From f84325d0899e5052fd59892ece265f7c2bd6c6a7 Mon Sep 17 00:00:00 2001 From: cvs2svn <> Date: Tue, 21 Mar 2006 00:57:35 +0000 Subject: This commit was manufactured by cvs2svn to create branch 'newlib- csl-20060320-branch'. Sprout from master 2006-03-21 00:57:34 UTC Mark Mitchell ' * acconfig.h (_ATEXIT_DYNAMIC_ALLOC): Undef.' Cherrypick from cygnus 1999-05-03 07:29:06 UTC Richard Henderson '19990502 sourceware import': README config/mh-armpic config/mh-elfalphapic config/mh-m68kpic config/mh-papic config/mh-ppcpic config/mh-x86pic config/mt-d30v config/mt-netware config/mt-ospace etc/add-log.el etc/add-log.vi etc/configbuild.ein etc/configbuild.fig etc/configbuild.jin etc/configbuild.tin etc/configdev.ein etc/configdev.fig etc/configdev.jin etc/configdev.tin etc/configure etc/configure.in makefile.vms Delete: compile djunpack.bat include/COPYING include/ChangeLog include/ChangeLog-9103 include/MAINTAINERS include/alloca-conf.h include/ansidecl.h include/aout/ChangeLog include/aout/adobe.h include/aout/aout64.h include/aout/ar.h include/aout/dynix3.h include/aout/encap.h include/aout/host.h include/aout/hp.h include/aout/hp300hpux.h include/aout/hppa.h include/aout/ranlib.h include/aout/reloc.h include/aout/stab.def include/aout/stab_gnu.h include/aout/sun4.h include/bfdlink.h include/bin-bugs.h include/bout.h include/coff/ChangeLog include/coff/ChangeLog-9103 include/coff/alpha.h include/coff/apollo.h include/coff/arm.h include/coff/aux-coff.h include/coff/ecoff.h include/coff/external.h include/coff/go32exe.h include/coff/h8300.h include/coff/h8500.h include/coff/i386.h include/coff/i860.h include/coff/i960.h include/coff/ia64.h include/coff/internal.h include/coff/m68k.h include/coff/m88k.h include/coff/maxq.h include/coff/mcore.h include/coff/mips.h include/coff/mipspe.h include/coff/or32.h include/coff/pe.h include/coff/powerpc.h include/coff/rs6000.h include/coff/rs6k64.h include/coff/sh.h include/coff/sparc.h include/coff/sym.h include/coff/symconst.h include/coff/ti.h include/coff/tic30.h include/coff/tic4x.h include/coff/tic54x.h include/coff/tic80.h include/coff/w65.h include/coff/we32k.h include/coff/xcoff.h include/coff/z80.h include/coff/z8k.h include/demangle.h include/dis-asm.h include/dyn-string.h include/elf/ChangeLog include/elf/ChangeLog-9103 include/elf/alpha.h include/elf/arc.h include/elf/arm.h include/elf/avr.h include/elf/bfin.h include/elf/common.h include/elf/cr16c.h include/elf/cris.h include/elf/crx.h include/elf/d10v.h include/elf/d30v.h include/elf/dlx.h include/elf/dwarf.h include/elf/dwarf2.h include/elf/external.h include/elf/fr30.h include/elf/frv.h include/elf/h8.h include/elf/hppa.h include/elf/i370.h include/elf/i386.h include/elf/i860.h include/elf/i960.h include/elf/ia64.h include/elf/internal.h include/elf/ip2k.h include/elf/iq2000.h include/elf/m32c.h include/elf/m32r.h include/elf/m68hc11.h include/elf/m68k.h include/elf/mcore.h include/elf/mips.h include/elf/mmix.h include/elf/mn10200.h include/elf/mn10300.h include/elf/msp430.h include/elf/mt.h include/elf/openrisc.h include/elf/or32.h include/elf/pj.h include/elf/ppc.h include/elf/ppc64.h include/elf/reloc-macros.h include/elf/s390.h include/elf/sh.h include/elf/sparc.h include/elf/v850.h include/elf/vax.h include/elf/x86-64.h include/elf/xc16x.h include/elf/xstormy16.h include/elf/xtensa.h include/fibheap.h include/filenames.h include/floatformat.h include/fnmatch.h include/fopen-bin.h include/fopen-same.h include/fopen-vms.h include/gdb/ChangeLog include/gdb/callback.h include/gdb/fileio.h include/gdb/remote-sim.h include/gdb/signals.h include/gdb/sim-arm.h include/gdb/sim-d10v.h include/gdb/sim-frv.h include/gdb/sim-h8300.h include/gdb/sim-m32c.h include/gdb/sim-ppc.h include/gdb/sim-sh.h include/gdbm.h include/getopt.h include/hashtab.h include/hp-symtab.h include/ieee.h include/libiberty.h include/md5.h include/nlm/ChangeLog include/nlm/alpha-ext.h include/nlm/common.h include/nlm/external.h include/nlm/i386-ext.h include/nlm/internal.h include/nlm/ppc-ext.h include/nlm/sparc32-ext.h include/oasys.h include/objalloc.h include/obstack.h include/opcode/ChangeLog include/opcode/ChangeLog-9103 include/opcode/alpha.h include/opcode/arc.h include/opcode/arm.h include/opcode/avr.h include/opcode/bfin.h include/opcode/cgen-bitset.h include/opcode/cgen.h include/opcode/convex.h include/opcode/cris.h include/opcode/crx.h include/opcode/d10v.h include/opcode/d30v.h include/opcode/dlx.h include/opcode/h8300.h include/opcode/hppa.h include/opcode/i370.h include/opcode/i386.h include/opcode/i860.h include/opcode/i960.h include/opcode/ia64.h include/opcode/m68hc11.h include/opcode/m68k.h include/opcode/m88k.h include/opcode/maxq.h include/opcode/mips.h include/opcode/mmix.h include/opcode/mn10200.h include/opcode/mn10300.h include/opcode/msp430.h include/opcode/np1.h include/opcode/ns32k.h include/opcode/or32.h include/opcode/pdp11.h include/opcode/pj.h include/opcode/pn.h include/opcode/ppc.h include/opcode/pyr.h include/opcode/s390.h include/opcode/sparc.h include/opcode/tahoe.h include/opcode/tic30.h include/opcode/tic4x.h include/opcode/tic54x.h include/opcode/tic80.h include/opcode/v850.h include/opcode/vax.h include/os9k.h include/partition.h include/progress.h include/safe-ctype.h include/sort.h include/splay-tree.h include/symcat.h include/ternary.h include/xregex.h include/xregex2.h include/xtensa-config.h include/xtensa-isa-internal.h include/xtensa-isa.h winsup/COPYING winsup/CYGWIN_LICENSE winsup/ChangeLog winsup/Makefile.common winsup/Makefile.in winsup/README winsup/configure winsup/configure.in winsup/cygserver/ChangeLog winsup/cygserver/Makefile.in winsup/cygserver/README winsup/cygserver/bsd_helper.cc winsup/cygserver/bsd_helper.h winsup/cygserver/bsd_log.cc winsup/cygserver/bsd_log.h winsup/cygserver/bsd_mutex.cc winsup/cygserver/bsd_mutex.h winsup/cygserver/client.cc winsup/cygserver/configure winsup/cygserver/configure.in winsup/cygserver/cygserver-config winsup/cygserver/cygserver.cc winsup/cygserver/cygserver.conf winsup/cygserver/msg.cc winsup/cygserver/process.cc winsup/cygserver/process.h winsup/cygserver/sem.cc winsup/cygserver/shm.cc winsup/cygserver/sysv_msg.cc winsup/cygserver/sysv_sem.cc winsup/cygserver/sysv_shm.cc winsup/cygserver/threaded_queue.cc winsup/cygserver/threaded_queue.h winsup/cygserver/transport.cc winsup/cygserver/transport.h winsup/cygserver/transport_pipes.cc winsup/cygserver/transport_pipes.h winsup/cygserver/transport_sockets.cc winsup/cygserver/transport_sockets.h winsup/cygserver/wincap.cc winsup/cygserver/wincap.h winsup/cygserver/woutsup.h winsup/cygwin/CYGWIN_LICENSE winsup/cygwin/ChangeLog winsup/cygwin/ChangeLog-1995 winsup/cygwin/ChangeLog-1996 winsup/cygwin/ChangeLog-1997 winsup/cygwin/ChangeLog-1998 winsup/cygwin/ChangeLog-1999 winsup/cygwin/ChangeLog-2000 winsup/cygwin/ChangeLog-2001 winsup/cygwin/ChangeLog-2002 winsup/cygwin/ChangeLog-2003 winsup/cygwin/ChangeLog-2004 winsup/cygwin/ChangeLog-2005 winsup/cygwin/Makefile.in winsup/cygwin/ROADMAP winsup/cygwin/acconfig.h winsup/cygwin/analyze_sigfe winsup/cygwin/ansi.sgml winsup/cygwin/assert.cc winsup/cygwin/autoload.cc winsup/cygwin/automode.c winsup/cygwin/binmode.c winsup/cygwin/child_info.h winsup/cygwin/config.h.in winsup/cygwin/config/i386/profile.h winsup/cygwin/configure winsup/cygwin/configure.in winsup/cygwin/cpuid.h winsup/cygwin/crt0.c winsup/cygwin/ctype.cc winsup/cygwin/cxx.cc winsup/cygwin/cygerrno.h winsup/cygwin/cygheap.cc winsup/cygwin/cygheap.h winsup/cygwin/cygmagic winsup/cygwin/cygmalloc.h winsup/cygwin/cygserver.h winsup/cygwin/cygserver_ipc.h winsup/cygwin/cygserver_msg.h winsup/cygwin/cygserver_sem.h winsup/cygwin/cygserver_shm.h winsup/cygwin/cygthread.cc winsup/cygwin/cygthread.h winsup/cygwin/cygtls.cc winsup/cygwin/cygtls.h winsup/cygwin/cygwin-shilka winsup/cygwin/cygwin.din winsup/cygwin/cygwin.sc winsup/cygwin/cygwin_version.h winsup/cygwin/dcrt0.cc winsup/cygwin/debug.cc winsup/cygwin/debug.h winsup/cygwin/delqueue.cc winsup/cygwin/devices.cc winsup/cygwin/devices.h winsup/cygwin/devices.in winsup/cygwin/dir.cc winsup/cygwin/dlfcn.cc winsup/cygwin/dll_init.cc winsup/cygwin/dll_init.h winsup/cygwin/dll_init.sgml winsup/cygwin/dllfixdbg winsup/cygwin/dlmalloc.c winsup/cygwin/dlmalloc.h winsup/cygwin/dtable.cc winsup/cygwin/dtable.h winsup/cygwin/dtable.sgml winsup/cygwin/environ.cc winsup/cygwin/environ.h winsup/cygwin/errno.cc winsup/cygwin/exceptions.cc winsup/cygwin/exec.cc winsup/cygwin/external.cc winsup/cygwin/external.sgml winsup/cygwin/fcntl.cc winsup/cygwin/fhandler.cc winsup/cygwin/fhandler.h winsup/cygwin/fhandler_clipboard.cc winsup/cygwin/fhandler_console.cc winsup/cygwin/fhandler_disk_file.cc winsup/cygwin/fhandler_dsp.cc winsup/cygwin/fhandler_fifo.cc winsup/cygwin/fhandler_floppy.cc winsup/cygwin/fhandler_mailslot.cc winsup/cygwin/fhandler_mem.cc winsup/cygwin/fhandler_netdrive.cc winsup/cygwin/fhandler_nodevice.cc winsup/cygwin/fhandler_proc.cc winsup/cygwin/fhandler_process.cc winsup/cygwin/fhandler_random.cc winsup/cygwin/fhandler_raw.cc winsup/cygwin/fhandler_registry.cc winsup/cygwin/fhandler_serial.cc winsup/cygwin/fhandler_socket.cc winsup/cygwin/fhandler_tape.cc winsup/cygwin/fhandler_termios.cc winsup/cygwin/fhandler_tty.cc winsup/cygwin/fhandler_virtual.cc winsup/cygwin/fhandler_windows.cc winsup/cygwin/fhandler_zero.cc winsup/cygwin/flock.cc winsup/cygwin/fork.cc winsup/cygwin/gcrt0.c winsup/cygwin/gendef winsup/cygwin/gendevices winsup/cygwin/gentls_offsets winsup/cygwin/glob.c winsup/cygwin/gmon.c winsup/cygwin/gmon.h winsup/cygwin/grp.cc winsup/cygwin/heap.cc winsup/cygwin/heap.h winsup/cygwin/hires.h winsup/cygwin/hookapi.cc winsup/cygwin/how-autoload-works.txt winsup/cygwin/how-cygheap-works.txt winsup/cygwin/how-cygtls-works.txt winsup/cygwin/how-fhandlers-work.txt winsup/cygwin/how-signals-work.txt winsup/cygwin/how-spawn-works.txt winsup/cygwin/how-to-debug-cygwin.txt winsup/cygwin/how-vfork-works.txt winsup/cygwin/include/a.out.h winsup/cygwin/include/arpa/ftp.h winsup/cygwin/include/arpa/inet.h winsup/cygwin/include/arpa/telnet.h winsup/cygwin/include/asm/byteorder.h winsup/cygwin/include/asm/socket.h winsup/cygwin/include/asm/types.h winsup/cygwin/include/byteswap.h winsup/cygwin/include/ctype.h winsup/cygwin/include/cygwin/_types.h winsup/cygwin/include/cygwin/acl.h winsup/cygwin/include/cygwin/config.h winsup/cygwin/include/cygwin/core_dump.h winsup/cygwin/include/cygwin/cygwin_dll.h winsup/cygwin/include/cygwin/fs.h winsup/cygwin/include/cygwin/grp.h winsup/cygwin/include/cygwin/hdreg.h winsup/cygwin/include/cygwin/icmp.h winsup/cygwin/include/cygwin/if.h winsup/cygwin/include/cygwin/in.h winsup/cygwin/include/cygwin/in_systm.h winsup/cygwin/include/cygwin/ipc.h winsup/cygwin/include/cygwin/msg.h winsup/cygwin/include/cygwin/mtio.h winsup/cygwin/include/cygwin/rdevio.h winsup/cygwin/include/cygwin/sem.h winsup/cygwin/include/cygwin/shm.h winsup/cygwin/include/cygwin/signal.h winsup/cygwin/include/cygwin/socket.h winsup/cygwin/include/cygwin/sockios.h winsup/cygwin/include/cygwin/stat.h winsup/cygwin/include/cygwin/stdlib.h winsup/cygwin/include/cygwin/sys_time.h winsup/cygwin/include/cygwin/sysproto.h winsup/cygwin/include/cygwin/time.h winsup/cygwin/include/cygwin/types.h winsup/cygwin/include/cygwin/uio.h winsup/cygwin/include/cygwin/utmp.h winsup/cygwin/include/cygwin/version.h winsup/cygwin/include/dlfcn.h winsup/cygwin/include/elf.h winsup/cygwin/include/endian.h winsup/cygwin/include/err.h winsup/cygwin/include/exceptions.h winsup/cygwin/include/fcntl.h winsup/cygwin/include/features.h winsup/cygwin/include/fnmatch.h winsup/cygwin/include/fts.h winsup/cygwin/include/ftw.h winsup/cygwin/include/getopt.h winsup/cygwin/include/glob.h winsup/cygwin/include/icmp.h winsup/cygwin/include/inttypes.h winsup/cygwin/include/io.h winsup/cygwin/include/lastlog.h winsup/cygwin/include/libgen.h winsup/cygwin/include/limits.h winsup/cygwin/include/machine/stdlib.h winsup/cygwin/include/mapi.h winsup/cygwin/include/memory.h winsup/cygwin/include/mntent.h winsup/cygwin/include/net/if.h winsup/cygwin/include/netdb.h winsup/cygwin/include/netinet/in.h winsup/cygwin/include/netinet/in_systm.h winsup/cygwin/include/netinet/ip.h winsup/cygwin/include/netinet/ip_icmp.h winsup/cygwin/include/netinet/tcp.h winsup/cygwin/include/netinet/udp.h winsup/cygwin/include/paths.h winsup/cygwin/include/poll.h winsup/cygwin/include/pthread.h winsup/cygwin/include/pty.h winsup/cygwin/include/sched.h winsup/cygwin/include/search.h winsup/cygwin/include/semaphore.h winsup/cygwin/include/stdint.h winsup/cygwin/include/strings.h winsup/cygwin/include/sys/acl.h winsup/cygwin/include/sys/cdefs.h winsup/cygwin/include/sys/copying.dj winsup/cygwin/include/sys/cygwin.h winsup/cygwin/include/sys/dirent.h winsup/cygwin/include/sys/elf32.h winsup/cygwin/include/sys/elf64.h winsup/cygwin/include/sys/elf_common.h winsup/cygwin/include/sys/elf_generic.h winsup/cygwin/include/sys/file.h winsup/cygwin/include/sys/ioctl.h winsup/cygwin/include/sys/ipc.h winsup/cygwin/include/sys/lock.h winsup/cygwin/include/sys/mman.h winsup/cygwin/include/sys/mount.h winsup/cygwin/include/sys/msg.h winsup/cygwin/include/sys/mtio.h winsup/cygwin/include/sys/param.h winsup/cygwin/include/sys/poll.h winsup/cygwin/include/sys/procfs.h winsup/cygwin/include/sys/queue.h winsup/cygwin/include/sys/resource.h winsup/cygwin/include/sys/select.h winsup/cygwin/include/sys/sem.h winsup/cygwin/include/sys/shm.h winsup/cygwin/include/sys/smallprint.h winsup/cygwin/include/sys/socket.h winsup/cygwin/include/sys/soundcard.h winsup/cygwin/include/sys/statfs.h winsup/cygwin/include/sys/statvfs.h winsup/cygwin/include/sys/stdio.h winsup/cygwin/include/sys/strace.h winsup/cygwin/include/sys/syslog.h winsup/cygwin/include/sys/sysmacros.h winsup/cygwin/include/sys/sysproto.h winsup/cygwin/include/sys/termio.h winsup/cygwin/include/sys/termios.h winsup/cygwin/include/sys/ttychars.h winsup/cygwin/include/sys/uio.h winsup/cygwin/include/sys/un.h winsup/cygwin/include/sys/utime.h winsup/cygwin/include/sys/utmp.h winsup/cygwin/include/sys/utsname.h winsup/cygwin/include/sys/vfs.h winsup/cygwin/include/sys/wait.h winsup/cygwin/include/sysexits.h winsup/cygwin/include/syslog.h winsup/cygwin/include/termio.h winsup/cygwin/include/tzfile.h winsup/cygwin/include/utmpx.h winsup/cygwin/init.cc winsup/cygwin/ioctl.cc winsup/cygwin/ipc.cc winsup/cygwin/lib/_cygwin_crt0_common.cc winsup/cygwin/lib/crt0.h winsup/cygwin/lib/cygwin_attach_dll.c winsup/cygwin/lib/cygwin_crt0.c winsup/cygwin/lib/dll_entry.c winsup/cygwin/lib/dll_main.cc winsup/cygwin/lib/libcmain.c winsup/cygwin/lib/premain0.c winsup/cygwin/lib/premain1.c winsup/cygwin/lib/premain2.c winsup/cygwin/lib/premain3.c winsup/cygwin/lib/pseudo-reloc.c winsup/cygwin/libc/bsdlib.cc winsup/cygwin/libc/fnmatch.c winsup/cygwin/libc/fts.c winsup/cygwin/libc/ftw.c winsup/cygwin/libc/getopt.c winsup/cygwin/libc/iruserok.c winsup/cygwin/libc/memmem.cc winsup/cygwin/libc/nftw.c winsup/cygwin/libc/strptime.cc winsup/cygwin/libc/timelocal.cc winsup/cygwin/libc/timelocal.h winsup/cygwin/localtime.cc winsup/cygwin/lsearch.cc winsup/cygwin/malloc.cc winsup/cygwin/malloc_wrapper.cc winsup/cygwin/mcount.c winsup/cygwin/misc-std.sgml winsup/cygwin/miscfuncs.cc winsup/cygwin/mktemp.cc winsup/cygwin/mkvers.sh winsup/cygwin/mmap.cc winsup/cygwin/msg.cc winsup/cygwin/mtinfo.h winsup/cygwin/net.cc winsup/cygwin/netdb.cc winsup/cygwin/newsym winsup/cygwin/ntdll.h winsup/cygwin/ntea.cc winsup/cygwin/passwd.cc winsup/cygwin/path.cc winsup/cygwin/path.h winsup/cygwin/path.sgml winsup/cygwin/perprocess.h winsup/cygwin/pinfo.cc winsup/cygwin/pinfo.h winsup/cygwin/pipe.cc winsup/cygwin/poll.cc winsup/cygwin/posix.sgml winsup/cygwin/profil.c winsup/cygwin/profil.h winsup/cygwin/pseudo-reloc.cc winsup/cygwin/pthread.cc winsup/cygwin/pwdgrp.h winsup/cygwin/regex/COPYRIGHT winsup/cygwin/regex/cclass.h winsup/cygwin/regex/cname.h winsup/cygwin/regex/engine.c winsup/cygwin/regex/engine.ih winsup/cygwin/regex/mkh winsup/cygwin/regex/regcomp.c winsup/cygwin/regex/regcomp.ih winsup/cygwin/regex/regerror.c winsup/cygwin/regex/regerror.ih winsup/cygwin/regex/regex.3 winsup/cygwin/regex/regex.7 winsup/cygwin/regex/regex.h winsup/cygwin/regex/regex2.h winsup/cygwin/regex/regexec.c winsup/cygwin/regex/regfree.c winsup/cygwin/regex/tests winsup/cygwin/regex/utils.h winsup/cygwin/regexp/COPYRIGHT winsup/cygwin/regexp/README winsup/cygwin/regexp/regexp.h winsup/cygwin/regexp/regmagic.h winsup/cygwin/regexp/v8_regerror.c winsup/cygwin/regexp/v8_regexp.c winsup/cygwin/regexp/v8_regsub.c winsup/cygwin/registry.cc winsup/cygwin/registry.h winsup/cygwin/resource.cc winsup/cygwin/rmsym winsup/cygwin/scandir.cc winsup/cygwin/sched.cc winsup/cygwin/sec_acl.cc winsup/cygwin/sec_helper.cc winsup/cygwin/security.cc winsup/cygwin/security.h winsup/cygwin/select.cc winsup/cygwin/select.h winsup/cygwin/sem.cc winsup/cygwin/shared.cc winsup/cygwin/shared.sgml winsup/cygwin/shared_info.h winsup/cygwin/shm.cc winsup/cygwin/signal.cc winsup/cygwin/sigproc.cc winsup/cygwin/sigproc.h winsup/cygwin/smallprint.c winsup/cygwin/spawn.cc winsup/cygwin/speclib winsup/cygwin/stackdump.sgml winsup/cygwin/strace.cc winsup/cygwin/string.h winsup/cygwin/strsep.cc winsup/cygwin/strsig.cc winsup/cygwin/sync.cc winsup/cygwin/sync.h winsup/cygwin/syscalls.cc winsup/cygwin/sysconf.cc winsup/cygwin/syslog.cc winsup/cygwin/termios.cc winsup/cygwin/textmode.c winsup/cygwin/textreadmode.c winsup/cygwin/thread.cc winsup/cygwin/thread.h winsup/cygwin/timer.cc winsup/cygwin/times.cc winsup/cygwin/tlsoffsets.h winsup/cygwin/tty.cc winsup/cygwin/tty.h winsup/cygwin/tz_posixrules.h winsup/cygwin/uinfo.cc winsup/cygwin/uname.cc winsup/cygwin/wait.cc winsup/cygwin/winbase.h winsup/cygwin/wincap.cc winsup/cygwin/wincap.h winsup/cygwin/window.cc winsup/cygwin/wininfo.h winsup/cygwin/winsup.h winsup/cygwin/winver.rc winsup/doc/ChangeLog winsup/doc/Makefile.in winsup/doc/README winsup/doc/configure winsup/doc/configure.in winsup/doc/cygserver.sgml winsup/doc/cygwin-api.in.sgml winsup/doc/cygwin-ug-net.in.sgml winsup/doc/cygwin-ug.in.sgml winsup/doc/cygwin.dsl winsup/doc/cygwinenv.sgml winsup/doc/dll.sgml winsup/doc/doctool.c winsup/doc/doctool.txt winsup/doc/effectively.sgml winsup/doc/faq-api.xml winsup/doc/faq-problems.xml winsup/doc/faq-programming.xml winsup/doc/faq-resources.xml winsup/doc/faq-sections.xml winsup/doc/faq-setup.xml winsup/doc/faq-using.xml winsup/doc/faq-what.xml winsup/doc/faq.xml winsup/doc/fhandler-tut.txt winsup/doc/filemodes.sgml winsup/doc/gcc.sgml winsup/doc/gdb.sgml winsup/doc/legal.sgml winsup/doc/ntsec.sgml winsup/doc/overview.sgml winsup/doc/overview2.sgml winsup/doc/pathnames.sgml winsup/doc/programming.sgml winsup/doc/setup-net.sgml winsup/doc/setup.sgml winsup/doc/setup2.sgml winsup/doc/textbinary.sgml winsup/doc/using.sgml winsup/doc/windres.sgml winsup/mingw/CONTRIBUTORS winsup/mingw/CRT_fp10.c winsup/mingw/CRT_fp8.c winsup/mingw/CRT_noglob.c winsup/mingw/CRTfmode.c winsup/mingw/CRTglob.c winsup/mingw/CRTinit.c winsup/mingw/ChangeLog winsup/mingw/DISCLAIMER winsup/mingw/Makefile.in winsup/mingw/README winsup/mingw/TODO winsup/mingw/binmode.c winsup/mingw/config.guess winsup/mingw/config.sub winsup/mingw/configure winsup/mingw/configure.in winsup/mingw/crt1.c winsup/mingw/crtdll.def winsup/mingw/crtmt.c winsup/mingw/crtst.c winsup/mingw/dllcrt1.c winsup/mingw/dllmain.c winsup/mingw/gccmain.c winsup/mingw/include/_mingw.h winsup/mingw/include/assert.h winsup/mingw/include/complex.h winsup/mingw/include/conio.h winsup/mingw/include/ctype.h winsup/mingw/include/dir.h winsup/mingw/include/direct.h winsup/mingw/include/dirent.h winsup/mingw/include/dos.h winsup/mingw/include/errno.h winsup/mingw/include/excpt.h winsup/mingw/include/fcntl.h winsup/mingw/include/fenv.h winsup/mingw/include/float.h winsup/mingw/include/getopt.h winsup/mingw/include/inttypes.h winsup/mingw/include/io.h winsup/mingw/include/limits.h winsup/mingw/include/locale.h winsup/mingw/include/malloc.h winsup/mingw/include/math.h winsup/mingw/include/mbctype.h winsup/mingw/include/mbstring.h winsup/mingw/include/mem.h winsup/mingw/include/memory.h winsup/mingw/include/process.h winsup/mingw/include/search.h winsup/mingw/include/setjmp.h winsup/mingw/include/share.h winsup/mingw/include/signal.h winsup/mingw/include/stdint.h winsup/mingw/include/stdio.h winsup/mingw/include/stdlib.h winsup/mingw/include/string.h winsup/mingw/include/strings.h winsup/mingw/include/sys/fcntl.h winsup/mingw/include/sys/file.h winsup/mingw/include/sys/locking.h winsup/mingw/include/sys/param.h winsup/mingw/include/sys/stat.h winsup/mingw/include/sys/time.h winsup/mingw/include/sys/timeb.h winsup/mingw/include/sys/types.h winsup/mingw/include/sys/unistd.h winsup/mingw/include/sys/utime.h winsup/mingw/include/tchar.h winsup/mingw/include/time.h winsup/mingw/include/unistd.h winsup/mingw/include/utime.h winsup/mingw/include/values.h winsup/mingw/include/varargs.h winsup/mingw/include/wchar.h winsup/mingw/include/wctype.h winsup/mingw/init.c winsup/mingw/install-sh winsup/mingw/isascii.c winsup/mingw/iscsym.c winsup/mingw/iscsymf.c winsup/mingw/jamfile winsup/mingw/main.c winsup/mingw/mingwex/Makefile.in winsup/mingw/mingwex/_Exit.c winsup/mingw/mingwex/atoll.c winsup/mingw/mingwex/btowc.c winsup/mingw/mingwex/complex/cabs.c winsup/mingw/mingwex/complex/cabsf.c winsup/mingw/mingwex/complex/cabsl.c winsup/mingw/mingwex/complex/cacos.c winsup/mingw/mingwex/complex/cacosf.c winsup/mingw/mingwex/complex/cacosh.c winsup/mingw/mingwex/complex/cacoshf.c winsup/mingw/mingwex/complex/cacoshl.c winsup/mingw/mingwex/complex/cacosl.c winsup/mingw/mingwex/complex/carg.c winsup/mingw/mingwex/complex/cargf.c winsup/mingw/mingwex/complex/cargl.c winsup/mingw/mingwex/complex/casin.c winsup/mingw/mingwex/complex/casinf.c winsup/mingw/mingwex/complex/casinh.c winsup/mingw/mingwex/complex/casinhf.c winsup/mingw/mingwex/complex/casinhl.c winsup/mingw/mingwex/complex/casinl.c winsup/mingw/mingwex/complex/catan.c winsup/mingw/mingwex/complex/catanf.c winsup/mingw/mingwex/complex/catanh.c winsup/mingw/mingwex/complex/catanhf.c winsup/mingw/mingwex/complex/catanhl.c winsup/mingw/mingwex/complex/catanl.c winsup/mingw/mingwex/complex/ccos.c winsup/mingw/mingwex/complex/ccosf.c winsup/mingw/mingwex/complex/ccosh.c winsup/mingw/mingwex/complex/ccoshf.c winsup/mingw/mingwex/complex/ccoshl.c winsup/mingw/mingwex/complex/ccosl.c winsup/mingw/mingwex/complex/cexp.c winsup/mingw/mingwex/complex/cexpf.c winsup/mingw/mingwex/complex/cexpl.c winsup/mingw/mingwex/complex/cimag.c winsup/mingw/mingwex/complex/cimagf.c winsup/mingw/mingwex/complex/cimagl.c winsup/mingw/mingwex/complex/clog.c winsup/mingw/mingwex/complex/clogf.c winsup/mingw/mingwex/complex/clogl.c winsup/mingw/mingwex/complex/cpow.c winsup/mingw/mingwex/complex/cpowf.c winsup/mingw/mingwex/complex/cpowl.c winsup/mingw/mingwex/complex/cproj.c winsup/mingw/mingwex/complex/cprojf.c winsup/mingw/mingwex/complex/cprojl.c winsup/mingw/mingwex/complex/creal.c winsup/mingw/mingwex/complex/crealf.c winsup/mingw/mingwex/complex/creall.c winsup/mingw/mingwex/complex/csin.c winsup/mingw/mingwex/complex/csinf.c winsup/mingw/mingwex/complex/csinh.c winsup/mingw/mingwex/complex/csinhf.c winsup/mingw/mingwex/complex/csinhl.c winsup/mingw/mingwex/complex/csinl.c winsup/mingw/mingwex/complex/csqrt.c winsup/mingw/mingwex/complex/csqrtf.c winsup/mingw/mingwex/complex/csqrtl.c winsup/mingw/mingwex/complex/ctan.c winsup/mingw/mingwex/complex/ctanf.c winsup/mingw/mingwex/complex/ctanh.c winsup/mingw/mingwex/complex/ctanhf.c winsup/mingw/mingwex/complex/ctanhl.c winsup/mingw/mingwex/complex/ctanl.c winsup/mingw/mingwex/configure winsup/mingw/mingwex/configure.in winsup/mingw/mingwex/dirent.c winsup/mingw/mingwex/feclearexcept.c winsup/mingw/mingwex/fegetenv.c winsup/mingw/mingwex/fegetexceptflag.c winsup/mingw/mingwex/fegetround.c winsup/mingw/mingwex/feholdexcept.c winsup/mingw/mingwex/feraiseexcept.c winsup/mingw/mingwex/fesetenv.c winsup/mingw/mingwex/fesetexceptflag.c winsup/mingw/mingwex/fesetround.c winsup/mingw/mingwex/fetestexcept.c winsup/mingw/mingwex/feupdateenv.c winsup/mingw/mingwex/ftruncate.c winsup/mingw/mingwex/fwide.c winsup/mingw/mingwex/getopt.c winsup/mingw/mingwex/imaxabs.c winsup/mingw/mingwex/imaxdiv.c winsup/mingw/mingwex/ldtoa.c winsup/mingw/mingwex/lltoa.c winsup/mingw/mingwex/lltow.c winsup/mingw/mingwex/math/acosf.c winsup/mingw/mingwex/math/acosh.c winsup/mingw/mingwex/math/acoshf.c winsup/mingw/mingwex/math/acoshl.c winsup/mingw/mingwex/math/acosl.c winsup/mingw/mingwex/math/asinf.c winsup/mingw/mingwex/math/asinh.c winsup/mingw/mingwex/math/asinhf.c winsup/mingw/mingwex/math/asinhl.c winsup/mingw/mingwex/math/asinl.c winsup/mingw/mingwex/math/atan2f.c winsup/mingw/mingwex/math/atan2l.c winsup/mingw/mingwex/math/atanf.c winsup/mingw/mingwex/math/atanh.c winsup/mingw/mingwex/math/atanhf.c winsup/mingw/mingwex/math/atanhl.c winsup/mingw/mingwex/math/atanl.c winsup/mingw/mingwex/math/cbrt.c winsup/mingw/mingwex/math/cbrtf.c winsup/mingw/mingwex/math/cbrtl.c winsup/mingw/mingwex/math/ceilf.S winsup/mingw/mingwex/math/ceill.S winsup/mingw/mingwex/math/cephes_emath.c winsup/mingw/mingwex/math/cephes_emath.h winsup/mingw/mingwex/math/cephes_mconf.h winsup/mingw/mingwex/math/copysign.S winsup/mingw/mingwex/math/copysignf.S winsup/mingw/mingwex/math/copysignl.S winsup/mingw/mingwex/math/cosf.S winsup/mingw/mingwex/math/coshf.c winsup/mingw/mingwex/math/coshl.c winsup/mingw/mingwex/math/cosl.S winsup/mingw/mingwex/math/erfl.c winsup/mingw/mingwex/math/exp2.S winsup/mingw/mingwex/math/exp2f.S winsup/mingw/mingwex/math/exp2l.S winsup/mingw/mingwex/math/expf.c winsup/mingw/mingwex/math/expl.c winsup/mingw/mingwex/math/expm1.c winsup/mingw/mingwex/math/expm1f.c winsup/mingw/mingwex/math/expm1l.c winsup/mingw/mingwex/math/fabs.c winsup/mingw/mingwex/math/fabsf.c winsup/mingw/mingwex/math/fabsl.c winsup/mingw/mingwex/math/fastmath.h winsup/mingw/mingwex/math/fdim.c winsup/mingw/mingwex/math/fdimf.c winsup/mingw/mingwex/math/fdiml.c winsup/mingw/mingwex/math/floorf.S winsup/mingw/mingwex/math/floorl.S winsup/mingw/mingwex/math/fma.S winsup/mingw/mingwex/math/fmaf.S winsup/mingw/mingwex/math/fmal.c winsup/mingw/mingwex/math/fmax.c winsup/mingw/mingwex/math/fmaxf.c winsup/mingw/mingwex/math/fmaxl.c winsup/mingw/mingwex/math/fmin.c winsup/mingw/mingwex/math/fminf.c winsup/mingw/mingwex/math/fminl.c winsup/mingw/mingwex/math/fmodf.c winsup/mingw/mingwex/math/fmodl.c winsup/mingw/mingwex/math/fp_consts.c winsup/mingw/mingwex/math/fp_consts.h winsup/mingw/mingwex/math/fp_constsf.c winsup/mingw/mingwex/math/fp_constsl.c winsup/mingw/mingwex/math/fpclassify.c winsup/mingw/mingwex/math/fpclassifyf.c winsup/mingw/mingwex/math/fpclassifyl.c winsup/mingw/mingwex/math/frexpf.c winsup/mingw/mingwex/math/frexpl.S winsup/mingw/mingwex/math/fucom.c winsup/mingw/mingwex/math/hypotf.c winsup/mingw/mingwex/math/hypotl.c winsup/mingw/mingwex/math/ilogb.S winsup/mingw/mingwex/math/ilogbf.S winsup/mingw/mingwex/math/ilogbl.S winsup/mingw/mingwex/math/isnan.c winsup/mingw/mingwex/math/isnanf.c winsup/mingw/mingwex/math/isnanl.c winsup/mingw/mingwex/math/ldexpf.c winsup/mingw/mingwex/math/ldexpl.c winsup/mingw/mingwex/math/lgamma.c winsup/mingw/mingwex/math/lgammaf.c winsup/mingw/mingwex/math/lgammal.c winsup/mingw/mingwex/math/llrint.c winsup/mingw/mingwex/math/llrintf.c winsup/mingw/mingwex/math/llrintl.c winsup/mingw/mingwex/math/llround.c winsup/mingw/mingwex/math/llroundf.c winsup/mingw/mingwex/math/llroundl.c winsup/mingw/mingwex/math/log10f.S winsup/mingw/mingwex/math/log10l.S winsup/mingw/mingwex/math/log1p.S winsup/mingw/mingwex/math/log1pf.S winsup/mingw/mingwex/math/log1pl.S winsup/mingw/mingwex/math/log2.S winsup/mingw/mingwex/math/log2f.S winsup/mingw/mingwex/math/log2l.S winsup/mingw/mingwex/math/logb.c winsup/mingw/mingwex/math/logbf.c winsup/mingw/mingwex/math/logbl.c winsup/mingw/mingwex/math/logf.S winsup/mingw/mingwex/math/logl.S winsup/mingw/mingwex/math/lrint.c winsup/mingw/mingwex/math/lrintf.c winsup/mingw/mingwex/math/lrintl.c winsup/mingw/mingwex/math/lround.c winsup/mingw/mingwex/math/lroundf.c winsup/mingw/mingwex/math/lroundl.c winsup/mingw/mingwex/math/modff.c winsup/mingw/mingwex/math/modfl.c winsup/mingw/mingwex/math/nearbyint.S winsup/mingw/mingwex/math/nearbyintf.S winsup/mingw/mingwex/math/nearbyintl.S winsup/mingw/mingwex/math/nextafterf.c winsup/mingw/mingwex/math/nextafterl.c winsup/mingw/mingwex/math/nexttoward.c winsup/mingw/mingwex/math/nexttowardf.c winsup/mingw/mingwex/math/pow.c winsup/mingw/mingwex/math/powf.c winsup/mingw/mingwex/math/powi.c winsup/mingw/mingwex/math/powif.c winsup/mingw/mingwex/math/powil.c winsup/mingw/mingwex/math/powl.c winsup/mingw/mingwex/math/remainder.S winsup/mingw/mingwex/math/remainderf.S winsup/mingw/mingwex/math/remainderl.S winsup/mingw/mingwex/math/remquo.S winsup/mingw/mingwex/math/remquof.S winsup/mingw/mingwex/math/remquol.S winsup/mingw/mingwex/math/rint.c winsup/mingw/mingwex/math/rintf.c winsup/mingw/mingwex/math/rintl.c winsup/mingw/mingwex/math/round.c winsup/mingw/mingwex/math/roundf.c winsup/mingw/mingwex/math/roundl.c winsup/mingw/mingwex/math/s_erf.c winsup/mingw/mingwex/math/scalbn.S winsup/mingw/mingwex/math/scalbnf.S winsup/mingw/mingwex/math/scalbnl.S winsup/mingw/mingwex/math/sf_erf.c winsup/mingw/mingwex/math/signbit.c winsup/mingw/mingwex/math/signbitf.c winsup/mingw/mingwex/math/signbitl.c winsup/mingw/mingwex/math/sinf.S winsup/mingw/mingwex/math/sinhf.c winsup/mingw/mingwex/math/sinhl.c winsup/mingw/mingwex/math/sinl.S winsup/mingw/mingwex/math/sqrtf.c winsup/mingw/mingwex/math/sqrtl.c winsup/mingw/mingwex/math/tanf.S winsup/mingw/mingwex/math/tanhf.c winsup/mingw/mingwex/math/tanhl.c winsup/mingw/mingwex/math/tanl.S winsup/mingw/mingwex/math/tgamma.c winsup/mingw/mingwex/math/tgammaf.c winsup/mingw/mingwex/math/tgammal.c winsup/mingw/mingwex/math/trunc.c winsup/mingw/mingwex/math/truncf.c winsup/mingw/mingwex/math/truncl.c winsup/mingw/mingwex/mb_wc_common.h winsup/mingw/mingwex/mbrtowc.c winsup/mingw/mingwex/mbsinit.c winsup/mingw/mingwex/mingw-aligned-malloc.c winsup/mingw/mingwex/mingw-fseek.c winsup/mingw/mingwex/sitest.c winsup/mingw/mingwex/stdio/fopen64.c winsup/mingw/mingwex/stdio/fseeko64.c winsup/mingw/mingwex/stdio/ftello64.c winsup/mingw/mingwex/stdio/lseek64.c winsup/mingw/mingwex/stdio/snprintf.c winsup/mingw/mingwex/stdio/snwprintf.c winsup/mingw/mingwex/stdio/vfscanf.c winsup/mingw/mingwex/stdio/vfwscanf.c winsup/mingw/mingwex/stdio/vscanf.c winsup/mingw/mingwex/stdio/vsnprintf.c winsup/mingw/mingwex/stdio/vsnwprintf.c winsup/mingw/mingwex/stdio/vsscanf.c winsup/mingw/mingwex/stdio/vswscanf.c winsup/mingw/mingwex/stdio/vwscanf.c winsup/mingw/mingwex/strtof.c winsup/mingw/mingwex/strtoimax.c winsup/mingw/mingwex/strtold.c winsup/mingw/mingwex/strtoumax.c winsup/mingw/mingwex/testwmem.c winsup/mingw/mingwex/tst-aligned-malloc.c winsup/mingw/mingwex/ulltoa.c winsup/mingw/mingwex/ulltow.c winsup/mingw/mingwex/wcrtomb.c winsup/mingw/mingwex/wcstof.c winsup/mingw/mingwex/wcstoimax.c winsup/mingw/mingwex/wcstold.c winsup/mingw/mingwex/wcstoumax.c winsup/mingw/mingwex/wctob.c winsup/mingw/mingwex/wctrans.c winsup/mingw/mingwex/wctype.c winsup/mingw/mingwex/wdirent.c winsup/mingw/mingwex/wmemchr.c winsup/mingw/mingwex/wmemcmp.c winsup/mingw/mingwex/wmemcpy.c winsup/mingw/mingwex/wmemmove.c winsup/mingw/mingwex/wmemset.c winsup/mingw/mingwex/wtoll.c winsup/mingw/mkinstalldirs winsup/mingw/moldname.def.in winsup/mingw/msvcrt.def.in winsup/mingw/mthr.c winsup/mingw/mthr_init.c winsup/mingw/mthr_stub.c winsup/mingw/profile/COPYING winsup/mingw/profile/CYGWIN_LICENSE winsup/mingw/profile/Makefile.in winsup/mingw/profile/configure winsup/mingw/profile/configure.in winsup/mingw/profile/gcrt0.c winsup/mingw/profile/gmon.c winsup/mingw/profile/gmon.h winsup/mingw/profile/mcount.c winsup/mingw/profile/profil.c winsup/mingw/profile/profil.h winsup/mingw/profile/profile.h winsup/mingw/pseudo-reloc-list.c winsup/mingw/pseudo-reloc.c winsup/mingw/readme.txt winsup/mingw/samples/dirent/jamfile winsup/mingw/samples/dirent/test.c winsup/mingw/samples/dirent/wtest.c winsup/mingw/samples/dlltest/dll.c winsup/mingw/samples/dlltest/dll.def winsup/mingw/samples/dlltest/dll.h winsup/mingw/samples/dlltest/exe.c winsup/mingw/samples/dlltest/exe.exp winsup/mingw/samples/dlltest/expexe.c winsup/mingw/samples/dlltest/expexe.def winsup/mingw/samples/dlltest/jamfile winsup/mingw/samples/dlltest/loaddll.c winsup/mingw/samples/dlltest/loadexe.c winsup/mingw/samples/dlltest/readme.txt winsup/mingw/samples/dlltest/silly.cpp winsup/mingw/samples/dlltest/silly.def winsup/mingw/samples/dlltest/silly.exp winsup/mingw/samples/dlltest/silly.h winsup/mingw/samples/dlltest/sillydll.cpp winsup/mingw/samples/filehand/filehand.c winsup/mingw/samples/filehand/jamfile winsup/mingw/samples/filehand/junk.txt winsup/mingw/samples/fixargv/fixargv.c winsup/mingw/samples/fixargv/fixargv.h winsup/mingw/samples/fixargv/readme.txt winsup/mingw/samples/fmode/all.c winsup/mingw/samples/fmode/jamfile winsup/mingw/samples/fmode/readme.txt winsup/mingw/samples/fmode/test.c winsup/mingw/samples/fmode/test2.c winsup/mingw/samples/globbing/glob.c winsup/mingw/samples/globbing/jamfile winsup/mingw/samples/globbing/noglob.c winsup/mingw/samples/globbing/readme.txt winsup/mingw/samples/print/jamfile winsup/mingw/samples/print/prntest.c winsup/mingw/samples/seh/eh3.c winsup/mingw/samples/seh/exutil.c winsup/mingw/samples/seh/exutil.def winsup/mingw/samples/seh/exutil.h winsup/mingw/samples/seh/jamfile winsup/mingw/samples/seh/sehfix.c winsup/mingw/samples/seh/sehsub.c winsup/mingw/samples/seh/sehtest.c winsup/mingw/samples/simpledll/dll.c winsup/mingw/samples/simpledll/dll.cpp winsup/mingw/samples/simpledll/dll.def winsup/mingw/samples/simpledll/exe.c winsup/mingw/samples/simpledll/jamfile winsup/mingw/samples/simpledll/makedll.bat winsup/mingw/samples/test/jamfile winsup/mingw/samples/test/test.c winsup/mingw/samples/wintest/jamfile winsup/mingw/samples/wintest/test.c winsup/mingw/strcasecmp.c winsup/mingw/strncasecmp.c winsup/mingw/test_headers.c winsup/mingw/toascii.c winsup/mingw/txtmode.c winsup/mingw/wcscmpi.c winsup/subauth/ChangeLog winsup/subauth/Makefile.in winsup/subauth/configure winsup/subauth/configure.in winsup/subauth/cygsuba.c winsup/subauth/cygsuba.din winsup/testsuite/ChangeLog winsup/testsuite/Makefile.in winsup/testsuite/README winsup/testsuite/config/default.exp winsup/testsuite/configure winsup/testsuite/configure.in winsup/testsuite/cygrun.c winsup/testsuite/libltp/include/dataascii.h winsup/testsuite/libltp/include/databin.h winsup/testsuite/libltp/include/file_lock.h winsup/testsuite/libltp/include/forker.h winsup/testsuite/libltp/include/open_flags.h winsup/testsuite/libltp/include/pattern.h winsup/testsuite/libltp/include/random_range.h winsup/testsuite/libltp/include/rmobj.h winsup/testsuite/libltp/include/search_path.h winsup/testsuite/libltp/include/str_to_bytes.h winsup/testsuite/libltp/include/string_to_tokens.h winsup/testsuite/libltp/include/test.h winsup/testsuite/libltp/include/tlibio.h winsup/testsuite/libltp/include/usctest.h winsup/testsuite/libltp/include/write_log.h winsup/testsuite/libltp/lib/dataascii.c winsup/testsuite/libltp/lib/databin.c winsup/testsuite/libltp/lib/datapid.c winsup/testsuite/libltp/lib/forker.c winsup/testsuite/libltp/lib/get_high_address.c winsup/testsuite/libltp/lib/libtestsuite.c winsup/testsuite/libltp/lib/open_flags.c winsup/testsuite/libltp/lib/parse_opts.c winsup/testsuite/libltp/lib/pattern.c winsup/testsuite/libltp/lib/rmobj.c winsup/testsuite/libltp/lib/search_path.c winsup/testsuite/libltp/lib/str_to_bytes.c winsup/testsuite/libltp/lib/string_to_tokens.c winsup/testsuite/libltp/lib/tst_res.c winsup/testsuite/libltp/lib/tst_sig.c winsup/testsuite/libltp/lib/tst_tmpdir.c winsup/testsuite/libltp/lib/write_log.c winsup/testsuite/winsup.api/checksignal.c winsup/testsuite/winsup.api/crlf.c winsup/testsuite/winsup.api/cygload.cc winsup/testsuite/winsup.api/cygload.exp winsup/testsuite/winsup.api/cygload.h winsup/testsuite/winsup.api/devdsp.c winsup/testsuite/winsup.api/devdsp_okay.h winsup/testsuite/winsup.api/devzero.c winsup/testsuite/winsup.api/iospeed.c winsup/testsuite/winsup.api/known_bugs.tcl winsup/testsuite/winsup.api/ltp/access01.c winsup/testsuite/winsup.api/ltp/access03.c winsup/testsuite/winsup.api/ltp/access04.c winsup/testsuite/winsup.api/ltp/access05.c winsup/testsuite/winsup.api/ltp/alarm01.c winsup/testsuite/winsup.api/ltp/alarm02.c winsup/testsuite/winsup.api/ltp/alarm03.c winsup/testsuite/winsup.api/ltp/alarm07.c winsup/testsuite/winsup.api/ltp/asyncio02.c winsup/testsuite/winsup.api/ltp/chdir02.c winsup/testsuite/winsup.api/ltp/chdir04.c winsup/testsuite/winsup.api/ltp/chmod01.c winsup/testsuite/winsup.api/ltp/chmod02.c winsup/testsuite/winsup.api/ltp/chown01.c winsup/testsuite/winsup.api/ltp/close01.c winsup/testsuite/winsup.api/ltp/close02.c winsup/testsuite/winsup.api/ltp/close08.c winsup/testsuite/winsup.api/ltp/creat01.c winsup/testsuite/winsup.api/ltp/creat03.c winsup/testsuite/winsup.api/ltp/creat09.c winsup/testsuite/winsup.api/ltp/dup01.c winsup/testsuite/winsup.api/ltp/dup02.c winsup/testsuite/winsup.api/ltp/dup03.c winsup/testsuite/winsup.api/ltp/dup04.c winsup/testsuite/winsup.api/ltp/dup05.c winsup/testsuite/winsup.api/ltp/execl01.c winsup/testsuite/winsup.api/ltp/execle01.c winsup/testsuite/winsup.api/ltp/execlp01.c winsup/testsuite/winsup.api/ltp/execv01.c winsup/testsuite/winsup.api/ltp/execve01.c winsup/testsuite/winsup.api/ltp/execvp01.c winsup/testsuite/winsup.api/ltp/exit01.c winsup/testsuite/winsup.api/ltp/exit02.c winsup/testsuite/winsup.api/ltp/fchdir01.c winsup/testsuite/winsup.api/ltp/fchdir02.c winsup/testsuite/winsup.api/ltp/fchmod01.c winsup/testsuite/winsup.api/ltp/fchown01.c winsup/testsuite/winsup.api/ltp/fcntl02.c winsup/testsuite/winsup.api/ltp/fcntl03.c winsup/testsuite/winsup.api/ltp/fcntl04.c winsup/testsuite/winsup.api/ltp/fcntl05.c winsup/testsuite/winsup.api/ltp/fcntl07.c winsup/testsuite/winsup.api/ltp/fcntl07B.c winsup/testsuite/winsup.api/ltp/fcntl08.c winsup/testsuite/winsup.api/ltp/fcntl09.c winsup/testsuite/winsup.api/ltp/fcntl10.c winsup/testsuite/winsup.api/ltp/fork01.c winsup/testsuite/winsup.api/ltp/fork02.c winsup/testsuite/winsup.api/ltp/fork03.c winsup/testsuite/winsup.api/ltp/fork04.c winsup/testsuite/winsup.api/ltp/fork06.c winsup/testsuite/winsup.api/ltp/fork07.c winsup/testsuite/winsup.api/ltp/fork09.c winsup/testsuite/winsup.api/ltp/fork10.c winsup/testsuite/winsup.api/ltp/fork11.c winsup/testsuite/winsup.api/ltp/fpathconf01.c winsup/testsuite/winsup.api/ltp/fstat01.c winsup/testsuite/winsup.api/ltp/fstat02.c winsup/testsuite/winsup.api/ltp/fstat03.c winsup/testsuite/winsup.api/ltp/fstat04.c winsup/testsuite/winsup.api/ltp/fsync01.c winsup/testsuite/winsup.api/ltp/ftruncate01.c winsup/testsuite/winsup.api/ltp/ftruncate02.c winsup/testsuite/winsup.api/ltp/ftruncate03.c winsup/testsuite/winsup.api/ltp/getegid01.c winsup/testsuite/winsup.api/ltp/geteuid01.c winsup/testsuite/winsup.api/ltp/getgid01.c winsup/testsuite/winsup.api/ltp/getgid02.c winsup/testsuite/winsup.api/ltp/getgid03.c winsup/testsuite/winsup.api/ltp/getgroups01.c winsup/testsuite/winsup.api/ltp/getgroups02.c winsup/testsuite/winsup.api/ltp/gethostid01.c winsup/testsuite/winsup.api/ltp/gethostname01.c winsup/testsuite/winsup.api/ltp/getpgid01.c winsup/testsuite/winsup.api/ltp/getpgid02.c winsup/testsuite/winsup.api/ltp/getpgrp01.c winsup/testsuite/winsup.api/ltp/getpid01.c winsup/testsuite/winsup.api/ltp/getpid02.c winsup/testsuite/winsup.api/ltp/getppid01.c winsup/testsuite/winsup.api/ltp/getppid02.c winsup/testsuite/winsup.api/ltp/getuid01.c winsup/testsuite/winsup.api/ltp/getuid02.c winsup/testsuite/winsup.api/ltp/getuid03.c winsup/testsuite/winsup.api/ltp/kill01.c winsup/testsuite/winsup.api/ltp/kill02.c winsup/testsuite/winsup.api/ltp/kill03.c winsup/testsuite/winsup.api/ltp/kill04.c winsup/testsuite/winsup.api/ltp/kill09.c winsup/testsuite/winsup.api/ltp/link02.c winsup/testsuite/winsup.api/ltp/link03.c winsup/testsuite/winsup.api/ltp/link04.c winsup/testsuite/winsup.api/ltp/link05.c winsup/testsuite/winsup.api/ltp/lseek01.c winsup/testsuite/winsup.api/ltp/lseek02.c winsup/testsuite/winsup.api/ltp/lseek03.c winsup/testsuite/winsup.api/ltp/lseek04.c winsup/testsuite/winsup.api/ltp/lseek05.c winsup/testsuite/winsup.api/ltp/lseek06.c winsup/testsuite/winsup.api/ltp/lseek07.c winsup/testsuite/winsup.api/ltp/lseek08.c winsup/testsuite/winsup.api/ltp/lseek09.c winsup/testsuite/winsup.api/ltp/lseek10.c winsup/testsuite/winsup.api/ltp/lstat02.c winsup/testsuite/winsup.api/ltp/mkdir01.c winsup/testsuite/winsup.api/ltp/mkdir08.c winsup/testsuite/winsup.api/ltp/mknod01.c winsup/testsuite/winsup.api/ltp/mmap001.c winsup/testsuite/winsup.api/ltp/mmap02.c winsup/testsuite/winsup.api/ltp/mmap03.c winsup/testsuite/winsup.api/ltp/mmap04.c winsup/testsuite/winsup.api/ltp/mmap05.c winsup/testsuite/winsup.api/ltp/mmap06.c winsup/testsuite/winsup.api/ltp/mmap07.c winsup/testsuite/winsup.api/ltp/mmap08.c winsup/testsuite/winsup.api/ltp/munmap01.c winsup/testsuite/winsup.api/ltp/munmap02.c winsup/testsuite/winsup.api/ltp/nice05.c winsup/testsuite/winsup.api/ltp/open02.c winsup/testsuite/winsup.api/ltp/open03.c winsup/testsuite/winsup.api/ltp/pathconf01.c winsup/testsuite/winsup.api/ltp/pause01.c winsup/testsuite/winsup.api/ltp/pipe01.c winsup/testsuite/winsup.api/ltp/pipe08.c winsup/testsuite/winsup.api/ltp/pipe09.c winsup/testsuite/winsup.api/ltp/pipe10.c winsup/testsuite/winsup.api/ltp/pipe11.c winsup/testsuite/winsup.api/ltp/poll01.c winsup/testsuite/winsup.api/ltp/read01.c winsup/testsuite/winsup.api/ltp/read04.c winsup/testsuite/winsup.api/ltp/readdir01.c winsup/testsuite/winsup.api/ltp/readlink01.c winsup/testsuite/winsup.api/ltp/readlink02.c winsup/testsuite/winsup.api/ltp/readlink03.c winsup/testsuite/winsup.api/ltp/rename01.c winsup/testsuite/winsup.api/ltp/rename02.c winsup/testsuite/winsup.api/ltp/rename08.c winsup/testsuite/winsup.api/ltp/rename10.c winsup/testsuite/winsup.api/ltp/rmdir01.c winsup/testsuite/winsup.api/ltp/rmdir04.c winsup/testsuite/winsup.api/ltp/rmdir05.c winsup/testsuite/winsup.api/ltp/sbrk01.c winsup/testsuite/winsup.api/ltp/select01.c winsup/testsuite/winsup.api/ltp/select02.c winsup/testsuite/winsup.api/ltp/select03.c winsup/testsuite/winsup.api/ltp/setgid01.c winsup/testsuite/winsup.api/ltp/setgroups01.c winsup/testsuite/winsup.api/ltp/setpgid01.c winsup/testsuite/winsup.api/ltp/setregid01.c winsup/testsuite/winsup.api/ltp/setreuid01.c winsup/testsuite/winsup.api/ltp/setuid01.c winsup/testsuite/winsup.api/ltp/setuid02.c winsup/testsuite/winsup.api/ltp/signal03.c winsup/testsuite/winsup.api/ltp/stat01.c winsup/testsuite/winsup.api/ltp/stat02.c winsup/testsuite/winsup.api/ltp/stat03.c winsup/testsuite/winsup.api/ltp/stat05.c winsup/testsuite/winsup.api/ltp/stat06.c winsup/testsuite/winsup.api/ltp/symlink01.c winsup/testsuite/winsup.api/ltp/symlink02.c winsup/testsuite/winsup.api/ltp/symlink03.c winsup/testsuite/winsup.api/ltp/symlink04.c winsup/testsuite/winsup.api/ltp/symlink05.c winsup/testsuite/winsup.api/ltp/sync01.c winsup/testsuite/winsup.api/ltp/sync02.c winsup/testsuite/winsup.api/ltp/time01.c winsup/testsuite/winsup.api/ltp/time02.c winsup/testsuite/winsup.api/ltp/times01.c winsup/testsuite/winsup.api/ltp/times02.c winsup/testsuite/winsup.api/ltp/times03.c winsup/testsuite/winsup.api/ltp/truncate01.c winsup/testsuite/winsup.api/ltp/truncate02.c winsup/testsuite/winsup.api/ltp/ulimit01.c winsup/testsuite/winsup.api/ltp/umask01.c winsup/testsuite/winsup.api/ltp/umask02.c winsup/testsuite/winsup.api/ltp/umask03.c winsup/testsuite/winsup.api/ltp/uname01.c winsup/testsuite/winsup.api/ltp/unlink05.c winsup/testsuite/winsup.api/ltp/unlink06.c winsup/testsuite/winsup.api/ltp/unlink07.c winsup/testsuite/winsup.api/ltp/unlink08.c winsup/testsuite/winsup.api/ltp/vfork01.c winsup/testsuite/winsup.api/ltp/wait02.c winsup/testsuite/winsup.api/ltp/wait401.c winsup/testsuite/winsup.api/ltp/wait402.c winsup/testsuite/winsup.api/ltp/write01.c winsup/testsuite/winsup.api/ltp/write02.c winsup/testsuite/winsup.api/ltp/write03.c winsup/testsuite/winsup.api/mmaptest01.c winsup/testsuite/winsup.api/mmaptest02.c winsup/testsuite/winsup.api/mmaptest03.c winsup/testsuite/winsup.api/mmaptest04.c winsup/testsuite/winsup.api/msgtest.c winsup/testsuite/winsup.api/nullgetcwd.c winsup/testsuite/winsup.api/pthread/cancel1.c winsup/testsuite/winsup.api/pthread/cancel10.c winsup/testsuite/winsup.api/pthread/cancel11.c winsup/testsuite/winsup.api/pthread/cancel12.c winsup/testsuite/winsup.api/pthread/cancel2.c winsup/testsuite/winsup.api/pthread/cancel3.c winsup/testsuite/winsup.api/pthread/cancel4.c winsup/testsuite/winsup.api/pthread/cancel5.c winsup/testsuite/winsup.api/pthread/cancel6.c winsup/testsuite/winsup.api/pthread/cancel7.c winsup/testsuite/winsup.api/pthread/cancel8.c winsup/testsuite/winsup.api/pthread/cancel9.c winsup/testsuite/winsup.api/pthread/cleanup2.c winsup/testsuite/winsup.api/pthread/cleanup3.c winsup/testsuite/winsup.api/pthread/condvar1.c winsup/testsuite/winsup.api/pthread/condvar2.c winsup/testsuite/winsup.api/pthread/condvar2_1.c winsup/testsuite/winsup.api/pthread/condvar3.c winsup/testsuite/winsup.api/pthread/condvar3_1.c winsup/testsuite/winsup.api/pthread/condvar3_2.c winsup/testsuite/winsup.api/pthread/condvar3_3.c winsup/testsuite/winsup.api/pthread/condvar4.c winsup/testsuite/winsup.api/pthread/condvar5.c winsup/testsuite/winsup.api/pthread/condvar6.c winsup/testsuite/winsup.api/pthread/condvar7.c winsup/testsuite/winsup.api/pthread/condvar8.c winsup/testsuite/winsup.api/pthread/condvar9.c winsup/testsuite/winsup.api/pthread/count1.c winsup/testsuite/winsup.api/pthread/create1.c winsup/testsuite/winsup.api/pthread/create2.c winsup/testsuite/winsup.api/pthread/equal1.c winsup/testsuite/winsup.api/pthread/exit1.c winsup/testsuite/winsup.api/pthread/exit2.c winsup/testsuite/winsup.api/pthread/exit3.c winsup/testsuite/winsup.api/pthread/inherit1.c winsup/testsuite/winsup.api/pthread/join0.c winsup/testsuite/winsup.api/pthread/join1.c winsup/testsuite/winsup.api/pthread/join2.c winsup/testsuite/winsup.api/pthread/mainthreadexits.c winsup/testsuite/winsup.api/pthread/mutex1.c winsup/testsuite/winsup.api/pthread/mutex1d.c winsup/testsuite/winsup.api/pthread/mutex1e.c winsup/testsuite/winsup.api/pthread/mutex1n.c winsup/testsuite/winsup.api/pthread/mutex1r.c winsup/testsuite/winsup.api/pthread/mutex2.c winsup/testsuite/winsup.api/pthread/mutex3.c winsup/testsuite/winsup.api/pthread/mutex4.c winsup/testsuite/winsup.api/pthread/mutex5.c winsup/testsuite/winsup.api/pthread/mutex6d.c winsup/testsuite/winsup.api/pthread/mutex6e.c winsup/testsuite/winsup.api/pthread/mutex6n.c winsup/testsuite/winsup.api/pthread/mutex6r.c winsup/testsuite/winsup.api/pthread/mutex7.c winsup/testsuite/winsup.api/pthread/mutex7d.c winsup/testsuite/winsup.api/pthread/mutex7e.c winsup/testsuite/winsup.api/pthread/mutex7n.c winsup/testsuite/winsup.api/pthread/mutex7r.c winsup/testsuite/winsup.api/pthread/mutex8e.c winsup/testsuite/winsup.api/pthread/mutex8n.c winsup/testsuite/winsup.api/pthread/mutex8r.c winsup/testsuite/winsup.api/pthread/once1.c winsup/testsuite/winsup.api/pthread/priority1.c winsup/testsuite/winsup.api/pthread/priority2.c winsup/testsuite/winsup.api/pthread/rwlock1.c winsup/testsuite/winsup.api/pthread/rwlock2.c winsup/testsuite/winsup.api/pthread/rwlock3.c winsup/testsuite/winsup.api/pthread/rwlock4.c winsup/testsuite/winsup.api/pthread/rwlock5.c winsup/testsuite/winsup.api/pthread/rwlock6.c winsup/testsuite/winsup.api/pthread/rwlock7.c winsup/testsuite/winsup.api/pthread/self1.c winsup/testsuite/winsup.api/pthread/self2.c winsup/testsuite/winsup.api/pthread/test.h winsup/testsuite/winsup.api/pthread/threadidafterfork.c winsup/testsuite/winsup.api/pthread/tsd1.c winsup/testsuite/winsup.api/resethand.c winsup/testsuite/winsup.api/samples/sample-fail.c winsup/testsuite/winsup.api/samples/sample-miscompile.c winsup/testsuite/winsup.api/samples/sample-pass.c winsup/testsuite/winsup.api/semtest.c winsup/testsuite/winsup.api/shmtest.c winsup/testsuite/winsup.api/sigchld.c winsup/testsuite/winsup.api/signal-into-win32-api.c winsup/testsuite/winsup.api/systemcall.c winsup/testsuite/winsup.api/waitpid.c winsup/testsuite/winsup.api/winsup.exp winsup/utils/ChangeLog winsup/utils/ChangeLog-2000 winsup/utils/Makefile.in winsup/utils/aclocal.m4 winsup/utils/configure winsup/utils/configure.in winsup/utils/cygcheck.cc winsup/utils/cygpath.cc winsup/utils/dump_setup.cc winsup/utils/dumper.cc winsup/utils/dumper.h winsup/utils/getfacl.c winsup/utils/ipcrm.c winsup/utils/ipcs.c winsup/utils/kill.cc winsup/utils/mkgroup.c winsup/utils/mkpasswd.c winsup/utils/module_info.cc winsup/utils/mount.cc winsup/utils/parse_pe.cc winsup/utils/passwd.c winsup/utils/path.cc winsup/utils/path.h winsup/utils/ps.cc winsup/utils/regtool.cc winsup/utils/setfacl.c winsup/utils/ssp.c winsup/utils/ssp.txt winsup/utils/strace.cc winsup/utils/umount.cc winsup/utils/utils.sgml winsup/w32api/CONTRIBUTIONS winsup/w32api/ChangeLog winsup/w32api/Makefile.in winsup/w32api/README.w32api winsup/w32api/TODO winsup/w32api/config.guess winsup/w32api/config.sub winsup/w32api/configure winsup/w32api/configure.in winsup/w32api/include/GL/gl.h winsup/w32api/include/GL/glext.h winsup/w32api/include/GL/glu.h winsup/w32api/include/accctrl.h winsup/w32api/include/aclapi.h winsup/w32api/include/aclui.h winsup/w32api/include/afxres.h winsup/w32api/include/basetsd.h winsup/w32api/include/basetyps.h winsup/w32api/include/cderr.h winsup/w32api/include/cguid.h winsup/w32api/include/comcat.h winsup/w32api/include/commctrl.h winsup/w32api/include/commdlg.h winsup/w32api/include/cpl.h winsup/w32api/include/cplext.h winsup/w32api/include/custcntl.h winsup/w32api/include/dbt.h winsup/w32api/include/dde.h winsup/w32api/include/ddeml.h winsup/w32api/include/ddk/atm.h winsup/w32api/include/ddk/batclass.h winsup/w32api/include/ddk/cfg.h winsup/w32api/include/ddk/cfgmgr32.h winsup/w32api/include/ddk/d4drvif.h winsup/w32api/include/ddk/d4iface.h winsup/w32api/include/ddk/ddkmapi.h winsup/w32api/include/ddk/hidclass.h winsup/w32api/include/ddk/hidpi.h winsup/w32api/include/ddk/hidsdi.h winsup/w32api/include/ddk/hidusage.h winsup/w32api/include/ddk/kbdmou.h winsup/w32api/include/ddk/mcd.h winsup/w32api/include/ddk/miniport.h winsup/w32api/include/ddk/minitape.h winsup/w32api/include/ddk/mountdev.h winsup/w32api/include/ddk/mountmgr.h winsup/w32api/include/ddk/ndis.h winsup/w32api/include/ddk/ndisguid.h winsup/w32api/include/ddk/ndistapi.h winsup/w32api/include/ddk/ndiswan.h winsup/w32api/include/ddk/netevent.h winsup/w32api/include/ddk/netpnp.h winsup/w32api/include/ddk/newdev.h winsup/w32api/include/ddk/ntapi.h winsup/w32api/include/ddk/ntdd8042.h winsup/w32api/include/ddk/ntddbeep.h winsup/w32api/include/ddk/ntddcdrm.h winsup/w32api/include/ddk/ntddcdvd.h winsup/w32api/include/ddk/ntddchgr.h winsup/w32api/include/ddk/ntdddisk.h winsup/w32api/include/ddk/ntddk.h winsup/w32api/include/ddk/ntddkbd.h winsup/w32api/include/ddk/ntddmou.h winsup/w32api/include/ddk/ntddndis.h winsup/w32api/include/ddk/ntddpar.h winsup/w32api/include/ddk/ntddpcm.h winsup/w32api/include/ddk/ntddscsi.h winsup/w32api/include/ddk/ntddser.h winsup/w32api/include/ddk/ntddstor.h winsup/w32api/include/ddk/ntddtape.h winsup/w32api/include/ddk/ntddtdi.h winsup/w32api/include/ddk/ntddvdeo.h winsup/w32api/include/ddk/ntddvol.h winsup/w32api/include/ddk/ntifs.h winsup/w32api/include/ddk/ntpoapi.h winsup/w32api/include/ddk/ntstatus.h winsup/w32api/include/ddk/parallel.h winsup/w32api/include/ddk/pfhook.h winsup/w32api/include/ddk/poclass.h winsup/w32api/include/ddk/scsi.h winsup/w32api/include/ddk/scsiscan.h winsup/w32api/include/ddk/scsiwmi.h winsup/w32api/include/ddk/smbus.h winsup/w32api/include/ddk/srb.h winsup/w32api/include/ddk/storport.h winsup/w32api/include/ddk/tdi.h winsup/w32api/include/ddk/tdiinfo.h winsup/w32api/include/ddk/tdikrnl.h winsup/w32api/include/ddk/tdistat.h winsup/w32api/include/ddk/tvout.h winsup/w32api/include/ddk/upssvc.h winsup/w32api/include/ddk/usb.h winsup/w32api/include/ddk/usb100.h winsup/w32api/include/ddk/usbcamdi.h winsup/w32api/include/ddk/usbdi.h winsup/w32api/include/ddk/usbioctl.h winsup/w32api/include/ddk/usbiodef.h winsup/w32api/include/ddk/usbscan.h winsup/w32api/include/ddk/usbuser.h winsup/w32api/include/ddk/video.h winsup/w32api/include/ddk/videoagp.h winsup/w32api/include/ddk/win2k.h winsup/w32api/include/ddk/winddi.h winsup/w32api/include/ddk/winddk.h winsup/w32api/include/ddk/winnt4.h winsup/w32api/include/ddk/winxp.h winsup/w32api/include/ddk/ws2san.h winsup/w32api/include/ddk/xfilter.h winsup/w32api/include/dhcpcsdk.h winsup/w32api/include/directx/d3d9.h winsup/w32api/include/directx/d3d9caps.h winsup/w32api/include/directx/d3d9types.h winsup/w32api/include/directx/dxerr8.h winsup/w32api/include/directx/dxerr9.h winsup/w32api/include/dlgs.h winsup/w32api/include/docobj.h winsup/w32api/include/errorrep.h winsup/w32api/include/exdisp.h winsup/w32api/include/exdispid.h winsup/w32api/include/httpext.h winsup/w32api/include/idispids.h winsup/w32api/include/imagehlp.h winsup/w32api/include/imm.h winsup/w32api/include/initguid.h winsup/w32api/include/intshcut.h winsup/w32api/include/ipexport.h winsup/w32api/include/iphlpapi.h winsup/w32api/include/ipifcons.h winsup/w32api/include/iprtrmib.h winsup/w32api/include/iptypes.h winsup/w32api/include/isguids.h winsup/w32api/include/largeint.h winsup/w32api/include/lm.h winsup/w32api/include/lmaccess.h winsup/w32api/include/lmalert.h winsup/w32api/include/lmapibuf.h winsup/w32api/include/lmat.h winsup/w32api/include/lmaudit.h winsup/w32api/include/lmbrowsr.h winsup/w32api/include/lmchdev.h winsup/w32api/include/lmconfig.h winsup/w32api/include/lmcons.h winsup/w32api/include/lmerr.h winsup/w32api/include/lmerrlog.h winsup/w32api/include/lmmsg.h winsup/w32api/include/lmremutl.h winsup/w32api/include/lmrepl.h winsup/w32api/include/lmserver.h winsup/w32api/include/lmshare.h winsup/w32api/include/lmsname.h winsup/w32api/include/lmstats.h winsup/w32api/include/lmsvc.h winsup/w32api/include/lmuse.h winsup/w32api/include/lmuseflg.h winsup/w32api/include/lmwksta.h winsup/w32api/include/lzexpand.h winsup/w32api/include/mapi.h winsup/w32api/include/mciavi.h winsup/w32api/include/mcx.h winsup/w32api/include/mgmtapi.h winsup/w32api/include/mmsystem.h winsup/w32api/include/msacm.h winsup/w32api/include/mshtml.h winsup/w32api/include/mswsock.h winsup/w32api/include/nb30.h winsup/w32api/include/nddeapi.h winsup/w32api/include/nspapi.h winsup/w32api/include/ntdef.h winsup/w32api/include/ntdll.h winsup/w32api/include/ntldap.h winsup/w32api/include/ntsecapi.h winsup/w32api/include/ntsecpkg.h winsup/w32api/include/oaidl.h winsup/w32api/include/objbase.h winsup/w32api/include/objfwd.h winsup/w32api/include/objidl.h winsup/w32api/include/objsafe.h winsup/w32api/include/ocidl.h winsup/w32api/include/odbcinst.h winsup/w32api/include/ole.h winsup/w32api/include/ole2.h winsup/w32api/include/ole2ver.h winsup/w32api/include/oleacc.h winsup/w32api/include/oleauto.h winsup/w32api/include/olectl.h winsup/w32api/include/olectlid.h winsup/w32api/include/oledlg.h winsup/w32api/include/oleidl.h winsup/w32api/include/pbt.h winsup/w32api/include/poppack.h winsup/w32api/include/powrprof.h winsup/w32api/include/prsht.h winsup/w32api/include/psapi.h winsup/w32api/include/pshpack1.h winsup/w32api/include/pshpack2.h winsup/w32api/include/pshpack4.h winsup/w32api/include/pshpack8.h winsup/w32api/include/rapi.h winsup/w32api/include/ras.h winsup/w32api/include/rasdlg.h winsup/w32api/include/raserror.h winsup/w32api/include/rassapi.h winsup/w32api/include/reason.h winsup/w32api/include/regstr.h winsup/w32api/include/richedit.h winsup/w32api/include/richole.h winsup/w32api/include/rpc.h winsup/w32api/include/rpcdce.h winsup/w32api/include/rpcdce2.h winsup/w32api/include/rpcdcep.h winsup/w32api/include/rpcndr.h winsup/w32api/include/rpcnsi.h winsup/w32api/include/rpcnsip.h winsup/w32api/include/rpcnterr.h winsup/w32api/include/rpcproxy.h winsup/w32api/include/schannel.h winsup/w32api/include/schnlsp.h winsup/w32api/include/scrnsave.h winsup/w32api/include/sddl.h winsup/w32api/include/secext.h winsup/w32api/include/security.h winsup/w32api/include/servprov.h winsup/w32api/include/setupapi.h winsup/w32api/include/shellapi.h winsup/w32api/include/shldisp.h winsup/w32api/include/shlguid.h winsup/w32api/include/shlobj.h winsup/w32api/include/shlwapi.h winsup/w32api/include/snmp.h winsup/w32api/include/sql.h winsup/w32api/include/sqlext.h winsup/w32api/include/sqltypes.h winsup/w32api/include/sqlucode.h winsup/w32api/include/sspi.h winsup/w32api/include/subauth.h winsup/w32api/include/svcguid.h winsup/w32api/include/tlhelp32.h winsup/w32api/include/tmschema.h winsup/w32api/include/unknwn.h winsup/w32api/include/userenv.h winsup/w32api/include/uxtheme.h winsup/w32api/include/vfw.h winsup/w32api/include/w32api.h winsup/w32api/include/winable.h winsup/w32api/include/winbase.h winsup/w32api/include/winber.h winsup/w32api/include/wincon.h winsup/w32api/include/wincrypt.h winsup/w32api/include/windef.h winsup/w32api/include/windns.h winsup/w32api/include/windows.h winsup/w32api/include/windowsx.h winsup/w32api/include/winerror.h winsup/w32api/include/wingdi.h winsup/w32api/include/wininet.h winsup/w32api/include/winioctl.h winsup/w32api/include/winldap.h winsup/w32api/include/winnetwk.h winsup/w32api/include/winnls.h winsup/w32api/include/winnt.h winsup/w32api/include/winperf.h winsup/w32api/include/winreg.h winsup/w32api/include/winresrc.h winsup/w32api/include/winsnmp.h winsup/w32api/include/winsock.h winsup/w32api/include/winsock2.h winsup/w32api/include/winspool.h winsup/w32api/include/winsvc.h winsup/w32api/include/winuser.h winsup/w32api/include/winver.h winsup/w32api/include/ws2spi.h winsup/w32api/include/ws2tcpip.h winsup/w32api/include/wsahelp.h winsup/w32api/include/wsipx.h winsup/w32api/include/wsnetbs.h winsup/w32api/include/wtypes.h winsup/w32api/include/zmouse.h winsup/w32api/install-sh winsup/w32api/lib/Makefile.in winsup/w32api/lib/aclui.def winsup/w32api/lib/advapi32.def winsup/w32api/lib/avicap32.def winsup/w32api/lib/avifil32.def winsup/w32api/lib/cap.def winsup/w32api/lib/comctl32.def winsup/w32api/lib/comdlg32.def winsup/w32api/lib/crypt32.def winsup/w32api/lib/ctl3d32.def winsup/w32api/lib/ddk/Makefile.in winsup/w32api/lib/ddk/apcups.def winsup/w32api/lib/ddk/cfgmgr32.def winsup/w32api/lib/ddk/dxapi.def winsup/w32api/lib/ddk/hal.def winsup/w32api/lib/ddk/hid.def winsup/w32api/lib/ddk/hidparse.def winsup/w32api/lib/ddk/mcd.def winsup/w32api/lib/ddk/ndis.def winsup/w32api/lib/ddk/newdev.def winsup/w32api/lib/ddk/ntoskrnl.def winsup/w32api/lib/ddk/scsiport.def winsup/w32api/lib/ddk/tdi.def winsup/w32api/lib/ddk/usbcamd.def winsup/w32api/lib/ddk/usbcamd2.def winsup/w32api/lib/ddk/videoprt.def winsup/w32api/lib/ddk/win32k.def winsup/w32api/lib/dhcpcsvc.def winsup/w32api/lib/directx/Makefile.in winsup/w32api/lib/directx/d3d8.def winsup/w32api/lib/directx/d3d9.def winsup/w32api/lib/directx/d3dim.def winsup/w32api/lib/directx/d3drm.def winsup/w32api/lib/directx/d3dx8d.def winsup/w32api/lib/directx/d3dx9d.def winsup/w32api/lib/directx/d3dxof.def winsup/w32api/lib/directx/ddraw.def winsup/w32api/lib/directx/dinput.def winsup/w32api/lib/directx/dinput8.def winsup/w32api/lib/directx/dinput_joy.c winsup/w32api/lib/directx/dinput_joy2.c winsup/w32api/lib/directx/dinput_kbd.c winsup/w32api/lib/directx/dinput_mouse.c winsup/w32api/lib/directx/dinput_mouse2.c winsup/w32api/lib/directx/dinput_private.h winsup/w32api/lib/directx/dmoguids.c winsup/w32api/lib/directx/dplayx.def winsup/w32api/lib/directx/dpnaddr.def winsup/w32api/lib/directx/dpnet.def winsup/w32api/lib/directx/dpnlobby.def winsup/w32api/lib/directx/dpvoice.def winsup/w32api/lib/directx/dsetup.def winsup/w32api/lib/directx/dsound.def winsup/w32api/lib/directx/dxerr.c winsup/w32api/lib/directx/dxerr8.c winsup/w32api/lib/directx/dxerr8w.c winsup/w32api/lib/directx/dxerr9.c winsup/w32api/lib/directx/dxerr9w.c winsup/w32api/lib/directx/dxguid.c winsup/w32api/lib/directx/ksproxy.def winsup/w32api/lib/directx/ksuser.c winsup/w32api/lib/directx/ksuser.def winsup/w32api/lib/directx/msdmo.def winsup/w32api/lib/directx/quartz.def winsup/w32api/lib/directx/strmiids.c winsup/w32api/lib/directx/test.c winsup/w32api/lib/dlcapi.def winsup/w32api/lib/dnsapi.def winsup/w32api/lib/faultrep.def winsup/w32api/lib/gdi32.def winsup/w32api/lib/glaux.def winsup/w32api/lib/glu32.def winsup/w32api/lib/glut.def winsup/w32api/lib/glut32.def winsup/w32api/lib/igmpagnt.def winsup/w32api/lib/imagehlp.def winsup/w32api/lib/imm32.def winsup/w32api/lib/iphlpapi.def winsup/w32api/lib/kernel32.c winsup/w32api/lib/kernel32.def winsup/w32api/lib/largeint.c winsup/w32api/lib/lz32.def winsup/w32api/lib/mapi32.def winsup/w32api/lib/mfcuia32.def winsup/w32api/lib/mgmtapi.def winsup/w32api/lib/mpr.def winsup/w32api/lib/msacm32.def winsup/w32api/lib/mshtml-uuid.c winsup/w32api/lib/msimg32.def winsup/w32api/lib/msvcp60.def winsup/w32api/lib/msvfw32.def winsup/w32api/lib/mswsock.def winsup/w32api/lib/msxml-uuid.c winsup/w32api/lib/nddeapi.def winsup/w32api/lib/netapi32.def winsup/w32api/lib/ntdll.def winsup/w32api/lib/odbc32.def winsup/w32api/lib/odbccp32.def winsup/w32api/lib/ole32.def winsup/w32api/lib/oleacc.def winsup/w32api/lib/oleaut32.def winsup/w32api/lib/olecli32.def winsup/w32api/lib/oledlg.def winsup/w32api/lib/olepro32.def winsup/w32api/lib/olesvr32.def winsup/w32api/lib/opengl32.def winsup/w32api/lib/penwin32.def winsup/w32api/lib/pkpd32.def winsup/w32api/lib/powrprof.def winsup/w32api/lib/psapi.def winsup/w32api/lib/rapi.def winsup/w32api/lib/rasapi32.def winsup/w32api/lib/rasdlg.def winsup/w32api/lib/res.rc winsup/w32api/lib/rpcdce4.def winsup/w32api/lib/rpcns4.def winsup/w32api/lib/rpcrt4.def winsup/w32api/lib/scrnsave.c winsup/w32api/lib/secur32.def winsup/w32api/lib/setupapi.def winsup/w32api/lib/shell32.c winsup/w32api/lib/shell32.def winsup/w32api/lib/shfolder.def winsup/w32api/lib/shlwapi.def winsup/w32api/lib/snmpapi.def winsup/w32api/lib/svrapi.def winsup/w32api/lib/tapi32.def winsup/w32api/lib/test.c winsup/w32api/lib/th32.def winsup/w32api/lib/thunk32.def winsup/w32api/lib/url.def winsup/w32api/lib/user32.def winsup/w32api/lib/userenv.def winsup/w32api/lib/uuid.c winsup/w32api/lib/uxtheme.def winsup/w32api/lib/vdmdbg.def winsup/w32api/lib/version.def winsup/w32api/lib/vfw32.mri winsup/w32api/lib/win32spl.def winsup/w32api/lib/wininet.def winsup/w32api/lib/winmm.def winsup/w32api/lib/winspool.def winsup/w32api/lib/winstrm.def winsup/w32api/lib/wldap32.def winsup/w32api/lib/wow32.def winsup/w32api/lib/ws2_32.c winsup/w32api/lib/ws2_32.def winsup/w32api/lib/wsnmp32.def winsup/w32api/lib/wsock32.def winsup/w32api/lib/wst.def winsup/w32api/lib/wtsapi32.def --- winsup/cygwin/CYGWIN_LICENSE | 38 - winsup/cygwin/ChangeLog | 1194 --- winsup/cygwin/ChangeLog-1995 | 177 - winsup/cygwin/ChangeLog-1996 | 2031 ---- winsup/cygwin/ChangeLog-1997 | 2800 ------ winsup/cygwin/ChangeLog-1998 | 4490 --------- winsup/cygwin/ChangeLog-1999 | 3562 ------- winsup/cygwin/ChangeLog-2000 | 4150 -------- winsup/cygwin/ChangeLog-2001 | 5337 ---------- winsup/cygwin/ChangeLog-2002 | 6655 ------------- winsup/cygwin/ChangeLog-2003 | 5678 ----------- winsup/cygwin/ChangeLog-2004 | 3848 ------- winsup/cygwin/ChangeLog-2005 | 5813 ----------- winsup/cygwin/Makefile.in | 472 - winsup/cygwin/ROADMAP | 129 - winsup/cygwin/acconfig.h | 14 - winsup/cygwin/analyze_sigfe | 80 - winsup/cygwin/ansi.sgml | 59 - winsup/cygwin/assert.cc | 55 - winsup/cygwin/autoload.cc | 569 -- winsup/cygwin/automode.c | 26 - winsup/cygwin/binmode.c | 21 - winsup/cygwin/child_info.h | 136 - winsup/cygwin/config.h.in | 53 - winsup/cygwin/config/i386/profile.h | 58 - winsup/cygwin/configure | 2541 ----- winsup/cygwin/configure.in | 189 - winsup/cygwin/cpuid.h | 35 - winsup/cygwin/crt0.c | 55 - winsup/cygwin/ctype.cc | 112 - winsup/cygwin/cxx.cc | 56 - winsup/cygwin/cygerrno.h | 52 - winsup/cygwin/cygheap.cc | 436 - winsup/cygwin/cygheap.h | 435 - winsup/cygwin/cygmagic | 34 - winsup/cygwin/cygmalloc.h | 34 - winsup/cygwin/cygserver.h | 190 - winsup/cygwin/cygserver_ipc.h | 84 - winsup/cygwin/cygserver_msg.h | 91 - winsup/cygwin/cygserver_sem.h | 87 - winsup/cygwin/cygserver_shm.h | 98 - winsup/cygwin/cygthread.cc | 514 - winsup/cygwin/cygthread.h | 57 - winsup/cygwin/cygtls.cc | 275 - winsup/cygwin/cygtls.h | 261 - winsup/cygwin/cygwin-shilka | 8 - winsup/cygwin/cygwin.din | 1621 --- winsup/cygwin/cygwin.sc | 142 - winsup/cygwin/cygwin_version.h | 31 - winsup/cygwin/dcrt0.cc | 1205 --- winsup/cygwin/debug.cc | 231 - winsup/cygwin/debug.h | 91 - winsup/cygwin/delqueue.cc | 103 - winsup/cygwin/devices.cc | 14933 ---------------------------- winsup/cygwin/devices.h | 182 - winsup/cygwin/devices.in | 157 - winsup/cygwin/dir.cc | 320 - winsup/cygwin/dlfcn.cc | 169 - winsup/cygwin/dll_init.cc | 430 - winsup/cygwin/dll_init.h | 92 - winsup/cygwin/dll_init.sgml | 11 - winsup/cygwin/dllfixdbg | 73 - winsup/cygwin/dlmalloc.c | 3815 ------- winsup/cygwin/dlmalloc.h | 93 - winsup/cygwin/dtable.cc | 912 -- winsup/cygwin/dtable.h | 102 - winsup/cygwin/dtable.sgml | 20 - winsup/cygwin/environ.cc | 1107 --- winsup/cygwin/environ.h | 50 - winsup/cygwin/errno.cc | 356 - winsup/cygwin/exceptions.cc | 1407 --- winsup/cygwin/exec.cc | 99 - winsup/cygwin/external.cc | 355 - winsup/cygwin/external.sgml | 18 - winsup/cygwin/fcntl.cc | 85 - winsup/cygwin/fhandler.cc | 1673 ---- winsup/cygwin/fhandler.h | 1374 --- winsup/cygwin/fhandler_clipboard.cc | 285 - winsup/cygwin/fhandler_console.cc | 1896 ---- winsup/cygwin/fhandler_disk_file.cc | 2034 ---- winsup/cygwin/fhandler_dsp.cc | 1374 --- winsup/cygwin/fhandler_fifo.cc | 199 - winsup/cygwin/fhandler_floppy.cc | 478 - winsup/cygwin/fhandler_mailslot.cc | 160 - winsup/cygwin/fhandler_mem.cc | 284 - winsup/cygwin/fhandler_netdrive.cc | 277 - winsup/cygwin/fhandler_nodevice.cc | 41 - winsup/cygwin/fhandler_proc.cc | 1103 -- winsup/cygwin/fhandler_process.cc | 978 -- winsup/cygwin/fhandler_random.cc | 164 - winsup/cygwin/fhandler_raw.cc | 215 - winsup/cygwin/fhandler_registry.cc | 679 -- winsup/cygwin/fhandler_serial.cc | 1080 -- winsup/cygwin/fhandler_socket.cc | 1690 ---- winsup/cygwin/fhandler_tape.cc | 1520 --- winsup/cygwin/fhandler_termios.cc | 376 - winsup/cygwin/fhandler_tty.cc | 1425 --- winsup/cygwin/fhandler_virtual.cc | 263 - winsup/cygwin/fhandler_windows.cc | 144 - winsup/cygwin/fhandler_zero.cc | 55 - winsup/cygwin/flock.cc | 89 - winsup/cygwin/fork.cc | 711 -- winsup/cygwin/gcrt0.c | 41 - winsup/cygwin/gendef | 451 - winsup/cygwin/gendevices | 159 - winsup/cygwin/gentls_offsets | 91 - winsup/cygwin/glob.c | 949 -- winsup/cygwin/gmon.c | 285 - winsup/cygwin/gmon.h | 166 - winsup/cygwin/grp.cc | 553 - winsup/cygwin/heap.cc | 164 - winsup/cygwin/heap.h | 20 - winsup/cygwin/hires.h | 53 - winsup/cygwin/hookapi.cc | 227 - winsup/cygwin/how-autoload-works.txt | 66 - winsup/cygwin/how-cygheap-works.txt | 120 - winsup/cygwin/how-cygtls-works.txt | 75 - winsup/cygwin/how-fhandlers-work.txt | 75 - winsup/cygwin/how-signals-work.txt | 158 - winsup/cygwin/how-spawn-works.txt | 32 - winsup/cygwin/how-to-debug-cygwin.txt | 128 - winsup/cygwin/how-vfork-works.txt | 36 - winsup/cygwin/include/a.out.h | 431 - winsup/cygwin/include/arpa/ftp.h | 109 - winsup/cygwin/include/arpa/inet.h | 37 - winsup/cygwin/include/arpa/telnet.h | 322 - winsup/cygwin/include/asm/byteorder.h | 103 - winsup/cygwin/include/asm/socket.h | 72 - winsup/cygwin/include/asm/types.h | 23 - winsup/cygwin/include/byteswap.h | 39 - winsup/cygwin/include/ctype.h | 76 - winsup/cygwin/include/cygwin/_types.h | 16 - winsup/cygwin/include/cygwin/acl.h | 98 - winsup/cygwin/include/cygwin/config.h | 48 - winsup/cygwin/include/cygwin/core_dump.h | 73 - winsup/cygwin/include/cygwin/cygwin_dll.h | 94 - winsup/cygwin/include/cygwin/fs.h | 20 - winsup/cygwin/include/cygwin/grp.h | 48 - winsup/cygwin/include/cygwin/hdreg.h | 24 - winsup/cygwin/include/cygwin/icmp.h | 1 - winsup/cygwin/include/cygwin/if.h | 90 - winsup/cygwin/include/cygwin/in.h | 205 - winsup/cygwin/include/cygwin/in_systm.h | 34 - winsup/cygwin/include/cygwin/ipc.h | 71 - winsup/cygwin/include/cygwin/msg.h | 102 - winsup/cygwin/include/cygwin/mtio.h | 313 - winsup/cygwin/include/cygwin/rdevio.h | 42 - winsup/cygwin/include/cygwin/sem.h | 128 - winsup/cygwin/include/cygwin/shm.h | 106 - winsup/cygwin/include/cygwin/signal.h | 271 - winsup/cygwin/include/cygwin/socket.h | 267 - winsup/cygwin/include/cygwin/sockios.h | 1 - winsup/cygwin/include/cygwin/stat.h | 88 - winsup/cygwin/include/cygwin/stdlib.h | 66 - winsup/cygwin/include/cygwin/sys_time.h | 27 - winsup/cygwin/include/cygwin/sysproto.h | 94 - winsup/cygwin/include/cygwin/time.h | 43 - winsup/cygwin/include/cygwin/types.h | 252 - winsup/cygwin/include/cygwin/uio.h | 1 - winsup/cygwin/include/cygwin/utmp.h | 40 - winsup/cygwin/include/cygwin/version.h | 364 - winsup/cygwin/include/dlfcn.h | 42 - winsup/cygwin/include/elf.h | 25 - winsup/cygwin/include/endian.h | 40 - winsup/cygwin/include/err.h | 33 - winsup/cygwin/include/exceptions.h | 115 - winsup/cygwin/include/fcntl.h | 26 - winsup/cygwin/include/features.h | 35 - winsup/cygwin/include/fnmatch.h | 63 - winsup/cygwin/include/fts.h | 153 - winsup/cygwin/include/ftw.h | 70 - winsup/cygwin/include/getopt.h | 92 - winsup/cygwin/include/glob.h | 113 - winsup/cygwin/include/icmp.h | 1 - winsup/cygwin/include/inttypes.h | 247 - winsup/cygwin/include/io.h | 29 - winsup/cygwin/include/lastlog.h | 22 - winsup/cygwin/include/libgen.h | 23 - winsup/cygwin/include/limits.h | 193 - winsup/cygwin/include/machine/stdlib.h | 22 - winsup/cygwin/include/mapi.h | 102 - winsup/cygwin/include/memory.h | 17 - winsup/cygwin/include/mntent.h | 48 - winsup/cygwin/include/net/if.h | 16 - winsup/cygwin/include/netdb.h | 168 - winsup/cygwin/include/netinet/in.h | 16 - winsup/cygwin/include/netinet/in_systm.h | 16 - winsup/cygwin/include/netinet/ip.h | 202 - winsup/cygwin/include/netinet/ip_icmp.h | 16 - winsup/cygwin/include/netinet/tcp.h | 144 - winsup/cygwin/include/netinet/udp.h | 51 - winsup/cygwin/include/paths.h | 30 - winsup/cygwin/include/poll.h | 11 - winsup/cygwin/include/pthread.h | 204 - winsup/cygwin/include/pty.h | 18 - winsup/cygwin/include/sched.h | 64 - winsup/cygwin/include/search.h | 73 - winsup/cygwin/include/semaphore.h | 45 - winsup/cygwin/include/stdint.h | 182 - winsup/cygwin/include/strings.h | 6 - winsup/cygwin/include/sys/acl.h | 17 - winsup/cygwin/include/sys/cdefs.h | 23 - winsup/cygwin/include/sys/copying.dj | 41 - winsup/cygwin/include/sys/cygwin.h | 273 - winsup/cygwin/include/sys/dirent.h | 107 - winsup/cygwin/include/sys/elf32.h | 156 - winsup/cygwin/include/sys/elf64.h | 172 - winsup/cygwin/include/sys/elf_common.h | 299 - winsup/cygwin/include/sys/elf_generic.h | 91 - winsup/cygwin/include/sys/file.h | 54 - winsup/cygwin/include/sys/ioctl.h | 68 - winsup/cygwin/include/sys/ipc.h | 18 - winsup/cygwin/include/sys/lock.h | 54 - winsup/cygwin/include/sys/mman.h | 63 - winsup/cygwin/include/sys/mount.h | 44 - winsup/cygwin/include/sys/msg.h | 18 - winsup/cygwin/include/sys/mtio.h | 18 - winsup/cygwin/include/sys/param.h | 81 - winsup/cygwin/include/sys/poll.h | 43 - winsup/cygwin/include/sys/procfs.h | 18 - winsup/cygwin/include/sys/queue.h | 558 -- winsup/cygwin/include/sys/resource.h | 84 - winsup/cygwin/include/sys/select.h | 41 - winsup/cygwin/include/sys/sem.h | 18 - winsup/cygwin/include/sys/shm.h | 18 - winsup/cygwin/include/sys/smallprint.h | 27 - winsup/cygwin/include/sys/socket.h | 56 - winsup/cygwin/include/sys/soundcard.h | 1287 --- winsup/cygwin/include/sys/statfs.h | 11 - winsup/cygwin/include/sys/statvfs.h | 44 - winsup/cygwin/include/sys/stdio.h | 38 - winsup/cygwin/include/sys/strace.h | 155 - winsup/cygwin/include/sys/syslog.h | 143 - winsup/cygwin/include/sys/sysmacros.h | 24 - winsup/cygwin/include/sys/sysproto.h | 18 - winsup/cygwin/include/sys/termio.h | 12 - winsup/cygwin/include/sys/termios.h | 341 - winsup/cygwin/include/sys/ttychars.h | 1 - winsup/cygwin/include/sys/uio.h | 38 - winsup/cygwin/include/sys/un.h | 28 - winsup/cygwin/include/sys/utime.h | 30 - winsup/cygwin/include/sys/utmp.h | 55 - winsup/cygwin/include/sys/utsname.h | 33 - winsup/cygwin/include/sys/vfs.h | 38 - winsup/cygwin/include/sys/wait.h | 74 - winsup/cygwin/include/sysexits.h | 118 - winsup/cygwin/include/syslog.h | 16 - winsup/cygwin/include/termio.h | 16 - winsup/cygwin/include/tzfile.h | 51 - winsup/cygwin/include/utmpx.h | 55 - winsup/cygwin/init.cc | 163 - winsup/cygwin/ioctl.cc | 63 - winsup/cygwin/ipc.cc | 92 - winsup/cygwin/lib/_cygwin_crt0_common.cc | 103 - winsup/cygwin/lib/crt0.h | 22 - winsup/cygwin/lib/cygwin_attach_dll.c | 25 - winsup/cygwin/lib/cygwin_crt0.c | 33 - winsup/cygwin/lib/dll_entry.c | 17 - winsup/cygwin/lib/dll_main.cc | 41 - winsup/cygwin/lib/libcmain.c | 44 - winsup/cygwin/lib/premain0.c | 14 - winsup/cygwin/lib/premain1.c | 14 - winsup/cygwin/lib/premain2.c | 14 - winsup/cygwin/lib/premain3.c | 14 - winsup/cygwin/lib/pseudo-reloc.c | 46 - winsup/cygwin/libc/bsdlib.cc | 312 - winsup/cygwin/libc/fnmatch.c | 220 - winsup/cygwin/libc/fts.c | 1253 --- winsup/cygwin/libc/ftw.c | 102 - winsup/cygwin/libc/getopt.c | 548 - winsup/cygwin/libc/iruserok.c | 270 - winsup/cygwin/libc/memmem.cc | 67 - winsup/cygwin/libc/nftw.c | 121 - winsup/cygwin/libc/strptime.cc | 545 - winsup/cygwin/libc/timelocal.cc | 125 - winsup/cygwin/libc/timelocal.h | 65 - winsup/cygwin/localtime.cc | 2166 ---- winsup/cygwin/lsearch.cc | 56 - winsup/cygwin/malloc.cc | 5064 ---------- winsup/cygwin/malloc_wrapper.cc | 273 - winsup/cygwin/mcount.c | 173 - winsup/cygwin/misc-std.sgml | 74 - winsup/cygwin/miscfuncs.cc | 371 - winsup/cygwin/mktemp.cc | 186 - winsup/cygwin/mkvers.sh | 177 - winsup/cygwin/mmap.cc | 2022 ---- winsup/cygwin/msg.cc | 213 - winsup/cygwin/mtinfo.h | 147 - winsup/cygwin/net.cc | 2270 ----- winsup/cygwin/netdb.cc | 423 - winsup/cygwin/newsym | 33 - winsup/cygwin/ntdll.h | 615 -- winsup/cygwin/ntea.cc | 325 - winsup/cygwin/passwd.cc | 309 - winsup/cygwin/path.cc | 4314 -------- winsup/cygwin/path.h | 317 - winsup/cygwin/path.sgml | 207 - winsup/cygwin/perprocess.h | 28 - winsup/cygwin/pinfo.cc | 1326 --- winsup/cygwin/pinfo.h | 258 - winsup/cygwin/pipe.cc | 538 - winsup/cygwin/poll.cc | 152 - winsup/cygwin/posix.sgml | 98 - winsup/cygwin/profil.c | 175 - winsup/cygwin/profil.h | 44 - winsup/cygwin/pseudo-reloc.cc | 46 - winsup/cygwin/pthread.cc | 251 - winsup/cygwin/pwdgrp.h | 83 - winsup/cygwin/regex/COPYRIGHT | 20 - winsup/cygwin/regex/cclass.h | 31 - winsup/cygwin/regex/cname.h | 102 - winsup/cygwin/regex/engine.c | 1019 -- winsup/cygwin/regex/engine.ih | 35 - winsup/cygwin/regex/mkh | 76 - winsup/cygwin/regex/regcomp.c | 1546 --- winsup/cygwin/regex/regcomp.ih | 48 - winsup/cygwin/regex/regerror.c | 127 - winsup/cygwin/regex/regerror.ih | 12 - winsup/cygwin/regex/regex.3 | 509 - winsup/cygwin/regex/regex.7 | 235 - winsup/cygwin/regex/regex.h | 83 - winsup/cygwin/regex/regex2.h | 134 - winsup/cygwin/regex/regexec.c | 141 - winsup/cygwin/regex/regfree.c | 38 - winsup/cygwin/regex/tests | 477 - winsup/cygwin/regex/utils.h | 22 - winsup/cygwin/regexp/COPYRIGHT | 22 - winsup/cygwin/regexp/README | 84 - winsup/cygwin/regexp/regexp.h | 34 - winsup/cygwin/regexp/regmagic.h | 17 - winsup/cygwin/regexp/v8_regerror.c | 28 - winsup/cygwin/regexp/v8_regexp.c | 1321 --- winsup/cygwin/regexp/v8_regsub.c | 88 - winsup/cygwin/registry.cc | 264 - winsup/cygwin/registry.h | 44 - winsup/cygwin/resource.cc | 193 - winsup/cygwin/rmsym | 9 - winsup/cygwin/scandir.cc | 93 - winsup/cygwin/sched.cc | 501 - winsup/cygwin/sec_acl.cc | 975 -- winsup/cygwin/sec_helper.cc | 566 -- winsup/cygwin/security.cc | 1862 ---- winsup/cygwin/security.h | 397 - winsup/cygwin/select.cc | 1710 ---- winsup/cygwin/select.h | 55 - winsup/cygwin/sem.cc | 164 - winsup/cygwin/shared.cc | 292 - winsup/cygwin/shared.sgml | 17 - winsup/cygwin/shared_info.h | 204 - winsup/cygwin/shm.cc | 370 - winsup/cygwin/signal.cc | 549 - winsup/cygwin/sigproc.cc | 1262 --- winsup/cygwin/sigproc.h | 98 - winsup/cygwin/smallprint.c | 247 - winsup/cygwin/spawn.cc | 1195 --- winsup/cygwin/speclib | 52 - winsup/cygwin/stackdump.sgml | 13 - winsup/cygwin/strace.cc | 469 - winsup/cygwin/string.h | 129 - winsup/cygwin/strsep.cc | 64 - winsup/cygwin/strsig.cc | 84 - winsup/cygwin/sync.cc | 157 - winsup/cygwin/sync.h | 71 - winsup/cygwin/syscalls.cc | 3164 ------ winsup/cygwin/sysconf.cc | 133 - winsup/cygwin/syslog.cc | 549 - winsup/cygwin/termios.cc | 306 - winsup/cygwin/textmode.c | 21 - winsup/cygwin/textreadmode.c | 25 - winsup/cygwin/thread.cc | 3334 ------- winsup/cygwin/thread.h | 705 -- winsup/cygwin/timer.cc | 452 - winsup/cygwin/times.cc | 748 -- winsup/cygwin/tlsoffsets.h | 133 - winsup/cygwin/tty.cc | 500 - winsup/cygwin/tty.h | 139 - winsup/cygwin/tz_posixrules.h | 48 - winsup/cygwin/uinfo.cc | 572 -- winsup/cygwin/uname.cc | 115 - winsup/cygwin/wait.cc | 121 - winsup/cygwin/winbase.h | 67 - winsup/cygwin/wincap.cc | 874 -- winsup/cygwin/wincap.h | 149 - winsup/cygwin/window.cc | 140 - winsup/cygwin/wininfo.h | 25 - winsup/cygwin/winsup.h | 360 - winsup/cygwin/winver.rc | 53 - 387 files changed, 175968 deletions(-) delete mode 100644 winsup/cygwin/CYGWIN_LICENSE delete mode 100644 winsup/cygwin/ChangeLog delete mode 100644 winsup/cygwin/ChangeLog-1995 delete mode 100644 winsup/cygwin/ChangeLog-1996 delete mode 100644 winsup/cygwin/ChangeLog-1997 delete mode 100644 winsup/cygwin/ChangeLog-1998 delete mode 100644 winsup/cygwin/ChangeLog-1999 delete mode 100644 winsup/cygwin/ChangeLog-2000 delete mode 100644 winsup/cygwin/ChangeLog-2001 delete mode 100644 winsup/cygwin/ChangeLog-2002 delete mode 100644 winsup/cygwin/ChangeLog-2003 delete mode 100644 winsup/cygwin/ChangeLog-2004 delete mode 100644 winsup/cygwin/ChangeLog-2005 delete mode 100644 winsup/cygwin/Makefile.in delete mode 100644 winsup/cygwin/ROADMAP delete mode 100644 winsup/cygwin/acconfig.h delete mode 100755 winsup/cygwin/analyze_sigfe delete mode 100644 winsup/cygwin/ansi.sgml delete mode 100644 winsup/cygwin/assert.cc delete mode 100644 winsup/cygwin/autoload.cc delete mode 100644 winsup/cygwin/automode.c delete mode 100644 winsup/cygwin/binmode.c delete mode 100644 winsup/cygwin/child_info.h delete mode 100644 winsup/cygwin/config.h.in delete mode 100644 winsup/cygwin/config/i386/profile.h delete mode 100755 winsup/cygwin/configure delete mode 100644 winsup/cygwin/configure.in delete mode 100644 winsup/cygwin/cpuid.h delete mode 100644 winsup/cygwin/crt0.c delete mode 100644 winsup/cygwin/ctype.cc delete mode 100644 winsup/cygwin/cxx.cc delete mode 100644 winsup/cygwin/cygerrno.h delete mode 100644 winsup/cygwin/cygheap.cc delete mode 100644 winsup/cygwin/cygheap.h delete mode 100755 winsup/cygwin/cygmagic delete mode 100644 winsup/cygwin/cygmalloc.h delete mode 100644 winsup/cygwin/cygserver.h delete mode 100644 winsup/cygwin/cygserver_ipc.h delete mode 100644 winsup/cygwin/cygserver_msg.h delete mode 100644 winsup/cygwin/cygserver_sem.h delete mode 100644 winsup/cygwin/cygserver_shm.h delete mode 100644 winsup/cygwin/cygthread.cc delete mode 100644 winsup/cygwin/cygthread.h delete mode 100644 winsup/cygwin/cygtls.cc delete mode 100644 winsup/cygwin/cygtls.h delete mode 100755 winsup/cygwin/cygwin-shilka delete mode 100644 winsup/cygwin/cygwin.din delete mode 100644 winsup/cygwin/cygwin.sc delete mode 100644 winsup/cygwin/cygwin_version.h delete mode 100644 winsup/cygwin/dcrt0.cc delete mode 100644 winsup/cygwin/debug.cc delete mode 100644 winsup/cygwin/debug.h delete mode 100644 winsup/cygwin/delqueue.cc delete mode 100644 winsup/cygwin/devices.cc delete mode 100644 winsup/cygwin/devices.h delete mode 100644 winsup/cygwin/devices.in delete mode 100644 winsup/cygwin/dir.cc delete mode 100644 winsup/cygwin/dlfcn.cc delete mode 100644 winsup/cygwin/dll_init.cc delete mode 100644 winsup/cygwin/dll_init.h delete mode 100644 winsup/cygwin/dll_init.sgml delete mode 100755 winsup/cygwin/dllfixdbg delete mode 100644 winsup/cygwin/dlmalloc.c delete mode 100644 winsup/cygwin/dlmalloc.h delete mode 100644 winsup/cygwin/dtable.cc delete mode 100644 winsup/cygwin/dtable.h delete mode 100644 winsup/cygwin/dtable.sgml delete mode 100644 winsup/cygwin/environ.cc delete mode 100644 winsup/cygwin/environ.h delete mode 100644 winsup/cygwin/errno.cc delete mode 100644 winsup/cygwin/exceptions.cc delete mode 100644 winsup/cygwin/exec.cc delete mode 100644 winsup/cygwin/external.cc delete mode 100644 winsup/cygwin/external.sgml delete mode 100644 winsup/cygwin/fcntl.cc delete mode 100644 winsup/cygwin/fhandler.cc delete mode 100644 winsup/cygwin/fhandler.h delete mode 100644 winsup/cygwin/fhandler_clipboard.cc delete mode 100644 winsup/cygwin/fhandler_console.cc delete mode 100644 winsup/cygwin/fhandler_disk_file.cc delete mode 100644 winsup/cygwin/fhandler_dsp.cc delete mode 100644 winsup/cygwin/fhandler_fifo.cc delete mode 100644 winsup/cygwin/fhandler_floppy.cc delete mode 100644 winsup/cygwin/fhandler_mailslot.cc delete mode 100644 winsup/cygwin/fhandler_mem.cc delete mode 100644 winsup/cygwin/fhandler_netdrive.cc delete mode 100644 winsup/cygwin/fhandler_nodevice.cc delete mode 100644 winsup/cygwin/fhandler_proc.cc delete mode 100644 winsup/cygwin/fhandler_process.cc delete mode 100644 winsup/cygwin/fhandler_random.cc delete mode 100644 winsup/cygwin/fhandler_raw.cc delete mode 100644 winsup/cygwin/fhandler_registry.cc delete mode 100644 winsup/cygwin/fhandler_serial.cc delete mode 100644 winsup/cygwin/fhandler_socket.cc delete mode 100644 winsup/cygwin/fhandler_tape.cc delete mode 100644 winsup/cygwin/fhandler_termios.cc delete mode 100644 winsup/cygwin/fhandler_tty.cc delete mode 100644 winsup/cygwin/fhandler_virtual.cc delete mode 100644 winsup/cygwin/fhandler_windows.cc delete mode 100644 winsup/cygwin/fhandler_zero.cc delete mode 100644 winsup/cygwin/flock.cc delete mode 100644 winsup/cygwin/fork.cc delete mode 100644 winsup/cygwin/gcrt0.c delete mode 100755 winsup/cygwin/gendef delete mode 100755 winsup/cygwin/gendevices delete mode 100755 winsup/cygwin/gentls_offsets delete mode 100644 winsup/cygwin/glob.c delete mode 100644 winsup/cygwin/gmon.c delete mode 100644 winsup/cygwin/gmon.h delete mode 100644 winsup/cygwin/grp.cc delete mode 100644 winsup/cygwin/heap.cc delete mode 100644 winsup/cygwin/heap.h delete mode 100644 winsup/cygwin/hires.h delete mode 100644 winsup/cygwin/hookapi.cc delete mode 100644 winsup/cygwin/how-autoload-works.txt delete mode 100644 winsup/cygwin/how-cygheap-works.txt delete mode 100644 winsup/cygwin/how-cygtls-works.txt delete mode 100644 winsup/cygwin/how-fhandlers-work.txt delete mode 100644 winsup/cygwin/how-signals-work.txt delete mode 100644 winsup/cygwin/how-spawn-works.txt delete mode 100644 winsup/cygwin/how-to-debug-cygwin.txt delete mode 100644 winsup/cygwin/how-vfork-works.txt delete mode 100644 winsup/cygwin/include/a.out.h delete mode 100644 winsup/cygwin/include/arpa/ftp.h delete mode 100644 winsup/cygwin/include/arpa/inet.h delete mode 100644 winsup/cygwin/include/arpa/telnet.h delete mode 100644 winsup/cygwin/include/asm/byteorder.h delete mode 100644 winsup/cygwin/include/asm/socket.h delete mode 100644 winsup/cygwin/include/asm/types.h delete mode 100644 winsup/cygwin/include/byteswap.h delete mode 100644 winsup/cygwin/include/ctype.h delete mode 100644 winsup/cygwin/include/cygwin/_types.h delete mode 100644 winsup/cygwin/include/cygwin/acl.h delete mode 100644 winsup/cygwin/include/cygwin/config.h delete mode 100644 winsup/cygwin/include/cygwin/core_dump.h delete mode 100644 winsup/cygwin/include/cygwin/cygwin_dll.h delete mode 100644 winsup/cygwin/include/cygwin/fs.h delete mode 100644 winsup/cygwin/include/cygwin/grp.h delete mode 100644 winsup/cygwin/include/cygwin/hdreg.h delete mode 100644 winsup/cygwin/include/cygwin/icmp.h delete mode 100644 winsup/cygwin/include/cygwin/if.h delete mode 100644 winsup/cygwin/include/cygwin/in.h delete mode 100644 winsup/cygwin/include/cygwin/in_systm.h delete mode 100644 winsup/cygwin/include/cygwin/ipc.h delete mode 100644 winsup/cygwin/include/cygwin/msg.h delete mode 100644 winsup/cygwin/include/cygwin/mtio.h delete mode 100644 winsup/cygwin/include/cygwin/rdevio.h delete mode 100644 winsup/cygwin/include/cygwin/sem.h delete mode 100644 winsup/cygwin/include/cygwin/shm.h delete mode 100644 winsup/cygwin/include/cygwin/signal.h delete mode 100644 winsup/cygwin/include/cygwin/socket.h delete mode 100644 winsup/cygwin/include/cygwin/sockios.h delete mode 100644 winsup/cygwin/include/cygwin/stat.h delete mode 100644 winsup/cygwin/include/cygwin/stdlib.h delete mode 100644 winsup/cygwin/include/cygwin/sys_time.h delete mode 100644 winsup/cygwin/include/cygwin/sysproto.h delete mode 100644 winsup/cygwin/include/cygwin/time.h delete mode 100644 winsup/cygwin/include/cygwin/types.h delete mode 100644 winsup/cygwin/include/cygwin/uio.h delete mode 100644 winsup/cygwin/include/cygwin/utmp.h delete mode 100644 winsup/cygwin/include/cygwin/version.h delete mode 100644 winsup/cygwin/include/dlfcn.h delete mode 100644 winsup/cygwin/include/elf.h delete mode 100644 winsup/cygwin/include/endian.h delete mode 100644 winsup/cygwin/include/err.h delete mode 100644 winsup/cygwin/include/exceptions.h delete mode 100644 winsup/cygwin/include/fcntl.h delete mode 100644 winsup/cygwin/include/features.h delete mode 100644 winsup/cygwin/include/fnmatch.h delete mode 100644 winsup/cygwin/include/fts.h delete mode 100644 winsup/cygwin/include/ftw.h delete mode 100644 winsup/cygwin/include/getopt.h delete mode 100644 winsup/cygwin/include/glob.h delete mode 100644 winsup/cygwin/include/icmp.h delete mode 100644 winsup/cygwin/include/inttypes.h delete mode 100644 winsup/cygwin/include/io.h delete mode 100644 winsup/cygwin/include/lastlog.h delete mode 100644 winsup/cygwin/include/libgen.h delete mode 100644 winsup/cygwin/include/limits.h delete mode 100644 winsup/cygwin/include/machine/stdlib.h delete mode 100644 winsup/cygwin/include/mapi.h delete mode 100644 winsup/cygwin/include/memory.h delete mode 100644 winsup/cygwin/include/mntent.h delete mode 100644 winsup/cygwin/include/net/if.h delete mode 100644 winsup/cygwin/include/netdb.h delete mode 100644 winsup/cygwin/include/netinet/in.h delete mode 100644 winsup/cygwin/include/netinet/in_systm.h delete mode 100644 winsup/cygwin/include/netinet/ip.h delete mode 100644 winsup/cygwin/include/netinet/ip_icmp.h delete mode 100644 winsup/cygwin/include/netinet/tcp.h delete mode 100644 winsup/cygwin/include/netinet/udp.h delete mode 100644 winsup/cygwin/include/paths.h delete mode 100644 winsup/cygwin/include/poll.h delete mode 100644 winsup/cygwin/include/pthread.h delete mode 100644 winsup/cygwin/include/pty.h delete mode 100644 winsup/cygwin/include/sched.h delete mode 100644 winsup/cygwin/include/search.h delete mode 100644 winsup/cygwin/include/semaphore.h delete mode 100644 winsup/cygwin/include/stdint.h delete mode 100644 winsup/cygwin/include/strings.h delete mode 100644 winsup/cygwin/include/sys/acl.h delete mode 100644 winsup/cygwin/include/sys/cdefs.h delete mode 100644 winsup/cygwin/include/sys/copying.dj delete mode 100644 winsup/cygwin/include/sys/cygwin.h delete mode 100644 winsup/cygwin/include/sys/dirent.h delete mode 100644 winsup/cygwin/include/sys/elf32.h delete mode 100644 winsup/cygwin/include/sys/elf64.h delete mode 100644 winsup/cygwin/include/sys/elf_common.h delete mode 100644 winsup/cygwin/include/sys/elf_generic.h delete mode 100644 winsup/cygwin/include/sys/file.h delete mode 100644 winsup/cygwin/include/sys/ioctl.h delete mode 100644 winsup/cygwin/include/sys/ipc.h delete mode 100644 winsup/cygwin/include/sys/lock.h delete mode 100644 winsup/cygwin/include/sys/mman.h delete mode 100644 winsup/cygwin/include/sys/mount.h delete mode 100644 winsup/cygwin/include/sys/msg.h delete mode 100644 winsup/cygwin/include/sys/mtio.h delete mode 100644 winsup/cygwin/include/sys/param.h delete mode 100644 winsup/cygwin/include/sys/poll.h delete mode 100644 winsup/cygwin/include/sys/procfs.h delete mode 100644 winsup/cygwin/include/sys/queue.h delete mode 100644 winsup/cygwin/include/sys/resource.h delete mode 100644 winsup/cygwin/include/sys/select.h delete mode 100644 winsup/cygwin/include/sys/sem.h delete mode 100644 winsup/cygwin/include/sys/shm.h delete mode 100644 winsup/cygwin/include/sys/smallprint.h delete mode 100644 winsup/cygwin/include/sys/socket.h delete mode 100644 winsup/cygwin/include/sys/soundcard.h delete mode 100644 winsup/cygwin/include/sys/statfs.h delete mode 100644 winsup/cygwin/include/sys/statvfs.h delete mode 100644 winsup/cygwin/include/sys/stdio.h delete mode 100644 winsup/cygwin/include/sys/strace.h delete mode 100644 winsup/cygwin/include/sys/syslog.h delete mode 100644 winsup/cygwin/include/sys/sysmacros.h delete mode 100644 winsup/cygwin/include/sys/sysproto.h delete mode 100644 winsup/cygwin/include/sys/termio.h delete mode 100644 winsup/cygwin/include/sys/termios.h delete mode 100644 winsup/cygwin/include/sys/ttychars.h delete mode 100644 winsup/cygwin/include/sys/uio.h delete mode 100644 winsup/cygwin/include/sys/un.h delete mode 100644 winsup/cygwin/include/sys/utime.h delete mode 100644 winsup/cygwin/include/sys/utmp.h delete mode 100644 winsup/cygwin/include/sys/utsname.h delete mode 100644 winsup/cygwin/include/sys/vfs.h delete mode 100644 winsup/cygwin/include/sys/wait.h delete mode 100644 winsup/cygwin/include/sysexits.h delete mode 100644 winsup/cygwin/include/syslog.h delete mode 100644 winsup/cygwin/include/termio.h delete mode 100644 winsup/cygwin/include/tzfile.h delete mode 100644 winsup/cygwin/include/utmpx.h delete mode 100644 winsup/cygwin/init.cc delete mode 100644 winsup/cygwin/ioctl.cc delete mode 100644 winsup/cygwin/ipc.cc delete mode 100644 winsup/cygwin/lib/_cygwin_crt0_common.cc delete mode 100644 winsup/cygwin/lib/crt0.h delete mode 100644 winsup/cygwin/lib/cygwin_attach_dll.c delete mode 100644 winsup/cygwin/lib/cygwin_crt0.c delete mode 100644 winsup/cygwin/lib/dll_entry.c delete mode 100644 winsup/cygwin/lib/dll_main.cc delete mode 100644 winsup/cygwin/lib/libcmain.c delete mode 100644 winsup/cygwin/lib/premain0.c delete mode 100644 winsup/cygwin/lib/premain1.c delete mode 100644 winsup/cygwin/lib/premain2.c delete mode 100644 winsup/cygwin/lib/premain3.c delete mode 100644 winsup/cygwin/lib/pseudo-reloc.c delete mode 100644 winsup/cygwin/libc/bsdlib.cc delete mode 100644 winsup/cygwin/libc/fnmatch.c delete mode 100644 winsup/cygwin/libc/fts.c delete mode 100644 winsup/cygwin/libc/ftw.c delete mode 100644 winsup/cygwin/libc/getopt.c delete mode 100644 winsup/cygwin/libc/iruserok.c delete mode 100644 winsup/cygwin/libc/memmem.cc delete mode 100644 winsup/cygwin/libc/nftw.c delete mode 100644 winsup/cygwin/libc/strptime.cc delete mode 100644 winsup/cygwin/libc/timelocal.cc delete mode 100644 winsup/cygwin/libc/timelocal.h delete mode 100644 winsup/cygwin/localtime.cc delete mode 100644 winsup/cygwin/lsearch.cc delete mode 100644 winsup/cygwin/malloc.cc delete mode 100644 winsup/cygwin/malloc_wrapper.cc delete mode 100644 winsup/cygwin/mcount.c delete mode 100644 winsup/cygwin/misc-std.sgml delete mode 100644 winsup/cygwin/miscfuncs.cc delete mode 100644 winsup/cygwin/mktemp.cc delete mode 100755 winsup/cygwin/mkvers.sh delete mode 100644 winsup/cygwin/mmap.cc delete mode 100644 winsup/cygwin/msg.cc delete mode 100644 winsup/cygwin/mtinfo.h delete mode 100644 winsup/cygwin/net.cc delete mode 100644 winsup/cygwin/netdb.cc delete mode 100755 winsup/cygwin/newsym delete mode 100644 winsup/cygwin/ntdll.h delete mode 100644 winsup/cygwin/ntea.cc delete mode 100644 winsup/cygwin/passwd.cc delete mode 100644 winsup/cygwin/path.cc delete mode 100644 winsup/cygwin/path.h delete mode 100644 winsup/cygwin/path.sgml delete mode 100644 winsup/cygwin/perprocess.h delete mode 100644 winsup/cygwin/pinfo.cc delete mode 100644 winsup/cygwin/pinfo.h delete mode 100644 winsup/cygwin/pipe.cc delete mode 100644 winsup/cygwin/poll.cc delete mode 100644 winsup/cygwin/posix.sgml delete mode 100644 winsup/cygwin/profil.c delete mode 100644 winsup/cygwin/profil.h delete mode 100644 winsup/cygwin/pseudo-reloc.cc delete mode 100644 winsup/cygwin/pthread.cc delete mode 100644 winsup/cygwin/pwdgrp.h delete mode 100644 winsup/cygwin/regex/COPYRIGHT delete mode 100644 winsup/cygwin/regex/cclass.h delete mode 100644 winsup/cygwin/regex/cname.h delete mode 100644 winsup/cygwin/regex/engine.c delete mode 100644 winsup/cygwin/regex/engine.ih delete mode 100755 winsup/cygwin/regex/mkh delete mode 100644 winsup/cygwin/regex/regcomp.c delete mode 100644 winsup/cygwin/regex/regcomp.ih delete mode 100644 winsup/cygwin/regex/regerror.c delete mode 100644 winsup/cygwin/regex/regerror.ih delete mode 100644 winsup/cygwin/regex/regex.3 delete mode 100644 winsup/cygwin/regex/regex.7 delete mode 100644 winsup/cygwin/regex/regex.h delete mode 100644 winsup/cygwin/regex/regex2.h delete mode 100644 winsup/cygwin/regex/regexec.c delete mode 100644 winsup/cygwin/regex/regfree.c delete mode 100644 winsup/cygwin/regex/tests delete mode 100644 winsup/cygwin/regex/utils.h delete mode 100644 winsup/cygwin/regexp/COPYRIGHT delete mode 100644 winsup/cygwin/regexp/README delete mode 100644 winsup/cygwin/regexp/regexp.h delete mode 100644 winsup/cygwin/regexp/regmagic.h delete mode 100644 winsup/cygwin/regexp/v8_regerror.c delete mode 100644 winsup/cygwin/regexp/v8_regexp.c delete mode 100644 winsup/cygwin/regexp/v8_regsub.c delete mode 100644 winsup/cygwin/registry.cc delete mode 100644 winsup/cygwin/registry.h delete mode 100644 winsup/cygwin/resource.cc delete mode 100755 winsup/cygwin/rmsym delete mode 100644 winsup/cygwin/scandir.cc delete mode 100644 winsup/cygwin/sched.cc delete mode 100644 winsup/cygwin/sec_acl.cc delete mode 100644 winsup/cygwin/sec_helper.cc delete mode 100644 winsup/cygwin/security.cc delete mode 100644 winsup/cygwin/security.h delete mode 100644 winsup/cygwin/select.cc delete mode 100644 winsup/cygwin/select.h delete mode 100644 winsup/cygwin/sem.cc delete mode 100644 winsup/cygwin/shared.cc delete mode 100644 winsup/cygwin/shared.sgml delete mode 100644 winsup/cygwin/shared_info.h delete mode 100644 winsup/cygwin/shm.cc delete mode 100644 winsup/cygwin/signal.cc delete mode 100644 winsup/cygwin/sigproc.cc delete mode 100644 winsup/cygwin/sigproc.h delete mode 100644 winsup/cygwin/smallprint.c delete mode 100644 winsup/cygwin/spawn.cc delete mode 100755 winsup/cygwin/speclib delete mode 100644 winsup/cygwin/stackdump.sgml delete mode 100644 winsup/cygwin/strace.cc delete mode 100644 winsup/cygwin/string.h delete mode 100644 winsup/cygwin/strsep.cc delete mode 100644 winsup/cygwin/strsig.cc delete mode 100644 winsup/cygwin/sync.cc delete mode 100644 winsup/cygwin/sync.h delete mode 100644 winsup/cygwin/syscalls.cc delete mode 100644 winsup/cygwin/sysconf.cc delete mode 100644 winsup/cygwin/syslog.cc delete mode 100644 winsup/cygwin/termios.cc delete mode 100644 winsup/cygwin/textmode.c delete mode 100644 winsup/cygwin/textreadmode.c delete mode 100644 winsup/cygwin/thread.cc delete mode 100644 winsup/cygwin/thread.h delete mode 100644 winsup/cygwin/timer.cc delete mode 100644 winsup/cygwin/times.cc delete mode 100644 winsup/cygwin/tlsoffsets.h delete mode 100644 winsup/cygwin/tty.cc delete mode 100644 winsup/cygwin/tty.h delete mode 100644 winsup/cygwin/tz_posixrules.h delete mode 100644 winsup/cygwin/uinfo.cc delete mode 100644 winsup/cygwin/uname.cc delete mode 100644 winsup/cygwin/wait.cc delete mode 100644 winsup/cygwin/winbase.h delete mode 100644 winsup/cygwin/wincap.cc delete mode 100644 winsup/cygwin/wincap.h delete mode 100644 winsup/cygwin/window.cc delete mode 100644 winsup/cygwin/wininfo.h delete mode 100644 winsup/cygwin/winsup.h delete mode 100644 winsup/cygwin/winver.rc (limited to 'winsup/cygwin') diff --git a/winsup/cygwin/CYGWIN_LICENSE b/winsup/cygwin/CYGWIN_LICENSE deleted file mode 100644 index 53369a297..000000000 --- a/winsup/cygwin/CYGWIN_LICENSE +++ /dev/null @@ -1,38 +0,0 @@ --------------------------------------------------------------------------- -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License (GPL) as published by -the Free Software Foundation; either version 2 of the License, or (at -your option) any later version. - -This program 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 program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. --------------------------------------------------------------------------- - - *** NOTE *** - -In accordance with section 10 of the GPL, Red Hat permits programs whose -sources are distributed under a license that complies with the Open -Source definition to be linked with libcygwin.a without libcygwin.a -itself causing the resulting program to be covered by the GNU GPL. - -This means that you can port an Open Source(tm) application to cygwin, -and distribute that executable as if it didn't include a copy of -libcygwin.a linked into it. Note that this does not apply to the cygwin -DLL itself. If you distribute a (possibly modified) version of the DLL -you must adhere to the terms of the GPL, i.e., you must provide sources -for the cygwin DLL. - -See http://www.opensource.org/osd.html for the precise Open Source -Definition referenced above. - -Red Hat sells a special Cygwin License for customers who are unable to -provide their application in open source code form. For more -information, please see: http://www.redhat.com/software/tools/cygwin/, -or call 866-2REDHAT ext. 3007 - diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog deleted file mode 100644 index 0fbb6055f..000000000 --- a/winsup/cygwin/ChangeLog +++ /dev/null @@ -1,1194 +0,0 @@ -2006-03-20 Christopher Faylor - - * child_info.h (child_status): New enum. - (child_info::flag): Rename from 'straced'. - (child_info::isstraced): New function. - (child_info::iscygwin): Ditto. - (child_info_fork::handle_fork): Reparmize. - (child_info_fork::handle_failure): Ditto. - (child_info_spawn::handle_spawn): New function. - * dcrt0.cc (get_cygwin_startup_info): Use isstraced method. - (child_info_spawn::handle_spawn): Define new function from code - previously in dll_crt0_0. - (dll_crt0_0): Move spawn stuff into handle_spawn. Only call - init_console_handler for fork case. - * sigproc.cc (child_info::child_info): Set flag appropriately. - (child_info::proc_retry): Treat exit code as "funny" if it's a cygwin - process. - * spawn.cc (spawn_guts): Remove commented out flag setting. - -2006-03-19 Christopher Faylor - - * pinfo.cc (commune_process): Fix randomly invalid pointer which caused - fifos to work incorrectly. - -2006-03-19 Christopher Faylor - - * dcrt0.cc (dll_crt0_0): Oops. We need to bother with setting this in - the fork/exec case. - -2006-03-19 Christopher Faylor - - * dcrt0.cc (dll_crt0_0): Don't bother with setting init_console_handler - here since it will be set later when we discover if we have a ctty or - not. - * exceptions.cc (init_console_handler): Properly remove NULL handler. - -2006-03-18 Christopher Faylor - - * pinfo.h (EXITCODE_OK): Define new constant. - * sigproc.cc (child_info::sync): Return EXITCODE_OK if entering with - exit_code == 0. - (sig_send): Don't complain if sending signals while blocked if the - sender isn't in the main thread. - -2006-03-18 Christopher Faylor - - * child_info.h (CURR_CHILD_INFO_MAGIC): Regenerate. - (child_info::retry): Move here from fork subclass. - (child_info::exit_code): New field. - (child_info::retry_count): Max retry count for process start. - (child_info::proc_retry): Declare new function. - (child_info_fork::retry): Move to parent. - (child_info_fork::fork_retry): Ditto. - * dcrt0.cc (child_info::fork_retry): Rename and move. - (child_info_fork::handle_failure): Move. - (dll_crt0_0): Initialize console handler based on whether we have a - controlling tty or not. Avoid nonsensical check for fork where it can - never occur. - * environ.cc (set_proc_retry): Rename from set_fork_retry. Set - retry_count in child_info. - (parse_thing): Reflect above change. - * exceptions.cc (dummy_ctrl_c_handler): Remove unused variable name. - (ctrl_c_handler): Always return TRUE for the annoying - CTRL_LOGOFF_EVENT. - * fhandler_termios.cc (fhandler_termios::tcsetpgrp): Remove call to - init_console_handler. - * fhandler_tty.cc (fhandler_tty_slave::open): Just call - mange_console_count here and let it decide what to do with initializing - console control handling. - * fork.cc (fork_retry): Remove definition. - (frok::parent): Define static errbuf and use in error messages (not - thread safe yet). Close pi.hThread as soon as possible. Protect - pi.hProcess as soon as possible. Don't set retry_count. That happens - automatically in the constructor now. Accommodate name change from - fork_retry to proc_retry. - * init.cc (dll_entry): Turn off ctrl-c handling early until we know how - it is supposed to be handled. - * pinfo.cc (_pinfo::dup_proc_pipe): Remember original proc pipe value - for failure error message. Tweak debug message slightly. - * sigproc.cc (child_info::retry_count): Define. - (child_info::child_info): Initialize retry count. - (child_info::sync): Set exit code if process dies before - synchronization. - (child_info::proc_retry): Rename from child_info_fork::fork_retry. Use - previously derived exit code. Be more defensive about what is - classified as an error exit. - (child_info_fork::handle_failure): Move here from dcrt0.cc. - * spawn.cc (spawn_guts): Maintain error mode when starting new process - to avoid annoying pop ups. Move deimpersonate call within new loop. - Move envblock freeing to end. Loop if process dies prematurely with - bad exit code. - * syscalls.cc (init_console_handler): Remove hopefully unneeded call to - init_console_handler. - -2006-03-15 Christopher Faylor - - * cygheap.cc (init_cygheap::manage_console_count): Turn console control - handler on/off depending on whether we have allocated a console or not. - * dcrt0.cc (child_info_fork::fork_retry): Add more potential retry - statuses. - (dll_crt0_0): Turn on/off console control depending on whether we have - a controlling tty or not. - * exceptions.cc (init_console_handler): Change BOOL to bool. - * fhandler_console.cc (fhandler_console::need_invisible): Cosmetic - change. - * winsup.h (init_console_handler): Reflect argument type change. - - * wincap.h (supports_setconsolectrlhandler_null): Remove duplicate - capability throughout. - * wincap.cc: Ditto. - -2006-03-14 Christopher Faylor - - * child_info.h (child_info_fork::fork_retry): Declare new function. - * dcrt0.cc (child_info_fork::fork_retry): Define new function. - * fork.cc (frok::parent): Move retry decision into - child_info_fork::fork_retry and honor what it tells us to do. - * sigproc.cc (sig_send): Unhold signals on __SIGEXIT. - -2006-03-14 Christopher Faylor - - * fork.cc (frok::parent): Improve error message. - -2006-03-14 Christopher Faylor - - * dcrt0.cc (main_environ): Initialize to &__cygwin_environment. - (dll_crt0_1): Move resourcelocks, thread interface, pinfo_init, and - uinfo_init... - (dll_crt0_0): ...to here. - (_dll_crt0): Call update_envptrs here after setting main_environ. - * environ.cc (environ_init): Eliminate initted variable. Don't call - update_envptrs here. - * sigproc.cc (wait_sig): Use my_sendsig when calling CreatePipe to - avoid a dereference. - -2006-03-13 Christopher Faylor - - * child_info.h (child_info_fork::handle_failure): Declare new function. - (child_info_fork::retry): New field. - * dcrt0.cc (__api_fatal_exit_val): Define. - (child_info_fork::handle_failure): Define new function. - (__api_fatal): Exit using __api_fatal_exit_val value. - * environ.cc (set_fork_retry): Set fork_retry based on CYGWIN - environment variable. - (parse_thing): Add "fork_retry" setting. - * fork.cc (fork_retry): Define. - (frok::parent): Reorganize to allow retry of failed child creation if - child signalled that it was ok to do so. - * heap.cc (heap_init): Signal parent via handle_failure when - VirtualAlloc fails. - * pinfo.h (EXITCODE_RETRY): Declare. - * sigproc.cc (child_info::sync): Properly exit with failure condition - if called for fork and didn't see subproc_ready. - * spawn.cc (spawn_guts): Use windows pid as first argument. - * winsup.h: Remove obsolete NEW_MACRO_VARARGS define. - (__api_fatal_exit_val): Declare. - (set_api_fatal_return): Define. - (in_dllentry): Declare. - * exceptions.cc (inside_kernel): Remove unneeded in_dllentry - declaration. - -2006-03-13 Christopher Faylor - - * dcrt0.cc (dll_crt0_0): Reorganize so that sigproc_init is called a - little later. Add a comment. - * fork.cc (resume_child): Make void. - (frok::parent): Only zero pi when necessary. Explicitly zero si. Set - this_errno when child_copy fails. Accommodate change to resume_child. - * sigproc.cc (sigalloc): Move global_sigs initialization here. - (sigproc_init): Move global_sigs. - (sig_send): Just check for flush signals once. - - * wincap.h: Define supports_setconsolectrlhandler_null throughout. - * wincap.cc: Ditto. - -2006-03-13 Corinna Vinschen - - * autoload.cc (LoadDLLfuncNt): New define to wrap NT native functions. - Use for NT native functions throughout. - * dtable.cc (handle_to_fn): Treat return value of NtQueryObject as - NTSTATUS value. - -2006-03-12 Christopher Faylor - - * cygtls.cc (_cygtls::remove): Reset initialized flag right away if we - were previously initialized. - * cygtls.h (_cygtls::initialized): Move nearer to the end to catch - situation when Windows 98 mysteriously changes parts of _my_tls when - thread is detaching. - * gendef (__sigfe_maybe): Simplify slightly. - * tlsoffsets.h: Regenerate. - -2006-03-12 Christopher Faylor - - * cygtls.h (CYGTLS_INITIALIZED): Change to a little more unlikely value. - (CYGTLSMAGIC): Delete. - * dcrt0.cc (dll_crt0_0): Call sigproc_init during init startup. - (_dll_crt0): Don't worry about sync_startup. Just wait for sigthread here. - * dll_init.cc (cygwin_detach_dll): Only pick up tls version of retaddr - if we have a valid tls. - * fork.cc (frok::child): Remove sigproc_init initialization since it - happens much earlier now. - * gendef: Recognize SIGFE_MAYBE. - (fefunc): Generate calls to _sigfe_maybe, if appropriate. - (_sigfe_maybe): New function. - * init.cc (search_for): Always initialize search_for, even on fork. - (calibration_thread): Delete. - (calibration_id): Delete. - (prime_threads): Delete. - (munge_threadfunc): Remove calibration_thread special case. Avoid - calling thread function if we haven't yet hit the "search_for" thread. - (dll_entry): Remove prime_threads call. Only call munge_threadfunc - when hwait_sig is active. Ditto. for _my_tls.remove (); - * sigproc.cc (hwait_sig): Make global. - (sigproc_init): Don't bother with sync_startup. - (sig_send): Treat flush as a no-op when signals are held. - (wait_sig): Cause signals to be held after fork. - -2006-03-09 Corinna Vinschen - - * syscalls.cc (rename): Move existance check for oldpath further up - to the start of the function. Avoid another case of a name collision - if oldpath is a shortcut and a file or directory newpath already exists. - -2006-03-09 Corinna Vinschen - - * autoload.cc (NtClose): Define. - (NtOpenDirectoryObject): Define. - (NtQueryDirectoryObject): Define. - * fhandler_proc.cc: Include ctype.h and wchar.h. - (format_proc_partitions): Revamp loop over existing harddisks by - scanning the NT native \Device object directory and looking for - Harddisk entries. - * ntdll.h: Rearrange system call declarations alphabetically. - (DIRECTORY_QUERY): Define. - (struct _DIRECTORY_BASIC_INFORMATION): Define. - (NtOpenDirectoryObject): Declare. - (NtQueryDirectoryObject): Declare. - -2006-03-08 Christopher Faylor - - * cygtls.h (_cygtls::retaddr): New method. - * dll_init.cc (cygwin_detach_dll): Use new tls method to find return - address since this function is now signal guarded. - (update_envptrs): Remove unneeded braces. - * syscalls.cc (statvfs): Coerce full_path to avoid a gcc warning. - -2006-03-08 Corinna Vinschen - - * syscalls.cc (statvfs): Simplify path name expression. - -2006-03-08 Corinna Vinschen - - * syscalls.cc: Include winioctl.h. - (statvfs): Request correct volume size using DeviceIoControl if - quotas are enforced on the file system. - -2006-03-03 Corinna Vinschen - - * dir.cc (opendir): Fix indentation. - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Move storing - fhandler in file descriptor table to some point very late in function - to avoid double free'ing. Add comment to explain what happens. - Add label free_mounts and don't forget to delete __DIR_mounts structure - if NtOpenFile fails. - -2006-03-02 Corinna Vinschen - - * syscalls.cc (chroot): Disallow chroot into special directories. - Return EPERM instead. - -2006-03-02 Corinna Vinschen - - * fhandler_disk_file.cc (__DIR_mounts::check_missing_mount): Check - cygdrive string length for those who have cygdrive mapped to "/". - -2006-03-01 Corinna Vinschen - - * sec_helper.cc (set_cygwin_privileges): Request SE_BACKUP_NAME - privileges. - -2006-03-01 Corinna Vinschen - - * fhandler_proc.cc (fhandler_proc::fstat): Always return fixed link - count of 1 for /proc directory instead of incorrect PROC_LINK_COUNT. - -2006-03-01 Corinna Vinschen - - * fhandler.h (enum dirent_states): Remove dirent_saw_cygdrive, - dirent_saw_dev and dirent_saw_proc. - (fhandler_cygdrive::open): Declare. - (fhandler_cygdrive::close): Declare. - * fhandler_disk_file.cc (class __DIR_mounts): Move to beginning of file. - (__DIR_mounts::check_mount): New parameter to indicate if inode number - is needed in calling function or not. Add /proc and /cygdrive handling. - (__DIR_mounts::check_missing_mount): Ditto. - (path_conv::ndisk_links): Use __DIR_mounts class to create correct - hardlink count for directories with mount points in them. - (fhandler_disk_file::readdir_helper): Remove /dev, /proc and /cygdrive - handling. - (fhandler_cygdrive::open): New method. - (fhandler_cygdrive::close): New method. - (fhandler_cygdrive::fstat): Always return fixed inode number 2 and - fixed link count of 1. Drop call to set_drives. - (fhandler_cygdrive::opendir): Drop call to get_namehash. - (fhandler_cygdrive::readdir): Handle "." entry to return fixed inode - number 2. - -2006-03-01 Christopher Faylor - - * cygwin.din: Fix some erroneous SIGFE/NOSIGFE settings. - -2006-03-01 Christopher Faylor - - * cygthread.cc (cygthread::callfunc): Revert below change. Make ev a - manual reset event again. so that it will be reset by WaitFor*Object - as appropriate. - (cygthread::stub): Ditto. - (cygthread::terminate_thread): Reset ev if it was found to have been - set. - -2006-03-01 Christopher Faylor - - * analyze_sigfe: New script. - * dllfixdbg: Add copyright. - * gendef: Ditto. - * gendevices: Ditto. - * gentls_offsets: Ditto. - -2006-03-01 Christopher Faylor - - * cygthread.cc (cygthread::callfunc): Create ev as an auto-reset event - so that it will be reset by WaitFor*Object as appropriate. - (cygthread::stub): Ditto. - (cygthread::terminate_thread): Remove forced setting of thread - termination. - -2006-03-01 Corinna Vinschen - - * include/sys/dirent.h (struct __DIR): Rename __d_unused to - __d_internal. - * fhandler_disk_file.cc (struct __DIR_cache): Remove useless "typedef". - (d_dirname): Remove useless "struct". - (d_cachepos): Ditto. - (d_cache): Ditto. - (class __DIR_mounts): New class, implementing mount point tracking - for readdir. - (d_mounts): New macro for easy access to __DIR_mounts structure. - (fhandler_disk_file::opendir): Allocate __DIR_mounts structure and - let __d_internal element of dir point to it. - (fhandler_disk_file::readdir_helper): Add mount points in the current - directory, which don't have a real directory backing them. - Don't generate an inode number for /dev. Add comment, why. - (fhandler_disk_file::readdir): Move filling fname to an earlier point. - Check if current entry is a mount point and evaluate correct inode - number for it. - (fhandler_disk_file::readdir_9x): Ditto. - (fhandler_disk_file::rewinddir): Set all mount points in this directory - to "not found" so that they are listed again after calling rewinddir(). - (fhandler_disk_file::closedir): Deallocate __DIR_mounts structure. - * path.cc (mount_info::get_mounts_here): New method to evaluate a list - of mount points in a given parent directory. - * shared_info.h (class mount_info): Declare get_mounts_here. - -2006-02-28 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Use iscygdrive - instead of isspecial. - * path.h (path_conv::iscygdrive): New method. - -2006-02-28 Christopher Faylor - - * exceptions.cc (_cygtls::interrupt_now): Remove "inside cygwin" check - since some cygwin functions are meant to be interrupted. - -2006-02-28 Corinna Vinschen - - * cygwin.din: Export __isinff, __isinfd, __isnanf, __isnand. - * include/cygwin/version.h: Bump API minor number to 155. - -2006-02-28 Corinna Vinschen - - * dir.cc (readdir_worker): Use slash as path separator when evaluating - namehash for paths below /proc. - * fhandler_netdrive.cc (fhandler_netdrive::readdir): Use expensive - inode number evaluation on share names. - -2006-02-27 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Only set - d_cachepos under NT or suffer memory corruption. - (fhandler_disk_file::readdir_helper): Avoid else with a return. Just - calculate extension location once when doing symlink checks. - (fhandler_disk_file::readdir): Make debug output more useful. - (fhandler_disk_file::readdir_9x): Ditto. Eliminate redundant variable. - -2006-02-27 Christopher Faylor - - * include/sys/termios.h (cfsetispeed): Just define as a function rather - than resorting to a macro. - (cfsetospeed): Ditto. - -2006-02-27 Christopher Faylor - - * sigproc.cc: Fix a comment. - -2006-02-27 Christopher Faylor - - * cygthread.cc (cygthread::release): Add a comment. - -2006-02-27 Corinna Vinschen - - * fhandler_netdrive.cc (fhandler_netdrive::fstat): Create unambiguous - inode number. - (fhandler_netdrive::readdir): Ditto. - -2006-02-24 Christopher Faylor - - * sigproc.cc (sigheld): Define new variable. - (sig_dispatch_pending): Don't check sigq since that's racy. - (sig_send): Set sigheld flag if __SIGHOLD is specified, reset it if - __SIGNOHOLD is specified. Ignore flush signals if we're holding - signals. - -2006-02-23 Christopher Faylor - - * cygwin.din (_exit): Use signal front end. - (exit): Ditto. - -2006-02-23 Christopher Faylor - - * winsup.h (cygwin_hmodule): Declare. - * exceptions.cc (inside_kernel): Reverse return values to reflect - function name. Return true if we're in cygwin1.dll or if we're - executing in dll_entry. - (_cygtls::interrupt_now): Reflect reversal of inside_kernel return - value. - * hookapi.cc (cygwin_hmodule): Remove declaration. - * init.cc (dll_entry): Use in_dllentry global to record that we are - executing in dllentry. - -2006-02-22 Corinna Vinschen - - * exceptions.cc (_cygtls::interrupt_now): Reorder conditional - to call inside_kernel only if this isn't locked. - -2006-02-22 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Add FILE_READ_ATTRIBUTES to - access flags in case of query_read_control case, add FILE_READ_DATA - in case of query_stat_control. - -2006-02-20 Christopher Faylor - - * spawn.cc (av::fixup): Check for .bat and friends specifically now - since these extensions are no longer automatically detected. - -2006-02-19 Christopher Faylor - - * exceptions.cc (stackdump): Avoid dumping more than once. - -2006-02-19 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Use NtOpenFile - to open the directory. - (fhandler_disk_file::readdir): Use NT_SUCCESS to determine if status - represents success. - -2006-02-19 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Drop generating - path_conv for root. - -2006-02-18 Corinna Vinschen - - * fhandler_disk_file.cc (FS_IS_SAMBA): Move out of - path_conv::hasgood_inode. - (path_conv::is_samba): New method. - (fhandler_base::fstat_by_handle): Don't even try to use - FileIdBothDirectoryInformation on Samba. - * path.h (class path_conv): Declare is_samba method. - -2006-02-17 Christopher Faylor - - * path.cc (conv_path_list): Eat empty paths when converting to POSIX. - (cygwin_conv_to_win32_path): Deal with Cygwin's necessity of adding a - '/' to the end of a path ending in '.'. - -2006-02-16 Corinna Vinschen - - * cygwin.din: Export sigignore and sigset. - * exceptions.cc (sigset): New function. - (sigignore): New function. - * include/cygwin/signal.h (SIG_HOLD): Define. - (sigignore): Declare. - (sigset): Declare. - * include/cygwin/version.h: Bump API minor number to 154. - -2006-02-13 Igor Peshansky - - * include/mntent.h: Add missing #include. - -2006-02-13 Igor Peshansky - - * gentls_offsets: Fix typo in error message. - -2006-02-10 Christopher Faylor - - * fhandler_process.cc (format_process_stat): Use cygwin-derived start - time even on NT since it is the logical start time of the "process". - * pinfo.cc (set_myself): Don't set start time when it should have - already been set previously. - -2006-02-10 Brian Ford - - * times.cc (clock_getres): Use correct conversion from milliseconds to - seconds/nanoseconds. - (clock_setres): Use correct conversion to nanoseconds. - -2006-02-10 Christopher Faylor - - * external.cc (sync_winenv): Rename from "setup_winenv". Use same - mechanism as spawn to determine environment variables which should be - converted back to windows form. - (cygwin_internal): Reflect setup_winenv -> sync_winenv name change. - * include/sys/cygwin.h: Ditto. - -2006-02-09 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Only set - the dirent_get_d_ino flag on filesystems having useful File IDs. - Add comment explaining why. - -2006-02-07 Corinna Vinschen - - * dtable.cc (handle_to_fn): Accommodate new argument order in call to - sys_wcstombs. - * fhandler_disk_file.cc (fhandler_disk_file::readdir): Call sys_wcstombs - instead of just wcstombs to accommodate OEM codepages. - * miscfuncs.cc (sys_wcstombs): Split len argument in source and target - length. Always 0-terminate result in target string. - * security.cc (lsa2wchar): Remove unused function. - (lsa2str): Ditto. - (get_lsa_srv_inf): Ditto. - (get_logon_server): Accommodate new argument order in call to - sys_wcstombs. - (get_user_groups): Ditto. - (get_user_local_groups): Ditto. - (get_priv_list): Call sys_wcstombs directly instead of lsa2str. - * uinfo.cc (cygheap_user::ontherange): Accommodate new argument order - in call to sys_wcstombs. - * winsup.h (sys_wcstombs): Change prototype to match new argument order. - -2006-02-07 Corinna Vinschen - - * init.cc (respawn_wow64_process): Exit with the exit code returned - by the respawned process. - -2006-02-06 Christopher Faylor - - Always zero all elements of siginfo_t throughout. - * cygtls.h (_cygtls::thread_context): Declare new field. - (_cygtls::thread_id): Ditto. - (_cygtls::signal_exit): Move into this class. - (_cygtls::copy_context): Declare new function. - (_cygtls::signal_debugger): Ditto. - * cygtls.cc (_cygtls::init_thread): Fill out thread id field. - * exceptions.cc (exception): Change message when exception info is - unknown. Copy context to thread local storage. - (_cygtls::handle_exceptions): Avoid double test for fault_guarded. - Reflect move of signal_exit to _cygtls class. - (sigpacket::process): Copy context to thread local storage. - (_cygtls::signal_exit): Move to _cygtls class. Call signal_debugger to - notify debugger of exiting signal (WIP). Call stackdump here (WIP). - (_cygtls::copy_context): Define new function. - (_cygtls::signal_debugger): Ditto. - * tlsoffsets.h: Regenerate. - * include/cygwin.h (_fpstate): New internal structure. - (ucontext): Declare new structure (WIP). - (__COPY_CONTEXT_SIZE): New define. - - * exceptions.cc (_cygtls::interrupt_setup): Clear "threadkill" field - when there is no sigwaiting thread. - (setup_handler): Move event handling into interrupt_setup. - -2006-02-06 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::connect): Fix formatting. - (fhandler_socket::wait): Handle SA_RESTART when signal arrives. - -2006-02-06 Corinna Vinschen - - * include/cygwin/socket.h (CMSG_FIRSTHDR): Avoid compiler warning. - -2006-02-05 Corinna Vinschen - - * include/features.h: Add comment to explain what's going to happen - here at one point. - * include/sys/stdio.h: Guard getline and getdelim prototypes with - _GNU_SOURCE to avoid collision with old-style declarations. - -2006-02-05 Corinna Vinschen - - * environ.cc (struct parse_thing): Add transparent_exe option. - * fhandler_disk_file.cc (fhandler_disk_file::link): Accommodate - transparent_exe option. Add .exe suffix for links to executable files, - if transparent_exe is set. - * fhandler_process.cc (fhandler_process::fill_filebuf): Remove .exe - suffix if transparent_exe option is set. - * path.cc (symlink_worker): Accommodate transparent_exe option. - (realpath): Don't tack on .exe suffix if transparent_exe is set. - * syscalls.cc (transparent_exe): New global variable. - (unlink): Accommodate transparent_exe option. - (open): Ditto. - (link): Ditto. - (rename): Ditto. Maybe add .exe suffix when renaming executable files. - (pathconf): Accommodate transparent_exe option. - * winsup.h: Declare transparent_exe. - -2006-02-05 Christopher Faylor - Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::readdir_9x): Remove - useless code. - -2006-02-05 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::rewinddir): Remove label - "out". Move test for NULL __handle ... - (fhandler_disk_file::rewinddir_9x): ... here. - -2006-02-05 Corinna Vinschen - - * dir.cc (rewinddir): Keep dirent_get_d_ino and dirent_set_d_ino flags. - -2006-02-05 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::readdir): Don't close dir - handle when we hit EOF since rewwindir may reactivate it. - (fhandler_disk_file::readdir_9x): Eliminate superfluous temporary - variable. - (fhandler_disk_file::closedir): Return EBADF when trying to close - unopened DIR. Reorganize slightly. Return actual derived error value - rather than always returning 0. - -2006-02-04 Christopher Faylor - - * dir.cc (rmdir): Reorganize check for trailing dot to return correct - error when directory does not exist. - -2006-02-03 Christopher Faylor - - * dir.cc (mkdir): Reorganize check for trailing dot to return correct - error when directory exists. - * fhandler_disk_file.cc (fhandler_disk_file::mkdir): Remove special - test for path ending in '.'. - -2006-02-03 Corinna Vinschen - - * path.cc (suffix_scan::lnk_match): Return true beginning with - SCAN_APPENDLNK. - (suffix_scan::next): Rearrange code to make .lnk append order slightly - more deterministic. - * spawn.cc (exe_suffixes): Try no suffix before .exe suffix to align - evaluation with stat_suffixes. - (dll_suffixes): Ditto. - -2006-02-02 Christopher Faylor - - * cygwin/version.h: Mention CW_SETUP_WINENV in comment for API minor - 153. - -2006-02-02 Corinna Vinschen - - * cygwin.din (updwtmpx): Export. - * syscalls.cc (updwtmpx): New function. - * include/utmpx.h (updwtmpx): Declare. - * include/cygwin/version.h: Bump API minor number to 153. - -2006-02-02 Christopher Faylor - - * external.cc (setup_winenv): New function. - (cygwin_internal): Implement CW_SETUP_WINENV. - * sys/cygwin.h (cygwin_getinfo_types): Define CW_SETUP_WINENV. - -2006-02-02 Corinna Vinschen - - * security.cc (is_group_member): Fix comment. - -2006-02-02 Corinna Vinschen - - * security.cc (is_group_member): Use local group info type 1. Test - group for being a global group or a well-known SID before adding it - to the group list. Add comment. - -2006-02-01 Corinna Vinschen - - * autoload.cc (GetTcpTable): Define. - * fhandler_socket.cc (address_in_use): New function to check if - sockaddr_in address is already in use. - (fhandler_socket::bind): Check if address is alreay in use in case of - SO_REUSEADDR, to circumvent WinSock non-standard behaviour. - -2006-02-01 Corinna Vinschen - - * spawn.cc (dll_suffixes): Add .exe and "no suffix" to the list. - -2006-01-31 Corinna Vinschen - - * dlfcn.cc (check_path_access): Call find_exec with FE_DLL option. - * path.h (enum fe_types): Add FE_DLL value. - * spawn.cc (std_suffixes): Remove. - (exe_suffixes): New suffix_info for executing files. - (dll_suffixes): New suffix_info for searching shared libraries. - (perhaps_suffix): Add opt argument. Use dll_suffixes if FE_DLL - option is given, exe_suffixes otherwise. - (find_exec): Propagate opt argument to perhaps_suffix. Drop suffix - check when testing execute permission. - (spawn_guts): Call perhaps_suffix with FE_NADA opt argument. - -2006-01-31 Christopher Faylor - - * spawn.cc (av::fixup): Remove unused argument. - (spawn_guts): Remove capitalization in debugging. - -2006-01-31 Corinna Vinschen - - * spawn.cc (find_exec): Only return files with execute permission set - if ntsec is on. Don't check execute permission of Windows batch files. - (av::fixup): Handle empty files gracefully. Drop execute permission - test here. - * path.cc (suffix_scan::next): Don't skip any suffix on first run. - -2006-01-31 Corinna Vinschen - - * path.cc (cwdstuff::set): Don't set win32 error, only POSIX errno. - -2006-01-31 Corinna Vinschen - - * path.cc (cwdstuff::set): When SetCurrentDirectory returns - ERROR_INVALID_FUNCTION, bend it over to ERROR_FILE_NOT_FOUND. Add - comment to explain why. - -2006-01-31 Corinna Vinschen - - * dir.cc (readdir_worker): Add comment about writing old 32 bit d_ino. - * include/cygwin/version.h: Bump API minor number to 152. - (CYGWIN_VERSION_CHECK_FOR_NEEDS_D_INO): Remove. - -2006-01-30 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::rewinddir): Simplify - conditional. - -2006-01-30 Corinna Vinschen - - * fhandler_disk_file.cc (d_cachepos): Rename from d_pos to distinct - clearly from __d_position. Change throughout. - (fhandler_disk_file::rewinddir): Reset readdir cache on NT. - -2006-01-29 Corinna Vinschen - - * fhandler_disk_file.cc (readdir_get_ino): Don't follow symlinks. - -2006-01-29 Corinna Vinschen - - * fhandler.h (class fhandler_socket): Add saw_reuseaddr status flag. - * fhandler_socket.cc (fhandler_socket::bind): Set socket to - SO_EXCLUSIVEADDRUSE if application didn't explicitely set SO_REUSEADDR - socket option, on systems supporting SO_EXCLUSIVEADDRUSE. - * net.cc (cygwin_setsockopt): Set fhandler's saw_reuseaddr status flag - if SO_REUSEADDR socket option has been successsfully set. - * wincap.h (wincaps::has_exclusiveaddruse): New element. - * wincap.cc: Implement above element throughout. - -2006-01-28 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::mkdir): In case or error, - check for existance explicitely and set errno to EEXIST. - -2006-01-28 Corinna Vinschen - - * fhandler_disk_file.cc (DIR_NUM_ENTRIES): New define determining - minimum number of dir entries which fit into the readdir cache. - (DIR_BUF_SIZE): Define globally as size of readdir cache. - (struct __DIR_cache): New structure used for readdir caching on NT. - (d_dirname): Accessor for struct __DIR_cache, use throughout. - (d_pos): Ditto. - (d_cache): Ditto. - (fhandler_disk_file::opendir): Allocate __d_dirname to contain readdir - cache on NT. - (fhandler_disk_file::readdir): Use buf as pointer into readdir cache. - Implement readdir caching. - -2006-01-28 Corinna Vinschen - - * include/sys/dirent.h (struct dirent): Revert misguided attempt to - rename __d_unused1 to __d_fd. - -2006-01-27 Corinna Vinschen - - * autoload.cc (NtQueryDirectoryFile): Define. - * dir.cc (__opendir_with_d_ino): Just call opendir. - (opendir): Remove CYGWIN_VERSION_CHECK_FOR_NEEDS_D_INO handling. - (readdir_worker): Only try generating d_ino if it's 0. - Utilize namehash of directories fhandler. Call readdir_get_ino to - generate d_ino for "..". - (seekdir64): Keep dirent_set_d_ino flag. - * fhandler.h (enum dirent_states): Add dirent_get_d_ino. - (class fhandler_disk_file): Declare new private methods readdir_helper - and readdir_9x. - * fhandler_disk_file.cc (path_conv::hasgood_inode): New method to - evaluate if a filesystem has reliable inode numbers. - (fhandler_base::fstat_by_handle): Accommodate structure member name - change from IndexNumber to FileId. - (fhandler_base::fstat_helper): Call hasgood_inode here. - (fhandler_disk_file::opendir): Call fhaccess only for real files. - Don't append '*' to __d_dirname here, move to readdir_9x. On NT, - open directory handle here. Set dirent_get_d_ino and dirent_set_d_ino - flags according to wincap and filesystem. - (fhandler_disk_file::readdir_helper): New method to implement readdir - postprocessing only once. - (readdir_get_ino_by_handle): New static function. - (readdir_get_ino): New function to centralize inode number evaluation - in case inode number hasn't been returned by NtQueryDirectoryFile. - (fhandler_disk_file::readdir): Move old functionality to readdir_9x. - Call readdir_9x when on 9x/Me. Implement NT specific readdir here. - (fhandler_disk_file::readdir_9x): Move 9x specific readdir here. - (fhandler_disk_file::seekdir): Accommodate new NT readdir method. - (fhandler_disk_file::closedir): Ditto. - (fhandler_cygdrive::fstat): Set d_ino to namehash. Add comment. - (fhandler_cygdrive::opendir): Call get_namehash to prepare later - correct evaluation of d_ino. - (fhandler_cygdrive::readdir): Replace recursion with loop. Evaluate - drive's d_ino by calling readdir_get_ino. - * fhandler_proc.cc (fhandler_proc::readdir): Set dirent_saw_dot and - dirent_saw_dot_dot to avoid seeing . and .. entries twice. - * fhandler_process.cc (fhandler_process::readdir): Ditto. - * fhandler_registry.cc (fhandler_registry::readdir): Ditto. - * ntdll.h (STATUS_INVALID_PARAMETER): New define. - (STATUS_INVALID_LEVEL): New define. - (struct _FILE_INTERNAL_INFORMATION): Rename member IndexNumber to - FileId (as in Nebbitt). - * path.h (path_conv::hasgood_inode): Now implemented in - fhandler_disk_file.cc. - * wincap.h (wincaps::has_fileid_dirinfo): New element. - * wincap.cc: Implement above element throughout. - * winsup.h (readdir_get_ino): Add declaration. - * include/sys/dirent.h (struct dirent): Slightly rename structure - members to accommodate changes. - Remove __USE_EXPENSIVE_CYGWIN_D_INO handling and declaration of - __opendir_with_d_ino. - -2006-01-27 Christopher Faylor - - * spawn.cc (spawn_guts): Fix potential handle leak when failing exec. - -2006-01-27 Christopher Faylor - - * exceptions.cc (inside_kernel): Fix to return true if we can't get the - name of the DLL for the given memory block since we are not in kernel - code. - -2006-01-26 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Fix bug in argument order to - InitializeObjectAttributes call. - -2006-01-25 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::readdir): Fix test for - dirent_isroot to use the correct boolean operator. - -2006-01-25 Christopher Faylor - - * ntdll.h: (temporarily?) Add more functions for querying directory. - -2006-01-24 Christopher Faylor - - * dir.cc (readdir_worker): Turn off expensive inode calculation. - -2006-01-24 Corinna Vinschen - - * fhandler_process.cc (fhandler_process::fill_filebuf): Disable - stripping the .exe suffix from the link target in PROCESS_EXE and - PROCESS_EXENAME case. - * path.cc (realpath): Tack on .exe suffix if necessary. - -2006-01-24 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_base::fstat_helper): Try harder - to determine remote file systems with reliable inode numbers. Add - longish comment. - -2006-01-23 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::fixup_after_fork): Reset - inheritance for duplicated socket. - -2006-01-20 Christopher Faylor - - * include/cygwin/version.h: Bump API minor number to 151. - * dir.cc (__opendir_with_d_ino): New function. - (opendir): Set flag if we should be calculating inodes. - (readdir_worker): Calculate d_ino by calling stat if the user has asked - for it. - (seekdir64): Maintain all persistent flag settings. - * fhandler.h (dirent_states): Add dirent_set_d_ino. - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Reflect changes - to dirent structure. - * fhandler_virtual.cc (fhandler_virtual::opendir): Ditto. - * include/sys/dirent.h (struct dirent): Coalesce two similar - structures. Remove all shreds of the apparently highly confusing - references to inodes. Add support for calculating a real inode if - __USE_EXPENSIVE_CYGWIN_D_INO is defined. - -2006-01-20 Christopher Faylor - - * include/sys/dirent.h: Add comments for people who are REALLY confused - about whether they should be using something called __invalid_d_ino or - not. - -2006-01-20 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::prepare): Fix debug output. - (fhandler_socket::release): Add debug output for WSAEventSelect failure. - (fhandler_socket::ioctl): Always cancel WSAEventSelect before switching - to blocking mode. Only set nonblocking flag if ioctlsocket call - succeeded. Only print new socket state if ioctlsocket call succeeded. - -2006-01-19 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Check posix path - for root rather than windows path. - -2006-01-19 Christopher Faylor - - * dir.cc (readdir_worker): Fill in invalid fields with -1. Accommodate - name change from __ino32 to __invalid_ino32. - * include/sys/dirent.h (__invalid_ino32): Rename from __ino32. Don't - define unused d_type macros. - -2006-01-18 Christopher Faylor - - * heap.cc (heap_init): Remove Sleep. - -2006-01-18 Corinna Vinschen - - * net.cc (rresvport): Remove extern declaration. - -2006-01-18 Corinna Vinschen - - * autoload.cc (rresvport): Remove. - * net.cc (last_used_rrecvport): New global shared variable. - (cygwin_rresvport): Implement rresvport without using rresvport from - wsock32. - -2006-01-18 Corinna Vinschen - - * include/cygwin/socket.h (struct sockaddr_storage): Fix typo in - ss_family member name. - -2006-01-16 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor version number to 20. - -2006-01-13 Corinna Vinschen - - * uname.cc (uname): Concatenate a "-WOW64" to utsname's sysname - member to see when running under WOW64. - -2006-01-13 Corinna Vinschen - - * net.cc (cygwin_setsockopt): Ignore errors when setting IP_TOS on - Windows 2000 and above. Clarify the comment about IP_TOS and move - to the place where the magic happens. - (get_ifconf): Remove unused code. - * wincap.h (wincaps::has_disabled_user_tos_setting): New element. - * wincap.cc: Implement above element throughout. - -2006-01-12 Christopher Faylor - - * fhandler_console.cc (set_console_state_for_spawn): Fix to recognize - ttys >= 0. - -2006-01-12 Christopher Faylor - - * fhandler.h (set_console_state_for_spawn): Whackamole the argument - back to a bool. - * spawn.cc (spawn_guts): Ditto, i.e., once again call - set_console_state_for_spawn with an indication of whether we're about - to start a cygwin process. - * fhandler_console.cc (set_console_state_for_spawn): Don't set the - console state if we know we're starting a cygwin process or if we're - using a "real" tty. - -2006-01-10 Corinna Vinschen - - * dcrt0.cc (dll_crt0_0): Remove call to wincap.init. - * init.cc (dll_entry): Rename is_wow64_proc to wow64_test_stack_marker. - Call wincap.init here before doing anything else. Use wincap.is_wow64 - to determine if we're running in a WOW64 emulator. - * mmap.cc (MapViewNT): Don't use AT_ROUND_TO_PAGE in WOW64, it's - apparently not supported. - (mmap64): Don't create mappings beyond EOF, which would need to use - AT_ROUND_TO_PAGE, on WOW64. - * wincap.cc (wincap): Throw into the .cygwin_dll_common section. - (wincapc::init): Determine if running in WOW64 and set wow_64 flag. - * wincap.h (class wincapc): Add wow64 member. - (wincapc::is_wow64): New method. - -2006-01-10 Christopher Faylor - - * fhandler_proc.cc (format_proc_cpuinfo): Avoid leading whitespace in - model name. - -2006-01-09 Christopher Faylor - - * spawn.cc (spawn_guts): Reorganize slightly so that 16 bit check is - done prior to check for command.com/cmd.com. Don't bother setting - CREATE_SUSPENDED flag for a MS-DOS process since it doesn't work - anyway. Avoid calling remember() when the child process has already - exited. - (av::fixup): Explicitly set cygexec flag to false on a 16 bit process. - -2006-01-09 Corinna Vinschen - - * include/getopt.h (getopt_long_only): Declare. - -2006-01-09 Eric Blake - - * cygwin.din: Export getsubopt. - * include/cygwin/version.h: Bump API minor version. - -2006-01-08 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::dup): Don't assign a controlling - terminal to a process when duped. Linux doesn't do this, so we won't - either. - -2006-01-08 Christopher Faylor - - * environ.cc (spenvs[]): windir -> WINDIR. - -2006-01-07 Christopher Faylor - - * fhandler_console.cc (fhandler_console::need_invisible): Remove - duplicate test. - -2006-01-07 Christopher Faylor - - * fhandler.h (set_console_state_for_spawn): Eliminate argument from - declaration. - * fhandler.cc (set_console_state_for_spawn): Eliminate argument from - definition. Always check for invisible console. - (fhandler_console::need_invisible): Don't do anything if the windows - station is already not visible. - * spawn.cc (spawn_guts): Accommodate change of argument to - set_console_state_for_spawn. - -2006-01-05 Christopher Faylor - - * sigproc.cc (no_signals_available): Use existence of signal thread - handle to figure out if we can actually send signals rather than - relying on my_sendsig. - (hwait_sig): Make static. - (sigproc_init): Don't set my_sendsig to anything special. Use new - global static hwait_sig. - (wait_sig): Set hwait_sig to NULL when we are exiting. - -2006-01-05 Christopher Faylor - - * include/getopt.h: Accommodate recent unfortunate newlib changes. - -2006-01-05 Christopher Faylor - - * cygtls.cc (_cygtls::remove): Don't output debugging info if this - isn't a cygwin thread. - * sigproc.cc (sigproc_init): Move clearing of sync_startup here to - lessen the likelihood of trying to deal with non-cygwin threads in - dll_entry. - - * fhandler_console: Fix set_console_state_for_spawn comment. - -2006-01-05 Igor Peshansky - - * spawn.cc (spawn_guts): Invert the argument to - set_console_state_for_spawn. - -2006-01-04 Christopher Faylor - - * fhandler_console.cc (fhandler_console::need_invisible): Only try to - open "CygwinInvisible" windows station if opening of default station - fails. Use CloseWindowStation to close window station handle. - -2006-01-04 Christopher Faylor - - * fhandler_console.cc (fhandler_console::need_invisible): Open up the - security of the newly created windows station. - -2006-01-04 Eric Blake - - * path.cc (dot_special_chars): Add ", <, >, and |. - -2006-01-03 Christopher Faylor - - * fhandler_console.cc (beep): Use MB_OK which is documented as using - the default bell rather than -1 which seems to behave differently on - different versions of Windows. - -2006-01-03 Christopher Faylor - - * fhandler_process.cc (fhandler_process::readdir): Add missing argument - to syscall_printf. - - * fhandler_console.cc (fhandler_console::need_invisible): Use made-up - name for windows station rather than asking Windows to create one for - us. - - * spawn.cc (spawn_guts): Don't mess with console if we're detaching. - -2006-01-03 Christopher Faylor - - * dir.cc (readdir_worker): Minor code cleanup. - - * fhandler_console.cc (beep): Use a more Windows-generic wav file if - the beep is missing. Use a more foolproof way to find out whether we - should be recreating the missing key. - - * registry.h (reg_key::_disposition): New field. - (reg_key::created): New function. - * registry.cc (reg_key::reg_key): Set _disposition to zero by default. - (reg_key::build_key): Fill in _disposition field. - -2006-01-03 Eric Blake - - * dir.cc (readdir_worker): Ensure that saw_dot* flags are updated when - not handling inodes. - -2006-01-02 Christopher Faylor - - * fhandler_console.cc (beep): New function. Restores missing "Default - Beep", if necessary. - (fhandler_console::write_normal): Use beep(). - -2006-01-02 Christopher Faylor - - * dcrt0.cc (_dll_crt0): Remove more leftover debugging stuff. - (cygwin_dll_init): Remove unneeded initializations. Call _dll_crt0 - rather than dll_crt0_1. - -2006-01-02 Corinna Vinschen - - * syslog.cc: Include sys/un.h instead of sys/socket.h. - (syslogd_inited): Convert to enum type noting the exact result of - trying to connect to syslog daemon. Use this way throughout. - (connect_syslogd): New static function taking over the task to - connect to syslog socket. Use correct struct sockaddr_un instead of - struct sockaddr. - (try_connect_syslogd): Call connect_syslogd. If write fails on - connection oriented socket, try to reconnect to syslog socket and - try to write again. - -2006-01-01 Christopher Faylor - - * pinfo.cc (pinfo::exit): Swap signal and normal exit value when not - started from a cygwin process - just like the good-old-days of B20. - -2006-01-01 Christopher Faylor - - * strace.cc (strace::write_childpid): Remove debugging output. - -2006-01-01 Christopher Faylor - - * cygtls.cc (_cygtls::remove): Remove left over debugging cruft which - caused this function to always return prematurely. - -2006-01-01 Christopher Faylor - - * exceptions.cc (sigpacket::process): Pass actual reference to signal's - sigaction structure to setup_handler. - -2006-01-01 Christopher Faylor - - * exceptions.cc (_cygtls::interrupt_setup): Implement SA_RESETHAND. - * include/cygwin/signal.h: Define SA_ONESHOT and SA_NOMASK. - - * dcrt0.cc (get_cygwin_startup_info): Remove commented out code. - -2006-01-01 Corinna Vinschen - - * syslog.cc (vklog): Never log kernel messages using the vsyslog - interface. - diff --git a/winsup/cygwin/ChangeLog-1995 b/winsup/cygwin/ChangeLog-1995 deleted file mode 100644 index 43d28a3a1..000000000 --- a/winsup/cygwin/ChangeLog-1995 +++ /dev/null @@ -1,177 +0,0 @@ -Mon Dec 18 16:44:38 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * configure.in (target_cpu): specify valid Intel x86 architectures - explicitly. - -Mon Dec 18 15:04:29 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * sysdef/*.def: moved to sysdef/i386/. - -Mon Dec 18 15:00:56 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * configure.in: Set DLL_ENTRY and SYSDEF_DIR for i386 and powerpc. - * configure: Regenerated with autoconf 2.7. - - * Makefile.in: Use DLL_ENTRY and SYSDEF_DIR. - -Sat Dec 16 18:36:44 1995 steve chamberlain - - Changed the way that file handles are inherited. Now - all files are opened with the inheriting turned on, and they're - closed when necessary. - - Changed the way that children are waited for. Now - you can exec a non-gnuwin32 program and wait for its - result. - - * Makefile.in: Turn off frame-pointer. - * dcrt0.cc (environ_init): Lint. - * dirsearch.cc (opendir): Use new path_conv mechanism. - * exceptions.cc (ctrl_c_handler): Exit with correct status - * exec.cc (file_exists): Moved to paths.cc - (_execve): Moved most of the work into spawn.cc. - * fhandler.cc (*): Much. - * libccrt0.c (foo): Deleted. - (cygwin_crt0): Lint. - * path.cc (readlink): Initialize the SECURITY_ATTRIBUTES struct. - * pipe.cc (pipe, dup*): Reorganized. - * registry.cc (read_in): Create the key in CURRENT_USER. - * wait.cc, spawn.cc (*): Much. - * sysconf.cc (sysconf): Understand SC_PAGESIZE. - * times.cc (utime): New function. - * uname.cc (uname): Dig out more info. - -Wed Dec 13 05:54:55 1995 Michael Meissner - - * dcrt0.cc (environ_init): Cast alloca return to appropriate type. - * spawn.cc (spawn_guts): Ditto. - - * strace.cc (__small_{v,}sprintf): Add appropriate prototypes. - - * exceptions.cc (_except_list): Only use segments for 386 systems. - (__stack_trace): Add PowerPC support, and do nothing for systems - that are not supported except print stack tracing is not yet - support. - - * sdata.cc (import_term): Only use __attribute__((section)) on 386 - systems. - - * shared.cc (shared_init): Use MARK macro instead of calling mark - directly with incorrect type arguments. - - * fhandler.cc (fhandler_dev_null::{read,write}): Use size_t in - prototype, not unsigned int. - - * fork.cc (find_exec): Fix type errors. - * path.cc (path_to_real_path_keep_rel): Ditto. - * syscalls.h (PATH_TO_REAL_PATH): Ditto. - - * {longjmp,setjmp}.c: #ifdef i386 code. - - * include/wintypes.h (ExitProcess): Add - __attribute__((__noreturn__)) so exit compiles without warnings. - -Tue Dec 12 18:25:05 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * include/wintypes.h (WINAPI): Only define WINAPI for x86 systems. - -Tue Dec 5 16:00:05 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * Makefile.in (all): Only build documentation for info target. - Expect texi2html to not be found most of the time. - -Tue Dec 5 08:08:08 1995 steve chamberlain - - Release-B10 - - * cygwin.dll (__assert, wait, spawnv, spawnvp): Deleted. - * dcrt0.c: Quoting rewritten. - * exec.cc (file_exists): Use new path_conv mechanism. - (_execve): Close open child process handles. - * fhandler.cc (fhandler_normal::open): Follow symlinks. - (fhandler_normal::read): Keep track of logical file posision. - (fhandler_normal::lseek): Seek in text files correctly. - (fhandler_normal::fstat): Set IFLNK bit if its a symlink. - (fhandler_normal::init): Maintain is_pipe. - (fhandler_dev_null::fstat): New. - (fhandler_dev_null::get_handle): Return INVALID_HANDLE. - * fork.cc: Use new event mechanism. - * libccrt0.cc: Keep track of _fmode variable. - * misc.c (readlink): Delete. - * path.cc (__path_to_real_path_1): Allow /d mechanism. - (path_to_real_path_keep_rel): New - (link_cookie:*): Support for symbolic links. - * spawn.cc (spawn_guts): Quoting rewritten. - * times.cc: New. - * syscalls.cc (_stat_worker): New. - (_stat, _lstat): Use _stat_worker. - * sysconf.cc (sysconf): Support _SC_CLK_TCK. - -Tue Nov 28 15:29:38 1995 steve chamberlain - - * loads of stuff. When I make < 100k of diffs in a day, - the ChangeLog will be usefull. - -Tue Nov 21 18:01:39 1995 steve chamberlain - - * Makefile.in: Build the doc. - * exceptions.cc: lint. - * fork.cc: lint. - * shared.cc (shared_init): If MapViewOfFileEx fails, then try - again, but get the OS to select the address (for win95) - * strace.cc (__sysprintf): Print pid and state in hex. - * syscalls.cc (_unlink): Translate path to realpath. - -Wed Nov 15 23:47:43 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * spawn.cc (_exit): set return value's lower byte to 0 by default. - - Tue Oct 3 10:23:14 1995 Anders Blomdell (anders.blomdell@control.lth.se) - - * spawn.cc (spawn_guts): quote doublequotes correctly - -Tue Nov 14 15:05:33 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * configure.in: comment out call to cfg-ml-com.in. - -Tue Oct 31 11:19:18 1995 steve chamberlain - - * libcerr.cc: New file. - * dcrt0.cc (environ_init): Initialize PATH and friends nicely. - * exceptions.cc (ctrl_c_handler): Default case is to exit. - * fork.cc (__suffixy, find_exec): translate between paths and - real_paths. - * shared.cc (shared_init): Hard wire shared memory at 0xa0000000. - * syscalls.c (__path_to_real_path, real_path_to_path): Always - translate '/' <> '\' - -Mon Oct 30 17:36:10 1995 steve chamberlain - - * syscalls.cc (_rename): Fix for win95. - -Fri Oct 27 20:53:47 1995 steve chamberlain - - * Everything changed. - -Thu Oct 19 10:47:52 1995 steve chamberlain - - * registry.cc, uinfo.cc: New files. - * crt0.c (*uinfo*, *_exe_suffix*): Delete. - (dll_crt0): Call shared_init. - * getlogin.c: deleted. - * shared.cc: Fill in. - * spawn.c (_spawn): Use __exe_suffix function. - * syscalls.c (getuid, getgid): Moved into uinfo.cc - * syscalls.h (*uinfo, __exe_suffix): Deleted - * Makefile.in: Cope with target configury. - * termios.c: Fix stub prototypes. - * win.h: Deleted. - * include/winadvapi.h: Fill in some REG prototypes. - -Thu Oct 19 10:47:52 1995 steve chamberlain - - * Makefile.in: Cope with target configury. - -Wed Oct 18 15:34:49 1995 steve chamberlain - - * Moved from newlib. diff --git a/winsup/cygwin/ChangeLog-1996 b/winsup/cygwin/ChangeLog-1996 deleted file mode 100644 index 9c786c408..000000000 --- a/winsup/cygwin/ChangeLog-1996 +++ /dev/null @@ -1,2031 +0,0 @@ -Mon Dec 23 13:35:27 1996 Jeremy Allison - - * Makefile.in: Added $(srcdir)/../libstdc++/stl -I$(srcdir)/../libio - to the include path. As mmap uses STL then this is needed - to build the cross compiler. Also added mmap.o file. - * cygwin.din: Added mmap, mprotect, msync, munmap. - * dcrt0.cc: Added code to get the module pathname from - a previously unused field in the u area so fork() calls - don't have to search the path. Forwards compatible with - earlier releases as they set this field to zero. - * fork.cc: Added call to recreate_mmaps_after_fork() in - child code. Ensures child has same view of mmap'ed areas - as parent. - * libccrt0.cc: (See dcrt0.cc change). Setup the module - handle so fork can get the path name. - * mmap.cc: New file. Implements mmap, mprotect, msync, munmap, - recreate_mmaps_after_fork. Uses STL. - * select.cc: Added code to set errno to EINVAL if select done - on handles and sockets. Must fix this soon. - * spawn.cc: Set new variable hmodule in u area to zero for child. - * syscalls.cc: Added fsync functionality. No longer a dummy call. - * winsup.h: Decremented internal_reserved array by one to add - hmodule in u area. Added prototype for recreate_mmaps_after_fork(). - * include/sys/mman.h: Fixed include file for mmap calls. - -Tue Dec 17 16:20:52 1996 Geoffrey Noer - - * syscalls.cc (_rename): fix code so we really do - return -1 if _rename fails. - -Tue Dec 17 12:12:29 1996 Jeremy Allison - - * fhandler.cc: Added Sergeys patch for FakeReadFile. - * cygwin.din: Re-ordered network calls. - -Mon Dec 16 16:47:26 1996 Geoffrey Noer - - * configure.in: remove AC_C_CROSS (now part of AC_PROG_CC) - * utils/configure.in: ditto - * configure: regenerate - * utils/configure: regenerate - -Mon Dec 16 14:50:46 1996 Geoffrey Noer - - * cygwin.din: export cygwin32_getsockopt - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * spawn.cc: don't assume all scripts should be run in - bash -- run the shell specified after the #! - -Fri Dec 13 16:18:22 1996 Jeremy Allison - - * path.cc: Added support for UNC paths. - -Fri Dec 13 10:56:21 1996 Jeremy Allison - - * cygwin.din: Added h_errno, seteuid, _seteuid. - * exceptions.cc: Made init_exceptions extern "C". - * exceptions.h: Added cplusplus wrappers to enable this to - be used from C. - * net.cc: Added error numbers, fixed gethostbyaddr, added h_errno - fixes. - * stubs.cc: Added seteuid. - * include/mywinsock.h: Added HOST error entries for DNS lookups. - -Tue Dec 10 15:38:46 1996 Geoffrey Noer - - * version.h: bump CYGWIN_DLL_VERSION_MINOR to 4 - - patch from Marcus Daniels : - * fhandler.cc: add fhandler_dev_null::dup (fhandler_base *child) - * fhandler.h: add matching header - - gnu-win32 beta 17.1 release made - -Thu Dec 5 14:03:08 1996 Geoffrey Noer - - * select.cc: add missing end comment at about line 933. - gnu-win32 beta 17 release made - -Wed Dec 4 15:53:11 1996 Geoffrey Noer - - * version.h: increment minor dll number in conjunction - with gnu-win32 beta 17 release - -Tue Dec 3 15:05:57 1996 Geoffrey Noer - - * strsep.cc: new file containing Berkeley-copyrighted strsep - code previously in misc.cc. - * misc.cc: strsep moved to strsep.cc, stop including - unistd.h, strings.h, sys/types.h, stddef.h, and stdarg.h - * Makefile.in: appropriate adjustments to add strsep.cc - -Tue Dec 3 13:50:59 1996 Geoffrey Noer - - * include/sys/copying.dj: new file whose presence is - required by include/sys/file.h - -Tue Dec 3 13:37:27 1996 Geoffrey Noer - - Throughout all Cygnus-developped source files: put all - code under GPL - -Tue Dec 3 10:54:01 1996 Jeremy Allison - - * fork.cc: Changed code to delete [] saved child_hinfo - after allocate_pid called. Needed as child changes this - value in the shared area when it de-linearizes fd array. - Needed to stop race condition with earlier fix. - * winsup.h: Changed definition of item in hinfo to be - a char array rather than fhandler_console. Stops - destructor being called when fork delete [] of - hinfo array called. - * hinfo.cc: Changes (casts) to support winsup.h changes. - -Mon Dec 2 17:22:13 1996 Geoffrey Noer - - * include/utime.h: add ifdef _UTIME_U wrapper around header - -Mon Dec 2 15:45:46 1996 Jeremy Allison - - * fork.cc: Fixed file descriptor resource leak in parent. - * registry.cc: Removed fatal error if registry key cannot - be opened. Causes errors in service code. - -Wed Nov 27 15:40:15 1996 Geoffrey Noer - - * cygwin.din: for MS compatibility, also export functions - as _funcname = funcname - * include/netdb: - * include/sys/socket.h: - Do the equivalent thing for functions exported as cygwin32_funcname - -Wed Nov 27 15:14:30 1996 Geoffrey Noer - - * cygwin.din: remove exported helper functions that shouldn't - need to be exported (_read et al) - * glob/Makefile.in: add SHELL definition - * utils/Makefile.in: add SHELL definition - -Mon Nov 25 14:24:52 1996 Geoffrey Noer - - * include/commdlg.h, ddeml.h, winadvapi.h, winbase.h, wincon.h, - windef.h, windowsx.h, winerror.h, wingdi.h, winkernel.h, winnt.h, - wintypes.h, winuser.h, winversion.h: - Add MS-style header files back, each of which now includes our - windows.h. This should allow compilation of Windows code - that expects normal MS-named headers as long as the information - is in our windows.h somewhere. The appropriate wrappers have - been added to each file so windows.h isn't included more than - once. - * include/windows.h: add paranoia wrapper so it can be included - more than once. - -Mon Nov 18 22:19:40 1996 Geoffrey Noer - - * Makefile.in: change rules around so new-cygwin.dll is - only rebuilt when necessary - * spawn.cc: include - -Mon Nov 18 21:08:15 1996 Geoffrey Noer - - * net.cc: remove extern "C"s that shouldn't be there - (get_win95_ifconf, get_winnt_ifconf, get_if_flags) - * syscalls.cc: remove extern "C"s from num_entries, _stat_worker - * winsup.h: add extern "C"s for syscalls protos - -Mon Nov 18 20:35:39 1996 Geoffrey Noer - - * winsup.h: include version.h - * Makefile.in: remove dependencies involving version.h, but add - version.h to winsup.h dependency line and also add others that - should also be there. - * dcrt0.cc: - * libccrt0.cc: - * registry.cc: - * shared.cc: delete includes of version.h - -Mon Nov 18 20:16:37 1996 Geoffrey Noer - - * stubs.c -> stubs.cc, add extern "C"s - * uname.c -> uname.cc, add extern "C"s - * console.cc: add extern "C"s, remove include windows.h - since its already included in winsup.h - * dirsearch.cc: add extern "C"s - * fcntl.cc: add extern "C"s - * winsup.h: remove LEAN_AND_MEAN define since that's no longer - relevant with new windows headers, include version.h - * malloc.cc: fix typos - -Mon Nov 18 18:02:31 1996 Geoffrey Noer - - * grp.c renamed to grp.cc, add extern "C"s - * misc.c renamed to misc.cc, add extern "C"s - -Mon Nov 18 16:08:26 1996 Geoffrey Noer - - * syscalls.cc: extern "C"'d function calls - * net.cc: extern "C"'d function calls, some respacing - * hinfo.cc: extern "C"'d function calls, some respacing - * syscalls.h: removed defines for MIN, errno, alloca(x), - DEFAULT_GID/UID, NOT_OPEN_FD(fd), STD_RBITS et al, - O_NOSYMLINK - * winsup.h: added what was just deleted from syscalls.h - -Mon Nov 18 15:56:22 1996 Jeremy Allison - - * cygwin.din: Added readv - * syscalls.cc: Added readv code. - * syscalls.h: Added readv prototype. - -Wed Nov 13 15:55:14 1996 Geoffrey Noer - - * cygwin.din: added C++-related exports for stuff in - libgcc.a (from new.o, tinfo.o, tinfo2.o, exception.o). - -Mon Nov 11 15:50:26 1996 Geoffrey Noer - - * dcrt0.cc - * dirsearch.cc - * malloc.cc - * passwd.cc - * path.cc, - * pinfo.cc - * syslog.cc - * utils/kill.cc - * utils/cygwin.cc: - need to #include which used to be included - automatically in windows.h included by winsup.h. - * shared.cc: UnmapViewOfFile takes a void *, not a - const void * - * malloc.cc: formatting fixes - -Fri Nov 8 17:31:55 1996 Jeremy Allison - - * select.cc: Added fix for HANDLE select sent by - Sergey Okhapkin. - * fhandler.h: Changed dup to return int. Can now - return error to dup2. - * fhandler.cc: Changed dup to return error code. - Corrected fhandler_console::close to return - error code. - * hinfo.cc (dup2): Check return code from - fhandler->dup. - * times.cc: Changed DST calculation as tm struct - month starts at zero, NT wMonth starts at 1. - * TODO: Added the things i'd like to do. - -Wed Nov 6 17:42:31 1996 Geoffrey Noer - - * Makefile.in: Changed name of base file for cygwin.dll from - base to cygwin.base. Changed name of exp file for cygwin.dll - from win.exp to cygwin.exp. Updated dependency list, removing - recently removed files like libcfork.cc, added missing files, - and added all missing header dependencies. Small formatting - fixes. - -Fri Nov 1 16:38:48 1996 Geoffrey Noer - - * TODO: deleted old stuff from a long time ago, added some - new stuff - - * added public domain disclaimers to all files missing them, - reformatting of non-imported code to conform to GNU standards. - Changes to: - delqueue.h, exceptions.h, fcntl.cc, fhandler.h, grp.c, - init.cc, ioctl.cc, key.cc, libcctype.c, libcerr.cc, libcmain.cc, - misc.c, path.h, pold.c, resource.cc, smallprint.c, strerror.cc, - syslog.cc, termios.cc, test.c, version.h, wait.cc - -Fri Nov 1 14:44:29 1996 Jeremy Allison - - * fhandler.h: Added is_console() method needed by - new select code. - * fhandler.cc (fhandler_console::init): Added c_oflag setting - dependent on bin parameter. - * select.cc: Added code to implement select from console - handles. Ignores keyup events and still blocks. - -Wed Oct 30 16:35:41 1996 Jeremy Allison - - * fhandler.h: Removed fhandler_console_in, fhandler_console_out - and integrated them both into fhandler_console. Added output_handle_ - so fhandler console has two handles. - * fhandler.cc: Updated to support changes in fhandler.h. It is now - possible to open("/dev/tty") and read/write to the same fd. - * hinfo.cc(build_fhandler): Removed references to obsolete classes. - * spawn.cc: Changed to get correct reference to output_handle_ for - fhandler_console class. - * console.cc: Changed to get output handle rather than input handle. - * winsup.h: Changed definition of prototypes for functions changed - in console.cc - -Wed Oct 30 13:05:33 1996 Geoffrey Noer - - * include/custcntl.h - * include/features.h - * include/icmp.h - * include/wchar.h - * include/cygwin32/icmp.h - * include/cygwin32/ip.h - * include/cygwin32/sockios.h - * include/cygwin32/types.h - * include/cygwin32/uio.h - * include/sys/ttychars.h - Added comment with name of header to each so that these are no - longer empty files (some unzip programs won't create - zero-length files which is a problem for headers) - -Sun Oct 27 17:30:03 1996 Geoffrey Noer - - * cygwin.din: also export "_execl = execl" and the same - for _execle and _execlp - -Thu Oct 24 01:43:29 1996 Geoffrey Noer - - * include/windows.h: rewritten to include headers from - the include/Windows32 subdirectory - * winsup.h: no longer define MAX_PATH here since it's defined - in header files dragged in by windows.h - * dirsearch.cc (readdir): change WIN32_FIND_DATAA to WIN32_FIND_DATA - * libccrt0.cc: #include - * syscalls.cc (_unlink): chmod file to be unlinked to be - writable and try to delete it again if first delete failed - with permission denied error (rm will now work on read-only files) - (num_entries): change WIN32_FIND_DATAA to WIN32_FIND_DATA - * include/commdlg.h: delete - * include/ddeml.h: delete - * include/winadvapi.h: delete - * include/winbase.h: delete - * include/wincon.h: delete - * include/windef.h: delete - * include/windowsx.h: delete - * include/winerror.h: delete - * include/wingdi.h: delete - * include/winkernel.h: delete - * include/winnt.h: delete - * include/wintypes.h: delete - * include/winuser.h: delete - * include/winversion.h: delete - -Wed Oct 23 10:43:05 1996 Jeremy Allison - - * dcrt0.cc (api_fatal): Changed locking clear of - process table to unlocking clear. Needed as lock code calls - api_fatal. - * exceptions.cc: Added debug_printfs to follow exceptions in - strace mode. - * pinfo.cc: Added code to ensure fd table is cleared when new - pid entry allocated. Fixed bug when process is terminated - violently by TerminateProcess and leaves fd table non-zero. - * termios.cc: Changed stubbed out syscalls to syscall_printf - rather than small_printf. Stops annoying tcdrain message. - * winsup.h: Made get_empty_pinfo call private to pinfo_list. - Should never be called external to this class. - -Tue Oct 22 16:14:23 1996 Jeremy Allison - - * hinfo.cc: Removed previous change. This is not the - correct place to flush input events. - -Tue Oct 22 09:25:32 1996 Jeremy Allison - - * dcrt0.cc: Fixed up exit code to clean up pinfo array. - * exceptions.cc: Fixed up exit code to clean up pinfo array. - * fork.cc: Tidied up access to inuse_p entry. Added flags - to allow different states to be represented. - * hinfo.cc: Added code to flush pending events if - stdin is a console. - * pinfo.cc (pinfo::record_death): Added code to clean - the pinfo array if we are an exiting parent. - * spawn.cc: Removed erroneous code to clean childs - pinfo entry. - * wait.cc: Changed WAIT_ERROR_RC to Win32 WAIT_FAILED. - Tidied up access to pinfo array. - * winsup.h: Added record_death_nolock to pinfo class. - Added PID_XXX types for inuse_p. - -Tue Oct 22 01:26:52 1996 Geoffrey Noer - - * include/Windows32/Base.h: - * include/Windows32/Functions.h: - * include/Windows32/Structures.h: - * include/Windows32/UnicodeFunctions.h: - Fixes to just commited changes - -Mon Oct 21 19:58:50 1996 Geoffrey Noer - - * include/Windows32/ASCIIFunctions.h: - * include/Windows32/Base.h: - * include/Windows32/Defines.h: - * include/Windows32/Functions.h: - * include/Windows32/Structures.h: - * include/Windows32/UnicodeFunctions.h: - - Add back items in old include files (commdlg.h, ddeml.h, - shellapi.h, winadvapi.h, winbase.h, wincon.h, windef.h, - windowsx.h, winerror.h, wingdi.h, winkernel.h, winnt.h, - wintypes.h, winuser.h, winversion.h) which should now be able - to be erased and windows.h modified to point to the new headers - without anything nasty happening. - - * include/WINREADME: deleted - * include/mywinsock.h: removed many blank lines - -Mon Oct 21 09:48:00 1996 Jeremy Allison - - * select.cc: Re-written from scratch. Take account of - the following cases. (1). All sockets [written&works] - (2). Handles, sockets and always readies [written,not tested] - (3). All handles [written,not tested]. (4). Handles & sockets - with timeout [not yet written,returns -1]. Correctly blocks - and doesn't spin cpu. - * pinfo.cc: Changed to add global lock around pinfo array. - * fork.cc: Changed to use global pinfo lock. - * shared.cc: Fixed bug with fork()->exec()->exec() code. - * net.cc: Removed select_init() call (no longer used). - * spawn.cc: Implemented suggestion that spawn creates - process suspended, then sets up it's dwProcessId entry - in the shared pinfo array. - * wait.cc: Changed to use global pinfo lock. - * winsup.h: Added missing windows_95() call. - * fhandler.h: Changed ifdefs to select new always_ready - methods. - * fhandler.cc (fhandler_console::write): Fixed bug - where return of write_normal was being ignored. - * dcrt0.cc: Added code to use global pinfo lock. - Ensure that process records it's own death. - * exceptions.cc: Added code to clear our entry in pinfo - array when we are exiting. Should reduce dead processes in - pinfo array. - * include/winbase.h: Added MAXIMUM_WAIT_OBJECTS define. - -Mon Oct 21 00:52:17 1996 Geoffrey Noer - - * Makefile.in: install headers from new Windows32 dir - -Sat Oct 19 00:47:58 1996 Geoffrey Noer - - * include/Windows32/Base.h: change DWORD to unsigned int from - unsigned long, change __WIN32__ checks to _WIN32, change - // comments to /* */ - -Fri Oct 18 17:33:07 1996 Geoffrey Noer - - * include/Windows32/Defines.h: change INFINITE to 0xFFFFFFFF, - add back definitions present in old winsup headers missing from - this file (STATUS_WAIT_0 et al, CONTEXT stuff, FAR, PACKED, - ASCIICHAR) - * include/Windows32/Functions.h: change // comments to /* */ - * include/Windows32/Messages.h: add definitions for WM_NULL, - WM_PENWINFIRST, WM_PENWINLAST - * include/Windows32/Sockets.h: change __WIN32__ checks to _WIN32 - * include/Windows32/Structures.h: add ppc case for CONTEXT - structure, change // comments to /* */ - -Fri Oct 18 17:25:09 1996 Geoffrey Noer - - * include/Windows32: new directory for Windows headers - * include/Windows32/ASCIIFunctions.h: - * include/Windows32/Base.h: - * include/Windows32/Defines.h: - * include/Windows32/Errors.h: - * include/Windows32/Functions.h: - * include/Windows32/Messages.h: - * include/Windows32/Sockets.h: - * include/Windows32/Structures.h: - * include/Windows32/UnicodeFunctions.h: - New Win32 headers from Scott Christley's windows32api-0.1.2 package - with no local modifications. - -Wed Oct 16 17:16:33 1996 Geoffrey Noer - - * key.cc: remove extra blank lines, change ASCIICHAR to AsciiChar - * registry.cc: remove #include since it's already - included in windows.h - -Tue Oct 15 09:51:48 1996 Jeremy Allison - - * fhandler.h: Many changes to support moving fhandler array out of - shared area into locally allocated memory. Removed fhandler class, - fhandler_base is now root of class tree. Re-arranged class definitions - to make it clear what functions are virtual and can be overridden. - Inlined may accessor functions. - * fhandler.cc: Many changes to support moving fhandler array out of - shared area into locally allocated memory. unix_path_name_ is now - always set (all fhandler_base classes have a name). - * hinfo.cc: Many changes to support moving fhandler array out of - shared area into locally allocated memory. Added linearization and - de-linearization functions. - * net.cc(socket): Added code to keep name for fhandler_socket. - * pinfo.cc : Changed allocation of fhandler_base array to be in local - memory rather than in shared area. (modified functions are pinfo_init, - pinfo_list::get_empty_pinfo, pinfo_list::allocate_pid, - pinfo::record_death). - * shared.cc: Added functions to copy fd area for spawned process. - Changed name of shared area to include master version number of - Cygwin32. - * spawn.cc (spawn_guts): Added code to initialize new shared area - for fds. - * syscalls.cc: Changed all code depending on NOFILE to use - getdtablesize(). Added internal setdtablesize() call for exec'ed - processes. - * syscalls.h: Added getdtablesize(). - * sysconf.cc (sysconf): Changed SC_OPEN_MAX to return getdtablesize(). - * winsup.h: Moved fhandler array out of shared area. Changed from - fhandler to fhandler_base (new root of class tree). - * include/mywinsock.h: Updated #endif to make end of - __INSIDE_CYGWIN32__ clear. - * include/winkernel.h: Added UnmapViewOfFile call. - -Mon Oct 14 14:59:16 1996 Geoffrey Noer - - * sysdef/i386: replace all files with ones from Scott - Christley's windows32api-0.1.2 package. Still need to - integrate new headers. - -Mon Oct 14 13:41:14 1996 Geoffrey Noer - - * syscalls.cc (_unlink): need to fchmod file to writable - before attempting to delete. This change still needs more - work (fchmod isn't written yet). - * (fchmod): change comment - -Fri Oct 11 22:27:17 1996 Geoffrey Noer - - * fhandler.cc, fhandler.h: minor fixes to console - support functions (remove missed reference to gotarg2, - definition in fhandler.h) - -Wed Oct 9 17:55:00 1996 Geoffrey Noer - - * delqueue.cc: added copyright notice, reformatted file - - from sos@prospect.com.ru (Sergey Okhapkin): - * fhandler.cc, fhandler.h: add/fix ansi/vt100 console support, - and fix a tab bug - (modified functions are fhandler_console_out::clear_screen, - fhandler_console_out::clear_to_eol, - fhandler_console_out::char_command, - fhandler_console_out::write, - FakeReadFile) - -Wed Oct 9 17:32:17 1996 Jeremy Allison - - * times.cc: Swapped gmtime and localtime (they were - incorrectly reversed). - Added is_dst determination to them both. - * misc.c: Added swab, ffs. - * fcntl.cc(fcntl): Added capability for lock calls. - * fhandler.h: Added lock method into fhandler class. - * fhandler.cc: Added NT/Win95 semantics locks into ::lock - made them pretend they are POSIX locks. - * syscalls.cc (writev): Fixed return value bug. - * net.cc: Added WSAEOPNOTSUPP error. - * cygwin.din: Added ffs and swab. - * include/strings.h: Added file (just include string.h). - * include/winbase.h: Added defines LOCKFILE_FAIL_IMMEDIATELY - and LOCKFILE_EXCLUSIVE_LOCK. - * include/winerror.h: Added define ERROR_LOCK_FAILED. - -Thu Oct 3 16:19:23 1996 Jeremy Allison - - * fhandler.h: Many changes - removed all public variables - from classes, replaced with accessor functions. Renamed all - class variables to add a trailing '_'. This makes reading - and understanding which variables are class variables much simpler. - Changed name member to unix_path_name_ and made dynamic rather - than a fixed 31 byte buffer per entry. - * fhandler.cc: Updated varable access for above. - * fcntl.cc: Updated varable access for above. - * hinfo.cc: Updated varable access for above. - * spawn.cc: Updated varable access for above. - * syscalls.cc: Added fsync (null call) and fchmod(null - call at present). - * net.cc: Added ioctls for SIOCGIFCONF and SIOCGIFFLAGS. - Added ntohs, ntohl, static functions get_winnt_ifconf, - get_win95_ifconf and get_if_flags. - * include/cygwin32/if.h: Added structs for new ioctls. - * include/cygwin32/socket.h: Added iovec include. - * include/asm/socket.h: Added defines for above ioctls. - * cygwin.din: Added ntohs, ntohl, fsync, fchmod. - -Wed Oct 2 17:34:21 1996 Geoffrey Noer - - * utils/configure.in: add call to AC_CANONICAL_SYSTEM - * utils/configure: regenerate - * Makefile.in: build cygwin.dll as new-cygwin.dll and install as - cygwin.dll to prevent confusion when building winsup natively - -Tue Oct 1 17:27:34 1996 Jeremy Allison (jra@cygnus.com) - - * include/regex.h: Added. - * net.cc: Added WSAECONNRESET, WSAEPFNOSUPPORT to - errmap array. - -Tue Oct 1 15:40:39 1996 Jeremy Allison (jra@cygnus.com) - - * fork.cc (cygwin_fork_helper1): Fixed resource leak of process - handles, added cleanup code. Also fixed timout problem when child - cannot be initialized. - * dirsearch.cc (readdir): Changed comparison to explicitly check for - INVALID_HANDLE_VALUE. Test < 0 fails with void *. - * syscalls.cc (num_entries): Changed comparison to explicitly check for - INVALID_HANDLE_VALUE. Test < 0 fails with void *. - * cygwin.din: Added regcomp, regexec, regerror, regfree. - * Makefile.in: Added EXTRA_OFILES containing ../librx/rx.o. Added - comment to explain makefrag. Added ../newlib/libc/include to include - path. - -Mon Sep 30 16:10:56 1996 Stu Grossman (grossman@critters.cygnus.com) - - * cygwin.din: Remove getopt and friends. - -Fri Sep 27 18:31:28 1996 Jeremy Allison - - * dcrt0.cc (dll_crt_1): Moved initialization of _reent to correct - position. - -Fri Sep 27 14:24:05 1996 Jeremy Allison - - * dcrt0.cc (dll_crt_1): Fixed fork bug with _impure_ptr not being - initialized correctly in a forked child. This should fix - the bash echo in a sub-shell bug. - * include/sys/uio.h: Created file. Contains definitions for writev - * include/limits.h: Added IOV_MAX and SSIZE_MAX. - * syscalls.cc: Added writev, changed read and write to return ssize_t. - * syscalls.h: Added writev, changed read and write to return ssize_t. - * cygwin.din: Added writev call. - -Wed Sep 20 13:09:00 1996 Jeremy Allison - - * include/mntent.h: Added MOUNTED definition, needed by - some code. - * dcrt0.cc : Added __progname for getopt code. - * misc.c: Added getw code. - * cygwin.din: Added getopt, optarg, opterr, optind - optopt, putw, getw calls. - -Fri Sep 20 03:03:17 1996 Geoffrey Noer - - * select.cc: change long millisec to unsigned int, - respaced file - - patch from Sergey Okhapkin : - * select.cc (polled): fix for select to get keyboard input - working properly (check EventType != KEY_EVENT instead - of checking for KeyEvent.AsciiChar == 0) - * select.cc (cygwin32_select): make int i unsigned int so NULL is - a valid timeout argument for loop - -Fri Sep 13 18:21:52 1996 Jeremy Allison - - * fhandler.cc (fhandler_base::read): rewrite text mode read - -Fri Sep 13 14:58:17 1996 Geoffrey Noer - - * exceptions.cc (call_handler): fix control-C not working - problem by setting rethere variable before the old value is - clobbered. - -Thu Sep 12 16:27:00 1996 Jeremy Allison - - * syslog.cc (pass_handler) : Removed duplicate code - in pass_handler::print(). Added get_win95_event_log_path() - to facilitate moving to registry configuration. - -Thu Sep 12 12:56:00 1996 Jeremy Allison - - * syslog.cc : Added real openlog, syslog, logmask, closelog - calls. syslog logs to event log on NT, file on Win95. - * include/winnt.h : added EVENTLOG_xx_TYPE definitions. - * include/winadvapi.h : added ReportEventA, RegisterEventSourceA - DeregisterEventSourceA declarations. - * include/winkernel.h : added LockFile, UnlockFile, LockFileEx, - UnlockFileEx declarations. - * include/wintypes.h : added PSID typedef. - * include/sys/syslog.h : added options flag definitions for openlog. - -Wed Sep 11 15:34:09 1996 Geoffrey Noer - - * fhandler.cc (popen): delete stub in favor of newlib's - (pclose): delete stub in favor of newlib's - -Tue Sep 10 17:20:56 1996 Geoffrey Noer - - * configure.in: don't transform names (the only time this might - be a good idea is for unix x cygwin32) - * configure: regenerated with autoconf - -Tue Sep 10 17:20:56 1996 Geoffrey Noer - - patch from Sergey Okhapkin : - * fhandler.cc (FakeReadFile): support arrow keys, stop treating - bringing window to front as a key down (resulting in random - characters being printed in bash). - -Mon Sep 9 19:09:36 1996 Geoffrey Noer - - * syscalls.cc (system): fix system call - -Fri Sep 6 09:33:13 1996 Doug Evans - - * fhandler.h (fhandler_base): Make execable_p public char, not - private signed char. Delete get_execable. - * fhandler.cc (fhandler_base::get_execable): Renamed to - check_execable_p. - (fhandler_base::open): Restore symlink support. - Set execable_p, symlink_p. - (fhandler_base::fstat): Replace call to get_execable with reference - to execable_p. - (fhandler_base::fhandler_base): Set execable_p to 0. - * path.h (symlink_check): Declare it. - * path.cc (symlink_check): New function. - (readlink): Call it. - (symlink_follow): Likewise. New arg EXEC, callers updated. - * syscalls.cc (_stat_worker): New arg CALLER, callers updated. - - * syscalls.cc: Delete all occurences of in/out and MARK. - -Thu Sep 5 18:51:01 1996 Doug Evans - - * fork.cc: Don't include . Delete find_exec and support. - * spawn.cc: Include . Move find_exec and support here. - (perhaps_suffix): New argument report_failure_p, callers updated. - (find_exec_1): Use perhaps_suffix when scanning PATH. - (spawn_guts): Replace code to translate posix to win32 path lists - with calls to utility fns that do the job. - -Wed Sep 4 13:30:57 1996 Doug Evans - - * path.cc (readlink): Make more bulletproof. - -Wed Aug 28 16:44:24 1996 Geoffrey Noer - - * syscalls.cc (system): use execlp - * public release beta 16 made - -Tue Aug 27 09:58:14 1996 Doug Evans - - * version.h (CYGWIN_DLL_VERSION_MINOR): Bump up to 2. - -Mon Aug 26 15:12:44 1996 Geoffrey Noer - - * syscalls.cc (system): added basic system() call. - -Mon Aug 26 13:46:30 1996 Doug Evans - - * cygwin.din (cygwin_fork_helper__FPvN30): Delete. - (vfork,select): Add. - * fork.cc (prepare_child): Delete, contents moved into - cygwin_fork_helper1. - (cygwin_fork_helper): Delete, contents moved into __fork. - * winsup.h (cygwin_fork_helper): Delete. - - * path.cc: #include . - (symlink,readlink): Reenable, rewrite. - (symlink_follow): New function. - * path.h (symlink): Delete. - (SYMLINK_COOKIE, MAX_LINK_DEPTH): Define. - (symlink_follow): Declare. - * spawn.cc (spawn_guts): Rewrite symlink support. - - * syscalls.cc (_unlink): Make arg a const char *. - * winsup.h (_unlink): Likewise. - - * spawn.cc (spawn_guts): Fix allocation of stack space for sh.exe path. - - * include/sys/errno.h: Deleted. Use newlib's. - -Fri Aug 23 16:00:00 1996 Jeremy Allison - - * net.cc (getdomainname): Changed win95 code to open - "System" key rather than "SYSTEM". I think the registry - is case-sensitive. - -Thu Aug 22 17:04:09 1996 Geoffrey Noer - - move fork into the dll: - * libcfork.cc: deleted - * fork.cc (vfork): used to be in libcfork.cc - * (__fork): used to be in libcfork.cc - * (fork): used to be in libcfork.cc - * Makefile.in: don't build libcfork.cc any more - * libccrt0.cc: set data_start, etc. from dll structure - * winsup.h: add data_start, etc. to public vars in dll - * cygwin.din: list fork - -Thu Aug 22 01:36:53 1996 Geoffrey Noer - - * registry.cc: fix new registry code - * syscalls.cc: make Windows95 check function extern "C" - -Wed Aug 21 16:15:47 1996 Geoffrey Noer - - * cygwin.din: list vfork - * dirsearch.cc: fix errno setting in readdir that caused - diff to not function on directories - * pipe.cc: reformatted - -Wed Aug 21 15:12:47 1996 Jeremy Allison - - * net.cc (domainname): Changed getdomainname to get the - information from the registry. - * registry.h: Modified interface to reg_key. - * registry.cc: Added open(),close() calls, made - get/set string values return error indication, added trailing - underscore to hkey member so it can be seen to - be a class member. - * include/winadvapi.h: Added KEY_READ and KEY write - defines for registry access. - -Mon Aug 19 09:22:35 1996 Doug Evans - - * path.cc (split_path): New function. - * path.h (split_path): Declare it. - * cygwin.din (cygwin32_split_path): Export it. - - * include/winkernel.h (FILE_SHARE_DELETE): Define. - - * syscalls.cc (__do_global_[cd]tors], __main): Move from here. - * dcrt0.cc: To here. - - * dcrt0.cc (recur): Restore (now that we know WHY it was needed). - (dll_crt0_1): Probe forked child's stack out. - - * fork.cc (FORK_WAIT_TIMEOUT): Bump up to two minutes. - - * fork.cc (dump_jmp_buf): New function. - (cygwin_fork_helper1): Call it. - * dcrt0.cc (dll_crt0:1): Call it. - * winsup.h (dump_jmp_buf): Declare it. - - * fork.cc (cygwin_fork_helper1): Reenable child suspend before - stack copy code. - -Sat Aug 17 04:06:36 1996 Geoffrey Noer - - * dirsearch.cc: reformatted, removed a couple of gotos - -Thu Aug 15 17:56:08 1996 Geoffrey Noer - - * cygwin.din: added __eprintf, a newlib function needed by assert. - * times.cc: swap gmtime and localtime (gmtime really was localtime - and vice versa). - -Tue Aug 13 03:46:22 1996 Geoffrey Noer - - * signal.cc: renamed all signal variables "sig", - fixed signal range error checking in all relevant functions, - (sigaddset): new - (sigismember): new - (sigfillset): new - (sigemptyset): new - * cygwin.din: added corresponding entries for new signal functions. - * cygwin.h: added protos for them - * fhandler.cc, fhandler.h: major reformat of code - * net.cc (cygwin32_socket): call checkinit() at start to - initialize WinSock in case it isn't already. - * syscalls.cc (access): set errno appropriately when no - write access - * fcntl.cc: reformatting - -Sat Aug 10 16:30:14 1996 Geoffrey Noer - - * signal.cc (_raise): rewrite to shorten code, corrected - return values. - * fcntl.cc, net.cc, signal.cc, stubs.c: reformatted, added - public domain notice at the tops if they were missing. - -Fri Aug 9 18:19:12 1996 Geoffrey Noer - - * syscalls.cc (_rename): return -1 if file to be renamed - doesn't exist. Reformatted whole file. - * fork.cc: increase timeout value to 60 sec from 30 sec - -Thu Aug 8 17:44:39 1996 Jim Wilson - - * config/i386/longjmp.c: Increment %eax if it is zero. - -Wed Aug 7 15:51:04 1996 Geoffrey Noer - - * include/sys/mman.h: fixed defines for PROT_READ et al to - match what's more normally there in unix - * sysdef/i386/*: removed the extra underscores present in most - of these files that shouldn't have been there - * net.cc: cleaned up whitespace, formatting - -Tue Jul 16 12:43:16 1996 Doug Evans - - * libccrt0.cc (__version): Deleted, unused. - - * uname.c (uname): Print CYGWIN_DLL_VERSION is version field. - -Mon Jul 15 16:48:29 1996 Doug Evans - - * version.h (CYGWIN_DLL_VERSION_MINOR): Bump up to 1. - - Path handling clean up, pass 2 (use //, not /..). - * path.cc (SLASH_DRIVE_PREFIX_LEN): Delete. - (slash_drive_to_win32_path): New function. - (mount_info::posix_path_p): Delete support for $CYGWIN, - always return 1. - (path_conv::path_conv): Call slash_drive_to_win32_path. - (mount_info::conv_to_win32_path): Renamed from - posix_path_to_win32_path. All callers updated. - (mount_info::conv_to_posix_path): Renamed from - win32_path_to_posix_path. All callers updated. - (normalize_posix_path): Keep two leading /'s (or \'s). - (normalize_win32_path): Likewise. - (conv_to_{win32,posix}_path): Renamed from - {posix,win32}_path_to_{win32,posix}_path_keep_rel. - (conv_to_full_{win32,posix}_path): Renamed from - {posix,win32}_path_to_full_{win32,posix}_path. - (posix_path_list_p): New function. - (cygwin32_{unix,dos}_path_to_{dos,unix}_path_keep_rel): Delete. - ({unix,dos}_path_to_{dos,unix}_path): Delete. - ({win32,posix}_to_{posix,win32}_path_list_buf_size): Renamed from - cygwin32_{win32,posix}_to_{posix,win32}_path_list_buf_size. - ({win32,posix}_to_{posix,win32}_path_list): Renamed from - cygwin32_{win32,posix}_to_{posix,win32}_path_list. - (slash_drive_prefix_p): Recognize //, not /.. - (build_slash_drive_prefix): Update. - * path.h: Update. - * cygwin.din ({dos,unix}_path_to_{unix,dos}_path): Delete. - (cygwin32_{dos,unix}_path_to_{unix,dos}_path_keep_rel): Delete. - (cygwin32_conv_to_{posix,win32}_path): Renamed from - (cygwin32_{win32,posix}_path_to_{posix,win32}_path_keep_rel. - (cygwin32_conv_to_full_{posix,win32}): New exports. - (cygwin32_posix_path_list_p): New export. - * dcrt0.cc (path_len): Delete. - (PATH_ENV_BUF_SIZE): Delete. - (conv_path_names): Delete all but PATH. - (dll_crt0_1): Rewrite environment variable conversion code. - * fork.cc (find_exec_1): Delete _SC_PATH_RULES support. Determine - path delimiter by calling posix_path_list_p. - * shared.cc (shared_info::initialize): Delete `path_rules'. - * sysconf.cc (sysconf): Delete _SC_PATH_RULES. - * winsup.h (shared_info): Delete `path_rules'. - - * fork.cc (cygwin_fork_helper1): Reset u->forkee after child has - started. - - * pinfo.cc (pinfo::init_from_fork): Delete. Empty function. - * fork.cc (cygwin_fork_helper1): Delete call to it. - - * utils/kill.cc (usage): New function. - (main): Allow multiple pids to be passed. Call usage. - -Mon Jul 15 13:07:23 1996 Michael Meissner - - * Makefile.in (install): If cross compiling, install the - cygwin.dll file as $target_alias-cygwin.dll in the bin directory, - instead of plain cygin.dll. - Install the cygwin.dll file in the library directory as well. - - * configure.in: Test for cross compiling, and if cross compiling, - transform name of cygwin.dll file in the binary directory. - - * configure: Regenerate. - - * utils/Makefile.in (Makefile): Rebuild Makefile if configure.in - changes. - (install): Use the toplevel install.sh to install the utilities, - and transform the name if cross compiling. - - * utils/configure.in: Test for cross compiling, and if cross - compiling, tranform mount, umount, ps, etc. Do not call - AC_PROG_INSTALL anymore. - - * utils/configure: Regenerate. - -Fri Jul 12 16:25:09 1996 Geoffrey Noer - - * Makefile.in: also make install in utils subdir so "mount" - et al gets installed. - -Thu Jul 11 17:53:31 1996 Geoffrey Noer - - * include/sys/param.h: fixed value of HZ (now 1000 instead of 100). - caused bug that showed up as "time sleep 5" returning 50. - -Thu Jul 11 14:08:09 1996 Geoffrey Noer - - * fhandler.cc: correct typo in comment - * exceptions.cc: remove definition of sig_func_ptr, replace - occurances with newlib-defined _sig_func_ptr. - -Wed Jul 10 19:12:18 1996 Doug Evans - - * version.h (CYGWIN_DLL_VERSION_{MAJOR,MINOR}): Bump up to 17.0. - * winsup.h (class per_process): New members {public,internal}_reserved. - (SIZEOF_PER_PROCESS): Define. - * dcrt0.cc (dll_crt0_1): Add sanity check of per_process size. - Don't call checkout for forkee. - * libccrt0.cc (cygwin_crt0): Set magic_biscuit to sizeof per_process - again. - - * utils/ps.cc (main): Print uid. - - * hinfo.h: Deleted. Contents moved to winsup.h. - * Makefile.in (WINSUP_H): Update. - - * dcrt0.cc (u, environ): Moved here. - * shared.cc: From here. - - * pinfo.cc (pinfo_init): Renamed from pinfo_init_per_process. - All callers updated. - * hinfo.cc (hmap_init): Renamed from hmap_init_per_process. - All callers updated. - * winsup.h (cygwin_parent_p): Renamed from invoked_by_cygwin_p. - All uses updated. - - * fork.cc (prepare_child): Add debug message. - - * uinfo.cc (uinfo_init): Renamed from uinfo::init. - All callers updated. Call getlogin instead of GetUserName. - (getlogin): Call GetUserName. - * winsup.h (class uinfo): Delete. Members uid,gid moved ... - (class pinfo): To here. All uses updated. - (class shared_info): Delete member `u'. - * fork.cc (cygwin_fork_helper1): Set child's uid,gid. - - * pinfo.cc (pinfo::clearout): Reset strace_mask_ptr. - - * shared.cc (open_shared_file_map): Add debugging message. - -Fri Jul 5 15:36:48 1996 Doug Evans - - * exceptions.cc (sig_func_ptr): New typedef. - (__stack_trace): Make i386 and ppc formats the same. - (sigfunc): Use sig_func_ptr. - (call_handler): Likewise. All callers updated. - (__cygwin_exception_handler): Handle exceptions before dll has - fully initialized. Only call dump_status once, like __stack_trace. - (really_exit): Call _exit, not exit. - - * hinfo.cc: Add copyright. - * uinfo.cc: Likewise. - - * passwd.c: Whitespace cleanup. - (search_for): Make static. - - * pinfo.cc (pinfo_list::init): Delete call to clearout vec[0]. - (pinfo::clearout): Reset more fields. - (pinfo_list::get_empty_pinfo): Delete printing of error messages - if table is full. - - * shared.cc (open_shared_file_map): Mark shared map as not inherited. - - * signal.cc (signal): Delete (void *) coersion of result. - (usleep): Convert microseconds to milliseconds. Delete second copy. - (_raise): Use _sig_func_ptr. - - * syscalls.h: Delete #include mntent.h, sys/types.h, string.h, - stdio.h, setjmp.h, stdlib.h, signal.h, sys/strace.h, unistd.h, - ctype.h, fcntl.h. - * winsup.h: #include sys/types.h, sys/strace.h, setjmp.h, signal.h, - string.h, windows.h. - * All necessary files updated. - - * winsup.h (class pinfo): Delete member localtime_buf. - * times.cc (corelocaltime): Use static local for localtime_buf. - - * winsup.h (class pinfo): Rename the_pid to pid. All uses updated. - Delete handle_valid_p, unused. Rename __sig_mask to sig_mask. - -Thu Jul 4 14:36:01 1996 Doug Evans - - * shared.h: Deleted. All files updated. - * winsup.h: shared.h contents moved here. - * Makefile.in (WINSUP_H): Update. - - * heap.cc: Renamed from pproc.cc. - (heap_init): Renamed from per_process::init. - In forkee initialization, ensure memory being reserved is at same - address as parent's. Commit forkee memory in one chunk. - (_sbrk): Moved here, - * syscalls.cc (_sbrk): From here. - * Makefile.in (DLL_OFILES): Update. - * dcrt0.cc (dll_crt0_1): Call heap_init instead of u->init. - * winsup.h (class per_process): Delete member `init'. - - * dcrt0.cc (recur): Delete. - (dos_argv_to_unix_argv): Delete. - - * delqueue.cc: Delete #include of delqueue.h, winerror.h - * winsup.h: #include delqueue.h. - - * exceptions.cc (ctrl_c_handler): Only require 13 ^c's to quit task. - - * fork.cc (fork_mutex,forkee_stopped,forker_stopped): New static - globals, were in class_shared info. - (fork_init,fork_terminate): New functions. - (prepare_child,cygwin_fork_helper1): Update. - (cygwin_fork_helper1): If fork disabled, return EAGAIN. - Delete unnecessary resetting of forkee_stopped event. - * winsup.h (fork_init,fork_terminate): Declare them. - * dcrt0.cc (dll_crt0_1): Call fork_init. - (_exit): Call fork_terminate. - * shared.c (shared_info::initialize): Delete init of fork stuff. - - * shared.c (h): New static global, was in class shared_info. - (shared_info::terminate): Delete, move contents into shared_terminate. - - * strace.cc (flush_p): New static global. - (strace_init): Don't clobber u->strace_mask if _STRACE_INHERIT set. - (__sys_printf): Only flush buffers if _STRACE_FLUSH. - * include/sys/strace.h (_STRACE_FLUSH,_STRACE_INHERIT): Define. - Reorganize bitmasks. - - * utils/ps.cc (main): Make output prettier. - -Wed Jul 3 12:30:24 1996 Doug Evans - - * utils/Makefile.in (mount,umount,ps,kill): Rewrite rules. - (PROGS): Add cygwin. - (cygwin): New target. - (install): Install all of $(PROGS). - * utils/cygwin.cc: New file. - - * pinfo.cc (pinfo_init_per_process): PID environment variable handling - moved here. Delete setting of u->parent. Set strace_mask_ptr. - Set invoked_by_cygwin_p appropriately. - (vfork_init): Delete, unused. - (pinfo::init_self): Delete setting of root_p. - (pinfo::terminate): root_p renamed to invoked_by_cygwin_p. - * winsup.h (class per_process): Delete initial_pid, no longer used. - (class pinfo): Add strace_mask_ptr. - * fork.cc (cygwin_fork_helper1): Update. - - * winsup.h (class per_process): Delete trace_file, trace_mutex. - Rename estrace to strace_mask. - (system_printf): Declare. - * strace.cc (strace_init): Renamed from per_process::strace_init. - Don't open trace file unless strace environment variable set. - Open trace file with FILE_SHARE_READ so others can read trace file - while tracing in progress. Print error if $strace too big. - (strace_file, strace_mutex): New static globals. - (__sys_printf): Don't do anything if strace file not opened. - (system_printf): New function. - * pproc.cc (per_process::init): Delete call to strace_init. - * dcrt0 (dll_crt0_1): Call strace_init as soon as possible. - - * dcrt0 (dll_crt0_1): Delete local can_glob, use - u->self->invoked_by_cygwin_p instead. - Move PID environment variable handling into pinfo_init_per_process. - Delete setting of u->self->in_bash. - Delete watching for bash. - * winsup.h (class pinfo): Delete in_bash. - - * exceptions.cc (*): Call system_printf, not __sys_printf. - - * shared.h (class shared_info): Delete pp, unused. - - * syscalls.cc (isatty): Replace ttyname with is_tty. - - * winsup.h (registry_init_once_only): Delete, unused. - (stdout_handle,file_handle_from_fd): Likewise. - (CHILD_P,child_p,ALL_FS,loadup_dll,cygwin_s): Likewise. - (unmixedcaseify): Prototype moved to path.h. - * path.h (unmixedcaseify): Declare. - - * fork.cc (FORK_WAIT_TIMEOUT, WAIT_ERROR_RC): Define. - (find_exec_1): Don't search PATH if directory present (not only if - absolute path). Search "." before searching PATH. - (copy): Return boolean indicating success. All callers updated. - (prepare_child): Simplify. Check return code of WaitForSingleObject. - Don't wait an infinite amount of time. - (cygwin_fork_helper1): Simplify. - Check return code of WaitForSingleObject. - Don't wait an infinite amount of time. - Check return code of copy. - Disable code to Suspend/Resume child thread a second time. - - * winsup.h (class per_process): Make initial_sp a char *. - * libccrt0.cc (cygwin_crt0): Update. - - * path.cc (path_conv): If name too long, set path to bogus value. - - * include/winkernel.h (WriteProcessMemory): Fix prototype. - - * include/sys/strace.h: Add extern "C" ifdef __cplusplus. - (_STRACE): Delete. - * dirsearch.cc (rewinddir): Use syscall_printf. - -Tue Jul 2 14:44:18 1996 Doug Evans - - * wait.cc (WAIT_ERROR_RC): Use it instead of ALL_FS. - (wait_found): New argument `options'. If GetExitCodeProcess fails, - ensure `result' contains something reasonable. - (wait_for_single): Check whether `c' is NULL before dereferencing it. - (wait_for_any): Add some comments. Delete unnecessary gotos. - (waitpid): Print message if called with intpid == 0. - -Sat Jun 29 10:49:28 1996 Doug Evans - - * dirsearch.cc (readdir): Clean up syscall tracing. - Mixed case handling temporarily disabled. - -Wed Jun 26 11:54:27 1996 Jason Molenda (crash@godzilla.cygnus.co.jp) - - * Makefile.in (bindir, libdir, datadir, infodir, includedir): - Use autoconf-set values. - (docdir): Removed. - (install-info): Add. - * configure.in (AC_PREREQ): autoconf 2.5 or higher. - * configure: Rebuilt. - * glob/configure.in (AC_PREREQ): autoconf 2.5 or higher. - * glob/configure: Rebuilt. - * utils/Makefile.in (bindir, exec_prefix): Use autoconf-set values. - * utils/configure.in (AC_PREREQ): autoconf 2.5 or higher. - * utils/configure: Rebuilt. - -Tue Jun 25 17:48:56 1996 Doug Evans - - * include/sys/param.h (PATH_MAX,MAXPATHLEN): Change from 1024 to 259. - (BIG_ENDIAN,LITTLE_ENDIAN,BYTE_ORDER): Define. - -Mon Jun 24 16:35:48 1996 Mark Eichin - - * fhandler.cc (read): Replace the old broken igncr code (which has - been disabled for a while anyway) with code that checks for - ENABLE_LINE_INPUT and replace only \r\n with \n. - -Mon Jun 24 00:12:22 1996 Doug Evans - - * dcrt0.cc (dll_crt0_1): Convert argv[0] to posix style if necessary. - -Sun Jun 23 17:21:41 1996 Doug Evans - - * version.h (CYGWIN_DLL_VERSION_MINOR): Bump up to 2. - - * fork.cc (perhaps_suffix): Simplify. - (find_exec_1): Likewise. Always try appending .exe first. - (cygwin_fork_helper1): Clean up (lots more needed still). - Test for split heap before calling CreateProcess. - No longer call find_exec, now done at start up. - * dcrt0.cc (dll_crt0_1): Call find_exec to expand argv[0]. - - * path.cc (conv_path_list_buf_size): New function. - (cygwin32_{win32,posix}_to_{posix,win32}_path_list_buf_size): Ditto. - (conv_path_list): Ditto. - (cygwin32_{win32,posix}_to_{posix,win32}_path_list): Ditto. - * cygwin.din: Export them. - - * misc.c (small_printf): Delete. - (vhangup): Set errno. - - * syscalls.cc (isatty): Print syscall trace message even if error. - - * console.cc (*): Check return codes of win32 api calls. - - * syscalls.cc (chmod): Set errno of SetFileAttributes fails. - Fix call to syscall_printf. - -Thu Jun 20 00:43:52 1996 Doug Evans - - * dcrt0.cc (dll_crt0_1): Save full program name. - * fork.cc (cygwin_fork_helper1): Always call find_exec. - - * path.cc (normalize_{posix,win32}_path): Fix edge case handling. - (path_conv::path_conv): Ensure path is \-ified if win32 path rules. - - * spawn.cc (spawn_guts): Set errno if CreateProcess fails. - -Wed Jun 19 00:18:03 1996 Doug Evans - - * path.h (PATH_RULES macros): Delete. Use ones in unistd.h. - (enum path_rules_enum): Deleted. All uses updated. - (path_conv): Rename member get_native to get_win32. All uses updated. - (*win32_path*): Renamed from *native_path*. - * path.cc (*win32_path*): Renamed from *native_path*. - (mount_info::posix_path_p): Prepend '_' to PATH_RULES. - Fix returning of cached value. - (slash_drive_prefix_p, build_slash_drive_prefix): New functions. - (mount_info::posix_path_to_win32_path): /.. is a drive spec. - (path_conv::path_conv): Likewise. - (mount_info::win32_path_to_posix_path): Convert unknown drives to - /.. Normalize win32_path. - (normalize_win32_path): New functions. - (getcwd_inner): New arg `posix_p'. All callers updated. - * shared.cc (shared_info::initialize): Prepend '_' to PATH_RULES. - _PATH_RULES_NATIVE -> _PATH_RULES_WIN32. - * spawn.cc (*win32_path*): Renamed from *native_path*. - * dcrt0.cc: Likewise. - * cygwin.din: Likewise. - - * Makefile.in (WINSUP_H): Add shared.h - - * smallprint.c (rn): Make static. - - * sysconf.cc: Renamed from sysconf.c. - (sysconf): Support _SC_PATH_RULES. - - * screen.c: Deleted. - * Makefile.in (DLL_OFILES): Delete screen.o. - - * fork.cc (cygwin_fork_helper): Don't pass 0 from longjmp to setjmp. - - * path.h (class mount_info): Update posix_path_to_native_path member. - * path.cc (path_prefix_p): Rewrite. - New arg `len'. All callers updated. - (mount_info::binary_native_path_p): Call path_prefix_p. - (path_conv::path_conv): Pass full_path to binary_native_path_p. - (mount_info::posix_path_to_native_path): Delete arg keep_rel_p. - New arg full_native_path. All callers updated. Don't call - getcwd_inner if unnecessary. Rewrite relative path handling. - (mount_info::native_path_to_posix_path): Call path_prefix_p. - Call slashify on `pathbuf', not original argument. - - * syscalls.cc (chdir): Fix lifetime of converted path. - -Tue Jun 18 11:48:51 1996 Doug Evans - - * configure.in (EXE_LDFLAGS): Explicitly link with newlib if necessary. - * configure: Regenerated. - * Makefile.in (EXE_LDFLAGS): Define. - (FLAGS_TO_PASS): Add EXE_LDFLAGS. - (config.status): New target. - (utils-all): Depend on $(LIBNAME). - * utils/Makefile.in (EXE_LDFLAGS): Define. - (mount,umount,ps,kill): Link with $(EXE_LDFLAGS). - - * version.h (CYGWIN_DLL_VERSION_MINOR): Bump up to 1. - -Mon Jun 17 18:29:54 1996 Doug Evans - - Improve pathname handling, first pass. - * path.h (symlink): Renamed from link_cookie. - (class path_conv): New member error. - (path_conv::get_native): Renamed from get_dos, all uses updated. - (path_conv::get_binary): Delete. - (mount_info::{mangle,reverse_mangle}): Delete. - (mount_item::posix_path_to_native_path): Renamed from mangle. - (mount_info::native_path_to_posix_path): Renamed from reverse_mangle. - (path_rules_enum): Define. - * path.cc: Temporarily disable mixed-case and symlink handling. - (mount_info::posix_path_p): New function. - (mount_info::binary_native_path_p): Renamed from binary_dos_path_p. - (path_conv::path_conv): Handle native path rules. - (mount_item::{mangle,reverse_mangle}): Delete. - (mount_info::posix_path_to_native_path): Renamed from mangle. - (mount_info::native_path_to_posix_path): Renamed from reverse_mangle. - (mount_info::from_registry): Set nmounts. Use MAX_PATH. - (mount_info::{add,del}_item): Rewrite. - (slashify): Renamed from flip_slash. - (getcwd_inner): Make static. Don't convert to posix path if using - native path rules. - (file_exists): Delete. - (addmntent,hasmntopt): Delete. - (mount): Only update registry if mount succeeded. - (umount): Only update registry if umount succeeded. - (normalize_posix_path): Renamed from normalize_path. Pass in cwd. - (cygwin32_{posix,native}_path_to_{native,posix}_path_keep_rel): Renamed - from ...{unix/dos}.... - * dcrt0.cc (dos_argv_to_unix_argv): #ifdef out. - (dll_crt0_1): Don't call it. - * fhandler.cc (fhandler_base::open): Temporarily disable symlinks. - * shared.cc (open_shared_file_map): New function. - (shared_init): Call it. - (shared_info::initialize): Fetch `path_rules' from registry. - * shared.h (inited): Make private. - (path_rules): New member. - * spawn.cc: #include "shared.h". - (spawn_guts, env var translation): Don't translate path names if - using native path rules. - * syscalls.cc (symlink): Delete (moved to path.cc). - * cygwin.din (dump__5pinfo): Delete. - (cygwin32_{posix,native}_path_to_{native,posix}_path_keep_rel): Renamed - from ...{unix/dos}.... - - * smallout.cc: Delete. - * sdata.cc: Delete. - * shared.cc (u,s,environ): Define here. - * Makefile.in (glob/libglob.a): Depend on glob/glob.c, glob/fnmatch.c. - (utils-all): New target. - (DLL_OFILES): Delete smallout.o, sdata.o. - (Makefile): Depend on cygwin.din. - (WINSUP_H): Depend on syscalls.h. - - * configure.in (AC_CONFIG_SUBDIRS): Add bin. - (AC_PROG_INSTALL): Call. - * configure: Regenerated. - * utils/{Makefile.in,configure.in,configure}: New files. - * utils/{kill.cc,mount.cc,ps.cc,umount.cc,termcap}: New files. - * Makefile.in (UTILS_ALL): Define. - (all): Depend on $(UTILS_ALL). - (utils-all): New target. - - * dcrt0.cc (recur): Make no-op to see what happens. - (globify): Don't call glob if unnecessary. - Check return code from glob. - (api_fatal): New function. - * fhandler.cc (fhandler_base::read): Dump first few chars read. - (fhandler_base::get_execable): New function. - (fhandler_base::fstat): Use it. - (fhandler_base::fhandler_base): Init execable_p. - (fhandler_disk_file::fhandler_disk_file): Delete execable_p. - (fhandler::{get,set}_execable_bit): Delete. - (fhandler_disk_file::{get,set}_execable_bit): Delete. - * fhandler.h (class fhandler): Delete {get,set}_execable_bit. - (class fhandler_base): New member execable_p. - New member fn get_execable. - * fork.cc: Simplify/cleanup. - (cygwin_fork_helper1): Use MAX_PATH, not MAXPATHLEN. - * pinfo.cc (pinfo::dump): Delete. - * pproc.cc (per_process::set_envname): Delete. - * strace.cc (smallout::do_pline): Delete. - * syscalls.h (readlink): Third arg is an int. - * winsup.h (class pinfo, member progname): Use MAX_PATH. - (class pinfo, member dump): Delete. - (class smallout): Delete. - (smallout): Delete. - (class per_process, member set_envname): Delete. - (file_exists): Delete. - (api_fatal): Declare. - * Makefile.in (LIB{C,CXX}FLAGS_FOR_TARGET): Delete, use {C,CXX}FLAGS. - (FLAGS_TO_PASS): Define. - (glob/libglob.a): Delete duplicate entry. - - * syscalls.cc (_sbrk): Update u->size when heap is grown. - - * hinfo.cc (hmap_init_per_process): Ensure stdout's handle != stderr's. - -Fri Jun 14 06:32:13 1996 Doug Evans - - * register.h, registry.cc: Whitespace cleanup. - -Thu Jun 13 20:57:28 1996 Doug Evans - - * Makefile.in (install): Install cygwin.dll in $(bindir). - -Tue Jun 11 13:46:17 1996 Geoffrey Noer - - * fhandler.cc: lseek is now only binary mode, interpret control - z characters as EOF when reading from a file. Reformatted some - of the code (cleaned up line spacing, etc.) - -Tue Jun 11 09:50:09 1996 Jason Molenda (crash@kyriath.cygnus.com) - - * path.cc (nofinalslash): move it so it is next to its friends - flip_slash and backslashify. - -Mon Jun 10 18:57:03 1996 Jason Molenda (crash@kyriath.cygnus.com) - - * path.cc (*): Pretty printing. - (unix_path_to_dos_path_with_rel): use "dosnamein" and "unixnameout" - instead of "path" & "real_path". - (dos_path_to_unix_path_keep_rel): delete obsolete code. - (mount_item::mangle): use "unixnamein" and "dosnameout" instead of - "unixname" and "dosname". - (mount_info::mangle): use "unixnamein" and "dosnameout". Remove - obsolete code. - * path.h (mount_item): Update prototypes, add comment. - (mount_info): Update prototypes. - -Mon Jun 10 17:05:23 1996 Jason Molenda (crash@kyriath.cygnus.com) - - * path.cc (mount_item::reverse_mangle): Pretty printing, - add a bit to the comment. - (getcwd_inner): use MAX_PATH not MAXPATHLEN. - (normalize_path): use MAX_PATH not MAXPATHLEN. - (link_cookie::follow): use MAX_PATH not MAXPATHLEN. - -Mon Jun 10 15:36:32 1996 Geoffrey Noer - - * Makefile.in: changed $(DOC) so it doesn't include html - files; made a new info-html target that does the html - versions of the docs. Since most customers don't have texi2html - installed, the make shouldn't fail because of this. - * configure: regenerated with autoconf 2.8 - -Sun Jun 9 17:10:37 1996 Doug Evans - - * version.c: Deleted. - * version.h: New file. - * winsup.h (VERSION): Deleted. - (class per_process): Add version_major, version_minor. Delete version. - * registry.cc: #include "version.h". - (reg_session::reg_session): Update. - * libccrt0.cc: #include "version.h" - (cygwin_crt0): Delete setting of version, set magic_biscuit to 0. - Set version_major, version_minor. - * dcrt0.cc: #include "version.h". - (cygwin_dll_version_{major,minor}): New static locals. - (dll_crt0_1): Rewrite app/dll compatibility test. - * Makefile.in (LIBCOS): Delete version.o. - (DLL_OFILES): Delete version.o. - (dcrt0.o,libccrt0.o,registry.o): Depend on version.h. - - * exceptions.h: New file. - * exceptions.cc: Massive cleanups (still lots more to go). - #include "exceptions.h". - (init_exceptions): Renamed from __init_exceptions. New argument of - pointer to exception handler list entry. - (init_exception_handler): Renamed from init_thread_exceptions. - Rewrite based on info from Onno Hovers . - (ppc descriptor_to_{function,gotattr}): Make static. - (i386 __stack_trace): Fix test for top of stack. - * dcrt0.cc: #include "exceptions.h". - (dll_crt0_1): Exception handler list entry must live on stack. - * winsup.h (class pinfo): Delete member myp. - * syscalls.h (struct exception_list): Delete. - (__really_exit, __init_exceptions): Delete. - * Makefile.in (dcrt0.o,exceptions.o): Depend on exceptions.h. - -Fri Jun 7 17:49:28 1996 Jason Molenda (crash@phydeaux.cygnus.com) - - * dcrt0.cc (conv_path_names): Add GCC_EXEC_PREFIX. - -Fri Jun 7 14:38:05 1996 Doug Evans - - * Makefile.in (CC_FOR_TARGET,LD,DLLTOOL): Define. - (AR,RANLIB): Set via configure. - * configure.in (AR,LD,DLLTOOL): Set. - (AC_PROG_RANLIB): Call. - * configure: Regenerated. - -Thu Jun 6 12:11:23 1996 Kim Knuttila - - * dcrt0.cc (dll_crt0_1): Removed reference to reent_data._next. - -Tue Jun 4 15:52:29 1996 Geoffrey Noer - - * include/winkernel.h: fixed typo - -Tue May 28 13:08:25 1996 Doug Evans - - * syscalls.cc (_sbrk): Fix test of return value from VirtualAlloc. - Delete lincr, make incr signed, and use only it. Misc. minor cleanup. - -Thu May 23 17:31:57 1996 Geoffrey Noer - - sac diffs applied: - * path.h: change MAXMOUNTS to 30 instead of 20 - * sysdef/i386/rpcndr.def: add "none" to end of file - * fhandler.cc: fix memset call to say sizeof (*buf) instead - of sizeof (buf). - * include/winuser.h: define MDIS_ALLCHILDSTYLES - * Makefile.in: entry to build glob/libglob.a: - -Thu May 23 10:38:43 1996 Doug Evans - - * fhandler.h (class fhandler_base): Make `name' private and shrink - to 32 bytes. - (set_name): Declare. - * fhandler.cc (fhandler::set_name): New function. - (fhander_base::open): Call it. - (fhander_base::init): Call it. - (fhandler_tty::ttyname): Call get_name instead of accessing `name' - directly. - - * dcrt0.cc (dll_crt0_1): Call ExitProcess instead of exit if - DLL and APP are out of sync. - -Thu May 16 03:07:18 1996 Mark Eichin - - * fhandler.cc (FakeReadFile): new function. Interface like - ReadFile, only called from fhandler_console_in::read, calls - ReadFile unless we're really reading from STD_INPUT_HANDLE and - with ENABLE_LINE_INPUT turned off, in which case we use - ReadConsoleInput instead. When using ReadConsoleInput, always read - all available events, but only block if we don't get at least one - actual character. This would be the place to implement FIONBIO on - the console tty, which doesn't actually exist yet. - (dbg_input_event): copied from select.cc, debugging code to show - detail of what events we're actually getting. - (ioctl): off-by-one on window size. - -Wed May 15 18:11:16 1996 Jim Wilson - - * fhandler.h (class fhandler_base): Use MAXPATHLEN not 100 for size - of array name. - -Wed May 15 11:14:46 1996 Doug Evans - - * fork.cc (cygwin_fork_helper1): More debugging printf's. - - * dcrt0.cc (num_ms_env_vars): Renamed from ms_env_arity. - (build_argv): Renamed from fill. - (compute_argc): Renamed from prepare. - * libccrt0.cc (cygwin_statu): Make static. - * pproc.cc (per_process::init): Move strace initialization from here, - * strace.cc (per_process::strace_init): To here. - Pass FILE_SHARE_WRITE to CreateFileA. Print error message if open - of log file fails. Create mutex for trace messages. - (__sys_printf): Always write to end of disk files. Use mutex. - (d): Delete. - * winsup.h (class per_process): Add strace_init. Reorganize. - `run_ctors' renamed to `run_ctors_p'. New member `trace_mutex'. - (d): Delete. - (PATH_MAX): Delete. - - * Makefile.in: Add header file dependencies. - - * dcrt0.cc (_exit): Add debugging printf. - * shared.h (class shared_info): Rename member mutex_a to fork_mutex. - * fork.cc (cygwin_fork_helper1): Update. - Return with error if process slot unavailable. - Set errno and release fork_mutex if failed because of split heap. - * shared.cc (shared_info::terminate): Update. - (shared_info::initialize): Update. - -Tue May 14 14:59:32 1996 Doug Evans - - * fork.cc (cygwin_fork_helper1): Avoid SIGSEGV if allocate_pid fails. - - * pproc.cc (per_process::init): Fix test. - - * winsup.h (): Rename member `parent' to `ppid'. - * fork.cc (prepare_child): Update. - (cygwin_fork_helper1): Likewise. - * hinfo.cc (hmap_init_per_process): Likewise. - (hinfo_vec::dup_for_fork): Fix message. - (hinfo_vec::dup2): Fix args to debug_printf. Delete extra printf's. - * pinfo.cc (pinfo_init_per_process): Update. - (pinfo::dump): Likewise. - (pinfo::init_self): Likewise. - * pproc.cc (per_process::init): Open strace file in append mode. - * smallprintf.c (__small_vsprintf): Support %p. - * syscalls.cc (getppid): Update. - * wait.cc (wait_for_any): Likewise. - -Mon May 13 13:45:36 1996 Mark Eichin - - * fhandler.cc (ioctl): fix TIOCGWINSZ handling: (1) check the - error return (2) if we're trying on STD_INPUT_HANDLE, substitute - STD_OUTPUT_HANDLE since GetConsoleScreenBufferInfo only works on - console output (3) check srWindow for the *screen* size, instead - of checking dwSize for the scroll buffer size. - - * include/sys/errno.h (ECONNABORTED): add another errno value. - * net.cc (errmap): add ECONNABORTED case. - - * fhandler.cc (fstat): clear the *entire* stat buf, not just the - first four bytes. - -Fri May 10 17:59:09 1996 Mark Eichin - - * select.cc: change most debugging statements to select_printf. - (dbg_input_event): new function, prints an INPUT_RECORD via select - printf. - (polled): Don't sleep around WaitForMultipleObjects; let it have a - 10ms timeout until we have time to test it with 0. If - WaitForMultipleObjects says that STD_INPUT_HANDLE has data, use - PeekConsoleInput to scan the available events. If the first one is - not a *bKeyDown* with a non-zero *AsciiChar* then use - ReadConsoleInput to rip it off the queue, and pretend it wasn't - there, so that later calls to read (and thus ReadFile) don't block - because they can't find any *real* input. (This could be optimized - later to check the whole queue, and if there are *no* real input - events, nuke them all.) - - * include/sys/strace.h (_STRACE_SELECT, select_printf): new printf - category, because select needs a *lot* of work. STRACE=256 to use it. - - * fhandler.cc (fhandler_console_in::init): IGNCR can't work - without major changes to deal with the interaction with select - (which shouldn't wake up if IGNCR causes the whole input to be - deleted...) so don't make it the default. - (fhandler_console_out::tcgetattr, fhandler_tty::tcgetattr): don't - set IGNCR based on get_r_binary either. - -Wed May 8 20:20:05 1996 Mark Eichin - - * times.cc (__to_clock_t): must cast dwLowDateTime to *unsigned* - before adding it -- otherwise we may subtract it! - (to_time_t): same. - -Wed May 8 18:21:28 1996 Mark Eichin - - * times.cc (corelocaltime): new function. Basic localtime from - newlib, with no conversions. - (gmtime): just calls corelocaltime. - (localtime): uses GetTimeZoneInformation, biases to standard time - first, then uses DaylightDate and StandardDate to figure out if - we're in DST -- and calls corelocaltime a second time with the - rebiased seconds, if we are. - (times): add debug_printf statements which work around apparent - compiler bug and 7+ minute error. - - * select.cc: revert to 's changes of 4/20 which were - accidentally backed out on 4/24. - -Tue May 7 05:29:42 1996 Mark Eichin - - * times.cc (__to_clock_t): subtract out FACTOR, the difference - between 1601 and 1970, just like to_time_t() does. - -Tue May 7 01:55:06 1996 Mark Eichin - - * times.cc (gmtime): new function. Use GetTimeZoneInformation to - compensate ahead before calling localtime (since the newlib - version doesn't know what timezone we're in.) - (localtime): use SECSPERMIN, not 60, to show that we know what - we're talking about. - - * net.cc (errmap): add WSAEADDRINUSE, WSAECONNREFUSED mappings. - -Sun May 5 00:45:59 1996 Mark Eichin - - * include/sys/socket.h: add recvfrom macro and cygwin32_recvfrom - declaration. Remove htons/htonl misdeclarations as they collide - with the macros in asm/byteorder.h. - - * include/asm/byteorder.h: enable the ntohl/ntohs declarations so - we at least get the macro versions when we optimize, even if the - library hooks aren't there. - -Wed Apr 24 23:42:49 1996 Steve Chamberlain - - * winsup.h (pinfo, pinfo_list): Remove dummy item. - * fork.cc (*): Revert changes of Apr 2. - -Sun Apr 21 17:00:14 1996 Steve Chamberlain - - * wait.cc (wait_for_any): Fix the wait heuristic. - -Sat Apr 20 13:22:03 1996 Steve Chamberlain - - * Makefile.in (.cc.o): Pass -fno-rtti. - * dcrt0.cc (globify): A single match is ok. - * exceptions.cc (i386 call_handler): optimize. - * fhandler.cc (fhandler_console_in::read): Handle ICRNL right. - (*:get_name *:always_ready): New. - * select.cc: Understand that console output doesn't signal when it's - ready. - -Fri Apr 12 14:49:34 1996 Doug Evans - - * Makefile.in (glob/libglob.a): Pass -I so glob.c finds right dirent.h. - -Wed Apr 10 16:13:30 1996 steve chamberlain - - * Makefile.in (glob/libglob.a): Call glob makefile correctly. - * winsup.h (pinfo, pinfo_list): Reorder elements to avoid - alignment bug in PPC gcc. - -Tue Apr 9 17:23:57 1996 steve chamberlain - - * dcrt0.cc (globify): Expand command line wildcards if - run from dos prompt. - - * exceptions.cc (386 call_handler): More fumblings. - * fhandler.cc (fhandler_base::stat): Initialize ino. - (fhandler_console::open): Fix test for RDONLY. - (fhandler_tty::stat): Set ino. - (fhandler_console_out::vt100 stuff): More. - * fork.cc: Lint. - * pinfo.cc (pinfo::init_self): Don't bother to DuplicateHandles - to get process info. - * signal.cc (usleep): Get correct order of magnitude. - * spawn.cc (spawn_guts): Turn of exception handling in - parent of thing which execs. - * syscalls.cc (stat): Look for and . - * wait.cc (wait_for_any): Keep waiting if WaitForMultipleObject - returns invalid result. - -Tue Apr 2 12:45:35 1996 steve chamberlain - - * dcrt0.cc (conv_path_names): Add HOME. - (dll_crt0_1): Use u->self->head_sp. - * exceptions.cc (i386 call_handler): Rewritten, now almost works - on win95. - * fhandler.cc (fhandler_base::open): Calculate namehash. - (fhandler_base::fstat): ^ name hash with file index low. - * fork.cc (*): forkee/forkerr events moved from sinfo - into pinfo. - -Fri Mar 29 16:35:02 1996 steve chamberlain - - * libcmain.cc: New. - * winsup.h: restore and myp moved from per_process to pinfo class. - * dcrt0.cc (dll_crt0_1): Cope with move. - * exceptions.cc (init_thread_exceptions): Ditto. - * signal.cc (sigprocmask): Ditto. - * fork.cc (cygwin_fork_helper1): Don't fork if split_heap_p. - * pinfo.cc (pinfo::clearout): Zero split_heap_p. - * syscalls.cc (_sbrk): Cope with not being able to - allocate contiguous chunks. - - -Tue Mar 26 09:14:32 1996 steve chamberlain - - * exceptions.cc (__cygwin_exception_handler): re-export. - -Fri Mar 22 16:49:29 1996 Michael Meissner - - * cygwin.din (__stack_trace): Export. - (__cygwin_exception_handler): Ditto. - - * exceptions.cc (i386 exception handling): Move under appropriate - x86 #ifdefs. Use the macro HAVE_INIT_THREAD_EXCEPTIONS to be - whatever a machine needs to do to initialize exceptions in this - thread. Nop for the PowerPC right now. - (__stack_trace): Make it a "C" function so there is no name - mangling, and export it. - (call_handler): Split by architecture before the function, rather - than inside it. First stab at PowerPC exception handling. - (__cygwin_exception_handler): Rename from ehandler3, and export - it. Add more status -> signal mappings. - (ctrl_c_handler, CTRL_LOGOFF_EVENT): Map to SIGHUP, not SIGQUIT. - (__stack_trace): Split into separate machine dependent functions, - rather than #ifdef'ing inside of a common function. Make the - PowerPC messages clearer. - -Mon Mar 18 13:27:05 1996 Michael Meissner - - * include/winkernel.h (CreateThread): Correctly declare function - pointer argument. - - * misc.c (wprintf): Convert to use vprintf and fix warnings. - (tgetent): Declare to return int to fix warnings. - (vhangup): Declare to return int to fix warnings. Return -1 also. - - * include/winbase.h (UnhandledExceptionFilter): Declare. - -Tue Mar 12 12:56:28 1996 Doug Evans - - * include/winkernel.h (FlushFileBuffers): Declare. - -Tue Mar 12 11:16:32 1996 Michael Meissner - - * exceptions.cc (dump_status): Make columns line up for PowerPC. - (call_handler): Right now, call exit(255) for the PowerPC. - - * strace.cc (__sys_printf): Call FlushFileBuffers after writing - out the file to make sure it really gets flushed. - - * include/winkernel.h (PowerPC CONTEXT): Add fields returned if - CONTEXT_DEBUG_REGISTERS is set. - -Sun Mar 10 15:31:17 1996 Steve Chamberlain - - * strerror.cc, syslog.cc, net.cc: New files. - * cygwin.din: Add new net functions. - * dcrt0.cc (dll_crt0_1): Fix call to build argv[0]. - * fhandler.cc (fhandler_base::open): Tidy. - * fhandler.h: Add net classes. - * hinfo.cc (hinfo_vec::build_fhandler): Add tape stuff. - * path.cc (*::mangle, *::reverse_mangle): Fix. - (mount_info::init): No trailing / now. - * select.cc (*): Rewrite. - * spawn.cc (spawn_guts): Fix leak. - * syscalls.cc (_sbrk): Keep working until memory really fills up. - -Tue Feb 20 16:53:24 1996 Steve Chamberlain - - * dcrt0.cc (dll_crt0_1): Get version from the header. - * fhandler.cc (CHUNK_SIZE): New. - (fhandler_base::read, fhandler_base::write): CRLF conversion - rewritten. - path.cc (path_conv::path_conv): Initialize mixed, binary and silent. - * smallprint.c (__small_vsprintf): Add 'c' option. - * wait.cc (wait_found): Close child handles. - -Mon Feb 19 09:11:57 1996 Michael Meissner - - * Makefile.in (real-headers): Eliminate real-headers dependency on - mspatches/*.patch, since you can't be guaranteed that it exists. - -Fri Feb 16 14:24:47 1996 Michael Meissner - - * exceptions.cc (dump_status): On the PowerPC, dump all of the - integer registers. - - * uname.c (uname): Don't assume that the only two NT systems are - i386 and PowerPC. - * exceptions.cc (call_handler): Ditto. - (dump_status): Ditto. - -Thu Feb 15 18:20:33 1996 Steve Chamberlain - - * cygwin.din (__empty): Add. - * dcrt0.cc (dos_argv_to_unix_argv): New. - (check, onetimecheck): New. - * exceptions.cc (ehandler3): Always show backtrace - if exception failed. - * fhandler.cc (*::open): Removed dos_path argument. - (fhandler_base::fstat): Use nFileIndexLow as the inode - value. - * hinfo.cc (init_std_file_from_handle): Don't default - to binary. - * paths.cc (*): Use new registry classes. - * registry.cc (*): Rewritten. - * syscalls.cc (open): Call fhandler->open without - the dos filename arg. - -Sat Feb 10 08:18:45 1996 Michael Meissner - - * configure.in (ALLOCA for powerpc): Add __allocate_stack. - -Wed Feb 7 16:41:18 1996 Steve Chamberlain - - Release-B13 - - * malloc.cc (export_*): New. Changed the way that malloc - stubs are used. - * cygwin.din: Export the export_* stuff as malloc, realloc and free. - * path.cc (link_cookie::create): Keep cookie filenames in unix - format. - (reverse_mangle): Clean up. - (readlink): Ditto. - (qfunc): Sort by name too. - * spawn.cc (spawn_guts): Handle zero length arg. - Only set errno when it's not 0. - * Makefile.in: Build new doc. - * fhandler.cc (fhandler_base::fstat): Round up block used. - * path.cc (escape_char): Now it's ^. - * syscalls.cc (errmap): ERROR_INVALID_NAME yields ENOENT. - (chown): Returns 0. - (sbrk): Clean up. - (_unlink): Only try and DeleteFile once. - -Mon Feb 5 19:15:44 1996 Steve Chamberlain - - * dcrt0.cc (dll_crt0_1): Build env string into static buffer. - * dirsearch.c (opendir): Stat on unix pathname. - * paths.cc (*): Support for mixed case filenames. - -Sun Feb 4 15:55:58 1996 Steve Chamberlain - - * *.cc: Lint. - (conv_path_names): New. - (dll_crt0_1): Use conv_path_names list. - * fctnl.cc (F_DUPFD): Look from the fd forward. - * fhandler.cc (fhandler_base::open): Understand binary modes. - (fhandler_console_in::init): Call tcsetattr with reasonable start - values. - * spawn.cc (spawn_guts): Use conv_path_names. - (queue_file_deletion): Deleted. - (unlink): Use new queue file stuff. - * delqueue.cc, delqueue.h: New files. - * shared.h: New file. - -Wed Jan 31 11:12:24 1996 Steve Chamberlain - - * crt0.cc: Hacks to probe out ppc stack. - * exceptions.cc (ehander3): Don't use 386 context info on the ppc. - * path.cc (mount_info::mangle): Turn /usi or /usp into /usr. - * uname.c (uname): Change sysname and get ppc name right. - -Fri Jan 26 15:47:31 1996 Steve Chamberlain - - * pproc.cc (per_process::init): Cope when no memory is needed. - * Makefile.in, configure.in: Cope with config directory. - * setjmp.c, longjmp.c: Moved into config/i386. - * config/ppc/setjmp.S, config/ppc/longjmp.S: New. - -Fri Jan 26 14:57:33 1996 Jason Molenda (crash@phydeaux.cygnus.com) - - * Makefile.in (DLL_OFILES): removed ppc-stub.o - ppc-stub.c: Removed. - configure: regenerated with autoconf 2.7. - -Fri Jan 26 11:18:07 1996 Kim Knuttila - - * Makefile.in (DLL_OFILES): added ppc-stub.o - -Thu Jan 25 09:33:24 1996 Steve Chamberlain - - * malloc.cc (malloc, free, realloc): Hack for ppc. - -Wed Jan 24 20:22:42 1996 Steve Chamberlain - - * cygwin.dll (loadup_dll): Remove. - * dcrt0.cc: lint. - * fhandler.* (*): Move to new class structure. - * hinfo.cc: Use new fhandler glue. - * libcfork.cc: Cope with ppc naming convention. - -Mon Jan 22 10:33:53 1996 Steve Chamberlain - - * fhandler.h, hinfo.h: New files. - * winsup.h: Split from here. - * configure.in: Set i386 entry point correctly. - * fhandler.cc (fhandler_normal:open): .com files - are executable too. - * hinfo.cc (init_std_file_from_handle): Inspect - master_fmode_binary. - * misc.cc (wcscmp, wcslen): New. - * dcrt0.cc (probe): Change way a forkee's stack is allocated. - * pproc.cc (per_process::init): Initialize using heap chunk. - * shared.cc (shared_info::initialize): Initialize heap chunk. - * syscalls.cc (_sbrk): If current chunk is used, allocate another. - * wait.cc (wait_found): Fix exit code. - -Thu Jan 18 10:09:45 1996 Steve Chamberlain - - * fhandler.cc (fhandler_normal::open) Don't test a - com port to see if it's executable. - * configure.in, cygwin.din: More powerpc configury. - -Wed Jan 17 16:25:36 1996 Steve Chamberlain - - * configure.in, Makefile.in: Build powerpc stuff. - * hinfo.cc (build_fhandler): Use new with placement. - (fhandler::operator new): New. - -Wed Jan 3 18:18:57 1996 steve chamberlain - - * select.cc: New file. - * Makefile.in: Cope with it. - -Tue Jan 2 08:58:58 1996 steve chamberlain - - * version.c: New file. - * Makefile.in: Cope with it. - * cygwin.def (setgrent, cuserid, setpgrp, mount, setmntent, endmntent, umount): New. - * dcrt0.cc: Remove obsolete vfork stuff. - (dll_crt0): Change way environ is built. Check that app is built - with correct version of dll. - * dirsearch.cc, exceptions.cc: Lint. - * fhandler.cc: Lint. Most of termios.c moved into here. - (fhandler_console:*): New. - * hinfo.cc (hinfo_vec::init_std_file_from_handle): Open stdfiles as consoles - if possible. - * libccrt0.cc: Lint. - * malloc.cc: More comments. - * path.cc (*): Cope with mount handling. - * registry.cc: Lint. - (reg_session): New. - * shared.cc: Lint. - * signal.cc (usleep): New. - * spawn.cc: Lint. Removed vfork stuff. - * stubs.c (getmntent, endgrent): Deleted. - * syscalls.c (__seterrno): Now takes arguments. - * termios.c: Much moved info fhandler.c - * times.cc (utime, utimes): New. - * uinfo.c (cuserid): New. diff --git a/winsup/cygwin/ChangeLog-1997 b/winsup/cygwin/ChangeLog-1997 deleted file mode 100644 index 33b001154..000000000 --- a/winsup/cygwin/ChangeLog-1997 +++ /dev/null @@ -1,2800 +0,0 @@ -Wed Dec 31 15:00:32 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * hinfo.cc (hinfo_vec::find_unused_handle): correct - previous patch -- need to fix up vec[i].h pointers - -Wed Dec 31 14:13:22 1997 Ian Lance Taylor - - * regexp/Makefile.in (tooldir): New variable. - (install): Install regexp.h. - -Tue Dec 30 19:52:46 1997 Ian Lance Taylor - - * net.cc (inet_netof): New function. - (inet_makeaddr): New function. - * cygwin.din: Export inet_netof and inet_makeaddr. - -Tue Dec 23 17:45:07 1997 Ian Lance Taylor - - * path.cc (current_directory_name): New static variable. - (current_directory_posix_name): New static variable. - (getcwd_inner): Cache the directory name. - (chdir): Move here from syscalls.cc. Clear directory cache - variables. - * syscalls.cc (chdir): Remove; now in path.cc. - - * environ.cc (setenv): Add cast to avoid warning. - - * security.cc (get_file_attribute): Make file parameter a pointer - to const char. - (set_file_attribute): Likewise. - * winsup.c (get_file_attribute): Update declaration. - (set_file_attribute): Likewise. - - * path.cc (path_conv): Don't pass the root directory to - symlink_check_one. - -Mon Dec 22 16:34:40 1997 Ian Lance Taylor - - * path.cc (realpath): Use path_conv to resolve symlinks. - - * path.cc (path_conv::path_conv): Rewrite completely to convert to - win32 path first and then check for symlinks element by element. - (symlink_check_one): New static function based on old - symlink_check_worker, but without path conversion. - (path_prefix_p): Move definition before all uses. - (skip_n_slashes, symlink_expand, symlink_follow): Remove. - (symlink_check_worker, symlink_check): Remove. - (readlink): Rewrite to use new symlink_check_one. - (unmixedcaseify, mixedcaseify): Comment out. - * path.h (symlink_check, symlink_follow): Don't declare. - * fhandler.cc (open): Don't pass O_NOSYMLINK to path_conv. Set - errno from path_conv if it fails. - * dirsearch.cc (opendir): Check errors from path_conv, and set - errno appropriately. - * times.cc (utimes): Likewise. - * syscalls.cc (_unlink, _link, mkdir, rmdir, chdir): Likewise. - (chmod, _rename): Likewise. - (_stat_worker): Don't just pass nofollow to _open, but base - whether to pass O_NOSYMLINK on whether nofollow is set. - (lstat): Pass 1, not O_NOSYMLINK, to _stat_worker. - * strerror.cc (strerror): Add ELOOP. - -Thu Dec 18 12:30:47 1997 Ian Lance Taylor - - * fhandler.h (class fhandler_base): Remove inline definitions of - tcflush, tcsendbreak, tcdrain, tcflow, tcsetattr, tcgetattr, - tcsetpgrp, and tcgetpgrp, so that we can set proper errno values. - (class fhandler_tty): Add pgrp_ field, and virtual tcgetpgrp and - tcsetpgrp functions. - * fhandler.cc (fhandler_base::tcflush): New function. - (fhandler_base::tcsendbreak): New function. - (fhandler_base::tcdrain): New function. - (fhandler_base::tcflow): New function. - (fhandler_base::tcsetattr): New function. - (fhandler_base::tcgetattr): New function. - (fhandler_base::tcsetpgrp): New function. - (fhandler_base::tcgetpgrp): New function. - (fhandler_tty::fhandler_tty): Initialize pgrp_. - - * tty.cc (tcsetpgrp): Set errno correctly on failure. - - * include/sys/termios.h (CBAUD): Change to 037. - (B57600, B115200): Change to values that can fit in a speed_t. - - * spawn.cc (spawn_guts): Set errno correctly if we can't find the - executable. - -Mon Dec 15 16:40:07 1997 Geoffrey Noer - - patch from msnyder@cygnus.com (Michael Snyder): - * heap.cc (_sbrk): handle situation where newalloc < incr - -Mon Dec 15 16:40:07 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - Allow Cygwin32 to terminate process even when in a blocking - winsock call. - * exceptions.cc (call_handler): call to WSACancelBlockingCall() - removed. - (sighandle): call WSACleanup() before exiting the process to - cancel blocking winsock calls. - * include/mywinsock.h: add proto for WSACleanup(). - -Mon Dec 15 16:40:07 1997 Geoffrey Noer - - * Makefile.in: compile .cc files with -fno-exceptions to - decrease dll size and increase execution speed a little. - -Mon Dec 15 16:40:07 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * tty.cc (do_input): Detect CTRL-T as a special case when - STRACE_CACHE is active. Dumps the strace cache to disk. - * console.cc (fhandler_console::read): Detect CTRL-T as a special - case when STRACE_CACHE is active. Dumps the strace cache to disk. - -Sat Dec 13 15:12:53 1997 Ian Lance Taylor - - * fork.cc: Include . - (cygwin_fork_helper1): Call __malloc_copy after copying the stack - and heap to the child. - -Thu Dec 11 15:14:40 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * sigproc.cc (proc_subproc): Remove over-enthusiastic test for - process handling readiness or proc_wait will loop attempting to - handle a dying subprocess when signal handlers are not ready. - * fork.cc (cygwin_fork_helper1): Reorganize to ensure that a - forked process is capable of receiving signals when fork() - returns. - -Wed Dec 10 15:43:37 1997 Ian Lance Taylor - - * include/sys/termios.h (IXANY): Correct value. - (PARMRK): Define again. - -Wed Dec 10 00:05:23 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * dcrt0.cc (dll_crt0_1): Move start time initialization to a more - logical place (pinfo_init). - (do_exit): Reorganize to attempt to solve races when a cygwin - process occupies two windows pids (i.e., an execed process). - * exceptions.cc (lock_cs): Fix erroneous WFSO logic. - (sighandle): Use new method for determining if process was - initiated via fork. - (events_terminate): Do not close pinfo_mutex. Allow automatic - close by ExitProcess to lengthen the time that the pinfo structure - is locked, minimizing races between an exiting child and a - potentially exiting parent. - * hinfo.cc (hmap_init): Use new method for determining if process - was initiated via fork. - (hinfo_vec::de_linearize_fd_array): Fix a typo in a comment. - * pinfo.cc (clearout): Remove this function. Handled in - allocate_pid. - (pinfo_init): Move start_time setting here from dll_crt0_1. - Remove call to init_self in favor of adding three additional lines - of code. - (pinfo_list::operator []): Implement a very simple hashing - scheme for pid lookup. - (lpfu): New routine controlled by DEBUGGING conditional. When - DEBUGGING is activated, lpfu returns more information about the - state of a timed out pinfo_mutex. - (pinfo_list::get_empty_pinfo): Remove function. Move - functionality to allocate_pid. - (allocate_pid): Implement a (very) simple hashing scheme for - finding an available pid. Take advantage of reorganized pinfo - structure to zero all pertinent fields with one memset. - (pinfo::record_death_nolock): Don't bothering zeroing - inconsequential stuff. - (pinfo::record_death): Leave pinfo_mutex locked with the - understanding that this function will be called just prior to - exiting the process. This minimizes a race between a child which - is exiting at nearly the same time as its parent. - * sigproc.cc: Reformat function calls. - (sigproc_init): Clear new PID_INITIALIZING flag to indicate that - a (possibly execed) process is now capable of receiving signals. - (sig_send): Be more defensive in determining if a signal can be - sent to myself or suffer problems with execed processes. - (sigproc_terminate): Wait for sig_proc to exit to ensure that - all pending signals have been handled. Use new 'proc_terminate' - function to terminate the subprocess handling thread. - (allow_sig_dispatch): Don't bother blocking signals if signal - handling isn't active in this process yet. - (block_sig_dispatch): Don't bother blocking signals if signal - handling isn't active in this process yet. - (sig_proc): Use sig_loop_wait variable to control wait time for - signal semaphores. Uncouples this wait from wait_subproc. - Perform signal cleanup here on thread termination. - (proc_exists): More accurate tests to determine if a process - really exists. - (proc_register): Remove this function in favor of a macro. - (proc_subproc): More stringent test for being "ready" to process - subprocesses. Add more common initialization to PROC_ADDCHILD. - Remove PROC_EXIT in favor of a separate function. - (proc_terminate): New function. Replaces PROC_EXIT functionality - in proc_subproc. Terminates subproc handler thread. - (stopped_or_terminated): use lock_pinfo_for_update when modifying - child stopsig status or suffer a race. - (wait_subproc): Save sig_proc thread handle away for - synchronization when exiting. Set up 'i_am_alive' mutex inherited - by childen. Child's inability to lock this mutex means that the - parent is still alive and processing children. Use proc_loop_wait - to control WFMO. Clean up events queue on thread exit. - (zap_subproc): Clear out pinfo structure for a child. - * sigproc.h: Remove PROC_EXIT constant. Remove obsolete - proc_register declaration. - (alive_parent): New macro to determine if a parent is still alive. - * spawn.cc (spawn_guts): Fix a comment typo. Use proc_terminate - to terminate all subprocess handling prior to an exec. Use new - method for determining if this process was started via a fork. - Attempt to clean up races between execed process, its parent, and - the execed child. - * winsup.h (pinfo): Add a new handle indicating that a parent is - alive. This should be a foolproof way of determining if a parent - has gone away so that a child will know whether to remove itself - from the pinfo table. - Reorganize the structure in such a way that items to be zeroed - are grouped together at the beginning for more efficient zeroing - in allocate_pid. - Add a new PID_* constant. - New lock_pinfo_for_update macro for use when debugging cygwin. - -Wed Dec 10 00:05:23 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - Change the way to inherit fd table on spawn/exec calls. - Use STARTUPINFO structure to pass an fd table to a child process - instead of shared memory area. This is undocumented, but is used - by MSVC runtime. The desktop inheritance code added again, - otherwise user32.dll will fail to initialize after sexec calls. - * pinfo.cc (pinfo_init): delinearize fd array from STARTUPINFO - structure instead of call to copy_shared_fd_table. - * shared.cc (create_shared_fd_mapping_name): remove - (create/copy_shared_fd_table): remove - * spawn.cc (spawn_guts): use lp(cb)Reserved2 fields of STARTUPINFO - to pass fd table to a child. Remove call to - create_shared_fd_table. Inherit window station/desktop on sexec - calls. - * winsup.h: remove prototypes for create/copy_shared_fd_table. - -Fri Dec 5 18:57:42 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * kill.cc (main): Report error if kill() fails. Minor reformat. - * ps.cc (main): Only use month/day in start time when starting - time is > 24 hours in the past, not when it occurs yesterday. - -Fri Dec 5 15:54:41 1997 Geoffrey Noer - - * fcntl.cc (_fcntl): reformat - * fhandler.cc (fhandler_tty::open): new, need special open for - ttys. In addition to calling fhandler_base::open, check - flags to handle blocking vs. non-blocking I/O. Should - initialize tty to standard state (9600 bits/sec - 8 - 1 with - no flow control) but this code needs more work still. Ifdef - out for now. - (fhandler_tty::tcsendbreak): new - (fhandler_tty::tcdrain): new - (fhandler_tty::tcflow): new - (fhandler_tty::tcsetattr): add support for action arg. Use - a DCB struct to hold the values we will set. First call - GetCommState to get the current state, then reassign values - based on the contents of the termios struct. Handle the - case where t->c_ospeed is set to B0, otherwise set state.BaudRate. - Set all the other DCB struct values appropriately, based on - the contents of the termios struct. - (fhandler_tty::tcgetattr): do the inverse of tcsetattr. - Call GetCommState to get the current state and use this to set - the appropriate termios struct values. - * termios.cc: reformat - (tcsendbreak): implement -- add duration arg, - call fhandler tcsendbreak as appropriate - (tcdrain): implement -- call fhandler tcdrain as appropriate - (tcflow): implement -- call fhandler tcflow as appropriate - * fhandler.h: add new tc* protos - * include/sys/termios.h: correct values of iflag bits, - define CRTSXOFF and CRTSCTS, CBAUD, B57600 and B115200. - Add protos for tc* functions. - -Wed Nov 26 17:06:17 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * spawn.cc (perhaps_suffix): resolve symlinks to .exes. - -Mon Nov 24 17:10:49 1997 Geoffrey Noer - - * cygwin.din: remove crypt - * syscalls.cc (crypt): remove crypt stub - -Sun Nov 23 17:34:42 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * spawn.cc (spawn_guts): save the path of the script itself, - use the saved path while building the command line to execute. - -Thu Nov 20 22:58:23 1997 Geoffrey Noer - - * stubs.cc: delete file, move unimplemented stubs to the - files in which they would normally belong. - * grp.cc (setgrent): implement (was in stubs.cc) - * syscalls.cc: move regfree, mknod, setgid, set(e)uid, sync, - crypt, and PPC __chkstk/_alloca/dll_entry stubs here from stubs.cc - (sync): just return zero for now instead of -1 - (crypt): return -1 instead of 0 - -Thu Nov 20 22:41:57 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * spawn.cc (spawn_guts): A premature close of the spawned filehandle - was possible when reparenting an exited process. Fix this. - * dcrt0.cc (do_exit): Only do minimal cleanup if "pid focus" - has moved to another windows process or the other process will - become confused. - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * sigproc.cc (getsem): set errno to EPERM if existing semaphore - cannot be opened. - (wait_subproc): allow access to signal semaphores to process's - owner only except for SIGCHLD (needed for SIGCHLD delivery after - sexecXX calls). - -Thu Nov 20 00:52:58 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * syscalls.cc (hash_path_name): Ignore trailing backslash when - calculating pathname hash. - * hinfo.cc (hinfo_vec::de_linearize_fd_array): Set use_tty - if /dev/ttyn is detected in the shared_fd_table. Before this - change, executing "set CYGWIN_TTY=1", "bash", "unset CYGWIN_TTY", - "/bin/pwd" would result in pwd printing nothing because - the de_linearize code would use the wrong fhandler_xxx when - reading from the buffer inherited from the parent process. - * cygwin.din: Add new ctermid function for export. - * syscalls.cc (ctermid): New function - * exceptions.cc (call_handler): If called during a P_OVERLAY - spawn, merely set appropriate flags and return. The spawn - code will then clean up and exit. - * sigproc.cc (proc_exists): Reorganize to better detect defunct - processes. Don't clean up pinfo if process has a parent since the - parent should clean up eventually. - * spawn.cc: New global exec_exit. Set by signal handler to - value which should be used on exit from aborted spawn. - (spawn_guts): Try harder to let the child terminate (if it is - going to) before exiting on a signal. Remove obsolete code. - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * exec.cc (file_exists): Removed - * spawn.cc (spawn_guts): call perhaps_suffix to convert filename - to win32 form and to check file existance; prog variable - removed, all references changed to real_path variable. - Do not inherit parent's window station/desktop on sexecXX calls. - They are no longer needed with the new signal handling. - (_spawnve): extra file existance check removed - * winsup.h: file_exists prototype removed - -Wed Nov 19 16:23:47 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * cygwin.din: add missing exports for random -- initstate - and setstate (accessed by gawk among others?) - -Tue Nov 18 22:27:10 1997 Geoffrey Noer - - * Makefile.in: Add spaces after colons in rules for make - -Mon Nov 17 22:35:25 1997 Geoffrey Noer - - patch from proven@cygnus.com (Chris Provenzano): - * Makefile.in: set SHELL = @SHELL@, set VPATH to only @srcdir@. - Remove mingw from directories to build for now, adapt rules - for building sysdef files without fancy VPATH - * configure: regenerate - * config/i386/makefrag: add rules to build setjmp/longjmp - * regexp/Makefile.in: set SHELL = @SHELL@ - * regexp/configure: regenerate - * utils/Makefile.in: set SHELL = @SHELL@ - * utils/configure: regenerate - -Mon Nov 17 18:36:50 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * fhandler.cc (fhandler_disk_file::open): calls to symlink_XXX - replaced with path_conv class calls. - * path.cc (path_conv::path_conv): comments added, O_NOSYMLINK case - added. - * path.h (class path_conv): symlink_p, exec_p - new class members. - * spawn.cc (spawn_guts): call path_conv instead of symlink_follow. - -Sun Nov 16 15:54:27 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * dcrt0.cc (do_exit): Use new pinfo element in debug statement. - * pinfo.cc (pinfo_init): Eliminate use of "PID" environment - variable in favor of scanning the process table for a - SpawnedProcessId field matching current windows process id. - Should speed up spawned process startup slightly. Delay setting - of dwProcessId until process is capable of processing signals - since this field is used to build signal semaphores. - * signal.cc (kill_worker): Perform a `proc_exists' on the pid - in question if signal == 0. This will verify that the process - actually exists and was not abnormally terminated. - * sigproc.cc (sigproc_init): Initialize dwProcessId field after - signal processing has been initialized. - (sigproc_terminate): Remove events[0] close. - (getsem): Use GetCurrentProcessId to find the windows pid since - this dwProcessId field is not yet set up. Use proc_exists to - determine if error should be printed on OpenSemaphore error. - (proc_exists): New function. Makes more exhaustive test of - process existence. Determines if process died without going - through normal shutdown. - (wait_subproc): Close wakeup event only on thread exit. - * spawn.cc: Remove pExeced. Use new field in pinfo. - (spawn_guts): Initialize dwSpawnedProcessId field. - * utils/ps.cc (main): Perform a kill(pid, 0) on any pids that - appear to be active. This will clear out pids that have died - abnormally. 'ps -f' bypasses this. - * winsup.h (class pinfo): Add dwSpawnedProcessId field. - -Sun Nov 16 15:54:27 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * pinfo.cc ((pinfo_init): use dwProcessId for execed/spawned - check, set subproc_ready event only if the process is exec'ed. - * spawn.cc (spawn_guts): initialize hProcess and dwProcessId - fields of pinfo on exec, keep progname field on spawn. - -Sun Nov 16 15:54:27 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * dcrt0.cc: remove commented out code - * spawn.cc: fix misapplied patch problem - -Sun Nov 16 15:54:27 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * fhandler.cc (fhandler_dev_null::open): Open Windows 'nul' - device rather than "faking" a real open. - (fhandler_dev_null::close): delete. - (fhandler_dev_null::fstat): delete. - (fhandler_dev_null::ioctl): delete. - (fhandler_dev_null::read): delete. - (fhandler_dev_null::write): delete. - (fhandler_dev_null::lseek): delete. - (fhandler_dev_null::dup): delete. - * fhandler.h (class fhandler_base): delete above methods from - class. - * hinfo.cc (hinfo_vec::build_fhandler): Use new fhandler_dev_null - class which opens 'nul' device. Treat /dev/null similarly to - other Windows devices. This allows redirection of /dev/null to - non-cygwin processes. - -Sun Nov 16 15:54:27 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * dcrt0.cc (do_exit): Use EXIT_* flags to determine how exit - should proceed. Honor new EXIT_NOCLOSEALL to avoid - close_all_files. - * exceptions.cc (__cygwin32_exception_handler): Use new - EXIT_SIGNAL define to indicate exiting due to signal. - * signal.cc (sigprocmask): Slightly more defensive check against - being called prior to complete cygwin setup. - (_raise): Defensive check to guard against being called prior to - complete cygwin setup. - * sigproc.cc (stopped_or_terminated): Use new EXIT_SIGNAL define - to detect exiting due to signal. - * sigproc.h: Define flags to be used during exit process as - EXIT_*. - * spawn.cc (spawn_guts): Use EXIT_* constants to control how - do_exit proceeds after _P_OVERLAY. - -Sun Nov 16 15:54:27 1997 Geoffrey Noer - - * sysconf.cc (sysconf): return 1048576 for ARG_MAX until - we figure out the right value (_POSIX_ARG_MAX is only 4K - which is too small). - -Sun Nov 16 15:54:27 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * dcrt0.cc (dll_crt0_1): call winsock_init if neccesary. - * fhandler.cc ((fhandler_socket::fhandler_socket): moved to net.cc - * fhandler.h (class fhandler_socket): destructor prototype added. - * fork.cc (cygwin_fork_helper1): set PID_SOCKETS_USED in the - child's pinfo if parent has open socket descriptors; call - winsock_init in child code if necessary. - * net.cc: static variable winsock_init_p removed; - number_of_sockets is new global variable containing number of - opened sockets. - (winsock_init): made global, save "winsock inited" flag in process - state field. - (cygwin32_winsock calls): condition for winsock initialisation - changed - (fhandler_socket::fhandler_socket): new, moved from fhandler.cc; - increment number_of_sockets on constructor call. - (fhandler_socket::~fhandler_socket): new. Decrement - number_of_sockets on destructor call, check for negative value. - (fhandler_socket::ioctl): check for winsock initialisation added. - * spawn.cc (spawn_guts): handle PID_SOCKETS_USED in child's pinfo. - * winsup.h: PID_SOCKETS_USED - new enum value; number_of_sockets - and winsock_init() prototypes added. - -Wed Nov 12 23:02:34 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * exceptions.cc: Substitute do_exit for _exit as appropriate. - do_exit allows full 32 bits of exit value. The upper 16 bits - are used for special cygwin operations. - * winsup.h: Change definition of do_exit to allow calling from - signal handler. - * dcrt0.cc (do_exit): Change to allow calling from signal handler - in place of _exit. This is necessary to ensure that only cygwin - internal applications can exit with the upper order 16 bits set - to non-zero. - -Wed Nov 12 23:02:34 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * dcrt0.cc (do_exit): New function. Subsumes functionality of - _exit but takes a DWORD argument. Changed to avoid some shutdown - activities when called with REPARENTING bit set in argument. Also - explicitly kills any executing non-cygwin subprocess from a - spawn(P_OVERLAY)... - (_exit): Use do_exit for exiting. Ensure that only low order 1 - bits of status are used or confusion will result if exiting with - some higher order bits set. - * exceptions.cc (set_process_mask): Reflect new method for - sig_send to send signals to self. - (handle_sigsuspend): Reflect new method for sig_send to send - signals to self. - * fork.cc: A handle name was changed in the pinfo structure to - be more reflective of its use. Change forkee_stopped to - subproc_ready everywhere. - * pinfo.cc (pinfo::clearout): Change forkee_stopped to - subproc_ready. - (pinfo_init): Use PID_EXECED flag to determine if this process has - been execed. If so, signal the remaining stub in the process - which invoked us so that the stub can terminate and let us take - over as this pid. - * sigproc.cc (sig_send): Change method for determining if sending - signals to myself. A NULL pointer means communicate with my - signal handler. This is necessary to allow communication with - our own signal processors after reparenting an execed process. - Also, add an additional test to detect if a process goes away in - the middle of attempting to send it a signal. - (allow_sig_dispatch): Reflect new method for sig_send to send - signals to self. - (getsem): Use dwProcessId in names for signal semaphores. Allows - communicating with both parts of a process that is temporarily - "split in two" while execing. - (sig_proc): Avoid printing an error if WAIT_FAILED and exiting - anyway. Process requests even if loop_wait == 0. - (proc_subproc): Defensive check for manipulating processes prior - to initialization or after terminating sigproc. - Use different check for subprocesses that have been reparented. - Hopefully this will eliminate WFSO, error 6 problems. - (wait_subproc): Only exit when loop_wait == 0 and not dealing with - a process. - * spawn.cc: Set up two global variables, used on exit when - execing a non-cygwin process: hExeced - handle of non-cygwin - process which is being waited for by a stub, pExeced - windows pid - of the process. - (spawn_guts): Reorganize to always (temporarily) wait for the new - process when P_OVERLAY. If a cygwin process is invoked, then the - wait will return when an event is signalled and the new process - will be "reparented" in the ppid. If a non-cygwin process is - invoked, wait until the process exits or a signal is received - which terminates the process. In this case, the do_exit function - will terminate the non-cygwin process. - * winsup.h: Rename forkee_stopped to subproc_ready since this - event now has a dual role which is better defined by this new - name. Add a new flag (PID_EXECED) for process_state. Define a - new function `do_exit' which operates similarly to _exit - but takes > 16 quantities with the high order bit signifying - different exit actions. - -Mon Nov 10 17:11:08 1997 Geoffrey Noer - - * include/utime.h: remove (moved to newlib/libc/sys/cygwin32/sys) - so as not to conflict with the one in newlib/libc/include. - -Mon Nov 10 15:11:42 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * exceptions.cc (__cygwin32_exception_handler): exit with - "core dumped" exit code after writing "core" file. - -Mon Nov 10 15:11:42 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * console.cc: Add convenience macros and structures for handling - scrolling. - (fhandler_console::fillin_info): New function to fill in the `info' - struct. - (fhandler_console::scroll_screen): Change to scroll only the visible - portion of the screen. Honor scroll regions more stringently. - (fhandler_console::open): Use new fillin_info function. - (fhandler_console::ioctl): Use new fillin_info function which - automatically calculates screen size. - (fhandler_console::clear_screen): Use new fillin_info function. - Only clear visible portion of screen. - (fhandler_console::cursor_set): Add a flag to indicate whether - cursor positioning is absolute within buffer or is screen relative. - Use new fillin_info function to get screen information. - (fhandler_console::cursor_rel): Use new fillin_info function. - Change for new cursor_set parameter. - (fhandler_console::cursor_get): Use new fillin_info function. - (fhandler_console::char_command): Use new fillin_info function - where appropriate. Change for new cursor set parameter where - appropriate. Scroll only visible portion of screen when required. - * fhandler.h (class fhandler_console): Add fillin_info, change - cursor_set to reflect additional argument. - -Mon Nov 10 15:11:42 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * dcrt0.cc (dll_crt0_1): Register process start time. - * fork.cc (cygwin_fork_helper1): Register process start time. - * utils/ps.cc (main): Report process start time. - (start_time): New function to format time similarly to UNIX ps. - A time from today shows as HH:MM, times from previous days just - show the month and day. - * winsup.h (class pinfo): Add start_time field. - -Mon Nov 10 11:54:27 1997 Ian Lance Taylor - - * include/Windows32/Defines.h (TIME_ZONE_ID_INVALID): Define. - * times.cc (gettimeofday): The error return from - GetTimeZoneInformation is TIME_ZONE_ID_INVALID, not - TIME_ZONE_ID_UNKNOWN. - -Sun Nov 9 17:08:30 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * Makefile.in: add ../libiberty/strsignal.o - * cygwin.din: add exports for strsignal, strtosigno - * utils/kill.cc: changes to allow accepting signal name - as argument - -Sun Nov 9 17:08:30 1997 Geoffrey Noer - - * include/limits.h: define PATH_MAX here instead of - include/sys/param.h, define _POSIX_NGROUPS_MAX as 0 not 1 - (system invariant value, not implementation-specific) - * include/sys/param.h: remove PATH_MAX, change NOFILE from 64 - to 8192, delete PATHSIZE, remove safety wrapper around - MAXHOSTNAMELEN, add comments - * sysconf.cc (sysconf): return NGROUPS_MAX not zero, - return _POSIX_SAVED_IDS not zero. Return _POSIX_CHILD_MAX - not 4096. Return _POSIX_CHILD_MAX, not 8. - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * winsup.h: add proto for setdtablesize, define NOFILE_INIT - and NOFILE_INCR - * hinfo.cc (hmap_init, hinfo_vec::find_unused_handle): change to - support virtually unlimited numbers of fds. Remove setdtablesize - proto - * syscalls.cc: initialize dtable_size to NOFILE_INIT instead of - NOFILE - -Thu Nov 6 13:14:09 1997 Geoffrey Noer - - * exceptions.cc (__cygwin32_exception_handler): don't - print "In cygwin32_except_handler" for exceptions Cygwin32 - isn't going to handle. Print "(progname PID) Exception: " - to console. Redirect all detailed information including the - stack trace to .core. This should reduce confusion - about what's causing the exception (a lot of people would see "In - cygwin32..." and think the problem was in Cygwin32 when most of - the time it was in some other program). - * syscalls.cc: add fixme - * times.cc: add fixme - -Wed Nov 5 19:23:10 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * Makefile.in: force .c.os and .cc.os to be built in same - directories as source - -Wed Nov 5 19:23:10 1997 Geoffrey Noer - - * drct0.cc (dll_crt0_1): stop initializing winsock on process - startup since that slows down startup time of all processes, even - ones that don't end up making Winsock calls. - * fork.cc (cygwin_fork_helper1): don't need to call uinfo_init - or socket_checkinit after fork -- the appropriate functions will - do the necessary initialization if they are ever called. - * net.cc: init winsock_init_p to zero and make it static - (all exported functions): call winsock_init before making - any WinSock calls since this no longer happens in dcrt0.cc - startup code. Only do this if !winsock_init_p. - (winsock_init): checkinit renamed. Now just inits winsock - without checking whether it has been already initialized. - Make it static. - * uinfo.cc (uinfo_init): after we call getpwnam, we know - the passwd file has been read in so don't check initialization - of it. However, we do need to read_etc_group() if group_in_memory - isn't set. - * passwd.cc: rename global i variable to pw_pos, rename - passwd_in_memory to passwd_in_memory_p to match net.cc scheme. - Add comments. - (read_etc_passwd): make static - (various): make sure to read_etc_passwd() if passwd_in_memory - isn't set - * grp.cc: add comments, rename idx global to grp_pos, - rename group_in_memory to group_in_memory_p to match net.cc - scheme, group_in_memory_p no longer static (needs to be accessed - by uinfo_init) - * winsup.h: remove proto for socket_checkinit since that's - renamed and static within net.cc - -Tue Nov 4 01:02:20 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * signal.cc (sigprocmask): Newer versions of gcc will call - sigprocmask when a builtin constructor is activated. If this - happens prior to the setup of u->self, then a NULL dereference - will occur. Guard against this. - -Mon Nov 3 17:00:45 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * hinfo.cc (hinfo_vec::build_fhandler): Open a console for - /dev/tty when !use_tty. - -Thu Oct 30 10:28:15 1997 Tom Tromey - - * include/mapi.h: New file. - * sysdef/i386/mapi32.def (MAPISendMail@20): New export. - -Thu Oct 30 15:08:13 1997 Geoffrey Noer - - * times.cc: add comments listing standards funcs are defined in - (dump_filetime): remove unused local func - * net.cc (fail): remove local func, replace one reference with - equivalent debug_printf, add standards comments, reformat a little - (fhandler_socket::close): simplify handling of res - (fhandler_socket::fstat): set ENOSYS (unimplemented) - * stubs.cc: set ENOSYS in unimplemented funcs - * uname.cc: add standards comment - * ntea.cc: reformat - -Wed Oct 29 22:43:57 1997 Geoffrey Noer - - * times.cc (settimeofday): set ENOSYS instead of EPERM - since ENOSYS maps to "Function not implemented" which is the - case here. - * syscalls.cc (seterrno): on failure, set EACCES instead of EPERM - which is better for the unknown error case - -Fri Oct 24 01:24:07 1997 Geoffrey Noer - - patch from green@cygnus.com (Anthony Green): - * dcrt0.cc: new host_dependent_constants object with a global - instance of it which allows constants that are different in Win 95 - and NT to be saved here instead of having forks in the code and - having to check the OS type each time. Add two constants for - fhandler, one for sharing attributes and one for upper word value - for locking files. - (dll_crt0_1): call host_dependent init function - * fhandler.cc (fhandler_base::open): use above object for - setting shared attributes - (fhandler_disk_file::lock): get upper word for locking from - host_dependent_constants - * winsup.h: define host_dependent_constants class and add extern - for global instance of it - -Wed Oct 22 02:27:53 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * cygwin.din: Export getenv, putenv, setenv and unsetenv instead - of cygwin32_ wrappers - * dcrt0.cc: External variable environ removed - (dll_crt0_1): strip executable's path on console title if - environment variable CYGWIN_TITLE set to "strip", references to - environ removed. - * environ.cc: New file. Code derived from newlib sources. - * exec.cc: include stdlib.h - (execl, execv): new (derived from newlib sources). - (sexecve): reference to environ removed. - (sexecvpe): call getenv instead of cygwin32_getenv. - * grp.cc: new static variable group_in_memory - (read_etc_group): skip blank lines - (getgrgid, getgrnam, getgrent): call read_etc_group when necessary. - * misc.cc (cygwin32_getenv/putenv/setenv/unsetenv): remove - wrappers. - * passwd.cc: new static variable passwd_in_memory - (read_etc_passwd): skip blank lines - (search_for, getpwent): call read_etc_passwd when necessary. - (setpwent): fixed incorrect initialization of i var. - * pinfo.cc (pinfo_init): initialize uid with illegal value to - force read of /etc/passwd and /etc/group. - * spawn.cc: call getenv instead cygwin32_getenv - (spawn_guts): force read of /etc/passwd and /etc/group on sexec - calls. - * uinfo.cc (uinfo_init): read /etc/passwd and /etc/group only if - uid is undefined. - * winsup.h: remove protos for environ, cygwin32_getenv, - cygwin32_putenv - -Wed Oct 22 02:08:54 1997 Geoffrey Noer - - * utils/aclocal.m4: new file. Define autoconf macros for - determining whether we're compiling for the cygwin32 environment - or not and determine the executable suffix - * utils/configure.in: call AM_CYGWIN32 and AM_EXEEXT - * utils/configure: regenerate - * utils/Makefile.in: add $(exeext) after executable names so - programs will be built with the .exe suffix - -Wed Oct 22 00:50:27 1997 Geoffrey Noer - - Now that it is possible to use gdb using a stable - cygwin.dll to debug a program using a newer, potentially buggy - cygwin.dll, the strace mechanism will probably end up being - used more and more for debugging timing/race-condition bugs that - aren't easily exposed in a gdb session. The following changes - make the strace facility better for debugging timing issues by - storing the last few commands in a buffer instead of writing - to disk each function call. - - patch from cgf@bbc.com (Chris Faylor): - * dcrt0.cc (dll_crt0_1): Change to strace_init call to take - an argument (for planned future registry changes). - (_exit): Call strace_dump when appropriate. Add a debugging - printf. - * include/sys/strace.h: Add _STRACE_CACHE, _STRACE_EXITDUMP, - strace_dump (). - * strace.c (strace_init): Allow hexadecimal, octal setting of - strace flags in environment variable. Handle new cache option. - (strace_printf): Display number of seconds from last message. - Handle _STRACE_CACHE. - (strace_dump): New function. Dump cached messages to disk. - -Wed Oct 22 00:08:40 1997 Geoffrey Noer - - * cygwin.din: export socket calls without cygwin32_ prefix - * net.cc: remove unused herror function in favor of - cygwin32_herror which is exported as herror - * include/netdb.h: we are now exporting the socket calls without - the cygwin32_ prefix so we don't need the nasty remapping in - header files - * include/arpa/inet.h: ditto - * include/sys/socket.h: ditto - * select.cc (select): make extern C - -Tue Oct 21 22:52:29 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * sigproc.cc (sigproc_terminate): Fix flawed attempt to signal - any processes waiting for signal notification success when the - process receiving the signal is terminating. - (wait_subproc): Report on errors when opening the - sync_proc_subproc mutex. Move initialization of events[0] - "wakeup" signal prior to wait_subproc_inited or risk a (miniscule) - chance for a reference to a NULL handle. - * strace.cc (ta[]): Change WM_ASYNCIO entry to reflect previous - changes to WM_ASYNCIO constant. - -Tue Oct 21 14:30:14 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * sigproc.cc (proc_subproc): fix minor error output problem - -Mon Oct 20 20:19:02 1997 Geoffrey Noer - - * Makefile.in: change DLL_NAME to cygwin97r2.dll - -Mon Oct 20 20:16:47 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * window.cc (alarm): When there is a previous alarm() request - with less than one second remaining, then the return from a call - to alarm() is supposed to return 1. - -Mon Oct 20 20:16:47 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * Makefile.in: Add sigproc.o target. Add sigproc.h dependency - where appropriate. Add -s to intermediate ld of cygwin.dll to - speed up the process of building the .dll. - * dcrt0.cc: Add new sigproc.h include. - (dll_crt0_1): Replace window_init with sigproc_init for - initialization of signal/sub process handling. Change to use new - process_state field in pinfo. - (_exit): Remove spurious debugging statement. Terminate sigproc - processing. Remove signal blocking obviated by previous signal - termination. Remove SIGCHLD notification of parent as it is now - handled automatically in the parent. - (api_fatal): Terminate sigproc processing. - * exceptions.cc: Add new sigproc.h include. Change name of - ourhThread. - (ctrl_c_handler): Change to static as this is no longer called - outside of this module. - (lock_cs): Change to a function which will optionally grab new - signal dispatch mutex. Don't wait forever for cs mutex. - (unlock_cs): Change to a function which will optionally release - new signal dispatch mutex. - (init_exceptions): Detect errors from SetConsoleCtrlHandler. - Initialize new sig_dispatch mutex. This mutex is used to - control dispatching to a function on signal receipt. - (sig_dispatch_pending): New function. Called from signal - processing thread to dispatch pending signals. - (set_process_mask): Block signal dispatch during setting of new - mask, if possible. Contact signal thread to dispatch pending - signals. - (handle_sigsuspend): New function. Attempts to implement a - sigsuspend which will not lose signal notification. Called from - sigsuspend. - (call_handler): Use sigproc_printf where appropriate. - (ctrl_c_handler): Use _raise to invoke the correct signal. - (sighandle): New function. Subsumes most of ctrl_c_handler. - Change to mark as suspended signals which would dispatch for which - the sig_dispatch mutex is unavailable. Use sigproc_printf where - appropriate. - (events_init): Remove application_stopped mutex made obsolete by - new sigproc handling. - (events_terminate): Remove application_stopped mutex made - obsolete by new sigproc handling. - * fork.cc: Add new sigproc.h include. - (cygwin_fork_helper1): Use process_state field in pinfo (replaces - inuse_p). Call proc_register to add a new subproc to sigproc - handling. Call sigproc_init for new subprocess. Remove obsolete - window_init. - * heap.cc (_sbrk): Use process_state field in pinfo (replaces - split_heap_p). - * hinfo.cc (hmap_init): Use process_state field in pinfo (replaces - cygwin_parent_p). - * include/sys/strace.h: Add tracing for signal/subprocesses. - * init.cc: Add new sigproc.h include. Add waitq_storage global - for new sigproc handling. - (dll_entry): Add initialization, destruction of structures needed - by new sigproc handling. - * net.cc (fhandler_socket::ioctl): Use gethwnd() function to find - hwnd of hidden window. - * pinfo.cc: Add new sigproc.h include. - (pinfo::clearout): Use process_state field in pinfo (replaces - split_heap_p). Explicitly initialize various handles to NULL. - (pinfo_init): Use process_state field in pinfo (replaces - cygwin_parent_p). - (pinfo_list::operator): Use process_state field in pinfo (replaces - inuse_p). - (pinfo_list::alocate_pid): Initialize process_state field. - (pinfo::init_self): Remove obsolete initialization of hProcess. - (pinfo::record_death_nolock): Changes for new sigproc handling. - (pinfo::record_death): Move bulk of this code to sigproc.cc. - (pinfo::terminate): Remove function made obsolete by sigproc - handling. - (pinfo::init_from_exec): Use process_state field (replaces - inuse_p). - * signal.cc: Add new sigproc.h include. - (kill_worker): Call new sig_send function to send signals to - cygwin processes. - (_kill): Use process_state field in pinfo (replaces inuse_p). - (sigsuspend): Call handle_sigsuspend in exceptions.cc to handle - sigsuspend in a non-raceable way. - * sigproc.cc: New signal/subprocess handling module. Replaces - SendMessage method for signals with a method using semaphores. - Also detects changes in the state of child processes. - * sigproc.h: New header file defining constants and functions for - signal/subprocess handling. - * spawn.cc: Add new sigproc.h include. Clean up trailing spaces. - (spawn_guts): Reorganize to use new sigproc handling. - Use new pinfo process_state field (replaces inuse_p). - * syscalls.cc (_read): Use new pinfo process_state field (replaces - inuse_p). - (_write): ditto. - * tty.cc (tty_init): Use new pinfo process_state field (replaces - cygwin_parent_p). - * utils/ps.cc (main): Use new pinfo process_state field (replaces - inuse_p). Detect "zombie" processes similarly to UNIX ps. - * wait.cc: Add required includes. - (wait_found): Function obsoleted by new sigproc handling. - (wait4): Reorganize to use new sigproc handling. - * window.cc: Changes for new sigproc handling. - (WndProc): Remove SIGNAL handling obsoleted by new sigproc - handling. Use static window handle since the field has been - removed from pinfo. Use _raise where appropriate to send signals. - (Winmain): Replace global window handle with static since the - field has been removed from pinfo. - (window_init): Remove obsolete function. - (gethwnd): New function to allocate hidden window on demand rather - than at startup. - (window_terminate): Kill hidden window only if allocated. - (setitimer): Use gethwnd function to retrieve hidden window - handle. - * winsup.h: Remove stuff made obsolete by sigproc handling. Move - some constants to new sigproc.h header file. Remove inuse_p, - cygin_parent_p, split_heap_p. Replace with a single process_state - field. Define bit fields for process_state in an enum for easier - debugging. - -Mon Oct 20 19:17:33 1997 Geoffrey Noer - - * sysdef/i386/winserve.def: remove ancient version of cygwin.din - * include/sgtty.h: remove since Cygwin32's tty handling doesn't - support bsd syntax/semantics - * include/sys/termios.h: change winsize struct to include - ws_xpixel and ws_ypixel members - * cygwin.din: remove export of ScreenCols, ScreenGetCursor, - ScreenRows, ScreenSetCursor, get_pid__5pinfo, getkey, _getkey, - kbhit, _kbhit, __small_printf = small_printf__FPCce - * key.cc: remove. Similar functionality exists in ncurses - which can be compiled for Cygwin32 - * console.cc (ScreenCols, ScreenGetCursor, ScreenSetCursor, - ScreenRows): delete and delete SCREEN_ROWS/COLS defines - * pold.c: remove old pipe-related code that's no longer used - * include/regex.h: remove, it's not a part of cygwin.dll - * syscalls.cc: started to add comments including standards - information - (truncate): new - (ftruncate): length is an off_t, not a size_t. Add missing - return value to debug printf - * syscalls.h: ftruncate length is an off_t, add proto for truncate - - patch from cgf@bbc.com (Chris Faylor): - * console.cc (fhandler_console::write): Recognize '@' as a valid - character to follow a '\e[' sequence or get 'Bad escape' errors. - -Wed Oct 15 18:44:25 1997 Geoffrey Noer - - * cygwin.din: restore __main as an export - -Mon Oct 13 18:41:09 1997 Geoffrey Noer - - * cygwin.din: revert renaming of __assert since that's - actually what it's supposed to be called - * assert.cc: ditto - -Fri Oct 10 19:25:49 1997 Tom Tromey - - * include/Windows32/Base.h: Moved typedefs of CHAR, SHORT, etc, - before all other uses in file. - -Fri Oct 10 17:50:12 1997 Ian Lance Taylor - - * include/Windows32/Base.h: Only typedef CHAR, SHORT, and LONG if - VOID is not defined - -Thu Oct 9 00:46:40 1997 Geoffrey Noer - - * cygwin.din: remove all libgcc.a exports. They don't - belong here since libgcc.a doesn't really relate to the - purpose of cygwin.dll, and (to make things worse) the contents - change over time. - * assert.cc: rename __assert to __cygwin32_assert - * exceptions.cc: rename __stack_trace to __cygwin32_stack_trace, - __cygwin_except_handler to __cygwin32_except_handler - * version.h: increment major and minor numbers - -Tue Oct 7 12:52:25 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * dcrt0.cc (_exit): under Win 95, don't send SIGCHLD - unless special env variable is set. This works around a - problem where exiting a process can hang under Win 95. - -Mon Oct 6 23:41:34 1997 Geoffrey Noer - - * regexp: new directory containing free regexp code by - Henry Spencer. Taken from the most recent release of NetBSD. - Write configure.in and Makefile.in, based on files from - winsup/utils. - * Makefile.in: build regexp directory and include objs in - cygwin.dll. - * stubs.cc: remove all reg* stubs except for regfree which - isn't provided by above code. - -Mon Oct 6 13:35:48 1997 Geoffrey Noer - - * dcrt0.cc: remove asm idata3 terminator, now that ld is fixed - such that this is no longer necessary. - * libccrt0.cc: ditto - -Mon Oct 6 13:14:00 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * spawn.cc (spawn_guts): return child's PID on - spawn (_P_NOWAIT,...) instead of child's handle. - (cwait): rewritten as a wrapper to waitpid. - -Mon Oct 6 13:02:01 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * net.cc (socketpair): new - * cygwin.din: add socketpair export - -Mon Oct 6 13:01:51 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * dcrt0.cc: Remove obsolete call to fork_terminate. - * exceptions.cc: Respace, remove extraneous trailing whitespace. - Change critical section to mutex since there are supposedly - multi-processor problems with critical sections under NT. - Use "lock_cs" and "unlock_cs" macros to lock/unlock critical - regions. - (init_exceptions): Change critical section initialization to mutex - initialization. - (set_process_mask): Use locking macros to control access to - sig_mask. - (ctrl_c_handler): Use lock_cs/unlock_cs to control access. - (events_init): Use standard cygname function to create names for - shareable objects. - (events_init): Close cs mutex. - * fork.cc: Use event flags which are specific to the child being - forked. This prevents one process from prematurely activating - another. It also makes fork slightly more thread-safe. - (fork_init): Remove event initialization. - (fork_terminate): Remove function. - (cygwin_fork_helper1): Initialize events on a per-fork basis. - Events are inherited in child's pinfo structure. - Remove child->hThread initialization as it not needed. Use - pi.hThread where child->hThread is used. - Work around Windows 95 bug where a WaitForSingleObjects will - sometimes return ERROR_INVALID_HANDLE when it is resumed after - a suspend. - * pinfo.cc: Remove references to hThread field whereever it occurs. - * strace.cc: Use standard cygname function to create name for - strace_mutex. Prevents confusion between different .dll versions. - * wait.cc (wait_found): Remove reference to hThread. - * winsup.h (class pinfo): Remove reference to hThread. Add - per-process fork control event handles. - * include/limits.h: Increase NGROUPS_MAX from 0 to 1 to reflect - recent change to getgroups. - -Mon Oct 6 11:06:22 1997 Geoffrey Noer - - Oops. ../libio refers to objdir and is not the same - as $(srcdir)/../libio. - -Thu Oct 2 23:12:19 1997 Geoffrey Noer - - Revert patches to sources applied after Sept 16. Removed - relevant portions of ChangeLog entries. Some of those changes - may reappear later (removing the entries makes this log easier - to understand). - -Thu Oct 2 15:34:03 1997 Geoffrey Noer - - * Makefile.in: remove hardcoding of SHELL to /bin/sh, remove - ../libio from INCLUDES since $(srcdir)/../libio is already - included. - * glob/Makefile.in: remove hardcoding of SHELL to /bin/sh - -Mon Sep 29 14:06:24 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * cygwin.din: add exports for rcmd, rresvport, rexec - * net.cc (cygwin32_rcmd): new - (cygwin32_rresvport): new - (cygwin32_rexec): new - * include/mywinsock.h: add protos for Winsock calls associated - with functions called by the above. - -Mon Sep 29 13:26:24 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * grp.cc (getgrent): Change overlooked comment to reflect new - behavior. - -Thu Sep 25 18:35:49 1997 Geoffrey Noer - - * Makefile.in: remove debugdll defs since the shared memory - overlap problem is solved by the timestamp addition of Sept 23 - * version.h: rework explanations of version numbers - -Thu Sep 25 16:21:49 1997 Geoffrey Noer - - * spawn.cc: add missing cast to debug printf - -Thu Sep 25 16:14:17 1997 Ian Lance Taylor - - * path.cc (conv_to_win32_path): Call backslashify on a win32 - path. - -Tue Sep 23 17:58:17 1997 Geoffrey Noer - - Fixes for things that were causing compile-time warnings: - * exec.cc (_execve): add missing const to args to match def - of execve in newlib which this calls. - (sexecve): add missing const to def - (sexeclpe): don't need to cast argv in sexecvpe call - (sexecvpe): add missing const to def - * winsup.h: correct _execve proto, add protos for login/logout - * syscalls.h: correct sexecve, sexecvpe protos - * include/Windows32/Base.h: NULL should be defined differently - for C++ - * init.cc: respacing - -Tue Sep 23 17:05:50 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * dcrt0.cc (dll_crt0_1): don't use alloca for allocating storage - for environment blocks because setenv() uses realloc! - -Tue Sep 23 17:05:50 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * Makefile.in (LD_STUFF): Add datestamp.o after DLL_OFILES. - (datestamp.o): New target. datestamp.c is generated whenever .o - files change. It creates a file containing a "date stamp" - which is used by the function "cygname" to create named - shared memory, events, mutexes, and semaphores used by - cygwin.dll. The unique datestamp allows multiple loading of - different cygwin.dll's even when they have incompatible use - of shared memory areas. - * init.cc (dll_entry): Create the name string used by cygname - from the name of the invoking .dll + the datestamp of the - .dll from the auto-generated datestamp.c - * misc.cc (cygname): New function. Creates a standard Cygnus - shared resource name given a prefix, a name (e.g., pinfo_mutex), - and a numeric suffix (e.g., a pid). Replaces custom code in - several files. Uses cygwin_dlldate from datestamp.c to construct - names that are unique for a given cygwin load. - * shared.cc (open_shared_file_map): Use standard cygname function - to create names for sharable objects. Use static handle 'h' - so that it can be closed later by shared_terminate. - (shared_terminate): Guard against calling CloseHandle with a - NULL handle. - (create_shared_fd_mapping_name): Use cygname function to generate - the name for the "fd_map". - -Tue Sep 16 23:34:36 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * fcntl.cc (_fcntl): correct errno value (EBADF instead of - EBADFD). - -Tue Sep 16 17:22:28 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * include/Windows32/Defines.h: add missing defines needed - for NTEA usage. - * ntea.cc: remove them from here - * syscalls.cc (_link): call CreateFile with FILE_WRITE_ATTRIBUTES - flag instead of GENERIC_WRITE - -Tue Sep 16 17:22:28 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * pinfo.cc (pinfo_init): Fix a NULL pointer dereference when PID - environment variable contains garbage. - -Thu Sep 11 16:51:40 1997 Geoffrey Noer - - * syscalls.cc (ftruncate): read file pointer location at - beginning of function and restore it at the end - -Thu Sep 11 15:35:10 1997 Ian Lance Taylor - - * path.cc (backslashify): Don't turn a single trailing slash into - a double trailing slash. - -Wed Sep 10 11:40:55 1997 Ian Lance Taylor - - * include/Windows32/Structures.h: Add PACKED to PRINTDLG. - * include/Windows32/Functions.h: Add STDCALL to a few function - declarations. - -Tue Sep 9 02:12:18 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * syscalls.cc (_link): Implement hard links under NT with NTFS - using the backup API. Default to copying the file (what we did - before). - -Mon Sep 8 20:19:09 1997 Geoffrey Noer - - Merge in the following changes: - - Thu Aug 21 13:30:12 1997 Ian Lance Taylor - * assert.cc: New file. - * Makefile.in (DLL_OFILES): Add assert.o. - (assert.o): New target. - * pinfo.cc (cygwin32_winpid_to_pid): New C function. - * cygwin.din: Add cygwin32_winpid_to_pid. - * include/sys/cygwin.h: Include . - (cygwin32_winpid_to_pid): Declare. - * pinfo.cc (pinfo_init): Add debug_printf showing pid and pgid. - - Wed Aug 20 13:24:30 1997 Ian Lance Taylor - * spawn.cc (env_sort): New static function. - (spawn_guts): Sort the environment before passing it to - CreateProcess. - * exceptions.cc (exit_already): New file static variable. - (__cygwin_exception_handler): If exit_already is set, just - return. If we get an exception we don't recognize, let the next - exception handler handle it. Just ignore the INVALID_HANDLE - exception. - (really_exit): Remove file static exit_already variable; use the - global one. - (events_terminate): Set exit_already. - * include/Windows32/Defines.h (EXCEPTION_INVALID_HANDLE): Define. - (STATUS_INVALID_HANDLE): Define. - * include/Windows32/Functions.h: Declare some shell functions. - -Mon Sep 8 17:40:46 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * dcrt0.cc (_exit): Kill the foreground process group on session - leader exit only if job control is in progress. - * exceptions.cc (ctrl_c_handler): protect the code with critical - section. This helps stability under Win 95. - * include/sys/strace.h: add new wm_printf macro - * signal.cc (kill_worker): window message number changed (window - messages WM_USER-WM_USER+0x100 reserved for common controls on - windows95). Debug print added. - * spawn.cc (spawn_guts): removed unneeded flag DETACHED_PROCESS. - * strace.cc: defines for SIGNAL and ASYNCIO messages added. - * tty.cc (create_tty_master): initialize speed fields of termios - structure. - (fhandler_pty_master::open): likewise. - * window.cc (WndProc): debug print added, window message number - changed. - * winsup.h: WM_ASYNCIO number changed. - -Mon Sep 8 16:40:46 1997 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * fhandler.h: set_w_binary/set_r_binary now defined to - return void - * grp.cc (getgroups): always return an array of length 1 where - the element is the user's gid. - * pinfo.cc (pinfo_init): verify that we haven't exceeded the - maximum number of processes - (pinfo_list::allocate_pid): ditto - * include/Windows32/Functions.h: add noreturn attrib to ExitProcess - * include/sys/strace.h: change strace defs so strace-related - printfs will automatically add __FUNCTION__: to the beginning, - rename __sys_printf to strace_printf. - * *.cc: remove function names from debug printfs in favor of the - new scheme where they are automatically added, change __sys_printf - references (now strace_printf). - * smallprint.c (__small_vsprintf): new function displayer code - to support the above changes - -Wed Sep 3 12:44:45 1997 Geoffrey Noer - - * Makefile.in: split subdir_do into subdir_dobefore and - subdir_doafter to reflect whether the subdir in question - should be built before or after the top level is built - (e.g. glob needs to be built before libcygwin.a but libcygwin.a - needs to be built before utils). - -Thu Aug 28 12:09:39 1997 Geoffrey Noer - - * configure.in: when setting up EXE_LDFLAGS, correct the - location of crt0.o to ../../newlib since EXE_LDFLAGS is used - by Cygwin32 subdirectories where newlib is two directories up - instead of one. - * configure: regenerate with autoconf - -Thu Aug 28 00:13:11 1997 Geoffrey Noer - - Replace all licensing-related headers in all Cygnus-owned - files. Instead of listing terms at the top of each file, now - we simply refer to: - * CYGWIN32_LICENSE: new file listing Cygwin32 licensing terms - -Wed Aug 27 17:40:16 1997 Geoffrey Noer - - * cygwin.din: export random, srandom - -Wed Aug 20 16:56:39 1997 Geoffrey Noer - - * Makefile.in: remove unused winsock-related build rules - that were commented out, minor comment changes, remove - test.exe build rule. - -Wed Aug 20 14:45:17 1997 Geoffrey Noer - - * Makefile.in: link cygwin.dll with -lm -lgcc -lc -lgcc instead - of -lc -lm -lm -lgcc so lgcc finds abort(). Add definitions that - will eventually be used to build a cygwindebug.dll used by gdb - so gdb can debug a buggy cygwin.dll. Change some variable names - to have underscores in them (DLL_NAME, LIB_NAME, DEF_FILE, etc.). - Comment out text.exe build rule. - -Tue Aug 19 20:41:51 1997 Geoffrey Noer - - * dcrt0.cc: respace, modify some comments slightly - -Tue Aug 19 16:17:57 1997 Geoffrey Noer - - * Makefile.in: include ../libiberty/random.o, stop including - librx since it is LGPL'd code. - * stubs.cc: add stubs for regcomp, regexec, regerror, regfree - * dcrt0.cc (dll_crt0_1): default to not support tty/pty devs, - default to not displaying the running process in the title bar. - -Fri Aug 15 18:23:43 1997 Rob Savoye - - Add mingw directory for the minimalist cygwin environment. - See mingw/ChangeLog for changes specific to that directory - - * configure.in: Add mingw to AC_CONFIG_SUBDIR. - * configure: Regenerated from autoconf 2.12 with Cygnus patches. - * Makefile.in: Use subdir_do which uses the value of $SUBDIRS - rather than having seperate target for each directory. - * glob/Makefile.in: Add a phony target for install. - * configure.in: Add mingw to AC_CONFIG_SUBDIR. - -Fri Aug 15 01:12:19 1997 Geoffrey Noer - - * times.cc: add missing extern "C"s around exported functions - -Thu Aug 14 17:00:32 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * console.cc (fhandler_console::input_tcsetattr): clear iflag_ and - lflag_ when tty support enabled. - (FakeReadFile): do not interrupt read when tty support enabled. - Do not reset signal_arrived event. - * cygwin.din: add exports - cf(g)set(i)ospeed, login, logout, ttyslot - * dcrt0.cc (_exit): kill orphaned childs with SIGHUP and SIGCONT - on group leader exit, kill foreground process group on session - leader exit. - * dirsearch.cc (closedir): check for FindFirst() was called - * exceptions.cc: include mywinsock.h. - (call_handler): call WSACancelBlockingCall to try to interrupt - blocking winsock call, do PulseEvent() instead of SetEvent(). - (ctrl_c_handler): clear pending SIGCONT on stop signals, clear all - pending stop signals on SIGCONT, suspend the thread before resuming - to avoid W95 bug, process pending signals on SIGCONT, add signals to - pending if the process is stopped. - * fcntl.cc (fcntl): some code rearrangement to always do debug printfs - on call exit. - * hinfo.cc: include stdio.h - (hinfo_vec::build_fhandler): always add ttynum to tty's filename - (hinfo_vec::dup2): fix return value initialization and errno setting. - * include/netdb.h: typedef for sig_t removed - * include/sys/termios.h: octal constants changed to hexadecimals - to simplify debugging. - * misc.cc: include unistd.h and utmp.h - (login): new - (logout): new - * pinfo.cc (lock_pinfo_for_update): debug printf added - (pinfo::record_death): mark processes as orphaned on group leader - exit. - * select.cc (cygwin32_select): ResetEvent() removed - * signal.cc: unneeded ResetEvents removed - (_kill): ignore stop signals from a member of orphaned process group, - kill self process the last on group kill. - (sigaction): reset pending SIGCHLD when the disposition is set to - default. - * spawn.cc (spawn_guts): ResetEvent removed - (cwait): do not interrupt the call - * strerror.cc: include stdio.h, reenable disabled cases, remove - duplicated cases, return decimal error value in the default case. - * syscalls.cc (setsid): set process group id to process id when setsid - called. - (setpgid): check for negative pgid - * syslog.cc (syslog): %m macro support added - * termios.cc (cfg(s)eti(o)speed): new fuctions needed to support - NIST PCTS requirements. - * tty.cc: include utmp.h. - (ttyslot): new - (tty_list::terminate): fill in utmp on tty master exit - (tty_list::allocate_tty): check for tty master pocess alive - (create_tty_master): fill in utmp - (do_input): restart tty output on interrupt - (fhandler_tty_slave::fhndler_tty_slave): ttynum logic moved to - build_fhandler. - (fhandler_tty_slave::open): set tty's session id to sid of the calling - process. - (fhandler_tty_slave::write): check for TOSTOP bit - (fhandler_tty_slave::fstat): allow access to tty to everyone - (fhandler_tty_slave::ioctl): check for TOSTOP bit - * tty.h: ttyslot prototype added - * wait.cc (wait4): check for valid value of option argument added - * winsup.h: define PID_ORPHANED, move tty_list array to the end - of shared area. - -Thu Aug 14 11:42:59 1997 Ian Lance Taylor - - * path.cc (slash_unc_prefix_p): Correct check of path[3]. Permit - numbers after the host name. - - * include/Windows32/Defines.h: Correct value for SM_CMETRICS, - SM_CXDRAG, SM_CYDRAG, SM_CXEDGE, SM_CYEDGE, SM_CXFIXEDFRAME, - SM_CYFIXEDFRAME, and add SM_MOUSEWHEELPRESENT. - -Wed Aug 13 20:11:52 1997 Ian Lance Taylor - - * fork.cc (cygwin_fork_helper1): If we don't have a console, pass - DETACHED_PROCESS to CreateProcess. - * spawn.cc (spawn_guts): Likewise. - -Tue Aug 12 19:51:32 1997 Ian Lance Taylor - - * include/Windows32/Structures.h (IMAGE_DOS_HEADER): Remove - dos_message and nt_signature fields; they aren't present in the - Windows header file. - -Wed Aug 6 16:27:13 1997 Ian Lance Taylor - - * include/Windows32/Structures.h: Define LPMEASUREITEMSTRUCT as a - pointer to MEASUREITEMSTRUCT. - - * syscalls.cc (_stat_worker): In directory case, only set - STD_WBITS in st_mode if FILE_ATTRIBUTE_READONLY is clear. - (access): Remove special case for directory. - - * include/Windows32/Defines.h (HKEY_DYN_DATA): Define. - (REG_FULL_RESOURCE_DESCRIPTOR): Define. - (REG_RESOURCE_REQUIREMENTS_LIST): Define. - -Mon Aug 4 21:15:05 1997 Andrew Cagney - - * glob/Makefile.in: Add include of newlib/libc/sys/cygwin32 to - explicit .c.o rule so that dirent.h is found. - -Thu Jul 24 02:14:24 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * cygwin.din: fpathconf, initgroups - new exports - * console.cc: new static variable CONSOLE_SCREEN_BUFFER_INFO info - (fhandler_console::scroll_screen): local variable info removed - (fhandler_console::open): likewise - (fhandler_console::ioctl): likewise - (fhandler_console::clear_screen): likewise - (fhandler_console::cursor_set): likewise - (fhandler_console::cursor_rel): likewise - (fhandler_console::cursor_get): likewise - (fhandler_console::write_normal): fixed scroll region bug, termcap - "cs" entry works now - * dcrt0.cc (dll_crt0_1): set file API to use OEM charset, convert - command line from ANSI to OEM charset. - (_exit): clear stopsig value on process exit - * exceptions.cc (call_handler): add one millisecond delay before - SetEvent() - (ctrl_c_handler): clear pending stop signals on SIGCONT, do not send - SIGCHLD to parent on process resuming; some debug printfs added; do - not call _exit() in a context of signal handling thread (would cause - more harm than good); fixed a bug with SA_NOCLDSTOP flag. - * fhandler.cc (fhandler_base::open): use full win32 path name to - generate inode number namehash instead of unix filename. - * fork.cc (cygwin_fork_helper1): block all signals while child and - parent are in fork() code - * grp.cc (initgroups): new stub added - * include/limits.h: new posix defines added - * include/sys/termios.h: typedef speed_t as unsigned char - * path.cc (mount_info::conv_to_posix_path) bugfix - * pinfo.cc (pinfo_list::operator []): PID_NOT_IN_USE check added - (pinfo::record_death): set child's ppid to 1 on parent exit - * signal.cc (sleep): correct return value if sleep call was - interrupted - (_kill): correct return value if killed pid was not found. - (sigaction): correct return value on handling non-handlable - signals, clear pending ignored signals - (sigsuspend): sigsuspend call should always return -1 and set errno - to EINTR. - * spawn.cc: respace - * syscalls.cc: map ERROR_NO_DATA to EPIPE instead of ENODATA - (isatty): fixed return value - (fpathconf): new - (pathconf): rewritten - (ttyname): fixed return value - * sysconf.cc (sysconf): misc fixes - * termios.cc (tcsendbreak): corrected errno set - (tcdrain): likewise - (tcflush): likewise - (tcflow): likewise - (tcsetattr): likewise - (tcgetattr): likewise - (tcgetpgrp): likewise - (tcsetpgrp): likewise - * tty.cc (fhandler_tty_slave::ioctl): TCGETA/TCSETA support added - * wait.cc (_wait): wait() syscall should do not terminate if - a child is stopped. - (wait4): wait calls should wait childs only; fixed a bug with - nprocinfo count; fixed signal handling. - -Thu Jul 24 02:10:25 1997 Geoffrey Noer - - * uname.cc: uname now outputs Cygwin32_NT or Cygwin32_95 - instead of Cygwin32/NT or Cygwin32/95. - -Thu Jul 24 02:10:25 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * cygwin.din: sexecve, sexecl, sexecle, sexeclp, sexeclpe, - sexecv, sexecp, sexecvpe - new exports - * exceptions.cc (ctrl_c_handler): do not raise SIGHUP on - CTRL_LOGOFF_EVENT to prevent termination of cygwin application - run as NT service on user logoff, raise SIGHUP instead of SIGQUIT - on system shutdown, clear stopped status in inuse_p on SIGCONT, - set stopped status on stop signals, call _exit() on process - termination in a context of signal thread to terminate while - in a blocking win32 syscall. - * exec.cc: include unistd.h and ctype.h. - (_execve): code moved to sexecve, call sexecve with a NULL hToken - handle. - (sexecve): new, check path, argv[0] and envp to null values, - pass nToken handle to spawn_guts(). - (sexecl): new (code derived from spawn family of functions in - spawn.cc) - (sexecle): new - (sexeclp): new - (sexeclpe): new - (sexecv): new - (sexecp): new - (strccopy): new - (sexecvpe): new - * fhandler.cc (fhandler_base::fstat): add STD_RBITS and STD_WBITS - to st_mode of non-file handles. - (fhandler_dev_floppy::open): clear O_TRUNC bit. - (fhandler_dev_tape::open): likewise - * fhandler.h (fhandler_pty_master): new member pktmode (flag to - indicate pty's packet mode) - * fork.cc (cygwin_fork_helper1): call uinfo_init () in a child code - to read /etc/passwd, /etc/group into memory. - * hinfo.cc (hinfo_vec::build_fhandler): check socket names for right - inheritance on exec(). - * include/Windows32/Defines.h: fixed a typo in LPSTR_TEXTCALLBACKA - definition - * include/Windows32/Functions.h: added prototype for - ImpersonateLoggedOnUser() API call. - * net.cc (cygwin32_socket): duplicate socket handle as inheritable - to avoid Windows95 socket inheritance bug, close the original socket. - (cygwin32_accept): likewise. - * path.cc (mount_info::conv_to_win32_path): do not add trailing - backslash to UNC device names like "\\.\a:", "\\.\tape0:" etc. - * pinfo.cc (pinfo::record_death_nolock) set PID_WAITING_FOR_PARENT - bit to inuse_p instead of assignment - inuse_p is a bit set now. - (pinfo::record_death): check PID_WAITING_FOR_PARENT bit instead of - comparison. - * select.cc (fd_pipe_map::convert_to_unix_fdset): deal with pipe - errors. - (pipethread): likewise - * shared.cc (create_shared_fd_table): allow any process to access - shared arg, needed for sexec() family implementation - * signal.cc (kill_worker): fixed a typo in debug printf - * spawn.cc (spawn_guts): new hToken argument (security token of - logged on user for sexec() calls implementation), added checks for - zero prog_arg and argv[0], if hToken is not NULL run - CreateProcessAsUser() on the current window station/desktop, or - just CreateProcess() otherwise, close hToken after the process is - created. - (_spawnve): pass NULL hToken to spawn_guts(). - * syscalls.cc (_read): set process's read status while in a read call - (_write): set process's write status while in a write call - (stat_worker): if GetFileAttributes() fails, try to call fstat to - support raw devices - * syscalls.h: include windows.h, added sexec() family functions - prototypes. - * sysdef/i386/kernel32.def: ImpersonateLoggedOnUser - new export - * tty.cc: tty attachment logic changed - tty_list::count field - counts now number of tty opens, but not a number of processes, - attached to a tty. - (tty_init): do not call attach_tty() in a exec'ed process - (attach_tty): correct return value if !use_tty. - (tty::init): initialize pgid and hwnd fields. - (tty_list::terminate): clearout tty on master exit. - (tty_list::allocate_tty): fixed a bug in a tty allocation. - (fhandler_tty_master::init): on NT allow any process to open - tty-master process for handle duplication, create synchronisation - events with a world-wide access, initialize winsize structure with - a default values. - (fhandler_tty_slave::open): if a tty doesn't have process group set, - set it to a process group of current process. - (fhandler_tty_slave::write): added missed \n to debug print, tty - write synchronization moved to a more correct place. - (fhandler_tty_slave::read): Sleep time changed for conformance with - other sleeps. - (fhandler_tty_slave::tcsetattr): synchronization added - (fhandler_tty_slave::ioctl): initialize arg.winsize with a tty-stored - value, copy the result of ioctl call to winsize. - (fhandler_pty_master::fstat): small fix - (fhandler_pty_master::open): on NT allow any process to open - pty-master process for handle duplication, initialize winsize - structure with a default values. - (fhandler_pty_master::read): check for pipe errors, changes to support - packet mode - (fhandler_pty_master::ioctl): rewritten, no longer a stub. - (fhandler_pty_master::linearize/de_linearize): save/restore pktmode - value. - * tty.h (class tty): winsize - new member - * utils/ps.cc: show process status just after tty number field - * winsup.h: defines for new bits in inuse_p added, spawn_guts() - prototype changed. - -Thu Jul 24 02:10:25 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * Makefile.in: Add tty.o to link and dependency lists, add - tty.h to headers list - * console.cc (fhandler_console::open): save open call flags - (fhandler_console::input_tcsetattr): clear all console modes if - tty support enabled - (FakeReadFile): restart read on signal delivering, changed CTRL - macro to CONTROL to avoid conflict with sys/termios.h, copy as - much as possible chars to output buffer instead of call to - undo_input after every char to prevent timeouts problem. - * cygwin.din: srandom, ptsname, grantpt, unlockpt - new exports. - * dcrt0.cc: include tty.h, new use_tty global variable. - (dll_crt0_1): call events_init() on application startup, set - use_tty to FALSE if CYGWIN_NOTTY environment variable is defined, - do not change console title if CYGWIN_NOTITLE environment - variable set, call tty_init(). - (_exit): call tty_terminate(), events_terminate() and others - in the right order. All modifications of console title are - mutexed to allow tty code to obtain console window handle right. - * exceptions.cc (exception_init): initialization of signal_arrived - event moved to events_init(). - (call_handler): raise signal arrived event after resuming main - thread. - (__cygwin_exception_handler): raise signal instead of calling - ctrl_c_handler, because exception handler is called in a context - of the thread, caused exception, and SuspendThread in call_handler - blocks itself :-) - (ctrl_c_handler): clear stopsig on SIGCONT delivery, call - ResumeThread until suspend count > 1, notify parent about child's - status changed. Care about handling SIGCONT signal. On stop - signals release vital mutexes used by stopped thread, save - signal number for wait(WUNTRACED) calls, notify parent about child's - status change. Do not stop processes running without job control - (when pgid == 0). Ensure that main thread is unblocked before - call _exit(). - (events_init): new - (events_terminate): new - * fcntl.cc (_fcntl): use saved open flags on F_GETFL/F_SETFL instead - of game with access_ variable. Is this variable longer needed? - * fhandler.cc (fhandler_base::linearize/de_linearize): save/restore - openflags_ variable. - (fhandler_base::open): save file open flags. - * fhandler.h (fhandler_base): new openflags_ member, new member - functions get_flags/set_flags, new virtual functions ptsname, - dup_for_fork, tcget(set)pgrp - (fhandler_pipe): remove always_write/except_ready because pipes - are always write ready (not true...) and selectable on read. - new classes fhandler_tty_slave, fhandler_pty_master, - fhandler_tty_master - * fork.cc (cygwin_fork_helper1): inherit control tty number on fork, - call tty_init on child startup. - * hinfo.cc: include stdlib.h and ctype.h. - (hmap_init): take care on exec'ed processes. - (init_std_file_from_handle): open /dev/tty for standard handles if - tty usage enabled. - (build_fhandler): check for tty slave and pty master devices. - * include/exceptions.h: exception handler returns "int" (exception - handling code), not "void". - * include/termios.h: new defines, struct winsize must contain - ws_xpixel and ws_ypixel members (commented now to avoid - incompabilities with existing binaries. Should be uncommented in - next release. - * net.cc (gethostbyaddr): corrected return value - * passwd.cc (parse): remove trailing newline from password - lines (user's shell was reported with trailing newline before). - * pinfo.cc (lock_pinfo_for_update): open mutex code moved to - events_init() in exceptions.cc. - (destroy_pinfo_lock): removed, pinfo_mutex is now closed in - events_terminate() in exceptions.cc. - (init_self): the initial value for pgid must be 0 (no job-controlled - process). - * select.cc: all debug_printf's changed to select_printf. - (fd_pipe_map): new class to implement (polling...) select on pipes. - (pipethread): new - (cygwin32_select): comment out socket only case since generic - code (select on different types of handles) works for sockets too - but is interruptable. The case for always_ready_used is used now - and for polling select (zero timevalue). Changes to support - select on pipes. - * shared.cc (shared_info::initialize): initialize tty table. - * signal.cc (sleep/usleep/sigsuspend/pause): signal_arrived moved - from u area to dll's address space, signal_arrived is manual reset - event now. - (_raise): implemented as kill (self, sig). - (kill_worker): new. Use SendMessage instead of PostMessage to avoid - some timing problems. - * spawn.cc: include tty.h. - (spawn_guts) call close_all_files() on exec, call tty_terminate() - before process exit. Some changes due to moving signal_arrived to - dll's address space. - (_spawnve): inherit control tty number on spawn. - * syscalls.cc (close_all_files): reenabled. The code is ok after - all! The troubles were due to incorrect usage on exec() calls. - (setsid): no longer a stub - (ptsname): new - * termios.cc: all syscall_printf's changed to termios_printf. - (tcget(set)pgrp): rewritten, no longer a stub. - * times.cc (utimes): It looks like Win32 does not allow changing - times of directories, so just return success in this case. - * tty.cc: new file - (tty_init): new - (tty_terminate): new - (attach_tty): new - (detach_tty): new - (tty::init): new - (tty_list::terminate): new - (tty_list::connect_tty): new - (tty_list::free_tty): new - (tty_list::init): new - (tty_list::allocate_tty): new - (fhandler_tty_master::fhandler_tty_master): new - (create_tty_master): new - (fhandler_tty_master::init): new - (doecho): new - (do_input): new - (process_input): new - (do_output): new - (process_output): new - (process_ioctl): new - (fhandler_tty_slave::fhandler_tty_slave): new - (fhandler_tty_slave::open): new - (fhandler_tty_slave::init): new - (fhandler_tty_slave::close): new - (fhandler_tty_slave::write): new - (fhandler_tty_slave::read): new - (fhandler_tty_slave::linearize): new - (fhandler_tty_slave::de_linearize): new - (fhandler_tty_slave::dup): new - (fhandler_tty_slave::dup_for_fork): new - (fhandler_tty_slave::fstat): new - (fhandler_tty_slave::tcgetattr): new - (fhandler_tty_slave::tcsetattr): new - (fhandler_tty_slave::tcflush): new - (fhandler_tty_slave::tcsetpgrp): new - (fhandler_tty_slave::tcgetpgrp): new - (fhandler_tty_slave::send_ioctl_request): new - (fhandler_tty_slave::ioctl): new - (fhandler_pty_master::fhandler_pty_master): new - (fhandler_pty_master::fstat): new - (fhandler_pty_master::open): new - (fhandler_pty_master::close): new - (fhandler_pty_master::write): new - (fhandler_pty_master::read): new - (fhandler_pty_master::tcgetattr): new - (fhandler_pty_master::tcsetattr): new - (fhandler_pty_master::tcflush): new - (fhandler_pty_master::ioctl): new - (fhandler_pty_master::ptsname): new - (fhandler_pty_master::linearize): new - (fhandler_pty_master::de_linearize): new - (fhandler_pty_master::dup_for_fork): new - (grantpt): new - (unlockpt): new - * tty.h: new - * utils/ps.cc: display process's control tty number. - * wait.cc (wait_for_single): removed. - (wait_for_any): all code moved to wait4(). - (wait4): rescan process table on child status changes, support for - WUNTRACED flag, avoid time races on child exit, correct return - value on timeout. - * window.cc: misc changes to wait creation of process's hidden - window to avoid race conditions on multiprocessor systems. - * winsup.h: misc changes to support all of the above. - -Thu Jul 24 02:10:25 1997 Geoffrey Noer - - * net.cc (cygwin32_shutdown): New implementation to replace - stub previously present - -Tue Jul 22 14:59:22 1997 Geoffrey Noer - - * cygwin.din: remove random, srandom - * Makefile.in: remove random/srandom-related lines - -Tue Jul 22 14:10:32 1997 Ian Lance Taylor - - * path.cc (realpath): New C function. - * cygwin.din: Export realpath. - - * cygwin.din: Export srandom. - -Wed Jul 9 12:26:03 1997 Geoffrey Noer - - * Makefile.in: libiberty random.o ends up in winsup, link - in that obj for now - -Tue Jul 8 14:02:41 1997 Ian Lance Taylor - - * libcmain.cc (main): Pass wShowWindow field from startup info to - WinMain. - -Mon Jul 7 17:47:48 1997 Geoffrey Noer - - * path.cc: respace, reword comments - * times.cc (utimes): add FIXME - -Tue Jun 24 18:31:27 1997 Geoffrey Noer - - * winsup.h: adjust protos to reflect the above, add enum os_type - which contains {winNT, win95, win32s, unknown} - * security.cc (is_nt): Delete - * syscalls.cc (windows_95): Delete - (get_os_type): New local function which returns os_type. Replaces - windows_95() and is_nt(). - - * fhandler.cc: Reformat. Call get_os_type() instead of - windows_95() and/or is_nt(), reorder so NT cases are first. - * mmap.cc: ditto - * net.cc: ditto - * syscalls.cc: ditto - * syslog.cc: ditto - - * uname.cc (uname): call get_os_type to fill new our_os local - variable, check that when filling out utsname struct, default - to i386 when we can't find out the specific Intel processor - variant. - * fhandler.cc (get_file_owner): remove doit variable - (get_file_group): ditto - * mmap.cc: extern "C" individual functions instead of wrapper - around most of file. - * misc.cc: minor reformat - * heap.cc (_sbrk): split a = b = c statement into two to - make code clearer and avoid invalid C++ casting warning during - compile. - * path.cc (symlink_follow): initialize syml_p and exec_p to zero - * select.cc: respace - (selectthread): cast first arg of WINSOCK_FD_SET - * ntea.cc (NTReadEARaw): add missing casts in front of malloc calls - * utils/mount.cc: remove mixed option since that hasn't been - supported for quite some time - -Sun Jun 22 17:27:03 1997 Ian Lance Taylor - - * include/windows.h: If RC_INVOKED is defined, don't include - limits.h, stdarg.h, Structures.h, Functions.h or Sockets.h, and - don't typedef BOOL. - * include/Windows32/Base.h: Don't do any typedefs if RC_INVOKED is - defined. - - * include/Windows32/Sockets.h (MAXHOSTNAMELEN): Don't define if - already defined. - * include/sys/param.h (MAXHOSTNAMELEN): Likewise. - -Fri Jun 20 11:06:09 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * include/sys/wait.h: correct operator precidence bug - in WIFSIGNALED - -Thu Jun 19 12:58:45 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - Handle unblocked pending signals on sig_mask changes - * exceptions.cc (return_handler): renamed to set_process_mask - (set_process_mask): new; use to set process mask instead of direct - u->self->sig_mask manipulations. - * winsup.h: rename return_handler proto to set_process_mask - * signal.cc: throughout file, call set_process_mask() instead of - direct manipulations of u->self->sig_mask. - (pause): new - * cygwin.din: add pause() export - * syscalls.cc (system): correct return value - -Wed Jun 18 22:01:56 1997 Geoffrey Noer - - * Makefile.in: add $(srcdir)/../newlib/libc/sys/cygwin32 to - the list of includes since that's where sys/dirent.h is - supposed to live - * include/sys/dirent.h: moved to newlib/libc/sys/cygwin32/sys - -Wed Jun 18 13:56:47 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * signal.cc (sigsuspend): deal with pending unblocked signals - * winsup.h: add proto for return_handler (sigset_t) - -Wed Jun 18 02:02:13 1997 Geoffrey Noer - - respaced console.cc, fhandler.cc, syscalls.cc, pinfo.cc, - fork.cc, spawn.cc - -Tue Jun 17 14:57:09 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * cygwin.din: add getpgid, killpg exports, delete duplicate - random export - * fork.cc (cygwin_fork_helper1): inherit pgid and sid on fork - * misc.cc (cygwin32_*env): save environ value in __cygwin_environ - too. Is __cygwin_environ variable really neccessary? Why not - export cygwin.dll's environ variable with "__cygwin_environ" name? - * pinfo.cc (pinfo::init_self): initialize pgid and sid - * signal.cc (kill_worker): new - (_kill): rewritten to support process groups - (killpg): new - * spawn.cc (_spawnwe): inherit pgid and sid on spawn family calls - * stubs.cc (setpgrp, getpgrp): remove stubs - * syscalls.cc (setpgid, getpgid, setpgrp, getpgrp): new - * termios.cc (setpgid): remove stub - * utils/ps.cc (main): add pgid to output, change output - format - * wait.cc (wait_for_any): add intpid argument, arrays ctable and - ptable have now fixed MAXIMUM_WAIT_OBJECTS size to avoid extra - scan of process table, changes for process groups support. - (wait4): misc changes to support process groups - * winsup.h (pinfo class): add new variables pgid, sid. - Define __cygwin_environ. - -Mon Jun 16 18:30:21 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * spawn.cc (spawn_guts): set child->hProcess and child->hThread, - CloseHandle on pi.hThread at end of spawn_guts instead of right - after starting the child process, - _P_WAIT needs to be handled separately from _P_OVERLAY - -Sun Jun 15 23:51:10 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * cygwin.din: remove setenv/getenv-related exports, - export cygwin32_ equivalents - * exec.cc: check ? - * misc.cc (cygwin32_getenv): new - (cygwin32_putenv): new - cygwin32_setenv): new - (cygwin32_unsetenv): new - * spawn.cc: call cygwin32_getenv instead of getenv, - call spawn with *u->envptr instead of environ - * winsup.h: define **environ as extern, define *cygwin32_getenv - -Sun Jun 15 20:51:09 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * Makefile.in: add ../libiberty/random.o to EXTRA_OFILES - * cygwin.din: remove exports of tgetent and _tgetent, added random - * exception.cc (exceptions_init): make OurThread handle - noniherittable, remove unused buf array. - (return_handler): add restmask argument (sig_mask value before - calling signal handler) - (call_handler): save sig_mask in user's stack before calling signal - handler, change PulseEvent() call to SetEvent() -- there were - losses of signal_arrived events if main thread was not in wait - state. - (ctrl_c_handler): add support for SIGIO signal. - * fhandler.cc (fhandler_base::linearize/delinearize): - save/restore async_ flag - (fhandler_base::fhandler_base): clear async_ flag - * fhandler.h: add async_ as new variable in fhandler_base, - add get_async/set_async functions - * misc.cc (tgetent): remove stub - * net.cc (fhandler_socket::write): raise SIGPIPE if write to - disconnected socket. - (cygwin32_accept): check the result of find_unused_handle() before - accept() call, set errno if no more file descriptors available. - (fhandler_socket::ioctl): add support for async I/O on sockets - * pinfo.cc (pinfo::clearout): clear sig_pending mask - * syscalls.cc (readv, writev): rewrite - * window.cc (WndProc): add support for async I/O - * winsup.h: define WM_ASYNCIO - -Mon Jun 9 18:51:09 1997 Geoffrey Noer - - * include/winsock.h: fix protection wrapper name - -Fri Jun 6 12:41:09 1997 Ian Lance Taylor - - * include/Windows32/Defines.h: Define CommonDlgExtendedError - return values (CDERR_*, PDERR_*, CFERR_*, FNERR_*). Define - TEXTMETRIC tmPitchAndFamily values (TMPF_*). - - * include/dlgs.h: New file; just includes windows.h. - * include/cderr.h: Likewise. - - * libcmain.cc (main): Don't pass the program name to WinMain. - - * cygwin.din: Export strlwr and strupr. - - * include/winreg.h: New file; just includes windows.h. - * include/winsock.h: New file; just includes windows.h and - Windows32/Sockets.h. - * include/Windows32/Sockets.h: Don't define u_char, et. al. if - _SYS_TYPES_H is defined. Undefine fd_set if it is defined. - - * include/Windows32/Functions.h: Define MoveMemory, FillMemory, - and ZeroMemory as macros. - - * times.cc (_timezone, _daylight, _tzname): New global variables. - (tzset): New function. - * cygwin.din: Don't set _timezone to timezone. Export tzset and - _tzset. Export _timezone, _daylight, and _tzname. - - * dcrt0.cc (__cygwin_environ): New global variable. - (dll_crt0_1): Set __cygwin_environ to environ. - * cygwin.din: Export __cygwin_environ. - -Thu Jun 5 17:52:02 1997 Ian Lance Taylor - - * times.cc (gettimeofday): Check return values and set tz_dsttime - correctly. - -Wed Jun 4 00:04:33 1997 Geoffrey Noer - - * fhandler.cc (fhandler_pipe::lseek): new virtual function - * fhandler.h: add lseek to fhandler_pipe class - -Tue Jun 3 19:20:47 1997 Ian Lance Taylor - - * include/Windows32/Defines.h (IMAGE_DOS_SIGNATURE): Define. - (IMAGE_NT_SIGNATURE): Define. - * include/Windows32/Structures.h (IMAGE_DOS_HEADER): Define. - -Tue Jun 3 13:05:26 1997 Geoffrey Noer - - * console.cc: respace - * fhandler.h: add virtual off_t lseek to fhandler_socket and - fhandler_tty defs, respacing - -Mon Jun 3 12:21:20 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * cygwin.din: export wait3, wait4 - * dcrt0.cc (_exit): call fill_rusage - * exceptions.cc (ctrl_c_handler): increment rusage_self.ru_nsignals++ - * fhandler.cc (fhandler_pipe::fhandler_pipe): new stub - * fhandler.h: add fhandler_pipe class - * hinfo.cc (hinfo_vec::build_fhandler): call - GetNumberOfConsoleInputEvents instead of GetConsoleScreenBufferInfo, - handle fhandler_pipe class - * pinfo.cc: include sys/resource.h, - (pinfo::clearout): erase memory associated with rusage_self - and rusage_children - * resource.cc (getrusage): rewrite - (add_timeval): new helper function - (add_rusage): new helper function - (fill_rusage): new helper function - * shared.cc (create_shared_fd_table): pass file mapping handle to - children letting them close it - * spawn.cc (spawn_guts): call fill_rusage and add_rusage as - appropriate - (cwait): ditto - * times.cc (__to_clock_t): add flag arg which says whether or not - to substract FACTOR from total - (times): also fill in tms_cstime and tms_cutime, add flag arg to - __to_clock_t calls - (totimeval): add extra flag passed on to __to_clock_t - (gettimeofday): add extra flag passed on to totimeval - * wait.cc (wait_for_single): add extra rusage arg, change - wait_found calls to account for extra arg - (wait_for_any): ditto - (_wait): call wait4 instead of waitpid - (wait_found): add rusage arg, deal with it calling add_rusage as - appropriate - (wait_pid): now just calls wait4 - (wait4): was wait_pid but adds extra rusage arg and deals with it - (wait3): new, calls wait4 - * winsup.h: include sys/resource.h, add rusage_self and - rusage_children to pinfo class, fix totimeval proto, add protos - for fill_rusage and add_rusage - * passwd.cc: include termios.h - (getpass): new - * stubs.cc (getpass): delete old stub - -Tue Jun 3 14:51:47 1997 Ian Lance Taylor - - * times.cc (ftime): New function. - * cygwin.din: Export ftime. - -Mon Jun 2 14:34:00 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * include/limits.h: NGROUPS_MAX should be 0 - * include/asm/socket.h: add missing additional options - including SO_SNDBUF, SO_RCVBUF, et al - * include/sys/wait.h: include sys/resource.h, add protos for - wait3() and wait4(). - -Mon Jun 2 15:26:35 1997 Ian Lance Taylor - - * utils/configure.in: Call AC_PROG_INSTALL. - * utils/configure: Rebuild. - -Mon Jun 2 11:44:14 1997 Geoffrey Noer - - * grp.cc (getgroups): new - * cygwin.din: export getgroups - -Fri May 30 16:47:38 1997 Geoffrey Noer - - * uname.cc (uname): completely rewrite, using more of the - SYSTEM_INFO struct to figure out information (now x86 type is - set correctly in Windows 95. - * version.h: increment CYGWIN_DLL_VERSION_MINOR - * include/Windows32/Structures.h: SYSTEM_INFO struct's first - member is dwOemId, not dwOemID according to MS docs - -Fri May 30 16:47:38 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * window.cc: new file - * Makefile.in: add window.cc to lists of source, object files, - and dependencies. - * console.cc: include , scroll_screen() added to - fhandler_console class, - add support for default screen attributes, - (open): set default_color on tty open - (linearize/delinearize): pass default_color to the child process - (clear_screen): fix Win95-specific bug, add support for - default_color. - (clear_to_eol): remove - (fhandler_console::fhandler_console): set default_color to - white on black - (char_command): add invisible screen attribute, misc changes - (FakeReadFile): do not convert AltGr-char to ESC-char sequence - to support international keyboards. - * cygwin.din: export setitimer, getitimer - * dcrt0.cc (dll_crt0_1): add call to window_init(), uppercase - environment vars only if started by a win32 process. - (_exit): add call to window_terminate() - * fhandler.cc: add mode argument to open() calls, - (fhandler_base::open): do not check for symlink in path_conv - calls, calls to set/get_file_attribute() instead of NTRead/WriteEA. - (fhandler_base::fstat): use get_file_attribute if possible - (fhandler_disk_file::open): remove unneeded unixattr checks - * fhandler.h: changes to support above. - * fork.cc (cygwin_fork_helper_1): pass umask value to the child, - call window_init() in child - * ntea.cc: enable EA calls, add FILE_FLAG_BACKUP_SEMANTICS - to CreateFile calls to support EA of directories. - * path.cc (symlink): add mode argument to _open call, remove - unneeded stuff - (symlink_check_worker): add checks for "system" attribute and EA. - * security.cc (get/set_file_attribute): new. Calls EA code now, - placeholders for NTFS security support. - * signal.cc (alarm): remove in favor of new implementation in - window.cc - (RemoteThread): remove - (_kill): use window messages to emulate signals on both NT and Win95 - * spawn.cc (spawn_guts): call window_terminate on exec() - (cwait): correct return result code - (_spawnve): add umask inheritance, some bug fixes - * syscalls.cc (_open): add mode argument, umask support - (umask): rewritten - (chmod): try to set file attributes, set system bit on symlinks - (stat_worker): fix nlinks of directories, add mode argument - to _open() call. - * syscalls.h: add mode argument to _open() prototype - * winsup.h: changes to support above - -Tue May 27 12:22:19 1997 Geoffrey Noer - - * times.cc (gettimeofday): return 0 on success instead of 1 - (utimes): init res to 0 - -Wed May 21 11:29:24 1997 Geoffrey Noer - - * include/limits.h: define NGROUPS_MAX - -Tue May 20 14:13:59 1997 Geoffrey Noer - - * passwd.cc: rename function setpwend to setpwent (typo) - * cygwin.din: ditto, also remove name__C9type_info from - exports list. - -Wed May 14 17:38:39 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * signal.cc (sleep): call WaitForSingleObject instead of Sleep - (usleep): ditto - -Wed May 7 15:34:07 1997 Geoffrey Noer - - Public gnu-win32 beta 18 release made - -Sun May 4 15:34:07 1997 Geoffrey Noer - - patch from Mikey : - * console.cc (FakeReadFile): FlushConsoleInputBuffer if - flags & ENABLE_LINE_INPUT and then return ReadFile - -Fri May 2 10:53:10 1997 Geoffrey Noer - - * signal.cc: make exported functions extern "C" - * include/cygwin32/socket.h: replace values assigned to - IP_ definitions with ones suitable for use with WinSock. - * cygwin.din: add exports for sigpending, sigsuspend, remove - exports for __9type_infoPCc and before__9type_infoRC9type_info - * winsup.h: remove signal-related protos from winsup.h in favor - of newlib/libc/include/sys/signal.h - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * signal.cc: (sigpending) new - (sigsuspend): new - * utils/termcap: replace with one from Linux - -Tue Apr 29 19:03:29 1997 Geoffrey Noer - - * utils/ps.cc: print Win32 pid as unsigned int so Windows 95 - pids don't show up as negative values - -Tue Apr 29 17:20:57 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * spawn.cc (spawn_guts): allocate new cygwin PID for a child - created with spawn(!_P_OVERLAY) - -Tue Apr 29 13:24:59 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * console.cc: assorted console fixes - * select.cc (fd_socket_map::convert_to_unix_fdset): only - do full debug_printf if used_ valid - * exceptions.cc: correct constants used for checking size of - stack (should be negated) - * fhandler.cc (fhandler_base::open): fix syscall_printf typo - - patch from marcus@cathcart.sysc.pdx.edu (Marcus Daniels): - * include/sys/mman.h: define MAP_ANON MAP_ANONYMOUS (typo fix) - -Mon Apr 28 15:19:44 1997 Geoffrey Noer - - * cygwin.din: remove libgcc2.a internal functions - -Mon Apr 28 14:57:04 1997 Michael Meissner - - * cygwin.din (before__9type_infoRC9type_info): Remove, the - type_info::before(type_info const &) function no longer seems to - exist. - -Mon Apr 28 14:19:44 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * console.cc (undo_input): new - (scroll_screen): new - (fhandler_console::output_tcsetattr): fix debug printf - (fhandler_console::input_tcsetattr): no longer call set_w_binary - (fhandler_console::cursor_get): fix base_chars - (fhandler_console::char_command): make savex, savey globals, - add char buf, add code to handle clears better, many other - additions - (fhandler_console::write_normal): assorted fixes - (fhandler_console::write): move screen scroll code to - scroll_screen(), support Reset Linux terminal, Restore cursor - position, Save cursor position, Skip orig_colors - (FakeReadFile): enlarge keytable to include shift/control/alt - values - Command set still missing set pelette, character sets, and - UTF codes. - -Mon Apr 28 12:19:44 1997 Geoffrey Noer - - * fhandler.cc (fhandler_base::open): only include - FILE_SHARE_DELETE in shared when running NT (Win 95 doesn't - support it). - -Thu Apr 24 18:57:21 1997 Geoffrey Noer - - patch from Jeremy Allison : - Correct problem caused by setting /dev/null fd to -1 which is - same as INVALID_HANDLE_VALUE. - * fhandler.h: set DEV_NULL_HANDLE_VALUE to -2 - * fhandler.cc (fhandler_dev_null::open): set handle to - DEV_NULL_HANDLE_VALUE instead of INVALID_HANDLE_VALUE - * hinfo.cc (hinfo_vec::build_fhandler): add case for - handle == (HANDLE) DEV_NULL_HANDLE_VALUE - -Thu Apr 24 15:12:13 1997 Geoffrey Noer - - * fhandler.cc (fhandler_base::write): catch return of raw_write - and return -1 if it failed - -Thu Apr 24 10:42:01 1997 Geoffrey Noer - - path.cc (symlink): restore chmod call for now since the NTEA code - isn't quite up to the task yet. - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * exceptions.cc (ctrl_c_handler): corrections to Apr 18 patch - * fhandler.cc: ditto - * dcrt0.cc (dll_crt0_1): move console title setting code, - set up default signal handlers - * fork.cc (cygwin_fork_helper1): also set child->sigs and - child->sig_mask - * spawn.cc (spawn_guts): if mode _P_OVERLAY, set up child - signal handlers. - -Mon Apr 21 22:29:49 1997 Geoffrey Noer - - * include/Windows32/ASCIIFunctions.h: remove old def of - GetEnvironmentStringsA, add new one based on def from Functions.h - * include/Windows32/Functions.h: define GetEnvironmentStrings as - GetEnvironmentStringsA when not unicode, remove definition of - GetEnvironmentStrings in favor of ones in ASCIIFunctions.h and - UnicodeFunctions.h - * include/Windows32/Defines.h: add missing XTYP_ definitions, - change value of XTYPF_NOBLOCK to 0x0002 from 0x2 - * include/Windows32/Sockets.h: comment out redefinitions of - errno.h-type constants since MS doesn't define them and we - have our own in errno.h - -Fri Apr 18 10:40:30 1997 Geoffrey Noer - - * include/Windows32/Structures.h: add typedefs for - LPDLGITEMTEMPLATE, PDLGITEMTEMPLATE. - * include/Windows32/Defines.h: define FW_REGULAR FW_NORMAL - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * exceptions.cc (ctrl_c_handler): do not reset signal - handler to SIG_DFL while processing the signal, instead - block the signal while handler executes. - * signal.cc (_raise): fixes related to the above - -Thu Apr 17 23:50:50 1997 Geoffrey Noer - - * path.h: increase path length in mount table to MAX_PATH - in size instad of 30. This will increase cygwin.dll memory - usage by 20K. We need to remove static allocations from - path code. - -Thu Apr 17 10:11:50 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * exceptions.cc (ctrl_c_handler): CTRL_CLOSE_EVENT should - generate SIGHUP instead of SIGQUIT - * signal.cc (_raise): rewrite - -Wed Apr 16 10:42:46 1997 Geoffrey Noer - - * version.h: increment CYGWIN_DLL_VERSION_MINOR - * syscalls.cc (system): use spawnvp instead of fork/exec - * ntea.cc: make all functions return false for now; they - were causing an obscene performance hit - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * console.cc (FakeReadFile): patch to support EINTR, EIO - * exceptions.cc: add support for return_handler, remove - control-C counter - (return_handler): new - (ctrl_c_handler): handle SIGCHLD, other assorted fixes - * fhandler.cc (fstat): reset errno to 0 - * passwd.cc (search_for): correct location of a debug printf - * select.cc: patches to handle signals better, respacing - * signal.cc (_raise): misc fixes - (_kill): call OpenProcess with PROCESS_ALL_ACCESS instead of - PROCESS_TERMINATE - * spawn.cc: more signal fixes - * syscalls.cc: add two new errors to errmap[] - (_stat_worker): fill out buf struct when stating directories - * wait.cc (wait_for_single): use INFINITE instead of large value - for timeouts - (wait_for_any): init nprocinfo to 1, not 0, other small fixes - * winsup.h: add signal_arrived to per_process class, reduce - amount of reserved space, add sig_pending to pinfo class - -Tue Apr 15 17:01:34 1997 Geoffrey Noer - - * utils/mkpasswd.c: change default shell to /bin/sh - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * utils/kill.cc: support sending numbered signals using - signal code instead of just calling TerminateProcess - -Tue Apr 15 15:24:55 1997 Ian Lance Taylor - - * utils/Makefile.in (INSTALL): Set to @INSTALL@. - (INSTALL_PROGRAM): Set to @INSTALL_PROGRAM@. - (INSTALL_DATA): Set to @INSTALL_DATA@. - (INSTALL_XFORM): Remove. - (install): Depend upon installdirs. Use $(program_transform_name) - directly, rather than using $(INSTALL_XFORM). - (installdirs): New target. - -Mon Apr 14 16:32:05 1997 Ian Lance Taylor - - * utils/Makefile.in (INSTALL): Change install.sh to install-sh. - -Mon Apr 14 12:33:22 1997 Geoffrey Noer - - * registry.cc: change key name to "Cygnus Solutions" instead - of "Cygnus Support" - * security.cc: don't include windows.h, already in winsup.h - * Makefile.in: add dependencies section entries for security.cc - and ntea.cc - -Fri Apr 11 00:03:49 1997 Geoffrey Noer - - * dcrt0.cc: add harmless cast to FreeEnvironmentStrings call - * registry.cc: added more presumed-harmless casts - * shared.cc: and another, and respacing - * utils/Makefile.in: don't need to link with -lkernel32 since it's - included automatically - * fhandler.cc: fhandler_console and FakeReadFile moved to - console.cc, stop including sys/stat.h, sys/param.h, sys/types.h, - stdio.h, ctype.h, pwd.h, grp.h, stdlib.h - reordered/respaced code so now we have all of fhandler_base, then - all of fhandler_disk_file, then all of fhandler_tty, etc... - (fhandler_base::ioctl): delete unused switch statement - * console.cc: added fhandler_console and FakeReadFile from - fhandler.cc, add includes necessary for this code - * grp.cc, Makefile.in: fix copyright dates - * ntea.cc: include string.h - -Thu Apr 10 22:00:43 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * path.cc (symlink): do NTWriteEA instead of chmod using same - flags - -Thu Apr 10 17:36:43 1997 Geoffrey Noer - - patch from gunther.ebert@ixos-leipzig.de (Gunther Ebert): - * Makefile.in: add libnetapi32.a to DLL_IMPORTS list, build security.o - * fhandler.cc (get_file_owner): new - (get_file_group): new - (fhandler_base::fstat): do another path_conv and check for error, - use get_file_owner and get_file_group to set buf->st_uid and - buf->st_gid - * fhandler.h: add protos for get_file_owner() and get_file_group() - * grp.cc (add_grp_line): new helper function - (read_etc_group): new helper function - (getgrgid): rewritten, no longer a stub - (getgrnam): rewritten, no longer a stub - (endgrent): rewritten, no longer a stub - (getgrent): rewritten, no longer a stub - * include/Windows32/ASCIIFunctions.h, include/Windows32/Base.h, - include/Windows32/Functions.h, include/Windows32/Defines.h, - include/Windows32/Structures.h, include/Windows32/UnicodeFunctions.h: - misc security/uid-related additions - * passwd.cc (add_pwd_line): new - (read_etc_passwd): new - (search_for): rewrite - (setpwend): rewritten, no longer a stub - (getpwent): rewritten, no longer a stub - (endpwent): rewritten, no longer a stub - * security.cc: new file - (get_world_sid): new - (world_full_access): new - (get_id_from_sid): new - (is_nt): new - * stubs.cc (endgrent): remove - (getgrent): remove - * syscalls.cc (rel2abssd): new - (set_process_privileges): new - (chown): now implemented for real for NT, still a stub in Win95 - (_stat_worker): use get_file_owner and get_file_group to set - buf->st_uid and buf->st_gid - * uinfo.cc: add protos for read_etc_passwd, read_etc_group - (uinfo_init): call read_etc_passwd(), read_etc_group() - * utils/Makefile.in: build mkpasswd, mkgroup - * utils/mkgroup.c: new, use to make an /etc/group file - * utils/mkpasswd.c: new, use to make an /etc/passwd file - * winsup.h: add protos for is_nt(), get_id_from_sid() - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * Makefile.in: build ntea.o - * dcrt0.cc (dll_crt0_1): move console title code here from spawn_guts - * exceptions.cc (ctrl_c_handler): small signal fixes, prepare - things so we can eventually reset the signal handler to SIG_DFL - * fhandler.cc (fhandler_disk_file::open): first check for EA info - about exec/symlink status before doing it the hard way - (fhandler_make_pipe): u->self->hmap.build_fhandler takes extra arg - (fhandler_base::open): make use of NTEA - * fhandler.h: remove init_std_file_from_handle, build_fhandler - protos - * hinfo.cc: include mywinsock.h and sys/socket.h, define - __INSIDE_CYGWIN_NET__, __INSIDE_CYGWIN32__ - (hinfo_vec::build_fhandler): takes an additional handle arg, - call GetConsoleScreenBufferInfo with it to see if are - fhandler_console, call GetCommState with it to see if we're - an fhandler_tty, call getpeername with it to see if we wamt - fhandler_socket. Old determining methods still work too. - * path.cc (symlink): chmod file to ((S_IFLNK) | (STD_RBITS) | - (STD_WBITS) | (STD_XBITS)) permissions - * select.cc: include stdio.h - (cygwin32_select): fix typo (missing an &), - assorted fixes for mixed socket/handles case - * shared.cc (create_shared_fd_table): set sa.bInheritHandle to 1 - to support reparenting - * signal.cc (_kill): add FIXME, cleanup return codes - * spawn.cc (spawn_guts): remove console title code, add code - to support reparenting of child processes - * syscalls.cc: add new third arg to hmap.build_fhandler calls - (chmod): make use of NTWriteEA - * ntea.cc: new file, NTEA handling routines - * times.cc: fix value of NSPERSEC - (utimes): fix return value - * wait.cc: changes to support reparenting, change INFINITE to - constant 500 to avoid "blocking win32 syscalls and signals" - problem - * winsup.h: add NTReadEA, NTWriteEA protos, define REPARENTING, - fix build_fhandler proto to add new arg, add handles hrProcess and - hrThread - -Tue Apr 9 00:25:33 1997 Geoffrey Noer - - * libcerr.cc: remove fixed size of sys_errlist array, figure out - sys_nerr from the sizeof the array rather than hard coding it. - * shared.cc (open_shared_file_map): add typecast - * signal.cc (_kill): SIGKILL should avoid exception handler - * fork.cc (cygwin_fork_helper1): don't call ExitProcess with a - negative arg on recreate_mmaps_after_fork failure - * include/Windows32/Defines.h: define VER_PLATFORM_WIN32_WINDOWS - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * dcrt0.cc: move reent_data from private address space to cygwin.dll - * fork.cc: copy parent's reent_data to the child - * cygwin.din: export reent_data - * winsup.h: add as public struct _reent reent_save to pinfo class - - another patch from sos@prospect.com.ru (Sergey Okhapkin): - * winsup.h: add ctrl_c_handler prototype - * exceptions.cc (init_exceptions): don't use u->self->hThread - since for a spawned process, this contains thread id of parent - Win32 process, not the child's. Instead use GetCurrent* funcs - to get thread handle. - (ctrl_c_handler): add more signal support, especially for kill - * signal.cc (_kill): more signal support, using CreateRemoteThread - under NT. Win95 only supports SIGKILL since it doesn't have this - call. - * syscalls.cc (windows_95): first version check should be an & - of 0x80000000 instead of 0x8000000 - (close_all_files): hmap[i] doesn't always exist, for now comment - out code - - patch from marcus@sysc.pdx.edu (Marcus Daniels): - * path.cc (skip_n_slashes): new local function - (symlink_check_worker): new local function, used to be symlink_check - (symlink_check): calls symlink_check_worker and returns - whether path is a symlink or not. - (symlink_expand): new local function, expand a symlink into - a file or directory path using symlink_check_worker - (path_conv::path_conv): takes extra follow_mode arg - (symlink_follow): call symlink_expand - * fhandler.cc, syscalls.cc: fix path_conv references - * path.h: fix path_conv prototype - -Mon Mar 24 19:44:28 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * select.cc: fix Feb 19 patch to select - * syscalls.cc: add statfs() and fstatfs() calls - * include/sys/vfs.h: new header file to support these - * cygwin.din: add them to dll export list - -Tue Mar 18 18:10:24 1997 Geoffrey Noer - - * dcrt0.cc: change idata3 asm section to have five null fields - instead of eight to conform to how MS does this section. - -Sun Mar 9 13:10:55 1997 Geoffrey Noer - - * include/sys/resource.h: add missing struct members to rusage struct - * resource.cc: added setting of missing fields, mostly to 0 until - we investigate how to set correct values. - -Wed Feb 19 17:44:06 1997 Jeremy Allison - - * select.cc: Added fixes from sos@prospect.com.ru (Sergey Okhapkin) - to implement blocking select on sockets/handles. This isn't - the way I finally want to do this, but I won't get chance - to do the re-write for a month or two so... - * include/Windows32/Defines.h: Added defines for NT ACL - stuff. - -Tue Feb 18 12:28:11 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * fhandler.cc: support reverse index escapes in console code - -Fri Feb 14 18:55:01 1997 Jeremy Allison - - * path.cc: Fixed normalize_posix_path() so that double slashes - are removed, except for those starting a UNC path. The command - ls .///////FILE_IN_DIRECTORY works now. - -Thu Feb 13 14:06:04 1997 Geoffrey Noer - - * path.cc: remove SLASH_P define and - * winsup.h: define it here instead - patch from scottk@utig.ig.utexas.edu (Scott Kempf): - dirsearch.cc (opendir): fix problem with accessing "/" - -Mon Feb 10 13:57:11 1997 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * misc.cc: replace nice () stub with Win32 implementation - * spawn.cc - * fork.cc: use priority returned by GetPriorityClass - -Wed Feb 5 16:56:23 1997 Geoffrey Noer - - * fhandler.cc, syscalls.cc: minor reformat - patch from sos@prospect.com.ru (Sergey Okhapkin): - * spawn.cc: set console title to reflect what's running - * winsup.h: TITLESIZE define added - -Mon Feb 3 16:53:10 1997 Geoffrey Noer - - * fhandler.h: fix typo - * fhandler.cc: check_execable_p should only take one arg now - -Mon Feb 3 16:16:39 1997 Jeremy Allison - - * fhandler.cc: Removed open_helper, turned it into - fhandler_base::open and added fhandler_disk_file::open. More - correct C++. - fhandler_disk_file: Moved check_execable_p into fhandler_disk_file. - tty ports are now closed correctly. - * fhandler.h: Changes to support the above. - -Fri Jan 31 19:14:34 1997 Geoffrey Noer - - * fhandler.cc (fhandler_base::open_helper): new function - containing the common open() code. symlink and executable - status defaults to 0. - (fhandler_tty::open): new function that calls - fhandler_base::open_helper - (fhandler_base::open): remove common code now in open_helper, - leaving symlink checking and executable checking - * fhandler.h: changes for the above, open_helper is protected - -Thu Jan 30 15:23:15 1997 Geoffrey Noer - - * hinfo.cc: also treat com3 and com4 as special files - * spawn.cc (spawn_guts): check return of WaitForSingleObject - in _P_WAIT case, some reformatting - -Tue Jan 28 10:46:16 1997 Jeremy Allison - - * net.cc: Added errors "WSAEINVAL", "WSAEFAULT" as these - can be returned for net calls. - * fhandler.cc: Added FILE_SHARE_DELETE to open share modes. - Much closer to POSIX on NT now (ignored on '95). - -Fri Jan 17 13:32:26 1997 Geoffrey Noer - - * configure.in: - * utils/configure.in: define LIB_AC_PROG_CC to get around - autoconf 1.12 problem. Invoke it instead of AC_PROG_CC. - * configure: - * utils/configure: regenerate - -Thu Jan 16 12:35:41 1997 Geoffrey Noer - - * mmap.cc: added missing copyright notice - -Tue Jan 14 12:51:12 1997 Jeremy Allison - - * cygwin.din: Added get_osfhandle, cwait and all the - spawn functions. - * exec.cc: Added include of process.h. Changed call to - spawn_guts to add extra parameter. - * libcerr.cc: Added extra error messages. Ensured - messages start at zero. - * spawn.cc: Changed spawn_guts to do wait and nowait - calls. Added all spawn functions. - * syscalls.cc: Added get_osfhandle. - * winsup.h: Removed incorrect spawn definitions, - corrected prototypes for spawn_guts and file_exists - calls. - * include/io.h: New file. Added for get_osfhandle. - -Thu Jan 9 14:20:01 1997 Jeremy Allison - - * exceptions.h: Moved from winsup to winsup/include. - * include/mywinsock.h: Added getprotobynumber and - getservbyport. - * Makefile.in: Moved exceptions.h dependency. - * cygwin.din: Added cygwin32_getprotobynumber and - cygwin32_getservbyport. - * net.cc: Added cygwin32_getprotobynumber and - cygwin32_getservbyport. - -Wed Jan 8 14:15:35 1997 Jeremy Allison - - * fhandler.cc: Fix from Scott Kempf (scottk@rimu.ig.utexas.edu) - to ensure creation_disposition is set correctly in open. - -Fri Jan 3 12:10:22 1997 Jeremy Allison - - * fork.cc: Added parameter to recreate_mmaps_after_fork - in child, and added set_child_mmap_ptr() call in parent. - Needed as cygwin.dll statics are not copied accros a fork. - * mmap.cc: Added parameter to recreate_mmaps_after_fork, - added set_child_mmap_ptr() call. - * winsup.h: Added mmap_ptr to pinfo struct. Removed obsolete - comments. - * Makefile.in: Added -I../libio, needed to rebuild source - using STL. Also added -nostdinc++ on recommendation of - Mike Stump (mrs@cygnus.com). - -Thu Jan 2 17:23:10 1997 Jeremy Allison - - * dcrt0.cc: Added a call to initialize winsock on app - init. - * fork.cc: Added call so child initializes winsock before - returning from the fork. This makes many network daemons - run correctly that did not before (apache soon...). - * net.cc: Removed calls to checkinit, this is now done on - app startup. Renamed checkinit to socket_checkinit and - removed static scope. - * winsup.h: Added prototype for socket_checkinit(). - -Thu Jan 2 12:25:06 1997 Jeremy Allison - - * dcrt0.cc (api_fatal): Check that u and u->self are - not zero before indirecting through them. - * fork.cc: Changed security descriptor for fork - mutexes to allow access by all. - * pinfo.cc: Changed security descriptor for shared - area to allow access by all. - * shared.cc: Added get_null_sd() call to return - security descriptor allowing access by all. Needed - when a cygwin32 service is running and also interactive - cygwin32 apps by the current logged in user. - * winsup.h: Added prototype for get_null_sd(). diff --git a/winsup/cygwin/ChangeLog-1998 b/winsup/cygwin/ChangeLog-1998 deleted file mode 100644 index aa657e01e..000000000 --- a/winsup/cygwin/ChangeLog-1998 +++ /dev/null @@ -1,4490 +0,0 @@ -Thu Dec 31 16:50:32 1998 DJ Delorie - - * mmap.cc: replaced all references to libstdc++ templates with - inline classes to remove build dependency on libstdc++ - -Thu Dec 31 00:02:40 1998 Geoffrey Noer - - * sysdef/uuid.def: remove useless stub. - * sysdef/oldnames.def: ditto. - * sysdef/largeint.def: ditto. - * sysdef/rpcndr.def: ditto. - -Wed Dec 30 20:33:09 1998 Geoffrey Noer - - * utils/cygcheck.cc: clean up misc. warnings relating to - signed vs. unsigned, char * vs. const char *, etc... - -Wed Dec 30 21:41:25 1998 Christopher Faylor - - * dcrt0.cc (do_exit): Remove previous dwProcessId - change as it presumes too much knowledge about signalling - in the wrong place in the code. - * sigproc.cc (sigproc_terminate): Move the dwProcessId - assignment here but only do it when it is necessary or - programs will die abnormally. - * fhandler.h: Add raw_write method to fhandler_serial. - * fhandler_serial.cc (raw_write): New method. Accommodates - overlapped I/O that now must be used with serial. - * utils/kill.cc (main): Allow `0' signal. Just checks - for existence of process. - -Wed Dec 30 00:01:18 1998 Geoffrey Noer - - * include/cygwin/version.h: bump API_MINOR to 8 to mark - recently exported _ctype_, _sys_errlist, _sys_nerr. Briefly - describe all API_MINOR changes to date. - -Wed Dec 30 01:31:34 1998 Christopher Faylor - - * dcrt0.cc (do_exit): Set myself->dwProcessId so that - some exit routines will not falsely believe that this - process has been execed. - * select.cc (peek_serial): Remove debugging statements. - * sigproc.cc (sigproc_terminate): Detect state where - myself->dwProcessId == 0 as indicative of not being - an exec stub. - -Tue Dec 29 21:13:33 1998 Christopher Faylor - - * dcrt0.cc (alloc_stack_hard_way): Fix a couple of thinkos - in calculating size of the new stack. Just use the size - passed from the parent. - (dll_crt0_1): Set up new frame pointers here, if appropriate. - * fork.cc (fork): Move frame pointer setup into dll_crt0_1. - -Tue Dec 29 12:57:38 1998 Geoffrey Noer - - * utils/mkpasswd.c: Include wchar.h. - * utils/mkgroup.c: Ditto. - -Tue Dec 29 12:53:23 1998 Geoffrey Noer - - * Makefile.in: remove dep for libcerr.o - -Mon Dec 28 22:02:15 1998 Christopher Faylor - - * fhandler.h: Make fhandler_serial io_status public since - select needs it. Add 'saw_error' field to select_record so - that select can detect error conditions. - * fhandler_serial.cc (fhandler_serial::raw_read): Detect - "operation aborted" error and retry. This seems to indicate - an attempt to retry an overlapped operation. - * select.cc (select_stuff::wait): Honor saw_error field when - appropriate. - (peek_serial): Rewrite to operate similarly to - fhandler_serial::raw_read. - * include/sys/termios.h: CBAUD mask was still not right. - -Mon Dec 28 09:09:27 1998 Christopher Faylor - - * libcerr.cc: Make obsolete. Move into errno.cc - * libctype.c: Make obsolete. Use newlib table. - * Makefile.in: Remove obsolete entries from LIBCOS. Define - __INSIDE_CYGWIN__ explicitly for .c -> .o compilation. - * cygwin.din: New exports: _ctype_, _sys_errlist, _sys_nerr. - * errno.cc: Move _sys_errlist and _sys_nerr here. - * dlfcn.cc: Reorganize includes to put ctype.h after winsup.h - so that __INSIDE_CYGWIN__ will be defined for use in ctype.h. - * fhandler_console.cc: Ditto. - * fhandler_tty.cc: Ditto. - * path.cc: Ditto. - * spawn.cc: Ditto. - -Sat Dec 26 00:20:48 1998 Christopher Faylor - - patch from Corinna Vinschen : - * include/Windows32/CommonFunction.h: Added proto for - NetUserChangePassword(). - -Thu Dec 24 16:15:40 1998 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Add more debugging output. - * ioctl.cc (ioctl): Can't use TC[GS]ET ioctls for pty master as - it conflicts with TIOCPKT. - * passwd.cc (passwd): Bypass tc[gs]etattr call in favor of appropriate - method or conversion confusion will result due to attempts to - appropriately convert to old-style termios structures in tc[gs]etattr. - * strace.cc (strace_vsprintf): Define t explicitly. - * termios.cc (tcsetattr): Reorganize to allow meaningful debugging - output. - (tcgetattr): Ditto. - -Wed Dec 23 15:02:11 1998 Christopher Faylor - - * winsup.h: Reorganize include order to allow thread-safe build. - -Wed Dec 23 11:45:33 1998 DJ Delorie - - * strace.cc (strace_microseconds): new function; returns elapsed - time in microseconds, using performance counters if available. - (strace_vsprintf): print timestamps and deltas as microseconds, - not seconds. - -Wed Dec 23 11:35:02 1998 DJ Delorie - - * times.cc (__to_clock_t): Change return value to unsigned long - long to prevent overflow. - -Tue Dec 22 19:37:55 1998 Christopher Faylor - - * fhandler.h: Reflect fhandler_*::init argument reordering. - Add dup and init methods to fhandler_serial. - * fhandler.cc (fhandler_base::init): Reorder arguments to mirror - open(). - * fhandler_console.cc (fhandler_console::init): Ditto. Initialize - using fhandler_base rather than fhandler_serial as console is - now being slowly uncouple from fhandler_serial. - * fhandler_serial.cc (fhandler_serial::fhandler_serial): Set size - of data structure or suffer strange behavior on exec(). - (raw_read): Add debugging output. - (fhandler_serial::init): New method. - (fhandler_serial::open): Detect call from init method and avoid - calling fhandler_base::open. Don't worry about non-blocking reads - since they are now handled correctly by _read(). - (fhandler_serial::tcsetattr): Honor ICANON in a kludgey sort of way. - (fhandler_serial::tcgetattr): Ditto. - (fhandler_serial::dup): New method. Ensures duplication of all - elements of fhandler_serial class. - * fhandler_tty.cc (fhandler_tty_master::init): Reflect init argument - reordering. - (fhandler_tty_slave::init): Ditto. - * hinfo.cc (hinfo::init_std_file_from_handle): Remove unnecessary - argument. - (hinfo_init): Reflect change to init_std_file_from_handle. - (cygwin_attach_handle_to_fd): Use more appropriate types for - arguments. - (hinfo::build_fhandler): Add some slop to allocated buffer just - for paranoia's sake. - (hinfo::dup2): Avoid dereferencing a NULL pointer when oldfd==newfd. - * pipe.cc (make_pipe): Reflect init argument change. - * shared.h: Another immigrant from winsup.h - * winsup.h: Reflect change to init_std_file_from_handle. Relocate - a declaration to shared.h so that it can be used in fhandler.h. - * include/sys/cygwin.h: Reflect change to cygwin_attach_handle_to_fd. - -Mon Dec 21 16:22:48 1998 Christopher Faylor - - * fhandler.cc (fhandler_base::open): Detect serial device as a special - case requiring an overlapped open. - * fhandler.h (fhandler_serial): Add several methods. Add new 'fixup after - fork required' field. - * fhandler_serial.cc (raw_read): Rewrite to come closer to handling VMIN - VTIME parameters and to allow EINTR. - (fhandler_serial::open): Initialize overlapped event here. Make error - messages more explicit. - (fhandler_serial::close): Close status event. - (fhandler_serial::tcsetattr): Store vtime_ as milliseconds. Attempt to - handle VMIN > 0, VTIME == 0 better. - (fhandler_serial::fixup_after_fork): Initialize a new event handle after - a fork. - (fhandler_serial::de_linearize): Ditto. - * hinfo.cc (hinfo::fixup_after_fork): Call fork fixer upper if close_on_exec - of need_fork_fixup set. - -Sun Dec 20 16:05:25 1998 Geoffrey Noer - - * include/shellapi.h: replace with stub that includes windows.h - like similar headers already do. - * scandir.cc (scandir): add parens around assignment used as truth - value. - -Sat Dec 19 00:42:44 1998 Christopher Faylor - - * thread.cc: Fix copyright info. - * thread.h: Ditto. - * libcmain.cc: gcc is now more picky about requiring a type - for main(), so add one. - * include/pthread.h: Add attribution for net contributor. - -Fri Dec 18 19:21:30 1998 Geoffrey Noer - - * pthread.cc: fix copyright header. - * shared.h: ditto. - -Fri Dec 18 19:21:30 1998 Geoffrey Noer - - patch from Corinna Vinschen : - * cygwin.din: export scandir and alphasort. - * Makefile.in: add scandir.o to deps - * scandir.cc: New file with scandir and alphasort implementations. - * include/cygwin/version.h: bump API_MINOR to 7. - -Fri Dec 18 16:44:07 1998 Geoffrey Noer - - * include/pthread.h: clean up, remove C++-style comments, - remove pthread_getsequence_np proto. - -Fri Dec 18 15:26:33 1998 Christopher Faylor - - Throughout, prepend cygwin_ to functions that are exported - as cygwin_* which previously needed to be aliased. - - * path.cc (cygwin_conv_to_win32_path): Resolve symbolic links. - Return success or failure value. - (cygwin_conv_to_full_win32_path): Ditto. - (cygwin_conv_to_posix_path): Return success or failure value. - (cygwin_win32_to_posix_path_list): Ditto. - (cygwin_posix_to_win32_path_list): Ditto. - * shared.h: New include file that incorporates parts of - winsup.h, fhandler_tty.h, path.h, and delqueue.h. - * Makefile.in: Remove old include files. - * cygwin.din: cygwin_* aliases are no longer required. - * libccrt0.cc: Store api_minor in per_process structure. - * select.cc: Change meaning of second argument to ready_for_read - to indicate whether read_ahead should be ignored. - * fhandler.h: Reflect change in second argument to ready_for_read. - * syscalls.cc (_read): Ditto. - * termios.cc: Throughout, detect attempt to use old style termios - structure and convert as appropriate. - * ioctl.cc (ioctl): Detect use of ioctl requiring termios field - and call appropriate tc[gs]et* function to handle it. - * fhandler_console.cc (fhandler_console::ioctl): Remove TC* calls - that are now handled in main ioctl. - * fhandler_tty.cc (fhandler_tty_slave::ioctl): Ditto. - * include/cygwin/version.h: Added TERMIOS defines. Bump API_MINOR - to 6. - * include/sys/cygwin.h: Reflect change in return value for some - cygwin_conv_* calls. - * include/sys/termios.h: Reformat slightly. Add conversion macros - for dealing with old style termios structure. - * include/pthread.h: add - -Fri Dec 18 15:03:33 1998 Christopher Faylor - - * Makefile.in: Cleanup pthread usage. - -Fri Dec 18 14:35:59 1998 Christopher Faylor - - * Makefile.in: Remove obsolete header dependency for - thread-safe build. - -Fri Dec 18 14:16:04 1998 Christopher Faylor - - * exceptions.cc (sig_handle): Avoid suspending top-level - processes. - * trace.cc: Remove unneeded include. - -Thu Dec 17 19:19:53 1998 Geoffrey Noer - - * cygwin.din: remove pthread_getsequence_np, _reent_clib - -Thu Dec 17 16:48:15 1998 Geoffrey Noer - - * include/cygwin/version.h: correct two typos in comments - -Thu Dec 17 19:11:31 1998 Christopher Faylor - - patch from Corinna Vinschen : - * include/Windows32/Defines.h: Add values for using Windows - function `DeviceIoControl()'. - -Thu Dec 17 18:00:34 1998 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): exception_list is not a struct. - * debug.cc (thread_stub): Ditto. - -Thu Dec 17 08:24:37 1998 Christopher Faylor - - * cygwin.din: Remove leading underscores from pthread functions. - * include/cygwin/version.h: Bump DLL major version to 21, DLL minor - version to 0, and API_MINOR to 5. - -Wed Dec 16 22:54:16 1998 Christopher Faylor - - Merge in thread-safe branch changes. - -Wed Dec 16 22:54:16 1998 Christopher Faylor - - * pthread.cc: Include winsup.h. - -Wed Dec 16 22:54:16 1998 Christopher Faylor - - * thread.cc: Reformat. - * pthread.cc: New file. - * cygwin.din: Add pthread interface functions - -Wed Dec 16 22:54:16 1998 Christopher Faylor - - * configure.in: Add some --enable options. - * configure: Regenerate. - * Makefile.in: Reorganize CFLAGS to recognize new --enable options. - -Wed Dec 16 22:54:16 1998 Christopher Faylor - - * fork.cc (stack_base): Store slightly different information - in child_info_fork structure for later use in alloc_stack_hard_way. - (fork): Set frame pointer information if stack has been reallocated. - * dcrt0.cc (alloc_stack_hard_way): Reflect change in - child_info_fork structure. - (dll_crt0_1): Make thread initializers "static" and NO_COPY or death - of the main thread causes death of other threads. - * winsup.h (child_info_fork): Change structure. - -Wed Dec 16 22:54:16 1998 Christopher Faylor - - * thread.h: Remove extraneous declaration. - * include/sys/strace.h: Make a new thread_printf function - for use by new thread-safe code. - * thread.cc: Use thread_printf throughout. - -Wed Dec 16 22:54:16 1998 Christopher Faylor - - patch from Marco Fuykschot (marco@ddi.nl) - * Throughout sources add locking control for preliminary - thread-safe cygwin operation. - -Wed Dec 16 22:54:16 1998 Christopher Faylor - - * dcrt0.cc (getprogname): Should be a static. - (alloc_stack): Extend to allow forking from another - thread. - (alloc_stack_hard_way): New function used by alloc_stack. - (dll_crt0_1); Don't pass parameters since stack may be - "funny". Use statics instead. Move fork/spawn checking - into dll_crt0. - (dll_crt0): Do fork spawn checking here. alloc_stack() - will call dll_crt0_1 if forked from a non-main thread. - * fork.cc (stack_base): New function determines base - (and other values) of this thread's stack. - (fork): Use new PROC_FORK1 method for forking. Provides - more data to forkee. Use stack_base to set stack - values. - * winsup.h (child_info_fork): Changes for PROC_FORK1. - -Wed Dec 16 16:15:29 1998 Geoffrey Noer - - * include/shellapi.h: fix typo in DragQueryPoint proto. - -Mon Dec 14 12:37:43 1998 Geoffrey Noer - - * net.cc: minor respacing - (get_ifconf): new local function, combines get_winnt_ifconf and - get_win95_ifconf. - (get_win95_ifconf): delete - (get_winnt_ifconf): delete - (fhandler_socket::ioctl): adjust ifconf calls in light of above, - check returned value for safety. - * include/cygwin/version.h: bump CYGWIN_VERSION_API_MINOR to 4 - in honor of newly supported socket ioctls. - - patch from Corinna Vinschen : - * include/asm/socket.h: Added defines for ioctl() calls - SIOCGIFADDR, SIOCGIFBRDADDR and SIOCGIFNETMASK. - * net.cc (get_winnt_ifconf): Check the registry entries - instead of just calling get_win95_ifconf(). Added what argument - to support the new ioctl() calls. - (get_win95_ifconf): Check the Windows 9x registry entries as - described by Tim Newsham. - (fhandler_socket::ioctl): Support the ioctl() commands - SIOCGIFADDR, SIOCGIFBRDADDR and SIOCGIFNETMASK. - (get_if_flags): Check for a down interface. - -Wed Dec 9 18:11:31 1998 Geoffrey Noer - - * fhandler.cc (fhandler_disk_file::open): check for shell scripts - regardless of Win32 OS type. - -Sun Dec 6 19:38:11 1998 Christopher Faylor - - patch from Corinna Vinschen : - * fhandler_console.cc (fhandler_console::tcgetattr): Fix typo. - ISIG should be ored with c_lflag. - -Tue Dec 1 16:28:56 1998 Geoffrey Noer - - * include/utmp.h: delete, moved to newlib/libc/sys/cygwin/sys. - -Thu Dec 3 15:41:51 1998 Geoffrey Noer - - Released 20.1 update. - -Thu Dec 3 22:24:18 1998 Christopher Faylor - - * exceptions.cc (set_process_mask): Add `sync' parameter - to control whether signals should be synched on exit. - (handle_sigsuspend): Provide second argument to set_process_mask - - don't sync. - (call_handler): Ditto for asm handler. - * signal.cc (sigprocmask): Ensure that signals are synchronized - by calling set_process_mask with sync == 1. - * sigproc.cc (__release_signal_mutex): Third argument is not - strictly a BOOL, so change it. - * sigproc.h: Reflect above parameter changes. - -Thu Dec 3 15:30:44 1998 Christopher Faylor - - * select.cc (peek_console): Work around NT bug that - caused strange behavior with ReadFile after this - function was invoked. - -Tue Dec 1 14:43:35 1998 Christopher Faylor - - * sigproc.cc (sigproc_init): Set maintid and signal_mutex early - to avoid races in wait_sig initialization. - (__get_signal_mutex): Improve debug output. - (__release_signal_mutex): Ditto. - * spawn.cc (spawn_guts): Allocate more space for string when building - up from #! and absolute path is not known. Otherwise weird stuff - like infinite recursion or unknown file errors occur. - -Tue Dec 1 08:34:18 1998 Christopher Faylor - - * mkvers.sh: Accommodate lack of timezone in date output so that - year shows up correctly. - -Mon Nov 30 14:30:51 1998 Jeff Johnston - - * times.cc (times): Altered function so that on non-Windows-NT systems - it does not use the GetProcessTimes() API which is not supported. - -Mon Nov 30 00:38:54 1998 Christopher Faylor - - * dcrt0.cc: Fix incorrect use of struct on exception_list - typedef. - * debug.cc (thread_stub): Ditto. - * dll_init.cc: Ditto. - * include/Windows32/Structures.h: Correct typo where - typedef SYSTEM_POWER_STATUS was being used as a struct. - -Sun Nov 29 22:03:17 1998 Christopher Faylor - - patch from Corinna Vinschen : - * fhandler_console.cc (fhandler_console::ioctl): - Added ioctl commands TCGETA, TCSETA, TCSETAW, TCSETAF. - -Fri Nov 27 22:30:58 1998 Christopher Faylor - - * fhandler.h: Set aside NOEINTR bit. When this is set - cygwin will not allow the read on this device to be - interrupted by a signal. - * pipe (_pipe): Set NOEINTR bit for read end of pipes - created using this method. The vague rationale for this - is that these pipes are supposed to be more like Windows - pipes than UNIX pipes. - * syscalls.cc (_pipe): Honor NOEINTR flag. - * getopt.c: Clean up some gcc warnings. - * libcerr.c: Ditto. - -Fri Nov 27 21:56:03 1998 Christopher Faylor - - * exceptions.cc (SIG_NONMASKABLE): Update for new signal - mask method. - (handle_sigsuspend): Release of signal mutex must be - synchronous -- the signal must be delivered before the - function returns. Otherwise, there will be races in - the caller code. - * sigproc.cc (sigproc_terminate): Minor cleanup. - -Thu Nov 26 20:26:17 1998 Christopher Faylor - - * exceptions.cc (call_handler): Attempt to work around - potential race when setting signal_arrived. This - particularly affects sigsuspend. - (handle_sigsuspend): Reset signal_arrived prior to - grabbing the mutex. This should reduce the probability - of a race. - * sigproc.cc (sig_send): Don't reset signal_arrived in - the SIGSUSPEND case since this could introduce a race. - -Thu Nov 26 12:19:16 1998 Christopher Faylor - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * select.cc (MAKEready): Don't wait for signal prior to - testing for read. That introduces an unnecessary delay. - -Wed Nov 25 23:03:47 1998 Christopher Faylor - - * winsup.h: Make `isdirsep' an alias for SLASH_P. - Implement isabspath convenience macro. - Change sigprotect to a macro since it appears to - be impossible to send __FILE__ type macros to a - constructor. Change use of sig_protect throughout. - * dcrt0.cc (dll_crt0_1): Use new path macro. - * dlfcn.cc (get_full_path_of_dll): Ditto. - * path.cc (path_conv::path_conv): Ditto. - (normalize_posix_path): Ditto. - (slashify): Ditto. - (backslashify): Ditto. - * syscalls.cc (num_entries): Ditto. - * lock.cc: Redefine lock methods to pass debug info to - {get,release}_signal_mutex. - * environ.cc (environ_init): Correct strncmp test for - TERM=, otherwise it's impossible to set TERM. - * exceptions.cc: Eliminate lock_cs and unlock_cs macros. - Use {get,release}_signal_mutex throughout. - (signal_init): Don't initialize signal_mutex here. - (set_process_mask): Remove vestiges of old mutex code. - (handle_sigsuspend): Ditto. - (call_handler): Move signal_arrived SetEvent back here. - It was being triggered too often before. - Detect when the signal thread is exiting. - (sig_handle): Remove inappropriate SetEvent(signal_arrived). - (events_terminate): Move close of signal_mutex elsewhere. - * glob.cc: Increase "MAXPATHLEN" size for arguments that - are not necessarily pathnames. - * pinfo.cc (lpfu): Lower timeout for reporting possible - problem with INFINITE wait. - * sigproc.cc (wake_wait_subproc): Make this a macro with - no arguments so that its use in the code is a little - clearer. - (proc_terminate): Eliminate signal blocking here since - this should already be handled by the caller. - (sigproc_init): It makes sense to initialize signal_mutex - here, so do so. - (__allow_sig_dispatch): Rename. Take debugging arguments. - Pass arguments on to release_signal_mutex. - (__block_sig_dispatch): Rename. Take debugging arguments. - Pass arguments on to get_signal_mutex. Detect signal - thread exiting confition. - (__get_signal_mutex): Take debugging arguments. Maintain - a stack of nested mutex calls for later display in - __release_signal_mutex. Detect signal thread exit - condition. Don't bother with locking if signal thread is - executing or if just an exec stub. - (__release_signal_mutex): Don't bother with locking if signal - thread is executing or if just an exec stub. - * sigproc.h: Reflect renamed functions above. Provide - wrappers to pass in diagnostic information. - * spawn.cc (spawn_guts): More fixes to deal with nested - #! and to properly report posix argv[0] when invoked as a - script. - -Wed Nov 25 12:41:12 1998 Christopher Faylor - - * Makefile.in: Reinstate libwinspool.a/winspool.drv creation. - -Tue Nov 24 18:48:56 1998 Geoffrey Noer - - * Makefile.in: add CFLAGS_COMMON and CFLAGS_CONFIG to CFLAGS - and CXXFLAGS in FLAGS_TO_PASS. - - * include/sys/select.h: new file with select proto. Avoid - potential conflict with Winsock inclusion by Cygwin internals. - * include/sys/socket.h: remove select proto. - * winsup.h: define __INSIDE_CYGWIN__. Include windows.h after - Unix include files. - * include/mywinsock.h: delete file - * include/Windows32/Sockets.h: add ndef __INSIDE_CYGWIN__s - around portions that conflict with Unix definitions. This - yields what used to be mywinsock.h which is a blend of Unix - sockets and Winsock needed by Cygwin internals. - * exceptions.cc: define Win32_Winsock to include - Windows32/Sockets.h. No longer define __INSIDE_CYGWIN__. - * hinfo.cc: ditto - * net.cc: ditto - * select.cc: ditto - - * include/exceptions.h: change wrapper define to _EXCEPTIONS_H. - * include/sys/resource.h: move includes outside __cplusplus check. - * include/sys/wait.h: ditto. - -Sun Nov 22 23:33:19 1998 Geoffrey Noer - - * sigproc.cc (__release_signal_mutex): revert Nov 3d change. - -Sun Nov 22 17:04:44 1998 Christopher Faylor - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * regexp/Makefile.in: Add additional bits necessary to - allow correct installation of include file. - -Fri Nov 20 17:04:48 1998 Christopher Faylor - - * Makefile.in: Set "Warn about writable strings" option in CFLAGS. - * fhandler_tty.h: Fix for writable strings detection. - * grp.cc (add_grp_line): Ditto. - * mkvers.sh: Ditto. - * path.h: Ditto. - * registry.cc: (reg_key::reg_key): Ditto. - * smallprint.c (__small_vsprintf): Ditto. - * tty.cc (tty::get_event): Ditto. - * winsup.h: Give up on read_ready_thread. Move sig_protect - here since it needs to use information set up after the sigproc.h - include. - * dcrt0.cc: Ditto. - * debug.cc (WFSO): New function. Used to ensure that - function shows up on stack trace. - (WFMO): Ditto. - * debug.h: Define the above. - * exceptions.cc (ctrl_c_handler): Record last signal - for signal handler. - * select.cc (MAKEready): New macro for constructing - fhandler_*::ready_for_read function. - (fhandler_*::ready_for_read): Use macro to construct this - method throughout. - * sigproc.cc (sig_send): Work around race on process termination - where the event being waited for may disappear. - (sigproc_terminate): #ifdef code here that attempted to deal with - the above condition in sig_send. - * sigproc.h: Move sig_protect to winsup.h. - * spawn.cc (perhaps_suffix): Don't return pointer into an - automatic variable. - (find_exec): Always point known_suffix to something. - * syscalls.cc (read_handler): Refine debug output. - (read_ready_thread): Delete. - (_read): Eliminate use of read_ready_thread. Call ready_for_read - directly as appropriate. - -Thu Nov 19 15:26:40 1998 Geoffrey Noer - - * Makefile.in: remove -Wunused since that's already in -Wall - * dlfcn.cc (check_path_access): rename winenv arg to mywinenv - * path.cc (symlink): change save_errno var to saved_errno - * spawn.cc (find_exec): rename winenv arg to mywinenv - (spawn_guts): rename sigprotect handle to starting_here - * winsup.h: remove trailing comma from process_state flags - enum - * utils/aclocal.m4: regenerate - * utils/configure: regenerate - -Thu Nov 19 11:16:38 1998 Christopher Faylor - - * Makefile.in: Use correct libpthread.a target when - thread-safe is enabled. - -Thu Nov 19 10:49:27 1998 Christopher Faylor - - * path.cc (path_conv): Correct error reporting. - -Wed Nov 18 20:07:50 1998 Geoffrey Noer - - * utils/Makefile.in: remove termcap file install rule - -Wed Nov 18 18:14:18 1998 Geoffrey Noer - - More minor cleanup: - * environ.cc (winenv): don't define len twice. - * fork.cc (sync_with_parent): should NOT use rc since - this is a macro and that could have interfered with rc in - the calling function. Renamed to psync_rc. - * fhandler_serial.cc (fhandler_serial::open): change - access to myaccess since it shadows global decl. - * hinfo.cc: ditto throughout - * path.cc: ditto throughout - (path_conv::path_conv): change error to err. - -Wed Nov 18 16:17:58 1998 Geoffrey Noer - - * profil.c: include stdio.h - (print_prof): comment out unused func - (profile_ctl): should return an int - -Wed Nov 18 16:17:58 1998 Geoffrey Noer - - * utils/ps.cc: include sys/cygwin.h, make pname buf - MAXPATH in size. - - patch from Corinna Vinschen : - * utils/ps.cc (main): converting windows paths to posix - paths in output. - -Wed Nov 18 15:34:46 1998 Geoffrey Noer - - * include/wchar.h: include stddef.h. - -Wed Nov 18 17:39:15 1998 Christopher Faylor - - * environ.cc (environ_init): Fix incorrect TERM= detection. - -Tue Nov 17 17:28:09 1998 Geoffrey Noer - - * gcrt0.c: include stdlib.h, add proto for monstartup. - -Tue Nov 17 16:47:42 1998 Geoffrey Noer - - * include/wchar.h: add protos for wcslen and wcscmp. - * syscalls.cc: minor reformat. - -Tue Nov 17 15:38:45 1998 Christopher Faylor - - * fhandler.cc (fhandler_base::fhandler_base): Default non-disk - devices to binary mode. - * fhandler.h: Reformat slightly. - -Tue Nov 17 11:19:23 1998 Christopher Faylor - - * external.cc (fillout_pinfo): Copy progname using strcpy to - save on time. - * path.h: Add new enums for more fine-grained control - of path_conv. - * dir.cc (opendir): Use enum argument to path_conv. - (mkdir): Ditto. - (rmdir): Ditto. - * dlfcn.cc (get_full_path_of_dll): Ditto. - * fhandler.h: Add new set_readahead_valid to set actual - readahead. - * fhandler.cc (raw_read): Remove extraneous variable. - (fhandler_base::read): Rework to allow readahead when - not text mode. - (fhandler_disk_file::fstat): get_symlink_p() only returns - true/false now. - (fhandler_disk_file::fhandler_disk_file): Use enum argument - to path_conv. - (fhandler_disk_file::open): Ditto. - * spawn.cc (perhaps_suffix): Ditto. - * syscalls.cc (_unlink): Ditto. - (_link): Ditto. - (stat_worker): Ditto. - (_rename): Ditto. - * fhandler_serial.cc (fhandler_serial::open): Always reset timeouts. - * path.cc (path_conv::path_conv): Honor new enum arguments. - Specifically, use SYMLINK_CONTENTS for readlink interface. - (readlink): Use SYMLINK_CONTENTS argument to path_conv. - * select.cc: Rework serial support which has apparently never - worked. - -Mon Nov 16 16:15:20 1998 Geoffrey Noer - - * Makefile.in: FLAGS_TO_PASS should pass CFLAGS and CXXFLAGS - not ALL_CFLAGS and ALL_CXXFLAGS. Rework handling of CFLAGS - variables to remove duplication and make it possible to - build mingw directory. - -Mon Nov 16 09:40:21 1998 Christopher Faylor - - * syscalls.cc (_open): Use new macro to check for - NULL or empty pathname and return appropriate error. - * path.cc (check_null_empty_path*): Move macro to - path.h. - * path.h: Move macros here. - -Sun Nov 15 20:23:10 1998 Geoffrey Noer - - * include/cygwin/version.h: bump API_MINOR to 3 to mark - addition of dll_noncygwin_dllcrt0 to exports list. - -Sun Nov 15 23:05:21 1998 Christopher Faylor - - * path.cc (check_null_empty_path): New macro. - (check_null_empty_path_errno): Ditto. - (path_conv::path_conv): Check for NULL and empty - path names here and set appropriate error. - (conv_to_win32_path): Ditto. - (conv_to_full_win32_path): Ditto. - (conv_to_posix_path): Ditto. - (conv_to_full_posix_path): Ditto. - (mount_info::conv_wo_win32_path): Back out previous - change. - (mount_info::conv_to_posix_path): Ditto. - -Sun Nov 15 19:29:19 1998 Geoffrey Noer - - * include/limits.h: define CHILD_MAX to be 63. - * sysconf.cc (sysconf): return CHILD_MAX when asked for - instead of _POSIX_CHILD_MAX. - -Sun Nov 15 18:25:22 1998 Geoffrey Noer - - patch from Mumit Khan : - * path.cc (mount_info::conv_to_posix_path): Handle NULL and - empty pathnames. - (mount_info::conv_to_win32_path): Likewise. - -Sun Nov 15 18:09:06 1998 Geoffrey Noer - - * cygwin.din: export dll_noncygwin_dllcrt0. - * {libccrt0.cc, winsup.h}: minor reformat. - -Sat Nov 14 22:14:51 1998 Christopher Faylor - - * environ.cc (environ_init): Use sizeof for string lengths - rather than hard-coded values. - - patch from Mumit Khan : - * dll_init.cc (dll_foreign_dllcrt0): Rename to - dll_noncygwin_dllcrt0. - * winsup.h: Ditto. - * include/cygwin/cygwin_dll.h: Ditto. - -Sat Nov 14 14:09:33 1998 Christopher Faylor - - * hinfo.cc (hinfo::de_linearize_fd_array): Reset first fd - for open to zero after an exec. - -Sat Nov 14 01:29:23 1998 Christopher Faylor - - * fork.cc (fork): No need for intermediate jmp_buf variable. - - patch from Mumit Khan : - * libccrt0.cc (cygwin_attach_foreign_dll): New function. - * dll_init.cc (dll_foreign_dllcrt0): New function to initialize - DLLs loaded by non-cygwin apps. - (dll_dllcrt0_1): Initialize process table entry. - (dll_dllcrt0): Revert last change to do partial initialization. - * winsup.h (dll_foreign_dllcrt0): Prototype. - * include/cygwin/cygwin_dll.h (_cygwin_foreign_dll_entry): New - entry point that does partial initialization for non-cygwin apps. - -Fri Nov 13 16:17:28 1998 Geoffrey Noer - - Assorted -Wall cleanup: - * utils/mount.cc (show_mounts): remove unused var i. - * utils/cygcheck.cc (dll_info): comment out unused var ofs. - (dump_sysinfo): return a void, not an int. Comment out unused - var len in two places. Add parens around assignment used as - truth value. - * utils/kill.cc (main): remove unused var i - * utils/mkpasswd: include and . - (enum_users): remove unused var rc. - (enum_local_groups): ditto. - * utils/ps.cc (main): Add parens around assignments used as - truth values. - * utils/mkgroup.c: include and . - (enum_groups): return void, not int. Remove unused var rc. - * gmon.c: include and . - (_mcleanup): remove unused vars buf and profdir. - -Fri Nov 13 16:17:28 1998 Geoffrey Noer - - patch from Corinna Vinschen : - * include/sys/sysmacros.h: new file, define major, minor, makedev - -Fri Nov 13 17:03:52 1998 Christopher Faylor - - * dcrt0.cc: Reflect a variable name change. - * fhandler.h: *::ready_for read takes an additional argument. - * fhandler_console.cc (get_non_ascii_key): New function derived - from fhandler_console::read1. - (fhandler_console::read1): Use new function. - * select.cc (*::ready_for_read): Add new "nonblocking" argument. - (peek_console): Be more diligent in detecting when a usable - character has been entered or false positives will be returned. - (fhandler_tty_common::ready_for_read): Detect attempt to perform - a "background" read. - * syscalls.cc (read_handler): Remove code for dealing with slow - devices. Just deal with non-blocking here. - (read_ready_thread): Renamed function. Rewritten to only detect - when an fd has data ready to be read. Actual reads happen in - the main thread. - (_read): Rely on read_handler to read data for everything. Use - the read_ready_thread to indicate when data is ready to be read. - Gut the read_thread_info class since it no longer needs to return - much information. - * winsup.h: Reflect above changes to read_thread_info. Rename - to read_ready_thread_info. - -Fri Nov 13 15:09:26 1998 Christopher Faylor - - patch from Corinna Vinschen and - Ron Parker : - * path.cc (mount_info::conv_to_win32_path): Refined recognition of - UNC devices. - -Fri Nov 13 12:37:00 1998 Christopher Faylor - - * Makefile.in: Fix a typo. - -Fri Nov 13 10:59:43 1998 DJ Delorie - - * Makefile.in: "make" uses new "ld -shared" by default internally. - -Fri Nov 13 00:58:38 1998 Christopher Faylor - - * spawn.cc (find_exec): Make sure that return value is correct - in all cases. Document. - * fhandler.h (fhandler_tty_common): Give unit number to constructor. - * fhandler_tty.cc (fhandler_tty_slave::fhandler_tty_slave): Give - unit number to descriptor. Create correct UNIX path name for - tty so that ttyname() will work correctly. - * select.cc (fhandler_tty_common::ready_for_read): Don't worry - about read_for_read since the tty read routines are already - interruptible. - * syscalls.cc (_read): Reset read thread events on signal. - - patch from Mumit Khan : - * dlfcn.cc (ctype.h): Include. - (check_access): Document. - (check_path_access): Document. - (get_full_path_to_dll): Rework to handle general filenames and - symlinks. - -Thu Nov 12 17:01:52 1998 DJ Delorie - - * Makefile.in (shared): "make shared" uses the new "ld -shared" - * cygwin.din: add LIBRARY and BASE tags for "ld -shared" - -Wed Nov 11 17:16:17 1998 Christopher Faylor - - * configure.in: Add --enable options for various cygwin defines - including preliminary thread-safe defines. - * configure: Regenerate - * Makefile.in: Honor new --enable options. - * glob.h: Move BSD defines to sys/cdefs.h. - * include/sys/cdefs.h: Move __P definition here. - -Wed Nov 11 14:00:45 1998 DJ Delorie - - * cygwin.din (getpwnam): remove duplicates - -Tue Nov 10 18:27:09 1998 Geoffrey Noer - - * utils/aclocal.m4: regenerate with aclocal - * utils/configure.in: don't call AM_CYGWIN32 - * utils/configure: regenerate - -Tue Nov 10 15:56:03 1998 Geoffrey Noer - - patch from Gary V. Vaughan : - * dlfcn.cc (dlopen): return an introspective handle to the - current module if name arg is NULL. The Single UNIX - Specification, Version 2 has this as a requirement. - -Mon Nov 9 16:29:27 1998 Geoffrey Noer - - * errno.cc (strerror): all errnos in - newlib/libc/include/sys/errno.h are now listed here. - -Mon Nov 9 16:29:27 1998 Geoffrey Noer - - * include/cygwin/version.h: up DLL version, bump API_MINOR to 2 - to mark following change. - - patch from Mumit Khan : - * cygwin.din: add exports for some of the newlib bessel - functions (j1, jn, y1, yn). - -Mon Nov 9 15:10:06 1998 Geoffrey Noer - - * syscalls.cc (_link): rewrite FIXME. - -Mon Nov 9 14:51:03 1998 Geoffrey Noer - - * errno.cc (strerror): add string for EDEADLOCK. - - patch from Corinna Vinschen : - * errno.cc (errmap[]): add END_OF_MEDIA and additional Win32 - error codes. - -Sun Nov 8 21:28:01 1998 Christopher Faylor - - * fhandler.h: fhandler_pipe cannot be is_slow under - Windows9[58]. There is no way to check for EOF on a pipe - without performing a read on that system. - * syscalls.cc (read_handler): Don't check for ready_for_read - unless this is a "slow" device. - * winsup.h: Reorganize to accomdate fhandler.h requirement - for os_type. - -Sat Nov 7 23:27:05 1998 Christopher Faylor - - * fhandler.h (fhandler_console): Add a new function declaration. - * fhandler_console.cc (fhandler_console::read1): New function - renamed from console_read to allow use of class fields. - Detect readahead situation when doing line buffering and - buffer does not contain \n. - (fhandler_console::read): Reflect function name change. - * select.cc (cygwin_select): Changes for better handling - of < 1000 usec timeouts. - (select_stuff::wait): Perform a poll on timeout to - set any fd's that may have become active. - (peek_pipe): More debugging. Honor write_ready if set. - (peek_console): Can't always use WaitForSingleObject. - Detect readahead conditions set in fhandler_console::read1. - Honor write_ready if set. - (peek_windows): Honor write_ready if set. - * times.cc (__to_clock_t): Return clock_t value. - (times): Add some debugging printfs. - -Fri Nov 6 20:15:20 1998 Christopher Faylor - - patch from Corinna Vinschen : - * spawn.cc (spawn_guts): find_exec() argument mismatch - resulted in inability to run !# scripts which did not - begin with '/'. - -Tue Nov 3 16:12:59 1998 Christopher Faylor - - * exceptions.cc (handle_exceptions): Don't wait for signal - completion. - (ctrl_c_handler): Ditto. - * fhandler.h (fhandler_*): Declare new ready_for_read functions. - * select.cc: Reorganize all methods into a peek_*, a poll_*, - and a fhandler_*::ready_for_read. This is to allow the _read - function to query the state of an fd without starting a thread. - * signal.cc (kill_worker): If sending a signal from a non-main thread - don't wait for completion. - * sigproc.h (myself_nowait_nonmain): New define for use by sig_send. - * sigproc.cc (sig_send): Honor myself_nowait_nonmain. Don't wait - if not in main thread. - (__release_signal_mutex): Revert to calling ReleaseMutex only - once or mutex is released prematurely. - * syscalls.cc (read_handler): Use new ready_for_read method to - determine if an fd has data for reading. This function optionally - blocks until there is data to read. - (read_helper): Add debugging statement. - (_read): Move signal_arrived reset to before sig_protect to avoid - a race. Force read_handler thread to longjmp back to read_handler - function on signal. - -Tue Nov 3 12:18:31 1998 DJ Delorie - - * utils/cygcheck.cc (dump_sysinfo): Note when not finding a - program (like cpp) on the path is a good thing. - -Tue Nov 3 01:26:08 1998 Geoffrey Noer - - patch from Kazuhiro Fujieda : - * environ.cc (environ_init): correct size arg to parse_options - -Mon Nov 2 21:40:32 1998 Christopher Faylor - - * regexp/regexp.c (regatom): Respond to compiler warning. - -Mon Nov 2 21:36:48 1998 Christopher Faylor - - * exceptions.cc (handle_exceptions): cygwin should not - print exception information if the exception is trapped - via signal(). - Also use consistent timings for lock_cs() throughout. - -Mon Nov 2 16:46:28 1998 Geoffrey Noer - - * Makefile.in: For now, also include newlib/libc/sys/cygwin. - Eventually will stop including newlib/libc/sys/cygwin32. - -Mon Nov 2 19:38:30 1998 Christopher Faylor - - patch from Corinna Vinschen : - * syscall.cc (gethostname): function deleted - * net.cc (gethostname): new function 'gethostname' which - first calls wsock32::gethostname and only if it fails, - calls GetComputerNameA. - -Wed Oct 28 17:57:53 1998 Geoffrey Noer - - * include/cygwin/version.h: up DLL version to 20.0 in honor - of new Net release. - -Wed Oct 28 17:57:53 1998 Geoffrey Noer - - patch from Mumit Khan : - * dll_init.cc (doGlobalCTORS): Fix invocation order. - (doGlobalDTORS): Likewise. - -Wed Oct 28 17:57:53 1998 Geoffrey Noer - - * Makefile.in: add include/exceptions.h to dll_init.cc deps. - - patch from Mumit Khan : - * dll_init.cc (exceptions.h): Include. - (dll_dllcrt0_1): New function to initialize Cygwin DLL guts - properly when a non-Cygwin app uses the Cygwin DLL. - (dll_dllcrt0): Call dll_dllcrt0_1 when user_data is NULL. - -Tue Oct 27 17:35:00 1998 Geoffrey Noer - - * syslog.cc: drop "32" from CYGWIN32_LOG_NAME - -Tue Oct 27 16:09:09 1998 DJ Delorie - - * utils/cygcheck.cc (usage): cygwhich->cygcheck - -Mon Oct 26 17:47:10 1998 Geoffrey Noer - - * Makefile.in: fix deps for dll_entry.o and dll_main.o, - add dep for glob.o. - - patch from Mumit Khan : - * dll_entry.cc: New file for user DLL entry point. - * dll_main.cc: New file for user DLL main. - * Makefile.in (LIBCOS): Add dll_entry.o and dll_main.o. - -Mon Oct 26 13:47:10 1998 Geoffrey Noer - - * Makefile.in: add back install of include/net which was - removed by accident. - -Mon Oct 26 15:25:22 1998 Christopher Faylor - - * strace.cc (get_strace_mutex): Don't reset last windows - error. - (strace_printf): Preserve last windows error. - -Mon Oct 26 11:01:46 1998 Christopher Faylor - - * uname.cc (uname): Remove slash from system name. - -Mon Oct 26 02:11:44 1998 Geoffrey Noer - - * include/asm/byteorder.h: add missing __cplusplus wrapper. - -Mon Oct 26 00:46:33 1998 Christopher Faylor - - * uname.cc (uname): Remove space from the system name. - -Sun Oct 25 23:47:56 1998 Christopher Faylor - - * fhandler_console.cc (console_read): Several typos caused flaky - behavior when \r or \n detected under ENABLE_LINE_INPUT. Also ignore - first \n detected under ENABLE_LINE_INPUT if it isn't preceded by a \r. - This avoids problems when switching from "raw" mode into "cooked mode. - -Sun Oct 25 12:28:21 1998 Geoffrey Noer - - * cygwin.din: remove unnecessary __cygwin32_stack_trace and - __cygwin_stack_trace exports. - -Sat Oct 24 21:18:46 1998 Christopher Faylor - - patch from Corinna Vinschen : - * path.cc (symlink): Standard protection for symlink should - be 0777. - * syscalls.cc (num_entries): Calculated links for directory - entry should only include directories. - -Sat Oct 24 20:51:08 1998 Christopher Faylor - - * mkvers.sh: Modify check for CVS/Tag to work around ash bug. - * sigproc.cc (wait_sig): Fix detection of non-blockable signals. - -Fri Oct 23 18:24:43 1998 Geoffrey Noer - - * environ.cc: CYGWIN32 environment variable is now called CYGWIN - * window.cc: lose "32" in Cygwin32WndClass - * syslog.cc: lose "32" in WIN95_EVENT_LOG_PATH and - CYGWIN32_LOG_NAME. - -Fri Oct 23 16:32:59 1998 Geoffrey Noer - - * utils/cygcheck.cc: reformat, add copyright notice - -Fri Oct 23 18:15:28 1998 DJ Delorie - - * utils/cygcheck.cc: new file - * utils/Makefile.in: build cygcheck.exe - -Fri Oct 23 16:48:41 1998 Christopher Faylor - - * exceptions.cc (signals_init): Add error to api_fatal. - (events_init): Ditto. Collapse printfs into one. - (winsock_init): Ditto. - * net.cc (winsock_init): Remove "Cygwin" from error message. - -Fri Oct 23 13:48:10 1998 Geoffrey Noer - - * Makefile.in: install include/cygwin headers, losing the "32". - * include/cygwin32: remove - -Fri Oct 23 14:36:31 1998 Christopher Faylor - - * environ.cc (environ_init): Avoid reallocating environ array. - * exec.cc: Increase number of arguments to 1024 throughout. - * fhandler.cc (fhandler_disk_file::open): Revert to checking - a file for '#!' to find out if it is executable but add - extra check for NTEA which, if set, eliminates the need for - the read. - * sigproc.cc (sigproc_terminate): Close hwait_sig and set it - to NULL prior to closing other handles since this flags some - routines that the process is going down. - -Fri Oct 23 00:31:27 1998 Geoffrey Noer - - * utils/*: remove "32"s from cygwin32_foo function calls - -Fri Oct 23 00:24:27 1998 Geoffrey Noer - - * include/cygwin/version.h: increment CYGWIN_VERSION_DLL_MINOR - and CYGWIN_VERSION_API_MINOR since I'm changing the API in a - meaningful but backwards-compatible fashion. - - * exceptions.cc: strip "32" from cygwin32_exception_handler - debug printfs - - * net.cc: strip "32" from all net functions - * select.cc, syscalls.cc, winsup.h: lose "32" from cygwin32_select - * cygwin.din: adjust for these changes (no backwards - compatability issues here). - - * cygwin.din: rename all cygwin32_foo functions, aliasing as - cygwin_foo for backwards compat. for now but intend to lose them - at a later date. - * include/sys/cygwin.h: copy all cygwin32_ protos and make them - usable without the "32". We will remove the cygwin32_ ones at a - later date. - * external.cc, external.h: lose "32" from cygwin32_internal - * shared.cc, winsup.h: lose "32" in cygwin32_getshared - * path.cc, path.h: lose "32" in cygwin32_foo comments - * dll_init.cc: lose "32" in cygwin32_detach_dll - * hinfo.cc: lose "32" in cygwin32_attach_handle_to_fd - * libccrt0.cc: lose "32" in refs to cygwin32_attach_dll - * pinfo.cc: lose "32" in cygwin32_winpid_to_pid - - * include/cygwin32: remove all files except cygwin32_dll.h which - some people may already be including. Aim to remove this - remaining file at a later date. - * include/cygwin: move all include/cygwin32 files here. - * cygwin/cygwin_dll.h: change protos to reflect loss of "32"s - * include/net/if.h, include/netinet/in.h, include/netinet/ip.h, - include/netinet/ip_icmp.h, include/asm/socket.h: - include/sys/socket.h: include the headers in include/cygwin - * Makefile.in, winsup.h: fix references to - include/cygwin32/version.h - - * libcctype.c, smallprint.c, test.c: lose "32" in Cygwin32 refs in - comments - * include/dlfcn.h, include/exceptions.h, include/mapi.h, - include/winsock.h, include/mywinsock.h: ditto - * config/*: ditto - * profil.c: ditto, and respace - -Thu Oct 22 22:52:40 1998 Geoffrey Noer - - * net.cc, exceptions.cc, hinfo.cc, select.cc, - include/mywinsock.h: rename __INSIDE_CYGWIN32__ to - __INSIDE_CYGWIN__ - -Thu Oct 22 17:39:06 1998 Geoffrey Noer - - First round of Cygwin32 -> Cygwin renaming. In all files, - rename Cygwin32 to Cygwin in comments. - * CYGWIN32_LICENSE: delete and - * CYGWIN_LICENSE: add it back under this name - -Thu Oct 22 20:10:24 1998 Christopher Faylor - - * exceptions.cc: Eliminate cs mutex. Just use signal_mutex - throughout. Rename sig_dispatch_mutex to signal_mutex throughout. - (lock_cs): Rewrite to be a front-end for get_signal_mutex. - (unlock_cs): Rewrite to be a front-end for release_signal_mutex. - (set_process_mask): Synchronize signals after resetting mask. - * sigproc.cc (release_signal_mutex): Report on success or - failure of signal_mutex release. - * include/Windows32/Defines.h (FILE_FLAG_WRITE_THROUGH): Make - unsigned to avoid a compiler warning. - -Thu Oct 22 14:23:49 1998 Geoffrey Noer - - * utils/Makefile.in: disable building cygwin.exe. - -Thu Oct 22 14:16:10 1998 Christopher Faylor - - * exceptions.cc (sig_handle): Minimize life of cs lock during - handling of signals to reduce the potential for a race. - -Thu Oct 22 10:23:19 1998 Christopher Faylor - - * include/sys/strace.h: Minor addition from threadsafe-branch. - -Thu Oct 22 09:03:18 1998 Christopher Faylor - - * debug.cc (close_handle): Error condition needs a return value. - * environ.cc (parse_thing): char pointers should all be constant. - (add): Ditto. - * heap.cc (heap_init): Provide a little more information in - fatal printf. Use api_fatal to print errors. - * sigproc.cc (sigproc_terminate): Move code executed on - thread termination here from wait_sig since this function - may actually be executing in the signal thread. - * strace.cc (strace_open): Argument should be const. - (strace_init): Ditto. - * winsup.h: Ditto. - * include/cygwin32/version.h: Note that original shared memory - version was 0 for 98r2. - -Wed Oct 21 08:41:39 1998 Christopher Faylor - - * dcrt0.cc (__api_fatal): Remove "cygwin" identifier. - * fhandler.cc (fhandler_disk_file::open): Set symlink flag - appropriately for previous change. - * shared.cc (shared_name): Initialize static buffer to - (hopefully) force it into NO_COPY segment. - * mkvers.sh: Reorganize, add cvs tag detection, and output - cygwin "info" defines. - -Tue Oct 20 18:42:50 1998 Geoffrey Noer - - * include/cygwin32/version.h: rewrite versioning comments, - updating for new scheme but keeping historical information. - -Mon Oct 19 23:45:24 1998 Geoffrey Noer - - * include/windows.h: remove Objective-C BOOL ifdef, now taken - care of within the include/Windows32 header files. - * fhandler_console.cc: fix KeyEvent references in light of - changes to the KeyEvent struct in the Windows32 headers. - - Update include/Windows32 header files. Changes from - Mumit Khan , Corinna Vinschen - , and me. - * include/Windows32/CommonFunctions.h: new file, contents from - Functions.h. - * include/Windows32/*.h: Misc updates. - -Mon Oct 19 20:26:15 1998 Christopher Faylor - - * debug.cc: Throughout, avoid calling *_printf while lock - is active. Previous lock count was not thread-safe. - * fhandler_console.cc (console_read): Avoid sending a - \r to caller if ENABLE_LINE_INPUT. - (fhandler_console::read): Rely on console_read to handle - \r\n conversion. - -Mon Oct 19 12:10:09 1998 Christopher Faylor - - * mkvers.sh: Use more portable constructs to allow running - this with /bin/sh, bash, and ksh. - -Mon Oct 19 11:19:58 1998 Christopher Faylor - - * path.cc (mount_info::from_registry): Missed "b15.0" part - for writing mount information back to registry. - (mount_info::init): Remove obsolete stuff. - -Mon Oct 19 10:42:17 1998 Christopher Faylor - - * Makefile.in: Avoid newer GNU make construction when building - version.cc. - -Mon Oct 19 00:09:06 1998 Geoffrey Noer - - * Makefile.in: invoke mkvers.sh with $(SHELL) - -Sun Oct 18 15:19:17 1998 Christopher Faylor - - * fhandler.cc (set_name): Accept unit argument for generating - win32_name. - (fhandler_base::fhandler_base): Ditto. - (fhandler_dev_floppy::fhandler_dev_floppy): Ditto. - (fhandler_dev_tape::fhandler_dev_tape): Ditto. - (fstat): Set symlink bit only if symlink_p is positive. - * fhandler.h: Reflect unit argument changes. - * fhandler_serial.cc (fhandler_serial::fhandler_serial): Accept - unit argument for generating win32_name. - * hinfo.cc (hinfo::build_fhandler): Pass unit argument to constructor - where apropriate. - * path.cc (path_conv::path_conv): Set symlink_p to a positive - value if !nofollow, negative otherwise. - (windows_device_names): Can't default to \dev\comx. \dev part - doesn't work. - (get_device_number): Accept just "comN" for backwards compatibility. - -Sat Oct 17 01:58:15 1998 Christopher Faylor - - * dcrt0.cc (globify): Fix problem with argument corruption - due to use of pointer freed by realloc. - -Sat Oct 17 00:10:53 1998 Christopher Faylor - - Change NOT_OPEN_FD to dtable.not_open throughout. - * Makefile.in: Change .dll name to cygwin1.dll. Increment - the '1' when there are API/shared memory changes. Make - version.cc file every time .dll is linked. Remove datestamp - stuff. - * mkvers.sh: New file. Creates version.cc. - * cygwin.din: Export setdtablesize. - * dcrt0.cc: Remove obsolete version variables. - (build_argv): Use issep() macro rather than isspace since - isspace includes whitespace that the shell does not consider - a command separator. - (check_sanity_and_sync): Use new cygwin version defines and - structures for compatibility checking. - (dll_crt0_1): Ditto. - (__api_fatal): Renamed from api_fatal. Now always called from - macro which tacks program name to beginning of fmt. Increase - size of buffer. - * environ.cc (regopt): Use new reg_key class constructor - functionality. - * net.cc (getdomainname): Ditto. - * path.cc (read_mounts): Ditto. - (mount_info::from_registry): Ditto. - (mount_info::to_registry): Ditto. - (hash_path_name): No need for this to be a "C" function. - * external.cc (cygwin32_internal): Export version info strings. - * external.h: Add CW_GETVERSIONINFO. - * fhandler.cc (fhandler_base::write): Eliminate use of MIN macro. - * init.cc (set_dllname): Obsolete function. Handled in version.cc. - (dll_entry): Remove reference to set_dllname. - * libccrt0.cc (this_proc): Renamed from cygwin_statu. - (cygwin_crt0_common): Record api version in this_proc. - * mmap.cc (recreate_mmaps_after_fork): No need for this to be - a "C" function. - * syscalls.cc (close_all_files): Ditto. - * pinfo.cc (lock_pinfo_for_update): Eliminate a compiler warning. - * registry.cc: Eliminate reg_session class. Augment reg_key to handle - functionality of reg_session. - * registry.h: Ditto. - * shared.cc (shared_name): No need for this to be a "C" function. - Use new cygwin version structure. - (shared_info::initialize): Use new reg_key class constructor - functionality. - * smallprint.c (__small_vsprintf): Accept %P as a format specifier. - Signifies the program name. - * spawn.cc (spawn_guts): Quote *all* of the stuff the dcrt0.c considers - special. - * tty.cc (tty::inuse_event_exists): Remove debugging printf. It results - in too much output to strace log. - * uinfo.cc: Add a needed include. - * uname.cc (uname): Use new cygwin version structure to fill in utsname - fields. - * winsup.h: Regroup into sections. Add new version structure. - * include/utmp.h: Move login/logout function declarations here. - * include/cygwin32/version.h: Define new CYGWIN version/info - stuff here. - -Fri Oct 16 00:13:35 1998 Geoffrey Noer - - * Makefile.in: enable building mingw subdir by default - -Thu Oct 15 12:01:08 1998 Christopher Faylor - - * spawn.cc (spawn_guts): Set all security attributes - for CreateProcess so that sexec will work properly. - -Thu Oct 15 08:49:12 1998 Christopher Faylor - - * hinfo.cc (hinfo::dup2): Avoid a null pointer dereference - in a debugging printf. - -Wed Oct 14 18:06:51 1998 Geoffrey Noer - - patch from Corinna Vinschen : - * fhandler_console.cc (fhandler_console::dup): reset - default_color since the console fhandler forgets its default - colorizing when it's `dup'ed. - (fhandler_console::fhandler_console): remove unnecessary - erasing in constructor of fhandler_console. - -Mon Oct 12 22:20:59 1998 Christopher Faylor - - * fcntl.cc (fcntl): According to the "Single UNIX Specification", - F_DUPFD should *not* close its argument. Revert to previous - behavior. - * hinfo.cc (dup2): Guard against closing target fd too early. - * pinfo.cc: Always initialize myself to a dummy value so that - myself != NULL checks are avoided. - * include/sys/strace.h (strace): Remove NULL check for myself. - * dcrt0.cc (api_fatal): Ditto. - * exceptions.cc (handle_exceptions): Ditto. - * signal.cc (sigprocmask): Ditto. - (_raise): Ditto. - * strace.cc (get_strace_mutex): Ditto. - -Mon Oct 12 15:19:47 1998 DJ Delorie - - * utils/ps.cc (main): use const char *pname - -Fri Oct 9 12:32:23 1998 Christopher Faylor - - * syscalls.cc (getw): Simplify. - -Thu Oct 8 23:09:34 1998 Geoffrey Noer - - * times.cc: add missing syscall_printfs to time functions, - slight reformatting. - -Thu Oct 8 21:56:37 1998 DJ Delorie - - * hinfo.cc (cygwin32_attach_handle_to_fd): allow to pass -1 - for dup() simulation; return allocated fd. - * pinfo.cc (lock_pinfo_for_update): if the mutex is broken, - fail instead of looping. If you do loop, don't use 100% CPU. - -Thu Oct 8 18:33:02 1998 Christopher Faylor - - * dcrt0.cc: Add another per-thread object for strace. - (quoted): Fix misconception of method used to quote - quotes. - (globify): Optionally output arguments. - (build_argv): Ditto. - (dll_crt0_1): Fix typo in line reassignment. - * debug.cc (class locker): Avoid calling lock multiple times. - * exceptions.cc (call_handler): Set strace recursion flag - to zero when invoking a signal handler. - * fcntl.cc (_fcntl): F_DUPFD should close its argument. - * fork.cc (fork): Move determination of parent process to - a safer place. - * sigproc.cc (get_sig_dispatch_mutex): Rename. Use macro - interface to provide the name of the caller for strace output. - (release_sig_dispatch_mutex): Ditto. - * sigproc.h: Define *_dispatch_mutex wrappers. - * strace.cc (strace_printf): Use new per-thread object to - guard against recursion. - * winsup.h: Define per_thread_strace_protect. Redo per_thread - base class for a little more clarity. - -Wed Oct 7 22:30:43 1998 Geoffrey Noer - - * fhandler_tty.h: up NTTYs from 16 to 128 - -Wed Oct 7 09:15:55 1998 Christopher Faylor - - * fhandler_console.cc (console_read): Distinguish between - 0 byte return from CTRL-C and EOF condition. - -Tue Oct 6 22:31:44 1998 Christopher Faylor - - * dcrt0.cc (build_argv): Rewrite. Now: 1) allocates argv on - the fly, 2) inserts '@' files as they are found, 3) uses - sh-style quoting using either " or ' which may be embedded - in an argument. - (insert_file): Don't scan command line. Accept already - parsed arguments from build_argv. - (quoted): New function for parsing quoted strings. - (globify): Don't scan argv list. Accept element from - build_argv which will be tacked to end of argv as it - is being built. Extend quoting options to allow - tilde, braces, and quotes. - (dcrt0_dll_1): Simplify argv processing. Just call - build_argv, which handles everything. - -Tue Oct 6 11:04:43 1998 Christopher Faylor - - Change Create[A-Z]* calls throughout to use sec_none_nih - to avoid subprocesses accidentally inheriting handles. - * grp.cc: Hold group structures in group_buf rather than - an image of the /etc/group file. - (parse_grp): New function to parse a group line into a - struct group. - (add_grp_line): Use parse_grp to add line from /etc/group - into internal cache. - (read_etc_group): Avoid redundant feof call. Set up - default group. - (getgrgid): Just return appropriate entry from group_buf - rather than reparsing internal representation. - (getgrnam): Ditto. - (getgrent): Ditto. - * hinfo.cc (hinfo::select_*): Set errno value when attempt - is made to use an unopened fd. - * passwd.cc: Hold passwd structures in passwd_buf rather than - an image of the /etc/passwd file. - (parse_pw): New function to parse a passwd line into a - struct passwd. - (add_pw_line): Use parse_pw to add line from /etc/passwd - into internal cache. - (read_etc_passwd): Avoid redundant feof call. - (search_for): Just scan passwd_buf for matching entries. - (getpwent): Just return appropriate entry from passwd_buf - rather than reparsing internal representation. - -Mon Oct 5 18:06:31 1998 Geoffrey Noer - - patch from Corinna Vinschen : - * sysdef/kernel32.def: add missing GetDiskFreeSpaceEx lines - -Sat Oct 3 23:52:23 1998 Christopher Faylor - - * dcrt0.cc (si): Initialize so that NO_COPY will work. - * debug.cc (class locker): Fix previous change. Critical - sections are still required, so protect them if operating - in main thread to avoid signal problems. - Make any previously static use of locker global since that - appears to be the only foolproof way of marking the variable - NO_COPY. Rename these variables to something that is not - likely to be collided with. - * exceptions.cc (call_handler): Signal arrival of a dispatched - signal here and wait a long time for the mutex before giving - up. Should increase performance slightly. - * sigproc.cc (maintid): New external symbol. - * sigproc.cc (maintid): Make this global since it is used - in other places now. - (sig_dispatch_pending): Don't wait for wait_sig to complete - if there are no pending signals. Avoids a race and should - be faster. - (wait_sig): Don't set signal_arrived event here. Do it in - call_handler. - * strace.cc (strace_printf): Remove previous recursion check - since it is not signal safe. - * syscalls.cc (_read): Remove duplicate CreateEvent typo. - -Fri Oct 2 09:54:42 1998 DJ Delorie - - * strace.cc (strace_printf): protect against recursion - -Thu Oct 1 17:08:47 1998 Geoffrey Noer - - * utils/ps.cc (main): add more detailed usage printfs - -Thu Oct 1 11:05:16 1998 Christopher Faylor - - * Makefile.in: Fix typo in debug.o dependency. - * debug.cc (class locker): Give up on using critical sections - since they are not safe to use in the main thread due to signals. - -Wed Sep 30 22:34:42 1998 Christopher Faylor - - * fork.cc (fork): Close parent's parent_alive handle - if there is one or suffer a handle leak. - * syscalls.cc (_read): Make all events no access and - non-inheritable or suffer potential handle leak. - * windows.cc (gethwnd): Ditto. - -Wed Sep 30 17:22:29 1998 Geoffrey Noer - - * include/io.h: add missing setmode proto - -Tue Sep 29 23:33:11 1998 Christopher Faylor - - * fhandler_tty.cc (fhandler_pty_master::close): Make sure - both sides of both pipes associated with a tty master are - closed or suffer handle leaks. - -Tue Sep 29 16:55:00 1998 Geoffrey Noer - - * path.cc (mount_info::init): remove default mounts for - raw devices. - * utils/mount.cc (reset_mounts): ditto - (main, usage): new -f flag disables warning messages about - missing mount point directories. Two new flags, disabled for - now: -c will create missing mount point directory, -g will - select adding the mount point to the global registry location. - * include/sys/mount.h: add MOUNT_GLOBAL define, for future use. - -Tue Sep 29 14:20:30 1998 Christopher Faylor - - * exceptions.cc (exception): Use %p to denote some hex - values. - * winsup.h (read_info): Add jmp_buf to structure. Required - for syscalls.cc change below. - -Mon Sep 28 19:36:41 1998 Syd Polk - - * include/{tchar.h, direct.h}: Added so that - tcl8.1a2 can be compiled with cygwin. - -Mon Sep 28 19:36:41 1998 Christopher Faylor - - * syscalls.cc (thread_reset): Yet another method for - handling interruptible reads. - (_read): Use thread_reset to reset reads after a signal. - -Sun Sep 27 21:11:46 1998 Christopher Faylor - - * cygwin.din: New alias for __cygwin32_stack_trace. - * debug.cc (find_handle): Avoid leaving function without - unlocking. - (newh): Ditto. - * exceptions.cc (__cygwin32_stack_trace): Rename to just - `stack'. Shortens stack trace output. - (exception): Use %p to distinguish register values. - * fhandler_console.cc (fhandler_console::init): Remove - debugging sig_protect. - * init.cc (dll_entry): Move definition to avoid a - compiler warning. - * path.cc (mount_info::conv_to_win32_path): Detect - case of root directory when setting win32 relative - path. - (mount): Remove obsolete label. - * syscalls.cc (thread_sync): New function for exiting - the read helper thread. - (_read): Use new method for exiting the read helper - thread. - -Sun Sep 27 11:25:06 1998 Christopher Faylor - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * delqueue.cc (delqueue_list::process_queue): Clear queue - entry if file cannot be deleted for a reason other than - sharing violation. - -Fri Sep 25 08:52:50 1998 Christopher Faylor - - * debug.cc: locker variables should all be static. - * syscalls.cc (_read): Call ForceCloseHandle on - thread handle since it is protected. - -Thu Sep 24 18:59:25 1998 Geoffrey Noer - - * path.cc (mount): don't verify that path is an existing - directory. Instead - * utils/mount.cc: verify that path is an existing directory - and print warning if it's not. Still do the mount. - -Thu Sep 24 11:45:04 1998 Christopher Faylor - - * debug.cc: locker class variables must be NO_COPY since - they contain data that should not be precisely duplicated - after a fork. This hopefully fixes a "SIGSEGV" problem. - * select.cc (peek_pipe): Pipes apparently should set both - "read" and "exception" flags on EOF. - -Wed Sep 23 18:26:31 1998 DJ Delorie - - * doc/doctool.c (main): typo checking for --help - -Wed Sep 23 17:46:06 1998 Christopher Faylor - - * path.cc (symlink_check_one): Try much harder to ensure that - CloseHandle is called on the file which was opened to check - for a symlink. Avoid obsolete check for NULL buf. - -Wed Sep 23 17:11:50 1998 Christopher Faylor - - * syscalls.cc (_read): Close thread handle or suffer a leak. - * dir.cc (opendir): Simplify logic. - (readdir): Ditto. Close handle explicitly when hit end - of files. - (rewinddir): Close directory handle or suffer leak. - (closedir): Simplify logic. - -Wed Sep 23 14:42:12 1998 Christopher Faylor - - patch from DJ Delorie : - * path.cc (symlink_check_one): Don't re-define res or symlinks - will be undetectable. - -Wed Sep 23 12:02:39 1998 Christopher Faylor - - * Change calls to api_fatal throughout to avoid need for \n - (see below). - Adapt some *_printf()/ExitProcess combinations to use api_fatal. - * winsup.h (SIGTOMASK): Generate signal mask correctly for - programs linked with newer cygwins. - * dcrt0.cc (check_sanity_and_check): Set subtract constant for - signal mask calculation based on whether binary was linked with - "older" or "newer" cygwin. - (do_global_ctors): Accept a second argument indicating whether - the ctors should always be run. Necessary in forked processes - for cygwin constructors which may do more than just allocate memory. - (checkout): Remove obsolete function. - (dll_crt0_1): Remove obsolete function call. Call do_global_ctors - with second argument TRUE. - (api_fatal): Change to a print-style function, allowing arguments. - Always emit a "\n" after a message. - (__main): Do not force running of constructors in forked processes. - * exceptions.cc (call_handler): Simplify arguments passed to this - function. Eliminate potential race by setting signal masks here. - (sig_handle): Just calculate current sigaction pointer once. - Change call_handler arguments. - * fhandler_console.cc (fhandler_console::write_normal): Output - unknown characters to screen. - (fhandler_console::write): Make signal protection synchronous. - * fork.cc (fork): Reorganize slightly to eliminate a compiler warning. - * init.cc (dll_entry): Temporarily remove freeing of waitq_storage - on thread detach until a more robust scheme is developed. - * signal.cc (signal): Make signal protection synchronous. - (sigaction): Ditto. - * sigproc.cc (get_sig_dispatch_mutex): More debug info. - (release_sig_dispatch_mutex): Work around potential bug in windows - with double allocation of a mutex when WaitForSingleObject is - interrupted. Save errno here only if about to call sig_send - where it may be changed. - (wait_sig): Remove unnecessary sig_sign stuff. Add some debugging - output. - * termios.cc (tcflow): Signal protection. - (tcgetattr): Ditto. - (tcsetattr): Make signal protection synchronous. - * winsup.h: Add new extern for SIGTOMASK macro. Use it in SIGTOMASK - macro. Move errno stuff to end so that it can benefit from previous - declarations. - * configure.in: Move AC_CANONICAL_SYSTEM up a little to avoid having - configure generate some code (like the check for host type) twice. - * configure: Regenerate. - -Wed Sep 23 11:49:55 1998 Christopher Faylor - - * path.cc (symlink_check_one): Fix handle leak resulting - from open of file to check for symlink magic. Suggested - by Corinna Vinschen . - -Wed Sep 23 08:33:26 1998 Christopher Faylor - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * fhandler_tty.cc (process_ioctl): Use console handle - for ioctl operations. - -Tue Sep 22 23:58:20 1998 Geoffrey Noer - - based on patch from sos@prospect.com.ru (Sergey Okhapkin): - * utils/ps.cc (main): rewrite ps to give it more options, - including a, e, f, l, and u. - -Tue Sep 22 15:18:41 1998 Geoffrey Noer - - * path.cc (umount): remove initial system_printf - (mount): stat path, verify that it's an existing directory, - otherwise fail. - (strncasematch, strcasematch): return 0 instead of FALSE - * utils/mount.cc (reset_mounts): reset / to System drive, - not C: as was done in the old days. - -Mon Sep 21 18:18:18 1998 Geoffrey Noer - - * path.cc (mount, umount, setmntent, getmntent, endmntent): - make extern "C" - -Mon Sep 21 20:37:16 1998 DJ Delorie - - * doc/configure.in: don't try to find cc until we can correctly - configure it for a native cc in a cross build. - -Mon Sep 21 17:17:14 1998 Geoffrey Noer - - * fhandler.cc (fhandler_disk_file::check_execable_p): - don't check for .shc since that's non-standard. Check for - .exe first. - -Mon Sep 21 14:57:50 1998 Geoffrey Noer - - * doc/Makefile.in: reference -db2html in case docbook - tools aren't installed. - -Mon Sep 21 14:43:40 1998 Geoffrey Noer - - patch from DJ Delorie : - * doc/doctool.c (scan_file): correct off by one error in - malloc - -Mon Sep 21 14:28:38 1998 Christopher Faylor - - * fhandler.h (select_record): Clear memory in constructor. - -Mon Sep 21 08:49:22 1998 Christopher Faylor - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * select.h: Use unsigned int to hold count in fd_set - structure or suffer alignment problems. - (WINSOCK_FD_ZERO): Back out previous change as it - is no longer needed due to the above. - -Sat Sep 19 22:58:18 1998 Christopher Faylor - - * fhandler_console.cc (console_read): Keep looping in - ENABLE_LINE_INPUT mode when no characters are read. - This apparently means that a CTRL-C has been hit. - * select.cc (select_record::operator new): Remove. - (setlect_stuff::~select_stuff): Use delete to remove - record. - (pipe_cleanup): Remove unneeded statement. - (poll_socket): Add debugging statement. - (start_thread_socket): Add debugging statements. - * fhandler.h: Remove new operator from select_record. - * select.h: Make WINSOCK_FD_ZERO more aggressive. - * sigproc.cc (allow_sig_dispatch): Use new errno - saving method. - * syscalls.cc (_read): Reorganize stack freeing - code to avoid overhead when it's not needed and - to actually decommit stack memory. - -Sat Sep 19 19:16:32 1998 Christopher Faylor - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * select.cc (socket_cleanup): Avoid using a pointer - after it has been deleted. - -Fri Sep 18 13:57:37 1998 Christopher Faylor - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * Makefile.in: Really remove extra slash in INCLUDES. - Previous change didn't work. - pipe.cc (make_pipe): set close-on-exec flag for non-inheritable - pipes. - -Thu Sep 17 15:26:14 1998 Christopher Faylor - - * doc/Makefile.in: Add dummy install target. - -Thu Sep 17 12:30:49 1998 Christopher Faylor - - * winsup.h (per_thread*): New classes for storing and - manipulating per_thread information. - (threadstuff): New array of per_thread objects which are - manipulated after a fork. - (read_helper_thread_info): read() thread local storage. - (waitq_storage): wait() thread local storage. - * debug.cc (class locker): New class for generic locking - of debug table manipulation. Use this throughout for - locking access to thread/debug tables. - (debug_init): Remove in favor of automatic constructor. - * debug.h: Ditto. - * fork.cc (fork): Iterate through threadstuff looking - for thread information to clear out. Should solve some - problems for Windows 95/98. - * init.cc (dll_entry): Remove thread storage initialization. - Use per_thread class for DLL_THREAD_DETEACH. - * sigproc.cc: Use system_printf rather than alert_printf - throughout since system_printf now has the same functionality. - (sigproc_init): Use method to initialize per-thread storage. - * sigproc.h: Remove waitq_storage declaration. - * syscalls.cc (_read): Use per_thread class to manipulate - per-thread information. - * wait.cc (wait4): Ditto. - -Wed Sep 16 12:58:49 1998 Christopher Faylor - - * syscalls.c (_read): Lower timeout for signal detection after - EOF on device. Should fix recent configure performance problems. - * Makefile.in: Extend clean target into regexp directory. - -Wed Sep 16 11:44:14 1998 Christopher Faylor - - * fhandler.cc (fhandler_base::set_name): Honor no_free_names(). - (fhandler_base::linearize): Remove unneeded check for NULL - get_win32_name(). - (fhandler_disk_file::fhandler_disk_file): Set path names - to a standard constant. They should eventually be filled - out by fhandler_disk_file::open. - (fhandler_disk_file::open): Detect if win32_path_name_ is - a dummy path. Fill it out from real_path, if so. - * hinfo.cc (hinfo::init_std_file_from_handle): Improve debugging - statement. - (hinfo::linearize_fd_array): Remove unneeded check for NULL - get*_name (). - * path.cc (path_conv::path_conv): Correct problem with - symlinks found at places like E:\. - -Wed Sep 16 02:25:33 1998 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * fhandler.cc (fhandler_disk_file::open): fix typo. - -Tue Sep 15 23:52:44 1998 Christopher Faylor - - * winsup.h: Remove side effects from SLASH_P. - -Tue Sep 15 18:36:08 1998 Ben Elliston - - * sysdef/kernel32.def: Add definition for the Win32 API function - `TryEnterCriticalSection'. - -Tue Sep 15 12:26:48 1998 Christopher Faylor - - * Makefile.in: Remove extra slash in INCLUDES. - * hinfo.cc (hinfo::dup2): Always clear close-on-exec - flag for duplicated handle (problem and fix determined - by Sergey Okhapkin, sos@prospect.com.ru). - * fhandler.cc (fhandler_base::set_name): Avoid use of empty - path names. - (fhandler_base::raw_read): Show error code on failure. - (fhandler_base::linearize): Avoid copying NULL names. - (fhandler_base::open): Use NULL detection in small_printf. - (fhandler_base::dup): Move set_close_on_exec_flag to dup2 - so it is caught in all cases. - (fhandler_disk_file::fhandler_disk_file): Set "no free names" - flag. - (fhandler_disk_file::open): Clear "no free names" flag since - names have been allocated to the fhandler structure at this point. - * fhandler.h (set_no_free_names): Newconditional "no free names" - function. - * hinfo.cc (hinfo::dup2): Clear close on exec here. - (hinfo::linearize_fd_array): Avoid copying NULL names. - * path.cc (normalize_posix_path): Avoid copying trailing slash - if root. - (nofinalslash): Rename variable. - * path.h: Add flag for future use. - * regexp/regerror.c: Avoid including RCS strings in product. - * regexp/regsub.c: Ditto. - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * select.cc (thread_pipe): Sleep for 10ms on every iteration. - (start_thread_pipe): Set the handle in the select structure - so that it will be properly identified in select_stuff::wait. - -Tue Sep 15 12:28:30 1998 DJ Delorie - - * added documentation and doctool.c - -Tue Sep 15 08:37:26 1998 Christopher Faylor - - * Makefile.in: Fix LIBGCC definition for native builds. - Remove CFCOMMON in favor of configure solution. - * configure.in: Default CXXFLAGS to be == CFLAGS. - * configure: regenerate. - -Sun Sep 13 19:52:04 1998 Geoffrey Noer - - * Makefile.in: include ../libio when building - -Sun Sep 13 19:30:58 1998 Geoffrey Noer - - * include/cygwin32/version.h: bump version minor now that - we've merged in all that new code... - -Sun Sep 13 21:34:33 1998 Christopher Faylor - - * dcrt0.cc (do_global_ctors): Reverse call order - of constructors thanks to insight from Mumit Khan - (hkan@xraylith.wisc.edu). - (do_global_dtors): Reflect above change: invoke destructors - in the proper order. - * smallprint.c (__small_vsprintf): Gracefully detect a - null pointer for '%s' format. - * syscalls.cc (_read): Set correct flags to retrieve stack - information or suffer sporadic failures due to uninitialized - flag. - * regexp/regexp.c: Comment out RCS string. This provides - no useful information in the .dll. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - Merge in experimental-980602 branch changes. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * path.cc (symlink_check_one): known_suffix needs to be - determined here in some cases, so deal with it here. - (path_conv::path_conv): More effort needed to propagate - the known_suffix back to caller in every case. - (has_suffix): Return suffix found. - (readlink): Avoid two passes through symlink_check_one. - * spawn.cc (find_exec): Propagate known_suffix from - perhaps_suffix back to caller, if appropriate. - (spawn_guts): Use suffix returned from find_exec to - determine if file should be scanned as a script when - a #! file is found. Avoids a duplicate call to - perhaps_suffix. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * path.h (suffix_info): New struct for dealing with standard - suffix (.exe, .bat, etc.) information. - (path_conv): Constructor now takes a suffix_info argument. - (std_suffixes) Standard array of suffixes to consider "special". - * path.cc (path_conv): Constructor now takes a suffix_info - argument. Record any known suffix in path_conv known_suffix - field. - (has_suffix): New function for determining if a path already - has a known suffix. - (next_suffix): New function for returning the next suffix from - a list of suffixes. - (symlink_check_one): Take an optional suffix_info argument - for suffixes to consider or tack on. - * spawn.cc (std_suffixes): Standard list of executable suffixes. - (perhaps_suffix): Pass std_suffixes to path_conv. Use - new known_suffix field in path_conv to determine if a - suffix has been detected. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - Substitute new str{,n}casematch for strcasecmp throughout. - This implementation is faster since it only tests equality. - - Change fhandler*::open throughout to return true/false - since the pointer returned was never used for anything. - - * Use strcasestr throughout for case insensitive matches for - filenames. - * Makefile.in: Use GNU make construct for determining gcc lib. - * dcrt0.cc (check_sanity_and_sync): Make error message more - explicit. - * debug.h: Better defines for dummy functions when !DEBUGGING. - * fhandler.cc (fhandler_base::fstat): Don't bother zeroing buf - here since it is always done in the caller. - (fhandler_base::~fhandler_base): Recognize cases where *_path_name_ - should not be freed. - (fhandler_disk_file::open): Split into two functions. First - function performs a path_conv and does testing on same. This - calls new fhandler_disk_file::open with path_conv data. New - function is called by stat_worker to avoid extra path tests and - mallocs. - Also, fix long standing off-by-one typo looking for #! magic. - Also, reapply test for != WinNT when checking files for magic. - Otherwise there is a tremendous slowdown in file opening, especially - for stat(). - * fhandler.h: Add support for setting/detecting when *_path_name - should not be freed. - Add new fhandler_disk_file::open declaration. - * hinfo.cc (digits): Remove obsolete function. - (hinfo::build_fhandler): Add default name for FH_DISK. - * path.cc (path_prefix_p_): Don't check beyond len1 for leading - slash. Responsible for reported performance problems? - (path_conv::path_conv): Ensure that fileattr is filled out - correctly in all cases. Return immediately when a file - is detected in !follow_mode. - (nofinalslash): Simplify. - (strncasematch): New function similar to strncasecmp except - that it only checks for =/!= and benchmarks faster than same. - (strcasematch): Ditto, re. strcasecmp. - (strcasestr): New function which does a case-insensitive strstr. - Needed for filename matching. - * smallprint.c (__small_vsprintf): Fix off-by-one in %.ns processing. - * spawn.cc (exe_exts): Make global for eventual use by other modules. - * syscalls.cc (_fstat): Zero buf prior to use. - (stat_worker): Rename from _stat_worker. Reorganize to minimize - mallocs and path name conversions. Should now perform only one - path conversion and 0 malloc/frees. - * winsup.h: Declare new functions. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - Clean up error messages throughout using new strace_printf - options. - * smallprint.c (__small_vsprintf): Add %E option for printing - error code. Understand %.n syntax. - * strace.cc (strace_vsprintf): Common routine for formatting - strace output. Default to always ending with \n unless - string ends with \b. - (strace_write): Common routine for writing to strace output. - (strace_printf): Use above two routines. - (system_printf): Ditto. - * path.cc (path_conv): Scan path to be converted from right - to left for efficiency. Implement extension searching - which is passed from spawn to symlink_check_one to minimize - overhead. - (symlink_check_one): Check extensions for existence for use - with spawn. - (readlink): Accommodate changes to symlink_check_one. - * spawn.cc (perhaps_suffix): Use new extension checking - capabilities of path_conv. - (find_exec_1): Delete. - (find_exec): Generalize to allow searching on any PATH like - environment variable. - * dllfcn.cc (check_path_access): Use find_exec to find a path. - This also ensures that paths are in Windows format which was - not the case before. - * environ.cc (conv_envvars): Add LD_LIBRARY_PATH. - * fork.cc (fork): Clean up dll loading slightly. - * Makefile.in: Turn on compiler warnings. - * winsup.h (save_errno): New class for saving errno from - being clobbered. - * include/sys/strace.h: Make system_printf a macro similar - to strace_printf_wrapper. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * sigproc.cc (sig_send): Attempt to work around Windows strangeness - when thread interrupted while waiting for completion event. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * dcrt0.cc: Remove debugging function DELETEME (). - * fhandler.cc (fhandler_base::fstat): Respond to compiler warning. - * signal.cc (sleep): Reset signal_arrived event before using it or - we could wake up immediately. - (usleep): Ditto. - (pause): Ditto. - * spawn.cc (spawn_guts): Ditto. Respond to compiler warning. - * sigproc.cc (sig_send): More debugging info. - (sig_dispatch_mutex): Only ping wait_sig when needed. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * select.cc (socket_cleanup): Close thread handle or suffer - handle leak. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * select.cc (verify_true): New function. - (fhandler_socket::select_*): Use verify_true for verification - function to avoid multiple calls to socket select. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * select.cc (select_stuff::wait): Scan entire list of fds - when WFMO wakes up. - (set_bits): Add some strace debugging output. - (thread_socket): Ditto. - (verify_ok): Return result of set_bits rather than always 1. - (start_thread_socket): Set the handle in the select structure - so that it will be properly identified in select_stuff::wait. - (fhandler_windows::select_read): Verification routine should - be `poll_windows'. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * sigproc.cc: Change some sigproc_printfs to only occur when - #ifdef DEBUGGING. - * spawn.cc (perhaps_suffix): Search for (PROG is the pathname to - the executable file) PROG.exe, PROG.com, PROG.bat, PROG.cmd, and - PROG and return extension found or NULL if no matching file. - (spawn_guts): If the file name of the executable ends in either - .exe, .com, .bat, or .cmd we assume that it is not a script file - and therefore do not open the file to determine if it is. - Fix "wait_failed" error when exec() called and non-cygwin parent. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * dir.cc (rmdir): Set correct errno when non-empty directory and - Windows9x. - * pipe.cc (pipe): Use binary mode by default for pipes. - * syscalls.cc (_read): Wait for terminated thread to exit before - clearing its stack memory. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * hinfo.cc (hinfo::fixup_after_fork): Start initial fd search - to zero forked processes so that a close(0)/dup(fd) will work. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * fhandler_windows::set_close_on_exec: Deal with possible - NULL handle. - (fhandler_windows::fixup_after_fork): Ditto. - * select.cc (select_stuff:wait): Handle return from - MsgWaitForMultipleObjects correctly for windows case. - * sigproc.cc (sig_send): Reset completion event for main thread. - * syscalls.cc (_read): Better handling of stack free condition. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * exceptions.cc (call_handler): Exit earlier if just running - in an exec'ed stub since the stub may own the sig_dispatch mutex, - but we still want to exit. - * select.cc (select_stuff::wait): Fix check for window activity - from MsgWaitForMultipleObjects. Handle infinite wait correctly. - (poll_windows): Add debugging output. - * spawn.cc (spawn_guts): Protect against signals interrupting - at an inopportune moment. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * select.cc (select_stuff:test_and_set): Take appropriate action - when a select record uses a window_handle. - (fhandler_windows::select_read): Set handle and windows_handle - appropriately. - (fhandler_windows::select_write): Ditto. - (fhandler_windows::select_except): Ditto. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * select.cc (cygwin32_select): Need to reset signal_arrived before - testing it or suffer loop. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * fork.cc (resume_child): Give up on SuspendThread synchronization - and use subproc_ready/forker_finished events. - (sync_with_parent): Ditto. - * sigproc.cc (wait_sig): Make sigcomplete_main manual reset to - allow handling of nested interrupts. - (wait_sig): Fix stupid typo on exit that would cause a - loop to run for a long time. Are exits faster now? - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * exceptions.cc (unlock_cs): Leave decision to release - sig_dispatch_mutex to the caller. - (set_process_mask): Call release_sig_dispatch_mutex explicitly - if needed. - (handle_sigsuspend): unlock_cs no longer takes an argument. - (call_handler): Try to acquire the strace mutex prior to - suspending the main thread to ensure that the mutex is always - released. - (sig_handle): Call release_sig_dispatch_mutex explicitly. - * fhandler_console.cc (fhandler_console::write): Protect against - signals while writing. - * signal.cc (signal): Protect against signal dispatch. - (sigaction): Ditto. - * sigproc.cc (sig_dispatch_pending): Return status no longer needed. - (sig_send): Assume pending_signals if sending signal to self. - (allow_sig_dispatch): Accept synchronize argument to control whether - to wait for wait_sig to do its thing. - (release_sig_dispatch_mutex): Just awaken wait_sig loop and wait - for acknowledgement if waitfor is TRUE. - (wait_sig): Don't ever zero pending_signals to avoid a possible race. - Set pending_signals for blocked signals, too. - * sigproc.h: Add __SIGFLUSH signal. - (class sig_protect): Allow destructor to wait for signal dispatch, - or not given constructor argument. - * strace.cc (get_strace_mutex): Renamed from waitfor_strace_mutex. - (release_strace_mutex): External function for use by call_handler. - This replaces raw calls to ReleaseMutex throughout. - * syscalls.cc (_read): Use sig_protect to protect against signals. - Other cosmetic cleanups. - (_close): Protect function with sig_protect. - * termios.cc (tcsetattr): Protect function with sig_protect. - -Thu Sep 10 21:09:51 1998 DJ Delorie - - * syscalls.cc (_read): typo in matching printf format to args. - - * fhandler.cc (write): Switch to the Microsoft/DJGPP way of - writing out text files: pass \r but prepend \r to \n. - (read): Don't collapse multiple \r's. - - * delqueue.cc: rewritten for speed. Don't check *every* entry in - the list if we know the list is empty, plus check for duplicates. - * delqueue.h: ditto. - * path.cc (path_conv): If a path component is missing, short- - circuit the symlink check. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * fhandler.h: Reorder fhandler status field so that device is - in lower bits. This allows gcc to optimize access to the device. - * hinfo.cc: Inline not_open(). - * winsup.h: Inline hinfo::not_open(). Make hinfo::[] operator a - simple array reference. - * strace.cc: Change strace() to a macro. - * include/sys/strace.h: Ditto. - * syscalls.cc (read_handler): New function. Called directly from - _read for "non-slow" devices or via read_handler for slow devices. - (_read): Use read_handler for reading. - (read_helper): Ditto. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * dcrt0.cc (do_exit): Don't ignore signals if reparenting. - Besides being a race, this screws up the process which is - actually executing. - * fork.cc (fork): Don't create a new process group when - forking or subprocesses won't respond to CTRL-C. - * syscalls.cc (_read): Ensure correct setting of EINTR errno. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * fork.cc (sync_with_child): Consider it a success if the child - has set the subproc_ready signal regardless of whether it has - exited or not. - * init.cc (dll_entry): Set read_helper_thread_info stuff to 0 - on dll initialization. Windows 95 seems to keep garbage here, - despite documentation to the contrary. - * syscalls.cc (_read): Report on errors to create read_helper - events. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * dcrt0.cc (compute_argc): Limit debug_printf string argument size - or suffer a buffer overrun. - (do_exit): Add debugging statement. - * exceptions.cc (call_handler): Remove extraneous sigproc_printf. - Consolidate signal_arrived event with sig_was_dispatched. - (events_terminate): Consolidate signal_arrived event with - sig_was_dispatched. - * fhandler.h: Rename a field to something more mnemonic. - * fhandler_tty.cc: Throughout: Only set up fhandler_tty_master when - actually using ttys. Change tty_master `f' field to `console'. - * tty.cc: Ditto. - * fork.cc (sync_with_child): Add more information to "child died" - error. - * hinfo.cc (hinfo::build_fhandler): Call tty master constructor - when appropriate. - * select.cc (select_stuff::wait): Consolidate signal_arrived event - with sig_was_dispatched. - * sigproc.h: Ditto. - * syscalls.cc (_read): Ditto. - * winsup.h: Ditto. - * sigproc.cc: Ditto, throughout. - (block_sig_dispatch): Don't reset signal_arrived. Causes races. - * spawn.cc (spawn_guts): Limit debug_printf string argument size - or suffer a buffer overrun. - * include/sys/strace.h: Implement strace_minimal for very minimal - output which, hopefully, will not affect the behavior of traced - programs as much. - -Thu Sep 10 21:09:51 1998 Geoffrey Noer - - * Makefile.in: build libwinspool.a with the dll name winspool.drv - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * dcrt0.cc (build_argv): Remove verbose debug_printf. - (dll_crt0_1): Use shared data handle passed in from parent process - when appropriate. Remove extraneous debug_printf. - * environ.cc (getwinenv): New function. Returns (possibly cached) - native version of an environment variable. - (win_env::add_cache): Add cached version of posix and win env - variables to local table. - (posify): Modify for use with native caching. - (setenv): Convert special environment variables to native here, - when they are set. - (struct parse_thing): Simplify struct. - (struct parse_things): Extend table to accommodate "envcache" - setting. - (parse_options): Add "envcache" option to control whether special - environment variables are cached. Simplify handling of remembered - parameters. - (winenv): Modify for use with getwinenv. - * exceptions.cc (unlock_cs): release_sig_dispatch takes an argument - now. - (set_process_mask): unlock_cs now wakens wait_sig when appropriate. - (handle_sigsuspend): Reorganize to take advantage of new behavior - of release_sig_dispatch_mutex and hopefully avoid a race. - (handle_sig): Avoid waking wait_sig if we couldn't get the dispatch - mutex. - * exec.cc (strccpy): Change to modify second argument to point - to position where "parse" stopped so that it doesn't have to be - recalculated by the caller. - (sexecvpe): Use find_exec () to find program to run. If you've - got a function for this, you might as well use it. - * fhandler_tty.cc (fhandler_pty_master::process_input_to_slave): - Report on signal being sent in termios_printf. Use kill_pgrp - interface. - * fork.cc (fork_copy): Just copy everything at once rather than - in individual pieces. - (fork): Potentially move up sbrk() when DEBUGGING so that parent - and child heaps are in sync. Pass cygwin_shared_h to child. - * path.cc (path_conv::path_conv): Make sure that a file is not - a symlink when returning immediately. - * sigproc.cc (sig_dispatch_pending): Return TRUE if signals were - pending. - (sigproc_init): Move sig_was_dispatched initialization here so - that it will always be available to other functions which rely - on it. Otherwise these functions would have to wait for wait_sig - to complete its initialization. - (sig_send): Rework SIGSUSPEND handling. - (release_sig_dispatch_mutex): Wait for signal to be dispatched - after releasing mutex if argument is TRUE. - (wait_sig): Remove sig_was_dispatched initialization from here. - * sigproc.h: release_sig_dispatch takes an argument. - * spawn.cc (perhaps_suffix): Take an optional argument indicating - whether the path has already been converted to win32. - (find_exec_1): Use getwinenv to get windows version of PATH. Use - windows version of individual directories to avoid posix lookups. - (spawn_guts): Call strace_dump here to cause strace output to - be slightly more synced when using strace caching. - (spawnvpe): Use find_exec () to find program to run. If you've - got a function for this, you might as well use it. - * syscalls.cc (_read): Only block signals for "slow" devices. - * winsup.h: Changes needed for previous checkin and getwinenv. - -Thu Sep 10 21:09:51 1998 DJ Delorie - - * path.cc (path_conv): bug fix when path ends in slash - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * fhandler.cc (fhandler_base::set_name): Use fhandler - method for determining native name. Avoid path_conv - when possible. - (fhandler_disk_file::get_native): New function, returns - windows name of disk file. - * fhandler.h: Add get_native() method to fhandler_* - classes. - * fhandler_serial.cc (fhandler_serial::get_native): Return - windows name of serial port. - * fhandler_tty.cc (fhandler_tty_master::init): Use consistent - name for tty master. - * fork.cc (fork_copy): Experimental change to avoid loop. - * grp.cc (add_grp_line): Use realloc to extend group buffer. - * hinfo.cc (hinfo::release): fd object should be deleted, - not freed or suffer a memory leak. - (init_std_file_from_handle): Reset first_fd_for_open to - signal that std* locations have been opened. Avoids use - of these locations prior to full dtable setup. - * passwd.cc (add_pwd_line): Use realloc to extend passwd buffer. - * path.cc (path_conv::path_conv): Avoid checking for symlinks on - network shares. Check for existence of file prior to taking - it apart for symlink checking (this needs more work). - (windows_device_names): Make global. - (get_device_number): Detect tty master. - * sigproc.cc (wait_sig): Maintain a flag which indicates when - signals are queued due to the wait_sig's inability to get a - sig_dispatch mutex. - (sig_dispatch_pending): Don't wake up the wait_sig thread if - unless there are signals queued (see above) or force argument. - (allow_sig_dispatch): Only wait for signal dispatch if something - is queued. - * sigproc.h: allow_sig_dispatch takes a (defaulted) argument now. - * syscalls.cc (_open): Use default hinfo::find_unused_handle call. - * net.cc: Ditto, throughout. - * pipe.cc: Ditto. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * dcrt0.cc (do_exit): Ignore user initiated signals here. - * fhandler.cc (fhandler_disk_file::open): Detect error condition - on fhandler_base::open. - * fhandler_console.cc (undo_input): Respond to compiler warnings. - * grp.cc (getgrgid): Ditto. - * times.cc (_tzname): Ditto. - * fhandler_tty.cc (fhandler_Tty_slave::open): Cosmetic changes. - * fork.cc: Clean up debugging output. - * pinfo.cc (pinfo_init): Set pgid and sid to different values - initially. Let user program set sid appropriately if it is - to be the owner of a tty. - * sigproc.cc (allow_sig_dispatch): Try harder to detect when we - should wait for a signal dispatch. - * strace.cc (strace_open): Revert to previous mutex behavior. - * include/sys/strace.h: Ditto. - * syscalls.cc (_open): Detect error from fhandler open. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - Global changes: - Store win32 name in fhandler structure to avoid multiple translations. - Support close_on_exec at the Win32 level for all but sockets. - Respond to gcc warnings. - Use single fstat() call for devices. - *::set_close_on_exec modified. - * dir.cc (opendir): Use win32 name in stat to speed things - up a little. - * debug.cc: New file. Provides routines for extra debugging - when -DDEBUGGING is specified. - * debug.h: New file. Definitions for debug.cc. - * exceptions.cc (signals_init): Break out signal initialization - from exceptions. - (dump_status): Add thread name to stack dump output. - (handle_exceptions): Renamed. - (set_process_mask): Don't ever mask non-maskable signals. - (ctrl_c_handler): Preliminary change to allow propagation of - cygwin signals back to gdb. - (sig_handle): Call do_exit directly from signal thread rather than - attempting to redirect the main thread. - * fhandler.cc (set_name): Store win32 name in fhandler structure. - (*::open) name field is extraneous now. Use get_win32_name () to - retrieve stored win32 name. - (fhandler_base::fstat): Default to performing fstat on a device. - (fhandler_disk_file::fstat): Renamed from fhandler_base::fstat. - Operate only on disk files. - (fhandler_base::set_close_on_exec_flag): New function sets flag - without touching the handle. - (fhandler_base::~fhandler_base): Free unix/win32 path names. - (fhandler_disk_file::close): Only call delqueue.process_queue from - this function since disk files are the only things that can - be unlinked, currently. - (fhandler_dev_null::open): Delete. - (set_inheritence): New function. Set handle inheritence. - (fhandler_*::fork_fixup): New functions. Inherit fhandler data - after a fork. - fhandler.h: *::set_output_handle - new method. - Setup methods for use by select(). - fork.cc (fork): Call fixup_after_fork in child to inherit - handles marked as non-inheritable on CreateProcess. - hinfo.cc (hinfo::build_fhandler): Use new function to detect - devices. - (dup_for_exec): Delete obsolete function. - (hinfo::dup2): Remove extraneous tests. - (hinfo::select_*): Interfaces into select(). - (hinfo::release): Free fd in dtable. - (hinfo::fixup_after_fork): New function. Inherit close-on-exec - handles from parent after fork. - path.cc (mount_info::posix_path_p): Make inline. - (path_conv::path_conv): Short circuit when path resolves to a device. - (digits): Move here from hinfo.cc. - (windows_device_names): Win32 names for Cygwin devices. - (get_device_number): New function. Return devie number given device - name. - (win32_device_name): New function. Decode a windows device name - and an optional "unit". - (mount_info::conv_to_win32_path): Short circuit when path resolves to - a device. - * path.h: add device and unit fields to path_conv class. - * select.cc: Rewrite for more structure, more OO. - * sigproc.cc: (get_sig_dispatch_mutex): New function. - (release_sig_dispatch_mutex): New function. - * sigproc.h: sig_protect class. Automatic protection from signals - when used. - * syscalls.cc (stat_dev): New function. - (stat_worker): Short-circuit when a cygwin device is detected. - * utils/ps.cc: Don't lock_pinfo when -f. Compress format to fit - more on a line. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Register name for main thread. - * exceptions.cc (dump_status): Add thread name to diagnostic output. - (__cygwin32_exception_handler): Rename to handle_exceptions. Avoid - creating a .core file. - * exec.cc (sexecve): Reflect spawn_guts argument change. - * fhandler_tty.cc (fhandler_tty_master::init): Use makethread to - create a new thread. - * select.cc: Create pipe/socket threads each time select is called. - Use thread termination as indication of fd readiness. - * sigproc.cc (sigproc_init): Use makethread to create a new thread. - (wait_sig): Simplify default signal call slightly. - * spawn.cc (spawn_guts): Accept child pinfo pointer rather than - pid. Reorganize so that common initialization is handled once. - * strace.cc: Set strace_mutex to NULL initially to catch CreateMutex - errors. - * window.cc (gethwnd): Use makethread to create a new thread. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * Makefile.in: Add debug.o target. - * cygwin.din: Separate pipe from _pipe. - * dcrt0.cc (alloc_stack): New, more precise method for allocating - stack space after a fork. - (dll_crt0_1): Use new child_proc_info class to retrieve information - from possible parent process. Remove #ifdef erroneously checked in. - Remove extraneous syscall_printf. - * exceptions.cc (signals_init): New function. - * fhandler.cc (fhandler_make_pipe): Move to pipe.cc. - * fhandler.h (fhandler_base): New = operator preserves unix_path_name_. - * fhandler_tty.cc: Strip some tty functions from here into tty.cc. - * fork.cc: Remove obsolete ifdefs. Reorganize, streamline with new - fork. - * hinfo.cc: Speed up build_fhandler. - * libccrt0.cc: Remove obsolete ifdefs. - * pinfo.cc (pinfo_init): Simplified by new fork/spawn info passing - method. - * pipe.cc (make_pipe): Moved from fhandler.cc. Handles MS-style - _pipe. - (pipe): Use new arguments to make_pipe. - (_pipe): New MS-compatible function. - * shared.cc: cygwin_shared_h make global so that it can be inherited - via new fork/spawn info passing method. - (open_shared_file_map): Detect if shared info is already set up from - fork/spawn. - * sigproc.cc (sigproc_init): Initialize signals with signals_init here. - Use new fork/spawn info passing method. - * spawn.cc (spawn_guts): Pass information in a structure to spawned - process. Identify structure type with a "magic number". - * strace.cc (strace_printf): Only print program full path spec once - to save space and clutter. Preserve any windows error. - * syscalls.cc (_open): Detect and avoid error return from - build_fhandler. - * tty.cc: Accept some non-fhandler functions formerly found in - fhandler_tty.cc - * winsup.h (pinfo): Remove some fields obsoleted by new fork/spawn - info passing method. - (child_info*): New classes for passing information to forked/spawned - process. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - * Makefile.in: Add debug.o target. - * console.cc (fhandler_console::char_command): Fix failed merge. - * dcrt0.cc (alloc_stack): New, more precise method for allocating - stack space after a fork. - (dll_crt0_1): Use new child_proc_info class to retrieve information - from possible parent process. Remove #ifdef erroneously checked in. - Remove extraneous syscall_printf. - -Thu Sep 10 21:09:51 1998 Christopher Faylor - - Global changes: - Replace pinfo hmap entry with "dtable" reference. - Replace cygwin_shared .t field with '.tty' and allow indexing via - tty into this array. - Make fhandler_ constructors set the size of the structure into any - created class. - Change fhandler settings into a bit mask. Use methods to access. - Record device type in fhandler class. - Remove old linearize/de_linearize code in favor of newer method - uses more bullet-proof method for determing device type of inherited - files. - Protect various important handles from closing when operating - under -DDEBUGGING. - * dcrt0.cc (do_global_ctors): Renamed, made static and reused - for calling from dll_crt0_1 to initialize cygwin.dll constructors. - (do_global_dtors): Renamed. - (dll_crt0_1): mark noreturn. Use new do_global_ctors function. - Call debug_init to initialize features turned on by -DDEBUGGING. - Call dtable_init to initialize dtable, hinfo_init to initialize - standard fds. - (dll_crt0): Mark noreturn. Move constructor calls to dll_crt0_1. - (__main): Use new do_global_ctors (). - Remove OLDWAY and _PPC_ conditionals. - * environ.cc (environ_init): Use appropriate strace printf. - * exceptions.cc (set_process_mask): Don't ever mask out unmaskable - signals. - * init.cc (dll_entry): Initialize storage for read_helper. - * pinfo.cc (init_from_exec): Delete obsolete function. - * sigproc.cc (sig_send): Implement myself_nowait to allow - sending a signal to myself without waiting for synchronization. - (wait_sig): Change method for determining whether signal should - be examined slightly. - * strace.cc (strace_printf): Add ability to report on thread from - which message originated. - (threadname): New function - * syscalls.cc (read_helper): New function. Invoked in separate thread - from _read. - (_read): Use a separate thread for reads that can be interrupted - with a TerminateThread(). Allows EINTR. - (setdtablesize): Use new method for extending the size. Callable - from anywhere. - (getdtablesize): Use new method for getting the current dtable size. - * tty.cc: Remove use count in favor of a method which checks tty - availability via an event. Some code cleanup. - (tty::inuse): New function for determining if a tty is - in use by any process. - (tty_list::terminate): Use new method for determining if a tty is in - use. Should avoid hangs waiting for non-existent processes to - free up a tty. - (tty::common_init): Common initialization for tty/pty master. - (fhandler_tty_master::init): New function. - (do_output): Use new method for determining if a tty is in use. - (fhandler_pty_master::open): Use comon initialization code. - (fhandler_pty_master::ptsname): static buffer is ok now. - * tty.h: Reflect inuse changes and tty.cc cleanup. - * winsup.h: Include debug.h for use when -DDEBUGGING. Remove - stuff previously here which was conditionally compiled with -DDEBUGGING. - (hinfo_vec): Rename to hinfo. Maintain argv style list of pointers - to open fds. Add methods to deal with above changes. - (pinfo): Removals due to above changes. - (shared_info): Rename t to tty. - Add common defines to extern "C" section. - -Wed Sep 9 22:24:50 1998 Christopher Faylor - - * path.cc (path_prefix_p_): Rewrite to avoid false match - against root when remote path or \\x style disk device. - * include/sys/strace.h: Implement new macro for use by - malloc_printf which does not default to "on" if STRACE=1. - This avoids massive strace logs. - -Tue Sep 8 11:31:42 1998 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Remove ill-advised ifdef NEEDOEM. - -Thu Sep 3 17:54:18 1998 Christopher Faylor - - * Makefile.in: Speed up dll links. - * path.cc (chdir): Fix previous change. - -Mon Aug 31 12:23:33 1998 Christopher Faylor - - * path.cc (chdir): Protect free from potential signal race. - -Fri Aug 28 15:59:27 1998 Geoffrey Noer - - * dlfcn.h: delete, move it - * include/dlfcn.h: here - -Thu Aug 27 14:20:38 1998 Christopher Faylor - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * path.cc (path_conv::path_conv): remove trailing backslash from - full win32 name, otherwise the last component of the path isn't - checked for symlink. - -Wed Aug 26 14:15:22 1998 Christopher Faylor - - * fhandler.h (fhandler_base): Make set_name() public and implement - clear_name() to accommodate dup2. - * hinfo.cc (dup2): Previous change exposed problem with dup2. - Same unix_path_name_ ptr was being used in two separate fds. - Fix this. - -Wed Aug 26 12:10:27 1998 Christopher Faylor - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * malloc.cc: Use malloc_printf throughout. - * path.cc (getcwd_inner): Allocate buffer with realloc to - avoid a memory leak. - * syscalls.cc (_close): delete unix_path_name_ explicitly since - destructor is never called. - * include/sys/strace.h: Add strace_malloc stuff. - -Mon Aug 24 15:45:59 1998 Geoffrey Noer - - * include/sys/ioctl.h: variable names in protos should start - with two leading underscores. - * include/sys/mman.h: ditto. - * include/sys/mount.h: ditto. - * include/sys/resource.h: ditto. - * include/sys/smallprint.h: ditto. - * include/sys/socket.h: ditto. - * include/sys/strace.h: ditto. - * include/sys/vfs.h: ditto. - * include/sys/wait.h: ditto. - * include/mntent.h: ditto. - -Tue Aug 18 17:00:20 1998 Geoffrey Noer - - patch from Trevor Yann (TYann@vet.com.au): - * uname.cc (uname): report processor type for win98 - -Tue Aug 18 16:09:13 1998 Christopher Faylor - - * fork.cc (cygwin_fork_helper1): Start initial fd search - to zero forked processes so that a close(0)/dup(fd) will work. - -Mon Aug 17 16:58:09 1998 Christopher Faylor - - * winsup.h (hinfo): Remember initial fd to start searching - for new fds. This avoid assigning std/in/out/err to - files opened early in initialization. - (hinfo_vec::find_unused_handle): New default way to search - for a new handle. Avoids using std/in/out/err until the - proper time in the initialization. - * fhandler.cc (fhandler_make_pipe): Use default method for - finding unused handle. - * net.cc: Ditto throughout. - * pipe.cc (dup): Ditto. - * syscalls.cc (_open): Ditto. - * hinfo.cc (hinfo_vec::init_std_file): Set initial fd for open - search to include std/in/out/err. - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * spawn.cc (perhaps_suffix): Use translated win32 path when - determining if a .exe extension should be added or suffer adding - a .exe extension twice. - -Mon Aug 10 15:08:49 1998 Geoffrey Noer - - * include/cygwin32/version.h: up minor version number - -Mon Aug 10 07:04:13 1998 DJ Delorie - - * delqueue.cc: rewritten for speed. Don't check *every* entry in - the list if we know the list is empty, plus check for duplicates. - * delqueue.h: ditto. - -Sat Aug 8 14:03:52 1998 Eric Bachalo - - * spawn.cc (perhaps_suffix): If report_failure_p is non-zero this - function will search for (PROG is the pathname to the executable - file) PROG.exe, PROG, PROG.com, PROG.bat, and PROG.cmd and return - either the full path name if found or NULL if not. - (spawn_guts): If the file name of the executable end in either - .exe, .com, .bat, or .cmd we assume that it is not a script file - and therefore do not open the file to determine if it is. - -Thu Aug 6 22:25:38 1998 Christopher Faylor - - * path.cc (path_conv): If a path component is missing, short- - circuit the symlink check. Bug fix for case where path ends - in a slash. - (path_conv::path_conv): Make sure that a file is not - a symlink when returning immediately. Avoid checking for - symlinks on network shares. Check for existence of file prior - to taking it apart for symlink checking (this needs more work). - -Sun Aug 2 19:17:59 1998 Christopher Faylor - - * select.cc (cleanup_pipe_thread): Cleanup thread handle or suffer - handle leak. - (cleanup_socket_thread): Ditto. - * sigproc.cc (proc_subproc): Make wait thread manual reset to - solve problem with nested waits not waiting correctly. - * fhandler_tty (fhandler_tty_slave::open): Don't create the output - mutex, just open it. If it can't be opened, its an error. - -Wed Jul 29 12:08:19 1998 Eric Bachalo - - * include/Windows32/Defines.h: Added Virtual-Key Code defines - for the Win95 keys - VK_LWIN, VK_RWIN, and VK_APPS. - -Tue Jul 21 14:47:59 1998 DJ Delorie - - * path.cc (path_prefix_p): optimize calls by comparing first - characters inline. - (path_conv): optimize by not checking both foo and foo/ for - symbolic links. - -Tue Jul 21 14:39:03 1998 Christopher Faylor - - * pinfo.cc (pinfo_init): Set myself->sid to 1 so that - a program started up outside of cygwin will not trump - other opens of ttys. Fixes problem with pgid change below. - -Tue Jul 21 12:59:21 1998 Christopher Faylor - - * path.cc (chdir): Force chdir to disk device to go to the root - directory. - -Tue Jul 21 09:32:23 1998 Christopher Faylor - - * pinfo.cc (pinfo_init): 0 is a very bad value for a default pgid. - -Fri Jul 16 15:09:50 1998 Stan Cox - - * (gcrt0.c, gmon.c, profil.c, mcount.c, gmon.h, profil.h, - config/i386/profile.h): New files for gprof cygwin support. - Some code contributed by Tim Newsham for Secure Networks, Inc. - * Makefile.in (LIBGMON_A, GMON_START, GMON_OFILES): New for gprof. - -Mon Jul 13 19:29:00 1998 Eric Bachalo - - * dcrt0.cc (insert_files): Now both -@file and @file work as - command line file insertion options. - * fhandler_serial.cc (fhandler_serial::open): Enabled RTS Control - Line by default to make full handshaking cables work for the - D10V board. (CDB.fRtsControl) - (fhandler_serial::tcsetattr): same as above - -Wed Jul 8 15:53:35 1998 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Avoid redundant strace_printf. - -Wed Jul 8 15:05:10 1998 DJ Delorie - - * fhandler.cc (fhandler_base::lseek): Note lseek so that next - write() can check for the Win95 "gap" bug. - (fhandler_base::write): If Win95 and lseek past eof - followed by write, use WriteFile to force the "gap" to be filled - with zeros rather than left to the "undefined" data Win32 specifies. - (fhandler_base::fhandler_base): initialize check_win95_lseek_bug_. - * fhandler.h (class fhandler_base): Add check_win95_lseek_bug_ - for bug: when seek past EOF and write, win95 fills with random - data (security hole). - -Thu Jul 2 10:45:15 1998 Christopher Faylor - - * environ.cc (winenv): Be more paranoid when restoring special - win32 environment variables beginning with '='. - -Thu Jul 2 09:19:32 1998 Christopher Faylor - - * environ.cc: Previous change was not rigorous enough. - Track environment variables to convert in a structure which - records the correct function for converting the environment - variable from/to POSIX format. - (isspecial): New function. - (parse_options): Use template to initialize parse array. - (posify): Use new conversion function. - (winenv): Ditto. Also restore special win32 environment variables - beginning with '='. - * path.cc (conv_path_list): Source argument should be const. - (win32_to_posix_path_list): Ditto. - (posix_to_win32_path_list): Ditto. - * path.h: Reflect changes to path.cc. - -Tue Jun 30 14:00:32 1998 Christopher Faylor - - * environ.cc (winenv): Avoid converting environment variables to - windows style if they begin with something like a 'C:'. - -Sun Jun 28 20:59:16 1998 Christopher Faylor - - * include/Windows32/Structures.h (MINMAXINFO): Add a missing - *LP... - -Thu Jun 25 10:45:38 1998 Christopher Faylor - - * signal.cc (sigpending): Stop from always reporting pending signals - when no signals are actually pending. - -Tue Jun 23 15:38:45 1998 Christopher Faylor - - * Makefile.in: Add a new target. - * cygwin.din: Add cygwin32_internal interface. - * dcrt0.cc (dll_crt0_1): Don't call main if no main set. Allows - initialization from a .dll. - * utils/ps.cc: Use new internal/external interface to cygwin to - provide an unchanging interface to some cygwin internals. - * external.h: Preliminary stab at an interface to cygwin32 for - getting at the "naughty bits". - * external.cc: External interfaces to some cygwin internal stuff. - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * exceptions.cc (sig_handle): When abnormally terminating, - close_all_files in signal thread context to prevent socket hangs. - -Thu Jun 18 15:17:06 1998 Christopher Faylor - - * pinfo.cc (pinfo_list::allocate_pid): Wrap pids at SHRT_MAX - or ash complains. - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * window.cc (WndProc): Always kill timer before starting up - a new one or eventually suffer a timer proliferation. - -Mon Jun 15 09:40:30 1998 Christopher Faylor - - * exceptions.cc: Cosmetic change. - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * syscalls.cc (system): Ignore SIGINT, SIGQUIT and SIGCHLD while - in a system() call. - -Thu Jun 11 18:37:02 1998 Geoffrey Noer - - * include/sys/syslog.h: add missing LOG_LOCALn bits - -Tue Jun 9 22:29:26 1998 Christopher Faylor - - * dll_init.cc (DllNameIterator::operator const char* ()): Add - a missing \n to a *_printf. - * fhandler_tty.cc (fhandler_tty_slave::dup): Ditto. - (fhandler_tty_slave::ioctl): Ditto. - * errno.cc (errmap): Add an unrepresented windows error. - Simplify table. - -Tue Jun 9 17:21:44 1998 Christopher Faylor - - * errno.cc (errmap): Make sure that errmap array is - terminated with a NULL or suffer a SIGSEGV. - -Tue Jun 9 10:30:02 1998 Christopher Faylor - - Change `sprintf' to `__small_sprintf' throughout cygwin. - * cygwin.din: Don't export exception handler. - * exceptions.cc (__cygwin32_exception_handler): Rename to - handle_exceptions. Make static. Redo core file generation - slightly so that __small_sprintf can be used. - (call_handler): Remove use of `rethere' in asm code. Don't - probe stack as this is potentially dangerous unless done - meticulously. - * select.cc (select): Redo to create thread whenever needed - for pipe/socket. Thread termination denotes fd readiness. - -Mon Jun 8 14:31:11 1998 Christopher Faylor - - * hinfo.cc (set_std_handle): New function to set windows - "standard" handles from cygwin handles. - (hinfo_vec::dup2): Set windows standard handle if appropriate. - * syscalls.cc (_open): Set windows standard handle if appropriate. - -Sun Jun 7 16:34:00 1998 Christopher Faylor - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * fhandler_console.cc (fhandler_console::scroll_screen): Add a - workaround for Win95 ScrollConsoleScreenBuffer bug which allowed - scrolling to work correctly in both directions. - (fhandler_console::char_command): Simulate underscore with cyan - instead of magenta like on a real linux console. - -Sat Jun 6 00:01:18 1998 Christopher Faylor - - * dcrt0.cc: Remove obsolete PPC and OLDWAY defines. - * exceptions.cc: Remove obsolete PPC defines. - -Fri Jun 5 22:18:01 1998 Christopher Faylor - - * utils/Makefile.in: install should build products if necessary. - -Fri Jun 5 17:47:11 1998 Geoffrey Noer - - * errno.cc (seterrno): shouldn't & against 0xff since there - are error codes above 255. - -Fri Jun 5 14:35:36 1998 Christopher Faylor - - * exceptions.cc (ctrl_c_handler): Ignore CTRL_LOGOFF_EVENT or - everybody gets signalled when a user logs off. Allow program - to clean up when receiving a CTRL_CLOSE_EVENT or CTRL_SHUTDOWN_EVENT. - * spawn.cc (_spawnve): Delete hmap.vec from created child since - it just gets overwritten in the child anyway. - * pinfo.cc (lpfu): u -> user_data. - -Thu Jun 4 22:45:12 1998 Geoffrey Noer - - * mmap.cc (mprotect): 3rd arg to VirtualProtect call should - be new_prot, not prot. Also, fix check for PROT_NONE (==, - not &). - -Wed Jun 3 16:37:43 1998 Geoffrey Noer - - * exceptions.cc: Fix typo in comment - (ctrl_c_handler): Add comments, return FALSE on CTRL_CLOSE_EVENT, - CTRL_LOGOFF_EVENT, and CTRL_SHUTDOWN_EVENT events. Otherwise, - we handle the console event ourselves, send a SIGINT, and return - TRUE. - -Wed Jun 3 14:36:08 1998 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * path.cc (conv_to_win32_path, conv_to_full_win32_path): resolve - symlinks before converting. - -Wed Jun 3 02:11:23 1998 Geoffrey Noer - - * exceptions.cc (ctrl_c_handler): return zero when a - CTRL_LOGOFF_EVENT occurs. - -Wed Jun 3 01:01:17 1998 Geoffrey Noer - - Reorganize fhandler-related file layout. - * Makefile.in: Remove console.o, add fhandler_console.o. Add - fhandler_serial.o. Remove tty.o, add fhandler_tty.o. - * fhandler_console.cc: Was console.cc. - * console.cc: Delete. - * fhandler_serial.cc: Was code in fhandler.cc. - * fhandler.cc: Delete fhandler_serial routines. - * fhandler.h: Fix comments describing fhandler file layout. - * fhandler_tty.cc: Was code in tty.cc. - * tty.h: Delete. - * fhandler_tty.h: Was tty.h. - * tty.cc: Delete code moved to fhandler_tty.cc. - * winsup.h: Include fhandler_tty.h instead of tty.h. - -Tue Jun 2 23:34:42 1998 Geoffrey Noer - - Don't need processor-specific sysdef directories: - * sysdef/powerpc: remove all files - * sysdef/i386: move all files to top of sysdef directory - * configure.in: stop setting processor-specific sysdef variable - * configure: regenerate - * Makefile.in: build .a files from top-level sysdef files. - -Tue Jun 2 16:52:18 1998 Geoffrey Noer - - patch from lhall@rfk.com (Larry Hall): - * console.cc (fhandler_console::fhandler_console): call - fillin_info() to check if console attributes have already been - set. If so, set the default foreground color to be the default - for the console, otherwise set it to white. - (fhandler_console::char_command): use the default color to set fg, - bg, and bold for all cases. - -Mon Jun 1 14:05:01 1998 Christopher Faylor - - * dir.cc (writable_directory): Avoid a malloc. - (opendir): Convert to fully qualified path spec. Use inode from - stat as hash instead of recalculating. - (readdir): Try hard to generate the same inode for filenames - as inodes returned from stat(). Handle '.' and '..' inodes - differently than normal files. Note that '..' will still fail - in certain pathological conditions. - * fhandler.cc (fstat): Preserve errno around path conversion. - * path.cc (path_conf::path_conv): Add an extra argument signifying - whether caller wants a fully qualified Windows spec. - (get_current_directory_name): New function. Retrieves current - directory name into internal buffer. - (getcwd_inner): Reorganize. Use get_current_directory_name() - to retrieve a (possibly cached) directory name. - (hash_path_name): Move function here from syscalls.cc. Rewrite to - deal (simplistically) with non-absolute path specs. Use - get_current_directory_name to absolutize path. - * path.h: Reflect additional argument for path_conv. - * select.cc (cygwin32_select): Remove newline from select_printf(). - * syscalls.cc (hash_path_name): Move to path.cc. - (stat_worker): Always use full path spec so that inodes are - calculated correctly. - * uinfo.cc (getlogin): Make extern "C". - * include/sys/resource.h: Put extern "C" around this file. - -Mon Jun 1 13:16:03 1998 Christopher Faylor - - * console.cc: Comment out small_printfs which issue errors - on things like invalid escape sequences. This is very much - unlike a normal terminal, or even like linux which console.cc - purports to emulate. - (console_read): Renamed from FakeReadConsole. Streamline - slightly. - (fhandler_console::read): Ditto. - -Fri May 29 22:41:18 1998 Geoffrey Noer - - * hinfo.cc: Include unistd.h, not fcntl.h. - -Fri May 29 21:38:10 1998 Christopher Faylor - - * path.cc (mount_info::binary_win32_path_p): Don't allow - the root mount to replace a //drive or //host specification. - -Fri May 29 08:20:28 1998 Geoffrey Noer - - * winsup.h: Remove exports section in favor of external - include files. Fix some comments. - * {console.cc, fcntl.cc, pipe.cc}: Include unistd.h. - * dcrt0.cc (__main): Make extern "C". - * strace.cc: Include time.h. - * wait.cc (_wait): Make extern "C". - * version.h: Bump minor version to 3 in honor of /dev/windows - support. - -Fri May 29 03:11:28 1998 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * Makefile.in: Add fhandler_windows.o target - * fhandler.h: Include . fhandler_windows: new - fhandler class that handles access to Windows message queue. - (fhandler_base::is_windows): new virtual member function - * fhandler_windows.cc: New file, fhandler_windows class - implementation. - * hinfo.cc (hinfo_vec::build_fhandler): build fhandler_windows - class for "/dev/windows". Include . - * select.cc: New fd_windows_map class - (fd_windows_map::convert_to_unix_fdset): New, check for Windows - messages in a queue. - (cygwin32_select): check for windows fd is passed to select call, - increase size of harray by one to support windows pseudo-handle, - do MsgWaitForMultipleObjects if windows fd passed to select call. - -Thu May 28 18:22:24 1998 Ian Lance Taylor - - * utils/cygpath.cc: New file. - * utils/Makefile.in (PROGS): Add cygpath$(EXEEXT). - (cygpath$(EXEEXT)): Ne target. - - * include/sys/cygwin.h: Declare more path conversion functions. - -Thu May 28 15:56:26 1998 Geoffrey Noer - - * include/sys/ioctl.h: need to include - * syscalls.h: remove ioctl proto - -Wed May 27 01:34:06 1998 Geoffrey Noer - - * cygwin.din: add sethostent/endhostent exports - * net.cc (sethostent, endhostent): new stubs - -Fri May 22 17:31:50 1998 Geoffrey Noer - - * include/cygwin32/in.h: correct typo in IPPORT_WHOIS define - -Fri May 22 17:00:48 1998 Geoffrey Noer - - * include/sys/ioctl.h: add ioctl proto - -Wed May 20 18:52:31 1998 Geoffrey Noer - - * include/sys/param.h: delete, file overlaps with newlib's. - Move it to newlib/libc/sys/cygwin32/sys where such files - are supposed to go. - -Wed May 20 18:20:35 1998 Geoffrey Noer - - * select.cc (auto_del_fd_set_map::auto_del_fd_set_map): correct - C++ problem -- can't use parens in call to new. - -Wed May 20 17:03:25 1998 Geoffrey Noer - - based on patch from newsham@lava.net (Tim Newsham): - * select.cc: FIXMEs added/adjusted - (select_sleep): new static select helper function - (cleanup_sockthread): ditto - (cleanup_pipethread): ditto - (cygwin32_select): remove degenerate goto in favor of calling - select_sleep, call cleanup_sockthread and cleanup_pipethread - instead of previously duplicated code. - -Wed May 20 02:21:37 1998 Geoffrey Noer - - patch from Christopher Faylor - * fhandler.cc (fhandler_serial::raw_read): When - vmin_ == 0, vtime_ > 0, don't force only one char at a time - to be read. - (fhandler_serial::tcsetattr): set to.ReadIntervalTimeout - and to.ReadTotalTimeoutMultiplier appropriately so reads - will time out properly when vmin_ == 0, vtime_ > 0. - -Tue May 19 09:05:46 1998 Christopher Faylor - - * init.cc (set_dllname): Use consistent "cygwin32" name for dll - if the name of the dll is actually cygwin. This will allow - better interoperability between dlls which have been renamed, - i.e., cygwindevo.dll -> cygwin98r1.dll. - -Mon May 18 22:39:35 1998 Christopher Faylor - - * winsup.h: Remove sig* undefs since this is now done in newlib. - Define SIGTOMASK define for use by signal mask operations. - * exceptions.cc (__cygwin32_exception_handler): Use SIGTOMASK. - (sig_handle): Ditto - * signal.cc (sigpending): Ditto. - (sigaddset): Use SIGTOMASK. Disallow signal 0. - (sigdelset): Ditto. - (sigismember): Ditto. - * strace.cc (strace_printf): It is possible for strace_mutex to - be an invalid handle. Open the mutex if so. Call ReleaseMutex - until exhausted since a signal may have interrupted an strace_printf. - (strace_dump): Call ReleaseMutex until exhausted. - * tty.cc (do_output): Remove strace printf to avoid filling up strace - output. - (fhandler_tty_slave::read): Use SIGTOMASK. - -Mon May 18 09:11:38 1998 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Clear errno before calling main. - -Thu May 14 00:37:01 1998 Geoffrey Noer - - * dcrt0.cc: add comments, reformatting - -Wed May 13 17:47:23 1998 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * times.cc (to_time_t): prevent stat from returning incorrect - file modification time (one second less) on fat partitions due - to round-up error. - -Wed May 13 16:03:07 1998 Geoffrey Noer - - * select.cc: add comments, FIXMEs, respace, delete old - sockets-only case that was previously commented out. - (cygwin32_select): in case where handles and sockets are - set, don't check that always_ready_used is zero (that case is - covered before). - * syscalls.cc: delete unused file_queue struct. - -Tue May 12 18:36:25 1998 Geoffrey Noer - - * syscalls.cc (get_os_type): add FIXME - -Tue May 5 14:02:12 1998 Christopher Faylor - - Throughout Cygwin replace use of "sa" SECURITY_ATTRIBUTE variables - with appropriate global variables. - * shared.cc (shared_init): Initialize global security attribute - variables for use in various places around cygwin. - * fork.cc (fork_init): Remove. Functionality replaced by above. - * dcrt0.cc (dll_crt0_1): Remove obsolete fork_init() call. - -Sat May 2 17:40:51 1998 Christopher Faylor - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * tty.cc (create_tty_master): Fill in ut_host utmp field with - local host name instead of "local" to avoid "who" command timeouts. - -Fri May 1 22:38:20 1998 Christopher Faylor - - * environ.cc: Add a global to control com port reset behavior. - (parse_options): Recognize "reset_com" as a CYGWIN32 option. - * fhandler.cc (fhandler_serial::raw_read): Handle vmin and vtime - more like UNIX. - (fhandler_serial::open): Revive code to reset com port on open. - Only reset the port if reset_com global is not set and if this - function is being called explicitly by open. - (fhandler_serial::tcsetattr): Make CRTSCTS flow control more - like UNIX -- it should turn on hardware handshaking in both - directions. Handle vmin and vtime in a manner more consistent - with UNIX. - (fhandler_serial::tcgetattr): Reflect CRTSCTS changes above when - reporting this state. - * include/sys/termios.h: Move CRTSCTS and CRTSXOFF (sic) into - 16 bits or they will never be capable of being set. - -Thu Apr 30 15:05:45 1998 Christopher Faylor - - * console.cc (fhandler_console::init): If resetting stdin, - make sure to reset the ConsoleCtrlHandler. - * exceptions.cc (set_console_handler): New function broken out - of init_exceptions(). Sets the function responsible for handling - CTRL-C. - (init_exceptions): Snipped out set_console_handler. - -Thu Apr 30 14:11:30 1998 Christopher Faylor - - * include/sys/cygwin.h: Remove cygnus-specific declaration. - * winsup.h: Move cygnus-specific cygwin32_attach_handle_to_fd - declaration here. This function may eventually be replaced by - an osf_* function. - -Tue Apr 28 17:07:46 1998 Geoffrey Noer - - * passwd.cc (parse, getpass): remove unneeded uses of NO_COPY - * grp.cc (getgrgid, getgrnam): ditto - -Tue Apr 28 16:18:03 1998 Geoffrey Noer - - * version.h: bump minor version to 2 - * errno.cc: add FIXME - -Wed Apr 22 15:43:56 1998 Geoffrey Noer - - * syscalls.cc (cygname): delete - * shared.cc (shared_name): new, was cygname - * strace.cc, exceptions.cc, sigproc.cc, shared.cc: fix - cygname references in light of above - -Wed Apr 22 14:12:09 1998 Christopher Faylor - - * select.cc (fd_set_map::remove_pair_by_handle): minor optimization - * strace.cc (strace_printf): change format for consistency - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * dcrt0.cc (dll_crt0): Call global constructors explicitly - * tty.cc (create_tty_master): Remove code which attempted to - invoke tty constructor - -Tue Apr 21 16:18:27 1998 Christopher Faylor - - * environ.cc (ucenv): inline - (posify): Ditto - (environ_init): remove obsolete function use - * path.cc (symlink_check_one): Set errno here where appropriate. - (readlink): Rely on errno set by symlink_check_one rather than - defaulting to EINVAL. Should fix problems with RCS. - -Tue Apr 21 15:36:41 1998 Christopher Faylor - - * Implement a NOSTRACE preprocessor define to allow building - Cygwin32 without any STRACE code. - * configure.in: Add entries for architecture specific programs - to allow easier cross-compile builds - * configure: Ditto - * Makefile.in: Ditto - * console.cc (fhandler_console::char_command): Fix two problems - with cursor position report: 1) it reported position relative - to beginning of buffer rather than beginning of screen, 2) it - reported y, x in reversed order - * dcrt0.cc: Remove NO_COPY from variables that don't need it. - Remove variables obsoleted by NO_COPY. - (dll_crt0_1): strace settings are now inherited. Don't try - to initialize strace early. Remove initialization of variables - which are now handled automatically by NO_COPY. Set error mode - for Cygwin32 to fail on critical errors rather than popping up - a dialog box. - * spawn.cc (spawn_guts): Always use default error mode when - spawning a new process. Move error message to more generally - useful location. Terminate signal handling in a cygwin parent - process or two processes will be handling signals. - (_spawnve): Inherit strace stuff - * exceptions.cc (events_init): Provide more information on - "Catastrophic failure". Change error message wording slightly. - * fork.cc: Remove obsolete structure - (cygwin_fork_helper1): Remove use of obsolete structure. Inherit - strace settings in child processes. - * sigproc.cc (sigproc_init): Set wait_sig priority immediately - after thread creation. - * smallprint.c: Remove unneeded include - * strace.cc: Reorganize to handle NOSTRACE - (strace_open): Use strace entries in pinfo structure which are - now inherited - (strace_dump): ditto - (strace_init): preprocessor define STRACE_HHMMSS causes strace - output to use alternate log file format. - (strace_printf): ditto - * syscalls.cc (access): Remove SetErrorMode in favor of global - cygwin32 setting in dll_crt0_1. - * fhandler.cc: Handle NOSTRACE - * tty.cc: Ditto - * window.cc: Ditto - * include/sys/strace.h: Ditto - * winsup.h: Move strace_file handle from per_process to pinfo so - that it can be inherited. Remove obsolete pinfo entry. - -Tue Apr 21 14:30:52 1998 Christopher Faylor - - * hinfo.cc (cygwin32_attach_handle_to_fd): New function - * include/sys/cygwin.h: Ditto. - * cygwin.din: Export new cygwin-specific function - -Tue Apr 21 02:32:08 1998 Geoffrey Noer - - * syscalls.cc: comment out file_queue struct that doesn't - seem to be used for anything anymore. Don't need to include - stdarg.h or sys/socket.h. Include utmp.h. Minor respacing. - Move all functions from misc.cc here. - (_read): change strace debug printf function name to _read - (logout): rename success to res - * misc.cc: delete file - * Makefile.in: adjust for above change - -Tue Apr 21 01:45:05 1998 Geoffrey Noer - - * dir.cc: new file for directory-related functions, was - dirsearch.cc. - (mkdir, rmdir, writable_directory): move here from syscalls.cc, - writable_directory no longer static - * dirsearch.cc: delete file - * winsup.h: add proto for writable_directory. - * errno.cc: new file for errno-related functions, move errmap - struct here from syscalls.cc - (seterrno): move from syscalls.cc - (strerror): move from strerror.cc - * strerror.cc: delete file - * syscalls.cc: delete everything moved to any of the above files - * Makefile.in: adjustments for above - -Thu Apr 17 16:43:23 1998 Geoffrey Noer - - * termios.cc: add comments, add extern "C" in front of exported - calls, move debugging local functions to end of file - * winsup.h: remove fork_terminate proto for function that is no - longer with us. Add strccpy proto. - * spawn.cc (_spawnve): make static - (strccpy): remove in favor of identical function in exec.cc - * exec.cc (strccpy): no longer static - - patch from newsham@lava.net (Tim Newsham): - * select.cc (cygwin32_select): fix off by one error, stop - using memcpy to copy memory over itself - -Thu Apr 16 16:23:00 1998 Geoffrey Noer - - * net.cc: respace, put all fhandler_socket functions together - (getsockopt): fix case statement bug resulting in faulty strace - output - (setsockopt): ditto - * shared.cc: throughout, rename global h to cygwin_shared_h - * strerror.cc: make error global a local variable - * fhandler.h: add comments, add virtual function always_read_ready - to fhandler_serial which should return zero to allow non-blocking - serial I/O. - * Makefile.in: select.cc should depend on select.h - -Wed Apr 15 16:14:01 1998 Geoffrey Noer - - * select.h: new file, containing macros used by select.cc. - * select.cc: remove them from here, include select.h - -Wed Apr 15 15:23:55 1998 Geoffrey Noer - - * ntea.cc (NTReadEARaw): mark as static, don't check allow_ntea - since this is only accessed by functions that have already checked - it. - -Tue Apr 14 14:07:54 1998 Geoffrey Noer - - * cygwin.din: export truncate call - -Mon Apr 13 23:15:13 1998 Geoffrey Noer - - Throughout Cygwin32, rename *u for per_process data *user_data. - Likewise, rename *s for shared memory data *cygwin_shared. - Respace where necessary. - * registry.cc: minor respace - * registry.h: ditto - * net.cc: ditto - * fhandler.cc (fhandler_base::read): don't redeclare int len - * syslog.cc: add FIXME, reformatting, remove extern "C" around - whole file, add before exported functions - (syslog): rename second cp char pointer cp2 - (setlogmask): comment out unused function - -Mon Apr 13 17:55:43 1998 Geoffrey Noer - - * environ.cc (parse_options): add "ntea" setting to CYGWIN32 - env variable. Setting determines whether NTEA is used or not. - * ntea.cc: Add allow_ntea global which is inited to FALSE. - Now instead of immediately returning FALSE, make all - functions check allow_ntea variable and use or not use NTEA - based on its value. - * ps.cc (main): widen Win32_pid field by one to better handle - Win 95 pids. - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * shared.cc (shared_info::initialize): increase default - heap_chunk_size to 128 mb to get around the problem that - Cygwin32 still can't cope with a split heap properly. - -Wed Apr 8 18:04:07 1998 Geoffrey Noer - - * net.cc (cygwin32_bind, cygwin32_getsockname, cygwin32_listen, - cygwin32_shutdown): if should check sock, not s. - -Wed Apr 8 15:00:46 1998 Geoffrey Noer - - Eliminate warnings revealed by -Wshadow -Wall: - * console.cc (FakeReadFile): fix aggregate with partly bracketed - initializer (add missing brackets). - * tty.cc (fhandler_tty_slave::close): remove unused variable tty - (fhandler_tty_slave::dup): ditto - (fhandler_tty_slave::send_ioctl_request): ditto - -Wed Apr 8 03:04:11 1998 Geoffrey Noer - - Eliminate warnings revealed by -Wshadow -Wall: - * console.cc (FakeReadFile): change variable name index to - modifier_index. - (fhandler_console::read): remove second definition of flags - * dcrt0.cc (build_argv): rename s to start, e to end - (insert_files): reformat, add parens around assign used as truth - value, make i a DWORD, remove dup def of i. - * dlfcn.cc (set_dl_error): rename s to str - (checkAccess): rename to check_access - (checkPathAccess): rename to check_path_access - (getFullPathOfDll): rename to get_full_path_of_dll, don't - redeclare len - * dll_init.cc (DllList::detachDll): rename index to dll_index - * fork.cc (cygwin_fork_helper1): rename index to dll_index, - reformat slightly, rename res in dll load section to loadres, - don't redeclare rc two additional times - (dump_jmp_buf): rename s to sbuf - * grp.cc (initgroups): rename group arg to grp - * hinfo.cc (digits): rename s to str - (hinfo_vec::build_fhandler): rename first buf variable to - buf_info, the second to buff. - (hinfo_vec::linearize_fd_array): cast sizeof return to int, - declare i in for loop - (hinfo_vec::de_linearize_fd_array): declare i in for loop - * misc.cc (nice): rename pri to priority, index to curr - (cygname): rename s to str - (login): rename tty to currtty - (logout) put missing parens around arg to sizeof calls - * net.cc (DuplicateSocket): rename function to duplicate_socket, - rename s arg to sock - (fhandler_socket::fhandler_socket): rename s arg to sock - (socketpair): rename sin to sock_in - (cygwin32_rexec): rename passwd arg to password - * passwd.cc (parse): rename stat array to tmpbuf - * resource.cc (fill_rusage): rename creation to creation_time, - exit to exit_time, kernel to kernel_time, user to user_time - (getrusage): rename rusage arg to rusage_in - * sigproc.cc (proc_terminate): move i declaration outside of - loop, get rid of extra declaration - (getsem): rename s to str - (proc_strace): declare i at top of function, remove extra two - declarations of it later - * smallprint.c: include ctype.h for isalnum proto - (__small_vsprintf): put parens around assign used as truth value - * spawn.cc (spawn_guts): rename both s variables to str, remove - redeclarations of i - * strace.cc (mark): rename s arg to str - * syscalls.cc (chown): remove unused vars group, passwd - (access): rename s to st - (ctermid): rename s to str - * termios.cc (cfsetospeed, cfsetispeed): rename s to speed - * times.cc (times): rename creation to creation_time, - exit to exit_time, kernel to kernel_time, user to user_time - (time_t_to_filetime, timeval_to_filetime): rename time to time_in - * tty.cc (create_tty_master): rename utmp variable our_utmp - (fhandler_tty_master::init): rename ttynum arg ttynum_in - -Tue Apr 7 17:18:05 1998 Geoffrey Noer - - * syscalls.cc (seterrno): add FIXME - * path.cc (symlink_check_one): change comment wording - - patch from Tom Tromey (tromey@cygnus.com) - * syscalls.cc (access): Call SetErrorMode to turn off critical - errors dialog. - - patch from Mikey (jeffdb@netzone.com): - * fhandler.cc (fhandler_disk_file::open): under Win95, set - S_IXOTH|S_IXGRP|S_IXGRP if the first two bytes of a file contain - a '#!'. - (fhandler_disk_file::check_execable_p): consider shell scripts - execable - -Mon Apr 6 20:55:06 1998 Geoffrey Noer - - * include/sys/cygwin.h: add protos for cygwin32 path conversion - functions. - -Wed Apr 1 16:12:58 1998 Geoffrey Noer - - * {fhandler.cc, fhandler.h, hinfo.cc, console.cc}: Rename - fhandler_tty class to fhandler_serial - -Tue Mar 31 16:27:36 1998 Geoffrey Noer - - * ntea.cc: temporarily disable reading/writing NTEA information - due to the large penalty incurred on NT fat partitions. - -Fri Mar 27 13:35:30 1998 Geoffrey Noer - - * environ.cc (parse_options): change struct to union to avoid - references to uninitialized fields. - -Thu Mar 26 19:03:00 1998 Eric Bachalo - - * dcrt0.cc (insert_files): added this function to replace - -@file in the command line with the contents of the file - (dll_crt0_1): calls insert_files before building argv - -Wed Mar 25 15:25:26 1998 Geoffrey Noer - - And more: - * {fhandler.cc, fhandler.h, tty.cc, net.cc, console.cc}: make - ioctl calls' cmd arg unsigned, ditto for access arg of init calls. - * console.cc (fhandler_console::fillin_info): add parens around - assignment used as truth value. - (FakeReadFile): make copied_chars a size_t - (fhandler_console::read): make i in loop unsigned - * environ.cc (setenv): make l_value unsigned, add parens around - assignments used as truth values. - * exceptions.cc (call_handler): supposed to return an int and - wasn't at the end of control flow. Now returns 1 there. - * fhandler.h (~fhandler_base): destructor should be marked virtual - * misc.cc (login): add parens around assignment used as truth - value. - * net.cc: cast INVALID_SOCKET to int in comparisons - (fhandler_socket::ioctl): remove int cast to FIONBIO since cmd - is now unsigned - (get_win95_ifconf): add cast to signed vs unsigned int comparison. - * ntea.cc (NTReadEA): add cast to signed vs unsigned int - comparison. - * path.cc (getcwd_inner): make len a size_t - * pinfo.cc (cygwin32_winpid_to_pid): add comment - * select.cc (cygwin32_select): make wait_ret an int - * signal.cc (kill_worker): add parens around assignments used as - truth values. - * sigproc.cc (wait_sig): make rc a DWORD - (sig_send): add parens around assignment used as truth value. - * strace.cc: make inqueue global a static DWORD - * tty.cc (do_output): add cast to signed vs unsigned int - comparison. - (fhandler_pty_master::open): remove unused handle nh - -Tue Mar 24 18:03:59 1998 Geoffrey Noer - - More spring cleaning: - * net.cc: move LOAD macro definition out of winsock_init, - correction to make it valid ANSI C++. - * grp.cc (read_etc_group): pass default line directly to - add_grp_line call - -Mon Mar 23 19:21:00 1998 Geoffrey Noer - - patch from cgf@bbc.com (Christopher Faylor): - * spawn.cc (spawn_guts): Don't call close_all_files if a cygwin - process has been spawned. Otherwise, we close tty handles twice. - -Fri Mar 20 23:01:24 1998 Geoffrey Noer - - * pinfo.cc (pinfo_list::init): Initialize next_pid to PBASE. - (pinfo_list::operator []): Now index is given by pid mod size(). - (pinfo_list::allocate_pid): Allow more pid numbers than spaces in - the process table. Pids now can range from PBASE (1000) to - INT_MAX. At that point they wrap to 1000 again. For speed, use - modular arithmetic to map pids into table. - * winsup.h: move PBASE to pinfo.cc, rename next_pid_index to - next_pid - * utils/ps.cc (main): reorg of what's printed where, listing pid - first. - -Thu Mar 19 15:05:07 1998 Geoffrey Noer - - * winsup.h: Change section name in NO_COPY definition. We were - using a .data$nocopy section to avoid copying certain data on - fork. The linker used to include this between __data_start__ and - __data_end__, but that broke building the cygwin32 dll. The fix - is to rename the section ".data_cygwin_nocopy" and explictly - include it after __data_end__. - -Wed Mar 18 15:03:51 1998 Geoffrey Noer - - * tty.h: fix ttyslot proto; it returns an int - * glob.h: fix glob proto; it returns an int - -Mon Mar 16 16:16:40 1998 Geoffrey Noer - - * Makefile.in: stop installing the dll in the lib directory as - well as the bindir. - * environ.cc (parse_options): don't need to call malloc - -Mon Mar 16 11:56:23 1998 Geoffrey Noer - - patch from cgf@bbc.com (Christopher Faylor): - * tty.cc (fhandler_tty_slave::dup): Don't set flags to 0. Flags - have already been set in wrapper. - * net.cc: Rename `s' variable which shadows global `s'. - * termios.cc: ditto - * time.cc: ditto - -Tue Mar 10 15:54:04 1998 Geoffrey Noer - - * version.h: up CYGWIN_DLL_VERSION_MINOR - -Tue Mar 10 15:41:29 1998 Geoffrey Noer - - patch from cgf@bbc.com (Christopher Faylor): - * spawn.cc (spawn_guts): Make argument handling after `#! pgm' - handle spaces similarly to UNIX. Close "linearized" file handles - when a non-cygwin32 binary is executed or suffer hangs on exit. - Reorganize lpReserved2 buffer to avoid conflicts with Microsoft - usage which resulted in incorrect stdin/stdout operation with - programs compiled using MSVC. - * pinfo.cc (pinfo_init): Accommodate change to lpReserved2 - organization. - -Mon Mar 9 19:27:17 1998 Geoffrey Noer - - * syscalls.cc (_open): modify to take a variable number of - arguments to match newlib's fcntl.h. - * environ.cc (parse_options): rewrite struct known to conform - to ANSI standards. Can't statically initialize, so do so - dynamically at the beginning of the function instead. - - patch from jeffdb@netzone.com (Mikey): - * dcrt0.cc (build_argv, compute_argc): need to escape quotes - -Sat Feb 28 16:41:54 1998 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * fhandler.cc (fhandler_base::init): call set_flags based on - access arg. - * net.cc: include fcntl.h - (fhandler_socket::fhandler_socket): made sockets O_RDWR - -Thu Feb 26 23:41:54 1998 Geoffrey Noer - - Beta 19 release made. - -Sun Feb 22 23:46:31 1998 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * Makefile.in: Do not link cygwinb19.dll with libwsock32.a - * exceptions.cc: add proto for i_WSACleanup. - (sig_handle): call *i_WSACleanup if winsock was inited. - * hinfo.cc: add proto for i_getpeername. - (hinfo_vec::build_fhandler): call *i_getpeername if winsock - was inited - * net.cc: wsock32, i_wsockimports - new globals. Throughout - file, call winsock functions via indirect pointers. - (winsock_init): dynamically load wsock32.dll and resolve addresses - of exports. - (cygwin32_rcmd, cygwin32_rexec, cygwin32_rresvport): resolve - addresses of exports. - * select.cc: add protos for i___WSAFDIsSet, i_WSAGetLastError, - i_select, i_socket, i_closesocket. WINSOCK_FD_ISSET changed to - use indirect pointer. Direct winsock calls changed to indirect. - (cygwin32_select): initialize winsock before calling select in - degenerate case. - * winsup.h: remove protos for ScreenRows, ScreenCols, - ScreenGetCursor, ScreenSetCursor. - -Sun Feb 22 17:44:55 1998 Geoffrey Noer - - * environ.cc (parse_options): comment out -- no longer - compiles with egcs. Will rewrite/enable later. - -Sun Feb 22 13:49:10 1998 Geoffrey Noer - - * syscalls.h: remove protos for _open, _read, _write since - they are in newlib headers that are already included - * syscalls.cc (_read): return int, not ssize_t - (_write): ditto - -Sat Feb 21 14:21:17 1998 Geoffrey Noer - - * Makefile.in: rename dll to cygwindevo.dll - -Sat Feb 21 01:33:56 1998 Geoffrey Noer - - * cygwin.din: remove dup definition of endpwent - -Thu Feb 19 14:20:21 1998 Geoffrey Noer - - * include/cygwin32/cygwin_dll.h: Correct protection wrapper - -Tue Feb 17 20:21:24 1998 Geoffrey Noer - - * include/Windows32/Structures.h: tagBITMAPFILEHEADER should - be packed. - -Tue Feb 17 19:34:41 1998 Geoffrey Noer - - patch from cgf@bbc.com (Christopher Faylor): - * cygwin.din: export sigpause - * signal.cc (sigpause): New "compatibility interface" to - sigsuspend function. Used currently by inetutils. - -Tue Feb 17 11:43:27 1998 Ian Lance Taylor - - * tty.h (class tty): Add slave_opened field. - * tty.cc (fhandler_tty_master::init): Initialize slave_opened. - (do_output): Only return with EOF if the slave has been opened. - (fhandler_tty_slave::open): Set slave_opened. - (fhandler_pty_master::open): Initialize slave_opened. - - * tty.cc (fhandler_pty_master::read): Change type of n to DWORD. - If there are no characters to read, and the descriptor is in - nonblocking mode, just return EGAIN. - -Mon Feb 16 15:11:25 1998 Ian Lance Taylor - - * tty.h (class tty): Remove handle_pid and slave_handles fields. - (class tty_list): Add getcount method. - * tty.cc (tty::init): Initialize input_handle and output_handle. - (tty_list::free_tty): If we just freed the last reference to this - tty, close input_handle and output_handle. - (fhandler_tty_master::init): Don't initialize handle_pid and - slave_handles. - (do_output): Instead of just calling ReadFile, loop using - PeekNamedPipe and check whether the tty has been closed. Return 0 - on EOF and -1 on error. - (process_output): Only print debugging error message if error - occurs in do_output. - (fhandler_tty_slave::open): Always duplicate handles from master. - Never close handles in source. Don't change slave_handles. - (fhandler_tty_slave::close): Don't change slave_handles, and don't - close tty handles. - (fhandler_tty_slave::linearize): Call attach_tty. - (fhandler_tty_slave::de_linearize): Don't call attach_tty. - (fhandler_tty_slave::dup): Don't increment slave handles. - (fhandler_pty_master::open): Don't initialize handle_pid and - slave_handles. - (fhandler_pty_master::close): Don't check slave_handles, and don't - close tty handles. - (fhandler_pty_master::read): Handle EOF return value from - do_output. - (fhandler_pty_master::linearize): Call attach_tty. - (fhandler_pty_master::de_linearize): Don't call attach_tty. - - * fork.cc (cygwin_fork_helper1): Copy strace_mask from parent to - child. - -Thu Feb 12 20:33:57 1998 Geoffrey Noer - - patch from cgf@bbc.com (Christopher Faylor): - * utils/cygwin.cc: Modify -s option to use new strace_mask entry - in pinfo. Prepare for future ability to specify an strace file. - -Thu Feb 12 11:57:26 1998 Geoffrey Noer - - * grp.cc (read_etc_group): add a default /etc/group in memory - if /etc/group isn't found - (getgrnam): return NULL if requested group isn't found instead - of returning a default group - -Wed Feb 11 15:59:10 1998 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * strace.cc (strace_open): do not close u->strace_file if it - points to stderr. - * malloc.cc (malloc_init): do not check for application's malloc - in a forkee, this breaks memory coherency in a forkee and forker. - use_internal_malloc flag now copies on fork. - -Tue Feb 10 18:11:30 1998 Geoffrey Noer - - patch from cgf@bbc.com (Christopher Faylor) - Throughout sources, mark statics and globals as NO_COPY where - appropriate. - * fork.cc (cygwin_fork_helper1): Remove #if 0 around fork_copy of - cygwin data/bss. Remove __malloc_copy since it is no longer - necessary. - -Tue Feb 10 15:30:19 1998 Geoffrey Noer - - patch from cgf@bbc.com (Christopher Faylor) - * console.cc (fhandler_console::write): Implement xterm style - escape sequences for setting title in the console title bar. - * fhandler.h: Define constants for console title escape sequence. - -Tue Feb 10 14:16:17 1998 Geoffrey Noer - - * include/a.out.h: remove junk chars introduced by mailer - when this header was sent to us - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * libccrt0.cc: rename cygwin_attach_dll to cygwin32_attach_dll - - patch from cgf@bbc.com (Christopher Faylor): - * environ.cc: fix off by one problem - -Mon Feb 9 14:56:00 1998 Geoffrey Noer - - * Makefile.in: add registry.h to environ.o deps - -Mon Feb 9 14:42:24 1998 Ian Lance Taylor - - * Makefile.in (DLL_OFILES): Rename dllinit.o to dll_init.o. - - * tty.cc (fhandler_tty_slave::close): Don't close the tty handles - if the slave and the master are the same process. - - * path.cc (read_mounts): Change key parameter to reference, to - avoiding running the destructor. - -Mon Feb 9 13:53:50 1998 Geoffrey Noer - - patch from cgf@bbc.com (Christopher Faylor): - Moves all environment manipulation into environ.cc. - Switches to CYGWIN32 for settings: - set CYGWIN32=[no]title [no]strip_title [no]binmode [no]glob - strace=mask:cache,file [no]tty - (set STRACE=whatever is still honored). - Propagates tty settings to all subprocesses regardless of - unsetting of environment variable. - Moves strace mask into pinfo structure for easier future - manipulation by external program. Moves strace_file into the - vacated position for automatic use in forked processes. - Propagates old title to execed processes so that they can - correctly restore the correct title when they exit. - * console.cc: Use PID_USETTY setting in process_state so that - tty state can be easily inherited. - (set_console_title): New function to set console title. - * syscalls.cc: Use PID_USETTY setting in process_state so that - tty state can be easily inherited. - * tty.cc: Ditto. - * hinfo.cc: Ditto. - (hinfo_vec::de_linearize_fd_array): Return last location in buffer - for further potential processing. - * dcrt0.cc: Add global variables for control of glob and title, - set by environ_init. Mark some variables as NO_COPY. - Remove routines and variables for dealing with environment. - (dll_crt0_1): Move environment initialization into separate - function. Honor 'noglob' CYGWIN32 setting. - * environ.cc (environ_init): New function to initialize the - environ table. Also scans for CYGWIN32 environment variable, - setting appropriate values. - (ucenv): New function. Upper cases an environment variable. - (parse_options): New function. Parse CYGWIN_* environment - variable. - (posify): New function. Convert a Windows env path spec to - cygwin. - (env_sort): New function. Sort an environ block. - (winenv): New function. Returns a windows style environment - block. - * fhandler.cc (fhandler_base::read): Reflect change to location of - strace_mask. - * fork.cc (cygwin_fork_helper1): Remove save/restore of some - settings since this is automatic now with new dll data copy. Save - PID_USETTY setting in child process_state. - * strace.h: Cosmetic change. - * pinfo.cc (pinfo_init): Call environ_init here since it may - affect further processing in this function. Use old console title - from "parent" process if execed process. Reflect change to - location of strace_mask. - * spawn.cc (spawn_guts): Remove environment manipulation code. - Use new winenv function call instead. Save old title in block of - memory copied to newly execed process if title is being displayed. - * strace.cc: Changes to reflect new location for strace_mask and - strace_file. These are now automatically inherited on fork. - * winsup.h: Move strace_mask into pinfo to allow possible - manipulation by other processes. Put u->strace_file in uptr - structure so that it will be automatically duplicated on fork, - removing the necessity of initializing strace in a forked - process. Add functions/variables associated with environment - manipulation and console title setting. - -Mon Feb 9 03:06:56 1998 Geoffrey Noer - - Extensive reformatting in new files from next patch. - Rename dllinit.h file to dll_init.h and likewise for dll_init.cc. - Rename cygwin_detach_dll to cygwin32_detach_dll throughout. - Similarly, rename cygwin_attach_dll and _cygwin_dll_entry. - And rename sanityAndSyncCheck to check_sanity_and_sync. - Also: - * dll_init.h: don't include winsup.h - * dll_init.cc: include winsup.h here instead - * dlfcn.cc: include winsup.h, don't include windows.h - * cygwin.din: rename cygwin_detach_dll to cygwin32_detach_dll. - - patch from giac@dalim.de (Philippe Giacinti): - Copy data areas of cygwin-compiled dlls on fork(), - implement dlopen/dlsym/dlclose/dlerror calls. - * Makefile.in: add dlfcn.o and dllinit.o to DLL_OFILES, add - dllinit.h dependencies - * cygwin.din: dll_dllcrt0, cygwin_detach_dll, dlopen, dlclose, - dlsym, dlerror, dlfork -- new exports. - * dcrt0.cc: include dllinit.h, mark u pointer as NO_COPY. - (sanityAndSyncCheck): new, code moved from dll_crt0_1. - Initialize all linked dlls before calling main(). - * dlfcn.cc: new file. - * dllinit.cc: new file. - * dllinit.h: new file. - * exceptions.cc: mark some variables with NO_COPY. - * fork.cc: include dllinit.h; declare cygwin.dll data/bss - start/end. - (cygwin_fork_helper1): copy data/bss of cygwin.dll itself to child - process (the code is disabled now); copy data areas of - linked/loaded dlls (if any); free loaded dll list on cleanup. - * include/cygwin32/cygwin_dll.h: new file. - * include/dlfcn.h: new file. - * libccrt0.cc (cygwin_crt0_common): new, code derived from - cygwin_crt0, MainFunc parameter added. - (cygwin_crt0): call cygwin_crt0_common. - (cygwin_attach_dll): new. - * shared.cc: mark some data as NO_COPY - * strace.cc: mark some data as NO_COPY - * winsup.h: add dll_dllcrt0 proto, NO_COPY macro. - -Sun Feb 8 17:51:26 1998 Geoffrey Noer - - * getopt.c: new. Import Berkeley getopt code modified for use - in Cygnus' kerberos implementation (including the writing of - getopt_long by Chris Provenzano (proven@cygnus.com)) then modified - a bit more to get it working in Cygwin32. Although we were - going to remove getopt, it appears that too many programs would - need fixing to remove it completely. Whether getopt should be - included in Cygwin32 should be decided at a later time. - * include/getopt.h: new. Import Berkeley getopt.h. - * Makefile.in: add getopt.o to LIBCOS - * utils/Makefile.in: remove include of ../../include since - getopt.h is now in winsup/include, also revert recent change - of addition of GETOPT_OBJS. - -Fri Feb 6 16:28:19 1998 Geoffrey Noer - - * cygwin.din: remove set_new_handler and cygwin_set_attributes - exports - * version.h: up major version number - * Makefile.in: rename dll to cygwinb19.dll - * syscalls.cc (cygwin_set_attributes): axe - -Thu Feb 5 18:28:37 1998 Geoffrey Noer - - * include/Windows32/Functions.h: add protos for - DdeCmpStringHandles and DdeCreateDataHandle - * Makefile.in: stop including ../libiberty/getopt* since - we aren't exporting or using them - * utils/Makefile.in: add new variable for libiberty getopt objs - which is linked in for cygwin.exe - -Thu Feb 5 17:59:12 1998 Geoffrey Noer - - syscalls.cc: move ppc dll_entry asm code to... - dcrt0.cc: ...here - - Import new globbing code from NetBSD 1.3 - * glob: delete subdirectory - * glob.c: new file - * glob.h: new file - * Makefile.in: remove glob from submakes, remove glob/libglob.a - from DLL_IMPORTS, fix dcrt0 glob.h dependency - * configure.in: don't configure glob subdirectory - * configure: regenerate - * dcrt0.cc: include glob.h, not glob/glob.h. - (globify): don't call glob with GLOB_NOESCAPE which isn't a valid - flag with this glob - -Wed Feb 4 16:14:13 1998 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - Allow system administrator to enter into the HKLM registry tree - a predefined mount table inherittable by all cygwin users. The - predefined mounts are non-mandatory so the user's mount table has - a higher priority than the default one. Cygwin reads HKLM tree - in read-only mode. - * path.cc (read_mounts): new, code derived from - mount_info::from_registry(). - (mount_info::from_registry): call read_mounts from user's table, - then from system-wide mount table. - * registry.cc (reg_session::reg_session): key and access arguments - added. - (reg_key::init): access argument added. - (reg_key::reg_key): access argument added. - * registry.h (class reg_key): init prototype changed, default - argument of reg_key added. - (class reg_session): default arguments of constructor added. - -Wed Feb 4 15:38:59 1998 Geoffrey Noer - - * include/a.out.h: new coff header file - -Wed Feb 4 01:55:18 1998 Geoffrey Noer - - * uinfo.cc: define DEFAULT_UID/GID here - * winsup.h: removed DEFAULT_UID/GID defs and unused - set_console_title proto. Did some major reorganizing, - and a little reformatting, commenting. - -Tue Feb 3 23:59:23 1998 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - Replace u->self and this_procinfo () with new `myself' pointer - wherever appropriate. Also replace get_pid() calls with a - simple ->pid reference. - -Mon Feb 2 12:34:49 1998 Geoffrey Noer - - patch from sos@prospect.com.ru (Sergey Okhapkin): - * console.cc (FakeReadFile): limit bytes to read to 30000 due to - Win NT 4.0 SP3 bug. Kill foreground process group with SIGWINCH - on console buffer size change if tty support enabled. - * include/sys/termios.h: define more constants. - * tty.cc (fhandler_pty_master::ioctl): kill foreground process - group with SIGWINCH on window resizing. - -Mon Feb 2 12:14:49 1998 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * dcrt0.cc (dll_crt0_1): Initialize u->self here, early in a - forked process so the correct pid is used in strace output and so - signals do not end up being erroneously sent to the parent. - * exceptions.cc: Make a global variable static. Some minor - optimizations. - (call_handler): Make sure that the signal mask is restored when - sig_dispatch mutex is unavailable. - Reorder asm statements to prevent clobbering of flags register by - preceding ors or risk random inexplicable behavior when returning - from a signal handler. - * fork.cc (cygwin_fork_helper1): Put setjmp restore in child's - pinfo. Have the child figure out its pid earlier in the - initialization process. Don't print a "child failed" error if the - child failed during initialization due to a CTRL-C. This is still - not quite right (see comment). - * sigproc.cc (sig_send): Remove unlock/lock_pinfo or suffer - consistent hangs in zsh. Make {allow,block}_sig_dispatch globally - available. - (wait_sig): Fix problem where blocked signals would still be - processed if queued. Add debugging SIGNOQUEUE conditional to turn - off signal queueing, making cygwin more like traditional UNIX. - * sigproc.h: Add {allow,block}_sig_dispatch functions. - -Mon Jan 26 17:33:57 1998 Geoffrey Noer - - * path.cc (mount_info::init): don't hardcode C: as the default - slash mount. Instead, use the drive letter that the OS is loaded - on. - -Mon Jan 26 13:33:57 1998 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * fork.cc (cygwin_fork_helper): Move setting PID_INITIALIZING - process_state here to avoid erroneously setting it permanently - via proc_register(). - * pinfo.cc (pinfo_init): Delay notifying "parent" when execing - until this process is ready to receive signals or risk a race - condition if exec parent calls sigproc_terminate prior to - the child exec. - * sigproc.cc (proc_subproc): Don't set PID_INITIALIZING here. - It is too late in the process creation. - (sig_send): Reset sigsuspend mutex prior to use to avoid a race. - (wait_sig): Create sigsuspend mutex as an auto reset to attempt - to avoid a race condition. Notify parent that this process is - ready if we were execed (code moved from pinfo_init). Change - PulseEvents to SetEvents to avoid races - * spawn.cc (spawn_guts): Move setting PID_INITIALIZING - process_state here to help avoid race. - -Fri Jan 23 12:31:37 1998 Ian Lance Taylor - - * malloc.cc (malloc_critical_section): New static variable. - (malloc_init): New function. - (__malloc_lock, __malloc_unlock): New functions. - * winsup.h (malloc_init): Declare. - * heap.cc (heap_init): Call malloc_init. - -Thu Jan 22 18:46:40 1998 Ian Lance Taylor - - * tty.h (class tty): Change slave_handles to int. - * tty.cc (fhandler_tty_slave::open): Check for invalid tty - handles. If this is the first slave, set slave_handles to 2; - otherwise, increment slave_handles. - (fhandler_tty_slave::close): Only close the tty handles if the - slave_handles field drops to 1. - (fhandler_tty_slave::write): Add a debugging message if WriteFile - fails. - (fhandler_tty_slave::dup): Set ttynum of new fhandler. Increment - slave_handles if appropriate. - (fhandler_pty_master::close): Only close the tty handles if the - tty is no longer allocated. - - * tty.h (class tty): Add handle_pid and slave_handles fields. - * tty.cc (attach_tty): Call connect_tty even if use_tty is not - set. - (detach_tty): Don't check use_tty. - (fhandler_tty_master::init): Initialize handle_pid and - slave_handles of tty. - (do_input): Treat \r as end of line character. - (do_output): Only set output_done_event if it is not NULL. - (fhandler_tty_slave::open): Don't worry if we can't open - output_done_event. Check slave_handles field of tty to decide - from where to duplicate the handles. Call detach_tty on error. - If we are now the owner of the slave handles, mark the tty - appropriately. - (fhandler_tty_slave::close): Only close output_done_event if it is - not NULL. Check for errors from CloseHandle. Close the tty - handles if we own them. - (fhandler_tty_slave::write): Only wait for output_done_event if it - is not NULL. - (fhandler_tty_slave::read): If nobody owns the tty, return EOF. - (fhandler_tty_slave::dup): Attach the tty. Don't duplicate - output_done_event if it is NULL. Detach the tty on error. - (fhandler_pty_master::open): Initialize handle_pid and - slave_handles of tty. Don't create output_done_event. - (fhandler_pty_master::close): Only close output_done_event if it - is not NULL. Check for errors from CloseHandle. Only close the - tty handles if we own them. - (fhandler_pty_master::read): Only set output_done_event if it is - not NULL. - * hinfo.cc (de_linearize_fd_array): Don't set use_tty just because - we find a tty to delinearize. - -Wed Jan 21 21:58:27 1998 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * sigproc.cc: Changes in wait_sig/sig_send semaphore/event - signaling to attempt to eliminate races. - -Tue Jan 20 16:11:05 1998 Geoffrey Noer - - Remove last remnants of the mixed case handling support. - * path.cc (path_conv::path_conv): remove mixed_p init - (mount_info::from_registry): don't check for fmixed - (mount_info::to_registry): ditto - (mount_item::getmntent): when setting ret.mnt_opts, only consider - text vs binary flag - (mount_item::init): remove init of mixed - * path.h: remove mixed_p, mixed from path_conv class. Remove - unmixedcaseify proto. - * include/sys/mount.h: comment out MOUNT_MIXED define, protect - header against multiple inclusion - - A little header file cleanup. Mostly to protect headers against - multiple inclusion. Some aren't strictly speaking necessary but... - * include/sys/cygwin.h: protect header against multiple inclusion - * include/sys/smallprint.h: ditto, also add cplusplus wrapper - * include/sys/strace.h: comment last endif - * include/cygwin32/in.h: change _LINUX_IN_H protect defines - to _CYGWIN32_IN_H - * include/arpa/inet.h: protect header against multiple inclusion - * include/asm/types.h: ditto - * include/net/if.h: ditto - * include/netinet/ip.h: ditto - * include/netinet/ip_icmp.h: ditto - * include/netinet/in.h: ditto, remove commented out real header - file - * include/fcntl.h: protect header against multiple inclusion - * include/memory.h: ditto - * include/mntent.h: ditto - * include/strings.h: ditto - * include/syslog.h: ditto - * include/termio.h: ditto - -Tue Jan 20 12:51:59 1998 Ian Lance Taylor - - * strace.cc (strace_stderr): New static variable. - (strace_init): Set strace_stderr. - (system_printf): If not strace_stderr, use debug_printf to put the - message in a trace file. - - * fhandler.h (fhandler_pty_master): Add neednl_ field. - * tty.h (RESTART_OUTPUT_EVENT): Change to be different from - IOCTL_DONE_EVENT. - * tty.cc (fhandler_tty_master::init): Initialize neednl_. - (do_output): Handle a length of one by using neednl_ to record an - expansion of \n to \r\n which doesn't fit. Never expand \r to - \r\n. Correct order of \r\n. - (fhandler_tty_slave::open): Improve error handling. Use - DUPLICATE_CLOSE_SOURCE to close the pipes in the master process. - (fhandler_tty_slave::dup): Duplicate the handles, rather than - calling fhandler_tty_slave::open. - (fhandler_pty_master::open): Initialize neednl_. - (fhandler_pty_master::read): Return EOF for ERROR_BROKEN_PIPE, - rather than error. Set errno correctly. - * hinfo.cc (digits): New static function. - (build_fhandler): Always accept /dev/ptmx and /dev/ttyDDD, even if - use_tty is not set. use_tty now only controls the interpretation - of /dev/tty. - -Mon Jan 19 14:49:45 1998 Geoffrey Noer - - * sigproc.cc (sig_send): lock_pinfo_for_update during this - function - -Fri Jan 16 18:09:59 1998 Geoffrey Noer - - * sigproc.cc (sigproc_init): if we can't create a signal - thread or can't create sync_proc_subproc mutex, fail with - an api_fatal call rather than just returning - -Fri Jan 16 18:08:49 1998 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - Changed signal handling to use one semaphore and one shared - memory array which is manipulated via Interlocked*() functions. - * exceptions.cc (lock_cs): Comment. Report on error. - (unlock_cs): Add debugging statement. - (sig_dispatch_pending): Remove obsolete function. - (set_process_mask): Adapt to new signal method. - (call_handler): Clear wait()ing threads here while main thread is - suspended to avoid timing screwups. Avoid calling the handler if - can't get dispatch mutex (code moved from sig_handle). Return - status of acquiring the sig_dispatch mutex. - (sighandle): Adapt to new signal method. Reorganize to *always* - honor sig_dispatch mutex or suffer deadlock on fatal signals when - someone else has the mutex and we're attempting to cleanup. - (events_init): Reflect change in cygname() arguments. - * fork.cc (stack_dummy): New function. Returns address of - argument to determine bounds for eventual stack copy. - (cygwin_fork_helper1): Call subproc_init to start up subproc - thread if it is not alreay started. Ensure that signals are - blocked while forked process is initializing. Change method of - calculation for lower stack bounds to slightly more foolproof - method. Preserve some global settings in forked process. - * misc.cc (cygname): Remove an unused argument. - * pinfo.cc (pinfo_list::allocate_pid): Add a useful debugging - statement. - * shared.cc (open_shared_file_map): Reflect change in cygname() - arguments. - * signal.cc (kill_pgrp): Avoid killing dead processes. Don't - kill processes in my pgrp if not also in my ctty. - (sigaction): Adapt to new signal method. - (sigpending): Adapt to new signal method. - * sigproc.cc: Many changes to adapt to new signal method. Also - delay waits for thread initialization until the thread needs to be - contacted. - * sigproc.h: Ditto. - * spawn.cc (spawn_guts): Fix potential off-by-one error(?) in - transcribing the argument list and add paranoid code to detect - future overruns. Change priority to highest so that waiting - process will clear out quickly. - (_spawnve): Call subproc_init() to start up subproc thread if is - not already started. - * strace.cc (strace_printf): Increase size of internal buffer so - that long argument lists printed from spawn_guts do not overrun it - so easily. - * wait.cc (wait4): Set status flag to -1 prior to exit. This will - cause previous wait that was interrupted by a signal which - dispatched to another wait to return the correct error value. - * winsup.h (pinfo): Add _sigtodo array for new signal method. - Remove obsolete field. Reflect change in cygname arguments. - -Thu Jan 15 13:07:07 1998 Ian Lance Taylor - - * syscalls.cc (mkdir): Don't permit the directory to be created if - the parent directory is not writable. - - * syscalls.cc (fchmod): Call chmod with the path name, rather than - just returning zero. - - * syscalls.cc (writable_directory): New static function. - (_unlink): Don't permit the file to be removed if the directory is - not writable. - (rename): Don't permit the rename if either the source or - destination directory is not writable. - - * syscalls.cc (chown): Set username and groupname lengths to UNLEN - + 1, rather than 100. If getpwuid fails, try to look up the real - user name to see if it is the same. Don't report an error if - there is no security mapping. - -Wed Jan 14 15:34:20 1998 Ian Lance Taylor - - * syscalls.cc (setegid): New function which just returns ENOSYS. - (chroot): Likewise. - * cygwin.din: Export setegid, _setegid, chroot, and _chroot. - - * syscalls.cc (setmode): Rename from _setmode. Change to return - the old mode. Remove old setmode function. - * cygwin.din: Make _setmode an alias for setmode. - -Wed Jan 14 14:46:00 1998 Geoffrey Noer - - * Makefile.in: don't strip cygwin.dll by default - * winsup.h: minor reformatting, removed/reworded some comments - -Mon Jan 12 13:53:03 1998 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - Speed up cygwin pid calculation by staying in the range - 1000 through (1000 + PSIZE - 1). - * pinfo.cc (pinfo_list::init): Change to reflect new pid - calculation method. - (pinfo_list::operator []): Ditto. - (pinfo_list::allocate_pid): Ditto. - * winsup.h (pinfo): Move pid and ppid into non-zeroed region since - they are always set by allocate_pid. - (pinfo_list): Change pid_base to next_pid_index to reflect new pid - calculation method. - (PBASE): New constant for new pid calcuation method. - -Sat Jan 10 12:06:38 1998 Geoffrey Noer - - * syscalls.cc (process_deletion_queue): remove wrapper function - (close_all_files): call s->delqueue.process_queue instead of - going through wrapper. - * fhandler.cc (fhandler_base::close): call - s->delqueue.process_queue instead of using above wrapper. - * winsup.h: remove process_deletion_queue proto - * delqueue.h: up MAX_DELQUEUES_PENDING to 100 for now. Rename - v to dqueue for clarity. - * delqueue.cc: v renamed to dqueue throughout. Add FIXME - describing why this whole delqueue system needs rewriting. - -Fri Jan 9 13:18:44 1998 Geoffrey Noer - - Remove some historical baggage: - * syscalls.cc (cygwin_set_attributes): remove commented-out code, - add FIXME since this function should go away next time an - incompatible change to cygwin.din is made. Stop including - include/sys/cygwin.h. - * include/sys/cygwin.h: remove cygwin_set_attributes proto. - Remove CYGWIN_FMODE_ALL_BINARY define. - * hinfo (hinfo_vec::init_std_file_from_handle): remove old - commented-out code - * path.cc (unmixedcaseify): delete commented-out function - (mixedcaseify): ditto - * strerror.cc (strerror): delete commented-out code section - -Tue Jan 6 18:51:40 1998 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - Conform to POSIX method for sending SIGHUP to stopped processes. - * dcrt0.cc (do_exit): Use new kill_pgrp function to kill orphaned - children on group leader exit iff the children are stopped (per - POSIX). - * signal.cc (kill_worker): Negative signal now means to send - a SIGCONT after the signal, to wake up the target process. - (_kill): Break out pgrp handling into separate function. - (kill_pgrp): New function pulled from _kill to send signals - to processes in a given pgrp. - -Tue Jan 6 14:37:43 1998 Geoffrey Noer - - patch from cgf@bbc.com (Chris Faylor): - * fhandler.cc (fhandler_base::open): include - FILE_FLAG_BACKUP_SEMANTICS in file_attributes when file is - a directory. Allows opening of directory as a file. Allows - use of handle to perform some operations on both directories and - files. - (fhandler_base::fstat): Loop when attempting to get volume serial - number. Works around an apparent Windows NT 3.51 bug. - * times.cc (utimes): use FILE_FLAG_BACKUP_SEMANTICS flag - to allow accessing directory times (may only work under NT; - until now it didn't work under either OS). - * winsup.h: Add O_DIROPEN constant. - -Mon Jan 5 19:18:01 1998 Geoffrey Noer - - * Makefile.in: make winsup.h depend on winsup.h in accordance - with below - - patch from cgf@bbc.com (Chris Faylor): - * {*.cc, *.h}: Remove include files already present in winsup.h. - Change empty function parameter lists to (void) where appropriate. - - * fork.cc: Clean up include files. Minor change to CreateProcess - parameter list. - * signal.cc: Remove ifdef'ed stuff. - * smallprint.c: Add a necessary include file. - * winsup.h: Add a common include file. Add a function declaration - for kill_pgrp. - -Mon Jan 5 18:30:37 1998 Geoffrey Noer - - Fix spoofing of directory inodes. - * syscalls.cc (hash_path_name): instead of initializing the - hash to zero, take the value of the initial hash as a new - argument. - (_stat_worker): fix up hash_path_name reference in light of above - * dirsearch.cc (opendir): initialize dir->__d_dirhash to the - hash of the full directory name so readdir can make use of it. - (readdir): compute d_ino by combining the directory hash - calculated by opendir with the hash of the filename. - * fhandler.cc: fix up hash_path_name reference in light of above - - * winsup.h: remove unnecessary protos for getkey, kbhit. Adjust - hash_path_name proto. diff --git a/winsup/cygwin/ChangeLog-1999 b/winsup/cygwin/ChangeLog-1999 deleted file mode 100644 index f2da41f51..000000000 --- a/winsup/cygwin/ChangeLog-1999 +++ /dev/null @@ -1,3562 +0,0 @@ -Sat Dec 25 12:46:25 1999 Christopher Faylor - - * dlfcn.cc (dlsym): Use correct HANDLE type for GetProcAddress. - (dlclose): Ditto for FreeLibrary. - * fhandler_windows.cc (fhandler_windows::set_close_on_exec): Properly - coerce arguments to set_inheritance. - (fhandler_windows::fixup_after_fork): Ditto for fork_fixup. - * libcmain.cc (main): Simplify. - * select.cc (peek_windows): Properly coerce argument to PeekMessage. - -Sat Dec 25 12:30:25 1999 Christopher Faylor - - * Makefile.in: Eliminate unneeded .y SUFFIX. - * dcrt0.cc (__api_fatal): Make "C". - (do_global_ctors): Make __stdcall. - (getprogname): Ditto. - (insert_file): Ditto. - (globify): Ditto. - (build_argv): Ditto. - (do_exit): Ditto. - * debug.cc (regthread): Ditto. - (makethread): Ditto. - (threadname): Ditto. - (find_handle): Ditto. - (handle_list): Ditto. - (add_handle): Ditto. - * debug.h: Reflect changes to __stdcall. - * shared.h: Ditto. - * winsup.h: Ditto. - -Sat Dec 25 12:09:10 1999 Kazuhiro Fujieda - - * path.cc (symlink): Don't return error if target is a symlink to a - nonexistent file. - -1999-12-23 DJ Delorie - - * dcrt0.cc (globify): Properly handle embedded tildes in variable - names. Treat a c:\foo style path spec as "special", i.e., don't - interpret the backslashes as quoting characters. - -Fri Dec 17 10:49:13 1999 Christopher Faylor - - * path.cc (symlink): Return error if the target exists. - -Thu Dec 16 22:36:45 1999 Christopher Faylor - - * path.cc: Change method for accessing com in windows_device_names to - allow > 2 com ports. - -Thu Dec 16 00:49:30 1999 Christopher Faylor - - * Makefile.in: Only build winver.o and version.o when required. - -Sat Dec 11 11:06:45 1999 Corinna Vinschen - - * path.cc (path_conv::path_conv): Ensure that a trailing slash is added - to "x:" specifications. - -Fri Dec 10 20:22:41 1999 Christopher Faylor - - * debug.cc (WFSO): Make __stdcall. - (WFMO): Ditto. - * debug.h: Reflect above changes. - * exceptions.cc (sig_set_errno): Set errno to be in effect after a - signal handler. - (handle_sigsuspend): Use set_sig_errno to ensure that the correct errno - is set after a signal handler. - (interrupt_now): Accommodate default errno field in stack. - (intterupt_on_return): Ditto. - (sigreturn): Pop, test, and possibly restore saved errno on return from - signal handler. - * fhandler_console.cc (fhandler_console::read): Set errno to be in - effect after a signal handler. - * fhandler_serial.cc (fhandler_serial::raw_read): Ditto. - * select.cc (cygwin_select): Ditto. - (select_stuff:wait): Ditto. - (peek_serial): Ditto. - * syscalls.cc (_read): Ditto. - * wait.cc (wait4): Ditto. - * winsup.h (signal_dispatch): Add "saved_errno" field. - -Thu Dec 9 23:35:45 1999 Christopher Faylor - - * debug.cc (threadname_init): Use new_muto macro to set up a static - buffer for a muto. - (debug_init): Ditto. - (WFSO): Reinstate wrapper for WaitForSingleObject. - (WFMO): Reinstate wrapper for WaitForMultipleObject. - * debug.h: Declare the above two wrappers. - * exceptions.cc (events_init): Use new_muto macro to set up a static - buffer for a muto. - * sigproc.cc (sigproc_init): Ditto. - * sync.cc (muto::acquire): Don't bump waiters if we already own the - muto. - * sync.h (new): New operator. - (delete): Ditto. - (new_muto): New macro. - -Dec 08 23:50:00 1999 Corinna Vinschen - - * security.cc (get_nt_attribute): Add debug output. Correct behaviour - in case of NULL ACL. - * syscalls.cc (stat_worker): Allow remote drives to get stat info from - fh.fstat(). - * include/winnt.h: Add defines for W2K ACL control flags. - * include/cygwin/socket.h: Add missing PF_NETBIOS. - -Wed Dec 8 23:06:07 1999 Christopher Faylor - - * Makefile.in: Ensure that winver.o is a dependency for building the - dll. - * mkvers.sh: Attempt to call windres in a fashion that accommodates - older and newer versions. - * winver.c: Reorganize slightly to accommodate older versions of - windres. - * fhandler.cc (fhandler_disk_file::fstat): Avoid using Windows "inodes" - on disks which do not support them. - -Tue Dec 7 21:15:11 1999 Christopher Faylor - - * dll_init.cc (DllList::forkeeLoadDlls): Reverse order of Free/Load - Library calls to ensure that references are resolved. - * path.cc (mount_info::conv_to_win32_path): Ensure that returned - windows paths are always normalized regardless of whether they were in - windows format to begin with. - -Tue Dec 7 08:48:22 1999 Christopher Faylor - - * environ.cc (parse_options): Properly detect end of known array. - -Mon Dec 6 22:32:04 1999 Christopher Faylor - - * mkvers.sh: Generate winver.o from winver.rc and various other things - from include/cygwin/version.h - * winver.rc: New file (adapted from donation by Mumit Khan - ). - * configure.in: Find windres. - * configure: Regenerate. - * Makefile.in: Link winver.o into cygwin1.dll. - -Mon Dec 6 13:04:47 1999 Mumit Khan - - * init.cc (dynamically_loaded): New global variable. - (dll_entry): Use. - * winsup.h (dynamically_loaded): Declare. - * dcrt0.cc (do_global_ctors): Likewise. - (set_os_type): Make static again. - (dll_crt0_1): Handle dynamically_loaded case. - * dll_init.cc (dll_dllcrt0_1): Delete. - (dll_dllcrt0): Handle dynamically_loaded case. - (dll_noncygwin_dllcrt0): Mark obsolescent. - * libccrt0.cc (cygwin_attach_noncygwin_dll): Delete. - * pinfo.cc (pinfo_init): Don't inherit parent fds if dynamically - loaded. - * include/cygwin/cygwin_dll.h (cygwin_attach_noncygwin_dll): Delete - prototype. - (_cygwin_noncygwin_dll_entry): Mark obsolescent. - -Mon Dec 6 11:09:41 1999 Christopher Faylor - - * configure.in: Make threadsafe the default. - * configure: regenerate. - * utils/strace.cc: Fix a compiler warning. - -Sun Dec 5 15:49:43 1999 Christopher Faylor - - * environ.cc (parse_options): Reinstate unions in parse_things, to - save space. - -Fri Dec 3 22:52:05 1999 Christopher Faylor - - Implement new signal-handling scheme which ensures that a program will - not be interrupted while in a system or cygwin DLL. - * Makefile.in: Add sync.o and dll_ofiles target. - * dcrt0.cc (alloc_stack_hard_way): Add more defensive code to ensure - that the stack is really grown. - (alloc_stack): Ditto. - (dll_crt0_1): Reorganize some initialization routines to ensure that - they occur after the heap has been initialized. - * debug.cc: Use muto for locks. Eliminate attempts to avoid being - interrupted by signals. - (threadname_init): New function. - (debug_init): Ditto. - * debug.h: Declare debug_init and threadname_init. - * exceptions.cc (stack_info::stack_info): Don't check for previous use - of get(). - (handle_sigsuspend): Simply using new signal-handling scheme. - (interruptible): New function. Determines if PC should be interrupted. - (interrupt_now): New function. Causes immediate signal dispatch. - (interrupt_on_return): New function. Causes signal dispatch on return - from cygwin or system routine. - (call_handler): Simplify to use new signal-handling scheme. - (set_process_mask): Use mask_sync muto to synchronize setting of - process signal mask. - (sig_handle_tty_stop): New function. Called when have to stop process - now. - (sig_handle): Simplify to use new signal-handling scheme. - (set_process_mask): Ditto. - (events_init): Allocate mask_sync muto. - (unused_sig_wrapper): New function. Encapsulates assembly language - signal handling support. - * fhandler.h (class select_stuff): Accommodate new signal-handling - scheme. - * fhandler_console.cc (fhandler_console): Simplify to use new - signal-handling scheme. - * fhandler_serial.cc (fhandler_serial::raw_read): Ditto. - * fhandler_termios.cc (bg_check): Ditto. - * fhandler_tty.cc (process_input): Ditto. - (fhandler_tty_slave::open): Ditto. - (fhandler_tty_slave::send_ioctl_request): Ditto. - * fork.cc: Ditto. - * path.cc (chdir): Ditto. - * select.cc: Ditto, throughout. - * shared.h: Eliminate unneeded signal enum. - * signal.cc (signal): Simplify to use new signal-handling scheme. - (sleep): Ditto. - (usleep): Ditto. - (sigprocmask): Ditto. - (sigaction): Ditto. - (pause): Use handle_sigsuspend to pause for signal. - * sigproc.cc: Change signal_arrived handle to global_signal_arrived - class. Change various mutex handles to mutos. - (proc_subproc): Simplify to use new signal-handling scheme. Use muto - for locking. - (get_proc_lock): Ditto. - (proc_terminate): Ditto. - (sig_dispatch_pending): Make a "C" function. Return status of pending - signals. - (sigproc_init): Initialize global_signal_arrived. Simplify to use new - signal-handling scheme. Initialize sync_proc_subproc muto. - (sig_send): Eliminate __SIGSUSPEND considerations. Simplify to use new - signal-handling scheme. - (__allow_sig_dispatch): Delete. - (__block_sig_dispatch): Delete. - (__get_signal_mutex): Delete. - (__release_signal_mutex): Delete. - (__have_signal_mutex): Delete. - (wait_sig): Simplify to use new signal-handling scheme. - * sigproc.h: Implement signal_arrived classes. - * smallprint.c (__small_vsprintf): Avoid printing a leading '*' in - function name with %F format. - * spawn.cc (spawn_guts): Simplify to use new signal-handling scheme. - (iscmd): Don't consider a filename to be a "command" unless it contains - a ':'. - * syscalls.cc (_read): Ditto. - (_open): Ditto. - (_close): Ditto. - * termios.cc (tcsendbreak): Ditto. - (tcdrain): Ditto. - (tcflush): Ditto. - (tcflow): Ditto. - (tcsetattr): Ditto. - (tcgetattr): Ditto. - * winsup.h: Reorganize include files. Add preliminary __sig_protect - implementation. - * cygwin/version.h: Bump current version to 1.1.0. - -Thu Dec 2 22:19:40 1999 Christopher Faylor - - * sync.cc (muto::muto): Use an event rather than a semaphore for wait - synchronization. - (muto::acquire): Rewrite to use an event and try to remove races. - (muto::release): Ditto. - -1999-12-02 DJ Delorie - - * environ.cc (parse_options): switch to a static initializer; - templates are sensitive to g++ bugs. - -Fri Nov 26 12:04:23 1999 Christopher Faylor - - * net.cc (cygwin_bind): Ensure that non-Unix domain socket operations - return success correctly. - -Wed Nov 24 21:37:58 1999 Christopher Faylor - - * net.cc (cygwin_bind): Guard against incorrectly setting res to zero - when there is an error condition. - -Tue Nov 23 17:49:55 1999 Christopher Faylor - - * fhandler.cc (fhandler_base::fhandler_base): Use better initialization - scheme. - * fork.cc (stack_base): Eliminate unneeded asm stuff. - * select.cc: Sprinkle in some comments. - * include/winnt.h: Add more CONTEXT. - -Nov 23 20:51:00 1999 Corinna Vinschen - - * net.cc (cygwin_bind): Use struct sockaddr_un in AF_UNIX code. Set - errno to ENAMETOOLONG if length of pathname exceeds limit in AF_UNIX - code. Sets errno to EADDRINUSE in AF_UNIX code if file system socket - object already exists. - * syscalls.cc (setsid): Set errno to EPERM if current process is - already process group leader. - * uinfo.cc (internal_getlogin): Rearrange for better debug output. Set - pi->psid to NULL if SID can't be determined. - * include/cygwin/socket.h: Add AF_LOCAL and PF_LOCAL - (same as AF_UNIX) for POSIX compatibility. - * include/sys/un.h: Add UNIX_PATH_LEN define. Added SUN_LEN macro for - POSIX compatibility. - -Sun Nov 21 22:55:04 1999 Christopher Faylor - - * environ.cc (parse_options): Return immediately after dealing with - NULL argument. Don't try to process it. - -Tue Nov 16 23:29:17 1999 Christopher Faylor - - * signal.cc (kill_worker): Guard against NULL dereference when thread - safe. - -Sat Oct 30 00:59:38 1999 Christopher Faylor - - * Makefile.in: Some general cleanup. - * smallprint.c (__small_vsprintf): Accommodate new format for - __PRETTY_FUNCTION__. - -Wed Oct 27 16:13:36 1999 Christopher Faylor - - * path.cc (mount_info::from_registry): Don't allow the same posix path - into the mount table more than once. - * utils/mount.cc (main): Add some orthogonality to the options. - -Tue Oct 26 21:55:49 1999 Christopher Faylor - - * environ.cc (environ_init): Turn off ntsec by default. - -Wed Oct 27 00:14:11 1999 J"orn Rennecke - - * fhandler.cc (fhandler_base::lseek): Take readahead into account. - -Tue Oct 26 16:46:54 1999 Christopher Faylor - - * syscalls.cc (_unlink): Return EISDIR when attempting to unlink a - directory. - -Mon Oct 25 18:05:23 1999 Christopher Faylor - - * fhandler.cc (fhandler_base::read): Fix previous fix. - -Mon Oct 25 13:46:44 1999 Christopher Faylor - - * dll_init.cc (add): Avoid allocating name for "LINK"ed DLLs. - (DllList::forkeeLoadDlls): Only reload DLLs if they have been - dlopen'ed. - * grp.cc (parse_grp): Assign gr_mem when it is determined. - -Sun Oct 24 21:55:48 1999 Christopher Faylor - - * dll_init.cc (struct dll): Add module name. - (add): Add additional 'name' parameter for recording in dll structure. - (reserve_upto): New function. - (release_upto): Ditto. - (DllList::forkeeLoadedDlls): Ditto. - (DllList::forkeeStartLoadDlls): Remove. - (DllList::forkeeEndLoadedDlls): Ditto. - (DllNameIterator::*): Eliminate class. - (LinkedDllNameIterator::*): Ditto. - * dll_init.h: Reflect above changes. - * fork.cc (fork): Don't generate a list of dlls to load in the parent. - Let the child do it. Use new DllList::forkeeLoadDlls to load DLLs. - * smallprint.c (__small_vsprintf): No need for a sign on a Win32 error. - (small_printf): Move function here from strace(). - * strace.cc (small_printf): Move to smallprint.c - * include/sys/strace.h: Always declare small_printf. - -Sun Oct 24 02:22:13 1999 Christopher Faylor - - * fhandler.cc (fhandler_base::read): Work around C bug. - -Tue Oct 19 22:10:21 1999 Christopher Faylor - - * dll_init.cc: Add some external symbols to allow thread-safe - compilation. - -Tue Oct 19 21:09:42 1999 Christopher Faylor - - Make minor changes throughout to accommodate new gcc merge. - * Makefile.in: Remvoe -fpermissive option when compiling using g++. - * dcrt0.cc (noload): Mark as "unused" to avoid a compiler warning. - * exceptions.cc (sigreturn): Make this "extern" since it essentially - *is* extern. - * fork.cc (sync_with_parent): Modify to cause the macro to be - considered void. - * heap.cc (sbrk): Remove debugging code. - * passwd.cc (getpass): Don't use fprintf to print the prompt. - * path.cc (mount_info::conv_to_win32_path): Accommodate compiler - warning. - * select.cc (cygwin_select): Experimental version of select which - handles fd_sets with non-standard FD_SETSIZE. - (select_stuff::wait): Ditto. - * termios.cc (tcgetattr): Avoid a compiler warning. - (cftospeed): Ditto. - (cftispeed): Ditto. - * uinfo.cc (netapi32_init): Ditto. - * winsup.h (api_fatal): Simplify and avoid a compiler warning. - * include/sys/strace.h (system_printf): Ditto. - (strace_printf_wrap): Modify to cause the macro to be considered void. - (strace_printf_wrap1): Ditto. - -1999-10-19 DJ Delorie - - * Makefile.in (.cc.o): add -fpermissive to avoid g++'s conformance - madness. - * environ.cc (_findenv): rename to my_findenv to avoid newlib - prototype. - * syscalls.cc (logout): remove braces around _PATH_UTMP - -Sat Oct 16 22:53:02 1999 Christopher Faylor - - * path.cc (mount_info::cygdrive_posix_path): Properly terminate string - after Oct 11 change below. - -Fri Oct 15 23:02:39 1999 Christopher Faylor - - * exceptions.cc (stack_info): Reimplement stack handling routines in - new stack_info class. - (stack_info::brute_force): Just fill out the same structure as - StackWalk. - (stack_info::walk): Just fill out stack info. - (stack): Use stack_info class stuff to iterate over and display the - stack. - -Fri Oct 15 00:32:13 1999 Christopher Faylor - - * include/cygwin/version.h: Bump some versions. - -Oct 5 11:45:00 1999 Corinna Vinschen - - * dcrt0.cc (dll_crt0_1): Delete calls to get_WHOEVER_sid. Move call to - uinfo_init() to the end of the function. - * fhandler.cc (get_file_owner): Substitute call to get_id_from_sid() - with call to get_uid_from_sid(). - (get_file_group): Substitute call to get_id_from_sid() with call to - get_gid_from_sid(). - * fork.cc (fork): Copy new pinfo members to child. - * grp.cc (parse_grp): Rewritten. Saves gr_passwd and all user names in - gr_mem. - (read_etc_group): Variable `group_sem' avoids endless loop. - * passwd.cc (read_etc_passwd): Variable `passwd_sem' avoids endless - loop. - * security.cc (get_sid): New function to generate SID from int values. - (get_ssid): New function to generate SID from string. - (get_pw_sid): New function to generate SID from pw_gecos entry. - (get_gr_sid): New function to generate SID from gr_passwd entry. - (get_admin_sid): Rewritten to avoid using heap space. - (get_system_sid): Ditto. - (get_creator_owner_sid): Ditto. - (get_world_sid): Ditto. - (get_id_from_sid): Try to read SIDs from /etc/passwd or /etc/group - files before using RID or Lookup... function. - (legal_sid_type): New function. - (lookup_name): Rewritten to use the logon server info, if any. - (alloc_sd): Try to use SID from /etc/passwd and /etc/group files before - call to lookup_name(). - (alloc_sd): New parameter for logon server. - (set_nt_attribute): Ditto. - (set_file_attribute): Ditto. - * shared.cc (sec_user): If SID is saved in myself, use it instead of - calling lookup_name(). - * shared.h: struct pinfo got extended user information. - * spawn.cc (spawn_guts): method for forcing reread /etc files changed. - (_spawnve): Copy new pinfo members to child. - * syscalls.cc (chown): Change call to set_file_attribute(). - (chmod): Ditto. - * uinfo.cc (internal_getlogin): New function. - (uinfo_init): Calls internal_getlogin() now. - (getlogin): Uses myself->username now. - * winsup.h: extern HANDLE netapi32_handle; Change prototypes for - set_file_attribute(), lookup_name(), get_id_from_sid(). New inline - functions get_uid_from_sid() and get_gid_from_sid(). - * utils/mkgroup.c: Adapt to the new ntsec features. - * utils/mkpasswd.c: Ditto. - -Thu Oct 14 23:46:03 1999 Christopher Faylor - - Replace calls to GetCurrentProcess() with hMainProc throughout. - * autoload.h: Implement LoadDLLinitnow() function to force the loading - of a DLL. - * cygwin.din: Export cygwin_stackdump. - * dcrt0.cc (dll_crt0): Set up hMainProc and hMainThread here. - * dll_init.cc (dll_dllcrt0_1): Ditto. - * environ.cc (parse_options): New "oldstack" option for forcing the use - of the old stack walking code. - * exceptions.cc (signals_init): Remove. - (err_printf): Remove. Use small_printf throughout. - (sfta): New helper function for StackWalk. - (sgmb): Ditto. - (stack_brute_force): Renamed from old stack walk function. Now uses - frame pointer from context handler. - (stack_walk): New function. Uses Windows API to walk the stack. - (stack): Reimplement to attempt to load imagehlp.dll. If this succeeds - use stack_walk() to display stack info, otherwise use - stack_brute_force. - (cygwin_stackdump): Temporary (?) function for displaying a stack dump - from the called location. - (stackdump): Accept new parameters for passing to stack(). - (handle_exceptions): Call stackdump with new parameters needed to walk - the stack. - * fhandler.cc (fhandler_base::read): Fix potential buffer overrun. Fix - end of buffer problems when \r is not followed by a \n. - (fhandler_base::lseek): Avoid flushing read ahead when not moving the - file pointer. - * fhandler_termios.cc (fhandler_termios::set_ctty): Add a debugging - statement. - * sigproc.cc (sigproc_init): Eliminate obsolete signals_init function. - * winsup.h: Add some declarations. - -Wed Oct 13 09:02:32 1999 Kazuhiro Fujieda - - * path.cc (readlink): Return errno correctly when it can't find the - target symlink. - -Tue Oct 12 13:02:08 1999 Christopher Faylor - - * syscalls.cc (setsid): Only reset sid/pgid when NOT process group - leader. - * tty.cc (tty_list::allocate_tty): Don't set sid to myself. The first - tty open should do that. - -Mon Oct 11 23:13:29 1999 Christopher Faylor - - * dcrt0.cc (noload): Issue appropriate Windows error. - * fhandler_termios.cc (fhandler_termios::ctty): Don't automatically set - sid, etc., unless the current pid associated with the tty's sid does - not exist. - * path.cc (mount_info::cygdrive_posix_path): Avoid copying beyond the - end of buffer or suffer garbage. - * pinfo.cc (pinfo_init): Restore sid behavior of a year ago. The sid - should be the same as the pid to be equivalent to UNIX. - (pinfo_list::operator []): Add more bounds checking. - -Sun Oct 10 14:08:30 1999 Christopher Faylor - - * select.cc (select): Return error if n > FD_SETSIZE. This is a - temporary fix. - -Sun Oct 10 13:56:14 1999 Christopher Faylor - - * path.cc (iscygdrive_device): Be more precise in detecting when a - "cygdrive" device. This should allow 'mkdir -p' to work correctly. - -Fri Oct 08 08:55:31 1999 Kazuhiro Fujieda - - * path.cc (symlink_check_one): set errno to EINVAL on socket files - same as normal files. - -1999-10-06 DJ Delorie - - * include/oaidl.h (IDispatch.GetIDsOfNames): Use DISPID* not DISPID - -1999-10-06 DJ Delorie - - * exceptions.cc (err_printf): new function; print to stderr - without strace's clutter. The stacktrace functions use this, so - the stacktrace files should be cleaner. - (exception): Print segment registers also - (stack): include a peek at the function's arguments - -Tue Oct 5 16:33:17 1999 Christopher Faylor - - * hinfo.cc (hinfo::extend): Eliminate inappropriate test for boundary - condition. - -1999-10-04 DJ Delorie - - * config/i386/longjmp.c: don't restore %fs (Paul Sokolovsky - ) - -1999-10-04 DJ Delorie - - * localtime.c (tzsetwall): Handle Asian Windows strings correctly - (from Kazuhiro Fujieda ). - -Sat Oct 2 23:00:00 1999 Corinna Vinschen - - * include/lm*.h: Correct multiple problems in lan manager - header files. - -Sun Oct 3 14:29:53 1999 Christopher Faylor - - * sysdef/imagehlp.def: New file. Definitions for imagehlp.dll. - * include/imagehlp.h: Ditto. - * include/winbase.h: YA missing structure. - -Fri Oct 1 11:16:00 Corinna Vinschen - - * security.cc (alloc_sd): Correct setting of FILE_DELETE_CHILD. - (get_file_attribute): Read ntea attributes only if ntsec is disabled. - * syscalls.cc (_unlink): Don't queue file into delqueue if DeleteFile - returns ERROR_ACCESS_DENIED. - -1999-09-30 Mumit Khan - - * init.cc (dll_entry): Remove static_load case. - * dcrt0.c (set_os_type): Make it externally visible. - * dll_init.cc (dll_dllcrt0_1): Update noncygwin initialization for - post-b20.1 code. - -1999-09-30 DJ Delorie - - * times.cc: declare _timezone and _daylight properly - -Wed Sep 29 23:57:40 1999 Christopher Faylor - - * dcrt0.cc (do_exit): Remove EXIT_SIGNAL mask when exiting. It is not - correct given changes to really_exit. - * select.cc (peek_serial): Work around apparent Windows bug. - -1999-09-29 Norbert Schulze - - * times.cc (timezone): revert 'return TZ if set' patch. - * times.cc (timezone): uses now tzset() and _timezone. - * times.cc (gettimeofday): ditto. - * localtime.c (tzsetwall): no negative minutes if offset is negativ. - * localtime.c (tzsetwall): minutes place holder was missing if - minutes == 0 and seconds !=0 (h:0:s). - * localtime.c (tzsetwall): if timezone has no daylight saving - (tz.StandardDate.wMonth==0) generate no daylight saving parameters. - -Sat Sep 25 15:11:04 1999 Christopher Faylor - - * fhandler_termios.cc (fhandler_termios::bg_check): Accept a new - argument to control whether we should worry about blocking signals. - * fhandler.h: Ditto. - * syscalls.cc (read_handler): Accept a new argument for passing to - bg_check. - (read): Inform read_handler if signals are blocked or not. - * termios.cc: Throughout, reorganize to always block signals before - calling bg_check. - -Sat Sep 25 13:36:06 1999 Christopher Faylor - - * fhandler.h (fhandler_termios::line_edit): Add an extra argument. - * fhandler_serial.cc (fhandler_serial::open): Maintain consisten - fAbortOnError state. - * fhandler_termios.cc (fhandler_termios::line_edit): Use new - "always_accept" argument to control whether input_done is set - regardless of canonical state. - * fork.cc (vfork): Duplicate "parent's" fd table. - * hinfo.cc (hinfo::dup_worker): New method. - (dup2): Use new dup_worker method. - (hinfo::fixup_after_fork): Lock dtable prior to operating on it. - (hinfo::vfork_child_dup): New method. Duplicates dtable for vfork. - (hinfo::vfork_parent_restore): New method. Restores dtable when vfork - exits. - * net.cc (set_winsock_errno): Make global. - * pipe.cc (pipe): Default mode to binary unless *explicitly* set to - text. - * select.cc (set_bits): Test that {read,write,except}_selected are - active before setting a bit. - (peek_pipe): Short circuit tests if we're not checking for readable - or "except"able handles. - (thread_socket): Use read check for exitsock as old method relied on - undocumented, unreliable behavior. - (start_thread_socket): Perform more setup on exitsock to improve thread - exit signalling. - (socket_cleanup): Connect to the exitsock to force thread_socket thread - exit. - * winsup.h (hinfo): Add preliminary vfork stuff. - * include/winsock.h: Add shutdown() how types. - * include/sys/socket.h: Add socketpair declaration. - -1999-09-22 DJ Delorie - - * syscalls.cc (chown): never return ENOSYS - just pretend it - works. - -Wed Sep 22 00:47:56 1999 Christopher Faylor - - * select.cc (MAKEready): Need to initialize 'fd' or open tests in - peek fail. - -Mon Sep 20 17:07:37 1999 Christopher Faylor - - * smallprint.c (__small_vsprintf): Fix '%+' handling. - -Thu Sep 16 21:48:13 1999 Christopher Faylor - - * utils/cygcheck.cc (dump_sysinfo): Deal with a new compiler error. - * utils/strace.cc (make_command_line): Change to a void * argument, as - is required for SetConsoleCtrlHandler. - -Thu Sep 16 20:47:12 1999 Christopher Faylor - - * dcrt0.cc (__api_fatal): Rearrange slightly. - * fhandler.h (set_ctty): Change to void. - * fhandler_termios.cc (fhandler_termios::set_ctty): Ditto. - * select.cc (thread_pipe): Change to a void * argument, as is required - for thread functions. - (thread_socket): Ditto. - (thread_serial): Ditto. - * include/winbase.h: Mark ExitProcess as noexit. - -Thu Sep 16 18:32:12 1999 Christopher Faylor - - * exceptions.cc (ctrl_c_handler): Make WINAPI, as required by - SetConsoleCtrlHandler. - -Thu Sep 16 17:48:05 1999 Christopher Faylor - - * debug.cc (thread_stub): Make WINAPI, as required by CreateThread. - * fhandler_tty.cc (process_input): Ditto. - (process_output): Ditto. - (process_ioctl): Ditto. - * select.cc (thread_pipe): Ditto. - (thread_serial): Ditto. - (thread_socket): Ditto. - * sigproc.cc (wait_proc): Ditto. - (wait_sig): Ditto. - * window.cc (winMain): Ditto. - -Wed Sep 15 20:58:37 1999 Christopher Faylor - - * exceptions.cc (call_handler): Let fatal signals through regardless of - signal_mutex. - * fhandler.h (fhandler_base): Make bg_check virtual. - (fhandler_termios::bg_check): Eliminate the second argument. - * fhandler_console.cc (fhandler_console::ioctl): Check for background - operation. - * fhandler_termios.cc (fhandler_termios::bg_check): Eliminate the - second argument. A negative arg 1 means the same thing. - * ioctl.cc (ioctl): Add debugging output. - * syscalls.cc (_write): Eliminate second argument to bg_check. - * termios.cc (tcsendbreak): Check for background operation. - (tcdrain): Ditto. - (tcflush): Ditto. - (tcflow): Ditto. - (tcsetattr): Reorganize on similar lines to above routine. - -Wed Sep 15 15:25:04 1999 Christopher Faylor - - * select.cc (peek_pipe): Only set read_ready if bg_check returns <= 0. - (peek_console): Ditto. Correct PeekConsole conditional so that the for - loop breaks eventually. - -Wed Sep 15 00:21:40 1999 Christopher Faylor - - * exceptions.cc (set_console_handler): Allocate security stuff here - since it is needed earlier in the process now. Allocate a shared event - for use in synchronizing CTRL-C events that happen while the process is - still initializing. - (ctrl_c_handler): Use the above event to synchronize with the cygwin - startup process, waiting for the signal thread to come alive before - trying to send a signal. - (signals_init): Don't call set_console_handler() here, since it is now - handled much earlier in cygwin initialization. - * shared.cc (shared_init): Move out security setup. - * sigproc.cc (wait_sig): Activate the console_handler_thread_waiter so - that any waiting thread which is handling ctrl-c's will wake up and - send a signal, if appropriate. - -Tue Sep 14 23:49:39 1999 Christopher Faylor - - * exceptions.cc (ctrl_c_handler): Handle ctrl-c events ourself, using - the "UNIX way". - * fhandler_console (tty_list::get_tty): New function. - * shared.h: Add some additional things to tty_min class for handling - ctrl-c. - -1999-09-14 DJ Delorie - - * dir.cc (rmdir): return ENOTDIR for regular files on 9x - -Tue Sep 14 00:01:59 1999 Christopher Faylor - - * debug.h (ForceCloseHandle2): New macro. - * fhandler.cc (set_inheritance): Accept name of handle as optional - third argument. Use this in ForceCloseHandle2/ProtecHandle2. - * fhandler.h: Implement bg_check() method. - * fhandler_console.cc (get_tty_stuff): Initialize more tty stuff. - (fhandler_console::read): Check for background read. - * fhandler_termios.cc (fhandler_termios::bg_check): New function. - Performs appropriate action given background read or write. - * fhandler_tty.cc (fhandler_tty_slave::write): Replace background check - code with new method. - (fhandler_tty_slave::read): Ditto. - (fhandler_tty_common::set_close_on_exec): Pass output_mutex name to - set_inheritance. - * select.cc: Throughout check that the fd is still open before polling. - (peek_pipe): Check for background read. - (peek_console): Ditto. - * shared.h: Move ntty from tty into tty_min. - * syscalls.cc (read_handler): Check for background read. - (_write): Check for background write. - -Sat Sep 11 16:24:21 1999 Christopher Faylor - - * path.cc (iscygdrive_device): New macro. - (mount_info::conv_to_win32_path): Only attempt "cygdrive" translation - when passed /cygdrive/something. - (mount_info::write_cygdrive_info_to_registry): Store in-memory copy of - cygdrive prefix automatically. - (mount_info::read_cygdrive_info_from_registry): Reorganize for new - write_cygdrive_info_to_registry functionality. - (mount): Ditto. - -Fri Sep 10 15:44:11 1999 Christopher Faylor - - * syscalls.cc (pathconf): Make first arg 'const'. - -1999-09-10 DJ Delorie - - * exec.cc (_execve): check for an empty environment - -Wed Sep 8 10:24:12 1999 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Generalize test for initial zeroes in - exec/fork block. - * fhandler.cc (fhandler_disk_file::open): Don't attempt #! detection on - non-disk files. - * fhandler.h: Use generic status bit set/clear macros. Use bitmask for - fhandler_termios state. - * fhandler_console.cc: Rename "tty_stuff" to more descriptive - "shared_console_info". - (fhandler_console::read): Reset console state before a read if - appropriate. - (fhandler_console::open): Improve check for setting console state. - (fhandler_console::fixup_after_fork): Ditto. - (set_console_state_for_spawn): New function. - * fhandler_termios.cc (fhandler_termios::tcinit): Use new method for - determining if initialized. - * fhandler_tty.cc (fhandler_tty::init_console): Avoid sending handle to - init or it will be closed. - * fork.cc (per_thread::set): Make this method non-inline, temporarily. - * select.cc (peek_console): Call set_input_state to ensure that the - console is in the correct state. - * shared.h (child_info): Make zero element an array for future - tweaking. - (tty_min): Change initialized element to a bit field. Define bit field - macros for manipulating it. - * sigproc.cc (wait_sig): Wake up every half second in a (vain?) attempt - to work around Windows 98 hanging problem. - (wait_subproc): Ditto. - * spawn.cc (spawn_guts): Use new "set_console_state_for_spawn" prior to - starting a process. - * winsup.h: Define generic macros for manipulating a method's status - field. - (per_thread): Move inline method to fork. - -Mon Sep 6 13:36:34 1999 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_master::init_console): Remove retrieval - of stderr handle since it is not required for correct init operation. - * hinfo.cc (hinfo_init): Reorganize to accommodate potential closing of - console handles by fhandler_console::init. - (init_std_file_from_handle): Set standard handle as appropriate. - (hinfo::de_linearize_fd_arry): Ditto. - * fhandler_console.cc (fhandler_console::init): Conditionally close - handle only if it is valid. - -Sun Sep 5 22:43:21 1999 Christopher Faylor - - * utils/cygcheck.cc: Make sure that GetDiskFreeSpaceExA is defined as a - __stdcall function or the stack will suffer. For now, don't sort mount - output as more work copying the individual mntent elements is required. - -Sat Sep 4 19:01:00 1999 Christopher Faylor - - * include/glob.h: Ensure that glob*() functions can be properly accessed by - programs using the DLL. - -Sat Sep 4 18:49:04 1999 Christopher Faylor - - * heap.cc (heap_init): Tweak debugging output. - * sigproc.cc (sig_send): Catch obvious impossible values from - GetLastError. - -Sat Sep 4 18:43:49 1999 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::open): Protect against signal - dispatch. - (fhandler_tty_slave::write): Only wait a fixed amount of time to - receive a an output_done_event. - (fhandler_tty_slave::tcflush): Protect against signal dispatch. - -Sat Sep 4 18:30:42 1999 Christopher Faylor - - * exceptions.cc (handle_sig): Temporarily remove OutputDebugString. It - seemed to be causing sporadic hangs. - (call_handler): Save and restore di and si. - (sigreturn): Ditto. - -Fri Sep 3 23:07:44 1999 Christopher Faylor - - * fhandler_termios.cc (fhandler_termios::line_edit): Properly deal with - sending characters to slave when !iscanon. - -Fri Sep 3 18:15:00 1999 Corinna Vinschen - - * fhandler_raw.cc (fhandler_dev_raw::fstat): Add S_ISCHR to mode bits. - * fhandler_tape.cc (fhandler_dev_tape::fstat): Erase setting of S_ISCHR - since it's set in fhandler_dev_raw::fstat now. - -Thu Sep 2 22:11:03 1999 Christopher Faylor - - * path.cc (mount_info::conv_to_win32_path): Fix problem with - calculating relative path at root. - -Wed Sep 1 23:24:43 1999 Christopher Faylor - - * fhandler.cc (fhandler_base::fhandler_base): Don't use default binmode - for console. - -Wed Sep 1 20:51:05 1999 Christopher Faylor - - * smallprint.c (__small_vsprintf): Allow field width argument with 'l' - modifier. Consolidate processing of field width. - * uname.cc (uname): Eliminate space in "release" field. - -Tue Aug 24 10:46:24 1999 Kazuhiro Fujieda - - * fhandler_console.cc (write_normal): Write '\n' corresponding to - DWN if the cursor is out of the window. - -Wed Aug 25 22:16:46 1999 Christopher Faylor - - * smallprint.c (rn): Deal with positive as well as negative signs. - (__small_vprintf): Handle '+', 'l', and '%' format types. - -Wed Aug 25 00:38:49 1999 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Zero heap information in user_data to - work around mutant startup code. - -Tue Aug 24 00:03:22 1999 Christopher Faylor - - * sigproc.cc (sig_send): One more end-of-process race detection. - -Mon Aug 23 21:37:07 1999 Christopher Faylor - - Throughout, remove malloc.h. - * debug.cc: Initialize handle list so that it will not be copied on - fork. - * exceptions.cc (_sigreturn): Zero windows error on exit. It's - meaningless after a signal dispatch. - * fhandler_console.cc (fhandler_console::de_linearize): Improve error - messages. - * shared.h: Increment fork magic number. - * sigproc.cc (sigproc_terminate): Close all handles prior to calling - proc_terminate if running in signal thread. - (sig_send): Eliminate bogus ResetEvent on a semaphore. Add code for - potentially dealing with problems when this code is interrupted via a - signal dispatch. - * times.cc (timezone): Use __small_sprintf. - * uname.cc (uname): Ditto. Also use strcpy instead of sprintf where - appropriate. - -1999-08-23 DJ Delorie - - * localtime.c: export timezone, daylight, tzname as _* - * times.cc: don't export timezone, daylight, tzname - (timezone): return TZ if set. - (cygwin_tzset): not needed. - -Thu Aug 19 13:46:47 1999 Christopher Faylor - - * fork.cc (fork): Remove pinfo lock. It is in allocate_pid, now. - * spawn.cc (_spawnve): Ditto. - * pinfo.cc (pinfo_init): Ditto. - (lock_pinfo_for_update): Impreove debug output. - (pinfo_list::allocate_pid): Lock pinfo mutex here. - -1999-08-19 DJ Delorie - - * Makefile.in (tooldir): If we're building natively, drop the - $(target_alias) on include and lib's install (i.e. /usr/include - instead of /usr/include/i686-cygwin). - -Thu Aug 19 01:11:25 1999 Christopher Faylor - - * sigproc.cc (sig_send): Avoid a race with proc thread when executing - due to a signal. - -Wed Aug 18 16:37:59 1999 Kazuhiro Fujieda - - * fhandler_console (fhandler_console::fillin_info): Avoid setting - scroll_region.Bottom when it is not known. - (fhandler_console::write_normal): Add various fixes for console - scrolling. - -Wed Aug 18 16:18:22 1999 Christopher Faylor - - * sigproc.cc: Add more precise end-of-process detection. - -Wed Aug 18 00:03:47 1999 Christopher Faylor - - * sigproc.cc (sig_send): Work around apparent Windows bug which - occasionally results in bogus error messages when a signal is - dispatched. - -1999-08-17 DJ Delorie - - * localtime.c (tzsetwall): Deduce TZ more accurately. - -Tue Aug 17 18:00:03 1999 Christopher Faylor - - * select.cc (peek_pipe): Correct detection of process group for - backgrounded processes. - -Tue Aug 17 10:24:49 1999 Christopher Faylor - - * include/winnt.h: Fix typo in IMAGE_FIRST_SECTION definition. - -Sun Aug 15 19:11:49 1999 Mumit Khan - - * gcrt0.c (__eprol): Avoid namespace pollution. - (_monstartup): Turn into a constructor function and prevent multiple - invocations. - -Mon Aug 16 10:03:00 Corinna Vinschen - - * utils/mkgroup.c: Correct call to LookupAccountSid for retrieval of - 'None'. - -Mon Aug 16 00:24:29 1999 Christopher Faylor - - * debug.cc (locker): Improve signal mutex locking. - * exceptions.cc (sig_handle): Pass STOP signals to call_handler to - ensure honoring of signal_mutex. - (call_handler): Move STOP code here after acquistion of signal_mutex. - * fhandler_tty.cc (fhandler_tty_common::__acquire_output_mutex): Track - lockers for debugging. - (fhandler_tty_common::__release_output_mutex): Ditto. - (fhandler_slave::write): Fix faulty signal blocking code. - * fork.cc (fork_copy): Remove ancient if 0. - (fork): Conditionalize "FORKDEBUG" under DEBUGGING. - * sigproc.cc (proc_terminate): Reduce pinfo lock time. - (sigproc_terminate): Set sig_loop_wait after getting signal_mutex. - (__get_signal_mutex): Reorganize for less strace output when not - DEBUGGING. - (__release_signal_mutex): Ditto. Reorganize case where !sig_loop_wait. - (have_signal_mutex): Returns true if current thread has the mutex. - * wait.cc (wait4): Change debugging message. - -Sat Aug 14 0:10:00 Corinna Vinschen - - * fhandler.cc (fhandler_base::raw_read): Set correct errno from Win32 - error when ReadFile fails. - (fhandler_base::raw_write): In case of ERROR_DISK_FULL, return - bytes_written only if bytes_written > 0. - * errno.cc: Map ERROR_DISK_FULL to ENOSPC. - -Fri Aug 13 14:22:12 1999 Christopher Faylor - - * select.cc (peek_pipe): Honor ignra argument. - -Fri Aug 13 00:45:00 1999 Christopher Faylor - - * spawn.cc (spawn_guts): Ensure that hExeced is set to proper state - when parent has exited. - -Thu Aug 12 14:09:30 1999 Christopher Faylor - - * sigproc.cc (getsem): Fix typo which prevented sending signals to - other processes. - -Wed Aug 11 22:06:33 1999 Christopher Faylor - - * cygwin.din: Export glob and globfree. - * glob.h: Move to include. - * Makefile.in: Correct glob.h dependencies. - -Wed Aug 11 19:41:04 1999 Sergey Okhapkin - - * fhandler.cc (fhandler_disk_file::fstat): Check if the file is unix - domain socket. - (fhandler_disk_file::open): Call set_socket_p(). - * fhandler.h: Add new fhandler type flags (FH_LOCAL, FH_FIFO). - (fhandler_base): get/set_socket_p - new member functions. - (fhandler_socket::addr_family): Add new member, currently unused. - (fhandler_socket::get/set_addr_family): Add new functions to access - addr_family. - * include/sys/un.h: New file. - * net.cc: Include - (cygwin_socket): Always create socket of AF_INET family, store - argument's family. - (get_inet_addr): New static function. Converts AF_UNIX requests into - corresponding AF_INET requests. - (cygwin_sendto): Use get_inet_addr(). - (cygwin_connect): Likewise. - (cygwin_accept): Check for sockaddr length. - (cygwin_bind): Implement AF_UNIX. - * path.h (PATH_SOCKET): Add new enum value. - (path_conv::issocket): Add new member function. - (SOCKET_COOKIE): Add new define. - * syscalls.cc (chmod): Mark socket files with system file attribute. - -Wed Aug 11 17:22:46 1999 Corinna Vinschen - - * utils/mkgroup.c (main): Generate "None" group when - invoked via mkgroup -l. - -Tue Aug 10 21:30:31 1999 Christopher Faylor - - * select.cc (peek_pipe): Handle type ahead where appropriate. - * sigproc.cc (proc_can_be_signalled): Revert to previous method for - determining signalability. - (getsem): Move PID_INITIALIZING test here. - * wait.cc (wait4): Improve debug output slightly. - -Mon Aug 9 23:27:44 1999 Christopher Faylor - - * dcrt0.cc (do_exit): Add additional check for valid hExeced. - * exceptions.cc (call_handler): Implement a raceless way to track - pending_signals. - * signal.cc (kill_worker): Make calls from non-main threads synchronous - or signals from a tty thread don't work right. - * sigproc.cc (sig_send): Localize pending_signals assignment to only - the wait_sig thread. - (__get_signal_mutex): Don't attempt to grab a mutex if signal_mutex - hasn't been assigned yet. Add more strace debugging information when - -DDEBUGGING. - (__release_signal_mutex): Don't attempt to release a mutex if - signal_mutex hasn't been assigned yet. Add more strace debugging - output. - (wait_sig): Attempt to eliminate race in setting of pending_signals. - * spawn.cc (spawn_guts): Set hExeced to INVALID_HANDLE_VALUE so that it - will be obvious when a process is actually just an execed stub. - * strace.cc (strace_vsprintf): Output a "!" after the pid when - executing in an execed stub. - -Mon Aug 9 17:17:13 1999 Christopher Faylor - - Throughout, eliminate in() and out() macros. - * winsup.h (tty_attached): Accept an argument indicating the pinfo - structure to query. - * exceptions.cc (really_exit): Cosmetic change. - * external.cc (fillout_pinfo): Use queried pinfo structure for - determining tty number, not *our* number. - * net.cc: More workarounds. - * path.cc (get_device_number): Supply argument to tty_attached. - * syscalls.cc (ctermid): Ditto. - * strace.cc (strace_dump): Remove. - * include/sys/strace.h: Eliminate obsolete stuff. - -Sun Aug 8 22:54:45 1999 Christopher Faylor - - * exceptions.cc (call_handler): Process all signals on return from a - signal dispatch. - * sigproc.cc (proc_can_be_signalled): Guard against waiting too long - when exiting. - (proc_exists): Don't report an exited process as "existing". - (proc_terminate): Close handle prior to testing for existence so that - proc_exists will not always return TRUE. Eliminate use of zap_subproc. - (stopped_or_terminated): Eliminate use of zap_subproc. - (zap_subproc): Delete. - -Sun Aug 8 22:17:36 1999 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_master::init): hThread must remain - open. Previous change to close it was wrong. - -Sun Aug 8 20:35:33 1999 Christopher Faylor - - * exceptions.cc: Initalize NO_COPY variables. - * pinfo.cc (record_death): Don't be so insistent about getting - the pinfo lock. - * sigproc.cc (proc_terminate): Tighten the region protected by - the pinfo lock. - * spawn.cc (spawn_guts): Eliminate the pinfo lock when reparenting - as it is no longer required. - (_spawnve): Tighten the region protected by the pinfo lock. - -Sun Aug 8 18:26:51 1999 Christopher Faylor - - * sigproc.cc (sig_send): Add more unfortunate guards against a - system call being interrupted by a signal dispatch. - -Sat Aug 7 15:38:42 1999 Christopher Faylor - - * security.cc (get_admin_sid): Ensure that returned buf is not copied - on a fork. - (get_system_sid): Ditto. - (get_create_owner_sid): Ditto. - (get_world_sid): Ditto. - -Sat Aug 7 15:17:25 1999 Christopher Faylor - - * fhandler_tty.cc (process_input): Reset signal_arrived event prior to - calling console read as this is now a requirement for functions which - detect signal_arrived. - (fhandler_tty_master::write): Allow signals to operate prior to raising - SIGTTOU. - (fhandler_tty_master::read): Allow signals to operate prior to raising - SIGTTIN. - * select.cc (peek_pipe): Detect attempt to read from tty not in our - process group as a "read_ready" event. - * include/shellapi.h: Add missing defines. - * utils/ps.cc: Output windows pid as unsigned for Windows 9x. - -Sat Aug 7 14:30:00 Corinna Vinschen - - * security.cc (get_creator_owner_sid): New function. - * shared.cc (sec_user): calls `get_creator_owner_sid' in creation - of the security attributes structure additionally. - -Fri Aug 6 13:04:40 1999 Christopher Faylor - - * spawn.cc (spawn_guts): Allow failure from OpenProcess. The parent - may have exited due to 7/31 change. - -Thu Aug 5 22:54:07 1999 Christopher Faylor - - * sigproc.cc (wait_for_me): Break out as a common function to check - that the current process is ready to handle signals. - (proc_can_be_signalled): Treat myself differently. - -Thu Aug 5 21:24:20 1999 Christopher Faylor - - * fhandler_console.cc (fhandler_console): Don't call tcinit here. - (fhandler_console::read): Don't reset signal_arrived here. - * syscalls.cc (_read): Set it here instead. - * fhandler_termios.cc (fhandler_termios::line_edit): Only call - accept_input when input is ready. Ignore iscanon in this case. - * fhandler_tty.cc (fhandler_tty_slave::init): Don't call tcinit here. - -Thu Aug 5 16:02:25 1999 Christopher Faylor - - * strace.cc (handle_output_debug_string): Ignore errors reading - from child memory as they seem to occur due to a process exiting. - (close_handle): New, defensive code. - -Thu Aug 5 13:32:43 1999 Christopher Faylor - - * strace.cc (remove_handle): New function. - (add_child): Speed up slightly. - (proc_child): Use output of remove_child in CloseHandle. - -Thu Aug 5 12:38:50 1999 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Don't protect subproc_ready if it is NULL. - (do_exit): Avoid calling close_all_files if exiting from exec stub. - * net.cc: Reorganize to work around some compiler bugs. - * spawn.cc (spawn_guts): Set hExeced only after child stuff has been - completely initialized. - * syscalls.cc (_open): Protect against signals. - * utils/strace.cc (warn): New function. - (add_child): Issue warning when can't duplicate child process handle. - -Wed Aug 4 21:35:28 1999 Christopher Faylor - - * psapi.h: New file. - -Thu Aug 4 10:28:00 Corinna Vinschen - - * security.cc: Eliminate MALLOC_CHECK calls. - (lookup_name): New function simplifies the retrieval of user and group - names. - (alloc_sd): Call `lookup_name' instead of `LookupAccountName'. - * shared.cc (sec_user): Call `lookup_name' instead of - `LookupAccountName'. Eliminate 'free' call on stack space. - * winsup.h: Declare `lookup_name'. - -Wed Aug 4 16:24:02 1999 Christopher Faylor - - * a.out.h: Fix cut and paste from mime email typos. - -Mon Aug 2 19:08:48 1999 Christopher Faylor - - * Makefile.in: Fix utils dependency. Make clean more assertive. - * path.cc (mount_info::conv_to_win32_path): Fill in correct destination - when a device name is detected. - * syscalls.cc (chown): Always succeed when referencing a cygwin device. - (chmod): Ditto. - * net.cc (get_ifconf): Eliminate holdover from previous change. - -Mon Aug 2 13:07:44 1999 Christopher Faylor - - * dcrt0.cc (do_global_ctors): Remove previous change. It was just - wrong. - -Sun Aug 1 23:21:28 1999 Christopher Faylor - - Throughout rename 'slave_alive' handle to 'inuse'. - * shared.h: Implement tty_attached() macro to determine when an actual - tty is associated with the process. - (class tty): Add some methods for manipulating an "inuse" event that is - common to both master and slave parts of a tty. - * dcrt0.cc (do_exit): Use tty_attached() to determine if signal should - be sent to process group. - * external.cc (fillout_pinfo): Return -1 if tty is not attached (i.e, - attached to a console). - * fhandler.h: Move more stuff into fhandler_tty_common and out from sub - classes. - * fhandler_console.cc (fhandler_console::read): Send SIGWINCH signal to - *correct* process group. - (fhandler_console::open): Fix incorrect argument ordering in set_ctty. - (fhandler_console::de_linearize): Remove unneeded handle resets. - * fhandler_tty.cc (fhandler_tty_slave::open): Fix incorrect argument - ordering in set_ctty. Use tty create_inuse method to create inuse - event. - (fhandler_tty_slave::close): Delete. - (fhandler_tty_slave::dup): Delete. - (fhandler_tty_slave::write): Minor cleanup of flow of control. - (fhandler_tty_common::dup): Subsume fhandler_tty_slave dup method. - (fhandler_pty_master::fhandler_pty_master): Zero inuse field. - (fhandler_pty_master::open): Set inuse field. - (fhandler_tty_common::close): New, superclass method. - (fhandler_tty_common::set_close_on_exec): Handle inuse field. - (fhandler_tty_common::fixup_after_fork): Ditto. - (fhandler_tty_slave::set_close_on_exec): Delete. - (fhandler_tty_slave::fixup_after_fork): Delete. - * path.cc (get_device_number): Use tty_attached() to figure out - /dev/tty. - * select.cc (peek_console): Send SIGWINCH signal to *correct* process - group. - * tty.cc (tty::master_alive): New method. - (tty::create_inuse): New method. - -Sun Aug 1 16:23:22 1999 Christopher Faylor - - * net.cc (get_ifconf): Use alloca for temporary buffer. - -Sun Aug 1 01:38:20 1999 Christopher Faylor - - Modify de_linearize methods throughout to set unix and msdos path - names. - * dcrt0.cc (do_exit): Only remove shared memory when we're done with - it. - * exceptions.cc (try_to_debug): Move static variable outside of the - function so that it can more easily be set with gdb. - * fhandler_console.cc (fhandler_console::open): Handles are typically - hexadecimal in debugging output. - (fhandler_console::open): Do not open inherit console handles by - default. - (fhandler_console::dup): Just use open method to "duplicate" a console - handle. - (fhandler_console::fixup_after_fork): Do *not* close handles here since - they have not been inherited. - (fhandler_console::de_linearize): Ditto. - * utils/strace.cc (create_child): Correct debugging flags when not - tracking forked processes. - -Sat Jul 31 20:10:58 1999 Christopher Faylor - - * dcrt0.cc (do_global_ctors): Ensure that ctors are not called more - than once per session. - * fork.cc (fork): Use sig_protect to protect against signals during - fork. - * pinfo.cc (lpfu): Show windows pid in debugging message as this is - generally more useful. - * pinfo.cc (unlock_pinfo): Issue an error if ReleaseMutex fails. - (pinfo::record_death): Actually unlock pinfo on exit rather than allow - ExitProcess to do this since ExitProcess can sometimes take a *long* - time. - * spawn.cc (spawn_guts): Ensure that pinfo is always unlocked. - -Thu Jul 29 23:43:24 1999 Christopher Faylor - - Throughout, consolidate pgid processing for console and tty into - fhandler_termios and tty_min. - * debug.h: Make WF?O functions the defaults for dealing with Waits. - These functions attempt to work around signal interrupt problems. - * debug.cc: Ditto. - * exceptions.cc (call_handler): Don't wait a long time for second - attempt to get signal mutex. - * fhandler_console.cc (fhandler_console::open): Set the "controlling - tty". - * fhandler_termios.cc: Move the ctty and pgid functions here. - (fhandler_termios::line_edit): Fix debug output. - * fhandler_tty.cc (fhandler_tty_slave_write): Use sig_protect to - protect against output_mutex deadlock. - * fork.cc (get_vfork_val): Conditionalize with NEWVFORK. - * syscalls.cc (setsid): Add debugging output. - (setpgid): Reorganize and add debugging output. - * tty.cc (tty::init): Use a method to clear the sid. - -Thu Jul 29 23:42:53 1999 Christopher Faylor - - Patch from Egor Duda : - * grp.cc (read_etc_group): Use a default /etc/group entry when one - doesn't exist. - (getgrgid): Ditto. - * passwd.cc (read_etc_passwd): Use a default /etc/passwd entry when one - doesn't exist. - (search_for): Ditto. - * uinfo.cc (read_etc_group): Remove some defines. - * winsup.h: Move them here. - -1999-07-29 Bernd Schmidt - - * Makefile.in (SUBDIRS_AFTER): Build mingw before utils. - * utils/Makefile.in (MINGW_LDFLAGS): Add "-B../mingw/" - - -Tue Jul 27 23:31:28 1999 Christopher Faylor - - * dcrt0.cc: Add experimental vfork_storage initialization. - (do_exit): Ditto. - * exec.cc: Use _spawnve throughout as a common interface for execing a - program. - * fork.cc (vfork): Add beginnings of true vfork support. - * path.cc (sort_by_posix_name): Remove special casing of zero length - names since they should now be eliminated earlier on. - (sort_by_native_name): Ditto. - (mount_info::del_item): Remove hole from mount table specifically, here - or suffer weird behavior. Suggested by Andrew Dalgleish - . - * shared.cc: Make SHAREDVER "unsigned" to avoid a compiler warning. - * spawn.cc : Accommodate additional argument to _spawnve, throughout. - (_spawnve): Make this a global function and take an hToken argument so - that it can be used by sexecve. Accommodate experimental vfork - functionality. - * winsup.h: Add initial support for per-thread vfork stuff. - * include/cygwin/version.h: Bump shared memory version number. - -Mon Jul 26 20:59:58 1999 Christopher Faylor - - * path.cc (sort_by_posix_name): Report two zero length strings as being - equal or suffer an infinite loop. - (sort_by_native_name): Ditto. - * shared.cc (shared_info::initialize): Refuse to use a different DLL's - shared memory. - * shared.h: Fix mask for child_info sanity test. - -Sun Jul 18 16:30:31 1999 Christopher Faylor - - * security.cc: Various changes from Corinna. - -Sat Jul 17 22:33:45 1999 Christopher Faylor - - * fork.cc (fork): Change DuplicateHandle slightly. - * security.cc (get_nt_attribute): Ignore error return from - set_process_privileges. - (set_nt_attribute): Ditto. - -Sat Jul 17 00:45:34 1999 Christopher Faylor - - * debug.h: Fix ForceCloseHandle1 in non-debug case. - -Fri Jul 16 23:47:31 1999 Christopher Faylor - - * sigproc.cc (proc_can_be_signalled): Accommodate different flavors of - myself. - * include/ddeml.h: Add missing struct. - * include/wingdi.h: Add missing defines. - -Fri Jul 16 23:01:30 1999 Christopher Faylor - - * Makefile.in: Attempt to cope when srcdir is a relative pathname. - * fork.cc (fork): Pass handle to parent process to fixup_after_fork. - Eliminate excess unlock_pinfos. - * hinfo.cc (hinfo::fixup_after_fork): Use inherited parent handle - rather than try to open the parent process explicitly. - * pinfo.cc (record_death): Cosmetic change. - * sigproc.cc (wait_sig): Add a debugging statement. - * winsup.h: Reflect change of argument for fixup_after_fork. - -Fri Jul 16 11:07:55 1999 Christopher Faylor - - * shared.h: Eliminate record_death_nolock. Just pass an argument to - record_death. - * pinfo.cc (record_death_nolock): Ditto. - * dcrt0.cc (__api_fatal): Use record_death with FALSE argument rather - than record_death_nolock. - * exceptions.cc (really_exit): Ditto. - * fork.cc (fork): Remove debugging statement. - -Wed Jul 14 22:08:52 1999 Christopher Faylor - - Throughout, make parent_alive a local variable. Rename 'alive_parent' - to 'my_parent_is_alive'. - * autoload.h: Improve the description of the autoload mechanism. - * dcrt0.cc: Define parent_alive here. - (dll_crt0_1): When debugging, rotect handles inherited from fork/exec. - Force signal thread to finish initializing prior to calling main. - (dll_crt0): Reorganize child_info stuff to allow common initialization. - Accept parent_alive handle from invoker and ensure that this is not - inherited by other processes. - (do_exit): Ensure that exit_state is not duplicated by a fork. - (__api_fatal): Call 'try_to_debug' directly. - * debug.cc: Increase the size of the handle list. - (threadname): Add an optional argument to control locking. - * exceptions.cc (error_start_init): Make this a "C" function. - (try_to_debug): Ditto. Also, use Sleep rather than pause and loop so - that gdb can get in to interrupt things. - (sig_handle): - * external.cc (fillout_pinfo): Reorganize slightly and plan for the - future. - * fhandler.h: Add an argument to show the name of the handle for error - messages to fork_fixup. - * fhandler.cc (fhandler_base::fork_fixup): Ditto. - (set_inheriting): Rename a variable for clarity. - (fhandler_base::fixup_after_fork): Pass in the name of the handle to - fork_fixup. - * fhandler_tty (fhandler_tty_common:fixup_after_fork): Ditto. - (fhandler_tty_slave:fixup_after_fork): Ditto. - (fhandler_tty_master:fixup_after_fork): Ditto. - * fhandler_windows.cc (fhandler_windows::fixup_after_fork): Ditto. - * fhandler_console.cc (fhandler_console::open): Specifically open - console with ENABLE_PROCESSED_INPUT. - * fork.cc (sync_with_child): Call abort when DEBUGGING and there's an - error. - (resume_child): Ditto. Also, allow an ERROR_INVALID_HANDLE error if it - can't be duplicated as they seem to occur occasionally when the parent - copies the stack. - (fork): Use init_child_info to initialize structure passed to child. - Remove start time setting in favor of common function. Don't mess with - parent's parent_alive. - * heap.cc (sbrk): Simply code slightly. - * hinfo.cc (hinfo::dup2): Improve error handling. - * pinfo.cc (set_myself): Set start time here since it is called by - everything which sets myself. - (pinfo_init): Remove start_time setting in favor of common function. - * shared.h (pinfo): Reorganize so that signal stuff falls into section - of pinfo which is automatically zeroed when a new pid is initialized. - (PROC_MAGIC): Increment to detect cygwin1.dll's memory passing - disparities. - * sigproc.cc (proc_alive): Make this a function. Wait for target pid - to initialize. - (my_parent_is_alive): Rename from alive_parent. - (proc_can_be_signalled): Renamed from proc_alive macro. - (proc_exits): Use proc_can_be_signaleed(). - (proc_subproc): Don't put parent_alive in child. - (proc_terminate): Close hwait_subproc in a race-safe way. Ditto - sync_proc_subproc. - (sigproc_terminate): Always terminate proc_subproc thread first or it - may try to use signal thread as it is going away. Wait for signal - thread to exit. - (sig_send): Use proc_can_be_signalled(). - (init_child_info): New function. Initializes memory block passed by - spawn/fork. - (mutex_stack): Add thread name field. - (sig_wait): Set active state after all handles have been set up and - before protecting the handles. Use ForceCloseHandle to close - subproc_ready as it is now protected. Close signal_mutex here. - * sigproc.h: Accommodate alive_parent rename. - * spawn.cc Use init_child_info to initilize memory block passed to - subprocess. - * strace.cc (__system_printf): Write to screen before writing to strace - log. Only write to strace log if we're actually stracing. - * winsup.h: Declare the 'action on error' functions. - * utils/Makefile.in: (Patch from Egor Duda ) Compile - strace using -mno-cygwin. - * utils/strace.cc: Allow ingw concession from Egor Duda. Attempt to - allow CTRL-C when stracing. - -Thu Jul 14 0:39:00 Corinna Vinschen - - * security.cc (alloc_sd): Delete special handling of uid/gid 513. - -Thu Jul 13 15:01:00 Corinna Vinschen - - * fhandler.cc (get_file_owner): Fix typo. - * path.cc (path_conv::path_conv) : Change `return' to `goto end' in - case of SYMLINK_IGNORE is set. - -Mon Jul 5 21:33:00 Corinna Vinschen - - * security.cc (WriteSD): Doesn't set errno if BackupWrite() - returns ERROR_INVALID_SECURITY_DESCR (which happens on FAT). - -Sat Jul 10 13:17:20 1999 Christopher Faylor - - * utils/strace.cc (error): Actually output error message. - (add_child): Duplicate inherited child process handle with all of the - privileges that we need. - -Fri Jul 9 01:37:23 1999 Geoffrey Noer - - * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 14 - in honor of snprintf and vnsprintf additions. - -Fri Jul 9 00:04:03 1999 Christopher Faylor - - * path.cc (path_conv::path_conv): Correct buffer overflow condition. - * fhandler_console.cc (fhandler_console::open): *Need* to enable - processed input or CTRL-C won't stop anything unless it's at a prompt. - (fhandler_console::input_tcsetattr): Ditto. - -Thu Jul 8 18:27:49 1999 Christopher Faylor - - * Makefile.in: Add malloc debugging options. - * dcrt0.cc (api_fatal): Call abort when debugging so that the debugger - will pop up. - * debug.cc (close_handle): Unlock in pathological case. - * fhandler_console.cc (fhandler_console::read): Always respond to - windows size changes. - (fhandler_console::open): Always set things to ~ENABLE_PROCESSED_INPUT - so that we can control INTR character. Don't set pgid here. - (fhandler_console::input_tcsetattr): Turn on windows event so that we - can see screen resizes. - (fhandler_console::init): Don't set pgid here. - * fhandler_termios (fhandler_termios::tcinit): Set pgid here. - * fhandler.h: Fix set_has_acls method return. - * utils/strace.h: Pass CTRL-Cs to child process. - -Wed Jul 7 23:59:50 1999 Christopher Faylor - - * Makefile.in: Improve dependencies. - * autoload.h: Work around "function unused" messages for autoload init - functions. - * configure.in: Use CHECK_TOOL to find CC so that it will get the - proper host alias. - * configure: Regenerate. - * dcrt0.cc (do_exit): Minor reorganization of termination function - calls. - * debug.cc (close_handle): Issue an error when an attempt is makde to - close a handle with a name different from the one used to record it - previously. - * debug.h: Implement new macros for storing arbitrary handle names. - * exceptions.cc (handle_signal): Terminate the main thread when exiting - due to signal in signal thread. - * fhandler.h: Add an extra 'fd' argument to all ready_for_read methods. - * select.cc: Ditto, throughout. - * fhandler_console (get_tty_stuff): Protect the tty_stuff handle here. - * fhandler_termios.cc (fhandler_termios::line_edit): Accommodate fd - argument to ready_for_read. - * fhandler_tty.cc (fhandler_tty_master::init): Close an unneeded thread - handle. - * fork.cc (fork): Use standard name when protecting process handle. - * spawn.cc (spawn_guts): Ditto. - * shared.cc (open_shared_file_map): Protect cygwin_shared handle here. - * sigproc.cc: Throughout, close child process handle using standard - name. - * syscalls.cc (read_handler): Check that fd is still open prior to - performing an operation. Supply fd argument for ready_for_read. - * (_read): Supply fd argument for read_for_read. - * tty.cc (tty_list::terminate): Close unneeded handles as tty is - closing down. - (tty_list::allocate): Protect against signals. - -Mon Jul 5 14:52:40 1999 Christopher Faylor - - * cygwin.din: Export new snprintf and vnsprintf functions courtesy of - Egor Duda . - -Sun Jul 4 23:54:43 1999 Christopher Faylor - - * exceptions.cc (sigbegin): New function. Called prior to dispatching - to signal handler. - (sigreturn): New function. Called after signal handler returns. - (set_process_mask): Make stdcall. - (call_handler): Remove sigwrap asm stuff in favor of new - sigbegin/sigreturn scheme. - * winsup.h: Change set_process_mask declaration. - -Sun Jul 4 22:00:14 1999 Christopher Faylor - - * syscalls.cc (stat_worker): Previous change to check for extension - found dots not in the filename part. Fix this. - -Sat Jul 3 23:22:55 1999 Christopher Faylor - - * include/wincon.h: Add some missing defines. - * environ.cc: Remove extern which is now in winsup.h. - * fhandler.cc (get_file_owner): Rename argument. Test for allow_ntsec. - (get_file_group): Ditto. - (fhandler_disk_file::fstat): Use new method inode checking. - * fhandler.h: Rename a method. - * security.cc (set_file_attribute): Take an additional argument to - determine if ntsec security setting should be used. - * dir.cc (mkdir): Pass acl info to set_file_attribute. - * syscalls.cc (chown): Ditto. - (chmod): Ditto. - * winsup.h: Define allow_ntsec here. - -Sat Jul 3 15:09:34 1999 Christopher Faylor - - * fhandler.cc (fhandler_disk_file:;fstat): Move check of disk volume to - path_conv. Use new methods for determining if file system is ACL - capable. - (fhandler_disk_file::open): Set "has acls" flag here. - * fhandler.h: Store acl information in fhandler base class. - * path.cc (path_conv): Set acl information on successful return. - * path.h: Add acl info to path_conv class. - * security.cc (get_file_attribute): Set ENOSYS if can't get extended - attributes. - * syscalls.cc (chown): Pass acl information from path_conv to - get_file_attributes. - (chmod): Ditto. - (stat_worker): Ditto. - * uinfo.cc: Make all exported functions extern "C". - * winsup.h: Add rootdir() declaration. - -Fri Jul 2 15:13:08 1999 Christopher Faylor - - * autoload.h: New file. - -Thu Jul 1 23:16:34 1999 Christopher Faylor - - * net.cc (cygwin_gethostname): Use new win32_gethostname to - disambiguate between cygwin and winsock version. - * tty.cc (creat_tty_master): Disambiguate by using cygwin_gethostname - to find the hostname. - * winsup.h: Declare cygwin_gethostname. - -Thu Jul 1 22:36:31 1999 Christopher Faylor - - Throughout, remove check for winsock initialization and indirect - references to winsock functions in favor of new dynamic DLL loading - method. - - * Makefile.in: Remove unneeded libraries. - * cygwin.din: Make gethostname == cygwin_gethostname like other network - functions. - * dcrt0.cc: Implement new "autoload" functionality for loading DLLs and - functions as they are needed. Add autoload functions for user32.dll. - (cygwin_dll_func_load): New function. - (dll_crt0): Issue a fatal error message if attempt to mix different - version DLLs is detected. - (api_fatal): Correct inexplicable use of buf + 8 when printing error - message into a buffer. - * fhandler.h: Cosmetic fixes. - * fhandler_tty.cc (fhandler_tty::close): Temporarily "if 0" out code - which sends EOF pulse to children. This should only happen when last - parent fd closes. - * heap.cc (sbrk): Implement new sbrk mechanism which returns memory to - Windows when top of heap decreases beyond a page boundary. - (getpagesize): New function. - * fork.cc (fork): Save new heap values in stuff passed to child. - * hinfo.cc (hinfo::build_fhandler): Don't do any checking on a handle - if the handle is NULL. Assume that it is a disk file. - * net.cc: Redo winsock functions to use dynamic loading scheme. - * shared.cc (shared_info::initialize): Cosmetic change. - * shared.h: Change magic number for memory block sent to child - processes. Accommodate new heap information in child_info. - * sigproc.cc (sig_dispatch_pending): Remove some memory debugging checks. - (__release_signal_mutex): Ditto. - * syscalls.cc (stat_worker): Don't attempt the .exe hack unless the - previous attempt to open the file resulted in an "ERROR_FILE_NOT_FOUND" - and the file did not already contain an extension. - * times.cc: Initialize static NO_COPY variables throughout or they will - not actually be NO_COPY. - * winsup.h: Rename heap fields in per_process to accommodate new sbrk. - Eliminate winsock stuff invalidated by dynamic loading change. - * include/winsock.h: Make this file C++ safe. - -Sun Jun 27 17:07:34 1999 Christopher Faylor - - * debug.h: Don't define MALLOC_DEBUG by default. - * fhandler.cc (fhandler_base::set_name): Always set names to NULL. Add - more slop to end of win32_path_name. - (fhandler_base::de_linearize): Set names to NULL. They'll be assigned - by the caller. - (fhandler_disk_file::get_native): Delete. - * fhandler.h: Ditto. - * hinfo.cc (hinfo::de_linearize_fd_array): Set path names after the - structure has been "delinearized". - * malloc.cc: Add debugging versions of malloc functions. - * syscalls.cc (stat_worker): Eliminate static buffer for thread safety. - -Wed Jun 23 22:53:00 Corinna Vinschen - - * fhandler.cc (fhandler_disk_file::fstat): If get_file_attribute() - signals a nonexistant acl, fstat sets default attributes now. - -Wed Jun 23 10:22:56 1999 Geoffrey Noer - - * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 13. - -Wed Jun 23 10:39:07 1999 Mumit Khan - - * cygwin.din (gamma, gammaf, lgamma, lgammaf): Export. - (j0,j0f,j1,j1f,jn,jnf): Export underscore versions as well. - -Mon Jun 21 21:34:06 1999 Christopher Faylor - - Sprinkle MALLOC_CHECK macro throughout. When turned on, this will give - a slightly better idea of where memory corruption occurs. Add slightly - modified versions of "error_start" code from Egor Duda - . - * Makefile.in: Add `utils' target. - * dcrt0.cc (do_exit): Attempt to detect loop conditions where do_exit - is called reentrantly and avoid the previously executed code in this - case. - * debug.h: Define MALLOC_CHECK macro for use with malloc debugging. - * environ.cc (environ_init): Add more slop at end of environ string - just to work around buggy programs. - (parse_options): Add error_start option to control core dumping or gdb - invocation. - * exceptions.cc (stackdump): New function. Dumps stack to stderr. - (error_start_init): New function. Initialize action on "core dumping" - error. - (handle_exceptions.cc): Use stackdump command to dump stack. Call - try_to_debug. - (set_process_mask): Must be __stdcall or compiler get's confused. - (sig_handle): Detect SIGQUIT and SIGABRT. Do a "stackdump" for these. - * fhandler.cc (get_file_owner): Add an argument to determine if - function should check for NT security. - (get_file_group): Ditto. - (fhandler_base::set_name): Don't free "fhandler_disk_dummy_name" path - names. - (rootdir): New function, pulled from the pages of syscalls.cc. - Determines the root dir of a given path. - (fhandler_disk_file::fstat): Get volume information of file in question - to determine if inodes are permanent and acls are available. This - replaces previous WinNT test. - (fhandler_base::~fhandler_base): free "fhandler_disk_dummy_name" path - names. - * fhandler.h: Change get_file_* declarations. - * fhandler_console.cc: Back out most of scroll fixes from April 17. - They caused weird scrolling behavior. - * fhandler_tty.cc (fhandler_pty_master::accept_input): Add debugging - message. - * security.cc (get_file_attribute): Add additional "check for ACL" - argument. - * path.cc (symlink_check_one): Use new argument to get_file_attribute. - * sigproc.cc (wait_subproc): Don't exit wait loop if WaitForMultipleObject - returns an error. Instead, loop for a while in case this is an expected - error. - * sigproc.h: Remove __stdcall from set_process_mask. - * spawn.cc (linebuf): Use initializers to set initial values. - (linebuf::append): Be defensive and ensure that enough space is - allocated for the new argument. - (linebuf::prepend): Ditto. - (spawn_guts): Correct logic which broke up program argument in a #! - script. - * syscalls.cc (chown): Use new argument to get_file_attribute. - (chmod): Use new argument to get_file_owner and get_file_group. - (stat_worker): Ditto. - (statfs): Break out code that determined the root directory of a given - path. Use new rootdir function instead. - * winsup.h: Reflect new get_file_attribute argument. - * include/sys/strace.h: Add "NOTALL" flag so that voluminous debugging - output can be avoided. - * utils/strace.cc: Honor NOTALL flag. Run at a higher priority. - -Mon Jun 14 18:33:08 1999 Christopher Faylor - - * syscalls.c (stat_worker): Consolidate calls to fh.fstat for both - directories and normal files. - * fhandler_tty.cc (fhandler_pty_master::close): Ensure that an "EOF - pulse" is sent to any executing child processes. - * path.cc (symlink_check_one): Check for ':\n' as well as '#!' to - determine if a file is executable. - -Mon Jun 14 16:04:00 1999 Christopher Faylor - - * fhandler_tty.cc (fhandler_pty_master::accept_input): Set read_retval - prior to performing a write to avoid a potential race condition. - * fhandler_termios.cc (fhandler_termios::line_edit): Don't set - read_retval here. It has to be set in an fhandler_tty accept_input. - * select.cc (peek_pipe): Fix typo which caused read_selected to be - tested twice rather than except_selected. - * shared.h (class tty_min): Remove read_retval from here. - (class tty) Put it here. - -Mon Jun 14 13:08:58 1999 Christopher Faylor - - * utils/Makefile.in: Consolidate and simplify. - -Mon Jun 14 12:43:32 1999 Christopher Faylor - - Throughout, remove reliance on strace_* fields in pinfo class. Use - global instead. Remove STRACE_DUMP and STRACE_CACHE logic. - * pinfo.cc (set_myself): New function. - * dcrt0.cc (dll_crt0_1): Use the new function. - * environ.cc (parse_options): Remove strace environment variable logic. - (environ_init): Ditto. - * exceptions.cc (call_handler): Remove strace mutex considerations. - * fhandler_termios (fhandler_termios::line_edit): Remove STRACE_CACHE - logic. - * localtime.cc: Define 'lint' to eliminate warnings. - * smallprint.c (__small_vsprintf): Remove text formatting of windowss - errors. This is now done in the 'strace' program. - * strace.cc: Define 'strace_active' variable to control whether strace - should be carried out. - (strace_open): Delete. - (strace_init): Delete. - (get_strace_mutex): Delete. - (release_strace_mutex): Delete. - (strace_vsprintf): Preserve last error. - (strace_write): Communicate with strace program using - OutputDebugString. - (strace_dump): Delete. - (mark): Gut. - * winsup.h: Remove a declaration. Add a new one. - * include/sys/strace.h: Modify to accommodate new strace scheme. - * utils/Makefile.in: Build strace.exe - * utils/strace.cc: New file. - -Sat Jun 12 22:22:00 1999 Corinna Vinschen - - * fhandler.cc (fhandler_disk_file::fstat): Must compute i-node numbers - via `get_namehash' for Windows 9x. - -Sat Jun 12 10:54:00 1999 Corinna Vinschen - - * fhandler.cc (fhandler_base::read): Returns correct value - if raw_read fails. - * fhandler_raw.cc: More trace output. - * fhandler_floppy.cc: Ditto. - * fhandler_tape.cc: Ditto. - -Thu Jun 10 14:01:05 1999 Christopher Faylor - - * exceptions.c (handle_exceptions): Use ".stackdump" - extension instead of ".core". - * path.cc (mount_info::read_mounts): Prescan the mount lists - for /cygdrive stuff to delete rather than attempting to - delete it in the main "add mount loop". - (mount_item::getmntent): Fix "system"/"user" determination. - * winsup.h: Use void methods in thread classes where - appropriate. - -Wed Jun 9 23:16:04 1999 Christopher Faylor - - * mkvers.sh: Issue error if can't find version information. - -1999-06-09 DJ Delorie - - * localtime.c: new file; public domain timezone handling routines. - * tz_posixrules.h: new file; POSIX default timezone data - * times.cc: comment out localtime, gmtime, replace tzset with - cygwin_tzset - * Makefile.in: add localtime.c - -Wed Jun 9 00:49:04 1999 Christopher Faylor - - * spawn.cc (spawn_guts): Correctly handle #! processing when line - ends with white space. Also correctly handle scripts that do not - begin with #!. - -Mon Jun 7 17:04:36 1999 Christopher Faylor - - * fhandler_console.cc (fhandler_console::open): Need to initialize - tc here, too. - (fhandler_console::init): Initialize tc earlier. - -Mon Jun 7 00:02:51 1999 Christopher Faylor - - * fhandler.h (fhandler_termios): Move tc initialization - into init method, etc. - (fhandler_tty_common): Ditto. - * fhandler_console.cc (fhandler_console::fhandler_console): - Move tc initialization to init method. - (fhandler_console::init): Initialize tc stuff here. - (fhandler_console::dup): Ditto. - (fhandler_console::fixup_after_fork): Ditto. - (fhandler_console::de_linearize): Ditto. - * fhandler_termios (tcinit): Rename constructor. - Accept force argument to force termios initialization. - * fhandler_tty.cc (fhandler_tty_master::init): Move tc initialization - to common_init. - (fhandler_tty_common::dup): Use tcinit () to initialize tc field. - * tty.cc (tty::common_init): Ditto. - -Sun Jun 6 22:19:09 1999 Christopher Faylor - - * tty.cc (tty_list::terminate): Add \n to output message. - (tty::init): Clear slave_opened field or we can't reopen - ttys. - -Fri Jun 4 23:58:17 1999 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::open): Reorganize - slightly to avoid a race with get_ttyp()->was_opened. - -1999-06-04 DJ Delorie - - * times.cc (totimeval): scale sub properly. - (gettimeofday): don't bias by timezone. - -Thu Jun 3 13:24:17 1999 Christopher Faylor - - * fhandler.h (fhandler_tty_common): Add two new methods. - * fhandler_tty.cc: Use new {acquire,release}_output_mutex - methods throughout for output_mutex. - (fhandler_tty_common::__acquire_output_mutex): New method. - (fhandler_tty_common::__release_output_mutex): New method. - * shared.h (get_output_mutex): Rename to open_output_mutex. - -Wed Jun 2 16:06:26 1999 Geoffrey Noer - - * utils/mkpasswd.c (main): account for long int args to printfs. - -Wed Jun 2 16:08:08 1999 Christopher Faylor - - * smallprint.c (__small_vsprintf): Conditionalize display of - textual messages under CYGWIN_TEXT_ERROR. - * ntea.cc: Remove debugging code. - -Wed Jun 2 16:04:00 1999 Corinna Vinschen - - * dcrt0.cc (dll_crt0_1): Call the functions `get_admin_sid', - `get_system_sid' and `get_world_sid' before heap initialization - to avoid heap fragmentation. - * security.cc (get_nt_attribute): Don't allocate memory - anymore. All memory is taken from stack. - (set_nt_attribute): Ditto. - (alloc_sd): Ditto. Change parameters to get a pointer to a - preallocated security descriptor and a pointer to it's length. - * shared.cc (sec_user): Don't allocate memory anymore. All - memory is taken from stack. Change parameters to receive a - pointer to a preallocated security buffer. - * shared.h: Change prototype for `sec_user' and `sec_user_nih'. - * sigproc.cc (getsem): Change call to `sec_user'. Additonally - buffer for `sec_user'. - * spawn.cc (spawn_guts): Ditto. - Change all error output in function `sec_user' and in module - `security.cc' from error text to error number output. - -Tue Jun 2 21:54:21 1999 Corinna Vinschen - - * net.cc (get_if_flags): Change the UP and RUNNING state - of disconnected RAS interfaces to true. - -Thu Jun 1 22:47:00 1999 Corinna Vinschen - - * security.cc (get_system_sid): New function to create - a SID for the well known group of local system. - (alloc_sd): New function. - (alloc_sd): Give ALL permissions to `system'. - * shared.cc (sec_user): Give ALL permissions to `system'. - (sec_user): Provide additionalparameter for a second SID. - This is used for `CreateProcessAsUser' call. - (sec_user_nih): Ditto. - * shared.h: Change prototypes for `sec_user' and - `sec_user_nih'. - * spawn.cc (spawn_guts): Now using `sec_user' in - `CreateProcessAsUser' call, if ntsec is set. - -Thu Jun 1 14:17:00 1999 Corinna Vinschen - - * utils/mkpasswd.c: Change to output native names of - well known groups `Everyone' (SID 0) and `system' (SID 18). - * utils/mkgroup.c: Ditto plus output of native name of - well known group `None' (SID 513). - -Mon May 31 22:10:57 1999 Christopher Faylor - - * path.h: Use bit mask flags in path_conv to save exec, - symlink, binary status. Use methods to access and set - these flags. - * fhandler.cc: Use methods to access path_conv flags - throughout. - * path.cc: (symlink-check_one): Accept a bitmask flags - variable to accommodate path_conv changes. - (path_conv::path_conv): Propagate path_flags from mount - table to path_conv class. Avoid walking the mount table - twice to find "binary" info. - (mount_info::conv_to_win32_path): Accept additional flags - argument. Don't add trailing slash if not required. - Fill out both paths when cygdrive. - (mount_info::cygdrive_win32_path): Change debugging output - slightly. - (mount_info::set_flags_from_win32_path): Generalize from - mount_info::binary_win32_path_p. - (mount_item::getmntent): Honor MOUNT_EXEC flag. - * shared.h: Add new method to mount_info class. - * include/sys/mount.h: Add a comment. - * utils/mount.cc: Accept -x to force a mountpoint to default - to executable permission. Rename automount stuff to cygdrive. - -Mon May 31 19:00:00 1999 Corinna Vinschen - - * environ.cc (environ_init): Set ntsec option by default - if running under NT. - * security.cc (set_nt_attribute): Delete superfluoues code. - * shared.cc (sec_user): Don't set owner in created security - descriptor. - * sigproc.cc (getsem): Use `sec_user' instead of `sec_user_nih'. - * spawn.cc (spawn_guts): Set security attribute of - `CreateProcess' to `sec_user' if ntsec is set, `sec_all_nih' - otherwise. - -Mon May 31 19:27:36 1999 Christopher Faylor - - Throughout, change "automount" to cygdrive. - Throughout, change mount flags from signed to unsigned. - - * path.cc (iscygdrive): New macro. - (normalize_posix_path): Tack a '/' on the end of constructed - path only if there isn't one there already. - (mount_info::init): Simplify slightly. - (mount_info::conv_to_win32_path): Don't search for automount - stuff in the mount table. Instead special case the cygdrive - handling so that it will always be acceptable to use /cygdrive - regardless of other mounts. - (mount_info::cygdrive_posix_path): Rename from - build_automount_mountpoint_path. Fully build a posix path - given inputs. - (mount_info::cygdrive_win32_path): New function. - (mount_info::conv_to_posix_path): Precalculate the length - of the pathbuf for multiple uses. Just use cygdrive_posix_path - to derive a /cygdrive/x/foo style path. - (mount_info::read_mounts): Don't read /cygdrive/x mounts from - the registry. Delete them. - (mount_info::from_registry): Read cygdrive info earlier for - subsequent use by other mount routines. - (mount_info::add_reg_mount): Cosmetic changes. - (mount_info::read_cygdrive_info_from_registry): Always add - trailing slash to cygdrive. Precalculate the length of the - cygdrive. - (mount_item::getmntent): Cosmetic changes. - (mount): Return EINVAL on attempt to add a mount point which - begins with the current cygdrive. - * path.h: Remove unused script_p from path_conv class. - * shared.h: Add cygdrive_length to mount_list. Add new - cygdrive_win32_path method. - * include/sys/mount.h: Use enums for MOUNT_ constants. - -1999-05-29 Keith Seitz - - * errno.cc (errmap): Map ERROR_NEGATIVE_SEEK to EINVAL. - -Fri May 28 21:43:56 1999 Christopher Faylor - - * times.cc (to_time_t): Rewrite slightly to avoid compiler - overoptimization. - -Fri May 28 21:10:33 1999 Corinna Vinschen - - * sigproc.cc (getsem): Set security attribute of process - semaphore to `sec_user_nih()', if ntsec is set, `sec_none_nih' - otherwise. - -Wed May 26 22:56:51 1999 Christopher Faylor - - Rename inuse_event and inuse_event_exists to "slave_alive" - throughout. - * shared.h: Eliminate inuse_event. Replace with a boolean. - Elminate slave_opened. - Add some function declarations used by new methods. - * fhandler_tty.cc (fhandler_pty_master::hit_eof): Use better - method for determining EOF for pty master. - (fhandler_tty_slave::open): Use method to acquire output_mutex. - Always create "inuse_event". Delete call to slave_opened. - (fhandler_tty_slave::write): Reorganize debugging output - slightly. - (fhandler_tty_master::close): Eliminate reference to inuse_event. - * tty.cc (tty_list::terminate): Eliminate call to slave_opened. - (tty_list::connect_tty): Use new exists() method to find out if - a tty exists. - (tty_list::allocate_tty): Rename argument for clarity. Use - new exists method to determine tty existence. - (tty::inuse): Delete. - (tty::init): Remove reference to inuse_event. - (tty::common_init): Ditto. - (tty::slave_opened): Delete. - * winsup.h: Move some function declarations to shared.h. - -Mon May 24 22:10:34 1999 Corinna Vinschen - - * security.cc (WriteSD): Don't set errno, if BackupWrite() - returns ERROR_NOT_SUPPORTED. - * security.cc (set_nt_attribute): Change condition for - calling LookupAccountName() with domain name again. - * shared.cc (sec_user): Ditto. - -Mon May 24 22:10:34 1999 Corinna Vinschen - - * include/winnt.h: Temporary erased definitions of QuadPart - in LARGE_INTEGER and ULARGE_INTEGER. - * security.cc (set_nt_attribute): Set standard attributes so - that reading and writing attributes for user and administrators - isn't hindered. - -Mon May 24 22:10:34 1999 Corinna Vinschen - - * security.cc (ReadSD): New function. - * security.cc (WriteSD): Ditto. - * security.cc (get_admin_sid): Moved from shared.cc. - * security.cc (set_process_privileges): Moved from syscalls.cc, - shortened, changed return typ to int. Sets errno now. - * security.cc (set_file_attributes): Return type changed to int. - * security.cc (get_file_attributes): Ditto. - * security.cc (set_nt_attributes): Ditto. Cares for setting - of S_ISVTX now. - * security.cc (get_nt_attributes): Ditto. - * syscalls.cc (rel2abssd): #if 0'ed. - * syscalls.cc (set_process_privileges): Moved to security.cc. - * syscalls.cc (chown): Rewritten. - * syscalls.cc (chmod): Change call order of the functions - set_file_attributes() and SetFileAttributesA(). - * fhandler.cc (fhandler_base::fstat): Change check for - return value of get_file_attributes(). - * ntea.cc (NTReadEA): returns TRUE now, if allow_ntea is unset. - * ntea.cc (NTWriteEA): returns TRUE now, if allow_ntea is unset. - * shared.cc (get_admin_sid): Moved to security.cc. - * path.cc (symlink_check_one): Change check for return value - of get_file_attributes(). - -Mon May 24 22:10:34 1999 Corinna Vinschen - - * security.cc (get_world_sid): Rewrite. - * security.cc (world_full_access): Delete. - * grp.cc: Use gid 0 as default gid. - * grp.cc (read_etc_group): Look for account name of world group. - * fhandler.cc (fhandler_base::open): Call `set_file_attribute' - only in case of disk file. - -Mon May 24 22:10:34 1999 Corinna Vinschen - - * security.cc (get_file_attribute): Patched incorrect test - for symlink. - * security.cc (set_file_attribute): ditto. - -Mon May 24 22:10:34 1999 Corinna Vinschen - - * security.cc: Special handling for user and/or administrators - permissions to write (extended) attributes. - -Mon May 24 22:10:34 1999 Corinna Vinschen - - * security.cc: Don't allow 513(none) as user or group. - -Mon May 24 22:10:34 1999 Corinna Vinschen - - * security.cc: new functions `set_nt_attribute()', `get_nt_attribute()' - and `set_file_attribute()' with additional parameters `uid' and `gid', - to support real NT security. - * winsup.h: Prototype for `set_file_attribute()' with four - parameters. - * dir.cc (mkdir): Calls `set_file_attribute()' now. - * syscalls.cc (chown): ditto. - * syscalls.cc (chmod): ditto, with correct uid/gid. - -Mon May 24 22:10:34 1999 Corinna Vinschen - - * shared.cc: New function `get_admin_sid()' to get a SID - of the administrators group or of administrator. - New functions `sec_user()' and `sec_user_nih()' to get - SECURITY_ATTRIBUTES with all permissions for the user and - the administtrator group. - * shared.h: Prototypes for the above new functions `sec_user()' - and `sec_user_nih()'. - * sigproc.cc (getsem): Create process semaphore with - permissions set by `sec_user()'. - -Mon May 24 20:29:29 1999 Christopher Faylor - - * fhandler_console.cc (fhandler_console::output_tcsetattr): - ONLRET was erroneously used in place of ONLCR. - (fhandler_console::read): Honor get_r_no_interrupt () so - that interrupts don't screw up tty reading. - * fhandler.h: Add some methods to fhandler_tty_master. - * fhandler_termios.cc (fhandler_termios::fhandler_termios): - ONLRET was erroneously used in place of ONLCR. - * fhandler_tty.cc (fhandler_tty_master::init): Associating - console capabilities with the tty capabilities is a bad - idea. Go back to using the console's own. - (fhandler_tty_master::fixup_after_fork): New method. - (fhandler_tty_master::de_linearize): New method. - (fhandler_tty_master::init_console): New method. - -Mon May 24 09:58:02 1999 Christopher Faylor - - * include/rapi.h: Add some more definitions. - -Sat May 22 21:45:01 1999 Mumit Khan - - * scandir.cc (scandir): Handle errno correctly. Do preallocation to - reduce realloc calls. - (alphasort): Use strcoll, not strcmp. - -Sat May 22 19:03:47 1999 Mumit Khan - - * dll_init.cc (DllList::recordDll): Forkee must reload dlopened - DLLs. Also use strcasematch, not strcmp to compare file name. - -Wed May 19 14:38:57 1999 Christopher Faylor - - * spawn.cc (linebuf::prepend): Fix possible reference to - uninitialized memory. - * winsup.h: Remove WINSUP_NO_CLASS_DEFS workaround. - * libccrt0.cc: Ditto. - * utils/cygwin.cc: Ditto. - * utils/mount.cc: Ditto. - * utils/ps.cc: Ditto. - -Sun May 16 17:22:50 1999 Christopher Faylor - - * include/winnt.h: Revert the previous reversion. The problem - with this include file was completely misdiagnosed. - -Sun May 16 16:05:07 1999 Christopher Faylor - - * sysdef/rapi.def: New definition file for RAPI.DLL. - * include/rapi.h: Preliminary RAPI declarations. - -Sun May 16 15:37:15 1999 Christopher Faylor - - * Makefile.in: Remove more obsolete code. - -Fri May 14 19:30:53 1999 Christopher Faylor - - * include/winbase.h: Change conditional to correctly refer - to UNDER_CE rather than UNICODE. - * include/winnt.h: Update MIPS and SHx CONTEXT definitions. - -Tue May 11 21:19:59 1999 Christopher Faylor - - * exceptions.cc (call_handler): Restore previously removed - 'leave' command as its absence causes programs to crash. It - should never have been deleted. - -Tue May 11 12:04:02 1999 Norbert Schulze - - * times.cc (timezone): Properly adjust for daylight savings time. - (gettimeofday): Ditto. - (localtime): Ditto. - (tzset): Ditto. - -Mon May 10 23:31:36 1999 Christopher Faylor - - * include/winnt.h: Revert to previous version. There are problems - with the previous checkin. - * fhandler_console.cc (fhandler_console::de_linearize): Add defensive - code to ensure that console handles are opened correctly. - -Sun May 9 22:31:31 1999 Christopher Faylor - - * Makefile.in: Forgot to remove a reference to the deleted targets - below. - -Fri May 7 17:28:12 1999 Christopher Faylor - - * Makefile.in: Remove obsolete code. - * exceptions.cc (set_process_mask): Make this a __stdcall. - * sigproc.h: Fix declaration of set_process_mask. - * include/winnls.h: Add new code page defines. - * include/winnt.h: Various fixes from Anders Norlander - . - -Tue May 4 22:20:05 1999 Christopher Faylor - - * include/winnt.h: Fix CONTEXT pointer typedefs. - -Mon May 3 11:32:32 1999 Mumit Khan - - * smallprint.c (__small_vsprintf): Display textual messages - for "%E" format type. - * dlfcn.cc (set_dl_error): Lose the "Win32 ". - -Sun May 2 12:22:17 1999 Mumit Khan - - * utils/Makefile.in (EXE_LDFLAGS): Provide default. - -1999-04-30 DJ Delorie - - * winsup.h (WINSUP_NO_CLASS_DEFS): if defined, don't include class - definitions (work around gcc bug) - * libccrt0.cc (WINSUP_NO_CLASS_DEFS): define - * utils/cygwin.cc (WINSUP_NO_CLASS_DEFS): define - * utils/mount.cc (WINSUP_NO_CLASS_DEFS): define - * utils/ps.cc (WINSUP_NO_CLASS_DEFS): define - -Thu Apr 29 13:55:57 1999 Mumit Khan - - * shared.h (read_mounts): Change prototype to accept a reference - to reg_key, not a copy. - * path.cc (read_mounts): Likewise. - -Thu Apr 29 11:06:37 1999 Mumit Khan - - * configure.in (EXE_LDFLAGS): Always add newlib if part of the - build tree. - * configure: Regenerate. - - * utils/Makefile.in (INCLUDES): Add newlib include directories. - (LDFLAGS): Replace this with - (ALL_LDFLAGS): this to avoid being overridden from higher level - Makefiles. - -Wed Apr 28 17:01:12 1999 Christopher Faylor - - * include/winnt.h: Add some handheld support. - * shared.cc (open_shared): Don't call OpenFileMapping with - a null name pointer. If the name is NULL it can't be opened. - -Fri Apr 23 00:28:38 1999 Christopher Faylor - - * winsup.h: Always clear memory in thread .create method or - suffer uninitialized pointers, etc. - -Wed Apr 21 03:56:54 1999 Christopher Faylor - - * fhandler_console.cc (fhandler_console::fhandler_console): - Set fork_fixup flag to ensure that shared info is duplicated. - (get_tty_stuff): Ensure that tty_stuff is initialized. - (fhandler_console::fixup_after_fork): Really force tc and - tty_stuff initialization. Close console handles or suffer - handle leak. (needs to be fixed) - (fhandler_console::de_linearize): Force tc and tty_stuff - initialization. - -Mon Apr 19 14:54:46 1999 Geoffrey Noer - - * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 12. - -Sat Apr 17 15:35:34 1999 Christopher Faylor - - * fhandler_console (fhandler_console::fixup_after_fork): Make sure - that new shared memory for console is initialized. - (fhandler_console::scroll_screen): Set region bottom correctly. - (fhandler_console::write_normal): Fix win95 problem where attribute - was propagated to scrolled region. - * include/wingdi.h: Fix GOBJENUMPROC prototype. - -Wed Apr 7 20:00:00 1999 John Fortin (fortinj@ibm.net) - - * pthread.cc (pthread_suspend): New function. - (pthread_continue): Ditto. - * include/pthread.h: added pthread_suspend and pthread_continue - prototypes. - * cygwin.din: added above functions. - * thread.h: Add 'bool suspended' to class MTitem. Prototype - __pthread_suspend __pthread_continue. - * thread.cc (__pthread_suspend): New function. - (__pthread_continue): New function. - -Sun Apr 4 23:00:00 1999 John Fortin (fortinj@ibm.net) - - * pthread.cc (pthread_join): New function. - (pthread_detach): New function. - * include/pthread.h: added pthread_join and pthread_detach prototypes. - * cygwin.din: added above functions for exports. - * thread.h: Added char joinable to MTitem class. Add void * - return_ptr to ThreadItem class to receive pointer from pthread_exit - and pthread_join. Add __pthread_join and __pthread_detach prototypes. - * thread.cc: Change thread_init_wrapper to set item->return_ptr=ret - and comment out item->used = false. Need to look at this more. - (__pthread_join): New function. - (__pthread_detach): New function. - (__pthread_exit): Implement ( was NOT_IMP ). - * thread.cc (MTinterface::FindNextUnused) : Use joinable != 'Y' as - an additional conditional. We may need to use this info in - pthread_join. - -Mon Apr 5 23:09:06 1999 Christopher Faylor - - * dcrt0.cc (do_exit): Change a variable name to minimize confusion. - * fhandler.h (fhandler_tty): Remove ttyp field in favor of get_ttyp - method. - * fhandler_tty.cc: Use get_ttyp () method to retrieve pointer to - tty device throughout. - (fhandler_tty_master::init): Point console tc at tty's tc so - that they share the same termios structure. - * select.cc (fhandler_tty_common::ready_for_read): Use get_ttyp - method. - * tty.cc (tty::common_init): Ditto. - -Mon Apr 5 00:22:30 1999 Christopher Faylor - - * fhandler_console.cc (fhandler_console::char_command): Make - setting of scrolling region cause the cursor to be placed at - the beginning of the scrolling region. - * thread.cc (__pthread_kill): Defend against item->sigs being - uninitialized. - (__pthread_sigmask): Defened against item->sigs being uninitialized. - -Wed Mar 31 22:52:18 1999 Christopher Faylor - - * dcrt0.cc (dll_crt0): Restore pointer to shared console - terminfo structure. This allows subprocesses to set - sticky console attributes. - * fhandler_console.cc (get_tty_styff): New function. Returns - pointer to shared console terminfo structure, allocating shared - memory if required. - (fhandler_console::fhandler_console): Use get_tty_stuff(). - (fhandler_console::de_linearize): Ditto. - * fork.cc (fork): Save shared console handle for export to - subprocesses. - * spawn.cc (spawn_guts): Ditto. - * shared.cc (open_shared_file_map): Rewrite to use generic - open_shared() function. - (open_shared): New function. Generic shared memory open - used by console and cygwin shared memory. - * shared.h: Define new stuff used by above. - -Wed Mar 31 01:46:23 1999 Christopher Faylor - - * fhandler.h (fhandler_tty): Set tc = ttyp. - * fhandler_tty.cc (fhandler_tty_master::init): Ditto. - (fhandler_tty_common::dup): Ditto. - * tty.cc (tty::common_init): Ditto. - -Wed Mar 31 01:43:06 1999 Christopher Faylor - - * path.cc (mount_info::conv_to_win32_path): Reorganize to - correctly handle //x syntax. - -Tue Mar 30 14:42:05 1999 Christopher Faylor - - * strace.cc (strace_vsprintf): Fix incorrect buffer reference. - -Mon Mar 29 22:46:16 1999 Christopher Faylor - - * debug.cc (__lock): Return value for gcc bug workaround. - (__unlock): Ditto. - * fhandler_tty.cc (fhandler_tty_master::init): Remove extraneous - console initialization. Set termios to sensical values before - initializing the console. - (fhandler_tty_slave): Add some debugging output. - * strace.cc: Conditionalize stuff not required by STRACE_HHMMSS. - (strace_vsprintf): Remove dependency on time() for STRACE_HHMMSS. - -Mon Mar 29 10:50:00 Corinna Vinschen - - * utils/passwd.c (GetPW): Correct cast in call to `NetUserGetInfo'. - -Sun Mar 28 16:54:57 1999 Christopher Faylor - - * fhandler.h: Remove tty_stuff field from fhandler_console - class. Use global instead to allow all console opens to - use same settings. - * fhandler_console.cc: Add new global. - (fhandler_console::tcgetattr): Use new global for initialization. - (fhandler_console::de_linearize): Ditto. - * fhandler_termios.cc (fhandler_termios::fhandler_termios): Don't - reinitialize an already initialized termios. Do not honor - CYGWIN=binmode for console output. It's too confusing. - * shared.h: Add `initialized' field to tty_min. - -Sun Mar 28 01:55:32 1999 Christopher Faylor - - * path.cc (path_prefix_p_): Add defensive code. - (slash_drive_prefix_p): Use macro to detect whether a character - is a path separator. - (mount_info::conv_to_win32_path): Rewrite to correctly handle - relative paths. - * strace.cc (strace_printf): Remove extraneous save of LastError. - * winsup.h (per_thread): Return TlsSetValue value. This seems - to work around a g++ bug. - -Thu Mar 25 13:00:00 Corinna Vinschen - - * fhandler_raw.cc (fhandler_dev_raw::dup): New method. - * fhandler_tape.cc (fhandler_dev_tape::dup(): Ditto. - * fhandler.h: Added prototypes for the formentioned methods. - -Wed Mar 24 23:00:00 Corinna Vinschen - - * fhandler_raw.cc (fhandler_dev_raw::linearize): - Only calling base class implementation now. - * fhandler_raw.cc (fhandler_dev_raw::de_linearize): - Only calling base class implementation and allocating devbuf now. - * fhandler_tape.cc (fhandler_dev_tape::linearize): Erased. - * fhandler_tape.cc (fhandler_dev_tape::de_linearize): Erased. - * fhandler_tape.cc (fhandler_dev_tape::fhandler_dev_tape): - Additional call to `set_cb()'. - * fhandler_floppy.cc (fhandler_dev_floppy::fhandler_dev_floppy): - Ditto. - * fhandler.h: Erased prototypes for linearize and de_linearize - methods of class fhandler_dev_tape. - -Thu Mar 25 14:05:57 1999 Christopher Faylor - - * signal.cc (pause): Make sure that signal has been dispatched - prior to pause returning. - -Wed Mar 24 20:04:21 1999 Christopher Faylor - - Change get_input_handle to get_io_handle throughout. - Change output_handle_ to output_handle throughout. - Use sys/termios.h only where needed. - * Makefile.in: Add new object. - * fhandler.cc (fhandler_base::puts_readahead): New function. - Adds a string to the read ahead buffer. - (fhandler_base::put_readahead): New function. Adds a character - to the read ahead buffer. - (fhandler_base::get_readahead): New function. Gets a character - from the read ahead buffer. - (fhandler_base::peek_readahead): New function. Returns character - at beginning or end of read ahead buffer. - (fhandler_base::set_readahead_valid): Augmented from fhandler.h. - (fhandler_base::eat_readahead): Eat a character from the read - ahead buffer. - (fhandler_base::de_linearize): Reset read ahead info. - (fhandler_base::read): Honor new read ahead mechanism. - (fhandler_base::fhandler_base): Don't set binmode to default - if it has already been explicitly set. - * fhandler.h: Add *BINSET flags to track whether the binary - mode has been turned on or off explicitly. - (fhandler_base): Add elements for new read ahead method. Remove - old `readahead_'. - (fhandler_termios): New base class. - (fhandler_console): Use fhandler_termios base class. - Add new de_linearize method. - (fhandler_tty_common): Rewrite to use fhandler_termios base class. - (fhandler_pty_master): Ditto. - (fhandler_tty_master): Ditto. - * fhandler_console (fhandler_console::read): Rewrite to use functions - from fhandler_termios and read ahead for line editing. - (fhandler_console::read1): Remove. - (fhandler_console::open): Interruptible I/O is now handled in the - read function. Mark this. - (fhandler_console::output_tcsetattr): Use ONLRET to control - binary behavior since it is more closely analgous. - (fhandler_console::input_tcsetattr): Don't set console flags if - there is no change or Windows 95 will eat input. - (fhandler_console::tcsetattr): Use ONLRET to control binary behavior - since it is more closely analgous. - (fhandler_console::fhandler_console): Accommodate fhandler_termios - base class. - (fhandler_console::init): Ditto. - (fhandler_console::igncr_enabled): Ditto. - (fhandler_console::char_command): Use new read ahead method. - (fhandler_console::de_linearize): New function. - * fhandler_serial.cc: Need additional include. - * fhandler_tty.cc (fhandler_tty_master::fhandler_tty_master): - Accommodate fhandler_termios base class. - (fhandler_tty_master::init): Ditto. - (fhandler_tty_master::accept_input): New function. Sends - (possibly line-edited) input to slave. - (process_input): Use line editing capabilities of fhandler_termios - base class when processing input. - (fhandler_tty_slave::open): Accommodate fhandler_termios base class. - (fhandler_tty_slave::tcgetattr): Ditto. - (fhandler_tty_slave::ioctl): Ditto. - (fhandler_pty_master::fhandler_pty_master): Ditto. - (fhandler_pty_master::read): Ditto. - (fhandler_tty_slave::dup): Be more paranoid about setting output - handle in case of error. - * fhandler_tty.h: Accommodate new tty_min base class in tty class. - * hinfo.cc (hinfo::build_fhandler): Send tty 'unit' to constructor. - * select.cc (peek_console): Send resize event to window regardless - of tty setting. Eliminate ReadFile kludge. - * shared.h (tty_min): Rename termios field to avoid conflict. - * tty.cc (create_tty_master): Send tty number to build_fhandler. - (tty::common_init): Remove termios initialization. It's handled - via fhandler_termios, now. - * fhandler_termios: New file. Contains methods for dealing with - fhandler_termios class. - -Wed Mar 24 19:22:04 1999 Christopher Faylor - - * exceptions.cc (call_handler): Reorder to work around - gcc bug. - -Sun Mar 21 21:26:43 1999 Christopher Faylor - - * fhandler_serial.cc (fhandler_serial::raw_read): Protect - against uninitialized variable. Output debug info if - ClearCommError fails. Clear overlapped I/O on error or - signal. - (fhandler_serial::tcflow): Output debug info at start of - routine. - (fhandler_serial::tcsetattr): Add more debugging output. - Avoid re-setting parameters if there has been no change. - Setting parameters via SetCommState seems to cause loss of - input on Windows 9[58]. - -Wed Mar 17 12:56:25 1999 Geoffrey Noer - - * include/winbase.h: Fix AllocateAndInitializeSid proto. - -Tue Mar 16 21:55:12 1999 Christopher Faylor - - * exceptions.cc (handle_exceptions): Always wait for sig_send - to exit or races can result. - -Tue Mar 16 13:04:34 1999 Geoffrey Noer - - * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 11. - -Tue Mar 16 15:44:10 1999 Christopher Faylor - - * cygwin.din: Export telldir/seekdir. - -Tue Mar 16 13:50:51 1999 Corinna Vinschen - - * dir.cc: Change unused struct member __d_find_first_called to - __d_position for use in new functions. - (telldir): New function. Returns current position in DIR stream. - (seekdir): New function. Seeks to new position in DIR stream. - -Mon Mar 15 19:17:23 1999 Geoffrey Noer - - * sysdef/comctl32.def: Add InitCommonControlsEx. - -Mon Mar 15 19:45:10 1999 Christopher Faylor - - * dir.cc (mkdir): Remove final slash from a directory if - appropriate or windwows won't create the directory. - * errno.cc: Change text for EAGAIN to something a little - more sensical. - * exceptions.cc (call_handler): Add a debug message. - * fhandler.cc (fhandler_base::open): Don't attempt to set - the position of a com device. - * fhandler_serial.cc (fhandler_serial::raw_read): Reset - overlapped event if not armed. Don't attempt to find out - if characters are available if vmin_. - (fhandler_serial::raw_write): Clear pending I/O when - necessary. - (fhandler_serial::open): Set comm state to current rather - than zeroing. - (fhandler_serial::tcflush): Don't use "queue" as a flag. - TCI* defines are not bit masks. - * select.cc (peek_serial): Add debugging output. - * sigproc.cc (wait_sig): Minor cleanup. - * path.cc (nofinalslash): Make global. - * winsup.h: Ditto. - -Mon Mar 15 16:31:29 1999 Geoffrey Noer - - * include/winnt.h: Add RID defs/protos from MSDN docs. - (SECURITY_*_RID, DOMAIN_*_RID*, etc.) - * include/richedit.h: Add missing SCF_* defines. - * include/commctrl.h: Add missing PBM_ defines, PBRANGE struct. - -Mon Mar 15 12:54:48 1999 Geoffrey Noer - - * Makefile.in: Don't install include/Windows32 since it doesn't - exist any more. - * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 10. - -1999-03-12 DJ Delorie - - * net.cc (gethostbyname): support a.b.c.d notation internally, - in case there's no DNS at least partial support is there. - -Thu Mar 11 21:27:41 1999 Jeff Johnston - - * cygwin.din: Added references to new fast-math routines. - -Wed Mar 10 19:22:46 1999 Geoffrey Noer - - * include/commdlg.h: Add missing PageSetupDlg defines. - -Tue Mar 9 14:28:14 1999 Geoffrey Noer - - * include/*.h: Switch Win32 API header file set to the one written - by Anders Norlander . Headers now - fit the standard Win32 API header layout and are more complete. - These correspond to Anders' headers, version 0.1.5. Please read - sysdef/README for more information. - * include/Windows32/*.h: Delete in favor of above definitions. - - Changes to support the above: - * fhandler_console.cc (fhandler_console::char_command): Add newly - needed cast to DWORD *. - * fhandler_serial.cc (fhandler_serial::raw_read): Make n, minchars - DWORDs. - * fhandler_tty.cc: Include limits.h. - (fhandler_pty_master::doecho): Second arg is now DWORD. - (fhandler_pty_master::process_input_to_sl): Make n, written DWORD. - (fhandler_pty_master::process_slave_outpu): Make n DWORD. - (fhandler_tty_slave::close): Make towrite, n DWORDs. - (fhandler_tty_slave::write): Make n DWORD. - * fhandler.h: Adjust fhandler_pty_master::doecho proto. - * hinfo.cc: Include file reordering. - * malloc.cc: Ditto. - * net.cc: Ditto. - * fhandler_tape.cc (get_ll): Need to reference .u in - LARGE_INTEGER usages. - * ntea.cc: Ditto. - * pinfo.cc: Include limits.h. - * spawn.cc: Ditto. - * uinfo.cc: Ditto. - * uname.cc (uname): sysinfo struct now has anon union. - Adjust sprintf for dwProcessorType being a long now. - * syscalls.cc: Include limits.h and lmcons.h. Throughout, - reference .u in LARGE_INTEGER usages. - (logout): Make rd a DWORD. - - * utils/mkgroup.c: Always include lmaccess.h and lmapibuf.h. - Include stdio.h. - (enum_groups): Adjust for longs in fprintfs. - (main): Ditto. - * utils/mkpasswd.c: Include lmaccess.h and lmapibuf.h. - (enum_users): Adjust for longs in fprintfs. - (main): Ditto. - (enum_local_groups): Ditto. - * utils/passwd.c: Remove many Win32 API defines now in new - Win32 headers. Include lmaccess.h, lmerr.h, lmcons.h, - lmapibuf.h. - (PrintPW): Adjust for longs in fprintfs. - -Wed Mar 3 21:14:45 1999 Christopher Faylor - - * environ.cc (environ_init): Fix off-by-one error in initial - environment allocation. - * fhandler_serial.cc (fhandler_serial::tcflush): Use different - method for flushing since serial handles are now opened for - overlapped I/O. - * select.cc (cygwin_select): Make degenerate case interruptible. - * sigproc.cc (proc_exists): Recognize all kinds of myself pointers - as "existing". - -Tue Feb 16 23:00:48 1999 Christopher Faylor - - * include/Windows32/Functions.h: Correct two #ifndefs that were - switched. - -Mon Feb 15 22:41:54 1999 Christopher Faylor - - * spawn.cc (spawn_guts): Fix incorrect arg length when - constructing new arguments for #!. - -Fri Feb 12 13:25:50 1999 Drew Moseley - - * Makefile.in (install-info): Test for file existence before installing. - -Fri Feb 12 13:17:49 1999 Corinna Vinschen - - * fhandler.cc (fhandler_disk_file::fstat): Handles directories, - returns unique i-node number. - * syscalls.cc (stat_worker): On WinNT, stat_worker calls - fhandler_disk_file::fstat for directories, too. - -1999-02-10 DJ Delorie - - * doc/doctool.c (scan_directory): check for opendir failing, - add closedir. - -Tue Feb 9 13:02:25 1999 Geoffrey Noer - - * utils/mount.cc: Add fixme. - * doc/doctool.c: Correct typo in comment. - -Mon Feb 8 17:29:58 1999 Christopher Faylor - - * include/Windows32/UnicodeFunctions.h: Fix incorrect use of - BOOL -> WINBOOL. - * Windows32/ASCIIFunctions.h: Ditto. - -Fri Feb 5 09:38:25 1999 Christopher Faylor - - * path.cc (mount_info::add_item): Ensure that drive names - are added using X: notation. - -Thu Feb 4 00:28:58 1999 Christopher Faylor - - * path.cc (path_prefix_p_): Recognize ':' as a path separator. - (mount_info::conv_to_posix_path): Detect case where a '/' has - to be added to a path being constructed. - (realpath): Ensure that the full path name is returned. - -Wed Feb 3 22:57:42 1999 Christopher Faylor - - * shared.h (mount_info): Add two separate arrays to track - reverse sorting of win32/posix paths. - * path.cc (sort_by_posix_name): New function. Sorts by - posix path. - (sort_by_native_name): Rename from sort_by_name. - (mount_info::conv_to_win32_path): Use native sort order - when iterating through mount table. - (mount_info::binary_win32_path_p): Ditto. - (mount_info::getmntent): Ditto. - (mount_info::conv_to_posix_path): Use posix sort order - when iterating through mount table. - (sort): Use two arrays to track sorting of mount table. - (mount_info::add_item): Simplify slightly. - -Wed Feb 3 15:17:54 1999 Christopher Faylor - - * cygwin.din: Remove DATA attribute which was erroneously - added to __errno. - -Tue Feb 2 23:10:18 1999 Geoffrey Noer - - * path.cc: Fix comment regarding UNC paths in mount table. - (mount_info::conv_to_win32_path): Add back code to handle - // paths for now. The plan is still to remove it again at - a later date. - (mount_info::slash_drive_to_win32_path): New. Convert a // - path to a Win32 path. Bring back from among the recently departed - path functions. - * shared.h: Add mount_info proto for slash_drive_to_win32_path. - -Tue Feb 2 22:52:43 1999 Geoffrey Noer - - * include/lmaccess.h: Add stub. - * include/shlobj.h: Add stub. - -Tue Feb 2 22:34:06 1999 Christopher Faylor - - * shared.h: Change magic number associated with fork/exec - information as a temporary measure to eliminate strange - core dumps with multiple versions of cygwin1.dll. - -1999-02-02 Brendan Kehoe - - * Makefile.in (readme.txt): Add missing -I$(srcdir)/doc. - -Tue Feb 2 01:10:31 1999 Geoffrey Noer - - * sysdef/*: Replace all files with new ones by Anders - Norlander . Please read sysdef/README - for more information. - -Mon Feb 1 14:55:11 1999 Christopher Faylor - - * path.cc (sort_by_name): Sort based on length of native_path - to ensure maximal match when converting from native -> UNIX. - * cygwin.din: Make more data variables DATA. - -Mon Feb 1 13:31:43 1999 Geoffrey Noer - - * fhandler_tape.cc: Change all fhandler_tape private functions - to be named foo_bar_baz-style instead of FooBarBaz. Add some - parens around logical ors/ands for clarity. Respace. - * fhandler.h: Change protos here in light of above. - -Thu Jan 28 11:00:00 Corinna Vinschen - - * errno.cc: Support for Windows errors ERROR_CRC and ERROR_NO_READY - and for error ENOMEDIUM. - -Wed Jan 27 01:05:39 1999 Christopher Faylor - - * dir.cc (rmdir): Correct errno setting when attempting to rmdir - a non-directory. - -Tue Jan 26 17:36:12 1999 Geoffrey Noer - - * registry.cc (reg_key::build_reg): Add FIXME. - -Tue Jan 26 01:30:48 1999 Geoffrey Noer - - * path.cc (mount_info::from_registry): Import old v1 mounts - only if current mount layout doesn't exist yet in both user - and system areas (when had_to_create_mount_areas == 2). - (mount_info::import_v1_mounts): New, was upgrade_v1_mounts. - (mount_info::from_v1_registry): Add missing comma in reg_key - creation call. - (mount_info::init): Init had_to_create_mount_areas to zero. - * external.cc (cygwin_internal): Fix reference to - upgrade_v1_mounts. - * shared.h: Change upgrade_v1_mounts proto to import_v1_mounts. - Add new had_to_create_mount_areas variable in mount_info class. - * registry.cc (reg_key::build_reg): Increment - had_to_create_mount_areas whenever we create a new mount area. - - * include/sys/mount.h: Don't define MOUNT_EXEC until we actually - implement this functionality. - - * utils/mount.cc (do_mount): Print warning messages after the - actual mount attempt so we don't see warnings when mount fails. - (usage): Change name of --upgrade-old-mounts flag to - --import-old-mounts. - (main): Ditto. - -Mon Jan 25 23:56:50 1999 Geoffrey Noer - - * errno.cc (seterrno_from_win_error): New. Given a Windows - error code, set errno accordingly. - (seterrno): Just call seterrno_from_win_error with the - error code returned by a call to GetLastError. - * winsup.h: Define __seterrno_from_win_error. - * path.cc: Clean up more function description comments. - (mount_info::add_reg_mount): Don't need res, just return the - right values. - (del_reg_mount): Return int, not void. If we're deleting a - system mount, set errno to EACCES and return -1 if we don't - have a valid key handle. If mount delete fails, set errno - accordingly and return -1. Otherwise, return zero for success. - (cygwin_umount): Delete mount from registry first, only remove - from internal table if successful. - * shared.h: Make del_reg_mount proto return int. - -Mon Jan 25 22:40:15 1999 Geoffrey Noer - - * path.cc (mount_info::mount_slash): Add mount to registry - first, only add to internal table if successful. - (mount_info::conv_to_posix_path): Ditto. - (mount): Ditto. - (mount_info::add_reg_mount): Return int, not void. If we're - writing a system mount, first check if we have a valid key handle. - If we don't, set errno to EACCES and return -1. Otherwise return - zero for success. - * shared.h: Make add_reg_mount proto return int. - -Mon Jan 25 20:40:26 1999 Geoffrey Noer - - * path.cc (mount_info::init): Don't read automount info here. - (mount_info::from_registry): Read it here instead. Also, read - system registry info in KEY_READ mode. - (mount_info::read_mounts): Read mount info with KEY_READ access - permissions. - -Mon Jan 25 19:12:31 1999 Geoffrey Noer - - * path.cc: Improve several function description comments. - (mount_info::init): Read automount information from the - registry before potentially automounting slash. - (mount_info::conv_to_posix_path): Create automount with - automount_flags flags. - (mount): Now flags is more than just a toggle so we - must check it in a different manner. And simply check - MOUNT_AUTO as the indicator. If we want to change the - automount_prefix, also change automount_flags as appropriate. - Fix args to syscall_printf. - (write_automount_info_to_registry): New. Was - write_automount_prefix_to_registry. - (read_automount_info_from_registry): New. Was - read_automount_prefix_from_registry. - * shared.h: Adjust protos for function renames just mentioned. - * include/sys/mount.h: Delete MOUNT_CHANGE_AUTOMOUNT_PREFIX - since we don't really need it. - * utils.cc (mount): Pass MOUNT_AUTO as indicator of desire to - change automount prefix. - (show_mounts): Change spacing so there's room for "system,auto" - in Type column. - -Mon Jan 25 13:17:40 1999 Geoffrey Noer - - * path.cc: Change all references from "automount root" to - "automount prefix", avoiding potential nomenclature confusion - with the root of the file system. - (read_automount_prefix_from_registry): New. Was - read_automount_root_from_registry. - (read_automount_prefix_from_registry): New. Was - read_automount_root_from_registry. Also read the default - flags for automounts from registry at the same time. - (write_automount_prefix_to_registry): New. Was - write_automount_root_to_registry. Also set automount flags - in registry using new auto_flags arg. - (mount): Add flags arg to write_automount_prefix_to_registry call. - * shared.h: Add automount_flags variable to mount_info class. - Adjust protos for function renames listed above. - - * include/sys/mount.h: Comment out MOUNT_MIXED and MOUNT_SILENT - whose values could be reused now that we're using a new mount - layout. Change MOUNT_CHANGE_AUTOROOT to - MOUNT_CHANGE_AUTOMOUNT_PREFIX. - - * utils/mount.cc (change_automount_prefix): New. Was - change_automount_root. Add new flags argument so it's possible - to change the default automount flags. - (main): Option name change from --change-automount-root to - --change-automount-prefix. - (usage): Update in light of option changes. - * utils/umount.cc (remove_all_automounts): Also need to check - for mnt_type looking like "system,auto" now that it's possible - for automounts to be located in the system registry. - -Mon Jan 25 08:59:04 1999 Christopher Faylor - - * spawn.cc (linebuf::add): Ensure that there is always - enough space for line being added. Always null terminate. - (linebuf::prepend): Ditto. - -Sat Jan 23 01:30:16 1999 Geoffrey Noer - - Make mount.exe able to upgrade mounts: - * external.cc: Fix file description. - (cygwin_internal): Handle CW_READ_V1_MOUNT_TABLES case, in - which case call upgrade_v1_mounts to upgrade old registry - area mounts. - * external.h: Add CW_READ_V1_MOUNT_TABLES to enum. - * shared.h: Make upgrade_v1_mounts public. - - * utils/mount.cc: Include winsup.h, external.h, undef errno since - it's defined by winsup.h. - (usage): Add --upgrade-old-mounts option to usage info. - (main): Handle --upgrade-old-mounts flag by calling - cygwin_internal with the right constant. - -Sat Jan 23 00:40:17 1999 Geoffrey Noer - - First pass at mount table backwards compatibility with v1 - mounts: - * path.cc (mount_info::from_registry): For now, upgrade from - old v1 mount registry area if nmounts==0 after reading new mount - areas. - (mount_info::read_v1_mounts): New function. Given a regkey, read - the mounts in the old v1 registry layout corresponding to the key. - A "which" arg tells us which registry we're reading so that we - can include MOUNT_SYSTEM when reading old system mounts. - (mount_info::from_v1_registry): New function. Retrieve old v1 - mount table area mounts. - (mount_info::upgrade_v1_mounts): New function. Retrieve old - v1 mounts, add them to the current registry mount location. - (mount_info::to_registry): New function. For every mount in - the internal mount table, add it to the correct registry. - * shared.h: Add protos for new mount_info functions -- - from_v1_registry, read_v1_mounts, upgrade_v1_mounts, to_registry. - Don't need class name in protos for - build_automount_mountpoint_path, write_automount_root_to_registry, - and read_automount_root_from_registry. - -Fri Jan 22 22:45:07 1999 Christopher Faylor - - * spawn.cc (spawn_guts): Arg 2 missing from special case - command/cmd handling. - -Fri Jan 22 22:40:32 1998 Corinna Vinschen - - * fhandler_raw.cc (fhandler_dev_raw::raw_read): bytes_to_read - corrected to multiple of 512 bytes instead of multiple to - devbufsiz. Insert break on ReadFile returned 0 Bytes. - -Fri Jan 22 15:50:49 1999 Christopher Faylor - - * mkvers.sh: Fix handling of CVS tag output. - * errno.cc: Mark exported data as __declspec(dllexport). - * times.cc: Ditto. - * fhandler.cc (fhandler_base::open): Yet another stab - at correcting handling of binmode/textmode ramifications. - * path.cc (hash_path_name): Make /. == '' for purposes - of generating a hash. - -Fri Jan 22 11:45:28 1999 Christopher Faylor - - * path.cc (slash_unc_prefix_p): Generalize to allow - either type of slash. - (mount_info::add_item): Don't disallow UNC specs in - the mount table. - * utils/Makefile.in: Always use current stub library. - -Fri Jan 22 08:52:36 1999 Christopher Faylor - - * environ.cc (regopt): Use correct registry key for Program - Options given new mount layout. - * cygwin.din: export __mb_cur_max from newlib. - -Thu Jan 21 16:52:20 1999 Geoffrey Noer - - * path.cc (cygwin_split_path): Adjust two FIXMEs. - (mount_info::write_automount_root_to_registry): Return int, - 0 on success, -1 if path is problematic. - (mount): Check return of write_automount_root_to_registry - and act appropriately. Do syscall_printf when adjusting automount - as well as regular mount. - * shared.h: mount_info::write_automount_root_to_registry now - returns an int. - * utils/mount.cc (main): don't sanity-check automount path - here, instead let the DLL take care of that. - -Thu Jan 21 17:12:26 1999 Christopher Faylor - - * spawn.cc (spawn_guts): Rewrite argument handling for - cleaner, one-pass operation. - (linebuf::add): New method for adding arguments to end - of the argument list. - (linebuf::prepend): New method for pushing arguments on - the front of the argument list. - -Wed Jan 20 19:06:30 1999 Geoffrey Noer - - * path.cc (mount_info::mount_slash): only call add_reg_mount if - add_item succeeded. - (mount_info::add_item): Fail if native path doesn't start with - : or if posix path doesn't start with a slash. - -Wed Jan 20 19:06:30 1999 Geoffrey Noer - - * fhandler_raw.cc: Correct copyright date, reformat. - * fhandler_floppy.cc: Ditto. - * fhandler_tape.cc: Ditto. - -Wed Jan 20 17:54:02 1999 Geoffrey Noer - - Remove /// support. Add support for automounts in - user registry area. - * path.cc: Rewrite, reformat docs at top in light of removing - /// support and new automount support. Add more function - description comments. - (slash_drive_prefix_p): Remove function. - (build_slash_drive_prefix): Ditto. - (slash_drive_to_win32_path): Ditto. - (mount_info::init): After everything else, read the automount_root - by calling read_automount_root_from_registry(). - (mount_info::mount_slash): Automount slash with MOUNT_AUTO. - (mount_info::conv_to_win32_path): Remove /// support code. - (mount_info::build_automount_mountpoint_path): Construct the name - of an automount POSIX path, given automount_root and the Win32 - path that needs to be automounted. - (mount_info::conv_to_posix_path): Automount missing drive letter - and call conv_to_posix_path again if path isn't covered by the - mount table but starts with ":". - (mount_info::read_automount_root_from_registry): New function. - Read in the value of automount_root from the current_user - registry mount area. If there isn't one, use default of - "/cygdrive" and write that to the registry by calling - write_automount_root_to_registry(). - (write_automount_root_to_registry): Write a value of - automount_root to the user registry area. - (mount_info::del_item): Add new flags arg to specify which - registry to delete the mount from. - (mount_info::del_reg_mount): Ditto. - (mount_item::getmntent): Use mount_info mnt_foo strings to store - strings passed back in the mntent struct. Otherwise if you - delete a mount item while using getmntent, the pointer may - change on the user. Add ",auto" to mnt_type if MOUNT_AUTO flag is - set. - (mount): Add support to set auto_root to path if flags is set - to the special MOUNT_CHANGE_AUTOROOT flag otherwise do the normal - thing. - (umount): Call cygwin_umount with flags value of 0. - (cygwin_umount): New exported function. Same as umount but - takes an additional flag argument that specifies which registry - area from which umount should remove the mount point. - * cygwin.din: Export the cygwin_umount call. - * shared.h (mount_info): Add public automount_root string. - Add public proto for write_automount_root_to_registry(). - Add private protos for build_automount_mountpoint_path() and - read_automount_root_from_registry(). Add flags arg to del_item - and del_reg_mount protos. Add strings used by getmntent et al - including mnt_type, mnt_opts, mnt_fsname, mnt_dir. (Can't just - pass back pointers to mount paths because they may change as - a result of a umount call. - - * include/sys/mount.h: Add new MOUNT_AUTO and - MOUNT_CHANGE_AUTOROOT flags. Add proto for cygwin_umount - function. - * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 9. - - * utils/mount.cc: Change missing_dir_warning flag to force - and init to FALSE instead of TRUE. Throughout swap names and - setting as appropriate. Include errno.h. - (usage): Remove info about --reset. Add info for new - --change-automount-root option. - (main): Don't check the --reset flag. Call change_automount_root - if invoked with --change-automount-root. Only call do_mount - if !mount_already_exists unless force flag is TRUE. Otherwise - fail. - (mount_already_exists): New helper function. Returns 1 - if the mount point of the same registry location is already - mounted. - (reset_mounts): Remove function. - (change_automount_root): New function that changes the - automount root in the registry via Cygwin by passing the new - path to mount() with the special MOUNT_CHANGE_AUTOROOT flag. - * utils/umount.cc: Add progname, set to argv[0]. Include string.h. - (usage): New function to print out usage info. - (main): Loop through argcs. Handle new flags to remove all mounts - of a specific type including --remove-all-mounts, - --remove-user-mounts, --remove-system-mounts, and - --remove-auto-mounts. New flag to specify removing a system - mount. Call cygwin_umount instead of umount, providing flags - as appropriate. - (remove_all_mounts): New function. Remove all mounts in - both tables. - (remove_all_automounts): Remove all mounts marked auto. - (remove_all_user_mounts): Remove all user mounts, including auto - mounts. - (remove_all_system_mounts): Remove all system mounts. - - * registry.cc (reg_key::get_string): Fix description comment. - * strace.cc: Minor reformatting. - -Wed Jan 20 17:49:20 1999 DJ Delorie - - * fhandler.cc (raw_write): Make sure that a disk full error - is properly signalled. - (fhandler_base::open): Only tapes are read/write, cd-roms may be - read-only (from Corinna). - -Wed Jan 20 10:46:48 Corinna Vinschen - - [applied by DJ Delorie ] - - * fhandler_raw.cc (fhandler_dev_raw::writebuf): Writes only - as much bytes as needed, instead of full buffer size. - - * fhandler_tape.cc (fhandler_dev_tape::close): Corrected error - handling in case of error while writing buffer content to dev. - - * fhandler_floppy.cc (fhandler_dev_floppy::close): Ditto. - - * fhandler_tape.cc (fhandler_dev_tape::writebuf): Delete function - - * fhandler_floppy.cc (fhandler_dev_floppy::writebuf): Ditto. - - Patch suggested by Ron Parker - * path.cc (mount_info::conv_to_win32_path): Change the - recognition of UNC devices, to support also paths of type - `\\.\UNC\'. - - * fhandler_tape.cc (fhandler_dev_tape::close): Fixed rewind - to block 1 instead of block 0 on rewind tapes in case of - uncaught signal (e.g. Ctrl-C). - - * path.cc (get_raw_device_number): New static function, - checks path for windows raw device. - - * path.cc (get_device_number): Change for recognition of - windows raw device paths by calling `get_raw_device_number()'. - - * path.h: Change prototype for `get_device_number()'. - - * Makefile.in: Added file 'fhandler_raw.o' to dependencies. - - * include/cygwin/rdevio.h: New file to support ioctl commands - on random access raw devices. At the time only get/set buffersize - for raw_read/raw_write. - - * fhandler.h: Change class hierarchy. 'fhandler_dev_floppy' - and 'fhandler_dev_tape' are now derived classes of - 'fhandler_dev_raw', which is derived from 'fhandler_base'. - - * fhandler_raw.cc: New file for implementation of class - 'fhandler_dev_raw' which is now base class for support of - mass storage raw devices. - - * fhandler_dev_tape.cc: Rewritten. - - * fhandler_dev_floppy.cc: Rewritten. Now supporting correct - lseek (seeking only to positions on 512 byte boundaries, - like supported from WinNT). - - * Makefile.in: Added file 'fhandler_floppy.o' to dependencies. - - * fhandler_floppy.cc: New file to support raw devices - including multi volume operations. - - * fhandler.cc: Delete 'fhandler_dev_floppy' implementation. - - * fhandler.h: Extend class fhandler_dev_floppy. - - * fhandler_tape.cc: Rewrite for correct support - of multi volume operations. Supports Setmarks now. - - * fhandler.h: Add private method `clear()' to class - fhandler_dev_tape. - - * Makefile.in: Add file 'fhandler_tape.o' to dependencies. - - * path.cc (mount_info::conv_to_win32_path): Change the - recognition of UNC devices, to support devices, which - are not partitions, too. - - * fhandler.h: Extend struct 'fhandler_dev_tape' for tape support. - Add method 'fstat' to fhandler_dev_floppy to get S_ISBLK(). - - * fhandler.cc (fhandler_base::open): In any case 'access_' has to - be GENERIC_READ | GENERIC_WRITE for tapes, to allow tape control. - No 'SetFilePointer' for tapes. - - * fhandler_tape.cc: New file to support rewind (/dev/stX) and - norewind (/dev/nstX) tapes. Supports ioctl() calls, described - in... - - * include/sys/mtio.h, include/cygwin/mtio.h: New header files - for tape support. - -Sat Jan 16 21:59:36 1999 Geoffrey Noer - - * registry.h: Delete; move contents into shared.h except for - posix_path_p() routine which disappears. - * {Makefile.in, environ.cc, net.cc, path.cc, registry.cc, - shared.cc}: No longer include registry.h. - * dcrt0.cc (dll_crt0_1): don't check posix_path_p() - - * include/mntent.h (struct mntent): Drop const from strings. - * include/sys/mount.h: Change MOUNT_GLOBAL flag that nobody has - used yet to MOUNT_SYSTEM. Add MOUNT_EXEC flag. - * include/cygwin/version.h: Bump CYGWIN_VERSION_MOUNT_REGISTRY to - 2. Change CYGWIN_INFO_CYGWIN_REGISTRY_NAME to "Cygwin". - Change CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME to "mounts v2". - - * registry.cc (reg_key::reg_key): Default key doesn't end in - "mounts" any more. - (reg_key::kill): Return error code from RegDeleteKeyA. - * path.cc: Reformat, reorder functionality, add comments - throughout. - (mount_info::init): Automount slash if it's not already mounted. - (mount_info::mount_slash): New private helper function. - (mount_info::binary_win32_path_p): Check flags to determine - if mount is binary or not, not binary_p. - (mount_info::read_mounts): Remove unneeded access argument. Use - RegEnumKeyEx to enumerate mount points in current registry - location where each key name returned is a posix_path mount - location. Use a subkey reg_key to read the posix_path's - corresponding native_path and flags. - (mount_info::from_registry): Access HKEY_LOCAL_MACHINE registry - with full access privs (which will fail if not administrator). - Fix registry path used to initialize HKEY_LOCAL_MACHINE reg_key. - (mount_info::to_registry): Delete function. Replaced by - add_reg_mount. - (mount_info::add_reg_mount): New function which adds a specified - mount point to the registry. - (mount_info::del_reg_mount): New function which deletes the - posix_path argument from the highest priority registry table it - can (first user, than system-wide). - (sort_by_name): If the two posix_paths are the same, then - differentiate between them looking at MOUNT_SYSTEM in their flags. - (mount_info::add_item): Also make sure that neither path is NULL. - Never claim mount point is busy: replace an existing posix_path - as long as it came from the same registry location. - (mount_info::del_item): Also make sure that neither path is NULL. - (mount_item::getmntent): Use mnt_type field to store user vs. - system registry location string. Cast all strings to char *. - Handle flags instead of binary_p. Change names of strings - returned in mnt_opts field. - (mount_item::init): Set flags, instead of dealing with binary_p - and silent_p. - (mount): Call add_reg_mount instead of to_registry. - (umount): Call del_reg_mount instead of to_registry. - (path_conv::path_conv): Remove reference to silent_p. - * path.h (path_conv): Remove silent_p. - - * utils/mount.cc: Add -s to usage (was a commented-out -g). - Or in MOUNT_SYSTEM if -s flag given. Add similar commented-out - support for future MOUNT_EXEC flag that will be added with -e. - (reset_mounts): Automount slash with zero for flags, not - MOUNT_SILENT which we no longer use for anything. - * utils/umount.cc: Also print out usage if the first argument - starts with a dash. - -Fri Jan 15 11:27:51 1999 DJ Delorie - - * strace.cc: add macros to protect against buffer overruns - (strace_printf): increase buffer from 6000 to 1000 to build devo - * include/sys/strace.h: allow -DNOSTRACE again - -Fri Jan 15 11:27:51 1999 DJ Delorie - - * dcrt0.cc (alloc_stack): add 16384 to work around Win95 page - fault during builds - * fork.cc (fork): try various things to avoid page faults during - win95 builds. - -Fri Jan 15 11:18:23 1999 DJ Delorie - - * fhandler.cc (raw_write): check for disk full. - -Fri Jan 15 11:18:23 1999 DJ Delorie - - * init.cc (dll_entry): if the DLL is being LoadLibrary'd, - initialize some things. - * heap.cc (_sbrk): detect uninitialized heap and initialize - * dcrt0.cc (user_data): initialize to something useful. - (do_global_ctors): make global for init.cc - -Thu Jan 14 02:16:44 1999 Geoffrey Noer - - * dll_init.cc: Add missing FIXME in comment. - * fhandler_console: Ditto. - -Thu Jan 14 00:53:25 1999 Christopher Faylor - - * spawn.cc (iscmd): New function. - (spawn_guts): Treat command /c and cmd /c as special - cases. Don't quote arguments to these programs if - there are exactly three arguments. - * dcrt0.cc (dll_crt0_1): Initialize exceptions prior - to fork to allow forked processes to "dump core". - * errno.cc (seterrno): No need for this to be extern "C". - * winsup.h: Ditto. - -Wed Jan 13 19:06:08 1999 Geoffrey Noer - - * registry.cc: Add comments corresponding to various reg_key - functions, minor reformatting. - (reg_key::reg_key): Delete already-commented-out function - -Wed Jan 13 15:41:34 1999 DJ Delorie - - * errno.cc (_sys_errlist): Add "extern" to work around new gcc - restrictions. - -Mon Jan 11 14:56:27 1999 Christopher Faylor - - * spawn.cc (spawn_guts): Fix problem with #! and relative - directories. - -Mon Jan 11 09:00:29 1999 Christopher Faylor - - * fhandler_console.cc (fhandler_console::read1): Handle EOF as a - specific case. - -Sun Jan 10 23:44:22 1999 Christopher Faylor - - * fhandler.h: Define __fmode for convenience. Use throughout. - * environ.cc (parse_options): Use O_TEXT when nobinmode. - * fhandler.cc (fhandler_base::open): Don't honor __fmode - when disk file. Default to O_TEXT if no mode is specified. - (fhandler_base::fhandler_base): Don't honor __fmode when disk - file. Otherwise default to O_BINARY. - * pipe.cc (make_pipe): Default to O_BINARY if no mode specified. - -Sat Jan 9 20:58:34 1999 Christopher Faylor - - * Makefile.in: Correct previously messed up patch. - * thread.h: Add back a needed include. - * sigproc.cc (sigproc_init): Work around problem with older - compilers. - * wait.cc (wait4): Ditto. - * winsup.h (per_thread_waitq): Ditto. - * include/Windows32/CommonFunctions.h: Temporary change to - work around problems with older compilers. - -Fri Jan 8 12:53:53 1999 Christopher Faylor - - * environ.cc (parse_options): Add "forkchunk" debug setting. - Takes a value which is used to limit the size of individual memory - copies in a fork. - * fork.cc (fork_copy): Rewrite slightly to allow copying of - individual chunks of memory rather than all in one gulp. - Controlled by chunksize global variable. - -Thu Jan 7 22:02:18 1999 Christopher Faylor - - patch from Corinna Vinschen : - * utils/passwd.c: New file. - * utils/Makefile.in: Add dependencies for passwd. - * syscalls.cc (chmod): Change permission checking in case - of readonly test. - (stat_dev): Change default permission bits to allow writing - for all users. - (chown): Retry LookupAccountName with username set to domain\\username, - if returned SID-Type is not SidTypeUser. - - -Thu Jan 7 17:50:49 1999 Christopher Faylor - - * fhandler.cc (fhandler_base::set_name): Fix bug which - disallowed '%' in a file name. - -Thu Jan 7 00:21:41 1999 Geoffrey Noer - - * path.cc: Add comments. - * path.h: Correct file description comment. - -Tue Jan 5 16:07:15 1999 Christopher Faylor - - * fhandler_serial.cc (fhandler_serial::raw_read): Be more defensive - about not calling problematic functions when the overlapped I/O is - armed. Reset the overlapped event prior to calling read or suffer - an "operation aborted". - * select.cc (peek_serial): Ditto. - -Mon Jan 4 15:16:22 1999 Geoffrey Noer - - Eliminate warnings: - * utils/mount.cc (show_mounts): make format a const char *. - * utils/ps.cc (main): make literal strings const char *s. - * utils/cygpath.cc (long_options): cast literal strings to char *s. - (main): - -Sun Jan 3 20:46:12 1999 Christopher Faylor - - * select.cc (peek_console): Remove #if 0 around NT code workaround. - -Sat Jan 2 00:04:01 1999 Christopher Faylor - - * Makefile.in: Remove include directories made obsolete by - recent changes to mmap.cc. Also remove libraries that appear - to be unnecessary for linking. - * mkvers.sh: Put contents of .snapshot-date, if available, into - the DLL. - -Fri Jan 1 22:44:49 1999 Christopher Faylor - - * fhandler.h (fhandler_serial): Add flag to track state of - overlapped serial I/O. Add overlapped_setup method for common - setup of overlapped structure. - * fhandler_serial.cc (fhandler_serial::overlapped_setup): New - method. Sets up the overlapped structure for overlapped serial I/O. - (fhandler_serial::raw_read): Use overlapped_armed flag to avoid - calling functions which perform overlapped operations if overlapped - I/O is in already progress. This should only be the case if a - previous operation was interrupted or select has detected serial I/O. - (fhandler_serial::open): Use overlapped_setup. - (fhandler_serial::fixup_after_fork): Ditto. - (fhandler_serial::de_linearize): Ditto. - (fhandler_serial::dup): Ditto. - (fhandler_serial::tcsetattr): Fix typo which caused IGNPAR - to be ignored. - * hinfo.cc (hinfo::select_read): Set saw_error to zero explicitly - to avoid spurious reporting of select errors. - (hinfo::select_write): Ditto. - (hinfo::select_except): Ditto. - * select.cc (peek_serial): Use overlapped_armed to avoid calling - functions which perform overlapped operations if overlapped I/O - is already in progress. diff --git a/winsup/cygwin/ChangeLog-2000 b/winsup/cygwin/ChangeLog-2000 deleted file mode 100644 index 54494e610..000000000 --- a/winsup/cygwin/ChangeLog-2000 +++ /dev/null @@ -1,4150 +0,0 @@ -Tue Dec 27 1:08:00 2000 Corinna Vinschen - - * cygwin.din: Add symbols for `getrlimit' and `setrlimit'. - * exceptions.cc (stackdump): Avoid creating stackdump when - `rlim_core' is 0. - * resource.cc: New global variable `rlim_core'. - (getrlimit): New function. - (setrlimit): Ditto. - include/cygwin/version.h: Bump minor API version to 32 due to - adding `getrlimit' and `setrlimit'. - include/sys/resource.h: Add defines, types and prototypes for - `getrlimit' and `setrlimit'. - -Mon Dec 25 22:18:42 2000 Christopher Faylor - - * autoload.h: Make DLL initializers global to avoid inlining. - * exceptions.cc (interrupt_setup): Reorganize arguments to allow use of - regparm. - (interrupt_now): Ditto. - (interrupt_on_return): Ditto. - (call_handler): Ditto. - -Mon Dec 25 13:36:44 2000 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor version number to 8. - -Wed Dec 20 13:37:00 2000 Corinna Vinschen - - * autoload.cc: Add load statement for SetSecurityDescriptorControl. - * security.cc (alloc_sd): Always set SE_DACL_PROTECTED flag on - Win2K and higher. - -Wed Dec 20 01:02:13 2000 Christopher Faylor - - * exceptions.cc (reset_signal_arrived): Make global to avoid inlining. - -Wed Dec 20 00:57:10 2000 Christopher Faylor - - * fhandler_serial.cc (fhandler_serial::raw_read): Always find number of - bytes ready to be read whether overlapped_armed or not. - -Tue Dec 19 21:39:00 2000 Corinna Vinschen - - * syscalls.cc (remove): New function, overriding the newlib - implementation. - -Tue Dec 19 16:26:00 2000 Corinna Vinschen - - * environ.cc (struct parse_thing): Add entry for new CYGWIN option - `smbntsec'. - * path.cc (path_conv::check): Check path for being a remote path. - If so and `allow_smbntsec' is set to FALSE, set has_acls to FALSE. - * security.cc: Add global definition for `allow_smbntsec'. - * security.h: Add extern declaration for `allow_smbntsec'. - * fhandler.cc (fhandler_disk_file::open): Eliminate extern declaration - of `allow_ntsec'. - * syscalls.cc: Ditto. - -Fri Dec 15 18:54:42 2000 Bradley A. Town - - * fhandler_console.cc (read): Add support for xterm-style mouse event - reporting. - (fhandler_console::char_command): Honor mouse events. - (fhandler_console::open): Enable mouse input events. - (fhandler_console::input_tcsetattr): Ditto. - * select.cc (peek_console): Add check for mouse events. - -Fri Dec 15 17:23:17 2000 Christopher Faylor - - * path.cc (normalize_posix_path): Calculate path name length overruns - more dynamically. - (normalize_win32_path): Ditto. - * Makefile.in: Avoid scanning the directory twice for *.d files. - -Thu Dec 14 23:37:51 2000 Christopher Faylor - - * fhandler.h (fhandler_console): Add additional argument to - char_command method. - * fhandler_console.cc (fhandler_console::read): Revert previously - misapplied patch. - (fhandler_console::char_command): Add a second argument. - (fhandler_console::write): Recognize when a '?' is found after a - [. - -Tue Dec 5 17:06:00 2000 Corinna Vinschen - - * net.cc (cygwin_rexec): Eliminate superfluous call to - `set_socket_inheritance'. - * include/sys/socket.h: Add SUS defines for option values to `shutdown'. - -Sun Dec 10 17:19:04 2000 Christopher Faylor - - * include/sysexits: New file. - -2000-12-09 Egor Duda - - * autoload.cc: Autoload CharToOemA. - * dcrt0.cc (dll_crt0_1): Translate command line to OEM if current - codepage is OEM. - * environ.cc: Add new option 'codepage' to CYGWIN environment variable. - * fhandler_clipboard.cc (fhandler_clipboard::read): Read clipboard in - OEM mode if current codepage is OEM. - * fhandler_console.cc (fhandler_console::read): Only translate console - input if current codepage is ANSI. - * fhandler_console.cc (fhandler_console::write_normal): Translate - output data if current codepage is ANSI. - * pinfo.cc (codepage_init): New function. Setup current codepage from - CYGWIN environment variable and set codepage for file APIs. - * security.cc (read_sd): Translate file name to it if current codepage - is OEM. - * winsup.h: (sys_wcstombs,sys_mbstowcs): Use current codepage for - translations between multibyte and widechar string and vice versa. - -Sat Dec 9 16:29:45 2000 Christopher Faylor - - * path.cc (normalize_win32_path): Check for explicit use of two slashes - at the beginning of a path. These should be treated specially - regardless of whether they are UNC paths or old-style //a paths. Avoid - adding cwd to a path if the path already begins with '/'. - -Fri Dec 8 22:21:01 2000 Christopher Faylor - - * path.cc (normalize_win32_path): Reorganize logic to accommodate - chroot. Always check for MAX_PATH overrun. Avoid adding one too many - backslashes when src path begins with a slash. From Corinna Vinschen. - * winsup.h: Force demangling for dll_crt0 for newer compilers. - -Thu Dec 7 12:10:00 2000 Edward M. Lee - - * cygwin.din: Declare strtok_r for the import lib. Already in the DLL. - -Wed Dec 6 15:39:18 2000 Earnie Boyd - - * include/sys/uio.h (readv): Correct prototype. - (writev): Ditto. - -Tue Dec 5 17:06:00 2000 Corinna Vinschen - - * include/sys/uio.h: Include . Use __BEGIN_DECL and - __END_DECL. - Add declarations for `readv' and `writev'. - -Mon Dec 4 20:49:00 2000 Corinna Vinschen - - * Makefile.in: Change `-nostartfiles' to `-nostdlib' to avoid - automatic linking with default libraries when linking new-cygwin1.dll. - Link with libgcc.a and libstdc++.a explicitly. - -Sun Dec 3 01:20:25 2000 Christopher Faylor - - * path.cc (normalize_win32_path): Handle UNC paths better. - (slash_unc_prefix_p): Allow backslash UNC paths. - -Sun Dec 3 00:20:25 2000 Christopher Faylor - - * Makefile.in: Remove some extra cruft. - -Sun Dec 3 00:13:26 2000 Christopher Faylor - - * Makefile.in: Use CXX to build the DLL. - * configure.in: Find correct c++ compiler. - * configure: Regenerate. - * path.cc (normalize_posix_path): Put correct drive at beginning of \foo style paths. - (chdir): Don't send non-posix path to cygcwd.set. - -Sat Dec 2 22:26:00 2000 Corinna Vinschen - - * net.cc (get_inet_addr ): Close AF_UNIX socket file after reading. - -Wed Nov 29 18:25:53 2000 Kazuhiro Fujieda - - * cygheap.cc (chgheap_root::operator =): Check root dir properly. - -Thu Nov 29 18:11:00 2000 Corinna Vinschen - - * net.cc (cygwin_inet_aton): Return nonzero if the address - is valid, zero if not according to Linux man page. - -Mon Nov 27 21:09:50 2000 Kelley Cook - - * mmap.cc (munmap): Check that mmap and munmap length match. - -Tue Nov 28 18:08:00 2000 Corinna Vinschen - - * fhandler.cc (fhandler_disk_file::open): Check for buggy CreateFile - condition. - * path.cc (path_conv::check): Get file system type in call to - GetVolumeInformation to check for file systems with buggy CreateFile. - * path.h (enum path_types): Add PATH_HASBUGGYOPEN. - (class path_conv): Add methods `has_buggy_open' and - `set_has_buggy_open'. - -Sun Nov 26 16:26:14 2000 Christopher Faylor - - * fhandler.cc (is_at_eof): New function. - (fhandler_base::raw_read): Detect special case where last error == - ERROR_NOACCESS but the file is at EOF. Most UNIXes do not consider - this to be an error. - -Sun Nov 26 14:37:29 2000 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor version number to 7. - -Sat Nov 25 11:27:00 2000 Corinna Vinschen - - * include/cygwin/version.h: Bump minor API version due to adding - inet_aton. - -Sat Nov 25 11:07:00 2000 Corinna Vinschen - - * net.cc (cygwin_inet_aton): New function. - * cygwin.din: Export cygwin_inet_aton as inet_aton. - -Sat Nov 25 01:57:42 2000 Kazuhiro Fujieda - - * path.cc (mount_info::read_cygdrive_info_from_registry): Read system - cygdrive prefix with KEY_READ. - (mount_info::get_cygdrive_info): Ditto. - -Wed Nov 22 11:18:02 2000 Christopher Faylor - - * Makefile.in: new-temp.a -> new-templib.a - -Mon Nov 20 17:04:43 2000 Christopher Faylor - - * spawn.cc (spawn_guts): Quoting was still wrong. Keep trying to - fix it. - -Mon Nov 20 14:26:38 2000 Christopher Faylor - - * spawn.cc (spawn_guts): YA tweak for dealing with arcane rules of - quoting in "normal" Microsoft programs. - * child_info.h: Bump fork magic number. - * include/sys/mount.h: Add an entry for mixed mode. - -Fri Nov 17 12:28:00 2000 Corinna Vinschen - - * path.cc (normalize_posix_path): Special care for root directory - in case of files beginning with a dot. - -Fri Nov 17 12:28:00 2000 Corinna Vinschen - - * syslog.cc (syslog): Add users SID to NT syslog entry. - -Thu Nov 16 15:59:58 2000 Bradley A. Town - - * fhandler_console.cc: New member variable `dwBufferSize' for `info'. - (fillin_info): Set `dwBufferSize' to the size of the console buffer. - (clear_screen): Use width of console buffer to calculate how many - spaces to clear. - -Thu Nov 16 15:24:45 2000 Christopher Faylor - - * Makefile.in: Make import library creation 'make -j2' friendly. - -Thu Nov 16 10:28:00 2000 Corinna Vinschen - - * uinfo.cc (uinfo_init): Call `cygwin_set_impersonation_token' to - reset `cygheap->user.token' to INVALID_HANDLE_VALUE. - -Thu Nov 16 00:18:15 2000 Christopher Faylor - - * exceptions.cc (interrupt_setup): Don't set signal mask here or races - occur with main thread. Set it in sigdelayed instead. - (sigreturn): Reflect change in stack order of ebp and flags. - (sigdelayed): Set stack frame correctly. Call set_process_mask here - with flags for last trapped signal. - (signal_dispatch): Add newmask. - * sigproc.cc (wait_sig): Eliminate ill-considered attempt to halt - looping signal processors. - * perthread.h (signal_dispatch): Add newmask field. - -Wed Nov 15 22:08:00 2000 Corinna Vinschen - - * uinfo.cc (internal_getlogin): Change parameter list to reflect - that `token' is member of cygheap_user now. - (uinfo_init): Use modified internal_getlogin. - * syscalls.cc (seteuid): Ditto. - -Wed Nov 15 21:56:00 2000 Corinna Vinschen - - * cygheap.h: Move `token' and `impersonated' from class _pinfo - to class cygheap_user. - * pinfo.h: Ditto. - * fork.cc (fork_child): Change usage of `token' and `impersonated' - accordingly. - (fork_parent): Ditto. - * security.cc (cygwin_set_impersonation_token): Ditto. - * sigproc.cc (proc_subproc): Ditto. - * spawn.cc (spawn_guts): Ditto. - * syscalls.cc (seteuid): Ditto. - * uinfo.cc (uinfo_init): Ditto. - -Wed Nov 15 9:59:00 2000 Corinna Vinschen - - * spawn.cc (spawn_guts): Revert patch to ignore chroot settings - on creating native Win32 environment. - -Wed Nov 15 01:44:37 2000 Christopher Faylor - - * fork.cc (slow_pid_reuse): Off-by-one. - -Wed Nov 15 01:20:24 2000 Christopher Faylor - - Throughout use myself->ppid_handle rather than parent_alive. - * child_info.h (child_info): Eliminate parent_alive. - * dcrt0.cc (dll_crt0_1): Call fork_init for debugging pid creation. - * fork.cc (fork_child): Reflect change to fixup_mmaps_after_fork - arguments. - (slow_pid_reuse): New function to grab last 'n' pids to prevent pid - reuse. - (fork_parent): Move last_fork_proc into slow_pid_reuse. - fork_pids debugging. Eliminate unnecessary call to set_child_mmap_ptr. - (fork_init): New debugging function. - * mmap.cc (fixup_mmaps_after_fork): Renamed from - recreate_mmaps_after_fork. Rely on copied data after a fork. - (set_child_mmap_ptr): Eliminate. - * pinfo.h (_pinfo): Eliminate parent_alive, mmap_ptr and reflect above - changes. - * spawn.cc (spawn_guts): Eliminate vestiges of "old way" of sending new - hProc to parent process. - -Wed Nov 15 0:51:00 2000 Corinna Vinschen - - * cygheap.cc (cygheap_root::cygheap_root): New function. - (cygheap_root::~cygheap_root): Ditto. - (cygheap_root::operator=): Ditto. - (cygheap_user::~cygheap_user): Ditto. - (cygheap_user::set_name): Ditto. - (cygheap_user::set_logsrv): Ditto. - (cygheap_user::set_domain): Ditto. - (cygheap_user::set_sid): Ditto. - * cygheap.h (cygheap_root): New class. - (cygheap_user): Ditto. - (init_cygheap): Change type of `root' member to cygheap_root. - Add `user' member. - * dir.cc (opendir): Use new `cygheap_root' class. - * dcrt0.cc (dll_crt0_1): Use new `cygheap_user' class. - * fork.cc (fork_parent): Ditto. - * grp.cc (getgroups): Ditto. - * passwd.cc (search_for): Ditto. - * path.cc: Use new `cygheap_root' class throughout. - * pinfo.h (_pinfo): Remove `use_psid'. Move `username', `psid', - `logsrv', `domain', `orig_{uid,gid}' and `real_{uid,gid}' to - cygheap_user class. - * security.cc: Use new `cygheap_user' class throughout. - * shared.cc (sec_user): Ditto. - * sigproc.cc (proc_subproc): Remove copy statements for user - related information moved to `cygheap_user' class. - * spawn.cc (spawn_guts): Invalidate current chroot settings - when creating Windows environment. Use new `cygheap_user' class. - * syscalls.cc: Use new `cygheap_user' class throughout. - * uinfo.cc: Ditto. - (internal_getlogin): Change parameters to reflect the - move of user information to cygheap. - -Tue Nov 14 17:05:00 2000 Eric Fifer - - * dir.cc (rewinddir): Always set __d_position = 0, so next - call to readdir() will restart the directory scan. - -Tue Nov 14 00:51:28 2000 Christopher Faylor - - * cygheap.h (init_cygheap): New struct holding values that live in the - Cygwin heap. - * child_info.h (child_info): Change pointer type of cygheap to - init_cygheap. - * cygheap.cc (init_cheap): Point cygheap_max after contents of cygheap. - Move some stuff into cygheap.h. - * dir.cc (opendir): Change to use root and rootlen in cygheap rather - than in myself. - (mkdir): Change to use umask in cygheap rather than in myself. - * path.cc: Ditto, throughout. - * syscalls.cc (_open): Ditto. Change to use umask in cygheap rather - than in myself. - (chroot): Change to allocate root dir on the cygwin heap. - (umask): Change to use umask in cygheap rather than in myself. - (cygwin_bind): Ditto. - * sigproc.cc (proc_subproc): Don't copy umask or root stuff as this - happens automatically now. - * pinfo.h (_pinfo): Migrate stuff out of here and into init_cheap. - * dcrt0.cc (dll_crt0_1): Call cygheap_init later in startup for first - cygwin process. - -Sun Nov 12 23:01:35 2000 Christopher Faylor - - * path.cc (get_device_number): Allow /dev/ttySn to designate a com - port. - -Sat Nov 11 23:55:19 2000 Christopher Faylor - - * path.h: Add __attribute__ ((regparm(x))) to commonly used functions. - * pinfo.h: Ditto. - * sigproc.h: Ditto. - * sync.h: Ditto. - -Fri Nov 10 13:48:44 2000 Bradley A. Town - - * dcrt0.cc: New global variable `ignore_case_with_glob'. - (dll_crt0_1): Disable case-insensitive globbing before calling `main'. - * environ.cc (glob_init): New static function to set or clear - `ignore_case_with_glob'. - (known): Changed "glob" entry to call `glob_init'. - * glob.c (match): Use case-insensitive globbing if needed. - -Thu Nov 9 14:30:00 2000 Corinna Vinschen - - * dir.cc (readdir): Avoid reading from the beginning when - readdir is called after a previous call has returned NULL. - -Wed Nov 8 21:00:31 2000 Christopher Faylor - - * select.cc (peek_pipe): Deal with pending newline in pty_master. - -Wed Nov 8 15:35:32 2000 Christopher Faylor - - * environ.cc (_addenv): malloc space for setenv if cygwin1.dll is used - in conjunction with older binaries. - (environ_init): Ditto. - -Wed Nov 8 08:49:27 2000 Jason Tishler - - * external.cc (get_cygdrive_info): New function. - * external.cc (get_cygdrive_prefixes): Change to use get_cygdrive_info - but toss the user and system flags. - * external.cc (cygwin_internal): Add new CW_GET_CYGDRIVE_INFO case. - * path.cc (mount_info::get_cygdrive_prefixes): Remove method. - * path.cc (mount_info::get_cygdrive_info): New method. Actually, - get_cygdrive_info is really an enhanced version of - get_cygdrive_prefixes renamed to get_cygdrive_info that also gets the - user and system flags. - * shared_info.h (get_cygdrive_prefixes): Remove method. - * shared_info.h (get_cygdrive_info): New method. - * include/cygwin/version.h: Bump minor API version due to adding - CW_GET_CYGDRIVE_INFO to cygwin_internal. - * include/sys/cygwin.h (cygwin_getinfo_types): Add - CW_GET_CYGDRIVE_INFO. - -Tue Nov 7 20:58:00 2000 Corinna Vinschen - - * autoload.cc: Add autoload statement for `WSASetLastError'. - * net.cc (cygwin_connect): Change error code to WSAEINPROGRESS - when connect returns WSAEWOULDBLOCK. - -Mon Nov 6 15:11:57 2000 Christopher Faylor - - * dcrt0.cc (sigthread::init): Reinstitute sigthread lock as a critical - section. - (dll_crt0_1): Move sigthread lock initialization to earlier in startup. - * exceptions.cc (interrupt_on_return): Remove previous kludgy attempt - to detect an invalid frame. - (call_handler): Eliminate inner for loop. Grab signal critical section - lock where appropriate. - * sigproc.cc (proc_subproc): Restore uid setting. - * sigproc.h (sigthread): Reinstitute sigthread lock as a critical - section. - (sigframe): Grab the sigthread lock before clearing frame to avoid - having the signal thread use an invalid frame. - -Mon Nov 6 11:11:42 2000 Jason Tishler - - * path.cc (mount_info::read_cygdrive_info_from_registry): Use - CYGWIN_INFO_CYGDRIVE_PREFIX, CYGWIN_INFO_CYGDRIVE_DEFAULT_PREFIX, and - CYGWIN_INFO_CYGDRIVE_FLAGS. - * path.cc (mount_info::write_cygdrive_info_to_registry): Use - CYGWIN_INFO_CYGDRIVE_PREFIX and CYGWIN_INFO_CYGDRIVE_FLAGS. - * path.cc (mount_info::remove_cygdrive_info_from_registry): Ditto. - * path.cc (mount_info::get_cygdrive_prefixes): Use - CYGWIN_INFO_CYGDRIVE_PREFIX. - * include/cygwin/version.h: Add CYGWIN_INFO_CYGDRIVE_FLAGS, - CYGWIN_INFO_CYGDRIVE_PREFIX, and CYGWIN_INFO_CYGDRIVE_DEFAULT_PREFIX. - -Mon Nov 6 11:10:44 2000 Jason Tishler - - * errno.cc (strerror): Change EAGAIN case to return "Resource - temporarily unavailable" instead of "No more processes". - -Mon Nov 6 01:04:35 2000 Christopher Faylor - - * child_info.h (child_info): Add pppid_handle for closing the parent's - parent handle. - * dcrt0.cc (_dll_crt0): Close parent's parent handle when spawned or - forked. - * debug.cc (add_handle): Correct erroneous reference to handle - structure when printing warning. - * exceptions.cc (interrupt_now): Always return 1. - (interrupt_on_return): Accept a sigthread argument. Check to see if - this argument has been trashed prior to setting up the stack return. - (call_handler): Add a loop around attempts to dispatch signals to - detect case where interrupt_on_return fails. - (_sigdelayed): Set up a temporary frame pointer prior to calling stuff - that could trigger an interrupt or the stack walking code will be very - confused. - * fork.cc (fork_parent): Move a lot of the setup of the child process - into proc_subproc. - * spawn.cc (spawn_guts): Ditto. Use ppid_handle to contact logical - parent when reparenting execed process. - * pinfo.h (_pinfo): Remember the logical handle of the parent process. - * sigproc.cc (proc_subproc): Record most stuff necessary for the _pinfo - structure that is inferrable from myself when adding children. - (wait_sig): Always set 'pending_signals' flag when about to kick off - the signal scanning loop. Reset it only if there are no pending - signals. - -Sun Nov 5 13:46:23 2000 Christopher Faylor - - * pinfo (wait_subproc): Son of neverending debug tweaking. - -Sun Nov 5 11:45:15 2000 Christopher Faylor - - * pinfo (wait_subproc): Neverending debug tweaking. - -Sun Nov 5 01:34:51 2000 Christopher Faylor - - * pinfo.cc (winpids:add): New method. - (winpids::enumNT): New method renamed from EnumProcessesNT. - Use add method to add elements to the lists. - (winpids::enum9x): New method renamed from EnumProcesses9x. - Use add method to add elements to the lists. - (winpids::enum_init): Accept 'winpid' parameter to control whether - to add all windows pids to the list. - (winpids::release): New method. - * pinfo.h (winpids): Reflect above changes. - * signal.cc (kill_pgrp): Ditto. - * external.cc (fillout_pinfo): Ditto. - -Sat Nov 4 22:07:03 2000 Christopher Faylor - - * exceptions.cc (handle_sigsuspend): Record frame here for signalling. - (set_process_mask): Ditto. - -Sat Nov 4 14:24:10 2000 Christopher Faylor - - * sigproc.cc (wait_subproc): Still more debugging cleanup. - -Sat Nov 4 00:51:38 2000 Christopher Faylor - - * pinfo.cc (EnumProcessesNT): Avoid 0 pids. - (EnumProcesses9x): Ditto. - * sigproc.cc (remove_child): Eliminate. - (proc_subproc): Move remove_child stuff here. - (wait_subproc): Synchronize with proc_subproc when error occurs. Add - more debugging info. - * sigproc.h (procstuff): Add an entry. - * spawn.cc (spawn_guts): Add sigframe here. - -Fri Nov 3 20:07:14 2000 Christopher Faylor - - * sigproc.cc (wait_subproc): Refine debug output. - -Thu Nov 2 23:01:20 2000 Christopher Faylor - - * pinfo.cc (pinfo::init): Reverse order of setting status and pid info - in an execed process to avoid a race. - * sigproc.cc (wait_subproc): Print more info when a WFSO error occurs. - * automode.c: New file. - * syscalls.cc (close_all_files): Streamline slightly. - * cygheap.cc (ccalloc): Clear *entire* allocated array. - -Thu Nov 2 01:58:03 2000 Christopher Faylor - - * ntdll.h: Remove IO_COUNTERS definition since it is now in winnt.h. - -Thu Nov 2 00:10:23 2000 Christopher Faylor - - * pinfo.cc (EnumProcessesNT): New function. Eliminates dependence on - psapi.h. - (EnumProcesses9x): Rename from EnumProcessesW95. Change arguments to - be more useful for cygwin. - (winpids::init): Accommodate argument changes. - (enum_init): Ditto. - * pinfo.h (winpids): Make pidlist dynamically extendable by storing it - as a pointer and remembering the size. - * ntdll.h: Add extra definitions needed for EnumProcessesNT. Reformat - via 'indent'. - -Wed Nov 1 21:08:23 2000 Christopher Faylor - - * exceptions.cc (interruptible): Remove obsolete tests. - (sigreturn): Construct pseudo-frame-pointer so that signal handler can - figure out where to put return address when signals are coming in - quickly. - * path.cc (cwdstuff::get): Allow length 0 buffer length when buffer - when NULL. - -Tue Oct 31 18:12:56 2000 Christopher Faylor - - * path.h (has_exec_chars): Standard function for checking for - executable magic numbers. - * path.cc (symlink_info::check): Use the above function. - * fhandler.cc (fhandler_disk_file::open): Ditto. - -Tue Oct 31 17:57:52 2000 Christopher Faylor - - * path.cc (_readlink): Return ENOENT when file does not exist. - -Tue Oct 31 23:35:00 2000 Corinna Vinschen - - * fhandler.h (fhandler_dev_raw): Add method `fixup_after_exec'. - -Tue Oct 31 22:39:00 2000 Corinna Vinschen - - * fhandler.h (fhandler_dev_raw): Add definition for method - `fixup_after_fork'. - * fhandler_raw.cc (fhandler_dev_raw::fhandler_dev_raw): Add - `set_need_fixup_after_fork' call. - (fhandler_dev_raw::~fhandler_dev_raw): Revert to user space - allocation. - (fhandler_dev_raw::open): Ditto. - (fhandler_dev_raw::dup): Ditto. Reset buffer pointer. - (fhandler_dev_raw::fixup_after_fork): New function. - * fhandler_tape.cc (fhandler_dev_tape::open): Revert to user space - memory allocation. - (fhandler_dev_tape::ioctl): Ditto. Change behaviour on MTSETBLK when - new size is 1. - -Tue Oct 31 20:56:00 2000 Corinna Vinschen - - * fhandler_tape.cc (fhandler_dev_tape::open): Fix memory allocation. - Use Cygwin heap instead of user heap. - (fhandler_dev_tape::ioctl): Ditto. - -Tue Oct 31 12:00:06 2000 Christopher Faylor - - * pinfo.cc (enum_init): Don't suffer silently if we can't load the - process enumerators. - -Mon Oct 30 16:54:26 2000 Christopher Faylor - - * signal.cc (kill_pgrp): Revert 25-Oct change. - (kill_worker): Ditto. - -Sun Oct 29 20:52:31 2000 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor version number to 6. - -Sat Oct 28 01:39:53 2000 Christopher Faylor - - * configure.in: Eliminate subdir stuff. - * configure: Regenerate. - * include/getopt.h (option): Make name field 'const'. - -Fri Oct 27 20:51:00 2000 Corinna Vinschen - - * autoload.cc: New file keeping all autoload stuff. - * Makefile.in: Add autoload.o to dependencies. - * dcrt0.cc: Move all autoload stuff to autoload.cc. - * fhandler_mem.cc: Ditto. - * net.cc: Ditto. - * uinfo.cc: Ditto. - -Fri Oct 27 11:37:20 2000 Christopher Faylor - - * sigproc.cc (wait_sig): Add braces to avoid confusion. - -Fri Oct 27 11:48:00 2000 Corinna Vinschen - - * fhandler_socket.cc: New file. - * Makefile.in: Add fhandler_socket.o to dependencies. - * fhandler.h: Change comment. - * net.cc Move all fhandler_socket methods to fhandler_socket.cc. - * winsup.h: Add declaration for `ws2_32_handle'. - -Thu Oct 26 11:51:59 2000 Corinna Vinschen - - * dtable.cc (dtable::release): Check for socket. Change - cnt_need_fixup_before accordingly. - (dtable::dup2): Ditto. - (dtable::fixup_before_fork): New method. - (dtable::fixup_before_exec): Ditto. - * dtable.h (class dtable): Add member `cnt_need_fixup_before'. Add - definition for methods `dec_need_fixup_before', `inc_need_fixup_before', - `need_fixup_before', `fixup_before_exec' and `fixup_before_fork'. - * fhandler.h (class fhandler_base): Slight rearrangements. Add - definitions for methods `fixup_before_fork_exec'. - (class fhandler_socket): Eliminate superfluous constructor. - Add member `prot_info_ptr'. Add destructor. Add definitions for - methods `dup', `fixup_before_fork_exec', `fixup_after_fork' and - `fixup_after_exec'. - * fork.cc (fork_parent): Care for file types which need a fixup - before fork. Start child in suspended state then. - * net.cc: New global variable `ws2_32_handle' and `wsadata'. - (fdsock): Check for Winsock version. Call `set_socket_inheritance' - only if Winsock version < 2.0. Care for `need_fixup' count in fdtab. - (cygwin_socket): Eliminate call to `set_socket_inheritance'. - (cygwin_accept): Ditto. - (cygwin_rcmd): Ditto. - (cygwin_rresvport): Ditto. - (cygwin_rexec): Ditto. - (socketpair): Ditto. - (fhandler_socket::fhandler_socket): Set `need_fork_fixup'. Allocate - space for the WSAPROTOCOL_INFOA struct used in fixup. - (fhandler_socket::~fhandler_socket): New destructor. - (fhandler_socket::fixup_before_fork_exec): New method. - (fhandler_socket::fixup_after_fork): Ditto. - (fhandler_socket::dup): Ditto. - (wsock_init): New static function. - (LoadDLLinitfunc (wsock32)): Rearranged. - (LoadDLLinitfunc (ws2_32)): New function. - (dummy_autoload): Add autoload statemants for `WSADuplicateSocketA' - and `WSASocketA'. - * spawn.cc (spawn_guts): Care for file types which need a fixup - before exec. Start child in suspended state then. - -Wed Oct 25 20:49:59 2000 Christopher Faylor - - * signal.cc (kill_pgrp): Don't limit sending of signals to stopped - processes when sig < 0. - (kill_worker): Only send SIGCONT to stopped processes when sendSIGCONT. - -Wed Oct 25 13:56:39 2000 Christopher Faylor - - * exceptions.cc (sig_handle): Just make sure that wait_sig loops when - receiving a SIGCONT. Don't block waiting for completion that will - never occur. - -Wed Oct 25 09:59:14 2000 Christopher Faylor - - * dtable.cc (dtable::fixup_after_exec): Use variable rather than - constantly indexing into fds array. - (dtable::fixup_after_fork): Ditto. - -Wed Oct 25 10:43:00 2000 Corinna Vinschen - - * fhandler.cc (fhandler_base::fcntl): Treat O_NONBLOCK and OLD_O_NDELAY - as exactly the same. If one is set, both are set. - * net.cc (fhandler_socket::fcntl): Ditto. - -Tue Oct 24 23:58:35 2000 Christopher Faylor - - * dcrt0.cc (do_exit): Remove debugging statement. - -Tue Oct 24 23:45:09 2000 Christopher Faylor - - * dcrt0.cc (do_exit): Don't bother looking for pgrp children to send - SIGHUP if process has never created any children. - * fork.cc (fork): Set flag indicating that there is another process - with our process group. - * spawn.cc (spawn_guts): Ditto. - * pinfo.h (set_has_pgid_children): New methods for setting when process - has children in its process group. - * syscalls.cc (setpgid): Clear has_gid_children if pgid changes. - -Tue Oct 24 20:38:00 2000 Corinna Vinschen - - * ntdll.h: New file. - * fhandler_mem.cc: Move ntdll.dll specific definitions and - declarations to ntdll.h. - * sysconf.cc (sysconf): Add support for _SC_NPROCESSORS_CONF, - _SC_NPROCESSORS_ONLN, _SC_PHYS_PAGES and _SC_AVPHYS_PAGES. - -Tue Oct 24 20:00:00 2000 Corinna Vinschen - - * fhandler.cc (fhandler_base::fcntl): Behave properly when passed - previous version of O_NDELAY. - * syscalls.cc: Move OLD_O_NDELAY to winsup.h. - * winsup.h: Define OLD_O_NDELAY now. - -Mon Oct 23 21:47:55 2000 Christopher Faylor - - * exceptions.cc (signal_exit): Kill any executing child process if - we're dying. - * path.h: Remove unneeded extern. - * spawn.cc (std_suffixes): Make static. Don't set dwProcessId here - since it makes the process unsignalable. Set strace flag that this is - an execed process stub. - * strace.cc (strace::vsprntf): Use strace flag to indicate when to - visually flag that this is an exec stub. - * include/sys/strace.h (strace): Add 'execing' flag. - -Mon Oct 23 16:43:33 2000 Christopher Faylor - - * sigproc.cc (proc_subproc): Don't send a false positive if WNOHANG and - no processes are available for waiting. - -Mon Oct 23 22:27:00 2000 Corinna Vinschen - - * fhandler.cc (fhandler_base::fcntl): Setting flags in F_SETFL - branch according to Linux documentation. - -Mon Oct 23 21:43:00 2000 Corinna Vinschen - - * fcntl.cc (_fcntl): Rearrange as wrapper function. Move all - functionality except F_DUPFD to fhandler classes. - * fhandler.cc (fhandler_base::fcntl): New method. - * net.cc (fhandler_socket::fcntl): Ditto. - * fhandler.h (class fhandler_base): Add method prototype for fcntl(). - (class fhandler_socket): Ditto. - -Mon Oct 23 12:44:35 2000 Christopher Faylor - - * sigproc.cc (proc_subproc): Correctly handle flags for WNOHANG case. - -Mon Oct 23 10:00:00 2000 Corinna Vinschen - - * security.cc: Eliminate C++ comments throughout. - -Sun Oct 22 23:33:00 2000 Christopher Faylor - - * fork.cc (fork): Set sigframe here, since it can pause for a - considerable amount of time. - * environ.cc (_addenv): Add debugging. - * fhandler.cc: Eliminate unneeded include. - * smallprint.c: Ditto. - -Sun Oct 22 12:07:00 2000 Corinna Vinschen - - * pinfo.cc (pinfo_init): Eliminate call to `set_process_privileges'. - * security.cc (write_sd): Call `set_process_privileges' on the first - call to `write_sd'. - (set_process_privileges): Eliminate adjusting SE_BACKUP_NAME privilege. - -Sat Oct 21 16:57:23 2000 Christopher Faylor - - * pinfo.cc (pinfo::init): Make PID_EXECED signal creation as well as - PID_IN_USE. - -Sat Oct 21 01:52:54 2000 Christopher Faylor - - * spawn.cc (spawn_guts): Don't do the reparenting step if we notice - that the child has exited prior to sending the subprocess_ready signal - (?). - -Sat Oct 21 00:46:36 2000 Christopher Faylor - - * fhandler.h (fhandler_console): Remove tcsetpgrp. - * fhandler_console.cc (fhandler_console::tcsetpgrp): Eliminate. - * fork.cc (fork_parent): Avoid returning same pid twice in a row - regardless of OS. - * pinfo.cc (pinfo::init): Rename create argument to flags and treat it - as such. - * signal.cc (set_sigcatchers): New function. - (signal): Use set_sigcatchers to increment or decrement sigcatcher - tracker. - (sigaction): Ditto. Add debugging output. - * spawn.cc (spawn_guts): Always quote first argv[0] argument when it's - a COMSPEC shell. - -2000-10-20 DJ Delorie - - * times.cc (to_time_t): pass zero time as epoch - * fhandler.cc (fstat): copy atime/ctime from mtime if they're zero - -Thu Oct 19 23:31:41 2000 Christopher Faylor - - * external.cc (fillout_pinfo): Pass PID_NOREDIR flag to pinfo init to - avoid finding execed processes twice. - * signal.cc (kill_pgrp): Ditto. - * spawn.cc (spawn_guts): Avoid passing first argument to CreateProcess - when running a windows shell so that CreateProcess will locate the - shell. Reorganize so that correct error is returned when CreateProcess - fails. - -Thu Oct 19 13:55:31 2000 Christopher Faylor - - * dcrt0.cc (sigthread::init): Correct overzealous ifdef. - * exceptions.cc (call_handler): Avoid calling sigthread acquire lock. - * sigproc.h (sigthread): Comment out lock for now. - * sync.cc (muto::acquire): Add a minor optimization. - -2000-10-18 DJ Delorie - - * Makefile.in: add miscfuncs.cc - * miscfuncs.cc: new, miscellaneous functions - * winsup.h: define table-driven tolower/toupper - * environ.cc: use them - * fhandler_console.cc: ditto - * fhandler_termios: ditto - * path.cc: ditto - (strncasematch, strcasematch, strcasestr): move to miscfuncs.cc - -Wed Oct 18 20:50:27 2000 Christopher Faylor - - * sigproc.h (sigthread): Eliminate locking for now since per thread - signalling is not available. - * dcrt0.cc (sigthread::init): Ditto. - (dll_crt0_1): Move set_process_privileges call (temporarily?) to - pinfo_init. - (pinfo_init): Only call set_process_privileges when allow_ntsec. - -2000-10-18 DJ Delorie - - * dcrt0.cc (dll_crt0_1): init cygcwd before forkee branch - - * environ.cc (conv_start_chars): Cache a table of "first - characters" for environment variables needing conversion. - (getwinenv): Use it. - (environ_init): Create it, also check first chars for TERM and - CYGWIN. - - * path.cc: Use lookup table for case insensitive comparisons. - -Wed Oct 18 00:48:49 2000 Christopher Faylor - - * exceptions.cc (call_handler): Make signal pending if sigsave.sig is - still active. - * syscalls.cc (_read): Don't clear errno. - * sigproc.cc (wait_sig): Don't scan the waiting process list after a - SIGCHLD if there are no zombies to reap. - * winsup.h: Use __builtin_strcmp. - * environ.cc (posify): Don't initialize len unless it is required - (from DJ Delorie ). - -Tue Oct 17 14:50:31 2000 Christopher Faylor - - * sigproc.cc (proc_subproc): Remove unneeded test for correct process - in PROC_ADDCHILD. Return 0 when terminated child has just been - reparented. - (wait_subproc): Only send SIGCHLD when proc_subproc returns != 0. - * strace.cc (strace::vsprntf): Only strip .exe extension from program - name. - -2000-10-16 Charles Wilson - - * fhandler_clipboard.cc: new file - * Makefile.in: include fhandler_clipboard.o in DLL_OFILES list. - * fhandler.h: add FH_CLIPBOARD to the devices enum. - (fhandler_dev_clipboard): new - * path.cc (windows_device_names): add "\\dev\\clipboard" - (get_device_number): check for "clipboard" - * dcrt0.cc: declare a few more functions from winuser.h - * dtable.cc (dtable::build_fhandler): check for FH_CLIPBOARD in - switch(). - -Mon Oct 16 21:36:57 2000 Christopher Faylor - - * debug.cc (add_handle): Issue warning on attempts to add the same - handle more than once. - * fhandler_tty.cc (fhandler_tty_slave::open): Protect some handles. - (fhandler_tty_common::close): Use proper name when closing handles. - (fhandler_pty_master::close): Don't close to_slave or from_slave since - they've already been closed earlier in the function. - * sigproc.cc (proc_subproc): Don't protect vchild->hProcess. Expect - that the caller will do this, instead. - * tty.cc (tty_list::terminate): Use proper name when closing handles. - (tty::make_pipes): Protect some handles. - -Mon Oct 16 18:37:22 2000 Christopher Faylor - - * Makefile.in: Remove some obsolete stuff. - * dcrt0.cc (dll_crt0_1): Call signal_fixup_after_exec where appropriate. - Set myself->uid from parent version. - Just use ThreadItem Init method. Close or store hexec_proc as appropriate. - (_dll_crt0): Store user_data->forkee here so that proper tests can be made - subsequently. - (do_exit): Remove hExeced stuff. - * environ.cc (environ_init): Accept environ count as well as environ pointer. - * environ.h: Reflect above change. - * pinfo.cc (pinfo_init): Ditto. Accept environ count. - (fixup_in_spawned_child): Remove. - * spawn.cc (spawn_guts): Move signal code to dll_crt0_1. Don't suspend - execing process since it is no longer necessary. Store envc. - * exceptions.cc (signal_fixup_after_exec): New function. - (call_handler): Remove hExeced test. - * child_info.h (cygheap_exec_info): Store envc as well as envp. - (child_info_spawn): Store hexec_proc so that it can be closed in child. - * path.cc (normalize_posix_path): Avoid intermediate use of temporary cwd buf. - (normalize_win32_path): Ditto. - (cwdstuff::get_initial): Always set lock. - * sigproc.h: Remove hExeced. - * strace.cc (strace::vsprntf): Modify to accommodate for lack of hExeced. - * thread.cc (MTinterface::Init): Merge Init1 and ClearReent into this method. - (MTinterface::Init1): Eliminate. - (MTinterface::ClearReent): Eliminate. - * thread.h: Reflect above changes. - * include/sys/strace.h (strace): Make microseconds() public. - -Sun Oct 15 21:54:52 2000 Christopher Faylor - - Make various functions 'regparm', throughout. - * pinfo.h (_pinfo): Inline simple signal manipulation functions. - Requires inclusion of thread.h which was removed from .cc files, where - appropriate. throughout. - * pinfo.cc: Eliminate signal manipulation functions. - (_pinfo::exit): Calculate total rusage for exiting process here. - * cygheap.cc (size2bucket): Eliminate. - (init_buckets): Ditto. - (_cmalloc): Calculate size and bits in a loop rather than going through - a function call. - (_crealloc): Use stored array index to calculate allocated size. - * spawn.cc (spawn_guts): Use _pinfo exit method to exit, calculating - cpu usage. - -Sat Oct 14 21:24:16 2000 Christopher Faylor - - * exceptions.cc (set_console_handler): Don't allocate - console_handler_thread_waiter. It is obsolete. - (ctrl_c_handler): Don't use console_handler_thread_waiter. - * path.cc (hash_path_name): Fix handling of relative names. Make case - insensitive. - * path.h (suffix_info): Use initializers. - * pinfo.h (_pinfo): Avoid initializers for null case. - * resource.cc (fill_rusage): Zero rest of rusage structure. - * security.cc (set_process_privileges): Don't reopen parent process. - Just use hMainProc. - * signal.cc (signal): Track when a signal handler has been used. - (sigaction): Ditto. - * sigproc.cc (pchildren): Use default initializer. - (zombies): Ditto. - (sigproc_terminate): Avoid closing handles that will be closed on exit - anyway. - (wait_sig): Send signal to "parent" on EXECing, not FORKing. - (wait_subproc): Send SIGCHLD here rather than in proc_wait to avoid - potential muto conflicts. - * sigproc.h (sigthread): Don't initialize to zero. It's the default. - * spawn.cc (spawn_guts): Fill in resources from exec parent prior to - termination. - * sync.h (muto): Don't initialize to zero. - * syscalls.cc (close_all_files): Use one lock around entire loop and - call fhandler close/release stuff directly. - (_read): Don't use ready_for_read if there are not signal handlers - active. - -Sat Oct 14 12:24:24 2000 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Fix display of "title". - (do_exit): Use pinfo exit method to exit. - (__api_fatal): Ditto. - * exceptions.cc (signal_exit): Ditto. - * fork.cc (fork_child): Remove debugging stuff. Use pinfo_fixup_after - fork in place of exec_fixup_after_fork. - * pinfo.cc (pinfo_fixup_after_fork): New method. - (pinfo_fixup_in_spawned_child): Ditto. - (_pinfo::exit): New method. - (_pinfo::init): Remove recursion. Detect pathological case where pinfo - structure already exists for new pid. - * pinfo.h (_pinfo): Reorganize slightly. Add new method and new - function declarations. - * sigproc.cc (proc_exists): Previous simplification was a little to - simple. Try harder to detect if a process exists. - (proc_terminate): Use PID_EXITED setting to determine if process is - still around. - (WFSO): Remove debugging statement. - (WFMO): Ditto. - * spawn.cc (exec_fixup_after_fork): Eliminate. - (spawn_guts): Always set old_title to NULL. Is it really needed? Move - hexec_proc to pinfo.cc. Call pinfo_fixup_in_spawned_child to eliminate - handle link after a spawn. - * include/sys/cygwin.h: Remove PID_NOT_IN_USE. Add PID_EXITED. - -Sat Oct 14 10:54:00 2000 Corinna Vinschen - - * cygwin.din: Add symbol hstrerror. - * net.cc: Change meaning of member `s' of struct host_errmap. - (set_host_errno): Fix error in loop condition. - (hstrerror): Ditto. - (herror): Add appropriate functionality. - * include/netdb.h: Add declaration of hstrerror. - * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 29. - -Sat Oct 14 01:45:25 2000 Christopher Faylor - - * cygheap.cc (cygheap_fixup_in_child): Don't page round cygheap copied - from parent. - * dcrt0.cc (do_exit): Don't cleanup pinfo on exit. That happens - automatically now. - * exceptions.cc (signal_exit): Ditto. - * fork.cc (fork_parent): Use stack_here value passed in from fork(). - (fork): Figure out top of stack here and pass it to fork_parent. - * pinfo.cc (_pinfo::record_death): Eliminate. - * pinfo.h (_pinfo): Ditto. - * sigproc.cc (proc_exists): Simplify. - (proc_terminate): Ditto. - (remove_zombie): Don't cleanup pinfo stuff. - (wait_sig): Send subproc_ready signal whether execed or spawned. - * spawn.cc (spawn_guts): Always create subproc_ready event. Use it for - both exec and spawn. - (_spawnve): Send proper mode to spawn_guts when mode != _P_OVERLAY. - -Thu Oct 12 23:11:05 2000 Christopher Faylor - - * dtable.cc (dtable::fixup_after_fork): Revert thinko below. - * pinfo.cc (set_myself): Show pid in initial strace line. - -Thu Oct 12 17:58:03 2000 Christopher Faylor - - * child_info: Bump child_info "version". - (child_info): Move some fields from child_info_spawn to here. - * cygheap.cc: Make cygheap pointers NOCOPY. - * dcrt0.cc (dll_crt0_1): Copy cygwin heap here regardless of whether - we've been forked or execed. - * dtable.cc (dtable::fixup_after_fork): Just release close-on-exec fds. - * exceptions.cc (stackdump): Respond to C warning. - * fork.cc: Reorganize to minimize stack copying. - (fork_child): New function. - (fork_parent): Ditto. - (sync_with_child): Don't suspend the forkee. - (sync_with_parent): Ditto. Make into a function. - * heap.cc (heap_init): Add some debugging output. - * path.cc (path_conv::check): Add an assertion. - (has_suffix): Ditto. - * security.cc (get_pw_sid): Defend against NULL. - * sigproc.cc (proc_subproc): Fix debugging output. - (wait_sig): Ditto. - * strace.cc: Make statics NO_COPY throughout. - (strace::vsprntf): Defend against NULL. - -Thu Oct 12 00:25:29 2000 Christopher Faylor - - * errno.cc (seterrno_from_win_error): Fix debugging output. - * fhandler.cc (fhandler_base::fstat): Move to inline method in - fhandler.h. - (fhandler_base::set_io_handle): Ditto. - * fhandler.h (fhandler_base): Make some methods inline. - * fhandler_console.cc (fhandler_console::write_normal): Make buffer - larger. - * sigproc.h (sigframe::sigframe): Actually use set ebp parameter - correctly. - * spawn.cc (spawn_guts): Set dwProcessId when exec'ing. Just exit - immediately after reparenting. - * syscalls.cc: Sprinkle sigframe stuff throughout. - * wait.cc (wait4): Set signal frame here. - -Tue Oct 10 19:54:06 2000 Christopher Faylor - - * dcrt0.cc (__api_fatal): Don't rely on small_printf to display errors. - Always display problems to the console, if possible. - -Tue Oct 10 15:21:10 2000 Christopher Faylor - - * path.cc (cwdstuff::get): Set EINVAL when length is zero. - -Mon Oct 9 14:07:04 2000 Christopher Faylor - - * path.cc (mount_info::cygdrive_posix_path): Handle e:foo construction - correctly. - -Mon Oct 9 16:44:00 2000 Corinna Vinschen - - * fhandler_mem.cc (fhandler_dev_mem::fhandler_dev_mem): - Fix debug output. - -Mon Oct 9 15:58:00 2000 Corinna Vinschen - - * fhandler_mem.cc: Eliminate unused include statements. - (fhandler_dev_mem::fhandler_dev_mem): Check for 9X/ME. - -Mon Oct 9 15:11:00 2000 Corinna Vinschen - - * fhandler.h (fhandler_dev_mem): Erase member `init_phase' and - member function `init'. - * fhandler_mem.cc: Add typedefs for NT internal data types - `SYSTEM_INFORMATION_CLASS' and `SYSTEM_BASIC_INFORMATION'. - Add prototype for `NtQuerySystemInformation' function. - (fhandler_dev_mem::fhandler_dev_mem): Takes over initialization task - from `init'. Use `NtQuerySystemInformation' function to evaluate the - size of physical memory instead of interval search. - (fhandler_dev_mem::init): Eliminated. - (fhandler_dev_mem::open): Don't call `init'. - (fhandler_dev_mem::read): Eliminate check for `init_phase'. - (dummy_autoload): Add load statement for `NtQuerySystemInformation'. - -Sun Oct 8 22:38:40 2000 Christopher Faylor - - * dtable.cc (set_std_handle): Use std_consts array to control - SetStdHandle settings. - (dtable::fixup_after_fork): Ditto. - * exceptions.cc (set_sig_errno): Remove some debugging output. - * path.cc (path_conv::check): Don't OR need_directory with flags sent - to symlink_info::check. - (symlink_info::check): Use PATH_ALL_EXEC to determine when a file is - executable. - * path.h (path_types): Add PATH_ALL_EXEC. - (isexec): Use PATH_ALL_EXEC so that cygexec types will be considered - executable. - * pinfo.h (_pinfo): Add a process handle that is kept open throughout - the life of a cygwin pid. - * sigproc.cc (proc_exists): Remove hopefully obsolete stuff. - (proc_subproc): Set up process handle that is kept open throughout the - life of a cygwin pid. Reorganize PROC_WAIT stuff to use common code. - (proc_terminate): Close pid lifetime process handle. - (checkstate): Cleanup. - (stopped_or_terminated): Move zombie cleanup. - (remove_zombie): To here. - * spawn.cc (spawn_guts): Reorganize reparenting code for 1247th time. - -Sat Oct 7 13:59:15 2000 Christopher Faylor - - * fhandler.h (fhandler_base): Remove obsolete _rpos and _rsize - elements. - * fhandler.cc (fhandler_base::open): Ditto. - * fhandler.cc (fhandler_base::fhandler_base): Ditto. - (fhandler_base::read): Ditto. Add more debugging output. Don't issue - a \r when \r\n detected. - * pipe.cc (make_pipe): Streamline slightly. Make debug output more - interesting. - * strace.cc (strace::vsprintf): Use __progname where appropriate to - distinguish strace output when exec'ing. - -Sat Oct 7 19:25:00 2000 Corinna Vinschen - - * fhandler.h (fhandler_dev_mem): Add methods mmap, munmap and msync. - Add `unit' member. - * fhandler_mem.cc (fhandler_dev_mem): Initialize `unit' as well. - (init): Care for differences between /dev/mem, /dev/kmem (not - implemented yet) and /dev/port. - (open): Change debug message to reflect the device. - (mmap): New function. - (munmap): Ditto. - (msync): Ditto. - (fstat): Use unit when setting st_dev in stat structure. - * mmap.cc (mmap): Handle MAP_ANONYMOUS flag. - Change error handling slightly. - * path.cc (get_device_number): Handle /dev/port. - -Fri Oct 6 23:21:29 2000 Christopher Faylor - - * syscalls.cc (_read): Behave properly when passed previous version of - O_NDELAY. Fix up debugging output. - -Thu Oct 5 20:34:48 2000 Christopher Faylor - - * net.cc (set_socket_inheritance): Rename from duplicate_socket. Use - NT specific call when appropriate. - (__set_winsock_errno): Rename from set_winsock_errno. Accept function - and line as arguments. - * path.cc (path_conv::check): Continue the neverending battle to make - cygwin properly understand that path specs ending in a slash require - that the path refer to a directory. Windows does not do this by - default. - (symlink_info::check): Remove ENOTDIR test. Move it to - path_conv::check. - * path.h: Remove obsolete constant. - * winsup.h (set_winsock_errno): New macro. - -Thu Oct 5 14:58:00 2000 Corinna Vinschen - - * fhandler.h: Add mmap(), munmap() and msync() to fhandler_base - and fhandler_disk_file. - * mmem.cc (mmap): Eliminated device dependent implementation details. - These are moved to the appropriate fhandler class. - (munmap): Ditto. - (msync): Ditto. - (fhandler_base::mmap): New method. - (fhandler_base::munmap): Ditto. - (fhandler_base::msync): Ditto. - (fhandler_disk_file::mmap): Ditto. - (fhandler_disk_file::munmap): Ditto. - (fhandler_disk_file::msync): Ditto. - -Thu Oct 5 01:52:43 2000 Christopher Faylor - - * net.cc: General cleanup. - (fdsock): Return pointer to created fhandler_socket. - (cygwin_socket): Use pointer returned by fdsock. Return correct errno - when fd < 0. - -Thu Oct 5 00:48:40 2000 Christopher Faylor - - * exceptions.cc (interruptible): Add extra debugging. - * sigproc.h (wait_sig): Fill in frame pointer, by default, prior to - calling or suffer confusion due to September 7 change below. - -Wed Oct 4 23:10:27 2000 Christopher Faylor - - * include/netinet/tcp.h: Remove winsock.h include. - * include/sys/cygwin.h: Move windows specific reference within - conditional. - -Thu Oct 5 1:13:00 2000 Corinna Vinschen - - * include/sys/mman.h: Add missing MAP_FAILED macro. - -Wed Oct 4 18:48:00 2000 Corinna Vinschen - - * fhandler.h (fhandler_dev_mem): Add method `init'. Add members - `mem_size' and `init_phase'. - * fhandler_mem.cc (init): New function to figure out the size of - the physical memory. - (open): Add checking for illegal flags. Change usage of access mode. - (write): Add intended functionality. - (read): Add parameter checking. Eliminate page size constant. Use - getpagesize() instead. Don't touch errno and don't create debug output - while init() is running. - (lseek): Add bounds checking. Fix SEEK_END. - (fstat): Eliminate page size constant. Use getpagesize() instead. - (dup): Add intended functionality. - -Mon Oct 2 22:15:00 2000 Corinna Vinschen - - * dcrt0.cc: Add LoadDLLFunc statement for RegEnumValueA(). - * net.cc: Change comments related to get_ifconf. - (get_2k_ifconf): Eliminate `type' variable. Eliminate `sa' parameter. - (get_nt_ifconf): Ditto. - (get_9x_ifconf): Ditto. Rewritten. - (get_ifconf): Change calls to OS specific functions. - -Mon Oct 2 15:15:01 2000 Christopher Faylor - - * signal.cc (sigaction): Allow new action == oldaction. - -Mon Oct 2 11:05:00 2000 Corinna Vinschen - - * fhandler_mem.cc: Load ntdll functions via autoload method. - (load_ntdll_funcs): Eliminated. - -Sun Oct 1 16:36:00 2000 Corinna Vinschen - - * fhandler_mem.cc (load_ntdll_funcs): Add missing __stdcall qualifiers. - -Sun Oct 1 22:20:39 2000 Christopher Faylor - - * cygheap.cc (cygheap_init): Born again function. - (_cmalloc): Reorganize to accommodate muto locking. - (_cfree): Use muto lock to avoid multi-thread problems. - * cygheap.h (incygheap): Just use cygheap_max to find upper cygwin heap - bounds. - * dcrt0.cc (dll_crt0_1): Reinstitute cygheap_init call. - * path.cc (getcwd): Just return cwdstuff::get result, allowing correct - handling of negative length. - (cwdstuff::get): Malloc a buffer if one is not available. - -Sun Oct 1 2:56:00 2000 Corinna Vinschen - - * Makefile.in: Add fhandler_mem.o to the dependencies. - * dtable.cc (dtable::build_fhandler): Add case for FH_MEM. - * fhandler.h: Add FH_MEM device type. Add class fhandler_dev_mem. - * fhandler_mem.cc: New file. Implementation of class fhandler_dev_mem. - * path.cc: Add /dev/mem to windows_device_names. - (get_device_number): Add FH_MEM type. - -Sat Sep 30 00:43:42 2000 Christopher Faylor - - * cygheap.cc (init_cheap): Set aside space for heap walk pointer. - (_csbrk): Make logic for detecting when to alloc cognizant of - initialization condition. - (_cmalloc): Use a structure to hold bucket size and heap chain pointer. - Store pointer to next freed block in bucket size location so that it - will be easy to see if a block is allocated. - (_cfree): Store pointer to next freed block in bucket size location. - (_crealloc): Use macro to retrieve bucket size. - (cygheap_init): Eliminate. - (cygheap_fixup_in_child): Add second argument to determine if we were - execed or not. In execed case, walk the heap, cleaning up any orphaned - blocks. - * cygheap.h: Add a "MAX" value to cygheap_types. Remove cygheap_init - declaration. Accommodate new argument to cygheap_fixup_in child. - * fork.cc (fork): Accommodate extra argument to cygheap_fixup_in_child. - * dcrt0.cc (dll_crt0_1): Ditto. Remove call to cygheap_init. - -Fri Sep 29 21:49:27 2000 Christopher Faylor - - * path.cc (symlink_info::check): Set executable bit for a file if the - first two characters are 'MZ' to mirror spawn_guts check. - -Sat Sep 30 03:34:00 2000 Corinna Vinschen - - * winsup.h: Add `winME' to os_type symbols. - * dcrt0.cc (set_os_type): Identify Windows ME systems. - * (host_dependent_constants::init): Care for winME. - * uname.cc (uname): Ditto. - -Thu Sep 28 01:46:00 2000 Corinna Vinschen - - * net.cc (get_ifconf): Code cleanup. Split. Call os dependent - subfunctions instead. - (get_9x_ifconf): New function for 9X systems, called by get_ifconf. - (get_nt_ifconf): New function for NT systems, called by get_ifconf. - (get_2k_ifconf): New function for W2K systems, called by get_ifconf. - -Wed Sep 27 01:10:07 2000 Christopher Faylor - - * spawn.cc (spawn_guts): Attempt to accommodate archaic windows quoting - mechanism when dealing with '\' and '"'. - -Mon Sep 25 20:47:04 2000 Christopher Faylor - - * dcrt0.cc (quoted): Fix problem where ' quoted strings were skipped. - * fhandler.h (fhandler_socket::~fhandler_socket): Delete declaration. - * net.cc: Remove unnecessary "number_of_sockets" usage. - (fhandler_socket::fhandler_socket): Ditto. - (fhandler_socket::~fhandler_socket): Delete definition. - * spawn.cc (spawn_guts): Force first argument passed to CreateProcess - as a command line to be windows style. - -2000-09-25 Christopher Faylor - - * spawn.cc (av::dup_maybe): Make function void rather than void *. - * environ.cc (environ_init): Remember to reparse CYGWIN if envp is - supplied. - * heap.cc (_sbrk): Remember frame for signal handling. - * syscalls.cc (read_handler): Eliminate. - (_read): Move read_handler code here. Reorganize for one path through - 'ready_for_read'. - -Tue Sep 19 09:46:36 2000 Christopher Faylor - - * spawn.cc (spawn_guts): Use actual program argument passed in for - argv[0] as originally suggested by Kazuhiro Fujieda - . - -Mon Sep 18 23:17:19 2000 Christopher Faylor - - * path.h: Create new input path flag PATH_NEEDDIR. - * path.cc (path::check): Detect trailing slash before converting to - windows path. Tell symlink_info::check to check for directory if one is - found. - (symlink_info::check): Set errno when path is not a directory if - pflags & PATH_NEEDDIR. - -Mon Sep 18 19:44:08 2000 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::write): Correct typo which - caused resetting of windows error to ERROR_IO_DEVICE to be ignored. - -Mon Sep 18 17:15:37 2000 Kazuhiro Fujieda - - * path.cc (mount_info::read_mounts): Don't delete mount entries of - which mount points have the cygdrive prefix. - * (mount_info::add_reg_mount): Properly catch errors on registry - operations. - * (mount_info::write_cygdrive_info_to_registry): Ditto. - * (mount_info::del_reg_mount): Cosmetic changes to be consistent - with other methods. - * (mount_info::add_item): Check arguments more precisely. - Increment nmounts only when registry operations succeed. - -Sun Sep 17 22:18:39 2000 Christopher Faylor - - * exceptions.cc (interruptible): Return 0 if given an address in - uncommitted memory. - -2000-09-16 Egor Duda - - * signal.cc (sleep): If interrupted by signal, return the - requested time minus the time actually slept. - -Fri Sep 15 22:30:40 2000 Christopher Faylor - - * exceptions.cc (handle_exceptions): Just "core dump" if SIGSEGV in - signal thread. - * external.cc (fillout_pinfo): Fix compiler warning. - * sigproc.h: Eliminate special asm naming for sig_dispatch_pending. - * sigproc.cc (sig_send): Remove debugging statements. - -Wed Sep 13 14:56:47 2000 Christopher Faylor - - * spawn.cc (av): Hide 'calloced' field and limit cstrduping to class - methods only. - (spawn_guts): Use methods for manipulating most newargv stuff. - -2000-09-13 Egor Duda - - * child_info.h (child_info_spawn::~child_info_spawn): Avoid - memory leaks in cygheap. - * spawn.cc (spawn_guts): Ditto. - -Wed Sep 13 14:28:03 2000 Christopher Faylor - - * dcrt0.cc (quoted): Return next character after a quoted string when - not doing special quote processing. Also ensure that non-NULL is - returned in all circumstances. - -Wed Sep 13 10:26:16 2000 Christopher Faylor - - * spawn.cc (spawn_guts): Ensure that argv[0] is correctly set to the - full path when a script is detected. Suggested by Kazuhiro Fujieda - . - -Tue Sep 12 22:33:30 2000 Christopher Faylor - - * external.cc (fillout_pinfo): Handle explicit pids correctly. - -Tue Sep 12 14:37:32 2000 Christopher Faylor - - * path.cc (normalize_posix_path): Fix more slashdot madness. - -Tue Sep 12 12:29:29 2000 Christopher Faylor - - * Makefile.in: Make clean target remove *.d. - -Mon Sep 11 13:19:15 2000 Christopher Faylor - - * path.cc (normalize_posix_path): Correctly deal with a "." parameter. - -Sun Sep 10 20:23:35 2000 Christopher Faylor - - * cygheap.cc (init_cheap): Just use any old address for the cygwin - heap. - * exceptions.cc (signal_exit): Don't terminate the main thread. Just - try to exit in this thread really quickly. - * signal.cc (kill_pgrp): Fix typo which caused pinfo structure to be - assigned incorrectly. - -Sun Sep 10 12:40:49 2000 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Initialize thread and debug stuff before - handling exec/fork. - * dtable.cc (dtable::fixup_after_exec): Always clear out the read ahead - buffer whether closing or adjusting. - * path.cc (chdir): Avoid a compiler warning. - -Sat Sep 9 23:29:17 2000 Christopher Faylor - - * path.cc (chdir): Use the full path for cwd_win32. Consider attempts - to chdir to strings of dots > 2 to be an error. Pass 'dir' argument to - cygcwd.set. - (cwdstuff::set): Need to treat arguments from chdir differently. - * path.h (cwdstuff): Add an argument to set. - -Fri Sep 8 11:50:09 2000 Christopher Faylor - - * lib/_cygwin_crt0_common.cc: Add missing header files. - -Thu Sep 7 23:07:21 2000 Christopher Faylor - - * sigproc.h (sigframe::set): Eliminate second argument. Default bp to - current frame pointer rather than using this within the function, which - is unstable when this method is not inlined. - * net.cc: Eliminate use of second argument to sigframe.set throughout. - * select.cc (cygwin_select): Ditto. - * sigproc.cc (sig_send): Ditto. - -Thu Sep 7 22:45:16 2000 Christopher Faylor - - Break out more header info into separate files. Use appropriate - header files throughout. - * shared.h: Remove. - * cygwin_version.h: New file. - * delqueue.h: New file. - * environ.h: New file. - * host_dependent.h: New file. - * perprocess.h: New file. - * registry.h: New file. - * security.h: New file. - -Thu Sep 7 12:14:43 2000 Christopher Faylor - - Split out tty and shared_info stuff into their own headers and use - throughout. Include sys/termios.h for files which need it. - * tty.h: New file. - * shared_info.h: New file. - * fhandler.h: Move inline methods that rely on tty stuff to - fhandler_console.cc. - * fhandler_tty.cc (fhandler_pty_master::process_slave_output): Set - output_done_event immediately after reading data to speed up tty output - processing. - (process_output): Set write_error to errno or zero. - (fhandler_tty_slave::write): Check previous write error prior to - writing to slave end of pipe. This allows tty output to be slightly - less synchronous. - * fhandler_console.cc (fhandler_console::tcsetpgrp): Moved here from - fhandler.h. - (fhandler_console::set_input_state): Ditto. - -Wed Sep 6 21:11:13 2000 Christopher Faylor - - * exceptions.cc (signal_exit): Reset all mutos owned by the main - thread. - * fhandler.h: Define *_output_mutex macros for serializing tty output. - (fhandler_termios): Remove restart_output_event. Define dummy output - mutex methods. - (fhandler_pty_master): Remove unneeded fixup_after_fork method. - * fhandler_termios.cc (fhandler_termios::line_edit): Acquire - output_mutex when CTRL-S is hit. Release it on CTRL-Q. - * fhandler_tty.cc (fhandler_pty_master::process_slave_output): Remove - inappropriate OutputStopped test here. Just use the output mutex. - (fhandler_pty_master::fhandler_pty_master): Remove obsolete reference - to restart_output_event. - (fhandler_tty_common::close): Ditto. - (fhandler_pty_master::set_close_on_exec): Ditto. - (fhandler_pty_master::fixup_after_fork): Delete. - * tty.cc (tty::common_init): Ditto. - * sync.cc (muto::reset): New method. - * sync.h: Declare above method. - -Wed Sep 6 16:56:38 2000 Christopher Faylor - - * sigproc.cc: Add include file for proper definitions. - * spawn.cc: Ditto. - * winsup.h: Define cfree to avoid newlib pollution. - -Wed Sep 6 14:11:51 2000 Christopher Faylor - - * Makefile.in (CFLAGS): Ensure that -MD is always added even when - CFLAGS is overwritten. - -Wed Sep 6 02:40:12 2000 Christopher Faylor - - * path.cc (cwdstuff::get_initial): Keep caching alive. - (mount_info::conv_to_win32_path): Fill out relative path in failing - case. - -Tue Sep 5 21:36:15 2000 Christopher Faylor - - * path.cc (normalize_posix_path): Deal with error return from cygcwd.get. - (normalize_win32_path): Ditto. - (mount_info::conv_to_win32_path): Ditto. - (cwdstuff::get): Set buf to NULL on error. - -Tue Sep 5 17:49:34 2000 Christopher Faylor - - * path.cc (readlink): 'max' should be a 'min' or we'll suffer - buffer overflow. - -Mon Sep 4 22:53:58 2000 Christopher Faylor - - * path.cc (cwd_win32): Eliminate. - (cwd_posix): Eliminate. - (cwd_hash): Eliminate. - (cwdstuff::init): Rename from cwd_init. - (cwdstuff::fixup_after_exec): Rename from cwd_fixup_after_exec. - (cwdstuff::get): Rename from get_cwd_inner. - (normalize_posix_path): Eliminate cwd argument. Just calculate when - necessary. - (normalize_win32_path): Ditto. - (mount_info::conv_to_win32_path): Eliminate cwd retrieval here. - (mount_info::conv_to_posix_path): Ditto. - (hash_path_name): Accommodate additional methods in cwdstuff. - (get_cwd_win32): Eliminate. - (getcwd): Use cwdstuff methods. Properly handle case where buf == NULL - and len < 0. - (cwdstuff::get_hash): New method. - (cwdstuff::get_initial): New method. - (cwdstuff::set): New method. - (cwdstuff::get): New method. - (cwdstuff::copy): New method. - * path.h: Move cwdstuff struct here. Add a bunch of stuff to cwdstuff. - Make cygcwd an extern. - * spawn.cc (spawn_guts): Use copy method to get copies of cwd info to - pass to execed process. - * dcrt0.cc (dll_crt0_1): Use cygcwd methods for cwd initialization. - -2000-09-03 Egor Duda - - * path.cc (readlink): Check if buffer length is positive. - Truncate output to buffer length. Don't terminate buffer - with '\0'. - -Sun Sep 3 00:38:40 2000 Christopher Faylor - - * environ.cc (environ_init): Don't free the new environment table after - we've just copied stuff to it. - -Sun Sep 3 00:07:32 2000 Christopher Faylor - - * Makefile.in: Add cygheap.o. - * child_info.h: Add specific exec class. - * cygheap.h: New file. Contains declarations for cygwin heap. - * cygheap.cc: New file. Implements cygwin heap functions. - * dcrt0.cc (quoted): Simplify due to new method for passing arguments - between cygwin programs. - (alloc_stack_hard_way): Attempt to handle overlapped stack. - (dll_crt0_1): Move child_info processing here. Accommodate new method - for passing arguments between cygwin programs. Initialize cygwin heap. - Establish __argc and __argv variables. - (_dll_crt0): Move most of child_info processing to dll_crt0_1. - (cygwin_dll_init): Remove duplication. - * dtable.cc (dtable::extend): Allocate dtable using cygwin heap. - (dtable::build_fhandler): Ditto for fhandler type being constructed. - (dtable::dup_worker): Free new fhandler from cygwin heap on error. - (dtable::select_*): Don't assume that this == fdtab. - (dtable::linearize_fd_array): Delete. - (dtable::delinearize_fd_array): Delete. - (dtable::fixup_after_exec): New file. - (dtable::vfork_child_dup): Use cygwin heap. - (dtable::vfork_parent_restore): Ditto. - * dtable.h: Remove obsolete methods. Add new method. - * environ.cc (posify): Eliminate already_posix parameter and logic. - (envsize): New function. - (_addenv): Use envsize. - (environ_init): Accept an argument pointing to an existing environment - list. If supplied, allocate space for this in the the program's heap. - * fhandler.cc (fhandler_base::operator =): Move here from fhandler.h. - Use cygwin heap to allocate filenames. - (fhandler_base::set_name): Allocate/free names from cygwin heap. - (fhandler_base::linearize): Delete. - (fhandler_base::de_linearize): Delete. - (fhandler_base::operator delete): Free from cygwin heap. - (fhandler_base::~fhandler_base): Ditto. - * fhandler.h: Accommodate elimination of *linearize and other changes - above. - * fhandler_console.cc (fhandler_console::fixup_after_exec): Rename from - de_linearize. - * heap.h: New file. - * fhandler_tty.cc (fhandler_tty_slave::fhandler_tty_slave): Use cygwin - heap for name. fhandler_tty::fixup_after_exec): Rename from - de_linearize. - * fork.cc (fork): Call cygheap_fixup_in_child. - * heap.cc: Use declarations in heap.h. - * malloc.cc: Sprinkle assertions throughout to catch attempts to - free/realloc something from the cygwin heap. - * path.cc: Throughout, eliminate use of per-thread cache for cwd. Use - cwd_* functions rather than cwd_* variables to access cwd_win32 and - cwd_posix. - (cwd_win32): New function. - (cwd_posix): New function. - (cwd_hash): New function. - (cwd_fixup_after_exec): New function. - * path.h: Accommodate path.cc changes. - * pinfo.cc (pinfo_init): Accept a pointer to an environment table. - Pass this to environ_init. Eliminate old 'title' tests. - * pinfo.h: Accommodate above change in argument. - * spawn.cc (struct av): New method for building argv list. - (av::unshift): New method. - (spawn_guts): Allocate everything that the child process needs in the - cygwin heap and pass a pointer to this to the child. Build argv list - using new method. Eliminate delinearize stuff. - * thread.h: Eliminate _cwd_win32 and _cwd_posix buffers. - * winsup.h: Eliminate obsolete functions. Add envsize() declaration. - -2000-09-02 Egor Duda - - * Makefile.in: Remove "make check" support. It is now in - winsup/Makefile.in. - -Fri Sep 1 21:17:03 2000 Christopher Faylor - - * sigproc.cc (mychild): New function. - (proc_subproc): Use mychild() to determine if a specific pid is valid - for wait()ing. - -Fri Sep 1 16:57:44 2000 Christopher Faylor - - * sigproc.cc (sigproc_init): Create wait_sig_inited without auto-reset - to avoid potential races. - (init_child_info): Avoid unneeded test. - -Fri Sep 1 16:51:26 2000 Christopher Faylor - - * sigproc.cc (proc_info): Rename proc_exists which takes a pid to - "pid_exists". - * shared.h: Split out "child_info" stuff into a new header file and - use where necessary. - Declare pid_exists. - * child_info.h: New file. - -Thu Aug 31 16:06:21 2000 Christopher Faylor - - * errno.cc (set_errno_from_win_error): Actually use arguments to - strace_printf. - -2000-08-30 DJ Delorie - - * times.cc (gettimeofday): use GetSystemTimeAsFileTime to avoid a - conversion - (FACTOR): correct value - (genf): set milliseconds to zero, DOW to 4. - -2000-08-29 Egor Duda - - * grp.cc (getgroups): fail with EINVAL if array is not large - enough to hold all supplementary group IDs. - -Mon Aug 28 22:03:21 2000 Christopher Faylor - - * signal.cc (_raise): New function. - * exceptions.cc (unused_sig_wrapper): Remove _raise. - * sigproc.h (class sigframe): Default frames to skip to zero or suffer - from exuberant optimization. - * fhandler_tty.cc (fhandler_tty::write): Set appropriate errno when - WriteFile to pipe fails. - -Fri Aug 25 23:44:48 2000 Christopher Faylor - - * pinfo.h (pinfo): Un-inline release. - * pinfo.cc (pinfo::release): Move here from pinfo.h. - * sigproc.cc (proc_terminate): Remove bogus 'pinfo child' which caused - strange destruction of random regions of memory when destructor was - invoked. - -Fri Aug 25 21:25:32 2000 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Move set_os_type. - (_dll_crt0): To here. - (cygwin_dll_init): And here. - * external.cc (fillout_pinfo): Use more foolproof method for scanning - for pids. - * pinfo.cc (set_myself): Eliminate myself_identity.init. - * sigproc.cc (wait_sig): Do it here instead to reduce the amount of - time where there could potentially be two processes with the same pid. - * spawn.cc (spawn_guts): Eliminate duplicate initialization. - * include/sys/cygwin.h: Mark unused PID_* elements. - -Fri Aug 25 21:49:00 2000 Corinna Vinschen - - * exec.cc (_execve): Change definition according to declaration in - newlib/libc/include/sys/unistd.h. - -Thu Aug 24 22:17:19 2000 Christopher Faylor - - * external.cc (cygwin_internal): Add CW_INIT_EXCEPTIONS to allow cygwin - exception handling on threads not created by cygwin. - * sigproc.cc (proc_terminate): Don't release pinfo structs since we are - exiting. - * include/sys/cygwin.h: Add CW_INIT_EXCEPTIONS. - -Thu Aug 24 17:16:14 2000 Christopher Faylor - - * select.cc (cygwin_select): Correct logic for "always_ready" fds or - when there is no wait specified. - * syslog.cc (pass_handler::set_message): Zero the buffer prior to - setting it. - -2000-08-24 Egor Duda - - * include/cygwin/core_dump.h: New file, contains structures used in - cygwin core core files. - * include/sys/procfs.h: New file, needed to autoconfigure cygwin core - dumps support in bfd. - -Thu Aug 24 13:50:15 2000 Christopher Faylor - - * environ.cc (parse_thing): nobinmode should force O_TEXT. - (regopt): Use correct path to find LOCAL_MACHINE registry options. - * fhandler.cc (fhandler_base::open): Set binary mode only when binmode - == O_BINARY. - * pipe.cc (pipe): Pipe handling should rely on binmode not _fmode now - that the two are different. - -Thu Aug 24 13:21:09 2000 Christopher Faylor - - * include/sys/cygwin.h (strace_printf_wrap): Force printing when - _STRACE_SYSTEM. - (strace_printf_wrap1): Ditto. - -Thu Aug 24 12:30:17 2000 Christopher Faylor - - * debug.h: Allow some debug defines for use in header files. - -Wed Aug 23 23:00:24 2000 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Move exception list and constructor stuff - earlier in the process. Use new second argument to set_myself. - (cygwin_dll_init): Initialize exception list and constructor stuff - here. - (_dll_crt0): And here. Also, deal with inherited pinfo shared memory - region from parent. - * pinfo.cc (set_myself): Accept a second argument signifying the a - shared memory region, passed from an execing parent. - (pinfo_init): Ditto. - * pinfo.h: Ditto. - * shared.h (child_info): Add a handle field to pass to child. - * spawn.cc (spawn_guts): Create a shared handle to pass to an execed - child. - * winsup.h: Remove extraneous declaration. - -Wed Aug 23 10:51:57 2000 Christopher Faylor - - * include/sys/cygwin.h: Protect class definitions. - -Tue Aug 22 13:57:36 2000 Christopher Faylor - - * path.cc (symlink_info::check): Clear error on each iteration of - extension check. - -Tue Aug 22 11:23:59 2000 Christopher Faylor - - * Makefile.in: Don't include '.d' file if there are none generated yet. - -Tue Aug 22 11:08:11 2000 Christopher Faylor - - * include/sys/cygwin.h: Declare some thread classes. - * include/mntent.h: Avoid declaring functions. - -Tue Aug 22 01:08:01 2000 Christopher Faylor - - * winsup.h: Eliminate inclusion of most of the cygwin .h files. Use .h - files only in sources which require them. - * Makefile.in: Generate dependencies with -MD option. - -Mon Aug 21 23:49:05 2000 Christopher Faylor - - * cygerrno.h: New file. Use this throughout whenever errno - manipulation is required. - * errno.cc: Use DWORD to hold Windows errors. - (geterrno_from_win_error): New function. - (seterrno_from_win_error): Use geterrno_from_win_error to convert - supplied windows error (suggested by Corinna Vinschen). - * path.cc (symlink_info): Add error element. - * path.cc (path_conv::check): Remove errno setting. Use new - symlink_info errno element to set path_conv error, where appropriate. - (symlink_info::check): Set error element rather than attempting to - manipulate errno. Add more checks for trailing / and /.. even though - they are currently useless. Avoid setting EINVAL. - -Mon Aug 21 23:49:05 2000 Corinna Vinschen - - * path.cc (normalize_posix_path): Correct check for trailing /. - -2000-08-21 DJ Delorie - - * include/cygwin/cygwin_dll.h (DECLARE_CYGWIN_DLL): hinstance, - not handle. - -Fri Aug 18 11:11:00 2000 Corinna Vinschen - - * dtable.cc (dtable::dup2): Extend fdtab if newfd is out of current - allocated bounds. - -Sat Aug 12 01:47:28 2000 Christopher Faylor - - * mkvers.sh: Properly trap exit removal of temp file. Remove debugging - statement. - -Sat Aug 12 01:37:56 2000 Christopher Faylor - - * poll.cc: Make winsup.h the first include file, re 2000-08-02 change. - -Sat Aug 12 01:33:12 2000 Christopher Faylor - - * winsup.h: Split out dtable definitions into separate header file. - * dtable.h: New file. - * sigproc.h: Eliminate pinfo.h usage here. Use it in source files that - need it. - -Sat Aug 12 01:08:11 2000 Christopher Faylor - - * Makefile.in: Use dtable.o rather than hinfo.o. - -Sat Aug 12 00:47:11 2000 Christopher Faylor - - Rename hinfo -> dtable. Name the former dtable array 'fdtab'. - -Fri Aug 11 14:47:00 2000 Corinna Vinschen - - * poll.cc: Allow any descriptor and any number of descriptors. - Allocate fd_set struct sdynamically. - -Fri Aug 11 14:47:00 2000 Corinna Vinschen - - * poll.cc: Add bounds checking for file descriptors. Return POLLNVAL - if fd is invalid. Return POLLERR for each valid fd if cygwin_select - returned with error. - include/sys/poll.h: Change POLLERR comment according to above change. - -Thu Aug 10 21:54:29 2000 Christopher Faylor - - * syslog.cc (syslog): Use a less malloc-intensive method for allocating - the buffer. Also fix a buffer overrun. - -Thu Aug 10 15:31:39 2000 Christopher Faylor - - * winsup.h: Change strchr inline for strange gcc problem. - * select.cc (select_stuff::wait): Bounds check w4 array. - -Thu Aug 10 15:17:53 2000 Christopher Faylor - - * dir.cc (readdir): Ensure that errno is *only* set when we've run out - of filenames. - * fhandler.cc (fhandler_disk_file::fstat): Use modern method for saving - errno, making it effective for the whole function. - -Tue Aug 8 22:25:39 2000 Christopher Faylor - - * select.cc (allocfd_set): Zero allocated fd_set. - (cygwin_select): Move fd_set copying logic from ::wait to here. Use - common return through sell.poll. - (select_stuff::wait): Just return success or failure and let caller - fill in fd_set. - * pinfo.h (pinfo): Eliminate self-referential pointer to sidbuf since - pinfo structure exists at random locations now. - * fork.cc (fork): Use 'use_psid' element to control when the psid is - relevant. - * shared.cc (sec_user): Ditto. - * spawn.cc (spawn_guts): Ditto. - * uinfo.cc (internal_getlogin): Ditto. - * syscall.cc (seteuid): Ditto. Set use_psid element. - -Tue Aug 8 13:20:00 2000 Bob Wilson - - * fhandler_serial.cc (tcsendbreak): "sleeptime" argument to usleep() - must be in units of microseconds, not milliseconds. - -Mon Aug 7 00:11:35 2000 Christopher Faylor - - * include/cygwin/cygwin_dll.h: Remove extraneous (and incorrect) - declarations. - -Fri Aug 4 00:00:46 2000 Christopher Faylor - - * hinfo.cc (hinfo::find_unused_handle): Just check for table entry == - NULL since we are already bounds checked by default. - * thread.cc (ResourceLocks::Lock): Streamline this function since it is - called a lot. - (ReleaseResourceLock): Ditto. - -Thu Aug 3 20:44:39 2000 Christopher Faylor - - * select.cc (fhandler_console::select_read): Call set_cursor_maybe - since select may block and cursor may not be visible. - * select.cc (fhandler_console::select_write): Ditto. - * select.cc (fhandler_console::select_except): Ditto. - -Thu Aug 3 09:01:14 2000 Christopher Faylor - - * fhandler_tty.cc (fhandler_pty_master::process_slave_output): Set - length field correctly when "need_nl". - -Wed Aug 2 22:58:07 2000 Christopher Faylor - - * fork.cc (vfork): Store complete stack frame in vfork_save structure - for later recovery. - * spawn.cc (spawn_guts): Reorganize slightly to consolidate handling - when there is a CreateProcess error. - (_spawnve): Only longjmp back to vfork handling when a process has been - successfuly started. - * winsup.h (vfork_save): Extend to include frame info. Remove obsolete - cpplus conditionals. - -Wed Aug 2 15:14:51 2000 Christopher Faylor - - * strace.cc (strace::prntf): Make second argument the function name, - rather than use special format options. - (strace::vprntf): Ditto. - (getfunc): New function. - * include/sys/strace.h: Reflect above changes. - * smallprint.c (__small_vsprintf): Eliminate '%F' formatting. - * pinfo.cc (set_myself): Modify for new strace::prntf parameter. - * errno.cc (seterrno_from_win_error): Ditto. - * fhandler_tty.cc (fhandler_tty_common::__acquire_output_mutex): Ditto. - * fhandler_tty.cc (fhandler_tty_common::__release_output_mutex): Ditto. - -Wed Aug 2 13:20:04 2000 Christopher Faylor - - * regexp/regexp.c: Add winsup.h. - -2000-08-02 DJ Delorie - - * winsup.h: take out protections of environ, errno, allow C use - * *.cc: put winsup.h before other headers (for __INSIDE_CYGWIN__); - use cur_environ() instead of just environ - * times.cc: remove import protections - * glob.c: add winsup.h - * localtime.c: ditto - * smallprint.c: ditto - * Makefile.in: don't __INSIDE_CYGWIN__ as it messes up profiling. - -Wed Aug 2 11:22:53 2000 Christopher Faylor - - * include/sys/strace.h: Fix strace definition. - -Tue Aug 1 23:37:08 2000 Christopher Faylor - - * strace.h: Add kludgy workarounds to avoid using deprecated methods - for variable argument macros when possible. - * sigproc.cc: Throughout, use sigproc_printf rather than sip_printf. - * strace.cc (strace::prntf): Remove 'active' check, since callers are - supposed to ensure this. - (__system_printf): Remove. Subsumed by strace::prntf. - * winsup.h: Define "NEW_MACRO_VARARGS" to indicate when to use new - macro varargs capability. - -Sun Jul 30 13:54:35 2000 Christopher Faylor - - * fhandler_console.cc: Remove VK_DIVIDE detection. - (get_nonascii_key): Simplify previous patch to return ascii char if it - is non-zero. Add a second "temporary buffer" argument to help with - thread safety. - * select.cc (peek_console): Pass a temporary buffer argument to - get_nonascii_key. - -Sat Jul 29 14:32:12 2000 Christopher Faylor - - * fhandler_console.cc: Add VK_DIVIDE detection. Return virtual keycode - if it is not detected and it is less than ' '. - -Sat Jul 29 13:33:49 2000 Christopher Faylor - - * path.cc (chdir): Avoid trailing dot calculation when chdir == '/' - or we end up with an empty string. - -Sat Jul 29 12:11:33 2000 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor version number to 5 due - to all of the changes below. - -Sat Jul 29 12:01:32 2000 Christopher Faylor - - Redefine process structure to avoid a fixed size table. Redefine - pinfo/_pinfo classes. Use these throughout. - * dcrt0.cc (dll_crt0_1): Accommodate set_myself argument change. - (__api_fatal): Accommodate _pinfo::record_death argument change. - * exceptions.cc (really_exit): Ditto. - (sig_handle_tty_stop): Use pinfo constructor to access process info. - (events_init): Don't create pinfo_mutex since it is no longer required. - * external.cc (fillout_pinfo): Use winpids class to iterate over all - system pids. - (cygwin_internal): lock_pinfo_for_update and unlock_pinfo are now - noops. - * fhandler_termios.cc (fhandler_termios::set_ctty): Use pinfo - constructor to access process info. - * fork.cc (fork): Reorganize to initialize child info after the child - has started since that is when we know the child's winpid, which is - necessary to allocate the pinfo shared memory. - * mmap.cc (recreate_mmaps_after_fork): Change arg type to _pinfo. - * pinfo.cc: Rename pinfo methods to _pinfo throughout. Eliminate - pinfo_list stuff. - (set_myself): Accept a pid argument now. Call pinfo initializer to - initialize myself. Detect when this is an "execed" process and create - an "indirect" pid block. - (pinfo_init): Accommodate set_myself arg change. - (procinfo): Remove. - (pinfo::lock_pinfo): Remove. - (pinfo::unlock_pinfo): Remove. - (pinfo::init): New method. Allocates shared memory space for process - pinfo structure. - (pinfo::record_death): Don't call locking functions. - (cygwin_winpid_to_pid): Simplify by using new pinfo constructor. - (EnumProcessesW95): New function for iterating over processes on - Windows 95. - (winpids::winpids): New constructor for winpids class. Sets up a list - of process ids. - (enum_init): Initialize w95/wnt pid enumerators. - * shared.cc (shared-info::initialize): Remove pid initialization. - * shared.h: Move pinfo stuff into pinfo.h. - (class shared_info): Remove pinfo_list element. - * signal.cc (kill_worker): Use pinfo constructor to access process - info. - (kill_pgrp): Ditto. Use winpids methods to access list of processes. - * sigproc.cc: Throughout, modify to use _pinfo where appropriate. - (proc_exists (pid_t)): New function. Determines if a process exists - based on the pid. - (proc_exists (_pinfo *p): Use new proc_exists function above. - (proc_subproc): Copy pinfo stuff around rather than _pinfo pointers. - Try to be careful about releasing shared memory when we don't need it - anymore. Remove pinfo locks. - (remove_zombies): Remove pinfo memory when zombie is going away. - * sigproc.h: Reflect _pinfo/pinfo changes in sigproc.cc. - * spawn.cc (spawn_guts): Eliminate pinfo *child argument. Reorganize - to only initialize child pinfo after process has been started and we - know the windows pid. - (_spawnve): Reflect spawn_guts changes. - * syscalls.cc (setpgid): Use pinfo constructor to access process info. - (getpgid): Ditto. - (internal_getlogin): Use _pinfo. - * winsup.h: Eliminate pinfo_mutex. Eliminate spawn_guts declaration - since it is static now. Reflect set_myself argument change. - * include/sys/cygwin.h: Add some PID_* enums to accommodate new pinfo - stuff. - -Sat Jul 29 12:13:27 2000 Christopher Faylor - - * include/cygwin/version.h: Update minor version for cygdrive changes - below. - -Sat Jul 29 11:59:29 2000 Christopher Faylor - - * environ.cc (parse_thing): Make binmode a DWORD. - * hinfo.cc (hinfo::init_std_file_from_handle): Use 'binmode' to - determine default open mode. - * winsup.h: Declare binmode. - -Sat Jul 29 00:16:35 2000 Christopher Faylor - - * include/cygwin/cygwin_dll.h: Update for modern compilers. - * lib/cygwin_crt0.c: Inexplicably need to define alloca for newer - compilers. - * fhandler.h (fhandler_console): Add new method. - * fhandler.cc (fhandler_console::set_cursor_maybe): New method. - (fhandler_console::read): Set cursor if it has moved to make it - visible. - -Thu Jul 27 22:54:28 2000 Jason Tishler - - * dcrt0.cc (dummy_autoload): Add load statement for RegDeleteValueA. - * external.cc (get_cygdrive_prefixes): New function. - (cygwin_internal): Add CW_GET_CYGDRIVE_PREFIXES case. - * path.cc (mount_info::read_cygdrive_info_from_registry): Read system - cygdrive prefix if user one is undefined. - (mount_info::write_cygdrive_info_to_registry): Write cygdrive prefix to - the appropriate registry hive. Overwrite in-memory copy of cygdrive, - if appropriate. - (mount_info::remove_cygdrive_info_from_registry): New method. - (mount_info::get_cygdrive_prefixes): New method. - (cygwin_umount): Remove cygdrive prefix, if appropriate. - * registry.cc (reg_key::killvalue): New method. - * shared.h (class reg_key): Add killvalue, - remove_cygdrive_info_to_registry, and get_cygdrive_prefixes - declarations. - * include/sys/cygwin.h (cygwin_getinfo_types): Add - CW_GET_CYGDRIVE_PREFIXES. - -Thu Jul 27 23:33:32 2000 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor version number to 4. - -2000-07-27 DJ Delorie - - * testsuite/winsup.api/winsup.exp: ignore stdout by default - * testsuite/winsup.api/crlf.c: non-verbose by default - - * winsup.h: prune out windows headers we don't normally need - * assert.cc: add wingdi.h and winuser.h - * fhandler_console.cc: ditto - * fhandler_windows.cc: ditto - * select.cc: ditto - * spawn.cc: ditto - * strace.cc: ditto - * tty.cc: ditto - * window.cc: ditto - * hinfo.cc: add winsock.h - * syscalls.cc: add winnls.h - * uinfo.cc: ditto - -Thu Jul 27 10:24:36 2000 Egor Duda - - * fhandler.cc (fhandler_disk_file::fstat): Allow block calculation to - succeed for files >= 2GB and <= 4GB. - -Wed Jul 26 16:05:04 2000 Christopher Faylor - - * exceptions.cc (signal_exit): Renamed from "really_exit". Always sets - EXIT_SIGNAL bit and reorganizes exit value for backwards cygwin - handling. - (handle_exceptions): Call signal_exit. Set "core dumped" bit. - (sig_handle): Call signal_exit. Set "core dumped" bit appropriately. - -Wed Jul 26 20:44:00 2000 Corinna Vinschen - - * environ.cc (posify): Revert previous patch. - (_addenv): Remove check_null_empty_path from here. - (putenv): Call check_nullempty_path. - (setenv): Call check_nullempty_path for name as well here. - Don't report an error if value is empty string. - (environ_init): Revert usage of newp. - -Wed Jul 26 14:32:38 2000 Egor Duda - - * syscalls.cc (stat_worker): Make stat return correct st_blocks for - files with size bigger than 2Gb and less than 4Gb - -Wed Jul 26 17:43:00 2000 Corinna Vinschen - - * security.cc (lookup_name): Search on local machine first if - myself->domain is not empty. - -2000-07-26 DJ Delorie - - * fhandler_console.cc (fhandler_console::read): Explicitly set cursor - to make it visible while waiting in WaitForMultipleObjects. - -Wed Jul 26 10:59:00 2000 Corinna Vinschen - - * passwd.cc: Change name of passwd_in_memory_p to passwd_state. - Change type to enum. Change storage class to static. Adjust comments. - (read_etc_passwd): Set passwd_state to different values when loaded - from file in contrast to being emulated. - (search_for): Return default passwd entry if passwd is emulated or - it's a request for the current user. Otherwise return NULL. - -Tue Jul 25 21:50:42 2000 Christopher Faylor - - * syscalls.cc (statfs): Use path_conv method to convert input path. - -Tue Jul 25 21:40:51 2000 Christopher Faylor - - * syscalls.cc (_link): Avoid extraneous call to - cygwin_conv_to_win32_path. - -Tue Jul 25 21:11:15 2000 Christopher Faylor - - * environ.cc (_addenv): New function. Subsumes functionality of - putenv/setenv. Does not allocate space for putenv case. - (putenv): Use _addenv to add a value to the environment. - (setenv): Ditto. - (environ_init): Don't malloc space for each entry in the environment - table. Just use the space from GetEnvironmentStrings. - (posify): Don't free the src argument since it is no longer malloced. - -Mon Jul 24 21:10:00 2000 Corinna Vinschen - - * syscalls.cc (_link): Corrected previous patch. - -Mon Jul 24 13:26:00 2000 Corinna Vinschen - - * fhandler.h (class fhandler_dev_random): Add members for managing - pseudo randomness. - * fhandler_random.cc: Rearrange. Use pseudo random number generator - as entropy source if system entropy isn't available and if device is - used as /dev/urandom. Allow initializing device by calling write(). - -Sun Jul 23 23:11:00 2000 Corinna Vinschen - - * fhandler.h: Add comment. - -Sun Jul 23 20:00:00 2000 Corinna Vinschen - - * fhandler.h (class fhandler_dev_raw): Add private member `varblkop' - to be set when variable blocksize mode is on. - * fhandler_raw.cc: Eliminate `\n' from trace output. - (clear): Set `varblkop' to 0. - (dup): Copy varblkop as well. - (writebuf): Care for variable blocksize. - (open): Ditto. - (raw_read): Ditto. - (raw_write): Ditto. - * fhandler_tape.cc (open): Ditto. - (ioctl): Ditto. Some cleanups. - -Sat Jul 22 18:40:00 2000 Corinna Vinschen - - Patch suggested by Kazuhiro Fujieda . - * winsup.h: Add new macros sys_wcstombs and sys_mbstowcs. - * syscalls.cc (_link): Replace calls to mbstowcs by call to - sys_mbstowcs. - * uinfo.cc (internal_getlogin): Replace calls to wcstombs and - mbstowcs by calls to sys_wcstombs and sys_mbstowcs. Replace - usage of constants by meaningful defines. Use result of - GetSystemDirectory for HOMEPATH and HOMEDRIVE as a last resort. - -Fri Jul 21 21:33:00 2000 Corinna Vinschen - - * spawn.cc (span_guts): Retrieve security attributes before setting - psid to NULL. - -Fri Jul 21 12:03:00 2000 Corinna Vinschen - - * security.cc (acl_worker): Use stat_suffixes in call to path_conv - just as in `stat_worker'. - -Wed Jul 19 22:24:00 2000 Corinna Vinschen - - * spawn.cc (spawn_guts): Don't restore impersonation in case - of _P_OVERLAY. Clean up slightly. Accommodate comments. - -Wed Jul 19 22:11:00 2000 Corinna Vinschen - - * shared.h (class pinfo): New members `root' and `rootlen'. - * syscalls.cc (chroot): Set new root for process. - * path.cc (getcwd_inner): Add parameter to force use of - new root from chroot() call. - (ischrootpath): New macro. - (normalize_posix_path): Care for changed root dir. - (normalize_win32_path): Ditto. - (getcwd_inner): Ditto. - (chdir): Eliminate trailing path component consisting - entirely of dots. - * fork.cc (fork): Copy pinfo members regarding chroot(). - * spawn.cc (_spawnve): Ditto. - * dir.cc (opendir): Don't use computed win32 path if - chroot() took place. - -Mon Jul 17 22:21:34 2000 Christopher Faylor - - * dll_init.cc (dll_list::alloc): Fix debugging output. - -Mon Jul 17 14:57:53 2000 Christopher Faylor - - Throughout, eliminate third argument to path_conv and use new PC_* - constants for second argument. - * dcrt0.cc (dll_crt0_1): Reorganize to allow more initialization prior - to returning due to dynamic loading. - * path.h: Generalize SYMLINK_* constants to PC_*. - (path_conv): Create a new method. Fold third argument into second. - * dll_init.cc (dll_list::alloc): Try harder to find space to allocate - dll struct. - (dll_dllcrt0): Don't check sanity if we've already called dll_crt0. - * path.cc (path_conv::check): Don't check for a null or empty path - unless specifically told with a flag setting. - (check_null_empty_path): New function, adapted from macro. - * syscalls.cc (_rename): Use already-determined file attributes rather - than checking again. - * lib/cygwin/cygwin_attach.dll.c (cygwin_attach_dll): Use a static - per_process structure since this is apparently supposed to be zeroed. - * lib/cygwin_crt0.c (cygwin_crt0): Zero per_process structure sent to - older DLLs. - -Mon Jul 17 19:39:00 2000 Corinna Vinschen - - Patch suggested by Eric Fifer - * poll.cc (poll): Fix erroneous negations. - -Mon Jul 17 17:56:00 2000 Corinna Vinschen - - * environ.cc (setenv): Use __cygwin_environ instead of - environ after reallocating environment space. - -Sun Jul 16 20:23:21 2000 Christopher Faylor - - * _cygwin_crt0_common.cc: Undef 'environ' or suffer compiler error. - -Sun Jul 16 16:03:00 2000 Christopher Faylor - - * environ.cc: Use new definition of "environ" throughout. - (environ_init): Explicitly initialize __cygwin_environ. - (cur_environ): New function. Detects when user has updated - their environment. - * exec.cc: Use 'environ' define throughout rather than __cygwin_environ. - * spawn.cc: Ditto. - * winsup.h: Declare cur_environ, main_environ, environ. - -Sun Jul 16 13:23:04 2000 Christopher Faylor - - * acconfig.h: Add support for NEWVFORK. - * config.h.in: Ditto. - * configure.in: Add --enable-vfork option. - * configure: Regenerate. - * dcrt0.cc (quoted): Detect and fix up quoted backslashes. - * sigproc.cc (proc_subproc): Correctly name handle of newly added child - process to avoid erroneous debugging messages about closing the wrong - handle. - -Sun Jul 16 02:30:09 2000 Christopher Faylor - - * spawn.cc (spawn_guts): Use \ for quoting '"'. - * dcrt0.cc (quoted): Understand \ quoting for '"'. - -Sun Jul 16 00:32:58 2000 Christopher Faylor - - * dcrt0.cc (build_argv): Strip quotes from argv[0] since it should - never be globified. - -Sat Jul 15 00:32:41 2000 Christopher Faylor - - * dll_init.cc (dll_list::alloc): Round correctly. Use VirtualAlloc - since shared file mapping is unnecessary. - (dll_list::detach): Release memory via VirtualFree since there we no - longer use shared file mapping. - -Fri Jul 14 22:40:22 2000 Christopher Faylor - - * hinfo.cc (hinfo::linearize_fd_array): Make max_used_fd an int so that - we can detect when there are no fds to pass. - * dcrt0.cc (host_dependent_constants::init): Revert Sat Mar 18 01:32:04 - 2000 change. - (dll_crt0_1): Set "cygwin_finished_initializing" flag. - (dll_crt0): Don't perform memcpy if uptr is already set to internal - structure. - (_dll_crt0): Remember location of programs envptr. - * dll_init.h (per_module, dll, dll_list): Revamp. - * dll_init.cc: Revamp. Use new classes. - * fork.cc (fork): Use new revamped dll, dll_list, and per_module stuff. - * environ.cc: Use __cygwin_environ throughout rather than the - user_data->envptr. - * exec.cc: Ditto. - * spawn.cc: Ditto. - * winsup.h: Declare update_envptrs, cygwin_finished_initializing. - * lib/_cygwin_crt0_common.cc (_cygwin_crt0_common): Revert previous - change. - * lib/cygwin_attach_dll.cc (cygwin_attach_dll): Always pass in own - per_process structure or we end up overwriting information from the - main program. - -Wed Jul 12 00:46:00 2000 Christopher Faylor - - * debug.cc (thread_stub): Use impure_ptr in place of reent_data. - * dll_init.cc (dll_dllcrt0): Replace erroneous use of local symbol with - correct __cygwin_user_data->impure_ptr. - -Wed Jul 12 00:01:03 2000 Christopher Faylor - - * lib/_cygwin_crt0_common.cc (_cygwin_crt0_common): Don't reset - environ if already set. - -Mon Jul 10 19:07:03 2000 Christopher Faylor - - * fhandler_console.cc (fhandler_console::read): Unicode interface - to ReadConsoleInput only exists on W2K, so use workaround from - Kazuhiro Fujieda . - -Mon Jul 10 11:30:00 2000 Christopher Faylor - - * Makefile.in (install): Install textmode.o as well as binmode.o. - * fhandler_console.cc (fhandler_console::read): Use UNICODE when - reading from the console and translate to ASCII from that. - -Sun Jul 9 21:52:00 2000 Corinna Vinschen - - * spawn.cc (spawn_guts): Close handle `hToken' only if it's not - copied from myself->token. - * syscalls.cc (seteuid): Replace CopySid by memcpy which is foolproof - here. - -Sun Jul 9 01:19:06 2000 Christopher Faylor - - * cygwin.din: Export _getmode and getmode to allow querying of binary - state of an fd. - * external.cc (cygwin_internal): Add handling of perfile_table setting. - * fhandler.cc (perfile_table): New global. - (fhandler_base::get_default_fmode): New method to return a file's - default mode based on its name. - (fhandler_base::open): Use get_default_mode method to determine a - file's mode. Record file mode in file flags. - * fhandler.h (fhandler_base): Declare get_default_fmode - * syscalls.cc (getmode): New function. - * sys/cygwin.h (__cygwin_perfile): New structure. - (cygwin_getinfo_types): Move outside of WINVER conditional. - (per_process): Move inside of WINVER conditional. - -Sat Jul 8 00:15:01 2000 Christopher Faylor - - * external.cc (cygwin_internal): Export __cygwin_user_data. - * include/sys/cygwin.h: Allow definition of per_process even when not - compiling with C++. - (cygwin_getinfo_types): Add CW_USER_DATA. - * lib/_cygwin_crt0_common.cc (_cygwin_crt0_common): Get - __cygwin_user_data pointer from cygwin_internal. If it doesn't exist, - return failure. Use either this pointer or passed in pointer - throughout. Clear forkee. - * lib/crt0.h: Accommodate argument changes to _cygwin_crt0_common. - * lib/cygwin_attach_dll.c (cygwin_attach_dll): Reorganize to allow use - of newer binaries with older DLLs. Detect older DLLs when - _cygwin_crt0_common returns 0 and allocate space for a per_process - structure on the stack. - * lib/cygwin_crt0.c (cygwin_crt0): Ditto. - -Fri Jul 7 10:31:00 2000 Corinna Vinschen - - * include/sys/cygwin.h: Hide internal data types in per_process - when not __INSIDE_CYGWIN__. - -Wed Jul 5 18:56:58 2000 Christopher Faylor - - * dcrt0.cc (__cygwin_user_data): Initialize. - (dll_crt0_1): Eliminate user_data initialization. - (dll_crt0): Set up impure_ptr_ptr for older executables. - (cygwin_dll_init): Eliminate user_data initializations. - (__api_fatal): Don't check for user_data initialization. - * dll_init.cc (struct dll): Store entire contents of per_process rather - than just a pointer. - (add): Ditto. - (initOneDll): Don't check for user_data initialization. - (DllList::recordDll): Store contents of per_process argument. - (DllList::detachDll): Pass address of per_process field. - (DllList::initAll): Ditto. - (DllList::doGlobalDestructorsOfDlls): Ditto. - (DllListIterator::operator *): Ditto. - (dll_dllcrt0): Default to __cygwin_user_data if arg is NULL. - * include/sys/cygwin.h: Reorganize per_process to eliminate obsolete - fields and accommodate new way of initializing. - * lib/_cygwin_crt0_common: Initialize _impure_ptr from - __cygwin_user_data.impure_ptr. - -2000-07-04 Vadim Egorov - - * exceptions.cc (try_to_debug): Prevent recursive spawning of JIT - debugger. Treat special event from debugger as command to continue. - -Mon Jul 4 19:29:00 2000 Corinna Vinschen - - * poll.cc (poll): Zero out `open_fds' as well. - -Mon Jul 4 1:22:00 2000 Corinna Vinschen - - * include/cygwin/version.h: Bump API minor version to 24. - -2000-07-04 Kazuhiro Fujieda - - * security.cc (read_sd): Eliminate OemToChar. - -Mon Jul 4 18:57:00 2000 Corinna Vinschen - - * poll.cc: New file. Implement `poll' system call. - * include/poll.h: Ditto. - * include/sys/poll.h: Ditto. - * Makefile.in: Add poll.o as dependency. - * cygwin.din: Add poll and _poll symbols. - -2000-07-04 Kazuhiro Fujieda - - * dcrt0.cc (dll_crt0_1): Eliminate SetFileApisToOEM and CharToOem. - * (dummy_autoload): Add functions used in fhandler_console. - * fhandler_console.cc (fhandler_console::read): Use ENCHANCED_KEY flag - to distinguish extended keys. Translate an input character from the - OEM code page to the ANSI code page. - * (fhandler_console::write_normal): Translate output characters from - the ANSI code page to the OEM code page. - * syscalls.cc (_link): Use MultiByteToWideChar instead of OemToCharW. - -Mon Jul 3 16:09:16 2000 Christopher Faylor - - * exceptions.cc (stack_info::walk): Use method to find offset. - (handle_exceptions): Be more assertive in finding ebp for use under - W2K. Create a dummy stack frame for cases where program is dying and a - stack dump is being output. - (sig_handle): Fill out a GetThreadContext for use with a user-generated - "core dump". - -Mon Jul 3 10:53:00 2000 Corinna Vinschen - - * include/cygwin/socket.h: Remove SOCK_PACKET define since it's - not supported by Windows sockets. - -Sun Jul 2 21:50:48 2000 Christopher Faylor - - * dcrt0.cc (user32_init): Add primitive guard against concurrent - attempts to call this function. Also add temporary debugging code to - display a message if the function is called multiple times. - (api32_init): Ditto. - -Sun Jul 2 10:39:00 2000 Corinna Vinschen - - * winsup.h: Define MAX_SID_LEN and new MAX_HOST_NAME. - * fork.cc (fork): Use above defines instead of numerical constants. - * shared.cc (sec_user): Ditto. - * shared.h (class pinfo): Ditto. - * syscall.cc (seteuid): Ditto. - * spawn.cc (_spawnve): Ditto. Eliminate conditional. - (spawn_guts): Set child->uid = USHRT_MAX when user context will be - changed in child process. - * uinfo.cc (uinfo_init): Check for myself->uid instead of myself->psid - to avoid reloading of /etc/passwd on process startup if ntsec is off. - Use above defines instead of numerical constants. - * security.cc: Move define for MAX_SID_LEN to winsup.h. - -Sun Jul 2 1:57:00 2000 Corinna Vinschen - - * uinfo.cc (uinfo_init): Eliminate calls to read_etc_group() - and read_etc_passwd(). - -2000-06-28 Kazuhiro Fujieda - - * assert.cc (__assert): Reduce dependency on newlib. - * exec.cc: Eliminate unnecessary inclusion of ctype.h. - * glob.c: Ditto. - * hinfo.cc: Ditto. - * init.cc: Ditto. - * strace.cc: Ditto. - * tty.cc: Ditto. - * grp.cc (parse_grp): Eliminate atoi. - * passwd.cc (grab_int): Ditto. - * grp.cc (getgroups): Eliminate str{n,}casecmp. - * path.cc (get_raw_device_number): Ditto. - * path.cc (sort_by_native_name): Ditto. - * spawn.cc (iscmd): Ditto. - * uinfo.cc (internal_getlogin): Ditto. - -Sat Jul 1 11:43:32 2000 Christopher Faylor - - * binmode.c (cygwin_premain0): Fix erroneous clearing of bit. - * textmode.c (cygwin_premain0): Ditto. - -Sat Jul 1 00:24:04 2000 Christopher Faylor - - * dcrt0.cc (_dll_crt0): Renamed from dll_crt0 (). - * winsup.h: Accommodate above change. - * cygwin.din: Ditto. - * lib/cygwin_crt0.c: Ditto. - -Fri Jun 30 23:21:40 2000 Christopher Faylor - - * Makefile.in: Use variables rather than configure constructs where - appropriate. - (LIBCOS): Find additional stub library stuff in their own subdirectory. - * dcrt0.cc: Convert user_data pointer to static __cygwin_user_data - area. - (do_global_ctors): Check magic_bisquit for initialization. - (dll_crt0_1): First group of premain functions prior to fd - initialization. Run second group before calling main. - (dll_crt0 ()): New function, called from new initialization code. - (dll_crt0 (per_process *uptr)): Call new dll_crt0 () function on - initialization. - * debug.cc (thread_stub): Initialize bottom of stack with per-thread - info. - * environ.cc (parse_thing): Use binmode global to control - CYGWIN=binmode behavior. - * fhandler.cc (fhandler_base::open): Allow explicit setting of __fmode - to O_BINARY or O_TEXT to override disk mount settings. - * libcmain.cc: Move to lib subdirectory. - * libccrt0.cc: Ditto. - * dll_main.cc: Ditto. - * dll_entry.cc: Ditto. - * getopt.c: Ditto. - * thread.cc (thread_init_wrapper): Call ExitThread explicitly rather - than returning, as a preliminary step towards placing per thread info - at the bottom of the stack. - * winsup.h: Move per_process class to include/sys/cygwin.h. Declare - new dll_crt0(). - * include/cygwin/version.h: Bump API minor version. - * binmode.c: New file. - * textmode.c: Ditto. - * perthread.h: Ditto. - * lib/_cygwin_crt0_common.cc: Ditto. - * lib/crt0.h: Ditto. - * lib/cygwin_attach_dll.c: Ditto. - * lib/cygwin_crt0.c: Ditto. - * lib/dll_entry.cc: Ditto. - * lib/dll_main.cc: Ditto. - * lib/getopt.c: Ditto. - * lib/libcmain.c: Ditto. - * lib/premain0.c: Ditto. - * lib/premain1.c: Ditto. - * lib/premain2.c: Ditto. - * lib/premain3.c: Ditto. - -Wed Jun 28 19:36:00 2000 Corinna Vinschen - - * syscalls.cc (seteuid): Initialize pi.token before calling - internal_getlogin(). - * uinfo.cc (internal_getlogin): Use impersonation token instead - of process token in case of active impersonation. Add some comments. - (uinfo_init): Initializing myself->token and myself->impersonated - before calling internal_getlogin(). Add some comments. - -Mon Jun 26 18:32:41 2000 Christopher Faylor - - * windows.cc (setitimer): Round up when < 1000 usecs. - -Mon Jun 26 17:34:54 2000 Christopher Faylor - - * hinfo.cc (hinfo::dup2): Eliminate compiler warning. - -Mon Jun 26 11:25:29 2000 Christopher Faylor - - * hinfo.cc (hinfo::dup2): Guard against out of bounds newfd. - -Sat Jun 24 23:43:06 2000 Christopher Faylor - - * grp.cc (read_etc_group): Open file in text mode. - * pwd.cc (read_etc_passwd): Ditto. - * shared.h: Bump PROC_MAGIC. - -Sat Jun 24 19:30:00 2000 Corinna Vinschen - - * fork.cc (fork): Fix error in copying SID pointer. - * spawn.cc (_spawnve): Ditto. - * passwd.cc: Remove static from `passwd_in_memory_p'. - (read_etc_passwd): Remove static. - * uinfo.cc: Move global declaration of `read_etc_group' and - `group_in_memory_p' into `uinfo_init'. - (internal_getlogin): Try to get SID from current process first. - (uinfo_init): Don't set uid and gid if `myself' has a valid SID. - Only load /etc/passwd and /etc/group in that case. - -Sat Jun 24 12:29:59 2000 Christopher Faylor - - * shared.cc (shared_info::initialize): Improve error message clarity. - * mkvers.sh: Eliminate debugging output. - -Thu Jun 22 17:50:59 2000 Christopher Faylor - - * Makefile.in: Autogenerate cygwin.def when appropriate. - * include/sys/cygwin.h: Correct prototype. - -Thu Jun 22 17:05:04 2000 Christopher Faylor - - * include/sys/cygwin.h: Don't define parts of this file that rely on - Windows headers unless the Windows header was previously included. - -Thu Jun 22 20:45:00 2000 Corinna Vinschen - - * registry.cc (load_registry_hive): Use HKEY_USERS when checking - for existing user hive. - Use MAX_PATH instead of numerical constant for array size. - Use return code of RegLoadKeyA instead of GetLastError for error output. - -Thu Jun 22 14:27:04 2000 Christopher Faylor - - * Makefile.in: Add new-libcygwin.a back to all_host target. - -Wed Jun 21 14:32:42 2000 Christopher Faylor - - * Makefile.in: Add *.def to clean operation. - -Wed Jun 21 13:18:23 2000 Christopher Faylor - - * Makefile.in: Add *.exe to clean operation. - -Wed Jun 21 01:02:38 2000 Christopher Faylor - - * mkvers.sh: Fix sed usage for older seds. - -Tue Jun 20 20:46:28 2000 Christopher Faylor - - * Makefile.in: Don't touch winver_stamp if mkvers.sh was unsuccessful. - -Tue Jun 20 17:41:30 2000 Christopher Faylor - - * mkvers.sh: Fix problem with handling of CVS tags causing .rc syntax - errors. - -Tue Jun 20 13:38:12 2000 Christopher Faylor - - * Makefile.in: Change to build the DLL during a cross-compiler build. - -Mon Jun 19 20:46:33 2000 Christopher Faylor - - * select.cc (socket_cleanup): Shutdown I/O on dummy sockets prior to - closing them. - -Mon Jun 19 19:35:00 2000 Corinna Vinschen - - * dcrt0.cc: Add load statements for `GetSidIdentifierAuthority' - and `RegLoadKeyA'. - * registry.cc (get_registry_hive_path): New function. - (load_registry_hive): Ditto. - * security.cc (convert_sid_to_string_sid): New function. - (get_ssid): Renamed to `convert_string_sid_to_sid'. - (get_pw_sid): Call `convert_string_sid_to_sid' instead of `get_ssid'. - (get_gr_sid): Ditto. - (get_admin_sid): Ditto. - (get_system_sid): Ditto. - (get_creator_owner_sid): Ditto. - (get_world_sid): Ditto. - * shared.h: New prototypes for `get_registry_hive_path' and - `load_registry_hive'. - * spawn.cc (spawn_guts): Set child->psid to NULL to force calling - `internal_getlogin' from child process in case of changing user context. - Call `load_registry_hive' in case of changing user context. - (_spawnve): Copy user infos only if user context remains the same. - * uinfo.cc: Add load statement for `NetUserGetInfo'. - Remove load statement for `NetGetDCName'. - (internal_getlogin): Rewrite to speed up process startup - and to correct user environment in case user context changes. - (uinfo_init): Call internal_getlogin only if myself->psid is NULL, - that is user context changes. - * winsup.h: Add prototypes for `convert_sid_to_string_sid', - `convert_string_sid_to_sid' and `get_pw_sid'. - -Sun Jun 18 13:42:50 2000 Christopher Faylor - - * fhandler.h (set_name): Don't use 'unix' as name since this is defined - by gcc now. - * fhandler.cc (set_name): Ditto. - -2000-06-17 Kazuhiro Fujieda - - * winsup.h (isabspath): Don't report `C:foo' as an absolute path. - -Sat Jun 17 13:51:48 2000 Christopher Faylor - - * configure.in: Detect "cross-hosting" situation and set appropriate - variables in Makefile to avoid building excess stuff. - * configure: Regenerate. - * Makefile.in: Accommodate above change. - -Sat Jun 17 19:52:00 2000 Corinna Vinschen - - * pinfo.cc (pinfo_init): Revert previous patch. - -Sat Jun 17 13:29:00 2000 Corinna Vinschen - - * pinfo.cc (pinfo_init): Add missing initializers. - * uinfo.cc (internal_getlogin): Request domain infos only - when ntsec is ON. - -Fri Jun 16 19:27:27 2000 Christopher Faylor - - * Makefile.in: Just use library files from this tree when building - cygrun.exe. - * path.cc (chdir): Don't set cache to offending chdir. Change comment - to reflect current reality. - -Fri Jun 16 20:55:00 2000 Corinna Vinschen - - * cygwin.din: Define symbols for `cygwin_logon_user' and - `cygwin_set_impersonation_token'. - * dcrt0.cc (dll_crt0_1): Eliminate superfluous conditional - statements. - Add load statements for `ImpersonateLoggedOnUser', `LogonUserA' - and `RevertToSelf'. - * fork.cc (fork): Care for correct impersonation of parent - and child process. - * security.cc (cygwin_set_impersonation_token): New function. - (cygwin_logon_user): Ditto. - shared.h (class pinfo): New members `orig_uid', `orig_gid', - `real_uid' nad `real_gid'. - spawn.cc (spawn_guts): Care for impersonation when starting - child process in a different user context. - * syscalls.cc (setgid): Call `setegid' now. Set real_gid. - (setuid): Call `seteuid' now. Set real_uid. - (seteuid): Functionality moved from setuid to here. Care for - correct impersonation. - (setegid): Functionality moved from setgid to here. - * uinfo.cc (uinfo_init): Initialization of additional pinfo - members. - (getuid): Return real uid. - (getgid): Return real gid. - (geteuid): Return effective uid. - (getegid): Return effective gid. - include/sys/cygwin.h: Add prototypes for `cygwin_logon_user' and - `cygwin_set_impersonation_token'. - include/cygwin/version.h: Bump API minor version to 22. - -Thu Jun 15 15:43:50 2000 Christopher Faylor - - * path.cc (normalize_posix_path): Convert path to POSIX if it seems to - be a Windows path. - -2000-06-15 Kazuhiro Fujieda - - * path.cc (mount_info::add_item): Eliminate a trailing backslash - included in a native path starting with '//[A-Za-z]/...'. - * path.cc (mount_info::del_item): Accept a native path as its target. - -Wed Jun 14 23:47:19 2000 Christopher Faylor - - * environ.cc (conv_envvars): Detect and convert all environment - variables used by libiberty's choose-temp.c - -Tue Jun 13 12:41:41 2000 Kazuhiro Fujieda - - * path.cc (mount_info::add_item): The previous patch can't handle - the case of overwriting a mount entry. - -Tue Jun 13 00:17:04 2000 Christopher Faylor - - * thread.h: Shorten "current_directory" variables to "cwd_*" - throughout. - * path.cc: Ditto. - (normalize_posix_path): Add some extra debugging info. - (chdir): Ditto. Store chdir'ed posix and MS-DOS directory names in - "cache" here rather than trying to derive them later. - -Sun Jun 11 15:57:00 2000 Corinna Vinschen - - * fhandler_random.cc (read): Call CryptAquireContext with - CRYPT_VERIFYCONTEXT. - -Thu Jun 8 22:49:00 2000 Corinna Vinschen - - * path.cc (path_conv::check): Erase two lines checked in - by mistake. - -Thu Jun 8 15:53:00 2000 Corinna Vinschen - - * fhandler.cc (fhandler_disk_file::open): Check for directory - to set O_DIROPEN on directories anyway. - -2000-06-07 Kazuhiro Fujieda - - * path.cc (mount_info::init): Eliminate the mount_slash feature. - (mount_slash): Eliminated. - (mount_info::read_mounts): Eliminate looking up existing entries. The - loop for deleting cygpath entries is done only when such entries exist. - (mount_info::from_registry): Eliminate sorting. - (mount_info::add_item): Call add_reg_mount if necessary. Check nmounts - more precisely. Use strcasematch in looking up existing entries. - (mount_info::del_item): Call del_reg_mount if necessary. Use - strcasematch. Use memmove instead of memcpy. - (mount_info::import_v1_registry): Everything is done in this method. - (mount_info::to_registry): Eliminated. - (mount_info::from_v1_registry): Eliminated. - (cygwin_umount): Simply call del_item. - * shared.h: Modify the declaration of add_item and del_item. Remove the - declaration of from_v1_registry. - -Wed Jun 7 23:56:10 2000 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor version number to 3. - -2000-06-07 DJ Delorie - - * cygwin.din: add cygwin_dll_init - * dcrt0.cc (cygwin_dll_init): new - (dll_crt0_1): short circuit if manually loaded - * path.cc (mount_info::init): don't init if manually loaded - -Wed Jun 7 13:47:00 2000 Corinna Vinschen - - * include/netinet/in_systm.h: New file. - * include/cygwin/in_systm.h: Ditto. - -Thu Jun 1 01:55:45 2000 Christopher Faylor - - * exceptions.cc: Remove unneeded include. - * dcrt0.cc: Wrap LoadDLLfunc stuff in dummy function. - * init.cc: Ditto. - * uinfo.cc: Ditto. - -2000-05-31 DJ Delorie - - * include/cygwin/version.h: use decimal, NOT octal - -Wed May 31 16:40:00 2000 Corinna Vinschen - - * fhandler.cc (fhandler_disk_file::open): Check for executable - even if ntsec is on if filesystem doesn't support ACLs. - -Wed May 31 15:57:00 2000 Corinna Vinschen - - * dcrt0.cc: Use LoadDLLfuncEx for loading Crypto API functions - with parameter `notimp' set to 1. - -Tue May 30 16:58:33 2000 Christopher Faylor - - * path.cc (mount_info::conv_to_win32_path): Previous patch was too - aggressive in adding a trailing slash. - -Mon May 29 20:31:01 2000 Christopher Faylor - - * Makefile.in: Remove libadvapi32.a. - * autoload.h: Add additional field to autoload block for handling - unimplemented functions. - (LoadDLLfuncEx): New function which accepts additional parameter for - controlling unimplemented function behavior. - (LoadDLLfunc): Use LoadDLLfuncEx. - * dcrt0.cc: Use new arguments for LoadDLLfunc. Add advapi32 routines. - (noload): Rewrite in assembler. Handle new unimplemented function - type. - * exceptions.cc: Eliminate another vestige of StackWalk stuff. - * net.cc: Use new arguments for LoadDLLfunc. - * uinfo.cc: Ditto. - -Mon May 29 20:18:47 2000 Christopher Faylor - - * config.h.in: Remove obsolete define. - * path.h (isdrive): New macro. - * dcrt0.cc (globify): Use new macro to determine if a string refers to - an MS-DOS drive. - * environ.cc (winenv): Ditto. - * spawn.cc (find_exec): Ditto. - * path.cc (get_raw_device_number): Ditto. - (mount_info::conv_to_posix_path): Ditto. - (chdir): Ditto. - (cygwin_posix_path_list_p): Ditto. - (cygwin_split_path): Ditto. - (path_conv::check): Move tmp_buf to beginning of function since it can - be used earlier in the loop. Use tmp_buf rather than 'root' to hold - root information. - (mount_info::conv_to_win32_path): Add trailing slash to end of mount - path when it translates to a drive. Add defensive code to avoid - writing beyond the end of 'dst'. - -Sat May 27 15:57:00 2000 Corinna Vinschen - - * fhandler_random.cc (read): Use CRYPT_MACHINE_KEYSET in - call to CryptAcquireContext() to serve users that did not - log in interactively. - -Fri May 26 11:16:00 2000 Corinna Vinschen - - * errno.cc (errmap): Map ERROR_BAD_NET_NAME to errno ENOSHARE. - -Fri May 26 02:23:35 2000 Christopher Faylor - - * sigproc.h (sigframe::set): Accept a default frame pointer. - * sigproc.cc (sig_send): Use passed in frame pointer, if appropriate. - -Thu May 25 17:44:25 2000 Christopher Faylor - - * dir.cc (rmdir): Use file attributes that have already been discovered - by path_conv. - -2000-05-25 Kazuhiro Fujieda - - * dir.cc (rmdir): Correct the manner in checking the target directory. - -Wed May 24 21:59:00 2000 Corinna Vinschen - - * dir.cc (writable_directory): Comment out previous code, - return always 1 for now. - (mkdir): Call set_file_attribute explicitely with S_IFDIR mode bit. - * syscalls.cc (chown_worker): Ditto. - (chmod): Ditto. - * security.cc (get_nt_attribute): Fix error in debug output. - Never set FILE_DELETE_CHILD for files. - Construct appropriate inherit attribute according to file type. - -2000-05-23 DJ Delorie - - * syscalls.cc (_cygwin_istext_for_stdio): New, for newlib - * include/cygwin/version.h: Bump API number for detect old - programs using old getc/putc macros - -2000-05-23 DJ Delorie - - * dir.cc (writable_directory): handle root directories - -Tue May 23 10:09:26 2000 Christopher Faylor - - * uname.cc (uname): Use a "s" to denote a snapshot to avoid confusion - with the number "5". - -Tue May 23 10:01:07 2000 Christopher Faylor - - * path.cc (mount_info::conv_to_posix_path): Avoid putting a trailing - slash on a directory name when the ms-dos path spec is a root directory - of a device. - * registry.cc (reg_key::build_reg): Set 'key_is_invalid' flag rather - than using an INVALID_HANDLE_KEY. - (reg_key::get_int): Test for key validity before performing registry - operations. - (reg_key::set_int): Ditto. - (reg_key::get_string): Ditto. - (reg_key::set_string): Ditto. - (reg_key::kill): Ditto. - (reg_key::~reg_key): Ditto. - -Tue May 23 01:13:33 2000 Christopher Faylor - - * mkvers.sh: Use snapshot date as build date since it is more - interesting. - * uname.cc (uname): Detect if this is a snapshot build and add an "S" - to the version number. Report the snapshot date as the release date. - -Mon May 22 17:11:25 2000 Christopher Faylor - - * environ.cc (regopt): Scan HKLM if HKCU scan fails. - -Mon May 16 23:39:00 2000 Corinna Vinschen - - * dir.cc (rmdir): Care for misleading error messages - when trying to remove a directory on a samba share. - Eliminate superfluous else branch. - * syscalls.cc (_rename): Additional check for ERROR_FILE_EXISTS - if MoveFile fails. - -Sun May 21 20:51:44 2000 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Move uinfo_init call to before sigproc_init to - avoid a race. - (noload): Add an extra argument for debugging. - * uinfo.cc (uinfo_init): Eliminate test for multiple calls. - (getlogin): Assume that uinfo_init has already been called. - -Sat May 20 01:34:57 2000 Christopher Faylor - - * exceptions.cc (interruptible): Add an argument to control whether - function just checks for validity. Flag module handle == 0 as - noninterrupible. - (call_handler): Always acquire and release ebp lock. Loop for only a - fixed amount of time attempting to grab mutos and find an interruptible - PC. - -2000-05-19 DJ Delorie - - * syscalls.cc (setmode): change mode of any matching FILE* also. - -Thu May 18 17:28:19 2000 Christopher Faylor - - * Makefile.in: Remove external.h dependency. - * dcrt0.cc (sigthread::init): Move here from sigproc.h. - * sigproc.h (sigthread): Move init to dcrt0.cc. - -Thu May 18 01:28:02 2000 Christopher Faylor - - * select.cc (thread_pipe): Add paranoid check to ensure thread - termination. - * external.cc: Eliminate obsolete include. - * getopt.c (getopt_long): Fix compiler warning. - * shared.h: Moved PID_ definitions to include/sys/cygwin so that they - can be used by external programs. - * include/sys/cygwin.h: Move external definitions here. Include - sys/resource.h to avoid having to do this everywhere. - -Thu May 18 01:04:02 2000 Christopher Faylor - - * sigproc.h (sigframe): Don't set frame info unless tid matches this - thread id. - -Wed May 17 23:13:32 2000 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Initialize mainthread stuff here before - anything needs it. - * sigproc.cc (sigproc_init): Move mainthread initialization out of - here. - * sigproc.h (sigthread): Add init() method. - (sigframe): Don't try to initialize muto. - * sync.cc: Undef WaitForSingleObject to avoid recursion. - -2000-05-17 DJ Delorie - - * testsuite/winsup.api/crlf.c: New - * testsuite/winsup.api/iospeed.c: New - -Wed May 17 01:05:52 2000 Christopher Faylor - - * path.cc (mount_info::cygdrive_posix_path): Don't add trailing slash - if referring to something like c:\. - * dcrt0.cc (dll_crt0_1): Move uinfo initialization prior to sig_send - initialization to give signal thread a chance to finish. - * debug.cc (WFSO): Move to sigproc.cc - (WFMO): Ditto. - * exceptions.cc (interruptible): Allocate slightly more space for - directory just for paranoia's sake. - (call_handler): Eliminate nonmain argument. Determine if main thread - has set a frame pointer and use it if so. - (sig_handle): Eliminate nonmain argument. - * net.cc: Record frame information in appropriate routines throughout. - * select.cc (select): Ditto. - * sigproc.cc: Use sigthread structure to record mainthread id - throughout. - (sig_send): Record frame information for signal handler. - (wait_sig): Reflect argument change in sig_handle. - (WFSO): Move here and record frame information for signal handler. - (WFMO): Ditto. - * sigproc.h: Implement new "sigthread" class. Implement "sigframe" - class for manipulating signal frame info. - * thread.cc (__pthread_kill): Use standard _kill() function rather than - calling sig_send directly. - * winsup.h: Eliminate ebp element from signal_dispatch class. - -Tue May 16 23:39:00 2000 Corinna Vinschen - - Patch suggested by John Rowley - * fhandler_tape.cc (fhandler_dev_tape::ioctl): Check - for filemark feature on MTWEOF operation. - -Tue May 16 11:49:13 2000 Christopher Faylor - - * include/cygwin/in.h (AF_INET6): Use correct in6_addr struct. - -Mon May 15 00:35:35 2000 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor version number to 2. - -Sun May 14 23:41:24 2000 Christopher Faylor - - * shared.h: Bump PROC_MAGIC. - * include/cygwin/version.h: Bump API minor to accommodate two recent - exports. - -2000-05-13 Mumit Khan - - * include/cygwin/socket.h (AF_INET6): Use same value as winsock2. - -2000-05-12 Mumit Khan - - * include/cygwin/in.h (struct in6_addr): Fix spelling. - * include/cygwin/socket.h (AF_INET6, PF_INET6): Define macros. - (AF_MAX, PF_MAX): Bump to 32 to leave room for future expansion. - -Fri May 12 21:35:54 2000 Christopher Faylor - - * dcrt0.cc (build_argv): Remove unneeded variable. - * select.cc (peek_pipe): Don't check for "ready" if it's already set. - (peek_console): Ditto. - (peek_serial): Ditto. - (peek_socket): Ditto. - (peek_windows): Ditto. - -Fri May 12 20:31:00 2000 Corinna Vinschen - - * fhandler_raw.cc (write_file, read_file): New wrapper functions - for WriteFile and ReadFile to get rid of ERROR_MEDIA_CHANGED - and ERROR_BUS_RESET in case of first access to tape. - (fhandler_dev_raw::raw_write): Use write_file instead of WriteFile. - (fhandler_dev_raw::raw_read): Use read_file instead of ReadFile. - -Fri May 12 01:04:57 2000 Christopher Faylor - - * Makefile.in (DLL_OFILES): Sort. - * fhandler_tty.cc (fhandler_tty_slave::send_ioctl_request): Eliminate. - (fhandler_tty_slave::ioctl): Rewrite to avoid races. - -2000-05-11 Mumit Khan - - * mmap.cc (list::erase): Increment loop counter. - (map::erase): Likewise. - -Thu May 11 00:54:00 2000 Charles Wilson - - * cygwin.din: insure that regsub() is included in - cygwin1.dll - -Tue May 9 18:59:41 2000 Christopher Faylor - - * Makefile.in: Use appropriate VARIABLE to refer to cygwin.def in load - line. - -Thu May 9 23:53:00 2000 Corinna Vinschen - - * fhandler.cc (fhandler_base::puts_readahead): Change - while condition to disallow wild runs. - -Thu May 9 15:24:00 2000 Corinna Vinschen - - Patch suggested by - * window.cc (setitimer): Check for overflow condition - in tv_sec. - -Thu May 9 0:47:00 2000 Corinna Vinschen - - Patch suggested by Eric Fifer - * errno.cc: Change mapping of ERROR_BAD_PATHNAME to ENOENT. - -Thu May 9 0:47:00 2000 Corinna Vinschen - - * path.cc (symlink::info): Treat non readable files - as normal non symlink files. - -2000-05-08 Paul K. Fisher - - * include/pthread.h (pthread_detach): Add missing prototype. - (pthread_join): same. - -2000-05-08 DJ Delorie - - * fhandler.cc (lock): use signed math to allow checking ranges - properly. - -Sat May 6 23:22:25 2000 Christopher Faylor - - * dcrt0.cc (insert_file): Eliminate unused parameter. - (build_argv): Ditto. - * exceptions.cc (stack): Eliminate unused parameters. - (stackdump): Ditto. - (cygwin_stackdump): Reflect above changes. - (sig_handle): Ditto. - * fhandler.cc (fhandler_base::set_inheritance): Use kludge to avoid - unused parameter warning. - -2000-05-06 Mumit Khan - - * include/wchar.h (wcscmp, wcslen): Fix prototypes. - * syscalls.cc (wcslen, wcscmp): Adjust. - -Fri May 5 23:32:07 2000 Christopher Faylor - - * errno.cc (errmap): Correct DIRECTORY mapping to ENOTDIR. - -2000-05-04 Mumit Khan - - * Makefile.in (install): Install profile startup and library. - -Wed May 3 21:54:11 2000 Christopher Faylor - - * configure.in: Use -gstabs+ as compile debug option. This seems to - promote better handling of symbols. - * configure: Regenerate. - * delqueue.cc (delqueue_list::process_queue): Allow ERROR_ACCESS_DENIED - to indicate that a file is being shared under Windows 95. - * syscalls.cc (_unlink): Use full path name. Take special action for - Windows 95. Assume that an ERROR_ACCESS_DENIED indicates a sharing - violation unless it's on a remote drive. Punt if there is an - ERROR_ACCESS_DENIED on a remote drive. - -Wed May 3 18:07:00 2000 Corinna Vinschen - - * errno.cc (errmap): Map ERROR_BAD_NETPATH to new errno ENOSHARE. - (_sys_errlist): Add entry for ENOSHARE. - (strerror): Add case for ENOSHARE. - * syscalls.cc (stat_worker): Check for errno ENOSHARE. - -Wed May 3 17:28:00 2000 Corinna Vinschen - - * Makefile.in: Add dependencies for fhandler_random.o - * fhandler.h: Add device type FH_RANDOM. Add class - fhandler_dev_random. - * fhandler_random.cc: New file. Implementation of - fhandler_dev_random. - * hinfo.cc (build_fhandler): Add case for FH_RANDOM. - * path.cc: Add device names for random devices to - windows_device_names. - (get_device_number): Add if branch for random devices. - (win32_device_name): Add device name generation for - random devices. - winsup.h: Include . - -2000-05-02 Kazuhiro Fujieda - - * path.cc (mount_info::conv_to_win32_path): Previous patch - failed to set flags on a win32 path. - -Tue May 2 11:34:00 2000 Corinna Vinschen - - * security.cc (read_sd): Return 1 on success because we - can't rely on the returned SD size from GetFileSecurity. - -Tue May 2 2:22:00 2000 Corinna Vinschen - - * dcrt0.cc: Add dynamic load code for `OemToCharA' from user32.dll. - * security.cc (read_sd): Call `OemToCharA' to make - `GetFileSecurity' happy on filenames with umlauts. - -Wed Apr 26 23:23:23 2000 Christopher Faylor - - * path.cc (normalize_win32_path): Don't add a trailing slash when one - already exists. - (mount_info::conv_to_win32_path): Use existing code for dealing with - relative path names when input is already a win32 path. - -2000-04-26 DJ Delorie - - * Makefile.in (install): install regexp.h - -Wed Apr 26 16:20:00 2000 Corinna Vinschen - - * syscalls.cc (stat_worker): Previous patch could succeed - in stating a non-existant file. - -Wed Apr 26 01:07:16 2000 Christopher Faylor - - * exceptions.cc (interruptible): Allocate slightly more space for - directory name check. Windows 95 seems to null-terminate the directory - otherwise. - (interrupt_on_return): Issue a fatal error if we can't find the - caller's stack. - -Tue Apr 25 16:50:54 2000 Christopher Faylor - - * spawn.cc (find_exec): Accept a path_conv argument rather than a - buffer so that the caller can find things out about a translated path. - (perhaps_suffix): Ditto. - (spawn_guts): Allocate path_conv stuff here so that we can find out - stuff about the translated path (this is work in progress). - * environ.cc (environ_init): Accept an as-yet unused argument - indicating whether we were invoked from a cygwin parent or not. - (winenv): Ditto. - (posify): Accept an argument indicating whether the path has already - been translated. - * dlfcn.cc (check_access): Provide a path_conv buffer to find_exec. - * exec.cc (sexecvpe): Ditto. - * path.cc (path_conv::check): Rename from path_conv::path_conv. - (mount_item::getmntent): Recognize "Cygwin executable" bit. - (symlink_info::check): Remove debugging statements. - * path.h (class path_conv): Add iscygexec method. Rewrite constructor - to call "check" method to allow multiple operations on a path_conv - variable. - * pinfo.cc (pinfo_init): Pass argument to environ_init. - * shared.h: Bump PROC_MAGIC. - * winsup.h: Reflect above changes to function arguments. - * include/sys/mount.h: Add MOUNT_CYGWIN_EXEC type. - -Thu Apr 25 21:35:00 2000 Corinna Vinschen - - * syscalls.cc (stat_worker): Previous patch failed to stat - each drives root dir on 9X. - -Thu Apr 25 16:37:00 2000 Corinna Vinschen - - * fhandler.cc (fhandler_disk_file::open): Check for allow_ntsec - when determining exec flag. - * path.cc (symlink_info::check): Remove call to get_file_attribute(). - * security.cc (read_sd): Rename, ditto for variables to conform - to common naming convention. Use GetFileSecurity() instead of - BackupRead() to avoid permission problems when reading ACLs. - (write_sd): Same renaming as for read_sd(). - (alloc_sd): Change default permissions according to Linux permissions - for group and world when write permission is set. - * syscalls.cc (stat_worker): Avoid different permission problems - when requesting file informations. - -Thu Apr 25 10:50:00 2000 Corinna Vinschen - - * net.cc: Avoid a warning in declaration inet_network. - -Mon Apr 24 17:38:25 2000 Thorsten Otto - - * fhandler_console.cc (fhandler_console::read): Detect extended keycode - information for Windows 9x so that function keys will work correctly. - -2000-04-24 Vadim Egorov - - * net.cc (cygwin_inet_network): new function. - * cygwin.din (inet_network): new export - -Fri Apr 21 10:37:08 2000 Christopher Faylor - - * path.cc (normalize_posix_path): Previous two patches were still - incorrect so rewrite this function to deal with trailing dots. - (mount_info::conv_to_win32_path): Just check for '/' where appropriate. - Eliminate nofinalslash call since it is handled in normalize_posix_path - now. - -Thu Apr 20 17:32:42 2000 Christopher Faylor - - * exceptions.cc (handle_exceptions): Search further for stack info to - accommodate Windows 95. - -Thu Apr 20 16:39:18 2000 Christopher Faylor - - * path.cc (normalize_posix_path): Previous change failed to take root - access into account. - -Thu Apr 20 11:26:00 2000 Corinna Vinschen - - * syscalls.cc (_link): Check new link path for trailing dot. - -Thu Apr 20 00:32:03 2000 Christopher Faylor - - * fhandler.h (fhandler_base::hclose): New virtual method. - (fhandler_base::set_inheritance): Make this a method so that we can use - the appropriate close methods. - * fhandler.cc (fhandler_base::set_inheritance): Ditto. - * path.cc (normalize_posix_path): Eliminate /. trailing path - component. - -Wed Apr 20 0:19:00 2000 Corinna Vinschen - - * syscalls.cc (setuid): Allow switching user context after - successful call to ImpersonateLogedOnUser (NT only). - (setgid): Ditto. - (seteuid): Call setuid. - (setegid): Call setgid. - -Wed Apr 19 22:00:00 2000 Corinna Vinschen - - * uinfo.cc (internal_getlogin): Use NetGetDCName() instead - of NetGetAnyDCName(). - -Mon Apr 17 12:08:47 2000 Kazuhiro Fujieda - - * syscalls.cc (_rename): Try MoveFile() at first before - MoveFileEx(..., MOVEFILE_REPLACE_EXISTING). - -Tue Apr 18 19:15:29 2000 Christopher Faylor - - * dcrt0.cc (globify): Don't use \ quoting when apparently quoting a DOS - path spec, even within a quoted string. - -Sun Apr 16 18:54:21 2000 Christopher Faylor - - * init.cc (dll_entry): Use better check for determining when to set - thread specific stuff. - * syscalls.cc (_unlink): Continue with chmod'ing file even if - DELETE_ON_CLOSE succeeds, if file still exists. - -Fri Apr 14 23:51:15 2000 Christopher Faylor - - * fhandler_console.cc (keytable): Add support for keypad 5 key, which - MS seems to think is equivalent to VK_CLEAR. - * debug.cc (thread_stub): Eliminate initialization of reent stuff. - * init.cc (dll_entry): Move it here. - -Thu Apr 13 18:32:26 2000 Christopher Faylor - - * dcrt0.cc (insert_file): Avoid freeing previously allocated argument - list. - * path.cc (symlink_info::check): Rename from symlink_check_one. Use - new symlink_info struct for communication. - (path_conv::path_conv): Use symlink_info structure for communication - with symlink_info::check. Fix typo which resulted in symbolic links - always being resolved. - (readlink): Use stat_suffixes array when resolving a link. - * syscalls.cc (stat_suffixes): Make global. - -Thu Apr 13 20:50:00 2000 Corinna Vinschen - - * include/cygwin/version.h: Bump minor api to reflect export change. - -Thu Apr 13 8:48:00 2000 Corinna Vinschen - - * path.cc (conv_to_win32_path): Detect a win32 path - if path contains backslashes. - * cygwin.din: Add symbol for `lacl'. - * security.cc (ReadSD): Add debug output. - (acl_worker): New static function. - (acl): Call acl_worker now. - (lacl): New function. - (facl): Call acl_worker now. - * include/cygwin/acl.h: Add prototype for `lacl'. - -Wed Apr 12 18:48:33 2000 Christopher Faylor - - * path.cc (path_conv::path_conv): Ensure that suffix is correctly - copied to path when we've found a symlink but aren't following - symlinks. - -Sat Apr 8 00:46:14 2000 Christopher Faylor - - * fhandler.cc (fhandler_disk_file::fstat): Allocate enough space for - root dir determination or overflow an array. - -Sat Apr 8 00:08:53 2000 Christopher Faylor - - * exceptions.cc (sigsave): Copy on fork so that we can restore correct - behavior in forked process. - (interruptible): Flag as interruptible when running in main process - module. - (interrupt_setup): Save return address and address of return address. - (signal_fixup_after_fork): New function. Uses above two values to - restore proper behavior to forked process. - (interrupt_on_return): Pass return address address to interupt_setup. - (interrupt_now): Pass NULL for return address address to - interrupt_setup. - * fork.cc (fork): Call signal_fixup_after_fork. - * shared.h: Lint cleanups. - * winsup.h: Ditto. - -Mon Apr 3 14:10:44 2000 Christopher Faylor - - * fhandler.h (select_stuff): Eliminate use of 'total'. - * select.cc (cygwin_select): Ditto. - (select_stuff::wait): Use maximum size for w4 rather than calculating - what will fit. - -Mon Apr 03 13:58:00 2000 Corinna Vinschen - - * grp.cc (parse_grp): Save empty array instead of - NULL in gr_mem if no supplementary group is given. - -Sun Apr 02 16:02:00 2000 Corinna Vinschen - - * syscalls.cc (chown_worker): Use previous uid/gid if - new uid/gid is -1. - -Fry Mar 31 22:55:00 2000 Corinna Vinschen - - * syscalls.cc (chown_worker): New static function with - chown functionality. - (chown): Call chown_worker with SYMLINK_FOLLOW. - (fchown): New function. Call chown_worker with SYMLINK_FOLLOW. - (lchown): New function. Call chown_worker with SYMLINK_IGNORE. - * cygwin.din: Add symbols for fchown, lchown. - -Fry Mar 31 11:18:00 2000 Corinna Vinschen - - * path.cc (symlink): Call `set_file_attribute()' and - `SetFileAttributeA()' instead of `chmod()' to set - uid/gid correct. - -Wed Mar 29 22:49:56 2000 Christopher Faylor - - * fhandler.h (select_record): Explicitly zero elements of this class. - (select_stuff): Ditto. - * select.cc (cygwin_select): Eliminate memset zero of sel. - -Tue Mar 28 16:45:42 2000 Christopher Faylor - - * Makefile.in: Use default rules when compiling cygrun.o. - * dcrt0.cc (host_dependent_constants::init): Limit non-NT platforms to - 32K chunks when copying regions during a fork. - * path.cc (symlink_check_one): Add temporary debugging output. - Simplify PATH_EXEC test. - * syscalls.cc (stat_suffixes): Null terminate this list. - -Sat Mar 25 20:46:39 2000 Christopher Faylor - - * path.cc (symlink_check_one): Recognize symlink settings from the - mount table. - * path.h: Make PATH_SYMLINK an alias for MOUNT_SYMLINK. - * syscalls.cc (stat_worker): Use extension search mechanism in - path_conv to look for .exe rather than trying to special case it here. - * mount.h: Make MOUNT_SYMLINK a real option. - -Sat Mar 25 00:22:32 2000 Christopher Faylor - - * environ.cc: Add TMPDIR to the list of environment variables which are - converted to POSIX format. - * sigproc.cc (proc_terminate): Don't attempt to delete when a muto - pointer is NULL. - -Sun Mar 19 12:01:00 2000 Corinna Vinschen - - * syscalls.cc (stat_worker): Set st_nlink to 1 on remote drives. - -Sat Mar 18 23:04:27 2000 Christopher Faylor - - * times.cc: Fix extern declarations for variables that are exported but - used by this modules. - -Sat Mar 18 01:32:04 2000 Christopher Faylor - - * dcrt0.cc (host_dependent_constants::init): Eliminate DELETE flag - from shared constant. - -Sat Mar 18 01:24:25 2000 Christopher Faylor - - * delqueue.cc (delqueue_list::queue_file): Add some debugging. - * path.h (class path_conv): Add a char * operator for the most common - case. - * syscalls.cc (_unlink): Rewrite to use FILE_FLAG_DELETE_ON_CLOSE when - possible (i.e., on NT). - -Fri Mar 17 18:16:00 2000 Corinna Vinschen - - Patch suggested by Eric Fifer - * fhandler.cc (fhandler_base::open): Call set_file_attribute() - only if a file is really created. - -Thu Mar 16 14:15:00 2000 Corinna Vinschen - - * security.cc (set_process_privileges): Remove `static'. - (get_nt_attribute): Returns uid and gid additionally. Remove call - to set_process_privileges(). - (get_file_attribute): Returns uid and gid additionally. Don't - call ntea if ntsec is ON. - (set_nt_attribute): Remove call to set_process_privileges(). - Don't call ntea if ntsec is ON. - (acl): Remove call to set_process_privileges(). - * dcrt0.cc (dll_crt0_1): Call set_process_privileges(). - * winsup.h: New prototype for set_process_privileges(), - changed prototype for get_file_attribute(). - * fhandler.cc (get_file_owner): Discard function. - (get_file_group): Ditto. - (fhandler_disk_file::fstat): Discard calls to get_file_owner() and - get_file_group(). - * path.cc (path_conv::path_conv): New debugging output for result - of GetVolumeInformation(). - (mount_info::conv_to_win32_path): Call backslashify() with pathbuf - instead of src_path. - * syscalls.cc (chown): Reformat slightly. - (chmod): Replace get_file_owner() and get_file_group() calls - by a call to get_file_attribute(). Discard local variable has_acls. - Reformat slightly. - (stat_worker): Root dir check now done by a call to rootdir(). - Don't call num_entries() on remote drives. - Discard local variable has_acls. - -Wed Mar 15 20:38:06 2000 Corinna Vinschen - - * errno.cc: Map ERROR_NOACCESS to EFAULT. - -Wed Mar 15 14:25:38 2000 Christopher Faylor - - * spawn.cc (spawn_guts): Restore dependency on signal_arrived. It's - needed to wake up the WaitForSingleObject. - -Tue Mar 14 23:41:16 2000 Christopher Faylor - - Pipe changes throughout suggested by Eric Fifer - * debug.cc (threadname_init): Pass name of lock as arg 2 of new_muto. - * malloc.cc (malloc_init): Ditto. - * sigproc.cc (sigproc_init): Ditto. - * exceptions.cc (events_init): Ditto. - (call_handler): Eliminate special case for hExeced. Report locked - thread in debugging output. - * fhandler.cc (fhandker_pipe::fhandler_pipe): Propagate device type to - base class. - * fhandler.h (fhandler_pipe): Ditto. - * hinfo.cc (hinfo::build_fhandler): Pass specific type of pipe to - constructor. - * spawn.cc (spawn_guts): Eliminate dependency on signal when waiting - for subprocess. - * strace.cc: Remove obsolete #ifdef. - * sync.cc (muto::muto): Save the name of the muto. - (muto:~muto): Also release the muto. - * sync.h: Add a muto name field. - * select.cc (peek_pipe): Avoid doing a PeekNamedPipe on the write end - of a pipe. - -Sun Mar 12 01:14:33 2000 Christopher Faylor - - * fhandler.cc (fhandler_base::get_readahead_into_buffer): New function. - * fhandler.h: Declare new function. Add extra argument to - process_slave_output. - * fhandler_console.cc (fhandler_console::read): Move read ahead code to - new function. - * fhandler_tty.cc (fhandler_pty_master::process_slave_output): Move - common code here. - (fhandler_tty_slave::read): Understand readahead. - (fhandler_pty_master::read): Move code to process_slave_output. - * select.cc (peek_pipe): Avoid performing certain checks when non-read - and on inappropriate fh types. - -Sat Mar 11 22:47:43 2000 Christopher Faylor - - * fhandler_console.cc (fhandler_console::read): Don't even think about - breaking on interrupt if executing in a "cygwin" thread. - * fhandler_tty.cc (fhandler_pty_master::process_slave_output): - Streamline, simplify code. - * sigproc.cc (sig_send): Remove debugging statement. - -Fri Mar 10 13:20:50 2000 Christopher Faylor - - * sigproc.cc: Set wait_sig priority to normal. - -Fri Mar 10 13:03:06 2000 Christopher Faylor - - * sigproc.cc (wait_sig): Add addtional debugging output. - -Thu Mar 9 15:25:01 2000 Christopher Faylor - - * environ.cc: Eliminate oldstack CYGWIN option. - * exceptions.cc (sfta): Eliminate obsolete function. - (sgmb): Eliminate obsolete function. - (class stack_info): Remove MS method for walking the stack. - (stack_info::init): Just initialize required fields. - (stack_info::brute_force): Rename to stack_info::walk. - (handle_exceptions): Pass derived frame pointer to sig_send. - (interrupt_setup): Clear saved frame pointer here. - (interrupt_on_return): thestack is no longer a pointer. - (call_handler): Accept a flag to indicate when a signal was sent from - other than the main thread. Use saved frame pointer for determining - where to place signal handler call. - (sig_handle): Accept "nonmain" argument. Pass it to call_handler. - * fhandler_tty.cc (fhandler_tty_common::__acquire_output_mutex): Change - debugging output slightly. - * (fhandler_tty_common::__release_output_mutex): Ditto. - (fhandler_tty_slave::read): Fix a comment, remove a goto. - * sigproc.cc (sig_send): Accept an optional frame pointer argument for - use when suspending the main process. sigcomplete_main is an autoreset - event now. Save frame pointer for non-main operation. - (wait_sig): Make sigcomplete_main an autoreset event. Eliminate - NOSIGQUEUE. Pass rc to sig_handle to signify if this was a nonmain - process. - * sigproc.h: Reflect change to sig_send argument. - * syscalls.cc (swab): Eliminate swab function since it is now available - in newlib. - * winsup.h (signal_dispatch): Change CONTEXT cx to DWORD ebp. - -Tue Mar 7 13:31:10 2000 Christopher Faylor - - * sigproc.cc (sig_send): Eliminate sync_sig_send synchronization since - it didn't seem to affect the "bash hangs" problem. - -Tue Mar 7 13:17:56 2000 Christopher Faylor - - * mcount.c: Remove strace.h include. - -Tue Mar 7 00:29:34 2000 Christopher Faylor - - Throughout use strace class in place of individual functions and - variables. - * cygwin.din: Eliminate _strace_wm. - * sigproc.cc (wait_sig): Temporarily add more debugging output. - * include/cygwin/version.h: Bump minor api to reflect export change. - -Sun Mar 5 01:17:05 2000 Christopher Faylor - - * exceptions.cc (call_handler): Streamline to use only one call to - ResumeThread. - * sigproc.cc (sig_send): Use a muto around the ReleaseSemaphore. - Remove priority setting since it didn't solve anything. - -Tue Feb 29 00:46:09 2000 Christopher Faylor - - * sigproc.cc (sig_send): Temporarily set priority to highest while - sending a signal. - -Mon Feb 28 11:23:29 2000 Christopher Faylor - - * pinfo.cc (set_myself): Add build date to strace output. - -Mon Feb 28 11:17:30 2000 Eric Fifer - - * sigproc.cc (proc_subproc): Only clear wait event when not attending - to a signal. - -Mon Feb 28 00:08:09 2000 Christopher Faylor - - * configure.in: Remove --enable-strace-hhmmss option. - * configure: Regenerate. - -Sun Feb 27 23:11:57 2000 Christopher Faylor - - * dcrt0.cc (set_os_type): Record OS name string. - (getprogname): Eliminate obsolete function. - (dll_crt0_1): Move initial strace initialization output to set_myself. - * exceptions.cc (interruptible): Add debugging output. - (interrupt_setup): New function. - (interrupt_now): Use interrupt_setup to set up common interrupt handler - stuff. - (interrupt_on_return): Ditto. - (call_handler): Move signal_arrived arm and clear threads to region - where signalled thread is suspended or suffer races. - * pinfo.cc (set_myself): Output interesting information when strace is - first initialized. Initialize progname here. - * sigproc.cc (sig_dispatch_pending): Modify to ensure that flush signal - are sent synchronously. - * strace.cc (strace_vsprintf): Move code into strace program. - * uname.cc (uname): Use 'osname' global to construct cygwin name + - Windows type + version. - -Fri Feb 25 19:26:42 2000 Christopher Faylor - - * exceptions.cc (interruptible): Make a little more structured. - (call_handler): Allow signals to be sent even if signalled thread is - stopped. Change order of signal_arrived arming/waiting threads - clearing to eliminate a race. - (reset_signal_arrived): New helper function. - * malloc.cc (malloc_init): Use mutos so that signal handler can keep - track of who owns the lock. - (__malloc_lock): Ditto. - (__malloc_unlock): Ditto. - * sync.h (new_muto): Actually use a muto for the "buffer". - * Makefile.in: Fix a dependency. - -2000-02-25 DJ Delorie - - * Makefile.in: fix "make check" support and cygrun. - -Thu Feb 24 15:56:00 2000 Christopher Faylor - - * syscalls.c (_read): Clear errno before doing any read operation. - -Thu Feb 24 14:45:06 2000 Christopher Faylor - - * exceptions.cc (call_handler): Use new muto linked list to look for - all potential mutos owned by suspended thread. Clear waiting threads - while thread is stopped. - (proc_subproc): Clarify debugging output. - * sync.h (class muto): Add 'next' field. - (new_muto): Keep linked list alive. - -Thu Feb 24 00:59:15 2000 Christopher Faylor - - Fix final round of gcc warnings relating to unused parameters. - * debug.cc (iscygthread): New function. - * debug.h: Declare it. - * exceptions.cc (set_process_mask): Flush pending signals. - (handle_sigsuspend): No need to flush pending signals. - (call_handler): Refine previous tests of muto ownership. Only clear - wait()'s when we have definitely responded to a signal. - * fhandler_console.cc (fhandler_console::read): Don't set EINTR if - executing in a "cygwin" thread. - * sigproc.cc (proc_subproc): Use second argument to control whether - CLEARWAIT actually sets "signalled" flag. - * sync.h (muto): Add 'unstable' method. - -Wed Feb 23 21:59:44 2000 Christopher Faylor - - * hinfo.cc (hinfo::extend): Clean up debugging output. - -Wed Feb 23 21:34:58 2000 Christopher Faylor - - * exceptions.cc (interruptible): Change method for determining if - something is interruptible. - (call_handler): Avoid suspending a thread if it owns a muto. Only set - signal_arrived if the thread was actually interrupted. - (events_init): Initialize module information needed by interruptible(). - * init.cc (dll_entry): Record module handle of main for use by - interruptible(). - (proc_subproc): Reorganize handling of terminated child so that the - bulk of the processing comes from the signal thread. - (wait_sig): Force processing of waiting threads if SIGCHLD is not - processed. - -Tue Feb 22 23:06:01 2000 Christopher Faylor - - Respond to more g++ warnings relating to initializing structures. - -Mon Feb 21 18:36:37 2000 Christopher Faylor - - * fhandler.cc (set_inheritance): Revert previous patch which got rid of - 'name' parameter. - -Mon Feb 21 00:19:40 2000 Christopher Faylor - - Respond to a multitude of new g++ warnings. - -Sun Feb 20 22:10:21 2000 Christopher Faylor - - * environ.cc (getwinenv): Make __stdcall. - (winenv): Ditto. - * malloc.cc (strdup): New function. Occludes newlib version. - (_strdup_r): Ditto. - * winsup.h: Reflect above __stdcall changes. - -Sun Feb 20 21:31:00 2000 Corinna Vinschen - - * fhandler.cc (fhandler_disk_file::fstat): Modify get_file_attribute - return value if FILE_ATTRIBUTE_READONLY is set. - -Thu Feb 17 11:00:23 2000 Christopher Faylor - - * environ.cc (environ_init): Cosmetic change. - -Mon Feb 7 16:50:44 2000 Christopher Faylor - - * Makefile.in: cygrun needs libshell32.a. - -Sun Feb 6 22:17:58 2000 Christopher Faylor - - * sigproc.cc (proc_subproc): Simplify case for when a child process is - stopped since new signal handler ensures the desired behavior. - -Sun Feb 6 21:52:33 2000 Christopher Faylor - - * Makefile.in: Fix install target so that directories will be created - when necessary. - -Sun Feb 6 18:12:17 2000 Christopher Faylor - - * Makefile.in: exceptions.cc should depend on autoload.h. - * exceptions.cc: Undef DECLSPEC_IMPORT prior to including imagehlp.h to - avoid defining StackWalk as "import". - (call_handler): Minor optimizations. - (sig_handle_tty_stop): Fix typo in previous checkin. - * sigproc.cc (sigproc_init): Ditto, for signal_arrived initialization. - -Sat Feb 5 15:37:37 2000 Christopher Faylor - - * dcrt0.cc (isquote): Convert to inline function. - -Sat Feb 5 00:26:01 2000 Christopher Faylor - - Throughout, rename global_signal_arrived to signal_arrived. - Throughout, eliminate use of arm_signals and __signal_arrived. - Throughout, revert to use of simple call to WaitForSingleObject or - WaitForMultipleObjects. - * debug.h: Eliminate obsolete function declaration. - * exceptions.cc (sigWaitForSingleObject): Eliminate obsolete function - definition. - * fhandler.h: Reflect change to select_stuff wait method. - * fhandler_tape.cc (get_ll): Accommodate new w32api LARGE_INTEGER - definition. - * ntea.c (NTReadEARaw): Ditto. - (NTWriteEA): Ditto. - * security.cc (ReadSD): Ditto. - (WriteSD): Ditto. - * syscalls.cc (_link): Ditto. - * uname.cc (uname): Eliminate PPC switch. - -2000-02-01 Salvador Eduardo Tropea - - * include/io.h: add return type to setmode() - -2000-01-27 DJ Delorie - - * include/netdb.h (h_errno): change __imp_ to dllimport - * cygwin.din (reent_data): add DATA - -Thu Jan 27 01:07:14 2000 Christopher Faylor - - * exceptions.cc (call_handler): Add debugging output. - * select.cc (MAKEready): Arm signals earlier. - * sigproc.cc (__signal_arrived:arm): Move debugging version of this - method here. - (__signal_arrived::release): Ditto. - * sigproc.h: Recognize debugging versions of above two methods. - (arm_signals::WaitForMultipleObjects): Don't release signal lock unless - signal arrived. - (arm_signals::WaitForMultipleSingleObject): Ditto. - (arm_signals::MsgWaitForMultipleObjects): Ditto. - -Thu Jan 27 00:19:26 2000 Christopher Faylor - - * sync.h (new_muto): Workaround change in gcc behavior. - -Wed Jan 26 12:57:13 2000 Christopher Faylor - - * Makefile.in: Ensure that all required libraries are built prior - to linking cygrun.exe. - -Tue Jan 25 21:26:57 2000 Christopher Faylor - - * exceptions.cc (sig_handle): Crudely work around potential problem - when main thread has a lock but is killed by a fatal signal. - * fhandler_tty.cc (fhandler_pty_master::write): Don't perform line - editing on the pty master (so why do we need the second argument to - line_edit, then?) - * thread.cc: Reformat to GNU standards. - -2000-01-11 DJ Delorie - - * ROADMAP: new - -2000-01-11 DJ Delorie - - * fhandler_zero.cc: new, emulate /dev/zero - * testsuite/winsup.api/devzero.c: new, test /dev/zero - * Makefile.in: build fhandler_zero.o - * fhandler.h: add support for /dev/zero - * hinfo.cc: ditto - * path.cc: ditto - -2000-01-11 DJ Delorie - - * mmap.cc (mmap): MSDN says *one* of FILE_MAP_*, fix flags for - MAP_PRIVATE. - -Mon Jan 10 01:11:00 2000 Corinna Vinschen - - * security.cc (acl_access): New function. - * syscalls.cc (access): Call acl_access if ntsec is on. - -Mon Jan 10 01:11:00 2000 Corinna Vinschen - - * fhandler.cc (get_file_owner): Use of ReadSD() instead of - GetFileSecurity(). - (get_file_group): Ditto. - -Sun Jan 9 15:43:07 2000 Christopher Faylor - - * debug.cc (struct thread_start): Add a flag to determine whether a - field is in use. Eliminate thread_start_ix since it was not - thread-safe. - (thread_stub): Use notavail flag to control whether the entry in - start_buf can be reused. - (makethread): Ditto. - -Sun Jan 9 20:18:00 2000 Corinna Vinschen - - * security.cc (alloc_sd): Rearrange order of ACE creation. - (setacl): Optimize creation of ACEs related to inheritance. Code - cleanup. - (aclcheck): Disable check for existance of DEF_)CLASS_OBJ. - -Sat Jan 8 18:42:32 2000 Christopher Faylor - - * mkvers.h: Reorg fix. - -Sat Jan 8 20:00:00 2000 Corinna Vinschen - - * cygwin.din: Add new acl API calls. - * grp.cc (getgroups): Change to work for any username. - * security.cc (get_id_from_sid): Change to work with acl API. - (is_grp_member): New function. - (get_nt_attribute): Rewritten. - (add_access_allowed_ace): New function. - (add_access_denied_ace): Ditto. - (alloc_sd): Rewritten. - (setacl): New function. - (getace): Ditto. - (searchace): Ditto. - (getacl): Ditto. - (acl): Ditto. - (facl): Ditto. - (aclcheck): Ditto. - (acecmp): Ditto. - (aclsort): Ditto. - (acltomode): Ditto. - (aclfrommode): Ditto. - (acltopbits): Ditto. - (aclfrompbits): Ditto. - (permtostr): Ditto. - (acltotext): Ditto. - (permfromstr): Ditto. - (aclfromtext): Ditto. - * syscalls.cc (access): Set errno again when needed. - * include/cygwin/acl.h: New file. - * include/sys/acl.h: Ditto. - -Sat Jan 8 14:46:19 2000 Christopher Faylor - - * Makefile.in: Add cygwin DLL specific CFLAGS define. - -Fri Jan 7 21:01:57 2000 Christopher Faylor - - * exceptions.cc (interrupt_on_return): Properly coerce assignment of - sigsave.func. - -2000-01-07 Mumit Khan - - * acconfig.h: New file. - * configure.in Add check for memset builtin. - (AC_CONFIG_HEADER): Use. - (STRACE_HHMMSS): Define instead of substituting. - (_MT_SAFE): Likewise. - (_CYG_THREAD_FAILSAFE): Likewise. - (DEBUGGING): Likewise. - (MT_SAFE): Substitute as a yes/no variable. - * Makefile.in: Remove DEBUGGING, STRACE_HHMMSS, and THREAD_FAILSAFE - variables and add DEFS. Update usage of MT_SAFE to reflect yes/no - values. Add config.h to winsup.h dependency. - (CFLAGS_CONFIG): Update. - (INCLUDES): Prepend `-I.'. - * utils/Makefile.in (INCLUDES): Likewise. - * winsup.h: Conditionally include config.h. - * thread.cc: Likewise. - * config.h.in: Generate new file. - * configure: Regenerate. - - -Fri Jan 7 16:21:01 2000 Christopher Faylor - - * dcrt0.cc (dll_crt0): Allow signal handling for dynamically loaded - case. - -Thu Jan 6 00:30:12 2000 Corinna Vinschen - - * path.cc (symlink_check_one): Initialize local variable `unixattr' - before calling `get_file_attribute'. - * syscalls.cc (chown): Ditto. - * security.cc (get_nt_attribute): Eliminate attribute copying from - world to user/group in case of missing ACEs. - (alloc_sd): Set special rights for administrators group only if it's - neither owner nor group. - * utils/mkpasswd.c: Create entry for local group administrators (SID - 544). - -Thu Jan 6 00:21:31 2000 Christopher Faylor - - Change function calls to __stdcall throughout. - * exceptions.cc (handle_exceptions): Probe stack for return address to - use with new signal method. Fill out sigsave.cx with this information. - (call_handler): Use sigsave.cx if it is available, rather than trying - to find the context of the main thread. - (interrupt_on_return): Use address of context rather than - pass-by-reference. - (interrupt_now): Ditto. - -Thu Jan 6 00:21:31 2000 Corinna Vinschen - - * grp.cc (getgroups): Return supplementary groups now. - * include/limits.h: Define NGROUP_MAX as 16 now. diff --git a/winsup/cygwin/ChangeLog-2001 b/winsup/cygwin/ChangeLog-2001 deleted file mode 100644 index 140b2a9e9..000000000 --- a/winsup/cygwin/ChangeLog-2001 +++ /dev/null @@ -1,5337 +0,0 @@ -2001-12-31 Christopher Faylor - - * Makefile.in: Strip path when installing library. - -2001-12-30 Christopher Faylor - - * include/getopt.h: Fix define. - -2001-12-30 Christopher Faylor - Ralf Habacker - - * speclib: New file. - * Makefile.in: Create library versions of automode.o, textmode.o, and - binmode.o for easier use on command line. Create libpthread.a, libm.a, - and libc.a with subsets of exports found in libcygwin.a. - -2001-12-30 Ralf Habacker - - * cygmagic: Eliminate unneeded use of 'tr' and 'bc'. - -2001-12-30 Corinna Vinschen - - * security.cc (open_local_policy): Use POLICY_EXECUTE instead of - enumerating user rights. - -2001-12-29 Corinna Vinschen - - * security.cc (open_local_policy): Initialize lsa handle to NULL. - Request only needed access rights in call to LsaOpenPolicy(). - (create_token): Check for NULL lsa pointer. - -2001-12-28 Corinna Vinschen - - * cygwin.din: Add symbols for endutent(), getutent(), getutid(), - getutline(), setutent() and utmpname(). - * syscalls.cc (setutent): New function. - (endutent): Ditto. - (utmpname): Ditto. - (getutent): Ditto. - (getutid): Ditto. - (getutline): Ditto. - * include/cygwin/version.h: Bump API minor version. - -2001-12-26 Christopher Faylor - - * cygmagic: Add define name to warning. - * dcrt0.cc (_dll_crt0): Check for changes in child_info size. - (multiple_cygwin_problem): Avoid "proc" errors when testing. Just - assume new cygwin proc. - * shared_info.h (mount_info): Add 'cb' element for sanity checks. - (shared_info): Ditto. - * child_info.h (child_info): Add fhandler_union_size element for sanity - checking. - * shared.cc (open_shared): Detect shared region size mismatch between - parent and child. - (shared_info::initialize): Detect shared region size mismatch with - expectation. - (memory_Init): Ditto. - * sigproc.cc (init_child_info): Correctly set cb in passed structure. - * shared.cc (open_shared): - -2001-12-26 Christopher Faylor - - * include/getopt.h: Protect a declaratin. - -2001-12-26 Robert Collins - - * thread.cc (pthread_cond::Signal): Use a separate flag for signal - detection and broadcast semantics. - (__pthread_cond_dowait): Ditto. - * thread.h (pthread_cond): New flag for testing when a waiter has - woken. - -2001-12-26 Christopher Faylor - - * Makefile.in: Quote arguments to shell scripts. - (clean): Remove new *_magic.h autogenerated files. - -2001-12-25 Christopher Faylor - - * Makefile.in: Autogenerate some header files which provide magic - numbers. Force dependencies for files which depend on autogenerated - headers to ensure that they are always built. - * child_info.h (child_info): Add new fields to accommodate new magic - number header stuff. - * dcrt0.cc: Rely on "child_info_magic.h" to ensure that correct - child_info magic numbers are used. - (dll_crt0_1): Temporarily remove _cygwin_testing_magic test. - (_dll_crt0): Do more testing on magic numbers from fork_info structure. - Call "multiple_cygwin_problem" where appropriate. - (multiple_cygwin_problem): Rename from multiple_cygwin_die. Issue a - warning or die, as appropriate based on cygwin version/magic number - mismatch. - * pinfo.cc (pinfo::exit): Don't attempt to dereference `this' if it - doesn't exist. This can happen when a fatal error occurs early in - process initialization. - * shared.cc: Rely on "shared_info_magic.h" to accommodate that new - magic number header stuff. - (shared_info::initialize): Use new magic number stuff, for shared - region. - (memory_init): Ditto, for mount table. - * shared_info.h: Accomodate new magic number stuff for shared region - and mount table. - * sigproc.cc: Rely on "child_info_magic.h" to accommodate new magic - number header stuff. - (init_child_info): Initialize new fields in child_info) to accomodate - magic numbers. - * winsup.h: Rename multiple_cygwin_die to multiple_cygwin_problem. - * include/cygwin/version.h: Define macros for manipulating version - magic. - * cygmagic: New shell script for generating magic numbers. - -2001-12-20 Christopher Faylor - - * include/cygwin/version.h: Bump API minor version for below changes. - -2001-12-19 Christopher Faylor - - * Makefile.in (VPATH): Add regex directory. - (NM): new variable. - (OBSOLETE_FUNCTIONS): Ditto. - (NEW_FUNCTIONS): Ditto. - (install-headers): Install regex.h. - (install-man): New target. - (install): Use new target. - (DLL_OFILES): Add v8_reg* stuff. - (new-cygwin1.dll): Eliminate stamp-cygwin-lib creation. - (libcygwin.a): Remove obsolete functions from import lib. Add new functions. - * configure.in: Detect 'nm' tool. - * configure: Regenerate. - * cygwin.din: Export posix_reg* functions. Eliminate export of v8 reg* functions. - This is now handled in object files themselves. - * regex/*: New files. - * regexp/v8_*.c: New files, renamed from non v8_ equivalents. - -2001-12-17 Corinna Vinschen - - * include/getopt.h: Don't define getopt_long() and friends when - included through unistd.h. - -2001-12-17 Christopher Faylor - - * dtable.cc (dtable::init_std_file_from_handle): Avoid initializing - using an invalid handle. - -2001-12-16 David Billinghurst - - * include/limits.h: Define LLONG_MIN, LLONG_MAX, ULLONG_MAX. - -2001-12-11 Christopher Faylor - - * include/getopt.h: Add HAVE_DECL_GETOPT to save pain elsewhere. - -2001-12-10 Christopher Faylor - - * fhandler.h (fhandler_serial::ev): New class member. - * fhandler_serial.cc (fhandler_serial::raw_read): Use class member for - event status. - * select.cc (peek_serial): Ditto. - -2001-12-07 Christopher Faylor - - * path.cc (path_conv::check): Use full path name for determining - attributes when /cygdrive/x/foo. - -2001-12-06 Christopher Faylor - - * path.cc (path_conv::check): Reset FH_CYGDRIVE if iterating through - path. - -2001-12-06 Christopher Faylor - - * path.cc (path_conv::check): Don't complain if /dev/x/foo when x - doesn't exist. - (mount_info::conv_to_win32_path): Keep translating when a /cygdrive is - found. Don't attempt to translate to a device name when devn == - FH_CYGDRIVE. - (cygwin_conv_to_win32_path): Set buffer to empty on error. - (cygwin_conv_to_full_win32_path): Ditto. - - * window.cc: Include unistd.h to verify definitions. - -2001-12-05 Christopher Faylor - - * dir.cc (opendir): Detect error return from build_fhandler_from_name. - -2001-12-04 David Rothenberger - - * net.cc (cygwin_getsockopt): Dereference optlen pointer when passing - to __check_null_invalid_struct_errno. - -2001-12-03 Christopher Faylor - - * net.cc (cygwin_getsockopt): Allow NULL optval. - (cygwin_setsockopt): Ditto. - (cygwin_recvfrom): Allow NULL from. - - * path.cc (mount_info::read_cygdrive_info_from_registry): Don't write - cygdrive to registry if it doesn't exist. - -2001-12-03 Christopher Faylor - - * path.cc (mount_info::conv_to_win32_path): Avoid returning error if - cygdrive == '/'. - (mount_info::cygdrive_win32_path): Return 0 if invalid cygdrive path. - -2001-11-30 Christopher Faylor - - * debug.cc (makethread): Eliminate unneeded function call. - * miscfuncs.cc (tls_ix): Predefine. - * perthread.h (set_reent): Eliminate. - (get_reent): Ditto. - * winbase.h (my_tlsalloc): Use global stack base pointer. Set newly - allocated location to NULL. - (my_tlssetvalue): Use global stack base pointer. - (my_tlsgetvalue): Ditto. - -2001-11-27 Christopher Faylor - - * winsup.h: Reorganize to avoid use of experimental stuff. - * shortcut.cc: Move winsup.h first in include order. - -2001-11-27 Christopher Faylor - - * cygwin.din (ualarm): New export. - * dcrt0.cc (_dll_crt0): Add experimental tls storage declaration. - (dll_crt0): Ditto. - * debug.cc (thread_stub): Ditto. - * thread.cc: Minor cleanup. - (__pthread_create): Add experimental tls storage declaration. - * miscfuncs.cc: Define tls index. - * winsup.h: Declare experimental tls storage. - - * window.cc (alarm): Use old timer return from setitimer. - (ualarm): New function. From Alexandr V. Shutko. - -2001-11-26 Christopher Faylor - - * Makefile.in (libcygwin.a): Use ar commands to build libcygwin.a since - adding an archive doesn't work the way we want it to. - -2001-11-24 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_cygdrive::readdir): Avoid reporting - inaccessible drives. - -2001-11-24 Corinna Vinschen - - * net.cc (cygwin_hstrerror): Allow s == NULL. - (cygwin_rcmd): Add parameter checking. - (cygwin_rexec): Ditto. - -2001-11-24 Corinna Vinschen - - * net.cc (cygwin_inet_ntoa): Add parameter checking. - (cygwin_inet_network): Return INADDR_NONE instead of 0 in case of - EFAULT. - (cygwin_hstrerror): Add parameter checking. - (cygwin_rresvport): Ditto. - (socketpair): Ditto. - * winsup.h (check_null_str): Add extern declaration. - -2001-11-24 Christopher Faylor - - * path.cc (path_conv::check): Tighten FH_CYGDRIVE check to avoid - matching trailing component, like other devices. - -2001-11-24 Christopher Faylor - - * autoload.cc (IsDebuggerPresent): Make conditional load since it is - not available everywhere. - - * path.cc (mount_info::conv_to_win32_path): Only consider /cygdrive to - be FH_CYGDRIVE, not /cygdrive/x. - -2001-11-24 Christopher Faylor - - * net.cc (inet_makeaddr): Revert previous change. - -2001-11-23 Christopher Faylor - - * path.cc (chdir): Allow 'cd /cygdrive'. - -2001-11-23 Christopher Faylor - - * dtable.cc (dtable::vfork_parent_restore): Add debugging statement. - - * exceptions.cc (try_to_debug): Spin only as long as we don't have a - debugger attached. - - * fhandler.h (fhandler_base::set_nohandle): New method. - (fhandler_base::get_nohandle): New method. - * fhandler.cc (fhandler_base::dup): Avoid duplicating handle if there - is no handle. - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Set nohandle - flag on dummy fd. - -2001-11-23 Christopher Faylor - - * Makefile.in: Make intermediate library for eventual inclusion in - libcygwin.a - - * fhandler.h (fhandler_pipe::fhandler_pipe): Remove default argument - setting since it is no longer used. - - * miscfuncs.cc (check_null_str): New function. - (check_null_str_errno): Ditto. - * net.cc: Add defensive buffer checking throughout. - (cygwin_sendto): Protect against invalid fd. - (cygwin_recvfrom): Ditto. - (cygwin_getpeername): Ditto. - (cygwin_recv): Ditto. - (cygwin_send): Ditto. - * winsup.h: Declare a new function. - -2001-11-23 Corinna Vinschen - - * select.cc (set_bits): Fix conditional for setting fd in exceptfds. - * dtable.cc (dtable::build_fhandler): Create fhandler_pipe using - correct device type. - * path.cc (get_devn): Set correct pipe device type from device name. - -2001-11-22 Christopher Faylor - - * path.cc (conv_path_list): Fix wild indexing into path due to - conflicting methods for setting src pointer. - - * dir.cc (opendir): Only pass path_conv argument to opendir, since name - is already part of the fhandler. - * dtable.cc (dtable::build_fhandler): Accomodate new FH_CYGDRIVE type. - * fhandler.cc (fhandler_base::opendir): Nuke name argument. - * fhandler.h: Add FH_CYGDRIVE to "device" enum. - (fhandler_base::opendir): Nuke name argument. - (fhandler_disk_file::opendir): Ditto. - (fhandler_disk_file::fhandler_disk_file): Declare new method which - passes devtype through. - (fhandler_cygdrive): Add elements for tracking drives. - (fhandler_cygdrive::set_drives): Declare new method. - (fhandler_cygdrive::iscygdrive_root): Declare new method. - (fhandler_cygdrive::opendir): Declare new method. - (fhandler_cygdrive::readdir): Declare new method. - (fhandler_cygdrive::telldir): Declare new method. - (fhandler_cygdrive::seekdir): Declare new method. - (fhandler_cygdrive::rewinddir): Declare new method. - (fhandler_cygdrive::closedir): Declare new method. - (fhandler_cygdrive::fstat): Declare new method. - * fhandler_disk_file.cc (fhandler_disk_file::fhandler_disk_file): - Define new method which passes devtype through. - (fhandler_disk_file::open): Tweak debug output. - (fhandler_disk_file::opendir): Nuke first argument. Use info from - path_conv and class rather than calling fstat. - (fhandler_cygdrive::set_drives): New method. - (fhandler_cygdrive::iscygdrive_root): New method. - (fhandler_cygdrive::opendir): New method. - (fhandler_cygdrive::readdir): New method. - (fhandler_cygdrive::telldir): New method. - (fhandler_cygdrive::seekdir): New method. - (fhandler_cygdrive::rewinddir): New method. - (fhandler_cygdrive::closedir): New method. - (fhandler_cygdrive::fstat): New method. - * path.cc (iscygdrive_device): Assume cygdriveness is already verified. - (path_conv::check): Treat FH_CYGDRIVE "method" as a special case, - setting file attributes as needed. - (mount_info::conv_to_win32_path): Allow stand-alone /cygdrive, meaning - "the directory which contains all of the drives on the system". - (fillout_mntent): Use cyg_tolower for conversions. - (mount_info::cygdrive_win32_path): Replace unused argument with unit - number. - * shared_info.h (mount_info::cygdrive_win32_path): Reflect argument - change. - -2001-11-21 Christopher Faylor - - * Makefile.in (DLL_OFILES): Add fhandler_disk_file.o. - * cygheap.h (cygheap_fdnew::operator =): New operator. - * dir.cc: Add invalid struct checking throughout. Use methods for all - directory manipulation throughout. - * fhandler.cc: Move fhandler_disk_file stuff to own file. - (fhandler_base::opendir): New method. - (fhandler_base::readdir): New method. - (fhandler_base::telldir): New method. - (fhandler_base::seekdir): New method. - (fhandler_base::rewinddir): New method. - (fhandler_base::closedir): New method. - * fhandler_disk_file.cc: New file. - * fhandler.h (fhandler_base): Declare new virtual methods. - (fhandler_disk_file): Ditto. - (fhandler_cygdrive): New class. - - * path.cc (conv_path_list): Use strccpy to break apart path. - -2001-11-17 Nick Duffek - - * path.cc (conv_path_list): Copy source paths before modifying them. - -2001-11-17 Corinna Vinschen - - * fhandler_raw.cc (fhandler_dev_raw::clear): Don't reset unit. - * fhandler_tape.cc (fhandler_dev_tape::fhandler_dev_tape): Add debug - output. - -2001-11-15 Egor Duda - - * include/pthread.h (PTHREAD_COND_INITIALIZER): Define. - * thread.cc (__pthread_cond_destroy): Add support for - PTHREAD_COND_INITIALIZER. - (__pthread_cond_init): Ditto. - (__pthread_cond_broadcast): Ditto. - (__pthread_cond_signal): Ditto. - (__pthread_cond_dowait): Ditto. - (__pthread_mutex_init): Handle PTHREAD_MUTEX_INITIALIZER correctly, - don't return error when it's passed as parameter. - * winsup.h (check_null_invalid_struct): Call correct function. - -2001-11-14 Christopher Faylor - - * exceptions.cc: Add stdlib.h include for alloca declaration. - * poll.cc: Ditto. - * termios.cc: Ditto. - -2001-11-14 Christopher Faylor - - * syscalls.cc (_write): Only allow zero length when fd is valid. - -2001-11-14 Corinna Vinschen - - * fhandler.cc (fhandler_disk_file::fstat): Add setting access time - and creation time to last modification time for files on filesystems - not supporting multiple timestamps. - (fhandler_disk_file::fstat_helper): Set access time and creation - time in incoming Windows structure instead of in stat buf to avoid - incorrectly overwriting Epoch timestamp. - -2001-11-14 Corinna Vinschen - - * winsup.h: Remove alloca definition since it's now defined through - inclusion of stdlib.h. - * lib/cygwin_crt0.c: Ditto. - -2001-11-13 Christopher Faylor - - * syscalls.cc (_write): Allow zero length as per SUSv2. - -2001-11-13 Corinna Vinschen - - * dir.cc (mkdir): Add HIDDEN file attribute if file has leading dot - and HIDDEN_DOT_FILES is defined. - * fhandler.cc (fhandler_base::open): Ditto. - * path.cc (symlink): Ditto. - * syscalls.cc (_rename): Ditto and remove HIDDEN file attribute if - new filename does not begin with a dot. - -2001-11-12 Christopher Faylor - - * fhandler_console.cc (fhandler_console::read): Revert 2001-10-23 - change to only honor keydown events. - -2001-11-11 Christopher Faylor - - * include/cygwin/version.h: Bump version to 1.3.6. - -2001-11-10 Christopher Faylor - - * dtable.cc (dtable::build_fhandler): Don't increment console fd count - if new operation fails. Increment fork_fixup field here. - (dtable::dup2): Don't increment fork_fixup field here. - * net.cc (fdsock): Ditto. - -2001-11-08 Corinna Vinschen - - * select.cc: Set errno using set_sig_errno() throughout. - * signal.cc (signal): Always set SA_RESTART flag. - * syscalls.cc (_read): Revert previous patch. - -2001-11-08 Corinna Vinschen - - * select.cc (fhandler_tty_slave::ready_for_read): Return 0 on EBADF. - * syscalls.cc (_read): If ready_for_read() failed, save errno from - being overwritten by signal handler call. - -2001-11-07 Corinna Vinschen - - * lib/getopt.c (getopt_internal): Reset optind to 1 only if optreset - is not set. - -2001-11-06 Christopher Faylor - - * select.cc (fhandler_tty_slave::ready_for_read): Correct inverted - not_open test. - -2001-11-05 Christopher Faylor - - * include/cygwin/version.h: Bump version to 1.3.5. - -2001-11-05 Corinna Vinschen - - * mmap.cc (mmap_record::find_empty): Add input parameter check. - -2001-11-04 Christopher Faylor - - * dtable.cc (dtable::build_fhandler): Fix debug_printf to avoid SEGV - due to incorrect parameter placement. - -2001-11-04 Christopher Faylor - - * fhandler.h (fhandler_pipe::broken_pipe): Renamed from saweof. - (fhandler_pipe::set_eof): Reflect above change. - * pipe.cc (fhandler_pipe::fhandler_pipe): Ditto. - (fhandler_pipe::read): Ditto. - (fhandler_pipe::hiteof): Ditto. - -2001-11-04 Christopher Faylor - - * pipe.cc (fhandler_pipe::read): Narrow eof return to just the "broken - pipe" test. - -2001-11-04 Christopher Faylor - - * select.cc: Add more comments throughout. Use bool 'true' where - appropriate throughout. - (fhandler_socket::select_read): Remove duplicate setting for *_ready - which inadvertently overrode previous, correct setting. - (fhandler_socket::select_write): Ditto. - -2001-11-03 Christopher Faylor - - * select.cc (verify_console): New function. - (verify_windows): Ditto. - (fhandler_console::select_read): Really do need to verify that there is - something to read. - (fhandler_console::select_windows): Ditto. - -2001-11-03 Christopher Faylor - - * fhandler.h (fhandler_base::ready_for_read): Remove unused argument. - (fhandler_tty_slave::ready_for_read): Ditto. - (select_record): Remove poll, initialize peek. - * select.cc: Remove all poll functions, throughout. Change second - argument of peek_* functions to 'bool' throughout. Specifically - initialize *_ready variables throughout. - (select_stuff::poll): Subsume previous poll functionality. - (peek_pipe): Don't grab guard mutex when in select loop. - select()/read() is racy by design so there is no need to worry about a - race in select(). - (fhandler_base::ready_for_read): Remove unused argument. - (fhandler_tty_slave::ready_for_read): Ditto. - * syscalls.cc (_read): Eliminate third argument in ready_for_read call. - -2001-11-03 Corinna Vinschen - - * security.cc (get_supplementary_group_sidlist): New function. - (get_group_sidlist): Call get_supplementary_group_sidlist() to - retrieve list of supplementary groups SIDs from /etc/group and - add them to the user's group list. - -2001-11-03 Christopher Faylor - - * fhandler.cc (fhandler_base::read): Return just read ahead characters - if slow device. - * fhandler.h (fhandler_base::set_eof): New virtual method. - (fhandler_pipe::set_eof): New method. - * pipe.cc (fhandler_pipe::fhandler_pipe): Clear saweof flag. - (fhandler_pipe::read): Return immediately if hit eof. - (fhandler_pipe::hit_eof): Return true if saweof flag is set. - * select.cc (peek_pipe): Don't call PeekNamedPipe if we couldn't grab - the guard mutex. - -2001-11-02 Egor Duda - - * dll_init.h (class dll_list): Reorder functions to avoid compiler - "can't inline" warnings. - * security.h (class cygsid): Ditto. - * sigproc.cc (get_proc_lock): Ditto. - * sigproc.h (class sigframe): Ditto. - * sync.h (class muto): Ditto. - -2001-11-02 Christopher Faylor - - * fhandler.h (fhandler_base::get_guard): Actually MAKE virtual as - previously indicated. - * pipe.cc (make_pipe): Remove extraneous set_errno. - * syscalls.cc (_open): Ditto. - * select.cc (peek_pipe): Need to check that there is still something to - read from the pipe after acquiring the mutex since another - process/thread could have eaten the input before we got to acquiring - the lock. (Thanks to Nick Duffek for this inspiration.) - -2001-11-01 Christopher Faylor - - * fhandler.h: Change Windows 'BOOL's to c++ 'bool's for all variables. - * select.cc (fhandler_base::ready_for_read): Set read_ready to zero - prior to testing it or it will be uninitialized. - - * Makefile.in (CFLAGS): Move setting to Makefile.common. - -2001-11-01 Christopher Faylor - - * cygheap.h (cygheap_fdmanip::isopen): Set appropriate errno if fd not - open. - * select.cc (fhandler_base::ready_for_read): Release an open guard - mutex when exiting with an error condition. - * syscalls.cc (_read): Check frequently for closed fd as a kludge until - something better is invented. - -2001-11-01 Christopher Faylor - - * dtable.cc (dtable::build_fhandler): Issue internal error on unknown - device. - * fhandler.cc (fhandler_base::close): Show both name and handle in - debugging output. - - * fhandler.h (fhandler_base::get_guard): New virtual method. - (fhandler_pipe::get_guard): New method. - (fhandler_socket::ready_for_read): Delete declaration. - (fhandler_pipe::ready_for_read): Ditto. - (fhandler_serial::ready_for_read): Ditto. - (fhandler_console::ready_for_read): Ditto. - (fhandler_tty_common::ready_for_read): Ditto. - (fhandler_windows::ready_for_read): Ditto. - (struct select_record::peek): Declare new method. - * select.cc (MAKEready): Delete. - (peek_pipe): Use get_guard method to retrieve potential guard mutex - handle. - (fhandler_base::ready_for_read): Rewrite as generic ready-for-read - handler. Should only be called for "slow" devices. - (fhandler_socket::ready_for_read): Delete definition. - (fhandler_pipe::ready_for_read): Ditto. - (fhandler_serial::ready_for_read): Ditto. - (fhandler_console::ready_for_read): Ditto. - (fhandler_tty_common::ready_for_read): Ditto. - (fhandler_windows::ready_for_read): Ditto. - (fhandler_pipe::select_read): Fill in new peek record in select_record - structure. - (fhandler_console::select_read): Ditto. - (fhandler_tty_common::select_read): Ditto. - (fhandler_serial::select_read): Ditto. - (fhandler_socket::select_read): Ditto. - (fhandler_socket::select_read): Ditto. - (fhandler_tty_slave::ready_for_read): Check for tty not open. Set - errnos appropriately. - * syscalls.cc (_read): Allow ready_for_read to set errno. - - * pinfo.cc (pinfo::init): Return spawn/NO_WAIT process as valid if it - is initializing. - * sigproc.cc (getsem): Adjust wait for process to initialize downward - to avoid huge waits. - -2001-10-31 Christopher Faylor - - * environ.cc: Set reset_com to false to mimic linux behavior more - closely. - -2001-10-31 Corinna Vinschen - - * dtable.cc (dtable::vfork_child_dup): Revert impersonation - before duplicating fhandler. - -2001-10-30 Christopher Faylor - - * exceptions.cc (signal_exit): Weight the odds against the main thread - running when signal thread is exiting. - -2001-10-30 Christopher Faylor - - * sigproc.cc (sigproc_terminate): Don't signal main thread when exiting. - * sigproc.h (sigframe): Decorate some methods with `inline'. - (new_muto): Coerce pointer to new to void *. - -2001-10-30 Christopher Faylor - - * fhandler.cc (fhandler_base::fork_fixup): Pass old handle to - setclexec_pid. - -2001-10-30 Christopher Faylor - - * cygheap.h (cygheap_fdmanip::cygheap_fdmanip): Clear fh. - (cygheap_fdmanip::isopen): New method. - * syscalls.cc (_read): Avoid accessing closed fd. - - * path.h (fe_types): New enum. - (path_conv::set_path): New method. - (find_exec): Change null_if_not_found argument to something more - generic. - * spawn.cc (find_exec): Default to returning the POSIX path rather than - the windows path, unless instructed otherwise. - (spawn_guts): Force call to find_exec to use native paths. - * dlfcn.cc (check_path_access): Accommodate new find_exec arguments. - * environ.h (win_env::get_posix): New method. - -2001-10-30 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::close): Add error handling. - -2001-10-30 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::dup): Revert previous change. - -2001-10-30 Christopher Faylor - - * dtable.cc (dtable::dup2): Add some debugging. Use methods from - passed in class rather than cygheap->fdtab. - * fhandler_socket.cc (fhandler_socket::fixup_before_fork_exec): Add - more debugging output. - (fhandler_socket::dup): Allocate new space for prot_info_ptr for - duplicated entry. - (fhandler_socket::close): Loop closesocket() as long as WSAEWOULDBLOCK - is returned. - * syscalls.cc (stat_worker): Always delete fh if it has been created. - -2001-10-29 Corinna Vinschen - - * security.cc (is_group_member): Call NetLocalGroupGetMembers() for - local machine only. - (get_user_local_groups): Ditto for NetLocalGroupEnum(). - -2001-10-29 Christopher Faylor - - * fhandler.cc (fhandler_base::set_name): Set namehash here to catch - name changes. - (fhandler_base::open): Remove namehash setting. - (fhandler_base::fstat): Subtract 1 from arbitrary time setting to avoid - strange ls -l granularity problem. - -2001-10-29 Christopher Faylor - - * select.cc (MAKEready): Remove extraneous select_read. - -2001-10-29 Corinna Vinschen - - * uinfo.cc (internal_getlogin): Set environment variable $HOME - from either /etc/passwd or $HOMEDRIVE/$HOMEPATH if necessary. - -2001-10-29 Christopher Faylor - - * fhandler.h (fhandler_serial::fhandler_serial): Change to only accept - unit argument. - * fhandler_serial.cc (fhandler_serial::fhandler_serial): Ditto. - (fhandler_serial::open): Avoid else when previous clause is a return(). - * path.cc (get_devn): Alias /dev/ttyS0 -> /dev/com1, etc. - (get_device_number): Reallow standalone "com1" as a valid name for - /dev/com1. - -2001-10-26 Christopher Faylor - - * select.cc (MAKEready): Check for read_ready in loop since select_read - could set it. - (peek_socket): Check ready/write/except specifically since they could - have been set even prior to peek_socket call. - -2001-10-24 Christopher Faylor - - * shared_info.h (MOUNT_VERSION): Change to a smaller, still arbitrary - number. - * shared.cc (open_shared): Accept a number to denote the shared memory - region. - (memory_init): Use shared memory version as part of the object name of - the shared region. Ditto for the mount table. - * path.cc (CYGWIN_REGNAME): New define used in place of - CYGWIN_INFO_CYGWIN_REGISTRY_NAME throughout. - * external.cc (cygwin_internal): Implement CW_[GS]ET_CYGWIN_REGISTRY_NAME. - * cygheap.h (init_cygheap::cygwin_regname): New element. - -2001-10-23 Christopher Faylor - - Ensure that all fhandler_*::read definitions are __stdcall throughout. - * fhandler.cc (fhandler_base::set_inheritance): Be more defensive in - debugging code. - * fhandler.h: Adjust regparms throughout to reflect passing 'this' - parameter. - * fhandler_console.cc (fhandler_console::read): Remove unneeded test. - Only honor "key down" events. - * miscfuncs.cc (strcasestr): Reorganize for efficient code use. - (check_null_empty_str_errno): Ditto. - (__check_null_invalid_struct_errno): Ditto. - (__check_invalid_read_ptr_errno): Ditto. - * syscalls.cc (_read): Return 0 when length == 0, as per Single UNIX - Specification. - -2001-10-22 Christopher Faylor - - * debug.cc (set_errno): Return value of errno that was set, just like - the macro. - (setclexec_pid): Replace old handle with new handle. - * debug.h: Reflect change in arguments for setclexec_pid. - * fhandler.cc (fhandler_base::set_inheritance): Ditto. - (fhandler_base::fork_fixup): Ditto. - * cygerrno.h: Reflect return value change for set_errno. - -2001-10-22 Christopher Faylor - - Remove 'cb' parameter and modify fhandler_* constructors throughout. - * dtable.cc (dtable::build_fhandler): Remove debugging output which - uses 'cb'. - * exec.cc (execvp): New function. - (execvpe): Ditto. - * fhandler.cc (fhandler_base::fhandler_base): Use constructor - initialization. - * fhandler.h (fhandler_tty_common::fhandler_tty_common): Ditto. - * fhandler_clipboard.cc (fhandler_dev_clipboard::fhandler_dev_clipboard): - Ditto. - * fhandler_console.cc (fhandler_console::fhandler_console): Ditto. - * fhandler_raw.cc (fhandler_dev_raw::fhandler_dev_raw): Ditto. - * fhandler_serial.cc (fhandler_serial::fhandler_serial): Ditto. - * fhandler_tty.cc (fhandler_tty_master::fhandler_tty_master): Ditto. - (fhandler_tty_slave::fhandler_tty_slave): Ditto. - (fhandler_pty_master::fhandler_pty_master): Ditto. - * fhandler_windows.cc (fhandler_windows::fhandler_windows): Ditto. - -2001-10-22 Corinna Vinschen - - Patch suggested by Ian Ray : - * syscalls.cc (seteuid): Unset environment variables HOMEDRIVE and - HOMEPATH before calling internal_getlogin(). - * uinfo.cc (internal_getlogin): Use default HOMEPATH and HOMEDRIVE - from environment if both are present, else query NetUserGetInfo(). - -2001-10-22 Corinna Vinschen - - * net.cc (get_2k_ifconf): Change multiple IP address naming scheme - to Linux style. - -Sun Oct 21 19:04:37 2001 Alexander Gottwald - - * net.cc (get_2k_ifconf): Added support for multiple IP addresses on - one interface. - -2001-10-22 Corinna Vinschen - - * miscfuncs.cc (__check_invalid_read_ptr_errno): Return error, if any. - -2001-10-21 Christopher Faylor - - * resource.cc (fill_rusage): Perform paranoid zero structure passed to - GetProcessMemoryInfo. - -2001-10-22 Robert Collins - - * autoload.cc: Autoload GetProcessMemoryInfo. - * resource.cc (fill_rusage): Calculate ru_maxrss and ru_majflt entries. - (Bug report on this from Guido Serassio in the squid project). - This requires including psapi.h. - -2001-10-20 Christopher Faylor - - * dll_init.cc (dll_list::alloc): Increase retry count to 1000. - -2001-10-20 Christopher Faylor - - * miscfuncs.cc (__check_invalid_read_ptr_errno): New function. - * syscalls.c (_write): Validate that write buffer is accessible for - reading, not writing. - * winsup.h: Declare new function, increase regparmization of check_* - functions. - -2001-10-19 Corinna Vinschen - - * path.cc (getcwd): Allow len == 0 when buf == NULL. - -2001-10-18 Christopher Faylor - - * syscalls.cc (_read): Validate input pointer. - (_write): Ditto. - (system): Ditto. - -2001-10-16 Frederic Devernay - - * poll.cc (poll): Call cygwin_select() if any fd is valid. - -2001-10-16 Corinna Vinschen - - * fhandler_raw.cc (fhandler_dev_raw::open): Eliminate compatibility - code since no Win32 device names are used anymore. - * fhandler_tape.cc (fhandler_dev_tape::tape_set_blocksize): Allow - 0 as blocksize to indicate variable blocksize. - * path.cc (win32_device_name): Generate NT internal device names - using upper/lower case names for readability. - Generate \DosDevices\: device name for mount table - compatibility devices. - -2001-10-16 Corinna Vinschen - - * fhandler_tape.cc (fhandler_dev_tape::tape_status): Report - EOTWarningZoneSize in get->mt_eotwarningzonesize. - * include/cygwin/mtio.h: Define DEFTAPE. - (struct mtget): Add member `mt_eotwarningzonesize'. Add a comment. - * include/cygwin/version.h: Bump API minor version to 47. - -2001-10-16 Christopher Faylor - - * fhandler.cc (fhandler_base::fork_fixup): Guard against compiler - warning. - -2001-10-16 Corinna Vinschen - - * autoload.cc: Add load statement for `NtOpenFile'. - * fhandler.h (fhandler_dev_raw::get_unit): New method. - (fhandler_dev_tape::norewind): Eliminate. - (fhandler_dev_tape::is_rewind_device): New method. - * fhandler_raw.cc (fhandler_dev_raw::open): Open new - fixed device name devices using NT internal method. - Keep calling fhandler_base::open() for old mount table - device mapping compatibility devices. - (fhandler_dev_raw::fstat): Eliminate. Settings are done - by fhandler_base::fstat() already. - * fhandler_tape.cc: Remove `norewind' usage throughout. - * ntdll.h: Define FILE_SYNCHRONOUS_IO_NONALERT. - Define struct _IO_STATUS_BLOCK. - Declare NtOpenFile(). - * path.cc (get_raw_device_number): Add new approach for - using fixed device names. - (win32_device_name): Ditto. - (get_device_number): Ditto. Require POSIX path to begin - with "/dev/". - (mount_info::conv_to_win32_path): Call win32_device_name() - instead of get_device_number() after evaluating mount points - to allow changing the win32 destination path again. - * security.cc (str2buf2uni): Remove `static' to be able to - call function from fhandler_dev_raw::open(). - * wincap.cc: Set flag has_raw_devices appropriately. - * wincap.h: Add flag has_raw_devices. - -2001-10-16 Christopher Faylor - - * cygheap.h (cygheap_fdget::cygheap_fdget): Remove debugging operation - from set_errno. - -2001-10-16 Christopher Faylor - - * mmap.cc (mmap): Assign 'fh' from cygheap_fdget. Use 'fh' everywhere. - -2001-10-15 Christopher Faylor - - * cygerrno.h (set_errno): Define more informative version of this - function for debugging. - (__set_errno): Declare when DEBUGGING. - * cygheap.h (cygheap_fdget::cygheap_fdget): Add a flag to control when - errno is set. - * debug.cc (__set_errno): New function. - * fcntl.cc (_fcntl): Fix so that correct fd is used for second argument - to dup2. - * syscalls.cc (_cygwin_istext_for_stdio): Don't set errno here when - using cygheap_fdget. - -2001-10-15 Christopher Faylor - - * fhandler.cc (fhandler_base::fork_fixup): Don't protect handle. - - * dlfcn.cc: Fix to confirm to coding standards. - - Reorganize includes throughout to accommodate new cygheap.h usage. - * cygheap.h (cygheap_fdmanip): New class: simplifies locking and - retrieval of fds from cygheap->fdtab. - (cygheap_fdget): Ditto. - (cygheap_fdnew): Ditto. - * fcntl.cc (_fcntl): Use new method to lock fdtab and retrieve info. - * ioctl.cc (ioctl): Ditto. - * mmap.cc (mmap): Ditto. - * net.cc: Ditto, throughout. - * passwd.cc (getpass): Ditto. - * path.cc (fchdir): Ditto. - * pipe.cc (make_pipe): Ditto. - * sec_acl.cc (facl): Ditto. - * syscalls.cc: Ditto, throughout. - * termios.cc: Ditto, throughout. - -2001-10-15 Corinna Vinschen - - * uname.cc (uname): Use `wProcessorLevel' unless OS sets it wrong. - Use `dwProcessorType' then instead. - * wincap.cc: Set flag has_valid_processorlevel appropriately. - * wincap.h: Add flag has_valid_processorlevel. - -2001-10-14 Christopher Faylor - - * dtable.cc (dtable::build_fhandler_from_name): Use PC_FULL to - determine path name. - * path.cc (fchdir): Remove rel -> abs path conversion. - -Sun Oct 14 08:10:12 2001 Gary R. Van Sickle - - * fork.cc (fork_parent): Correct the "unable to allocate - forker_finished event" error message. It named the wrong event before. - -2001-10-13 Christopher Faylor - - * autoload.cc (load_wsock32): Declare dummy function to force loading - of winsock. - * fhandler.cc (fhandler_base::set_inheritance): Make debugging output - more verbose. - * fhandler_socket.cc (fhandler_socket::fixup_after_fork): Force loading - of winsock32 if winsock2 not available. - * net.cc (set_socket_inheritance): Use DuplicateHandle in all cases to - set inheritance correctly. - (fdsock): Use winsock2_active macro to determine when to set socket - inheritance. Remove fdtab resource locking since this function should - already be protected. - (cygwin_accept): Simplify logic. Ensure that fdtab unlock is not - called inappropriately. - (cygwin_rcmd): Use fdtab locking. - (cygwin_rresvport): Ditto. - (cygwin_rexec): Ditto. - * select.cc (peek_socket): Set errno appropriately if winsock select - fails. - -2001-10-13 Kazuhiro Fujieda - - * winsup.h: Declare check_pty_fds. - * syscalls.cc (check_pty_fds): Rename from check_ttys_fds. Also check - pty master. - (setsid): Use check_pty_fds. - * dtable.cc (dtable::dec_console_fds): Add check on pty fds. - -2001-10-13 Ralf Habacker - - * fhandler_dsp.cc (fhandler_dsp::ioctl): Return 0 for successful - SNDCTL_DSP_GETBLKSIZE operation. - -2001-10-13 Christopher Faylor - - Remove obsolete 'name' arg from fhandler_* constructors throughout. - * winsup.h (winsock_active): New macro. - (winsock2_active): Ditto. - * autoload.cc (wsock_init): Use new macros to decide if winsock or - winsock2 is loaded. - (nonexist_wsock32): Dummy function to force winsock load. - (nonexist_ws2_32): Dummy function to force winsock2 load. - * fhandler.h (fhandler_socket::fstat): Declare new method. Currently - unused. - * fhandler_socket.cc (fhandler_socket::fixup_before_fork_exec): Check - that winsock2 is active before trying WSADuplicateSocketA. - (fhandler_socket::fixup_after_fork): Add extra check for - winsock2_active. Otherwise use iffy procedures for Windows 95. - (fhandler_socket::fixup_after_exec): Add debugging. - (fhandler_socket::dup): Add debugging. - (fhandler_socket::fstat): New method. - (fhandler_socket::set_close_on_exec): Attempt to perform iffy stuff on - Windows 95. - - * errno.cc (_sys_nerr): Work around compiler strangeness. - - * pinfo.cc (winpids::add): Add extra element at end of allocated array - for setting to NULL. - (winpids::enumNT): Ditto. - (winpids::init): Don't modify pidlist if it hasn't been allocated - (possibly due to malloc problem). - -2001-10-12 Christopher Faylor - - * autoload.cc (wsock_init): Reorganize slightly to accommodate a new - compiler. - -2001-10-11 Egor Duda - - * net.cc (cygwin_sendto): Use correct socket address when sending - data to AF_UNIX socket. - -Wed Oct 10 16:10:41 2001 Alexander Gottwald - - * net.cc (get_95_ifconf): Using other registry values pointing to - correct networkdevice identification for Windows95. - -Tue Oct 9 22:22:45 2001 Christopher Faylor - - Throughout, rename PROC_FORK1 to PROC_FORK. - * child_info.h: Rename PROC_* to _PROC_*. Define PROC_* with - additional testing magic. Eliminate old PROC_FORK and rename - PROC_FORK1 to PROC_FORK. - * dcrt0.cc (_cygwin_testing_magic): New variable. Added to magic - number in proc_info. - (alloc_stack): Eliminate old PROC_FORK test. - (dll_crt0_1): Ditto. Use _PROC_* enums for test. Subtract - _cygwin_testing_magic from child_proc_info->type so that normal cygwin - programs invoked by test suite programs do not consider themselves to - be in a cygwin environment. - (_dll_crt0): Ditto. Move environment checks to initial_env function to - conserve on stack space. - (initial_env): New function. Checks for testing and debugging - environment variables. - * init.cc (cygwin_hmodule): Move declaration. - * winsup.h: Declare variables used for cygwin testing. - -Tue Oct 9 19:17:53 2001 Christopher Faylor - - * uinfo.cc (internal_getlogin): Reorganize slightly to minimize work in - default condition. - -Tue Oct 9 18:53:00 2001 Corinna Vinschen - - * fhandler.cc (fhandler_disk_file::open): Add missing case clash check. - -Mon Oct 8 01:47:27 2001 Christopher Faylor - - * dtable.cc (dtable::build_fhandler): Allocate correct amount for given - fhandler class. - * fhandler.h (fhandler_union): Properly define rather than relying on - fhandler_console being "big enough". - -Mon Oct 8 00:25:18 2001 Christopher Faylor - - * external.cc (fillout_pinfo): Reset counter whenever we initialize the - pid list. - -Sun Oct 7 17:16:05 2001 Christopher Faylor - - * path.cc (normalize_posix_path): Don't eat a '.' after a '\\' since it - has special meaning on NT. - - * syscalls.cc (access): Use stat_worker. - -Fri Oct 5 21:01:14 2001 Christopher Faylor - - * fhandler.cc (fhandler_base::fork_fixup): Protect dup'ed handle and - record it as non-inheritable for debugging purposes in case there is a - subsequent fork or exec. - * fhandler_tty.cc (fhandler_tty_common::fixup_after_fork): Allow - fork_fixup to call ProtectHandle. - -Fri Oct 5 14:22:47 2001 Christopher Faylor - - * path.cc (get_raw_device_number): Correct length arguments for - wdeveqn. - -Fri Oct 5 11:05:32 2001 Christopher Faylor - - * path.cc (getcwd): Allow NULL first argument. - -Fri Oct 5 00:31:35 2001 Christopher Faylor - - * heap.h (inheap): Check for NULL. - -Thu Oct 4 23:17:49 2001 Christopher Faylor - - Add second path_conv * argument to fstat()s throughout. - * fhandler.h: Change read and fstat to regparm/stdcall throughout. - (fhandler_base::fstat): Just declare. Don't define. - (fhandler_disk_file::fstat_helper): Declare. - * fhandler.cc (fhandler_base::fstat): Move here from fhandler.h, adapt - from former stat_dev(). - (fhandler_disk_file::fstat): Move most of the disk-file-specific logic - from stat_worker to here. Use fstat_helper to derive final fstat - output. - (fhandler_disk_file::fstat_helper): New method, renamed from former - fstat method. - (num_entries): Moved here from syscalls.cc. - * fhandler_mem.cc (fhandler_dev_mem::fstat): Use base class to - initialize most stuff. Invert has_physical_mem_access test for - establishing permissions. - * fhandler_raw.cc (fhandler_dev_raw::fstat): Eliminate unneed test and - memory clearing. Use base class to initialize most stuff. - * syscalls.cc (stat_dev): Eliminate. - (stat_worker): Simply call fstat method to generate fstat output. Move - all device specific code to appropriate fstats. - - * dir.cc (opendir): Pass correct arg to stat_worker to allow following - symlinks. - -Thu Oct 4 21:37:57 2001 Christopher Faylor - - * spawn.cc (perhaps_suffix): Return NULL on non-existence of file as - well as "directoryness". Previous code modified on 2001/09/30 actually - had an arguable bug which was unmasked by the change on that day. - -Thu Oct 4 20:52:42 2001 Christopher Faylor - - * path.cc (path_conv::check): Return ENOTDIR when leading device and - trailing component. - -Thu Oct 4 18:49:23 2001 Christopher Faylor - - * syscalls.cc (stat_worker): Make global. Accept path_conv parameter - for passing information back to caller. - * winsup.h: Declare stat_worker. - * dir.cc (opendir): Use stat_worker rather than stat and pass path_conv - parameter to stat_worker for later inspection. - -2001-10-04 Karellen (karellen@boreworms.com) - - * syslog.cc (syslog): Teach syslog about syslog priorities other than - LOG_ERR, LOG_WARNING and LOG_INFO - -Thu Oct 4 15:50:03 2001 Christopher Faylor - - * path.cc (path_conv::check): Don't perform file system or rootdir - checks on devices. - -Wed Oct 3 19:40:36 2001 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Don't close hexec_proc if it is NULL. - - * fork.cc (vfork): Add debugging statements. - - * path.cc (get_device_number): Make static. Rewrite to inspect both unix - and windows paths. - (get_raw_device_number): Just check for parts of raw device that we - care about. - (get_devn): New function, pulled from get_device_number. - (win32_device_name): Accommodate arg changes to get_device_number. - (mount_info::get_device_number): Call get_device_number on translated - Windows path. - - * spawn.cc (spawn_guts): Don't treat P_VFORK differently from P_NOWAIT. - Add handle to child's shared region to child so that it will be - preserved if the parent goes away. - * fhandler.h: Throughout, simplify to one open method for all fhandler - classes, requiring a path_conv first element. - * fhandler.cc (fhandler_base::open): Remove obsolete method. - Generalize to require path_conv * as first argument. - (fhandler_disk_file::open): Remove obsolete method. - (fhandler_disk_file::open): Use path_conv pointer rather than - reference. - * fhandler_clipboard.cc (fhandler_dev_clipboard::dup): Use new open - method. - (fhandler_dev_clipboard::open): Accommodate new argument for open - methods. - * fhandler_console.cc (fhandler_console::open): Ditto. - (fhandler_console::dup): Use new open method. - (fhandler_console::fixup_after_fork): Ditto. - (fhandler_console::fixup_after_exec): Ditto. - * fhandler_dsp.cc (fhandler_dev_dsp::open): Accommodate new argument for - open methods. - * fhandler_floppy.cc (fhandler_dev_floppy::open): Ditto. - * fhandler_mem.cc (fhandler_dev_mem::open): Ditto. - * fhandler_random (fhandler_dev_random::open): Ditto. - * fhandler_raw.cc (fhandler_dev_raw::open): Ditto. - * fhandler_serial.cc (fhandler_serial::open): Ditto. - * fhandler_tape.cc (fhandler_dev_tape::open): Ditto. - * fhandler_tty.cc (fhandler_tty_slave::open): Ditto. - (fhandler_pty_master::open): Ditto. - * fhandler_windows.cc (fhandler_windows::open): Ditto. - * fhandler_zero.cc (fhandler_dev_zero::open): Ditto. - * fhandler_socket.cc (fhandler_socket::set_connect_secret): Accommodate - new argument for open methods. - * syscalls.cc (_open): Ditto. - (stat_worker): Ditto. - -Tue Oct 2 23:49:18 2001 Christopher Faylor - - * cygheap.cc (cfree): Remove malloc debugging probe. - * dlmalloc.c (errprint): Remove abort() call which causes interesting - error message printing to abort prematurely. - * environ.cc: Sprinkle MALLOC_CHECKs liberally throughout. - (_addenv): Allocate two empty elements at end of environ to - (apparently) work around problems with some buggy applications. - (winenv): Avoid calling alloca if no forced environment variable is - present. - - * exceptions.cc (open_stackdumpfile): Don't print "Dumping stack trace - to..." when running in a cygwin environment (i.e., the parent is a - cygwin process). - - * dtable.cc (dtable::init_std_file_from_handle): Move device type - detection code from build_fhandler here since it is only used by this - function. - (dtable::build_fhandler_from_name): New method. Renamed from - dtable::build_fhandler. - (dtable::build_fhandler): Use build_fhandler_from_name. - (cygwin_attach_handle_to_fd): Ditto. - * syscalls.cc (_open): Ditto. - (stat_worker): Ditto. - * dtable.h (dtable::build_fhandler_from_name): Rename declaration from - dtable::build_fhandler. - -Mon Oct 1 16:52:23 2001 Christopher Faylor - - * dtable.h (dtable::build_fhandler): Make path_conv parameter - non-optional. - (dtable::init_std_file_from_handle): Eliminate name parameter. - * dtable.cc (stdio_init): Don't pass bogus name to - init_std_file_from_handle. The function will figure out the name - itself. - (dtable::init_std_file_from_handle): Eliminate name parameter. Assume - that we're always called with an appropriate fd. Pass name as NULL if - we can't simply figure it out from context. - (cygwin_attach_handle_to_fd): Pass path_conv argument to - build_fhandler. - (dtable::build_fhandler): Make path_conv argument mandatory. Eliminate - specific call to get_device_number. With unknown device names, set - name from handle context for parsing by path_conv. - (dtable::build_fhandler): Pass path_conv argument to build_fhandler. - * path.h (path_conv::set_isdisk): Set disk device type. - (path_conv::is_device): Don't consider FH_DISK a "device". - * syscalls.cc (_open): Pass path_conv argument by reference. - (stat_worker): Ditto. - (_rename): Use path_conv operators. Add bounds to DeleteFile/MoveFile - for loop. - -Mon Oct 1 14:25:00 2001 Charles Wilson - - * cygwin.din: export strtoll and strtoull - -Sun Sep 30 22:51:41 2001 Christopher Faylor - - Add "path.h" include throughout, where needed. Use new path_conv - methods and operators to simplify testing for directory and attributes, - throughout. - * path.h (path_conv::exists): New method. - (path_conv::has_attribute): Ditto. - (path_conv::isdir): Ditto. - (path_conv::DWORD &): New operator. - (path_conv::int &): Ditto. - * dir.cc (rmdir): Eliminate a goto. - * dtable.cc (dtable::build_fhandler): Accept opt and suffix info for - path_conv.check. Return fh == NULL on path_conv error. Pass unit to - set_name as appropriate. - (dtable::reset_unix_path_name): New method. - * dtable.h (dtable): Declare new method. Reflect arg changes to - build_fhandler. - * fhandler.cc (fhandler_disk_dummy_name): Eliminate. - (fhandler_base::set_name): Expect paths to be NULL. Build - unix_path_name from win32_path_name when it is a device. - (fhandler_base::reset_unix_path_name): New method. - (fhandler_base::raw_read): Report EISDIR when ERROR_INVALID_FUNCTION - or ERROR_INVALID_PARAMETER and reading a directory. - (fhandler_disk_file::fstat): Don't call stat_dev since we should now - never be calling fhandler_disk_file methods with devices. - (fhandler_base::fhandler_base): Clear {unix,win32}_path_name. - (fhandler_base::~fhandler_base): Always free {unix,win32}_path_name. - (fhandler_disk_file::fhandler_disk_file): Remove set_no_free_names - kludge. - (fhandler_disk_file::open): Ditto. - * fhandler.h (fhandler_base::no_free_names): Eliminate. - (fhandler_base::set_no_free_names): Ditto. - * fhandler_tty.cc (fhandler_tty_slave::fhandler_tty_slave): Don't set - unix_path_name here. - * path.cc (fchdir): Lock fd table throughout. Use new - dtable::reset_unix_path_name method to reset path. - * syscalls.cc (stat_worker): Reorganize to always call fstat method. - Pass path_conv method to fhandler_*::open. - (chroot): Elminate a goto. - -Sun Sep 30 17:37:43 2001 Christopher Faylor - - * environ.cc (winenv): Allocate exact amount of space needed for forced - windows environment variable rather than just using MAX_PATH. - -Sun Sep 30 17:10:18 2001 Christopher Faylor - - * Makefile.in: Depend on stamp to ensure rebuilding. Remove stamp file - when we've just built the DLL. - -Mon Oct 1 00:34:00 2001 Robert Collins - - * thread.cc (pthread_cond_dowait): Hopefully eliminate a race on multiple thread - wakeups. - -Sat Sep 29 18:26:00 2001 Robert Collins - - * pthread.cc (pthread_cond_timedwait): Deleted - exported from thread.cc. - (pthread_cond_wait): Deleted - exported from thread.cc. - * thread.cc (pthread_cond::BroadCast): Update to use the new syntax for - verifyable_object_isvalid (). - (pthread_cond::Signal): Ditto. Also attempt to fix the lost signal race - with pthread_cond::TimedWait(). - (check_valid_pointer): Change definiton to void const *. - (verifyable_object_isvalid): Add new parameter to allow identification of - static initializers, and return a enum rather than magic numbers. - (__pthread_create): Ditto. - (__pthread_cleanup): Ditto. - (__pthread_attr_init): Ditto. - (__pthread_attr_getinheritsched): Ditto. - (__pthread_attr_getschedparam): Ditto. - (__pthread_attr_getschedpolicy): Ditto. - (__pthread_attr_getscope): Ditto. - (__pthread_attr_setdetachstate): Ditto. - (__pthread_attr_getdetachstate): Ditto. - (__pthread_attr_setinheritsched): Ditto. - (__pthread_attr_setschedparam): Ditto. - (__pthread_attr_setschedpolicy): Ditto. - (__pthread_attr_setscope): Ditto. - (__pthread_attr_setstacksize): Ditto. - (__pthread_attr_getstacksize): Ditto. - (__pthread_attr_destroy): Ditto. - (__pthread_join): Ditto. - (__pthread_detach): Ditto. - (__pthread_suspend): Ditto. - (__pthread_continue): Ditto. - (__pthread_getschedparam): Ditto. - (__pthread_getsequence_np): Ditto. - (__pthread_key_create): Ditto. - (__pthread_key_delete): Ditto. - (__pthread_setschedparam): Ditto. - (__pthread_setspecific): Ditto. - (__pthread_getspecific): Ditto. - (__pthread_cond_destroy): Ditto. - (__pthread_cond_init): Ditto. - (__pthread_cond_broadcast): Ditto. - (__pthread_cond_signal): Ditto. - (__pthread_condattr_init): Ditto. - (__pthread_condattr_getpshared): Ditto. - (__pthread_condattr_setpshared): Ditto. - (__pthread_condattr_destroy): Ditto. - (__pthread_kill): Ditto. - (__pthread_mutex_init): Ditto. - (__pthread_mutex_getprioceiling): Ditto. - (__pthread_mutex_lock): Ditto. - (__pthread_mutex_trylock): Ditto. - (__pthread_mutex_unlock): Ditto. - (__pthread_mutex_destroy): Ditto. - (__pthread_mutex_setprioceiling): Ditto. - (__pthread_mutexattr_getprotocol): Ditto. - (__pthread_mutexattr_getpshared): Ditto. - (__pthread_mutexattr_gettype): Ditto. - (__pthread_mutexattr_init): Ditto. - (__pthread_mutexattr_destroy): Ditto. - (__pthread_mutexattr_setprotocol): Ditto. - (__pthread_mutexattr_setprioceiling): Ditto. - (__pthread_mutexattr_getprioceiling): Ditto. - (__pthread_mutexattr_setpshared): Ditto. - (__pthread_mutexattr_settype): Ditto. - (__sem_init): Ditto. - (__sem_destroy): Ditto. - (__sem_wait): Ditto. - (__sem_trywait): Ditto. - (__sem_post): Ditto. - (__pthread_cond_dowait): New function, contains core logic from - __pthread_cond_wait and __pthread_cond_timedwait. Decrement (*cond)->waiting - before reentering the cond access mutex to allow detection of lost signals. - (__pthread_cond_timedwait): Rename to pthread_cond_timedwait, and call - __pthread_cond_dowait after calculating the wait length. - (__pthread_cond_wait): Rename to pthread_cond_wait, and call - __pthread_cond_dowait. - * thread.h: New enum for use with verifyable_object_isvalid. - Remove the extern exporting of __pthread_cond_timedwait and __pthread_cond_wait. - -Fri Sep 28 21:18:50 2001 Christopher Faylor - - * pipe.cc (fhandler_pipe::fixup_after_fork): New method. - * fhandler.h (fhandler_pipe::fixup_after_fork): Declare new method. - -Fri Sep 28 03:23:04 2001 Christopher Faylor - - * passwd.cc (read_etc_passwd): Bother with unlocking when not - in cygwin initialization. - * grp.cc (read_etc_group): Ditto. - -Fri Sep 28 02:57:03 2001 Christopher Faylor - - * passwd.cc (read_etc_passwd): Don't bother with locking when - in cygwin initialization since there is only one thread. - * grp.cc (read_etc_group): Ditto. - -Fri Sep 28 01:50:09 2001 Christopher Faylor - - * pipe.cc (fhandler_pipe::hit_eof): Return correct value when there is - no EOF event available. - -Sat Sep 28 00:34:00 2001 Corinna Vinschen - - * mmap.cc (mmap): Move setting the access after evaluating fd. - Remove useless comment. Explain copy-on-write problem of 9x - more detailed. Don't set access to FILE_MAP_COPY on 9x only - when anonymous mapping is requested. - (fhandler_disk_file::mmap): Remove useless device check. - Add debug output. - -Fri Sep 27 07:35:00 2001 Robert Collins - - * Makefile.in: Only stamp winver_stamp on success. - -Wed Sep 26 16:02:35 2001 Christopher Faylor - - * select.cc (peek_pipe): REALLY only grab mutex when we actually got - something from the pipe. - -Tue Sep 25 21:25:00 2001 Robert Collins - - * thread.cc (pthread_cond::BroadCast): Use address with verifyable_object_isvalid(). - (pthread_cond::Signal): Ditto. - (__pthread_create): Ditto. - (__pthread_cleanup): Ditto. - (__pthread_attr_init): Ditto. - (__pthread_attr_getinheritsched): Ditto. - (__pthread_attr_getschedparam): Ditto. - (__pthread_attr_getschedpolicy): Ditto. - (__pthread_attr_getscope): Ditto. - (__pthread_attr_setdetachstate): Ditto. - (__pthread_attr_getdetachstate): Ditto. - (__pthread_attr_setinheritsched): Ditto. - (__pthread_attr_setschedparam): Ditto. - (__pthread_attr_setschedpolicy): Ditto. - (__pthread_attr_setscope): Ditto. - (__pthread_attr_setstacksize): Ditto. - (__pthread_attr_getstacksize): Ditto. - (__pthread_attr_destroy): Ditto. - (__pthread_join): Ditto. - (__pthread_detach): Ditto. - (__pthread_suspend): Ditto. - (__pthread_continue): Ditto. - (__pthread_getschedparam): Ditto. - (__pthread_getsequence_np): Ditto. - (__pthread_key_create): Ditto. - (__pthread_key_delete): Ditto. - (__pthread_setschedparam): Ditto. - (__pthread_setspecific): Ditto. - (__pthread_getspecific): Ditto. - (__pthread_cond_destroy): Ditto. - (__pthread_cond_init): Ditto. - (__pthread_cond_broadcast): Ditto. - (__pthread_cond_signal): Ditto. - (__pthread_cond_timedwait): Ditto. - (__pthread_cond_wait): Ditto. - (__pthread_condattr_init): Ditto. - (__pthread_condattr_getpshared): Ditto. - (__pthread_condattr_setpshared): Ditto. - (__pthread_condattr_destroy): Ditto. - (__pthread_kill): Ditto. - (__pthread_mutex_init): Ditto. - (__pthread_mutex_getprioceiling): Ditto. - (__pthread_mutex_lock): Ditto. - (__pthread_mutex_trylock): Ditto. - (__pthread_mutex_unlock): Ditto. - (__pthread_mutex_destroy): Ditto. - (__pthread_mutex_setprioceiling): Ditto. - (__pthread_mutexattr_getprotocol): Ditto. - (__pthread_mutexattr_getpshared): Ditto. - (__pthread_mutexattr_gettype): Ditto. - (__pthread_mutexattr_init): Ditto. - (__pthread_mutexattr_destroy): Ditto. - (__pthread_mutexattr_setprotocol): Ditto. - (__pthread_mutexattr_setprioceiling): Ditto. - (__pthread_mutexattr_getprioceiling): Ditto. - (__pthread_mutexattr_setpshared): Ditto. - (__pthread_mutexattr_settype): Ditto. - (__sem_init): Ditto. - (__sem_destroy): Ditto. - (__sem_wait): Ditto. - (__sem_trywait): Ditto. - (__sem_post): Ditto. - (verifyable_object_isvalid): Recieve a pointer to a pointer for verification. - (__pthread_mutexattr_getprotocol): Fix typo in magic number. - (__pthread_mutexattr_getpshared): Ditto. - (__pthread_mutexattr_gettype): Ditto. - * thread.h (verifyable_object_isvalid): Change prototype to recieve a pointer to a - pointer for verification. - * include/pthread.h: Fix typo for __cleanup_routine_type typedef. (Contrib from Net). - -Tue Sep 25 02:09:42 2001 Christopher Faylor - - * select.cc (fhandler_tty_common::ready_for_read): Rewrite to correctly - call peek_pipe. - -Mon Sep 24 18:46:39 2001 Christopher Faylor - - * select.cc (peek_pipe): Only grab mutex when we actually got something - from the pipe. - -Mon Sep 24 17:41:03 2001 Christopher Faylor - - * fhandler.h (fhandler_pipe::hit_eof): New method. - (writepipe_exists): New class element. - (orig_pid): Ditto. - (id): Ditto. - (is_slow): Eliminate. - * pipe.cc (fhandler_pipe::set_close_on_exec): Set inheritance on - writepipe_exists, if it exists. - (fhandler_pipe::hit_eof): New method, modelled after tty. - (fhandler_pipe::dup): Duplicate writepipe_exists, if it exists. - (make_pipe): Set up a dummy event for pipes on windows 9x. The - nonexistence of this event means that the write side of the - pipe has closed. - (_dup): Move to syscalls.cc - (_dup2): Ditto. - - * dtable.cc (dtable::build_fhandler): Fill out set_names here, if - appropriate. - * syscalls.cc (_open): Call set_names in build_fhandler. - -Sun Sep 23 16:55:00 2001 Corinna Vinschen - - * syscalls.cc (_open): Set name in fhandler object after successful - creation. - (stat_dev): Set device type to block device in FH_FLOPPY case. - -Sun Sep 23 11:15:00 2001 Corinna Vinschen - - * dtable.cc (dtable::build_fhandler): Initialize unit when using - optional path_conv argument. - -Sat Sep 22 17:33:45 2001 Christopher Faylor - Corinna Vinschen - - * dtable.cc (dtable::build_fhandler): Accept an optional path_conv - argument. If available, use this to calculate path name and device - number. - * dtable.h (dtable): Reflect above change. - * fhandler.h (fhandler_base): Declare virtual method which accepts - path_conv rather than path string as first argument. - * fhandler.cc (fhandler_base::open): Define above new method. - * syscalls.cc (_open): Set aside a path_conv variable for use in - build_fhandler and subsequent call to open. - -Sat Sep 22 12:44:57 2001 Christopher Faylor - - * exceptions.cc (setup_handler): Always relinquish lock after we've - interrupted. - * fhandler.cc: Move pipe methods to pipe.cc. - * fhandler.h (fhandler_pipe): Add new methods. - * fork.cc (sync_with_parent): Make error messages more informative. - * pipe.cc (fhandler_pipe::fhandler_pipe): Move here from fhandler.cc. - (fhandler_pipe::lseek): Ditto. - (fhandler_pipe::set_close_on_exec): New method. - (fhandler_pipe::read): Ditto. - (fhandler_pipe::close): Ditto. - (fhandler_pipe::dup): Ditto. - (make_pipe): Create the guard mutex on the read side of the pipe. - * select.cc (peek_pipe): Use guard_mutex to discover if we have the - right to read on this pipe. - (fhandler_pipe::readh_for_read): Pass the read pipe guard mutex to - peek_pipe. - * syscalls.cc (_read): Always detect signal catchers, for now. - - * debug.cc (makethread): Eliminate hack to make thread inheritable. - * sigproc.cc (subproc_init): Don't use hack to make thread inheritable. - -Thu Sep 20 16:48:44 2001 Christopher Faylor - - * fhandler.cc (fhandler_base::set_inheritance): Just use - DUPLICATE_CLOSE_SOURCE to change inheritance. Eliminate all other - logic dealing with closed handles. - * fhandler.h (fhandler_base::set_inheritance): Reflect above change. - * fhandler_tty.cc (fhandler_tty_common::set_close_on_exec): Ditto. - -Thu Sep 20 13:34:00 2001 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::fixup_after_exec): Close - socket only when not using Winsock2. - -Thu Sep 20 13:20:00 2001 Corinna Vinschen - - * fhandler.h (fhandler_socket::fixup_after_exec): Remove inline - implementation. - (fhandler_dev_raw::fixup_after_exec): Ditto. - * fhandler_raw.cc (fhandler_dev_raw::fixup_after_fork): Don't - duplicate buffer on fork to avoid memory leak. - (fhandler_dev_raw::fixup_after_exec): New implementation equal to - former fixup_after_fork() implementation. - * fhandler_socket.cc (fhandler_socket::fixup_after_fork): Do - nothing when not using Winsock2. - (fhandler_socket::fixup_after_exec): New implementation. - (fhandler_socket::set_close_on_exec): Never call set_inheritance(). - -Thu Sep 20 9:55:00 2001 Corinna Vinschen - - * fhandler.cc (fhandler_base::set_inheritance): If available, - use SetHandleInformation() to set inheritance. - * wincap.cc: Set flag has_set_handle_information_on_console_handles - appropriately. - * wincap.h: Add flag has_set_handle_information_on_console_handles. - -Wed Sep 19 12:24:09 2001 Christopher Faylor - - * lib/getopt.c (__progname): Don't declare if not compiling for cygwin. - -Wed Sep 19 18:07:00 2001 Corinna Vinschen - - * lib/getopt.c (getopt_long): Avoid compiler warning. - -Wed Sep 19 11:52:42 2001 Christopher Faylor - - * lib/getopt.c: Use __progname==__argv[0] when not compiling for cygwin. - - * scandir.cc (scandir): Use correct default when compar == NULL. - -Wed Sep 19 17:49:00 2001 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::fhandler_socket): Revert - memory allocation to use cmalloc again. - -Tue Sep 18 21:04:26 2001 Christopher Faylor - - * cygwin.din (__argv): Export. - (__argc): Ditto. - (__progname): Ditto. - * include/getopt.h (getopt_long): constify arguments. - * lib/getopt.c: Import new file from NetBSD. - -Tue Sep 18 18:21:00 2001 Corinna Vinschen - - * mmap.cc (mmap): Don't reuse anonymous memory in MAP_FIXED case. - -Mon Sep 17 17:29:25 2001 Christopher Faylor - - * include/io.h: Add access declaration. - -Mon Sep 17 14:04:27 2001 Christopher Faylor - - * syscalls.cc (rmdir): Set cwd to some other location if attempting to - rmdir current working directory. - -Sun Sep 16 23:04:31 2001 Christopher Faylor - - * dtable.h (not_open): Assure inline. - * fhandler.h (operator []): Make const. - -Sun Sep 16 23:02:57 2001 Robert Collins - - * sync.cc (muto::~muto): Fix typo which stopped muto event handle from - ever being closed. - -2001-09-16 Egor Duda - - * path.cc (symlink): Check arguments for validity. - (getcwd): Ditto. - * syscalls.cc (ftruncate): Ditto. - * times.cc (times): Ditto. - * uname.cc (uname): Ditto. - -Sat Sep 15 22:54:49 2001 Christopher Faylor - - * net.cc (dup_servent_ptr): Detect old Windows 95 misaligned structure - and realign appropriately. - -Sat Sep 15 00:28:40 2001 Christopher Faylor - - * Makefile.in: Generate libcygwin.a during the link pass rather than as - a separate dlltool step. - * dcrt0.cc (_dll_crt0): pppid_handle could be NULL. Don't close it if - so. - -Fri Sep 14 20:48:18 2001 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Create vfork main storage here so that it can - be queried in waitsig later. - * sigproc.cc (wait_sig): Don't deliver a signal if in a vfork. - * sigproc.h (sigframe::init): New method. - (sigframe): Use init. - * perthread.h: Declare main_vfork. - * fork.cc (vfork): Deliver all signals on parent return from vfork. - -Fri Sep 14 10:21:00 2001 Corinna Vinschen - - * dcrt0.cc (_dll_crt0()): Don't call wincap.init() here. - -Fri Sep 14 00:37:54 2001 Christopher Faylor - - * fork.cc (vfork): Avoid recursive vforks. - -Fri Sep 14 00:18:52 2001 Christopher Faylor - - * fhandler.h (fhandler_pipe::is_slow): Return true only if pipes are - reliable (i.e., not Win9x). - * wincap.cc: Make statics NO_COPY to avoid fork overhead. - -Thu Sep 13 23:01:00 2001 Christopher Faylor - - * grp.cc (read_etc_group): Just reuse group_buf storage for subsequent - reread of /etc/group. - * passwd.cc (read_etc_passwd): Just reuse passwd_buf storage for - subsequent reread of /etc/passwd. - -Thu Sep 13 20:46:05 2001 Christopher Faylor - - * cygheap.cc (dup_now): New function. - (cygheap_setup_for_child): Accept new argument controlling whether to - delay copying of cygheap to shared memory region. - (cygheap_setup_for_child_cleanup): Accept new arguments controlling - whether to copy cygheap at this point. - * cygheap.h: Reflect above changes. - * fork.cc (fork_parent): Break copying of cygheap into two parts when - fork_fixup is required so that the child can see the parent's changes. - (vfork): Do stack cleanup prior to forcing a fork error. - * spawn.cc (spawn_guts): Ditto. - -Thu Sep 13 17:14:59 2001 Christopher Faylor - - * cygheap.cc (ccalloc): Pass correct length to creturn so that - cygheap_max is correctly calculated. - -Wed Sep 12 21:06:38 2001 Christopher Faylor - - * sync.cc (muto::acquire): Fix while/if typo. - -Wed Sep 12 23:06:00 2001 Corinna Vinschen - - * wincap.cc (wincapc::init): Simplify W2K/XP case. - -Wed Sep 12 23:02:00 2001 Corinna Vinschen - - * wincap.cc (wincapc::init): Set os name to "NT" on XP, too. - -Wed Sep 12 19:00:00 2001 Corinna Vinschen - - * Makefile.in: Build wincap.o. - * wincap.cc: New file. - * wincap.h: Ditto. - * autoload.cc: Add dynamic load statement for `CreateHardLinkA'. - * dcrt0.cc (os_being_run): Eliminated. - (osname): Ditto. - (iswinnt): Ditto. - (set_os_type): Ditto. - (dll_crt0_1): Call wincap.init() instead of set_os_type(). - (_dll_crt0): Ditto. - * environ.cc (set_chunksize): New function. - (parse_thing): `forkchunk' setting now invokes function `set_chunksize'. - * fork.cc (chunksize): Eliminated. Moved to be member of wincap. - * host_dependent.h: Removed. - * syscalls.cc (_link): Try using `CreateHardLinkA' first, if available. - * cygheap.cc, dcrt0.cc, delqueue.cc, dir.cc, - environ.cc, fhandler.cc, fhandler.h, fhandler_console.cc, - fhandler_mem.cc, fork.cc, mmap.cc, net.cc, pinfo.cc, pinfo.h, - security.cc, syscalls.cc, sysconf.cc, syslog.cc, thread.cc, - times.cc, tty.cc, uinfo.cc, uname.cc, winsup.h: Use new wincap - capability check throughout. - * winsup.h: Include wincap.h. Eliminate extern declarations of - `os_being_run' and `iswinnt'. Eliminate `os_type" definition. - * include/cygwin/version.h: Bump version to 1.3.4. - -Wed Sep 12 01:03:36 2001 Christopher Faylor - - * exceptions.cc (call_signal_handler_now): Add additional guard against - inappropriately calling signal handler. - * syscalls.cc (_read): Reset errno if not exiting due to signal. - -Wed Sep 12 13:03:00 2001 Robert Collins - - * autoload.cc (LoadDLLfuncEx): Auto load TryEnterCriticalSection - it's - an NT only call. - * thread.cc (pthread_cond::TimedWait): Use critical sections for NT. - (pthread_cond::fixup_after_fork): Don't detect bad apps. - (pthread_mutex::pthread_mutex): Use critical sections for NT. - (pthread_mutex::~pthread_mutex): Ditto. - (pthread_mutex::Lock): Ditto. - (pthread_mutex::TryLock): Ditto. - (pthread_mutex::UnLock): Ditto. - (pthread_mutex::fixup_after_fork): Ditto. Also do not detect bad apps. - (__pthread_mutex_trylock): Move WIN32 specific test into the class - method. - (__pthread_mutex_destroy): Prevent dereferencing passed pointer without - valid address. - * thread.h (pthread_mutex): Use critical sections for NT. - -Tue Sep 11 21:55:37 2001 Christopher Faylor - - * sigproc.h (sigframe::unregister): Return true/false whether this - frame is capable of responding to signals. - * exceptions.cc (sigframe::call_signal_handler): Don't call signal - handler if it is not armed for this thread. - -Tue Sep 11 11:23:10 2001 Christopher Faylor - - * cygwin.din: Remove cygwin_getshared. - * shared.cc: Ditto. - * include/cygwin/version.h: Bump API minor number. - -Tue Sep 11 11:14:11 2001 Dmitry Timoshkov - - * dtable.cc (dtable::build_fhandler): Fix incorrect test for socket. - -Tue Sep 11 21:22:00 2001 Robert Collins - - * thread.cc (pthread_cond::~pthread_cond): Fix incorrect use of - InterlockExchangePointer. - (pthread_mutex::~pthread_mutex): Ditto. - (semaphore::~semaphore): Ditto. - -Tue Sep 11 18:15:00 2001 Robert Collins - - * dcrt0.cc (cygwin_finished_initializing): Copy _mtinterf on fork. - * fork.cc (fork_child): Fixup thread-related structures after fork. - * thread.cc (MTinterface::Init): Initialise the new mutex, condition - and semaphore lists. - (MTinterface::fixup_after_fork): Iterate through each list and fixup - the objects. - (pthread_cond::pthread_cond): Add this to the condition list. - (pthread_cond::~pthread_cond): Remove this from the condition list. - (pthread_cond::fixup_after_fork): Recreate as best we can the pre-fork - state. - (pthread_mutex::pthread_mutex): Add this to the mutex list. - (pthread_mutex::~pthread_mutex): Remove this from the mutex list. - (pthread_mutex::fixup_after_fork): Recreate as best we can the pre-fork - state. - (semaphore::semaphore): Store the initial value, and add this to the - semaphore list. - (semaphore::~semaphore): Remove this from the semaphore list. - (semaphore::Post): Increment the current semaphore value. - (semaphore::TryWait): Decrement the current semaphore value. - (semaphore::Wait): Ditto. - (semaphore::fixup_after_fork): Recreate the pre-fork state as best we - can. - * thread.h (pthread_mutex): New members to allow fixup_after_fork. - (pthread_cond): Ditto. - (semaphore): Ditto. - (MTinterface): New list heads for tracking conds and semaphores. - -Sun Sep 9 22:11:27 2001 Christopher Faylor - - * dtable.cc (dtable::fixup_after_fork): Use SetStdHandle appropriately - on inherited fds. - -Sun Sep 9 20:09:11 2001 Christopher Faylor - - * sigproc.cc (NZOMBIES): Reduce substantially to minimize memory use. - -Mon Sep 10 08:28:00 2001 Robert Collins - - * thread.h (MT_Interface): Remove pshared mutex array. Add a - threadsafe list for mutex tracking (for fixup after fork). - * thread.cc (MTInterface::Init): Remove pshared mutex array. - (pthread_mutex::pthread_mutex): Remove pshared mutex functionality. - Fail with EINVAL on attempts to use pshared functionality. - (__pthread_mutex_getpshared): Remove. - (__pthread_cond_timedwait): Remove pshared mutex functionality. - (__pthread_cond_wait): Ditto. - (__pthread_mutex_init): Ditto. - (__pthread_mutex_getprioceiling): Ditto. - (__pthread_mutex_lock): Ditto. - (__pthread_mutex_trylock): Ditto. - (__pthread_mutex_unlock): Ditto. - (__pthread_mutex_destroy): Ditto. - (__pthread_mutex_setprioceiling): Ditto. - (__pthread_mutexattr_setpshared): Ditto. - -Sun Sep 9 23:09:00 2001 Corinna Vinschen - - * pwdgrp.h (pwdgrp_check::set_last_modified): Call GetFileTime() - instead of GetFileInformationByHandle(). - -Sun Sep 9 15:59:53 2001 Christopher Faylor - - * heap.h (inheap): Rewrite macro to accommodate removal of brk macros - below. - -Sun Sep 9 15:02:44 2001 Christopher Faylor - - * cygheap.cc (cygheap_fixup_in_child): Clear cygheap->base so that heap - is not forced to start at the same place in execed process. - * heap.cc: Remove brk* macros for clarity throughout. - * heap.h: Ditto. - * shared.cc (shared_info::initialize): Move heap_chunk test into - heap_chunk_size(). - (heap_chunk_size): Check for chunk size here. Don't go to registry if - heap_chunk_in_mb is already set. - - * smallprint.c (console_printf): Add Windows 95 concessions. - -Sun Sep 9 13:01:06 2001 Christopher Faylor - - * child_info.h (PROC_MAGIC): Bump magic number. - -Sun Sep 9 18:36:00 2001 Corinna Vinschen - Christopher Faylor - - * cygheap.cc (init_cygheap::etc_changed): New method to signal - a change in /etc. - * cygheap.h (struct init_cygheap): Add member `etc_changed_h' - and method `etc_changed'. - * grp.cc (enum grp_state): Eliminate. - (class grp_check): Ditto. - (group_state): Define as `class pwdgrp_check'. - (parse_grp): Remeber path and modification time of /etc/group file. - * passwd.cc (enum_pwd_state): Eliminate. - (class pwd_check): Ditto. - (passwd_state): Define as `class pwdgrp_check'. - (read_etc_passwd): Remember path and modification time of /etc/passwd - file. - * pwdgrp.h: New file. - (enum pwdgrp_state): Substitutes `pwd_state' and `grp_state'. - (class pwdgrp_check): Substitutes `pwd_check' and `grp_check'. - -Sun Sep 9 14:31:00 2001 Corinna Vinschen - - * include/cygwin/version.h: Bump API minor version to 45 according - to adding the gamm*_r functions. - -Sat Sep 8 23:32:18 2001 Christopher Faylor - - * fork.cc (fork_parent): Stop malloc activity while fork is in control - of the heap. - * sigproc.cc (NZOMBIES): Rename from ZOMBIEMAX for clarity. - (zombies): Revert to original behavior. Allocating zombie array - resulted in performance hit. - * winsup.h: Declare malloc lock routines. - -Fri Sep 7 21:35:35 2001 Christopher Faylor - - * cygwin.din: Add gamm*_r function exports. - -Fri Sep 7 17:11:11 2001 Christopher Faylor - - * cygheap.h (init_cygheap): Move heap pointers here. - * include/sys/cygwin.h (perprocess): Remove heap pointers. - * dcrt0.cc (__cygwin_user_data): Reflect obsolete perprocess stuff. - (_dll_crt0): Don't initialize heap pointers. - (cygwin_dll_init): Ditto. - (release_upto): Use heap pointers from cygheap. - * heap.h: Ditto. - * fork.cc (fork_parent): Ditto. Don't set heap pointers in ch. - (fork_child): Remove obsolete sigproc_fixup_after_fork. - * shared.cc (memory_init): Reorganize so that cygheap initialization is - called prior to regular heap since regular heap uses cygheap now. - * sigproc.cc (proc_subproc): Eliminate zombies allocation. - (sigproc_init): Move zombies alloation here. Don't free up array on - fork, just reuse it. - (sigproc_fixup_after_fork): Eliminate. - * sigproc.h: Ditto. - * include/cygwin/version.h: Reflect change to perprocess structure. - -Fri Sep 7 10:53:34 2001 Jason Tishler - - * poll.cc (poll): Change implementation to only call select() when no - invalid file descriptors are specified. - -Fri Sep 7 10:27:00 2001 Corinna Vinschen - - * include/limits.h: Define PIPE_BUF. - * syscalls.cc (fpathconf): Use PIPE_BUF instead of numerical constant. - (pathconf): Ditto. - -Thu Sep 6 20:04:05 2001 Christopher Faylor - - * fhandler_socket.cc (fhandler_socket::fhandler_socket): Ensure that - prot_info_ptr is zeroed for later use. - -Thu Sep 6 14:03:49 2001 Christopher Faylor - - * cygheap.cc (cygheap_fixup_in_child): Don't consider a NULL bucket as - a candidate for deletion. It is actually the end of a linked list - chain. - - * exceptions.cc (open_stackdumpfile): Default to "unknown" program name - if myself->progname hasn't been filled out yet. - -Thu Sep 6 01:16:44 2001 Christopher Faylor - - Move appropriate variables to NO_COPY segment, throughout. - -Thu Sep 6 00:40:35 2001 Christopher Faylor - - Remove initialization of static or global values to zero, throughout. - This just needlessly grows the size of the DLL. - * tty.cc (tty::alive): Make inuse handle non-inheriting on open, just - for thread safety. - -Wed Sep 5 23:36:03 2001 Christopher Faylor - - * cygheap.h (init_cygheap): Move bucket array here from cygheap.cc. - * cygheap.cc: Throughout use bucket array from cygheap. - - * sigproc.cc (proc_subproc): Dynamically allocate zombie buffer to save - DLL space. - (sigproc_fixup_after_fork): Free zombie array after a fork. - * sigproc.h (sigproc_fixup_after_fork): Declare. - -2001-09-06 Egor Duda - - * dir.cc (mkdir): Expand buffer for security descriptor to 4K to avoid - stack corruption. - * fhandler.cc (fhandler_base::open): Ditto. - * path.cc (symlink): Ditto. - -Wed Sep 5 21:35:00 2001 Corinna Vinschen - - * winver.rc: Change copyright to include 2001. - -Wed Sep 5 12:12:00 2001 Corinna Vinschen - - * fhandler_floppy.cc (fhandler_floppy::lseek): Remove iswinnt check. - -Wed Sep 5 11:34:00 2001 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::close): Change 2MSL value - according to MSDN. - -Wed Sep 5 10:14:00 2001 Corinna Vinschen - - * net.cc (cygwin_connect): Add WSAEALREADY and WSAEINVAL handling - for non-blocking sockets. - -Tue Sep 4 22:42:13 2001 Christopher Faylor - - * exceptions.cc (ctrl_c_handler): Only send SIGINT when we have a - controlling terminal and we are the head of the process group. - -Tue Sep 4 16:48:14 2001 Christopher Faylor - - * thread.cc (InterlockedExchangePointer): Don't define if it already - exists. - -Tue Sep 4 22:14:00 2001 Corinna Vinschen - - * uname.cc (uname): Eliminate os specific retrieving of x86 - processor type. - -2001-09-04 Kazuhiro Fujieda - - * fhandler_console.cc (fhandler_console::char_command): Save the cursor - position relative to the top of the window. - * fhandler_cc (fhandler_console::write): Ditto. - -Mon Sep 3 21:06:00 2001 Corinna Vinschen - - * dir.cc (opendir): Write version information to __d_dirent->d_version. - -Mon Sep 3 18:34:00 2001 Corinna Vinschen - - * cygwin.din: Add `dirfd'. - * dir.cc (dirfd): New function. - (opendir): Open a directory file descriptor and save it in - __d_dirent->d_fd. - (closedir): Close directory file descriptor. - * include/cygwin/version.h: Bump API minor version to 44. - -Sun Sep 2 22:09:31 2001 Christopher Faylor - - * child_info.h: Modify magic number. - * dcrt0.cc (_cygwin_testing): Define. - (_dll_crt0): Set _cygwin_testing if CYGWIN_TESTING environment variable - exists. Don't issue "conflicting versions" error if _cygwin_testing is - true. - * shared.cc (shared_name): Use _cygwin_testing global rather than - testing the environment. - * syscalls.cc (_write): Remove debugging info. - -Sat Sep 1 01:37:13 2001 Christopher Faylor - - * tty.cc (tty::create_inuse): Eliminate unneeded argument. - * tty.h: Reflect above change. - * fhandler_tty.cc: Reflect argument reduction in tty::create_inuse, - throughout. Always make inuse inheritable. - -Sat Sep 1 01:10:07 2001 Christopher Faylor - - * debug.cc (mark_closed): Rename from debug_mark_closed and make - static. - (setclexec_pid): New function for marking saved handle as - close-on-exec. - (delete_handle): New function. - (debug_fixup_after_fork): New function. - * debug.h: Declare new functions, remove obsolete ones. - * fork.cc (debug_fixup_after_fork): Call to cleanup close-on-exec - handles. - - * fhandler.cc (fhandler_disk_file::close): Minor reorg. - (fhandler_base::set_inheritance): Set flag appropriately for debugging - when close-on-exec so forked process can delete closed handles. - * tty.h (open_output_mutex): Eliminate unneeded argument. - (open_input_mutex): Ditto. - * fhandler_tty.cc (fhandler_tty_slave::open): reflect open_*_mutex - argument changes. - * fhandler.h (fhandler_socket): Make saw_shutdown_* functions type - bool. - * tty.cc (tty::get_event): Eliminate unneeded argument. - (tty::common_init): Reflect change to get_event. Events should always - be inherited. - -Fri Aug 31 21:39:00 2001 Corinna Vinschen - - * security.cc (create_token): Change initialization of `exp' to comply - with new LARGE_INTEGER definition in winnt.h. - -Fri Aug 31 13:58:51 2001 Christopher Faylor - - * cygwin.sc: Revert to previous NO_COPY behavior. - * winsup.h: Ditto. - * sigproc.cc: Ditto. - * autoload.cc: Ditto. - -Fri Aug 31 00:56:26 2001 Christopher Faylor - - * cygwin.sc: New file -- linker script for building cygwin DLL. - * Makefile.in: Use linker script to control location of cygheap. - * cygheap.cc (buckets): Make static. - (init_cheap): Remove special iswinnt handling. Allocate cygheap at a - fixed location. Display more info when allocation fails. - (cygheap_fixup_in_child): Try harder to move cygheap to correct - location. Display more info when allocation fails. - * fhandler.h (fhandler_socket): Add macros for tracking socket shutdown - state. - * net.cc (cygwin_shutdown): Set appropriate shutdown value for future - use. - * select.cc (select_stuff::cleanup): New method. - (cygwin_select): Call cleanup explicitly to avoid a race. - (select_stuff:~select_stuff): Call cleanup chain via cleanup method. - (fhandler_socket::select_read): Set *_ready when shutdown has been - called on the socket. - (fhandler_socket::select_write): Ditto. - (fhandler_socket::select_except): Ditto. - - * winsup.h: Move NO_COPY to "COMMON" section. - * autoload.cc (wsock_started): Avoid initializing NO_COPY value. - * sigproc.cc: Remove initialization from NO_COPY variables. - (sigproc_init): Initialize sig_loop_wait here, rather than via - initialization. - (subproc_init): Initialize proc_loop_wait here, rather than via - initialization. - -Thu Aug 30 10:19:00 2001 Christopher Faylor - - * select.cc (select_read): Add setting read_ready flag. - (select_write): Add setting write_ready flag. - -Wed Aug 29 00:40:42 2001 Christopher Faylor - - * path.cc (path_conv::check): Avoid splitting off leading '/' in path - component when building a symlink. - -Wed Aug 29 0:45:00 2001 Corinna Vinschen - - * resource.cc (getrlimit): Return actual values on RLIMIT_STACK. - -Tue Aug 28 16:37:17 2001 Christopher Faylor - - * dir.cc (rmdir): Report ENOENT when file doesn't exist rather than - ENOTDIR. - -Mon Aug 27 11:58:19 2001 Christopher Faylor - - * select.cc (cygwin_select): Ensure that arguments are zeroed on - timeout. - (select_stuff::wait): Ditto. - -2001-08-24 Kazuhiro Fujieda - - * syscalls.cc (check_tty_fds): New function. Check whether there is a - fd referring to pty slave. - (setsid): Don't detach console if the process has a pty slave. - -Fri Aug 24 8:54:00 2001 Corinna Vinschen - - * net.cc (free_addr_list): Add define for symmetry. - (free_hostent_ptr): Use free_addr_list to free h_addr_list element. - -Thu Aug 23 16:00:09 2001 Jason Tishler - - * net.cc (dup_addr_list): New static function. - (dup_hostent_ptr): Use dup_addr_list instead of dup_char_list in order - to handle embedded null characters. - -Wed Aug 22 22:23:14 2001 Christopher Faylor - - * dtable.cc (dtable::dup2): Allow extension of fd table by dup2. - * syscalls.cc: Minor code cleanup. - (fpathconf): Check for bad fd before doing anything else. - * termios.cc (tcsetattr): Don't convert to new termios if bad fd. - (tcgetattr): Minor debugging tweak. - -Wed Aug 22 23:41:00 2001 Corinna Vinschen - - * net.cc (cygwin_inet_ntoa): Rearrange previous patch to use - thread local buffer space when compiled thread safe. - (cygwin_getprotobyname): Ditto. - (cygwin_getprotobynumber): Ditto. - (cygwin_getservbyname): Ditto. - (cygwin_getservbyport): Ditto. - (cygwin_gethostbyname): Ditto. - (cygwin_gethostbyaddr): Ditto. Move near to cygwin_gethostbyname. - * thread.h (struct _winsup_t): Add pointers for above used buffer space. - * passwd.cc (getpwduid): Remove initializing passwd. - (setpwent): Ditto. - (endpwent): Ditto. - (setpassent): Ditto. - -Wed Aug 22 13:41:09 2001 Christopher Faylor - - * smallprint.c (console_printf): New function. - * dcrt0.cc (dll_crt0_1): Use console_printf for debugging output. - * debug.cc (debug_mark_closed): New function. - (close_handle): Use debug_mark_closed. - * debug.h: Declare new functions. - * dtable.cc (dtable::build_fhandler): Remove unneeded extern. - * spawn.cc: Cosmetic changes. - * winsup.h: Define NO_COPY for C files, too. Declare a global. - -Wed Aug 22 17:31:00 2001 Corinna Vinschen - - * net.cc (free_char_list): New static function. - (dup_char_list): Ditto. - (free_protoent_ptr): Ditto. - (dup_protoent_ptr): Ditto. - (free_servent_ptr): Ditto. - (dup_servent_ptr): Ditto. - (free_hostent_ptr): Ditto. - (dup_hostent_ptr): Ditto. - (cygwin_inet_ntoa): Use local static buffer to allow propagating of - the result to child processes. - (cygwin_getprotobyname): Ditto. - (cygwin_getprotobynumber): Ditto. - (cygwin_getservbyname): Ditto. - (cygwin_getservbyport): Ditto. - (cygwin_gethostbyname): Ditto. - (cygwin_gethostbyaddr): Ditto. - -Mon Aug 20 11:56:19 2001 Christopher Faylor - - * cygheap.cc (init_cheap): Allocate cygheap in shared memory for Windows NT. - -Thu Aug 16 09:38:59 2001 Jason Tishler - - * fhandler_socket.cc (fhandler_socket::create_secret_event): Relax - security of secret_event so AF_UNIX socket clients can connect to - servers even if running under a different user account. - (fhandler_socket::check_peer_secret_event): Ditto. - -Thu Aug 16 16:26:00 2001 Corinna Vinschen - - * resource.cc (getrlimit): Return getdtablesize () as current limit - on RLIMIT_NOFILE. - * syscalls.cc (getdtablesize): Return OPEN_MAX if current dtable size - is less than OPEN_MAX, the current dtable size otherwise. - * sysconf.cc (sysconf): Return getdtablesize () on _SC_OPEN_MAX. - -Thu Aug 16 16:17:00 2001 Corinna Vinschen - - * resource.cc (getrlimit): Return OPEN_MAX as current limit - on RLIMIT_NOFILE. - * syscalls.cc (getdtablesize): Return OPEN_MAX. - * sysconf.cc (sysconf): Return OPEN_MAX on _SC_OPEN_MAX. - * include/limits.h (OPEN_MAX): Define as 256. - -Wed Aug 15 12:43:00 2001 Corinna Vinschen - - * times.cc (utimes): Revert previous change. Just open the - file using FILE_WRITE_ATTRIBUTES instead of GENERIC_WRITE - on NT/W2K. - -Wed Aug 15 12:18:00 2001 Corinna Vinschen - - * security.cc (set_nt_attribute): Return always -1 in case of - a failure. - * times.cc (utimes): On NTFS with ntsec ON, change the file's - security descriptor temporarily to acquire write access if - opening the file failed. - -Wed Aug 15 9:42:00 2001 Corinna Vinschen - - * fhandler.cc (fhandler_base::is_nonblocking): New method. - (fhandler_base::set_nonblocking): Ditto. - * fhandler.h (fhandler_base): Declare new methods `is_nonblocking' and - `set_nonblocking'. - * fhandler_socket.cc (fhandler_socket::ioctl): Use `set_nonblocking'. - * fhandler_tty.cc (fhandler_pty_master::process_slave_output): - Use `is_nonblocking'. - (fhandler_tty_slave::read): Ditto. - (fhandler_tty_slave::ioctl): Use `set_nonblocking'. - (fhandler_pty_master::ioctl): Ditto. - * net.cc (cygwin_sendto): Fallback to winsock 1 functionality - in case of nonblocking IO. - (cygwin_recvfrom): Ditto. - (cygwin_recv): Ditto. - (cygwin_send): Ditto. - * syscalls.cc (_read): Use `is_nonblocking'. - -Tue Aug 14 11:05:26 2001 Christopher Faylor - - * include/cygwin/version.h: Bump API version. - -2001-08-14 Egor Duda - - * spawn.cc (spawn_guts): Enable appropriate privilege before - loading user's registry hive. - -Mon Aug 13 22:34:00 2001 Corinna Vinschen - - * fhandler.cc (fhandler_base::fcntl): Use new O_NONBLOCK_MASK define. - * fhandler.h: Move definitions of O_NOSYMLINK, O_DIROPEN and - OLD_O_NDELAY from winsup.h to here. Add O_NONBLOCK_MASK define. - * fhandler_socket.cc (fhandler_socket::close): Add hack to allow - a graceful shutdown even if shutdown() hasn't been called by the - application. Add debug output. - (fhandler_socket::ioctl): Set fhandler's NONBLOCK flag according - to FIONBIO setting. - (fhandler_socket::fcntl): Use new O_NONBLOCK_MASK define. Actually - set `request' before using it. - * fhandler_tty.cc: Use new O_NONBLOCK_MASK define throughout. - (fhandler_tty_slave::ioctl): Set fhandler's NONBLOCK flag according - to FIONBIO setting. - (fhandler_pty_master::ioctl): Ditto. - * net.cc (wsock_event::prepare): Compare WSACreateEvent return code - with `WSA_INVALID_EVENT' according to MSDN. - * syscalls.cc (_read): Use new O_NONBLOCK_MASK define. - -Wed Aug 8 15:24:59 2001 Christopher Faylor - - * include/wchar.h: Define __need_wint_t. - -Wed Aug 8 11:46:00 2001 Corinna Vinschen - - * security.cc (alloc_sd): Revert to setting inheritance attribute for - permissions given to directories. Never set inheritance on NULL ACE. - -Tue Aug 7 18:11:00 2001 Corinna Vinschen - - * security.cc (alloc_sd): Don't set FILE_DELETE_CHILD for group - if S_ISVTX attribute is given. - * dir.cc (mkdir): Allow immediate setting of S_ISUID, S_ISGID and - S_ISVTX attribute. - * syscalls.cc (_open): Ditto. - -Tue Aug 7 16:24:00 2001 Corinna Vinschen - - * dir.cc (mkdir): Set security attributes correctly for - CreateDirectoryA () call if ntsec is on. Don't call - set_file_attributes () then. - * fhandler.cc (fhandler_base::open): Ditto for CreateFileA () call. - * path.cc (symlink): Ditto. - * security.cc (set_security_attribute): New function. - * security.h: Add declaration for `allow_ntea' and - `set_security_attribute'. - -Tue Aug 7 10:54:00 2001 Corinna Vinschen - - * grp.cc (class grp_check): New class. Make `group_state' - a member of class grp_check. - (read_etc_group): Free former allocated memory on reread. - * passwd.cc (class pwd_check): New class Make `passwd_state' - a member of class pwd_check. - (read_etc_passwd): Free former allocated memory on reread. - -Tue Aug 7 01:13:58 2001 Christopher Faylor - - * fhandler_console.cc (get_tty_stuff): Don't initialize shared memory - console area if it is already initialized. - - * fhandler_termios.cc (fhandler_termios::tcsetpgrp): Augment debugging - info. - -Mon Aug 6 19:58:43 2001 Christopher Faylor - - * cygheap.cc (cygheap_root::set): Avoid treating '/' specially. - - * fhandler.cc (fhandler_base::fcntl): Only set specific O_NDELAY style - flag passed in from application. - * fhandler_socket.cc (fhandler_socket::fcntl): Ditto. - * fhandler.h: Set constant for future use. - * winsup.h: Define OLD_O_NDELAY only for old programs. - * include/cygwin/version.h: Define - CYGWIN_VERSION_CHECK_FOR_OLD_O_NONBLOCK. - -Sat Aug 4 16:52:03 2001 Christopher Faylor - - Throughout, change check for running under Windows NT to 'iswinnt'. - * dcrt0.cc (set_os_type): Set 'iswinnt' appropriately. - * cygheap.cc (init_cheap): Revert to using VirtualAlloc for allocating - cygheap. - (cygheap_setup_for_child_cleanup): New function. Standard function to - call after calling CreateProcess to cleanup cygheap info passed to - child. - (cygheap_fixup_in_child): Copy cygheap from shared memory into - allocated space under Windows 9x or if can't relocate shared space - under NT. - * cygheap.h: Declare new function. - * spawn.cc (spawn_guts): Use cygheap_fixup_in_child. - * fork.cc (fork_parent): Ditto. - * winsup.h: Declare iswinnt. - -2001-08-04 Egor Duda - - * dtable.cc (dtable::release): Avoid messing with console when - closing socket. - -Fri Aug 3 14:02:00 2001 Corinna Vinschen - - * net.cc (cygwin_accept): Allow NULL peer and len parameters. - * include/cygwin/socket.h: Define socklen_t as int. - -Fri Aug 3 13:04:00 2001 Corinna Vinschen - - * path.cc (fchdir): Set the fhandler's path to absolute value to ensure - changing to the correct directory even if the fhandler originally - points to a relative path. - -Thu Aug 2 17:59:00 2001 Corinna Vinschen - - * security.cc (set_file_attribute): Clean up. Don't call - `set_nt_attribute' when ntsec isn't set. - -Sat Jul 28 22:30:55 2001 Christopher Faylor - - * dcrt0.cc (alloc_stack_hard_way): Make half-hearted attempt to deal - with growing stack under Windows 95. - -Fri Jul 27 12:36:07 2001 Christopher Faylor - - * Makefile.in: Add install-lib and install-headers. - -Fri Jul 27 12:28:12 2001 Christopher Faylor - - * cygwin.din: Export sys_errlist, sys_nerr. - * include/cygwin/version.h: Bump minor version number. - -Fri 27 Jul 2001 10:29:00 Corinna Vinschen - - * security.cc (get_user_primary_group): Fix compiler warning. - (alloc_sd): Add DELETE permission for user when S_IWUSR is given. - -Thu Jul 26 16:43:39 2001 Pieter de Visser - - * thread.cc (__pthread_equal): Invert return value so that true is - returned when threads are equal. - -Thu Jul 26 15:50:38 2001 Charles Wilson - Christopher Faylor - - * cygwin.din: Export __signgam. - * include/cygwin/version.h: Bump minor version number. - -Thu Jul 26 15:19:50 2001 Christopher Faylor - - Throughout, reorganize header file inclusion to put security.h prior to - fhandler.h. - * fhandler.h (fhandler_base::get_inheritance): New method. - * fhandler_socket.cc (fhandler_socket::create_secret_event): Use proper - close-on-exec inheritance when creating. - (fhandler_socket::check_peer_secret_event): Create handle as - non-inheritable. - -2001-07-25 Kazuhiro Fujieda - - * syscalls.cc (setsid): Detach process from its console if the current - controlling tty is the console and already closed. - * dtable.h (class dtable): Add members to count descriptors referring - to the console. - * dtable.cc (dtable::dec_console_fds): New function to detach process - from its console. - (dtable::release): Decrement the counter of console descriptors. - (dtable::build_fhandler): Increment it. - * exception.cc (ctrl_c_handler): Send SIGTERM to myself when catch - CTRL_SHUTDOWN_EVENT. - -Tue 24 Jul 2001 02:28:00 PM Trevor Forbes - - * thread.cc (verifyable_object_isvalid): Don't validate - PTHREAD_MUTEX_INITIALIZER pointer as it will cause an exception - in IsBadWritePtr() when running GDB. - -Wed 25 Jul 2001 23:46:00 Corinna Vinschen - - * localtime.c: Changed whole file to become C++ clean. Rename to - localtime.cc. - * localtime.cc (tzload): Preserve errno. - -Fri 20 Jul 2001 11:15:50 PM EDT Christopher Faylor - - * cygheap.cc (cygheap_fixup_in_child): Attempt Win95 workaround. - * dtable.cc (dtable::dup_worker): Add debugging output. - (dtable::vfork_child_dup): Correctly set close_on_exec. - * fhandler.cc (fhandler_base::fork_fixup): Don't mess with handle if - there is no need to get it from the parent. - * fhandler_tty.cc (fhandler_tty_common::close): Add debugging output. - -Fri 20 Jul 2001 09:15:00 Mark Bradshaw - - * dir.cc (readdir): Protect FindNextFileA against INVALID_HANDLE_VALUE. - -Wed 18 Jul 2001 01:00:47 PM EDT Christopher Faylor - - * cygheap.cc (_cmalloc): Use correct constants for size calculation. - * dcrt0.cc (dll_crt0_1): Move uid initialization earlier. - * fork.cc (fork_parent): Move cygheap_setup_in_child to just prior to - CreateProcess so that all contents of cygheap are copied. - * spawn.cc (spawn_guts): Ditto. - -Wed 18 Jul 2001 12:54:17 Corinna Vinschen - - * security.cc (get_user_groups): Call Net function with NULL server - name under specific error conditions. - (is_group_member): Ditto. - (get_user_local_groups): Ditto. - (get_user_primary_group): Ditto. - -Wed 18 Jul 2001 11:56:00 Corinna Vinschen - - * syscalls.cc (_unlink): Explicitly check for non-existant file. - -Tue 17 Jul 2001 10:19:00 Corinna Vinschen - - * delqueue.h: Remove obsolete file. - -Mon 16 Jul 2001 10:47:17 PM EDT Christopher Faylor - - * child_info.h: Bump magic number. - (class child_info): Add an element. - * cygheap.cc (init_cheap): Allocate cygwin heap in shared memory area. - (cygheap_fixup_in_child): Map cygwin heap, passed from parent via - shared memory into correct address. - (cygheap_setup_for_child): New function. - * cygheap.h: Declare new functions. - * dcrt0.cc (dll_crt0_1): Accommodate new cygheap_fixup_in_child - arguments. Avoid protecting subproc_ready unless it is spawn/nowait. - * fork.cc (fork_parent): Use new cygheap_setup_for_child function to - setup cygwin heap info. Close passed cygheap shared memory handle. - * spawn.cc (spawn_guts): Ditto. Also, reorganize to avoid - synchronization between parent and child in non-P_OVERLAY case. - * sigproc.cc (wait_sig): Only signal subproc_ready when execing. - -Mon 16 Jul 2001 15:21:00 Corinna Vinschen - - * grp.cc: Add missing Copyright date 2001. - -Mon 16 Jul 2001 00:11:00 Corinna Vinschen - - Change well_known_admin_sid to well_known_admins_sid throughout. - * sec_acl.cc (setacl): Never set DELETE permission. Set - FILE_DELETE_CHILD only on readable and executable directories. - * sec_helper.cc: Add constructor for `well_known_null_sid'. - * security.cc (get_nt_attribute): Set S_ISVTX for directories if - FILE_WRITE_DATA and FILE_EXECUTE but not FILE_DELETE_CHILD is set. - Add evaluation of S_ISVTX, S_ISGID and S_ISUID from NULL ACE. - (alloc_sd): Never set DELETE permission. Set FILE_DELETE_CHILD - only on readable and executable directories. - Add creation of NULL ACE for S_ISVTX, S_ISGID and S_ISUID permissions. - * security.h: Add extern declaration for `well_known_null_sid'. - -Fri 13 Jul 2001 08:08:49 PM EDT Christopher Faylor - - * syscalls.cc (stat_worker): Simplify previous change. - -Fri Jul 13 13:13:09 2001 Christopher Faylor - - * syscalls.cc (_unlink): Correct (?) logic which determines when - to report an access violation and when to queue file for eventual - deletion. - (stat_worker): Check for invalid buf argument. - -Tue Jul 10 23:01:00 2001 Corinna Vinschen - - * mmap.cc (fhandler_disk_file::mmap): Try to open file mappings - by a unified name when running under 9x/ME. If that failes, create - the file mapping using the unified name. - -Mon Jul 9 10:43:00 2001 Corinna Vinschen - - * uinfo.cc (internal_getlogin): Add pointer check. - -Mon Jul 9 10:05:00 2001 Corinna Vinschen - - * security.cc (alloc_sd): Don't set inheritance attribute for - permissions given to directories. - -Thu Jun 28 22:19:08 2001 Christopher Faylor - - * fhandler_dsp.cc (fhandler_dev_dsp::ioctl): Return 0 for success. - -Wed Jun 27 22:19:07 2001 Christopher Faylor - - * path.cc (path_conv::check): Add signal protection here since - retrieving info about remote shares can take some time. - -Wed Jun 27 23:30:00 2001 Robert Collins - Christopher Faylor - - Change check_null_empty_path* to check_null_empty_str* throughout. - * path.h (check_null_empty_str_errno): Convert to a function prototype. - * path.cc (check_null_empty_str): Move to miscfuncs.cc. - * miscfuncs.cc (check_null_empty_str_errno): New function. - (__check_null_invalid_struct): Ditto. - (__check_null_invalid_struct_errno): Ditto. - (check_null_empty_str): Change from VirtualQuery to IsBadWritePtr. - * thread.cc (check_valid_pointer): Ditto. - * resource.cc (getrlimit): Use check_null_invalid_struct macro for - checking validity of pointer. - (setrlimit): Ditto. - -Tue Jun 26 16:59:16 2001 Christopher Faylor - - * fhandler.cc (fhandler_disk_file::fstat): Don't rely on exactly 3 - characters being read for executable test since we could be checking - for less than that. - * syscalls.cc (stat_worker): Try opening the file the "correct" way - first so that #! processing can potentially happen. If that fails, - then use "query open" method. - - * spawn.cc (spawn_guts): Delay processing of signal until after we've - notified parent about reparenting. - -Tue Jun 26 10:47:24 2001 Christopher Faylor - - * mmap.cc: Clean up *ResourceLock calls throughout. - -Tue Jun 26 22:10:00 2001 Robert Collins rbtcollins@hotmail.com - - * thread.cc (pthread_cond::TimedWait): Check for WAIT_TIMEOUT as well - as WAIT_ABANDONED. - (__pthread_cond_timedwait): Calculate a relative wait from the abstime - parameter. - -Sun Jun 24 17:38:19 2001 Christopher Faylor - - * exceptions.cc (interrupt_setup): Move actions from setup_handler to - here. - (setup_handler): Move actions after a successful interrupt to - interrupt_setup. - * fork.cc (vfork): Augment debugging output. - * sigproc.cc (proc_subproc): Ditto. - * spawn.cc (spawn_guts): Ditto. Correctly fill out progname when spawn - NO_WAIT. Call signal handler when a signal arrives. - * sigproc.h: Declare a function. - -Fri Jun 22 16:50:00 2001 Corinna Vinschen - - * fhandler.h class fhandler_socket): Declare new method - `set_close_on_exec'. - * fhandler_socket.cc (fhandler_socket::set_close_on_exec): - New method. - -Fri Jun 22 16:12:00 2001 Corinna Vinschen - - * fhandler_tape.cc (fhandler_dev_tape::tape_erase): Set size - parameter to value expected by GetTapeParameters(). - -Thu Jun 21 22:01:39 2001 Marius Gedminas - - * fhandler_console.cc (fhandler_console::read): Detect AltGr more - robustly on WinNT. - -2001-06-22 Robert Collins - - * thread.cc (__pthread_cond_timedwait): Lock the waiting mutex before - the condition protect mutex to avoid deadlocking. (Found by Greg Smith). - (__pthread_cond_wait): Ditto. - -2001-06-30 Egor Duda - - * fhandler.cc (fhandler_base::open): Work around windows bug when - CreateFile() with dwDesiredAccess == 0 called on remote share returns - valid handle even if file doesn't exist. - -2001-06-20 Egor Duda - - * fhandler_socket.cc (fhandler_socket::signal_secret_event): New - function. - * fhandler.h: Declare it. - * fhandler_socket.cc (fhandler_socket::create_secret_event): Don't - signal secret event immediately. - (fhandler_socket::check_peer_secret_event): Do it after peer event - was opened. - * net.cc (cygwin_connect): Or if socket is non-blocking. - (cygwin_accept): Ditto. - -Mon Jun 18 17:09:25 2001 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::init): Revert 2001-06-16 change. - - * fork.cc (fork_copy): Print more debugging info. - (fork_parent): Change order of arguments to accomdate buggy gcc. - (fork): Ditto. - -Sun Jun 17 18:54:46 2001 Christopher Faylor - - * syscalls.cc (_unlink): Reorganize to try harder to delete file with - DeleteFile and to recover more gracefully if FILE_FLAG_DELETE_ON_CLOSE - doesn't work properly. - -Sat Jun 16 13:06:49 2001 Christopher Faylor - - * exceptions.cc (sig_handle_tty_stop): Reset PID_STOPPED if not - actually stopping. - * fhandler_console.cc (fhandler_console::fixup_after_fork): Don't set - controlling terminal if just inheriting a handle. - (fhandler_console::fixup_after_exec): Ditto. - * fhandler_tty.cc (fhandler_tty_slave::init): Ditto. - * signal.cc (kill_worker): Set appropriate errno if proc_exists - determines that process does not really exist. - -Fri Jun 15 14:34:19 2001 Christopher Faylor - - * path.cc (path_conv::check): Deal more robustly with foo/ behavior. - -Fri Jun 15 11:15:00 2001 Corinna Vinschen - - * fhandler_tape.cc (fhandler_dev_tape::tape_status): Set size - parameter to value expected by GetTapeParameters(). - -Thu Jun 14 20:19:46 2001 Christopher Faylor - - * fhandler.cc (fhandler_disk_file::fstat): Properly set executable bits - for directory when !ntsec && !ntea. Also move common code prior to - call to get_attributes. - -Fri June 15 09:25:00 Robert Collins - - * thread.cc (pthread_cond::Signal): Release the condition access - variable correctly. - -2001-06-14 Egor Duda - - * fhandler.cc (fhandler_base::open): Set win32 access flags to 0, when - requested. - * fhandler.h: New status flag FH_QUERYOPEN. - (fhandler::get_query_open): New function. - (fhandler::set_query_open): Ditto. - * syscalls.cc (stat_worker): Request query-only open mode. - -2001-06-12 Egor Duda - - * environ.cc (set_file_api_mode): New function. Move setting - of file APIs mode (OEM/ANSI) here. - (codepage_init): From here. - * winsup.h (set_file_api_mode): Declare it. - * fork.cc (fork_child): Set file APIs mode in forkee. - -Mon Jun 11 14:19:49 2001 Christopher Faylor - - * pinfo.cc: Use autoloaded ToolHelp functions throughout for Win9x. - * autoload.cc: Autoload ToolHelp functions. - - * sigproc.cc (proc_subproc): Incorporate SIGCHLD == SIG_IGN special - handling of zombie processes. Ensure that zombie processes which are - at the end of the zombie array are properly cleaned up. - -Mon Jun 11 11:18:56 2001 Christopher Faylor - - * path.cc (chdir): Fix call to path_conv constructor so that it REALLY - doesn't check for the null/non-empty path. - -Sun Jun 10 23:34:09 2001 Christopher Faylor - - * path.cc (path_conv::update_fs_info): Don't consider remote drives to - be NTFS. Set root_dir before invoking GetDriveType (from Kazuhiro - Fujieda ). Eliminate extra checks for rootdir. - -Sun Jun 10 20:19:47 2001 Christopher Faylor - - * path.cc (chdir): Pre-check path for validity before eating trailing - space. Then, ensure that path_conv doesn't check the path for validity - again. - -Sun Jun 10 12:56:00 2001 Christopher Faylor - - * exceptions.cc (sigdelayed): Ensure that signal is cleared as - the last operation or suffer races. - * sigproc.cc (proc_subproc): Deal with zombie array overflow. - -Sun Jun 10 11:56:00 2001 Corinna Vinschen - - * cygwin.din: Add fchdir symbols. - * path.cc (chdir): Guard against invalid parameter. - (fchdir): New function. - * include/cygwin/version.h: Bump API minor version to 40. - * uinfo.cc (internal_getlogin): Remove unused variable. - -Sat Jun 9 23:20:00 2001 Corinna Vinschen - - * syscalls.cc (seteuid): Set environment variables USERNAME and - USERDOMAIN before impersonation to workaround a LookupAccountSid() - misbehaviour. - * uinfo.cc (internal_getlogin): Revert most of the previous change. - Don't set environment variables USERNAME and USERDOMAIN. That's - the job of seteuid() now. Try to get logon server from Lsa - only if logon server isn't already known. - -Thu Jun 7 15:54:32 2001 Robert Collins - - * thread.cc (pthread_cond::Broadcast): Don't print error messages on - invalid mutexs - user programs are allowed to call - pthread_cond_broadcast like that. - (__pthread_cond_timedwait): Initialise themutex properly. - (__pthread_cond_wait): Initialise themutex properly. - -Tue Jun 5 19:56:00 2001 Corinna Vinschen - - * fhandler_console.cc (fhandler_console::dup): Allocate space for - savebuf on Cygwin heap. - (fhandler_console::char_command): Ditto. Use correct values for size. - -2001-06-05 Egor Duda - - * security.h (NTWriteEA): Change prototype. - * ntea.cc (NTReadEA): Don't check for global ntea setting, now - it's caller responsibility. - (NTWriteEA): Ditto. - * security.cc (get_file_attribute): Read attribute from EA only - if 'ntea' is enabled. - (set_file_attribute): Ditto. - * path.h: (class path_conv): Add members to store file system - information. - (path_conv::get_drive_type): New function. - * syscalls.cc (stat_worker): Use it. - * path.cc (path_conv::update_fs_info): New functions. - (path_conv::check): Get file system information from device where - file resides. On NTFS, try to read symlink contents from EA. - (get_symlink_ea): New function. - (set_symlink_ea): Ditto. - (symlink): Store symlink in extended attribute, if possible. - -Tue Jun 5 11:18:00 2001 Corinna Vinschen - - * fhandler.cc (fhandler_disk_file::fstat): Always reset file position - to original value after checking for executable magic. - -Mon Jun 4 16:21:00 2001 Corinna Vinschen - - * cygheap.h (cygheap_user::cygheap_user): Initialize token to - INVALID_HANDLE_VALUE. - * uinfo.cc (uinfo_init): Close token handle if needed. - -Sun Jun 3 20:52:13 2001 Christopher Faylor - - * path.cc (normalize_posix_path): Revert .. check removed by previous - changes. - * cygheap.h: Temporarily declare path_prefix_p here. - -Mon Jun 4 0:14:00 2001 Corinna Vinschen - - * net.cc (wsock_event): Add destructor. - -Sun Jun 3 09:49:55 2001 Robert Collins - - * dlfcn.cc (dlclose): Do not call FreeLibrary if the symbol to close - was obtained by dlopen(NULL,...). - -Sat Jun 2 23:11:52 2001 Christopher Faylor - - * syscalls.cc (sleep): Try to be a little more accomodating of signal - arrival. Ensure that the signal handler is called. - -Sat Jun 2 14:07:28 2001 Christopher Faylor - - * cygheap.cc (cygheap_root::cygheap_root): Remove constructor. - (cygheap_root::~cygheap_root): Remove destructor. - (cygheap_root::operator =): Remove. - (cygheap_root::set): New method. - * cygheap.h (cygheap_root): Reflect above changes. Store root info in - mount-like structure. - (cygheap_root:posix_ok): New method. - (cygheap_root::ischroot_native): Ditto. - (cygheap_root::unchroot): Ditto. - (cygheap_root::exists): Ditto. - (cygheap_root::posix_length): Ditto. - (cygheap_root::posix_path): Ditto. - (cygheap_root::native_length): Ditto. - (cygheap_root::native_path): Ditto. - * dir.cc (opendir): Remove special chroot test. - * path.cc (path_prefix_p): Remove front end. - (normalize_posix_path): Reorganize chroot tests to accommodate new - convention of allowing paths using posix chroot prefix. - (path_conv::check): Pass a "already ran normalize" option to - conv_to_win32_path. Return if there is an error from this function. - (mount_info::conv_to_win32_path): Add extra argument. Don't call - normalize_posix_path if caller has already done so. Substitute chroot - setting, if any, for root translation. Add chroot checking to final - output step. - * shared_info (mount_info): Accommodate additional argument to - conv_to_win32_path. - * syscalls.cc (chroot): Store both normalized posix path and native - path in chroot. - -Fri Jun 1 10:57:19 2001 Christopher Faylor - - * path.cc (chdir): Really make sure that isspace gets only an unsigned - char. - -Fri Jun 1 13:45:00 2001 Corinna Vinschen - - * syscalls.cc (_rename): Handle the case that `foo' is renamed to - `bar' while `bar.lnk' is an existing shortcut-symlink. - -Thu May 31 15:57:57 2001 Christopher Faylor - - * fhandler.cc (fhandler_disk_file::fstat): Avoid clearing S_IFMT bits - since we've already pre-cleared everything anyway. - -Wed May 30 23:51:32 2001 Earnie Boyd - - * path.cc (chdir): Always send unsigned chars to isspace since newlib's - isspace doesn't deal well with "negative" chars. - -Wed May 30 23:51:32 2001 Christopher Faylor - - * fhandler.cc (fhandler_disk_file::open): Propagate remote status of - file garnered from path_conv. Move #! checking to fstat. - (fhandler_disk_file::fstat): Reorganize st_mode setting to eliminate - duplication. Move check for #! here from fhandler::open. - - * fhandler.h (fhandler_base::isremote): New method. - (fhandler_base::set_isremote): Ditto. - (fhandler_base::set_execable_p): Also record "don't care if executable - state". - (fhandler_base::dont_care_if_execable): New method. - * path.cc (path_conv::check): Clear new flags. Appropriately set - vol_flags, drive_type, and is_remote_drive. - * path.h: Add new flags and methods for manipulating them. - * syscalls.cc (_unlink): Use isremote() to determine if a path is - remote rather than calling GetDriveType. - (stat_worker): Ditto. - * security.cc (get_file_attribute): Or attribute with result of - NTReadEA to be consistent with get_nt_attribute. - -Tue May 29 19:02:00 2001 Corinna Vinschen - - * sec_helper.cc (cygsid::getfrompw): Change parameter to `const'. - (cygsid::getfromgr): Ditto. - * security.cc: Use `sys_mbstowcs' and `sys_wcstombs' throughout. - (extract_nt_dom_user): Try to get user and domain from SID in - pw->pw_gecos first. - * security.h (class cygsid): Change parameter of getfrompw() and - getfromgr() to `const'. - * uinfo.cc (internal_getlogin): Change order for evaluating user - information in winNT case. Drop usage of NetWkstaUserGetInfo(). - -Mon May 28 21:34:00 2001 Corinna Vinschen - - * shortcut.c (check_shortcut): Treat only Cygwin shortcuts as symlinks. - -Fri May 25 11:07:07 2001 Christopher Faylor - - * path.cc (symlink_info::check): Correctly set 'ext_tacked_on'. Use - this to determine if user specified 'foo.lnk' explicitly. Reorganize - slightly to get rid of one goto. - -Fri May 25 10:15:00 2001 Corinna Vinschen - - * path.cc (symlink_info::check): Add a check to return correctly - if incoming `*.lnk' file is not a symlink. - -Thu May 24 15:46:50 2001 Christopher Faylor - - * path.cc (slash_drive_prefix_p): Remove. - (mount_info::slash_drive_to_win32_path): Ditto. - (mount_info::conv_to_win32_path): Remove slash drive prefix check. - (mount_info::add_item): Ditto. - (mount_info::del_item): Ditto. - * shared_info.h (mount_info): Remove slash_drive_to_win32_path - declaration. - -Thu May 24 01:17:33 2001 Christopher Faylor - - * exceptions.cc (handle_exceptions): Bump repeat count for debugging - kick out. - - * fhandler.h (fhandler_dev_dsp): Add a fixup_after_exec. - * fhandler_dsp.cc (class Audio): Add TOT_BLOCK_SIZE to enum. - (operator new): New. - (bigwavebuffer): Declare using TOT_BLOCK_SIZE to avoid buffer overruns. - (Audio::Audio): Optimize slightly. - (fhandler_dev_dsp::open): Allocate s_audio using static buffer. - (fhandler_dev_dsp::fixup_after_exec): New function. Ditto. - -Wed May 23 17:45:00 2001 Corinna Vinschen - - * syscalls.cc (seteuid): Restrict overriding external provided - user tokens to ntsec. Don't test external tokens for primary - group to evaluate if it should be overridden. Restrict creating - internal tokens to ntsec. - -Wed May 23 10:11:00 2001 Corinna Vinschen - - * syscalls.cc (chown_worker): Don't check for ENOSYS. - -Tue May 22 12:20:07 2001 Christopher Faylor - - * signal.cc (sleep): Protect with sigframe. - -Tue May 22 17:58:00 2001 Corinna Vinschen - - * security.cc (get_file_attribute): Don't set errno. - -Mon May 21 15:08:00 2001 Christopher Faylor - - * configure.in: Allow --enable-newvfork to turn NEWVFORK on and off. - * configure: Regenerate. - -Mon May 21 11:46:01 2001 Christopher Faylor - - * include/cygwin/version.h: Bump minor version number. - -Sun May 20 13:26:25 2001 Christopher Faylor - - * fhandler_dsp.cc: Reformat to GNU standards. - (s_audio): Change to a pointer throughout. - (fhandler_dev_dsp::open): Initialize s_audio, if required. - -Sat May 19 23:40:00 2001 Corinna Vinschen - - * autoload.cc: Add load statements for `LookupAccountNameW', - `LsaClose', `LsaEnumerateAccountRights', `LsaFreeMemory', - `LsaOpenPolicy', `LsaQueryInformationPolicy', `NetLocalGroupEnum', - `NetLocalGroupGetMembers', `NetServerEnum', `NetUserGetGroups' and - `NtCreateToken'. - * ntdll.h: Add declaration for `NtCreateToken'. - * sec_helper.cc: Add `well_known_local_sid', `well_known_dialup_sid', - `well_known_network_sid', `well_known_batch_sid', - `well_known_interactive_sid', `well_known_service_sid' and - `well_known_authenticated_users_sid'. - (cygsid::string): Define as const method. - (cygsid::get_sid): Set psid to NO_SID on error. - (cygsid::getfromstr): Ditto. - (cygsid::getfrompw): Simplify. - (cygsid::getfromgr): Check for gr == NULL. - (legal_sid_type): Move to security.h. - (set_process_privilege): Return -1 on error, otherwise 0 or 1 related - to previous privilege setting. - * security.cc (extract_nt_dom_user): Remove `static'. - (lsa2wchar): New function. - (open_local_policy): Ditto. - (close_local_policy): Ditto. - (get_lsa_srv_inf): Ditto. - (get_logon_server): Ditto. - (get_logon_server_and_user_domain): Ditto. - (get_user_groups): Ditto. - (is_group_member): Ditto. - (get_user_local_groups): Ditto. - (sid_in_token_groups): Ditto. - (get_user_primary_group): Ditto. - (get_group_sidlist): Ditto. - (get_system_priv_list): Ditto. - (get_priv_list): Ditto. - (get_dacl): Ditto. - (create_token): Ditto. - (subauth): Return immediately if SE_TCB_NAME can't be assigned. - Change all return statements in case of error to jumps to `out' - label. Add `out' label to support cleanup. - * security.h: Add extern declarations for `well_known_local_sid', - `well_known_dialup_sid', `well_known_network_sid', - `well_known_batch_sid', `well_known_interactive_sid', - `well_known_service_sid' and `well_known_authenticated_users_sid'. - Add extern declarations for functions `create_token', - `extract_nt_dom_user' and `get_logon_server_and_user_domain'. - (class cygsid): Add method `assign'. Change operator= to call new - `assign' method. Add `debug_print' method. - (class cygsidlist): New class. - (legal_sid_type): Moved from sec_helper.cc to here. - * spawn.cc (spawn_guts) Revert reversion of previous patch. - Call `RevertToSelf' and `ImpersonateLoggedOnUser' instead of `seteuid' - again. - * syscalls.cc (seteuid): Rearranged. Call `create_token' now when - needed. Call `subauth' if `create_token' fails. Try setting token - owner and primary group only if token was not explicitely created - by `create_token'. - * uinfo.cc (internal_getlogin): Try harder to generate correct user - information. Especially don't trust return value of `GetUserName'. - -Sat May 19 21:16:07 2001 Christopher Faylor - - * fork.cc (fork_parent): Move atforkprepare call here. - (fork): From here. - -Sat May 19 18:35:00 2001 Corinna Vinschen - - * autoload.cc: Add missing load statement for `CancelIo'. - -Sat May 19 01:22:43 2001 Christopher Faylor - - * grp.cc (read_etc_group): Don't copy mutex on fork. - * pwd.cc (read_etc_passwd): Ditto. - * autoload.cc (LoadDLLfuncEx): Use LoadDLLprime to initialize DLL - specific area. - -Fri May 18 10:31:00 2001 Corinna Vinschen - - * net.cc (wsock_event::wait): Explicitely cancel IO when a signal - arrived to avoid data loss. Fallback to blocking IO when canceling - fails. - -Thu May 17 15:29:00 2001 Corinna Vinschen - - * security.cc (cygwin_set_impersonation_token): Never destroy - previous token object. - (subauth): Create token source with well defined identifier. - -Wed May 16 23:27:00 2001 Corinna Vinschen - - * uinfo.cc (uinfo_init): Just set user token to INVALID_HANDLE_VALUE. - Token value is already invalid at that point. - -Wed May 16 21:34:00 2001 Fred Yankowski - - * net.cc (errmap): Add missing mapping from WSAEINTR to EINTR. - -Wed May 16 09:20:00 2001 Corinna Vinschen - - * sec_helper.cc (legal_sid_type): Fix conditional. Change to - inline function. - -Wed May 16 01:01:48 2001 Christopher Faylor - - * autoload.h: Eliminate. - * autoload.cc: Pull in autoload.h. Eliminate many macros. Rewrite to - avoid necessity of initialization routines. Just use a standard one. - (wsock_init): New function. Moved from net.cc. - * net.cc (wsock_init): Move to autoload.cc. - (wsadata): Make global. - * dtable.cc (dtable::build_fhandler): Use more reliable method for - checking if net stuff has been loaded. - -Tue May 15 19:52:00 2001 Corinna Vinschen - - * fork.cc (fork): Eliminate superfluous call to getuid(). - * security.h: New define `NO_SID'. Remove declarations of functions - moved to methods into class cygsid. - (class cygsid): Declare new methods `getfromstr', `get_sid', - `getfrompw', `getfromgr', `get_rid', `get_uid', `get_gid', `string' - and new constructors and operators =, == and !=. - Declare new global cygsids `well_known_XXX_sid' substituting the - corresponding `get_XXX_sid' functions. Remove declarations of - these functions. - * sec_helper.cc (well_known_admin_sid): New global variable. - (well_known_system_sid): Ditto - (well_known_creator_owner_sid): Ditto - (well_known_world_sid): Ditto - (cygsid::string): New method, substituting `convert_sid_to_string_sid'. - (cygsid::get_sid): New method, substituting `get_sid'. - (cygsid::getfromstr): New method, substituting - `convert_string_sid_to_sid'. - (cygsid::getfrompw): New method, substituting `get_pw_sid'. - (cygsid::getfromgr): New method, substituting `get_gr_sid'. - (cygsid::get_id): New method, substituting `get_id_from_sid'. - (get_admin_sid): Eliminated. - (get_system_sid): Ditto. - (get_creator_owner_sid): Ditto. - (get_world_sid): Ditto. - * grp.cc: Use new cygsid methods and well known sids throughout. - * registry.cc: Ditto. - * sec_acl.cc: Ditto. - * security.cc: Ditto. - * shared.cc: Ditto. - * syscalls.cc (seteuid): Ditto. Eliminate redundant conditional. - * uinfo.cc (internal_getlogin): Ditto. - * spawn.cc (spawn_guts) Revert previous patch. - -Tue May 15 10:20:00 2001 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::ioctl): Convert s_addr - field to host byte order before comparing with INADDR_LOOPBACK. - -Tue May 15 9:03:00 2001 Corinna Vinschen - - * autoload.cc: Add autoload statements for ws2_32 functions - `WSACloseEvent', `WSACreateEvent', `WSAGetOverlappedResult', - `WSARecv', `WSARecvFrom', `WSASend', `WSASendTo' and `WSASetEvent', - `WSAWaitForMultipleEvents'. - * net.cc: Define wsock_evt. - (wsock_event): New class. - (cygwin_sendto): Use overlapped socket io if available. - (cygwin_recvfrom): Ditto. - (cygwin_recv): Ditto. - (cygwin_send): Ditto. - * security.cc (subauth): Set Win32 error to 0 to safely ask for the - error code of dynamically loaded function `LsaRegisterLogonProcess'. - -Mon May 14 15:37:29 2001 Christopher Faylor - - * errno.cc (_sys_errlist): Add missing commas. - -Mon May 14 16:13:00 2001 Corinna Vinschen - - * security.cc (subauth): Check if Secur32.dll could be loaded. - -Sun May 13 22:49:04 2001 Christopher Faylor - - * path.cc (path_conv::check): Revert allow_ntsec check so that volume - info is always retrieved and isdisk setting is properly set. - -Sun May 13 14:02:36 2001 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_common::dup): Preserve O_NOCTTY when - duping a filehandle. - -Sat May 12 18:19:00 2001 Corinna Vinschen - - * dir.cc (rmdir): Rearrange slightly to allow removing directories - even when R/O attribute is set. - -Fri May 11 16:53:38 2001 Christopher Faylor - - * external.cc (fillout_pinfo): Use correct pids. - * path.cc (mount_info::conv_to_win32_path): Correct test for whether to - include a slash. - -Fri May 11 01:04:17 2001 Christopher Faylor - - * exceptions.cc (handle_exceptions): Don't print message when executing - from a cygwin program. - -2001-05-10 Egor Duda - Christopher Faylor - - * environ.cc (winenv): Always add SYSTEMDRIVE and SYSYEMROOT to - win32-style environment if they don't already exist. - -2001-05-10 Kazuhiro Fujieda - - * path.cc (mount_info::conv_to_win32_path): Treat UNC paths the same as - paths including `:' or `\'. - -Wed May 9 14:46:32 2001 Christopher Faylor - - * fhandler.h (fhandler_termios::echo_erase): Declare new method. - * fhandler_termios.cc (fhandler_termios::echo_erase): New method for - echoing erase characters. - (fhandler_termios::line_edit): Check the echo flag before echoing - control characters (from Kazuhiro Fujieda ). - -Wed May 9 10:43:30 2001 Christopher Faylor - - * include/pthread.h: Remove C++ comment. - -Tue May 8 11:09:59 2001 Christopher Faylor - - * cygheap.cc (_cfree): Add regparm attribute. - (_crealloc): Ditto. - - * dcrt0.cc (dll_crt0_1): Default to always checking for executable for now. - - * dtable.cc (dtable::not_open): Move method. - * dtable.h (dtable): Here. - - * exceptions.cc (ctrl_c_handler): Don't expect process group leader to - handle a signal if it doesn't exist. - - * fhandler.h (fhandler_base): Make openflags protected. - - * localtime.c (tzsetwall): Check for __CYGWIN__ as well as __WIN32__. - - * path.cc (path_conv::check): Add some comments. Change strcat to assignment. - - * lib/_cygwin_S_IEXEC.cc (_cygwin_bob__): Eliminate. - - * fhandler_tty.cc (fhandler_console::dup): Set controlling terminal if necessary. - * fhandler_tty.cc (fhandler_tty_slave::dup): Ditto. - -Mon May 7 21:33:17 2001 Christopher Faylor - - * include/sys/file.h: Revert special X_OK usage. Just make it a - constant. - -Sun May 6 17:05:00 2001 Robert Collins - - * thread.h (pthread_cond): New element cond_access to allow atomic - broadcasts. - * thread.cc (pthread_cond::pthread_cond): Initialise cond_access. - (pthread_cond::~pthread_cond): Destroy cond_access. - (pthread_cond::Broadcast): Use cond_access. - (pthread_cond::Signal): Use cond_access. - (pthread_cond_wait): Use cond_access. - (pthread_cond_timedwait): Use cond_access. - -Sun May 6 11:55:40 2001 Christopher Faylor - - * string.h (cygwin_strchr): Make 'static inline' so that things will - still work when optimized. - -Sat May 5 01:04:11 2001 Christopher Faylor - - * exceptions.cc (handle_exceptions): Vastly increase test for exception - loop guard variable. - -Fri May 4 22:23:33 2001 Christopher Faylor - - * exceptions.cc (stack_info): Add some controls. - (stack_info::init): Add extra arguments to control method of - initialization.. If we have a known good frame, set things up so that - this frame is not skipped the first time through. Record whether - caller cares about arguments or not. - (stack_info::walk): Don't store arguments if they're unwanted. - (stackdump): Add isexception parameter for use when called by exception - handler. - (cygwin_stackdump): Accommodate extra argument to stackdump. - (handle_exceptions): Ditto. - (sig_handle): Ditto. - (interrupt_on_return): Accommodate extra arguments to stack walk - initialization. - -Fri May 4 21:05:20 2001 Christopher Faylor - - * localtime.c: Revert exclusion of windows.h. - -Fri May 4 17:03:16 2001 Christopher Faylor - - * string.h: Fix last-minute typo. - -Fri May 4 16:49:34 2001 Christopher Faylor - - * pinfo.h: Correctly set __SIGOFFSET. - - * path.cc (hash_path_name): Avoid calling library functions for simple - copying of characters. - - * shortcut.c: Use WIN32_LEAN_AND_MEAN. - * smallprint.c: Ditto. - - * environ.cc (getwinenv): Minor clarity fix. - - * localtime.c: No need to include windows.h - - * string.h: New file. - -Fri May 4 16:37:30 2001 Christopher Faylor - - * exceptions.cc (ctrl_c_handler): Always send signal to process if it - has no tty. - -2001-05-04 Egor Duda - - * fhandler_socket.cc (set_connect_secret): Use /dev/urandom to - generate secret cookie. - -Thu May 3 16:37:55 2001 Christopher Faylor - - * include/pthread.h (pthread_cleanup_push): Eliminate space preceding - arguments. - (pthread_cleanup_pop): Ditto. - -Thu May 3 18:16:00 2001 Corinna Vinschen - - * net.cc (wsock_init): Rename `was_in_progress' to `wsock_started' - for clearness. - -Thu May 3 10:44:16 2001 Christopher Faylor - - * exceptions.cc (handle_exceptions): Break out of "loop" if the - debugger doesn't seem to be attaching to our process. - -Wed May 2 20:18:00 2001 Corinna Vinschen - - * autoload.cc: Use new definition of LoadDLLinitfunc throughout. - Redefine wrapper for wsock32.dll and ws2_32.dll. - (std_dll_init): New function. - * autoload.h: Rename LoadDLLinitfunc to LoadDLLinitfuncdef. - Add new defines LoadDLLinitfunc and LoadDLLstdfunc. - * net.cc (wsock_init): Add guard variable handling. Take care - to call WSAStartup only once. Load WSAStartup without using - autoload wrapper to eliminate recursion. Eliminate FIONBIO - and srandom stuff. - -Tue May 1 01:26:15 2001 Christopher Faylor - - * path.cc (mount_info::conv_to_win32_path): More path tweaking. - -Tue May 1 00:34:46 2001 Christopher Faylor - - * path.cc (mount_info::conv_to_win32_path): Fix debugging output to - avoid a SIGSEGV. Avoid double backslashes in middle of filename. - -Mon Apr 30 21:51:14 2001 Christopher Faylor - - * path.cc (mkrelpath): New function. - (mount_info::conv_to_win32_path): Eliminate now-unneeded relative path - name arg and processing. - (path_conv::check): Accommodate relative path names again. Accommodate - one extra argument in mount_info::conv_to_win32_path. Tack trailing - slash on end of relative path as a side effect, like before. - * shared_info.h (mount_info::conv_to_win32_path): Reflect new argument - ordering. - -Mon Apr 30 22:09:00 2001 Corinna Vinschen - - * autoload.cc: Add LoadDLLinitfunc for secur32.dll. - Add LoadDLLfuncEx statements for AllocateLocallyUniqueId@4, - DuplicateTokenEx@24, LsaNtStatusToWinError@4, - LsaDeregisterLogonProcess@4, LsaFreeReturnBuffer@4, - LsaLogonUser@56, LsaLookupAuthenticationPackage@12, - LsaRegisterLogonProcess@12, - * environ.cc: Add extern declaration for `subauth_id'. - (subauth_id_init): New function for setting `subauth_id'. - (struct parse_thing): Add entry for `subauth_id'. - * fork.cc (fork_parent): Call `RevertToSelf' and - `ImpersonateLoggedOnUser' instead of `seteuid'. - * security.cc: Define global variable `subauth_id'. - (extract_nt_dom_user): New function. - (cygwin_logon_user): Call `extract_nt_dom_user' now. - (str2lsa): New static function. - (str2buf2lsa): Ditto. - (str2buf2uni): Ditto. - (subauth): Ditto. - * security.h: Add prototype for `subauth'. - * spawn.cc (spawn_guts): Use cygheap->user.token only if impersonated. - Use `cygsid' type. Remove impersonation before allowing access to - workstation/desktop to everyone. Call `RevertToSelf' and - `ImpersonateLoggedOnUser' instead of `seteuid'. - * syscalls.cc (seteuid): Rearranged to allow using subauthentication - to retrieve user tokens when needed. - -Mon Apr 30 20:26:00 2001 Corinna Vinschen - - * uinfo.cc (internal_getlogin): Formatting change. - -Mon Apr 30 19:58:00 2001 Corinna Vinschen - - * grp.cc: Eliminate MAX_DOMAIN_NAME define. - (read_etc_group): Substitute MAX_DOMAIN_NAME by - INTERNET_MAX_HOST_NAME_LENGTH. - * passwd.cc (parse_pwd): Don't force pw_name to be lower case. - * sec_helper.cc: Substitute MAX_USER_NAME by UNLEN, - MAX_COMPUTERNAME_LENGTH by INTERNET_MAX_HOST_NAME_LENGTH throughout. - (lookup_name): Slight cleanup. - * security.cc (alloc_sd): Substitute MAX_USER_NAME by UNLEN. - * security.h: Define DEFAULT_UID as DOMAIN_USER_RID_ADMIN and - DEFAULT_GID as DOMAIN_ALIAS_RID_ADMINS. - * shared.cc (memory_init): Substitute MAX_USER_NAME by UNLEN. - * thread.h: Ditto. - * uinfo.cc (internal_getlogin): Substitute MAX_USER_NAME by UNLEN. - Substitute MAX_COMPUTERNAME_LENGTH and MAX_HOST_NAME by - INTERNET_MAX_HOST_NAME_LENGTH. - * winsup.h: Include lmcons.h. Eliminate MAX_USER_NAME and - MAX_HOST_NAME. Move DEFAULT_UID and DEFAULT_GID to security.h. - -Mon Apr 30 12:35:40 2001 Christopher Faylor - - * path.cc (path_conv::check): Don't use path_flags when converting to - MS-DOS syntax unless parsing tail of path component. Stop parsing path - when we reach the 'root' of the path. Correctly copy tail to path - component. - -Sun Apr 29 22:28:06 2001 Christopher Faylor - - * exceptions.cc (INIT_EXCEPTION_HANDLER): Eliminate. - (init_exceptions): Just use init_exception_handler. - (open_stackdumpfile): New function. - (stack_info::first_time): Eliminate. - (stack_info::init): Set up fields to avoid "first_time" consideration. - (stack_info::walk): Remove "first_time" consideration. - (stackdump): Change arguments to accept initial frame pointer and open - stack file flag. - (stack): Eliminate. - (cygwin_stackdump): Use stackdump() rather than stack(). - (try_to_debug): Remove all synchronization logic. Just keep looping in - exception handler until debugger notices us. Return 1 if successfully - started debugger. - (handle_exceptions): Just return if we know that we're debugging. - Reorganize to avoid creating a stackdump file if we are starting a - debugger. Return from exception handler if debugger started - successfully. - (sig_handle): Create a stackdump only if debugger wasn't started. - * winsup.h (try_to_debug): Add an argument. - -Sun Apr 29 21:41:25 2001 Christopher Faylor - - * path.cc (symlink_info::check): Remove extra arguments, move - functionality back to path_conv::check. Clear symlink bit from pflags - argument before detecting if this is a symlink. - (path_conv::check): Convert posix path here instead of - symlink_info::check. Only grab volflags when using ntsec. - (symlink_info::check_case): Just replace appropriate part of input - path. - -Sat Apr 28 19:36:13 2001 Christopher Faylor - - Throughout, change 'tty_attached' to 'real_tty_attached', for clarity. - Throughout, change 'OutputStopped' to 'output_stopped', for - consistency. - * dtable.cc (stdio_init): Set controlling tty if not set by stdio - opens. - * exceptions.cc (ctrl_c_handler): Avoid special pgid checking if no tty - is associated with the process. - (Suggested by Tim Baker ) - * external.cc (fillout_pinfo): Return actual tty number for ctty. - * fhandler_console.cc (get_tty_stuff): Set ctty when shared memory is - allocated. Accept flags input from open(). - (set_console_ctty): New function. - (fhandler_console::open): Pass flags to get_tty_stuff and rely on this - function to set the ctty, if appropriate. - * fhandler_termios.cc (fhandler_termios::set_ctty): Move to tty_min - class. - * fhandler_tty.cc (fhandler_tty_slave::open): Use tc field to access - set_ctty(). - * tty.h (TTY_CONSOLE): Move to include/sys/cygwin.h. - (tty_min): Add set_ctty class here. - * include/sys/cygwin.h (TTY_CONSOLE): New home here. - - * path.cc (symlink_info): Make contents an actual buffer. Pass more - flags to case_check. - (path_conv::check): Reorganize to do parsing based on posix path rather - than native path. - (symlink_info::check): Expect posix path as input. Translate to native - path here. Accept path_conv flags. Stop parsing if not a symlink - regardless of whether previous path was a symlink. - -2001-04-27 Kazuhiro Fujieda - - * thread.cc (thread_init_wrapper): Use _REENT_INIT to initialize the - reent structure of newlib. - -Fri Apr 27 14:02:24 2001 Christopher Faylor - - * sigproc.h (sig_send): Add exception parameter to sig_send. - * sigproc.cc (sig_send): Ditto. Use it when setting frame info. - * exceptions.cc (handle_exceptions): Use exception flag when calling - sig_send. - -2001-04-27 Egor Duda - - * tty.cc (tty::make_pipes): Set to_slave pipe mode to nonblocking. - * fhandler_tty.cc (fhandler_pty_master::accept_input): If pipe buffer - is full, give slave a chance to read data. - -2001-04-26 Kazuhiro Fujieda - - * security.cc (alloc_sd): Add unrelated ACCESS_ALLOWED_ACE behind - the `everyone' ACE. - -Wed Apr 25 15:07:37 2001 Christopher Faylor - - * sigproc.h [sigthread]: Add exception field. - [sigframe::~sigframe]: Clear exception field. - [sigframe::set]: Set exception field from caller. - * sigproc.cc (sig_send): Set exception field when frame pointer is - passed in. - * exceptions.cc (interrupt_on_return): Always treat exception as - interruptible. - -2001-04-25 Egor Duda - - * cygwin.din: Export asctime_r, ctime_r, gmtime_r, localtime_r - * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 39 - -Wed Apr 25 10:57:36 2001 Christopher Faylor - - * include/cygwin/version.h: Bump minor version number. - * childinfo.h: Bump child structure magic number. - -2001-04-25 Kazuhiro Fujieda - - * uinfo.cc (internal_getlogin): Return pointer to struct passwd. - (uinfo_init): Accommodate the above change. - * syscalls.cc (seteuid): Ditto. - -Tue Apr 25 11:08:00 2001 Corinna Vinschen - - * autoload.cc: Add LoadDLLfunc statements for SetTokenInformation@16. - * cygheap.cc: Include security.h. - * grp.cc (internal_getgrent): New function. - (getgroups): Rearranged using `internal_getgrent' and the new - `cygsid' class. - * passwd.cc (internal_getpwent): New function. - * sec_acl.cc: Use new `cygsid' class throughout. - (acl_access): Use `internal_getgrent' instead of `getgrent'. - * sec_helper.cc: Use new `cygsid' class throughout. - (get_id_from_sid): Use `internal_getgrent' instead of `getgrent'. - Use `internal_getpwent' instead of `getpwent'. - * security.cc: Use new `cygsid' class throughout. - * security.h: Move `MAX_SID_LEN' from winsup.h to here. - Add extern declarations for `internal_getgrent' and `internal_getpwent'. - (class cygsid): New class. - * shared.cc (sec_user): Use new `cygsid' class. - * syscalls.cc (seteuid): Try to set owner to user and primary group to - current group in impersonation token before performing impersonation. - (setegid): Try to set primary group in process token to the new group - if ntsec is on. - * uinfo.cc (internal_getlogin): Use new `cygsid' class. - Try to set owner to user and primary group to current group in process - token if the process has been started from a non cygwin process. - (uinfo_init): Set primary group only if the process has been started - from a non cygwin process. - * winsup.h: Move define for `MAX_SID_LEN' to security.h. - -Mon Apr 16 23:20:00 2001 Andy Younger - - * fhandler_dsp.cc: Improved handling of 8 bit playback modes. - Put in mock support for SNDCTL_DSP_SETFRAGMENT. - -Tue Apr 24 23:51:00 2001 Corinna Vinschen - - * passwd.cc (getpwnam_r): Add pw_passwd handling as well. - (getpwuid_r): Ditto. - -Tue Apr 24 23:43:00 2001 Corinna Vinschen - - * passwd.cc (getpwnam_r): Use correct offsets into buffer. - Copy pw_gecos field as well. - (getpwuid_r): Ditto. - -2001-04-24 Egor Duda - - * dlmalloc.c: New file. Port of Doug Lea's malloc - * dlmalloc.h: Ditto. - * Makefile.in: Add support for MALLOC_DEBUG - * config.h.in: Ditto. - * winsup.h: Ditto. - * configure.in: Add --enable-malloc-debugging option. - * configure: Regenerate. - * debug.h: Include declarations for debugging malloc. - * tty.cc (grantpt): Fix definition. - (unlockpt): Ditto. - -Mon Apr 23 22:00:29 2001 Christopher Faylor - - Remove trailing underscore from fhandler_base and friends, throughout. - * fhandler.h (fhandler_base::set_open_status): New method. Stores - original open status. - (fhandler_base::get_open_status): New method. Retrieves original open - status. - (fhandler_base::reset_to_open_binmode): New method. - * fhandler.cc (fhandler_base::open): Save open status. - (fhandler_base::init): Ditto. - * fhandler_clipboard.cc (fhandler_clipboard::open): Ditto. - * fhandler_console.cc (fhandler_console::open): Ditto. - * fhandler_dsp.cc (fhandler_dsp::open): Ditto. - * fhandler_dev_mem.cc (fhandler_dev_mem::open): Ditto. - * fhandler_dev_random.cc (fhandler_dev_random::open): Ditto. - * fhandler_serial.cc (fhandler_serial::open): Ditto. - * fhandler_tty_slave.cc (fhandler_tty_slave::open): Ditto. - * fhandler_tty_master.cc (fhandler_tty_master::open): Ditto. - * fhandler_dev_zero.cc (fhandler_dev_zero::open): Ditto. - * syscalls.cc (setmode): Rework so that 0 mode value causes reversion - to open state. - - * fhandler_tty_slave.cc (fhandler_tty_slave::read): Use correct - multiplier when converting from deciseconds to milliseconds. - -Mon Apr 23 13:28:35 2001 Christopher Faylor - - * fhandler.h (fhandler_base::clear_r_binary): New method. - (fhandler_base::clear_w_binary): New method. - * syscalls.cc (setmode): Accept 0 as mode value. Resets text/binary - behavior for fd to default. - -Mon Apr 23 12:46:07 2001 Christopher Faylor - - * net.cc [errmap]: Add '0' condition. - (find_winsock_errno): Don't translate no error to EPERM. - -Sun Apr 22 20:48:24 2001 Christopher Faylor - - * include/cygwin/version.h: Bump Cygwin version and API version. - -Mon Apr 23 9:27:00 2001 Robert Collins - - * thread.cc (MTinterface::Init): Always initialise per process variables. - -Sun Apr 22 19:18:18 2001 Christopher Faylor - - * features.h: Reinstate as wrapper for sys/features.h. - -Mon Apr 23 0:10:00 2001 Corinna Vinschen - - * security.cc (alloc_sd): Reformat comment. - * shared.cc: Drop function declarations already in security.h. - -Sun Apr 22 12:17:57 2001 Christopher Faylor - - * shortcut.c (check_shortcut): Close input file handle before - returning. - * path.cc (check_sysfile): Ditto. - (symlink_info::check): Rely on opened file handle being closed by - symlink checking routines. Set ext_tacked_on when .lnk is detected. - -Sat Apr 21 19:26:05 2001 Christopher Faylor - - * thread.cc (MTinterface::Init): Remove accidentally checked in code. - -Sun Apr 22 00:22:00 2001 Robert Collins - - * passwd.cc (getpwuid): Check for thread cancellation. - (getpwuid_r): Ditto. - (getpwname): Ditto. - (getpwnam_r): Ditto. - * thread.h (pthread_mutex): New constructors for pshared operation. - (MTinterface): Associative array for pshared mutex's. - * thread.cc (MTinterface::Init): Initailize pshared mutex array. - (pthread_cond::BroadCast): Implementation notes. - (pthread_cond::TimedWait): Remove use of SignalObjectAndWait on non-NT systems. - (pthread_mutex::pthread_mutex(unsigned short)): New function. - (pthread_mutex::pthread_mutex (pthread_mutex_t *, pthread_mutexattr *)):New function. - (pthread_mutex::pthread_mutex(pthread_mutexattr *)): Fail on pshared mutex's. - (__pthread_mutex_getpshared): New function. - (__pthread_join): Check for thread cancellation. - (__pthread_cond_timedwait): Support pshared mutex's. - (__pthread_cond_wait): Ditto. - (__pthread_condattr_setpshared): Error on PROCESS_SHARED requests. - (__pthread_mutex_init): Support pshared mutex's. - (__pthread_mutex_getprioceiling): Ditto. - (__pthread_mutex_lock): Ditto. - (__pthread_mutex_trylock): Ditto. - (__pthread_mutex_unlock): Ditto. - (__pthread_mutex_destroy): Ditto. - (__pthread_mutex_setprioceiling): Ditto. - (__pthread_mutexattr_setpshared): Support PTHREAD_PROCESS_PSHARED requests. - -Fri Apr 20 19:38:29 2001 Christopher Faylor - - * cygwin.din: Add *scanf and *scan_r functions. - -Fri Apr 20 22:25:00 2001 Corinna Vinschen - - * security.cc (set_process_privileges): Swap out. - * sec_helper.cc (set_process_privilege): Rename from - `set_process_privileges'. Takes the privilege to enable or disable - as parameter now. - * security.h: Add prototype for `set_process_privileges'. - -2001-04-19 Egor Duda - - * path.cc (path_conv::check): Always initialize member variables. - -Fri Apr 20 12:27:49 2001 Christopher Faylor - - * include/sys/file.h: More cleanup for X_OK. - -Fri Apr 20 11:48:45 2001 Christopher Faylor - - * include/sys/file.h: Move X_OK protection earlier. - - * dtable.cc (dtable::vfork_child_fixup): Avoid closing already closed - handles. - -Fri Apr 20 16:29:00 2001 Corinna Vinschen - - * grp.cc (getgroups): Change so that SIDs get compared instead - of strings to SIDs. - -Fri Apr 20 14:50:00 2001 Corinna Vinschen - - * Makefile.in: Add object files `sec_helper.cc' and `sec_acl.cc'. - * security.cc: Swap out several functions. - * sec_acl.cc: New file. Move Sun compatibel ACL functions from - `security.cc' to here. - * sec_helper.cc: New file. Move security helper functions from - `security.cc' to here. - * security.h: Changed to accommodate the above changes. - -Fri Apr 20 14:12:00 2001 Corinna Vinschen - - * grp.cc: Replace `group_in_memory_p' by `group_state'. - Eliminate group_sem throughout. - (enum grp_state): New enumeration type. - (read_etc_group): Make race safe. - * security.cc: Eliminate group_sem throughout. - -Thu Apr 19 9:40:00 2001 Corinna Vinschen - - * mmap.cc (mmap): Drop usage of the same memory area if the same - region of the same file is mapped twice. - -Wed Apr 18 16:53:54 2001 Christopher Faylor - - Throughout, change fdtab references to cygheap->fdtab. - * child_info.h (cygheap_exec_info): Eliminate special fdtab stuff. - * spawn.cc (spawn_guts): Ditto. - * cygheap.cc (cygheap_init): Initialize fdtab, if appropriate. - * cygheap.h (CYGHEAPSIZE): Include size of init_cygheap. - (_cmalloc_entry): Include fdtab here. - * dtable.h (dtable): Declare/define new methods. - * dtable.cc (dtable::vfork_child_fixup): New method. - (dtable::fixup_after_exec): Remove unneeded extra arguments. - * dcrt0.cc (dll_crt0_1): Ditto. - - * environ.cc (getwinenv): Use case sensitive comparison. - (winenv): Make a copy of environment cache to avoid realloc problems - when duplicate environment variables exist in the environment. (From - Egor Duda) - - * net.cc (cygwin_socket): Revert Apr 14 change. - - * include/sys/file.h: Protect against previous X_OK definition. - -Tue Apr 17 12:18:28 2001 Christopher Faylor - - * passwd.cc: Eliminate passwd_sem throughout. - * security.cc: Ditto. - -Tue Apr 17 12:18:28 2001 Robert Collins - - * cygwin.din: Export New functions. - * passwd.cc (read_etc_passwd): Make race safe. - (getpwuid_r): New function. - (getpwnam_r): New function. - -2001-04-18 Egor Duda - - * grp.cc (getgroups): Avoid crash if passwd field if /etc/group is - empty. - -Tue Apr 17 19:05:44 2001 Christopher Faylor - - * path.h (path_conv::add_ext_from_sym): Declare. - * path.cc (path_conv::add_ext_from_sym): Convert to pure inline method. - -Tue Apr 17 18:50:00 2001 Corinna Vinschen - - * path.cc (windows_device_names): Add missing NULL element. - -Tue Apr 17 12:14:54 2001 Christopher Faylor - - * path.cc (windows_device_names): Move dsp to proper location. - -Tue Apr 17 13:44:00 2001 Corinna Vinschen - - * path.cc (path_conv::check): Set case_clash even if pcheck_case - is set to PCHECK_ADJUST when a case clash is given for the last - component in path. - (symlink_info::case_check): Ditto. - * syscalls.cc (_rename): Avoid overwriting an already existing file - if a case clash is given even if pcheck_case is set to PCHECK_ADJUST. - -Tue Apr 17 2:07:07 2001 Christopher Faylor - - * config.h.in: Turn off VFORK again. - -Mon Apr 16 23:45:24 2001 Christopher Faylor - - * path.h (cwdstuff): Move class. - * cygheap.h (cwdstuff): To here. - (init_cygheap): Add cwd field. - * child_info.h (cygheap_exec_info): Eliminate cwd stuff. - (child_info_spawn): Ditto. - * dcrt0.cc (dll_crt0_1): Remove cygcwd.fixup_after_exec call. Convert - cygcwd reference to cygheap->cwd. - * path.cc: Ditto, throughout. - (cwdstuff::copy): Eliminate. - (cwdstuff::fixup_after_exec): Ditto. - * spawn.cc (spawn_guts): Eliminate call to cygcwd.copy. - - * fhandler.h (FH_OSS_DSP): Move into "fast" device category. - -Mon Apr 16 19:19:00 2001 Corinna Vinschen - - * mmap.cc: Move fh_paging_file from some functions to be - a global static variable. - (class mmap_record): Add `devtype_' member to remember - the device type of the file. Add declaration for methods - `get_device', `alloc_fh' and `free_fh'. - (mmap_record::mmap_record): Initialize `devtype_' correctly. - (mmap_record::alloc_fh): New method. - (mmap_record::free_fh): Ditto. - (munmap): Use new mmap_record::alloc_fh and mmap_record::free_fh - methods to create a correct fhandler. - (msync): Ditto. - (fixup_mmaps_after_fork): Ditto. - -Mon Apr 16 16:01:00 2001 Corinna Vinschen - - * grp.cc (getgroups): If `allow_ntsec' is set, use the process token - information to evaluate the groups list. - -Mon Apr 16 00:08:02 2001 Christopher Faylor - - * features.h: Remove this file as it is now being supplied by newlib. - -Sun Apr 15 23:23:29 2001 Christopher Faylor - - * autoload.cc: Add winmm functions needed by fhandler_dsp.cc. - -Sun Apr 15 22:53:52 2001 Andy Younger - - * fhandler_dsp.cc: New file. Implements OSS like /dev/dsp. - * include/sys/soundcard.h: New file. User land includes for OSS - /dev/dsp. - * fhandler.h: Add new class fhandler_dev_dsp and a FH_OSS_DSP - definition. - * dtable.cc (dtable::build_fhandler): Allow creation of the /dev/dsp - device. - * path.cc (windows_device_names): Add /dev/dsp into list of device - names. - * Makefile.in (DLL_OFILES): Add fhandler_dsp.o. - -Sun Apr 15 16:36:27 2001 Christopher Faylor - - * uname.c (uname): Default n in in86 to 6 if Windows returns > 6. - -Sun Apr 15 15:56:00 2001 Corinna Vinschen - - * path.cc (add_ext_from_sym): Redefine to call `add_ext_from_sym_'. - (add_ext_from_sym_): New inline function. - -Sat Apr 14 19:23:52 2001 Christopher Faylor - - * config.h.in: Turn on VFORK by default. - -Sat Apr 14 18:04:35 2001 Christopher Faylor - - * net.cc (cygwin_socket): Set SO_LINGER to small value so closed UNIX - domain sockets will not stay around. - -Sat Apr 14 18:01:43 2001 Pierre A. Humblet - - * select.cc (socket_cleanup): Set SO_LINGER to small value so closed - dummy sockets do not stay around. Use correct value for second argument - to shutdown. - -Sat Apr 14 17:04:00 2001 Robert Collins - - * thread.h (MTinterface): Add threadcount. - * thread.cc (MTinterface::Init): Set threadcount to 1. - (__pthread_create): Increment threadcount. - (__pthread_exit): Decrement threadcount and call exit() from the last thread. - -Fri Apr 13 11:34:24 2001 Robert Collins - - * fork.cc (fork_child): Call the __pthread_atforkchild function. - (fork_parent): Call the __pthread_atforkparent function. - * cygwin.din: Export pthread_atfork. - * thread.h (callback): New class. - (MTinterface): Use it. - * thread.cc (__pthread_atforkprepare): New function. - (__pthread_atforkparent): New function. - (__pthread_atforkchild): New function. - (__pthread_atfork): New function. - * pthread.cc (pthread_atfork): New function. - -Fri Apr 13 9:52:00 2001 Corinna Vinschen - - * path.cc (add_ext_from_sym): New define evaluating `known'suffix'. - (path_conv::check): Use add_ext_from_sym throughout. - -Thu Apr 12 23:19:00 2001 Corinna Vinschen - - * dir.cc (mkdir): Check for case clash. - * environ.cc: Add extern declaration for `pcheck_case'. - (check_case_init): New function. - (struct parse_thing): Add "check_case" option. - * errno.cc (_sys_nerrlist): Add text for ECASECLASH. - (strerror): Add case branch for ECASECLASH. - * fhandler.cc (fhandler_disk_file::open): Check for case clash. - * path.cc: Add global variable `pcheck_case'. - (struct symlink_info): Add member `case_clash' and method `case_check'. - (path_prefix_p_): Call `pathnmatch' instead of `strncasematch'. - (pathnmatch): New funtion. - (pathmatch): Ditto. - (path_conv::check): Add handling for case checking. - (symlink): Check for case clash. - (symlink_info::check): Add parameter for case checking. - Handle case checking. - (symlink_info::case_check): New method. - (chdir): Don't use unconverted path if pcheck_case==PCHECK_STRICT. - * path.h: Add extern declarations for `pathmatch' and - `pathnmatch'. - (enum case_checking): New enumeration type describing - the case checking behaviour of path conversion routines. - (class path_conv): Add member `case_clash'. - * syscalls.cc (_link): Check for case clash. - -Thu Apr 12 12:49:53 2001 Christopher Faylor - - * syscalls.cc (mkfifo): New function stub. - -2001-04-12 Robert Collins - - * configure.in: Remove PTH_ALLOW. - * cygwin.din: Remove @PTH_ALLOW@ prefixes to pthread functions. Add - new pthread exports. - * pthread.cc: New wrapper functions for the above new exports. - * sched.cc (valid_sched_parameters): New function. - (sched_setparam): Use it. - (sched_set_thread_priority): New function. Used by pthread_sched*. - * thread.cc (pthread_key_destructor::InsertAfter): New function. - (pthread_key_destructor::UnlinkNext): New function. - (pthread_key_destructor::Next): New function. - (pthread_key_destructor_list::Insert): New function. - (pthread_key_destructor_list::Remove): New function. - (pthread_key_destructor_list::Pop): New function. - (pthread_key_destructor::pthread_key_destructor): New function. - (pthread_key_destructor_list::IterateNull): New function. - (MTinterface::Init): Initialise new member. - (pthread::pthread): Initialise new members. - (pthread::create): Copy new attributes. Set the new thread priority. - (pthread_attr::pthread_attr): Initialise new members. - (pthread_key::pthread_key): Setup destructor function. - (pthread_key::~pthread_key): Remove destructor function. - (pthread_mutexattr::pthread_mutexattr): New function. - (pthread_mutexattr::~pthread_mutexattr): New function. - (__pthread_once): New function. - (__pthread_cleanup): New function. - (__pthread_cancel): New function. - (__pthread_setcancelstate): New function. - (__pthread_setcanceltype): New function. - (__pthread_testcancel): New function. - (__pthread_attr_getinheritsched): New function. - (__pthread_attr_getschedparam): New function. - (__pthread_attr_getschedpolicy): New function. - (__pthread_attr_getscope): New function. - (__pthread_attr_setinheritsched): New function. - (__pthread_attr_setschedparam): New function. - (__pthread_attr_setschedpolicy): New function. - (__pthread_attr_setscope): New function. - (__pthread_exit): Call any key destructors on thread exit. - (__pthread_join): Use the embedded attr values. - (__pthread_detach): Use the embedded attr values. - (__pthread_getconcurrency): New function. - (__pthread_getschedparam): New function. - (__pthread_key_create): Pass the destructor on object creation. - (__pthread_key_delete): Correct incorrect prototype. - (__pthread_setconcurrency): New function. - (__pthread_setschedparam): New function. - (__pthread_cond_timedwait): Support static mutex initialisers. - (__pthread_cond_wait): Ditto. - (__pthread_mutex_getprioceiling): New function. - (__pthread_mutex_lock): Support static mutex initialisers. - (__pthread_mutex_trylock): Ditto. - (__pthread_mutex_unlock): Ditto. - (__pthread_mutex_destroy): Ditto. - (__pthread_mutex_setprioceiling): New function. - (__pthread_mutexattr_getprotocol): New function. - (__pthread_mutexattr_getpshared): New function. - (__pthread_mutexattr_gettype): New function. - (__pthread_mutexattr_init): New function. - (__pthread_mutexattr_destroy): New function. - (__pthread_mutexattr_setprotocol): New function. - (__pthread_mutexattr_setprioceiling): New function. - (__pthread_mutexattr_getprioceiling): New function. - (__pthread_mutexattr_setpshared): New function. - (__pthread_mutexattr_settype): New function. Remove stubs for non - MT_SAFE compilation. - * thread.h: Remove duplicate #defines. Add prototypes for new - functions in thread.cc. - (pthread_key_destructor): New class. - (pthread_key_destructor_list): New class. - (pthread_attr): Add new members. - (pthread): Remove members that are duplicated in the pthread_attr - class. - (pthread_mutex_attr): Add new members. - (pthread_once): New class. - * include/pthread.h: Add prototypes for new functions exported from - cygwin1.dll. Remove typedefs. - * include/sched.h: Add prototypes for new functions in sched.cc. - * include/cygwin/types.h: Add typedefs from pthread.h - -Tue Apr 10 22:02:53 2001 Christopher Faylor - - * path.cc (struct symlink_info): Add extn and ext_tacked_on fields. - (path_conv::check): Only tack on extension if a known one didn't - already exist. - (suffix_scan::has): Return pointer to known extension. - (symlink_info::check): Record location of extension, if any. - -2001-04-09 Egor Duda - - * fhandler.h (class fhandler_socket): Add members and methods to - support secure connections on AF_UNIX sockets. - * fhandler_socket.cc (fhandler_socket::set_connect_secret): New method. - (fhandler_socket::get_connect_secret): Ditto. - (fhandler_socket::create_secret_event): Ditto. - (fhandler_socket::close_secret_event): Ditto. - (fhandler_socket::check_peer_secret_event): Ditto. - (fhandler_socket::fixup_after_fork): Duplicate secret event to child. - (fhandler_socket::dup): Copy address family. - (fhandler_socket::close): Close secret event. - * net.cc (get_inet_addr): Read secret cookie. - (cygwin_connect): Check if peer knows secret cookie value. - (cygwin_accept): Ditto. Copy address family to newly created socket. - (cygwin_bind): Generate and write secret cookie. - (wsock_init): Initialize random number generator. - -Sun Apr 8 20:40:58 2001 Christopher Faylor - - * Makefile.in: Put -lgcc last in list of libraries, since stdc++ - library needs it. - * cygwin.din: Remove obsolete "__empty" export. - * exceptions.cc (call_signal_handler_now): Force inclusion of function - even when -finline-functions is specified. - * sigproc.h: Remove obsolete call_signal_handler declaration. - -Sun Apr 8 20:36:55 2001 Benjamin Riefenstahl - - * fhandler_console.cc (cp_get_internal): New function. - (cp_convert): New function. - (con_to_str): New function. - (str_to_con): New function. - (fhandler_console::read): Replace OemToCharBuff with con_to_str. - (fhandler_console::write_normal): Replace CharToOemBuff with str_to_con. - -Thu Apr 5 22:41:00 2001 Corinna Vinschen - - * syscalls.cc (stat_worker): Fix conditional which still allowed - successful stat'ing of non-existant files. - -Wed Apr 4 10:37:44 2001 Christopher Faylor - - * child_info.h: Bump magic number for fork/exec/spawn. - -Tue Apr 3 20:06:00 2001 Corinna Vinschen - - * errno.cc (errmap): Map ERROR_FILE_INVALID to ENXIO. - -Mon Apr 2 22:48:58 2001 Christopher Faylor - - * cygrun.c (main): Fix compiler warning. - * gmon.c (_mcleanup): Ditto. - * profil.c (profile_off): Ditto. - - * net.cc (find_winsock_errno): New function. - (__set_winsock_errno): Use find_winsock_errno. - (cygwin_setsockopt): Detect SO_ERROR for debugging. - (cygwin_getsockopt): Ditto. Translate error when getsockopt returns - SO_ERROR. - * winsup.h: regparmize __set_winsock_errno. - * include/sys/strace.h: Document that strace functions can't use - regparm. - -2001-04-02 Kazuhiro Fujieda - - * fhandler.cc (fhandler_disk_file::open): Avoid checking a magic - number of a directory. - -Mon Apr 2 00:24:08 2001 Christopher Faylor - - * shared_info.h (mount_info): Remove mnt_ elements. - * thread.h (struct _winsup_t): Add mnt_ elements. - * path.cc (fillout_mntent): Use mnt_ elements from reent_winsup (). - -Sun Apr 1 20:10:34 2001 Christopher Faylor - - * exceptions.cc (sigframe::call_signal_handler): Return value of - call_signal_handler_now. - * sigproc.h (sigframe): Use constructor. - * syscalls.cc (_read): Correct errno test prior to calling signal - handler. - -Sun Apr 1 00:38:06 2001 Christopher Faylor - - * exceptions.cc (sigframe::call_signal_handler): Move outside of "C" - block or some compilers will complain. - -Sun Apr 1 00:24:14 2001 Christopher Faylor - - * exceptions.cc (call_signal_handler_now): Rename from - call_signal_handler to avoid C++ confusion. - -Sun Apr 1 00:08:15 2001 Christopher Faylor - - * path.cc (fillout_mntent): Always remove drive root directories from - future consideration by "/cygdrive" reporting. - (cygdrive_getmnt): Avoid reporting removable drives or drives with no - media mounted. - -Sat Mar 31 21:56:19 2001 Christopher Faylor - - * thread.h (struct _winsup_t): Remove obsolete elements. Add - available_drives element. - * path.cc (mount_info::getmntent): Report "/cygdrive" drives when - mounted drives are exhausted. - (fillout_mntent): New function. - (mount_item::getmntent): Use fillout_mntent. - (cygdrives_mntent): New function. Returns next available "/cygdrive". - (setmntent): Initialize available "/cygdrives". - * syscalls.cc: Remove some if 0'ed code. - * times.cc (timezone): Use more descriptive variable name. - -Sat Mar 31 18:59:52 2001 Christopher Faylor - - * sigproc.h (class sigframe): Implement 'unregister()' method. - (sigframe::~sigframe): Use unregister method. - (sigframe::call_signal_handler): Declare new method. - * exceptions.cc (sigframe::call_signal_handler): New method. - Unregisters current sigframe before calling signal handler. - (setup_handler): Clear waiting threads prior to arming signal_arrived. - * syscalls.cc (_read): Change goto to loop. Recalculate sigframe - inside of loop so that constructor is called when appropriate. - * wait.cc (wait4): Ditto. - - * signal.cc: Change "sig" to "signal" in debugging messages throughout. - * sigproc.cc: Ditto. - -Sat Mar 31 17:12:08 2001 Christopher Faylor - - * fhandler_serial.cc (fhandler_serial::raw_write): Close protected - handles with ForceCloseHandle or suffer spurious warnings. - -Sat Mar 31 16:23:32 2001 Christopher Faylor - - * fhandler.cc (fhandler_base::read): Remove special handling of CTRL-Z. - -Sat Mar 31 11:09:00 2001 Corinna Vinschen - - * fhandler.h (class fhandler_console): Add members `insert_mode'. - * fhandler_console.cc (fhandler_console::dup): Duplicate `insert_mode'. - (fhandler_console::fhandler_console): Initialize `insert_mode'. - (fhandler_console::char_command): Add terminal capabilities - "enter insert mode" = \E[4h and "exit insert mode" = \E[4l. - Care for insert mode on terminal capability "repeat char" = \E[x;yb. - (fhandler_console::write_normal): Care for insert mode before writing - to the console. - (array keytable): Add keymapping for modified cursor and control - block keys (xterm like). - -Fri Mar 30 13:02:00 2001 Corinna Vinschen - - * fhandler.h (class fhandler_console): Add members `savebufsiz' and - `savebuf' to allow save/restore of screen. - * fhandler_console.cc (fhandler_console::dup): Duplicate `savebufsiz' - and `savebuf'. - (fhandler_console::fhandler_console): Initialize `savebufsiz' and - `savebuf'. - (fhandler_console::char_command): Add terminal capabilities - "save screen content" = \E[?47h and "restore screen content" = \E[?47l. - -Wed Mar 28 19:28:50 2001 Christopher Faylor - - * path.cc (chdir): Eat trailing whitespace on input path. - -Tue Mar 27 22:38:42 2001 Christopher Faylor - - * lib/_cygwin_S_IEXEC.c: Remove "const" from globals or they never seem - to be defined. Wrap definitions in extern "C". Include winsup.h to - assure proper definitions. - - * dcrt0.cc (dll_crt0_1): Call stdio_init after premain run so that - binmode.o, etc., will control default stdio settings. - * dtable.cc (dtable::init_std_file_from_handle): Allow __fmode to force - binmode/textmode settings. Default pipes to binmode. - -Tue Mar 27 11:31:00 2001 Corinna Vinschen - - * mmap.cc (mmap): Fix conditional for previous patch. - -Mon Mar 26 18:48:00 2001 Corinna Vinschen - - * mmap.cc (mmap): Outflank copy-on-write problem on 9x by - setting access mode to FILE_MAP_READ when read access is requested. - -Sun Mar 25 20:12:21 2001 Christopher Faylor - - * dlfcn.cc (check_access): Eliminate. - (check_path_access): Use passed in path_conv buf. - (get_full_path_of_dll): Use passed in name buf to avoid a static. Rip - out most of the path checking since LoadLibrary will do all of this - automatically. - (dlopen): Set errno when appropriate (may not be compliant?). - * environ.cc (posify): Don't pass in "native" path if it seems to - actually be posix. - -Thursday Mar 22 2001 Robert Collins - - * fhandler.h (fhandler_dev_clipboard): Extend to support writing. - * fhandler_clipboard.cc (fhandler_dev_clipboard::fhandler_dev_clipboard): - Initialize new fields. Open clipboard here. - (fhandler_dev_clipboard::dup): New method. - (fhandler_dev_clipboard::open): Accommodate new fields. Register - clipboard here, if appropriate. - (set_clipboard): New function. Moves buffer to clipboard. - (fhandler_dev_clipboard::write): Truly implement clipboard writing. - (fhandler_dev_clipboard::read): Reimplement to allow successive reads. - (fhandler_dev_clipboard::lseek): Truly implement seeks in clipboard. - (fhandler_dev_clipboard::close): Clear out new fields. Support - sequential reads and sequential writes. Support for binary data via a - native clipboard format. - -2001-03-22 Egor Duda - - * fhandler_console.cc (fhandler_console::set_default_attr): Update - console color attributes on tty reset. - -Wed Mar 21 22:12:36 2001 Christopher Faylor - - * autoload.cc (kernel32_init): New function for kernel32 autoload - initialization. - (SignalObjectAndWait): Add conditional load of this function when it is - available. - -2001-03-21 Robert Collins - - * sched.cc: New file. Implement sched*. - * include/sched.h: New file. User land includes for sched*. - * Makefile.in: Add sched.o - * cygwin.din: Add exports for sched*. - -Tue Mar 20 14:48:46 2001 Christopher Faylor - - * dtable.cc: Guard against new winsock.h/winsock2.h warnings when - mixing winsock*.h and sys/types.h. - * fhandler_socket.cc: Ditto. - * net.cc: Ditto. - * select.cc: Ditto. - * exceptions.cc: Remove unneeded define. - -Mon Mar 19 17:43:29 2001 Christopher Faylor - - * exceptions.cc (interruptible): Update debugging output. - (setup_handler): Ensure that wait_sig loop wakes up when we punt on - sending a signal. - * poll.cc (poll): Add signal guard here. - -2001-03-19 Egor Duda - - * tty.h (tty::create_inuse): Add new parameter to allow non- - inheritable 'inuse' events. - * tty.cc (tty::create_inuse): Use new parameter. - * fhandler_tty.cc (fhandler_tty_master::init): Ditto. - * fhandler_tty.cc (fhandler_pty_master::open): Ditto. - * fhandler_tty.cc (fhandler_tty_master::init): Create master_alive - event. - * tty.cc (tty_list::terminate): Close master_alive event. - * fhandler_tty.cc (fhandler_tty_common::close): Send EOF to slaves - when master side is closed. - -Mon Mar 19 14:32:00 2001 Corinna Vinschen - - * mmap.cc (map::get_list_by_fd): Avoid calling `get_namehash' when - file descriptor is -1. - -Sat Mar 17 18:30:00 2001 Corinna Vinschen - - * syscalls.cc (check_posix_perm): New static function. - (fpathconf): Add _PC_POSIX_PERMISSIONS and _PC_POSIX_SECURITY - support. - (pathconf): Ditto. - * include/cygwin/version.h: Bump API minor number to 37. - -2001-03-18 Egor Duda - - * fhandler.h (fhandler_tty_slave): Declare new methods. - * select.cc (fhandler_tty_slave::select_read): New method. - * select.cc (fhandler_tty_slave::ready_for_read): Ditto. - * select.cc (verify_tty_slave): New function. - * fhandler_termios.cc (fhandler_termios::line_edit): Empty input - buffer on signal. - * fhandler_tty.cc (fhandler_tty_slave::read): Check for input data - after reading from pipe. Reset event if input pipe is empty. - * tty.h (class tty): Allow creating events with manual reset. - * tty.cc (tty::get_event): Use manual_reset flag. - * tty.cc (tty::common_init): Create input_available_event with - manual reset. - -Sat Mar 17 21:48:03 2001 Christopher Faylor - - * external.cc (fillout_pinfo): Match windows pid, as well as cygwin pid - when passed in pid. Don't prematurely break when searching for a pid. - - * thread.h (_winsup_t): Eliminate unneeded field. - -Sat Mar 17 20:46:00 2001 Corinna Vinschen - - * net.cc (get_95_ifconf): Use strcasematch instead of strcasecmp. - * syscalls.cc (_unlink): Ditto. - (_rename): Ditto. - -Sat Mar 17 12:43:15 2001 Christopher Faylor - - * path.cc (suffix_scan::next): Avoid searching for foo.lnk twice when - input is "foo". - -Sat Mar 17 18:10:00 2001 Corinna Vinschen - - * net.cc (cygwin_socket): Set protocol to 0 when address family is - AF_UNIX to avoid WSAEPROTONOSUPPORT error. - -Sat Mar 17 09:51:32 2001 Mathew Brozowski - - * net.cc (cygwin_socket): Pass protocol parameter to socket call. - -Sat Mar 17 02:05:38 2001 Christopher Faylor - - * dir.cc (readdir): Use strcasematch for consistency. - * path.cc (symlink_info): Eliminate known_suffix. - (path_conv::check): Always copy ext_here to end of buffer, if found. - (suffix_scan): Eliminate ext_here, add suffixes_start. - (suffix_scan::has): Eliminate an argument. Reorganize. Always return - pointer to end of input path. - (suffix_scan::next): Take a second pass through the suffix list looking - for .lnk. - (symlink_info::check): Eliminate known_suffix usage. - -Sat Mar 17 00:10:52 2001 Christopher Faylor - - * syscalls.cc (stat_dev): Give devices full read/write by default. - -Saturday Mar 17 3:45 2001 Robert Collins - - * thread.cc (MTinterface::CreateCond): Check for null attr pointer. - -Fri Mar 16 21:13:23 2001 Christopher Faylor - - * fhandler_termios.cc (fhandler_termios::line_edit): Don't accept input - when a signal is sent or we'll end up in an EOF/signal race. - -Fri Mar 16 20:25:40 2001 Christopher Faylor - - * path.cc: Translate scan states from defines to enums. - (suffix_scan): Rename state to nextstate for clarity. - (lnk_match): Change to allow multiple states to indicate that a .lnk - has been matched. - (suffix_scan::has): Eliminate a goto. Handle .lnk as a special case, - since a .lnk may also need to be tacked on the end of a .lnk. - (suffix_scan::next): Don't increment next state. Set it specifically. - Recognize new .lnk states. - -Saturday Mar 17 01:19 2001 Robert Collins rbtcollins@hotmail.com - - * cygwin.din: Export the new functions. - * pthread.cc (pthread_cond_*): Add wrapper functions that call - __pthread_cond* functions. - * thread.cc (__pthread_cond_*): Implement the pthread_cond* functions. - * thread.h: Add new class entries and prototypes for __pthread_cond* - functions. - * include/pthread.h: user land header prototypes for pthread_cond* - functions and related defines. - -Wed Mar 14 16:30:00 2001 Corinna Vinschen - - * environ.cc (parse_options): Use strtok_r instead of strtok. - * security.cc (convert_string_sid_to_sid): Ditto. - (aclfromtext): Ditto. Fix buffer usage. - -Wed Mar 14 10:11:00 2001 Corinna Vinschen - - * path.cc (lnk_suffixes): Remove. - (class suffix_scan): Add `lnk_state' flag. - (suffix_scan::lnk_match): Return state of `lnk_state' now. - (suffix_scan::has): Changed behaviour if file has `.lnk' suffix. - (suffix_scan::next): Set `lnk_state' where appropriate. - (symlink_info::check): Fix a wrong `break'. - * syscalls.cc (chown_worker): Change debug statement to reflect - lchown fix. - (lchown): Call chown_worker with `PC_SYM_NOFOLLOW' instead of - `PC_SYM_IGNORE'. - -Tue Mar 13 13:52:00 2001 Corinna Vinschen - - * fhandler.cc (fhandler_disk_file::fstat): Add correct modes to - symlinks when stat'ing on FAT or FAT32 file systems. - -2001-03-12 Egor Duda - - * fhandler.h (fhandler_termios::fixup_after_exec): New function. - * fhandler_termios.cc (fhandler_termios::fixup_after_fork): New - function. Fixup output handle. - * fhandler_tty.cc (fhandler_tty_common::fixup_after_fork): Output - handle is now fixed up in fhandler_termios::fixup_after_fork(). - -2001-03-12 Egor Duda - - * fhandler.h (fhandler_termios::fhandler_termios): Enable fixup - after fork. - * fhandler_console.cc (fhandler_console::fhandler_console): Fixup - after fork is now enabled in the base class constructor. - -Mon Mar 12 11:19:41 2001 Christopher Faylor - - * mkvers.sh: Include config.h so that DEBUGGING is correctly defined. - -Mon Mar 12 09:47:55 2001 Christopher Faylor - - * spawn.cc (spawn_guts): Don't set EXIT_REPARENTING if parent process - is not a cygwin process (suggested by Jason Gouger - ). - -Sun Mar 11 16:00:58 2001 Christopher Faylor - - * child_info.h: Bump magic number for fork/exec/spawn. - -Sat Mar 10 20:54:47 2001 Christopher Faylor - - * autoload.cc (noload): Use proper method for multiline strings or - newer gcc's complain. - * exceptions.cc (unused_sig_wrapper): Ditto. - * fhandler.h (fhandler_base): Make get_io_handle and friends return - self. - * fhandler_tty.cc (fhandler_pty_common::close_on_exec): Accommodate - DEBUGGING flag to avoid spurious warnings when inheritance is set. - -Sat Mar 10 16:52:12 2001 Christopher Faylor - - * shortcut.c (PATH_ALL_EXEC): Add parentheses to avoid a compiler - warning. - - * exceptions.cc (setup_handler): Clarify debugging message. - * sigproc.cc (proc_subproc): Remove PROC_CHILDSTOPPED test. It is - handled by normal PROC_CLEARWAIT case. - (wait_sig): Eliminate "dispatched" tracking. Remove __SIGCHILDSTOPPED - test. Decrement counter again before jumping out of - InterlockedDecrement loop so that subsequent InterlockedIncrement will - keep the counter at the correctly decremented value and also detect - when there are pending signals. - * sigproc.h: Remove __SIGCHILDSTOPPED element. - (procstuff): Remove PROC_CHILDSTOPPED element. - -Sat Mar 10 15:22:44 2001 Christopher Faylor - - * syscalls.cc (_rename): Set errno to ENOENT when an old path doesn't - exist (from Kazuhiro Fujieda ). Also set EACCES - when directory is not writable. - -Wed Mar 7 15:49:47 2001 Christopher Faylor - - * syscalls.cc (_read): Change definition to return ssize_t to be - consistent with read. - (_write): Change definition to return ssize_t to be consistent with - write. - -Wed Mar 7 01:08:21 2001 Christopher Faylor - - * sigproc.h (sigthread): Declare new methods. Create new winapi_lock - field. - (sigframe:;set): Call get_winapi_lock after frame is set so that signal - handler thread knows not to call SuspendThread. - (sigframe::~sigframe): Release winapi_lock. - * exceptions.cc (sigthread::get_winapi_lock): New method. - (sigthread::release_winapi_lock): New method. - (setup_handler): Use get_winapi_lock to ensure that signalled thread is - not blocked in a Windows API. - - * path.h (path_types): Avoid broken GCC warning. - -Tue Mar 6 14:02:00 2001 Corinna Vinschen - - * path.cc (suffix_scan::has): Change order of conditionals - to allow checking for .lnk suffixes even if in_suffixes is empty. - -Tue Mar 6 13:02:00 2001 Corinna Vinschen - - * autoload.c (cygwin_premain0): Add missing parameter. - * binmode.c (cygwin_premain0): Ditto. - * textmode.c (cygwin_premain0): Ditto. - -Tue Mar 6 12:04:00 2001 Jason Tiller - - * auto_load.cc: Add "GetKeyboardLayout" entry in the list of - Win32 User32.DLL exports to provide. - * fhandler.h (class fhandler_console): Add meta_mask private - member to remember which keystroke modifiers should generate - META. - * fhandler_console.cc (fhandler_console::read): Modify code that - tests a keystroke for a META-escaped key to use the 'meta_mask' - variable. - (fhandler_console::fhandler_console): Add definition for - variable "meta_mask" used to determine if a keystroke should be - preceded by META in the client console stream. Set meta_mask - based on whether or not user's keyboard language is English - - non-English keyboards pass AltGr (right ) unmolested, - whereas English keyboards now interpret left- and right- - as META. - -Mon Mar 5 20:15:00 2001 Corinna Vinschen - - * include/a.out.h: Add copyright hint. - * include/fcntl.h: Ditto. - * include/lastlog.h: Ditto. - * include/memory.h: Ditto. - * include/mntent.h: Ditto. - * include/paths.h: Ditto. - * include/poll.h: Ditto. - * include/syslog.h: Ditto. - * include/termio.h: Ditto. - * include/tzfile.h: Ditto. - * include/arpa/inet.h: Ditto. - * include/asm/byteorder.h: Ditto. - * include/asm/socket.h: Ditto. - * include/asm/types.h: Ditto. - * include/cygwin/if.h: Ditto. - * include/cygwin/mtio.h: Ditto. - * include/cygwin/rdevio.h: Ditto. - * include/cygwin/socket.h: Ditto. - * include/net/if.h: Ditto. - * include/netinet/in.h: Ditto. - * include/netinet/in_systm.h: Ditto. - * include/netinet/ip.h: Ditto. - * include/netinet/ip_icmp.h: Ditto. - * include/netinet/tcp.h: Ditto. - * include/sys/cdefs.h: Ditto. - * include/sys/cygwin.h: Ditto. - * include/sys/ioctl.h: Ditto. - * include/sys/mman.h: Ditto. - * include/sys/mount.h: Ditto. - * include/sys/mtio.h: Ditto. - * include/sys/procfs.h: Ditto. - * include/sys/resource.h: Ditto. - * include/sys/smallprint.h: Ditto. - * include/sys/socket.h: Ditto. - * include/sys/strace.h: Ditto. - * include/sys/syslog.h: Ditto. - * include/sys/sysmacros.h: Ditto. - * include/sys/termio.h: Ditto. - * include/sys/termios.h: Ditto. - * include/sys/uio.h: Ditto. - * include/sys/un.h: Ditto. - * include/sys/utsname.h: Ditto. - * include/sys/vfs.h: Ditto. - * include/sys/wait.h: Ditto. - * regexp/regerror.c: Ditto. - * regexp/regexp.h: Ditto. - * regexp/regmagic.h: Ditto. - -Mon Mar 5 01:25:03 2001 Christopher Faylor - - * dlopen.c (dlopen): Return NULL when name is NULL (suggested by - chrisiasci@aol.com). - - * cygwin.din: Add a new, internally used export - - _check_for_executable. - * dcrt0.cc (dll_crt0_1): Set _check_for_executable for older binaries. - Pass user_data to premain functions. - * fhandler.cc (fhandler_disk_file::open): Only check for executable if - the linked program is interested in the executable bit. - (fhandler_disk_file::check_execable_p): Delete. - * fhandler.h (executable_states): New enumeration of various states of - executable bit caring. - (fhandler_base::set_execable_p): New method. - - * fhandler_termios.cc (fhandler_termios::line_edit): Flag when a signal - has been sent to the tty. Return -1 when this is so. - * fhandler_console.cc (fhandler_console::read): Return -1 when signal - sending character encountered. - - * path.cc (path_conv::check): Record when path refers to a disk device. - Move executable extension check here. - (check_sysfile): Accommodate new EXEC path states. - (has_suffix): Remove. - (next_suffix): Remove. - (class suffix_scan): New clas. - (suffix_scan::has): New method. - (suffix_scan:next): New method. - (symlink_info::check): Use suffix_scan method to control for scanning - for suffixes. - * path.h (path_conv::exec_state): New method. - * perprocess.h: Make "C" friendly. - * include/cygwin/version.h: Define CYGWIN_VERSION_CHECK_FOR_S_IEXEC. - Bump CYGWIN_VERSION_API_MINOR. - * include/sys/cygwin.h: Change premain declarations. - - * winsup.h: Move __cplusplus test to after builtin defines. - -2001-03-04 Egor Duda - - * fhandler.h (class fhandler_tty_common): New mutex and event to - syncronize input on master tty with slave tty. - * fhandler_tty.cc (fhandler_pty_master::accept_input): Use them to - syncronize with slave. - * fhandler_tty.cc (fhandler_tty_slave::read): Use input mutex and - event to syncronize with master. Do not limit amount of data read - from master to vmin value. Interrupt on signal and return already - read data, if any. - * fhandler_tty.cc (fhandler_tty_slave::open): Handle input mutex and - event. - * fhandler_tty.cc (fhandler_tty_common::close): Ditto. - * fhandler_tty.cc (fhandler_tty_common::set_close_on_exec): Ditto. - * fhandler_tty.cc (fhandler_tty_common::fixup_after_fork): Ditto. - * fhandler_tty.cc (fhandler_tty_common::dup): Ditto. - * tty.h (tty::open_input_mutex): New function. - * tty.cc (tty::common_init): Create input mutex and event. - -Fri Mar 2 13:32:00 2001 Corinna Vinschen - - * dir.cc (readdir): Fix creating path in symlink check. - -Fri Mar 2 12:33:00 2001 Corinna Vinschen - - * dir.cc (readdir): Fix shortcut==symlink condition. - * environ.cc: Add extern decl for `allow_winsymlinks'. - (struct parse_thing): Add entry for `[no]winsymlinks'. - * path.cc (symlink): Change to be able to create both, - symlink==shortcut and symlink==systemfile, dependent of - the setting of `allow_winsymlinks'. - * security.cc (cygwin_logon_user): Add debug output. - * shortcut.c: Add defines from path.h. - (has_exec_chars): Copy from path.h. - (check_shortcut): Check for executable file condition if not a - shortcut. - -Thu Mar 1 21:06:07 2001 Christopher Faylor - - * exceptions.cc (sig_handle_tty_stop): Ignore attempts to suspend a - process if started by non-cygwin parent. - -Thu Mar 1 20:48:11 2001 Christopher Faylor - - * select.cc (peek_console): Don't report read_ready on mouse events - unless we are looking for mouse events. - * fhandler.h (fhandler_console::mouse_aware): New method. - -Wed Feb 28 15:10:00 2001 Corinna Vinschen - - * uinfo.cc: Eliminate `#include '. - -2001-02-28 Egor Duda - - * fhandler_floppy.cc (fhandler_dev_floppy::lseek): Determine - drive geometry or partition size to allow seeking from the end of - raw floppy device. Don't allow positioning past the end of media or - to offsets bigger then max off_t. - -2001-02-27 Egor Duda - - * fhandler.h (class fhandler_console): Make all variables that - describe "state" of console to be members of fhandler_console. - default_color is now the color which is set when console recieves - reset command. - * fhandler_console.cc (fhandler_console::fhandler_console): Turn - mouse handling and raw keyboard mode off by default. Initialize - state information. - * fhandler.cc (fhandler_console::set_raw_win32_keyboard_mode): New - function. - * fhandler_console.cc (fhandler_console::set_default_attr): New - function. Reset console attributes to default values. - * fhandler_console.cc (fhandler_console::open): Reset attributes. - * fhandler_console.cc (fhandler_console::get_win32_attr): New function. - Calculate win32-style console attribute based on terminal attributes. - * fhandler_console.cc (fhandler_console::set_cursor_maybe): Use - member variable. - * fhandler_console.cc (fhandler_console::read): If in raw-win32 - keyboard mode, encode win32 keyboard events in \033{x;y;z;t;u;wK - sequences. - * fhandler_console.cc (fhandler_console::dup): Copy all state - information to the dup()ed handle. - * fhandler_console.cc (fhandler_console::scroll_screen): Use current - fill-in attribute. - * fhandler_console.cc (fhandler_console::clear_screen): Ditto. - * fhandler_console.cc (fhandler_console::char_command): Check if we - saw '?' symbol by member variable. Set terminal attributes on \033[Xm - commands. \033[24m - turn off underline mode, \033[27m - turn off - reverse mode, \033[39m - restore default foreground color. - \033[49m - restore default background color. \033[2000h - turn on raw - keyboard mode, \033[2000l - turn off raw keyboard mode. - * fhandler_console.cc (fhandler_console::write): Set attribues to - default values on reset command. - -2001-02-26 Mike Simons - - * times.cc (settimeofday): Replace function stub with working code. - -Mon Feb 26 10:42:00 2001 Corinna Vinschen - - * strace.cc (strace::vprntf): Move prntf functionality to this function - adding an va_list interface to strace. - (strace::printf): Calls strace::vprntf now. - (strace_printf): New function providing an extern "C" interface to - trace output. - * include/sys/strace.h: Make plain C clean. - (class strace): Add `vprntf' method. - -Mon Feb 26 0:10:00 2001 Corinna Vinschen - - * shortcut.c: Remove #include . - -Sun Feb 25 10:32:00 2001 Corinna Vinschen - - * path.cc (symlink): Add a ".lnk" suffix regardless. Add a comment. - -Sun Feb 25 10:18:00 2001 Corinna Vinschen - - * shortcut.c (check_shortcut): Change symlink condition. - -Fri Feb 23 10:42:00 2001 Corinna Vinschen - - * mmap.cc (fhandler_disk_file::mmap): Use `addr' correctly. - * fhandler_mem.cc (fhandler_dev_mem::mmap): Ditto. - -Thu Feb 22 17:09:00 2001 Corinna Vinschen - - * path.cc (symlink): Keep relative paths relative in the DOS - path inside of a shortcut. If that's impossible or the target - path is already absolute save an absolute path. - -Thu Feb 22 15:33:00 2001 Corinna Vinschen - - * cygerrno.h: Revert previous patch. - * errno.cc: Ditto. - * dir.cc: Eliminate `dir_suffixes'. - (opendir): Remove usage of `dir_suffixes'. - (rmdir): Ditto. - * fhandler.cc (fhandler_disk_file::open): Remove usage of - `inner_suffixes'. - * path.cc: Rename `inner_suffixes' to `lnk_suffixes'. - (path_conv::check): Remove usage of `inner_suffixes'. - (symlink): Ditto. - (symlink_info::check): Handle checking for `.lnk' in path_conv - exclusively here. - (chdir): Remove usage of `dir_suffixes'. - * shortcut.c: Eliminate debug_printf lines. - (check_shortcut): Don't set error except on failing ReadFile. - * spawn.cc: Remove ".lnk" from `std_suffixes'. - * syscalls.cc (_unlink): Remove usage of `inner_suffixes'. - Remove ".lnk" from `stat_suffixes'. - (_rename): Add check for renaming a symlink to keep the ".lnk" - suffix after renaming. - -Thu Feb 22 13:38:00 2001 Corinna Vinschen - - * shortcut.c: New file. Provides a C interface to reading of - Windows shortcuts to avoid compiler flag `-fvtable-thunks'. - * shortcut.h: Ditto. - * Makefile.in: Add shortcut.o to DLL_OFILES. - * cygerrno.h: Provide a C interface to `geterrno_from_win_error' for - using in shortcut.c. - * errno.cc (geterrno_from_win_error): Define as extern "C". - * path.cc (struct symlink_info): Remove methods `check_shortcut' and - `check_sysfile'. - (shortcut_header): Move to shortcut.c. - (shortcut_initalized): Ditto. - (create_shortcut_header): Ditto. - (cmp_shortcut_header): Ditto. - (symlink_info::check_shortcut): Ditto. Reorganize as a plain C function. - (symlink_info::check_sysfile): Redefine as a global function using the - same parameter list as `check_shortcut' for clearness. - (symlink_info::check): Change parameter list for calls to - `check_shortcut' and `check_sysfile'. - -Thu Feb 22 12:04:00 2001 Corinna Vinschen - - * fhandler.cc (fhandler_disk_file::open): Use `inner_suffixes' when - resolving real_path. - * path.cc (symlink): Ditto for win32_topath. - -Wed Feb 21 22:41:00 2001 Corinna Vinschen - - * Makefile.in: Add `-lshell32 -luuid' to link pass for new-cygwin1.dll. - * autoload.cc: Add LoadDLLinitfunc for ole32.dll. - Add LoadDLLfuncEx statements for CoInitialize@4, CoUninitialize@0 - and CoCreateInstance@20. - * dir.cc (dir_suffixes): New datastructure. - (readdir): Check for R/O *.lnk files to hide the suffix. - (opendir): Use `dir_suffixes' in path conversion. - (rmdir): Ditto. - * fhandler.cc (fhandler_disk_file::fstat): Add S_IFLNK flag - before calling `get_file_attribute'. Take FILE_ATTRIBUTE_READONLY - into account only if the file is no symlink. - * path.cc (inner_suffixes): New datastructure. - (SYMLINKATTR): Eliminated. - (path_conv::check): Use `inner_suffixes' on inner path components. - (shortcut_header): New global static variable. - (shortcut_initalized): Ditto. - (create_shortcut_header): New function. - (cmp_shortcut_header): Ditto. - (symlink): Create symlinks by creating windows shortcuts. Preserve - the old code. - (symlink_info::check_shortcut): New method. - (symlink_info::check_sysfile): Ditto. - (symlink_info::check): Check for shortcuts. Move code reading - old system attribute symlinks into symlink_info::check_sysfile(). - (chdir): Use `dir_suffixes' in path conversion. - * security.cc (get_file_attribute): Check for S_IFLNK flag. - Force 0777 permissions then. - * spawn.cc (std_suffixes): Add ".lnk" suffix. - * syscalls.cc (_unlink): Use `inner_suffixes' in path conversion. - Check for shortcut symlinks to eliminate R/O attribute before - calling DeleteFile(). - (stat_suffixes): Add ".lnk" suffix. - (stat_worker): Force 0777 permissions if file is a symlink. - -2001-02-21 Egor Duda - - * sigproc.cc (getsem): Make semaphore always non-inheritable. - -Mon Feb 19 22:25:53 2001 Christopher Faylor - - * dcrt0.cc (locale_init): Remove. - -2001-02-15 Kazuhiro Fujieda - - * cygwin.din: Export rand48 functions. - * thread.cc (MTinterface::Init): Remove the initialization of - `reent_data'. - * dcrt0.cc: Add the initalizer to the declaration of `reent_data'. - * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 35. - -2001-02-16 Egor Duda - - * signal.cc (signal): Prohibit setting handlers for SIGKILL and - SIGSTOP - * signal.cc (sigaction): Ditto - * syscalls.cc (_lseek): Return EINVAL on invalid input - -Wed Feb 14 14:54:40 2001 Christophe Iasci - - * dlfcn.cc (dlopen): Do not call LoadLibrary with a NULL pointer, when - the library is not found - -2001-02-14 Egor Duda - - * fhandler_console.cc (fhandler_console::char_command): Ignore unknown - rendition codes in \033[xx;yym control sequences - -Fri Feb 9 23:19:01 2001 Christopher Faylor - - * fork.cc (fork_parent): Return EAGAIN when can't record pid. - * pinfo.h (pinfo::remember): Return value of call to proc_subproc. - * sigproc.cc (proc_subproc): Return error if can't record pid. - -Fri Feb 9 12:17:27 2001 Christopher Faylor - - * syscalls.cc (mknod): Add valid parameters. - -Thu Feb 8 22:09:00 2001 Corinna Vinschen - - * mmap.cc (mmap): Check for reusing a mapping only on MAP_SHARED - and on MAP_PRIVATE|MAP_ANON in the special case of offset 0. - -Thu Feb 8 21:57:00 2001 Corinna Vinschen - - * mmap.cc (class list): Add member `hash'. - (list::list): Initialize `hash'. - (list::get_list_by_fd): Use filepath hash value to get the correct - mapping list if it's not an anonymous mapping. - (map::add_list): Initialize `hash' with filepath hash value. - (mmap): Check for reusing a mapping only on MAP_SHARED. - -Wed Feb 7 18:47:36 2001 Christopher Faylor - - * signal.cc (killpg): Correct first argument. - -Wed Feb 7 22:22:00 2001 Corinna Vinschen - - * autoload.cc: Add LoadDLLinitfunc for iphlpapi.dll. - Add LoadDLLfuncEx statements for GetIfTable@12 and GetIpAddrTable@12. - * fhandler_socket.cc (fhandler_socket::ioctl): Move variable - definitions to the beginning of the function to allow better debugging. - Add handling for SIOCGIFHWADDR, SIOCGIFMETRIC and SIOCGIFMTU. - * net.cc: Include iphlpapi.h. - (get_2k_ifconf): Rewritten. Uses IP Helper API now. - (get_nt_ifconf): Add handling for SIOCGIFHWADDR, SIOCGIFMETRIC - and SIOCGIFMTU. - (get_95_ifconf): Ditto. Renamed from `get_9x_ifconf'. - (get_ifconf): Name loopback `lo' instead of `lo0' as in Linux. - Add handling for SIOCGIFHWADDR, SIOCGIFMETRIC and SIOCGIFMTU. - Call `get_95_ifconf' only on Windows 95, `get_nt_ifconf' only - on Windows NT < Service Pack 3, `get_2k_ifconf otherwise. - * include/asm/socket.h: Add defines for SIOCGIFHWADDR, SIOCGIFMETRIC - and SIOCGIFMTU. - * include/cygwin/if.h: Add `ifr_hwaddr', `ifr_metric' and `ifr_mtu'. - (struct ifreq): Add `ifru_hwaddr'. - -Tue Feb 6 15:04:00 2001 Corinna Vinschen - - * syscalls.cc (stat_worker): Add a check for the special case when - a process creates a file using mode 000 using ntsec. - -Mon Feb 5 17:00:00 2001 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Always add GENERIC_READ access - when opening raw disk devices. - * fhandler_floppy.cc (fhandler_dev_floppy::lseek): Implement bytewise - access. - * fhandler_raw.cc (fhandler_dev_raw::open): Always open raw disk device - binary. - (fhandler_dev_raw::raw_write): Don't drop read buffer content when - writing after read. - -Mon Feb 5 13:30:00 2001 Corinna Vinschen - - * mmap.cc (mmap_record::fixup_map): New method to duplicate - the memory protection in a just forked child. - (mmap): Realign gran_len to page boundary only on anonymous - mapping before saving in the mmap_record. - (munmap): Cleanup code. - (msync): Ditto. - (fixup_mmaps_after_fork): Ditto. Call mmap_record::fixup_map now. - -Thu Feb 1 23:08:29 2001 Christopher Faylor - - * cygheap.cc (creturn): Correctly calculate cygheap_max. - -Wed Jan 31 10:04:58 2001 Christopher Faylor - - * shared.cc (shared_info::initialize): Reduce size of heap. - -Wed Jan 31 13:22:00 2001 Corinna Vinschen - - * include/sys/resource.h: Fix typo. - -Wed Jan 31 13:20:00 2001 Corinna Vinschen - - * include/sys/resource.h: Add RLIMIT_NLIMITS and RLIM_NLIMITS. - -Tue Jan 30 18:15:23 2001 Christopher Faylor - - * include/cygwin/version.h: Bump version to 1.3.0. - -Tue Jan 30 8:55:00 2001 Corinna Vinschen - - * pinfo.cc (pinfo::init): Use INVALID_HANDLE_VALUE instead of - explicit cast (HANDLE) 0xffffffff. - * shared.cc (open_shared): Ditto. - -Mon Jan 29 17:15:22 2001 Bill Hegardt - - * fhandler_serial.cc (raw_write): Use local copy of OVERLAPPED - structure instead of shared structure to fix a race condition between - read/write. - -Mon Jan 29 14:30:00 2001 Corinna Vinschen - - * mmap.cc (mmap): Remove obsolete check for MAP_SHARED|MAP_ANON as - being invalid. - -Mon Jan 29 10:23:00 2001 Corinna Vinschen - - * mmap.cc (mmap_record::find_empty): Fix loop condition. - -Sun Jan 28 19:40:40 2001 Christopher Faylor - - * syscalls.cc (_link): Make sure that newpath does not exist. Set - errno if it does. - -Sun Jan 28 19:29:08 2001 Christopher Faylor - - * cygheap.cc (init_cheap): Don't specify a load address for the heap. - It doesn't work on #!*& Windows 9x. - (cygheap_init): Move GetUserName to memory_init. - * dcrt0.cc (dll_crt0_1): Call new memory_init functin, eliminate call - to heap_init. - * heap.cc (heap_init): Improve error output. - * heap.h: Correct some declarations. - * shared.cc (mount_table_init): Remove. - (memory_init): Renamed from shared_init. Reorganize to accommodate - strange Windows 9x problems with cygheap/heap interaction. - * shared_info.h: Rename shared_init to memory_init. - -Sun Jan 28 01:25:33 2001 Christopher Faylor - - * include/cygwin/version.h: Bump API version. - -Sun Jan 28 01:18:22 2001 Christopher Faylor - - * cygheap.cc (init_cheap): Move username initialization. - (cygheap_init): Here. - * shared_info.h (mount_info): Add a sys_mount_table_counter field. - (shared_info): Ditto. - * path.cc (mount_info::conv_to_win32_path): Check that our mount table - is in sync with the system mount table and reinitialize it if not. - (mount_info::add_reg_mount): Bump sys_mount_table counters if the - system mount table changes. - (mount_info::del_reg_mount): Ditto. - (mount_info::write_cygdrive_info_to_registry): Ditto. - (mount_info::remove_cygdrive_info_from_registry): Ditto. - -Sun Jan 28 00:28:30 2001 Christopher Faylor - - Throughout, change 'cygwin_shared.mount' to 'mount_table'. - * child_info.h (child_info): Move shared_h, console_h to cygheap. Add - mount_h. - * cygheap.h (init_cygheap): Add shared_h, console_h. - * cygheap.cc (init_cheap): Initialize heap at a fixed location after - the shared memory regions. Initialize cygheap->user name here. - * dcrt0.cc (dll_crt0_1): Call getpagesize () to initialize constants. - Remove cygheap_init since it is done in shared_init now. - (_dll_crt0): Initialize mount_h, remove shared_h and console_h - initialization. - * fhandler_console.cc (console_shared_h): Eliminate. - (get_tty_stuff): Use cygheap->console_h rather than console_shared_h. - * heap.cc (heap_init): Use page size constant calculated earlier in - initialization. - * shared.cc: Eliminate cygwin_shared_h. Add cygwin_mount_h. - (mount_table_init): New function for initializing a user mount table. - (open_shared_file_map): Use constant for shared memory region. - Initialize cygheap and mount table here. - (open_shared): Improve debugging output. - (shared_info::initialize): Eliminate call to mount.init. - (shared_terminate): Use cygheap->shared_h. Close cygwin_mount_h. - (open_shared_file_map): Eliminate. - * shared_info.h (mount_info): Add a version field. - (shared_align_past): New macro for calculating location for shared - memory regions. - * sigproc.cc (init_child_info): Eliminate shared_h, console_h. - * spawn.cc (spawn_guts): Pass on cygwin_mount_h iff not a different - user. - * syscalls.cc (system_info): New global holding system memory defaults. - (getpagesize): Use system_info. - * uinfo.cc (internal_getlogin): Only fill in user name if nonexistent. - * winsup.h: Declare system_info. - - * passwd.cc (read_etc_passwd): Use cygheap->user.name () rather than - retrieving the name again. - -Sat Jan 27 10:18:02 2001 Christopher Faylor - - * path.cc (path_conv::check): Detect when path has symlinks. - (symlink_info::check): Remove debugging stuff. - (chdir): Use posix'ized win32 path if cd'ed to a path using symlinks. - -Fri Jan 26 21:20:28 2001 Christopher Faylor - - * exceptions.cc (sigreturn): Call any pending signals prior to - resetting the signal mask so that stacked signals behave correctly. - (sigdelayed): Avoid a race where a signal could end up calling an - incorrect signal handler if two signals come in close together. - -Tue Jan 23 21:56:00 2001 Corinna Vinschen - - * mmap.cc (fhandler_disk_file::mmap): Call CreateFileMapping with - len != 0 only when performing an anonymous mapping. - -Mon Jan 22 15:35:28 2001 Christopher Faylor - - * path.h: Add a new constant. - * syscalls.cc (_read): Oscillate errno check. - -Mon Jan 22 15:27:12 2001 Christopher Faylor - - * include/cygwin/version.h: Bump API to reflect setlogmask. - -Sun Jan 21 22:40:25 2001 Jason Tishler - - * cygwin.din: Add export for setlogmask(). - * syslog.cc (setlogmask): New function. - -Thu Jan 18 10:27:00 2001 Corinna Vinschen - - * resource.cc (setrlimit): Support RLIMIT_NOFILE. - -Wed Jan 17 23:23:12 2001 Christopher Faylor - - * syscalls.cc (setdtablesize): Call with amount to increment not total - amount. Return success or failure error code. - -Wed Jan 17 09:47:13 2001 Christopher Faylor - - * autoload.cc (LoadDLLinitfunc): Remove debugging statement. - - * exceptions.cc (sig_handle_tty_stop): Move setting of PID_STOPPED to - earlier in interrupt. - (interrupt_setup): i.e., here. - (sig_handle): Don't queue multiple SIGSTOPS. - * fhandler.h (bg_check_types): Enumerate return value of bg_check for - clarity. - * signal.cc (kill_pgrp): Minor cleanup. - * fhandler_termios.cc (fhandler_termios::bg_check): Use enumerated type - for function return. Don't raise signal if a signal is already queued. - * fhandler_console.cc (fhandler_console::read): Use enumerated return - type for bg_check. - * select.cc: Ditto, throughout. - * read.cc: Ditto, throughout. - * termios.cc: Ditto, throughout. - (_read): YA interrupt detect simplification. - * wait.cc (wait4): Ditto. - -Wed Jan 17 10:56:00 2001 Corinna Vinschen - - * cygheap.cc (cygheap_user::~cygheap_user): Temporarily - disable free'ing memory. - -Tue Jan 16 18:01:00 2001 Corinna Vinschen - - * mmap.cc (mmap): Initialize fh to avoid compiler warnings. - -Mon Jan 15 21:07:00 2001 Christopher Faylor - - * wait.cc (wait4): Rename variable for consistency. Allow restartable - signal behavior. - -Mon Jan 15 23:15:00 2001 Corinna Vinschen - - * mmap.cc (mmap): Add more parameter checking. Change error output - in case of EINVAL. Treat mmapping /dev/zero like MAP_ANONYMOUS. - -Mon Jan 15 20:34:00 2001 Corinna Vinschen - - * mmap.cc: include . Define some bit operations for - the new page map. - (mmap_record): Change type of base_address_ to caddr_t. - Add map_map_ member. Add several methods to manipulate map_map_. - (mmap_record::alloc_map): New method. - (mmap_record::free_map): Ditto. - (mmap_record::find_empty): Ditto. - (mmap_record::map_map): Ditto. - (mmap_record::unmap_map): Ditto. - (list::add_record): Change return type to `mmap_record *'. - Allocate page map. - (list::match): New method. - (mmap): Partly rewritten to take care for the new page map. Add some - parameter checking. - (munmap): Ditto. - -Mon Jan 15 13:50:00 2001 Corinna Vinschen - - * heap.cc (heap_init): Fix extern declaration of getpagesize. - * syscalls.cc (getpagesize): Fix another typo. - -Mon Jan 15 12:48:00 2001 Corinna Vinschen - - * syscalls.cc (getpagesize): Save pagesize in global variable to - avoid calling GetSystemInfo too often. - * heap.cc (getpagesize): Eliminate. - (heap_init): Use getpagesize function from syscalls.cc. - -Mon Jan 15 11:56:00 2001 Corinna Vinschen - - * sysconf.cc (sysconf): return `getpagesize ()' on _SC_PAGESIZE - request to avoid implementing the same twice. - -Sun Jan 14 14:07:50 2001 Christopher Faylor - - * syscalls.cc (_read): Use more lightweight method for determining if - read has been interrupted by a signal. - -Fri Jan 12 00:35:15 2001 Christopher Faylor - - * debug.h: Add regparm attributes to some functions. - - * signal.cc (sigaction): Don't treat SIGCONT specially. - - * exceptions.cc (interrupt_setup): Save sa_flags of interrupted signal - for later use. - (sig_handler): Default any stopping signal to SIGSTOP. - (call_signal_handler): New function. - (sigdelayed0): New function. - * sigproc.cc (sigproc_init): Initialize SIGSTOP sigaction for special - behavior. - * sigproc.h: Define call_signal_handler. - * syscalls.cc (_read): Allow restartable signal behavior. - -Thu Jan 11 13:17:00 2001 Corinna Vinschen - - * fhandler.h (fhandler_base): New method `fixup_mmap_after_fork'. - (fhandler_disk_file: Ditto. - (fhandler_dev_mem): Ditto. - * fhandler_mem.cc (fhandler_dev_mem::open): Set OBJ_INHERIT attribute - for device\physicalmemory handle. - (fhandler_dev_mem::mmap): Ditto. - * fhandler_mem.cc (fhandler_dev_mem::fixup_mmap_after_fork): New - method. - * mmap.cc (mmap_record): Add private `fdesc_' member. Change - constructor accordingly. - (get_fd): New method. - (mmap): Use new mmap_record constructor. - (fhandler_base::fixup_mmap_after_fork): New method. - (fhandler_disk_file::fixup_mmap_after_fork): Ditto. - (fixup_mmaps_after_fork): Call `fixup_mmap_after_fork' of appropriate - fhandler class. - -Wed Jan 10 22:08:30 2001 Kazuhiro Fujieda - - * sigproc.cc (wait_sig): Allow SIGCONT when stopped. - -Tue Jan 9 16:55:00 2001 Corinna Vinschen - - Patch suggested by René Møller Fonseca - * include/sys/socket.h: Change prototype to have 2nd parameter `const'. - * net.cc (cygwin_bind): Change 2nd parameter to `const'. - -Sun Jan 7 22:59:37 2001 Christopher Faylor - - * pinfo.cc (codepage_init): Move function. - * environ.cc (codepage_init): To here. - * exceptoins.cc (SIG_NONMASKABLE): Remove SIGCONT from consideration - since it is supposed to be maskable. - * signal.cc (sigaction): Ditto. - * sigproc.cc (wait_sig): Ditto. - * winsup.h: Eliminate global declaration of codepage_init. - -Thu Jan 5 9:33:00 2001 Corinna Vinschen - - * resource.cc (getrlimit): Set errno on EFAULT instead of returning - it. - (setrlimit): Ditto. - -Thu Jan 5 3:38:00 2001 David Sainty - - * resource.cc (setrlimit): Prevent failing with an error when the - operation would not have changed anything. - -Thu Jan 4 10:29:54 2001 Earnie Boyd - - * thread.cc: Need LONG_MAX definition. - -Wed Jan 3 13:47:23 2001 Christopher Faylor - - * thread.cc (MTinterface::CreateSemaphore): Correctly set semaphore - max. - -Wed Jan 3 09:44:51 2001 Christopher Faylor - - * fhandler_console.cc (fhandler_console::read): Restore missing test - for code page before doing OemToCharBuff. - -Wed Jan 3 09:20:20 2001 Jason Tishler - - * include/cygwin/version.h: Fix typo in CYGWIN_VERSION_DLL_COMBINED - macro. diff --git a/winsup/cygwin/ChangeLog-2002 b/winsup/cygwin/ChangeLog-2002 deleted file mode 100644 index 68cf38059..000000000 --- a/winsup/cygwin/ChangeLog-2002 +++ /dev/null @@ -1,6655 +0,0 @@ -2002-12-30 Christopher Faylor - - * exceptions.cc (events_init): Display name of mutex on failure. - -2002-12-30 Christopher Faylor - - * windows.cc (setitimer): Return ENOSYS on invalid argument. - -2002-12-28 Christopher Faylor - - * fhandler_termios.cc (fhandler_termios::line_edit): Perform echo - before input is accepted or suffer a "race". - -2002-12-27 Christopher Faylor - - * fhandler.h (fhandler_tty_master::set_winsize): Declare new function. - * fhandler_console.cc (fhandler_console::send_winch_maybe): If - appropriate, call tty master function to handle screen size change. - * fhandler_tty.cc (fhandler_tty_master::set_winsize): New function. - (fhandler_tty_master::init): Call set_winsize to set initial screen - size. - -2002-12-26 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_master::init): Set initial size of tty - to that of console in which tty is operating. - (process_input): Semi-revert previous change. Need to just use current - terminfo settings since this function is running in a thread, blocked - when the terminfo changes. - -2002-12-26 Christopher Faylor - - * fhandler.h (fhandler_termios::line_edit): Replace third argument with - passed-in termios struct. - * fhandler_console.cc (fhandler_console::read): Prior to loop, make a - copy of current termios for passing to line_edit prior so that all - characters are processed consistently. - * fhandler_tty.cc (fhandler_pty_master::write): Ditto. - (process_input): Make a copy of curent termios prior to read for use in - subsequent line_edit. - * fhandler_termios.cc (fhandler_termios::line_edit): Replace third - parameter with passed-in termios struct and use it throughout rather - than the data from the current fhandler_termios class. - -2002-12-25 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number. - -2002-12-25 Christopher Faylor - - * exceptions.cc (events_init): Initialize critical section to control - exiting via signal. - (signal_exit): Enter critical section early to avoid exit races with - main thread. - * dcrt0.cc (do_exit): Use exit_lock critical section to avoid races. - -2002-12-25 Christopher Faylor - - * cygthread.cc (cygthread::detach): Set errno with set_sig_errno so - that EINTR is properly restored after signal. - -2002-12-21 Christopher Faylor - - * Makefile.in: Default fhandler objects to -fomit-frame-pointer. - Eliminate redundant CFLAGS settings. - -2002-12-20 Christopher Faylor - - * fhandler.h (line_edit_status): Reorganize so that tests for error - condition can be < or >. - * fhandler_tty.cc (fhandler_pty_master::write): Don't return after - sending a signal. - - * fhandler_termios.cc (fhandler_termios::line_edit): Trivial change to - use built-in bool types. - -2002-12-19 Pierre Humblet - - * localtime.cc (tzsetwall): Set lcl_is_set and lcl_TZname - in the Cygwin specific part of the routine. - -2002-12-19 Pierre Humblet - - * fhandler.cc (fhandler_base::open): Use "flags" rather than "mode" - in Win9X directory code. - -2002-12-19 Steve Osborn - - * fhandler.h (line_edit_status): Add a new element. - * fhandler_termios.cc (fhandler_termios::line_edit): After - accept_input, handle both potential error condition and pipe full - conditions. - * fhandler_tty.cc (fhandler_pty_master::accept_input): Return -1 on - error. - (fhandler_pty_master::write): Handle pipe full condition. - -2002-12-16 Steve Osborn - Christopher Faylor - - * fhandler_termios.cc (fhandler_termios::line_edit): Return - line_edit_error and remove last char from readahead buffer if - accept_input() fails. - * fhandler_tty.cc (fhandler_pty_master::accept_input): Return 0 and - restore readahead buffer when tty slave pipe is full. - -2002-12-16 Christopher Faylor - - * pinfo.cc (_pinfo::cmdline): Allocate sufficient space for myself - command line args. - -2002-12-14 Steve Osborn - - * fhandler_termios.cc (fhandler_termios::line_edit): Call - accept_input() in character processing loop. Set return value - independently of input_done. - -2002-12-14 Christopher Faylor - - * fhandler.cc (fhandler_base::read): Signal event, if necessary, and - raw_read hasn't done so. - -2002-12-14 Christopher Faylor - - * fhandler.cc (fhandler_base::raw_read): Reset priorities to minimize - window where thread termination may cause data loss. - (fhandler_base::read): Always return at end of function. Just set len - to copied_chars when len is zero. Return immediately after raw_read if - len <= 0. Remove in_len setting and just check end instead. Fix CRLF - handling at end of buffer. - -2002-12-14 Corinna Vinschen - - * dcrt0.cc (dll_crt0_1): Call well known SID initializer function. - * security.h (cygsid::init): Declare new static method. - * sec_helper.cc (cygsid::init): New method for initializing well - known SIDs. - -2002-12-14 Pierre Humblet - - * security.h: Declare well_known_creator_group_sid. - * sec_helper.cc: Define and initialize well_known_creator_group_sid. - -2002-12-14 Corinna Vinschen - - * netdb.cc: Remove strtok_r comment. - -2002-12-14 Pierre Humblet - - * security.cc (get_user_local_groups): Use LookupAccountSid to find the - local equivalent of BUILTIN. - -2002-12-14 Christopher Faylor - - * pipe.cc (make_pipe): Set fork fixup flag for read pipe. - -2002-12-14 Christopher Faylor - - * winbase.h: Turn on inline versions of Interlocked* by default. - -2002-12-14 Gary R. Van Sickle - - * winbase.h: Fixup inline asm functions. Add ilockcmpexch. - -2002-12-13 Christopher Faylor - - Throughout, change fhandler_*::read and fhandler_*::raw_read to void - functions whose second arguments are both the length and the return - value. - * fhandler.cc (fhandler_base::read): Rework slightly to use second - argument as input/output. Tweak CRLF stuff. - (fhandler_base::readv): Accommodate fhandler_*::read changes. - * cygthread.h (cygthread::detach): Declare as taking optional handle - argument. - (cygthread::detach): When given a handle argument, wait for the handle - to be signalled before waiting for thread to detach. Return true when - signal detected. - -2002-12-12 Corinna Vinschen - - * Makefile.in: Add MINGW_LDFLAGS when linking cygrun.exe. - -2002-12-10 Christopher Faylor - - * cygthread.h (cygthread::stack_ptr): New element. - (cygthread::detach): Accept a "wait_for_signal" argument. - (cygthread::terminate_thread): New function. - * cygthread.cc (cygthread::stub): Set stack pointer argument. - (cygthread::terminate_thread): New function. Forcibly terminate - thread. - (cygthread::detach): Optionally wait for signals and kill thread when - signal arrives. - * exceptions.cc (signal_exit): Set signal_arrived prior to exiting to - wake up anything blocking on signals. - * fhandler.h (fhandler_base::set_r_no_interrupt): Change to accept bool - argument. - (fhandler_pipe::ready_for_read): Declare. - * pipe.cc (pipeargs): New structure. - (read_pipe): New thread stub wrapper for normal pipe read. - (fhandler_pipe::read): Modify to call reader in a cygthread, - terminating on signal, as appropriate. - * select.cc (fhandler_pipe::ready_for_read): Define new function. - -2002-12-10 Corinna Vinschen - - * net.cc (free_protoent_ptr): Add missing free() for base structure. - (free_servent_pt): Ditto. - (free_hostent_pt): Ditto. - -2002-12-10 Craig McGeachie - - * netdb.cc (parse_alias_list): Change strtok calls to strtok_r. - (parse_services_line): Ditto. - (parse_protocol_line): Ditto. - -2002-12-10 Pierre Humblet - - * pwdgrp.h (pwdgrp_check::pwdgrp_state): Replace by - pwdgrp_check::isinitializing (). - (pwdgrp_check::isinitializing): Create. - * passwd.cc (grab_int): Change type to unsigned, use strtoul and set - the pointer content to 0 if the field is invalid. - (parse_pwd): Move validity test after getting pw_gid. - (read_etc_passwd): Replace "passwd_state <= " by - passwd_state::isinitializing (). - (internal_getpwuid): Ditto. - (internal_getpwnam): Ditto. - (getpwent): Ditto. - (getpass): Ditto. - * grp.cc (parse_grp): Use strtoul for gr_gid and verify the validity. - (read_etc_group): Replace "group_state <= " by - group_state::isinitializing (). - (internal_getgrgid): Ditto. - (getgrent32): Ditto. - (internal_getgrent): Ditto. - -2002-12-10 Pierre Humblet - - * security.h: Move declarations of internal_getgrent, - internal_getpwsid and internal_getgrsid to pwdgrp.h. - * pwdgrp.h: Declare internal_getpwsid, internal_getpwnam, - internal_getpwuid, internal_getgrsid, internal_getgrgid, - internal_getgrnam, internal_getgrent and internal_getgroups. - Delete "emulated" from enum pwdgrp_state. - (pwdgrp_check::isuninitialized): Create. - (pwdgrp_check::pwdgrp_state): Change state to initializing - rather than to uninitialized. - (pwdgrp_read::gets): Remove trailing CRs. - * passwd.cc (grab_string): Don't look for NLs. - (grab_int): Ditto. - (parse_pwd): Don't look for CRs. Return 0 if entry is too short. - (search_for): Delete. - (read_etc_passwd): Simplify tests to actually read the file. - Set state to loaded before making internal_getpwXX calls. - Replace search_for calls by equivalent internal_pwgetXX calls. - (internal_getpwsid): Use passwd_state.isuninitialized to decide - to call read_etc_passwd. - (internal_getpwuid): Create. - (internal_getpwnam): Create. - (getpwuid32): Simply call internal_getpwuid. - (getpwuid_r32): Call internal_getpwuid. - (getpwnam): Simply call internal_getpwnam. - (getpwnam_r): Call internal_getpwnam. - * grp.cc (parse_grp): Don't look for CRs. Adjust blank space. - (add_grp_line): Adjust blank space. - (class group_lock): Ditto. - (read_etc_group): Simplify tests to actually read the file. - Set state to loaded before making internal_getgrXX calls. - Replace getgrXX calls by equivalent internal calls. - (internal_getgrsid): Use group_state.isuninitialized to decide - to call read_etc_group. - (internal_getgrgid): Create. - (internal_getgrnam): Create. - (getgroups32): Simply call internal_getgrgid. - (getgrnam32): Simply call internal_getgrnam. - (internal_getgrent): Call group_state.isuninitialized. - (internal_getgroups): Create from the former getgroups32, using - two of the four arguments. Set gid to myself->gid and username - to cygheap->user.name (). - (getgroups32): Simply call internal_getgroup. - (getgroups): Call internal_getgroup instead of getgroups32. - (setgroups32): Call internal versions of get{pw,gr}XX. - * sec_helper.cc: Include pwdgrp.h. - (is_grp_member): Call internal versions of get{pw,gr}XX. - * security.cc: Include pwdgrp.h. - (alloc_sd): Call internal versions of get{pw,gr}XX. - * syscalls.cc: Include pwdgrp.h. - (seteuid32): Call internal versions of get{pw,gr}XX. - (setegid32): Ditto. - * uinfo.cc: Include pwdgrp.h. - (internal_getlogin): Call internal versions of get{pw,gr}XX. - (cygheap_user::ontherange): Ditto. - * sec_acl.cc: Include pwdgrp.h. - (setacl): Call internal versions of get{pw,gr}XX. - (acl_access): Ditto and simplify logic. - (aclfromtext): Ditto. - -2002-12-09 2002-12-02 Egor Duda - - * lib/pseudo-reloc.c: New file. - * lib/_cygwin_crt0_common.cc: Perform pseudo-relocs during - initialization of cygwin binary (.exe or .dll). - -2002-12-06 Christopher Faylor - - * cygwin.din: Reflect name change from strtodf to strtof. Export - strtof. - * include/cygwin/version.h: Bump API minor number. - -2002-12-04 Steve Osborn - - * fhandler.h (fhandler_termios::line_edit): Change return from an int - to an enum to allow the function to return an error. - * fhandler_console.cc (fhandler_console::read): Update the line_edit - call to use the new enum. - * fhandler_termios.cc (fhandler_termios::line_edit): Change return from - an int to an enum to allow the function to return an error. Put - put_readahead call before doecho for future patch. - * fhandler_tty.cc (fhandler_pty_master::write): Change to call - line_edit one character at a time, and stop if an error occurs. - -2002-12-04 Craig McGeachie - - * netdb.cc: New file. - * Makeile.in (DLL_OFILES): Add reference to the new netdb.cc file. - * cygwin.din : Add new aliased exports for service and protocol - enumerations in netdb.cc. - -2002-12-04 Thomas Pfaff - - * cxx.cc: New file. Implement new, new[], delete and delete[] - operators and __cxa_pure_virtual if compiled by gcc >=3. - * Makefile.in (DLL_OFILES): Add cxx.o. - Remove libstdc++.a from cygwin1.dll link step. - -2002-11-29 Steve Osborn - - * fhandler_tty.cc (fhandler_pty_master::accept_input): Move - read_retval assignment to prevent race condition. Remove read_retval - from return statement. - -2002-11-29 Christopher Faylor - - * pinfo.h (winpids::set): Renamed from init. - (winpids::init): New declaration. - (winpids::cs): Ditto. - (winpids::winpids): Use set rather than init. - * external.cc (fillout_pinfo): Ditto. - * dcrt0.cc (dll_crt0_1): Call winpids::init. - * pinfo.cc (winpids::set): Renamed from init. Wrap calls in critical - section. - (winpids::init): New function. - (winpids::cs): Define. - -2002-11-28 Christopher Faylor - - * sigproc.cc (sig_dispatch_pending): Remove assertion. - -2002-11-27 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number. - -2002-11-27 Mikael Ylikoski - - * fhandler_socket.cc (fhandler_socket::sendto): Fix potential - unitialized value return. - -2002-11-27 Christopher Faylor - - * cygwin.din: Export pthread_getsequence_np. - * include/cygwin/version.h: Bump API minor version. - -2002-11-26 Jason Tishler - - * cygwin.din: Export nl_langinfo(). - * include/cygwin/version.h: Bump API minor version. - -2002-11-26 Christopher Faylor - - * fhandler_tty.cc (fhandler_pty_master::accept_input): Just use a - normal Sleep or suffer amazing pauses when other tty apps are running. - (fhandler_pty_master::process_slave_output): Ditto. - -2002-11-25 Pierre Humblet - - * passwd.cc (read_etc_passwd): Never add an entry when starting - on Win95/98/ME if a default entry is present. - * uinfo.cc (internal_getlogin): Look for the default uid if needed. - Always call user.set_name (). - -2002-11-25 Corinna Vinschen - - * sec_acl.cc (getacl): Set errno to ENOSPC if command is GETACL and - nentries is less than the number of entries in the file's ACL. - -2002-11-24 Corinna Vinschen - - * sec_acl.cc: Fix some formatting. Only set and check `other' bits in - a_perm throughout. Use ILLEGAL_GID id for all entries having no id. - (setacl): Fix inheritance condition. - (getacl): Set all permission bits in CLASS_OBJ and DEF_CLASS_OBJ - entries. Remove DENY bits before returning to calling function. - (acltomode): Fix usage of searchace(). If available, use CLASS_OBJ - to mask GROUP_OBJ permissions. - (aclfrommode): Fix usage of searchace(). If available, set CLASS_OBJ - permissions to same value as GROUP_OBJ permissions. - -2002-11-24 Pierre Humblet - - * sec_acl.cc (getace): Fix the behavior when allow and - deny entries are present in arbitrary order. - (getacl): Report the actual number of entries when - aclbufp is NULL, even if nentries is zero. Fix the mask - reporting, handle the case where the owner and group sids - are equal and streamline the code. - (acl_worker): Take allow_ntsec into account. - -2002-11-05 Thomas Pfaff - - * dcrt0.cc (dll_crt0_1): Add call to pthread::initMainThread to - initialize mainthread when it is safe to call new. - * init.cc (dll_entry): Change call to store reents in tls key. - * thread.cc (_reent_clib) : Change call to get reents from tls - key. - (_reent_winsup): Ditto. - (MTinterface::Init): Key handling changed. Remove initialization - of member variables. - (MTinterface::fixup_after_fork): Reinitialize mainthread object - after fork. Reset threadount to 1. - (pthread::initMainThread): Create mainthread object dynamically. - and initialize with valid handles. - (pthread::self): Remove calls to create thread objects. - (pthread::setTlsSelfPointer): Change call to store thread self - handle in tls key. - (pthread::getTlsSelfPointer): New static method. - (pthread::exit): Remove setTlsSelfPointer call. - (pthread::initCurrentThread): New method. - (pthread::thread_init_wrapper): Change call to store thread self - handle in tls key. - (pthread::join): Check for a valid joiner. - (pthreadNull::pthreadNull): Mark Null object as detached. - (pthreadNull::exit): Terminate thread via ExitThread. - * thread.h (pthread::initMainThread): Change parameter in function - call. - (pthread::getTlsSelfPointer): New static method. - (pthread::initCurrentThread): New method. - (MTinterface::reent_key): Remove. - (MTinterface::thread_self_dwTlsIndex): Ditto.. - (MTinterface::indexallocated): Ditto. - (MTinterface::mainthread): Ditto. - (MTinterface::reent_key): New member. - (MTinterface::thread_self_key): Ditto. - (MTinterface::MTinterface): Initialize all members. - -2002-11-23 Christopher Faylor - - * wait.cc (wait4): Force pending signal delivery before waiting for - process completion. - -2002-11-23 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number. - -2002-11-22 Christopher Faylor - - * exceptions.cc (handle_sigsuspend): Force pending signal delivery - before waiting for signals to happen. - * signal.cc (sleep): Force pending signal delivery before sleeping. - (usleep): Ditto. - (signal): Force pending signal delivery before manipulating signal - stuff. - (sigprocmask): Ditto. - (kill_worker): Ditto. - (abort): Ditto. - (sigaction): Ditto. - * syscalls.cc (readv): Force pending signal delivery before I/O. - (writev): Ditto. - (open): Ditto. - * net.cc: Ditto, throughout. - * sigproc.cc (sig_dispatch_pending): Deliver any pending signals prior - to returning. - - * tty.cc (tty::make_pipes): Increase pipe buffer size. - -2002-11-22 Christopher Faylor - - * include/cygwin/version.h: Fix comment. - -2002-11-21 Igor Pechtchanski - - * external.cc (cygwin_internal): Fix va_arg references. - -2002-11-21 Christopher Faylor - - * exceptions.cc (sigthread::get_winapi_lock): Just do standard 'give up - timeslice' wait. - (setup_handler): Revamp YA to attempt to deliver signal multiple times - on failure rather than punting to wait_sig. - * miscfuncs.cc (low_priority_sleep): Accept INFINITE sleep to mean - "don't reset the priority after setting it to idle". Return previous - priority. - * winsup.h (SLEEP_0_STAY_LOW): Define. - (low_priority_sleep): Return an int. - * sigproc.h: Define WAIT_SIG_PRIORITY here. - * sigproc.cc: Remove WAIT_SIG_PRIORITY definition. - -2002-11-20 Pierre Humblet - - * security.h: Declare internal_getpwsid and internal_getgrsid. - Undeclare internal_getpwent. Define DEFAULT_UID_NT. Change - DEFAULT_GID. - * passwd.cc (internal_getpwsid): New function. - (internal_getpwent): Suppress. - (read_etc_passwd): Make static. Rewrite the code for the completion - line. Set curr_lines to 0. - (parse_pwd): Change type to static int. Return 0 for short lines. - (add_pwd_line): Pay attention to the value of parse_pwd. - (search_for): Do not look for nor return the DEFAULT_UID. - * grp.cc (read_etc_group): Make static. Free gr_mem and set - curr_lines to 0. Always call add_pwd_line. Rewrite the code for the - completion line. - (internal_getgrsid): New function. - (parse_grp): If grp.gr_mem is empty, set it to &null_ptr. - Never NULL gr_passwd. - (getgrgid32): Only return the default if ntsec is off and the gid is - ILLEGAL_GID. - * sec_helper.cc (cygsid::get_id): Use getpwsid and getgrsid. - (cygsid_getfrompw): Clean up last line. - (cygsid_getfromgr): Ditto. - (is_grp_member): Use getpwuid32 and getgrgid32. - * uinfo.cc (internal_getlogin): Set DEFAULT_GID at start. - Use getpwsid. Move the read of /etc/group after the second access - to /etc/passwd. Change some debug_printf. - -2002-11-20 Steven O'Brien - - * poll.cc (poll): ...but set POLLIN instead. - -2002-11-20 Pierre Humblet - - * security.cc (get_attribute_from_acl): Always test "anti", - just in case an access_denied ACE follows an access_allowed. - Handle the case owner_sid == group_sid, with a FIXME. - Remove unnecessary tests for non-NULL PSIDs. - (alloc_sd): Use existing owner and group sids if {ug}id == -1. - Handle case where owner_sid == group_sid. - Do not call is_grp_member. Try to preserve canonical ACE order. - Remove unnecessary tests for non-NULL PSIDs. Reorganize - debug_printf's. - (get_initgroups_sidlist): Put well_known_system_sid on left - side of ==. - (add_access_denied_ace): Only call GetAce if inherit != 0. - (add_access_allowed_ace): Ditto. Use appropriate sizeof. - * syscalls.cc (chown_worker): Pass {ug}id equal to -1 to - alloc_sd, which removes the need to obtain old_{ug}id. - (chmod): Remove call to get_file_attribute (), simply pass - {ug}id equal to -1 to alloc_sd. - -2002-11-20 Corinna Vinschen - - * poll.cc (poll): Don't set POLLERR if a listening socket has a - pending connect. Don't use errno value from call to - fhandler_socket::recvfrom(). - -2002-11-19 Christopher Faylor - - * net.cc: Sprinkle sigframes throughout. - -2002-11-16 Christopher Faylor - - * tty.cc (tty::make_pipes): Make pipe buffer larger. - -2002-11-15 Pierre Humblet - - * grp.cc (getgroups32): Protect against closing cygheap->user.token. - -2002-11-15 Christopher Faylor - - * include/cygwin/version.h: Bump API_MINOR to accommodate below - changes. - -002-11-14 Sergey Okhapkin - - * cygwin.din (siginterrupt): New export. - * signal.cc (siginterrupt): New. - -2002-11-15 Sergey Okhapkin - - * select.cc (peek_serial): Don't call PurgeComm() to avoid characters - loss. - -2002-11-14 Christopher Faylor - - * exceptions.cc (setup_handler): Add debugging output. Set thread - priority to idle if pending signals to allow other threads to get into - interruptible state. - * miscfuncs.cc (sys_mbstowcs): Save current thread in variable to avoid - an OS call. - * wait.cc (wait_sig): Reset thread priority each time through loop - since the priority may have been set down to deal with pending signals. - -2002-11-14 Christopher Faylor - - * fhandler_serial.cc (fhandler_serial::tcgetattr): Don't take any - special action when vmin_ == 0. - -2002-11-14 Corinna Vinschen - - * grp.cc (getgroups32): Revert previous patch. Use impersonation - token if process is in impersonated state. - * sec_helper.cc (is_grp_member): Rewrite. Call getgroups32 only - for current user. Scan passwd and group info otherwise. - -2002-11-14 Christopher Faylor - - * fhandler_console.cc (fhandler_console::write): Allow characters >= - 0177 to be displayed in the title bar. - -2002-11-14 Corinna Vinschen - - * grp.cc (getgroups32): Don't use access token of current user when - retrieving group info for another user. - -2002-11-13 Christopher Faylor - - * dll_init.cc (dll_list::detach): Eliminate reliance on passed in dll - address. Infer from module of caller instead. - (cygwin_detach_dll): Ignore dll_index argument. - * dll_init.h (dll_list::detach): Reflect argument change above. - -2002-11-13 Christopher Faylor - - * ioctl.cc (ioctl): Always print ioctl results, even when it's a tty. - -2002-11-13 Christopher Faylor - - * winsup.h (low_priority_sleep): Declare. - -2002-11-13 Christopher Faylor - - * miscfuncs.cc (low_priority_sleep): New function. Use throughout - where code is supposed to be giving up time slice. - - * fhandler_console.cc (fhandler_console::read): Switch button 2/3 - output escape sequences to be consistent with xterm. - -2002-11-12 Pierre Humblet - - * syscalls.cc (chmod): Simplify conditional. - * sec_helper (cygsid::getfromstr): Reorganize to remove - calls to strcpy and strtok_r. - (cygsid::getfromgr): Change type to __uid32_t instead of int. - Keep only the allow_ntsec branch. Never call LookupAccountSid - which calls PDCs, simply return -1 in case of failure. - Use cygsid == instead of calling EqualSid and remove test - for NULL psid. - * security.h: Declare cygsid::getfromgr as __uid32_t. - -2002-11-10 Corinna Vinschen - - * net.cc: Run indent. - -2002-11-10 Alexander Gottwald - - * autoload.cc (GetIfEntry): Add symbol. - * net.cc (get_2k_ifconf): Get the interface entries with the GetIfEntry - call intead of the GetIfTable call. Clean-up multiple IP address naming. - -2002-11-09 Sergey Okhapkin - - * fhandler.h (class fhandler_pipe): New ioctl() method. - * pipe.cc (fhandler_pipe::ioctl): New. - -2002-11-07 Christopher Faylor - - * fhandler_serial.cc (fhandler_serial::ioctl): Fix typo. - -2002-11-07 Christopher January - - * include/cygwin/fs.h: New file. - * include/cygwin/hdreg.h: New file. - * fhandler_floppy.cc (fhandler_floppy::ioctl): Add implementation for - HDIO_GETGEO, BLKGETSIZE, BLKGETSIZE64, BLKRRPART and BLKSSZGET ioctls. - -2002-11-07 Gilles Courcoux - - * fhandler_socket.cc (fhandler_socket::ioctl): Return correct flags - for loopback interface when name is given on input instead of address. - -2002-11-07 Jason Tishler - - * cygwin.din: Export fseeko() and ftello(). - * include/cygwin/version.h: Bump API minor version. - -2002-11-06 Christopher Faylor - - * fhandler_console.cc (keytable[]): Revert previous change. It would - break too many things. - -2002-11-06 Christopher Faylor - - * fhandler_console.cc (keytable[]): Redefine F1 - F5 to something a - little more sensical. - -2002-11-06 Sergey Okhapkin - - * syscalls.cc (getutid): Use UT_IDLEN where appropriate. - -2002-11-06 Christopher Faylor - - * include/cygwin/version.h: Bump API minor number for below export. - -2002-11-06 Sergey Okhapkin - - * cygwin.din (pututline): New exported function. - * syscalls.cc (login): Use pututiline(). - (setutent): Open utmp as read/write. - (endutent): Check if utmp file is open. - (utmpname): call endutent() to close current utmp file. - (getutid): Enable all cases, use strncmp() to compare ut_id fields. - (pututline): New. - * tty.cc (create_tty_master): Set ut_pid to current pid. - -2002-11-05 Christopher Faylor - - * fhandler_serial.cc (fhandler_serial::ioctl): Don't try to figure out - if OS has the capability to retrieve RTS/CTS. Just set default values - if DeviceIoControl fails. (suggested by Sergey Okhapkin) - -2002-11-05 Sergey Okhapkin - - * fhandler_serial.cc (fhandler_serial::raw_read): Use correct type for - minchars. - (fhandler_serial::ioctl): Set errno if the ClearCommError fails. - (fhandler_serial::tcsetattr): Use correct value for vmin_. - (fhandler_serial::tcgetattr): Ditto. - -2002-11-05 Thomas Pfaff - - * fhandler_socket.cc (fhandler_socket::recvmsg): Call if from == NULL - WSARecvFrom with fromlen = NULL. - -2002-11-04 Christopher Faylor - - * pinfo.cc (_pinfo::commune_send): Fix thinko in previous checkin. - -2002-11-04 Christopher Faylor - - * pinfo.cc (_pinfo::commune_send): Set priority low when sleeping, - waiting for commune completion so that we don't spin waiting for lower - priority processes. - -2002-11-04 Christopher Faylor - - * sigproc.cc (WAIT_SIG_PRIORITY): Bump to THREAD_PRIORITY_TIME_CRITICAL. - -2002-11-04 Christopher Faylor - - * pinfo.cc (_pinfo::commune_send): Initialize buffer or suffer random - crashes. - -2002-11-04 Christopher Faylor - - * fhandler_process.cc (fhandler_process::fill_filebuf): Deal with error - condition from cmdline retrieval. - -2002-11-04 Christopher Faylor - - * sigproc.cc (WAIT_SIG_PRIORITY): Bump to highest priority. - -2002-11-04 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number. - -2002-11-03 Christopher Faylor - - * fhandler_serial.cc (fhandler_serial::ioctl): Reformat. Set errno - appropriately. Exit from the bottom. Correctly deal with third - argument for TCFLSH. (Suggested by Sergey Okhapkin) - -2003-11-03 Sergey Okhapkin - - * fhandler_tty.cc (fhandler_tty_slave::ioctl): Do nothing if the new - window size is equal to the old one. Send SIGWINCH if slave connected - to a pseudo tty. - (fhandler_pty_master::ioctl): Do nothing if the new window size is - equal to the old one. - -2002-10-31 Pierre Humblet - - * fhandler.cc (fhandler_base::open): Verify pc isn't NULL. - -2002-10-30 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number. - -2002-10-30 Christopher Faylor - - * external.cc (cygwin_internal): Implement CW_CMDLINE. - * pinfo.h (SIGCOMMUNE): New signal type. - (commune_result): New structure for commune functions. - (picom): New enum for commune functions. - (_pinfo::hello_pid): New. Pid who's communicating with me. - (_pinfo::tothem): New. Handle of communicating pipe. - (_pinfo::fromthem): Ditto. - (_pinfo::commune_recv): Declare. - (_pinfo::commune_send): Declare. - (_pinfo::alive): Declare. - (_pinfo::cmdline): Declare. - (_pinfo::lock): Declare. - * pinfo.cc (set_myself): Initialize new _pinfo lock. - (_pinfo::alive): Define. Determines if process still exists. - (_pinfo::commune_recv): Define. Receive info from another cooperating process. - (_pinfo::commune_send): Define. Send info to another cooperating process. - (_pinfo::cmdline): Define. Determine command line of a given process. - * include/sys/cygwin.h (CW_CMDLINE): Define. - - *sigproc.cc (talktome): Communicate with any processes who want to talk - to me. - (wait_sig): Honor __SIGCOMMUNE. - - * fhandler.cc (fhandler_virtual::fixup_after_exec): Declare. - * fhandler_proc.cc: Use malloc/free/realloc throughout rather than - cmalloc since buffers don't need to be propagated to subprocesses. - * fhandler_registry.cc: Ditto. - * fhandler_virtual.cc: Ditto. - (fhandler_virtual::fixup_after_exec): Define. - * fhandler_process.cc: Ditto for malloc/free/realloc. - (process_listin): Add "cmdline". - (fhandler_process::fill_filebuf): Implement PROCESS_CMDLINE. - - * miscfuncs.cc (isalpha_array): New array populated with xor values for - alpha characters to switch from one case to another. - * string.h (cygwin_strcasematch): New asm implementation of case match. - * string.h (cygwin_nstrcasematch): New asm implementation of counted - case match. - -2002-10-24 Pierre Humblet - - * pwdgrp.h (pwdgrp_read::open): Compare fh to INVALID_HANDLE_VALUE. - -2002-10-22 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Nevermind. - Revert everything to previous state wrt ntsec and exec bits. - -2002-10-22 Christopher Faylor - - * shared.cc (shared_info::initialize): Use correct value for version - comparison. - * include/cygwin/version.h (CYGWIN_VERSION_MAGIC): Use all of a DWORD - for magic calculation. - -2002-10-22 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Oops. Only - do the executable thing for #! scripts since .exe files wouldn't be - executable in ntsec case regardless. - -2002-10-22 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Always - consider .exe files and '#!' shell scripts to be executable. - -2002-10-22 Christopher Faylor - - * cygthread.cc (cygthread::exiting): New variable. - (cygthread::initialized): Delete. - (cygthread::stub): Use exiting variable to determine when to exit. - (cygthread::runner): Delete. - (cygthread_protect): New variable. - (cygthread::init): Don't start runner thread. Initialize muto for list - protection. - (cygthread::freerange): Return pointer to cygthread. - (cygthread::operator new): Change logic to start threads on an - as-needed basis. - (cygthread::detach): Don't zero id. - (cygthread::terminate): Don't kill any executing threads. Just set - exiting flag. - * cygthread.h (cygthread): Reflect above changes. - * dcrt0.cc (dll_crt0_1): Move cygthread initialization later. - - * fork.cc (fork_child): Do fdtab fixup after dll fixup or (apparently) - winsock may allocate memory in dll load address. - -2002-10-22 Pierre Humblet - - * sec_helper.cc (cygsid::get_id): If the sid matches a sid stored in - cygheap->user, return the uid or gid from myself. - * security.cc (alloc_sd): If gid == myself->gid, return the group sid - from cygheap->user. Remove the test for uid == original_uid, which is - counter-productive. - -2002-10-22 Christopher Faylor - - * cygheap.cc (cygheap_fixup_in_child): Use user_heap element in - cygheap. - (init_cheap): Ditto for declaration. - * fork.cc (fork_parent): Use user_heap element in cygheap. - * heap.h (inheap): Ditto. - * heap.cc (sbrk): Ditto. - (heap_init): Ditto. Reorganize to shrink heap chunk as required and - record new value in cygheap. - * dcrt0.cc (dll_crt0_1): More "move the cygthread init" games. - * shared.cc (open_shared): Rework memory protection to properly deal - with relocated shared segment. - (shared_info::heap_chunk_size): Rename element to 'heap_chunk'. - * shared_info.h (shared_info): Ditto for declaration. - * strace.cc (strace::hello): Report on heap chunk size from cygheap - since it may shrink. - -2002-10-20 Christopher Faylor - - Change _function() to function() throughout. - * cygwin.din: Remove last vestiges (?) of newlib wrappers. - -2002-10-20 Christopher Faylor - - * cygthread.cc (cygthread::detach): Always wait for event or suffer an - apparently inavoidable race. - * dcrt0.cc (dll_crt0_1): Allocate threads after stack has been - relocated. - * debub.cc (lock_debug): Don't acquire lock on exit. - * fork.cc (fork_child): Recreate mmaps before doing anything else since - Windows has a habit of using blocks of memory in the child that could - previously have been occupied by shared memory in the parent. - * mmap.cc (fhandler_disk_file::fixup_mmap_after_fork): Issue error here - and provide some details about what went wrong. - (fixup_mmaps_after_fork): Remove error message. - * shared.cc (open_shared): Move warning message so that more detail is - possible. - * sigproc.cc (sigproc_init): Initialize sync_proc_subproc to avoid a - race. - (sigproc_terminate): Specifically wait for process thread to terminate. - -2002-10-20 Christopher Faylor - - * cygthread.cc (cygthread::stub): Fix typo. - (cygthread::terminate): Don't zero thread handle prior to using it. - -2002-10-20 Christopher Faylor - - * sigproc.cc (wait_sig): Remove obsolete sigchld logic. - -2002-10-20 Christopher Faylor - - Rename _kill() to kill() throughout. Rename _raise() to raise() - throughout. Rename _pid() to pid() throughout. - * Makefile.in: Compile some objects with -fomit-frame-pointer. - * cygwin.din: Reverse aliasing for _kill. - * syscalls.cc (_getpid_r): New function, implemented for newlib - compatibility. - - * shared.cc (open_shared): Remove reserving of memory since previous - change eliminate the need for this hack. - -2002-10-19 Christopher Faylor - - * fork.cc (fork_child): Move pinfo fixup later to attempt some minor - gains from concurrency with cythread::init. - -2002-10-18 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Initialize cygwin threads here only when not - forking. - * fork.cc (fork_child): Initialize cygwin thread later in process to - avoid allocating memory for thread stacks. - * shared.cc (open_shared): Issue warning if NT and shared segment is - relocated. - -2002-10-18 Christopher Faylor - - * cygthread.cc: Bump number of cygthreads up to accommodate - applications which use ttys. - -2002-10-18 Christopher Faylor - - * fork.cc (fork_child): Move mmap initialization. - * shared.cc (shared_info::heap_chunk_size): Store info as megabytes. - Search HKEY_LOCAL_MACHINE as well as HKEY_CURRENT_USER. - * shared_info.h (shared_info::initial_heap_size): Change element name - to reflect new functionality. - * strace.cc (strace::hello): Report on initial heap size. - -2002-10-18 Thomas Pfaff - - * thread.cc (verifyable_object_isvalid): Test for a valid object - pointer before testing for static ptr. - -2002-10-17 Christopher Faylor - - * dtable.cc (dtable::init_std_file_from_handle): Force "devices" to - always be in binary mode. Temporary fix until ssh is rebuilt? - -2002-10-17 Christopher Faylor - - * dtable.cc (dtable::set_file_pointers_for_exec): New function. - * dtable.h (dtable::set_file_pointers_for_exec): Declare new function. - * spawn.cc (spawn_guts): Call dtable::set_file_pointers_for_exec to set - pointers to EOF when execing non-cygwin applications. - -2002-10-17 Robert Collins - - * thread.h (pthread_mutex::isGoodInitializerOrBadObject): Declare. - * thread.cc (pthread_mutex::isGoodInitializerOrBadObject): Implement. - (pthread_mutex::init): Use isGoodInitializerOrBadObject to avoid - unneeded SEGV's during debugging. - -2002-10-17 Thomas Pfaff - - * thread.cc (verifyable_object_isvalid): Test for static object first. - -2002-10-16 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::read): Attempt #527 to properly - implement VMIN/VTIME. - -2002-10-15 Christopher Faylor - - * shared.cc (open_shared): Revert to "old" method for shared memory - location if !wincap.needs_memory_protection. - * wincap.cc: Implement needs_memory_protection throughout. - * wincap.h: Ditto. - -2002-10-15 Christopher Faylor - - * child_info.h (CURR_CHILD_INFO_MAGIC): Reset. - (child_info_fork::mount_table): Remove. - (child_info_fork::myself_addr): Remove. - * fork.cc (fork_child): Don't set either of the above. - * dcrt0.cc (dll_crt0_1): Call memory_init as early as possible. - * fhandler_console.cc (console_state): Move to shared_info.h. - (fhandler_console::get_tty_stuff): Reflect open_shared arg change. - * pinfo.cc (myself_addr): Remove definition. - (pinfo::init): Get myself address from open_shared. - * pinfo.h (myself_addr): Remove declaration. - * shared.cc (open_shared): Rework so that known shared memory locations - are protected. Take shared memory type as fifth argument. - (memory_init): Reflect open_shared arg change. - * shared_info.h (shared_locations): New enum. - (console_state): Move here. - (open_shared): Reflect open_shared arg change in declaration. - -2002-10-14 Christopher Faylor - - * child_info.h (CURR_CHILD_INFO_MAGIC): Reset. - (child_info_fork::heaptop): Remove obsolete element. - (child_info_fork::heabbase): Ditto. - (child_info_fork::heapptr): Ditto. - (child_info_fork::mount_table): New element. - (child_info_fork::myself_addr): Ditto. - * dcrt0.cc (dll_crt0_1): Set mount_table and myself_addr when forking. - (initial_env): Add newline to "sleeping" message. - * dll_init.cc (reserve_upto): Accommodate cygwin heap when freeing - memory. Make debugging output a little more descriptive. - * fork.cc (fork_parent): Save mount_table and myself_addr. - * pinfo.cc (myself_addr): New variable. - (set_myself): Pass PID_MYSELF flag to init. - (pinfo::init): Honor PID_MYSELF. Save address where myself shared - memory resides in myself_addr, for fork. - * pinfo.h (myself_addr): Declare. - * shared.cc (memory_init): On fork, use previously saved address for - location of mount table. - * include/sys/cygwin.h (PID_MYSELF): New value. - - * dtable.cc (dtable::stdio_init): Don't pass access type to - init_std_file_from_handle. It's always the same. - (dtable::init_std_file_from_handle): Remove access type argument. - Assume read/write. - * dtable.h (dtable::init_std_file_from_handle): Ditto for declaration. - - * exceptions.cc (try_to_debug): Don't try to debug if already being - debugged. - - * fhandler_console.cc (shared_console_info_save): New variable. - (fhandler_console::get_tty_stuff): Save address of shared console stuff - for fork. - -2002-10-13 Christopher Faylor - - * cygthread.cc (cygthread::stub): Reintroduce clearing of __name but do - it before SetEvent to eliminate a race. - (cygthread::terminate): Accumulate list of threads to check for - termination and call WaitForMultipleObjects on list rather than waiting - for each thread individually. - * sigproc.cc (subproc_init): Zap hwait_subproc thread handle since it - is no longer used. - -2002-10-13 Christopher Faylor - - * spawn.cc (spawn_guts): Fix so that cygthread::terminate is *really* - called only for exec. - -2002-10-13 Christopher Faylor - - * cygthread.cc (cygthread::stub): Don't zero __name here. That - introduces a race. - -2002-10-13 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number. - -2002-10-13 Christopher Faylor - - * cygthread.cc (cygthread::stub): Don't create event for long-running - threads. Initialize thread_sync event here which is used to Suspend - using an event rather than relying on SuspendThread/ResumeThread. - (cygthread::init): Save handle to runner thread for future termination. - (cygthread::cygthread): Only resume thread when it is actually - suspended. Otherwise signal thread completion event. - (cygthread::terminate): Forcibly terminate runner thread and any helper - threads. Call DisableThreadLibrary calls if execing. - * cygthread.h (cygthread::thread_sync): Declare. - * dcrt0.cc (do_exit): Eliminate calls to obsolete window_terminate and - shared_terminate. - * exceptions.cc (events_terminate): Don't bother closing title_mutex - since it is going away anyway. - * pinfo.cc (_pinfo::exit): Call cygthread::terminate to ensure that - threads are shut down before process exit or otherwise strange races - seem to occur. - * shared.cc (shared_terminate): Eliminate. - * shared.h (shared_terminate): Eliminate declaration. - * winsup.h (window_terminate): Eliminate declaration. - * spawn.cc (spawn_guts): Call cygthread::terminate early in process if - execing. Call DisableThreadLibrary calls if execing. - * window.cc (Winmain): Call ExitThread to force exit. - (window_terminate): Eliminate. - - * dcrt0.cc (do_exit): Track exit state more closely. - -2002-10-10 Christopher Faylor - - * window.cc (gethwnd): Use SetThreadPriority method. - -2002-10-10 Christopher Faylor - - * Makefile.in (new-cygwin1.dll): Reorganize library order. - - * dcrt0.cc (do_exit): Move thread stuff after vfork stuff or threads - are terminated during vfork. - * sigproc.cc (proc_terminate): Grab proc lock prior to signalling - subproc thread exit to avoid an extra "wait-for-thread-to-exit". - -2002-10-09 Christopher Faylor - - * cygthread.cc (cygthread::stub): Don't create an event for "cygself" - threads. Assume that they exit via an ExitThread call. - * cygthread.h (cygthread::SetThreadPriority): New function. - (cygthread::zap_h): New function. - * dcrt0.cc (do_exit): Move cygthread::terminate earlier and establish - exit_state guard. - * fhandler.h (fhandler_tty_master::output_thread): Delete. - * fhandler_tty.cc (fhandler_tty_master::init): Set priority for threads - via method. Zap handles when done. Don't treat process_output - specially. - (process_output): Call ExitThread directly. - (fhandler_tty_master::fixup_after_fork): Don't worry about - output_thread. - (fhandler_tty_master::fixup_after_exec): Ditto. - * sigproc.cc (proc_terminate): Don't detach from hwait_subproc. Just - let it exit. - (sigproc_init): Close thread handle after initialization. - (wait_sig): Use GetCurrentThread() as SetThreadPriority call rather - than *event* handle. Call ExitThread directly on termination. - (wait_subproc): Call ExitThread directly on termination. - * tty.cc (tty_list::terminate): Don't attempt to detach from - output_thread. - -2002-10-08 Christopher Faylor - - * cygheap.cc (dup_now): Make fatal error a little more informative. - (cygheap_setup_for_child): Detect when default size of shared region is - less than the current size and allocate that much. - (_cbrk): Just return NULL on inability to allocate. - (_cmalloc): Ditto. - * cygheap.h (CYGHEAPSIZE): Change size to reflect newer, tinier - fhandler sizes. - * spawn.cc (av::error): New element, reflects potential errno from cmalloc. - (av::~av): Don't free NULL pointers. - (av::replace0_maybe): Detect out-of-memory conditions. - (av::dup_maybe): Ditto. - (av::dup_all): Ditto. - (av::unshift): Ditto. - (spawn_guts): Set errno and return if argv creation ran into problems. - - * fhandler.h (fhandler_union): Change member names to something safer. - - * fhandler_console.cc (fhandler_console::get_tty_stuff): Always set - fhandler_console::dev_state regardless of whether shared region is - initialized. - - * cygthread.cc (cygthread::runner): Use ExitThread rather than return - (planning for future). - -2002-10-08 Christopher Faylor - - * fhandler.h (dev_console): New class. - (fhandler_console::dev_state): New class element. - (fhandler_console::mouse_aware): Use dev_state element. - (fhandler_console::get_tty_stuff): Declare new function. - * fhandler_console.cc: Use dev_state fhandler_console element, - throughout. - (fhandler_console::get_tty_stuff): Move to fhandler_console class. - Incorporate dev_console information. Move constructor stuff here. - -2002-10-07 Christopher Faylor - - * dtable.cc (dtable::init_std_file_from_handle): Try to mimic standard - open behavior with files redirected from stdin/stdout/stderr, i.e., - fmode settings take precedence over mount settings. - -2002-10-07 Christopher Faylor - - * dtable.cc (unknown_file): New variable. - (dtable::init_std_file_from_handle): Don't set binmode if we couldn't - determine the actual file name on stdin/stdout/stderr. - (handle_to_fn): Return unknown_file when can't determine filename. - -2002-10-07 Christopher Faylor - - * dcrt0.cc (do_exit): Call DisableThreadLibraryCalls since we don't - need to track thread detaches. - * init.cc (dll_entry): Reorganize slightly. Fix api_fatal message. - -2002-10-05 Christopher Faylor - - * cygthread.cc (cygthread::stub): Very minor cleanup. - (cygthread::stub): Report overflows in cygwin thread pool when - DEBUGGING is on and special environment variable is not set. - (cygthread::terminate): Set event only when event actually exists. - * exceptions.cc (signal_exit): Set priority of main thread to low - before setting current thread to high. - -2002-10-01 Robert Collins - - * thread.cc (pthread_key::keys): Copy on fork. Add a comment explaining - why. - (pthreadNull::_instance): Copy on fork. Absolutely no state exists - in pthreadNull. - -2002-09-30 Conrad Scott - - * cygserver_transport_pipes.cc (transport_layer_pipes::accept): - Remove trailing \n from debug_printf. - -2002-09-30 Christopher Faylor - - * thread.cc (pthread_mutex::initMutex): Remove \n from api_fatal. - -2002-09-30 Christopher Faylor - - * thread.cc (pthread::precreate): Use explicit "no inherit" option when - creating mutex. - (pthread_mutex::nativeMutex::init): Ditto. - -2002-09-30 Christopher Faylor - - * thread.cc (pthread_key::keys): Do not copy on fork. - (pthread_mutex::mutexInitializationLock): Ditto. - (pthreadNull::_instance): Ditto. - -2002-09-30 Christopher Faylor - - * exceptions.cc (unused_sig_wrapper): Still need additional level of - indirection when setting errno. - -2002-09-30 Robert Collins - - * thread.cc (pthread_mutex::initMutex): Use the wrapper init call. - (pthread_mutex::nativeMutex::init): Implement. - (pthread_mutex::nativeMutex::lock): Ditto. - (pthread_mutex::nativeMutex::unlock): Ditto. - (pthread_mutex::init): Use the wrapper lock and unlockcalls. - * thread.h (pthread_mutex): Move mutexInitializationLock into a - nativeMutex wrapper class. - -2002-09-30 Christopher Faylor - - Remove \n from calls to strace class printfs throughout. - -2002-09-30 Christopher Faylor - - * exceptions.cc (unused_sig_wrapper): Accommodate newer compilers. - -2002-09-29 Christopher Faylor - - * security.cc (allow_ntsec): Default to zero. - * environ.cc (environ_init): Set allow_ntsec to TRUE by default, - assuming OS allows it. - -2002-09-29 Christopher Faylor - - * environ.cc (environ_init): Avoid a compiler warning. - * path.cc (path_conv::check): Ditto. - * path.h (path_conv::operator int): Ditto. - * regex/engine.c: Ditto throughout. - * regex/regcomp.c: Ditto throughout. - * regex/regexec.c: Ditto throughout. - -2002-09-29 Christopher Faylor - - * thread.cc: Use "%E" in *_printf throughout rather than calling - GetLastError. GNUify comments. - (__pthread_mutex_lock): Don't return error on EBUSY since that just - means that the mutex has already been initialized. - -2002-09-30 Robert Collins - - * pthread.cc (pthread_mutex_init): Use new pthread_mutex::init. - * thread.cc: Change __pthread_mutex_init to pthread_mutex::init - throughout. - (MTinterface::Init): Initialise pthread_mutex support. - (pthread_mutex::mutexInitializationLock): Instantiate. - (pthread_mutex::initMutex): New method. - (__pthread_cond_dowait): Don't dereference untrusted pointers. - Use the new pthread_mutex::init method. - (__pthread_condattr_init): Don't dereference untrusted pointers. - (__pthread_mutex_init): Rename to pthread_mutex::init. - Lock and release mutexInitializationLock to prevent races on - mutex initialisation. - * thread.h (pthread_mutex::initMutex): New method, initialise - pthread_mutex supporting state on process initialisation. - (pthread_mutex::init): Initialise a single mutex. - (pthread_mutex::mutexInitializationLock): A win32 mutex for - syncronising pthread mutex initialisation. - (__pthread_mutex_init): Remove this. - -2002-09-28 Christopher Faylor - - * thread.h (verifyable_object:~verifyable_object): Make virtual. - -2002-09-28 Christopher Faylor - - * cygthread.h (cygthread::terminate): Declare new function. - (cygthread::initialized): Change to 'int'. - * cygthread.cc (cygthread::stub): Exit thread if initialized < 0. - (cygthread::new): Ditto. - (cygthread::runner): Ditto. Set initialized using xor to preserve - sign. - (cygthread::terminate): New function. - * dcrt0.cc (do_exit): Call cygthread::terminate. - -2002-09-27 Robert Collins - - * thread.cc (pthread_key::run_destructor): Run_destructor is not - const as it needs to set the key value. - * thread.h (pthread_key::run_destructor): Ditto. - -2002-09-27 Robert Collins - - * thread.cc (pthread_key::run_destructor): Follow opengroup algorithm. - I.e. only run the destructor NON-NULL key values, and reset the key - to NULL before running the destructor. Reported by Thomas Pfaff. - -2002-09-25 Christopher Faylor - - * cygrun.c (main): Fix setting of CYGWIN environment variable. - - * Makefile.in: Remove linking of unnecessary libraries. - -2002-09-24 Christopher January - - * fhandler_proc.cc (format_process_stat): make ctty a real device - number. - (format_process_status): use effective uid/gid as real and saved - uid/gid. - -2002-09-24 Corinna Vinschen - - * errno.cc (errmap): Map ERROR_INVALID_ADDRESS to new errno code - EOVERFLOW. - (_sys_errlist): Add entries for EILSEQ and EOVERFLOW. - (strerror): Ditto. - * mmap.cc (map_map): Set errno in case of error. - (mmap64): Remove setting errno explicitely to ENOMEM. - -2002-09-24 Corinna Vinschen - - * mmap.cc (map_map): Add debug output. - (mmap64): Evaluate gran_len correctly even if offset isn't 0. - -2002-09-22 Christopher Faylor - - More GNUify non-GNU formatted functions calls throughout. - -2002-09-22 Christopher Faylor - - * Makefile.in (DLL_O_FILES): Restore formatting. - -2002-09-22 Conrad Scott - - GNUify non-GNU formatted functions calls throughout. - -2002-09-22 Conrad Scott - - * cygserver_shm.cc (with_strerr): Remove macro. - (server_shmmgr::segment_t::~segment_t): Remove calls to with_strerr. - (server_shmmgr::segment_t::attach): Ditto. - (server_shmmgr::new_segment): Ditto. - * shm.cc (with_strerr): Remove macro. - (client_shmmgr::shmdt): Remove calls to with_strerr. - (client_shmmgr::attach): Ditto. - -2002-09-22 Conrad Scott - - * include/sys/ipc.h: Move to "include/cygwin/ipc.h". - * include/sys/msg.h: Move to "include/cygwin/msg.h". - * include/sys/sem.h: Move to "include/cygwin/sem.h". - * include/sys/shm.h: Move to "include/cygwin/shm.h". - * include/cygwin/ipc.h: New file. - * include/cygwin/msg.h: Ditto. - * include/cygwin/sem.h: Ditto. - * include/cygwin/shm.h: Ditto. - * cygserver_shm.h: Update includes. - * msg.cc: Ditto. - * sem.cc: Ditto. - -2002-09-22 Conrad Scott - - * safe_memory.h (safe_delete): Make a templated function. - * cygserver.cc (~server_request): Update use of safe_delete. - (main): Ditto. - * cygserver_client.cc (client_request::handle_request): Ditto. - (client_request::make_request): Ditto. - * cygserver_process.cc (~process_cleanup): Ditto. - (process::remove): Ditto. - (process::cleanup): Ditto. - (process_cache::process): Ditto. - * cygserver_shm.cc (server_shmmgr::segment_t::detach): Ditto. - (server_shmmgr::delete_segment): Ditto. - * shm.cc (client_shmmgr::shmdt): Ditto. - * threaded_queue.cc (~threaded_queue): Ditto. - (threaded_queue::worker_loop): Ditto. - -2002-09-22 Conrad Scott - - * safe_memory.h: Replace #include with an explicit - definition of the placement new operator. - (safe_delete): Remove unnecessary ## operator. - -2002-09-22 Conrad Scott - - * cygserver_shm.cc (class server_shmmgr): Remove `cleanup_t' - friend declaration. - (cleanup_t::cleanup_t): Use the segment's shmid as the key rather - than the segment pointer itself. - (cleanup_t::segptr): Remove method. - (cleanup_t::shmid): New method. - (cleanup_t::cleanup): Update for new key value. - (server_shmmgr::find (segment_t *)): Remove method. - * include/cygwin/cygserver_process.h (cleanup_routine::key): Make - method const. - -2002-09-22 Conrad Scott - - * include/cygwin/cygserver_process.h - (cleanup_routine::_key): New field. - (cleanup_routine::cleanup_routine): Initialise new field with new - argument. - (cleanup_routine::operator==): New method. - (cleanup_routine::key): New method. - (cleanup_routine::cleanup): Make argument non-const. - (process::is_active): New method. - (process::remove): Ditto. - (process::check_exit_code): Rename method. - * cygserver_process.cc (process::add): Reorganize code. - (process::remove): New method. - (process::check_exit_code): Rename method. - (process::cleanup): Use new `process::is_active' method. - (process_cache::process): Ditto. - (process_cache::sync_wait_array): Ditto. - (process_cache::check_and_remove_process): Ditto. - * cygserver_shm.cc (server_shmmgr): Make `cleanup_t' a friend. - (segment_t::detach): Make argument non-const. Remove cleanup - object from client if appropriate. - (cleanup_t::_segptr): Remove field. - (cleanup_t::cleanup_t): Initialise parent explicitly. Remove - field. - (cleanup_t::segptr): New method. - (cleanup_t::cleanup): Add error checking and reporting. - (server_shmmgr::shmdt): Make argument non-const. - (server_shmmgr::find (segment_t *)): New method. - -2002-09-22 Conrad Scott - - * cygserver.cc (client_request_shutdown::client_request_shutdown): - Comment out verbose tracing statement. - * cygserver_client.cc - (client_request_get_version::client_request_get_version): Ditto. - (client_request_attach_tty::client_request_attach_tty): Ditto. - * cygserver_shm.cc (client_request_shm::client_request_shm): - Ditto. - -2002-09-22 Conrad Scott - - * cygserver_transport_pipes.cc (transport_layer_pipes::listen): - Set `_is_listening_endpoint' appropriately. - -2002-09-22 Conrad Scott - - * include/cygwin/cygserver_transport.h - (transport_layer_base::listen): Change return type. - (transport_layer_base::connect): Ditto. - * include/cygwin/cygserver_transport_pipes.h - (transport_layer_pipes::listen): Change return type. - (transport_layer_pipes::connect): Ditto. - (transport_layer_pipes::_sec_none_nih): Remove unused field. - (transport_layer_pipes::_is_listening_endpoint): New field. - * cygserver_transport_pipes.cc: Synchronize with sockets code. - (transport_layer_pipes::transport_layer_pipes): Initialise new - field. Separate out asserts. - (transport_layer_pipes::listen): Change return type. Add asserts. - (transport_layer_pipes::accept): Add asserts. - (transport_layer_pipes::read): Change conditional to an assert. - Add assert. - (transport_layer_pipes::write): Ditto. - (transport_layer_pipes::connect): Change return type. Change - conditional to an assert. Add asserts. Rationalize error code - slightly. - (transport_layer_pipes::impersonate_client): Add asserts. - * include/cygwin/cygserver_transport_sockets.h - (transport_layer_sockets::listen): Change return type. - (transport_layer_sockets::connect): Ditto. - (transport_layer_sockets::_addr): Change type of field. - (transport_layer_sockets::_addr_len): Ditto. - (transport_layer_sockets::_is_accepted_endpoint): New field. - (transport_layer_sockets::_is_listening_endpoint): Ditto. - * cygserver_transport_sockets.cc - (MAX_CONNECT_RETRY): New constant. - (transport_layer_sockets::transport_layer_sockets): Initialise new - fields. Only initialise the socket address where necessary. - (transport_layer_sockets::listen): Change return type. Rewrite. - (transport_layer_sockets::accept): Add asserts. Add tracing - statements. Use a local variable to hold the accepted address. - (transport_layer_sockets::close): Add tracing statements. Unlink - the UNIX domain socket file as appropriate. Close the socket - cleanly. - (transport_layer_sockets::read): Rewrite method. - (transport_layer_sockets::write): Ditto. - (transport_layer_sockets::connect): Change return type. Rewrite. - * cygserver.cc (server_submission_loop::request_loop): Run the - listening thread at high priority with special handling for - shutdown. - (main): Print the request error code rather than errno in shutdown - request code. Install signal handlers with sigaction(2) to avoid - setting SA_RESTART. Check value of the listen method call, now it - has one. - * cygserver_client.cc (client_request::make_request): Check new - return value on connect method call. - -2002-09-22 Conrad Scott - - * include/cygwin/cygserver_transport_pipes.h - (cygserver_transport_pipes::_sd): Rename field. - (cygserver_transport_pipes::_sec_none_nih): Ditto. - (cygserver_transport_pipes::_sec_all_nih): Ditto. - (cygserver_transport_pipes::_pipe_name): Ditto. - (cygserver_transport_pipes::_hPipe): Ditto. - (cygserver_transport_pipes::_is_accepted_endpoint): Ditto. - * cygserver_transport_pipes.cc - (transport_layer_pipes::transport_layer_pipes): Rename fields. - (transport_layer_pipes::init_security): Ditto. - (transport_layer_pipes::listen): Ditto. - (transport_layer_pipes::accept): Ditto. - (transport_layer_pipes::close): Ditto. - (transport_layer_pipes::read): Ditto. - (transport_layer_pipes::write): Ditto. - (transport_layer_pipes::connect): Ditto. - (transport_layer_pipes::impersonate_client): Ditto. - (transport_layer_pipes::revert_to_self): Ditto. - * include/cygwin/cygserver_transport_sockets.h - (cygserver_transport_sockets::_fd): Rename field. - (cygserver_transport_sockets::_addr): Ditto. - (cygserver_transport_sockets::_addr_len): Ditto. - * cygserver_transport_sockets.cc - (transport_layer_sockets::transport_layer_sockets): Rename fields. - (transport_layer_sockets::listen): Ditto. - (transport_layer_sockets::accept): Ditto. - (transport_layer_sockets::close): Ditto. - (transport_layer_sockets::read): Ditto. - (transport_layer_sockets::write): Ditto. - (transport_layer_sockets::connect): Ditto. - -2002-09-22 Conrad Scott - - * cygserver_shm.cc (with_strerr): Fix use of %p format. - * shm.cc (client_shmmgr::shmat): Ditto. - (client_shmmgr::shmctl): Ditto. - (client_shmmgr::shmdt): Ditto. - (client_shmmgr::attach): Ditto. - -2002-09-22 Christopher Faylor - - * woutsup.h (system_printf): Remove extraneous semicolon from macro - definition. - -2002-09-22 Conrad Scott - - * cygserver_transport_pipes.cc - (transport_layer_pipes::connect): Use ProtectHandle in DLL code. - (transport_layer_pipes::close): Use ForceCloseHandle in DLL code. - -2002-09-22 Nicholas Wourms - - * threaded_queue.h (class queue_submission_loop): Correct friend - declaration for GCC 3.1.1. - * include/cygwin/cygserver_process.h (class process): Ditto. - (class process_cache): Ditto. - -2002-09-22 Conrad Scott - - * cygserver_shm.cc (server_shmmgr::shmdt): Only call - delete_segment if the segment exists [sic]. - -2002-09-22 Conrad Scott - - * safe_memory.h: Include rather than for gcc 3. - -2002-09-22 Conrad Scott - - * safe_memory.h: New file extracted from "woutsup.h". - * woutsup.h: Move the "safe" new/delete macros into the new - "safe_memory.h" header file and include that here. - * cygserver_client.cc: Explicitly include "safe_memory.h" for - client-side code. - (client_request::make_request): Use the "safe" new/delete macros - unconditionally, i.e. use them on the client side as well as on - the server side. - * cygserver_transport.cc: Explicitly include "safe_memory.h" for - client-side code. - (create_server_transport): Use the "safe" new/delete macros - unconditionally, i.e. use them on the client side as well as on - the server side. - * shm.cc: Include "safe_memory.h". - (client_shmmgr::instance): Use the "safe" new/delete macros. - (client_shmmgr::shmdt): Ditto. - (client_shmmgr::new_segment): Ditto. - -2002-09-22 Conrad Scott - - * cygserver_process (process::process): Add the client's cygpid - and winpid to all tracing statements as appropriate. - (process::exit_code): Ditto. - (process_cache::check_and_remove_process): Ditto. - * cygserver_shm.cc (server_shmmgr::shmat): Ditto. - (server_shmmgr::shmdt): Ditto. - (server_shmmgr::shmctl): Add a process object argument and remove - the explicit cygpid argument. Add the client's cygpid and winpid - to all tracing statements as appropriate. - (server_shmmgr::shmget): Ditto. - (client_request_shm::serve): Update for the new signature of the - shmctl and shmget methods. - -2002-09-22 Conrad Scott - - * cygserver.cc (client_request_shutdown::serve): Don't set the - shutdown flag directly, but send a SIGINT, as the signal handler - sets the flag and the signal breaks the pause(2) in the main loop. - (print_usage): Add new options. - (main): Add new --cleanup-threads and --request-threads options to - set the number of threads used by the daemon. Use pause(2) rather - the win32 Sleep in the main loop. - * shm.cc (shmat): Add sigframe. - (shmctl): Ditto. - (shmdt): Ditto. - (shmget): Ditto. - -2002-09-22 Conrad Scott - - * cygserver_shm.cc: Automatically detach processes from any - segments they are attached to at exit. - (class server_shmmgr::attach_t): New class. - (server_shmmgr::segment_t::IS_DELETED): Rename and make private. - (server_shmmgr::segment_t::_sequence): Make private. - (server_shmmgr::segment_t::_flg): Ditto. - (server_shmmgr::segment_t::_hFileMap): Ditto. - (server_shmmgr::segment_t::_attach_head): New private field. - (server_shmmgr::segment_t::segment_t): Initialise new fields. - Make non-inline. - (server_shmmgr::segment_t::~segment_t): New method. - (server_shmmgr::segment_t::is_deleted): Ditto. - (server_shmmgr::segment_t::is_pending_delete): Ditto. - (server_shmmgr::segment_t::mark_deleted): Ditto. - (server_shmmgr::segment_t::attach): Ditto. - (server_shmmgr::segment_t::detach): Ditto. - (server_shmmgr::segment_t::find): Ditto. - (class server_shmmgr::cleanup_t): New class. - (server_shmmgr::_shm_atts): New private field. - (server_shmmgr::shmat): Add a process object argument to replace - the removed process_cache, cygpid and winpid arguments. Remove - the process_cache manipulations. Move body of code to the - segment_t::attach method. Increment _shm_atts when required. - Update tracing statements. - (server_shmmgr::shmdt): Add a process object argument to replace - the removed cygpid argument. Move body of code to the - segment_t::detach method. Decrement _shm_atts when required. - Update tracing statements. - (server_shmmgr::shmget): Use the new segment_t::is_deleted method. - (server_shmmgr::server_shmmgr): Initialise the new _shm_atts - field. - (server_shmmgr::delete_segment): Remove the CloseHandle code, as - this is now done in the segment_t destructor. - (client_request_shm::serve): Look up the client's process object - and pass to the server_shmmgr::shmat and server_shmmgr::shmdt - methods rather than passing the cache, winpid and cygpid. - * cygserver_process.h: Add a cygpid to the process object to make - it more useful and then pass process objects rather than winpids - where possible. - (cleanup_routine::cleanup): Change argument to be a pointer to a - process object. - (class process): Re-order fields for no discernible reason. - (process::_cygpid): New field. - (process::process): Add a cygpid argument. - (process::winpid): New method. - (process::cygpid): Ditto. - (process::add): Make public, as it always should have been. - (process_cache::process): Add a cygpid argument. - * cygserver_process.cc (process::process): Add a cygpid argument - and use it to initialise the `_cygpid' field. Re-order - initialisers to match new field order. - (process::cleanup): Pass `this' rather than just the winpid to - cleanup_routine::cleanup. - (process_cache::process): Add a cygpid argument and pass it to the - process object constructor. - * include/sys/shm.h (shmatt_t): Make unsigned as per SUSv3. - (shm_info::shm_atts): New field. - -2002-09-22 Conrad Scott - - * cygserver_shm.cc (class server_shmmgr::segment_t): Add `_' - prefix to the names of all fields. - -2002-09-22 Conrad Scott - - * msg.cc: New file of stub functions, no functionality. - * sem.cc: Ditto. - * shm.cc (client_shmmgr::shmctl): Add support for an out shm_info - buffer for the SHM_INFO command. - (client_shmmgr::shmget): Use %X to print keys. - * include/sys/ipc.h: Comment all fields and values. - (IPC_PRIVATE): Change to be non-negative. - * include/sys/msg.h: New file with SUSv3 and ipcs(8) interfaces. - * include/sys/sem.h: Ditto. - * include/sys/shm.h: Comment all fields and values. - (struct shm_info): New struct. - * cygserver_shm.h (client_request_shm::shminfo): Rename. - (client_request_shm::shm_info): New method. - (client_request_shm::_parameters.out.hFileMap): Move into union. - (client_request_shm::_parameters.out.shminfo): Rename. - (client_request_shm::_parameters.out.shm_info): New field. - * cygserver_shm.cc (server_shmmgr::_shm_ids): Rename. - (server_shmmgr::_shm_tot): New field. - (server_shmmgr::shmctl): Rename `out_shminfo' argument. Add - `out_shm_info' argument. Fill in the `out_shm_info' argument in - the SHM_INFO command. - (server_shmmgr::shmget): Check `shmflg' against the mode of - existing segments as per Stevens 1990, p. 123. - (server_shmmgr::server_shmmgr): Initialise the new `_shm_tot' - field. - (server_shmmgr::new_segment): Set ENOMEM if CreateFileMapping - fails. Pass `size' to new_segment. - (server_shmmgr::new_segment): Add size argument and use it to - check against and update the new `_shm_tot' field. - (server_shmmgr::delete_segment): Update the new `_shm_tot' field. - * Makefile.in (DLL_OFILES): Add new DLL object files. - -2002-09-22 Conrad Scott - - * cygserver_transport_pipes.cc: The main change is to make the - client try harder to connect to the server if it's previously - connected, and so has good grounds for believing that the server - is running. - (MAX_WAIT_NAMED_PIPE_RETRY): Change to be an enumerator. - (WAIT_NAMED_PIPE_TIMEOUT): Ditto. - (transport_layer_pipes::accept): Use interlocked operators on - `pipe_instance'. - (transport_layer_pipes::close): Rearrange so that FlushFileBuffers - and DisconnectNamedPipe are only called for accepted endpoints. - Use interlocked operators on `pipe_instance'. - (transport_layer_pipes::read): Use set_errno where required. - (transport_layer_pipes::write): Ditto. - (transport_layer_pipes::connect): Add local static variable - `assume_cygserver'. Set it if a connection is made to cygserver, - clear it if a connection is not made even after retrying. If set, - ignore all errors from CreateFile and retry the connection. Catch - the situation where WaitNamedPipe fails to wait [sic] and add a - `Sleep (0)' so that the server gets a chance to run. - -2002-09-22 Conrad Scott - - * dcrt0.cc: Only check for cygserver if and when required. - (dll_crt0_1): Remove call to `cygserver_init ()'. - * fhandler_tty.cc (fhandler_tty_slave::open): Change the cygserver - logic to allow for the fact that `cygserver_init ()' may not yet - have been called. - (fhandler_tty_slave::cygserver_attach_tty): Tweak the cygserver - request logic to conform to the practice elsewhere in the code. - * tty.cc (tty::common_init): Add an explicit call to - `cygserver_init ()' if it hasn't already been called. - * include/cygwin/cygserver.h (CYGSERVER_UNAVAIL): Rename from - `CYGSERVER_DEAD'. - (client_request_get_version::check_version): Make available in - cygserver as well the DLL. - (check_cygserver_available): Ditto. Remove `check_version_too' - argument. - (cygserver_init): Ditto. And likewise. - * cygserver_client.cc (client_request_get_version::check_version): - Make available in cygserver as well the DLL. - (client_request::make_request): This may now be called without - `cygserver_init ()' having been called first. Detect this and - call it as required. Add tracing. - (check_cygserver_available): Make available in cygserver as well - the DLL. Remove `check_version_too' argument and always check the - version information. And since this is called from within - `cygserver_init ()', force `cygserver_running' before calling - `client_request::make_request ()'. - (cygserver_init): Make available in cygserver as well the DLL. - Remove `check_version_too' argument. - -2002-09-22 Conrad Scott - - * cygserver_shm.cc: Implement the ipcs(8) interfaces, IPC_INFO, - SHM_STAT and SHM_INFO. - (server_shmmgr::segment_t::sequence): New static field. - (server_shmmgr::segment_t::key): Remove field, use the new - ds.shm_perm.key field instead. - (server_shmmgr::segment_t::shmid): Remove field. - (server_shmmgr::segment_t::intid): New field. - (server_shmmgr::segment_t::segment_t): Use the `key' argument to - initialise `ds.shm_perm.key'. Change from using `shmid' to - `intid'. - (server_shmmgr::_shmseg_cnt): Renamed from `_shmid_cnt'. - (server_shmmgr::_intid_max): Renamed from `_shmid_max. - (server_shmmgr::shmat): Move the out arguments to the start of the - argument list. Rename the `pid' argument as `cygpid'. Add - tracing. Pass an intid to `find ()', not a shmid. - (server_shmmgr::shmctl): Add separate out arguments. Rename the - `pid' argument as `cygpid'. Add support for the ipcs(8) - interfaces. Add tracing. Pass an intid to `find ()', not a - shmid. - (server_shmmgr::shmdt): Rename the `pid' argument as `cygpid'. - Add tracing. Pass an intid to `find ()', not a shmid. - (server_shmmgr::shmget): Add a separate out arguments. Rename the - `pid' argument as `cygpid'. Add tracing. - (server_shmmgr::server_shmmgr): Update for new field names. - (server_shmmgr::find_by_key): Update for the new `ds.shm_perm.key' - field. - (server_shmmgr::find): Update to use the new `segment_t::intid' - field. - (server_shmmgr::new_segment): Rename the `pid' argument as - `cygpid'. Check that the requested size is within bounds. Handle - new error result from `new_segment (key, HANDLE)'. - (server_shmmgr::new_segment): Work with intids, not shmids. Check - that the new intid is within bounds. Update for new field names. - (server_shmmgr::delete_segment): Pass an intid to `find ()', not a - shmid. Update for new field names. - (client_request_shm::serve): Check that the incoming message - length is the size of the `_parameters.in' struct, not of the - whole in/out parameter union. Likewise, set the outgoing message - length to the size of the `_parameters.out' struct. Update for - the new server_shmmgr interfaces. - * include/sys/ipc.h (ipc_perm::key): New field. - * include/sys/shm.h (SHM_INFO): New constant. - * cygserver_ipc.h (IPCMNI): New constant. - (ipc_int2ext): Add `sequence' argument and munge this into the - external ipc id. - (ipc_ext2int_subsys): Unmunge the sequence number from the - external ipc id. - (ipc_ext2int): Ditto. - (ipc_inc_id): Remove. - (ipc_dec_id): Remove. - * cygserver_shm.h (SHMMAX): New constant. - (SHMMIN): Ditto. - (SHMMNI): Ditto. - (SHMSEG): Ditto. - (SHMALL): Ditto. - (client_request_shm::_parameters): Re-arrange as a union of two - separate structs, one for in arguments, the other for out. - (client_request_shm::shmid): Update for the new parameter layout. - (client_request_shm::ds): Ditto. - (client_request_shm::info): New method. - * shm.cc (client_shmmgr::_shmat_cnt): New static field. - (client_shmmgr::shmat): Add locking. Add tracing. - (client_shmmgr::shmctl): Update for ipcs(8) commands. Add - tracing. Add more argument checking. - (client_shmmgr::shmdt): Add locking. Add tracing. Update the new - `_shmat_cnt' field. - (client_shmmgr::shmget): Add tracing. - (client_shmmgr::fixup_shms_after_fork): Add tracing. Add - consistency checking. - (client_shmmgr::attach): Add more tracing. - (client_shmmgr::new_segment): Update the new `_shmat_cnt' field. - (client_request_shm::client_request_shm): Update for the new - parameter layout. Set the outgoing message length to the size of - the `_parameters.in' struct, not of the whole in/out parameter - union. - -2002-09-22 Conrad Scott - - * shm.cc: Remove the use of a static client_shmmgr object. - (client_shmmgr::_instance): New static variable. - (client_shmmgr::instance): Allocate a new shmmgr on the heap, - rather than using a local static object. - -2002-09-22 Conrad Scott - - * cygserver_transport.cc (create_server_transport): Fix - cut-and-paste error. - -2002-09-22 Conrad Scott - - * cygserver_client.cc (client_request::handle_request): Don't - bother with the client request activity marker when compiled with - debugging output. - -2002-09-22 Conrad Scott - - * cygserver_transport_pipes.cc - (MAX_WAIT_NAMED_PIPE_RETRY): New constant. - (WAIT_NAMED_PIPE_TIMEOUT): Ditto. - (transport_layer_pipes::close): The `pipe' field is now either - NULL or a valid handle, and it should never have the value - `INVALID_HANDLE_VALUE'. - (transport_layer_pipes::read): Ditto. - (transport_layer_pipes::write): Ditto. - (transport_layer_pipes::connect): Ditto. - (transport_layer_pipes::impersonate_client): Ditto. - (transport_layer_pipes::connect): Ditto. New, but still bogus, - retry logic. - -2002-09-22 Conrad Scott - - * cygserver_shm.cc (server_shmmgr::server_shmmgr): All fields have - to be initialized now that the singleton is no longer static. - -2002-09-22 Conrad Scott - - * cygserver_shm.cc (server_shmmgr::_instance): New static field. - (server_shmmgr::_instance_once): Ditto. - (server_shmmgr::initialise_instance): New static method. - (server_shmmgr::instance): Use a pthread_once_t rather than - relying on a local static variable. - -2002-09-22 Conrad Scott - - * woutsup.h: Remove all uses of the C++ new and delete operators - throughout cygserver until they are fully thread-safe. - (safe_new0): New macro to replace the C++ new operator. - (safe_new): Ditto. - (safe_delete): New macro to replace the C++ delete operator. - * cygserver_client.cc (client_request::handle_request): Replace - all uses of the C++ new and delete operators with the new macros - from "woutsup.h". - (client_request::make_request): Ditto. - * cygserver_process.cc (~process_cleanup): Ditto. - (process::cleanup): Ditto. - (process_cache::process): Ditto. - (process_cache::check_and_remove_process): Ditto. - * cygserver_shm.cc (server_shmmgr::new_segment): Ditto. - (server_shmmgr::delete_segment): Ditto. - * cygserver_transport.cc (create_server_transport): Ditto. - * cygserver_transport_pipes.cc - (transport_layer_pipes::accept): Ditto. - * cygserver_transport_sockets.cc - (transport_layer_sockets::accept): Ditto. - * threaded_queue.cc (~threaded_queue): Ditto. - (threaded_queue::worker_loop): Ditto. - (threaded_queue::stop): Replace sleep(3) with win32 Sleep. - * cygserver.cc (~server_request): Replace all uses of the C++ new - and delete operators with the new macros from "woutsup.h". - (server_submission_loop::request_loop): Ditto. - (main): Ditto. Replace sleep(3) with win32 Sleep. Replace - iostreams with FILEs. - (print_usage): Replace iostreams with FILEs. - (print_version): Ditto. - -2002-09-22 Conrad Scott - - * cygserver_transport_sockets.cc - (transport_layer_sockets::accept): Rename local variable - `accept_fd' to avoid shadowing the `fd' field. - -2002-09-22 Conrad Scott - - * cygwin_ipc.h: Moved (back) to "include/sys/ipc.h". - * cygwin_shm.h: Moved (back) to "include/sys/shm.h". - * include/sys/ipc.h: New file. - * include/sys/shm.h: New file. - * cygserver_shm.h: Update for new header file locations. - * ipc.cc: Ditto. - -2002-09-22 Conrad Scott - - * cygserver_client.cc (client_request::make_request): Comment out - a verbose tracing statement. - * cygserver_process.cc (process_cache::sync_wait_array): Fix - broken assert. - * include/cygwin/cygserver.h (class client_request): Remove excess - use of `class' qualifier in declarations. - (class client_request_get_version): Ditto. - (class client_request_shutdown): Ditto. - (class client_request_attach_tty): Ditto. - -2002-09-22 Conrad Scott - - * cygserver_ipc.h: New file. - * cygserver_shm.h: Re-written from scratch. - * cygserver_shm.cc: Ditto. - * shm.cc: Ditto. - -2002-09-22 Conrad Scott - - * threaded_queue.h (class queue_request): Re-write. - (threaded_queue_thread_function): Remove. - (class queue_process_param): Remove. - (class threaded_queue): Re-write. - (class queue_submission_loop): New version of the old - `queue_process_param' class. - (TInterlockedExchangePointer): New templated function. - (TInterlockedCompareExchangePointer): Ditto. - * threaded_queue.cc (worker_function): Remove. - (class threaded_queue): Re-write. - (class queue_process_param): Remove. - (class queue_submission_loop): New version of the old - `queue_process_param' class. - * include/cygwin/cygserver_process.h (process_cleanup): Re-write. - (class process_process_param): Remove. - (class cleanup_routine): Re-write. - (class process): Re-write. - (class process_cache): Re-write. - * cygserver_process.cc (process_cleanup): Re-write. - (class process_process_param): Remove. - (class cleanup_routine): Re-write. - (class process): Re-write. - (class process_cache): Re-write. - * cygserver.cc (request_count): Remove unused variable. - (class server_request): Move methods inline. - (class server_process_param): Remove. - (class server_request_queue): Remove. - (request_queue): Move into `main ()' and change type to - `threaded_queue'. - (request_loop): Remove. - (class server_submission_loop): New version of the old - `server_process_param' class. - (shutdown_server): New variable. - (client_request_shutdown::serve): Set `shutdown_server' to trigger - shutdown. - (handle_signal): Ditto. - (main): Install signal handler for SIGINT rather than SIGQUIT. - Use new interfaces for the `request_queue' and the `cache'. - Create a `server_submission_loop' and add to the `request_queue'. - Add check for the `shutdown_server' variable to the main loop. - * cygserver_shm.cc (client_request_shm::serve): Release the - process object after use. - -2002-09-22 Conrad Scott - - * cygserver_client.cc (client_request::handle_request): Correct - tracing statement. - * cygserver_transport_pipes.cc: Remove local definition of - FILE_FLAG_FIRST_PIPE_INSTANCE constant. - * cygwin_ipc.h: Update copyright notice. - * cygwin_shm.h: Ditto. - * woutsup.h: Add definition of _WIN32_WINNT. - -2002-09-22 Conrad Scott - - * cygserver_client (client_request::make_request): Replace my - inappropriate use of set_errno () with error_code () throughout. - -2002-09-22 Conrad Scott - - * include/cygwin/cygserver.h: Add forward declarations of class - transport_layer_base and class process_cache to reduce - dependencies between header files. - * include/cygwin/cygserver_process.h: Add include of - "threaded_queue.h". - * cygserver.cc: Remove unnecessary cygserver header files. - * cygserver_client.cc: Ditto. - * cygserver_process.cc: Ditto. - * cygserver_shm.cc: Ditto. - * cygserver_shm.h: Ditto. - * cygserver_transport_pipes.cc: Ditto. - * dcrt0.cc: Ditto. - * fhandler_tty.cc: Ditto. - * tty.cc: Ditto. - -2002-09-22 Conrad Scott - - * cygserver_shm.h: Replace with "cygwin_shm.h" after - merge from HEAD. - * cygwin_ipc.h: Update with changes to include/sys/ipc.h lost in - merge from HEAD. - * cygwin_shm.h: Ditto. - -2002-09-22 Conrad Scott - - * cygserver.cc: The tests for a duplicate server instance are now - the responsibility of the transport layer. - (request_loop): Use new `recoverable' flag in call to - `cygserver_transport::accept ()' and shutdown on an unrecoverable - error. - (main): Never call `cygserver_init ()'. Fake `cygserver_running' - just for sending a shutdown request. - * cygserver_client.cc (client_request::send): Comment out - message-size tracing statements as verbose. - (client_request::handle): Ditto. - (client_request_get_version::check_version): #ifdef as DLL-only. - (check_cygserver_available): Ditto. - (cygserver_init): Ditto. - * include/cygwin/cygserver.h - (client_request_get_version::check_version): #ifdef as DLL-only. - (check_cygserver_available): Ditto. - (cygserver_init): Ditto. - * include/cygwin/cygserver_transport.h - (transport_layer_base::impersonate_client): #ifdef as - cygserver-only. - (transport_layer_base::revert_to_self): Ditto. - (transport_layer_base::listen): Ditto. - (transport_layer_base::accept): Ditto. Add a `recoverable' out - flag for error handling. - * include/cygwin/cygserver_transport_sockets.h: Ditto. - * include/cygwin/cygserver_transport_pipes.h: Ditto. - (transport_layer_pipes): Change type of the `pipe_name' field. - Remove the `inited' field, as unnecessary. Add new - `is_accepted_endpoint' field. - * include/cygwin/cygserver_transport.cc - (transport_layer_base::impersonate_client): #ifdef as - cygserver-only. - (transport_layer_base::revert_to_self): Ditto. - * include/cygwin/cygserver_transport_sockets.cc - (transport_layer_sockets::listen): #ifdef as cygserver-only. - (transport_layer_sockets::accept): #ifdef as cygserver-only. - Analyse any errno from `accept ()' and set `recoverable' as - appropriate. - * cygserver_transport_pipes.cc: Add local #define of - `FILE_FLAG_FIRST_PIPE_INSTANCE'. - (pipe_instance_lock_once): New variable. - (pipe_instance_lock): Ditto. - (pipe_instance): Ditto. - (initialise_pipe_instance_lock): New function. - (transport_layer_pipes::transport_layer_pipes): Change - initialization of `pipe_name'. Initialize `is_accepted_endpoint' - as appropriate. Remove use of `inited'. - (transport_layer_pipes::impersonate_client): #ifdef as - cygserver-only. - (transport_layer_pipes::revert_to_self): Ditto. - (transport_layer_pipes::listen): Ditto. - (transport_layer_pipes::accept): Ditto. Keep track of how often - many named pipes have been created, in the `pipe_instance' - variable, and pass the `FILE_FLAG_FIRST_PIPE_INSTANCE' flag on the - open of the first instance. Analyse the error code from - `CreateNamedPipe ()' and set the `recoverable' flag as - appropriate. - (transport_layer_pipes::close): Update the `pipe_instance' count. - -2002-09-22 Conrad Scott - - * woutsup.h (cygserver_running): Add declaration. - (api_fatal): Eliminate. - * include/cygwin/cygserver.h - (client_request_get_version::check_version): Change return type to - bool. - (check_cygserver_available): New function. - (cygserver_init): Add check_version_too argument. - * cygserver_client.cc (allow_daemon): Make a bool. - (client_request_get_version::make_request): See errno on error. - Remove special case for CYGSERVER_REQUEST_GET_VERSION; this is now - handled in cygserver_init(). - (client_request_get_version::check_version): Use syscall_printf() - instead of api_fatal(). Return true if cygserver version is - compatible. - (check_cygserver_available): New function; code moved here from - cygserver_init(). - (cygserver_init): Move some code into check_cygserver_available(). - * cygserver.cc (__set_errno): Copy from debug.cc so that - set_errno() can be used when __OUTSIDE_CYGWIN__. - (main): Call cygserver_init() to set up cygserver_running and add - checks against this to (try and) prevent multiple copies of - cygserver running simultaneously. Remember to delete all - transport connections so that (one day) the transport classes can - tidy up on cygserver shutdown. - -2002-09-22 Conrad Scott - - * cygserver.cc (main): Adjust tracing output for a cleaner display - when compiled without --enable-debugging. - * threaded_queue.cc (threaded_queue::cleanup): Ditto. - (queue_process_param::stop): Ditto. - * include/cygwin/cygserver.h - (client_request::make_request): Make non-virtual. - (client_request::send): Make virtual and protected, not private. - (client_request_attach_tty::send): New virtual method. - * cygserver_client.cc: Use the `msglen()' accessor rather than - `_header.msglen' throughout. - (client_request_attach_tty::send): New method. - (client_request::make_request): Remove the explicit close of - `transport' as it is closed on deletion. - -2002-09-22 Conrad Scott - - * include/cygwin/cygserver.h: Change the client_request classes to - give greater encapsulation and to allow variable length requests - and replies. - (enum cygserver_request_code): Now client_request::request_code_t. - (class request_header): Now client_request::header_t. Make a - union of the request_code and the error_code. The `cb' field, - which was the buffer length, is now the `size_t msglen' field. - (struct request_get_version): Now - client_request_get_version::request_get_version. - (struct request_shutdown): Remove unused type. - (struct request_attach_tty): Now - client_request_attach_tty::request_attach_tty. - (client_request::_buf): Make field const. - (client_request::_buflen): New const private field. - (client_request::request_code): New accessor. - (client_request::error_code): Ditto. - (client_request::msglen): Ditto. - (client_request::handle_request): New static method. - (client_request::make_request): New virtual method. - (client_request::handle): New method. - (client_request::send): Make private. - (client_request_get_version::check_version): New method. - (client_request_get_version::serve): Make private. - (client_request_get_version::version): Ditto. - (client_request_shutdown::serve): Ditto. - (client_request_attach_tty::req): Ditto. - (client_request_attach_tty::serve): Ditto. - (client_request_attach_tty::from_master): Make method const. - (client_request_attach_tty::from_master): Ditto. - * cygserver_client.cc - (client_request_get_version::client_request_get_version): Track - changes to the client_request classes. - (client_request_attach_tty::client_request_attach_tty): Ditto. - (client_request_get_version::check_version): New method to - encapsulate code from cygserver_init(). - (client_request_shutdown::client_request_shutdown): Move into - "cygserver.cc". - (client_request::send): Track changes to the client_request - classes. Add more error checking. - (client_request::handle_request): New static method containing the - first half of the old server_request::process() code. - (client_request::make_request): New method to replace the old - cygserver_request() function. - (client_request::handle): New method containing the second half of - the old server_request::process() code. - (cygserver_init): Track changes to the client_request classes. In - particular, some code moved into the - client_request_get_version::check_version() method. - * cygserver.cc (client_request_attach_tty::serve): Track changes - to the client_request classes. In particular, only return a reply - body if some handles are successfully duplicated for the client. - And remove goto's. - (client_request_get_version::serve): Track changes to the - client_request classes. - (client_request_shutdown::serve): Ditto. - (class client_request_invalid): Dead, and so young too. - (server_request::request_buffer): Remove unnecessary field. - (client_request_shutdown::client_request_shutdown): Moved here - from "cygserver_client.cc". - (server_request::process): Implementation moved into the new - client_request::handle_request() and client_request::handle() - methods. - * cygserver_shm.h (class client_request_shm): Put client- and - server-specific interfaces inside #ifdef/#ifndef __INSIDE_CYGWIN__ - guards. - (client_request_shm::serve): Make private. - * cygserver_shm.cc - (client_request_shm::client_request_shm): Track changes to the - client_request classes. - (client_request_shm::serve): Ditto - * shm.cc (client_request_shm::client_request_shm): Ditto. Use - alloc_sd() rather than set_security_attribute() to get access to - the SECURITY_DESCRIPTOR length, so that we can use it to set the - request body length. - (shmat): Track changes to the client_request classes. In - particular, allocate client_request objects on the stack rather - than on the heap, and use the client_request::make_request() - method rather than the old cygserver_request() function. - (shmdt): Ditto. - (shmctl): Ditto. - (shmget): Ditto. - * fhandler_tty.cc (fhandler_tty_slave::cygserver_attach_tty): Ditto. - -2002-09-22 Conrad Scott - - * include/cygwin/cygserver_transport.h - (cygserver_transport::read): Change buffer type to void *. - (cygserver_transport::write): Ditto. - * include/cygwin/cygserver_transport_sockets.h - (cygserver_transport_sockets::read): Ditto. - (cygserver_transport_sockets::write): Ditto. - * include/cygwin/cygserver_transport_pipes.h - (cygserver_transport_pipes::read): Ditto. - (cygserver_transport_pipes::write): Ditto. - * cygserver_transport_sockets.cc - (cygserver_transport_sockets::read): Ditto. - (cygserver_transport_sockets::write): Ditto. - * cygserver_transport_pipes.cc - (cygserver_transport_pipes::read): Ditto. Set errno on error, to - match behaviour of cygserver_transport_sockets class. - (cygserver_transport_pipes::write): Ditto. - -2002-09-22 Conrad Scott - - * cygserver.cc (version): New static variable. - (server_request_queue::add_connection): Remove my gratuitous use - of studly caps. - (setup_privileges): Declare static. - (handle_signal): Ditto. - (longopts): Make a local variable of main(). - (opts): Ditto. - (print_usage): New function. - (print_version): Ditto (tip of the hat to Joshua Daniel Franklin - for inspiration here). - (main): More argument checking. Add --help and --version options. - -2002-09-22 Conrad Scott - - * include/cygwin/cygserver.h (client_request::serve): Make pure - virtual. - * cygserver.cc (client_request::serve): Remove definition of pure - virtual method. - (class client_request_invalid): New class. - (server_request::process): Use new client_request_invalid - class. And remove goto's. - -2002-09-22 Conrad Scott - - * cygserver.cc (class server_request): Add virtual destructor. - (server_request_queue::addConnection): New method to replace bad - virtual add() method. - (request_loop): Replace call to queue->add() with call to - queue->addConnection(). - (server_request::server_request): Use field initialization. - (server_request::~server_request): New virtual destructor. - (server_request::process): Remove close and delete of - transport_layer_base object. It is deleted by the server_request's - own destructor and closed by its own destructor. - * include/cygwin/cygserver.h - (client_request::operator request_header): Remove unused method. - * cygserver_client.cc: Ditto. - * include/cygwin/cygserver_process.h - (class cleanup_routine): Add virtual destructor. - (cleanup_routine::cleanup): Make pure virtual. - (class process_cache): Make destructor non-virtual. - (process_cache::add): Ditto. - * cygserver_process.cc - (cleanup_routine::~cleanup_routine): New virtual destructor. - * include/cygwin/cygserver_transport.h - (class transport_layer_base): Add virtual destructor. - * cygserver_transport.cc - (transport_layer_base::~transport_layer_base): New virtual - destructor. - * include/cygwin/cygserver_transport_pipes.h - (class transport_layer_pipes): Add virtual destructor. - * cygserver_transport_pipes.cc - (transport_layer_pipes::~transport_layer_pipes): New virtual - destructor. - (transport_layer_pipes::close): Null out handle after closing. - * include/cygwin/cygserver_transport_sockets.h - (class transport_layer_sockets): Add virtual destructor. - * cygserver_transport_sockets.cc - (transport_layer_sockets::~transport_layer_sockets): New virtual - destructor. - (transport_layer_sockets::close): Null out fd after closing. - * threaded_queue.h (class queue_request): Add virtual destructor. - (queue_request::process): Make pure virtual. - * threaded_queue.cc (~queue_request): New virtual destructor. - (queue_request::process): Remove definition of pure virtual - method. - -2002-09-22 Conrad Scott - - * include/cygwin/cygserver.h (client_request::send): Make - non-virtual. - (class client_request_attach_tty): Put client- and server-specific - interfaces inside #ifdef/#ifndef __INSIDE_CYGWIN__ guards. - * cygserver_client.cc: Ditto. - (cygserver_init): Fix error handling. - -2002-09-22 Conrad Scott - - * cygserver.cc: Throughout the code, check and correct level of - the XXX_printf() functions used. Comment out several of the - debug_printf() calls with "// verbose:". Reformat and correct - typos of some of the XXX_printf() formats. - * cygserver_process.cc: Ditto. - * cygserver_shm.cc: Ditto. - * cygserver_transport_pipes.cc: Ditto. - * cygserver_transport_sockets.cc: Ditto. - * shm.cc (hi_ulong): New function to allow printing of a 64-bit - key with current small_printf implementation. - (lo_ulong): Ditto. - (client_request_shm::client_request_shm): Use hi_ulong() and - lo_ulong() in call to debug_printf(). - -2002-09-22 Conrad Scott - - * cygserver_shm.cc: Remove #define __INSIDE_CYGWIN__ from around - as it no longer contains any internal code. - -2002-09-22 Conrad Scott - - * include/sys/ipc.h (IPC_PRIVATE): Add cast to key_t. - (IPC_INFO): New flag for ipcs(8). - (IPC_RMID IPC_SET IPC_STAT): Renumber. - * include/sys/shm.h (SHM_RDONLY SHM_RND): Renumber with distinct - values [sic]. - (class _shmattach): Internal type moved to "cygserver_shm.h". - (class shmnode): Ditto. - (class shmid_ds): Ditto. - (struct shmid_ds): Add spare fields. - (struct shminfo): New type for IPC_INFO interface. - * cygserver_shm.h: Remove obsolete #if 0 ... #endif block. - (class shm_cleanup): Remove unused class. - (struct _shmattach): Internal type moved from . - (struct shmnode): Ditto. - (struct int_shmid_ds): Ditto. Renamed to avoid name clash with - public interface struct shmid_ds. Use the shmid_bs structure as a - field. - * cygserver_shm.cc: Remove obsolete #if 0 ... #endif block. - (client_request_shm::serve): Update for redefinition of - int_shmid_ds structure. - * shm.cc (build_inprocess_shmds): Ditto. - (fixup_shms_after_fork): Ditto. - (shmctl): Ditto. - (shmget): Ditto. Remove obsolete #if 0 ... #endif code. - -2002-09-22 Conrad Scott - - * include/cygwin/cygserver_transport.h - (transport_layer_base::transport_layer_base): Remove since it is - now redundant. - (transport_layer_base::listen): Make a pure virtual method. - (transport_layer_base::accept): Ditto. - (transport_layer_base::close): Ditto. - (transport_layer_base::read): Ditto. - (transport_layer_base::write): Ditto. - (transport_layer_base::connect): Ditto. - * cygserver_transport.cc - (transport_layer_base::transport_layer_base): Remove since it is - now redundant. - (transport_layer_base::listen): Remove since it is now a pure - virtual method. - (transport_layer_base::accept): Ditto. - (transport_layer_base::close): Ditto. - (transport_layer_base::read): Ditto. - (transport_layer_base::write): Ditto. - (transport_layer_base::connect): Ditto. - -2002-09-22 Conrad Scott - - * cygserver.cc (check_and_dup_handle): Only use security code if - running on NT, i.e. if wincap.has_security(). - (client_request_attach_tty::serve): Add check for has_security(). - * cygserver_process.cc (process_cache::process): Use DWORD winpid - throughout to avoid win32 vs. cygwin pid confusion. - (process::process): Ditto. - * cygserver_shm.cc (client_request_shm::serve): Only use security - code if running on NT, i.e. if wincap.has_security(). - * cygserver_shm.h (client_request_shm::parameters.in): Replace the - ambiguous pid field with cygpid and winpid fields. - (client_request_shm::client_request_shm): Reduce to only two - client-side constructors: one for SHM_CREATE, another for all the - other requests. - * shm.cc (client_request_shm::client_request_shm): - Ditto. Initialize cygpid and winpid fields here. On NT initialize - sd_buf here using set_security_attribute() to make use of the euid - and egid. - (shmat): Use new client_request_shm constructor. - (shmdt): Ditto. - (shmctl): Ditto. - (shmget): Ditto. Remove security code, now performed in the - relevant client_request_shm constructor. - * include/cygwin/cygserver_process.h: (class cleanup_routine): - Change winpid type to DWORD. - (class process): Ditto. - -2002-09-22 Conrad Scott - - * woutsup.h: New file. - * cygserver.cc: Use "woutsup.h" and new XXX_printf macros. - (getfunc): New function, copied verbatim from "strace.cc". - (__cygserver__printf): New function. - * cygserver_client.cc: Use "woutsup.h" and new XXX_printf macros. - * cygserver_process.cc: Ditto. - * cygserver_shm.cc: Ditto. - * cygserver_transport.cc: Ditto. - * cygserver_transport_pipes.cc: Ditto. - * cygserver_transport_sockets.cc: Ditto. - * threaded_queue.cc: Ditto. - * shm.cc: Remove trailing \n from XXX_printf format strings. - * Makefile.in: Remove special __OUTSIDE_CYGWIN__ case for - cygserver_shm.cc. - -2002-09-21 Christopher Faylor - - * init.cc (dll_entry): Temporarily disable thread detach code. - -2002-09-21 Christopher Faylor - - * fhandler.cc (fhandler_base::dup): Don't set handle on failure. - Caller has already taken care of that. - * fhandler_console.cc (fhandler_console::open): Initialize handles to - NULL. - (fhandler_console::close): Ditto. - -2002-09-21 Christopher Faylor - - GNUify non-GNU formatted functions calls throughout. - -2002-09-21 Conrad Scott - - * cygwin_ipc.h: Move to "include/cygwin/ipc.h". - * cygwin_shm.h: Move to "include/cygwin/shm.h". - * include/cygwin/ipc.h: New file. - * include/cygwin/shm.h: New file. - * ipc.c:c Update include. - * cygserver_shm.cc: Update include. - * shm.cc: Ditto. - -2002-09-21 Robert Collins - - * pthread.cc: Use class::call for converted pthread and semaphore - calls. - * thread.cc: Convert various __pthread_call and __sem_call to - pthread::call and sem::call throughout. - * pthread.h (__pthread_cancel): Convert to pthread::cancel. - (__pthread_join): Convert to pthread::join. - (__pthread_detach): Convert to pthread::detach. - (__pthread_create): Convert to pthread::create. - (__pthread_once): Convert to pthread::once. - (__pthread_atfork): Convert to pthread::atfork. - (__pthread_suspend): Convert to pthread::suspend. - (__pthread_continue): Convert to pthread::resume. - (__sem_init): Convert to semaphore::init. - (__sem_destroy): Convert to semaphore::destroy. - (__sem_wait): Convert to semaphore::wait. - (__sem_trywait): Convert to semaphore::trywait. - (__sem_post): Convert to semaphore::post. - -2002-09-21 Robert Collins - - * thread.cc: Finish the removal of the separate pthread_key - destructor list. - Remove all pthread_key_destructor and pthread_key_destructor_list - references throughout. - (pthread::exit): Call the new pthread_key interface to activate - destructors. - (pthread_key::keys): Change into a list. - (pthread_key::saveAKey): New method, used via forEach. - (pthread_key::restoreAKey): Ditto. - (pthread_key::destroyAKey): Ditto. - (pthread_key::fixup_before_fork): Use the List::forEach functionality. - (pthread_key::fixup_after_fork): Ditto. - (pthread_key::runAllDestructors): New method implementation. - (pthread_key::pthread_key): Use List::Insert rather than custom list - code. - (pthread_key::~pthread_key): Use List::Remove for the same reason. - * thread.h: Remove all pthread_key_destructor and - pthread_key_destructor_list references throughout. - (List): Move the interface above pthread_key in the header. - Use atomic operations during insert and delete. - (List::forEach): A generic interface for doing something on each node. - (pthread_key::runAllDestructors): New method, run all destructors. - (pthread_key::fork_buf): Make private. - (pthread_key::run_destructor): Ditto. - (pthread_key::saveAKey): New method for clearer source. - (pthread_key::restoreAKey): Ditto. - (pthread_key::destroyAKey): Ditto. - (MTinterface::destructors): Remove. - -2002-09-21 Robert Collins - - * thread.cc: Partial refactoring of pthread_key destructor - handling. Loosely based on Thomas Pfaff's work. - (pthread_key_destructor_list::Insert): Remove. - (pthread_key_destructor_list::Pop): Remove. - (pthread_key_destructor_list::IterateNull): Call the key's - run_destructor method. - (pthread_key::pthread_key): Initialize new member. - (pthread_key::get): Mark as const for correctness. - (pthread_key::run_destructor): Implement. - * thread.h (pthread_key::get): Mark as const for correctness. - (pthread_key::run_destructor): Declare. - (List): New template class that implements a generic list. - (pthread_key_destructor_list): Inherit from List, and remove - now duplicate functions. - -2002-09-21 Robert Collins - - * thread.cc: Change verifyable_object_isvalid calls with - PTHREAD_CONDATTR_MAGIC, PTHREAD_MUTEXATTR_MAGIC, PTHREAD_COND_MAGIC, - SEM_MAGIC to objecttype::isGoodObject() calls throughout. - (pthread_condattr::isGoodObject): Implement. - (pthread_mutex::isGoodInitializer): Implement. - (pthread_mutex::isGoodInitializerOrObject): Minor bugfix in the - check for verifyable_object_isvalid result. - (pthread_mutexattr::isGoodObject): Implement. - (pthread_cond::isGoodObject): Ditto. - (pthread_cond::isGoodInitializer): Ditto. - (pthread_cond::isGoodInitializerOrObject): Ditto. - (semaphore::isGoodObject): Ditto. - * thread.h (pthread_mutex::isGoodInitializer): Declare. - (pthread_condattr::isGoodObject): Ditto. - (pthread_cond::isGoodObject): Const correctness. - (pthread_cond::isGoodInitializer): Declare. - (pthread_cond::isGoodInitializerOrObject): Ditto. - (semaphore::isGoodObject): Const correctness. - -2002-09-21 Robert Collins - - * thread.cc: Change verifyable_object_isvalid calls with - PTHREAD_MUTEX_MAGIC and PTHREAD_KEY_MAGIC and PTHREAD_ATTR_MAGIC to - ::isGoodObject() calls throughout. - (MTinterface::Init): Remove dead code. - (pthread_attr::isGoodObject): Implement. - (pthread_key::isGoodObject): Implement. - (pthread_mutex::isGoodObject): Implement. - (pthread_mutex::isGoodInitializerOrObject): Implement. - (pthread::isGoodObject): Update signature. - * thread.h (pthread_key::isGoodObject): Declare. - (pthread_attr::isGoodObject): Ditto. - (pthread_mutex::isGoodObject): Ditto. - (pthread_mutex::isGoodInitializerOrObject): Ditto. - (pthread::isGoodObject): Change to a const parameter for const - correctness. - (pthread_mutexattr::isGoodObject): Declare. - (pthread_condattr::isGoodObject): Ditto. - (pthread_cond::isGoodObject): Ditto. - (semaphore::isGoodObject): Ditto. - -2002-09-19 Christopher Faylor - - Cleanup calls to CreateFile throughout. - * dcrt0.cc (__api_fatal): Correctly check for failing return from CreateFile. - * assert.cc (__assert): Don't check return value from CreateFile for NULL. - * fhandler_console.cc (set_console_state_for_spawn): Ditto. - * fork.cc (fork_parent): Ditto. - -2002-09-18 Christopher Faylor - - * cygthread.cc (cygthread::initialized): Avoid copying on fork or some - threads may not end up in the pool. - (cygthread::new): Avoid race when checking for initialized. Add - debugging code. - -2002-09-18 Pierre Humblet - - * fhandler.cc (fhandler_base::raw_read): Add case for - ERROR_INVALID_HANDLE due to Win95 directories. - (fhandler_base::open): Handle errors due to Win95 directories. - (fhandler_base::close): Add get_nohandle () test. - (fhandler_base::set_close_on_exec): Ditto. - (fhandler_base::fork_fixup): Ditto. - (fhandler_base::lock): Change error code to Posix EINVAL. - (fhandler_base::dup): If get_nohandle (), set new value to - INVALID_HANDLE_VALUE instead of NULL. - * fhandler_disk_file.cc (fhandler_disk_file::fstat): Call fstat_by_name - if get_nohandle (). Remove extraneous element from strpbrk. - (fhandler_disk_file::open): Remove test for Win95 directory. - - * fhandler_random.cc (fhandler_dev_random::open): Add set_nohandle (). - * fhandler_clipboard.cc (fhandler_dev_clipboard::open): Ditto. - * fhandler_zero.cc (fhandler_dev_zero::open): Ditto. - (fhandler_dev_zero::close): Delete. - * fhandler.h (class fhandler_dev_zero): Ditto. - -2002-09-17 Robert Collins - - * thread.cc (pthread_key::set): Preserve GetLastError(). Reported - by Thomas Pffaf. - -2002-09-17 Robert Collins - - This work inspires by Thomas Pfaff's pthread_fork patch (1). - * fork.cc (fork_child): Remove MTinterface fixup call, it's - adsorbed by pthread::atforkchild. - Rename __pthread_atforkchild to pthread::atforkchild to give - access to private members. - (fork_parent): Rename __pthread_atforkparent to - pthread::atforkparent to give it access to private members. - Ditto for __pthread_atforkprepare. - * thread.cc: Fix some formatting problems throughout. - (MTinterface::fixup_before_fork): Implement. - (MTinterface::fixup_after_fork): Fix pthread_keys. - (pthread_key::keys): Implement. - (pthread_key::fixup_before_fork): Ditto. - (pthread_key::fixup_after_fork): Ditto. - (pthread_key::pthread_key): Add to pthread_key::keys. - (pthread_key::~pthread_key): Remove from pthread_key::keys. - (pthread_key::saveKeyToBuffer): Implement. - (pthread_key::recreateKeyFromBuffer): Ditto. - (pthread::atforkprepare): Prepare all MT classes for fork. - (pthread::atforkchild): And fix them up afterwards. - * thread.h (pthread_key): Buffer the key value during - fork in fork_buf. - List the keys needing to be fixed up in a linked list with - head pthread_key::keys. - (pthread): Move atfork cygwin internal calls into the class. - (MTInterface): Provide a fixup_before_fork for objecst that - need to save state. - (__pthread_atforkprepare): Remove. - (__pthread_atforkparent): Remove. - (__pthread_atforkchild): Remove. - -2002-09-16 Christopher Faylor - - * init.cc: Cleanup slightly and remove obsolete code. - -2002-09-11 Robert Collins - - * init.cc (dll_entry): On thread detach, if the thread hasn't - exit()ed, do so. - * pthread.cc (pthread_getsequence_np): Remove the - __pthread_getsequence_np wrapper. This requires errno.h. - * thread.cc (pthread::self): Instantiate a new pthread object - when called and none exists. return a NULL object if instantiation - fails. - (pthread::precreate): Factor out common code. - (pthread::postcreate): Ditto. - (pthread::create): Ditto. - (pthread::exit): Remove the TLS value when we exit to prevent - double exits. - (MTinterface::Init): Bugfix - don't mark the TLS index as created - if one was not allocated. - Apply Extract Method to move pthread specific initialisation into - pthread. - (pthread::initMainThread): Extracted method from MTinterface::Init. - (pthread::setTlsSelfPointer): Extracted method from various pthread - calls, to make reading those functions easier. - (pthread::setThreadIdtoCurrent): Ditto. - (pthread::cancel_self): Bring into the .cc file, it's only used - within the class. - (pthread::getThreadId): Ditto. - (pthread::thread_init_wrapper): Apply Extract Method to the TLS - setting logic. - (pthread::isGoodObject): Extracted method from various pthread - wrapper calls, for clarity of reading. - (pthread::getsequence_np): Converted from __pthread_getsquence_np. - (__pthread_create): Apply Extract Method to the object validation. - (__pthread_cancel): Ditto. - (__pthread_join): Ditto. - (__pthread_detach): Ditto. - (__pthread_suspend): Ditto. - (__pthread_continue): Ditto. - (__pthread_getschedparam): Ditto. - (__pthread_getsequence_np): Remove. - (__pthread_setschedparam): Apply Extract Method to the object - validation. - (pthreadNull::getNullpthread): New method, return the pthreadNull - object. - (pthreadNull::pthreadNull): Private constructor to prevent accidental - use. - (pthreadNull::~pthreadNull): Prevent compile warnings. - (pthreadNull::create): Override pthread behaviour. - (pthreadNull::exit): Ditto. - (pthreadNull::cancel): Ditto. - (pthreadNull::testcancel): Ditto. - (pthreadNull::setcancelstate): Ditto. - (pthreadNull::setcanceltype): Ditto. - (pthreadNull::push_cleanup_handler): Ditto. - (pthreadNull::pop_cleanup_handler): Ditto. - (pthreadNull::getsequence_np): Ditto. - (pthreadNull::_instance): Ditto. - * thread.h (pthread): Declare pre- and post-create. - Move GetThreadId to private scope and rename to getThreadId. - Move setThreadIdtoCurrent to private scope. - Make create virtual. - Make ~pthread virtual. - Declare initMainThread. - Declare isGoodObject. - Make exit virtual. - Make cancel virtual. - Make testcancel virtual. - Make setcancelstate virtual. - Make setcanceltype virtual. - Make push_cleanup_handler virtual. - Make pop_cleanup_handler virtual. - Declare getsequence_np. - Declare setTlsSelfPointer. - (pthreadNull): New null object class for pthread. - (__pthread_getsequence_np): Remove. - -2002-09-13 Corinna Vinschen - - * syscalls.cc (seteuid32): Treat ILLEGAL_UID invalid. - (setegid32): Treat ILLEGAL_GID invalid. - -2002-09-10 Pierre Humblet - - * grp.cc (initgroups): Call groups::clear_supp to free the - supplementary group sids that may have been set by setgroups. - * security.cc (cygsidlist::free_sids): Also zero the class members. - * security.h (groups::clear_supp): New. - Rename cygsidlist_unknown to cygsidlist_empty. - -2002-09-08 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::open): Don't protect - input/output handles since they are not properly manipulated later. - * tty.cc (tty::make_pipes): Ditto. - -2002-09-06 Christopher Faylor - - * winsup.h (_WIN32_WINNT): Protect. - -2002-09-06 Christopher Faylor - - * winsup.h (_WIN32_WINNT): Define. - -2002-09-03 Corinna Vinschen - - * Makefile.in (DLL_OFILES): Drop shortcut.o. - * path.cc: Move all shortcut functions from shortcut.c to here. - (check_shortcut): Implement without using COM interface. - * path.h: Move definition of SHORTCUT_HDR_SIZE to here. - * shortcut.c: Remove. - * shortcut.h: Ditto. - -2002-09-03 Conrad Scott - - * fhandler.h (fhandler_socket::read): Remove method. - (fhandler_socket::write): Ditto. - (fhandler_socket::readv): New method. - (fhandler_socket::writev): Ditto. - (fhandler_socket::recvmsg): Add new optional argument. - (fhandler_socket::sendmsg): Ditto. - * fhandler.cc (fhandler_socket::read): Remove method. - (fhandler_socket::write): Ditto. - (fhandler_socket::readv): New method. - (fhandler_socket::writev): Ditto. - (fhandler_socket::recvmsg): Use win32's scatter/gather IO where - possible. - (fhandler_socket::sendmsg): Ditto. - * net.cc (cygwin_recvmsg): Check the msghdr's iovec fields. - (cygwin_sendmsg): Ditto. Add omitted sigframe. - -2002-09-02 Kazuhiro Fujieda - - * cygwin.din: Revert exporting new wchar functions. - * include/cygwin/version.h: Change comment for API minor 62. - -2002-09-02 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Remove getpagesize() call. - * shared.cc (memory_init): Move it here. - -2002-08-31 Christopher January - - * fhandler_proc.cc: Add include. - (format_proc_uptime): Use KernelTime and UserTime only as they include - the other counters. - (format_proc_stat): KernelTime includes IdleTime, so subtract IdleTime - from KernelTime. Make number of 'jiffies' per second same as HZ define. - * fhandler_process.cc: Add include. - (format_process_stat): Make number of 'jiffies' per second same as - HZ define. Use KernelTime and UserTime only to calculate start_time. - -2002-08-30 Christopher Faylor - - (inspired by a patch from Egor Duda) - * select.cc (fhandler_tty_slave::ready_for_read): Remove. - * fhandler.h (fhandler_tty_slave::ready_for_read): Remove declaration. - * fhandler_tty.cc (fhandler_tty_slave::fhandler_tty_slave): Set "don't - need ready for read" flag. - (fhandler_tty_slave::read): Don't do anything special with vtime when - vmin == 0. - -2002-08-30 Egor Duda - - * autoload.cc (GetConsoleWindow): Correct parameter count. - -2002-08-30 Christopher January - Christopher Faylor - - * tty.cc (tty_list::allocate_tty): Use GetConsoleWindow, if available. - Call FindWindow in a loop. - * autoload.cc (GetConsoleWindow): Export - -2002-08-30 Christopher Faylor - - * miscfuncs.cc (check_iovec_for_read): Don't check buffer when zero - length iov_len. - (check_iovec_for_write): Ditto. - -2002-08-27 Conrad Scott - - * fhandler.h (fhandler_base::readv): New method. - (fhandler_base::writev): Ditto. - * fhandler.cc (fhandler_base::readv): New method. - (fhandler_base::writev): Ditto. - * syscalls.cc (_read): Delegate to readv(2). - (_write): Ditto, mutatis mutandi. - (readv): Rewrite, based on the old _read code, to use the new - fhandler_base::readv method. Improve access mode handling and ensure - all calls reach the final strace statement. - (writev): Ditto, mutatis mutandi. - * include/sys/uio.h (struct iovec): Change field types to match SUSv3. - * winsup.h (check_iovec_for_read): New function. - (check_iovec_for_write): Ditto. - * miscfuncs.cc (check_iovec_for_read): Ditto. - (check_iovec_for_write): Ditto. - -2002-08-30 Corinna Vinschen - - * cygwin.din: Add more prototypes for new wchar functions in newlib. - -2002-08-30 Corinna Vinschen - - * cygwin.din: Add prototypes for new wchar functions in newlib. - * include/cygwin/version.h: Bump API minor number. - -2002-08-29 Boris Schaeling - Corinna Vinschen - - * poll.cc (poll): Peek sockets ready for read to see if there's - actually data. - -2002-08-28 Christopher Faylor - - * cygthread.cc (hthreads): Remove unneeded global. - (cygthread::simplestub): New static member function. - (cygthread::runner): Don't set hthreads. - (cygthread::freerange): New member function. - (cygthread::operator new): Call freerange if all cygwin slots are used - up. - (cygthread::exit_thread): Don't mess with event if freerange thread. - (cygthread::detach): Ditto. - * cygthread.h (class cygthread): Declare new member functions and - variables. - -2002-08-28 Christopher Faylor - - * malloc.cc: Protect some definitions to avoid a compile time warning. - -2002-08-27 Nicholas Wourms - - * cygwin.din: Export getc_unlocked, getchar_unlocked, - putc_unlocked, putchar_unlocked functions. - * include/cygwin/version.h: Bump api minor. - -2002-08-28 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::recvfrom): Eliminate flags - not understood by WinSock. - (fhandler_socket::sendto): Ditto. If WinSock sendto() returns - WSAESHUTDOWN, change errno to EPIPE and raise SIGPIPE if MSG_NOSIGNAL - isn't set in flags. - * include/cygwin/socket.h: Define MSG_WINMASK and MSG_NOSIGNAL. - * include/cygwin/version.h: Bump API minor number. - -2002-08-28 Corinna Vinschen - - * poll.cc (poll): Eliminate erroneous POLLERR conditional. - -2002-08-26 Conrad Scott - - * fhandler_socket.cc (fhandler_socket::check_peer_secret_event): - Fix strace message. - (fhandler_socket::connect): Remove sigframe. - (fhandler_socket::accept): Ditto. - (fhandler_socket::getsockname): Ditto. - (fhandler_socket::getpeername): Ditto. - (fhandler_socket::recvfrom): Ditto. - (fhandler_socket::recvmsg): Ditto. - (fhandler_socket::sendto): Ditto. - (fhandler_socket::sendmsg): Ditto. - (fhandler_socket::close): Ditto. - (fhandler_socket::ioctl): Ditto. - * ioctl.cc (ioctl): Add sigframe. - * net.cc (cygwin_sendto): Ditto. - (cygwin_recvfrom): Ditto. - (cygwin_recvfrom): Ditto. - (cygwin_connect): Ditto. - (cygwin_shutdown): Ditto. - (cygwin_getpeername): Ditto. - (cygwin_accept): Ditto. Improve strace message. - (cygwin_getsockname): Ditto. Ditto. - (cygwin_recvmsg): Ditto. Ditto. - (cygwin_sendmsg): Fix strace message. - -2002-08-27 Christopher Faylor - - * child_info.h: Add _PROC_WHOOPS enum value. - (CURR_CHILD_INFO_MAGIC): Update. - (child_info::magic): Make 'long'. - * cygheap.h: Export _cygheap_start. - * cygheap.cc: Don't declare _cygheap_start. - * cygmagic: Use cksum to produce checksums. Append 'U' to end of - checksum. - * dcrt0.cc (initial_env): Calculate sleep ms before reusing buffer. - (_dll_crt0): Detect cygheap mismatch as indicative of different cygwin - version. Set child_proc_info to NULL when _PROC_WHOOPS. - (multiple_cygwin_problem): If child_info specific problem, then set - child_proc_info type to _PROC_WHOOPS. - * shared_info.h (CURR_MOUNT_MAGIC): Update. - (CURR_SHARED_MAGIC): Ditto. - -2002-08-25 Conrad Scott - - * fhandler.h (fhandler_socket::recvfrom): Fix prototype. - (fhandler_socket::sendto): Ditto. - * fhandler_socket.cc (fhandler_socket::recvfrom): Ditto. - (fhandler_socket::sendto): Ditto. - * include/sys/socket.h (recv): Fix prototype. - (recvfrom): Ditto. - (send): Ditto. - (sendto): Ditto. - * net.cc (cygwin_sendto): Ditto. Improve strace message - (cygwin_recvfrom): Ditto. Ditto. - (cygwin_setsockopt): Improve strace message. - (cygwin_getsockopt): Ditto. - (cygwin_connect): Ditto. - (cygwin_accept): Ditto. - (cygwin_bind): Ditto. - (cygwin_getsockname): Ditto. - (cygwin_getpeername): Ditto. - (cygwin_recv): Fix prototype. - (cygwin_send): Ditto. - (cygwin_recvmsg): Improve strace message. - (cygwin_sendmsg): Ditto. - -2002-08-25 Pierre Humblet - - * sec_acl.cc (getacl): Check ace_sid == well_known_world_sid - before owner_sid and group_sid so that well_known_world_sid - means "other" even when owner_sid and/or group_sid are Everyone. - * security.cc (get_attribute_from_acl): Created from code common - to get_nt_attribute() and get_nt_object_attribute(), with same - reordering as in getacl() above. - (get_nt_attribute): Call get_attribute_from_acl(). - (get_nt_object_attribute): Ditto. - -2002-08-26 Christopher Faylor - - * Makefile.in (cygrunk.exe): Make a -mno-cygwin program. - * cygrun.c (main): Export CYGWIN=ntsec unless otherwise set. - - * shared.cc (shared_name): Only add build date to shared name when - *testing*. - -2002-08-24 Christopher Faylor - - * Makefile.in (DLL_IMPORTS): Move libuuid.a and libshell32.a to list - rather than referring to them via -l. Add DLL imports last in link - line for new-cygwin.dll and cygrun.exe. - -2002-08-19 Christopher Faylor - - * pinfo.h (pinfo::remember): Arrange for destructor call if - proc_subproc returns error. - * sigproc.cc (zombies): Store 1 + total zombies since proc_subproc uses - NZOMBIES element. - -2002-08-19 Corinna Vinschen - - * pwdgrp.h (pwdgrp_read::pwdgrp_read): Remove. - (pwdgrp_read::~pwdgrp_read): Ditto. - (pwdgrp_read::open): Reset fh to NULL instead of INVALID_HANDLE_VALUE. - (pwdgrp_read::close): Ditto. - -2002-08-19 Christopher Faylor - - * fhandler.h (fhandler_console::send_winch_maybe): New method. - * fhandler_console.cc (set_console_state_for_spawn): Remove if 0'ed - code. - (fhandler_console::send_winch_maybe): Define new method. - (fhandler_console::read): Use send_winch_maybe where appropriate. - (fhandler_console::init): Just call all tcsetattr rather than - output_tcsetattr. - * select.cc (peek_console): Reorganize so that send_winch_maybe is - called for everything but keyboard input. - -2002-08-18 Christopher Faylor - - * perthread.h (vfork_save): Add ctty, sid, pgid, exitval fields. - (vfork_save::restore_pid): New method. - (vfork_save::restore_exit): New method. - * fork.cc (vfork): Save ctty, sid, pgid and restore them when returning - to "parent". Use exitval field if exiting but never created a new - process. - * syscalls.cc (setsid): Detect when in "vfork" and force an actual fork - so that pid will be allocated (UGLY!). - (getsid): New function. - * dcrt0.cc (do_exit): Use vfork_save::restore_exit method for returning - from a vfork. - * spawn.cc (spawnve): Use vfork_save::{restore_pid,restore_exit} - methods for returning from vfork. - * cygwin.din: Export getsid. - * include/cygwin/version.h: Bump api minor number. - - * malloc.cc: #ifdef sYSTRIm for when MORECORE_CANNOT_TRIM is true. - -2002-08-18 Christopher Faylor - - * cygmalloc.h (MORECORE_CANNOT_TRIM): Define. - -2002-08-18 Christopher Faylor - - * sigproc.cc (sigCONT): Define. - * sigproc.h (sigCONT): Declare. - (wait_sig): Create sigCONT event here. - * exceptions.cc (sig_handle_tty_stop): Wait for sigCONT event rather - than stopping thread. - (sig_handle): Set sigCONT event as appropriate on SIGCONT rather than - calling ResumeThread. - -2002-08-17 Christopher Faylor - - * malloc.cc: Update to 2.7.2. - * malloc_wrapper.cc (malloc_init): Call user level mallocs to determine - if the malloc routines have been overridden. - -2002-08-16 Christopher Faylor - - * winsup.h: Remove malloc_*lock functions. - -2002-08-16 Christopher Faylor - - * Makefile.in: Add support for new malloc.o and renamed - malloc_wrapper.o. Use -fomit-frame-pointer for malloc.o compilation. - * malloc_wrapper.cc: New file. Rename from malloc.cc. Add support for - more malloc functions. Eliminate export_* calls. Just use straight - malloc names. Remove unused argument from malloc lock functions. - * cygwin.din: Just export straight malloc names. Add malloc_stats, - malloc_trim, malloc_usable_size, mallopt, memalign, valloc. - * dcrt0.cc (__cygwin_user): Eliminate export_* malloc entries. - * fork.cc (fork_parent): Remove unused argument from malloc_lock - argument. - * malloc.cc: New file. Doug Lea's malloc v2.7.1. - * cygmalloc.h: New file. - * include/cygwin/version.h: Bump API_MINOR. - - * sync.h (muto::acquire): Use appropriate number for regparm attribute. - (muto::reset): Ditto. - (muto::release): Ditto. - -2002-08-16 Pavel Tsekov - - * exceptions.cc (interrupt_setup): Ensure that the previous signal mask - is properly saved. - -2002-08-15 Thomas Pfaff - - * dcrt0.cc: Modify define for CYGWIN_GUARD. - (alloc_stack_hard_way): Just use CYGWIN_GUARD in VirtualAlloc call. - -2002-08-11 Conrad Scott - - * fhandler.h (fhandler_socket::recv): Remove method. - (fhandler_socket::send): Ditto. - * fhandler_socket.cc (fhandler_socket::recv): Ditto. - (fhandler_socket::send): Ditto. - (fhandler_socket::read): Delegate to fhandler_socket::recvfrom. - (fhandler_socket::write): Delegate to fhandler_socket::sendto. - (fhandler_socket::sendto): Check for null `to' address. - * net.cc (cygwin_sendto): Check for zero request length. - (cygwin_recvfrom): Ditto. Fix signature, use void *buf. - (cygwin_recv): Delegate to cygwin_recvfrom. - (cygwin_send): Delegate to cygwin_sendto. - -2002-08-11 Christopher Faylor - - * cygthread.cc (cygthread::cygthread): Close another race. - -2002-08-11 Christopher Faylor - - * assert.cc (__assert): Call debugger on assertion failure if - debugging. - * dcrt0.cc (dll_crt0_1): Just wait for signal thread to go live rather - than going through the overhead of invoking it. - * fork.cc (fork_child): Ditto. - * exceptions.cc (signal_fixup_after_fork): Call sigproc_init here. - * sigproc.cc (proc_can_be_signalled): Assume that the signal thread is - live. - (sig_dispatch): Ditto. - (sig_send): Ditto. - (wait_for_sigthread): Rename from "wait_for_me". Assume that - wait_sig_inited has been set and that this function is only called from - the main thread. - * sigproc.h (wait_for_sigthread): Declare new function. - -2002-08-08 Christopher Faylor - - * environ.cc (parse_options): Remember the "no" part of any options for - later export. - -2002-08-07 Conrad Scott - - * winsup.h (__check_null_invalid_struct): Make ptr argument non-const. - (__check_null_invalid_struct_errno): Ditto. - * miscfuncs.cc (__check_null_invalid_struct): Ditto. - (__check_null_invalid_struct_errno): Ditto. - (__check_invalid_read_ptr_errno): Remove superfluous cast. - * net.cc (get): Set appropriate errno if fd is not a socket. - (cygwin_sendto): Fix parameter checking. - (cygwin_recvfrom): Ditto. - (cygwin_setsockopt): Ditto. - (cygwin_getsockopt): Ditto. - (cygwin_connect): Ditto. - (cygwin_gethostbyaddr): Ditto. - (cygwin_accept): Ditto. - (cygwin_bind): Ditto. - (cygwin_getsockname): Ditto. - (cygwin_listen): Ditto. - (cygwin_getpeername): Ditto. - (cygwin_send): Ditto. - (cygwin_shutdown): Ditto. Move sigframe to fhandler_socket. - (cygwin_recvmsg): Fix parameter checking. Add tracing. - (cygwin_sendmsg): Ditto. - * fhandler_socket.cc (fhandler_socket::shutdown): Add sigframe. - * resource.cc (setrlimit): Fix parameter checking. - -2002-08-08 Joe Buehler - - * fhandler_socket.cc (fhandler_socket::accept): Fix FIONBIO call. - -2002-08-06 Christopher Faylor - - * cygheap.cc (_csbrk): Avoid !cygheap considerations. - (cygheap_init): Deal with unintialized cygheap issues here. - (cheap_init): Move cygheap_max setting here. - -2002-08-06 Christopher Faylor - Conrad Scott - - * spawn.cc (spawn_guts): Don't set mount_h here. - * sigproc.cc (init_child_info): Set it here instead. - * shared.cc (cygwin_mount_h): Make NO_COPY. - -2002-08-06 Christopher Faylor - - * cygthread.cc (cygthread::stub): Accept flag to pass info structure to - thread function. - (cygthread::operator new): Add defensive debugging output. - (cygthread::cygthread): Add debugging output. Set name after thread - has been awakened to avoid a race. - (cygthread::exit_thread): Use handle operator rather than using ev - directly. - (cygthread::exit_thread): Reorganize to provide debugging. Set __name - to NULL. - * cygthread.h (cygself): Define. - * fhandler_tty.cc (fhandler_tty_master::init): Use cygself as argument - so that invoked thread can access its own info. - (process_output): Derive cygthread info of thread from thread argument. - * sigproc.cc (sigproc_init): Use cygself as argument so that invoked - thread can access its own info. - (wait_sig): Derive cygthread info of thread from thread argument. - -2002-08-06 Conrad Scott - - * debug.h (handle_list::allocated): Remove field. - * debug.cc (newh): Don't malloc extra entries. - (add_handle): Downgrade strace message level. - (delete_handle): Remove case for `allocated' entries. - -2002-08-05 Christopher Faylor - - * cygthread.cc (cygthread::stub): Change event creation to manual - reset. Set __name after calling SetEvent to prevent races. - (cygthread::detach): Always reset event here to prevent races. - -2002-08-03 Conrad Scott - - * debug.h (WaitForMultipleObjects): Correct typo. - -2002-08-01 Pierre Humblet - - * security.cc (verify_token): Do not reject a token just because - the supplementary group list is missing Everyone or a groupsid - equal to usersid, or because the primary group is not in the token, - as long as it is equal to the usersid. - * syscalls.cc (seteuid32): Use common code for all successful returns. - * grp.cc (getgroups32): Never includes Everyone in the output. - -2002-08-01 Christopher Faylor - - * cygthread.cc (cygthread::exit_thread): Define new method. - * cygthread.h (cygthread::exit_thread): Declare new method. - * fhandler.h (fhandler_tty_master::hThread): Delete. - (fhandler_tty_master::output_thread): Define. - * fhandler_tty.cc (fhandler_tty_master::fhandler_tty_master): Adjust - constructor. - (fhandler_tty_master::init): Use cygthread rather than handle. - (process_output): Use cygthread method to exit. - (fhandler_tty_master::fixup_after_fork): Set output_thread to NULL - after fork. - (fhandler_tty_master::fixup_after_exec): Set output_thread to NULL - after spawn/exec. - * tty.cc (tty_list::terminate): Detach from output_thread using - cygthread method. - -2002-08-01 Christopher Faylor - - * syscalls.cc (_link): Revert previous change and just always - dereference the oldpath. - -2002-08-01 Christopher Faylor - - * syscalls.cc (link): Properly deal with a link to a symlink. - -2002-08-01 Christopher Faylor - - * cygthread.cc: Remove cruft. - -2002-08-01 Christopher Faylor - - * Makefile.in (DLL_OFILES): Add cygthread.o. - * dcrt0.cc (dll_crt0_1): Eliminate various thread initialization - functions in favor of new cygthread class. - * debug.cc: Remove thread manipulation functions. - * debug.h: Ditto. - * external.cc (cygwin_internal): Use cygthread method for determining - thread name. Remove capability for setting thread name. - * fhandler_console.cc (fhandler_console::read): Use cygthread method - rather than iscygthread function. - * fhandler_tty.cc (fhandler_tty_master::fhandler_tty_master): Use - cygthread methods to create threads. - (fhandler_tty_common::__acquire_output_mutex): Use cygthread method to - retrieve thread name. - * select.cc (pipeinf): Use cygthread pointer rather than handle. - (start_thread_pipe): Ditto. - (pipe_cleanup): Ditto. - (serialinf): Ditto. - (start_thread_serial): Ditto. - (serial_cleanup): Ditto. - (socketinf): Ditto. - (start_thread_socket): Ditto. - (socket_cleanup): Ditto. - * sigproc.cc (hwait_sig): Ditto. - (hwait_subproc): Ditto. - (proc_terminate): Ditto. - (sigproc_terminate): Ditto. - (sigproc_init): Initialize cygthread hwait_sig pointer. - (subproc_init): Initialize cygthread hwait_subproc pointer. - (wait_sig): Rely on cygthread HANDLE operator. - * strace.cc (strace::vsprntf): Use cygthread::name rather than threadname. - * window.cc (gethwnd): Use cygthread method to initialize thread. - -2002-07-31 Conrad Scott - - * fhandler.h (fhandler_base::get_r_no_interrupt): Make non-virtual. - * net.cc (fdsock): Call set_r_no_interrupt. - -2002-07-30 Christopher Faylor - - * syscalls.cc (_read): Clarify debugging output. - -2002-07-30 Christopher Faylor - - * fhandler.h (fhandler_base::get_r_no_interrupt): Make virtual. - -2002-07-30 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_cygdrive::set_drives): Incorporate . - and .. processing here. - (fhandler_cygdrive::readdir): Assume . and .. are already in pdrive. - (fhandler_cygdrive::seekdir): Ditto. - -2002-07-29 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Move debug_fixup_after_fork_exec. - * cygheap.cc (cygheap_fixup_in_child): Call debug_fixup_after_fork_exec - immediately after cygheap has been set up. - -2002-07-29 Corinna Vinschen - - * security.cc: Change some formatting. - * include/cygwin/version.h: Bump API minor version. - -2002-07-28 Pierre Humblet - - * cygheap.h (class cygheap_user): Add member groups. - * security.h (class cygsidlist): Add members type and maxcount, methods - position, addfromgr, alloc_sids and free_sids and operator+= (const - PSID psid). Modify contains () to call position () and optimize add () - to use maxcount. - (class user_groups): Create. Update declarations of verify_token and - create_token. - * security.cc (cygsidlist::alloc_sids): New. - (cygsidlist::free_sids): New. - (get_token_group_sidlist): Create from get_group_sidlist. - (get_initgroups_sidlist): Create from get_group_sidlist. - (get_group_sidlist): Suppress. - (get_setgroups_sidlist): Create. - (verify_token): Modify arguments. Add setgroups case. - (create_token): Modify arguments. Call get_initgroups_sidlist and - get_setgroups_sidlist as needed. Set SE_GROUP_LOGON_ID from auth_pos - outside of the loop. Rename the various group sid lists consistently. - * syscalls.cc (seteuid32): Modify to use cygheap->user.groups. - (setegid32): Call cygheap->user.groups.update_pgrp. - * grp.cc (setgroups): Create. - (setgroups32): Create. - * uinfo.cc (internal_getlogin): Initialize and update - user.groups.pgsid. - * cygwin.din: Add setgroups and setgroups32. - -2002-07-28 Christopher Faylor - - * fhandler_console.cc (fhandler_console::read): Use appropriate - kill_pgrp method. - * select.cc (peek_console): Ditto. - * fhandler_termios.cc (fhandler_termios::bg_check): Send "stopped" - signal to entire process group as dictated by SUSv3. - * termios.cc (tcsetattr): Detect when stopped signal sent and force a - stop before setting anything. - -2002-07-26 Christopher Faylor - - * include/cygwin/version.h: Bump API version to indicate that ntsec is - on by default now. - -2002-07-26 Conrad Scott - - * fhandler_registry.cc (fhandler_registry::close): Return any error - result to the caller. - * syscalls.cc (_close): Return result of fhandler::close to the caller. - -2002-07-25 Christopher Faylor - - * security.cc (allow_ntsec): Default to on. - (allow_smbntsec): Default to off. - -2002-07-24 David MacMahon - - * times.cc (to_time_t): Always round time_t down to nearest second. - -2002-07-25 Egor Duda - - * Makefile.in: Check if API version is updated when exports are - changed and stop if not so. - -2002-07-24 Egor Duda - - * include/cygwin/version.h: Bump minor API version. - -2002-07-24 Corinna Vinschen - - * fhandler_serial.cc: Change 'must_init_serial_line capability' - to 'supports_reading_modem_output_lines' throughout (negated meaning). - * wincap.cc: Ditto. - * wincap.h: Ditto. - -2002-07-23 Nicholas Wourms - - * cygwin.din (fcloseall): Add symbol for export. - (fcloseall_r): Ditto. - -2002-07-24 Christopher Faylor - - * path.cc (path_conv::check): Always set fileattr when component == 0. - (readlink): Use path_conv method rather than field. - * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Ditto, - throughout. - * path.h (path_conv): Make fileattr private. - * exceptions.cc (try_to_debug): Default to idle priority when looping. - -2002-07-23 Corinna Vinschen - - * fhandler_serial.cc: Use must_init_serial_line capability throughout. - * wincap.cc: Set flag must_init_serial_line appropriately. - * wincap.h: Add flag must_init_serial_line. - -2002-07-23 Corinna Vinschen - - * security.cc (get_group_sidlist): Create group list from /etc files - even if DC is available but access fails. - -2002-07-22 Christopher Faylor - - * fhandler_serial.cc: Fix formatting problems introduced by below - changes. - -2002-07-22 Jacek Trzcinski - - * fhandler.h (class fhandler_serial): Add new members of the class - - rts,dtr and method ioctl(). Variables rts and dtr important for Win 9x - only. - * fhandler_serial.cc (fhandler_serial::open): Add initial setting of - dtr and rts. Important for Win 9x only. - (fhandler_serial::ioctl): New function. Implements commands TIOCMGET, - TIOCMSET and TIOCINQ. - (fhandler_serial::tcflush): Fix found error. - (fhandler_serial::tcsetattr): Add settings of rts and dtr. Important - for Win 9x only. - * termios.h: Add new defines as a support for ioctl() function on - serial device. - -2002-07-20 Christopher Faylor - - * autoload.cc (LoadDLLprime): Add jmp call to allow streamlining of - later jmp rewrite. - (doit): Avoid use of cx register. Just change one word to avoid races. - -2002-07-18 Pierre Humblet - - * security.cc (get_unix_group_sidlist): Create. - (get_supplementary_group_sidlist): Evolve into get_unix_group_sidlist. - (get_user_local_groups): Add check for duplicates. - (get_user_primary_group): Suppress. - (get_group_sidlist): Silently ignore PDC unavailability. - Call get_unix_group_sidlist() before get_user_local_groups(). - Remove call to get_supplementary_group_sidlist(). Never call - get_user_primary_group() as the passwd group is always included. - Add well_known_authenticated_users_sid in only one statement. - -2002-07-19 Christopher Faylor - - * fhandler_serial.cc (fhandler_serial::tcflush): Fix typo. - -2002-07-15 Corinna Vinschen - - * security.cc (get_group_sidlist): Fix formatting. - -2002-07-14 Christopher Faylor - - * dcrt0.cc (initial_env): Force path and CYGWIN_DEBUG contents to lower - case. - * exceptions.cc (error_start_init): Use the name derived from - GetModuleName rather than myself->progname. - -2002-07-14 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Move debug_init call back to here. Avoid a - compiler warning. - * shared.cc (memory_init): Remove debug_init call. - * debug.h (handle_list): Change "clexec" to "inherited". - * debug.cc: Remove a spurious declaration. - (setclexec): Conditionalize away since it is currently unused. - (add_handle): Use inherited field rather than clexec. - (debug_fixup_after_fork_exec): Ditto. Move debugging output to - delete_handle. - (delete_handle): Add debugging output. - * fhandler.cc (fhandler_base::set_inheritance): Don't bother setting - inheritance in debugging table since the handle was never protected - anyway. - (fhandler_base::fork_fixup): Ditto. - - * exceptions.cc (debugger_command): Revert. - -2002-07-14 Conrad Scott - - * debug.cc (clexec): Add missing `hl = hl->next'. - -2002-07-14 Christopher Faylor - - * Makefile.in (cygrun.exe): Add a -lcygwin on the end. - -2002-07-14 Christopher Faylor - - * Makefile.in (cygserver.exe): Add -lstdc++. - (cygrun.exe): Move -lgcc last. - -2002-07-13 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Delay closing of some handles until cygheap - has been set up. - (break_here): New function, for debugging. - (initial_env): Add program name to "Sleeping" message. Implement new - "CYGWIN_DEBUG" environment variable option. - * exceptions.cc (debugger_command): Add argument to dumper call. - * strace.cc (strace::hello): Use winpid if cygwin pid is unavailable. - (strace::vsprntf): Ditto. - -2002-07-13 Christopher Faylor - - * debug.h (handle_list): Move here from debug.cc. Add "inherit" flag - functionality. - * cygheap.cc (init_cheap): Move cygheap_max calculation to _csbrk. - (_csbrk): Reorganize to not assume first allocation is <= 1 page. - (cygheap_setup_for_child): Mark protected handle as inheritable. - * cygheap.h (cygheap_debug): New struct. - (init_cygheap): Add new structure when debugging. - * dcrt0.cc (dll_crt0_1): Remove call to debug_init. Close ppid_handle - here, if appropriate. Don't protect subproc_ready, since it is already - protected in the parent. Call memory_init prior to ProtectHandle to - ensure that cygheap is set up. Call debug_fixup_after_fork_exec when - appropriate. - (_dll_crt0): Don't close ppid_handle here. - * debug.cc: Use cygheap debug structure rather than static elements - throughout. - (add_handle): Don't issue a warning if attempt to protect handle in - exactly the same way from exactly the same place. Add pid info to - warning output. Accept additional argument controlling whether handle - is to be inherited. Add pid to stored information. - (debug_fixup_after_fork_exec): Renamed from debug_fixup_after_fork. - Reorganize to avoid erroneously skipping handles. - (mark_closed): Add pid info to warning output. - (setclexec): Rename from setclexec_pid. - * fhandler.cc (fhandler_base::get_default_fmode): Minor reorg. - (fhandler_base::fstat): Add debugging output. - (fhandler_base::set_inheritance): Call setclexec rather than - setclexec_pid. - (fhandler_base::fork_fixup): Ditto. - * fhandler_console.cc (get_tty_stuff): Mark protected handle as - inheritable. - * fhandler_tty.cc (fhandler_tty_slave::open): Ditto. - * tty.cc (tty::make_pipes): Ditto. - (tty::common_init): Ditto. - * fork.cc (fork_parent): Ditto. - (fork_child): Close protected handles with correct name. Remove - debug_fixup_after_fork call. - * fhandler_socket.cc (fhandler_socket::create_secret_event): Mark - protected handle as inheritable/non-inheritable, as appropriate. - * shared.cc (memory_init): Mark protected handle as inheritable. - Call debug_init here. - * sigproc.cc (wait_sig): Close protected handle with correct name. - * spawn.cc (spawn_guts): Rename spr to subproc_ready and mark it as - inheritable. - - * exceptions.cc (debugger_command): Try to run dumper.exe, if found. - - * syscalls.cc (fstat64): Don't follow symlinks for path_conv lookup - since path is already resolved. - -2002-07-12 Christopher Faylor - - * cygwin.din: Change erroneous entries. - -2002-07-11 Pavel Tsekov - - * fhandler_disk_file.cc (fhandler_disk_file::open): Don't - move the file pointer to the end of file if O_APPEND is - specified in the open flags. - -2002-07-09 Christopher Faylor - - * debug.cc: Avoid explicit zeroing of globals. - (lock_debug): Make locker a static member. Avoid unlocking when - already unlocked (from Conrad Scott). - (debug_init): Initialize lock_debug::locker here. - * fork.cc (fork_child): Fix up fdtab earlier to avoid some (but not - all) confusion with close-on-exec craziness. - -2002-07-05 Corinna Vinschen - - * fhandler.h (fhandler_socket::is_unconnected): Constify. - (fhandler_socket::is_connect_pending): Ditto. - (fhandler_socket::is_connected): Ditto. - (fhandler_socket::set_connect_state): New method. - (struct select_record): Add member `except_on_write'. - (select_record::select_record): Initialize all bool values to `false'. - * fhandler_socket.cc: Use set_connect_state() method throughout. - (fhandler_socket::connect): Set state always to connected if connection - isn't pending. - * net.cc (cygwin_getsockopt): Revert erroneous previous patch. - * select.cc (set_bits): Check for `except_on_write'. Set fd in - write_fds if set. Set connect state to connected if fd has been - returned by WINSOCK_SELECT. - (peek_socket): Check for `except_on_write'. - (start_thread_socket): Ditto. - (fhandler_socket::select_write): Don't set `write_ready' if connect - is pending. Set `except_on_write' if connect is pending. - -2002-07-05 Christopher Faylor - - * ntdll.h (_SYSTEM_PROCESSOR_TIMES): Force eight byte alignment. - (_SYSTEM_TIME_OF_DAY_INFORMATION): Ditto. - - * path.cc (suffix_scan::has): Reorganize to eliminate double scanning - for for .exe (in the typical case). - -2002-07-05 Corinna Vinschen - - * fhandler.h (UNCONNECTED): New define. - (CONNECT_PENDING): Ditto. - (CONNECTED): Ditto. - (class fhandler_socket): Add member `had_connect_or_listen'. - Add member functions `is_unconnected', `is_connect_pending' and - `is_connected'. - * fhandler_socket.cc (fhandler_socket::connect): Set member - `had_connect_or_listen' according to return code of WinSock - call. - (fhandler_socket::listen): Ditto. - * net.cc (cygwin_getsockopt): Modify SO_ERROR return value in - case of socket with pending connect(). - * select.cc (peek_socket): Only add socket to matching fd_set - if it's not "ready". Call WINSOCK_SELECT only if at least one - socket is in one of the fd_sets. - (start_thread_socket): Only add socket to matching fd_set - if it's not "ready". - (fhandler_socket::select_write): Set write_ready to true also - if socket isn't connected or listening. - -2002-07-04 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::set_sun_path): Don't free - memory here. Allow NULL parameter. - -2002-07-04 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::dup): Add missing copy operation - on sun_path. - -2002-07-03 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number. - -2002-07-03 Christopher Faylor - - * include/sys/statfs.h: New header file. - -2002-07-03 Christopher Faylor - - * dtable.cc (cygwin_attach_handle_to_fd): Default to implicit bin mode - if none specified. - * fhandler.cc (fhandler_base::init): Make bin argument a guarantee - rather than a suggestion. - * path.cc (path_conv::check): Load flag returned from - cygwin_conv_to_win32_path into path_flags. - -2002-07-03 Conrad Scott - - * tty.cc (tty::common_init): Reverse logic of cygserver check in - call to SetKernelObjectSecurity. - -2002-07-03 Thomas Pfaff - - * autoload.cc (WSAEventSelect): Define new autoload function. - (WSAEnumNetworkEvents): Ditto. - * fhandler_socket.cc (fhandler_socket::accept): If socket is - in blocking mode wait for incoming connection and signal. - -2002-07-02 Christopher Faylor - - * cygheap.cc (init_cheap): Rearrange error message. - (cygheap_fixup_in_child): Ditto. - * dtable.cc: Remove if 0'ed code. - * fhandler_dsp.cc (fhandler_dev_dsp::open): Force binmode. - * sec_helper.cc (cygsid::get_id): Use system_printf for error message. - * tty.cc (tty::common_init): Ditto. - -2002-07-02 Christopher Faylor - - * net.cc (cygwin_getpeername): Defend against NULL pointer dereference. - -2002-07-02 Egor Duda - - * include/cygwin/version.h: Bump API minor version. - -2002-07-01 Pierre Humblet - - * security.cc (get_logon_server): Interpret a zero length - domain as the local domain. - (get_group_sidlist): Add authenticated users SID to SYSTEM's group - list instead of SYSTEM itself. - (verify_token): Accept the primary group sid if it equals - the token user sid. - -2002-07-02 Corinna Vinschen - - * cygwin.din (__fpclassifyd): Add symbol. - (__fpclassifyf): Ditto. - (__signbitd): Ditto. - (__signbitf): Ditto. - -2002-07-02 Corinna Vinschen - - * security.h (DONT_INHERIT): Eliminate definition. - (INHERIT_ALL): Ditto. - (INHERIT_ONLY): Ditto. - * sec_acl.cc: Use appropriate defines from accctrl.h instead of the - above throughout. - * security.cc: Ditto. - -2002-07-01 Pierre Humblet - - * syscalls.c (seteuid32): Return immediately if the program is not - impersonated and both uid and gid are original. - (setegid32): Return immediately if the new gid is the current egid. - -2002-07-01 Christopher Faylor - - * syscalls.cc (seteuid32): Fix incorrect placement of Pierre's patch - below. - -2002-07-01 Christopher Faylor - - * syscalls.cc (seteuid32): Fix incorrect use of system_printf. - -2002-07-02 Christopher January - - * autoload.cc (GetSecurityInfo): Define new autoload function. - (RegQueryInfoKeyA): Ditto. - * fhandler.h (fhandler_virtual::fill_filebuf): Change return type to - bool. - (fhandler_proc::fill_filebuf): Ditto. - (fhandler_registry::fill_filebuf): Ditto. - (fhandler_process::fill_filebuf): Ditto. - (fhandler_registry::value_name): Add new member. - (fhandler_registry::close): Add new method. - (fhandler_process::p): Remove member. - * fhandler_proc.cc (fhandler_proc::open): Add set_nohandle after - calling superclass method. Check return value of fill_filebuf. - (fhandler_proc::fill_filebuf): Change return type to bool. Add return - statement. - * fhandler_process.cc (fhandler_process::open): Add set_nohandle after - calling superclass method. Remove references to p. Check return value - of fill_filebuf. - (fhandler_process::fill_filebuf): Change return type to bool. Don't - use dereference operator on p. Add return statement. - (fhandler_process::format_process_stat): Fix typo. - * fhandler_registry.cc: Add static open_key declaration. - (fhandler_registry::exists): Assume path is already normalised. Try - opening the path as a key in its own right first, before reverting to - enumerating subkeys and values of the parent key. - (fhandler_registry::fstat): Add additional code to return more relevant - information about the registry key/value. - (fhandler_registry::readdir): Explicitly set desired access when - opening registry key. Remove output of buf from debug_printf format - string. - (fhandler_registry::open): Use set_io_handle to store registry key - handle. Set value_name member. Move code to read a value from the - registry to fill_filebuf. Add call to fill_filebuf. - (fhandler_registry::close): New method. - (fhandler_registry::fill_filebuf): Change return type to bool. Add - code to read a value from registry. - (fhandler_registry::open_key): Make function static. Use KEY_READ as - desired access unless this is the last path component. Check the - return value of RegOpenKeyEx for an error instead of hKey. - * fhandler_virtual.cc (fhandler_virtual::lseek): Check the return value - of fill_filebuf. - (fhandler_virtual::open): Remove call to set_nohandle. - (fhandler_virtual::fill_filebuf): Change return type to bool. Add - return statement. - * security.cc (get_nt_object_attribute): New function. - (get_object_attribute): New function. - * security.h (get_object_attribute): New function declaration. - -2002-07-01 Pierre Humblet - - * syscalls.c (seteuid32): Do not return an error when the token cannot - be created only because of a problem with the gid. - -2002-07-01 Christopher Faylor - - * fhandler_clipboard.c (fhandler_dev_clipboard::open): Force text mode. - * fhandler_console.cc (fhandler_console::open): *Really* force binary - mode rather than make it optional. - * fhandler_proc.cc (fhandler_proc::open): Ditto. - * fhandler_process.cc (fhandler_process::open): Ditto. - * fhandler_random.cc (fhandler_dev_random::fhandler_dev_random): Ditto. - * fhandler_raw.cc (fhandler_dev_raw::open): Ditto. - * fhandler_registry.cc (fhandler_registry::open): Ditto. - * fhandler_tty.cc (fhandler_tty_slave::open): Ditto. - * fhandler_virtual.cc (fhandler_virtual::open): Ditto. - * fhandler_windows.cc (fhandler_windows::open): Ditto. - * fhandler_zero.cc (fhandler_dev_zero::open): Ditto. - * net.cc (fdsock): Ditto. - * path.cc (set_flags): Add more debugging. - -2002-07-01 Christopher Faylor - - * debug.cc (threads): Avoid initialization. - * uinfo.cc (cygheap_user::ontherange): (from Corinna Vinschen) Actually - make below changes work. - -2002-07-01 Christopher Faylor - - * uinfo.cc (cygheap_user::ontherange): Make cygwin root the last resort - for HOMEPATH/HOMEDRIVE for consistency with HOME. - -2002-07-01 Corinna Vinschen - - * shared.cc (sec_none): Move to sec_helper.cc. - (sec_none_nih): Ditto. - (sec_all): Ditto. - (sec_all_nih): Ditto. - (get_null_sd): Ditto. - (sec_acl): Ditto. - (__sec_user): Ditto. - * sec_helper.cc (sec_none): Move from shared.cc to here. - (sec_none_nih): Ditto. - (sec_all): Ditto. - (sec_all_nih): Ditto. - (get_null_sd): Ditto. - (sec_acl): Ditto. - (__sec_user): Ditto. - -2002-06-30 Christopher Faylor - - * uinfo.cc (cygheap_user::ontherange): Potentially set HOME from - existing homepath and homedrive cygheap_user fields (not currently used - yet). Set HOME to / if no other alternative. - (cygheap_user::test_uid): Simplify. - -2002-06-30 Christopher Faylor - - * environ.cc (parse_options): Use setenv to potentially replace CYGWIN - value on export. Fixes broken behavior since November 2000 changes. - (regopt): Return indication of whether or not something has been parsed - from the registry. - (environ_init): Only attempt to export CYGWIN variable when values were - set from the registry. It is exported automatically otherwise. - -2002-06-30 Christopher Faylor - - * fhandler.h (fhandler_process::pid): New field. - (fhandler_process::fstat): Remove unneeded array. Set pid element. - (fhandler_process::open): Ditto. - (fhandler_process::fill_filebuf): Handle case where 'p' field is NULL. - -2002-06-30 Christopher Faylor - - * fhandler.h (fhandler_process::p): New field. - (fhandler_process:fill_filebuf): Revert to same definition as virtual - in parent class. - (fhandler_process::open): Fill out p field rather than passing as an - argument. - (fhandler_process::fill_filebuf): Use p pointer rather than argument. - -2002-06-29 Pierre Humblet - - * security.cc (extract_nt_dom_user): Check for all buffer overflows. - Call LookupAccountSid after trying to get domain & user from passwd. - (get_group_sidlist): Obtain the domain and user by calling - extract_nt_dom_user instead of LookupAccountSid. - -2002-06-29 Christopher Faylor - - * uinfo.cc (cygheap_user::test_uid): Use standard issetuid test. - -2002-06-29 Christopher Faylor - - * autoload.cc (NetGetDCName): Change to make this an optional load - function. - * cygheap.h (cygheap_user::logsrv): Return NULL when operation fails. - (cygheap_user::winname): Ditto. - (cygheap_user::domain): Ditto. - * uinfo.cc (cygheap_user::env_logsrv): Save results in temp variable. - (cygheap_user::env_userprofile): Ditto. - -2002-06-29 Christopher Faylor - - * environ.cc (spenv::retrieve): Detect return of env_dontadd from - cygheap_user methods. - (build_env): Avoid incrementing environment pointer if not actually - adding to the environment. That could result in garbage in the - environment table. Be more defensive when reallocing envblock. - -2002-06-29 Christopher Faylor - - * uinfo.cc (cygheap_user::test_uid): Return NULL or further tests are - sorta useless. - (cygheap_user::env_domain): Recalculate if name is missing. - -2002-06-29 Christopher Faylor - - * environ.cc (spenv::from_cygheap): Still need to take setuid into - consideration. - -2002-06-28 Christopher Faylor - - * uinfo.cc (cygheap_user::env_logsrv): Return "almost_null" in case - where no domain or username is "SYSTEM". - -2002-06-28 Christopher Faylor - - * cygheap.h (cygheap_user): Reorg to accommodate environment caching. - (cygheap_user::logsrv): New method. - (cygheap_user::winname): Ditto. - (cygheap_user::domain): Ditto. - (cygheap_user::test_uid): Ditto. - * cygheap.cc (cygheap_user::set_name): Reflect name "pwinname" name - change. - * environ.cc (getwinenveq): New function. - (penv::from_cygheap): penv::from_cygheap): Change arguments. - (spenv::retrieve): Ditto for call. Use getwinenveq to retrieve info - from environment. Always return value from cygwin environment, if it - exists. - * environ.h (getwinenveq): Declare. - * uinfo.cc (cygheap_user::ontherange): Use logsrv() rather than - env_logsrv(). - (cygheap_user::test_uid): Define new method. - (cygheap_user::env_logsrv): Accept environment arguments. Use test_uid - to find info. - (cygheap_user::env_domain): Ditto. - (cygheap_user::env_userprofile): Ditto. - (cygheap_user::env_homepath): Ditto. - (cygheap_user::env_homedrive): Ditto. - (cygheap_user::env_name): Ditto. - -2002-06-27 Christopher Faylor - - * cygheap.cc (cfree_and_set): New function. - (cygheap_user::set_name): Use cfree_and_set to reset members. - * cygheap.h (cygheap_user): Delete static members. - (cygheap_user::puserprof): New member. - (cfree_and_set): Declare. - * dcrt0.cc (almost_null): Define. - * environ.cc (env_dontadd): Redefine as "almost_null". - * winsup.h (almost_null): Declare. - * syscalls.cc (cfree_and_set): Remove unused variable. - * uinfo.cc (cygheap_user::homepath_env_buf): Eliminate. - (cygheap_user::homedrive_env_buf): Ditto. - (cygheap_user::userprofile_env_buf): Ditto. - (cygheap_user::ontherange): YA change to try to preserve existing - HOMEPATH and HOMEDRIVE. Return almost_null values when variables - should not actually exist. - (cygheap_user::env_logsrv): Ditto. - (cygheap_user::env_domain): Ditto. - (cygheap_user::env_userprofile): Ditto. - -2002-06-27 Corinna Vinschen - - * dcrt0.cc (dll_crt0_1): Let __progname point to the applications - basename. Move eliminating ".exe" suffix from argv[0] so that it - always also affects __progname. - -2002-06-27 Thomas Pfaff - - * thread.cc (pthread::create): Add trace printf to get CreateThread - LastError. - -2002-06-27 Corinna Vinschen - - * mmap.cc (list::match): Check using pagesize aligned size. - -2002-06-26 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::fstat_by_name): Force - FindFirstFile on first file of directory when asking for x:\ . - -2002-06-26 Christopher Faylor - - * cygheap.cc (cygheap_user::set_name): Correct thinko in below change. - -2002-06-26 Christopher Faylor - - * cygheap.cc (cygheap_user::set_name): Avoid clearing things when just - setting name to itself or during first time initialization. - - * environ.cc (check_case_init): Make case insensitive. - -2002-06-26 Corinna Vinschen - - * fhandler.h (fhandler_socket::bind): Add method definition. - (fhandler_socket::connect): Ditto. - (fhandler_socket::listen): Ditto. - (fhandler_socket::accept): Ditto. - (fhandler_socket::getsockname): Ditto. - (fhandler_socket::getpeername): Ditto. - (fhandler_socket::recvfrom): Ditto. - (fhandler_socket::recvmsg): Ditto. - (fhandler_socket::sendto): Ditto. - (fhandler_socket::sendmsg): Ditto. - (fhandler_socket::shutdown): Ditto. - * fhandler_socket.cc (get_inet_addr): Move here from net.cc. - (fhandler_socket::bind): New method. - (fhandler_socket::connect): Ditto. - (fhandler_socket::listen): Ditto. - (fhandler_socket::accept): Ditto. - (fhandler_socket::getsockname): Ditto. - (fhandler_socket::getpeername): Ditto. - (fhandler_socket::recvfrom): Ditto. - (fhandler_socket::recvmsg): Ditto. - (fhandler_socket::sendto): Ditto. - (fhandler_socket::sendmsg): Ditto. - (fhandler_socket::shutdown): Ditto. - * net.cc: Various formatting cleanups throughout. - (get_inet_addr): Move to fhandler_socket.cc. - (cygwin_bind): Move base functionality to appropriate fhandler_socket - method. - (cygwin_connect): Ditto. - (cygwin_listen): Ditto. - (cygwin_accept): Ditto. - (cygwin_getsockname): Ditto. - (cygwin_getpeername): Ditto. - (cygwin_recvfrom): Ditto. - (cygwin_recvmsg): Ditto. - (cygwin_sendto): Ditto. - (cygwin_sendmsg): Ditto. - (cygwin_shutdown): Ditto. - -2002-06-26 Corinna Vinschen - - * pwdgrp.h (pwdgrp_read::~pwdgrp_read): Avoid compiler warning. - -2002-06-26 Christopher Faylor - - * dcrt0.cc (_dcrt0): Be more defensive when reserved block is used and - it's not cygwin info. - -2002-06-26 Christopher Faylor - - * autoload (noload): Avoid clobbering bx register. - - * environ.cc (codepage_init): Use case insensitive match. - - * fhandler_console.cc (cp_get_internal): Delete. - (con_to_str): Use get_cp to derive code page. - (str_to_con): Ditto. - * miscfuncs.cc (get_cp): New function. - (sys_wcstombs): New function. Converted from macro. - (sys_mbstowcs): Ditto. - * winsup.h: Reflect above changes. - -2002-06-26 Christopher Faylor - - * winsup.h: Minor cleanup. - * path.h (path_conv::[]): New operator. - * syscalls.cc (_link): Use path_conv operators rather than methods, - where appropriate. Minor white space cleanup. - -2002-06-26 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number. - -2002-06-25 Thomas Pfaff - - * include/pthread.h (PTHREAD_CANCELED): Define a reasonable value. - * pthread.cc (pthread_exit): Call method instead of function. - (pthread_setcancelstate): Ditto. - (pthread_setcanceltype): Ditto. - (pthread_testcancel): Ditto. - * thread.h (pthread::cancel_event): New member. - (__pthread_cancel_self): New prototype. - (pthread::exit): New Method. - (pthread::cancel): Ditto. - (pthread::testcancel): Ditto. - (pthread::cancel_self): Ditto. - (pthread::static_cancel_self): Ditto. - (pthread::setcancelstate): Ditto. - (pthread::setcanceltype): Ditto. - (__pthread_cancel): Give c++ linkage. - (__pthread_exit): Remove. - (__pthread_setcancelstate): Ditto. - (__pthread_setcanceltype): Ditto. - (__pthread_testcancel): Ditto. - * thread.cc (pthread::pthread): Inititialize cancel_event. - (pthread::~pthread): Close cancel_event if needed. - (pthread::create): Create cancel_event. - (pthread::exit): New method. Replacement for __pthread_exit. - (pthread::cancel): New method. - (pthread::testcancel): Ditto. - (pthread::static_cancel_self); New static method. - (pthread::setcancelstate): New method. Replacement for - __pthread_setcancelstate. - (pthread::setcanceltype): New method. Replacement for - __pthread_setcanceltype. - (pthread::pop_cleanup_handler): Add lock for async cancel safe - cancellation. - (pthread::thread_init_wrapper): Change __pthread_exit to - thread->exit(). - (__pthread_cancel): Call method thread->cancel(). - (__pthread_exit): Remove. - (__pthread_setcancelstate): Ditto. - (__pthread_setcanceltype): Ditto. - (__pthread_testcancel): Ditto. - -2002-06-25 Christopher Faylor - - * dcrt0.cc (sm): Make NO_COPY. - -2002-06-25 Corinna Vinschen - - * syscalls.cc (chown): Convert uid to 32 bit. - (lchown): Ditto. - (fchown): Ditto. - -2002-06-24 Christopher Faylor - - * dtable.cc (dtable::find_unused_handle): Avoid coercion. - -2002-06-24 Christopher Faylor - - * dtable.cc (fhandler_base::dup2): Cleanup. Ensure that lock is turned - off in error condition. - -2002-06-24 Corinna Vinschen - - * uinfo.cc (internal_getlogin): Set myself->uid and myself->gid instead - of user.real_uid and user.real_gid. - (uinfo_init): Evaluate orig_uid and real_uid from myself->uid. Ditto - for gid. - -2002-06-23 Pierre Humblet - - * security.cc (get_group_sidlist): Add pw argument and use pw->pw_name - in call to get_supplementary_group_sidlist. - (create_token): Add pw argument and use it in call to - get_group_sidlist. - * security.h: Add pw argument in declaration of create_token. - * syscalls.cc (seteuid32): Add pw argument in call to create_token. - -2002-06-23 Conrad Scott - - * fhandler.cc (fhandler_base::fstat): Set S_IFIFO for pipes. - * fhandler_socket.cc (fhandler_socket.cc::fstat): Set S_IFSOCK. - -2002-06-23 Christopher Faylor - - * lib/_cygwin_S_IEXEC.cc: Remove obsolete file. - -2002-06-23 Christopher Faylor - - Use cygwin_{shm,ipc}.h instead of /sys/{shm,ipc}.h throughout. - * sys/ipc.h: Remove. - * sys/shm.h: Remove. - * cygwin_ipc.h: New file. - * cygwin_shm.h: New file. - -2002-06-23 Christopher Faylor - - * cygwin.sc: Add recent changes from ld sources. - -2002-06-23 Conrad Scott - - * winsup.h: Move #ifdef EXPCGF code into "winbase.h". - * winbase.h: #ifdef EXPCGF code moved here from "winsup.h". - -2002-06-12 Thomas Pfaff - - * thread.h (pthread::cleanup_stack): Rename cleanup_handlers to - cleanup_stack. - * thread.cc (pthread::pthread): Ditto. - (pthread::create): Fix mutex verification. - (pthread::push_cleanup_handler): Renam cleanup_handlers to - cleanup_stack. Remvoe Mutex calls, use InterlockedExchangePointer - instead. - (pthread::pop_cleanup_handler): Rename cleanup_handlers to - cleanup_stack. - (pthread::pop_all_cleanup_handlers): Ditto. - (__pthread_once): Check state first and return if already done. - (__pthread_join): Revert DEADLOCK test to __pthread_equal call. - (__pthread_detach): Unlock mutex before deletion. - -2002-06-21 Christopher Faylor - - * Makefile.in (cygrun.exe): Move -lgcc where it will do some good. - -2002-06-21 Corinna Vinschen - - * syscalls.cc (stat64_to_stat32): Correctly evaluate st_rdev. - (fstat64): Set st_rdev to same value as st_dev. - (stat_worker): Ditto. - -2002-06-21 Corinna Vinschen - - * security.cc (alloc_sd): Carefully check owner_sid again after trying - SIDs from cygheap. - -2002-06-21 Corinna Vinschen - - * security.cc (alloc_sd): Remove unnecessary retrieval of owner name. - Check uid for current user first and use SIDs from cygheap if so. - Set errno to EINVAL if user SID isn't retrievable. Just print user SID - as debug output. - Don't bail out if group SID isn't retrievable. Change debug output - appropriately. - -2002-06-21 Christopher Faylor - - * errno.cc: Change text description for EBADF throughout. - -2002-06-20 Pierre Humblet - - * uinfo.cc (cygheap_user::ontherange): Use env_name for NetUserGetInfo. - (cygheap_user::env_logsrv): Verify env_domain is valid. - * environ.cc: Include child_info.h and keep spenvs[] sorted. - (environ_init): Check child_proc_info instead of myself->ppid_handle. - -2002-06-19 Christopher Faylor - - * fhandler.cc (fhandler_base::set_flags): Change priority of "linked - in" default binmode setting so that it has priority over optional - setting. - -2002-06-19 Christopher Faylor - - Use hMainProc where appropriate, throughout. - * environ.cc (spenv::retrieve): Add debugging statements. - - * pinfo.cc (set_myself): Don't call strace.hello if already stracing. - * strace.cc (strace): Move NO_COPY keyword so that it will actually - take effect. - -2002-06-19 Corinna Vinschen - - * uinfo.cc (cygheap_user::ontherange): Call NetUserGetInfo() only with - non-NULL logserver parameter. - -2002-06-16 Christopher Faylor - - * cygheap.h (cygheap_user::issetuid): New method. - * dtable.cc (dtable::vfork_child_dup): Use new method to determine if - we are in "setuid mode." - * fork.cc (fork_parent): Ditto. - * spawn.cc (spawn_guts): Ditto. - * syscalls.cc (seteuid32): Ditto. - (setegid32): Ditto. - * environ.cc (spenv::retrieve): (Suggested by Pierre Humblet) Do - potential recalculation of cygheap_user stuff when in setuid mode. - Return special value when environment variable should be calculated but - not added. - (build_env): Don't add retrieved value to dstp if it is 'dont_add'. - -2002-06-16 Christopher Faylor - - Changes suggested by Pierre Humblet. - * environ.cc (NL): New macro. - (conv_envvars): Use NL macro to fill in name and namelen. - (spenv::namelen): New field. - (spenvs): Use NL to fill in name and namelen. - (spenv::retrieve): Eliminate length argument. Instead, use namelen - throughout. - (build_env): Don't calculate length of initial FOO= part of - environment. Accommodate spenv::retrive argument change. - -2002-06-16 Christopher Faylor - - * cygheap.h (cygheap_user::winname): New field. - * cygheap.cc (cygheap_user::set_name): Clear winname when name changes. - * uinfo.cc (cygheap_user::env_logsrv): Avoid calculating server when - Windows user == SYSTEM. - (cygheap_user::env_domain): Set winname here too. - (cygheap_user::env_userprofile): Eliminate superfluous tests. - (cygheap_user::env_name): Seed winname by calling env_domain(). - -2002-06-12 Pierre Humblet - - * spawn.cc (spawn_guts): Revert removal of ciresrv.moreinfo->uid = - ILLEGAL_UID. - -2002-06-15 Christopher Faylor - - * child_info.h (child_proc_info): Declare as base class. - (spawn_info): Declare as alias of child_proc_info to aid debugging. - (fork_info): Ditto. - * cygheap.cc (cygheap_fixup_in_child): Use child_proc_info global - rather than parameter. - * cygheap.h (cygheap_fixup_in_child): Reflect above change in - declaration. - * dcrt0.cc (_dll_crt0): Move 'si' definition here. Assign - child_proc_info. - (dll_crt0_1): Accommodate cygheap_fixup_in_child and *_info changes. - * environ.cc (spenv::retrieve): Make regparm. - * environ.h (environ_init): Ditto. - (win_env::add_cache): Ditto. - (build_env): Ditto. - (getwinenv): Ditto. - * fork.cc (sync_with_parent): Use fork_info global. - (fork_child): Ditto. - -2002-06-14 Christopher Faylor - - * uinfo.cc (cygheap_user::ontherange): Don't set HOMEDRIVE or HOMEPATH - unless one or the other is specified. - -2002-06-14 Christopher Faylor - - * cygheap.h (cygheap_user::userprofile_env_buf): New static member. - * environ.cc (build_env): Add debugging statement. - (spenvs): Switch functions for USERDOMAIN and USERNAME. - * spawn.cc (spawn_guts): Move environment initialization prior to - cygheap_setup_for_child or environment info will never be copied to - child. - -2002-06-14 Christopher Faylor - - * cygheap.h (cygheap_user): Add static members to hold home{drive,path} - info. - * uinfo.cc (cygheap_user::ontherange): Use static class members for - local HOME* storage. - -2002-06-14 Christopher Faylor - - * cygheap.cc (cygheap_user::set_logsrv): Remove. - (cygheap_user::set_domain): Ditto. - * cygheap.h (cygheap_user::set_logsrv): Remove declaration. - (cygheap_user::set_domain): Ditto. - (cygheap_user::env_domain): Declare new method. - (cygheap_user::env_name): Ditto. - * environ.cc (spenvs): Add two environment variables. - * spawn.cc (spawn_guts): Call build_env after RevertToSelf. Always set - ciresrv.mount_h. - (cygheap_user::ontherange): Recalculate homedrive/homepath if they are - empty. Use env_logsrv to get logon server. - (cygheap_user::env_logsrv): Calculate server name here rather than - relying on it having been previously calculated. - (cygheap_user::env_domain): Ditto for domain name. - (cygheap-user::env_name): New method. - -2002-06-12 Pierre Humblet - - * syscalls.cc (seteuid32): Do not get or set the environment. Do not - call LookupAccountSid nor internal_getlogin. Set cygheap->user name - and sid from the passwd entry. - * uinfo.cc (uinfo_init): Only call internal_getlogin when starting from - a non Cygwin process and use the values returned in user. - (internal_getlogin): Simplify to case where starting from a non Cygwin - process. Store return values in user and return void. Do not set the - Windows default environment. - * dcrt0.cc (dll_crt0_1): Call uinfo_init only when needed. Do not set - myself->uid nor reset user.sid. - * spawn.cc (spawn_guts): Get the sid from cygheap->user. Always - RevertToSelf(). Don't set uid in impersonated case. - * cygheap.cc (cygheap_user::set_sid): Do not set orig_sig. - (cygheap_user::set_orig_sid): New. - * cygheap.h: Declare cygheap_user::set_sid. - * winsup.h: Add argument to uinfo_init(). - -2002-06-14 Corinna Vinschen - - * environ.cc (build_env): If realloc moves envblock, move s with it. - -2002-06-13 Nicholas S. Wourms - - * winver.rc: Add more words to copyright. - -2002-06-13 Corinna Vinschen - - * cygheap.cc (cygheap_user::set_name): Revert previous change. - * environ.cc (spenv::retrieve): Check return value of call to - cygheap->user.*from_cygheap(). - -2002-06-13 Corinna Vinschen - - * cygheap.cc (cygheap_user::set_name): Remove setting homedrive and - homepath to NULL. - (cygheap_user::set_logsrv): Fix free'ing of plogsrv. - * cygheap.h (cygheap_user::cygheap_user): Initialize homedrive and - homepath to NULL. - -2002-06-13 Christopher Faylor - - * security.cc (get_logon_server): Use strcasematch rather than - strcasecmp. - -2002-06-12 Christopher Faylor - - * path.cc (chdir): Minor cleanup. - -2002-06-12 Christopher Faylor - - * environ.cc (build_env): Correctly fill out windows environment block - with win32 paths rather than posix paths. - -2002-06-12 Christopher Faylor - - * cygheap.cc (cygheap_user::set_name): Set homedrive and homepath to - NULL on user name change. - (cygheap_user::set_logsrv): Allocate enough space for leading \\ so - that we can put this in the environment, if needed. - * cygheap.h (homebodies): New enum. - (cygheap_user::homedrive): New field. - (cygheap_user::homepath): Ditto. - (cygheap_user::env_logsrv): New method. - (cygheap_user::env_homepath): New method. - (cygheap_user::env_homedrive): New method. - (cygheap_user::env_userprofile): New method. - (cygheap_user::ontherange): New method. - * environ.cc (envsize): Eliminate debugging argument. - (environ_init): Assume that envc counts number of elments not total - size. - (spenv): New class. - (spenvs): New array, rename from forced_winenv_vars, using spenv. - (spenv::retrieve): New method. - (build_env): Rename from 'winenv' -- one stop shopping for building new - environment blocks for both windows and "unix". - * environ.h (build_env: Declare. - (winenv): Delete declaration. - (envsize): Ditto. - * spawn.cc (spawn_guts): Use build_env to build windows and cygwin - environment blocks. - * uinfo.cc (internal_getlogin): Eliminate environment manipulation. - Default to info from GetUserName if it exists. Move HOMEPATH and - HOMEDRIVE stuff elsewhere. Move HOME setting elsewhere. Only set HOME - environment variable in processes that are not parented by a cygwin - process. - (cygheap_user::ontherange): Define new method. - (cygheap_user::env_logsrv): Ditto. - (cygheap_user::env_homepath): Ditto. - (cygheap_user::env_homedrive): Ditto. - (cygheap_user::env_userprofile): Ditto. - -2002-06-11 Christopher Faylor - - * spawn.cc (spawn_guts): More hToken removal cleanup. - -2002-06-09 Pierre Humblet - - * spawn.cc (spawn_guts): Define sec_attribs and call sec_user_nih() - only once. - -2002-06-10 Christopher Faylor - - * Makefile.in: Ensure that -MD gets added to CFLAGS regardless of - CFLAGS command-line setting. - - * cygwin.din: Export sexec* functions as function which returns ENOSYS - (i.e., sexec* is deprecated). - * dtable.cc (dtable::vfork_child_dup): Ensure that impersonation is - restored even on failure. - * exec.cc: Throughout, remove references to sexec* and _spawnve. - * pinfo.h: Remove _spawnve declaration. - * spawn.cc: Rename _spawnve to spawnve and use throughout. - (spawn_guts): Eliminate hToken argument and processing of same. Just - perform special actions if impersonating. - (spawnve): Rename from _spawnve. - -2002-06-10 Christopher Faylor - - * include/sys/strace.h (strace): Avoid use of constructor. - -2002-06-10 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Initialize wincap and check for sanity before - running global ctors. - * wincap.h (wincap): Eliminate constructor. Default is to zero memory, - anyway. - * wincap.cc (wincap): Copy this on fork to avoid initialization in - forked processes. - -2002-06-10 Corinna Vinschen - - * fhandler.h (fhandler_socket::fixup_after_fork): Revert patch from - 2002-06-04. - * fhandler_socket.cc (fhandler_socket::fixup_after_fork): Ditto. - (fhandler_socket::dup): Ditto. - * net.cc (fdsock): Make sockets explicitely noninheritable on NT. - -2002-06-09 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Correctly - set number of links for directory, if appropriate. - -2002-06-10 Robert Collins - - * thread.cc: Variation of a patch from Thomas Pffaf. - (__pthread_detach): Cleanup thread object if the thread has terminated. - (__pthread_join): Change order of error checks, and lock against - join/detach/exit races. - (__pthread_exit): Lock object against join/detach/exit races. - (pthread::thread_init_wrapper): Ditto. - (thread_init_wrapper): Rename to pthread::thread_init_wrapper. - (pthread::create): Check that the mutex initialized correctly. - (pthread::push_cleanup_handler): Lock against potential cancellation - race. NB: this may not be required if pthread_cleanup_push is non- - cancelable. - * thread.h (pthread::mutex): New member. - (thread_init_wrapper): Rename to pthread::thread_init_wrapper. - (pthread::thread_init_wrapper_: New static member. - -2002-06-10 Robert Collins - - * cygwin.din: Add _pthread_cleanup_push and _pthread_cleanup_pop. - * pthread.cc: Change __pthread_self to pthread::self() thruoghout. - (_pthread_cleanup_push): New function. - (_pthread_cleanup_pop): Ditto. - * thread.cc: Thanks to Thomas Pfaff for the pthread cleanup_push,_pop - patch, this work is derived from that. - Change __pthread_self to pthread::self() thruoghout. - (__pthread_self): Rename to pthread::self. - (pthread::self): New method. - (pthread::pthread): Initialize new member. - (pthread::push_cleanup_handler): New method. - (pthread::pop_cleanup_handler): New method. - (pthread::pop_all_cleanup_handlers): New method. - (__pthread_exit): Pop all cleanup handlers. - * thread.h (pthread::push_cleanup_handler): Declare. - (pthread::pop_cleanup_handler): Ditto. - (pthread::pop_all_cleanup_handlers): Ditto. - (pthread::self): New static method. - (__pthread_exit): Give C++ linkage. - (__pthread_join): Ditto. - (__pthread_detach): Ditto. - (__pthread_self): Remove. - -2002-04-24 Thomas Pfaff - - * include/pthread.h (__pthread_cleanup_handler): New structure. - (pthread_cleanup_push): Rewritten. - (pthread_cleanup_pop): Ditto. - (_pthread_cleanup_push): New prototype. - (_pthread_cleanup_pop): Ditto. - -2002-04-24 Thomas Pfaff - - * thread.cc (thread_init_wrapper): Check if thread is already joined. - (__pthread_join): Set joiner first. - (__pthread_detach): Ditto. - -2002-06-10 Robert Collins - - * cygserver_transport.cc (create_server_transport): Finish the split - out of sockets code from transport_layer_base. Thanks to Nicholas - Wourms and Conrad Scott for catching this. - -2002-06-08 Christopher Faylor - - * pinfo.cc (pinfo_dummy): Initialize to correct size. - -2002-06-08 Christopher Faylor - - * path.cc: Change MOUNT_AUTO to MOUNT_CYGDRIVE throughout. - * shared_info.h (CURR_MOUNT_MAGIC): Update. - -2002-06-08 Christopher Faylor - - * external.cc (cygwin_internal): Make v1 mount table access invalid. - * path.cc (mount_info::init): Remove had_to_create_mount_areas initialization. - (mount_info::from_registry): Remove v1 table import. - (mount_info::read_v1_mounts): Eliminate. - (mount_info::import_v1_mounts): Ditto. - * shared_info.h (mount_info): Ditto for both of above. - * sys/mount.h (MOUNT_DEVFS): New enum. - (MOUNT_PROC): Ditto. - -2002-06-08 Christopher Faylor - - * include/wchar.h: Define __need_size_t. - -2002-06-07 Christopher Faylor - - * fhandler_socket.cc (fhandler_socket::fstat): Don't assume that socket - is unix-domain socket. - -2002-06-07 Christopher Faylor - - * times.cc (hires_ms::prime): Set init flag. - -2002-06-07 Conrad Scott - - * times.cc (hires_ms::prime): Adjust epoch of initime_us from 1601 to - 1970. - -2002-06-06 Christopher Faylor - - * autoload.cc (timeGetDevCaps): Define new autoload function. - (timeGetTime): Ditto. - (timeBeginPeriod): Ditto. - (timeEndPeriod): Ditto. - * hires.h (hires_base): New class. Rename from hires. - (hires_us): New class. - (hires_ms): New class. - * strace.cc (strace::microseconds): Use hires_us class. - * times.cc (gettimeofday): Use hires-ms class. - (hires_us::prime): Rename from hires::prime. - (hires_us::usecs): Rename from hires:usecs. - (hires_ms::prime): New method. - (hires_ms::usecs): New method. - (hires_ms::~hires_ms): New destructor. - -2002-06-06 Christopher Faylor - - * autoload.cc (noload): Correctly save argument count register. - -2002-06-05 Conrad Scott - - * fhandler.cc (fhandler_base::fstat): Initialise tv_nsec member of - st_atim, st_mtim, and st_ctim fields. - * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Ditto. - * fhandler_process.cc (fhandler_process::fstat): Ditto. - * glob.c (stat32_to_STAT): Copy across the whole st_atim, st_mtime, and - st_ctim fields. - * syscalls.cc (stat64_to_stat32): Ditto. - * times.cc (to_timestruc_t): New function. - (time_as_timestruc_t): New function. - * winsup.h: Add to_timestruc_t and time_as_timestruc_t functions. - * include/cygwin/stat.h: Replace time_t with timestruc_t throughout for - all file times, removing the st_spare1, st_spare2, and st_spare3 fields - in the process. Add macros to access tv_sec fields by old names. - * include/cygwin/types.h: Typedef timespec_t and timestruc_t as struct - timespec. - -2002-06-03 Pierre Humblet - - * sec_helper.cc (lookup_name): Suppress. - * security.cc (alloc_sd): Remove logsrv argument. - Remove two calls to lookup_name. - (set_security_attribute): Remove logsrv argument. - Remove logsrv argument in call to alloc_sd. - (set_nt_attribute): Remove logsrv argument. - Remove logsrv argument in call to set_security_attribute. - (set_file_attribute): Remove logsrv argument. - Remove logsrv argument in call to set_nt_attribute. - (set_file_attribute): Remove logsrv argument. - Remove logsrv argument in call to set_file_attribute. - * syscalls.cc (chown_worker): Remove logserver argument in - call to set_file_attribute. - (chmod): Ditto. - * shm.cc (shmget): Remove logsrv argument in call to alloc_sd. - * uinfo.cc (internal_getlogin): Replace calls to - lookup_name by call to LookupAccountName. - * security.h: Remove logsrv in declarations of set_file_attribute - and alloc_sd. Remove declaration of lookup_name. - -2002-06-05 Christopher Faylor - - * child_info.h (CHILD_INFO_MAGIC): Oops. Revert previous change. gcc - 3.1 bug? - -2002-06-05 Christopher Faylor - - * child_info.h (CHILD_INFO_MAGIC): Update. - -2002-06-05 Christopher Faylor - - * strace.cc (strace::hello): Set inited, when appropriate. - -2002-06-05 Christopher Faylor - - * cygwin.din: Eliminate some newlib wrappers. - * path.cc (get_devn): Only consider first 99 potential com devices. - (get_device_number): Ditto. - * times.cc (_times): Eliminate. - (_times): Rename from times(). - -2002-06-05 Christopher Faylor - - * dir.cc (rmdir): Streamline. Detect attempts to remove directories - from "read-only" virtual devices. (Suggested by Pavel Tsekov) - * syscalls.cc (unlink): Detect attempts to remove directories from - "read-only" virtual devices. (From Pavel Tsekov) - -2002-06-05 Christopher Faylor - - * dtable.cc (handle_to_fn): Check error return value from NtQueryObject - first before seeing if name buffer is NULL. - - * grp.cc (read_etc_group): Fix gcc warning regarding snprintf format. - * passwd.cc (read_etc_passwd): Ditto. - -2002-04-18 Thomas Pfaff - - * thread.h (pthread::joiner): New member. - * thread.cc (pthread::pthread): Initialize joiner to NULL - (pthread::create): Increment of thread counter moved from - __pthread_create to this location. - (__pthread_create): Increment thread counter removed. - (thread_init_wrapper): Set joiner to self when thread was created - detached. - (__pthread_exit): delete thread when it is detached and not - joined. - (__pthread_join): Check for deadlock and delete thread when it has - terminated. - (__pthread_detach): Set joiner to self when thread state - changed to detached. - -2002-06-05 Corinna Vinschen - - * grp.cc (read_etc_group): When emulating nonexisting group file on - NT systems, read primary group SID from process token. Use that info - to create correct group entry. On error or on 9x systems fallback - to emulating Administrators group as before. - * passwd.cc (read_etc_passwd): When emulating nonexisting passwd file - on NT systems, read user and primary group SID from process token. - Use that info to create correct passwd entry. On error or on 9x - systems fallback to emulating user with Administrator user id and - Administrators group as before. - -2002-06-05 Corinna Vinschen - - * grp.cc (etc_group): Removed. - (parse_grp): Make line parameter nonconst. Don't copy data into new - allocated memory. Check for CR instead of LF to accomodate new - read method. - (add_grp_line): Make line parameter nonconst. - (read_etc_group): Rearrange using new pwdgrp_read class. - * passwd.cc (parse_pwd): Don't copy data into new allocated memory. - Check for CR instead of LF to accomodate new read method. - (read_etc_passwd): Rearrange using new pwdgrp_read class. - * pwdgrp.h (pwdgrp_check::set_last_modified): Use different - parameters. - (class pwdgrp_read): New class for opening and reading passwd and - group files. - -2002-06-04 Christopher Faylor - - * dtable.cc (handle_to_fn): Attempt to handle "raw" accesses to remote - shares. - * path.cc (mount_info::conv_to_win32_path): Set flags to binary when - mount entry is not found. - (mount_info::set_flags_from_win32_path): Ditto. - -2002-06-04 Christopher Faylor - - * dtable.cc (handle_to_fn): Correct placement and length of name - buffer. (Suggested by Pavel Tsekov) - -2002-06-04 Christopher Faylor - - Remove fcntl.h includes throughout. - * fhandler.h: Move fcntl.h include here. - (fhandler_base::set_flags): Accept supplied_bin argument. Make - non-inlined. - * dtable.cc (dtable::init_std_file_from_handle): Just use binmode from - pc. - (reset_to_open_binmode): Use set_flags. - * cygwin.din (open): Avoid newlib wrapper. - (read): Ditto. - (unlink): Ditto. - (write): Ditto. - * fhandler.cc (fhandler_base::set_flags): Accept supplied_bin argument. - Make binmode decisions here. - (fhandler_base::open): Avoid using pc if it is NULL. Eliminate binmode - logic. Just call set_flags with binmode argument. - (fhandler_base::init): Call set_flags with binmode argument. - * fhandler_clipboard.cc (fhandler_dev_clipboard::open): Ditto. - * fhandler_console.cc (fhandler_console::open): Ditto. - (fhandler_console::init): Force binary on open. - * fhandler_disk_file.cc (fhandler_disk_file::open): Don't set binmode - here. Let it happen in base class. - * fhandler_dsp.cc (fhandler_dev_dsp::open): Force binmode open. Set - return value appropriately if unable to open. - * fhandler_proc.cc (fhandler_proc::open): Make sure flags are set - before open_status. - * fhandler_process.cc (fhandler_process::open): Ditto. - * fhandler_registry.cc (fhandler_registry::open): Ditto. - * fhandler_random.cc (fhandler_dev_random::fhandler_dev_random): Ditto. - * fhandler_raw.cc (fhandler_dev_raw::open): Force O_BINARY by default. - * fhandler_serial.cc (fhandler_serial::init): Ditto. - * fhandler_tty.cc (fhandler_tty_slave::open): Ditto. - (fhandler_pty_master::open): Ditto. - * fhandler_virtual.cc (fhandler_virtual::open): Ditto. - * fhandler_windows.cc (fhandler_windows::open): Ditto. - * fhandler_zero.cc (fhandler_dev_zero::open): Ditto. - * net.cc (fdsock): Ditto. - * path.cc (path_conv::check): Avoid checking for executable extension - when directory. (Suggested by Pavel Tsekov) - (set_flags): Set PATH_TEXT explicitly, when appropriate. - (mount_info::conv_to_win32_path): Use set_flags() to set path flags. - * path.h (PATH_TEXT): New enum. - (path_conv::binmode): Return appropriate constant based on binmode. - * pipe.cc (make_pipe): Set binmode to O_TEXT xor O_BINARY. - * syscalls.cc (setmode_helper): Make debugging message a little - clearer. - (setmode): Set binmode via set_flags. - -2002-06-04 Corinna Vinschen - - * fhandler.h (class fhandler_socket): Add private method - fixup_after_fork (bool, HANDLE). - * fhandler_socket.cc (fhandler_socket::fixup_after_fork): Move - functionality to new private method. Add closing parent socket - if not called from dup(). Create method new calling private method - with appropriate parameter. - (fhandler_socket::fixup_after_exec): Call private method - fixup_after_fork with appropriate parameter. - (fhandler_socket::dup): Ditto. - -2002-06-04 Corinna Vinschen - - * fhandler_dsp.cc (fhandler_dev_dsp::open): Set errno to EACCES if - requested mode isn't supported. - -2002-06-03 Christopher Faylor - - * fhandler.cc (fhandler_base::open): Don't set binmode if already set. - Don't check for file. Files should already be set. Report on binary - mode for debugging. - (fhandler_base::fhandler_base): Don't set default binmode here. That's - for later. - * fhandler_console.cc (fhandler_console::output_tcsetattr): Don't set - binmode, ever, for console. - * fhandler_disk_file.cc (fhandler_disk_file::open): Always set the - binary mode to the value derived from mount table. - * path.cc (mount_info::conv_to_win32_path): Default to binmode if path - does not translate into anything in the mount table. - -2002-06-03 Corinna Vinschen - - * external.cc (cygwin_internal): Add CW_EXTRACT_DOMAIN_AND_USER - handling to call extract_nt_dom_user() from applications. - * include/sys/cygwin.h (cygwin_getinfo_types): Add - CW_EXTRACT_DOMAIN_AND_USER. - -2002-06-03 Corinna Vinschen - - * syscalls.cc (stat64_to_stat32): Transform st_dev correctly. - (fstat64): Add evaluating st_ino and st_dev. - (stat_worker): Evaluate st_dev as 32 bit value. - * include/cygwin/stat.h: Use new dev_t definition throughout. - * include/cygwin/types.h: Define __dev16_t and __dev32_t. Define - dev_t according to __CYGWIN_USE_BIG_TYPES__ setting. - * include/sys/sysmacros.h: Define major, minor and makedev - according to __CYGWIN_USE_BIG_TYPES__ setting. - -2002-06-03 Pierre Humblet - - * syscalls.cc (setegid32): Verify the correctness of the gid - of the group returned by getgrgid32. - -2002-06-03 Pierre Humblet - - * security.cc (lsa2wchar): Suppressed. - (get_lsa_srv_inf): Suppressed. - (get_logon_server_and_user_domain): Suppressed. - (get_logon_server): Essentially new. - (get_user_groups): Add "domain" argument. Only lookup the - designated server and use "domain" in LookupAccountName. - (is_group_member): Simplify the arguments. - (get_user_local_groups): Simplify the arguments. Do only a - local lookup. Use "BUILTIN" and local domain in LookupAccountName. - (get_user_primary_group). Only lookup the designated server. - (get_group_sidlist): Remove logonserver argument. Do not lookup - any server for the SYSTEM account. - (create_token): Delete logonserver and call to get_logon_server. - Adjust arguments of get_group_sidlist, see above. - * security.h: Delete declaration of get_logon_server_and_user_domain - and add declaration of get_logon_server. - * uinfo.cc (internal_get_login): Call get_logon_server instead of - get_logon_server_and_user_domain. - -2002-06-02 Christopher Faylor - - * dtable.cc (handle_to_fn): Use largest match for device. Correctly - (?) deal with remote drive weirdness. - -2002-06-02 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::fstat_by_name): Check - specifically for non-existent file, first. - (fhandler_disk_file::fstat): Perform fd open on files with funny - characters. - -2002-06-02 Christopher January - - * fhandler_process.cc (fhandler_process::open): Set fileid. - -2002-06-02 Christopher Faylor - - Remove unneeded sigproc.h includes throughout. - * fhandler.h (fhandler_proc::fill_filebuf): Take a pinfo argument. - * fhandler_proc.cc (fhandler_proc::get_proc_fhandler): Simplify search - for given pid. - (fhandler_proc::readdir): Assume that pid exists if it shows up in the - winpid list. - * fhandler_process.cc (fhandler_process::open): Simplify search for - given pid. Call fill_filebuf with pinfo argument. - (fhandler_process::fill_filebuf): Pass pinfo here and assume that it - exists. - * pinfo.h (pinfo::remember): Define differently if sigproc.h is not - included. - -2002-06-02 Christopher Faylor - - * dll_init.cc (dll_list::detach): Don't run destructor on exit. - -2002-06-01 Christopher Faylor - - * fhandler.cc (fhandler_base::fstat): Move dev and ino calculation into - caller. - * syscalls.cc (stat_worker): Calculate dev and ino calculation here, if - zero. - * fhandler_proc.cc (fhandler_proc::fhandler_proc): Minor reorg for - debugging. - * fhandler_process.cc (fhandler_process::exists): Return 0 on - nonexistence. - (fhandler_process::fstat): Simplify pid logic. - * fhandler_tape.cc (fhandler_dev_tape::fstat): Minor reformatting. - -2002-06-01 Christopher Faylor - - * path.cc (chdir): Don't allow cd'ing to a non-directory virtual path. - -2002-05-31 Christopher Faylor - - * fhandler_disk_file.cc (readdir): Move inode calculation into caller. - (fhandler_cygdrive::readdir): Add "." and "..". - * dir.cc (readdir): Move inode calculation here so that fhandler - readdirs can benefit. - -2002-05-31 Christopher Faylor - - * fhandler_console.cc (fhandler_console::open): Reinstate setting of - flags. - - * dtable.cc (dtable::init_std_file_from_handle): Default to using - binmode derived from path_conv, when required. - * fhandler.h (fhandler_base::get_w_binary): Default to binmode if - nothing else is specified. - * fhandler.h (fhandler_base::get_r_binary): Ditto. - - * fhandler_disk_file.cc (fhandler_disk_file::fstat_by_handle): Work - around g++ warning. - - * path.cc (path_conv::check): Remove a debugging statement. - -2002-05-31 Christopher Faylor - - * fhandler_console.cc (fhandler_console::open): Always default to - binmode. - (fhandler_console::write_normal): Don't honor binmode setting. There - is already a termios setting for this. - (fhandler_console::init): Correct argument order in init call. - -2002-05-31 Christopher Faylor - - * fhandler.cc (fhandler_base::open): Make default open mode == binmode. - (fhandler_base::init): Set open flags based on derived binmode argument. - -2002-05-31 Christopher Faylor - - * dll_init.cc (dll_list::init): Eliminate unneeded debugging statement. - -2002-05-31 Christopher Faylor - - * fhandler_proc.cc (fhandler_proc::readdir): Set errno when no more - files. - * fhandler_process.cc (fhandler_process::readdir): Ditto. - * fhandler_registry.cc (fhandler_registry::readdir): Ditto. - -2002-05-30 Christopher Faylor - - * path.cc (path_conv::check): Set fileattr to INVALID_FILE_ATTRIBUTES - for nonexistent virtual device path. - (chdir): Set correct errno when attempt is made to cd to nonexistent - virtual device path. - -2002-05-30 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::fstat): Always call - fstat_by_name if fd is not opened to allow fstat_by_name to properly - set errno. - -2002-05-30 Corinna Vinschen - - * autoload.cc: Replace autoload statments for ZwXXX by NtXXX. - Drop ZwQuerySystemInformation since NtQuerySystemInformation was - already available. - * fhandler_proc.cc (format_proc_uptime): Replace call to - ZwQuerySystemInformation by call to NtQuerySystemInformation. - (format_proc_stat): Ditto. - * fhandler_process.cc (format_process_stat): Replace call to - ZwQueryInformationProcess by call to NtQueryInformationProcess. - (get_process_state): Ditto. - (get_mem_values): Ditto. Replace call to ZwQueryVirtualMemory by - call to NtQueryVirtualMemory. - * ntdll.h: Cleanup. Drop ZwQuerySystemInformation since - NtQuerySystemInformation was already available. Replace declarations - of ZwXXX functions by declarations of NtXXX. - * pinfo.cc (winpids::enumNT): Replace call to ZwQuerySystemInformation - by call to NtQuerySystemInformation. - -2002-05-29 Christopher Faylor - - * fhandler.cc (binmode): Default to binmode when mode is not known. - -2002-05-29 Christopher Faylor - - * include/sys/cygwin.h (EXTERNAL_PINFO_VERSION): Reinstate. - * external.cc (fillout_pinfo): Use it. - -2002-05-29 Corinna Vinschen - - * external.cc (fillout_pinfo): Use new version define. - * include/sys/cygwin.h (external_pinfo): Define - EXTERNAL_PINFO_VERSION_16_BIT and EXTERNAL_PINFO_VERSION_32_BIT - instead of just EXTERNAL_PINFO_VERSION. - -2002-05-29 Christopher Faylor - - * external.cc (fillout_pinfo): Set new version field in external_pinfo - structure. - * include/sys/cygwin.h (external_pinfo): Replace strace_file with - version field. - -2002-05-29 Corinna Vinschen - - Change internal uid datatype from __uid16_t to __uid32_t - throughout. - * cygwin.din: Export new symbols getpwuid32, getpwuid_r32, getuid32, - geteuid32, setuid32, seteuid32. - * passwd.cc (getpwuid32): New function. - (getpwuid_r32): Ditto. - * syscalls.cc (seteuid32): Ditto. - (setuid32): Ditto. - * uinfo.cc (getuid32): Ditto. - (geteuid32): Ditto. - * winsup.h (uid16touid32): New macro, correct casting from __uid16_t - to __uid32_t. - (gid16togid32): Ditto fir gids. - (getuid32): Declare. - (geteuid32): Ditto. - (getpwuid32): Ditto. - * include/sys/cygwin.h (struct external_pinfo): Add members uid32 and - gid32. - -2002-05-29 Corinna Vinschen - - * include/cygwin/socket.h: Protect some symbols against multiple - definition. - * include/netinet/ip.h: Ditto. - * include/netinet/tcp.h: Ditto. - -2002-05-29 Wu Yongwei - - * include/netinet/ip.h: Replace by BSD derived version of the file. - * include/netinet/tcp.h: Ditto. - * include/netinet/udp.h: New file. - * include/cygwin/ip.h: Remove. - -2002-05-29 Christopher Faylor - - * dtable.cc (dtable::init_std_file_from_handle): Attempt stronger - detection of invalid handle. - (handle_to_fn): Detect pathological condition where NT resets the - buffer pointer to NULL on an invalid handle. - -2002-05-28 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Properly - check for whether we should be opening the file to search for #! - characters. Set path_conv structure execability, too, when - appropriate. - -2002-05-28 Corinna Vinschen - - * security.cc (set_security_attribute): Call getegid32() instead of - getegid(). - * include/cygwin/grp.h: Declare getegid32(). - -2002-05-28 Corinna Vinschen - - Change internal gid datatype from __gid16_t to __gid32_t - throughout. - * cygwin.din: Export new symbols chown32, fchown32, getegid32, - getgid32, getgrgid32, getgrnam32, getgroups32, initgroups32, lchown32, - setgid32, setegid32, getgrent32. - * grp.cc (grp32togrp16): New static function. - (getgrgid32): New function. - (getgrnam32): Ditto. - (getgrent32): Ditto. - (getgroups32): Change name of internal function from getgroups. - (getgroups32): New function. - (initgroups32): Ditto. - * syscalls.cc (chown32): Ditto. - (lchown32): Ditto. - (fchown32): Ditto. - (setegid32): Ditto. - (setgid32): Ditto. - * uinfo.cc (getgid32): Ditto. - (getegid32): Ditto. - * include/cygwin/grp.h: Remove declaration of getgrgid() and getgrnam(). - Declare getgrgid32() and getgrnam32() instead. Declare getgid32(). - -2002-05-27 Christopher Faylor - - * autoload.cc (noload): Properly mask low order word for determining - number of bytes to pop. - -2002-05-27 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::fstat): Minor logic - cleanup. - -2002-05-27 Christopher Faylor - - * autoload.cc (LoadFuncEx): Define via new LoadFuncEx2 macro. - (LoadFuncEx2): Adapt from LoadFuncEx. Provides control of return - value for nonexistent function. - (NtQueryObject): Declare. - (IsDebuggerPresent): Declare via LoadFuncEx2 and always return true if - not available. - * debug.h (being_debugged): Just rely on IsDebuggerPresent return - value. - * dtable.cc (handle_to_fn): New function. - (dtable::init_std_file_from_handle): Attempt to derive std handle's - name via handle_to_fn. - (dtable::build_fhandler_from_name): Fill in what we can in path_conv - structure when given a handle and path doesn't exist. - * fhandler.cc (fhandler_base::open): Don't set the file pointer here. - Use pc->exists () to determine if file exists rather than calling - GetFileAttributes again. - * fhandler.h (fhandler_base::exec_state_isknown): New method. - (fhandler_base::fstat_helper): Add extra arguments to declaration. - (fhandler_base::fstat_by_handle): Declare new method. - (fhandler_base::fstat_by_name): Declare new method. - * fhandler_disk_file (num_entries): Make __stdcall. - (fhandler_base::fstat_by_handle): Define new method. - (fhandler_base::fstat_by_name): Define new method. - (fhandler_base:fstat): Call fstat_by_{handle,name} as appropriate. - (fhandler_disk_file::fstat_helper): Accept extra arguments for filling - out stat structure. Move handle or name specific stuff to new methods - above. - (fhandler_disk_file::open): Use real_path->exists rather than calling - GetFileAttributes again. - * ntdll.h (FILE_NAME_INFORMATION): Define new structure. - (OBJECT_INFORMATION_CLASS): Partially define new enum. - (OBJECT_NAME_INFORMATION): Define new structure. - (NtQueryInformationFile): New declaration. - (NtQueryObject): New declaration. - * path.cc (path_conv::fillin): Define new method. - * path.h (path_conv::fillin): Declare new method. - (path_conv::drive_thpe): Rename from 'get_drive_type'. - (path_conv::volser): Declare new method. - (path_conv::volname): Declare new method. - (path_conv::root_dir): Declare new method. - * syscalls.cc (fstat64): Send real path_conv to fstat as second - argument. - -2002-05-24 Pierre Humblet - - * security.cc (lsa2str): New function. - (get_priv_list): Call lsa2str instead of sys_wcstombs. - -2002-05-22 Pierre Humblet - - * syscalls.cc (seteuid): Do not take allow_ntsec into account. - Attempt to use an existing or new token even when the uid - matches orig_uid, but the gid is not in the process token. - Major reorganization after several incremental changes. - (setegid): Do not take allow_ntsec into account. Minor - reorganization after several incremental changes. - -2002-05-26 Christopher Faylor - - * debug.h (being_debugged): New macro. - * dtable.cc (dtable::extend): Use new macro. - * exceptions.cc (try_to_debug): Ditto. - * strace.cc (strace::hello): Only output debugging info when we think - we're being debugged. - -2002-05-25 Robert Collins - - * winsup.h: Remove duplicate declarations of malloc_lock and - malloc_unlock. - -2002-05-24 Christopher Faylor - - Remove unneeded sync.h, where appropriate, throughout. - Remove unneeded heap.h, where appropriate, throughout. - Remove unneeded exceptions.h, where appropriate, throughout. - Remove unneeded perprocess.h, where appropriate, throughout. - -2002-05-22 Pierre Humblet - - * security.cc (create_token): Call __sec_user() instead of - sec_user() to remove dependence on allow_ntsec. Verify that - the returned sd is non-null. - -2002-05-25 Robert Collins - - * gmon.c (fake_sbrk): Correctly return -1 on failed malloc's. - -2002-05-24 Christopher Faylor - - * dtable.cc (dtable::build_fhandler_from_name): Just pass posix path - along to set_name via return_and_clear_normalized_path. - (dtable::build_fhandler): New method with const char * argument. - (dtable::reset_unix_path_name): Eliminate. - (dtable::dup_worker): Use correct build_fhandler method. - * mmap.cc (mmap_record::alloc_fh): Ditto. - * dtable.h (dtable::build_fhandler): New method. - (dtable::reset_unix_path_name): Eliminate. - * fhandler.cc (fhandler_base::set_name): Assume that unix_name has - already been cmalloced. - (fhandler_base::reset_unix_path_name): Eliminate. - (fhandler_base::~fhandler_base): Coercion for cfree. - * fhandler.h (fhandler_base::unix_path_name): Make const char *. - (fhandler_base::win32_path_name): Ditto. - (fhandler_base::reset_unix_path_name): Eliminate. - * fhandler_disk_file.cc (fhandler_cygdrive::set_drives): Accommodate - const char *ness of win32_path_name. - * fhandler_socket.cc (fhandler_socket::fstat): Accommodate new set_name - requirements. - * path.cc (path_conv::return_and_clear_normalized_path): New method. - (path_conv::clear_normalized_path): Eliminate. - (path_conv::~path_conv): Ditto. - (path_conv::check): Accommodate new build_fhandler method. - * path.h (path_conv::~path_conv): Eliminate. - (path_conv::clear_normalized_path): Ditto. - (path_conv::return_and_clear_normalized_path): Declare new method. - -2002-05-23 Christopher Faylor - - * path.cc (path_conv::check): Make sure any trailing path component is - part of potential normalized posix path. - -2002-05-23 Christopher Faylor - - * smallprint.c (__small_vsprintf): Implement '%o' after all these - years. - -2002-05-22 Christopher Faylor - - * fhandler.h (fhandler_virtual::exists): Eliminate path argument. - (fhandler_proc::exists): Ditto. - (fhandler_registry::exists): Ditto. - (fhandler_process::exists): Ditto. - * fhandler_proc.cc (fhandler_proc::exists): Ditto. Use built-in name. - * fhandler_process.cc (fhandler_process::exists): Ditto. - (fstat): Ditto. - * fhandler_registry.cc (fhandler_registry::exists): Ditto. - (fhandler_registry::fstat): Ditto. - * fhandler_virtual.cc (fhandler_virtual::opendir): Ditto. - * path.cc (path_conv::check): Ditto. Add debugging. - -2002-05-22 Christopher Faylor - - * syscalls.cc (dup): Always call dup2 for error handling. - -2002-05-22 Corinna Vinschen - - * include/cygwin/types.h: Revert previous patch. - -2002-05-22 Corinna Vinschen - - * include/cygwin/types.h: Define pthread stuff only if _POSIX_THREADS - is defined. - -2002-05-19 Pierre Humblet - - * security.cc (open_local_policy): Initialize lsa to - INVALID_HANDLE_VALUE instead of NULL. - (get_logon_server_and_user_domain): Test for INVALID_HANDLE_VALUE - instead of NULL. - (create_token): Both of the above. - -2002-05-18 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::fstat): Make handling of - nlink consistent for remote files. - -2002-05-18 Christopher Faylor - - * path.cc (path_conv::check): Always set executable bit for executable - extension. - -2002-05-17 Christopher Faylor - - * fhandler.cc (fhandler_base::lseek): Avoid calling SetFilePointer with - high order part of 64 bit address on OS's which do not support that - kind of operation. Otherwise Windows 95 will become confused. - -2002-05-16 Pierre Humblet - - * fhandler_raw.cc (fhandler_dev_raw::open): Replace set_errno() - by __seterrno_from_win_error(). - * security.cc (open_local_policy): Ditto. - (get_lsa_srv_inf): Ditto. - (get_user_groups): Ditto. - (get_user_primary_group): Ditto. - (create_token): Ditto. - (subauth): Ditto. - -2002-05-17 Corinna Vinschen - - * times.cc (utimes): Use FILE_WRITE_ATTRIBUTES even on 9x/Me when - opening file for writing timestamp. - * wincap.cc: Remove flag has_specific_access_rights. - * wincap.h: Ditto. - -2002-05-13 Pierre Humblet - - * syscalls.cc (seteuid): Set default dacl in process token. - Replace in-line code by call to verify_token(). - (setegid): Reverse change from 2002-01-21. Add call to - RevertToSelf and set primary group in impersonation token. - * security.cc (create_token): Store pgrpsid in token security - descriptor, except if it already appears in my_grps. - Use sec_acl() in place of get_dacl(). - (verify_token): Create from code in seteuid(), with tighter checks. - (get_dacl): Deleted. - (get_group_sidlist): Add argument to indicate if pgrpsid is already - in the groups. - * security.h: Define verify_token(). - * autoload.cc: Load GetKernelObjectSecurity(). - -2002-05-13 Mark Bradshaw - - * cygwin.din: Add strlcat and strlcpy. - * include/cygwin/version.h: Increment API minor version number. - -2002-05-09 Pierre Humblet - - * shared.cc (__sec_user): Split into sec_acl() and call orig_sid(). - (sec_acl): Create from part of __sec_user(), except creator/owner. - * security.h: Define sec_acl() and MAX_DACL_LEN. - -2002-05-12 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::open): Avoid using - O_DIROPEN when OS doesn't support it. Return proper errno in that - case. - -2002-05-12 Christopher Faylor - - * syscalls.cc (_read): Change error to EBADF if attempt to read from a - non-readable fd. - -2002-05-11 Christopher Faylor - - * fhandler.h (executable_states): For now, make dont_care_if_executable - equivalent to not_executable. - * sys/mount.h: Define MOUNT_NOTEXEC. - * path.h (fs_info): New class. - (path_conv): Move fs-specific fields to new 'fs' structure. - (path_conv::update_fs_info): Move to fs_info and rename to just 'update'. - * path.cc (fs_info::update): Ditto. Return 'true' if successful. - (fillout_mntent): Add ',noexec' to list of reported options. - -2002-05-11 Christopher Faylor - - * fhandler_virtual.cc (fhandler_virtual::close): Quiet a compiler - warning. - -2002-05-10 Christopher January - - * autoload.cc: Add dynamic load statements for - 'ZwQueryInformationProcess' and 'ZwQueryVirtualMemory'. - * fhandler.h: Change type of bufalloc and filesize members of - fhandler_virtual from int to size_t. Change type of position member - from __off32_t to __off64_t. Add new fileid member to fhandler_virtual - class. Make seekdir take an __off64_t argument. Make lseek take an - __off64_t argument. Add fill_filebuf method to fhandler_virtual. Add - fill_filebuf method to fhandler_proc. Add fill_filebuf method to - fhandler_registry. Add fill_filebuf method to fhandler_process. Add - saved_pid and saved_p members to fhandler_process. - * fhandler_proc.cc (proc_listing_array): Add 'loadavg', 'meminfo', and 'stat'. - (proc_fhandlers array): Ditto. - (fhandler_proc::open): Use fill_filebuf to flesh out the file contents. - (fhandler_proc::fill_filebuf): New method. - (fhandler_proc::format_proc_meminfo): Ditto. - (fhandler_proc::format_proc_stat): Ditto. - (fhandler_proc::format_proc_uptime): Ditto. - * fhandler_process.cc (process_listing): Add 'stat' and 'statm'. - (fhandler_process::fstat): Find the _pinfo structure for the process - named in the filename. Return ENOENT if the process is no longer - around. Set the gid and uid fields of the stat structure. - (fhandler_process::open): Store pid and pointer to _pinfo structure in - saved_pid and saved_p respectively. Use fill_filebuf to flesh out file - contents. - (fhandler_proc::fill_filebuf): New method. - (format_process_stat): New function. - (format_process_status): Ditto. - (format_process_statm): Ditto. - (get_process_state): Ditto. - (get_mem_values): Ditto. - * fhandler_registry.cc (fhandler_registry::seekdir): Change argument - type from __off32_t to __off64_t. - (fhandler_registry::fill_filebuf): New method. - * fhandler_virtual.cc (fhandler_virtual::seekdir): Change argument type - from __off32_t to __off64_t. - (fhandler_virtual::lseek): Ditto. - (fhandler_virtual::fill_filebuf): New method. - (fhandler_virtual::fhandler_virtual): Initialise fileid to -1. - * wincap.cc: Set flag has_process_io_counters appropriately. - * wincap.h: Add flag has_process_io_counters. - -2002-05-09 Christopher Faylor - - * syscalls.cc (_write): Change error to EBADF if attempt to write to a - non-writeable fd. - -2002-05-08 Corinna Vinschen - - * cygheap.h (class cygheap_user): Add member `orig_psid'. - Add method `orig_sid()'. - * cygheap.cc (cygheap_user::set_sid): Maintain orig_psid. - -2002-04-28 Norbert Schulze - - * localtime.cc (tzsetwall): Use wildabbr if generated timezone name - length < 3. - -2002-05-05 Pierre Humblet - - * spawn.cc (spawn_guts): Move call to set_process_privilege() - to load_registry_hive(). - * registry.cc (load_registry_hive): ditto. - * fork.cc (fork_parent): Call sec_user_nih() only once. - -2002-05-04 Christopher January - - * path.h (path_conv::path_conv): Initialise normalized_path to NULL. - -2002-05-03 Christopher Faylor - - * net.cc (getdomainname): Change second argument of getdomainname to - size_t. - -2002-05-03 Christopher January - - * fhandler_proc.cc (proc_listing): Add '.' and '..' to directory - listing. - (fhandler_proc::open): Change use of mode to flags. If the file does - not exist already, fail with EROFS if O_CREAT flag is set. Change - EROFS error to EACCES error when writing to a file. Use cmalloc to - allocate memory for filebuf. - (fhandler_proc::close): Use cfree to free filebuf. - (fhandler_proc::get_proc_fhandler): Properly detect attempts to access - unknown subdir. - * fhandler_process.cc (process_listing): Add '.' and '..' to directory - listing. - (fhandler_process::open): Use cmalloc to allocate memory for filebuf. - (fhandler_process::close): Use cfree to free filebuf. - * fhandler_registry.cc (registry_listing): Add . and '..' to directory - listing. - (fhandler_registry::open): Move check for open for writing before - open_key. Use cmalloc to allocate memory for filebuf. - (fhandler_registry::close): Use cfree to free filebuf. - (fhandler_registry::telldir): Use lower 16 bits of __d_position as - position in directory. - (fhandler_registry::seekdir): Ditto. - * fhandler_virtual.cc (fhandler_virtual::write): Change EROFS error to - EACCES error. - (fhandler_virtual::open): Set the NOHANDLE flag. - (fhandler_virtual::dup): Add call to fhandler_base::dup. Allocate - child's filebuf using cmalloc. Copy filebuf from parent to child. - (fhandler_virtual::close): Use cfree to free filebuf. - (fhandler_virtual::~fhandler_virtual): Ditto. - (from Chris Faylor ). - (fhandler_registry::readdir): Add support for '.' and '..' files in - subdirectories of /proc/registry. - * path.cc (path_conv::check): Do not return ENOENT if a file is not - found in /proc. - -2002-05-02 Christopher Faylor - - * fhandler_proc.cc (fhandler_proc::fstat): Use fhandler name rather - than path_conv name. - (fhandler_proc::open): Ditto. - * fhandler_process.cc (fhandler_process::fstat): Use fhandler name - rather than path_conv name. - (fhandler_process::open): Ditto. - * fhandler_registry.cc (fhandler_registry::fstat): Use fhandler name - rather than path_conv name. - (fhandler_registry::open): Ditto. - * path.cc (path_conv::check): Don't copy posix path when virtual. - (mount_info::conv_to_win32_path): Don't zero string when isproc. Just - derive normal windows path. - - * path.h (path_conv::clear_normalized_path): Declare new method. - * path.cc (path_conv::clear_normalized_path): Define new method. - * dtable.cc (build_fhandler_from_name): Clear normalized path when - finished to conserve space. - -2002-05-02 Christopher Faylor - - * fhandler_proc.cc (fhandler_proc::fstat): Prime with information from - fhandler_base::fstat. Use defines rather than constants for permission - settings. - -2002-04-30 Eric Blake - - * path.cc (hash_path_name): Improve hash function strength. - -2002-05-02 Robert Collins - - * thread.cc (__pthread_cond_dowait): Fix a race on signalling from a - thread woken by the same condition variable it's signalling on. Thanks - to Michael Beach for the report and test case. - -2002-05-02 Christopher Faylor - - * path.h (pathconv_arg): Add PC_POSIX. - (path_conv): Add normalized_path field. - * path.cc (path_conv::~path_conv): New destructor. - (path_conv::check): Set normalized_path, where appropriate. - * dtable.cc (build_fhandler_from_name): Use normalized path from - path_conv. - * syscalls.cc (chroot): Ditto. - - * cygheap.h: Remove path_prefix_p declaration. - -2002-02-26 Christopher January - Christopher Faylor (minor fixups) - - * Makefile.in: Add fhandler_proc.o, fhandler_registry.o, - fhandler_process.o and fhandler_virtual.o. - * dtable.cc (dtable::build_fhandler): Add entries for FH_PROC, - FH_REGISTRY and FH_PROCESS. Set unix_name to the normalized posix - path. - * fhandler.h: Add constants for FH_PROC, FH_REGISTRY and FH_PROCESS. - Add class declarations for fhandler_virtual, fhandler_proc, - fhandler_registry and fhandler_virtual. Update fhandler_union - accordingly. - * fhandler_proc.cc: New file. Add implementation for fhandler_proc. - * fhandler_virtual.cc: New file. Add implementation for - fhandler_virtual. - * fhandler_process.cc: New file. Add implementation for - fhandler_process. - * fhandler_registry.cc: New file. Add implementation for - fhandler_registry. - * path.cc (isproc): New macro. - (isvirtual_dev): Ditto. - * path.cc (path_conv::check): Add check for virtual devices. - * path.cc (mount_info::conv_to_win32_path): Convert paths in /proc to - empty Win32 paths. - * path.cc (chdir): Replace check for FH_CYGDRIVE with more generic - isvirtual_dev macro. Force setting of posix path for virtual - fhandlers. - * path.h (path_prefix_p): Declare. - - -Wed May 1 16:06:02 2002 Jason Tishler - - * include/cygwin/types.h: Include . - -Wed Apr 17 11:27:04 2002 Jason Tishler - - * security.cc (get_lsa_srv_inf): Prevent extraneous backslashes for - the NT Domain case. - -2002-04-12 Corinna Vinschen - - * net.cc (cygwin_accept): Set socket type for accepted socket. - (socketpair): Set socket type for both sockets. - -2002-04-12 Egor Duda - - * fhandler.h (class fhandler_socket): New member to store socket type. - (fhandler_socket::get_socket_type): Access it. - (fhandler_socket::set_socket_type): Ditto. - * net.cc (cygwin_socket): Store socket type. - (cygwin_connect): Disable security checks for connectionless sockets. - (cygwin_accept): Ditto. - -2002-04-09 Mark Bradshaw - - * cygwin.din: Add strptime. - * include/cygwin/version.h: Increment API version number. - -2002-04-09 Corinna Vinschen - - * fork.cc (fork_child): Call fixup_mmaps_after_fork() somewhat earlier. - -2002-04-09 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Set read-only bit in - file_attributes when adequate. - -2002-03-28 Christopher Faylor - - * times.cc (gettimeofday): Fix typo in previous patch. - -2002-03-27 Wu Yongwei - - * times.cc (gettimeofday): Revert to setting timezone info if tz != - NULL. - -2002-03-21 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Always set - st_[ug]id to value derived from get_file_attributes. - -2002-03-21 Christopher Faylor - - * spawn.cc (find_exec): Return input if file not found. - -2002-03-19 Boris Schaeling - - * poll.cc (poll): Add support for invalid descriptors. - -2002-03-15 Robert Collins - - * fhandler.h (fhandler_termios::lseek): Override lseek. - * fhandler_termios.cc (fhandler_termios::lseek): Implement this. - -2002-03-15 Christopher Faylor - - * cygserver.cc: Include stdlib.h for exit declaration. - * threaded_queue.cc: Ditto. - -2002-03-15 Christopher Faylor - - * pinfo.cc (pinfo::init): Use PID_ALLPIDS flag to control when a - redirected block should be marked as nonexistent. - (winpids::add): Use PID_ALLPIDS when looking for all pids. - * cygwin.h (PID_ALLPIDS): New enum element. - -2002-03-15 Corinna Vinschen - - * glob.c (stat32_to_STAT): New function. - (g_lstat): Call user space functions always with 32 bit struct stat - as a workaround. - (g_stat): Ditto. - * include/glob.h (struct glob): Don't prototype function pointers - when compiling Cygwin. - -2002-03-14 Christopher Faylor - - * pinfo.cc (pinfo::init): Properly handle execed process stub when - PID_NOREDIR is specified. - -2002-03-13 Boris Schaeling - - * poll.cc (poll): Remove variable open_fds. Rearrange and add code to - fix settings of revents. - -2002-03-13 Corinna Vinschen - - * mmap.cc (mmap_record::map_map): Return -1 if VirtualProtect fails. - (list::erase): New method with no argument. Erase latest record - added. - (mmap64): Fail if map_map() fails. - -2002-03-12 Corinna Vinschen - - * sysconf.cc (sysconf): Fix condition. - -2002-03-11 Corinna Vinschen - - * mmap.cc (msync): Check area given by addr and len for being a - contigeous mmap'd region. - -2002-03-11 Corinna Vinschen - - * fork.cc (fork_child): Call fixup_mmaps_after_fork() before - closing parent process handle. Call fixup_mmaps_after_fork() - with parent process handle as parameter. - * mmap.cc (mmap_record::access): New method. - (fixup_mmaps_after_fork): Take process handle as parameter. - In case of FILE_MAP_COPY access, copy valid memory regions to child. - * pinfo.h (fixup_mmaps_after_fork): Change prototype accordingly. - -2002-03-07 Corinna Vinschen - - * autoload.cc (NetGetDCName): Add symbol. - (NetServerEnum): Remove symbol. - * security.cc (get_lsa_srv_inf): Call NetGetDCName() instead of - NetServerEnum() since it's faster. Don't call it at all if machine - is not a domain member. - -2002-03-06 Christopher Faylor - - * path.cc (normalize_posix_path): Avoid runs of '.'s > 2. - -2002-03-05 Christopher Faylor - - * errno.cc: Change EPERM associated text to "Operation not permitted" - throughout. - -2002-03-05 Christopher Faylor - - * fhandler_socket.cc (fhandler_socket::close): Respond to signals while - looping, waiting for socket to close. Superstitiously clear last error - when WSAEWOULDBLOCK. - -2002-03-05 Robert Collins - - * cygserver_transport_pipes.cc (transport_layer_pipes::transport_layer_pipes): - Always init - until static members work correctly. - * shm.cc (shmget): Initialize the security descriptor - thanks Corinna! - * include/sys/ipc.h: Make the ipc control constants partitioned off from the sem - control constants. - -2002-03-04 Christian Lestrade - - * include/sys/termios.h: Define _POSIX_VDISABLE. Define CCEQ macro. - * fhandler_termios.cc: Include . - (line_edit): Recognize disabled c_cc[] chars. Ignore VDISCARD when - not in ICANON mode. - -2002-03-04 Dmitry Timoshkov - - * syscalls.cc (truncate64): Use ftruncate64 directly to not lose - upper 32 bits. - -2002-03-04 Robert Collins - - * cygserver_shm.cc (delete_shmnode): New function. - (client_request_shm::serve): Use it. - -2002-03-04 Robert Collins - - * cygserver_shm.cc (client_request_shm::serve): Implement SHM_DETACH. - * shm.cc (shmdt): Implement. - -2002-03-04 Robert Collins - - * cygserver_shm.cc: Run indent. - (deleted_head): New global for storing shm id's pending deletion. - (client_request_shm::serve): Return ENOSYS for invalid request types. - Implement SHM_DEL - delete a shm id. - * cygserver_shm.h (SHM_DEL): New type value. - * shm.cc (delete_inprocess_shmds): New function, does what it's name implies. - (shmctl): Implement shm_rmid control type. - -2002-03-04 Robert Collins - - * Makefile.in (install): Remove install-bin to allow make install to work. - -2002-03-03 Robert Collins - - * shm.cc (shmat): Prevent a compile error. - (shmdt): Set errno as this function is incomplete. - -2002-02-28 Christopher Faylor - - * times.cc: Remove if 0'd code. Clean up slightly. - -2002-02-28 Robert Collins - - * Merge cygwin_daemon into head minus the new shm and ipc exports. - -2002-02-28 Robert Collins - - * fhandler_tty.cc (fhandler_tty_slave::open): More debugging. - (fhandler_tty_slave::read): Fix printf type for the handle. - * tty.cc (tty::common_init): Add a FIXME for security. - -2002-01-29 Robert Collins - - * Makefile.in (OBJS): Remove duplicate localtime.o. - -2002-01-17 Robert Collins - - * cygserver.cc (check_and_dup_handle): Consolidate the two variants for - simplicity. - Add Some basic debug output. - (client_request_attach_tty::serve): Use the new debug_printf for clarity. - Mark the duplicated handles as inheritable - fixup_after_fork() doesn't reopen - tty's. - -2002-01-16 Robert Collins - - * cygserver.cc (transport): Correct scope. - (client_request_attach_tty::serve): Add more debug information. - Fix erroneous use of transport instead of conn. - * cygserver_transport_pipes.cc (transport_layer_pipes::close): More debug. - (transport_layer_pipes::read): Ditto. - (transport_layer_pipes::write): Ditto. - (transport_layer_pipes::impersonate_client): Ditto. - -Mon Oct 8 7:41:00 2001 Robert Collins - - * cygserver.cc (server_request::process): Rename client_request_shm_get to - client_request_shm. - * cygserver_process.cc (process_cache::add): Rename to add_task. - Use process_cleanup instead of process_request. - (process_cache::remove_process): New method. - (process::process): Initialize new members. - (process::~process): New member. - (process::cleanup): New method. - (process::add_cleanup_routine): New method. - (process_request::process): Rename to process_cleanup. - Call the process object's cleanup method and then delete it. - (process_process_param::request_loop): Remove the signalling process. - * cygserver_shm.cc: Globally rename client_request_shm_get to client_request_shm. - (client_request_shm_get::serve): Handle attach request counting. - * cygserver_shm.h: Globally rename client_request_shm_get to client_request_shm. - (class shm_cleanup): New class. - * shm.cc: Globally rename client_request_shm_get to client_request_shm. - (client_request_shm::client_request_shm): New constructor for attach requests. - (shmat): Use it. - * include/cygwin/cygserver_process.h (class process_request): Rename to - process_cleanup. - (class cleanup_routine): New class. - (class process): New members and methods to allow calling back when the process - terminates. - -Thu Oct 4 14:12:00 2001 Robert Collins - * cygserver.cc (request_loop): Make static. - (main): Use new cache constructor syntax. - Start cache worker threads. - Cleanup the cache at shutdown. - * cygserver_process.cc: Run indent. - (process_cache::process_cache): Add a trigger to use when adding a process. - (process_cache::process): Move process_entry to process. - Insert at the end of the list. - Trigger the request loop when new process's inserted. - (process_cache::process_requests): Do it. - (process_cache::add): New method. - (process_cache::handle_snapshot): New method. - (process::process): Merge in the process_entry fields. - (process::handle): Make a stub function. - (process::exit_code): New method. - (process_request::process): New method. - (process_process_param::request_loop): New method. - * cygserver_shm.cc: New header dependency - threaded_queue.h. - * threaded_queue.cc (threaded_queue::cleanup): Clearer messages. - (queue_process_param::stop): Short spinlock on interruptible threads. - * threaded_queue.h (class threaded_queue): New constructor. - * include/cygwin/cygserver_process.h (process_request): New class. - (process_entry): Remove. - (process): Merge in process_entry. - (process_cache): Inherit from threaded_queue. - -Tue Oct 2 23:24:00 2001 Robert Collins - - * cygserver.cc (class server_process_param): Use new constructor syntax. - * cygserver_process.cc (process_cache::~process_cache): New function. - * threaded_queue.cc: Define condition debug_printf. - Run indent. - (threaded_queue::cleanup): Move queue_process_param guts to a method. - (threaded_queue::process_requests): Ditto. - (queue_process_param::queue_process_param): New method. - (queue_process_param::~queue_process_param): Ditto. - (queue_process_param::start): Ditto. - (queue_process_param::stop): Ditto. - * threaded_queue.h (class queue_process_param): Add support for - interruptible request loops. - * cygwin/include/cygwin/cygserver_process.h (class process_cache): Add - destructor. - -Tue Oct 2 23:24:00 2001 Robert Collins - - * cygserver_client.cc: New flag allow_daemon to disable the daemon completely. - (cygserver_request): Check it. - (cygserver_init): Ditto. - * environ.cc (parse_thing): Add (no)daemon option. - -Tue Oct 2 23:00:00 2001 Robert Collins - - * shm.cc: Update to handle include changes from HEAD. - -Tue Oct 2 16:06:00 2001 Robert Collins - - * Makefile.in: Remove cygserver_shm.o from cygwin1.dll. - Rename cygserver_shm_outside.o to cygserver_shm.o. - * cygserver.cc (server_request::process): Use the new client_request - constructor. - * cygserver_client.cc: Remove the #ifdef's stubs for the server method - within cygwin. - (client_request_attach_tty::client_request_attach_tty): Use the new - client_request constructor. - (client_request_shutdown::client_request_shutdown): Ditto. - (client_request::client_request): Ditto. - * cygserver_shm.cc (client_request_shm_get::serve): Remove the - #ifdef'd stub for in-cygwin builds. - (client_request_shm_get::client_request_shm_get): Use the new - client_request constructor, and remove the in-cygwin variants. - * cygserver_shm.h (class client_request_shm_get): #ifndef test the - serve method - it's only used in cygserver. - * shm.cc (client_request_shm_get::client_request_shm_get): New function. - * include/cygwin/cygserver.h (request_header): New constructor. - (class client_request): Use it. - New constructor accepting the header size. - #ifndef test the server method - it's only used within cygserver. - (client_request_get_version): #ifdef test the server method. - (client_request_shutdown): Ditto. - (client_request_attach_tty): Ditto. - -Tue Oct 2 9:57:00 2001 Robert Collins - - * Makefile.in: add threaded_queue.o to cygserver.exe. - * cygserver.cc: Include threaded_queue.h - (class server_request): Inherit from queue_request. - (class server_process_param): Inherit from queue_process_param. - (class server_request_queue): Inherit from threaded_queue. - (request_loop): Adjust for new types. - (server_request_queue::process_requests): Remove guts to - threaded_queue::process_requests. - (server_request::server_request): Adjust for new types. - (worker_function): Delete. - (server_request_queue::create_workers): Delete. - (server_request_queue::cleanup): Delete. - (server_request_queue::add): Move guts to threaded_queue::add. - * threaded_queue.cc: New file. - * threaded_queue.h: New file. - -Mon Oct 1 12:38:00 2001 Robert Collins - - * cygserver.cc (client_request::serve): New function. - * cygserver_process.cc: Inlude for pthread_once. - (process_cache::process_cache): Initialise a crtiical section for write access. - (process_cache::process): Use the critical section. Also add missing entries to - the cache. - (do_process_init): New function to initalise class process static variables. - (process::process): Ensure that the process access critical section is - initialised. - (process::handle): Close the handle of old process's when they have terminated - and we are returning the handle for a process with the same pid. - * cygserver_shm.cc: Run indent. - Include cygserver_process.h to allow process cache functionality. - (client_request_shm_get::serve): New parameter for process cache support. - Use the process cache, not OpenProcess to get a handle to the originating process. - Fix a handle leak with token_handle. - * cygserver_shm.h (class client_request_shm_get): Update ::serve for process - cache support. - * cygserver_transport_pipes.cc: Redefine debug_printf to be conditional on DEBUG. - * include/cygwin/cygserver.h: Do not implement client_request::serve in the - header. - * include/cygwin/cygserver_process.h (class process_cache): Add a write access - critical section to prevent races when requests from a multithreaded - application arrive. - -Sun Sep 30 23:41:00 2001 Robert Collins - - * Makefile.in: Add cygserver_process.o to cygserver.exe. - * cygserver.cc: Include signal.h and cygwin_version.h. - Define debug_printf as a macro. - Define DEBUG to a value. - (client_request_attach_tty::serve): Add beginning of process cache support. - Change from #ifdef DEBUG to work with new DEBUG style. - (client_request_get_version::serve): Add beginning of process cache support. - (class server_request): New prototype for support of process cache. - (class queue_process_param): New class to allow request loop threading. - (class server_request_queue): Add beginning of process cache support. - Allow request loop threading. - (request_loop): Thread function for request loops. - (server_request_queue::process_requests): Initiator for threaded request loops. - (client_request_shutdown::serve): Add beginning of process cache support. - (server_request::server_request): Ditto. - (server_request::process): Use debug_printf. Add beginning of process cache - support. - (server_request_queue::cleanup): Kill off any request loop threads. - (server_request_queue::add): Add beginning of process cache support. - (handle_signal): Trigger a shutdown. - (main): Print out some useful info at startup - version, date time. - Add process cache support. - Spawn a separate thread for the transport request loop, thus allowing concurrent - support for multiple transports. - * cygserver_client.cc (client_request_get_version::serve): Add process cache - support. - (client_request_attach_tty::serve): Add process cache support. - (client_request_shutdown::serve): Add process cache support. - * cygsserver_process.cc: New file with the process cache support. - * cygserver_shm.cc: Redefine debug_printf to allow conditional output. - * cygwin.din: Export shmdt(). - * shm.cc: Run indent. - Update FIXME's. - (shmdt): New function. - * include/cygwin/cygserver.h (class client_request): Add process cache support. - (class client_request_get_version): Ditto. - (class client_request_shutdown): Ditto. - (class client_request_attach_tty): Ditto. - * include/cygwin/cygserver_process.h: New header for process cache support. - -Sun Sep 30 8:52:00 2001 Robert Collins - - * include/cygwin/cygserver_transport.h: Add copyright header. - * include/cygwin/cygserver_transport_pipes.h: Ditto. - * include/cygwin/cygserver_transport_sockets.h: Ditto. - -Sat Sep 29 20:40:00 2001 Robert Collins - - * Makefile.in: Add cygserver_transport_sockets.o to DLL_OFILES. - Add cygserver_transport_sockets_outside.o to cygserver.exe. - * cygserver.cc: Include new include files. - * cygserver_client.cc: Ditto. - * cygserver_shm.h: No need to include now. - * cygerver_transport.cc: Include new include files. - (transport_layer_base::transport_layer_base): Strip back to a stub. - (transport_layer_base::listen): Ditto. - (transport_layer_base::accept): Ditto. - (transport_layer_base::close): Ditto. - (transport_layer_base::read): Ditto. - (transport_layer_base::write): Ditto. - (transport_layer_base::connect): Ditto. - * cygserver_transport_pipes.cc: Include new header - "cygwin/cygserver_transport_pipes.h". - * cygserver_transport_sockets.cc: New file. - * dcrt0.cc: No need to include now. - * fhandler_tty.cc: Ditto. - * tty.cc: Ditto. - * include/cygwin/cygserver_transport.h: Strip the base class to a stub. - Remove the cygserver_transport_pipes class. - * include/cygwin/cygserver_transport_pipes.h: New file. - * include/cygwin/cygserver_transport_sockets.h: New file. - -Tue Sep 25 16:22:00 2001 Robert Collins - - * autoload.cc: Add dynamic load statement for 'ImpersonateNamedPipeClient'. - * Makefile.in: Add new object files, and build instructions for cygserver.exe. - * cygwin.din: Export ftok, shmat, shmctl and shmget. - * dcrt0.cc: Additional includes for cygserver support. - (dll_crt0_1): Initialise the cygserver client. - * fhandler.h (fhandler_tty): New method cygserver_attach_tty. - * fhandler_tty.cc: Additional includes for cygserver support. - (fhandler_tty_slave::open): Attempt to use the cygserver when obtaining - handles from the parent process. On failure or 9x use the current method. - (fhandler_tty_slave::cygserver_attach_tty): New function. - * fork.cc (fork_child): Fixup shm memory mapped areas. - * pinfo.h: Declare fixup_shms_after_fork(). - * security.h: Declare alloc_sd(). - * tty.cc: Additonal includes to support cygserver. - (tty::common_init): Don't allow others to open us if the cygserver is running. - * winsup.h: Declare cygserver_running. - * cygserver.cc: New file. - * cygserver_client.cc: New file. - * cygserver_shm.cc: New file. - * cygserver_shm.h: New file. - * cygserver_transport.cc: New file. - * cygserver_transport_pipes.cc: New file. - * ipc.cc: New file. - * shm.cc: New file. - * include/cygwin/cygserver.h: New file. - * include/cygwin/cygserver_transport.h: New file. - * include/sys/ipc.h: New file. - * include/sys/shm.h: New file. - -2002-02-28 Robert Collins - - * thread.cc (semaphore::TryWait): Set errno as required by posix 1003.1. - (__sem_wait): Ditto. - (__sem_trywait): Ditto. - -2002-02-27 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number. - -2002-02-23 Corinna Vinschen - - * cygwin.din (fstat64): New symbol. - (ftruncate64): Ditto. - (lseek64): Ditto. - (lstat64): Ditto. - (mmap64): Ditto. - (seekdir64): Ditto. - (stat64): Ditto. - (telldir64): Ditto. - (truncate64): Ditto. - * dir.cc (telldir64): New function. - (telldir): Call telldir64(). - (seekdir64): New function. - (seekdir): Call seekdir64(). - * fhandler.h: Redefine all methods using __off32_t to use __off64_t. - * fhandler.cc: Use __off64_t and struct __stat64 throughout. - * fhandler_clipboard.cc: Ditto. - * fhandler_disk_file.cc: Ditto. - * fhandler_dsp.cc: Ditto. - * fhandler_floppy.cc: Ditto. - * fhandler_mem.cc: Ditto. - * fhandler_random.cc: Ditto. - * fhandler_socket.cc: Ditto. - * fhandler_tape.cc: Ditto. - * fhandler_zero.cc: Ditto. - * pipe.cc: Ditto. - * glob.c: Ditto, call lstat64 and stat64 in Cygwin. - * mmap.cc: Use __off64_t throughout. - (mmap64): New function. - * sec_acl.cc (acl_worker): Use struct __stat64, call stat64 and lstat64. - * syscalls.cc (lseek64): New function. - (stat64_to_stat32): Ditto. - (fstat64): Ditto. - (stat64): Ditto. - (lstat64): Ditto. - (ftruncate64): Ditto. - (truncate64): Ditto. - (_fstat): Call fstat64. - (_stat): Call stat64. - (cygwin_lstat): Rename to avoid declaration problem. Call lstat64. - (stat_worker): Use struct __stat64. - (access): Ditto. - (ftruncate): Call ftruncate64. - (truncate): Call truncate64. - * wincap.cc: Set flag has_64bit_file_access appropriately. - * wincap.h: Add flag has_64bit_file_access. - * winsup.h (ILLEGAL_SEEK): Define as __off64_t. - (stat_dev): Declare using struct __stat64. - (stat_worker): Ditto. - * include/cygwin/stat.h (struct __stat32): Define if compiling Cygwin. - (struct __stat64): Ditto. - (struct stat): Revert definition with explicitly sized datatypes. - Eliminate sized field names. - * include/cygwin/types.h (blksize_t): New type. - (__blkcnt32_t): Ditto. - (__blkcnt64_t): Ditto. - (blkcnt_t): Ditto. - -2002-02-22 Christopher Faylor - - * sync.h (new_muto): Just accept an argument which denotes the name of - the muto. Use this argument to construct static storage. - * cygheap.cc (cygheap_init): Reflect above change. - * exceptions.cc (events_init): Ditto. - * malloc.cc (malloc_init): Ditto. - * path.cc (cwdstuff::init): Ditto. - * cygheap.h (cwdstuff): Change name of lock element to make it less - generic. - * path.cc (cwdstuff::get_hash): Ditto. - (cwdstuff::get_initial): Ditto. - (cwdstuff::set): Ditto. - (cwdstuff::get): Ditto. - * sigproc.cc (proc_subproc): Ditto. - - * debug.cc (lock_debug): Change to method. Use method rather than - macro throughout. - - * tty.h (tty_min::kill_pgrp): Declare new method. - * fhandler_termios.cc (tty_min::kill_pgrp): New method. - (fhandler_termios::line_edit): Use new method for killing process. - * dcrt0.cc (do_exit): Ditto. - - * dtable.cc (dtable::get_debugger_info): New method for inheriting - dtable info from a debugger. - * tty.cc (tty_init): Attempt to grab file handle info from parent - debugger, if appropriate. - - # dtable.cc (dtable::stdio_init): Make this a method. - (dtable::init_std_file_from_handle): Don't set fd unless it's not open. - (dtable::build_fhandler_from_name): Move name setting to - dtable::build_fhandler. - (dtable::build_fhandler): Add win32 name parameter. - * dcrt0.cc (dll_crt0_1): Change to use dtable stdio_init. - * dtable.h (dtable): Reflect build_fhandler parameter change. - * mmap.cc (mmap_record::alloc_fh): Don't set name parameter in - build_fhandler. - * net.cc (fdsock): Remove set_name call since it is now handled by - build_fhandler. - - * sigproc.cc (proc_subproc): Release muto as early as possible. - -2001-02-22 Corinna Vinschen - - * smallprint.c (rn): Allow long long values. - (__small_vsprintf): Add 'D', 'U' and 'X' formats for long long - parameters. - -2002-02-19 Christopher Faylor - - * fhandler.cc (fhandler_base::puts_readahead): Remove default parameter - setting. Newer gcc's complain about this. - (fhandler_base::set_readahead_valid): Ditto. - * fhandler_dsp.cc (Audio::open): Ditto. - (fhandler_dev_dsp::open): Ditto. - -2002-02-19 Christopher Faylor - - * fork.cc (fork_parent): Use sec_user_nih to control process/thread - inheritance/permission. - * spawn.cc (spawn_guts): Ditto. - * security.cc (create_token): Initialize token so that it is not tested - for bogus value later. Use sec_user to control process/thread - creation. - * security.h (__sec_user): Rename declaration from sec_user. - (sec_user_nih): Declare here as inline function wrapper for __sec_user. - (sec_user): Ditto. - * sigproc.cc (czombies): Allocate a character array for zombies to - avoid constructor overhead - (extremely hackish, I know). - (cpchildren): Ditto. - (pchildren): New define. - (zombies): Ditto. - (getsem): Use sec_user_nih to control semaphore inheritance/permission. - -2002-02-16 Christopher Faylor - - * times.cc (hires::prime): Restore thread priority on failure - condition. - - * uinfo.cc (uinfo_init): Use more robust method for determining if - process was invoked from a non-cygwin process. - - * sync.h (muto::init): Eliminate "inheritance" parameter. - (new_muto): Reflect removal of parameter. - * sync.cc (muto::init): Ditto. - * cygheap.cc (cygheap_init): Ditto. - * debug.cc (threadname_init): Ditto. - * exceptions.cc (events_init): Ditto. - * malloc.cc (malloc_init): Ditto. - * path.cc (cwdstuff::init): Ditto. - * sigproc.cc (sigproc_init): Ditto. - - * grp.cc (group_lock): Use different method for locking with static - member. - (read_etc_group): REALLY ensure that read lock mutex is released. - * passwd.cc (passwd_lock): Use different method for locking with static - member. - (read_etc_passwd): REALLY ensure that read lock mutex is released. - - * shared.cc (sec_user): Correct reversed inheritance test. - -2002-02-15 Christopher Faylor - - * hires.h (hires::usecs): Rename from utime. Accept an argument. - * strace.cc (strace::microseconds): Use hires class for calculating - times. - * sync.h (new_muto): Use NO_COPY explicitly in declaration. - * times.cc (gettimeofday): Reflect change in usecs argument. - (hires::usecs): Ditto. Changed name from utime. - * winsup.h (NO_COPY): Add nocommon attribute to force setting aside - space for variable. - * regcomp.c (REQUIRE): Add a void cast to bypass a warning. - -2002-02-15 Christopher Faylor - - * hires.h: New file. - * times.cc (gettimeofday): Use hires class for calculating current time. - (hires::prime): New method. - (hires::utime): Ditto. - -2002-02-14 Christopher Faylor - - * include/sys/cygwin.h (cygwin_getinfo_types): New CW_STRACE_ACTIVE. - * external.cc (cygwin_internal): Handle CW_STRACE_ACTIVE. - -2002-02-14 Christopher Faylor - - * exceptions.cc (unused_sig_wrapper): Eliminate unused parameter to - asm. - * external.cc (cygwin_internal): Change CW_STRACE_ON to - CW_STRACE_TOGGLE. - * strace.cc (strace::hello): Toggle strace on and off. - * sync.cc (muto::init): Rename from constructor. - * sync.h (muto::new): Delete. - (muto::delete): Ditto. - (new_muto): Simplify. Use muto.init for nearly everything. - * uinfo.cc (uinfo_init): Avoid closing a NULL handle. - * include/sys/cygwin.h (cygwin_getinfo_types): Rename CW_STRACE_OFF to - CW_STRACE_TOGGLE. Delete CW_STRACE_OFF. - * include/sys/strace.h (strace): Add "inited" field. - -2001-02-12 Corinna Vinschen - - * include/cygwin/acl.h: Fix definition of aclent_t. - -2002-02-10 Christopher Faylor - - * Makefile.in (DLL_OFILES): Consolidate object files. - -2002-02-10 Corinna Vinschen - - * child_info.h, cygheap.h, fhandler_clipboard.cc, fhandler_dsp.cc, - fhandler_floppy.cc, fhandler_mem.cc, fhandler_random.cc, - fhandler_tape.cc, fhandler_zero.cc, grp.cc, mmap.cc, passwd.cc, - pinfo.cc, pinfo.h, pipe.cc, sec_acl.cc, sec_helper.cc, security.cc, - security.h, thread.h, uinfo.cc, include/cygwin/acl.h: Fix copyright. - -2002-02-10 Corinna Vinschen - - * child_info.h, cygheap.h, dcrt0.cc, dir.cc, fhandler.cc, fhandler.h, - fhandler_clipboard.cc, fhandler_disk_file.cc, fhandler_dsp.cc, - fhandler_floppy.cc, fhandler_mem.cc, fhandler_random.cc, - fhandler_tape.cc, fhandler_zero.cc, grp.cc, mmap.cc, passwd.cc, - pinfo.cc, pinfo.h, pipe.cc, sec_acl.cc, sec_helper.cc, security.cc, - security.h, spawn.cc, syscalls.cc, thread.h, uinfo.cc, winsup.h: - Change usage of uid_t to __uid16_t, gid_t to __gid16_t and - off_t to __off32_t throughout. Use INVALID_UID, INVALID_GID and - INVALID_SEEK instead casting -1 to the appropriate type. - * winsup.h: Define INVALID_UID, INVALID_GID and INVALID_SEEK. - * include/cygwin/acl.h: Define internal __aclent16_t and __aclent32_t - types. Don't declare acl functions when compiling Cygwin. - * include/cygwin/grp.h: Declare getgrgid() and getgrnam() with - correct types for internal usage. - -2002-02-10 Corinna Vinschen - - Patch suggested by Pierre A. Humblet : - * uinfo.cc (internal_getlogin): Try evaluating user by SID even if - ntsec is off. - (uinfo_init): Set primary group even if ntsec is off. - -2002-02-09 Corinna Vinschen - - * include/cygwin/grp.h: New file. - * include/cygwin/stat.h: Ditto. - * include/cygwin/types.h: Add definitions for __off32_t, - __off64_t, off_t, __uid16_t, __uid32_t, uid_t, __gid16_t, - __gid32_t and gid_t. - * include/sys/cygwin.h: Use correct uid and gid types. - -2002-02-09 Corinna Vinschen - - * dtable.cc (dtable::dup2): Revert previous patch. - * fhandler.h: Ditto. - (fhandler_socket::recv): Define new method. - (fhandler_socket::send): Ditto. - * fhandler_socket.cc (fhandler_socket::recv): New method. - (fhandler_socket::send): Ditto. - (fhandler_socket::read): Call fhandler_socket::recv() now. - (fhandler_socket::write): Call fhandler_socket::send() now. - * net.cc (class wsock_event): Move definition to wsock_event.h. - (fdsock): Revert previous patch. - (cygwin_recv): Move implementation to fhandler_socket::recv(). - (cygwin_send): Move implementation to fhandler_socket::send(). - * wsock_event.h: New file. - -2002-02-06 Alexander Gottwald - - * net.cc (get_2k_ifconf): Create interface entries for tokenring cards. - -2002-02-08 Corinna Vinschen - - * dtable.cc (dtable::dup2): Store fd for fhandler_socket. - * fhandler.h (fhandler_base::set_fd): New virtual method. - (fhandler_base::get_fd): Ditto. - (fhandler_socket::set_fd): Ditto. - (fhandler_socket::get_fd): Ditto. - * fhandler_socket.cc (fhandler_socket::read): Call cygwin_recv instead - of native Winsock recv. - (fhandler_socket::write): Call cygwin_send instead of native Winsock - send. - * net.cc (fdsock): Store fd in fhandler_socket. - -2002-02-07 Corinna Vinschen - - * net.cc (cygwin_getsockname): Fix handling of NULL sun_path. - -2002-01-29 Corinna Vinschen - - * net.cc (getdomainname): Fix registry key for 9x systems, too. - -2002-01-29 Corinna Vinschen - - * net.cc (getdomainname): Fix registry key for NT systems. - -2002-01-28 Christopher Faylor - - * external.cc (cygwin_internal): Initialize various internal settings - if required to allow use of some things from user loaded DLL. - (CW_STRACE_ON): Add new feature. - (CW_CYGWIN_PID_TO_WINPID): Ditto. - * pinfo.cc (set_myself): Call "strace.hello" to initiate possible - strace session. - (pinfo::init): Guard against dereferencing uninitialized myself. - * sigproc.cc (wait_sig): Call strace.hello() when __SIGTRACE "signal" - received. - * strace.cc (strace::hello): New method. - * wincap.cc (wincapc::init): Avoid initializing if already initialized. - * wincap.h (wincapc::wincapc): New method. - * include/sys/cygwin.h: Add new CW_ enums. Kludge typedefs of - {g,u}id_t if required. - * strace.h (strace::hello): Declare new method. - -2002-01-28 Earnie Boyd - - * include/sys/strace.h (_STRACE_ON): Define. - (_STRACE_OFF): Ditto. - -2002-01-24 Christopher Faylor - - * speclib: Ensure that temporary def file is removed. - -2002-01-23 Christopher Faylor - - * speclib: Use rm -f to remove temp file just to quiet any potential - warnings. - -2002-01-23 Corinna Vinschen - - * security.cc (create_token): Use sec_user() to create - SECURITY_ATTRIBUTES structure for primary token. Use - MAXIMUM_ALLOWED access rights instead of TOKEN_ALL_ACCESS. - -2002-01-23 Corinna Vinschen - - * path.cc (symlink): Fix check for already existing file. - -2002-01-21 Christopher Faylor - - * cygmagic: Suppress error output when figuring out if sum takes an - option. - -2002-01-21 Christopher Faylor - - * cygmagic: Attempt to figure out if sum takes an option. - -2002-01-21 DJ Delorie - - * Makefile.in (libpthread.a): Pass the assembler also. - (libm.a): Ditto. - (libc.a): Ditto. - * speclib: Specify the assembler to dlltool. - -2002-01-21 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number. - -2002-01-21 Corinna Vinschen - - * grp.cc (getgrgid): Don't return default gid entry when ntsec is on. - * syscalls.cc (setegid): Don't set primary group in process token. - -2002-01-21 Christopher Faylor - - * speclib: Don't use /dev/null as DLL name. Just default to what's - already in .def file. - -2002-01-21 Christopher Faylor - - * exceptions.cc (sig_handle): Remove last vestiges of SA_NOCLDSTOP code - which caused SIGCHLD to be ignored. - -2002-01-20 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number. - -2002-01-20 Christopher Faylor - - * syscalls.cc (regfree): Make dll_export. - -2002-01-20 Christopher Faylor - - * exceptions.cc (ctrl_c_handler): Convert windows pid to cygwin pid - when detecting if we should actually handle CTRL-C. - -2002-01-19 Christopher Faylor - - * Makefile.in (new-cygwin1.dll): Revert previous change. libsupc++.a - is only available in libstdc++-v3. - -2002-01-19 Christopher Faylor - - * exceptions.cc (sig_handle_tty_stop): Don't send SIGCHLD if parent - doesn't want it. - (sig_handle): Don't check for SA_NOCLDSTOP here. We don't have enough - information. - -2002-01-19 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number. - -2002-01-19 Christopher Faylor - - * Makefile.in (new-cygwin1.dll): Just use -lsupc++ for link. - * sigproc.cc (proc_exists): Change existence criteria. - * sync.h (new_muto): Add volatile to definition to avoid gcc - optimization problems. - -2002-01-19 Corinna Vinschen - - * include/cygwin/version.h: Bump API minor version to 51. - -2002-01-19 Mark Bradshaw - - * cygwin.din: Add recvmsg and sendmsg. - * net.cc: Add cygwin_recvmsg and cygwin_sendmsg. - * /usr/include/sys/socket.h: Add recvmsg and sendmsg. - -2002-01-19 Corinna Vinschen - - * security.cc (create_token): Close processes token handle as soon - as it's not used anymore. - -2002-01-17 Corinna Vinschen - - * Makefile.in: Add fnmatch.o to DLL_OFILES. - * cygwin.din: Add fnmatch export symbol. - * fnmatch.c: New file. - * include/fnmatch.h: Ditto. - * include/cygwin/version.h: Bump API minor version to 50. - -2002-01-15 Corinna Vinschen - - * path.cc (fchdir): Call chdir with full windows path. - -2002-01-14 Corinna Vinschen - - * dir.cc: Use INVALID_FILE_ATTRIBUTES instead of "(DWORD) -1" - for file attributes throughout. - * fhandler.cc: Ditto. - * fhandler_disk_file.cc: Ditto. - * path.cc: Ditto. - * path.h: Ditto. - * syscalls.cc: Ditto. - * times.cc (utimes): Use path_conv::isdir() instead of explicit - GetFileAttributes() call. - -2002-01-13 Christopher Faylor - - * dcrt0.cc (multiple_cygwin_problem): Clarify logic and make - CYGWIN_MISMATCH_OK more powerful. - -2002-01-10 Christopher Faylor - - * exceptions.cc (sig_handle): Accept a second argument indicating - whether the signal came from this process or not. - * sigproc.h: Reflect sig_handle arg change. - * signal.cc (kill_pgrp): Add sigframe info. - (abort): New function. Eliminates newlib function of same name. - * sigproc.cc (wait_sig): Pass "signal from this process" value as arg - 2. - -2002-01-10 Corinna Vinschen - - * syscalls.cc (pathconf): Guard _PC_PATH_MAX branch against invalid - file parameter. - -2002-01-09 Christopher Faylor - Robert Collins - - * exceptions.cc (early_stuff_init): Rename from misnamed - set_console_handler. - (ctrl_c_handler): Attempt to work around potential signal duplication - during process startup. - (sig_handle): Ignore SIGINT when we're just an "exec stub". - * spawn.cc (spawn_guts): Store pid of spawned process in global for use - by ctrl_c_handler. - * dcrt0.cc (dll_crt0_1): Call renamed initialization function. - * winsup.h: Reflect function name change. - -2002-01-08 Corinna Vinschen - - * net.cc (cygwin_accept): Set sun_path for newly connected socket. - -2002-01-07 Ralf Habacker - - * Makefile.in: Add uninstall target. - -2002-01-07 Christopher Faylor - - * sigproc.cc (getsem): Clean up debugging output. - -2002-01-07 Christopher Faylor - - * sigproc.cc (getsem): Set errno when unable to create own semaphore. - Reorganize to make clearer that error should only come from initial - creation of process semaphore. - -2002-01-06 Christopher Faylor - - * dtable.cc (dtable::init_std_file_from_handle): Add some defensive - code to invalid handle case. - -2002-01-06 Corinna Vinschen - - * ioctl.cc (ioctl): Make third argument optional. - * include/sys/ioctl.h: Ditto in declaration. - * dtable.cc (dtable::init_std_file_from_handle): Revert previous - bogus patch. - * window.cc (WndProc): Raise SIGURG instead of SIGIO in case of FD_OOB - message. - -2002-01-05 Christopher Faylor - - * dir.cc (opendir): Guarantee release of alloced fhandler structure on - error. - -2002-01-05 Corinna Vinschen - - * exceptions.cc (sig_handle): Set default action for SIGURG to SIG_IGN. - -2002-01-05 Corinna Vinschen - - * dtable.cc (dtable::init_std_file_from_handle): Don't treat NULL - handle as errorneous. - -2002-01-04 Christopher Faylor - - * cygmagic: Change logic for equality test. - -2002-01-04 Christopher Faylor - - * dir.cc (opendir): Don't attempt to call sub-opendir if ENOENT. - -2002-01-04 Corinna Vinschen - - * net.cc: Replace usage of AF_UNIX by Posix compliant AF_LOCAL - throughout. - (socketpair): Explicitly allow SOCK_STREAM and SOCK_DGRAM socket types - in families AF_UNIX and AF_LOCAL. Explicitly allow PF_UNSPEC, PF_LOCAL - and PF_INET protocols. Return error otherwise. Implement datagram - socketpairs. - -2002-01-01 Christopher Faylor - - * speclib: Remove temp files automatically. - -2002-01-01 Corinna Vinschen - * fhandler.h (fhandler_socket::sun_path): New private member. - (fhandler_socket::set_sun_path): New method. - (fhandler_socket::get_sun_path): Ditto. - * fhandler_socket.cc (fhandler_socket::fhandler_socket): Initialize - sun_path to NULL. - (fhandler_socket::~fhandler_socket): Free sun_path if needed. - (fhandler_socket::set_sun_path): New method. - * net.cc (cygwin_bind): Set sun_path to path of local socket file. - (cygwin_getsockname): Add code to return correct sockaddr for unix - domain sockets. diff --git a/winsup/cygwin/ChangeLog-2003 b/winsup/cygwin/ChangeLog-2003 deleted file mode 100644 index 6c16579a2..000000000 --- a/winsup/cygwin/ChangeLog-2003 +++ /dev/null @@ -1,5678 +0,0 @@ -2003-12-31 Christopher Faylor - - * cygwin.din: Make crt0 functions NOSIGFE. - * include/cygwin/version.h: Gratuitous comment change. - * lib/_cygwin_crt0_common.cc: Remove unneeded declaration. - -2003-12-29 Christopher Faylor - - * cygtls.h (_threadinfo::stack): Increase stack size to accommodate - nested signal handlers. Reorganize to cause potential SEGV on stack - overflow. - * sigproc.cc (no_signals_available): Check sendsig value rather than - relying on obsolete sig_loop_wait. - (sigproc_terminate): Ditto. - (proc_can_be_signalled): Check sendsig value even for myself. - * tlsoffsets.h: Regenerate. - -2003-12-29 Christopher Faylor - - Move open_fhs from fhandler.h to cygheap.h for easier tracking. - Accommodate this change throughout. - * dtable.cc (dtable::add_archetype): Use correct count when iterating - through *active* archetypes. - * dtable.cc (dtable::fixup_after_exec): Close handle if close_on_exec - and archetype exists since archetype currently does not set windows - close-on-exec flag (FIXME). - * fhandler_tty.cc (fhandler_tty_slave::open): Change debugging output - slightly. - (fhandler_tty_slave::close): Ditto. - (fhandler_tty_slave::fixup_after_fork): Just report on inherited use - counts since since archetype currently does not set windows - close-on-exec flag (FIXME). - * pinfo.cc (_pinfo::set_ctty): Change debugging output slightly. - * cygheap.cc (cygheap_init): Remove open_fhs accommodation and use - count reporting. - * perthread.h (vfork_save::fhctty): New element. - * perthread.h (vfork_save::open_fhs): New element. - * fork.cc (vfork): Muck around with ctty and open_fhs stuff, both of - which are now saved in the vfork_save structure. - -2003-12-27 Christopher Faylor - - * fhandler.h (fhandler_tty_slave::archetype): Make public. - (report_tty_counts): New macro. Use throughout for reporting tty use - counts. - * dtable.cc (dtable::vfork_child_dup): Add debugging output for - usecount increment. Increment open_fhs if appropriate. - (dtable::vfork_parent_restore): "Close" artificially bumped ctty. - (dtable::vfork_child_fixup): Close ctty since it was bumped prior to - vfork. Save open_fhs around close since the closing of these handles - has no effect on the console. - * fhandler_tty.cc (fhandler_tty_slave::open): Reorganize calls to allow - for easier tracking of usecount modification. - (fhandler_tty_slave::open): Ditto. - -2003-12-26 Christopher Faylor - - * syscalls.cc (close_all_files): Simplify logic around closing ctty. - -2003-12-26 Christopher Faylor - - * pinfo.cc (_pinfo::set_ctty): *Always* call close on opened ctty since - it counts as an opened handle. - -2003-12-26 Christopher Faylor - - * fhandler.h (fhandler_tty_master::fixup_after_fork): Remove - declaration. - (fhandler_tty_master::fixup_after_exec): Ditto. - * fhandler_tty.cc (fhandler_tty_master::init): Fix so that children do - not inherit master tty handles. - (fhandler_tty_master::fixup_after_fork): Remove, since it was never - used. - (fhandler_tty_master::fixup_after_exec): Ditto. - * pinfo.cc (_pinfo::set_ctty): Increment open_fhs when ctty is set. - * cygheap.cc (cygheap_init): Ditto. - * syscalls.cc (setsid): *Always* call close on opened ctty since the - archetype is associated with the ctty and it counts as an opened - handle. - * tty.cc (tty::common_init): Don't protect input/output mutex since it - confuses subsequent fork/execs when CYGWIN=tty. - - * fhandler_process.cc (fhandler_process::fill_filebuf): Properly set - "file size" for "" reporting when filebuf is zero length. - -2003-12-26 Christopher Faylor - - * exceptions.cc (try_to_debug): Fix off-by-one problem when resetting - environment variable after error_start detected. - - * fhandler_tty_slave.cc (fhandler_tty_slave::close): Clarify debug - message. - * syscalls.cc (setsid): Don't increment usecount here, since it will be - automatically decremented on close. - -2003-12-26 Christopher Faylor - - * exceptions.cc (setup_handler): Protect against a race. - -2003-12-26 Christopher Faylor - - * path.cc (mount_item::build_win32): Backslashify paths in non-managed - case. - -2003-12-25 Christopher Faylor - - * dcrt0.cc (reent_data): Reluctantly resurrect. - (__cygwin_user_data::impure_ptr): Ditto. - (_dll_crt0): Reluctantly initialize _impure_ptr here. - (initialize_main_tls): Eliminate local_clib initialization since it now - happens in init_thread. - * init.cc (dll_entry): Reluctantly remove code which set _impure_ptr to - the main thread's local_clib. - * perthread.h (reent_data): Remove obsolete declaration. - - * sigproc.cc (proc_subproc): Add more debugging output. - (get_proc_lock): Ditto. - - *dcrt0.cc (dll_crt0_1): Allocate argv[0] via malloc since main thread - could exit. - -2003-12-23 Christopher Faylor - - * fork.cc (fork_child): After a pthread/fork, ensure that impure - pointer stuff which resides in parent is propagated to child thread. - -2003-12-23 Christopher Faylor - - * exceptions.cc (set_signal_mask): Redefine to not pass by address. - Report calculated mask in debugging output. - * sigproc.h (set_signal_mask): Reflect above change in declaration. - -2003-12-22 Christopher Faylor - - * path.cc (mount_item::build_win32): Take path apart before feeding it - to fnmunge. - -2003-12-21 Christopher Faylor - - Throughout, change use of _reent_winsup()-> to _my_tls.locals. - instead. - Throughout, remove obsolete MT_SAFE/_CYG_THREAD_FAILSAFE considerations. - Througout, add cygtls.h include. - * Makefile.in (DLL_OFILES): Add cygtls.o. Add some more objects to the - -fomit-frame-pointer list. - * acconfig.h: Remove obsolete settings. - * config.h.in: Ditto. - * bsdlib.cc: Add cygtls.h include. - * configure.in: Remove --enable-extra-threadsafe-checking. - * configure: Regenerate. - * cygtls.h (_local_storage): New struct renamed from _winsup_t (sic). - (_threadinfo:local_clib): Add new field. - (_threadinfo::locals): Ditto. - (_threadinfo::init_thread): Accept second _reent * argument. - (_threadinfo::call): Define as regparm. - (CYGTLS_PADSIZE): Remove unnecessary slop. - (_getreent): Define as a macro. - * thread.h: Remove _CYG_THREAD_FAILSAFE and MT_SAFE stuff. - (_winsup_t): Move to cygtls.h. - (ResourceLocks::ResourceLocks): Eliminate empty constructor. - (MTinterface::reents): Eliminate. - (MTinterface::thread_self_key): Eliminate. - (MTinterface::MTinterface): Eliminate. - * dcrt0.cc: Include stdio.h for _impure_ptr initialization. - (do_global_ctors): Remove run_ctors_p (sic) considerations. Don't call - atexit here. - (__main): Initialize destructors for user here. - (dll_crt0_1): Accept a dummy argument. Don't call init_thread here. - Don't set _impure_ptr here. Call do_global_ctors after more things - have been initialized. - (_dll_crt0): Define zeros buffer as max of needed size of - CYGTLS_PADSIZE so that it can be used for two purposes while minimizing - stack usage. Initialize _impure_ptr specifically, for speed. Call - dll_crt0_1 with buffer argument. - (cygwin_dll_init): Call dll_crt0_1 with dummy argument. - * dtable.cc (dtable::find_unused_handle): Remove call to - AssertResourceOwner. - * exceptions.cc: Move _threadinfo stuff to new file. - * cygtls.cc: New file. - * gentls_offsets: Accommodate increasing complexity of cygtls.h. - * hires.h (hires_base::~hires_base): Remove. - * init.cc (dll_entry): Remove setting of reents. - * thread.cc: Remove syslog.h include. - (__getreent): Simplify to use _my_tls. - (_reent_winsup): Delete. - (AssertResourceOwner): Delete. - (MTinterface::Init): Remove setting of _clib and _winsup, with all that - entails. - (MTinterface::fixup_after_fork): Ditto. - (pthread::thread_init_wrapper): Ditto. Also remove call to - set_tls_self_pointer. - (pthread::set_tls_self_pointer): Eliminate. - (pthread::get_tls_self_pointer): Just return _my_tls.tid; - (__reent_t::init_clib): Eliminate. - * tlsoffsets.h: Regenerate. - -2003-12-17 Christopher Faylor - - * sigproc.cc (proc_subproc): Simplify code to just remove all zombies - if SIGCHLD == SIG_IGN. - -2003-12-17 Christopher Faylor - - * pinfo.h (pinfo::operator ==): Add a way to check for _pinfo types. - * sigproc.cc (proc_subproc): Ensure that zombie is removed when SIGCHLD - == SIG_IGN but still allow wait()ing threads to wake up. - -2003-12-16 Christopher Faylor - - * exceptions.cc (set_signal_mask): Report on input argument rather than - getsigmask. - - * fhandler.h (fhandler_base): Make friends with close_all_files. - * pinfo.cc (_pinfo::set_ctty): Add more debugging. - * sigproc.cc (proc_can_be_signalled): Detect state when signal handler - thread is gone in target process as an EPERM situation. Set errno to - ESRCH if process doesn't exist. - (sigproc_terminate): Set sendsig to illegal value when closed. - (sig_send): Rely on proc_can_be_signalled setting the proper errno. - * syscalls.cc (close_all_files): Detect when all ttys are closed prior - to calling close_all_files. The ctty needs to be closed explicitly in - this case. - -2003-12-16 Corinna Vinschen - - * include/cygwin/ipc.h: Include sys/types.h. - -2003-12-15 Thomas Pfaff - - * thread.cc (pthread::init_main_thread): Make sure that the main thread - has valid handles. - (pthread::create_cancel_event): Fix error message. - -2003-12-14 Christopher Faylor - - * winsup.h (access_worker): Declare with added fhandler_base parameter. - * syscalls.cc (access_worker): Accommodate extra fhandler_base - argument. Use it instead of stat_worker to determine stat information, - when appropriate. - * fhandler.cc (fhandler_base::device_access_denied): Pass fhandler - pointer to access_worker so that it can use the proper method for - determining stat information. - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Ditto. - * path.cc (path_conv::check): Add read-only attribute to /cygdrive - default settings. - -2003-12-14 Christopher Faylor - - * exceptions.cc (ctrl_c_handler): Remove this thread from the signal - handler chain. - -2003-12-14 Christopher Faylor - - * cygthread.cc (cygthread::stub): Revert previous change and again - subsume cygthread::stub2. Just return from function now since - ExitThread is guaranteed by automatic _threadinfo wrapper. Define as - per ThreadProc convention. - (cygthread::stub2): Remove. - (cygthread::simplestub): Perform similar operations to cygthread::stub. - (cygthread::simplestub2): Remove. - * cygthread.h (cygthread::stub): Declare as per ThreadProc convention. - (cygthread::stub2): Remove declaration. - (cygthread::simplestub): Declare as per ThreadProc convention. - (cygthread::simplestub2): Remove declaration. - * cygtls.h (_threadinfo::call): Define first argument as per ThreadProc - convention. - (_threadinfo::call2): Ditto. - (_tlsbase): Define as char * pointer. - (_tlstop): New definition. - (_main_tls): Define here. - * dcrt0.cc (alloc_stack): Revert previous change which called - init_thread since information would be overwritten by fork later - anyway. - (dll_crt0_1): Use _tlsbase and _tlstop for setting stack bottom, top. - * exceptions.cc: Move _main_tls declaration to cygtls.h. - (_threadinfo::call): Define first argument as per ThreadProc - convention. - (_threadinfo::call2): Call ExitThread with thread function return - value. - (_threadinfo::init_thread): Don't initialize cygtls to zero if input - arg is NULL. - * fork.cc (fork_child): Reset _main_tls here. Reinitialize parts of - _my_tls after copying data from parent. - * init.cc (threadfunc_fe): New function. Front-end for all threads - created in cygwin processes. - (munge_threadfunc): New function. - (dll_entry): Call munge_threadfunc to force the call of a thread - wrapper. - * thread.cc (pthread::thread_init_wrapper): Perform similar operations - to cygthread::stub. - (pthread::thread_init_wrapper2): Remove. - * thread.h (pthread::thread_init_wrapper): Declare as per ThreadProc - convention. - (pthread::thread_init_wrapper2): Remove declaration. - * window.cc (Winmain): Just return from function now since ExitThread - is guaranteed by automatic _threadinfo wrapper. - -2003-12-12 Christopher Faylor - - * dtable.cc (dtable::delete_archetype): Add debugging. - (dtable::release): Move archetype deletion here. - (dtable::vfork_child_dup): Increment ctty usecount to catch later - close_all_files case in parent/child. - (dtable::vfork_child_fixup): Avoid using cygheap->foo where this should - really be using local references. Call close on archetyped handles - since the handles haven't had the noninherit flag set. - * fhandler_tty.cc (fhandler_tty_slave::close): Remove archetype - deletion code. Add defensive error message when DEBUGGING. - (fhandler_tty_common::set_close_on_exec): Use more robust method for - checking whether to set handles into noninherit if there is an - archetype associated with the fhandler. - -2003-12-12 Christopher Faylor - - * dcrt0.cc (alloc_stack): Move _main_tls if stack is relocated. - -2003-12-11 Christopher Faylor - - * miscfuncs.cc (low_priority_sleep): Correct thinko which caused - SetPriority to be called unnecessarily. - * thread.cc (pthread::init_main_thread): Call new create_cancel_event - function. - (pthread::precreate): Ditto. - (pthread::postcreate): Remove cancel_event creation. - (pthread::create_cancel_event): Define new function. - * thread.h (pthread::create_cancel_event): Declare new function. - -2003-12-11 Brian Ford - - * fhandler_serial.cc (fhandler_serial::tcflush): Simplify. Remove - read polling loop to avoid a hang with streaming devices. - -2003-12-11 Christopher Faylor - - * pinfo.cc (_pinfo::set_ctty): Correct stupid typo. - -2003-12-11 Christopher Faylor - - * cygheap.h (cygheap_types): Add HEAP_ARCHETYPES. - (init_cheap::ctty): Change to pointer. - * dtable.h (dtable::find_archetype): Declare new function. - (dtable::add_archetype): Declare new function. - (dtable::delete_archetype): Declare new function. - (dtable::narchetypes): Declare. - (dtable::farchetypes): Declare. - (dtable::initial_archetype_size): Declare. - (dtable::dtable): Initialize new fields. - (dtable::initial_archetype_size): Declare. - * dtable.cc (dtable::find_archetype): Define new function. - (dtable::add_archetype): Define new function. - (dtable::delete_archetype): Define new function. - (dtable::initial_archetype_size): Define. - * fhandler.h (fhandler_base::archetype): Declare. - (fhandler_base::usecount): Declare. - * fhandler.cc (fhandler_base::fhandler_base): Initialize new fields. - * fhandler_console.cc (fhandler_console::get_tty_stuff): Pass NULL to - third argument of set_ctty. - * fhandler_tty.cc (fhandler_tty_slave::open): Accommodate new archetype - method to create only one instance of a tty. - (fhandler_tty_slave::close): Don't close handles unless archetype - usecount is zero. When that happens, close archetype too. - (fhandler_tty_slave::dup): Just copy archetype. Set use count - appropriately. Set ctty, if appropriate. - (fhandler_tty_common::dup): Remove slave considerations. - (fhandler_tty_common::set_close_on_exec): Remove cygheap->ctty - considerations. - * pinfo.cc (_pinfo::set_ctty): Accommodate new archetype methods. - * pinfo.h (_pinfo::set_ctty): Make third argument explicit. - * syscalls.cc (close_all_files): Decrement controlling tty use count - before closing all handles to allow controlling tty to be closed. - Remove previous controlling tty considerations. - -2003-12-09 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_common::dup): Just copy cygheap->ctty - to child if duping the current ctty. - (fhandler_tty_common::close): Move debugging statement earlier in function. - (fhandler_tty_slave::close): Return success when closing ctty. - * syscalls.cc (close_all_files): Avoid calling fhandler_tty_slave close - method so that open_fhs will not be decremented when closing cygheap - ctty. - (setsid): Ditto. - * dcrt0.cc (do_exit): Reorganize to avoid leaving a critical section - active after vfork. - * fhandler.h (fhandler_tty_slave::get_unit): Remove regparm parameter - since it can't work in a virtualized function. - -2003-12-08 Christopher Faylor - - * pinfo.cc (_pinfo::set_ctty): Don't copy over existing ctty if it is - active. - -2003-12-08 Christopher Faylor - - * thread.cc (pthread::precreate): Delete duplicate setting of - cancel_event. - -2003-12-08 Christopher Faylor - - * fhandler.h (fhandler_tty_slave::ttyname): Use name from pc since it - is guaranteed to be accurate. - * fhandler_tty.cc (fhandler_tty_slave::open): Increment open_fhs - appropriate when copying ctty. - (fhandler_tty_slave::close): Remove special case handling for - exit_state. Use ctty < 0 check instead. - (fhandler_tty_common::close): Set io_handle to NULL after closing. - * syscalls.cc (close_all_files): Specifically close cygheap->ctty, if - appropriate. - -2003-12-07 Christopher Faylor - - * spawn.cc (spawn_guts): Change type back to 'int' after erroneous - change below. - * wait.cc (wait4): Move sawsig initialization inside loop. - -2003-12-07 Christopher Faylor - - Change use of BOOL, TRUE, FALSE to bool, true, false, as appropriate, - throughout. - -2003-12-07 Pierre Humblet - - * tty.cc (tty::common_init): Remove call to SetKernelObjectSecurity and - edit some comments. - -2003-12-07 Christopher Faylor - - * cygheap.h (init_cygheap::ctty): Add new element. - * devices.in (device::parse): Remove special handling for /dev/tty. - * devices.cc: Regenerate. - * dtable.cc (build_fh_pc): Don't reset /dev/tty device. Let the device - opener do that. - * fhandler_termios.cc (tty_min::set_ctty): Redefine to _pinfo class. - * fhandler_tty.cc (fhandler_tty_common::set_close_on_exec): Avoid - setting noninherit flag for ctty. - * tty.h: Move BOOLs to bools. - (tty_min::set_ctty): Redeclare to _pinfo class. - * pinfo.cc (_pinfo::set_ctty): Define new function based on - tty_min::set_ctty. Change first argument from tty number to tty_min - class. - * pinfo.h (_pinfo::set_ctty): Declare. - * fhandler_console.cc (fhandler_console::get_tty_stuff): Reflect move - of set_ctty to _pinfo class. - * fhandler_tty.cc (fhandler_tty_slave::open): Treat FH_TTY specially. - Use saved cygheap value if it exists. Otherwise convert to real device - and save on first time open. - (fhandler_tty_common::dup): Potentially set controlling tty if duping a - slave tty. - * syscalls.cc (setsid): Close controlling tty in cygheap. - * tty.cc: Change some BOOLs to bools. - -2003-12-07 Pierre Humblet - - * syscalls.cc (locked_append): New. - (updwtmp): Remove mutex code and call locked_append. - (pututline): Ditto. - -2003-12-06 Christopher Faylor - - * exceptions.cc (_threadinfo::remove): Avoid a linked list walk. - -2003-12-06 Christopher Faylor - - * cygtls.h (_threadinfo::find_tls): New function. - * exceptions.cc (_threadinfo::find_tls): Rename from find_tls. Use - critical section to protect access to linked list. - -2003-12-06 Christopher Faylor - - * exceptions.cc (_threadinfo::remove): Avoid returning without - unlocking critical section in the (hopefully impossible) case of an - unrecognized thread. - -2003-12-06 Christopher Faylor - - * cygtls.h: Add more "don't parse this" guards. - (_threadinfo::init_thread): Rename from 'init'. - (_threadinfo::init): Declare new function. - (_threadinfo::protect_linked_list): Declare new critical section. - * dcrt0.cc (dll_crt0_1): Call init_thread to initialize thread stuff. - (_dll_crt0): Call _threadinfo::init prior to invoking dll_crt0_1. - * exceptions.cc (_threadinfo::init_thread): Rename from 'init'. - (_threadinfo::init): Define new function. Protect linked list - manipulation with new critical section. - (_threadinfo::call): Reflect function name change. - (_threadinfo::remove): Protect linked list manipulation with new - critical section - * gentls_offsets: Rework to allow multi-line "don't parse this" - protection. - * init.cc (dll_entry): Don't remove threads info stuff here since the - remove function uses a critical section which can't be used during - thread creation or destruction. - * thread.cc (pthread::exit): Call _threadinfo remove function here. - -2003-12-05 Christopher Faylor - - * cygthread.cc (cygthread::stub2): Remove myself from the list of - threads monitored by signals since this thread will never call raise or - sigwait. - (cygthread::simplestub2): Ditto. Set ev here. - (cygthread::cygthread): Don't set ev here for freerange thread. - -2003-12-04 Christopher Faylor - - * path.cc (slash_unc_prefix_p): Allow '.' as a valid character after - '\\' in a UNC path. - -2003-12-04 Christopher Faylor - - * exceptions.cc (setup_handler): Remove ill-advised debugging output. - -2003-12-04 Corinna Vinschen - - * include/cygwin/types.h (struct __fcntl64): Fix datatype of l_start. - -2003-12-03 Corinna Vinschen - - Substitute 0x7fffffff and 0xffffffff by INT32_MAX and UINT32_MAX - throughout, except in assembler code. - -2003-12-03 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::lock): Use UINT32_MAX - instead of 0xffffffff. Accommodate Win 9x bug in evaluating length - of area to lock when given length is 0. - -2003-12-03 Pierre Humblet - - * fhandler_disk_file.cc (fhandler_disk_file::lock): Interchange - values of off_low and off_high. - -2003-12-03 Corinna Vinschen - - * fcntl.cc (fcntl_worker): Remove static storage class. - * flock.cc (flock): Use struct __flock64. Call fcntl_worker. - Use Cygwin errno functions instead of accessing errno directly. - * winsup.h: Declare fcntl_worker. - -2003-12-03 Corinna Vinschen - - * fcntl.cc: Whitespace cleanup. - -2003-12-03 Christopher Faylor - - * cygthread.cc (cygthread::stub): Properly establish _threadinfo - environment. - (cygthread::stub2): New function. - (cygthread::simplestub): Ditto. - (cygthread::simplestub2): New function. - * cygthread.h (cygthread::stub2): Declare new function. - (cygthread::simplestub2): Ditto. - * cygtls.h (_threadinfo::call): Declare new function. - (_threadinfo::call2): Ditto. - * dcrt0.cc (dll_crt0_1): Accommodate new _threadinfo::init which - doesn't return pointer to tls. - (_dll_crt0): Remove obsolete DECLARE_TLS_STORAGE. - (dll_crt0): Ditto. - * exceptions.cc (_threadinfo::call): New function. - (_threadinfo::call2): Ditto. - (_threadinfo::init): Don't return pointer. - * thread.cc (pthread::thread_init_wrapper): Properly establish - _threadinfo environment. - (pthread::thread_init_wrapper2): New function. - * thread.h (pthread::thread_init_wrapper): Remove noreturn attribute - (pthread::thread_init_wrapper2): Declare new function. - * winbase.h: Remove obsolete code. - -2003-12-02 Christopher Faylor - - * Makefile.in: Change the way that -f options are appended to CFLAGS, - slightly. - -2003-12-02 Christopher Faylor - - * fcntl.cc (_fcntl): Silence a compiler warning. - -2003-12-02 Pierre Humblet - - * pinfo.cc (pinfo::init): Use shared_name to construct the mapname. - -2003-12-01 Thomas Pfaff - - * thread.cc (pthread_rwlock::add_reader): Remove mx parameter for - List_insert call. - (pthread::prepare): Ensure race safeness when adding function - pointers to atfork lists by using List_insert. - * thread.h (List_insert): Use InterlockedCompareExchangePointer to - ensure race safeness without using a mutex. - (List_remove): Use InterlockedCompareExchangePointer to - ensure race safeness with List_insert. - (List::insert): Remove mx parameter for List_insert call. - -2003-12-01 Corinna Vinschen - - * Makefile.in (OBSOLETE_FUNCTIONS): Add fcntl. - (NEW_FUNCTIONS): Add fcntl64. - * cygwin.din: Export fcntl64. Make fcntl being SIGFE. - * fcntl.cc (fcntl_worker): New function. - (fcntl64): New function. - (_fcntl): Call fcntl_worker. Convert 32 bit flock structure into - 64 bit flock structure and vice versa. - * fhandler.cc (fhandler_base::lock): Change 2nd parameter to - struct __flock64 *. - * fhandler_disk_file.cc (fhandler_disk_file::lock): Ditto. Rework - to be 64 bit aware. - * fhandler.h: Accommodate above method argument changes. - * include/cygwin/types.h: Add struct __flock32 and __flock64. - Define struct flock according to setting of __CYGWIN_USE_BIG_TYPES__. - * include/cygwin/version.h: Bump API minor number. - -2003-12-01 Corinna Vinschen - - * cygheap.cc (cygheap_init): Set cygheap->shared_prefix. - * cygheap.h (struct init_cygheap): Add shared_prefix. - * shared.cc (shared_name): Use cygheap->shared_prefix. - -2003-12-01 Pierre Humblet - - * shared.cc (shared_name): Take into account the SE_CREATE_GLOBAL_NAME - privilege when building the name string. - (open_shared): Remove the call to OpenFileMapping. - (shared_info::initialize): Move cygheap initialization to ... - (memory_init): ... here. Suppress now useless shared_h variable. - (user_shared_initialize): Make tu a cygpsid. - -2003-12-01 Dr. Volker Zell - - * include/tzfile.h: Remove duplicate definition of TM_SUNDAY. - * localtime.cc: Point TZDIR to the /usr/share/zoneinfo directory used - by the tzcode package. - -2003-11-30 Corinna Vinschen - - * flock.cc: Renamed from flock.c. - -2003-11-29 Christopher Faylor - - * pinfo.h: Remove global_sigs declaration. - * siginfo.h: Move global_sigs declaration here. - * Makefile.in: Remove duplicate compiler flag. - -2003-11-29 Christopher Faylor - - * exceptions.cc (_threadinfo::pop): Zero *contents* of popped stack - location rather than the actual stack pointer. - -2003-11-29 Nicholas Wourms - - * Makefile.in: (DLL_OFILES): Add flock.o. - * cygwin.din: Export flock. - * flock.c: New file. - * include/sys/file.h: Include sys/cdefs.h. - Add function prototype for flock(). - Add some comments from BSD's header for further clarity. - (L_SET, L_CURR, L_INCR, L_XTND): Redefine as the macros - SEEK_SET, SEEK_CUR, SEEK_CUR, & SEEK_END respectively. - (LOCK_SH,LOCK_EX,LOCK_NB,LOCK_UN): New macros for flock(). - * include/cygwin/version.h: Bump API minor number. - -2003-11-28 Christopher Faylor - - * sigproc.cc (no_signals_available): Fix so that non-zero exit state is - a true condition rather than errnoneously only checking other states - when exist_state was zero. - -2003-11-28 Christopher Faylor - - * pinfo.h (_pinfo::getthread2signal): Remove obsolete function. - * cygtls.h (_threadinfo): Define tid more precisely. - (_threadinfo::operator HANDLE): Define. - * exceptions.cc (_threadinfo::interupt_now): Use _threadinfo HANDLE - operator to derive thread handle. - (setup_handler): Ditto. - * sigproc.cc: Reorganize includes. Fix no_signals_available test to - properly return true when !sig_wait_loop. - -2003-11-28 Christopher Faylor - - * pinfo.h (_pinfo::getsig): Remove obsolete function, here and - throughout. - * exceptions.cc: Ditto. - * fhandler_termios.cc: Ditto. - * signal.cc: Ditto. - * sigproc.cc: Ditto. - - * Makefile.in: Revert previous change which made a cygwin.din newer - than a version.h a warning rather than an error. - -2003-11-28 Christopher Faylor - - * cygwin.din: Re-add inexplicably missing semaphore/msg functions. - -2003-11-28 Christopher Faylor - - * gendevices: Issue error when shilka is missing. - -2003-11-28 Christopher Faylor - - * include/cygwin/signal.h: New file. - -2003-11-28 Christopher Faylor - - Eliminate use of sigframe and sigthread throughout. - * Makefile.in (DLL_OFILES): Add sigfe.o. Remove reliance on cygwin.def - from cygwin0.dll dependency since dependence on sigfe.o implies that. - Generate def file on the fly using 'gendef'. - * configure.in: Don't auto-generate cygwin.def. - * configure: Regenerate. - * cygwin.din: Add SIGFE stuff where appropriate. - * dcrt0.cc (dll_crt0_1): Initialize cygwin tls early in process - startup. Set _main_tls to address of the main thread's cygwin tls. - * debug.h: Remove now unneeded WFSO and WFMO declarations. - * exceptions.cc (_last_thread): Define. - (set_thread_state_for_signals): New function. - (reset_thread_exception_for_signals): Ditto. - (init_thread_for_signals): Ditto. - (delete_thread_for_signals): Ditto. - (capture_thread_for_signals): Ditto. - (handle_exceptions): Set return address explicitly for exceptions prior - to calling sig_send. - (interrupt_on_return): Eliminate. - (setup_handler): Add preliminary implementation for dealing with - thread-specific signals by querying _main_tls. - (signal_exit): Use cygthread::main_thread_id instead of mainthread.id. - (call_signal_handler_now): For now, just handle the main thread. - * fork.cc (vfork): Save and restore main _my_tls. - * gendef: New file. Generates def file and sigfe.s file. - * gentls_offsets: New file. Generates offsets for perl to use in - sigfe.s. - * how-signals-work.txt: Mention that info is obsolete. - * init.cc (dll_entry): Initialize cygwin tls storage here. - * miscfuncs.cc (low_priority_sleep): Make a C function for easier - calling from asm. - * perthread.h (vfork_save::tls): New element. - * signal.cc (nanosleep): Replace previous use of - sigframe.call_signal_handler_now with straight call to - call_signal_handler_now. - (abort): Ditto. - * syscalls.cc (readv): Ditto. - * termios.cc (tcsetattr): Ditto. - * wait.cc (wait4): Ditto. - * sigproc.cc (sig_dispatch_pending): Ditto. - (sig_send): Ditto. - * sigproc.h: Declare call_signal_handler_now. - * thread.cc (pthread::thread_init_wrapper): Initialize cygwin tls. - Remove obsolete and unworking signal stuff. - * thread.h (verifyable_object::sigs): Eliminate. - (verifyable_object::sigmask): Eliminate. - (verifyable_object::sigtodo): Eliminate. - (verifyable_object::exit): Make attribute noreturn. - (verifyable_object::thread_init_wrapper): Ditto. - (pthread_null::exit): Ditto. - * winbase.h (__stackbase): Always define. - * winsup.h (low_priority_sleep): Declare as a "C" function. - * include/cygwin/version.h: Bump API version to reflect sigwait export. - - * include/sys/queue.h: Protect SLIST_ENTRY from previous declaration. - - * signal.cc (sigwait): Implement. - - * select.cc (fhandler_base::ready_for_read): Add debugging output. - - * devices.h: Define more device pointers via their storage. - * devices.in: Don't parse things like /dev/inet/tcp, as they really - have no meaning. - * devices.cc: Regenerate. - * gendevices: Set proper protection for output file. - - * cygtls.h: New file. - * gendef: New file. - * gentls_offsets: New file. - * tlsoffsets.h: New file. Autogenerated. - * config/i386/longjmp.c: Remove. File subsumed by gendef output. - * config/i386/makefrag: Remove obsolete file. - - * fhandler.cc: Remove spurious access_worker declaration. - - * spawn.cc (spawnve): Make debugging output more accurate. - - * cygwin-gperf: Remove. - * devices.cc: Remove. - -2003-11-28 Christopher Faylor - - * speclib: Use correct EOF marker. Ensure that directory is actually - deleted when running under Windows. - -2003-11-27 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::readdir): Reorganize to - avoid inappropriate .lnk extensions with munged filenames under managed - mode. - -2003-11-26 Corinna Vinschen - - * sec_helper.cc (set_process_privilege): Rename restore_priv to - priv_luid. - -2003-11-26 Pierre Humblet - - * sec_helper.cc (set_process_privilege): Call LookupPrivilegeValue - before opening the token. - -2003-11-26 Corinna Vinschen - - * dir.cc (mkdir): Use local security_descriptor. Call - set_security_attribute appropriately. - * external.cc (cygwin_internal): Ditto. - * fhandler.cc (fhandler_base::open): Ditto. - * fhandler_socket.cc (fhandler_socket::bind): Ditto. - * path.cc (symlink_worker): Ditto. - * sec_acl.cc (setacl): Ditto. Call read_sd appropriately. - (getace): Ditto. - * sec_helper.cc (security_descriptor::malloc): New method. - (security_descriptor::realloc): New method. - (security_descriptor::free): New method. - * security.cc (read_sd): Get security_descriptor as parameter instead - of PSECURITY_DESCRIPTOR and a size. Drop unnecessary parameter check. - Allocate the security_descriptor buffer according to size returned by - a call to GetFileSecurity. Return buffer size on success. - (write_sd): Get security_descriptor as parameter instead of - PSECURITY_DESCRIPTOR and a size. - (get_nt_attribute): Use local security_descriptor. - (get_nt_object_attribute): Ditto in case of type == SE_REGISTRY_KEY. - Allocate security_descriptor buffer according to size returned by - a call to RegGetKeySecurity. - (alloc_sd): Make static. Get security_descriptor as parameter instead - of PSECURITY_DESCRIPTOR and a size. Drop unnecessary parameter check. - (set_security_attribute): Get security_descriptor as parameter instead - of PSECURITY_DESCRIPTOR and a size. - (set_nt_attribute): Use local security_descriptor. - (check_file_access): Ditto. - * security.h: Add class security_descriptor. - (read_sd): Change declaration to get security_descriptor as parameter - instead of PSECURITY_DESCRIPTOR and a size. - (write_sd): Ditto. - (set_security_attribute): Ditto. - (alloc_sd): Remove declaration. - * thread.cc (semaphore::semaphore): Use local security_descriptor. Call - set_security_attribute appropriately. - -2003-11-26 Corinna Vinschen - - * sec_acl.h (getace): Use FILE_*_BITS as permission mask. - * security.cc (get_attribute_from_acl): Ditto. - * security.h (FILE_READ_BITS): Define to match also GENERIC bits. - (FILE_WRITE_BITS): Ditto. - (FILE_EXEC_BITS): Ditto. - -2003-11-25 Christopher Faylor - - * thread.cc: Minor whitespace cleanup. Remove some obsolete code. - -2003-11-24 Christopher Faylor - - * dtable.cc (build_fh_name): Set error in dummy fhandler when one is - noted during path_conv. - * fhandler.h (fhandler_base::set_error): New method. - -2003-11-24 Christopher Faylor - - * configure.in: Avoid using cygserver unless hosting on cygwin. - -2003-11-23 Christopher Faylor - - * sigproc.cc (sig_send): Correct below checkin. Use - thisframe.call_signal_handler. - -2003-11-23 Christopher Faylor - - * sigproc.cc (proc_exists): A zombie process does not exist. - (sig_send): Improve debugging output. Wait for pipe to be created - before trying to send to it. Call call_signal_handler_now if sending a - signal to myself. - -2003-11-22 Christopher Faylor - - * dcrt0.cc (check_sanity_and_sync): Correct api major version check so - that newer dlls will work with older apps but not vice versa. - -2003-11-21 Christopher Faylor - - * sem.cc: Always include signal.h to handle SIGSYS raise when - !USE_SERVER. - * shm.cc: Ditto. - -2003-11-21 Christopher Faylor - - * msg.cc: Always include signal.h to handle SIGSYS raise when - !USE_SERVER. - -2003-11-20 Christopher Faylor - - * configure.in: Make --use-server the default. Remove powerpc target. - * configure: Regenerate. - -2003-11-20 Corinna Vinschen - - * msg.cc (msgctl): Raise SIGSYS if call not available. - (msgget): Ditto. - (msgrcv): Ditto. - (msgsnd): Ditto. - * sem.cc (semctl): Ditto. - (semget): Ditto. - (semop): Ditto. - * shm.cc (shmat): Ditto. - (shmctl): Ditto. - (shmget): Ditto. - (shmdt): Ditto. - -2003-11-19 Corinna Vinschen - - * cygserver.h (client_request::request_code_t): Add - CYGSERVER_REQUEST_MSG and CYGSERVER_REQUEST_SEM. - (admininstrator_group_sid): Add extern declaration. - * cygserver_ipc.h: Rewrite. - * cygserver_msg.h: New file. - * cygserver_sem.h: New file. - * cygserver_shm.h: More or less rewrite. - * cygwin.din: Add msgctl, msgget, msgrcv, msgsnd, semctl, semget and - semop. - * msg.cc: Rewrite. - * safe_memory.h: Remove. - * sem.cc: Rewrite. - * shm.cc: Rewrite. - * include/cygwin/ipc.h: Use appropriate guard. - (struct ipc_perm): Add seq. - (IPCID_TO_IX): New define from BSD. - (IPCID_TO_SEQ): Ditto. - (IXSEQ_TO_IPCID): Ditto. - (IPC_R): Ditto. - (IPC_W): Ditto. - (IPC_M): Ditto. - * include/cygwin/msg.h: Use appropriate guard. #ifdef _KERNEL all stuff - not explicitely defined by SUSv3. Use signed types in structs to match - types used in BSD. - (msgqnum_t): Define unsigned. - (msglen_t): Ditto. - (struct msqid_ds): Add msg_first and msg_last. - (struct msginfo): Remove msgpool. Add msgssz and msgseg. - * include/cygwin/sem.h: Use appropriate guard. #ifdef _KERNEL all stuff - not explicitely defined by SUSv3. Use signed types in structs to match - types used in BSD. - (SEM_UNDO): Define appropriately. - (struct semid_ds): Add sem_base. - (struct seminfo): Add semmap and semusz. - (SEM_A): New define from BSD. - (SEM_R): Ditto. - (SEM_ALLOC): Ditto. - (union semun): Define. - * include/cygwin/shm.h: Use appropriate guard. #ifdef _KERNEL all stuff - not explicitely defined by SUSv3. Use signed types in structs to match - types used in BSD. - (SHMLBA): Define using cygwin_internal(CW_GET_SHMLBA) call. - (struct shmid_ds): Add shm_internal. - (struct shm_info): Rename shm_ids to used_ids as in BSD. Add define - for shm_ids. - * include/cygwin/sysproto.h: New file. - * include/cygwin/version.h: Bump API minor number. - * include/sys/ipc.h: New file. - * include/sys/msg.h: New file. - * include/sys/queue.h: New file from BSD. - * include/sys/sem.h: New file. - * include/sys/shm.h: New file. - * include/sys/sysproto.h: New file. - -2003-11-19 Corinna Vinschen - - * dtable.cc (build_fh_pc): Resurrect accidentally removed - DEV_CYGDRIVE_MAJOR case. - -2003-11-17 Brian Ford - - * fhandler.cc (fhandler_base::lseek): Include high order offset - bits in return value. - -2003-11-17 Corinna Vinschen - - * bsdlib.cc (getprogname): New function. - (setprogname): New funtion. - * cygwin.din: Export getprogname and setprogname. - * include/cygwin/version.h: Bumb API version number. - -2003-11-15 Christopher Faylor - - * include/limits.h: Revert unsanctioned changes below. - * include/cygwin/config.h: Ditto. - * include/sys/param.h: Ditto. - -2003-11-14 Robert Collins - Ron Parker - - * bsdlib.cc: Update throughout to use CYG_MAX_PATH rather than MAX_PATH. - * cygheap.h: Ditto. - * dcrt0.cc: Ditto. - * delqueue.cc: Ditto. - * dlfcn.cc: Ditto. - * dll_init.cc: Ditto. - * dll_init.h: Ditto. - * dtable.cc: Ditto. - * environ.cc: Ditto. - * environ.h: Ditto. - * exceptions.cc: Ditto. - * external.cc: Ditto. - * fhandler_disk_file.cc: Ditto. - * fhandler_proc.cc: Ditto. - * fhandler_process.cc: Ditto. - * fhandler_raw.cc: Ditto. - * fhandler_registry.cc: Ditto. - * fhandler_socket.cc: Ditto. - * fhandler_virtual.cc: Ditto. - * miscfuncs.cc: Ditto. - * mmap.cc: Ditto. - * netdb.cc: Ditto. - * path.cc: Ditto. - * path.h: Ditto. - * pinfo.cc: Ditto. - * pinfo.h: Ditto. - * pthread.cc: Ditto. - * registry.cc: Ditto. - * shared.cc: Ditto. - * shared_info.h: Ditto. - * smallprint.c: Ditto. - * spawn.cc: Ditto. - * strace.cc: Ditto. - * syscalls.cc: Ditto. - * thread.h: Ditto. - * uinfo.cc: Ditto. - * winsup.h: Ditto. - * include/limits.h: Ditto. - * include/cygwin/config.h: Ditto. - * include/sys/param.h: Ditto. - -2003-11-12 Brian Ford - - * dtable.cc (build_fh_pc): Use DEV_SERIAL_MAJOR to catch all serial - ports. Remove redundant FH_CYGDRIVE case since it is handled by - DEV_CYGDRIVE_MAJOR. - -2003-11-11 Christopher Faylor - Thomas Pfaff - - * thread.cc (pthread::exit): Cleanup on thread exit. - (__reent_t::init_clib): Set thread local clib __cleanup var - appropriately. - -2003-11-10 Christopher Faylor - - * miscfuncs.cc (low_priority_sleep): Make a "C" function. - * winsup.h (low_priority_sleep): Revert previous change to declaration. - -2003-11-10 Corinna Vinschen - - * winsup.h (low_priority_sleep): Fix declaration to avoid linker - warning. - -2003-11-10 Thomas Pfaff - - * thread.cc (__reent_t::init_clib): Set thread local clib - __sdidinit var appropriately. - -2003-11-08 Corinna Vinschen - - * syscalls.cc (ftruncate64): Log length as long long. - (logout): Erase ut_host. Don't write wtmp entry. Return 1 only - if matching utmp entry has been found, 0 otherwise. - -2003-11-08 Corinna Vinschen - - * external.cc (cygwin_internal): Add CW_GET_UID_FROM_SID and - CW_GET_GID_FROM_SID handling. - * include/cygwin/version.h: Bump API minor number. - * include/sys/cygwin.h (cygwin_getinfo_types): Add - CW_GET_UID_FROM_SID and CW_GET_GID_FROM_SID. - -2003-11-07 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Reorganize to - handle freeing of memory on error condition. - -2003-11-07 Christopher Faylor - - * cygthread.cc (cygthread::freerange): Set inuse count. Avoid setting - ev from h as h would be NULL at this point. - (cygthread::operator new): Issue debugging info when overflowing the - thread pool. - (cygthread::cygthread): Set ev from h here after h has been initialized. - -2003-11-06 Corinna Vinschen - - * bsdlib.cc (_vwarnx): New function. - (vwarn): Ditto. - (vwarnx): Ditto. - (warn): Ditto. - (warnx): Ditto. - (verr): Ditto. - (verrx): Ditto. - (err): Ditto. - (errx): Ditto. - * cygwin.din: Export above functions. - * include/err.h: New file. - * include/cygwin/version.h: Bump API minor number. - -2003-11-06 Corinna Vinschen - - * syscalls.cc (getshmlba): New function. - * external.cc (cygwin_internal): Add CW_GET_SHMLBA handling. - * mmap.cc (mmap64): Call getshmlba to evaluate granularity. - * winsup.h (getshmlba): Add declaration. - * include/cygwin/version.h: Bump API minor number. - * include/sys/cygwin.h (cygwin_getinfo_types): Add CW_GET_SHMLBA. - -2003-11-06 Christopher Faylor - - * winsup.h: Declare access_worker. - -2003-11-05 Corinna Vinschen - - * include/cygwin/types.h: Fix preprocessor guards for vm_offset_t and - vm_size_t. Add typedef for vm_object_t. - -2003-11-05 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Detect attempt - to open a directory which lacks read privileges. - -2003-11-04 Corinna Vinschen - - * external.cc (cygwin_internal): Add CW_GET_POSIX_SECURITY_ATTRIBUTE - handling. - * include/cygwin/version.h: Bump API minor number. - * include/sys/cygwin.h (cygwin_getinfo_types): Add - CW_GET_POSIX_SECURITY_ATTRIBUTE. - - * exceptions.cc (init_global_security): Move from here... - * sec_helper.cc (init_global_security): ...to here. - -2003-11-04 Christopher Faylor - - * net.cc (dup_ent): Use IsBadStringPtr for alignment checks. Don't use - a known bad pointer. - -2003-11-03 Corinna Vinschen - - * net.cc (dup_ent): Move Win 95 misalignment recogition before - trying to evaluate string length. - -2003-10-31 Thomas Pfaff - - * thread.cc (pthread::thread_init_wrapper): Initialize exception - handling. - -2003-10-31 Thomas Pfaff - - Rename pthread::running to pthread::valid throughout. - - * thread.h: (pthread::suspend_all_except_self): New static method. - (pthread::resume_all): Ditto. - (pthread::suspend_except_self): New method. - (pthread::resume): Ditto. - * thread.cc (pthread::suspend_except_self): Implement. - (pthread::resume): Ditto. - -2003-10-29 Danny Smith - - * include/stdint.h: Prevent signed->unsigned conversion for 32 and - 64 bit min value constants. - -2003-10-28 Igor Pechtchanski - - * path.cc (dot_special_chars): New global variable. - (special_name): Make files ending in "." special. - (fnunmunge): Allow encoded ".". - (mount_item::fnmunge): Handle trailing ".". - -2003-10-28 Christopher Faylor - - * include/stdint.h: Duplicate below effort for rest of *64_*. - -2003-10-28 Christopher Faylor - - * include/stdint.h: Correctly define INT64_MAX. - -2003-10-27 Thomas Pfaff - - * thread.h (fast_mutex::init): Initialize lock_counter. - -2003-10-27 Corinna Vinschen - - * Makefile.in (OBSOLETE_FUNCTION): Add tmpfile. - (NEW_FUNCTIONS): Add _tmpfile64 -> tmpfile translation. - * cygwin.din: Export _tmpfile64 - * include/cygwin/version.h: Bump api minor number. - -2003-10-27 Corinna Vinschen - - * cygwin.din: Add sem_close, sem_getvalue, sem_open and sem_timedwait. - * pthread.cc (+mangle_sem_name): New function. - (sem_open): Ditto. - (sem_close: Ditto. - (sem_timedwait): Ditto. - (sem_getvalue): Ditto. - * thread.cc (semaphore::semaphore): Rearrange member initialization. - Use appropriate security attribute for process shared semaphores. - (semaphore::semaphore): New constructor for named semaphores. - (semaphore::~semaphore): Care for semaphore name. - (semaphore::_post): Accommodate failing ReleaseSemaphore. Use value - returned by ReleaseSemaphore vor currentvalue. - (semaphore::_getvalue): New method. - (semaphore::_timedwait): Ditto. - (semaphore::_fixup_after_fork): Rearrange. Don't fail for process - shared semaphores. - (semaphore::open): New method. - (semaphore::timedwait): Ditto. - (semaphore::post): Fix return value. Set errno appropriately. - (semaphore::getvalue): New method. - * thread.h (class semaphore): Add prototypes for open, getvalue, - timedwait, _getvalue, _timedwait. Add prototypes for new constructor. - Add name member. - * include/semaphore.h: Add prototypes for sem_open, sem_close, - sem_timedwait and sem_getvalue. - include/cygwin/version.h: Bump API minor number. - -2003-10-27 Corinna Vinschen - - * miscfunc.cc (__check_invalid_read_ptr): New function. - * winsup.h: Declare. - -2003-10-26 Corinna Vinschen - - * security.h (cygpsid::debug_print): Avoid compiler warnings. - -2003-10-25 Corinna Vinschen - - * path.cc (normalize_posix_path): Test runs of more than two - dots for being a run of only dots. Let it pass if not. - -2003-10-25 Brian Ford - - * fhandler.cc (fhandler_base::ioctl): Handle FIONBIO. - -2003-10-24 Thomas Pfaff - - Rename native_mutex to fast_mutex throughout. - Rename pthread_key::save_key_to_buffer to - pthread_key::_fixup_before_fork throughout. - Rename pthread_key::recreate_key_from_buffer to - pthread_key::_fixup_after_fork throughout. - - * thread.cc (native_mutex::init): Remove. - (native_mutex::lock): Ditto. - (native_mutex::unlock): Ditto. - (pthread::push_cleanup_handler): InterlockedExchangePointer - is not needed here. - (pthread_rwlock::pthread_rwlock): Initialize readers list mutex. - (pthread_rwlock::add_reader): Add reader via List_insert. - (pthread_rwlock::lookup_reader): Lock list while walking through. - (pthread_cond::init): Locking the init mutex is now void. - (pthread_rwlock::init): Ditto. - (pthread_mutex::init): Ditto. - * thread.h: Include security.h. - (fast_mutex): New class. Replacement for native_mutex. - (List_insert): New template function. - (List_remove): Ditto. - (List::List): Initialize synchronising mutex. - (List::fixup_after_fork): New method. - (List::insert): Add node via List_insert. - (List::remove): Remove node via List_remove. - (List::pop): Remove. - (List::for_each): Lock list while walking through. - (List::mx_init): New method. - (pthread_mutex::fixup_after_fork): Fixup mutex list after fork. - (pthread::fixup_after_fork): Ditto. - (pthread_conds::fixup_after_fork): Ditto. - (pthread_rwlock::fixup_after_fork): Ditto. - (semaphore::fixup_after_fork): Ditto. - (pthread_rwlock::readers_mx): New member. - -2003-10-24 Brian Ford - - * fhandler.cc (fhandler_base::fcntl): Don't clobber O_APPEND when - both O_NONBLOCK/O_NDELAY are set for F_SETFL. - -2003-10-24 Corinna Vinschen - - * path.cc (win32_device_name): Fix comment. - -2003-10-23 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::ioctl): Properly set return - value in FIONBIO case. - -2003-10-23 Corinna Vinschen - - * fhandler_proc.cc (format_proc_partitions): Use new device code - to get major and minor device numbers. Fix size evaluation. - -2003-10-22 Corinna Vinschen - - * external.cc (cygwin_internal): Add CW_GET_ERRNO_FROM_WINERROR - handling. - * include/cygwin/version.h: Bump API minor number. - * include/sys/cygwin.h (cygwin_getinfo_types): Add - CW_GET_ERRNO_FROM_WINERROR. - -2003-10-22 Corinna Vinschen - - * Makefile.in: Add $(LIBSERVER) rule. - * cygserver.h: Moved from include/cygwin to here. - * cygserver_ipc.h: Moved from ../cygserver to here. - * cygserver_shm.h: Ditto. - * cygwin.din: Add shmat, shmctl, shmdt and shmget. - * fhandler_tty.cc (fhandler_tty_slave::open): Don't warn about handle - dup'ing if not build with USE_SERVER. - * shm.cc: Include cygerrno.h unconditionally. - (shmat): Set errno to ENOSYS and return -1 if not build with - USE_SERVER. - (shmctl): Ditto. - (shmdt): Ditto. - (shmget): Ditto. - * woutsup.h: Remove. - * include/cygwin/cygserver_process.h: Moved to ../cygserver directory. - * include/cygwin/cygserver_transport.h: Ditto. - * include/cygwin/cygserver_transport_pipes.h: Ditto. - * include/cygwin/cygserver_transport_sockets.h: Ditto. - * include/cygwin/version.h: Bump API minor number. - -2003-10-16 Pierre Humblet - - * syscalls.cc (seteuid32): Always construct a default DACL including - the new sid, Admins and SYSTEM and copy it to the new thread token. - * security.cc (create_token): Use a NULL default DACL in NtCreateToken. - -2003-10-14 Micha Nelissen - - * dcrt0.cc: Remove local variable alternate_charset_active. - * fhandler.h: Add variable alternate_charset_active, functions - str_to_con, con_to_str to dev_console structure. - * fhandler_console.cc (con_to_str): Move function into dev_console - class. - (str_to_con): Ditto. - (fhandler_console::read): Call con_to_str on dev_state. - (fhandler_console::write_normal): Call str_to_con on dev_state. - (fhandler_console::char_command): Change active_charset_active - assignment to be on dev_state. - * winsup.h: Remove global external variable alternate_charset_active. - -2003-10-13 Micha Nelissen - - * fhandler_console.cc (char_command): Add escape sequence for codepage - ansi <-> oem switching for ncurses frame drawing capabilities. - * dcrt0.cc: Add local variable alternate_charset_active. - * winsup.h: Add global external variable alternate_charset_active. - -2003-10-14 Corinna Vinschen - - * exceptions.cc (ctrl_c_handler): Don't send SIGHUP on - CTRL_LOGOFF_EVENT to processes running in invisible Windows Stations. - * window.cc (has_visible_window_station): New function. - * winsup.h: Add declaration for has_visible_window_station. - -2003-10-10 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::open): Don't create a new window - station if one already exists. - -2003-10-10 Christopher Faylor - - * shared.cc (shared_info::initialize): Remove myself check since - hMainProc initialization will allow user initialization to work. - -2003-10-09 Yitzchak Scott-Thoennes - - * include/sys/mman.h (MAP_FAILED): Define as void *. - -2003-10-08 Christopher Faylor - - * dcrt0.cc (hMainProc): Initialize to useful value for use when dll is - dynamically loaded. - * shared.cc (shared_info::initialize): Don't initialize user stuff if - myself doesn't exist. - -2003-10-08 Corinna Vinschen - - * syscalls.cc (unlink): Don't even try DELETE_ON_CLOSE technique on - systems not supporting it. - -2003-10-02 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Call newlib __sinit routine to ensure that - stdio buffers are initialized to avoid thread initialization races. - -2003-10-01 Christopher Faylor - - * path.cc (win32_device_name): Only fill out destination buffer when - it's really a device. - -2003-09-30 Christopher Faylor - - * Makefile.in: Add YA method for generating devices.cc. - * child_info.h: YA update of another magic number. - * gendevices: New file. - * devices.in: New file. - * devices.cc: Regenerate. - * devices.shilka: Remove. - * devices.h: Correctly define device pointers. - (device): Remove now obsolete fields. - (device::native): Renamed from device::fmt. - * dtable.cc (build_fh_dev): Simplify in light of new unit parsing - scheme. - (build_fh_pc): Ditto. - * path.cc (win32_device_name): Ditto. - * fhandler.h (fhandler_base::get_native_name): Reflect renaming of fmt - to native. - * fhandler_tty.cc (fhandler_tty_mster::init): Initialize slave device - prior to reporting unit. - -2003-09-30 Corinna Vinschen - - * fhandler.cc (fhandler_base::fstat): Drop FH_FLOPPY case. - -2003-09-30 Corinna Vinschen - - * fhandler.h (class fhandler_dev_raw): Add method fstat. - * fhandler_raw.cc (fhandler_dev_raw::fstat): New method. - -2003-09-30 Corinna Vinschen - - * devices.h (enum fh_devices): Remove DEV_RAWDRIVE_MAJOR and - FH_RAWDRIVE. - * devices.shilka (dev_rawdrive_storage): Remove. - (unit_devices): Remove pointer to dev_rawdrive_storage. - (uniq_devices): Remove rawdrive entry. - * dtable.cc (build_fh_pc): Remove DEV_RAWDRIVE_MAJOR case. - * path.cc (win32_device_name): ditto. - -2003-09-29 Corinna Vinschen - - * syslog.cc (vsyslog): Print debug message if ReportEventA fails. - -2003-09-28 Pierre Humblet - - * sigproc.cc (proc_subproc): Restrict permissions on ppid_handle. - -2003-09-28 Christopher Faylor - - * devices.shilka (device::parse): Restore check for tty in unit - handling, but without the previous typo. - * devices.cc: Regenerate. - * devices.h (DEV_CYGDRIVE_MAJOR): Change major number to one used by - linux for "user-mode virtual block device". - -2003-09-28 Corinna Vinschen - - * devices.h: Move a few device major numbers. Fix typo of FH_UDP. - * device.shilka: Remove /dev/hd device entries, rename all device_hd* - to device_sd*. - (device::parse): Disallow units outside lower and upper bounds. - * dtable.cc (build_fh_pc): Fix typo of FH_UDP. - * path.cc (win32_device_name): Fix win32 name creation to match new - device handling. - -2003-09-27 Christopher Faylor - - * device.shilka (device::parse): Allow units on other than tty. - -2003-09-27 Corinna Vinschen - - * wincap.cc (wincapc::init): Allow requesting server info for NT4 SP6. - -2003-09-27 Christopher Faylor - - * path.cc (symlink_info::check): Use new introducer for mknod'ed files. - (parse_device): Ditto. - * syscalls.cc (mknod_worker): Ditto. - -2003-09-27 Christopher Faylor - - * devices.shilka: Add /dev/sda disk devices. - * devices.cc: Regenerate. - -2003-09-27 Christopher Faylor - - * cygwin-shilka: Remove '#line directives' or suffer debugging oddities. - Use -length option so that device prefixes are used. - * devices.cc: Regenerate. - * syscalls.cc (ttyname): Add debugging output. - -2003-09-26 Vaclav Haisman - - * wincap.h (wincaps::is_server): New flag. - (wincapc::version): Change type to OSVERSIONINFOEX. - (wincapc::is_server): New function. - * wincap.cc (wincap_unknown::is_server): New initializer. - (wincap_95): Ditto. - (wincap_95osr2): Ditto. - (wincap_98): Ditto. - (wincap_me): Ditto. - (wincap_nt3): Ditto. - (wincap_nt4): Ditto. - (wincap_nt4sp4): Ditto. - (wincap_2000): Ditto. - (wincap_xp): Ditto. - (wincapc::init): Adapt to OSVERSIONINFOEX. Add detection of NT server - systems. - * sched.cc: Include windows.h and registry.h. - (sched_rr_get_interval): Re-implement for NT systems. - -2003-09-26 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::ioctl): Properly set - ioctl_request event when window size changes. Store failing errno in - ioctl_retval (needed?). - -2003-09-26 Pavel Tsekov - - * fhandler_console.c (fhandler_console::read): Record the state of the - SHIFT, CTRL and ALT keys at the time of the last keyboard input event. - (fhandler_console::ioctl): Handle requests to retrieve the keyboard - modifiers via the TIOCLINUX command. - * fhandler_tty.c (fhandler_tty_slave::read): Ditto. - * include/sys/termios.h (TIOCLINUX): New macro definition. - -2003-09-26 Pierre Humblet - - * pinfo.cc (pinfo::init): Do not give FILE_MAP_WRITE access to Everybody. - * exceptions.cc (sig_handle_tty_stop): Do not create pinfo parent with - PID_MAP_WRITE. - * fhandler_process.cc (fhandler_process::fill_filebuf): Ditto for pinfo p. - * signal.cc (kill_worker): Ditto for pinfo dest. - -2003-09-26 Pierre Humblet - - * pinfo.h (pinfo::set_acl): Declare. - * pinfo.cc (pinfo_fixup_after_fork): Duplicate with no rights. - (pinfo::set_acl): New. - * spawn.cc (spawn_guts): Call myself.set_acl. - -2003-09-26 Pierre Humblet - - * uinfo.cc (cygheap_user::init): Make sure the current user appears - in the default DACL. Rearrange to decrease the indentation levels. - Initialize the effec_cygsid directly. - (internal_getlogin): Do not reinitialize myself->gid. Open the process - token with the required access. - * cygheap.h (class cygheap_user): Delete members pid and saved_psid. - Create members effec_cygsid and saved_cygsid. - (cygheap_user::set_sid): Define inline. - (cygheap_user::set_saved_sid): Ditto. - (cygheap_user::sid): Modify. - (cygheap_user::saved_sid): Modify. - * cygheap.cc (cygheap_user::set_sid): Delete. - (cygheap_user::set_saved_sid): Ditto. - * sec_helper.cc (sec_acl): Set the correct acl size. - * autoload.cc (FindFirstFreeAce): Add. - * security.h: Define ACL_DEFAULT_SIZE. - -2003-09-26 Corinna Vinschen - - * mmap.cc (munmap): Use correct address and length parameters when - calling fhandler's munmap. - -2003-09-26 Corinna Vinschen - - * spawn.cc (spawn_guts): Set errno to E2BIG if command line is - longer than CreateProcess allows (32K). - -2003-09-25 Christopher Faylor - - * dtable.cc (build_fh_name): Return pointer to a 'nodevice' rather than - a NULL pointer or suffer SEGVs with invalid paths. - -2003-09-25 Christopher Faylor - - * fork.cc (fork_parent): Detect failed pinfo constructor. - * spawn.cc (spawn_guts): Don't overwrite ENOMEM errno on failed pinfo - constructor. - -2003-09-25 Christopher Faylor - - * spawn.cc (spawnve): Remove vfork short circuit and let caller deal - with error return. - -2003-09-25 Pierre Humblet - Christopher Faylor - - * spawn.cc (spawn_guts): Catch potential error from pinfo.remember. - Change debug messages to make sense. Pass correct value to pinfo - constructor. Ensure cleanup after errors. Always reimpersonate after - errors. - -2003-09-25 Christopher Faylor - - * spawn.cc (spawn_guts): Move system signal handling stuff after - CreateProcess error check. - -2003-09-25 Pierre Humblet - - * shared_info.h: Update CURR_USER_MAGIC, CURR_SHARED_MAGIC and - SHARED_INFO_CB. - (mount_info::cb): Delete. - (mount_info::version): Delete. - (shared_info::delqueue): Delete. - * Makefile.in: Do magic for USER_MAGIC, class user_info, instead - of for mount_info. - -2003-09-24 Christopher Faylor - - * include/tzfile.h: Add some missing entries. - -2003-09-24 Christopher Faylor - - * include/paths.h: Add some missing entries. - -2003-09-24 Christopher Faylor - - * shared_info.h (CURR_MOUNT_MAGIC): Fix. - - * sigproc.cc (sigpacket): New structure. - (sig_send): Fill out sigpacket structure to send to signal thread - rather than racily sending separate packets. - (wait_sig): Use sigpacket structure to receive info from signal sender. - -2003-09-24 Pierre Humblet - - * shared_info.h (class user_info): New. - (cygwin_user_h): New. - (user_shared): New. - (enum shared_locations): Replace SH_MOUNT_TABLE by SH_USER_SHARED; - (mount_table): Change from variable to macro. - * shared.cc: Use sizeof(user_info) in "offsets". - (user_shared_initialize): Add "reinit" argument to indicate need - to reinitialize the mapping. Replace "mount_table" by "user_shared" - throughout. Call user_shared->mountinfo.init and - user_shared->delqueue.init. - (shared_info::initialize): Do not call delqueue.init. - (memory_init): Add argument to user_shared_initialize. - * child_info.h (child_info::mount_h): Delete. - (child_info::user_h): New. - * sigpproc.cc (init_child_info): Use user_h instead of mount_h. - * dcrt0.cc (_dll_crt0): Ditto. - * fhandler_disk_file.cc (fhandler_disk_file::close): Use - user_shared->delqueue instead of cygwin_shared->delqueue. - * fhandler_virtual.cc (fhandler_virtual::close): Ditto. - * syscalls.cc (close_all_files): Ditto. - (unlink): Ditto. - (seteuid32): Add argument to user_shared_initialize. - -2003-09-24 Christopher Faylor - - * devices.cc: New file. - * devices.gperf: New file. - * devices.shilka: New file. - * cygwin-gperf: New file. - * cygwin-shilka: New file. - * fhandler_fifo.cc: New file. - * fhandler_nodevice.cc : New file. - -2003-09-24 Christopher Faylor - - Reorganize headers so that path.h precedes fhandler.h throughout. - Remove device argument and unit arguments from fhandler constructors - throughout. Remove pc arguments to fhandler functions and use internal - pc element instead, throughout. Use dev element in pc throughout. Use - major/minor elements rather than units and device numbers previously in - fhandler class. Use correct methods for fhandler file names rather - than directly accessing file name variables, throughout. - * Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o - * dcrt0.cc (dll_crt0_1): Call device::init. - * devices.h: Renumber devices based on more Linux-like major/minor - numbers. Add more devices. Declare standard device storage. - (device): Declare struct. - * dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* - type. - * dtable.cc (dtable::get_debugger_info): Ditto. - (cygwin_attach_handle_to_fd): Ditto. - (dtable::release): Remove special FH_SOCKET case in favor of generic - "need_fixup_before" test. - (dtable::init_std_file_from_handle): Use either build_fh_dev or - build_fh_name to build standard fhandler. - (dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. - Move out of dtable class. Don't accept a path_conv argument. Just - build it here and pass it to: - (build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable - class. Use intrinsic device type in path_conv to create new fhandler. - (build_fh_dev): Renamed from dtable::build_fhandler. Move out of - dtable class. Simplify arguments to just take new 'device' type and a - name. Just return pointer to fhandler rather than trying to insert - into dtable. - (dtable::dup_worker): Accommodate above build_fh name changes. - (dtable::find_fifo): New (currently broken) function. - (handle_to_fn): Use strechr for efficiency. - * dtable.h: Reflect above build_fh name changes and argument - differences. - (fhandler_base *&operator []): Return self rather than copy of self. - * fhandler.cc (fhandler_base::operator =): Use pc element to set - normalized path. - (fhandler_base::set_name): Ditto. - (fhandler_base::raw_read): Use method to access name. - (fhandler_base::write): Correctly use get_output_handle rather than - get_handle. - (handler_base::device_access_denied): New function. - (fhandler_base::open): Eliminate pc argument and use pc element of - fhandler_base throughout. - (fhandler_base::fstat): Detect if device is based in filesystem and use - fstat_fs to calculate stat, if so. - (fhandler_base::fhandler_base): Eliminate handling of file names and, - instead, just free appropriate component from pc. - (fhandler_base::opendir): Remove path_conv parameter. - * fhandler.h: Remove all device flags. - (fhandler_base::pc): New element. - (fhandler_base::set_name): Change argument to path_conv. - (fhandler_base::error): New function. - (fhandler_base::exists): New function. - (fhandler_base::pc_binmode): New function. - (fhandler_base::dev): New function. - (fhandler_base::open_fs): New function. - (fhandler_base::fstat_fs): New function. - (fhandler_base::fstat_by_name): New function. - (fhandler_base::fstat_by_handle): New function. - (fhandler_base::isfifo): New function. - (fhandler_base::is_slow): New function. - (fhandler_base::is_auto_device): New function. - (fhandler_base::is_fs_special): New function. - (fhandler_base::device_access_denied): New function. - (fhandler_base::operator DWORD&): New operator. - (fhandler_base::get_name): Return normalized path from pc. - (fhandler_base::get_win32_name): Return windows path from pc. - (fhandler_base::isdevice): Renamed from is_device. - (fhandler_base::get_native_name): Return device format. - (fhandler_fifo): New class. - (fhandler_nodevice): New class. - (select_stuff::device_specific): Remove array. - (select_stuff::device_specific_pipe): New class element. - (select_stuff::device_specific_socket): New class element. - (select_stuff::device_specific_serial): New class element. - (select_stuff::select_stuff): Initialize new elements. - * fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base - class from fhandler_disk_file. - (fhandler_base::fstat_by_name): Ditto. - (fhandler_base::fstat_by_name): Ditto. - (fhandler_disk_file::open): Move most functionality into - fhandler_base::open_fs. - (fhandler_base::open_fs): New function. - (fhandler_disk_file::close): Move most functionality into - fhandler_base::close_fs. - (fhandler_base::close_fs): New function. - * fhandler_mem.cc (fhandler_dev_mem::open): Use device name in - debugging output. - * fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy - standard urandom device into appropriate place. - (fhandler_socket::accept): Reflect change in fdsock return value. - * fhandler_tty.cc: See "throughouts" above. - * net.cc: Accommodate fdsock change throughout. - (fdsock): Return success or failure, accept fd argument and device - argument. - * path.cc (symlink_info::major): New element. - (symlink_info::minor): New element. - (symlink_info::parse_device): Declare new function. - (fs_info::update): Accommodate changes in path_conv class. - (path_conv::fillin): Ditto. - (path_conv::return_and_clear_normalized_path): Eliminate. - (path_conv::set_normalized_path): New function. - (path_conv::path_conv): Set info in dev element. Use path_conv methods - Check for FH_FS rather than FH_BAD to indicate when to fill in - filesystem stuff. where appropriate rather than direct access. Use - set_normalized_path to set normalized path. - (windows_device_names): Eliminate. - (get_dev): Ditto. - (get_raw_device_number): Ditto. - (get_device_number): Ditto. - (win32_device_name): Call new device name parser to do most of the - heavy lifting. - (mount_info::conv_to_win32_path): Fill in dev field as appropriate. - (symlink_worker): Handle new device files. - (symlink_info::check): Ditto. - (symlink_info::parse_device): Define new function. - * path.h (executable_states): Move here from fhandler.h. - (fs_info): Rename variables to *_storage and create methods for - accessing same. - (path_conv): Add dev element, remove devn and unit and adjust inline - methods to accommodate. - (set_normalized_path): Declare new function. - * pinfo.cc (_pinfo::commune_recv): Add broken support for handling - fifos. - (_pinfo::commune_send): Ditto. - * pipe.cc (fhandler_pipe::close): check for existence of handle before - closing it. - (handler_pipe::create): Rename from make_pipe. Change arguments to - accept fhandler_pipe array. Accommodate fifos. - (pipe): Rework to deal with fhandler_pipe::create changes. - (_pipe): Ditto. - * select.cc: Use individual device_specific types throughout rather - than indexing with obsolete device number. - (set_bits): Use is_socket call rather than checking device number. - * shared_info.h (CURR_MOUNT_MAGIC): Update. - (conv_to_win32_path): Reflect addition of device argument. - * syscalls.cc (mknod_worker): New function. - (open): Use build_fh_name to build fhandler. - (chown_worker): Detect if this is an 'auto' device rather than an - on-filesystem device and handle appropriately. - (chmod_device): New function. - (chmod): Detect if this is an 'auto' device rather than an - on-filesystem device and handle appropriately. Use chmod_device to set - mode of in-filesystem devices. - (stat_worker): Eliminate path_conv argument. Call build_fh_name to - construct fhandler. Use fh->error() rather than pc->error to detect - errors in fhandler construction. - (access_worker): New function pulled from access. Accommodate - in-filesystem devices. - (access): Use access_worker. - (fpathconf): Detect if this is an 'auto' device rather than an - on-filesystem device and handle appropriately. - (mknod_worker): New function. - (mknod32): New function. - (chroot): Free normalized path -- assuming it was actually cmalloced. - * tty.cc (create_tty_master): Tweak for new device class. - (tty::common_init): Ditto. - * winsup.h (stat_worker): Remove. - (symlink_worker): Declare. - - * exceptions.cc (set_process_mask): Just call sig_dispatch_pending and - don't worry about pending_signals since sig_dispatch_pending should - always do the right thing now. - (sig_handle): Reorganize SIGCONT handling to more closely conform to - SUSv3. - * pinfo.h: Move __SIG enum to sigproc.h. - (PICOM_FIFO): New enum element. - (_pinfo): Remove 'thread2signal' stuff throughout class. - (_pinfo::commune_send): Make varargs. - (_pinfo::sigtodo): Eliminate. - (_pinfo::thread2signal): Ditto. - * signal.cc (kill_worker): Eliminate call to setthread2signal. - * sigproc.cc (local_sigtodo): Eliminate. - (getlocal_sigtodo): Ditto. - (sigelem): New class. - (pending_signals): New class. - (sigqueue): New variable, start of sigqueue linked list. - (sigcatch_nonmain): Eliminate. - (sigcatch_main): Eliminate. - (sigcatch_nosync): Eliminate. - (sigcomplete_nonmain): Eliminate. - (pending_signals): Eliminate. - (sig_clear): Call signal thread to clear pending signals, unless - already in signal thread. - (sigpending): Call signal thread to get pending signals. - (sig_dispatch_pending): Eliminate use of pending_signals and just check - sigqueue. - (sigproc_terminate): Eliminate all of the obsolete semaphore stuff. - Close signal pipe handle. - (sig_send): Eliminate all of the obsolete semaphore stuff and use pipe - to send signals. - (getevent): Eliminate. - (pending_signals::add): New function. - (pending_signals::del): New function. - (pending_signals::next): New function. - (wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to - communicate and maintain a linked list of signals. - * sigproc.h: Move __SIG defines here. Add __SIGPENDING. - (sig_dispatch_pending): Remove "C" specifier. - (sig_handle): Accept a mask argument. - * thread.cc: Remove signal handling considerations throughout. - -2003-09-22 Christopher Faylor - - * dcrt0.cc (do_exit): Eliminate "C" linkage. Call events_terminate - early. - (exit_states): Move out of source file into header file. - * winsup.h: Move exit_states here. Remove "C" linkage from do_exit - declaration. - * debug.cc (lock_debug): Remove explicit (and incorrect) external for - exit_state. - * sigproc.cc (sig_dispatch_pending): Don't flush signals if exiting. - -2003-09-20 Christopher Faylor - - * spawn.cc (pthread_cleanup): New struct. - (do_cleanup): New function. - (spawn_guts): Initialize struct for pthread_cleanup handling to ensure - proper restoration of signals if/when thread is cancelled. Restore - settings using pthread_cancel_pop. - -2003-09-19 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 6. - -2003-09-19 Christopher Faylor - - * thread.h (__reent_t::init_clib): Declare new function. - * thread.cc (__reent_t::init_clib): Define new function. - (pthread::thread_init_wrapper): Use __reent_t::init_clib to init local - clib storage and set std{in,out,err} appropriately. - -2003-09-19 Christopher Faylor - - * syscalls.cc (system): Strip signal considerations from here so that - they are not inherited by a child process. - * spawn.cc (spawn_guts): Handle system() signal stuff here. - * winsup.h (_P_SYSTEM): Define. - -2003-09-18 Corinna Vinschen - - * fhandler_tty.cc (fhandler_pty_master::process_slave_output): - Handle buf == NULL as flushing the buffer. - (fhandler_tty_slave::read): Handle ptr == NULL as flushing the buffer. - (fhandler_tty_slave::tcflush): Implement input queue flushing by - calling read with NULL buffer. - (fhandler_pty_master::tcflush): Ditto, calling process_slave_output. - * termios.cc (tcflush): Check for legal `queue' value. Return - EINVAL otherwise. - -2003-09-16 Brian Ford - - * syscalls.cc (gethostid): Add lpFreeBytesAvailable argument to - GetDiskFreeSpaceEx call since NT4 requires it. - -2003-09-16 Christopher Faylor - - * fhandler_process.cc (fhandler_process::fill_filebuf): Open pinfo with - PID_MAP_RW. - * sigproc.cc (talktome): Ditto for winpids. - -2003-09-16 Christopher Faylor - - * pinfo.h (winpids::pid_access): New element. - (winpids::winpids): Rejigger to set pinfo_access. - * pinfo.cc (winpids::add): Try to open shared memory region with - supplied pinfo_access first, then default to readonly. - * fhandler_termios.cc (tty_min::kill_pgrp): When getting list of pids - to work with, suggest opening with PID_MAP_RW. - * signal.cc (kill_pgrp): Ditto. - * sigproc.cc (sig_send): Perform a write check on todo prior to - attempting to increment it. Return EACCES if we can't write to it. - -2003-09-16 Corinna Vinschen - - * cygheap.cc (cygheap_user::set_saved_sid): Rename from set_orig_sid. - * cygheap.h (class cygheap_user): Rename orig_psid, orig_uid and - orig_gid to saved_psid, saved_uid and saved_gid respectively. - Rename methods orig_sid and set_orig_sid to saved_sid and set_saved_sid - respectively. - * sec_helper.cc (sec_acl): Accommodate above changes. - * spawn.cc (spawn_guts): Ditto. - * uinfo.cc (uinfo_init): Ditto. - -2003-09-15 Christopher Faylor - - * getopt.c (opterr): Reinstate initialization. - (optind): Ditto. - (optopt): Ditto. - * pinfo.cc: Include cygheap.h or suffer compile error. - * shared.h: Reset magic number. - -2003-09-15 Christopher Faylor - - * exceptions.cc (sig_handle_tty_stop): Fix boneheaded mistake by using - correct check for parent state rather than inverted check. - -2003-09-15 Pierre Humblet - - * security.h (__sec_user): Add "access2" argument. - (sec_acl): Add "original" and "access2" arguments. - (sec_user): Add "sid2" and "access2" argument. Remove dependence on - allow_ntsec. - (sec_user_nih): Ditto. - * sec_helper.cc (__sec_user): Add "has_security" test. - Call sec_acl with new arguments, letting it handle original_sid. - (sec_acl): Add "original" and "access2" arguments. Handle original_sid - depending on flag but avoiding duplicates. Use "access2" for sid2. - * pinfo.cc (pinfo::init): Use security attributes created by sec_user - when creating the mapping. - * security.cc (create_token): Adjust arguments in call to sec_acl. - Call sec_user instead of __sec_user. - * syscall.cc (seteuid32): Adjust arguments in call to sec_acl. Remove - now unnecessary test. Remove useless conversions to psid. - * dcrt0.cc (dll_crt0_1): Call cygsid::init before pinfo_init. - -2003-09-13 Christopher Faylor - - * Makefile.in: Make malloc_wrapper -fomit-frame-pointer. - - * cygwin.din: Remove extraneous mallinfo definition. - - * dcrt0.cc (quoted): Use strechr for efficiency. - - * fhandler.cc (fhandler_base::write): Correctly use get_output_handle - rather than get_handle. - (fhandler_base::lseek): Use method for accessing name in debug output. - -2003-09-13 Christopher Faylor - - * fhandler_disk_file.cc (path_conv::ndisk_links): Fix potential - off-by-one problem when first file in a directory is a directory. - -2003-09-13 Pierre Humblet - - * include/sys/cygwin.h: Rename PID_UNUSED to PID_MAP_RW. - * pinfo.cc (pinfo_init): Initialize myself->gid. - (pinfo::init): Create the "access" variable, set it appropriately and - use it to specify the requested access. - * exceptions.cc (sig_handle_tty_stop): Add PID_MAP_RW in pinfo parent. - * signal.cc (kill_worker): Ditto for pinfo dest. - * syscalls.cc (setpgid): Ditto for pinfo p. - -2003-09-13 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 5. - -2003-09-12 Christopher Faylor - - * thread.cc (MTinterface::fixup_after_fork): Remove code which - potentially overwrote _impure pointer with contents of thread which - invoked fork since this eliminates important information like the - pointer to the atexit queue. - -2003-09-12 Christopher Faylor - - * fhandler_disk_file.cc (path_conv::ndisk_links): Fix problem where - search characters overwrote the path instead of being tacked on the - end. - -2003-09-12 Christopher Faylor - - * dcrt0.cc (_dll_crt0): Accommodate breaking apart of early_stuff_init. - * exceptions.cc (early_stuff_init): Delete. - (init_console_handler): New function - top half of early_stuff_init. - (init_global_security): New function - bottom half of early_stuff_init. - (sig_handle): Avoid special hExeced test for SIGINT. Just terminate - the captive process. - (signal_exit): Add debugging output. - * fhandler_tty.cc (fhandler_tty_slave::open): Don't allocate a console - if one already seems to exist. Properly initialize ctrl-c handling if - we do allocate a console. - * winsup.h (early_stuff_init): Delete declaration. - (init_console_handler): New declaration. - (init_global_security): New declaration. - -2003-09-11 Christopher Faylor - - * fhandler_disk_file.cc (path_conv::ndisk_links): Rename from - num_entries. Accept an argument and calculate any extra links needed - based on missing . and .. entries. - (fhandler_disk_file::fstat_helper): Always call pc->ndisks_links() to - calculate the number of links. - * path.h (path_conv::ndisk_links): Declare. - -2003-09-11 Christopher Faylor - - * path.cc (normalize_posix_path): Put check for '//' prefix back to - denote a UNC path. - (slash_unc_prefix_p): Remove vestige of old //c method for accessing - drives. - -2003-09-11 Christopher Faylor - - * dir.cc (rmdir): Add more samba workarounds. - -2003-09-11 Corinna Vinschen - - * shared.cc (user_shared_initialize): Revert length attribute for name - variable to be just UNLEN + 1. - -2003-09-10 Pierre Humblet - - * shared_info.h (shared_info::initialize): Remove argument. - * cygheap.h (cygheap_user::init): New declaration. - * uinfo.cc (cygheap_user::init): New. - (internal_getlogin): Move functionality to cygheap_user::init. Open - the process token to update the group sid. - * shared.cc (user_shared_initialize): Get the user information from - cygheap->user. - (shared_info::initialize): Remove argument. Call cygheap->user.init - instead of cygheap->user.set_name. - (memory_init): Do not get the user name and do not pass it to - shared_info::initialize. - * registry.cc (get_registry_hive_path): Make csid a cygpsid. - (load_registry_hive): Ditto. - -2003-09-10 Christopher Faylor - - * fhandler_disk_file.cc (num_entries): Take . and .. into account if - they do not exist since cygwin simulates them. - (fhandler_cygdrive::fstat): Ditto. - (fhandler_cygdrive::readdir): Don't do any specific tests on - __d_position when seeing if a drive exists. - -2003-09-10 Corinna Vinschen - - * Makefile.in (DLL_OFILES): Add getopt.o and iruserok.o. - * cygwin.din: Export __check_rhosts_file, __rcmd_errstr, optarg, - opterr, optind, optopt, optreset, getopt, getopt_long, iruserok - and ruserok. - * getopt.c: Moved from lib to here. Define opt* variables as - dllexport. - * iruserok.c: Moved from lib to here. Rearrange function order. - Prefer using 64/32 bit functions. - * syscalls.cc (shell_fp): Define as struct __sFILE64. - (getusershell): Use fopen64 instead of fopen. - * winsup.h: Add declarations for seteuid32, fopen64, - cygwin_gethostbyname and cygwin_inet_addr. - * include/getopt.h: Declare opt* variables dllimport. - * include/cygwin/version.h: Bump API minor number. - -2003-09-10 Christopher Faylor - - * exceptions.cc (sig_handle_tty_stop): Check parent PID_NOCLDSTOP - rather than erroneously checking *my own* sigtodo. - -2003-09-10 Christopher Faylor - - * Makefile.in: Add some more -fomit-frame-pointer files. - - * path.cc (conv_path_list_buf_size): Free normalized_path or suffer - memory leak. - * syscalls.cc (chroot): Ditto. - -2003-09-10 Corinna Vinschen - - * Makefile.in (DLL_OFILES): Add bsdlib.o. - * autoload.cc (RegisterServiceProcess): Add. - * bsdlib.cc: New file. - (daemon): New function. - (login_tty): Ditto. - (openpty): Ditto. - (forkpty): Ditto. - * cygwin.din: Export daemon, forkpty, login_tty, logwtmp, updwtmp, - openpty and revoke. - * syscalls.cc (updwtmp): New function, writing to wtmp exclusively. - (logwtmp): Ditto. - (login): Call updwtmp instead of writing to wtmp by itself. - (logout): Ditto. - * tty.cc (revoke): New funtion. - * include/paths.h: Define _PATH_DEVNULL. - * include/pty.h: New header. - * include/cygwin/version.h: Bump API minor number. - * include/sys/utmp.h: Declare logwtmp with const arguments. - Declare updwtmp. - * lib/iruserok.c: New file. - (ruserok): New function. - (iruserok): Ditto. - (__ivaliduser): Ditto. - (__icheckhost): Ditto. - -2003-09-10 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::fstat): Don't use PC_POSIX. - -2003-09-09 Pierre Humblet - - * shared_info.h: Include security.h. - (open_shared): Add psa argument. - (user_shared_initialize): New declaration. - * security.h: Add _SECURITY_H guard. - (sec_user): Use sec_none in the no ntsec case. - * spawn.cc (spawn_guts): Remove call to load_registry_hive. - * syscalls (seteuid32): If warranted, call load_registry_hive, - user_shared_initialize and RegCloseKey(HKEY_CURRENT_USER). - * shared.cc (user_shared_initialize): New. - (open_shared): Add and use psa argument. - (memory_init): Move mount table initialization to - user_shared_initialize. Call it. - -2003-09-09 Corinna Vinschen - - * mmap.cc (mmap64): Change address types from caddr_t to void * - according to SUSv3. - (mmap): Ditto. - (munmap): Ditto. - (msync): Ditto. - (mprotect): Ditto. Move to before the fhandler methods. - * include/sys/mman.h: Change prototypes accordingly. - -2003-09-08 Christopher Faylor - - * dcrt0.cc (dlL_crt0_1): Set __argc_safe after __argc is absolutely - know to be set. - * exceptions.cc (sig_handle_tty_stop): Don't reset sigCONT event since - it is reset automatically. - * fork.cc (fork): Remove obsolete usage of PID_SPLIT_HEAP. - * include/sys/cygwin.h: Ditto. - * sigproc.cc (sig_send): Use sigframe init method to set frame since it - checks for previous ownership of the frame. - * sigproc.h (sigframe::init): Accept an "is_exception" argument. - -2003-09-08 Christopher Faylor - - * dir.cc (readdir): Reinstate setting of old ino field for legacy - applications. - * dirent.h (dirent): Rename unused field to __ino32. - -2003-09-08 Christopher Faylor - - * passwd.cc (getpwnam_r): Initialize pw_comment field. - -2003-09-08 Christopher Faylor - - * passwd.cc (getpwuid_r32): Initialize pw_comment field. - -2003-09-08 Christopher Faylor - - * sigproc.cc (wait_sig_inited): Remove assertion since it is racy. - -2003-09-08 Corinna Vinschen - - * cygwin.din: Export endusershell, getusershell and setusershell. - * syscalls.cc (getusershell): New function. - (setusershell): Ditto. - (endusershell): Ditto. - * include/cygwin/version.h: Bump API minor number. - -2003-09-08 Nicholas Wourms - - * cygwin.din: Export argz_add argz_add_sep argz_append argz_count - argz_create argz_create_sep argz_delete argz_extract argz_insert - argz_next argz_replace argz_stringify envz_add envz_entry envz_get - envz_merge envz_remove envz_strip - * include/cygwin/version.h: Bump api minor number. - -2003-09-07 Christopher Faylor - - Throughout, remove __d_u.__d_data fields from DIR structure. - * include/sys/dirent.h (dirent): Remvoe old_d_ino. - (DIR): Make __d_dirhash a 64 bit value. Remove __d_data and __d_u. - Add __flags. - * dir.cc (opendir_states): New enum. - (opendir): Clear new DIR __flags field. - (readdir): Fill in '.' and '..' entries if we hit EOF and we haven't - seen them already. Nuke setting of old_d_ino. - (rewinddir): Reset DIR __flags field. - (seekdir64): Ditto. - * fhandler_disk_file.cc (fhandler_cygdrive::fhandler_cygdrive): Remove - special handling of "." and ".." since they are now handled - automatically. - -2003-09-07 Christopher Faylor - - * include/cygwin/in.h: Don't define ipv6 stuff unless we call for it - specifically since it isn't really implemented yet. - -2003-09-07 Christopher Faylor - - * cygheap.cc (_csbrk): More left coercion cleanup. - * fhandler_tty.cc (fhandler_tty_slave::read): Ditto. - (fhandler_tty_slave::write): Ditto. - * fhandler_windows.cc (fhandler_windows::read): Ditto. - * heap.cc (sbrk): Ditto. - -2003-09-07 Pierre Humblet - - * signal.cc (nanosleep): Improve test for valid values. Round delay up - to resolution. Fix test for negative remainder. Use timeGetTime - through gtod. - (sleep): Round up return value. - -2003-09-07 Pierre Humblet - Christopher Faylor - - * hires.h (HIRES_DELAY_MAX): Define. - (hires_ms::minperiod): Declare static. - (hires_ms::resolution): New. - (hires_ms::dmsecs): New. - (hires_ms::prime): Return UINT. - (gtod): Declare. - * times.cc (hires_ms::prime): Always calculate minperiod and set it to - 1 in case of failure. Return minperiod. - (hires_ms::resolution): Define. - (hires_ms::~hires_ms): Delete. - (hires_ms::usecs): Check minperiod to prime. - (gtod) Define as global. - -2003-09-06 Christopher Faylor - - Remove left coercion throughout. - -2003-09-04 Pierre Humblet - - * hires.h (hires_ms::~hires_ms): Delete declaration. - * times.cc (hires_ms::~hires_ms): Delete definition.. - -2003-09-04 Christopher Faylor - - * dcrt0.cc (__argc_safe): New variable. - (dll_crt0_1): Store argc in __argc_safe, which will theoretically - remain untouched by the user. - * fhandler_console.cc (fhandler_console::read): Silence some compiler - warnings. - * fhandler_raw.cc (fhandler_dev_raw::raw_read): Ditto. - * pinfo.cc (_pinfo::commune_recv): Carefully bound argv scan and check - for potentially bad pointers since user could have set argv cell to - anythinw. - * cygheap.h (CYGHEAPSIZE): Bump up size. - -2003-09-04 Corinna Vinschen - - * sysconf.cc (sysconf): Return more accurate value for _SC_AVPHYS_PAGES. - -2003-09-04 Corinna Vinschen - - * mmap.cc: Restructure. Add, remove and rewrite comments throughout - for better readability. Change function names for better - understanding. - (MAP_SET): Accommodate name change from map_map_ to page_map_. - (MAP_CLR): Ditto. - (MAP_ISSET): Ditto. - (mmap_record::page_map_): Rename from page_map_. - (mmap_record::get_map): Remove. - (mmap_record::alloc_page_map): Rename from alloc_map. Return bool - indicating success of cygheap memory allocation. - (mmap_record::free_page_map): Rename from free_map. - (mmap_record::fixup_page_map): Rename from fixup_map. - (mmap_record::find_unused_pages): Rename from find_empty. - (mmap_record::map_pages): Rename from map_map. - (mmap_record::unmap_pages): Rename from unmap_map. - (class list): Make all class members private. - (list::list): Remove. - (list::~list): Remove. - (list::get_fd): New attribute reader. - (list::get_hash): Ditto. - (list::get_record): Ditto. - (list::add_record): Manage all allocation for mmap_records. Check - for failed memory allocation and return NULL if so. - (list::set): New function. - (list::del_record): Rename from erase. Return true if last mmap_record - has been deleted, false otherwise. Check for legal incoming index - value. - (list::erase): Remove erase/0. - (list::search_record): Rename from match. - (map::map): Remove. - (map::~map): Remove. - (map::add_list): Manage all allocation for lists. Check for failed - memory allocation and return NULL if so. - (map::get_list): New method. - (map::del_list): Rename from erase. Check for legal incoming index - value. - (mmap64): Check for failed mmap_record memory allocation. Return - with MAP_FAILED and errno set to ENOMEM if so. - (munmap): Rearrange loop using new list and mmap_record accessor - functions. Rename loop index variables for better understanding. - Check if list can be deleted after last mmap_record in it has been - deleted. - (msync): Rearrange loop using new list and mmap_record accessor - functions. Rename loop index variables for better understanding. - (fixup_mmaps_after_fork): Ditto. - -2003-09-03 Christopher Faylor - - * cxx.cc (new): Fix formatting. Just return result of ccalloc rather - than calling memset explicitly. - -2003-09-03 Christopher Faylor - - * exceptions.cc (set_process_mask): Set pending signals only when - signals become unmasked. - * sigproc.cc (pending_signals): Flip back to a global. - (wait_sig): Don't set pending signals when there is an armed semaphore - or signal is blocked. - - * shared.cc (shared_info::initialize): Add a username parameter for - user-mode mounts. Reorganize to try to avoid startup race. - (memory_init): Move some stuff into shared_info::initialize. - * shared_info.h (shared_info::initialize): Change declaration. - (CURR_SHARED_MAGIC): Update. - -2003-09-01 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 4. - -2003-09-01 Christopher Faylor - - * net.cc (dup_ent): Restore check for NULL input. - -2003-08-31 Christopher Faylor - - * include/sys/cygwin.h: Don't define cygwin-specific things if - !__CYGWIN__. - -2003-08-31 Christopher Faylor - - * cygheap.cc (cygheap_init): Allocate space for sigaction array in - cygheap. - * cygheap.h (cygheap_types): Add HEAP_SIGS. - * exceptions.cc (signal_fixup_after_exec): Remove from this file. - * pinfo.h (pinfo::getsig): Just return global_sigs array. - (pinfo::sigs): Delete. - * sigproc.cc (signal_fixup_after_exec): Move it here. - (global_sigs): New global array, moved from pinfo structure. - (sigalloc): New function. Allocate global sigaction array here. - (proc_subproc): Remove copysigs call. It's automatic now. - * include/sys/cygwin.h (PID_NOCLDSTOP): New value. - * signal.cc (sigaction): Set myself->PID_NODCLDSTOP when appropriate. - * sigproc.h (sigalloc): Declare. - - * fnmatch.c (fnmatch): Use C90 parameters. - (rangematch): Ditto. - - * fhandler.cc (fhandler_base::raw_read): Use right coercion to avoid a - compiler warning. - -2003-08-31 Christopher Faylor - - * net.cc (dup_ent): Make debugging output consistent. - -2003-08-31 Christopher Faylor - - Use dup_ent rather than specific dup_*_ptr functions throughout. - * (gen_ent): Delete. - (dup_ent): Subsume gen_ent functionality. - (dup_host_ptr): Delete. - (dup_proto_ptr): Ditto. - (dup_servent_ptr): Ditto. - -2003-08-31 Christopher Faylor - - * net.cc (gen_ent): Invert sense of null check so that debug output - makes sense. - -2003-08-31 Christopher Faylor - - * net.cc (free_char_list): Delete. - (dup_addr_list): Delete. - (dup_char_list): Delete. - (free_hostent_ptr): Delete. - (free_protoent_ptr): Delete. - (free_servent_ptr): Delete. - (DWORD_round): New function. - (strlen_round): New function. Returns strlen rounded up to word size. - (dup_ent): New, generic function to duplicate a {host,proto,serv}ent - structure. - (gen_ent): New macro. Generates a generic dup_{host,proto,serv}ent_ptr - function. - (cygwin_getservbyname): Remove call to free_servent_ptr, pass - servent_buf to dup_servent_ptr. - (cygwin_getservbyport): Ditto. - (cygwin_gethostbyname): Ditto for hostent. - (cygwin_gethostbyaddr): Ditto. - (cygwin_getprotobyname): Ditto for protoent. - (cygwin_getprotobynumber): Ditto. - -2003-08-31 Christopher Faylor - - * Makefile.in (MALLOC_OFILES): Always fill in with correct malloc - object. - * configure.in: Fill in MALLOC_OFILES with either debugging or regular - malloc. - * configure: Regenerate. - * dlmalloc.c: Make various fruitless changes to attempt to get to work. - * dlmalloc.h: Ditto. - * malloc.cc (free): Check malloc pool when debugging. - - * path.cc (win32_device_name): Eliminate compiler warning. - - * sigproc.cc (sig_dispatch_pending): Remove use of was_pending. Let - thisframe.call_signal_handler decide if handler should be called rather - than using bogus was_pending check. - - * exceptions.cc (interrupt_setup): Remove accidentally checked in - debugging code. - -2003-08-30 Christopher Faylor - - * heap.cc (sbrk): Save rounded address in user_heap_max. - -2003-08-30 Christopher Faylor - - * sigproc.cc (sig_dispatch_pending): Remove explicit call to - thisframe.call_signal_handler. - -2003-08-30 Christopher Faylor - - Remove some cygserver files. - -2003-08-28 Christopher Faylor - - * sigproc.h: Make some functions regparm. - * sigproc.cc (checkstate): Make regparm. - (getevent): Change parameters in declaration, rename from getsem, make regparm. - (sig_send): Recognize that nosync is now an event. Remove some old - cruft from previous interrupt anywhere signal handler. - (getevent): Change parameters in definition, rename from getsem. - Allocate event rather than semaphore. - (wait_sig): Treat sigcatch_nosync as an event. - -2003-08-28 Christopher Faylor - - * exceptions.cc (sigreturn): Fix problem where old return address was - not properly restored for a nested signal. - -2003-08-27 Christopher Faylor - - * autoload.cc (SwitchToThread): Declare as autoload function. - * cygthread.h (cygthread::main_thread_id): Make public. - * exceptions.cc (setup_handler): Remove unneeded priority stuff. - Rename label to reflect what it does. Add debugging for idiotic - Windows NT problem. Change debugging output to include signal number. - * miscfuncs.cc (low_priority_sleep): If available, use SwitchToThread - function to give time slice to other threads. - * wincap.cc: Properly define have_switch_to_thread throughout. - * wincap.h (wincap::switch_to_thread): New element. - -2003-08-27 Christopher Faylor - - * syscalls.cc (mount): Don't check win32_path when doing cygdrive - mount. - -2003-08-27 Christopher Faylor - - * specdir: Correctly remove temporary directory prior to use. - -2003-08-27 Christopher Faylor - - * sigproc.cc (wait_sig): Count number of iterations through - 'more_signals' loop and issue a warning if DEBUGGING and excessive. - (WFSO): When debugging and infinite timeout, loop. - -2003-08-26 Corinna Vinschen - - * include/cygwin/stat.h: Allow definition of internal stat structures - also when compiling newlib. - -2003-08-25 Christopher Faylor - - Throughout, change USE_CYGSERVER to USE_SERVER. - * Makefile.in (LIBSERVER): Define and use. - * configure.in: Set LIBSERVER as appropriate. - * configure: Regenerate. - * acconfig.h: Regenerate. - * environ.cc: Rename allow_daemon to allow_server. Only recognize when - USE_SERVER is defined. - -2003-08-23 Christopher Faylor - - * syscalls.cc (_remove_r): Define. - -2003-08-22 Corinna Vinschen - - * cygheap.h (enum cygheap_types): Add HEAP_MMAP. - (CYGHEAPSIZE): Add another 64K. - * mmap.cc: Use cmalloc, ccalloc and crealloc with HEAP_MMAP type - throughout. - -2003-08-22 Christopher Faylor - - * cygheap.cc (user_heap_info::max): New field. - * heap.cc (heap_init): Save pointer to end of heap reserved memory. - (sbrk): Don't attempt to commit memory beyond end of heap reserved - memory. Attempt to honor comment and reserve commitbytes if heapchunk - fails. - -2003-08-20 Pierre Humblet - - * exceptions.cc (sigreturn): Don't clobber ebp in recursive signal - calls. - -2003-08-22 Christopher Faylor - - * exceptions.cc (sig_handle): Change so that default signals indicate - success. - -2003-08-21 Christopher Faylor - - * sigproc.cc (wait_sig): Remove redundant test in do/while. - -2003-08-21 Christopher Faylor - - * sigproc.cc (wait_sig): Avoid infinite loop. - -2003-08-20 Christopher Faylor - - * speclib: Reenable removal of temp files. - -2003-08-20 Christopher Faylor - - * miscfuncs.cc (low_priority_sleep): Sleep at same priority as main - thread. - * sigproc.cc (wait_sig): Keep looping if there are more signals to - consider and we are flushing signals. - (sig_send): Put nonsync signals in the correct bucket. - -2003-08-20 Christopher Faylor - - * speclib: Fix created lib to avoid "File truncated" problems. - -2003-08-20 Pierre Humblet - - * exceptions.cc (interrupt_setup): Set sigsave.sig last to avoid a - race. - -2003-08-20 Christopher Faylor - - * sigproc.cc (wait_sig): Ensure that myself->getsigtodo array is - flushed on a __SIGFLUSH. - -2003-08-20 Pierre Humblet - Christopher Faylor - - * exceptions.cc (_sigreturn): Handle nested signals without growing the - stack. - -2003-08-19 Christopher Faylor - - * exceptions.cc (pending_signals): Remove unneeded declaration. - * sigproc.cc (pending_signals): Make static. - (wait_sig): Use defined values rather than integers for rc. Never scan - both todo arrays as this could cause hangs if signals arrive from two - different sources. Rename saw_pending_signals to saw_failed_interrupt. - Exit loop when signal found. Enter low-priority sleep, if necessary, - after finished signalling completion. Set pending_signals when blocked - (from Pierre Humblet). - -2003-08-19 Christopher Faylor - - * signal.cc (sigpending): Move. - * sigproc.cc (sigpending): To here. - (getlocal_sigtodo): Return process-local signal array. - (sigpending): Accommodate new process-local signal array. - (sig_send): Ditto. - (sig_set_pending): Ditto. - (wait_sig): Ditto. - -2003-08-19 Christopher Faylor - - Throughout, eliminate argument to sig_dispatch_pending. - * exceptions.cc (setup_handler): Move non-interruptible condition - handling (back) to wait_sig. - (set_process_mask): Don't worry about calling sig_dispatch_pending from - sigthread since it is detected in the function anyway. - (sig_handle): Eliminate thisproc arg. Don't call sig_dispatch_pending - on SIGCONT since that should happen automatically. - * sigproc.cc (sig_dispatch_pending): Eliminate justwake argument. Just - return when called from sigthread. - (wait_sig): Change some variables to bool. Change inner while to an - if. Move uninterruptible signal handling here. - (sigproc_terminate): Don't call sig_dispatch_pending. Just increment - semaphore on exit. - - * speclib: Use slightly different (but still flawed) method for - determining symbols to extract from libraries. - -2003-08-18 Christopher Faylor - - * exceptions.cc (sigdelayed): Fix race where signal handler could get - the wrong mask (as suggested by Pierre Humblet). - -2003-08-18 Christopher Faylor - - * path.cc (mount): Add null/empty check for input parameters. - (umount): Add null/empty check for input parameters. - -2003-08-17 Pierre Humblet - - * grp.cc (read_group): Revert previous change. - * uinfo.cc (pwdgrp::load): Always reset curr_lines. - -2003-08-17 Corinna Vinschen - - * errno.cc (errmap): Map ERROR_INVALID_BLOCK_LENGTH to EIO. - * fhandler_raw.cc (fhandler_dev_raw::raw_read): Set more accurate - errnos instead of EACCES. - (fhandler_dev_raw::raw_write): Ditto. - -2003-08-17 Christopher Faylor - - * path.cc (special_name): Accommodate all special names with - extensions. - -2003-08-15 Corinna Vinschen - - * mmap.cc (mmap64): Avoid crash if file size is less than requested - map length. - -2003-08-13 Igor Pechtchanski - - * path.cc (special_name): Add checks for some specials followed by - a "." and a FIXME comment. - -2003-08-13 Corinna Vinschen - - * cygwin.din: Accommodate change from cygwin_lstat to lstat. - * syscalls.cc: Add defines to avoid declaration issues when - renaming cygwin_lstat back to lstat. - (lstat): Reverted name change from cygwin_lstat. - -2003-08-12 Corinna Vinschen - - * include/sys/param.h (NBBY): Define if not defined. - -2003-08-12 Nicholas Wourms - - * include/sys/param.h (setbit): Add new bitmap related macro. - (clrbit): Likewise. - (isset): Likewise. - (isclr): Likewise. - (howmany): Add new counting/rounding macro. - (rounddown): Likewise. - (roundup): Likewise. - (roundup2): Likewise. - (powerof2): Likewise - (MIN): Add macro for calculating min. - (MAX): Add macro for calculating max. - -2003-08-09 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 3. - -2003-08-08 Gerrit P. Haase - - * include/stdint.h: Correctly define INT32_MIN. - -2003-08-08 David Rothenberger - - * grp.cc (read_group): Set __group32.gr_mem pointer back to &null_ptr - after free() is called. - -2003-08-05 Christopher Faylor - - * Makefile.in: Rework to accommodate new speclib arguments. - * speclib: Rework to extract everything from libcygwin.a rather than - building things from existing object files. - -2003-08-05 Pavel Tsekov - - * path.cc (cygdrive_getmntent): Do not skip over drives of type - DRIVE_REMOVABLE. - -2003-08-05 Christopher Faylor - - * fhandler.cc (fhandler_base::lseek): Be more paranoid when - constructing offsets from 64 bit value. - * syscalls.cc (logout): Avoid temp buffer memcpy since new scheme does - not require it. - (utmp_data): Rework as a macro which returns a pointer into a buffer. - (getutent): Use new buffer allocation mechanism to grab a utmp buffer. - (getutid): Ditto. - (pututline): Ditto. - -2003-08-05 Pavel Tsekov - - * fhandler_disk_file.cc (fhandler_cygdrive::readdir): Do not change - 'errno' if end of directory condition is encountered as per SUSv2. - * fhandler_proc.cc (fhandler_proc::readdir): Ditto. - * fhandler_process (fhandler_process::readdir): Ditto. - * fhandler_registry (fhandler_registry::readdir): Ditto. - -2003-07-30 Christopher Faylor - - * dcrt0.cc (_dll_crt0): Move strace.microseconds initialization to - after pthread initialization. - (dll_crt0_1): i.e., here. - -2003-07-28 Christopher Faylor - - * fhandler_base.cc (fhandler_base::readv): Rework to properly return - number of bytes from read. - -2003-07-28 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 2. - -2003-07-26 Christopher Faylor - - * exceptions.cc (ctrl_c_handler): Send SIGHUP when events occur only if - there is a tty associated with the process. Send SIGHUP on - CTRL_LOGOFF_EVENT. - - * fhandler_tty.cc (fhandler_tty_slave::open): Adjust console open - handle counter regardless of whether this is a pty or tty. - (fhandler_tty_slave::open): Ditto. - (fhandler_tty_slave::dup): Ditto. - (fhandler_tty_common::set_close_on_exec): Ditto. - (fhandler_tty_master::init_console): Decrement console open handle - counter after init since it will now be handled by all tty open. - * syscalls.cc (setsid): Rework debugging output slightly. - -2003-07-25 Christopher Faylor - - * configure.in: Use 'install-sh -c'. - * configure: Regenerate. - -2003-07-25 Christopher Faylor - - * configure.in: Always use install-sh. - * configure: Regenerate. - -2003-07-25 Christopher Faylor - - * include/cygwin/socket.h: Conditionalize [AP]F_INET6 define. - -2003-07-25 Christopher Faylor - - * Makefile.in (OBSOLETE_FUNCTION): Add fdopen. - -2003-07-25 Christopher Faylor - - * cygwin.din: Export _fdopen64 - * Makefile.in (NEW_FUNCTIONS): Add _fdopen64 -> fdopen translation. - * include/cygwin/version.h: Bump api minor number. - - * ntdll.h: Remove (now) duplicate FILE_SYNCHRONOUS_IO_NONALERT - definition. - -2003-07-24 Christopher Faylor - - * environ.cc (check_case_init): Use strncasematch. - - * cygwin.din: Export __mempcpy. - * cygwin/version.h: Bump api minor number. - -2003-07-21 Pavel Tsekov - - * mmap.cc: Use proper format specifiers for _off64_t and size_t in - format strings passed to syscall_printf () and debug_printf () - throughout. - -2003-07-18 Pierre Humblet - - * security.cc (verify_token): Fix white space and style. - Use type bool instead of BOOL and char. Use alloca - instead of malloc and free for my_grps. - -2003-07-17 Corinna Vinschen - - * sysconf.cc (sysconf): Fix OPEN_MAX patch. Return page size on - _SC_PAGESIZE again. - -2003-07-14 Corinna Vinschen - - * cygheap.h (class cygheap_user): Use INVALID_HANDLE_VALUE as invalid - value for tokens. - * syscalls.cc (seteuid32): Ditto. Set new_token to process token if - process token is suitable. - * uinfo.cc (uinfo_init): Initialize tokens in cygheap user info - to INVALID_HANDLE_VALUE. - -2003-07-14 Pierre Humblet - - * cygheap.h (enum impersonation): Delete. - (cygheap_user::impersonation_state): Delete. - (cygheap_user::current_token): New. - (cygheap_user::issetuid): Modify to use current_token. - (cygheap_user::token): Ditto. - (cygheap_user::deimpersonate): Ditto. - (cygheap_user::reimpersonate): Ditto. - (cygheap_user::has_impersonation_tokens): Ditto. - (cygheap_user::close_impersonation_tokens): Ditto. - * security.cc (cygwin_set_impersonation_token): Always set the token. - (verify_token): Change type of gsid to cygpsid. - (get_file_attribute): Use the effective ids. - * syscalls.cc (seteuid32): Modify to use cygheap_user::current_token. - * uinfo.cc (uinfo_init) Do not set cygheap->user.impersonation_state. - -2003-07-12 Christopher Faylor - - * pinfo.cc (_pinfo::commune_send): Fix bounds test so that poll of - communicating pid actually stops eventually. - -2003-07-10 Christopher Faylor - - * path.cc (get_device_number): Remove special com? consideration. - (special_chars): Make static. - (special_introducers): New. - (special_char): Allow specified valid_chars args. - (fnunmunge): Handle aux-like filenames correctly. - (special_name): Add con, conin$, conout$. - (mount_item::fnmunge): Use __small_sprintf return value to calculate - increments. - -2003-07-09 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 1. - -2003-07-09 Christopher Faylor - - * fhandler_proc.cc (format_proc_stat): Use correctly sized constants - for filling in zeros on 98. - -2003-07-09 Christopher Faylor - - * fhandler_proc.cc (fhandler_proc::fill_filebuf): Allocate more space - for stat buffer. - (format_proc_stat): Reorganize to accumulate and report on all cpus. - -2003-07-09 Christopher Faylor - - * sysconf.cc (sysconf): Return processors online rather than bitmask - for _SC_NPROCESSORS_ONLN. - -2003-07-08 Christopher Faylor - - * cygheap.cc (creturn): Set appropriate errno when out of memory. - (ccalloc): Only issue system_printf when debugging. - * dtable.cc (dtable::extend): Only allocate 100 * the incremental growth - size max. Set errno appropriately. - (dtable::build_fhandler): Check for error from set_name. - * fhandler.cc (fhandler_base::set_name): Set errno and return error on OOM. - * fhandler.h (fhandler_base::set_name): Change to bool. - * fhandler_process.cc (format_process_stat): Fix formatting. - * resource.cc (getrlimit): Return greater of OPEN_MAX or fd table size. - * sysconf.cc (sysconf): Ditto. - -2003-07-07 Christopher Faylor - - * rmsym: Don't use ranlib. - -2003-07-07 Christopher Faylor - - * newsym: Reenable removal of tmp directory. Just use ar to generate - archive index. - * Makefile.in: Don't send ranlib to newsym or rmsym. - -2003-07-07 Christopher Faylor - - * newsym: Create objects that are closer to those created by dlltool so - as not to confuse --export-all-symbols. - * rmsym: Be a little more accepting of object filenames now that - dlltool can create different format files. - -2003-07-06 Christopher Faylor - - * newsym: Oops. Revert below change. - -2003-07-06 Christopher Faylor - - * newsym: Use correct prefix for generating imports. - * pinfo.cc (_pinfo::commune_send): Don't wait forever for a response - from another process. - -2003-07-06 Christopher Faylor - - * syscalls.cc (gethostid): Set thread affinity so that results are - predictable. - -2003-07-05 Corinna Vinschen - - * mmap.cc (list::match): Add parameters to return valid address and - length back to munmap(). Evaluate intersection between given - area and mapped area and return it, if any. - (mmap64): On regular files, don't allow mappings beginning beyond - EOF. Return with errno set to ENXIO instead. - (munmap): Rewrite SUSv3 conformant. Check if given memory area is - valid. Unmap all maps inside given memory area. Don't return error - if no mapping has been unmapped. - -2003-07-05 N Stephens - - * fhandler.h (fhandler_socket::get_connect_state): New method to - return socket connection state. - * fhandler_socket.cc (dup): Copy socket connect state to new file - handle. - * net.cc (cygwin_rcmd): Mark file handles of sockets returned by - rcmd() as CONNECTED state. - (cygwin_rexec): Similarly for rexec(). - (socketpair): Mark both ends of a new socket pair as CONNECTED. - -2003-07-04 Corinna Vinschen - - * mmap.cc (fhandler_disk_file::mmap): Fix address test. - -2003-07-03 Christopher Faylor - - * path.cc (fillout_mntent): Change "posix" to "managed". - -2003-07-02 Christopher Faylor - - * fhandler.h (FH_ENC): New enum. - (fhandler_base::get_encoded): New function. - (fhandler_base::set_encoded): Ditto. - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Set encoded flag - in fhandler, as appropriate. - (fhandler_disk_file::readdir): Unmunge filename as appropriate based on - new encoding flag. - * path.cc (normalize_posix_path): Don't punt on files with colons. - (special_char): New function. - (mount_item::fnmunge): Ditto. - (fnunmunge): Ditto. - (special_name): Ditto. - (mount_item::build_win32): Avoid drive considerations when file is - encoded. - (mount_info::conv_to_win32_path): Handle encoded filenames. - (mount_info::conv_to_posix_path): Ditto. - (fillout_mntent): Add posix string when directory is encoded. - * path.h (fnunmunge): Declare. - (path_conv::is_encoded): Declare. - -2003-07-03 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::open): Conditionalize a little - more of the cygserver stuff so that ttys actually work. - -2003-07-03 Corinna Vinschen - - * mmap.cc (mmap64): Allow MAP_FIXED with pagesize granularity (4K). - If a non-zero addr is given, align it to the next lower 64K boundary. - (fhandler_disk_file::mmap): If a non-zero address is given, try - mapping using the given address first. If it fails and flags is not - MAP_FIXED, try again with NULL address. - -2003-07-01 Christopher Faylor - - * thread.cc: Remove _MT_SAFE conditional. - -2003-07-01 Christopher Faylor - - * configure.in: Fix --enable-server option. - * configure: Regenerate. - -2003-07-01 Christopher Faylor - - * Makefile.in: Remove cygserver stuff. - * acconfig.h: Add USE_CYGSERVER define. - * config.h.in: Regenerate. - * configure.in: Add --enable-server setting. - * configure: Regenerate. - * fhandler_tty.cc (fhandler_tty_slave::open): Conditionalize - compilation of cygserver stuff. - * fork.cc (fork_child): Ditto. - * shm.cc: Ditto. - * tty.cc (tty::common_init): Ditto. - - * dcrt0.cc: Use bool rather than BOOL for CYGWIN environment variable - definitions. - * environ.cc: Ditto. - * ntea.cc: Ditto. - * security.cc: Ditto. - * security.h: Ditto. - * syscalls.cc (check_posix_perm): Remove externs that were already - declared in a header. - * winsup.h: Ditto. Declare _MT_SAFE here. Delete it someday since - cygwin should always be _MT_SAFE. - -2003-07-01 Christopher Faylor - - * thread.cc: Remove _MT_SAFE conditional. - -2003-07-01 Christopher Faylor - - * configure.in: Fix --enable-server option. - * configure: Regenerate. - -2003-07-01 Christopher Faylor - - * Makefile.in: Remove cygserver stuff. - * acconfig.h: Add USE_CYGSERVER define. - * config.h.in: Regenerate. - * configure.in: Add --enable-server setting. - * configure: Regenerate. - * fhandler_tty.cc (fhandler_tty_slave::open): Conditionalize - compilation of cygserver stuff. - * fork.cc (fork_child): Ditto. - * shm.cc: Ditto. - * tty.cc (tty::common_init): Ditto. - - * dcrt0.cc: Use bool rather than BOOL for CYGWIN environment variable - definitions. - * environ.cc: Ditto. - * ntea.cc: Ditto. - * security.cc: Ditto. - * security.h: Ditto. - * syscalls.cc (check_posix_perm): Remove externs that were already - declared in a header. - * winsup.h: Ditto. Declare _MT_SAFE here. Delete it someday since - cygwin should always be _MT_SAFE. - -2003-06-30 Pierre Humblet - - * cygheap.h (enum impersonation): New enum. - (cygheap_user::token): Delete. - (cygheap_user::impersonated): Delete. - (cygheap_user::external_token): New member. - (cygheap_user::internal_token): New member. - (cygheap_user::impersonation_state): New member. - (cygheap_user::issetuid): Modify. - (cygheap_user::token): New method. - (cygheap_user::deimpersonate): New method. - (cygheap_user::reimpersonate): New method. - (cygheap_user::has_impersonation_tokens): New method. - (cygheap_user::close_impersonation_tokens): New method. - * dtable.cc (dtable::vfork_child_dup): Use new cygheap_user methods. - * fhandler_socket.cc (fhandler_socket::dup): Ditto. - * fork.cc (fork_child): Ditto. - (fork_parent): Ditto. - * grp.cc (internal_getgroups): Ditto. - * security.cc (verify_token): Ditto. - (check_file_access): Ditto. - (cygwin_set_impersonation_token): Detect conflicts. Set - user.external_token. - * spawn.cc (spawn_guts): Use new cygheap_user methods. - * syscalls.cc (seteuid32): Rearrange to use the two tokens - in cygheap_user. - (setegid32): Use new cygheap_user methods. - * uinfo.cc: (internal_getlogin): Ditto. - -2003-06-25 Doru Carastan - - * Makefile.in: Use INSTALL_PROGRAM to install the cygwin DLL. - -2003-06-24 Thomas Pfaff - - * thread.cc (MTinterface::fixup_after_fork): Fix thread list after - fork. - (pthread::threads): Instantiate. - (pthread::pthread): Initialize running and suspendend. - Initialize next with NULL. - Add thread to thread list if it is not the null_pthread. - (pthread::~pthread): Remove thread from thread list if it is - not the null_pthread. - (pthread::postcreate): Set running flag. - (pthread::exit): Reset running flag. - (pthread::cancel): Try to cancel thread only if still running. - (pthread::_fixup_after_fork): Implement. - (pthread::detach): Check if thread is still running before detach. - * thread.h (pthread::running): New member. - (pthread::next): Ditto. - (pthread::fixup_after_fork): New static method. - (pthread::threads): New static method. - (pthread::_fixup_after_fork): New method. - -2003-06-20 Christopher Faylor - - * pinfo.cc (_pinfo::commune_send): Don't attempt to communicate with a - pure windows process. - -2003-06-18 Pierre Humblet - - * autoload.cc (GetNetworkParams): Add. - * net.cc (getdomainname): Call GetNetworkParams and read the - DhcpDomain registry value if warranted. - -2003-06-17 Christopher Faylor - - * path.cc (mount): Do more strict checking on posix path arguments. - -2003-06-15 Christopher Faylor - - Throughout, remove "include " from files which already include - cygerrno.h. - -2003-06-15 Thomas Pfaff - - * include/cygwin/config.h (__DYNAMIC_REENT__): Define. - * include/cygwin/version.h: Bump API minor version. - * cygwin.din: Export __getreent - * cygerrno.h: Include errno.h. Fix places where _impure_ptr is used - directly to store the errno value. - * debug.cc (__set_errno): Ditto. - * errno.cc: Remove _RRENT_ONLY define to get errno.cc compiled. - * signal.cc: Rename _reent_clib to _REENT throughout. - * thread.h (reent_clib): Remove prototype. - * thread.cc (reent_clib): Rename reent_clib to __getreent. Return - _impure_ptr until MTinterface is initialized. - (reent_winsup): Fix a possible SEGV when _r == NULL. Return NULL - instead. - * MTinterface::fixup_after_fork: Switch reent back to _impure_ptr to - keep signal handling running when fork is called from a thread other - than the mainthread. - -2003-06-12 Thomas Pfaff - - * thread.cc (pthread_attr_init): Revert change from 2003-06-11 - to return 0 if attribute is already initialized back to EBUSY. - (pthread_condattr_init): Ditto. - (pthread_rwlockattr_init): Ditto. - (pthread_mutexattr_init): Ditto. - -2003-06-12 Corinna Vinschen - - * exceptions.cc (ctrl_c_handler): Don't send a signal on - CTRL_SHUTDOWN_EVENT. Add a comment to rationalize the patch. - -2003-06-11 Thomas Pfaff - - * thread.cc (pthread_attr_init): Return 0 if attribute is already - initialized. - Fix return code if out of memory. - (pthread_condattr_init): Ditto. - (pthread_rwlockattr_init): Ditto. - (pthread_mutexattr_init): Return 0 if attribute is already - initialized. - -2003-06-09 Pierre Humblet - - * spawn.cc (spawn_guts): Call CreateProcess while impersonated, - when the real {u,g}ids and the groups are original. - Move RevertToSelf and ImpersonateLoggedOnUser to the main line. - * uinfo.cc (uinfo_init): Reorganize. If CreateProcess was called - while impersonated, preserve the uids and gids and call - ImpersonateLoggedOnUser. Preserve the uids and gids on Win9X. - - * exceptions.cc (error_start_init): Quote the pgm in the command. - -2003-06-07 Christopher Faylor - - * poll.cc: Define FD_SETSIZE to ridiculously large number so that there - will be no artificially small limits. - -2003-06-07 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::close): Free the console when - last tty closes. - -2003-06-07 Thomas Pfaff - - * fhandler_socket.cc (fhandler_socket::connect): Change error - handling for nonblocking connects to return EALREADY when - connect is called more than once for the same socket. - -2003-06-06 Corinna Vinschen - - * cygwin.din: Add vsyslog. - * fhandler.cc (fhandler_base::write): Only make file sparse if the - seeked area is >= 128K. - * syslog.cc (vsyslog): New function, overtaking functionality from - syslog. - (syslog): Just call vsyslog. - * include/cygwin/version.h: Bump API minor. - * include/sys/syslog.h: Add vsyslog declaration. - -2003-06-05 Christopher Faylor - - * cygthread.cc (cygthread::terminate_thread): Change system_printf to - debug_printf. - -2003-06-04 Christopher Faylor - - * shared.cc (shared_info::heap_chunk_size): Be really defensive about - making sure that heap_chunk is set. - -2003-06-04 Christopher Faylor - - * path.cc (conv_path_list): Use correct value when calculating length - to avoid a potential SEGV. - -2003-06-03 Pierre Humblet - - * fhandler_disk_file.cc (fhandler_disk_file::fstat): Mark the pc - as non-executable if the file cannot be opened for read. Retry query - open only if errno is EACCES. Never change the mode, even if it is 000 - when query open() fails. - -2003-06-03 Christopher Faylor - - * configure.in: Allow any i?86 variant. - * configure: Regenerate. - -2003-06-03 Corinna Vinschen - Thomas Pfaff - - * fhandler_socket.cc (connect_thread): Remove. - (accept_thread): Remove. - (fhandler_socket::connect): Remove all special blocking handling. - (fhandler_socket::accept): Ditto. - * net.cc (cygwin_connect): Make blocking sockets temporarily - non-blocking and call cygwin_select on them to be interruptible. - (cygwin_accept): Ditto. - -2003-06-02 Christopher Faylor - - * spawn.cc (spawn_guts): Don't hang around if the parent doesn't exist. - -2003-06-02 Christopher Faylor - - * cygthread.h (cygthread::terminate_thread): Mark private. - * cygthread.cc (cygthread::terminate_thread): Deallocate free_range - thread stuff. - -2003-06-02 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::accept): Rename `signalled' - to `interrupted' as used in fhandler_socket::connect. - -2003-06-02 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::connect): Simplify previous - patch. - (fhandler_socket::accept): Ditto. - -2003-06-02 Corinna Vinschen - - * fhandler_socket.cc: Include cygthread.h. - (class sock_event): Remove. - (thread_connect): New function. - (thread_accept): Ditto. - (fhandler_socket::connect): Use cygthread instead of socket event - handling for blocking sockets. - (fhandler_socket::accept): Ditto. - -2003-06-02 Christopher Faylor - - * fhandler.cc (fhandler_base::write): Correct minor printf formatting - style glitch. - -2003-06-01 Pierre Humblet - - * fhandler_disk_file.cc (fhandler_disk_file::fstat_by_name): Assume - an existing directory is a root if FindFirstFile fails. - -2003-05-30 Christopher Faylor - - * path.cc (mount_info::conv_to_win32_path): gcc warning about chroot_ok - was actually valid. Fix it. - -2003-05-30 Christopher Faylor - - * cygheap.cc (init_cheap): Temporarily remove inline that newer gcc's - have problems with. - - * path.cc (path_conv::check): Rework has_acls logic slightly. Uncouple - exec tests away from filesystem tests. - -2003-05-30 Corinna Vinschen - - * include/sys/param.h: Add DEV_BSIZE. - -2003-05-29 Pierre Humblet - Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::dup): Rearrange. Fix - conditional. - -2003-05-28 Christopher Faylor - - * mkvers.sh: Avoid "-dontuse" tags. - - * path.cc (path_conv::check): Set exec state based on known situations. - - * path.cc (mount_item::fnmunge): New function. - (mount_item::build_win32): New function. - (mount_info::conv_to_win32_path): Use build_win32 to build windows - path. - * path.h (mount_item::fnmunge): Declare new function. - (mount_item::build_win32): Ditto. - * sys/mount.h (MOUNT_ENC): Define. - -2003-05-28 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::dup): If running impersonated, - revert to original account before calling fixup_before_fork_exec - and impersonate again afterwards. Change comment accordingly. - Clean up error handling and debug output. - -2003-05-27 Thomas Pfaff - - * fhandler_socket.cc (sock_event::~sock_event): New method. - (sock_event::load): Change to void. Check if winsock2 is available. - (socke_event::wait): Return 0 if interruptible mode is not available. - (fhandler_socket::connect): Remove checks for winsock2 availability. - (fhandler_socket::accept): Ditto. - -2003-05-27 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::dup): First try duplicating - using WSADuplicateSocket/WSASocket, if that fails, try DuplicateHandle. - -2003-05-27 Bill C. Riemers - - * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Filter - permissions through umask on FAT or if ntsec is off. - -2003-05-26 Pierre Humblet - - * syscalls.cc (statfs): Call GetDiskFreeSpaceEx before GetDiskFreeSpace. - -2003-05-26 Corinna Vinschen - - * fhandler.cc (is_at_eof): Fix conditional. Use INVALID_FILE_SIZE - instead of numeric constant. - -2003-05-26 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::connect): Guard calls to - sock_event methods by a check for WinSock2 availability. - (fhandler_socket::accept): Ditto. - -2003-05-26 Corinna Vinschen - - * fhandler.h: Rename FH_W95LSBUG flag to FH_LSEEKED. - (fhandler_base::set_did_lseek): Rename from set_check_win95_lseek_bug. - (fhandler_base::get_did_lseek): Rename from get_check_win95_lseek_bug. - (fhandler_base::set_fs_flags): New method. - (fhandler_base::get_fs_flags): Ditto. - * fhandler.cc (fhandler_base::write): Make 64 bit clean. Convert file - to a "sparse" file when writing after a long lseek (>64K) beyond EOF. - (fhandler_base::lseek): Call set_did_lseek() instead of - set_check_win95_lseek_bug(). - (fhandler_base::fhandler_base): Initialize fs_flags to 0. - * fhandler_disk_file.cc (fhandler_disk_file::open): Don't create files - as "sparse" unconditionally. Set fs_flags member. - -2003-05-25 Pierre Humblet - - * autoload.cc (GetDiskFreeSpaceEx): Add. - * syscalls.cc (statfs): Call full_path.root_dir() instead of - rootdir(full_path). Use GetDiskFreeSpaceEx when available and - report space available in addition to free space. - * fhandler_disk_file.cc (fhandler_disk_file::fstat_by_name): - Do not call FindFirstFile for disk root directories. - -2003-05-24 Joe Buehler - - * fhandler_process.cc (format_process_stat): Use PagefileUsage - instead of VirtualSize. - (get_mem_values): Ditto. - -2003-05-21 Corinna Vinschen - - * shared_info.h: Match shared_name declaration with below change. - * shared.cc (shared_name): Use incoming char * parameter instead of - local static buffer. - (open_shared): Accommodate new calling convention for shared_name. - * exceptions.cc (events_init): Ditto. - * sigproc.cc (getsem): Ditto. - * syscalls.cc (login): Ditto. - (logout): Ditto. - (pututline): Ditto. - -2003-05-20 Corinna Vinschen - - * fhandler_socket.cc (secret_event_name): Return void. Use incoming - char * parameter instead of local static buffer. - (fhandler_socket::create_secret_event): Accommodate new calling - convention for secret_event_name. - (fhandler_socket::close_secret_event): Ditto. - -2003-05-20 Corinna Vinschen - - * fhandler_socket.cc (SECRET_EVENT_NAME): Remove. - (ENTROPY_SOURCE_NAME): Ditto. - (secret_event_name): New static function. Create shared event name - with "Global\" prefix on systems supporting terminal services. - (fhandler_socket::set_connect_secret): Fix conditional. - (fhandler_socket::create_secret_event): Create secret event using - secret_event_name(). - (fhandler_socket::close_secret_event): Ditto. - * shared.cc (shared_name): Create shared object name with "Global\" - prefix on systems supporting terminal services. - * wincap.cc: Set has_terminal_services capability throughout. - (wincap_2003): New global object representing Windows 2003 Server - capabilities. - (wincapc::init): Accommodate Windows 2003 Server. - * wincap.h (struct wincaps): Add has_terminal_services capability. - -2003-05-20 Charles Wilson - - * winsup/cygwin/include/cygwin/version.h: Bump API minor version. - * winsup/cygwin/include/cygwin/types.h: Define key_t as long long. - * winsup/cygwin/cygwin.din: Add ftok, _ftok. - * winsup/cygwin/ipc.cc (ftok): Rework implementation. - -2003-05-18 Joe Buehler - - * spawn.cc (spawn_guts): Show more of command line in strace output. - -2003-05-15 Thomas Pfaff - - * thread.h (pthread::init_mainthread): Remove function parameter. - (MTinterface::Init): Ditto. - * thread.cc (MTinterface::Init): Remove function parameter. - Always initialize reent_key. - (pthread::init_mainthread): Remove function parameter. - (MTinterface::fixup_after_fork): Fix pthread::init_mainthread call. - * dcrt0.cc (dll_crt_0_1) Fix calls to MTinterface::Init and - pthread::init_mainthread. - Call pthread::init_mainthread only when not forked. - -2003-05-15 Corinna Vinschen - - * fhandler_proc.cc (format_proc_meminfo): Make swap memory output - Linux style values. - -2003-05-13 Corinna Vinschen - - * include/cygwin/config.h: Define __USE_INTERNAL_STAT64 appropriately. - -2003-05-12 Corinna Vinschen - - * Makefile.in (CYGWIN_START): Define as crt0.o. Add to TARGET_LIBS. - * fhandler.h (fhandler_virtual::fstat): Remove useless declaration. - * fhandler_virtual.cc: Remove _COMPILING_NEWLIB define. - * ipc.cc (ftok): Use stat64. - * syscalls.cc (_fstat64): Remove alias. - (_fstat): Ditto. - (_stat): Ditto. - (_fstat64_r): New function. - (_fstat_r): Ditto. - (_stat64_r): Ditto. - (stat_r): Ditto. - * crt0.o: New file, moved from newlib. - * include/sys/param.h: Ditto. - * include/sys/utime.h: Ditto. - * include/sys/utmp.h: Ditto. - * include/sys/dirent.h: Ditto. Expose different struct dirent, - dependening of the environment. - -2003-05-11 Corinna Vinschen - - Replace ino_t by __ino64_t throughout. - -2003-05-11 Corinna Vinschen - - * include/cygwin/types.h: Add key_t typedef. - -2003-05-10 Christopher Faylor - - * dir.cc (readdir): Fill out new old_d_ino field. - * fhandler.h (fhandler_base::namehash): Define as ino_t. - (fhandler_base::get_namehash): Ditto. - * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Accommodate - new 64 bit st_ino. - * fhandler_socket.cc (fhandler_socket::fstat): Ditto. - * path.cc (hash_path_name): Return ino_t. - * syscalls.cc (stat64_to_stat32): Convert 64 bit inode to 32 bit. - * winsup.h (hash_path_name): Declare as returning ino_t. - * include/cygwin/stat.h (__stat32): Use 32 bit st_ino. - (__stat64): Use 64 bit st_ino. - * include/cygwin/types.h (__ino64_t): Define. - (__ino32_t): Ditto. - (ino_t): Define appropriately. - -2003-05-10 Corinna Vinschen - - * Makefile.in (NEW_FUNCTIONS): All 32/64 from 0.79 API get - leading underscore. - * cygwin.din: Ditto. - * include/cygwin/version.h: Bump API minor number. - -2003-05-09 Corinna Vinschen - - * include/cygwin/config.h: New file. - -2003-05-09 Christopher Faylor - - * cygthread.cc (cygthread::detach): Prioritize waiting for I/O - completion over waiting for signal delivery. - -2003-05-06 Thomas Pfaff - - * signal.cc (nanosleep): Do not wait twice for signal arrival. - -2003-05-03 Corinna Vinschen - - * include/cygwin/types.h: Fix erroneous definition of ino_t from - 2003-04-28. - -2003-05-03 Corinna Vinschen - - * syscalls.cc (chown_worker): Allow chown'ing of socket files. - -2003-04-30 Thomas Pfaff - - * Makefile.in: Revert patch from 2003-04-17. - -2003-04-28 Brian Ford - - * profil.h (PROFADDR): Prevent overflow when text segments are larger - than 256k. - * profil.c (profthr_func): Raise thread priority for more accurate - sampling. - -2003-04-26 Christopher Faylor - - * path.cc (hash_path_name): Use ino_t as type. - -2003-04-26 Christopher Faylor - - * errno.cc (_sys_nerr): Fix compile error erroneously checked in on - 2003-04-23. - -2003-04-25 Corinna Vinschen - - * include/netinet/ip.h: Include netinet/in_systm.h and netinet/in.h - to allow standalone usage (autoconf). - -2003-04-23 Christopher Faylor - - * fork.cc: Change SLOW_PID_REUSE to NO_SLOW_PID_REUSE and invert ifdef - sense throughout. - -2003-04-22 Christopher Faylor - - * select.cc (fhandler_pipe::ready_for_read): Assure that get_guard is - called for successful non-blocking pipe reads. - -2003-04-22 Corinna Vinschen - - * include/inttypes.h: New file. - * include/stdint.h: New file. - * include/cygwin/in.h: Include stdint.h instead of sys/types.h. - * include/cygwin/types.h: Include stdint.h. Remove typedefs for - intN_t and uintN_t since these are defined in stdint.h now. - -2003-04-21 Christopher Faylor - - * include/cygwin/version.h: Bump DLL major number to 1005. Change DLL - minor number to 0. Bump API minor number. - -2003-04-20 Corinna Vinschen - - * autoload.cc (CreateWindowStationA): Add. - (SetProcessWindowStation): Add. - -2003-04-19 Christopher Faylor - - * wincap.h (wincaps:pty_needs_alloc_console): New element. - (wincapc:pty_needs_alloc_console): New function. - * wincap.cc: Add pty_needs_alloc_console throughout. - * fhandler_tty.cc (fhandler_tty_slave::open): Open an "invisible" - console on first pty allocation. - -2003-04-18 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::open): Allocate a console - whenever a pty is allocated. - -2003-04-18 Christopher Faylor - - * Makefile.in: Use ${nostdlib} variable. - -2003-04-18 Diego Biurrun - - * fhandler_proc.cc (format_proc_cpuinfo): Change /proc/cpuinfo "vendor - id" string to "vendor_id" to conform with Linux systems. - -2003-04-17 Christopher Faylor - - * syscalls.cc (setsid): Don't call FreeConsole if ctty is already < 0. - -2003-04-17 Thomas Pfaff - - * Makefile.in: Add finline-functions optimization to CXXFLAGS. - * autoload.cc (LoadDLLprime): Rename std_dll_init to - _std_dll_init. - (std_dll_init): Remove name mangling prototype. Add attributes - used and noinline. - (wsock_init): Ditto. - Change wsock_init to _wsock_init in wsock32 and ws2_32 - LoadDLLprime. - * exceptions.cc (unused_sig_wrapper): Remove prototype. Add - attributes used and noinline. - * pwdgrp.h ((pwdgrp (passwd *&)): Remove inline code. - (pwdgrp (__group32 *&)): Ditto. - * grp.cc (pwdgrp (passwd *&)): Outline constructor. - (pwdgrp (__group32 *&)): Ditto. - -2003-04-17 Thomas Pfaff - - * thread.h (pthread::equal): New static method. - * thread.cc: Rename pthread_equal to pthread::equal throughout. - (pthread_equal): Use pthread::equal to compare threads ids. - -2003-04-15 Christopher Faylor - - * termios.cc (setspeed): New function. - (cfsetospeed): Use setspeed to set speed. - (cfsetispeed): Use setspeed to set speed. - -2003-04-15 Chris January - - * autoload.cc: Add load statement for UuidCreate, and - UuidCreateSequential. - * cpuid.h: New file. - * cygwin.din: Export gethostid. - * fhandler_proc.cc (cpuid): Move to cpuid.h. - (can_set_flag): Move to cpuid.h. - * syscalls.cc (gethostid): New function. - * version.h: Bump api minor version number to 83. - -2003-04-15 Thomas Pfaff - - * thread.h (pthread_rwlock::release): New method. - * thread.cc (pthread_rwlock::unlock): Use release to signal waiting - threads. - (pthread_rwlock::rdlock_cleanup): Signal waiting threads after a - cancelation. - (pthread_rwlock::wrlock_cleanup): Ditto. - -2003-04-13 Pierre Humblet - - * mkvers.sh: Prefix day with 0 in date only when day < 10. - -2003-04-11 Pierre Humblet - - * security.cc (get_info_from_sd): New function. - (get_nt_attribute): Only call read_sd and get_info_from_sd. - Return void. - (get_file_attribute): Move sd error handling to get_info_from_sd. - and symlink handling to fhandler_disk_file::fstat_helper. - (get_nt_object_attribute): Only call read_sd and get_info_from_sd. - Return void. - (get_object_attribute): Remove symlink handling and simply return -1 - when ntsec is off. - * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): For - symlinks set the attribute, call get_file_attribute to get the ids - and return. In the normal case call get_file_attribute with the - addresses of the buffer ids and do not recheck if the file is a socket. - -2003-04-10 Christopher Faylor - - * cygthread.cc (cygthread::stub): Initialize stack pointer earlier. - (cygthread::simplestub): Initialize stack pointer. - (cygthread::terminate_thread): Account for possibility that stack - pointer has not been set. Issue warnings for unusual conditions. - -2003-04-10 Corinna Vinschen - - * regex/regex.h: Define regoff_t as _off_t. - * regex/regex2.h: Ditto. - -2003-04-10 Corinna Vinschen - - * cygwin.din: Export wcscoll, wcswidth and wcwidth. - * include/cygwin/version.h: Bump API minor number. - -2003-04-10 Christopher Faylor - - * cygthread.h: Change 'avail' cygthread element to 'inuse' throughout. - * cygthread.cc: Ditto. - (cygthread::stub): Don't initialize already initialized events. - (cygthread::freerange): Don't create thread here. - (cygthread::cygthread): Create thread here. Die if thread not created. - (cygthread::operator new): Simplify. Just grab a thread structure from - the pool. Don't try to start the thread. - (cygthread::terminate_thread): Don't close event handles. Just reuse - them. Call MEM_RELEASE rather than MEM_DECOMMIT (from Joe uehler). - -2003-04-08 Bob Cassels - - * fhandler_console.cc (fhandler_console::read) Handle certain key up - events, to allow pasting accented characters and typing them using the - "alt + numerics" sequences. - -2003-04-07 Christopher Faylor - - * include/limits.h (IOV_MAX): Set to a number which is small enough to - use in an array. - -2003-04-04 Christopher Faylor - - * cygthread.h (cygthread::avail): Make LONG for easier use with - Interlocked* functions. - * cygthread.cc (cygthread::init): Eliminate unneeded muto. - (cygthread::operator new): Don't lock. Instead change use of avail - variable into tri-state: available (1), not available (-1), - uninitialized (0). - (cygthread::terminate_thread): Set avail to uninitialized. - (cygthread::detach): Eliminate local 'avail'. Always set avail to 1 - unless signalled. - -2003-04-04 Christopher Faylor - - * cygthread.cc (cygthread::operator new): Be more defensive when messing with - threads that are marked "unavailable". - -2003-04-03 Christopher Faylor - - * fhandler_console.cc (CONVERT_LIMIT): Use a size for the 21st century. - -2003-04-03 Corinna Vinschen - - * external.cc (check_ntsec): Return general ntsec state on NULL - filename. Check wincap.is_security() additionally. - -2003-04-02 Christopher Faylor - - * Makefile.in (EXTRA_OFILES): Remove debugging object. - -2003-04-02 Jason Tishler - Christopher Faylor - - * external.cc (check_ntsec): New function. - (cygwin_internal): Add CW_CHECK_NTSEC handling to call check_ntsec() - from applications. - * include/cygwin/version.h: Bump API minor number. - * include/sys/cygwin.h (cygwin_getinfo_types): Add CW_CHECK_NTSEC. - -2003-04-02 Christopher Faylor - - * cygthread.cc (cygthread::new): Add more defensive debugging. - -2003-04-01 Pierre Humblet - - * fhandler.cc (fhandler_base::fstat): Set the uid and gid fields - from the current effective ids. - * fhandler_socket.cc (fhandler_socket::fstat): Keep the uid and gid set - by fhandler_base::fstat. - * security.cc (get_nt_attribute): Do not test wincap.has_security (). - (get_nt_object_attribute): Ditto. - (get_file_attribute): Add test for wincap.has_security (). - (get_object_attribute): Ditto. - -2003-04-01 Corinna Vinschen - - * dir.cc: Change __off32_t to _off_t and __off64_t to _off64_t - throughout. - * fhandler.cc: Ditto. - * fhandler.h: Ditto. - * fhandler_clipboard.cc: Ditto. - * fhandler_disk_file.cc: Ditto. - * fhandler_dsp.cc: Ditto. - * fhandler_floppy.cc: Ditto. - * fhandler_mem.cc: Ditto. - * fhandler_proc.cc: Ditto. - * fhandler_process.cc: Ditto. - * fhandler_random.cc: Ditto. - * fhandler_registry.cc: Ditto. - * fhandler_tape.cc: Ditto. - * fhandler_termios.cc: Ditto. - * fhandler_virtual.cc: Ditto. - * fhandler_zero.cc: Ditto. - * mmap.cc: Ditto. - * pipe.cc: Ditto. - * syscalls.cc: Ditto. - * winsup.h: Ditto. - * include/cygwin/stat.h: Ditto. - * include/cygwin/types.h: Ditto. Remove definition of __off32_t - and __off64_t. - -2003-03-31 Christopher Faylor - - * exceptions.cc (setup_handler): Make sure winapi lock is released when - exiting loop. - -2003-03-30 Christopher Faylor - - * include/cygwin/fs.h: Remove unneeded include. - * include/cygwin/in.h: Include sys/types.h rather than cygwin/types.h. - -2003-03-29 Corinna Vinschen - - * syscalls.cc (login): Fix comment. - (logout): Ditto. - -2003-03-29 Corinna Vinschen - - * syscalls.cc: Slightly cleanup all utmp functions. - (login): Use mutex to secure against concurrent access to wtmp file. - (logout): Rewrite using POSIX calls. - (utmp_fd): Initialized to -1 now. Any value < 0 is treated as closed - in subsequent functions. - (utmp_readonly): New variable, indicating utmp file open for reading - only. - (internal_setutent): New function implementing setutent(). - (setutent): Call internal_setutent now. - (endutent): Reset utmp_readonly. - (getutent): Return immediately if utmp file can't be opened. - (getutid): Ditto. - (getutline): Ditto. - (pututline): Ditto. Use mutex to secure against concurrent access to - utmp file. - -2003-03-28 Christopher Faylor - - * Makefile.in: Remove EXE_LDFLAGS. Fix fhandler_CFLAGS typo. Recognize .s suffix. - * configure.in: Remove EXE_LDFLAGS. - * configure: Regenerate. - -2003-03-28 Christopher Faylor - - * include/sys/cygwin.h: Declare cygwin_internal as unsigned long. - * external.cc (cygwin_internal): Define as unsigned long. - -2003-03-27 Christopher Faylor - - * include/sys/cygwin.h: Move cygwin_internal outside of WINVER - conditional. - -2003-03-27 Thomas Pfaff - - * thread.cc: Change 1==foo equations to foo==1 throughout. - -2003-03-27 Thomas Pfaff - - * thread.h: Change class names, methods, members and local vars - according to the GNU coding style. - * thread.cc: Ditto. - * dcrt0.cc (dll_crt0_1): Rename pthread::initMainThread call to - pthread::init_mainthread. - * pthread.cc (pthead_getsequence_np): Rename pthread::isGoodObject - call to pthread::is_good_object. - -2003-03-27 Joe Buehler - - * autoload.cc: Add RegGetKeySecurity(). - * security.cc (get_nt_object_attribute): Use RegGetKeySecurity() for - performance. - -2003-03-25 Christopher Faylor - Joe Buehler - - * fork.cc (fork_parent): Don't copy signals from parent to child here. - * sigproc.cc (proc_subproc): Copy signals from parent to child pinfo - here. - -2003-03-23 Thomas Pfaff - - * thread.h (class List): Move inline code inside class declaration. - (List::forEach): Change callback parameter to template class member - function pointer. - (pthread_keys::fixup_before_fork): Change to inline. Use List::forEach - to fixup keys. - (pthread_keys::fixup_after_fork): Ditto. - (pthread_keys::runAllDestructors): Ditto. - (pthread_key::saveAKey): Remove. - (pthread_key::restoreAKey): Ditto. - (pthread_key::destroyAKey): Ditto. - (pthread_key::run_destructor): Rename to runDestructor. - (pthread_mutex::fixup_after_fork): Change to inline. Use List::forEach - to fixup mutexes after a fork. - (pthread_mutex::FixupAfterFork): New method. - (pthread_mutex::mutexes): New member. - (pthread_cond::fixup_after_fork): Change to inline. Use List::forEach - to fixup conds after a fork. - (pthread_cond::FixupAfterFork): New method. - (pthread_cond::conds): New member. - (pthread_rwlock::fixup_after_fork): Change to inline. Use - List::forEach to fixup rwlocks after a fork. - (pthread_rwlock::FixupAfterFork): New method. - (pthread_rwlock::rwlocks): New member. - (semaphore::fixup_after_fork): Change to inline. Use List::forEach to - fixup mutexes after a fork. - (semaphore::FixupAfterFork): New method. - (semaphore::semaphores): New member. - (MTinterface::mutexs): Remove. - (MTinterface::conds): Ditto. - (MTinterface::rwlocks): Ditto. - (MTinterface::semaphores): Ditto. - (pthread_equal): Add extern "C". - (pthread_mutex_lock): Ditto. - - * thread.cc (MTinterface::fixup_after_fork): Change fixup_after_fork - calls for pthread objects. - (semaphore::conds): Instantiate. - (pthread_cond::pthread_cond): Use List::Insert rather than custom list - code. - (pthread_cond::~pthread_cond): Use List::Remove rather than custom list - code. - (pthread_cond::fixup_after_fork): Rename to FixupAfterFork. - (pthread_rwlock::rwlocks): Instantiate. - (pthread_rwlock::pthread_crwlock): Use List::Insert rather than custom - list code. - (pthread_rwlock::~pthread_rwlock): Use List::Remove rather than custom - list code. - (pthread_rwlock::fixup_after_fork): Rename to FixupAfterFork. - (pthread_key::saveAKey): Remove. - (pthread_key::fixup_before_fork): Ditto. - (pthread_key::restoreAKey): Ditto. - (pthread_key::fixup_after_fork): Ditto. - (pthread_key::destroyAKey): Ditto. - (pthread_key::runAllDestructors): Ditto. - (pthread_key::run_destructor): Rename to runDestructor. - (pthread_mutex::mutexes): Instantiate. - (pthread_mutex::pthread_mutex): Use List::Insert rather than custom - list code. - (pthread_mutex::~pthread_mutex): Use List::Remove rather than custom - list code. - (pthread_mutex::fixup_after_fork): Rename to FixupAfterFork. - (semaphore::conds): Instantiate. - (semaphore::semaphore): Use List::Insert rather than custom list code. - (semaphores::~semaphore): Use List::Remove rather than custom list - code. - (semaphore::fixup_after_fork): Rename to FixupAfterFork. - -2003-03-22 Christopher Faylor - - * pipe.cc (fhandler_pipe::dup): Don't dup input_handle if it doesn't - exist. - -2003-03-22 Christopher Faylor - - * syscalls.cc (unlink): Be more defensive when SetFileAttributes is - called. Fix typo in debugging output. - -2003-03-21 Christopher Faylor - - * fork.cc: Conditionalize use of slow_pid_reuse throughout. It's not - necessary for newer versions of bash. - -2003-03-20 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::sendto): Restrict EPIPE and - SIGPIPE handling to connection oriented sockets. Add comment. - -2003-03-19 Christopher Faylor - - * sigproc.h (signal_fixup_after_exec): Eliminate argument in declaration. - * exceptions.cc (signal_fixup_after_exec): Eliminate argument in - definition. Don't reset signal handlers after spawm. Just treat like - fork/exec. - * dcrt0.cc (dll_crt0_1): Don't pass PROC_SPAWN argument to - signal_fixup_after_exec. - * syscalls.cc (unlink): Don't change attributes of file if not readonly/system. - Ditto for resetting of arguments. - -2003-03-19 Corinna Vinschen - - * glob.c: Eliminate __INSIDE_CYGWIN__ preprocessor conditionals - throughout. - -2003-03-19 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Fix - wrong usage of S_IFDIR. - * security.cc (get_attribute_from_acl): Ditto. - (get_file_attribute): Fix wrong usage of S_IFLNK. - (get_object_attribute): Ditto. - (alloc_sd): Fix wrong usage of S_IFDIR. - * syscalls.cc (chmod): Allow chmod'ing of socket files. - -2003-03-19 Corinna Vinschen - - * include/cygwin/version.h (CYGWIN_VERSION_CHECK_FOR_USING_BIG_TYPES): - Define. - * glob.c (g_lstat): Use CYGWIN_VERSION_CHECK_FOR_USING_BIG_TYPES - instead of numerical constants. - (g_stat): Ditto. - -2003-03-18 Thomas Pfaff - - * pthread.cc (pthread_attr_init): Remove - (pthread_attr_destroy): Ditto. - (pthread_attr_setdetachstate): Ditto. - (pthread_attr_getdetachstate): Ditto. - (pthread_attr_setstacksize): Ditto. - (pthread_attr_getstacksize): Ditto. - (pthread_attr_setinheritsched): Ditto. - (pthread_attr_getinheritsched): Ditto. - (pthread_attr_setschedparam): Ditto. - (pthread_attr_getschedparam): Ditto. - (pthread_attr_setschedpolicy): Ditto. - (pthread_attr_getschedpolicy): Ditto. - (pthread_attr_setscope): Ditto. - (pthread_attr_getscope): Ditto. - (pthread_attr_setstackaddr): Ditto. - (pthread_attr_getstackaddr): Ditto. - (pthread_key_create): Ditto. - (pthread_key_delete): Ditto. - (pthread_setspecific): Ditto. - (pthread_getspecific): Ditto. - (pthread_kill): Ditto. - (pthread_sigmask): Ditto. - (pthread_equal): Ditto. - (pthread_mutex_lock): Ditto. - (pthread_mutex_trylock): Ditto. - (pthread_mutex_unlock): Ditto. - (pthread_mutex_destroy): Ditto. - (pthread_mutex_setprioceiling): Ditto. - (pthread_mutex_getprioceiling): Ditto. - (pthread_mutexattr_destroy): Ditto. - (pthread_mutexattr_getprioceiling): Ditto. - (pthread_mutexattr_getprotocol): Ditto. - (pthread_mutexattr_getpshared): Ditto. - (pthread_mutexattr_gettype): Ditto. - (pthread_mutexattr_init): Ditto. - (pthread_mutexattr_setprioceiling): Ditto. - (pthread_mutexattr_setprotocol): Ditto. - (pthread_mutexattr_setpshared): Ditto. - (pthread_mutexattr_settype): Ditto. - (pthread_cond_destroy): Ditto. - (pthread_cond_signal): Ditto. - (pthread_cond_broadcast): Ditto. - (pthread_condattr_init): Ditto. - (pthread_condattr_destroy): Ditto. - (pthread_condattr_getpshared): Ditto. - (pthread_condattr_setpshared): Ditto. - (pthread_rwlock_destroy): Ditto. - (pthread_rwlock_rdlock): Ditto. - (pthread_rwlock_tryrdlock): Ditto. - (pthread_rwlock_wrlock): Ditto. - (pthread_rwlock_trywrlock): Ditto. - (pthread_rwlock_unlock): Ditto. - (pthread_rwlockattr_init): Ditto. - (pthread_rwlockattr_getpshared): Ditto. - (pthread_rwlockattr_setpshared): Ditto. - (pthread_rwlockattr_destroy): Ditto. - (pthread_getconcurrency): Ditto. - (pthread_setconcurrency): Ditto. - (pthread_getschedparam): Ditto. - (pthread_setschedparam): Ditto. - - * thread.h (__pthread_attr_init): Remove prototype. - (__pthread_attr_destroy): Ditto. - (__pthread_attr_setdetachstate): Ditto. - (__pthread_attr_getdetachstate): Ditto. - (__pthread_attr_setstacksize): Ditto. - (__pthread_attr_getstacksize): Ditto. - (__pthread_attr_setinheritsched): Ditto. - (__pthread_attr_getinheritsched): Ditto. - (__pthread_attr_setschedparam): Ditto. - (__pthread_attr_getschedparam): Ditto. - (__pthread_attr_setschedpolicy): Ditto. - (__pthread_attr_getschedpolicy): Ditto. - (__pthread_attr_setscope): Ditto. - (__pthread_attr_getscope): Ditto. - (__pthread_attr_setstackaddr): Ditto. - (__pthread_attr_getstackaddr): Ditto. - (__pthread_key_create): Ditto. - (__pthread_key_delete): Ditto. - (__pthread_setspecific): Ditto. - (__pthread_getspecific): Ditto. - (__pthread_kill): Ditto. - (__pthread_sigmask): Ditto. - (__pthread_equal): Ditto. - (__pthread_mutex_lock): Ditto. - (__pthread_mutex_trylock): Ditto. - (__pthread_mutex_unlock): Ditto. - (__pthread_mutex_destroy): Ditto. - (__pthread_mutex_setprioceiling): Ditto. - (__pthread_mutex_getprioceiling): Ditto. - (__pthread_mutexattr_destroy): Ditto. - (__pthread_mutexattr_getprioceiling): Ditto. - (__pthread_mutexattr_getprotocol): Ditto. - (__pthread_mutexattr_getpshared): Ditto. - (__pthread_mutexattr_gettype): Ditto. - (__pthread_mutexattr_init): Ditto. - (__pthread_mutexattr_setprioceiling): Ditto. - (__pthread_mutexattr_setprotocol): Ditto. - (__pthread_mutexattr_setpshared): Ditto. - (__pthread_mutexattr_settype): Ditto. - (__pthread_cond_destroy): Ditto. - (__pthread_cond_signal): Ditto. - (__pthread_cond_broadcast): Ditto. - (__pthread_condattr_init): Ditto. - (__pthread_condattr_destroy): Ditto. - (__pthread_condattr_getpshared): Ditto. - (__pthread_condattr_setpshared): Ditto. - (__pthread_rwlock_destroy): Ditto. - (__pthread_rwlock_rdlock): Ditto. - (__pthread_rwlock_tryrdlock): Ditto. - (__pthread_rwlock_wrlock): Ditto. - (__pthread_rwlock_trywrlock): Ditto. - (__pthread_rwlock_unlock): Ditto. - (__pthread_rwlockattr_init): Ditto. - (__pthread_rwlockattr_getpshared): Ditto. - (__pthread_rwlockattr_setpshared): Ditto. - (__pthread_rwlockattr_destroy): Ditto. - (__pthread_getconcurrency): Ditto. - (__pthread_setconcurrency): Ditto. - (__pthread_getschedparam): Ditto. - (__pthread_setschedparam): Ditto. - - * thread.cc: Rename __pthread_equal to pthread_equal throughout. - Change pthread_self parameter appropriate. - (__pthread_attr_init): Remove __ prefix. Change to extern "C". - (__pthread_attr_destroy): Ditto. - (__pthread_attr_setdetachstate): Ditto. - (__pthread_attr_getdetachstate): Ditto. - (__pthread_attr_setstacksize): Ditto. - (__pthread_attr_getstacksize): Ditto. - (__pthread_attr_setinheritsched): Ditto. - (__pthread_attr_getinheritsched): Ditto. - (__pthread_attr_setschedparam): Ditto. - (__pthread_attr_getschedparam): Ditto. - (__pthread_attr_setschedpolicy): Ditto. - (__pthread_attr_getschedpolicy): Ditto. - (__pthread_attr_setscope): Ditto. - (__pthread_attr_getscope): Ditto. - (__pthread_attr_setstackaddr): Ditto. - (__pthread_attr_getstackaddr): Ditto. - (__pthread_key_create): Ditto. - (__pthread_key_delete): Ditto. - (__pthread_setspecific): Ditto. - (__pthread_getspecific): Ditto. - (__pthread_kill): Ditto. - (__pthread_sigmask): Ditto. - (__pthread_equal): Ditto. - (__pthread_mutex_lock): Ditto. - (__pthread_mutex_trylock): Ditto. - (__pthread_mutex_unlock): Ditto. - (__pthread_mutex_destroy): Ditto. - (__pthread_mutex_setprioceiling): Ditto. - (__pthread_mutex_getprioceiling): Ditto. - (__pthread_mutexattr_destroy): Ditto. - (__pthread_mutexattr_getprioceiling): Ditto. - (__pthread_mutexattr_getprotocol): Ditto. - (__pthread_mutexattr_getpshared): Ditto. - (__pthread_mutexattr_gettype): Ditto. - (__pthread_mutexattr_init): Ditto. - (__pthread_mutexattr_setprioceiling): Ditto. - (__pthread_mutexattr_setprotocol): Ditto. - (__pthread_mutexattr_setpshared): Ditto. - (__pthread_mutexattr_settype): Ditto. - (__pthread_cond_destroy): Ditto. - (__pthread_cond_signal): Ditto. - (__pthread_cond_broadcast): Ditto. - (__pthread_condattr_init): Ditto. - (__pthread_condattr_destroy): Ditto. - (__pthread_condattr_getpshared): Ditto. - (__pthread_condattr_setpshared): Ditto. - (__pthread_rwlock_destroy): Ditto. - (__pthread_rwlock_rdlock): Ditto. - (__pthread_rwlock_tryrdlock): Ditto. - (__pthread_rwlock_wrlock): Ditto. - (__pthread_rwlock_trywrlock): Ditto. - (__pthread_rwlock_unlock): Ditto. - (__pthread_rwlockattr_init): Ditto. - (__pthread_rwlockattr_getpshared): Ditto. - (__pthread_rwlockattr_setpshared): Ditto. - (__pthread_rwlockattr_destroy): Ditto. - (__pthread_getconcurrency): Ditto. - (__pthread_setconcurrency): Ditto. - (__pthread_getschedparam): Ditto. - (__pthread_setschedparam): Ditto. - -2003-03-18 Thomas Pfaff - - * cygwin.din: Add pthread_rwlock_destroy, pthread_rwlock_init, - pthread_rwlock_rdlock, pthread_rwlock_tryrdlock, - pthread_rwlock_wrlock, pthread_rwlock_trywrlock, - pthread_rwlock_unlock, pthread_rwlockattr_init, - pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared, - and pthread_rwlockattr_destroy. - * include/cygwin/version.h: Bump API minor number. - * include/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Define a - reasonable value. - Add prototypes for pthread_rwlock_destroy, pthread_rwlock_init, - pthread_rwlock_rdlock, pthread_rwlock_tryrdlock, - pthread_rwlock_wrlock, pthread_rwlock_trywrlock, - pthread_rwlock_unlock, pthread_rwlockattr_init, - pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared, - and pthread_rwlockattr_destroy. - * thread.h (PTHREAD_ONCE_MAGIC): Remove superflous semicolon. - (PTHREAD_RWLOCK_MAGIC): New define. - (PTHREAD_RWLOCKATTR_MAGIC): Ditto. - (pthread_rwlockattr): New class. - (pthread_rwlock): Ditto. - (MTinterface::rwlocks): New member. - (MTinterface::MTinterface): Initialize rwlocks. - Add prototypes for __pthread_rwlock_destroy, - __pthread_rwlock_wrlock, __pthread_rwlock_trywrlock, - __pthread_rwlock_unlock, __pthread_rwlockattr_init, - __pthread_rwlockattr_getpshared, __pthread_rwlockattr_setpshared, - and __pthread_rwlockattr_destroy. - * thread.cc (MTinterface::Init): Initialize rwlock internal mutex. - (MTinterface::fixup_after_fork): Fixup rwlocks after fork. - (pthread_rwlockattr::isGoodObject): Implement. - (pthread_rwlockattr::pthread_rwlockattr): Ditto. - (pthread_rwlockattr::~pthread_rwlockattr): Ditto. - (pthread_rwlock::initMutex): Ditto. - (pthread_rwlock::pthread_rwlock): Ditto. - (pthread_rwlock::~pthread_rwlock): Ditto. - (pthread_rwlock::RdLock): Ditto. - (pthread_rwlock::TryRdLock): Ditto. - (pthread_rwlock::WrLock): Ditto. - (pthread_rwlock::TryWrLock): Ditto. - (pthread_rwlock::UnLock): Ditto. - (pthread_rwlock::addReader): Ditto. - (pthread_rwlock::removeReader): Ditto. - (pthread_rwlock::lookupReader): Ditto. - (pthread_rwlock::RdLockCleanup): Ditto. - (pthread_rwlock::WrLockCleanup): Ditto. - (pthread_rwlock::fixup_after_fork): Ditto. - (pthread_rwlock::isGoodObject): Ditto. - (pthread_rwlock::isGoodInitializer): Ditto. - (pthread_rwlock::isGoodInitializerOrObject): Ditto. - (pthread_rwlock::isGoodInitializerOrBadObject): Ditto. - (__pthread_rwlock_destroy): Ditto. - (pthread_rwlock::init): Ditto. - (__pthread_rwlock_rdlock): Ditto. - (__pthread_rwlock_tryrdlock): Ditto. - (__pthread_rwlock_wrlock): Ditto. - (__pthread_rwlock_trywrlock): Ditto. - -2003-03-18 Thomas Pfaff - - * thread.h (pthread_cond::ExitingWait): Remove. - (pthread_cond::mutex): Ditto. - (pthread_cond::cond_access): Ditto. - (pthread_cond::win32_obj_id): Ditto. - (pthread_cond::TimedWait): Ditto. - (pthread_cond::BroadCast): Ditto. - (pthread_cond::Signal): Ditto. - (pthread_cond::waiting): Change type to unsigned long. - (pthread_cond::pending): New member. - (pthread_cond::semWait): Ditto. - (pthread_cond::mtxIn): Ditto. - (pthread_cond::mtxOut): Ditto. - (pthread_cond::mtxCond): Ditto. - (pthread_cond::UnBlock): New method. - (pthread_cond::Wait): Ditto. - * thread.cc: Update list of cancellation points. - (pthread_cond::pthread_cond): Rewrite. - (pthread_cond::~pthread_cond): Ditto. - (pthread_cond::TimedWait): Remove. - (pthread_cond::BroadCast): Ditto. - (pthread_cond::Signal): Ditto. - (pthread_cond::UnBlock): Implement. - (pthread_cond::Wait): Ditto. - (pthread_cond::fixup_after_fork): Rewrite. - (pthread_mutex::fixup_after_fork): Remove DETECT_BAD_APP - conditional. - (__pthread_cond_broadcast): Just return 0 if the condition is - not initialized. Call pthread_cond::UnBlock to release blocked - threads. - (__pthread_cond_signal): Ditto. - (__pthread_cond__dowait): Rewrite. - (pthread_cond_timedwait): Add pthread_testcancel call. Fix - waitlength calculation. - (pthread_cond_wait): Add pthread_testcancel call. - -2003-03-18 Thomas Pfaff - - * include/pthread.h (PTHREAD_MUTEX_NORMAL): New define. - * thread.cc: Remove errno.h include. - (pthread::precreate): Change internal mutex type to normal. - (pthread_mutex::canBeUnlocked): Implement. - (pthread_mutex::pthread_mutex): Initialize lock_counter with 0. - (pthread_mutex::Lock): Rename to _Lock. Add self parameter. - Change lock_counter logic. Update SetOwner call. - (pthread_mutex::TryLock): Rename to _TryLock. Add self parameter. - Change lock_counter logic. Update SetOwner call. - (pthread_mutex::UnLock): Rename to _UnLock. Add self parameter. - Change lock_counter logic. - (pthread_mutex::Destroy): Rename to _Destroy. Update TryLock call. - (pthread_mutex::SetOwner): Move to thread.h as inline. - (pthread_mutex::LockRecursive): Ditto. - (pthread_mutex::fixup_after_fork): Change lock_counter logic. - (__pthread_mutexattr_settype): Add PTHREAD_MUTEX_NORMAL to valid - types check. - * thread.h: Include errno.h and limits.h. - (MUTEX_LOCK_COUNTER_INITIAL): Remove. - (MUTEX_OWNER_ANONYMOUS): New define. - (pthread_mutex::canBeUnlocked): New static method. - (pthread_mutex::lock_counter): Change type to unsigned long. - (pthread_mutex::GetPthreadSelf): New method. - (pthread_mutex::Lock): Call _Lock with pthread_self pointer. - (pthread_mutex::TryLock): Call _TryLock with pthread_self pointer. - (pthread_mutex::UnLock): Call _UnLock with pthread_self pointer. - (pthread_mutex::Destroy): Call _Destroy with pthread_self pointer. - (pthread_mutex::SetOwner): Moved from thread.cc as inline. - (pthread_mutex::LockRecursive): Ditto. - (pthread_mutex::_Lock): New method. - (pthread_mutex::_TryLock): New method. - (pthread_mutex::_UnLock): New method. - (pthread_mutex::_Destroy): New method. - -2003-03-18 Christopher January - - * fhandler_proc.cc (format_proc_cpuinfo): Use IsProcessorFeaturePresent - only on Windows NT. Read CPU Mhz value only on NT. Revert previous - change so cpuid instruction is called even on non-NT systems. - -2003-03-17 Corinna Vinschen - - * glob.c (g_lstat): Change API minor test to match API minor number - change in previous patch. - (g_stat): Ditto. - -2003-03-17 Christopher Faylor - - * include/cygwin/version.h: Reorganize last two api versions so that - btowc and trunc exports show up before previous bump since there has - been no exported version of the DLL with the 64 bit changes yet but - 1.3.22 will have the btowc and trunc. - -2003-03-17 Christopher Faylor - - * cygwin.din: Export btowc, trunc. - * include/cygwin/version.h: Reflect new exports. - * syscalls.cc (_stat): Rename to stat to avoid newlib wrapper. - * syscalls.cc (_fstat): Ditto. - -2003-03-16 Christopher Faylor - - * fhandler_console.cc (fhandler_console::close): Correct check for - current tty. Add debugging output when console is freed. - (set_console_state_for_spawn): Add debugging output. - * fhandler_tty.cc (fhandler_tty_slave::open): Don't decrement console - open flag when vforking. - * sigproc.cc (sigproc_terminate): Fix debugging output. - * spawn.cc (handle): Eliminate second argument. - (spawn_guts): Reflect elimination of argument change to handle. - * syscalls.cc (setsid): Add debugging output when console is freed. - -2003-03-14 Christopher Faylor - - * syscalls.cc (rename): Revert assumption that DELETE_ON_CLOSE works on - Win9x. - -2003-03-13 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 23. - -2003-03-13 Corinna Vinschen - - * autoload.cc (IsProcessorFeaturePresent): Add. - * fhandler_proc.cc (format_proc_cpuinfo): Add case for 9x systems. - -2003-03-13 Corinna Vinschen - - * fhandler_proc.cc (format_proc_cpuinfo): Fix vendor id in cpuid case. - -2003-03-13 Corinna Vinschen - - * net.cc (cygwin_rcmd): Use correct file descriptor in call to fdsock. - (cygwin_rexec): Ditto. - -2003-03-13 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::close): Fix typo in debug - output. - - * syscalls.cc (rename): Assume that DELETE_ON_CLOSE works on Win9x. - -2003-03-11 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::dup): Don't call - fhandler_base::dup() but call DuplicateHandle directly instead to have - control over socket inheritence. - -2003-03-11 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::dup): On NT systems avoid - using WinSock2 socket duplication methods. Add comment. - -2003-03-11 Pierre Humblet - - * fhandler_socket.cc (fhandler_socket::fixup_after_fork): - Set io_handle to INVALID_SOCKET in case of failure. - (fhandler_socket::dup): Return 0 if the io_handle is valid. - -2003-03-10 Corinna Vinschen - - * sec_acl.cc (setacl): Don't handle DELETE flag specially. - * security.cc (alloc_sd): Ditto. - -2003-03-09 Corinna Vinschen - - * winver.rc: Change Copyright hint to include 2003. - -2003-03-09 Corinna Vinschen - - Switch to 32/64 datatypes: - * Makefile.in (OBSOLETE_FUNCTIONS): Add open acl aclcheck aclfrommode - aclfrompbits aclfromtext aclsort acltomode acltopbits acltotext chown - facl fchown fgetpos fopen freopen fseeko fsetpos fstat ftello - ftruncate getegid geteuid getgid getgrent getgrgid getgrnam getgroups - getpwuid getpwuid_r getuid initgroups lchown lseek lstat mknod mmap - seekdir setegid seteuid setgid setgroups setregid setreuid setuid stat - telldir truncate. - (NEW_FUNCTIONS): Add _open64 acl32 aclcheck32 aclfrommode32 - aclfrompbits32 aclfromtext32 aclsort32 acltomode32 acltopbits32 - acltotext32 chown32 facl32 fchown32 fgetpos64 fopen64 freopen64 - fseeko64 fsetpos64 fstat64 ftello64 ftruncate64 getegid32 geteuid32 - getgid32 getgrent32 getgrgid32 getgrnam32 getgroups32 getpwuid32 - getpwuid_r32 getuid32 initgroups32 lchown32 lseek64 lstat64 mknod32 - mmap64 seekdir64 setegid32 seteuid32 setgid32 setgroups32 setregid32 - setreuid32 setuid32 stat64 telldir64 truncate64 to substitute the - above. - * cygserver_shm.h (class client_request_shm): Change uid_t and gid_t - members to __uid32_t and __gid32_t. - * cygwin.din: Add symbols acl32 aclcheck32 aclfrommode32 - aclfrompbits32 aclfromtext32 aclsort32 acltomode32 acltopbits32 - acltotext32 facl32 fgetpos64 fopen64 freopen64 fseeko64 fsetpos64 - _fstat64 ftello64 _lseek64 mknod32 _open64. - * glob.c: Include perprocess.h. - (globtilde): Call getpwuid32 and getuid32 instead of getpwuid and - getuid. - (g_lstat): Check for applications API version to call the appropriate - typed gl_lstat function. - (g_stat): Ditto for gl_stat. - * shm.cc (client_request_shm::client_request_shm): Call geteuid32 - and getegid32 instead of geteuid and getegid throughout. - * syscalls.cc (_open64): New alias for open. - (_lseek64): New alias for lseek64. - (_fstat64): New alias for fseek64. - (mknod32): New function. - (mknod): Calls mknod32 now. - * winsup.h: Make function declarations for getuid32, geteuid32, - and getpwuid32 accessible for plain C sources. Add declarations - for getegid32 and getpwnam. - * include/cygwin/version.h: Bum API minor number to 78. - * include/sys/cygwin.h: Guard C++ specific members of struct - per_process against inclusion in plain C sources. - * include/sys/mman.h (mman): Add guard to avoid type clash when - compiling Cygwin. - -2003-03-09 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 22. - -2003-03-09 Christopher Faylor - - Do some minor reformatting of 'extern "C"' use throughout. - -2003-03-06 Christopher January - - * autoload.cc (GetSystemTimes): Define new autoload function. - * fhandler_proc.cc (proc_listing): Add cpuinfo and partitions entries. - (fhandler_proc::fill_filebuf): Add PROC_CPUINFO and PROC_PARTITIONS - cases. - (format_proc_uptime): Use GetSystemTimes if available. - (read_value): New macro. - (print): New macro. - (cpuid): New function. - (can_set_flag): New function. - (format_proc_cpuinfo): New function. - (format_proc_partitions): New function. - -2003-03-09 Christopher Faylor - - * syscalls.cc (unlink): Attempt to be more clever about setting - attributes of file. Only open file in query mode to avoid having to - mess with security stuff for reading. - -2003-03-09 Corinna Vinschen - - * rmsym: Fix regular expression. - -2003-03-09 Christopher Faylor - - * Makefile.in: Change from using new-* to cygwin0 for temporary - targets. - -2003-03-09 Corinna Vinschen - - * include/cygwin/socket.h: Set SOMAXCONN to Winsock2 value. - -2003-03-08 Christopher Faylor - - * syscalls.cc (unlink): Always attempt to use FILE_FLAG_CLOSE_ON_DELETE - to delete files since this allows us to preserve the protection of hard - linked files. - (link): Generate full path for potentially recalculated .lnk target. - -2003-03-08 Christopher Faylor - - Revert below changes regarding _pinfo::cmdline. - -2003-03-08 Corinna Vinschen - - * external.cc (cygwin_internal): Change n to __off64_t to match change - of _pinfo::cmdline. - * fhandler.h (class fhandler_virtual): Change filesize member to - __off64_t. - * fhandler_proc.cc (format_proc_meminfo): Change to return __off64_t. - (format_proc_stat): Ditto. - (format_proc_uptime): Ditto. - * fhandler_process.cc (format_process_stat): Ditto. - (format_process_status): Ditto. - (format_process_statm): Ditto. - * pinfo.cc (_pinfo::cmdline): Expect __off64_t parameter. - * pinfo.h (class _pinfo): Change declaration of cmdline accordingly. - -2003-03-07 Christopher Faylor - - * path.h (PATH_LNK): New enum val. - (path_conv::is_lnk_symlink): New function. True if path represents - .lnk style symlink. - * path.cc (check_shortcut): Set PATH_LNK in pflags when appropriate. - (symlink_info::check): Ditto. Remove PATH_LNK from pflags initially. - * syscalls.cc (unlink): Always remove readonly attribute from a symlink - regardless of type. - (link): (from Corinna Vinschen) Allow links to symlinks. Reset - attributes on a symlink after successful link creation. - (chmod): Use is_lnk_symlink where appropriate. - (rename): Ditto. - -2003-03-07 Pierre Humblet - - * tty.cc (create_tty_master): Call GetComputerName instead of - cygwin_gethostname. Set ut_id. - * syscalls.cc (login): Call endutent. - (setutent): Do not seek after a fresh open. - -2003-03-07 Corinna Vinschen - - * syscalls.cc (seteuid32): Fix formatting. - -2003-03-04 Thomas Pfaff - - * thread.cc (MTinterface::fixup_after_fork): Initialize mainthread - prior to pthread objects. - -2003-03-04 Jason Tishler - - * fhandler_socket.cc (fhandler_socket::dup): Initialize type. - -2003-03-03 Christopher Faylor - - * fhandler.h (fhandler_tty_slave::close): Declare new function. - (fhandler_tty_slave::dup): Declare new function. - (fhandler_tty_slave::fixup_after_function): Declare new function. - * fhandler_tty.cc (fhandler_tty_slave_open): Only increment - fhandler_console::open_fhs when associated with a pty. - (fhandler_tty_slave::close): Define new function. Decrement - fhandler_console::open_fhs when associated with a pty. - (fhandler_tty_slave::dup): Define new function. Increment - fhandler_console::open_fhs when associated with a pty. - (fhandler_tty_slave::fixup_after_fork): Define new function. Increment - fhandler_console::open_fhs when associated with a pty. - -2003-03-03 Christopher Faylor - - * fhandler_tty.cc (fhandler_pty_slave::open): Grudgingly increment - fhandler_console::open_fhs here. - (fhandler_pty_slave::close): Ditto for close. - -2003-03-02 Christopher Faylor - - * lib/getopt.c: Refresh from NetBSD sources. - -2003-03-02 Christopher Faylor - - * fhandler_console.cc (fhandler_console::close): Don't decrement - in use counter if in vfork fixup stage. - -2003-03-02 Christopher Faylor - - * lib/getopt.c: Nuke use of unneeded BSDisms. - -2003-03-02 Christopher Faylor - - * dll_init.cc (dll_list::load_after_fork): Don't revert to LoadLibrary - if LoadLibraryEx fails. - * dtable.cc (dtable::dec_console_fds): Eliminate. - (dtable::release): Don't treat console specially. - (dtable::build_fhandler): Ditto. - * dtable.h (console_fds): Eliminate. - (dtable::dec_console_fds): Eliminate. - (dtable::inc_console_fds): Eliminate. - * fhandler.h (fhandler_console::open_fhs): New static element. - * fhandler_console.cc (fhandler_console::open): Increment open_fs. - (fhandler_console::close): Call FreeConsole if no more open consoles - and ctty is not associated with the console. - * syscalls.cc (setsid): Simplify check for when to call FreeConsole. - (check_pty_fds): Eliminate definition. - * winsup.h (check_pty_fds): Eliminate declaration. - -2003-03-02 Christopher Faylor - - * dll_init.cc (dll_list::load_after_fork): Fix typo where result of - LoadLibrary was ignored. - -2003-03-01 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::bind): Open and write socket - file using Win32 calls. - -2003-03-01 Corinna Vinschen - - * fhandler_socket.cc (get_inet_addr): Open and read socket file using - Win32 calls. - -2003-02-28 Christopher Faylor - - * cygwin.din: Wrap atexit and exit with cygwin, thread-safe functions. - * dcrt0.cc (cygwin_atexit): New function. - (cygwin_exit): Ditto. - -2003-02-28 Pierre Humblet - - * syscalls.cc (fstat64): Pass get_name () to pc. - (access): Pass fn to stat_worker. - -2003-03-27 Corinna Vinschen - - * fhandler_socket.cc (class sock_event): New class managing Winsock - events for interruptible socket calls. - (fhandler_socket::connect): Move support for interruptible call to - class sock_event. Use class object instead. - (fhandler_socket::accept): Ditto. Remove useless casts. - -2003-03-27 Thomas Pfaff - - * fhandler_socket.cc (fhandler_socket::connect): Add support for - an interruptable connect. - -2003-02-27 Pierre Humblet - - * uinfo.cc (internal_getlogin): Only update user.groups.pgsid - if the call to set the primary group succeeds. - -2003-02-27 Christopher Faylor - - * cygthread::detach: Improve error message. - -2003-02-26 Pierre Humblet - - * sec_helper.cc (get_sids_info): debug_print owner_sid and group_sid. - -2003-02-25 Corinna Vinschen - - * mmap.cc (mmap64): Fix returned address by taking the granularity - into account. - -2003-02-23 Pierre Humblet - - * syslog.cc (syslog): Do not unlock the file before closing it - and remove debug_printf about stream errors. - -2003-02-22 Christopher Faylor - - * cygmalloc.h: Remove MORECORE_CANNOT_TRIM. It's not true. - # cygwin.din: Export mallinfo. - # malloc_wrapper.cc (mallinfo): New function. - -2003-02-22 Pierre Humblet - - * syslog.cc (syslog): Do not print the Windows pid. Print the Cygwin - pid as an unsigned decimal. On Win95 print a timestamp and attempt to - lock the file up to four times in 3 ms. - -2003-02-21 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::fhandler_socket): Fix compiler - warning. - (fhandler_socket::fstat): Simplify. Set st_uid/st_gid to effective - uid/gid of current process in case of open sockets. - -2003-02-21 Corinna Vinschen - - * dtable.cc (dtable::build_fhandler_from_name): Set some fhandler - data on sockets to evaluate AF_LOCAL sockets correctly. - (dtable::build_fhandler): Set unit number on sockets. - * fhandler.h (fhandler_socket): Add unit number. - (fhandler_socket::get_unit): New method. - * fhandler_socket.cc (fhandler_socket::fhandler_socket): Set unit - number. - (fhandler_socket::fstat): Reorganize to return more Linux-like - values. - * net.cc: include ctype.h. - (fdsock): Set unit number when building fhandler. - * path.cc (path_conv::check): Set device type to FH_SOCKET if file - is a AF_UNIX socket. - (get_devn): Evaluate unit for virtual socket devices. - (win32_device_name): Set windows path for sockets to unix_path with - just backslashes to keep the different names. - * syscalls.cc (fstat64): Don't override st_ino, st_dev and st_rdev - for sockets. - (stat_worker): Ditto. - -2003-02-21 Pierre Humblet - - * autoload.cc (AccessCheck): Add. - (DuplicateToken): Add. - * security.h (check_file_access): Declare. - * syscalls.cc (access): Convert path to Windows, check existence - and readonly attribute. Call check_file_access instead of acl_access. - * security.cc (check_file_access): Create. - * sec_acl (acl_access): Delete. - -2003-02-19 Christopher Faylor - - * fhandler.cc (fhandler_base::open): Move some filesystem specific - stuff. - (fhandler_disk_file::open): Accept some filesystem specific stuff. - * sigproc.cc (wait_for_sigthread): Become slightly more thread safe. - (sig_send): Don't assume that signal thread is ready. - -2003-02-20 Corinna Vinschen - - * wincap.h (wincap): Remove unnecessary definition of - supports_sparse_files. - * wincap.cc: Ditto. - -2003-02-20 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Check descriptor - created by cygheap_fdnew constructor. - * fhandler_virtual.cc (fhandler_virtual::opendir): Ditto. - * fhandler_socket.cc (fhandler_socket::accept): Ditto and move - creation of file descriptor behind blocking OS call. - * net.cc (cygwin_socket): Ditto. - (cygwin_rcmd): Ditto. - (cygwin_rresvport): Ditto. - (cygwin_rexec): Ditto. - (socketpair): Ditto. - -2003-02-20 Corinna Vinschen - - * autoload.cc (GetCompressedFileSize): Add. - * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Compute - st_blocks value from GetCompressedFileSize() if available. - -2003-02-18 Vaclav Haisman - - * wincap.h (wincaps::supports_sparse_files): New flag. - (wincapc::supports_sparse_files): New method. - * wincap.cc (wincap_unknown): Define value for the new flag. - (wincap_95): Ditto. - (wincap_95osr2): Ditto. - (wincap_98): Ditto. - (wincap_98se): Ditto. - (wincap_me): Ditto. - (wincap_nt3): Ditto. - (wincap_nt4): Ditto. - (wincap_nt4sp4): Ditto. - (wincap_2000): Ditto. - (wincap_xp): Ditto. - * path.h (path_conv::fs_flags): New method. - * fhandler_disk_file.cc: Include winioctl.h for DeviceIoControl. - (fhandler_disk_file::open): Set newly created and truncated files as - sparse on platforms that support it. - -2003-02-17 Pierre Humblet - - * grp.cc (internal_getgroups): Handle properly tokens with - no groups. Fix bug introduced on 2003-02-04. - -2003-02-16 Christopher Faylor - - * cygwin.din: Export all appropriate newlib libm functions. Sort. - * include/cygwin/version.h: Bump API minor number. - -2003-02-15 Christopher Faylor - - * cygwin.din: Export all appropriate newlib libc functions. - * include/cygwin/version.h: Bump API minor number. - -2003-02-14 Jason Tishler - - * mmap.cc (mprotect): Add missing break. - -2003-02-13 Christopher Faylor - - * exceptions.cc (try_to_debug): Don't reset priority when returning - from non-waitloop call. - -2003-02-13 Vaclav Haisman - Christopher Faylor - - * fhandler_console.cc (fhandler_console::write_normal): Use MessageBeep - for bell sound. - * autoload.cc (MessageBeep): Add. - -2003-02-13 Christopher Faylor - - * include/cygwin/types.h: Use correct ifdef guard for u_ definitions. - -2003-02-13 Christopher Faylor - - * environ.cc (environ_init): Use strechr. - -2003-02-13 Christopher Faylor - - * include/cygwin/in.h (sockaddr_in): Fix typo. - -2003-02-12 Christopher Faylor - - * path.h (path_conv): Reorganize slightly. - -2003-02-12 Christopher Faylor - - * fhandler_tty.cc (process_input): Add sanity check to ensure that - console typeahead is cleared on signal. - -2003-02-12 Christopher Faylor - - * spawn.cc (linebuf::~linebuf): Resurrect commented out (for - debugging?) code. - -2003-02-10 Ralf Habacker - - * include/cygwin/in.h (in_attr_t): Define new type. - * include/arpa/inet.h (inet_addr): Change return type to in_addr_t. - (inet_lnaof): Ditto. - (inet_netof): Ditto. - (inet_network): Ditto. - -2003-02-10 Christopher Faylor - - * include/cygwin/types.h: Move many *_t typedefs here. Protect them - with ifdefs. - * fhandler_disk_file.cc (fhandler_disk_file::fstat): Change ntsec_atts to mode_t. - * security.cc (get_attribute_from_acl): Accept mode_t attribute. - (get_nt_attribute): Ditto. - (get_file_attribute): Ditto. - (get_nt_object_attribute): Ditto. - (get_object_attribute): Ditto. - * security.h: Reflect above changes. - * syscalls.cc (chown_worker): Change attrib to mode_t. - -2003-02-08 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 21. - -2003-02-07 Christopher Faylor - - * malloc.cc (DEFAULT_MMAP_THRESHOLD): Bump down to 16MB thanks to below - changes. - -2003-02-07 Corinna Vinschen - - * mmap.cc (mmap_record::alloc_map): De-inline. Add offset and length - parameter. Only protect pages actually unused currently. Do job - of map_map() when initializing a map. - (mmap_record::map_map): Reduce functionality for the reuse case - of private anonymous mapping. - (mmap_record::fixup_map): Format change. - (list::add_record): Add offset and length parameter to call - mmap_record::alloc_map() correctly. - (mmap64): Rename `l' variable to `map_list'. Accommodate above changes. - (munmap): Rename `l' variable to `map_list'. - (msync): Ditto. - (fhandler_disk_file::mmap): Streamline code. - (mprotect): Ditto. - (fixup_mmaps_after_fork): Rename `l' variable to `map_list'. - -2003-02-07 Vaclav Haisman - Christopher Faylor - - * exceptions.cc (try_to_debug): Set priority of current thread rather - than the main thread. Make busy waiting loop less busy. Restore - priority when function returns. - -2003-02-07 Christopher Faylor - - * malloc.cc (DEFAULT_MMAP_THRESHOLD): Set high to avoid mmaps. - -2003-02-07 Christopher Faylor - - * pipe.cc (fhandler_pipe::close): Avoid extraneous this->. - -2003-02-06 Christopher Faylor - - * heap.cc (heap_init): Remove debugging code. - -2003-02-06 Pierre Humblet - - * security.h: Introduce names UNKNOWN_UID and UNKNOWN_GID and delete - declaration of is_grp_member. - * uinfo.cc (internal_getlogin): Use UNKNOWN_GID. - * passwd.cc (pwdgrp::read_passwd): Use UNKNOWN_UID. - * grp.cc (pwdgrp::read_group): Change group name to provide better - feedback. - (getgrgid): Use gid16togid32. - * sec_helper.cc (is_grp_member): Delete. - -2003-02-05 Christopher Faylor - - * path.cc: Change 'to_posix_p' to 'to_posix' throughout. - (conv_path_list_buf_size): Accommodate relative paths. - -2003-02-05 Christopher Faylor - - * path.cc (etc::dir_changed): Fix debug printf. - -2003-02-05 Corinna Vinschen - - * sec_acl.cc (setacl): Move all permission settings to beginning of - loop. Set default rights to same values as in alloc_sd(). Set DELETE - for owner and default owner only if S_IWOTH is given. - -2003-02-05 Pierre Humblet - - * sec_acl.cc: Change all __aclent16_t to __aclent32_t except in - wrapper function definitions. Replace call to the aclXYZ functions by - calls aclXYZ32. - (searchace): Change type of third argument to __uid32_t and use - ILLEGAL_UID instead of -1; - (setacl): Remove some initializations. Only give STANDARD_RIGHTS_WRITE - for S_IWOTH. Replace -1 by ILLEGAL_UID. - (getacl): Change type of owner_sid, group_sid and ace_sid to cygpsid. - In last else clause, suppress second call to ace_sid.get_id and use - TRUE in first call. Replace EqualSid by ==. - (acl_access): Call internal_getgroups in USER and GROUP cases. - (acecmp: Define static. - (acl32): Create from 16 bit type. - (facl32): Ditto. - (lacl32): Ditto. - (aclcheck32): Ditto. - (aclsort32): Ditto. - (acltomode32): Ditto. - (aclfrommode32): Ditto. - (acltopbits32): Ditto. - (aclfrompbits32): Ditto. - (acltotext32): Ditto. - (aclfromtext32): Ditto, and use strechr. - (acl16to32): Create. - (acl): Make it a wrapper function. - (facl): Ditto. - (lacl): Ditto. - (aclcheck): Ditto. - (aclsort): Ditto. - (acltomode): Ditto. - (aclfrommode): Ditto. - (acltopbits): Ditto. - (aclfrompbits): Ditto. - (acltotext): Ditto. - (aclfromtext): Ditto. - * security.cc (write_sd): Call set_process_privilege and check - ownership. - (alloc_sd): Remove call to set_process_privilege and the owner check. - -2003-02-05 Christopher Faylor - - * include/sys/cygwin.h: Use C-style comments. - -2003-02-05 Pierre Humblet - - * sec_helper.cc (get_sids_info): New function. - * security.cc (extract_nt_dom_user): Simplify with strechr. - (get_user_groups): Initialize glen to MAX_SID_LEN. - (get_user_local_groups): Ditto. - (get_attribute_from_acl): Define ace_sid as cygpsid. - (get_nt_attribute): Define owner_sid and group_sid as cygpsid. - Call get_sids_info instead of cygsid.get_{u,g}id and is_grp_member. - (get_nt_object_attribute): Ditto. - (alloc_sd): Define ace_sid as cygpsid. - -2003-02-04 Thomas Pfaff - - * syscalls.cc (struct system_cleanup_args): New struct. - (system_cleanup): New function. - (system): Use pthread_cleanup_push and _pop to save and restore - signal handlers and sigprocmask. - -2003-02-04 Corinna Vinschen - - * path.cc (symlink): Create security attributes so that only the - user can modify the symlink. - * security.cc (set_security_attribute): Remove symlink special - handling. - -2003-02-04 Pierre Humblet - - * grp.cc (internal_getgroups): Do not return without closing - the process handle. - -2003-02-04 Pierre Humblet - - * security.h (class cygpsid): New class. - (class cygsid): Use cygpsid as base. Remove members psid, get_id, - get_uid, get_gid, string, debug_printf and the == and != operators. - (cygsidlist::clear_supp): Only do work if setgroups has been called. - * sec_helper.cc: Define sid_auth NO_COPY. - (cygpsid::operator==): New operator. - (cygpsid::get_id): New function. - (cygpsid::string): New function. - (cygsid::string): Delete. - (cygsid::get_id): Delete. - * pwdgrp.h: Change arguments of internal_getpwsid, - internal_getgrsid and internal_getgroups to cygpsid. - * passwd.cc (internal_getpwsid): Change argument from cygsid to cygpsid. - * grp.cc (internal_getgrsid): Ditto. - (internal_getgroups): Ditto. - -2003-02-03 Christopher Faylor - - Eliminate most unneeded this-> pointers throughout. - -2003-02-03 Pierre Humblet - - * security.h: Add third argument to set_process_privilege. - * autoload.cc: Add OpenThreadToken. - * sec_helper.cc (set_process_privilege): Add and use use_thread - argument. - * security.cc (alloc_sd): Modify call to set_process_privilege. - Remember the result in each process. If failed and file owner is not - the user, fail. - -2003-02-03 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::recvfrom): Return buffer - length and don't set errno in case of WSAEMSGSIZE error. - (fhandler_socket::recvmsg): Ditto. - -2003-02-01 Christopher Faylor - - * grp.cc (getgrent32): Only refresh group entries when at beginning. - (internal_getgrsid): Only refresh if uninitialized. - (internal_getgrent): Ditto. - * passwd.cc (getpwent): Only refresh passwd entries when at beginning. - (pwdgrp::read_passwd): linebuf *cannot* be NO_COPY. - (internal_getpwsid): Only refresh if uninitialized. - (getpass): No need to refresh passwd data here. - * pwdgrp.h (refresh): Eliminate default. - -2003-01-31 Christopher Faylor - - * dlfcn.cc (dlerror): Only report load errors once per error. - -2003-01-31 Christopher Faylor - - * fhandler_serial.cc (fhandler_serial::open): Avoid extraneous setting - of res. - - * termios.cc (tcsetattr): Correctly record errno after tcsetattr call. - -2003-01-31 Troy Curtiss - - * fhandler_serial.cc (fhandler_serial::tcsetattr): Add error-checking - so that if any Win32 SetComm*() calls fail, errno gets set to EINVAL - and tcsetattr() returns -1. Catch invalid bitrates, mostly. If baud - rate setting is B0, just drop DTR and leave Win32 DCB bitrate as-is - since 0 is not a valid Win32 setting. - (fhandler_serial::tcgetattr): If DTR is low, populate the bitrate as - B0, otherwise get it from the DCB. - -2003-01-31 Christopher Faylor - - * passwd.cc (pwdgrp::read_passwd): linebuf *must* be static (from - Pierre Humblet). - * pwdgrp.h (pwdgrp::refresh): Avoid calling read function if we already - have lock since that means we are in the process of reading the file. - -2003-01-31 Jason Tishler - - * shared.cc (shared_info::heap_chunk_size): Use correct variable when - reading HKLM. - -2003-01-30 Christopher Faylor - - * fhandler_registry.cc (fhandler_registry::exists): Fix off-by-one - error when inspecting path. - -2003-01-29 Christopher Faylor - - * lib/getopt.c: Allow environment variable control of POSIXLY_INCORRECT - behavior. - -2003-01-28 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::accept): On successful execution - set connection state of returned socket to CONNECTED. - -2003-01-27 Christopher Faylor - - * passwd.cc (pwdgrp::parse_passwd): Be more unforgiving about - non-numeric fields. - -2003-01-26 Christopher Faylor - - * uinfo.cc (pwdgrp::next_num): Remove check for NULL since it is no - longer a valid return from next_str. - (pwdgrp::add_line): Duh. Revert to use strchr. - -2003-01-26 Christopher Faylor - - * string.h (strechr): New function. - * uinfo.cc (pwdgrp::next_str): Search only for input char in string. - Return EOS on failure. Don't check for NULL since it shouldn't be - possible. - (pwdgrp::add_line): Revert to replacing '\n' in input line with '\0'. - (pwdgrp::next_num): Pass explicit separator character to next_str. - * grp.cc (pwdgrp::parse_group): Ditto. - * passwd.cc (pwdgrp::parse_passwd): Ditto. Revamp test for garbage - input. - * pwdgrp.h (pwdgrp::next_str): Don't use default parameter. - -2003-01-26 Christopher Faylor - - * uinfo.cc (pwdgrp::load): Regularize strace output. Add warning for - CreateFile failure. - -2003-01-26 Christopher Faylor - - * passwd.cc (pwdgrp::parse_passwd): Eliminate use of memset. The - structure should always be completely filled out. - * grp.cc (pwdgrp::parse_group): Ditto. - -2003-01-26 Christopher Faylor - - * grp.cc (pwdgrp::parse_group): Fix off-by-one problem in allocating - gr_mem. - -2003-01-26 Christopher Faylor - - * include/sys/strace.h (paranoid_printf): Define as not being part of - "all" output. - -2003-01-25 Christopher Faylor - - * pwdgrp.h (pwdgrp::next_num): Rename from next_int. Returns - true/false if parse operation succeeded. - (pwdgrp::reparse): Remove. - (pwdgrp::raw_ptr): New function. Returns pointer in line. - (pwdgrp::next_num): New functions for parsing other than unsigned long. - * grp.cc (pwdgrp::parse_group): Reinstate previous parsing behavior. - Don't fill in fields with NULL and assign empty gr_mem to known pointer - rather than doing a pointless calloc. Streamline gr_mem parsing. - Don't increment curr_lines here. - * passwd.cc (pwdgrp::parse_passwd): Use new behavior of next_num. - Don't increment curr_lines here. - * uinfo.cc (pwdgrp::next_str): Keep returning EOL if out of data. - (pwdgrp::reparse): Remove. - (pwdgrp::next_num): Rename from next_int. Return bool indicating - success of parse, argument returns value parsed. - (pwdgrp::add_line): Increment curr_lines here on successful parse. - (pwdgrp::load): (from Pierre Humblet) Don't return status. Just report - it here. - -2003-01-25 Christopher Faylor - - * pwdgrp.cc (pwdgrp::reparse): Declare. - * uinfo.cc (pwdgrp::reparse): Define. - * grp.cc (pwdgrp::parse_group): Use reparse. - -2003-01-25 Pierre Humblet - - * syscalls.cc (seteuid32): On Win95 get the pw entry. If it exists - update the euid and call cygheap->user.set_name. Remove special - handling of ILLEGAL_UID. - (setgid32): Add a debug_printf. On Win95, always set the egid. - Remove special handling of ILLEGAL_GID. Do not compare gid and gr_gid. - * child_info.h (class cygheap_exec_info): Remove uid. - * spawn.cc (spawn_guts): Do not set ciresrv.moreinfo->uid. - * dcrto.cc (dll_crt0_1): Always call uinfo_init. - * uinfo.cc (uinfo_init): Reorganize and close handle if needed. - (cygheap_user::ontherange): Do not call internal_getpwnam if pw is NULL. - -2003-01-24 Christopher Faylor - - * fhandler_console.cc (fhandler_console::send_winch_maybe): Reset - scroll region if size changes. - -2003-01-24 Pierre Humblet - Jason Tishler - - * cygwin.din: Export setreuid32, setreuid, setregid32, setregid. - * syscalls.cc (setreuid32): New function. - (setreuid): Ditto. - (setregid32): Ditto. - (setregid): Ditto. - * include/cygwin/version.h: Bump API minor number. - -2003-01-23 Christopher Faylor - - * pwdrp.h (pwdgrp::refresh): Lock entire test prior to reading. - -2003-01-23 Christopher Faylor - - * grp.cc (pwdgrp::parse_group): Eliminate arg and use class member - instead. Use next_str and next_int to parse arguments. - * passwd.cc (pwdgrp::parse_passwd): Ditto. - (grab_string): Eliminate. - (grab_int): Ditto. - * pwdgrp.h (pwdgrp::parse): Eliminate input arg. - (pwdgrp::parse_passwd): Reflect above change. - (pwdgrp::parse_group): Reflect above change. - (pwdgrp::next_str): New function. - (pwdgrp::next_int): Ditto. - (pwdgrp::gets): Eliminate. - * uinfo.cc (pwdgrp::next_str): New function. - (pwdgrp::next_int): Ditto. - (pwdgrp::add_line): Subsume gets. - (pwdgrp::gets): Eliminate. - (pwdgrp::load): Just call add_line to parse input buffer. - -2003-01-22 Thomas Pfaff - - * include/pthread.h (PTHREAD_MUTEX_RECURSIVE): Revert changes from - 2003-01-09 mutex patch. - (PTHREAD_MUTEX_ERRORCHECK): Ditto. - -2003-01-22 Corinna Vinschen - - * cygrun.c: Move from here to ../testsuite. - * Makefile.in: Remove cygrun.exe dependencies. - -2003-01-21 Jason Tishler - - * cygwin.din: Export nanosleep(). - * signal.cc (nanosleep): New function. - (sleep): Move old functionality to nanosleep(). Call nanosleep(). - (usleep): Remove old functionality. Call nanosleep(). - * include/cygwin/version.h: Bump API minor number. - -2003-01-21 Christopher Faylor - - * grp.cc: Call gr.refresh() rather than doing isunitialized tests - throughout. - (gr): Use constructor (sigh). - (pwdgrp::parse_group): Rename from parse_grp. - (pwdgrp::read_group): Rename from read_etc_group. Just call gr.load - with a single argument. - * passwd.cc: Call pr.refresh() rather than doing isunitialized tests - throughout. - (pr): Use constructor (sigh). - (pwdgrp::parse_passwd): Rename from "parse_pwd". - (pwdgrp::read_passwd): Rename from read_etc_passwd. Just call pr.load - with a single argument. - * pwdgrp.h (pwdgrp_state): Eliminate. - (pwdgrp): Reflect above renamings. - (pwdgrp::etc_ix): Rename from pwd_ix. - (pwdgrp::read): New element. - (pwdgrp::lock): New element. - (pwdgrp::refresh): New function. - (pwdgrp::load): Eliminate variations which take buffer arguments. - (pwdgrp::pwdgrp): New constructors. Initialize mutex here. - * uinfo.cc (pwdgrp::load): Accommodate pwd_ix -> etc_ix renaming. - (pwdgrp::load): Set initialized state to true rather than setting state - to loaded. - -2003-01-21 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number. - -2003-01-21 Pierre Humblet - - * path.h (etc::change_possible): Revert the type to bool. - (etc::set_last_modified): Remove obsolete function. - * path.cc (etc::change_possible): Revert type to bool. - (etc::test_file_change): Do not test for negative values of - change_possible and do not set it to -res. - (etc::dir_changed): When the handle is NULL, call memset instead of - test_file_changed. When the handle is invalid, return true. Detect - filename change in /etc. - (etc::file_changed): Remove unneeded check for !fn[n]. - * uinfo.cc (pwdgrp::load): Eliminate spurious setting of fh to NULL. - * pwdgrp.h (pwdgrp::operator =): Eliminate. - -2003-01-19 Christopher Faylor - - * pwdgrp.h (etc): Move to path.h. - (pwdgrp::max_lines): New field. - (pwdgrp::curr_lines): New field. - (pwdgrp::pwdgrp_buf): Ditto. - (pwdgrp_buf_elem_size): Ditto. - (pwdgrp_parse): Ditto. - (pwdgrp::gets): Just declare here. - (pwdgrp::load): Ditto. Just take one argument. - (pwdgrp::load): Define overloaded function accepting passwd buf. - (pwdgrp::load): Define overloaded function accepting group buf. - * grp.cc: Use pwdgrp elements rather than standalone static variables - throughout. - (curr_lines): Eliminate. - (max_lines): Ditto. - (add_grp_line): Ditto. - (parse_grp): Define as returning boolean. Accept void * arg and line - count. Coerce first argument into __group32 buf reference. Increment - curr_line as appropriate. - (read_etc_group): Pass pwdgrp buffer to gr.load. - * passwd.cc: Use pwdgrp elements rather than standalone static variables - throughout. - (curr_lines): Eliminate. - (max_lines): Ditto. - (add_grp_line): Ditto. - (parse_passwd): Define as returning boolean. Accept void * arg and line - count. Coerce first argument into passwd buf reference. Increment - curr_line as appropriate. - (read_etc_group): Pass pwdgrp buffer to pr.load. - * path.cc (etc::fn): Extend buffer size to allow index by 1 rather than - zero. - (etc::last_modified): Ditto. - (etc::change_possible): Ditto. Renamed from sawchange. Change to - signed char since elements are now tri-state. - (etc::init): Assume "handle" is 1 based rather than 0. - (etc::test_file_change): New function. Sets change_possible based on - file date comparison. - (etc::dir_changed): Check file states immediately after changed_h is - initialized to avoid a race. - (etc::file_changed): Use test_file_change to detect if file needs to be - updated. - * path.h (etc): Move class here from pwdgrp.h. - * uinfo.cc: Move etc:: functions to path.cc. Move pwdgrp functions - here. - (pwdgrp::gets): Eliminate buf checks. Just check eptr and set lptr. - (pwdgrp::add_line): New function. - (pwdgrp::load): Call generic add_line function which will call correct - parser. - -2003-01-17 Christopher Faylor - - * cygheap.cc: Change most 'int's to 'unsigned's. - (_cmalloc): Only check for size of malloced region when calculating - bucket. Add overhead when performing the sbrk. Previous change broke - _crealloc. - -2003-01-17 Christopher Faylor - - * dcrt0.cc (initialize_env): Use colon for CYGWIN_DEBUG separator. - * grp.cc: Change most statics to NO_COPY throughout. - * passwd.cc: Ditto. - -2003-01-17 Christopher Faylor - - * pwdgrp.h: Change some BOOLs to bools. - (pwdgrp::pwdgrp): Remove unneeded constructor. - * passwd.cc: Change BOOL to bool throughout. - -2003-01-17 Corinna Vinschen - - * cygwin.din: Add strerror_r. - * include/cygwin/version.h: Bump API minor number. - -2003-01-17 Christopher Faylor - - * uinfo.cc (etc::dir_changed): Don't print a warning if can't open - /etc, unless debugging. - -2003-01-17 Pierre Humblet - - * grp.cc (read_etc_group): On NT, add a line for gid = -1. Change name - "unknown" to "mkgroup". - (internal_getgrgid): Do not return default in nontsec case. - (internal_getgroups): Add argument srchsid and look for it in groups if - not NULL. - * passwd.cc (read_etc_passwd): On NT, add a line for uid = -1. Use - same default uid for Win95 and NT. Call cygheap_user::ontherange to - initialize HOME. - -2003-01-16 Christopher Faylor - - * cygheap.cc (init_cygheap::etc_changed): Move to uinfo.cc. - * cygheap.h (init_cygheap::etc_changed_h): Remove. - (init_cygheap::etc_changed): Ditto. - * grp.cc (group_state): Remove. Use gr instead throughout. - (gr): Define as class pwdgrp. - (read_etc_group): Remove gr definition. Remove calls to - set_last_modified and close. Pass add_grp to gr.load to load file. - * passwd.cc (passwd_state): Remove. Use pr instead, throughout. - (pr): Define as class pwdgrp. - (read_etc_passwd): Remove pr definition. Remove calls to - set_last_modified and close. Pass add_pwd_line to pr.load to load - file. - * pwdgrp.h (etc): New helper class for pwdgrp. - (pwdgrp): Combine pwdgrp_check and pwdgrp_read into one class. Remove - file_w32 and last_modified fields. - (pwdgrp::set_last_modified): Remove. - (pwdgrp::isinitializing): Remove FindFirstFile stuff. Move to - etc::file_changed. - (pwdgrp::load): Rename from 'open'. Call etc::init to initialize etc - scanning. Close file handle after reading buffer into memory. Parse - buffer by calling second argument. - (pwdgrp::gets): Reorganize slightly to rely on eptr starting at - beginning of buffer. - (pwdgrp::close): Remove. - * uinfo.cc (etc::dir_changed): New function. - (etc::init): Ditto. - (etc::file_changed): Ditto. - (etc::set_last_modified): Ditto. - -2003-01-16 Jason Tishler - - * mmap.cc (fixup_mmaps_after_fork): Add ERROR_NOACCESS to the list of - ReadProcessMemory() error codes that trigger a retry with temporary - PAGE_READONLY access. Note that this can occur on NT 4.0. - -2003-01-15 Christopher Faylor - - * path.cc (normalize_posix_path): Convert win32 path separators to - slashes when full path is specified. - -2003-01-15 Pierre Humblet - - * cmalloc.cc (_cmalloc): Fix memory leak. - -2003-01-15 Corinna Vinschen - - * autoload.cc: Fix copyright date. - * fhandler_dsp.cc: Ditto. - * mmap.cc: Ditto. - * net.cc: Ditto. - * ntdll.h: Ditto. - * signal.cc: Ditto. - * syscalls.cc: Ditto. - * uname.cc: Ditto. - * wait.cc: Ditto. - -2003-01-14 Corinna Vinschen - - * mmap.cc (fixup_mmaps_after_fork): Copy protection to child process. - Change ambiguous debug output. - -2003-01-14 Corinna Vinschen - - * mmap.cc (mmap_record::access): Change argument type to caddr_t - for strictness. - (mprotect): Protect against calling VirtualProtect() for shared - pages on 9x/Me. - (fixup_mmaps_after_fork): If ReadProcessMemory() fails, try to - change protection of parent page to PAGE_READONLY, then try again. - Revert protection afterwards. - -2003-01-14 Thomas Pfaff - - * syscalls.cc (system): Add pthread_testcancel call. - * thread.cc: Update list of cancellation points. - -2003-01-14 Thomas Pfaff - - * wait.cc: Include thread.h - (wait4): Add pthread_testcancel call. - Wait for child process and cancellation event. - * thread.cc: Update list of cancellation points. - -2003-01-14 Thomas Pfaff - - * signal.cc (sleep): Add pthread_testcancel call. - Wait for signal and cancellation event. - (usleep): Ditto. - -2003-01-14 Thomas Pfaff - - * exceptions.cc (handle_sigsuspend): Add pthread_testcancel call. - Wait for signal and cancellation event. - * thread.cc: Update list of cancellation points. - -2003-01-14 David Huang - - * fhandler_dsp.cc (fhandler_dsp::ioctl): Add limited support for - SNDCTL_DSP_GETFMTS. - -2003-01-12 Christopher Faylor - - * ntdll.h: Fix typo. - -2003-01-12 Corinna Vinschen - - * uname.cc (uname): Use cygwin_gethostname() to retrieve hostname. - -2003-01-12 Pierre Humblet - - * sec_acl.cc (search_ace): Use id == -1, instead of < 0, as wildcard. - (setacl): Start the search for a matching default at the next entry. - Invalidate the type of merged entries instead of clearing it. - Use well_known_creator for default owner and owning group and do - not try to merge non-default and default entries in these cases. - (getacl): Recognize well_known_creator for default owner and group. - (acl_worker): Improve errno settings and streamline the nontsec case. - * security.cc (write_sd): Remove the call to set_process_privilege. - (alloc_sd): If the owner changes, call set_process_privilege and return - immediately on failure. Change inheritance rules: on new directories add - inherit only allow ACEs for creator_owner, creator_group and everyone. - Preserve all inheritances through chmod and chown calls. Introduce - isownergroup to implement the uid == gid case, to keep the inheritance - code simple. Do not initialize owner_sid and group_sid and stop using - the variable psd. - -2003-01-10 Christopher Faylor - - * net.cc: Use gethostname define from winsock2.h. - -2003-01-10 Christopher Faylor - - * path.cc: Unrevert below reversion except for - mount_info::conv_to_posix_path part. - -2003-01-10 Corinna Vinschen - - * path.cc: Revert patch from 2003-01-09 to normalize a windows path - rather than converting to posix. - -2003-01-10 Corinna Vinschen - - * autoload.cc (gethostname): Make call optional, return 1 if function - can't get loaded. - * net.cc (cygwin_gethostname): Call GetComputerName if return value - of gethostname is non-zero. - -2003-01-10 Charles Wilson - - * cygwin.din: Add asprintf and vasprintf, as well as the reentrant - versions and underscore variants. - * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR. - -2003-01-10 Corinna Vinschen - - * net.cc (cygwin_gethostname): Fix call to wsock function gethostname. - -2003-01-09 Christopher Faylor - - * cygthread.cc (cygthread::cygthread): Be more noisy about odd - condition. - * miscfuncs.cc (low_priority_sleep): Sleep in regular priority if - that's what we're currently running at. - -2003-01-09 Thomas Pfaff - - * include/semaphore.h: Modify typedef for sem_t. - * include/cygwin/types.h: Modify typedefs for pthread_t, - pthread_mutex_t, pthread_key_t, pthread_attr_t, - pthread_mutexattr_t, pthread_condattr_t, pthread_cond_t, - pthread_rwlock_t and pthread_rwlockattr_t. - -2003-01-09 Thomas Pfaff - - * thread.h (WAIT_CANCELED): New define. - (pthread::cancelable_wait): New static method. - * thread.cc (pthread::cancelable_wait): Implement. - (semaphore::Wait): Wait on semaphore and thread cancellation. - (pthread::join): Wait on joined thread and thread cancellation. - (semaphore::wait): Add testcancel to check for thread - cancellation even if the semaphore is available. - -2003-01-09 Thomas Pfaff - - * include/pthread.h: Add define for errorchecking mutexes. - Change default mutex type. - * thread.cc (pthread_cond::TimedWait): Update mutex unlock - calls. - (pthread_mutex::pthread_mutex): New implement. - (pthread_mutex::~pthread_mutex): Ditto. - (pthread_mutex::Lock): Ditto. - (pthread_mutex::TryLock): Ditto. - (pthread_mutex::UnLock): Ditto. - (pthread_mutex::Destroy): Implement new method. - (pthread_mutex::SetOwner): Ditto. - (pthread_mutex::LockRecursive): Ditto. - (pthread_mutex::fixup_after_fork): Restore locking state after - fork. - (__pthread_mutex_lock): Return pthread_mutex::Lock errorcode. - (__pthread_mutex_trylock): Return pthread_mutex::TryLock - errorcode. - (__pthread_mutex_unlock): Return pthread_mutex::UnLock - errorcode. - (__pthread_mutex_destroy): Call pthread_mutex::Destroy to - destroy mutex. - (__pthread_mutexattr_settype): Allow errorchecking and recursive - types. - * thread.h (MUTEX_LOCK_COUNTER_INITIAL): New define. - (pthread_mutex::criticalsection): Remove. - (pthread_mutex::lock_counter): New member. - (pthread_mutex::recursion_counter): Ditto. - (pthread_mutex::owner): Ditto. - (pthread_mutex::type): Ditto. - (pthread_mutex::Destroy): New method. - (pthread_mutex::SetOwner): Ditto. - (pthread_mutex::LockRecursive): Ditto. - -2003-01-09 Thomas Pfaff - - * pthread.cc (pthread_cond_init): Use new pthread_cond::init. - * thread.cc: Some white spaces cleanups. - Change __pthread_cond_init to pthread_cond::init throughout. - (nativeMutex): Move class methods outside pthread_mutex. - (MTinterface::Init): Initialize pthread_cond init lock. - (pthread_cond::condInitializationLock): Instantiate. - (pthread_cond::initMutex): New Method. - (pthread_cond::isGoodInitializerOrBadObject): Ditto. - * thread.h: Some white spaces cleanups. - (nativeMutex): Move class declaration outside pthread_mutex. - (pthread_cond::condInitializationLock): New static member. - (pthread_cond::initMutex): New Method. - (pthread_cond::isGoodInitializerOrBadObject): Ditto. - (__pthread_cond_init): Remove prototype. - -2003-01-09 Corinna Vinschen - - * fhandler_disk_file.cc (num_entries): Return 2 as link count if - directory unreadable. - -2003-01-09 Corinna Vinschen - - * security.cc (get_nt_attribute): Always return -1 when read_sd() - fails. - (get_file_attribute): Set permissions to 0 and owner/group to -1 - if security descriptor is unreadable. - -2003-01-09 Christopher Faylor - - Use isdirsep rather than SLASH_P throughout. - * path.cc (iscygdrive): Disallow /cygdrive\x. - (normalize_posix_path): "Normalize" a windows path, if detected, rather - than converting to posix. - -2003-01-06 Troy Curtiss - - * fhandler_serial.cc (fhandler_serial::tcsetattr): Add support and - capability checking for B230400 bitrate. - (fhandler_serial::tcgetattr): Add support for B230400 bitrate. - * include/sys/termios.h: Add B230400 definition for Posix support of - 230.4Kbps. - -2003-01-05 Christopher Faylor - - * pinfo.cc (_pinfo::commune_send): Use myself->lock rather than just - lock when leaving. - -2003-01-03 Christopher Faylor - - * dtable.h (dtable::in_vfork_cleanup): New function. True if vfork - cleanup needed. - * dtable.cc (dtable::vfork_parent_restore): Remove assertion. - * pipe.cc (fhandler_pipe::close): Don't close read_state during - fork_fixup since it wasn't inherited. - -2003-01-01 Christopher Faylor - - * passwd.cc (getpwuid_r32): Revert previous change. - -2003-01-01 Christopher Faylor - - * sysconf.cc (sysconf): Return arbitrary values for - _SC_GETGR_R_SIZE_MAX, _SC_LOGIN_NAME_MAX, _SC_GETPW_R_SIZE_MAX. - - * passwd.cc (getpwuid_r32): Add uid/gid fields to size check - calculation. - diff --git a/winsup/cygwin/ChangeLog-2004 b/winsup/cygwin/ChangeLog-2004 deleted file mode 100644 index ebb696237..000000000 --- a/winsup/cygwin/ChangeLog-2004 +++ /dev/null @@ -1,3848 +0,0 @@ -2004-12-30 Christopher Faylor - - * devices.cc (device::isfs): Return true for the logical case of - devn == FH_FS. - -2004-12-28 Christopher Faylor - - * pinfo.cc (_pinfo::dup_proc_pipe): DUPLICATE_CLOSE_SOURCE closes the - handle regardless, so revert previous change. - -2004-12-27 Christopher Faylor - - * cygthread.cc (cygthread::stub): Add better debug output. - (cygthread::cygthread): Ditto. - (cygthread::terminate_thread): Ditto. Move inuse test earlier or - suffer infinite loop. - * pinfo.cc (_pinfo::dup_proc_pipe): Close handle if DuplicateHandle - fails and process no longer exists. - * spawn.cc (spawn_guts): Create process in suspended state if OS - demands it. - * wincap.cc: Add "start_proc_suspended" throughout. - * wincap.h (wincaps): Ditto. - (wincapc): Ditto. - -2004-12-27 Christopher Faylor - - * pinfo.cc (_pinfo::exit): Beef up debugging output. - * sigproc.cc (proc_subproc): Detached children apparently need a ppid - of 1. - -2004-12-26 Christopher Faylor - - * init.cc (dll_entry): Previous code reversion was ill-advised. Revert - it. - * sigproc.cc (child_info::sync): Ditto. - * pinfo.cc (_pinfo::exit): Don't set myself.procinfo to NULL since it - is no longer required. - -2004-12-26 Christopher Faylor - - * init.cc (dll_entry): Remove exit code setting. - * pinfo.cc (pinfo::init): Initialize exitcode to unset state rather - than SIGTERM. - (proc_waiter): Detect if exit code is unset and use status from - GetExitCodeProcess. - * sigproc.cc (child_info::sync): Remove exit code detection here since - proc_waiter now (again) detects it. - -2004-12-25 Christopher Faylor - - * fhandler.cc (fhandler_base::fchmod): Do the right thing when changing - an "on disk" device or fifo. - (fhandler_base::fchown): Ditto for changing ownership. - * fhandler_disk_file.cc (fhandler_base::fstat_helper): Accommodate - device files on ntfs partitions. - * path.cc (path_conv::check): Use isfs function to figure out if a path - exists on a filesystem to make sure that device files are caught. - -2004-12-24 Christopher Faylor - - * child_info.h (CURR_CHILD_INFO_MAGIC): Update. - (child_info::parent_wr_proc_pipe): Eliminate. - * pinfo.h (_pinfo::alert_parent): Move here from pinfo class. - (_pinfo::dup_proc_pipe): New method. - (_pinfo::sync_proc_pipe): Ditto. - * exceptions.cc (sig_handle_tty_stop): Reflect move of alert_parent. - * init.cc (dll_entry): Exit with status one if main process called - ExitProcess. - * pinfo.cc (set_myself): Remove handling of parent_wr_proc_pipe. - (_pinfo::exit): Reflect move of alert_parent. Set procinfo to NULL to - flag that we are exiting normally. Always use exitcode when exiting - (although this could be a little racy). - (pinfo::init): Set default exit to SIGTERM. This will be the exit code - reported if process is terminated. - (_pinfo::dup_proc_pipe): New function. - (pinfo::wait): Duplicate wr_proc_pipe to the right place. Use - dup_proc_pipe to move the pipe to the child. - (_pinfo::sync_proc_pipe): New function. - (_pinfo::alert_parent): Move to _pinfo. Make sure that wr_proc_pipe is - ours before using it. - * sigproc.cc (child_info::child_info): Remove handling of - parent_wr_proc_pipe. - * spawn.cc (spawn_guts): Pass our wr_proc_pipe to the child when - execing. Ensure that exit code of cygwin process started from windows - is correctly set. - -2004-12-23 Pierre Humblet - Christopher Faylor - - * path.h (path_conv::set_normalized_path): Add second argument and fill - it in throughout. - * path.cc (path_conv::check): Declare, set and use "strip_tail". - (path_conv::set_normalized_path): Add and use second argument, - replacing all tail stripping tests. - -2004-12-23 Christopher Faylor - - * cygthread.cc (cygthread::cygthread): Guard debugging variable with - "ifdef DEBUGGING". - (cygthread::release): Ditto. - -2004-12-23 Christopher Faylor - Corinna Vinschen - - * path.cc (path_conv::check): Don't strip the trailing slash from a - path consisting only of two slashes. - -2004-12-23 Christopher Faylor - - * cygthread.cc (cygthread::stub): Detect if thread function wants to - release itself here, to avoid a race. - (cygthread::release): Clear more stuff. Add a diagnostic for an - internal error. - * cygthread.h (auto_release): New function. - * pinfo.h (pinfo::remember): Add an argument to denote whether child is - detached. - * fork.cc (fork_parent): Reflect change in arguments to - pinfo::remember. - * pinfo.cc (_pinfo::exit): Signal exit more forcibly. - (proc_waiter): Use cygthread::auto_release to signify that - cygthread::stub should release the thread. This should avoid a race. - (pinfo::alert_parent): Don't signify an error when wr_proc_pipe == NULL. - * sigproc.cc (proc_subproc): Add support for PROC_DETACHED_CHILD. - * sigproc.h: Ditto. - * spawn.cc (spawn_guts): Specify whether child is detached or not when - calling pinfo::remember. - -2004-12-22 Christopher Faylor - - * cygheap.cc (cygheap_setup_for_child): Add api_fatal to catch failing - MapViewOfFileEx. - * cygthread.cc (cygthread::stub): Previous change to make diagnostic - output more informative was really a bust. Try again. Capture previous - name in a new field in cygthread for diagnostic purposes. - (cygthread::cygthread): Ditto. - (cygthread::release): Add an argument to control whether h should be cleared - or not. - (cygthread::terminate_thread): Use 'inuse' for tests rather than 'h'. - (cygthread): Add some diagnostic fields. - (cygthread::release): Add an argument. - * pinfo.cc (proc_waiter): Accommodate change to cygthread::release. - -2004-12-22 Christopher Faylor - - * cygthread.cc (cygthread::stub): Make diagnostic output more informative. - -2004-12-22 Christopher Faylor - - * pinfo.cc (proc_waiter): Zero wait_thread in child to avoid races with - process termination. - * cygthread.cc (cygthread::terminate): Clumsily detect when h has gone away - and attempt no further action. - -2004-12-22 Christopher Faylor - - * cygthread.h (cygthread::release): Just declare here. - * cygthread.cc (cygthread::release): Define here. Use - InterlockedExchange to set inuse or suffer potential races. - (cygthread::terminate): Use release(). - -2004-12-22 Chris January - - * fhandler_process.cpp (format_process_status): Use tabs in formatting - instead of spaces. - -2004-12-22 Corinna Vinschen - - * path.cc (set_normalized_path): Allow empty pathnames. - -2004-12-21 Christopher Faylor - - * spawn.cc (spawn_guts): Force parent to forget about P_DETACH'ed - process. - -2004-12-20 Christopher Faylor - - * path.cc (normalize_win32_path): Remove unneeded check for dots. - -2004-12-20 Christopher Faylor - - * path.cc (normalize_posix_path): Remove unneeded check for dots. - (path_conv::set_normalized_path): Strip trailing dots, similarly to - what had previously been done for the win32 path. - -2004-12-18 Christopher Faylor - - * path.cc (normalize_win32_path): Make third arg pass-by reference. - Reorganize slightly to eliminate extra variables. - (normalize_posix_path): Ditto. - (path_conv::check): Reflect change in arguments. - (mount_info::conv_to_posix_path): Ditto. - (mount_info::add_item): Ditto. - -2004-12-18 Christopher Faylor - - * child_info.h (CURR_CHILD_INFO_MAGIC): Use updated value. - -2004-12-18 Christopher Faylor - Pierre Humblet - - * path.cc (path_conv::check): Check the output Win32 path for trailing - spaces and dots, not the input path. Disallow all use of foo./bar - since consistently getting this right is time consuming. Remove - strange test for "unc\" since no one seems to know what it's for. - -2004-12-18 Chris January - - * fhandler_proc.cc (proc_listing): Add entry for "self". - (proc_fhandlers): Add entry for "self". - * fhandler_process.cc (fhandler_process::fstate): Handle "self". - (fhandler_process::open): Handle "self". - -2004-12-17 Christopher Faylor - - * sigproc.cc (proc_subproc): Fix long-standing problem. Only wait for - "all processes" if pid == -1 -- not just if pid is negative. - (proc_can_be_signalled): Fix another long-standing problem. Set - correct errno when detecting an exited process. - -2004-12-16 Thomas Wolff - - * fhandler_console.cc (get_win32_attr): Avoid inappropriate intensity - interchanging that used to render reverse output unreadable when - non-reversed text is bright. - -2004-12-15 Corinna Vinschen - - * cygwin.din: Add utmpx symbols. - * syscalls.cc: Include utmpx.h. Implement utmpx functions as stubs - to utmp functions. - (copy_ut_to_utx): New static function. - (pututline): Change from void to struct utmp * as on Linux. - (setutxent): New function. - (endutxent): New function. - (getutxent): New function. - (getutxid): New function. - (getutxline): New function. - (pututxline): New function. - * include/utmpx.h: New file. - * include/cygwin/utmp.h: New file. - * include/cygwin/version.h: Bump API minor number. - * include/sys/utmp.h: Include cygwin/utmp.h. Move stuff common with - utmpx functionality there. - (pututline): Declare struct utmp *. - -2004-12-14 Corinna Vinschen - - * tty.cc (tty_list::terminate): Guard releasing the tty with tty_mutex. - (tty::init): Set master_pid to 0. - -2004-12-14 Thomas Wolff - - * fhandler_console.cc (read): Consider offset within scrolling - region of the console window. - -2004-12-13 Corinna Vinschen - - * cygheap.h (cwdstuff::get_drive): Release cwd_lock. - -2004-12-12 Bas van Gompel - - * fhandler.cc (fhandler_base::puts_readahead): Fix end-condition. - -2004-12-10 Corinna Vinschen - - * errno.cc (errmap): Map ERROR_INVALID_ADDRESS to EINVAL instead of - EOVERFLOW. - -2004-12-10 Christopher Faylor - - * include/sys/strace.h: Don't output paranoid_printf by default. - -2004-12-09 Christopher Faylor - - * lib/libcmain.c (main): Properly deal with quoted first argument. - -2004-12-06 Christopher Faylor - - * pinfo.h (proc_pipe::*): Delete class. - * pinfo.cc (proc_pipe::*): Ditto. - -2004-12-05 Christopher Faylor - - * fork.cc (fork_parent): Reinstate "childhProc" protection. Don't - close hProcess handle here since it is used to ensure that a new - process isn't created with the old pid after the old pid exits. - * spawn.cc (spawn_guts): Ditto. - * pinfo.cc (proc_waiter): Don't send any signals if we've execed since - this process doesn't officially exist. - * pinfo.h (pinfo::pid_handle): Eliminate. Just use hProc. - * sigproc.cc (sig_send): Don't send any signals if our sendsig doesn't - exist. That's a sign that we are execing. - (remove_proc): Eliminate pid_handle close. - -2004-12-05 Christopher Faylor - - * cygthread.h (cygthread::terminate_thread): Make public. - * pinfo.h (pinfo::wait_thread): New element. - * pinfo.cc (pinfo::wait): Store "handle" to started thread in pinfo. - * sigproc.cc (proc_terminate): Kill any threads waiting for a process - pipe. - -2004-12-05 Christopher Faylor - - * sigproc.cc (mychild): Reimplement as list scan. - (proc_subproc): Don't mess with pinfo if it's myself. - -2004-12-05 Christopher Faylor - - * child_info.h (child_info_types): Label enum for _PROC constants. - (child_info::child_info): New constructor. - (child_info::~child_info): New destructor. - (child_info::sync): Declare new function. - (child_info_fork::child_info_fork): New constructor. - (child_info_spawn::child_info_spawn): Remove old constructor. - (child_info_spawn::child_info_spawn): New constructor. - * dcrt0.cc (dll_crt0_0): Use correct sizeof when doing sanity check on - passed in child_info. Signal readiness to parent when not forking (and - not spawning). - * fork.cc (sync_with_child): Delete. - (resume_child): Remove extra argument. - (sync_with_parent): Use child_info method to sync with parent. - (fork_child): Don't close fork_info->subproc_ready since that is now - handled by the destructor. - (fork_parent): Remove subproc_ready stuff. Use child_info sync method - for waiting.. Set start time here for child. Rename "forked" to - "child". - (fork): Check ch.subproc_ready for validity here. - * pinfo.h (_pinfo::exec_sendsig): Temp storage for exec stub which may - be staying around to handle non-cygwin captive process. - (_pinfo::exec_dwProcessId): Ditto. - (_pinfo::_lock): Renamed from lock. - (_pinfo::lock): New method. - (_pinfo::unlock): Ditto. - (_pinfo::initialize_lock): Ditto. - * pinfo.cc (set_myself): Use initialize_lock method to initialize - myself lock. Set "exec" fields in _pinfo to zero to indicate that - we've started successfully. Set start time here when appropriate. - (_pinfo::commune_send): Use pinfo lock/unlock methods. - (proc_waiter): Remove special case for non-cywin processes. - Reinstitute handling for PID_NOCLDSTOP. - * sigproc.cc (proc_subproc): Set proper EAGAIN errno when process table - is filled. - (sig_send): Use exec_* fields from _pinfo for sending signals if the - the _pinfo sendsig never materializes. - (child_info::child_info): New constructor, renamed from init_child_info. - Zeroes child_info structure and sets appropriate fields in structure - based on chtype. - (child_info::~child_info): New destructor. Closes subproc_ready if it - exists. - (child_info_fork::child_info_fork): New constructor. - (child_info_spawn::child_info_spawn): New constructor. - (child_info::ready): New function. Signals parent when child is ready. - (child_info::sync): New function. Wait for child to signal us or - process to die. - (remove_proc): Remove closing of hProcess since this should now be - handled shortly after process creation. - * spawn.cc (spawn_guts): Use child_info_spawn constructor rather than - init_child_info. Save exec_sendsig and exec_dwProcessId in execing - _pinfo. Rely on child_info constructor to properly set - parent_wr_proc_pipe in ciresrv. Revert to previous determination on - whether to start a process in suspended mode. Remove reparenting - stuff. Just keep a stub around if starting a non-cygwin process. - -2004-12-05 Bas van Gompel - - * fhandler.cc (fhandler_base::read): Remove superfluous check in - __small_printf format for strace. - -2004-12-05 Bas van Gompel - - * fhandler.cc (fhandler_base::read): Don't debug_printf garbage when - copied_chars is zero. - -2004-12-03 Christopher Faylor - - * environ.cc (environ_init): Alloc space for TERM if it is not set, - like all of the other environment variables. - -2004-12-02 Christopher Faylor - - * child_info.h (child_info_fork::parent_wr_proc_pipe): New element. - * fork.cc (fork_parent): Set parent_wr_proc. - * pinfo.cc (set_myself): Close child_proc_info->parent_wr_proc if it - exists rather than trying to get value from parent _pinfo. - -2004-12-02 Christopher Faylor - - * pinfo.h (enum parent_aleter): New enum. - (pinfo::alert_parent): Declare as returning a value. - (pinfo::parent_alive): New function. - * pinfo.cc (pinfo::alert_parent): Set wr_proc_pipe to invalid non-NULL - value when parent disappears. Return success of operation. - (proc_waiter): Use __ALERT_* enum for control since these are not really signals. - Implement __ALERT_ALIVE. - * sigproc.cc (my_parent_is_alive): Eliminate. - * sigproc.h (my_parent_is_alive): Ditto for declaration. - (__SIGREPARENT): Eliminate. - -2004-12-02 Christopher Faylor - - * pinfo.cc (pinfo::wait): Use better name for cygthread. - -2004-12-03 Pierre Humblet - - * registry.h (reg_key::reg_key): Change arguments. - * shared_info.h (class mount_info): Remove had_to_create_mount_areas. - * registry.cc (reg_key::reg_key): Change constructors to always handle - HKLM and to avoid relying on HKCU. - Do not set mount_table->had_to_create_mount_areas. - * path.cc (mount_info::conv_to_win32_path): Improve update of - sys_mount_table_counter. - (mount_info::read_mounts): Use new reg_key constructor. - (mount_info::add_reg_mount): Ditto. - (mount_info::del_reg_mount): Ditto. - (mount_info::read_cygdrive_info_from_registry): Ditto. - (mount_info::write_cygdrive_info_to_registry): Ditto. - Update cygwin_shared->sys_mount_table_counter after registry update. - (mount_info::get_cygdrive_info): Ditto. - * shared.cc (shared_info::heap_chunk_size): Use new reg_key constructor. - * environ.cc (regopt): Ditto. - -2004-12-01 Christopher Faylor - - * include/features.h: Include sys/cdefs.h, like linux. - -2004-12-01 Christopher Faylor - - * syscalls.cc (truncate64): Don't second-guess errno if open fails. - * devices.in: Don't allow /dev/com0. - -2004-11-25 Christopher Faylor - - * environ.cc (putenv): Accommodate recent newlib change in argument to - putenv. - -2004-11-25 Christopher Faylor - - * child_info.h (child_info_spawn::hexec_proc): Eliminate. - * dcrt0.cc (dll_crt0_0): Remove hexec_proc stuff. - * fork.cc (fork_child): Remove call to pinfo_fixup_after_fork. - * pinfo.cc (set_myself): Close and zero pid_handle if set. - (pinfo_fixup_after_fork): Delete. - (proc_waiter): Don't close vchild.hProcess here. Do that when we are - remove the vchild from procs. Save hProcess as pid_handle only on - first reparent operation. - (pinfo::wait): Don't set pid_handle here. - (pinfo::alert_parent): Always try to send signal. If unsuccessful then - close and zero wr_proc_pipe. - * pinfo.h (pinfo::pinfo): Make sure that appropriate parts of the class - are zeroed on construction. - (pinfo::alert_parent): Take char argument. - (pinfo_fixup_after_fork): Delete declaration. - (hexec_proc): Ditto. - * sigproc.cc (remove_proc): Close pid_handle and hProcess if - appropriate. - * spawn.cc (spawn_guts): Set cygheap->pid_handle on first exec. - -2004-11-25 Christopher Faylor - - * cygheap.h (init_cygheap::pid_handle): New element. - * pinfo.cc (set_myself): Clear previously existing cygheap->pid_handle - when a new process has been started. - (pinfo::wait): Make sure that a handle to the newly forked/spawned - process is kept around so that the pid will not be reused. - * pinfo.h (_pinfo::pid_handle): Move. - (pinfo::pid_handle): to here. - * spawn.cc (spawn_guts): Create a pid_handle in cygheap prior to - spawning to ensure that the pid does not get reused during the lifetime - of the "cygwin pid". - -2004-11-25 Christopher Faylor - - * pinfo.h (pinfo::alert_parent): New function. - * exceptions.cc (sig_handle_tty_stop): Use alert_parent to send - "signals" to parent. - * fork.cc (fork_parent): Don't close pi.hProcess. Let the waiter - thread do that. - * pinfo.cc (proc_waiter): Detect case where process exits without - setting the exit code and use value from GetExitCodeProcess. - Reluctantly implement __SIGREPARENT. - (pinfo::alert_parent): Define. - * sigproc.h (__SIGREPARENT): New enum. - * spawn.cc (spawn_guts): Send reparent signal to parent on exec. - Always create process in suspended state to avoid races. - -2004-11-25 Christopher Faylor - - Remove cygthread.h in favor of cygtls.h throughout since cygtls now - includes cygthread.h. Eliminate ppid_handle usage throughout. - * child_info.h: Regenerate magic number - (child_info): Remove pppid_handle. - * cygthread.h (cygthread::release): New method. Frees thread without - waiting. - * cygthread.cc (cygthread::stub): Set _ctinfo in _mytls to point to - information for executing thread. Don't call SetEvent if thread is no - longer in use. - (cygthread::simplestub): Ditto. - * cygtls.h (_cygtls::_ctinfo): New element contains pointer to - information about executing cygthread, if any. - * dcrt0.cc: Remove last vestiges of per_thread stuff. - (dll_crt0_0): Ditto. Remove accommodation for ppid_handle. - (do_exit): Remove obsolete reparenting test. - (_exit): Exit with a more SUSv3-like exit value. - * dtable.cc (dtable::stdio_init): Check for myself->cygstarted rather - than myself->ppid_handle to see if we were started by a cygwin process. - * exceptions.cc (open_stackdumpfile): Ditto. - (handle_exceptions): Ditto. - (ctrl_c_handler): Ditto. - (sig_handle_tty_stop): Ditto. Let parent send signal to itself on - STOP. - (sigpacket::process): Comment out vfork test. - (signal_exit): Use more SUSv3-like exit value on signal. - * external.cc (fillout_pinfo): Don't set hProcess. - * fork.cc: Remove VFORK cruft. - (per_thread::set): Delete. - (fork_child): Remove perthread stuff. - (fork_parent): Remove obsolete subproc_init. Accommodate new method - for tracking subprocesses. - * pinfo.cc (set_myself): Accommodate new pinfo/_pinfo layout. Set some - things here that used to be set in wait_sig. - (_pinfo::exit): Set exitcode here. Close process pipe. - (_pinfo::commune_send): Accommodeate new pinfo/_pinfo layout. - (proc_waiter): New function. Waits, in a thread for subprocess to go - away. - (pinfo::wait): New function. Initialization for proc_waiter. - * pinfo.h (_pinfo::exitcode): New element. - (_pinfo::cygstarted): Ditto. - (_pinfo::wr_proc_pipe): Ditto. - (_pinfo::ppid_handle): Delete. - (_pinfo::hProcess): Delete. - (_pinfo::lock): Delete. - (pinfo::hProcess): New element. - (pinfo::lock): Ditto. - (pinfo::wait): Declare new function. - (pinfo::preserve): Define new function. - * sigproc.cc: Remove old stuff from wait_subproc thread based method. - (zombies): Remove. - (procs): New. - (my_parent_is_alive): Just check that the parent pid exists. - (mychild): Just use pinfo methods to determine if child is mine. - (proc_subproc): Revamp PROC_ADDCHILD to use pinfo::wait. Remove - PROC_CHILDTERMINATED logic. Use different method to remove processes - from list when SIGCHLD == SIG_IGN. - (proc_terminate): Gut. - (subproc_init): Delete. - (init_child_info): Remove setting of pppid_handle. - (checkstate): Revamp to only scan procs array. - (remove_proc): Rename from remove_zombie. Don't close hProcess or - pid_handle. Don't release memory if it's myself. - (stopped_or_terminated): Change logic to handle new consolidated - proc/zombie array. - (wait_subproc): Delete. - * sigproc.h: Remove obsolete EXIT_* defines. - (subproc_init): Remove declaration. - * spawn.cc (spawn_guts): Remove reparenting stuff. Use standard wait - logic to wait for child if started from a non-cygwin process. - * tlsoffsets.h: Regenerate. - * tty.cc (tty_init): Check for myself->cygstarted rather than - myself->ppid_handle to see if we were started by a cygwin process. - * include/sys/signal.h (external_pinfo::exitcode): Replace hProcess. - * include/sys/wait.h (WCOREDUMP): Define. - - * fhandler_tty.cc (fhandler_tty_slave::read): Add debugging output for - timeout case. - * signal.cc (abort): Flag that we are exiting with the ABORT signal. - -2004-11-22 Christopher Faylor - - * select.cc (select_stuff::test_and_set): Remove extraneous tests of - "window_handle". - -2004-11-20 Pierre Humblet - - * fhandler.cc (fhandler::write): Remove debug_printf. - * pipe.cc (fhandler_pipe::create): Edit syscall_printf format. - -2004-11-20 Pierre Humblet - - * cygheap.h (cygheap_user::get_windows_id): New method. - * registry.h (get_registry_hive_path): Change argument type. - (load_registry_hive): Ditto. - * registry.cc (get_registry_hive_path): Change argument type and take - Win9x keys into account. - (load_registry_hive): Ditto. - * uinfo.cc (cygheap_user::env_userprofile): Use get_windows_id, even - for SYSTEM. - * shared.cc (user_shared_initialize): Use get_windows_id. - * syscalls.cc (seteuid32): Load the registry hive and reload the user - shared also on Win9x. - -2004-11-11 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 13. - -2004-10-28 Christopher Faylor - - * fork.cc (NPIDS_HELD): Reduce to former number now that bash problem - has been identified. - -2004-10-28 Pierre Humblet - - * path.cc (mount_info::from_registry): Deimpersonate while - accessing HKLM. - (mount_info::read_cygdrive_info_from_registry): Ditto. - * cygheap.h: Define NO_IMPERSONATION. - (cygheap_user::issetuid): Replace INVALID_HANDLE_VALUE by - NO_IMPERSONATION. - (cygheap_user::has_impersonation_tokens): Ditto. - (cygheap_user::close_impersonation_tokens): Ditto. - * uinfo.cc (uinfo_init): Ditto. - * syscalls.cc (seteuid32): Ditto. - * security.cc (set_impersonation_token): Ditto. - -2004-10-26 Christopher Faylor - - * cygtls.cc (_cygtls::fixup_after_fork): Wipe out exitsock local since - it should not be used by the child. - * select.cc (start_thread_socket): Turn off inheritance for exitsock. - Don't add exitsock to exception mask since it should never get an - exception. - (socket_cleanup): Change some debug messages for consistency. - * fhandler_socket.cc (fhandler_socket::dup): Change comment wording - slightly. - -2004-10-26 Pierre Humblet - - * registry.cc (get_registry_hive_path): Simplify and add a - debug_printf in case of failure. - (load_registry_hive): Revert the 2004-04-19 change. - -2004-10-20 Christopher Faylor - - * select.cc (start_thread_socket): Remove attempt to delay reading of - exitsock or suffer occasional mysterious 60 second hangs. - (socket_cleanup): Empty the exitsock here after the thread has - terminated. - -2004-10-19 Christopher Faylor - - * fhandler_console.cc (fhandler_console::fixup_after_exec): Fix error - message. - -2004-10-12 Christopher Faylor - - * select.cc (start_thread_socket): Remove unused code. - -2004-10-11 Christopher Faylor - - * fhandler_termios.cc (fhandler_termios::tcsetpgrp): Revert previous checkin. - -2004-10-10 Christopher Faylor - - * cygtls.h (exitsock): New element. - (exitsock_sin): Ditto. - * cygtls.cc (_cygtls::init_thread): Initialize exitsock to invalid handle. - (_cygtls::call2): Close exitsock if it is valid. - * select.cc (struct socketinf): Remove sin element. - (start_thread_socket): Initialize one SOCK_DGRAM socket per thread - instead of (apparently) expensive opening and closing of socket with - each select call. - (socket_cleanup): Send a byte to the exitsock socket as a way to - potentially signal a waiting-for-socket thread to exit. - * tlsoffsets.h: Regenerate. - -2004-10-07 Corinna Vinschen - - * cygheap.h (class cygheap_user): Add psystemroot member and - env_systemroot method. - * environ.cc (struct spenv): Add add_always member. - (spenvs): Accommodate new add_always member. Add - cygheap_user::env_systemroot method to SYSTEMROOT entry. - (build_env): Check add_always member when adding missing environment - variables from spenvs. - * uinfo.cc (cygheap_user::env_systemroot): New method. - -2004-10-07 Corinna Vinschen - - * dcrt0.cc (dll_crt0_0): Drop duplicated line. - -2004-10-07 Christopher Faylor - - * spawn.cc (pthread_cleanup::oldmask): Default to invalid signal mask. - (do_cleanup): Test for invalid signal mask to decide whether to restore - the mask rather than assuming zero mask indicates that there is nothing - to do. - -2004-10-07 Mark Paulus - - * fhandler_tty.cc (fhandler_tty_slave::read): Use previously - evaluated time_to_wait value. - -2004-10-05 Pierre Humblet - - * external.cc (check_ntsec): Do not call wincap.has_security. - * path.cc (path_conv::check): Ditto. - * security.cc (get_object_attribute): Ditto. - (get_file_attribute): Ditto. - -2004-10-05 Bas van Gompel - - * pinfo.cc (_pinfo::commune_send): Correct debugging output. - -2004-10-04 Christopher Faylor - - * include/cygwin/signal.h: Add siginterrupt definition. - -2004-10-02 Pierre Humblet - - * path.h (enum path_types): Delete PATH_ISDISK. - (path_conv::isdisk): Delete method. - (path_conv::set_isdisk): Ditto. - * path.cc (path_conv::check): Do not call set_isdisk. - * uinfo.cc(pwdgrp::load): Do not call pc.isdisk. - -2004-09-28 Christopher Faylor - - * fhandler_termios.cc (fhandler_termios::tcsetpgrp): Disallow attempts - to set the process group to a nonexistent process group. - -2004-09-27 Corinna Vinschen - - * lib/_cygwin_crt0_common.cc: Revert patch from 2004-09-16. Brakes - newly built DLLs. - -2004-09-24 Christopher Faylor - Sergey Ivanov - - * path.cc (mount_info::read_cygdrive_info_from_registry): Default - /cygdrive to binary mode. - -2004-09-22 Pierre Humblet - - * path.cc (normalize_win32_path): Only look for : in second position. - Avoid infinite loop with names starting in double dots. - (mount_info::conv_to_win32_path): Do not worry about a trailing dot. - (hash_path_name): Ditto. - -2004-09-20 Christopher Faylor - - * exceptions.cc (sig_handle_tty_stop): Set flag earlier. - -2004-09-20 Christopher Faylor - - * exceptions.cc (sig_handle_tty_stop): Set flag that we are in a cygwin - function to avoid a probably erroneous stack walk. - -2004-09-17 Corinna Vinschen - - * syscalls.cc (unlink): Don't use "delete on close" on remote shares. - -2004-09-17 Corinna Vinschen - - * cygwin.din (_impure_ptr): Add export again. There are libs out there. - -2004-09-16 Corinna Vinschen - - * cygwin.din (_impure_ptr): Don't export. - (reent_data): Export. - * lib/_cygwin_crt0_common.cc (_impure_ptr): Drop entirely. Don't - initialize _impure_ptr or u->impure_ptr_ptr. - -2004-09-15 Corinna Vinschen - - * cygwin.din (_impure_ptr): Export. - (reent_data): Don't export. - * dcrt0.cc (reent_data): Drop. - (__cygwin_user_data): Initialize impure_ptr as GLOBAL_REENT. - (_dll_crt0): Initialize _impure_ptr as GLOBAL_REENT. - * lib/_cygwin_crt0_common.cc (_impure_ptr): Drop. Declare extern as - dllimport instead. - -2004-09-14 Christopher Faylor - - * cygtls.h: Add alignment kludge to fix disparity between compilers. - * tlsoffsets.h: Regenerate. - - * fork.cc (slow_pid_reuse): Use define to control number of pids held - to prevent pid reuse. - -2004-09-14 Sam Steingold - - * autoload.cc (EnumProcessModules): Add. - * dlfcn.cc (dlsym): Handle RTLD_DEFAULT using EnumProcessModules(). - * include/dlfcn.h (RTLD_DEFAULT): Define to NULL. - -2004-09-13 Christopher Faylor - - * fork.cc (slow_pid_reuse): Temporarily double the number of pids held - to prevent pid reuse. - -2004-09-12 Christopher Faylor - - * sigproc.cc (wait_sig): Ensure that waiting threads are awoken after - returning from a hold condition. - -2004-09-12 Christopher Faylor - - * child_info.h (CURR_CHILD_INFO_MAGIC): Update. - -2004-09-11 Pierre Humblet - Christopher Faylor - - * exceptions.cc: (ctrl_c_handler): Do nothing while a Cygwin subprocess - is starting. - -2004-09-10 Christopher Faylor - - * child_info.h (init_child_info): Remove pid argument from declaration. - * cygheap.h (init_cygheap::pid): New element. - * dcrt0.cc (dll_crt0_0): Eliminate handling of now-noexistent cygpid - parameter in child_info struct. Set forkee to 'true' rather than - cygpid since the pid value was never used. - (dll_crt0_1): Ditto. - (_dll_crt0): Ditto. - * fork.cc (fork_child): Don't wait for sigthread. This is handled in - the fork call now. - (fork_parent): Remove obsolete pid argument from init_child_info call. - Don't do anything special with cygpid when DEBUGGING. - (fork): Delay all signals during fork. - (fork_init): Don't do anything special when DEBUGGING. - * pinfo.cc (set_myself): Remove pid parameter. Use new pid field in - cygheap. - (pinfo_init): Don't pass pid argument to set_myself. - * sigproc.cc (sig_send): Wait for dwProcessId to be non-zero as well as - sendsig. - (init_child_info): Eliminate handling of pid. - (wait_sig): Implement method to temporarily hold off sending signals. - * sigproc.h (__SIGHOLD): New enum. - (__SIGNOHOLD): Ditto. - * spawn.cc (spawn_guts): Remove obsolete pid argument from - init_child_info call. - -2004-09-10 Corinna Vinschen - - * fhandler.cc (fhandler_base::dup): Use debug_printf. - -2004-09-10 Corinna Vinschen - - * Makefile.in: Create libutil.a from bsdlib.o exports. - * bsdlib.cc (logwtmp): Move from syscalls.cc to here. - (login): Ditto. - (logout): Ditto. - - * winsup.h (EXPORT_ALIAS): New macro. - * exec.cc: Define alias symbols using EXPORT_ALIAS macro. - * syscalls.cc: Ditto. - * times.cc: Ditto. - -2004-09-09 Corinna Vinschen - - * fhandler_tape.cc (fhandler_dev_tape::open): Fix typo. - -2004-09-09 Bas van Gompel - - * pipe.cc (create_selectable_pipe): Work around bug in Windows 95 - where CreateNamedPipe returns NULL. - -2004-09-08 Pierre Humblet - - * cygheap.h (cwdstuff::drive_length): New member. - (cwdstuff::get_drive): New method. - * path.cc (normalize_win32_path): Simplify by using cwdstuff::get_drive. - (mount_info::conv_to_win32_path): Use cwdstuff::get_drive as default for /. - (cwdstuff::set): Initialize drive_length. - -2004-09-07 Christopher Faylor - - * cygtls.cc (_cygtls::init_thread): Set __sdidinit to negative value to - indicate that it is "special". - * thread.cc (pthread::exit): If __sdidinit is < 0, it was never really - initialized so reset it to 0 before calling _reclaim_reent. - -2004-09-05 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 12. - -2004-09-03 Corinna Vinschen - - * security.cc: Fix a few more strace_prints. - -2004-09-02 Christopher Faylor - - Regularize most strace_prints throughout so that %E is always preceded - by a comma and elminate most uses of "foo = %s" to "foo %s". - -2004-09-02 Bob Byrnes - Christopher Faylor - - * autoload.cc (NtQueryInformationFile): Return nonzero on error. - * ntdll.h (FILE_PIPE_LOCAL_INFORMATION): Add. - (NtQueryInformationFile): Fix types for last two arguments. - * pipe.cc: Include stdlib.h, limits.h, and ntdll.h. - (create_selectable_pipe): New function to create a pipe that can be - used with NtQueryInformationFile for select. - (fhandler_pipe::create): Call create_selectable_pipe instead of - CreatePipe. - (pipe): Use DEFAULT_PIPEBUFSIZE as argument to create_pipe. - * select.cc: Include limits.h and ntdll.h. - (peek_pipe): Add select_printf output. Call NtQueryInformationFile to - implement select for write on pipes. - (fhandler_pipe::select_read): Reorder field assignments to be - consistent with fhandler_pipe::select_write. - (fhandler_pipe::select_write): Initialize startup, verify, cleanup, and - write_ready fields for select_record. - (fhandler_pipe::select_except): Tweak indentation to be consistent with - fhandler_pipe::select_write. - -2004-08-30 Pierre Humblet - - * fork.cc (fork_parent): Return the cygpid directly derived from the - winpid. - -2004-08-30 Christopher Faylor - - * fork.cc (fork_parent): Record child's pid when we're sure that it has - been filled out by the child. - * pinfo.cc (pinfo::init): Trivial change. - -2004-08-29 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::fchmod): Allow to report - success on systems with ntsec and ntea set. - -2004-08-28 Pierre Humblet - - * fhandler.cc (fhandler_base::write): In the lseek_bug case, set EOF - before zero filling. Combine similar error handling statements. - -2004-08-28 Pierre Humblet - - * syscalls.cc (ftruncate64): On 9x, call write with a zero length - to zero fill when the file is extended. - -2004-08-24 Corinna Vinschen - - * syscalls.cc (link): Avoid compiler warning. - -2004-08-21 Corinna Vinschen - - * environ.cc (set_ntea): New function. - (set_ntsec): Ditto. - (set_smbntsec): Ditto. - (parse_thing): Change ntea, ntsec and smbntsec settings to call - appropriate functions. - -2004-08-20 Corinna Vinschen - - * fhandler_tape.cc (fhandler_dev_tape::raw_read): Use ?: instead of - if/else. - (fhandler_dev_tape::raw_write): Return -1 in case of error. - -2004-08-19 Corinna Vinschen - - * errno.cc (_sys_errlist): Change various text to their english Linux - counterparts. Unify layout. - (strerror): Remove switch statement. - -2004-08-19 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Set shared flags to 0 when - opening a tape device. - -2004-08-19 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::dup): Increment dtable's - need_fixup_before counter on successful dup. - * net.cc (cygwin_getpeername): Add file descriptor to debug output. - -2004-08-17 Pierre Humblet - - * fhandler.h (fhandler_dev_dsp:~fhandler_dev_dsp): Delete. - (fhandler_dev_dsp::open_count): Delete. - (fhandler_dev_dsp::close_audio_in): New method declaration. - (fhandler_dev_dsp::close_audio_in): Ditto. - * fhandler_dsp.cc: Add and edit debug_printf throughout. - (fhandler_dev_dsp::Audio::denyAccess): Delete. - (fhandler_dev_dsp::Audio::fork_fixup): Ditto. - (fhandler_dev_dsp::Audio::getOwner): Ditto. - (fhandler_dev_dsp::Audio::clearOwner): Ditto. - (fhandler_dev_dsp::Audio::owner_): Ditto. - (fhandler_dev_dsp::Audio::setformat): Ditto, rename to setconvert. - (fhandler_dev_dsp::Audio::lock): Ditto, move to queue. - (fhandler_dev_dsp::Audio::unlock): Ditto. - (fhandler_dev_dsp::Audio::lock_): Ditto. - (fhandler_dev_dsp::Audio::bufferIndex_): New member, from Audio_out - and Audio_in. - (fhandler_dev_dsp::Audio::pHdr_): Ditto. - (fhandler_dev_dsp::Audio::wavehdr_): Ditto. - (fhandler_dev_dsp::Audio::bigwavebuffer_): ditto. - (fhandler_dev_dsp::Audio::Qisr2app_): Ditto. - (fhandler_dev_dsp::Audio::setconvert): New method, from old setformat. - (fhandler_dev_dsp::Audio::queue::lock): New method. - (fhandler_dev_dsp::Audio::queue::unlock): Ditto. - (fhandler_dev_dsp::Audio::queue::dellock): Ditto. - (fhandler_dev_dsp::Audio::queue::isvalid): Ditto. - (fhandler_dev_dsp::Audio::queue::lock_): New member. - (fhandler_dev_dsp::Audio::queue::depth1_): Delete. - (fhandler_dev_dsp::Audio_out::fork_fixup): New method. - (fhandler_dev_dsp::Audio_out::isvalid): New method. - (fhandler_dev_dsp::Audio_out::start): Remove arguments. - (fhandler_dev_dsp::Audio_out::parsewav): Change arguments and set - internal state. - (fhandler_dev_dsp::Audio_out::emptyblocks): Delete. - (fhandler_dev_dsp::Audio_out::Qapp2app_): Ditto. - (fhandler_dev_dsp::Audio_out::Qisr2app_): Ditto, move to Audio. - (fhandler_dev_dsp::Audio_out::bufferIndex_): Ditto. - (fhandler_dev_dsp::Audio_out::pHdr_): Ditto. - (fhandler_dev_dsp::Audio_out::wavehdr_): Ditto. - (fhandler_dev_dsp::Audio_out::bigwavefuffer_): Ditto. - (fhandler_dev_dsp::Audio_out::freq_): New member. - (fhandler_dev_dsp::Audio_out::bits_): New member. - (fhandler_dev_dsp::Audio_out::channels_): New member. - (fhandler_dev_dsp::Audio_in::fork_fixup): New method. - (fhandler_dev_dsp::Audio_in::isvalid): New method. - (fhandler_dev_dsp::Audio_in::Qapp2app_): Delete. - (fhandler_dev_dsp::Audio_in::Qisr2app_): Ditto, move to Audio. - (fhandler_dev_dsp::Audio_in::bufferIndex_): Ditto. - (fhandler_dev_dsp::Audio_in::pHdr_): Ditto. - (fhandler_dev_dsp::Audio_in::wavehdr_): Ditto. - (fhandler_dev_dsp::Audio_in::bigwavefuffer_): Ditto. - (fhandler_dev_dsp::Audio::queue::queue): Simplify. - (fhandler_dev_dsp::Audio::queue::send): Use lock. - (fhandler_dev_dsp::Audio::queue::query): Do not use depth1_. - (fhandler_dev_dsp::Audio::queue::recv): Ditto. - (fhandler_dev_dsp::Audio::Audio): Adapt to new class members. - (fhandler_dev_dsp::Audio::~Audio): Ditto - (fhandler_dev_dsp::Audio_out::start): Reorganize. - (fhandler_dev_dsp::Audio_out::stop): Simplify. - (fhandler_dev_dsp::Audio_out::init): Reset the queue and clear flag. - (fhandler_dev_dsp::Audio_out::write): Reorganize to allocate audio_out. - (fhandler_dev_dsp::Audio_out::buf_info): Use appropriate block size. - (fhandler_dev_dsp::Audio_out::callback_sampledone): Do not use lock. - (fhandler_dev_dsp::Audio_out::waitforspace): Simplify. - (fhandler_dev_dsp::Audio_out::waitforallsent):Ditto. - (fhandler_dev_dsp::Audio_out::sendcurrent): Reorganize. - Clear flag before requeuing. - (fhandler_dev_dsp::Audio_out::parsewav): - (fhandler_dev_dsp::Audio_in::start): Reorganize. - (fhandler_dev_dsp::Audio_in::stop): Simplify. - (fhandler_dev_dsp::Audio_in::queueblock): Ditto. - Requeue header in case of error. - (fhandler_dev_dsp::Audio_in::init): Reset the queue and clear flag. - (fhandler_dev_dsp::Audio_in::waitfordata): Simplify. - Do not UnprepareHeader if the flag is zero. - (fhandler_dev_dsp::Audio_in::buf_info): Ditto. - (fhandler_dev_dsp::Audio_in::callback_blockfull): Do not use lock. - (fhandler_dev_dsp::open_count): Delete. - (fhandler_dev_dsp::open): Only check existence, do not allocate - anything. Set flags appropriately. Create archetype. - (fhandler_dev_dsp::write): Call archetype as needed. Create audio_out. - (fhandler_dev_dsp::read): Call archetype as needed. Create audio_in. - (fhandler_dev_dsp::close): Call archetype as needed. - Call close_audio_in and close_audio_out. - (fhandler_dev_dsp::close_audio_in): New function. - (fhandler_dev_dsp::close_audio_out): New function. - (fhandler_dev_dsp::dup): Use archetypes. - (fhandler_dev_dsp::ioctl): Call archetype as needed. Reorganize for - new structures. - (fhandler_dev_dsp::fixup_after_fork): Call archetype as needed. - (fhandler_dev_dsp::fixup_after_exec): Call archetype as needed. - Clear audio_in and audio_out. - -2004-08-14 Pierre Humblet - - * fhandler.cc (fhandler_base::open_9x): Set file attributes - for new files. - -2004-08-11 Christopher Faylor - - * net.cc (cygwin_gethostbyname): Show failing host name on error. - -2004-08-10 Christopher Faylor - - * select.cc (select_stuff::wait): Correctly check for w4 array bounds. - -2004-08-03 Corinna Vinschen - - * errno.cc (errmap): Add ERROR_TOO_MANY_LINKS -> EMLINK mapping. - * syscalls.cc (link): Only copy files if FS doesn't support hard links. - -2004-07-26 Christopher January - - * fhandler_proc.cc (format_proc_cpuinfo): Remove Intel-specific flags - from /proc/cpuinfo on non-Intel processors. Added new AMD-specific - flags. Changed Intel flag names to match Linux. - -2004-07-24 Christopher Faylor - - * dcrt0.cc (dll_crt0_0): Use proper boolean arguments. - * pinfo.cc (pinfo::init): Don't consider MapViewOfFileEx error to be - fatal if exiting. - * pinfo.h (pinfo::init): Eliminate default argument and supply the - argument in the one case that needed it. - -2004-07-24 Corinna Vinschen - Christopher Faylor - - * autoload.cc (GetNativeSystemInfo): Add. - (IsWow64Process): Add. - * init.cc (respawn_wow64_process): New function. - (dll_entry): If process has been started from a 64 bit - process, call respawn_wow64_process. - * uname.cc (uname): On 64 bit systems, use GetNativeSystemInfo. - Show actual CPU type. - -2004-07-23 Corinna Vinschen - - * dtable.cc (dtable::get_debugger_info): Make stderr r/w according - to SUSv3. - -2004-07-22 Corinna Vinschen - - * fhandler_tty.cc (fhandler_tty_slave::open): Use requested flag - values also when copying fhandler from archetype. - -2004-07-22 Christopher Faylor - - * pinfo.cc (pinfo::init): Print handle in hex when MapViewOfFile fails. - -2004-07-20 Corinna Vinschen - - * shm.cc: Whitespace fixes. - -2004-07-20 Christopher Faylor - - * Makefile.in (clean): Remove cygwin.def since it is autogenerated. - -2004-07-19 Corinna Vinschen - - * fhandler_dsp.cc (fhandler_dev_dsp::Audio_out::init): Fix non-ISO - expression. - * fhandler_floppy.cc (fhandler_dev_floppy::open): Remove unused - variable. - * fhandler_proc.cc (format_proc_meminfo): Fix compiler warning. - -2004-07-16 Christopher Faylor - - * pinfo.cc (pinfo::init): Guard against MapViewOfFileEx failure. - -2004-07-15 Corinna Vinschen - - * mmap.cc (mmap_record::alloc_page_map): Mark pages as allocated even - on Windows 9x, FWIW. - -2004-07-15 Corinna Vinschen - - * mmap.cc (mprotect): When MAP_WRITE protection is requested, use - READWRITE or WRITECOPY protection, whatever has been used when the - page has been allocated initially. - -2004-07-15 Corinna Vinschen - - * fhandler.h (class fhandler_dev_raw): Remove is_writing flag. - Remove declaration of writebuf. - (class fhandler_dev_floppy): Remove declaration of close. - * fhandler_floppy.cc (fhandler_dev_floppy::close): Delete. - (fhandler_dev_floppy::lseek): Remove calls to writebuf. Set - eom_detected to false after successful seek. - * fhandler_raw.cc (fhandler_dev_raw::writebuf): Delete. - (fhandler_dev_raw::raw_read): Remove calls to writebuf. - (fhandler_dev_raw::raw_write): Always invalidate buffer. - -2004-07-15 Corinna Vinschen - - * mmap.cc (class mmap_record): Fix return type of get_offset. - (mmap_record::fixup_page_map): Fix off by one error. - (list::search_record): Use long as type of "start" argument in both, - declaration and definition. Use long as type for local variable "i". - -2004-07-14 Dave Korn - - * fhandler_registry.cc (registry_listing): Correct typo. - (fhandler_registry::fill_filebuf): Set size of newly expanded buffer - prior to calling RegQueryValueEx. - -2004-07-14 Corinna Vinschen - - * fhandler_raw.cc (fhandler_dev_raw::raw_write): Remove buffered - write entirely. - -2004-07-07 Corinna Vinschen - - * spawn.cc (spawn_guts): Check if script is executable. - -2004-06-30 Corinna Vinschen - - * times.cc (hires_ms::usecs): Don't overreact. - -2004-06-30 Corinna Vinschen - - * times.cc (hires_ms::usecs): Reinit timer when system time overflows. - -2004-06-27 Christopher Faylor - - * thread.cc (__cygwin_lock_lock): Don't bother locking when there is - only one known thread. - (__cygwin_lock_unlock): Ditto for unlocking. - -2004-06-23 Tomas Ukkonen - - * fhandler_proc.cc (format_proc_cpuinfo): Test CPU vendor and print - AMD specific 3dnow capabilities. - -2004-06-23 Pierre Humblet - - * fhandler_socket.cc (fhandler_socket::release): Call - WSASetLastError last. - -2004-06-21 Christopher Faylor - - * autoload.cc (wsock_init): Keep lock while modifying return address. - -2004-06-17 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Remove 9x specific code. - -2004-06-17 Pierre Humblet - - * fhandler.cc (fhandler_base::open_9x): Do not check for null name. - Move debug_printf to common code line. - (fhandler_base::open): Ditto. Initialize upath. Remove second argument - of pc.get_nt_native_path. - * path.h (path_conv::get_nt_native_path): Remove second argument. - * path.cc (path_conv::get_nt_native_path): Ditto. Call str2uni_cat. - * security.h (str2buf2uni_cat): Delete declaration. - (str2uni_cat): New declaration. - * security.cc (str2buf2uni): Get length from sys_mbstowcs call. - (str2buf2uni_cat): Delete function. - (str2uni_cat): New function. - * miscfuncs.cc (sys_mbstowcs): Add debug_printf. - -2004-06-17 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Substitute FILE_SUPERSEDE with - FILE_OVERWRITE_IF. - -2004-06-09 Christopher Faylor - - * include/cygwin/version.h: REALLY bump dll minor version to 11. - -2004-06-08 Egor Duda - - * include/cygwin/ipc.h: Make IPC_INFO visible only for ipc system - utilities, to make it consistent with declaration of struct seminfo. - -2004-06-08 Pierre Humblet - - * path.cc (fchdir): Pass the Posix path to chdir. - -2004-06-07 Christopher Faylor - - * dtable.cc (dtable::find_fifo): Release lock after fifo found (still - racy). - * fhandler.h (fhandler_fifo::get_io_handle): New fifo-specific method. - * fhandler_fifo.cc (fhandler_fifo::close): Close output_handle only if - it is open. - (fhandler_fifo::open_not_mine): Reorganize slightly. Don't call _pinfo - methods when the fifo is owned by me or suffer dtable lock_cs deadlock. - (fhandler_fifo::open): Call open_not_mine first, otherwise open myself - (racy). - * pinfo.cc (_pinfo::commune_recv): Duplicate fifo handles here in - requesting processes arena to avoid one potential race (of many). - (_pinfo::commune_send): Move all PICOM_FIFO code under one case - statement. - - * thread.cc (pthread::init_mainthread) Use existing hMainProc handle - rather than calling GetCurrentProcess. - -2004-06-04 Christopher Faylor - - * winbase.h (ilockincr): Add more neverending changes from the - inexplicable world of gcc asm constraint magic. Should stop random - crashes. - (ilockdecr): Ditto. - -2004-06-03 Christopher Faylor - - * autoload.cc (IsDosDeviceName_U): Define. - * ntdll.h (IsDosDeviceName_U): Declare. - * fhandler.cc (fhandler_base::open): Check to see if win32_name is a - dos device and just call the 9x open if so. - -2004-06-03 Christopher Faylor - - * winbase.h (ilockincr): More changes from the inexplicable world of - gcc asm magic. - (ilockdecr): Ditto. - -2004-06-03 Christopher Faylor - - * winbase.h (ilockincr): YA correction to ensure correct operation with - no optimization. - (ilockdecr): Ditto. - -2004-06-03 Corinna Vinschen - - * cygserver.h (CYGWIN_SERVER_VERSION_API): Bump. - -2004-06-03 Corinna Vinschen - - * include/cygwin/ipc.h (IPC_KEY_IS_SHMID): Redefine to a more sensible - value. - -2004-06-02 Christopher Faylor - - * cygheap.cc (cmalloc): Add debugging hook. - -2004-06-02 Christophe Jaillet - - * spawn.cc (find_exec): Use has_slash to determine if path has a slash - rather than calculating this twice. - -2004-05-30 Pierre Humblet - - * path.cc (mount_info::add_item): Make sure native path has drive - or UNC form. Call normalize_xxx_path instead of [back]slashify. - Remove test for double slashes. Reorganize to always debug_print. - -2004-05-28 Pierre Humblet - - * fhandler_disk_file.cc (fhandler_disk_file::fchmod): Only try to open - the file if it uses an acl. - -2004-05-28 Pierre Humblet - - * path.cc (chdir): Always use the normalized_path as posix_cwd, except - if it starts with a drive. - -2004-05-25 Christopher Faylor - - * winbase.h: Semi-revert previous patch as it caused strange behavior. - Use syntax similar to that recommended in mingw-dvlpr. - -2004-05-25 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 11. - -2004-05-25 Christopher Faylor - - * winbase.h: Add proper attributions for memory operands throughout. - -2004-05-24 Christopher Faylor - - * include/cygwin/version.h: Bump api minor version number. - -2004-05-24 Christopher Faylor - - * cygwin.din: Export atoll. - -2004-05-20 Christopher Faylor - - * tty.cc (tty_list::allocate_tty): Leave tty_mutex armed on successful - return from !with_console - * fhandler_tty.cc (fhandler_pty_master::open): Release tty_mutex here - after all initialization is done. - -2004-05-17 Corinna Vinschen - - * grp.cc (getgrgid_r): Replace struct group by struct __group32 in - argument definition. - (getgrnam_r): Ditto. - -2004-05-17 Corinna Vinschen - - * cygwin.din: Add symbols flockfile, ftrylockfile, funlockfile, - getgrgid_r, getgrnam_r and getlogin_r. - * grp.cc (getgrgid_r): New function. - (getgrnam_r): Ditto. - * syscalls.cc (flockfile): Ditto. - (ftrylockfile): Ditto. - (funlockfile): Ditto. - * sysconf.cc (sysconf): Return LOGIN_NAME_MAX in case of - _SC_LOGIN_NAME_MAX. - * thread.cc (__cygwin_lock_trylock): Define int. Return value from - call to pthread_mutex_trylock. - * uinfo.cc (getlogin_r): New function. - * include/limits.h: Define LOGIN_NAME_MAX. - * include/cygwin/version.h: Bump API minor number. - * include/sys/lock.h: Add declarations for __cygwin_lock_xxx functions. - * include/sys/stdio.h: Add define for _ftrylockfile. - -2004-05-17 Christopher Faylor - - * tty.cc (tty_list::init): Move hmaster initialization earlier to - prevent compilation error. - -2004-05-17 Christopher Faylor - - Change the name "title_mutex" to "tty_mutex" throughout. - * tty.h (tty_list::allocate_tty): Turn argument into a boolean. - * tty.cc (tty_list::init): Protect entire allocation operation with - tty_mutex (formerly title_mutex) to protect against allocation races. - -2004-05-16 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::recvfrom): Use original flags - value in each WSARecvFrom call. - (fhandler_socket::recvmsg): Ditto. Reformat slightly. - -2004-05-15 Christopher Faylor - - * cygthread.cc (cygthread::is): Eliminate. - * cygthread.h (cygthread::is): Eliminate declaratin. - * fhandler_console.cc (fhandler_console::read): Only wait for - signal_arrived in the main thread. - * fhandler_socket.cc: Include new "wininfo.h". - (fhandler_socket::ioctl): Use 'winmsg' rather than 'gethwnd()'. - * sync.cc (muto::grab): Define new function. - (muto::acquire): Use tls pointer rather than tid. - (muto::acquired): Ditto. - (muto::reset): Delete. - (muto::release): Ditto. Also implement "close on last release". - * sync.h (muto::tid): Delete. - (muto::tls): New field. - (muto::ismine): Delete. - (muto::owner): Delete. - (muto::unstable): Delete. - (muto::reset): Delete. - (muto::upforgrabs): New method. - (muto::grab): Ditto. - (new_muto_name): New define. - * wininfo.h: New file. - (wininfo): New class. - * window.cc: Rework throughout to use winfo class for controlling - invisible window operation. - (gethwnd): Delete definition. - * winsup.h (gethwnd): Delete declaration. - -2004-05-15 Christopher Faylor - - * cygheap.h: Remove some parameter names from declarations throughout. - (cygheap::set): Reflect changes in declaration for arguments and return - value from previous checkin. - -2004-05-15 Pierre Humblet - - * cygheap.h (cwdstuff::set): Modify return value and arguments. - * path.cc (chdir): Specify PC_POSIX. Do not call SetCurrentDirectory. - Set posix_cwd in a way that does not break find.exe. Change call to - cwd.set. - (cwdstuff::get_initial): Do not call GetCurrentDirectory here. - (cwdstuff::set): Call SetCurrentDirectory and GetCurrentDirectory as - needed. - -2004-05-12 Corinna Vinschen - - * path.cc (path_conv::check): Don't bail out with error if path is "//". - -2004-05-12 Corinna Vinschen - - * cygheap.h (struct init_cygheap): Add mt_h member. - * fhandler_tape.cc (mt_h): Drop in favor of cygheap based handle. - (mtinfo_init): Use cygheap->mt_h handle. Protect it. - -2004-05-12 Pierre Humblet - - * tty.h: Remove the %d or %x from all cygtty strings. - (tty::open_output_mutex): Only declare. - (tty::open_input_mutex): Ditto. - (tty::open_mutex): New definition. - * fhandler_tty.cc (fhandler_tty_slave::open): Declare buf with - size CYG_MAX_PATH and replace __small_printf calls by shared_name. - * tty.cc (tty::create_inuse): Ditto. - (tty::get_event): Ditto. - (tty::common_init): Ditto. - (tty::open_output_mutex): New method definition. - (tty::open_input_mutex): Ditto. - (tty::open_mutex): New method. - -2004-05-11 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Set file attributes to correct - value when creating files. - * path.h (class path_conv): Add write accessor for file_attributes. - -2004-05-10 Corinna Vinschen - - * fhandler.h (class fhandler_socket): Add "owner" status flag. - * fhandler_socket.cc (wait): Take flag parameter to take FD_OOB into - account. Don't wait infinitely. - (fhandler_socket::recvfrom): Also wait for FD_OOB if socket owner. - (fhandler_socket::recvmsg): Ditto. - (fhandler_socket::sendto): Ditto. - (fhandler_socket::sendmsg): Ditto. - (fhandler_socket::fcntl): Set owner status flag if F_SETOWN with own - pid is called. - -2004-05-09 Pierre Humblet - - * environ.cc (build_env): Only try to construct required-but-missing - variables while issetuid. - -2004-05-08 Pierre Humblet - Christopher Faylor - - * syscalls.cc: Include environ.h. - (chroot): Set errno in case of path error. Call getwinenv. - * environ.cc: Remove the NO_COPY attribute of conv_envvars. - -2004-05-07 Corinna Vinschen - - * fhandler_mem.cc (fhandler_dev_mem::fhandler_dev_mem): Move - initialization of "mem_size" from here... - (fhandler_dev_mem::open): ...to here. Fix typo in FH_PORT case. - -2004-05-07 Gerd Spalink - - * fhandler_dsp.cc (fhandler_dev_dsp::Audio_out::stop): Move delete of - bigwavebuffer_ so that it is always cleaned, also in child processes. - (fhandler_dev_dsp::Audio_in::stop): Ditto. - (fhandler_dev_dsp::close): Stop audio play immediately in case of - abnormal exit. - -2004-05-07 Corinna Vinschen - - Revert code reversion from 2004-04-03. So, revert to async I/O again. - * fhandler.h (status): Add "closed" flag. - (prepare): New method declaration. - (wait): Ditto. - (release): Ditto. - * fhandler_socket.cc: Don't include wsock_event.h. - (fhandler_socket::prepare): New method, moved from wsock_event. - (fhandler_socket::wait): Ditto. - (fhandler_socket::release): New method. - (fhandler_socket::recvfrom): Simplify loop. - (fhandler_socket::recvmsg): Ditto. - (fhandler_socket::sendto): Ditto. - (fhandler_socket::sendmsg): Ditto. - * net.cc: Don't include wsock_event.h. - (wsock_event::prepare): Remove. - (wsock_event::wait): Ditto. - * wsock_event.h: Remove. - -2004-05-06 Christopher Faylor - - * thread.cc (pthread::create): Move postcreate call to avoid a - potential race. - (pthread::cancelable_wait): Don't allow signal interrupt unless main - thread. - -2004-05-07 Pierre Humblet - Christopher Faylor - - * path.cc (mount_info::conv_to_posix_path): Return proper status when - chrooted. - -2004-05-06 Pierre Humblet - - * path.cc (path_conv::check): Strip trailing dots and spaces and - return error if the final component had only dots and spaces. - (normalize_posix_path): Revert 2004-04-30. - (chdir): Do not check for trailing spaces. Do not set native_dir - to c:\ for virtual devices. Pass only native_dir to cwd.set. - (cwdstuff::set): Assume posix_cwd is already normalized. - -2004-05-04 Christopher Faylor - - * path.cc (normalize_win32_path): Detect components with only dots. - Remove a final . if it follows '\\'. - (mount_info::conv_to_win32_path): Only backslashify the path when no - mount is found. - (chdir): Do not look for components with only dots. - -2004-05-04 Pierre Humblet - Christopher Faylor - - * path.cc (is_unc_share): Remove redundant tests. - -2004-05-04 Corinna Vinschen - - * crt0.o (mainCRTStartup): 16 byte align stack for main function. - -2004-05-04 Corinna Vinschen - - * path.cc (check_sysfile): Don't scan string twice. - -2004-05-03 Corinna Vinschen - - * dir.cc (writable_directory): Remove. - (mkdir): Remove call to writable_directory. - * syscalls.cc (unlink): Ditto. - (rename): Ditto. - * winsup.h (writable_directory): Remove declaration. - -2004-04-30 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Call path_conv::get_nt_native_path - for evaluating NT path. - * path.cc (normalize_posix_path): Remove trailing dots and spaces. - (path_conv::get_nt_native_path): New function. - * path.h (class path_conv): Declare get_nt_native_path method. - -2004-04-30 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Fix NT native path evaluation - to allow opening serial ports. - -2004-04-30 DJ Delorie - - * init.cc (threadfunc_fe): Hack to make thread stacks always 16 - byte aligned. - -2004-04-21 Yitzchak Scott-Thoennes - - * syscalls.cc (lseek64): Fix debug_printf format string. - (truncate64): Ditto. - -2004-04-21 Corinna Vinschen - - * fhandler.cc (fhandler_base::lseek): Force res to -1 on error. - -2004-04-20 Christopher Faylor - - * path.cc (is_unc_share): Rename from slash_unc_prefix_p throughout. - -2004-04-20 Pierre Humblet - - * path.cc (normalize_posix_path): Process all Posix paths and map three - or more initial slashes to a single one. Simplify processing following - two initial slashes. - (normalize_win32_path): Make last argument non-optional and do not - check for NULL value. - -2004-04-20 Pierre Humblet - - * fhandler_disk_file.cc (fhandler_base::open_fs): Change - set_file_attribute call to indicate that NT security isn't used. - (fhandler_disk_file::fchmod): Rearrange to isolate 9x related - statements. - Do not set FILE_ATTRIBUTE_SYSTEM. - (fhandler_disk_file::fchown): Check noop case first. - * fhandler.cc (fhandler_base::open9x): Remove ntsec related statements. - (fhandler_base::set_name): Do not set namehash. - * fhandler.h (fhandler_base::get_namehash): Compute and set namehash if - needed. - * syscalls.cc (access): Verify that fh is not NULL. Do not set PC_FULL. - (chmod): Ditto. - (chown_worker): Ditto. - (stat_worker): Ditto. Verify if the path exists. - -2004-04-20 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Remove special DEV_FLOPPY_MAJOR - treatment. - * fhandler_raw.cc (fhandler_dev_raw::open): Simplify write-only case. - * fhandler_tape.cc (fhandler_dev_tape::raw_write): Add accidentally - dropped condition. - -2004-04-20 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Add FILE_READ_ATTRIBUTES when - only GENERIC_WRITE access is requested. - -2004-04-19 Corinna Vinschen - - * include/cygwin/mtio.h (GMT_ASYNC): New define. - (MT_ST_ASYNC_WRITES): Remove "Not supported" comment. - -2004-04-19 Corinna Vinschen - - * errno.cc (errmap): Handle ERROR_IO_PENDING. - * fhandler.cc (fhandler_base::open): Make tape I/O asynchronous. - * fhandler.h (class fhandler_dev_tape): Add mt_evt member. - * fhandler_tape.cc (mtinfo_drive::initialize): Initialize async_writes. - (mtinfo_drive::close): Handle async writes. - (mtinfo_drive::read): Add mt_evt parameter. Use overlapped I/O. - (mtinfo_drive::async_wait): New function. - (mtinfo_drive::write): Add mt_evt parameter. Use overlapped I/O. - Handle async writes. - (mtinfo_drive::_set_pos): Handle async writes. - (mtinfo_drive::set_partition): Ditto. - (mtinfo_drive::prepare): Ditto. - (mtinfo_drive::get_status): Drop useless "else". Handle async_writes - flag. - (mtinfo_drive::set_options): Handle async_writes flags. - (fhandler_dev_tape::close): Close mt_evt handle. - (fhandler_dev_tape::raw_read): Create mt_evt handle and use in call - to mtinfo_drive::read. - (fhandler_dev_tape::raw_write): Create mt_evt handle and use in call - to mtinfo_drive::write. - * mtinfo.h (MTINFO_VERSION): Bump. - (enum dirty_state): Add async_write_pending state. - (class mtinfo_drive): Add OVERLAPPED struct "ov". Add async_writes - flag. - (mtinfo_drive::async_wait): Add declaration. - (mtinfo_drive::read): Add mt_evt parameter. - (mtinfo_drive::write): Ditto. - - * registry.cc (load_registry_hive): Call enable_restore_privilege - instead of set_process_privilege. - -2004-04-19 Corinna Vinschen - - * fhandler_tape.cc (mtinfo_drive::_set_pos): Take additional dont_wait - parameter. Use in call to SetTapePosition. - (mtinfo_drive::set_pos): Accommodate _set_pos calls to above change. - (mtinfo_drive::set_partition): Ditto. - * mtinfo.h (mtinfo_drive::_set_pos): Change declaration accordingly. - -2004-04-16 Corinna Vinschen - - * autoload.cc (NtCreateFile): Add. - * dir.cc (mkdir): Change set_file_attribute call to indicate that - NT security isn't used. - * fhandler.cc (fhandler_base::open_9x): New method, created from - fhandler_base::open. - (fhandler_base::open): Rearrange to use NtCreateFile instead of - CreateFile. - * fhandler.h (enum query_state): Redefine query_null_access to - query_stat_control. query_null_access isn't allowed in NtCreateFile. - (fhandler_base::open_9x): Declare. - * fhandler_disk_file.cc (fhandler_base::fstat_fs): Use - query_stat_control first, query_read_control if that fails. - (fhandler_disk_file::fchmod): Call enable_restore_privilege before - trying to open for query_write_control. Don't fall back to - opening for query_read_control. - (fhandler_disk_file::fchown): Ditto. - (fhandler_disk_file::facl): Only request restore privilege and query - access necessary for given cmd. - * fhandler_raw.cc (fhandler_dev_raw::open): Call fhandler_base::open - instead of opening device here. - * ntdll.h (NtCreateFile): Declare. - * path.cc (symlink_worker): Change set_file_attribute call to indicate - that NT security isn't used. - * sec_acl.cc (getacl): Fix bracketing. - * sec_helper.cc (enable_restore_privilege): New function. - * security.cc (str2buf2uni_cat): New function. - (write_sd): Don't request restore permission here. - * security.h (set_process_privileges): Drop stale declaration. - (str2buf2uni): Declare. - (str2buf2uni_cat): Declare. - (enable_restore_privilege): Declare. - * syscalls.cc (fchown32): Return immediate success on 9x. - -2004-04-15 Christopher Faylor - - * autoload.cc (dll_chain1): Rename to dll_chain. Remove old dll_chain - code. - (wsock_init): Avoid unneeded winsock_active tests. - * winsup.h (winsock_active): Delete. - -2004-04-15 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::fchmod): Try opening - in query_read mode if query_write fails. - * fhandler_disk_file.cc (fhandler_disk_file::fchown): Ditto. - * fhandler_disk_file.cc (fhandler_disk_file::facl): Ditto. - -2004-04-14 Corinna Vinschen - - * ntdll.h: Fix copyright date. - * sec_acl.cc (acl_worker): Delete allocated fhandler. - * syscalls.cc (chown_worker): Ditto. - (chmod): Ditto. - (stat_worker): Use get_namehash instead of hash_path_name. - -2004-04-14 Corinna Vinschen - - * sec_acl.cc (getacl): Avoid compiler warning. - * security.cc (write_sd): Ditto. Fix error handling. - -2004-04-14 Corinna Vinschen - - * syscalls.cc (fstat64): Use get_namehash instead of hash_path_name. - -2004-04-14 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Simplify access evaluation - expression. - (fhandler_base::facl): New method. - * fhandler.h: Declare facl method in fhandler_base, - fhandler_disk_file and fhandler_virtual. - * fhandler_disk_file.cc (fhandler_disk_file::facl): New method. - * fhandler_virtual.cc (fhandler_virtual::facl): New method. - * sec_acl.cc: Remove forward declaration for aclsort32 and acl32. - (setacl): Remove static. Add and use handle parameter. - (getacl): Ditto. - (acl_worker): Reorganize to call fhandler's facl method eventually. - (facl32): Ditto. - * security.cc (get_nt_object_security): Remove static. - * security.h: Add extern declarations for get_nt_object_security, - aclsort32, acl32, getacl and setacl. - -2004-04-14 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Accommodate query_write_control - query_state. - (fhandler_base::fchown): New method. - * fhandler.h: Declare fchown method in fhandler_base, - fhandler_disk_file and fhandler_virtual. - (enum query_state): Add query_write_control. - * fhandler_disk_file.cc (fhandler_disk_file::fchmod): Set query_state - to query_write_control. Only remove FILE_ATTRIBUTE_READONLY if not - setting security descriptor. - (fhandler_disk_file::fchown): New method. - * fhandler_virtual.cc (fhandler_virtual::fchown): New method. - * sec_acl.cc (setacl): Call write_sd with additional handle attribute. - * security.cc (write_sd): Take handle argument. Only request owner - if getting SE_RESTORE_NAME privilege failed. Only open file if - NtSetSecurityObject failed or handle is NULL. - (set_nt_attribute): Call write_sd with additional handle attribute. - * security.h (write_sd): Declare with additional handle argument. - * syscalls.cc (chown_worker): Reorganize to call fhandler's fchown - method eventually. - (fchown): Ditto. - -2004-04-14 Corinna Vinschen - - * autoload.cc (NtSetSecurityObject): Add. - * fhandler_disk_file.cc (fhandler_disk_file::fchmod): Only request - READ_CONTROL rights when opening the file. - * ntdll.h (NtSetSecurityObject): Add declaration. - * security.cc (write_sd): Call NtSetSecurityObject instead of - BackupWrite. - (get_nt_object_security): Don't free security descriptor here. - -2004-04-14 Corinna Vinschen - - * syscalls.cc (ttyname): Use buffer of length TTY_NAME_MAX + 1. - * sysconf.cc (sysconf): Handle _SC_TTY_NAME_MAX request. - * include/limits.h: Define TTY_NAME_MAX and _POSIX_TTY_NAME_MAX. - -2004-04-14 Corinna Vinschen - - * cygwin.din: Export rand_r and ttyname_r. - * syscalls.cc (ttyname_r): New function. - (ttyname): Move functionality to ttyname_r. Call it from here. - * include/cygwin/version.h: Bump API minor number. - -2004-04-14 Pierre Humblet - - * path.h (path_conv::set_symlink): Add argument. - (path_conv::get_symlink_length): New method. - (path_conv::symlink_length): New member. - * path.cc (path_conv::check): Pass symlen to set_symlink. - * fhandler_disk_file.cc (fhandler_base::fstat_helper): For symlinks - set st_size from get_symlink_length. - -2004-04-13 Corinna Vinschen - - * security.cc (set_nt_attribute): Only call get_nt_object_security - if handle is NULL. - -2004-04-13 Corinna Vinschen - - * dir.cc (mkdir): Call set_file_attribute with additional handle - argument. - * fhandler.cc (fhandler_base::fchmod): New method. - * fhandler.h: Declare fchmod method in fhandler_base, - fhandler_disk_file and fhandler_virtual. - * fhandler_disk_file.cc (fhandler_disk_file::fchmod): New method. - (fhandler_base::open_fs): Call set_file_attribute with additional - handle argument. - * fhandler_virtual.cc (fhandler_virtual::fchmod): New method. - * path.cc (symlink_worker): Call set_file_attribute with additional - handle argument. - * security.cc (get_nt_object_security): New function. - (get_nt_object_attribute): Call get_nt_object_security. - (set_nt_attribute): Add handle argument. Call get_nt_object_security - first, read_sd only if that fails. - (set_file_attribute): Add handle argument. - * security.h (set_file_attribute): Declare with additional handle - argument. - * syscalls.cc (stat_suffixes): Move to beginning of file. - (chown_worker): Call set_file_attribute with additional handle argument. - (chmod): Reorganize to call fhandler's fchmod method eventually. - (fchmod): Ditto. - -2004-04-13 Corinna Vinschen - - * autoload.cc (NtQuerySecurityObject): Add. - * ntdll.h (STATUS_BUFFER_TOO_SMALL): Add definition. - (NtQuerySecurityObject): Add declaration. - * security.cc (get_nt_object_attribute): Always use - NtQuerySecurityObject to retrieve security descriptor. - -2004-04-13 Gerd Spalink - - * fhandler_dsp.cc (fhandler_dev_dsp::Audio_out::stop): Add optional - boolean argument so that playing can be stopped without playing - pending buffers. - (fhandler_dev_dsp::ioctl): Stop playback immediately for - SNDCTL_DSP_RESET. Do not reset audio parameters in this case. - Add support for ioctl SNDCTL_DSP_GETISPACE. - (fhandler_dev_dsp::Audio_out::emptyblocks): Now returns the number of - completely empty blocks. - (fhandler_dev_dsp::Audio_out::buf_info): p->fragments is now the number - of completely empty blocks. This conforms with the OSS specification. - (fhandler_dev_dsp::Audio_out::parsewav): Ignore wave headers that are - not aligned on four byte boundary. - (fhandler_dev_dsp::Audio_in::buf_info): New, needed for - SNDCTL_DSP_GETISPACE. - -2004-04-13 Corinna Vinschen - - * winsup.h (IMPLEMENT_STATUS_FLAG): New macro to define status flag - accessor methods unambiguously. - * fhandler.h: Use IMPLEMENT_STATUS_FLAG throughout where possible. - * fhandler_termios.cc (fhandler_termios::tcinit): Call corrected - accessor for initialized status flag. - * mtinfo.h (class mtinfo_drive): Use IMPLEMENT_STATUS_FLAG throughout. - * path.cc (fs_info::update): Remove duplicate call to flags(). - * path.h (struct fs_info): Use IMPLEMENT_STATUS_FLAG where possible. - (path_conv::is_auto_device): Fix spacing. - * tty.h (class tty_min): Use IMPLEMENT_STATUS_FLAG throughout. - -2004-04-12 Christopher Faylor - - * thread.cc (pthread::thread_init_wrapper): Wait later to get more - parallel behavior. - -2004-04-12 Christopher Faylor - - * thread.cc (pthread::create): Use thread mutex to control - synchronization rather than creating a suspended thread. Wait for - "cancellation event" to indicate that started thread has been properly - initialized. - (pthread::thread_init_wrapper): Use set_tls_self_pointer() to set tid - and cygtls. Signal with cancel_event when done. - -2004-04-12 Pierre Humblet - - * path.cc (path_conv::check): Fix "tail filling" logic. - -2004-04-11 Christopher Faylor - - * cygheap.h: Replace inexplicably removed closing brace. - -2004-04-11 Christopher Faylor - - * cygheap.h (CYGHEAP_SLOP): Reduce drastically to avoid collisions. - -2004-04-11 Pierre Humblet - - * dtable.cc (dtable::extend): Change order of memcpy and cfree. - -2004-04-10 Corinna Vinschen - - * syscalls.cc (sync): Define void according to SUSv3. - -2004-04-10 Corinna Vinschen - - * sec_acl.cc (setacl): Use correct offset when trying to combine - standard and default entry of same type. - -2004-04-10 Pierre Humblet - - * fhandler.cc (rootdir): Add and use second argument. - * winsup.h (rootdir): Add second argument in declaration. - * path.cc (fs_info::update): Modify call to rootdir. - * syscalls.cc (check_posix_perm): Ditto. - (statfs): Ditto. Move syscall_printf near top. - -2004-04-10 Corinna Vinschen - - * Use new unified status_flag accessor methods from classes fhandler_*, - tty_min, mtinfo and fs_info thoroughout. - * fhandler.h: Redefine all set_close_on_exec methods to take a bool - argument. - (enum conn_state): Rename from connect_state. - (class fhandler_base): Rename some status flags to align with - accessor method names. Drop encoded flag entirely. Unify status - accessor methods. Const'ify all read accessor methods. - (class fhandler_socket): Ditto. - (class fhandler_dev_raw): Ditto. - * fhandler_disk_file.cc (fhandler_base::fstat_fs): Use fs.fs_is_fat() - instead of evaluating FATness of file system here. - (fhandler_disk_file::opendir): Drop call to set_encoded(). - (fhandler_disk_file::readdir): Use pc.isencoded() directly. - * mtinfo.h (class mtinfo_drive): Const'ify all read accessor methods. - * path.cc (fsinfo_cnt): Add. - (fs_info::update): Accommodate class changes. Evaluate file system - name specific flags right here. Add thread safety for reading and - writing global fsinfo array. - * path.h (enum path_types): Drop values for flags kept in fs already. - (struct fs_info): Move status informatin into private struct type - status_flags. Add accessor methods. Remove path and file system - name string arrays in favor of status bits. - (class path_conv): Use new fs_info status information where - appropriate. - (path_conf::fs_has_ea): Rename from fs_fast_ea. - (path_conf::fs_has_acls): New method. - (path_conf::root_dir): Remove. - (path_conf::volname): Remove. - * syscalls (statfs): Evaluate root dir locally. - * tty.h (class tty_min): Unify status accessor methods. Const'ify - all read accessor methods. - -2004-04-09 Thomas Pfaff - - * thread.h (pthread::init_mainthread): Remove parameter forked. - (pthread::set_tls_self_pointer): New static function. - * thread.cc (MTinterface::fixup_after_fork): Change call to - pthread::init_mainthread. - (pthread::init_mainthread): Remove parameter forked. Simplify thread - self pointer handling. - (pthread::self): Set thread self pointer to null_pthread if thread has - not been initialized. - (pthread::set_tls_self_pointer): New static function. - -2004-04-05 Pierre Humblet - - * path.cc (path_conv::check): Optimize symlink replacements. - -2004-04-09 Pierre Humblet - - * path.cc (normalize_posix_path): Add "tail" argument and set it. - Always have a final slash for directories. Pass 3rd argument to - normalize_win32_path. - (path_conv::check): Pass tail to normalize_posix_path. Set - need_directory and remove final slash after that call. Remove last - argument to mount_table->conv_to_win32_path(). Remove noop dostail - check. Remove fs.update() from inner loop. Improve tail finding - search. - (normalize_win32_path): Add and set tail argument. - (mount_item::build_win32): Avoid calling strcpy. - (mount_info::conv_to_win32_path): Remove third argument and simplify - because the source is normalized. Keep /proc path in Posix form. Call - win32_device_name() only once. - (mount_info::conv_to_posix_path): Add and use 3rd argument to - normalize_win32_path to avoid calling strlen. - (cwdstuff::set): Add 3rd argument to normalize_posix_path and remove - final slash if any. - * shared_info.h (mount_info::conv_to_win32_path): Remove last argument - in declaration. - -2004-04-09 Corinna Vinschen - - * fhandler.h (class fhandler_dev_raw): Move status bits into protected - bitfield struct type status_flags. Drop unused has_written bit. - Add accessor methods. - (fhandler_dev_raw::clear): Remove. - (fhandler_dev_raw::reset_devbuf): Remove. - * fhandler_floppy.cc (fhandler_dev_floppy::lseek): Use accessor method - for is_writing. - * fhandler_raw.cc: Use status accessor methods throughout. - (fhandler_dev_raw::clear): Remove. - (fhandler_dev_raw::fhandler_dev_raw): Drop clear call. - (fhandler_dev_raw::~fhandler_dev_raw): Ditto. - * fhandler_tape.cc: Use mtinfo::status accessor methods throughout. - (mtinfo_drive::close): Fix conditional to enable BSD semantics - correctly. - (mtinfo_drive::get_status): Rename from mtinfo_drive::status. - * mtinfo.h (class mtinfo_drive): Move status bits into private bitfield - struct type status_flags. Add accessor methods. - Rename status method to get_status. - -2004-04-09 Corinna Vinschen - - * path.cc (fsinfo): Global storage for file system information. - (fs_info::update): Store file system information also in fsinfo and - short circuit GetVolumeInformation by using alredy stored file system - information. - -2004-04-09 Corinna Vinschen - - * fhandler.h (fhandler_base::status): Declare private. - (fhandler_base::open_status): Ditto. - (class fhandler_socket): Move status bits into private bitfield struct - type status_flags. Change accessor methods appropriately. - * fhandler_socket.cc (fhandler_socket::fhandler_socket): Accommodate - above status bit changes. - * tty.h: Remove status bit enumerator. - (TTYISSETF): Remove. - (TTYSETF): Remove. - (TTYCLEARF): Remove. - (TTYCONDSETF): Remove. - (tty_min::status): Define as private bitfield struct type status_flags. - Add appropriate accessor methods. - * fhandler_console.cc: Use tty_min::status accessor methods throughout. - * fhandler_termios.cc: Ditto. - * winsup.h (__ISSETF): Remove. - (__SETF): Remove. - (__CLEARF): Remove. - (__CONDSETF): Remove. - -2004-04-09 Corinna Vinschen - - * fhandler.cc (fhandler_base::write): Use bool parameter in calls to - set_did_lseek. - (fhandler_base::fhandler_base): Accommodate new status and open_status - constructor. - * fhandler.h: Remove status bit enumerator. - (FHDEVN): Remove. - (FHISSETF): Remove. - (FHSETF): Remove. - (FHCLEARF): Remove. - (FHCONDSETF): Remove. - (FHSTATOFF): Remove. - (UNCONNECTED, CONNECT_PENDING, CONNECTED): Substitute by enum - connect_state. - (fhandler_base::status): Define as bitfield struct type status_flags. - Remove unused flags entirely. Accommodate all status access methods. - (open_status): Define as bitfield struct type status_flags. - (fhandler_socket): Move socket related status bits to here. Redefine - had_connect_or_listen to be part of these status bits. Accommodate - related access methods. - * fhandler_disk_file.cc (fhandler_base::fstat_helper): Use pc.issymlink - instead of dropped method get_symlink_p. - (fhandler_base::open_fs): Remove setting dropped status flags. - * fhandler_socket.cc: Use values from enum connect_state throughout. - (fhandler_socket::fhandler_socket): Initialize status bits. - * fhandler_virtual.cc (fhandler_virtual::open): Remove setting dropped - status flags. - * net.cc: Use values from enum connect_state throughout. - * select.cc: Ditto. - * shared_info.h: Protect struct console_state using _FHANDLER_H_ - instead of FHDEVN. - -2004-04-09 Corinna Vinschen - - * security.cc (get_file_attribute): Fix conditional. - -2004-04-08 Christopher Faylor - - * child_info.h: Update CHILD_INFO_MAGIC after 2004-04-03 change. - -2004-04-08 Corinna Vinschen - - * path.cc (hash_path_name): Replace hash algorithm with SDBM. - -2004-04-08 Corinna Vinschen - - * fhandler.cc (fhandler_base::open): Set query access mode according - to query_open setting. - (fhandler_base::fhandler_base): Initialize query_open. - * fhandler.h (FH_QUERYOPEN): Drop. - (enum query_state): Add. - (class fhandler_base): Add query_open member. - (fhandler_base::get_query_open): Redefine to use query_open. - (fhandler_base::set_query_open): Ditto. - * fhandler_disk_file.cc (fhandler_base::fstat_fs): Remove O_DIROPEN - from open_flags since it's added in open_fs anyway. Remove - query_open_already. Use new query_open settings. Rearrange slightly. - (fhandler_base::fstat_helper): Add get_io_handle as parameter to - get_file_attribute. - * security.cc (get_nt_object_attribute): Make returning an int. - Return -1 on error, 0 otherwise. - (get_file_attribute): Take an object handle as argument. Move down - to allow calling get_nt_object_attribute in case a non-NULL handle - is given. - * security.h (get_file_attribute): Add handle to argument list. - * syscalls.cc (chown_worker): Accommodate new definition of - get_file_attribute. - -2004-04-07 Pierre Humblet - - * path.cc (path_prefix_p): Optimize test order. - -2004-04-06 Corinna Vinschen - - * Makefile.in (EXTRALIBS): Add libtextreadmode.a. - (INSTOBJS): Add textreadmode.o. - * textreadmode.c: New file. - -2004-04-06 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_base::fstat_helper): Request - compressed size only if the matching attributes are set. Use - NtQueryInformationFile instead of GetCompressedFileSize. - (fhandler_base::fstat_by_handle): Remove NT 3.5 cruft since - local.dwVolumeSerialNumber isn't used subsequently. - * ntdll.h: Add typedefs for FILE_COMPRESSION_INFORMATION and - FILE_INFORMATION_CLASS. - -2004-04-06 Corinna Vinschen - - * fhandler_raw.cc (fhandler_dev_raw::open): Actually use "options". - -2004-04-04 Gerd Spalink - - * fhandler_dsp.cc (fhandler_dev_dsp::ioctl): Add implementation - for ioctl codes SNDCTL_DSP_CHANNELS and SNDCTL_DSP_GETCAPS. - -2004-04-03 Christopher Faylor - - * child_info.h (child_info::cygheap_reserve_sz): Rename from - cygheap_alloc_sz. - * cygheap.cc: Rename alloc_sz to reserve_sz throughout. - -2004-04-03 Corinna Vinschen - - * fhandler.h (class fhandler_socket): Remove has_been_closed member. - * fhandler_socket.cc (fhandler_socket::recvfrom): Revert to - overlapped I/O. - (fhandler_socket::recvmsg): Ditto. - (fhandler_socket::sendto): Ditto. - (fhandler_socket::sendmsg): Ditto. - * net.cc (wsock_event::prepare): Ditto. - (wsock_event::wait): Ditto. Evaluate overlapped result also after - calling CancelIo (thanks to Patrick Samson ). - (wsock_event::release): Remove. - * wsock_event.h: Revert to overlapped I/O. - -2004-04-02 Corinna Vinschen - - * net.cc (wsock_event::release): Use NULL handle in call to - WSAEventSelect to resolve KB 168349. - -2004-04-01 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::recvfrom): Rearrange loop - so that WSARecvFrom is always called before waiting. - (fhandler_socket::recvmsg): Ditto. - -2004-04-01 Corinna Vinschen - - * net.cc (wsock_event::wait): Make wsa_err an int. Don't set - ret to 0 if any error has happened. - -2004-04-01 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::sendto): Drop out of loop if - has_been_closed gets set. - (fhandler_socket::sendmsg): Ditto. - * net.cc (wsock_event::wait): Don't initialize evts. Don't try to - evaluate network events if WSAEnumNetworkEvents fails. - (wsock_event::release): Save last WSA error and set it again unless - resetting to blocking socket fails. - * wsock_event.h (class wsock_event): Remove destructor. - -2004-03-31 Corinna Vinschen - - * fhandler_tape.cc (mtinfo::initialize): Fix fatal error message. - -2004-03-31 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::recvfrom): Always initialize - ret to 0 when using in Winsock call. - (fhandler_socket::recvmsg): Ditto. - (fhandler_socket::sendto): Ditto. - (fhandler_socket::sendmsg): Ditto. - -2004-03-31 Corinna Vinschen - - * fhandler_tape.cc (mtinfo_drive::get_pos): Only set partition if - GetTapePosition returned a non-zero partition number. - (mtinfo_drive::create_partitions): Reinitialize to partition 0. - Support TAPE_DRIVE_INITIATOR and TAPE_DRIVE_FIXED partitioning. - (mtinfo_drive::set_partition): Initialize new partition. - (mtinfo_drive::status): Readd accidentally dropped setting of mt_resid. - - * net.cc (wsock_event::prepare): Always print debug output in case - of error. - -2004-03-31 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::sendmsg): Add SIGPIPE handling. - -2004-03-31 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::recvfrom): Initialize res to - SOCKET_ERROR. Use SOCKET_ERROR instead of -1 throughout. - (fhandler_socket::recvmsg): Ditto. - (fhandler_socket::sendto): Ditto. - (fhandler_socket::sendmsg): Ditto. - * net.cc (wsock_event::prepare): Call WSASetLastError instead of - SetLastError. - (wsock_event::wait): Use SOCKET_ERROR instead of -1. - -2004-03-30 Thomas Pfaff - - * thread.h (pthread::init_mainthread): Add parameter forked. Set - forked default to false.. - * thread.cc (MTinterface::fixup_after_fork): Call - pthread::init_mainthread with forked = true. - (pthread::init_mainthread): Add parameter forked. Do not change thread - self pointer when forked. - -2004-03-30 Corinna Vinschen - - * shm.cc (shmat): If shmid is unknown, call a special variation - of shmget to retrieve the shared memory segment from Cygserver - instead of failing immediately. - * include/cygwin/ipc.h (IPC_KEY_IS_SHMID): New internal flag for - shmget when called from shmat. - -2004-03-29 Corinna Vinschen - - * fhandler.h (class fhandler_socket): Add has_been_closed member. - * fhandler_socket.cc (fhandler_socket::fhandler_socket): Initialize - has_been_closed to 0. - (fhandler_socket::recvfrom): Use new asynchronous I/O driven - wsock_event methods. - (fhandler_socket::recvmsg): Ditto. - (fhandler_socket::sendto): Ditto. - (fhandler_socket::sendmsg): Ditto. - * net.cc (wsock_event::prepare): Reimplement using asynchronous I/O. - (wsock_event::wait): Ditto. - (wsock_event::release): New method. - * wsock_event.h (class wsock_event): Remove ovr member. Accommodate - new implementation of prepare and wait methods. Add release method. - -2004-03-29 Thomas Pfaff - - * thread.cc (pthread::atforkprepare): Call - MT_INTERFACE->fixup_before_fork at the end of atforkprepare. - -2004-03-29 Corinna Vinschen - - * net.cc (wsock_event::wait): Change scope of local "len" variable. - -2004-03-28 Corinna Vinschen - - * shm.cc (shmat): Return (void *) -1 on error instead of NULL. - -2004-03-27 Christopher Faylor - - * fhandler_nodevice.cc (fhandler_nodevice::open): Assume that errno has - already been set if pc.error is nonzero. - -2004-03-26 Christopher Faylor - - * cygheap.cc (cygheap_fixup_in_child): Improve strace output. - -2004-03-26 Corinna Vinschen - - * errno.cc (errmap): Map ERROR_SHARING_VIOLATION to EBUSY, - ERROR_EOM_OVERFLOW and ERROR_NO_DATA_DETECTED to EIO. Add mappings - for ERROR_NO_MEDIA_IN_DRIVE, ERROR_DEVICE_REQUIRES_CLEANING and - ERROR_DEVICE_DOOR_OPEN. - * fhandler.h (class fhandler_dev_raw): Drop varblkop member. - (fhandler_dev_raw::is_eom): De-virtualize. - (fhandler_dev_raw::is_eof): Ditto. - (class fhandler_dev_tape): Drop lasterr and dp member. Add mt_mtx - member. Drop all private methods formerly used by ioctl. - (fhandler_dev_tape::is_rewind_device): Use get_minor for clarity. - (fhandler_dev_tape::driveno): New method. - (fhandler_dev_tape::drive_init): New method. - (fhandler_dev_tape::clear): Remove method. - (fhandler_dev_tape::is_eom): Ditto. - (fhandler_dev_tape::is_eof): Ditto. - (fhandler_dev_tape::write_file): Ditto. - (fhandler_dev_tape::read_file): Ditto. - (fhandler_dev_tape::_lock): New method. - (fhandler_dev_tape::unlock): New method. - (fhandler_dev_tape::raw_read): New method. - (fhandler_dev_tape::raw_write): New method. - * fhandler_raw.cc (fhandler_dev_raw::is_eom): New method. - (fhandler_dev_raw::is_eof): New method. - (fhandler_dev_raw::open): Allow setting write through option by - using the O_TEXT flag as ... flag. - (fhandler_dev_raw::writebuf): Remove usage of varblkop and other - tape specific code. - (fhandler_dev_raw::raw_read): Ditto. - (fhandler_dev_raw::dup): Ditto. - * fhandler_tape.cc: Rewrite tape operations entirely. Implement - new tape driver classes mtinfo, mtinfo_drive and mtinfo_part. - Reduce fhandler_dev_tape methods to mostly just calling appropriate - mtinfo_drive methods. - (mtinfo_init): New function adding the mtinfo shared memory area. - * mtinfo.h: New file, containing the definition of the new tape - driver classes. - * shared.cc: Include mtinfo.h. - (offsets): Add entry for mtinfo shared memory area. - (memory_init): Call mtinfo_init. - * shared_info.h (shared_locations): Add SH_MTINFO shared location. - * include/cygwin/mtio.h: Change and add various comments. Add GMT_xxx - macros for new generic flags. Add MT_ST_xxx bitfield definitions - for MTSETDRVBUFFER ioctl. - * include/cygwin/version.h: Bump API minor version number. - -2004-03-26 Christopher Faylor - - * path.cc (path_conv::check): Use 'strchr' rather than 'strrchr' to - find end of string, for efficiency. - -2004-03-26 Thomas Pfaff - - * include/cygwin/_types.h: New file. - * include/sys/lock.h: Ditto. - * include/sys/stdio.h: Ditto. - * thread.cc: Include sys/lock.h - (__cygwin_lock_init): New function. - (__cygwin_lock_init_recursive): Ditto. - (__cygwin_lock_fini): Ditto. - (__cygwin_lock_lock): Ditto. - (__cygwin_lock_trylock): Ditto. - (__cygwin_lock_unlock): Ditto. - (pthread::atforkprepare): Lock file pointer before fork. - (pthread::atforkparent): Unlock file pointer after fork. - (pthread::atforkchild): Ditto. - -2004-03-26 Corinna Vinschen - - * sem.cc (semget): Fix debug string. - (semop): Ditto. - * shm.cc (fixup_shms_after_fork): Ditto. - (shmat): Ditto. - (shmdt): Ditto. - (shmget): Ditto. - -2004-03-26 Christopher Faylor - - * sigproc.cc (wait_sig): Make sure that SIGCHLD is handled regardless - of whether a signal is queued. - -2004-03-26 Christopher Faylor - - * sigproc.cc (wait_sig): Report if not trying to send signal due to - queued signal. - -2004-03-25 Christopher Faylor - - * path.cc (normalize_posix_path): Reorganize to short circuit to DOS - path handling whenever a '\' is detected. - - * signal.cc (sigaction): Make strace output more informative. - * sigproc.cc (pending_signals::add): Just index directly into signal - array rather than treating the array as a heap. - (pending_signals::del): Ditto. - (wait_sig): Don't send signal if we already have a similar signal - queued. - * sigproc.h (call_signal_handler_now): Remove obsolete declaration. - -2004-03-23 Gerd Spalink - - * fhandler_dsp.cc (fhandler_dev_dsp::write): Remove type - cast from argument to audio_out_->parsewav() to make reference - work properly. Now .wav file headers are properly discarded. - -2004-03-23 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_base::fstat_fs): Use created - handle regardless of nohandle state. Clean up afterwards. - -2004-03-23 Gerd Spalink - - * autoload.cc: Load eight more functions for waveIn support. - * fhandler.h (class fhandler_dev_dsp): Add class Audio, class Audio_in - and class Audio_out members and audio_in_, audio_out_ pointers so - that future changes are restricted to file fhandler_dsp.cc. - * fhandler_dsp.cc (fhandler_dev_dsp::Audio): Add this class to treat - things common to audio recording and playback. - Add more format conversions. - (fhandler_dev_dsp::Audio::queue): New queues for buffer management - to fix incomplete cleanup of buffers passed to the wave device. - (fhandler_dev_dsp::Audio_in): New, added class to implement audio - recording. - (fhandler_dev_dsp::Audio_out): Rework to use functionality provided - by fhandler_dev_dsp::Audio. Allocate memory audio buffers late, - just before write. - (fhandler_dev_dsp::Audio_out::start): Size of wave buffer allocated - here depends on audio rate/bits/channels. - (fhandler_dev_dsp::Audio_in::start): Ditto. - (fhandler_dev_dsp::setupwav): Replaced by following function. - (fhandler_dev_dsp::Audio_out::parsewav): Does not setup wave device - any more. Discard wave header properly. - (fhandler_dev_dsp::open): Add O_RDONLY and_RDWR as legal modes. - Protect against re-open. Activate fork_fixup. - (fhandler_dev_dsp::ioctl): Protect against actions when audio is - active. SNDCTL_DSP_GETFMTS only returns formats supported by - mmsystem wave API, not all supported formats. SNDCTL_DSP_GETBLKSIZE - result now depends on current audio format. - (fhandler_dev_dsp::fixup_after_fork): Call fork_fixup for the Audio - classes to let them duplicate the CRITICAL_SECTION. - -2004-03-19 Pierre Humblet - Christopher Faylor - - * init.cc (munge_threadfunc): Handle all instances of search_for. - (prime_threads): Test threadfunc_ix[0]. - -2004-03-21 Christopher Faylor - - * cygheap.cc (init_cheap): Set initial_sz to something or suffer - spurious output. - (cygheap_fixup_in_child): Set alloc_sz to passed in size to ensure that - children will have the right size heap. - (_csbrk): Make output conditional on DEBUGGING. - -2004-03-21 Christopher Faylor - - * cygheap.cc (init_cheap): Conditionalize debugging code. - -2004-03-21 Christopher Faylor - - * cygheap.cc (init_cheap): Add ability to specify minimal cygwin heap - size when debugging. - (_csbrk): Report error in allocation to stderr. - (ccalloc): Ditto. - * dtable.cc (dtable::find_fifo): Remove use of atoms. - * dtable.h (dtable::find_fifo): Ditto. - * fhandler.h (fhandler_fifo): Ditto. - * fhandler_fifo.cc (fhandler_fifo::fhandler_fifo): Ditto. - (fhandler_fifo::set_use): Ditto. - (fhandler_fifo::open_not_mine): Ditto. - (fhandler_fifo::open): Ditto. - * pinfo.cc (_pinfo::commune_recv): Ditto. - (_pinfo::commune_send): Ditto. - -2004-03-19 Pierre Humblet - - * dir.cc (rmdir): Reorganize error handling to reduce indentation. - -2004-03-19 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 10. - -2004-03-18 Christopher Faylor - - * child_info.h (CURR_CHILD_INFO_MAGIC): Reset to new value. - (child_info::cygheap_alloc_sz): New field. - * cygheap.cc (init_cheap): Reduce size of cygwin stack until minimal - hit when attempting initial allocation. - (cygheap_setup_for_child): Use alloc_sz to create secondary memory - mapped entry. Store alloc_sz in cygheap_alloc_sz. - (cygheap_fixup_in_child): Use cygheap_alloc_sz to map parent's cygheap. - * cygheap.h (_CYGHEAPSIZE_SLOP): New define. - (CYGHEAPSIZE): Use _CYGHEAPSIZE_SLOP. - -2004-03-18 Corinna Vinschen - - * fhandler_proc.cc (format_proc_meminfo): On NT, try to figure out - real swap file usage by requesting SystemPagefileInformation. Use - GlobalMemoryStatus as fallback. - * ntdll.h (_SYSTEM_INFORMATION_CLASS): Add SystemPagefileInformation. - (struct _SYSTEM_PAGEFILE_INFORMATION): Define. - -2004-03-17 Christopher Faylor - - * pipe.cc (fhandler_pipe::dup): Fix debugging message. - -2004-03-17 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 9. - -2004-03-16 Christopher Faylor - - * sigproc.cc (proc_terminate): Release sync_proc_subproc when done - terminating or suffer potential hangs. - (get_proc_lock): Reorganize debugging output slightly. - -2004-03-15 Christopher Faylor - - * cygtls.cc (_cygtls::fixup_after_fork): Just manipulate the signal - stack if a signal occurred during the parent's fork. Otherwise leave - it alone. - -2004-03-15 Christopher Faylor - - * exceptions.cc (try_to_debug): Report on tid of caller. - - * sync.cc (muto::acquire): Fix some races. - * sync.h (muto): Expose some fields for easier debugging. - -2004-03-15 Corinna Vinschen - - * fhandler.h (fhandler_dev_tape::tape_get_pos): Declare with extra - parameter for partition number. - (fhandler_dev_tape::_tape_set_pos): Ditto. - (fhandler_dev_tape::tape_partition): New method. - (fhandler_dev_tape::tape_set_partition): New method. - * fhandler_tape.cc (fhandler_dev_tape::open): Call private methods - directly instead of ioctl. - (fhandler_dev_tape::ioctl): Use long erase on MTERASE by default. - Don't use absolute positioning on MTSEEK. Call tape_set_partition - on MTSETPART, tape_partition on MTMKPART. - (fhandler_dev_tape::tape_get_pos): Add partition number parameter. - Prefer logical position information over absolute position information. - Return partition number. - (fhandler_dev_tape::_tape_set_pos): Add partition number parameter. - Use in SetTapePosition. - (fhandler_dev_tape::tape_set_pos): Remove special TAPE_ABSOLUTE_BLOCK - handling. - (fhandler_dev_tape::tape_erase): Rewind before erasing. - (fhandler_dev_tape::tape_status): Rearrange slightly. Try to get a - MediaType even if no tape is loaded. Store active partition in - mt_resid as on Linux. - (fhandler_dev_tape::tape_partition): New method. - (fhandler_dev_tape::tape_set_partition): New method. - * include/cygwin/mtio.h: Fix copyright. Add comment to explain - mt_resid content. - * include/cygwin/version.h: Bump API minor number. - -2004-03-14 Christopher Faylor - - * cygtls.cc (_cygtls::remove): Call remove_wq even when we can't - necessarily get the cygtls table lock. - * cygtls.h (_cygtls::remove_wq): Add wait argument. - * sigproc.cc (_cygtls::remove_wq): Honor wait argument when acquiring - lock. - (proc_terminate): Don't NULL sync_proc_subproc since other threads may - still try to access it. - -2004-03-14 Corinna Vinschen - - * errno.cc (errmap): Map ERROR_BEGINNING_OF_MEDIA and - ERROR_SETMARK_DETECTED to EIO instead of ESPIPE. - Handle ERROR_FILEMARK_DETECTED. - * fhandler_tape.cc (TAPE_FUNC): Add comment that ERROR_BUS_RESET - has still to be handled correctly. - (fhandler_dev_tape::open): Accommodate fact that get.mt_dsreg - also contains density code. - (fhandler_dev_tape::ioctl): Rearrange slightly. Reset devbuf also on - MTNOP, MTWSM, MTSETBLK, MTSETDRVBUFFER, MTSETPART and MTMKPART. - (fhandler_dev_tape::tape_set_pos): Rearrange. Match behaviour to - the Linux tape driver. - (fhandler_dev_tape::tape_status): Call IOCTL_STORAGE_GET_MEDIA_TYPES_EX - if available. Return device type and density code in appropriate - mtget members. - * wincap.h (wincaps::has_ioctl_storage_get_media_types_ex): New element. - * wincap.cc: Implement above element throughout. - * include/cygwin/mtio.h: Add tape device types as returned by - IOCTL_STORAGE_GET_MEDIA_TYPES_EX. - (MT_TAPE_INFO): Use above type codes. - (struct mtget): Change mt_dsreg comment. - -2004-03-14 Pierre Humblet - - * dir.cc (rmdir): Construct real_dir with flag PC_FULL. - Use a loop instead of recursion to handle the current directory. - -2004-03-14 Christopher Faylor - - * cygtls.cc (_cygtls::remove): Call remove_wq to ensure that wait stuff - is removed from proc_subproc linked list. - * cygtls.h (_cygtls::remove_wq): Declare. - * sigproc.cc (_cygtls::remove_wq): Define. - (proc_subproc): Label event handle appropriately. - * spawn.cc (spawn_guts): Return -1 when wait() fails for spawn types - that require waiting. - -2004-03-13 Corinna Vinschen - - * errno.cc (errmap): Handle ERROR_BUS_RESET. - * fhandler.h (fhandler_dev_raw::write_file): New method, created - from former static function. - (fhandler_dev_raw::read_file): Ditto. - (reset_devbuf): New inline method. - (class fhandler_dev_tape): Add TAPE_GET_DRIVE_PARAMETERS - member `dp'. - (fhandler_dev_tape::write_file): New method. - (fhandler_dev_tape::read_file): Ditto. - (fhandler_dev_tape::tape_get_feature): Convert to inline method. - (fhandler_dev_tape::tape_error): New method, created from former - static function. - (fhandler_dev_tape::tape_get_blocksize): Remove declaration. - * fhandler_raw.cc (fhandler_dev_raw::write_file): New method, created - from former static function. - (fhandler_dev_raw::read_file): Ditto. - (fhandler_dev_raw::writebuf): Accommodate the fact that no devbuf - exists under variable block size condition. - (fhandler_dev_raw::raw_read): Ditto. Add local p pointer to simplify - pointer arithmetic. - (fhandler_dev_raw::raw_write): Always set devbufend to 0 when starting - with writing. Accommodate the fact that no devbuf exists under - variable block size condition. - * fhandler_tape.cc: Various formatting changes. - (TAPE_FUNC): New macro. Use throughout as tape function loop. - (get_ll): Convert into macro. - (IS_EOM): New macro. - (IS_EOF): New macro. - (fhandler_dev_tape::is_eom): Use IS_EOM macro. - (fhandler_dev_tape::is_eof): Use IS_EOF macro. - (fhandler_dev_tape::write_file): New method. - (fhandler_dev_tape::read_file): New method. - (fhandler_dev_tape::open): Get drive information block here once. - (fhandler_dev_tape::lseek): Remove unneeded duplicate code. - (fhandler_dev_tape::dup): Duplicate drive information block. - (fhandler_dev_tape::ioctl): Remove drvbuf in variable block size mode. - Return ERROR_INVALID_BLOCK_LENGTH instead of ERROR_MORE_DATA if - buffer contains data which would get lost on buffer size changing. - Use absolute tape positioning also if drive only supports logical - block positioning. - (fhandler_dev_tape::tape_error): New method, created from former - static function. - (fhandler_dev_tape::tape_get_pos): Allow logical block reporting. - Workaround tape driver bug. - (fhandler_dev_tape::_tape_set_pos): Reset device buffer and flags - after successful repositioning. - (fhandler_dev_tape::tape_set_pos): Allow logical block positioning. - Workaround tape driver bug. - (fhandler_dev_tape::tape_erase): Use dp instead of calling - GetTapeParameters. - (fhandler_dev_tape::tape_prepare): Ditto. - (fhandler_dev_tape::tape_get_blocksize): Remove. - (fhandler_dev_tape::tape_set_blocksize): Don't call tape_get_blocksize. - Error handling already done in fhandler_dev_tape::ioctl. - (fhandler_dev_tape::tape_status): Remove local `dp' variable. - Accommodate logical tape reporting. Call tape_get_feature instead - of accessing feature words directly. - (fhandler_dev_tape::tape_compression): Use dp instead of calling - GetTapeParameters. Fix resetting datcompression. - -2004-03-12 Christopher Faylor - - * wait.cc (wait4): Initialize pointer on entry. Avoid calling - call_signal_handler twice since that guarantees exiting with errno set - to EINTR. - -2004-03-12 Corinna Vinschen - - * exceptions.cc (sigpacket::process): Simplify code slightly. - -2004-03-11 Christopher Faylor - - * cygtls.h (waitq): Declare structure here. - (_cygtls::wq): Declare. - * cygtls.cc (_cygtls::fixup_after_fork): Clear wq.thread_ev to avoid - using an invalid event handle in forked process. - * dcrt0.cc (waitq_storage): Delete. - (threadstuff): Remove waitq_storage. - * perthread.h (per_thread_waitq): Delete. - (waitq_storage): Delete declaration. - * sigproc.cc (sigproc_init): Remove perthread waitq consideration. - * sigproc.h (waitq): Delete declaration. - * wait.cc (wait4): Use _my_tls waitq structure rather than per_thread. - -2004-03-11 Pierre Humblet - - * cygtls.h (_cygtls::newmask): Delete member. - (_cygtls::deltamask): New member. - * gendef (_sigdelayed): Replace the call to set_process_mask by a call - to set_process_mask_delta. - * exceptions.cc (handle_sigsuspend): Do not filter tempmask. Or - SIG_NONMASKABLE in deltamask as a flag. - (_cygtls::interrupt_setup): Set deltamask only. - (set_process_mask_delta): New function. - (_cygtls::call_signal_handler): Replace the first call to - set_process_mask by a call to set_process_mask_delta. - * tlsoffsets.h: Regenerate. - -2004-03-11 Christopher Faylor - - * cygtls.cc (_cygtls::fixup_after_fork): Remove unneeded setting of - oldmask. - * exceptions.cc: Remove some __I386__ conditionals. - (handle_exceptions): Move ppid test to outside of a loop for - efficiency. - (setup_handler): Make debugging output more wordy. - (_cygtls::call_signal_handler): To avoid a race, use lock/unlock to - synchronize with signal thread and ensure that signal_arrived event has - actually been set. - * gendef (_sigfe): Use ebx for all sigstack manipulations to ensure - that the register is saved. Move setting of incyg to within stack lock - to avoid setup_handler confusion. - (_sigbe): Use ebx for all sigstack manipulations to ensure that the - register is saved. - (_cygtls::pop): Ditto. - (_cygtls::lock): Ditto. - (stabilize_sig_stack): Ditto. - (setjmp): Ditto. - (longjmp): Ditto. - -2004-03-08 Jaakko Hyvatti - - * fhandler_serial.cc (fhandler_serial::ioctl): Implement TIOCSBRK and - TIOCCBRK. - * include/sys/termios.h: Define TIOCSBRK and TIOCCBRK. - -2004-03-08 Christopher Faylor - - * exceptions.cc (setup_handler): Avoid suspending a thread if it is in - a cygwin function, in an exception, spinning, or locked. - * gendef (_sigfe): Move incyg setting earlier. - (sigreturn): Set incyg flag to avoid interrupting called cygwin - functions. - (sigdelayed): Ditto. - (stabilize_sig_stack): Ditto. - - * sigproc.cc (proc_subproc): Don't restore process lock early in exec - case. - - * cygtls.h: Reorganize fields in _cygtls slightly. - * tlsoffsets.h: Regenerate. - -2004-03-06 Christopher Faylor - - * fork.cc (fork_parent): Save parent pid in a temporary variable since - child could conceivably exit before function returns, rendering the - child's shared memory area invalid. - - * cygtls.h (_cygtls::incyg): Declare new field. - (_cygtls::in_exception): Define new function. - * exceptions.cc (setup_handler): Remove locked flag. Use 'incyg' flag - and in_exception function to determine when we're in a cygwin function. - (_cygtls::call_signal_handler): Decrement incyg flag prior to calling a - handler. Increment it on return. - * gendef (_sigfe): Increment incyg flag. Use testl for zero testing - rather than orl, for consistency. - (_sigbe): Decrement incyg flag. Use testl for zero testing rather than - orl, for consistency. - (_cygtls::pop): Use testl for zero testing rather than orl, for - consistency. - (stabilize_sig_stack): Ditto. - - * tlsoffsets.h: Regenerate. - -2004-03-05 Christopher Faylor - - * gendef (sigdelayed): Handle return here rather than going through - sigbe to ensure that flags are properly restored. - -2004-03-04 Thomas Pfaff - - * include/pthread.h (PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP): New - define. - (PTHREAD_NORMAL_MUTEX_INITIALIZER_NP): Ditto. - (PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP): Ditto. - * thread.cc (pthread_mutex::is_good_initializer): Check for all - posssible initializers - (pthread_mutex::is_good_initializer_or_object): Ditto. - (pthread_mutex::is_good_initializer_or_bad_object): Ditto. - (verifyable_object_isvalid): Support up to three static initializers. - (verifyable_object_isvalid (void const *,long)): Remove. - (pthread_cond::is_good_initializer_or_bad_object): Remove unneeded - objectState var. - (pthread_cond::init): Condition remains unchanged when creation has - failed. - (pthread_rwlock::is_good_initializer_or_bad_object): Remove unneeded - objectState var. - (pthread_rwlock::init): Rwlock remains unchanged when creation has - failed. - (pthread_mutex::init): Remove obsolete comment. Mutex remains - unchanged when creation has failed. Add support for new initializers. - (pthread_mutex_getprioceiling): Do not create mutex, just return - ENOSYS. - (pthread_mutex_lock): Simplify. - (pthread_mutex_trylock): Remove unneeded local themutex. - (pthread_mutex_unlock): Just return EPERM if mutex is not initialized. - (pthread_mutex_setprioceiling): Do not create mutex, just return - ENOSYS. - * thread.h (verifyable_object_isvalid): Support up to three static - initializers. - (verifyable_object_isvalid (void const *,long)): Remove prototype. - (pthread_mutex::init): Add optional initializer to parameter list. - -2004-03-03 Christopher Faylor - - * gendef (sigreturn): Call stabilize_sig_stack to ensure that there are - no pending signals. Restore edx later. - (sigdelayed): Save edx earlier. - - * malloc_wrapper.cc (malloc_init): Add some more debugging output. - -2004-03-02 Corinna Vinschen - - * fhandler_raw.cc (fhandler_dev_raw::raw_read): When reading with - variable block size, read only one block, read directly into user - supplied buffer, return ENOMEM if user supplied buffer is smaller - than size of next block to read. Use read2 instead of bytes_to_read - to count number of bytes read. - * fhandler_tape.cc (fhandler_dev_tape::open): Add debug output. - -2004-02-26 Brian Ford - - * miscfuncs.cc (check_invalid_virtual_addr): Assure the last page - in the range is always tested. Add appropriate const. - * mmap.cc (mmap_record::alloc_fh): Remove unused static path_conf object. - -2004-02-25 Christopher Faylor - - * exceptions.cc (setup_handler): Signal event for any sigwaitinfo, if it - exists, to force signal to be handled. Zero event here to prevent - races. - * signal.cc (sigwaitinfo): Use local handle value for everything since - signal thread could zero event element at any time. Detect when - awaking due to thread not in mask and set return value and errno - accordingly. Don't set signal number to zero unless we've recognized - the signal. - * sigproc.cc (sigq): Rename from sigqueue throughout. - - * thread.cc (pthread::join): Handle signals received while waiting for - thread to terminate. - -2004-02-25 Christopher Faylor - - * cygwin.din: Export sighold, sigqueue. - * exceptions.cc (sighold): Define new function. - * signal.cc (handle_sigprocmask): Set correct errno for invalid signal. - Simplify debugging output. - (sigqueue): Define new function. - * include/cygwin/signal.h (sighold): Declare new function. - (sigqueue): Ditto. - * include/cygwin/version.h: Bump API minor version number. - * include/limits.h (TIMER_MAX): Define. - (_POSIX_TIMER_MAX): Ditto. - -2004-02-25 Brian Ford , - Corinna Vinschen - - * miscfuncs.cc (check_invalid_virtual_addr): New function. - * winsup.h (check_invalid_virtual_addr): Declare. - * mmap.cc (munmap): Call check_invalid_virtual_addr instead of - IsBadReadPtr. - -2004-02-24 Christopher Faylor - - * gendef (stabilize_sig_stack): Correctly align this pointer for call - to _cygtls::call_signal_handler. - * gentls_offsets: Output sizeof field. - * tlsoffsets.h: Regenerate. - -2004-02-24 Christopher Faylor - - * dcrt0.cc (_dll_crt0): Don't check sync_startup if threadfunc_ix is set. - - * external.cc (cygwin_internal): Implement CW_GET_BINMODE. - * include/sys/cygwin.h: Declare CW_GET_BINMODE. - -2004-02-24 Christopher Faylor - - * dcrt0.cc (_dll_crt0): Add some stern internal errors. - -2004-02-24 Corinna Vinschen - - * thread.cc (pthread::cancelable_wait): Rearrange slightly. - Add do_sig_wait parameter. Wait for signal_arrived if set to true. - Return WAIT_SIGNALED if signal arrived. - (pthread_cond::wait): Accommodate change to pthread::cancelable_wait. - (pthread::join): Ditto. - (semaphore::_timedwait): Ditto. - (semaphore::_wait): Ditto. Change to return int to allow status - feedback. - (semaphore::wait): Return return value from semaphore::_wait. - * thread.h (WAIT_SIGNALED): New definition. - (pthread::cancelable_wait): Change declaration. Define do_sig_wait - as false by default to not interfere with existing calls accidentally. - (semaphore::_wait): Declare int. - -2004-02-21 Christopher Faylor - - * exceptions.cc (sigpacket::process): Make sure that tls is filled in - for SIGSTOP condition. - (_cygtls::call_signal_handler): Restore signal mask using saved oldmask - rather than current oldmask. - -2004-02-20 Christopher Faylor - - * path.cc (conv_path_list): Return error condition. - (copy1): New function. - (copyenc): New function. - (mount_item::fnmunge): Return error condition. Use new functions to - copy strings. - (mount_item::build_win32): Ditto. - (mount_info::conv_to_win32_path): Return error condition. - (cygwin_conv_to_posix_path): Return result of path conversion. - (cygwin_conv_to_full_posix_path): Ditto. - (return_with_errno): New macro. - (cygwin_win32_to_posix_path_list): Use new macro to potentially set - errno. - (cygwin_posix_to_win32_path_list): Ditto. - * path.h (mount_item::fnmunge): Add size argument. - (mount_item::build_win32): Ditto. - -2004-02-20 Corinna Vinschen - - * getopt.c: Avoid useless compiler warnings. - -2004-02-20 Corinna Vinschen - - * getopt.c: Replace with latest vanilla(!) OpenBSD version 1.16. - -2004-02-18 Christopher Faylor - - * fork.cc (fork_child): Invert sense of test which defeated correct - handling in a fork from a non-main thread. - - * dcrt0.cc (initial_env): Eliminate parameter and just send DebugBreak - when appropriate. - (dll_crt0_0): Reflect parameter change to initial_env. - (dll_crt0_1): Don't call initial_env. - -2004-02-18 Christopher Faylor - - * gendef (stabilize_sig_stack): New function. - (setjmp): Import, add sig stack handling. Store sig stack info. - (longjmp): Call stabilize_sig_stack. Restore sig stack info. - * config/i386/setjmp.c: Remove. - -2004-02-17 Corinna Vinschen - - * fork.cc (fork_child): Move fixup_shms_after_fork so that - signal_arrived is initialized when calling it. - -2004-02-17 Christopher Faylor - - * Makefile.in (clean): Clean libserver, too. - - * fhandler.cc (fhandler_base::~fhandler_base): Remove path_conv cleanup. - * syscalls.cc (chroot): Ditto. - * path.cc (path_conv::~path_conv): Define new destructor. - (conv_path_list_buf_size): Remove explicit path_conv cleanup. - * path.h (path_conv::~path_conv): Declare new destructor. - -2004-02-16 Christopher Faylor - - * Makefile.in: Compile flock.o with -fomit-frame-pointer. - -2004-02-16 Christopher Faylor - - * Makefile.in: Compile dlfcn.o with -fomit-frame-pointer. - -2004-02-16 Christopher Faylor - - * Makefile.in: Compile delqueue.o with -fomit-frame-pointer. - -2004-02-16 Pierre Humblet - - * syscalls.cc (rename): Do not test the MoveFile error code - where MoveFileEx exists. - -2004-02-15 Christopher Faylor - - * cygheap.cc (_csbrk): Report more debugging details on failing - condition. - -2004-02-14 Christopher Faylor - - * Makefile.in: Compile syscalls.o with -fomit-frame-pointer. - - * sigproc.cc: Eliminate unused variable. - -2004-02-14 Corinna Vinschen - - * getopt.c: Replace with latest NetBSD version 1.16. Keep Cygwin - specific changes as minimal as possible. - -2004-02-13 Christopher Faylor - - * sigproc.cc (proc_subproc): Change warning back to silent debug - output. - -2004-02-13 Christopher Faylor - - * dcrt0.cc (alloc_stack_hard_way): Revert to previous implementation. - (alloc_stack): Ditto. - * exceptions.cc (ctrl_c_handler): Add debugging output. - -2004-02-13 Christopher Faylor - - * Makefile.in (clean): Remove sigfe.s. - (sigfe.s): Ensure that sigfe.s will be regenerated if it does not exist. - * dll_init.cc (dll_dllcrt0): Simplify initializing tests. - - * exceptions.cc (setup_handler): Detect when stub caller is either - spinning or has acquired the lock after being suspended to avoid - windows problems with suspending a win32 API call. - - * cygtls.h (_cygtls::spinning): Declare new element. - * gendef: Remove unused _siglist_index and _siglist declaration. - (_sigfe): Set spinning element when potentially looping, waiting for lock. - (_sigbe): Ditto. - (_cygtls::lock): Ditto. - (_longjmp): Ditto. - * tlsoffsets.h: Regenerate. - * pinfo.cc (_pinfo::exit): Set final exit state here. Call sigproc_terminate if - invoked with 'norecord'. Clear any residual _cygtls stuff. - * winsup.h (exit_states): Define ES_FINAL. - * spawn.cc (spawn_guts): Don't call proc_terminate specifically when - execing. Let _pinfo::exit handle that case. - - * sigproc.cc (wait_subproc): Always exit loop early when proc_loop_wait. - - * init.cc (munge_threadfunc): Eliminate unused argument. - (dll_entry): Reflect above change in call to munge_threadfunc. - -2004-02-11 Christopher Faylor - - * gendef (_sigbe): Zero location on pop. - (_cygtls::pop): Ditto. - -2004-02-11 Christopher Faylor - - * dcrt0.cc (alloc_stack_hard_way): Eliminate second argument. - (alloc_stack): Remove use of 'b' throughout. - -2004-02-11 Christopher Faylor - - Rename _threadinfo to _cygtls, throughout. - * cygtls.h (_cygtls::call_signal_handler): Rename from - call_signal_handler_now. - (_cygtls::push): Make second argument mandatory. - (_cygtls::fixup_after_fork): Declare new function. - (_cygtls::lock): Ditto. - * cygtls.cc (_cygtls::fixup_after_fork): Define new function. - * dcrt0.cc (cygwin_finished_initializing): Define as bool. - (alloc_stack): Use _tlstop rather than arbitrary variable in probably - vain attempt to avoid strange fork problem on CTRL-C. - (dll_crt0_0): Remove obsolete winpids::init call. - * dll_init.cc (dll_dllcrt0): Detect forkee condition as equivalent to - initializing. - * winsup.h (cygwin_finished_initializing): Declare as bool. - * exceptions.cc (handle_exceptions): Rely on - cygwin_finished_initializing to determine how to handle exception - during process startup. - (_cygtls::call_signal_handler): Rename from call_signal_handler_now. - (_cygtls::interrupt_now): Fill in second argument to push. - (signal_fixup_after_fork): Eliminate. - (setup_handler): Initialize locked to avoid potential inappropriate - unlock. Resume thread if it has acquired the stack lock. - (ctrl_c_handler): Just exit if ctrl-c is hit before cygiwn has finished - initializing. - * fork.cc (sync_with_child): Don't call abort since it can cause exit - deadlocks. - (sync_with_child): Change debugging output slightly. - (fork_child): Set cygwin_finished_initializing here. Call _cygtls fork - fixup and explicitly call sigproc_init. - (fork_parent): Release malloc lock on fork failure. - (vfork): Call signal handler via _my_tls. - * sigproc.cc (sig_send): Ditto. - * syscalls.cc (readv): Ditto. - * termios.cc (tcsetattr): Ditto. - * wait.cc (wait4): Ditto. - * signal.cc (nanosleep): Ditto. - (abort): Ditto. - (kill_pgrp): Avoid killing self if exiting. - * sync.cc (muto::acquire): Remove (temporarily?) ill-advised - exiting_thread check. - * gendef (_sigfe): Be more agressive in protecting stack pointer from - other access by signal thread. - (_cygtls::locked): Define new function. - (_sigbe): Ditto. - (_cygtls::pop): Protect edx. - (_cygtls::lock): Use guaranteed method to set eax to 1. - (longjmp): Aggressively protect signal stack. - * miscfuncs.cc (low_priority_sleep): Reduce "sleep time" for secs == 0. - * pinfo.cc (winpids::set): Counterintuitively use malloc's lock to - protect simultaneous access to the pids list since there are - pathological conditions which can cause malloc to call winpid. - (winpids::init): Eliminate. - * pinfo.h (winpids::cs): Eliminate declaration. - * pinfo.h (winpids::init): Eliminate definition. - -2004-02-11 Corinna Vinschen - - * security.cc (get_nt_object_attribute): Fix error handling. - -2004-02-09 Ralf Habacker - - * fhandler_socket.cc (fhandler_socket::ioctl): Add FIONREAD handling. - -2004-02-08 Christopher Faylor - - * debug.h (console_printf): Define for non-debugging condition. - - * cygtls.h (_threadinfo::lock): Remove wait argument. - (_threadinfo::interrupt_setup): Remove retaddr argument. - * exceptions.cc (_threadinfo::interrupt_setup): Ditto. - (_threadinfo::interrupt_now): Accommodate change to interrupt_setup - argument. - (setup_handler): Ditto. Always lock sig stack prior to determining - interrupt method. - * gendef (_sigfe): Correct thinko regarding cmpxchg. - (_sigbe): Ditto. - (_threadinfo::lock): Ditto. - (_threadinfo::pop): Eliminate left-over stack unlock. - * sigproc.cc (proc_subproc): Change debugging output to printed - warning. - -2004-02-08 Christopher Faylor - - * localtime.cc (localtime_r): Call tzset. - - * Makefile.in: Make version.h/cygwin.din version check a warning since - it is not foolproof. - - * cygheap.h (CYGHEAPSIZE): Bump size down. - - * cygtls.h (_threadinfo::stacklock): New element. - (_threadinfo::pop): Make regparm. - (_threadinfo::lock): New function. - (_threadinfo::unlock): New function. - * cygtls.cc (_threadinfo::push): Wait for a lock on the stack before - performing the operation. - (_threadinfo::pop): Move to another file. - * cygwin.din: More SIGFE changes. - * exceptions.cc (try_to_debug): Always display messages on console. - (handle_exceptions): Unwind stack only when actually about to call - sig_send. - (setup_handler): Lock stack prior to performing any operations. - * gendef (_sigfe): Ditto. - (_sigbe): Ditto. - (_threadinfo::pop): Ditto. Move here. - * gen_tlsoffsets: Generate positive offsets. - * tlsoffsets.h: Regenerate. - -2004-02-06 Corinna Vinschen - - * cygserver.h (CYGWIN_SERVER_VERSION_API): Bump. - * cygserver_ipc.h (struct proc): Add signal_arrived member. - (ipc_set_proc_info): Inititalize blk.signal_arrived. - -2004-02-06 Pierre Humblet - - * uinfo.cc (cygheap_user::init): Use sec_user_nih to build a - security descriptor. Set both the process and the default DACLs. - * fork.cc (fork_parent): Use sec_none_nih security attributes. - * spawn.cc (spawn_guts): Ditto. - -2004-02-05 Christopher Faylor - - * cygwin.din: Make many more functions SIGFE. - * include/cygwin/version.h (CYGWIN_VERSION_SHARED_DATA): Bump. - -2004-02-05 Pierre Humblet - - * security.h (SID): New macro. - (well_known_*_sid): Change type to cygpsid. - (cygsid::init): Delete declaration. - * sec_helper.cc (well_known_*_sid): Define using above SID macro. - (cygsid::init): Delete. - * dcrt0.cc (dll_crt0_0): Do not call cygsid::init. - * security.cc (get_user_local_groups): Change the second argument type - to cygpsid. - -2004-02-03 Christopher Faylor - - * cygtls.h (_local_storage::signamebuf): Increase size to prevent - overflow on really odd values. - * tlsoffsets.h: Regenerate. - -2004-02-03 Christopher Faylor - - * Makefile.in (DLL_OFILES): Add strsig.o. - * cygtls.h (_local_storage::signamebuf): New element. - * sysconf.cc (sysconf): Implement _SC_RTSIG_MAX. - * tlsoffsets.h: Regenerate. - * include/limits.h (_POSIX_RTSIG_MAX): New define. - (RTSIG_MAX): Ditto. - * include/cygwin/signal.h (SIGRTMIN): New define. - (SIGRTMAX): Ditto. - (NSIG): Bump. - * strsig.cc: New file. - -2004-02-03 Jason Tishler - - * window.cc (Winmain): Show windows error code in error output when - RegisterClass fails. - -2004-02-02 Christopher Faylor - - * fhandler.h (*::fixup_after_exec): Eliminate unused handle argument. - * fhandler.h (dtable::fixup_after_exec): Eliminate unused handle - argument. - * dcrt0.cc (dll_crt0_1): Reflect elimination of unused handle argument - to fixup_after_exec. - * dtable.cc (dtable::fixup_after_exec): Ditto. - * fhandler_console.cc (fhandler_console::fixup_after_exec): Ditto. - * fhandler_dsp.cc (fhandler_dsp::fixup_after_exec): Ditto. - * fhandler_raw.cc (fhandler_raw::fixup_after_exec): Ditto. - * fhandler_socket.cc (fhandler_socket::fixup_after_exec): Ditto. - * fhandler_virtual.cc (fhandler_virtual::fixup_after_exec): Ditto. - * pipe.cc (fhandler_pipe::fixup_after_exec): Ditto. - -2004-02-02 Pierre Humblet - - * spawn.cc (spawn_guts): Do not set ciresrv.parent. - * child_info.h (child_info_spawn::~child_info_spawn): Do not close - parent. Update CURR_CHILD_INFO_MAGIC. - * dcrt0.cc (dll_crt0_0): Do not close spawn_info->parent. Pass NULL to - cygheap->fdtab.fixup_after_exec(). - -2004-02-02 Christopher Faylor - - Throughout, change name from set_inheritance to set_no_inheritance to - better reflect input arguments of this function. - - * cygheap.h (CYGHEAPSIZE): Increase size of cygheap to something closer - to the 21st century. - -2004-02-02 Corinna Vinschen - - * cygerrno.h (set_errno): Replace semicolon with comma in non-DEBUGGING - version to avoid compile time error. - -2004-02-01 Christopher Faylor - - * cygerrno.h (set_errno): Set global errno whenever setting thread - specific version. - * debug.cc (__set_errno): Ditto. - - * exceptions.cc (handle_sigsuspend): Remove spurious - sig_dispatch_pending call. - (set_signal_mask): When there seem to be pending signals to dispatch, - tell signal_dispatch_pending/sig_send not to specifically call any - handlers. - * sigproc.h (sig_dispatch_pending): Change declaration to void. - * sigproc.cc (sig_dispatch_pending): Change definition to void. Take - an argument to determine whether to tell sig_send to wait for handler - to be called. - * sigproc.cc (sig_send): Don't call signal handler when sig == - __SIGFLUSHFAST. - (wait_sig): Honor __SIGFLUSHFAST. Guard against sigpacket::process - nuking si_signo. - * sigproc.h (__SIGFLUSHFAST): Define new special signal. - (sig_dispatch_pending): Change declaration to void. Take optional - boolean argument. - - * fork.cc (vfork): Add debugging output. - -2004-01-26 Christopher Faylor - - * exceptions.cc (sig_handle_tty_stop): Avoid races by waiting for both - signal_arrived and for sigCONT. - (sigpacket::process): Enforce sending of both signal_arrived and - sigCONT, where appropriate. - * gendef (sigreturn): Save tls pointer in ebx so that it can jump into - sigdelayed and use the same register. - -2004-01-26 Christopher Faylor - - * cygtls.cc (_threadinfo::init_thread): Add more local reent stdio - initialization. - * dcrt0.cc (initial_env): Can it really be true that XP doesn't allow - attaching a debugger during DLL attach? Add temporary workaround. - (dll_crt0_0): Ensure that _impure_ptr stdio is initialized before any - threads. - (dll_crt0_1): Move _impure_ptr initialization to dll_crt0_0. - * exceptions.cc (try_to_debug): Reinstate old method for looping while - debugging. - * syscalls.cc (_cygwin_istext_for_stdio): Regularize debugging output. - Remove hopefully extraneous check. - (setmode_helper): Add debugging output for improbable case. Use - "binary" rather "raw" for consistency. - -2004-01-25 Christopher Faylor - - * fhandler.cc (fhandler_base::fhaccess): Avoid always setting errno to - EACCESS when return value is < 0. Rely on errno being set properly. - -2004-01-25 Christopher Faylor - - * sigproc.cc (proc_subproc): Don't protect *child's* handle. - -2004-01-24 Christopher Faylor - - * fhandler.h (fhandler_base::fhaccess): Return int for compatibility - with access. - * fhandler.cc (fhandler_base::fhaccess): Return int. Use consistent - variable name for exit value. Exit at bottom, printing debugging - information, like other cygwin functions. - -2004-01-23 Christopher Faylor - - * cygheap.cc (init_cygheap::close_ctty): Protect YA vforkism. - * fhandler.h (fhandler_base::has_acls): Make pass through for path_conv - method. - (fhandler_base::isremote): Ditto. - (fhandler_base::is_fs_special): Ditto. - (fhandler_base::has_attribute): Ditto. Define new function. - (fhandler_base::fhaccess): Declare new function based on access_worker. - (fhandler_base::set_has_acls): Eliminate obsolete function. - (fhandler_base::set_isremote): Ditto. - * fhandler.cc (fhandler_base::fhaccess): Move from syscalls.cc and into - fhandler_base class. Use fhandler methods to access data rather than - path_conv stuff. - (fhandler_base::device_access_denied): Use fhaccess method. - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Ditto. - (fhandler_base::open_fs): Remove calls to obsolete functions. - * fhandler_virtual.cc (fhandler_virtual::open): Ditto. - * winsup.h (access_worker): Remove obsolete access_worker declaration. - *syscalls.cc (access_worker): Move function to fhandler.cc. - (access): Use fhaccess method. - - * pinfo.cc (_pinfo::set_ctty): Clarify debugging output. - * sigproc.cc (sig_dispatch_pending): Ditto. - * syscalls.cc (setsid): Perform minor rearrangement. - -2004-01-23 Pierre Humblet - - * fhandler_socket.cc (fhandler_socket::create_secret_event): Avoid - creating multiple handles. Always allow event inheritance but set the - handle inheritance appropriately. Improve error handling. - (fhandler_socket::check_peer_secret_event): Improve error handling. - (fhandler_socket::close_secret_event): Simply call CloseHandle. - (fhandler_socket::set_close_on_exec): Set secret event inheritance. - -2004-01-23 Christopher Faylor - - * configure.in: Remove NEWVFORK default. - * configure: Regenerate. - * dcrt0.cc: Conditionalize vfork stuff throughout. - * dtable.cc: Ditto. - * perthread.h: Ditto. - * pipe.cc (fhandler_pipe::close): Ditto. - * spawn.cc (spawnve): Ditto. - * syscalls.cc (setsid): Ditto. - * exceptions.cc (sigpacket::process): Use macro to refer to vfork pid. - - * debug.cc (verify_handle): Define new function. - * debug.h (VerifyHandle): Define new macro. - (verify_handle): Declare new function - * fhandler.cc (fhandler_base::dup): Verify that dup'ed handle is not - supposed to be in use. - (fhandler_base::set_inheritance): Ditto. - (fhandler_base::fork_fixup): Ditto. - * fhandler_socket.cc (fhandler_socket::dup): Ditto. - * fhandler_tty.cc (fhandler_tty_slave::open): Ditto. - * net.cc (set_socket_inheritance): Ditto. - * pinfo.cc (pinfo_fixup_after_exec): Ditto. - * sigproc.cc (proc_subproc): Ditto. - (sig_send): Ditto. - * spawn.cc (spawn_guts): Ditto. - * thread.cc (pthread::init_mainthread): Ditto. - * pipe.cc (fhandler_pipe::close): Close read_state with - ForceCloseHandle since it was protected. - (fhandler_pipe::fixup_after_exec): Protect read_state handle. - (fhandler_pipe::dup): Correctly close open handles on error condition. - Verify that dup'ed handle is not supposed to be in use. - (fhandler_pipe::create): Protect read_state. - -2004-01-23 Christopher Faylor - - * exceptions.cc (sig_handle_tty_stop): Fix boneheaded mistake by using - correct check for parent state rather than inverted check mistakenly - introduced on 2003-09-15. - -2004-01-22 Brian Ford - - * fhandler_serial.cc (fhandler_serial::raw_write): Prevent a deadlock - when the input buffer overflows. - (fhandler_serial::raw_read): Correct to print the actual error and only - call PurgeComm when necessary. - -2004-01-22 Christopher Faylor - - * dcrt0.cc (reent_data): Make global. - * cygwin.din: Reexport reent_data. - -2004-01-22 Christopher Faylor - - * cygtls.cc (_threadinfo::remove): Don't assume that we are removing - _my_tls. - * exceptions.cc (setup_handler): Improve debugging output. - (call_signal_handler_now): Remove ill-advised debugger call. - * sigproc.cc (sigcomplete_main): Delete. - (sig_send): Honor FIXME and avoid using main thread's completion event - for everything or suffer races. - (pending_signals::add): Default stored mask to current process mask - rather than mask at time of signal send. - (wait_sig): Add debugging output. - * sigproc.h (sigpacket::mask_storage): Delete. - -2004-01-22 Christopher Faylor - - * fhandler.cc (fhandler_base::open): Revert isfs change. - -2004-01-21 Christopher Faylor - - * devices.in: Change raw com device to more correct form. - -2004-01-21 Christopher Faylor - - * fhandler.cc (fhandler_base::open): Use major numbers rather than - device numbers to control special behavior for devices which take - units. - * fhandler_raw.cc (fhandler_dev_raw::writebuf): Ditto. - (fhandler_dev_raw::fstat): Ditto. - (fhandler_dev_raw::open): Ditto. - (fhandler_dev_raw::ioctl): Ditto. - -2004-01-21 Nicholas Wourms - - * signal.cc (sigaction): Fix if-statement typo. - -2004-01-21 Christopher Faylor - - * cygtls.cc (handle_threadlist_exception): Change logic, improve - debugging output. - -2004-01-21 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty::ioctl): Semi-revert 2003-09-26 change - for TIOCSWINSZ. It is not an error for ioctl_request_event to be - missing. - -2004-01-20 Christopher Faylor - - * sigproc.cc (pending_signals::save): New function. - (pending_signals::restore): Ditto. - (sig_clear): Save/restore current queue pointer. - (wait_sig): Delete signals marked as such. - * sigproc.h (__SIGDELETE): New enum. - -2004-01-20 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 8. - - * cygmalloc.h: Make more concessions to attempts to get debugging - malloc working. - * debug.h: Ditto. - * dlmalloc.cc: Ditto. - * dlmalloc.h: Ditto. - * malloc_wrapper.cc: Ditto. - - * perthread.h (perthread::create): Use calloc to ensure zeroed memory. - -2004-01-20 Christopher Faylor - - * sec_acl.cc (setacl): Make sure sd_ret is large enough. - -2004-01-19 Christopher Faylor - - * sigproc.cc (sigproc_terminate): Don't close sendsig handle when - execing since we're not closing what we think we're closing. - (sig_send): Improve debugging when exiting due to no_signals_available. - - * wincap.h (wincaps::cant_debug_dll_entry): New element. - * wincap.cc: Implement above element throughout. - * dcrt0.cc (initial_env): Accommodate changes necessary to allow - initial debugging for systems which do not allow debugging in - dll_entry. - (dll_crt0_0): Add initial_env call back here. - - * Makefile.in (install-man): Use mandir as target for installation. - -2004-01-19 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 7 (should have been - done earlier). - -2004-01-19 Christopher Faylor - - * cygwin/include/signal.h: Add copyright notice. - - * cygwin.din: Make clock SIGFE. Add clock_gettime, sigwaitinfo, - timer_create, timer_delete, timer_settime. - * include/cygwin/version.h: Reflect above additions. - * fork.cc (fork_child): Call fixup_timers_after_fork. - * signal.cc (sigwait): Remove unused variable. - * timer.cc: New file. - (clock_gettime): Define new function. - (timer_tracker): Define new struct used by timer functions. - (timer_tracker::timer_tracker): New function. - (to_us): New function. - (timer_thread): New function. - (timer_tracker::settime): New function. - (timer_create): New function. - (timer_settime): New function. - (timer_delete): New function. - (fixup_timers_after_fork): New function. - * cygthread.cc: Bump thread count. - -2004-01-17 Christopher Faylor - - * signal.cc (sigwaitinfo): Define new function. - (sigwait): Redefine based on sigwaitinfo. - * include/cygwin/signal.h (sigwaitinfo): Declare. - (sigwait): Ditto. - -2004-01-17 Christopher Faylor - - * dtable.cc (dtable::vfork_parent_restore): Avoid double close of ctty - when ctty == ctty_on_hold. - -2004-01-16 Christopher Faylor - - * cygtls.h (_threadinfo::threadkill): New element. - (_threadinfo::set_threadkill): Declare new function. - (_threadinfo::reset_threadkill): Declare new function. - * dcrt0.cc (dcrt0_1): Call here so that it will be possible to attach - to running process with #(*& Windows Me/9x. - (initial_env): Try to initialize strace if uninitialized. - * gendef: Don't zero signal if threadkill is set since that will happen - in the called function. - * signal.cc (sigwait): Ensure cleanup in error conditions. - * sigproc.cc (sig_send): Clear packet mask storage. - (wait_subproc): Fill in child exit code in siginfo_t structure. - * thread.cc (pthread_kill): Set threadkill flag. - * tlsoffsets.h: Regenerate. - -2004-01-16 Christopher Faylor - - Throughout, use siginfo_t to fill out all signal information for - "kernel" signals. - * cygtls.h (_threadinfo::set_siginfo): Declare new function. - * cygtls.cc (_threadinfo::set_siginfo): Define new function. - * dcrt0.cc (do_exit): Accommodate siginfo_t considerations. - * exceptions.cc (handle_exceptions): Ditto. - (sig_handle_tty_stop): Ditto. - (ctrl_c_handler): Use killsys() to send signal. - (sigpacket::process): Rename from sig_handle. Use siginfo_t field from - sigpacket for everything. - (tty_min::kill_pgrp): Accommodate siginfo_t considerations. - (fhandler_termios::bg_check): Ditto. - * fhandler_tty.cc (fhandler_tty_slave::ioctl): Use killsys() to send signal. - * signal.cc (kill_worker): Rewrite to use siginfo_t second argument. - (kill_pgrp): Ditto. - (kill0): Define new function pulled from kill(). - (kill): Rewrite as frontend to kill0. - (killsys): Define new function. - * sigproc.cc (sigelem): Eliminate. - (sigpacket): Move to sigproc.h. Subsume sigelem. - (pending_signals): Use sigpacket rather than sigelem for everything. - (sig_clear): Ditto. - (wait_sig): Ditto. - (sig_send): Rewrite to use siginfo_t argument. - (sig_send): New function wratpper to sig_send with siginfo_t argument. - (wait_subproc): Accommodate siginfo_t considerations. - * thread.cc (pthread_kill): Ditto. - * sigproc.h (sigpacket): Move here. - (sigpacket::process): Declare "new" function. - (sig_handle): Eliminate declaration. - (sig_send): Declare with new paramaters. - (killsys): Declare new function. - (kill_pgrp): Declare. - * winsup.h: Move some signal-specific stuff to sigproc.h. - * include/cygwin/signal.h: Tweak some siginfo_t stuff. - -2004-01-16 Christopher Faylor - - * fhandler_console.cc (fhandler_console::close): Remove obsolete test - for vfork_cleanup. - * pipe.cc (fhandler_pipe::close): Add comment. - -2004-01-16 Christopher Faylor - - * cygheap.cc (init_cygheap::close_ctty): Don't NULL ctty if it is still - active. - -2004-01-16 Christopher Faylor - - * dtable.cc (dtable::vfork_parent_restore): Store ctty_on_hold prior to - calling close_all_files since it will be zeroed. - -2004-01-15 Christopher Faylor - - * gentls_offsets: Reinstate unlink of temp files. - -2004-01-14 Christopher Faylor - - * fhandler_console.cc (fhandler_console::close): Fix debugging output. - (fhandler_console::fixup_after_fork): Decrement open_fhs prior to call - to fhandler_console::open since this would cause incrementing too much - incrementing in child processes. (Probably needs to be handled more - elegantly someday) - (fhandler_console::fixup_after_exec): Ditto. - -2004-01-14 Christopher Faylor - - * cygtls.h (_threadinfo::call): Remove regparm declaration to work - around compiler bug. - -2004-01-13 Christopher Faylor - - * autoload.cc (TryEnterCriticalSection): Remove. - * dcrt0.cc (dll_crt0_0): Delete inappropriate setting of - _my_tls.stackptr to NULL since it has really bad consequences. Make - 'si' an automatic variable. - -2004-01-13 Christopher Faylor - - * cygtls.cc (_threadinfo::init_thread): Correct thinko which caused - thread list to be allocated every time. - * cygtls.h (CYGTLS_PADSIZE): Define as const int. - * sync.h: Make multiple inclusion safe. - (muto::next): Eliminate. - (muto::exiting_thread): New variable. - (muto::set_exiting_thread): New function. - (new_muto): Change to use different section for mutos since c++ give - inexplicable warning in some cases otherwise. - (new_muto1): Ditto. - * dcrt0.cc (do_exit): Call muto::set_exiting_thread here. - * sync.cc (muto_start): Eliminate. - (muto::acquire): Always give exiting thread a lock. Never give thread - a lock if exiting. - (muto::release): Ditto for releasing. - * dtable.cc (dtable::init_lock): Unline function and define here. - * dtable.h (lock_cs): Define as a muto since critical sections seem to - work oddly on Windows Me. - (lock): Accommodate switch to muto. - (unlock): Ditto. - * exceptions.cc (setup_handler): Don't worry about acquiring mutos - since that hasn't mattered for a long time. - (signal_exit): Ditto: muto stuff will be handled automatically on exit - now. - -2004-01-12 Christopher Faylor - - * Makefile.in (DLL_IMPORTS): Link advapi32 to ensure proper DLL - initialization. - * autoload.cc (RegCloseKey): Arbitrarily choose this function as a - "seed" to pull the advapi32 link library in. So, comment out the - autoloading. - * cygtls.cc (_threadinfo::init_thread): Just clear CYGTLS_PADSIZE. - (_threadinfo::remove): Add debugging. - (_threadinfo::find_tls): Ditto. - * cygtls.h (_threadinfo::padding): Make zero length (for now?). - * dcrt0.cc (dll_crt0_0): Move more initialization here from dll_crt0_1. - (dll_crt0_1): See above. - * dtable.h (dtable::lock): Remove commented out critical section - locking. - * dtable.h (dtable::init_lock): Remove commented out critical section - locking. - * dtable.h (dtable::unlock): Remove commented out critical section - locking. - * exceptions.cc (interruptible): bool'ize. - * init.cc (threadfunc_fe): Revert to storing threadfunc at stack - bottom. - (munge_threadfunc): Ditto. Avoid adding overhead to - calibration_thread. - (prime_threads): Don't initialize tls stuff. - (dll_entry): Make minor change to initialization order. - * tlsoffsets.h: Regenerate. - - * sigproc.cc (wait_sig): Add sanity check for end of process thread - exit. - - * select.h: Make minor formatting change. - -2004-01-10 Christopher Faylor - - * Makefile.in: Add still more -fomit-frame-pointer functions. - * dtable.h (dtable::lock): New function. - (dtable::unlock): New function. - (dtable::init_lock): New function. - * cygheap.h (HEAP_TLS): Declare new enum value. - (init_cygheap::threadlist): Declare new array. - (init_cygheap::sthreads): Declare new variable. - (cygheap_fdmanip::~cygheap_fdmanip): Use new dtable lock/unlock - functions. - (cygheap_fdnew::cygheap_fdnew): Ditto. - (cygheap_fdget::cygheap_fdget): Ditto. - * dtable.cc (dtable_init): Initialize fdtab critical section. - (dtable::fixup_after_fork): Ditto. - (dtable::fixup_after_exec): Ditto. - (dtable::dup2): Use lock/unlock calls to protect access to fdtab. - (dtable::find_fifo): Ditto. - (dtable::fixup_before_fork): Ditto. - (dtable::fixup_before_exec): Ditto. - (dtable::set_file_pointers_for_exec): Ditto. - (dtable::vfork_child_dup): Ditto. - (dtable::vfork_parent_restore): Ditto. - * syscalls.cc (close_all_files): Ditto. - * sync.h (muto::acquired): Declare new function. - (new_muto1): Declare new macro used to specify name of muto storage. - * sync.cc (muto::acquired): Define new function. - - * cygthread.cc (cygthread::stub): Remove signal chain removal call - since it is handled during initialization now. - * cygthread.cc (cygthread::simplestub): Remove signal chain removal - call since it is handled during initialization now. - * cygtls.cc (sentry): New class used for locking. Use throughout. - (_threadinfo::reset_exception): Don't pop stack. - (_threadinfo::find_tls): Move from exceptions.cc. - (_threadinfo::init_thread): Initialize array of threads rather than - linked list. Take second argument indicating thread function for this - thread. - (_threadinfo::remove): Search thread array rather than linked list. - Use sentry to lock. Only unlock if we got the lock. - (_threadinfo::find_tls): Ditto for first two. - (handle_threadlist_exception): Handle exceptions when manipulating the - thread list in case of premature thread termination. - (_threadinfo::init_threadlist_exceptions): Ditto. - * cygtls.h (TLS_STACK_SIZE): Decrease size. - (_threadinfo::padding): Add element to avoid overwriting lower part of - stack. - (_threadinfo::remove): Add a "wait" argument to control how long we - wait for a lock before removing. - * exceptions.cc (init_exception_handler): Make global. Take argument - to control exception handler being set. - (ctrl_c_handler): Wait forever when removing self from signal chain. - (_threadinfo::find_tls): Move to cygtls.cc. - (sig_handle): Reorganize detection for thread-specific signals. - * heap.cc (heap_init): Rework slightly. Make fatal error more verbose. - Remove malloc initialization since it can't happen during dll attach. - * init.cc (search_for): Move address to search for on stack here. - (threadfunc_ix): Ditto for stack offset. Make shared so that stack - walk potentially only has to be done once when cygwin processes are - running. - (threadfunc_fe): Use standard tls to store thread function (may change - back later). - (calibration_thread): New function. Potentially called to find - threadfunc_ix. - (munge_threadfunc): Search for "search_for" value on stack. Output - warning when thread func not found on stack. Use standard tls to store - thread function. - (prime_threads): New function. Called to prime thread front end. - (dll_entry): Call dll_crt0_0 here when DLL_PROCESS_ATTACH. Call - prime_threads here. Try to remove thread from signal list here. - * sigproc.cc (wait_sig): Initialize threadlist exception stuff here. - * thread.cc (pthread::exit): Pass argument to signal list remove - function. - * thread.h: Remove obsolete *ResourceLock defines. - - * tlsoffsets.h: Regenerate. - - * winsup.h (spf): Define temporary debug macro to be deleted later. - - * dcrt0.cc (dll_crt0_0): New function, called during DLL - initialization. Mainly consists of code pulled from dll_crt0_1. - (dll_crt0_1): See above. - (_dll_crt0): Wait for initial calibration thread to complete, if - appropriate. Move some stuff to dll_crt0_0. - (initialize_main_tls): Accommodate argument change to - _thread_info::init_thread. - * fork.cc (fork_child): Ditto. - (sync_with_child): Fix debug message. - * external.cc (cygwin_internal): Remove special considerations for - uninitialized dll since initialization happens during dll attach now. - - * dlfcn.cc (dlopen): Remove obsolete *ResourceLock calls. - (dlclose): Ditto. - -2004-01-05 Christopher Faylor - - * cygheap.h (init_cygheap::close_ctty): Declare new function. - * cygheap.cc (init_cygheap::close_ctty): Define new function. - * syscalls.cc (close_all_files): Use close_ctty. - (setsid): Ditto. - - * cygthread.cc (cygthread::stub): Remove exception initialization. - * cygthread.cc (cygthread::stub): Remove exception initialization. - (cygthread::simplestub): Ditto. - * thread.cc (pthread::thread_init_wrapper): Ditto. - * cygtls.cc (_last_thread): Make static. - (_threadinfo::call2): Initialize exception handler here. - (_threadinfo::find_tls): Move here. - * exceptions.cc (_threadinfo::find_tls): Move. - - * dcrt0.cc (__api_fatal): Add prefix info to message here rather than - including it in every call to function. - * winsup.h (api_fatal): Accommodate above change. - * debug.cc (add_handle): Don't do anything if cygheap not around. - (mark_closed): Ditto. - - * dll_init.cc (dll_list::detach): Fix debug output. - * fork.cc (sync_with_child): Ditto. - (vfork): Improve debug output. - * heap.cc (heap_init): Ditto. - - * exceptions.cc (try_to_debug): Clarify message when debugger attaches. - -2004-01-03 Christopher Faylor - - * exceptions.cc (_threadinfo::interrupt_now): Avoid double call to - sigdelayed. - * pinfo.cc (_pinfo::commune_send): Avoid inexplicable test which caused - most pids to be shown as "" on Win9x. - -2004-01-02 Christopher Faylor - - * cygheap.h (init_cygheap): Play more vfork shell games and move - ctty_on_hold and open_fhs_on_hold (back) here. - * dcrt0.cc (_dll_crt0): Just set impure_ptr_ptr here and let later - initialization deal with tls. - * dtable.cc (dtable::vfork_child_fixup): Move ctty considerations here. - (dtable:vfork_parent_restore): And here. - * fork.cc (vfork): Reflect change to ctty handling. - * perthread.h (vfork_save::fhctty): Eliminate. - - * cygwin.din: Make more exports NOSIGFE that will never be interrupted - by a signal. - - * init.cc (dll_entry): Set stackptr to NULL to catch problems earlier. diff --git a/winsup/cygwin/ChangeLog-2005 b/winsup/cygwin/ChangeLog-2005 deleted file mode 100644 index a44ab5832..000000000 --- a/winsup/cygwin/ChangeLog-2005 +++ /dev/null @@ -1,5813 +0,0 @@ -2005-12-31 Corinna Vinschen - - * syslog.cc (vsyslog): Decrement len if trailing \n has been removed. - Add \n when writing to stderr if LOG_PERROR option is set. - -2005-12-31 Corinna Vinschen - - * include/cygwin/in.h: Drop including stdint.h. Move definition - of in_port_t and in_addr_t to top of file and use throughout. Use - sa_family_t type where appropriate. - (struct in6_addr): Change `unsigned char' to `uint8_t'. - (struct sockaddr_in6): Add sin6_scope_id member. Add comments. - * include/cygwin/socket.h: Include stdint.h. Move definition of - socklen_t to top of file. Define sa_family_t. Define struct - sockaddr_storage as per SUSv3. - * include/sys/un.h: Include cygwin/socket.h. Use sa_family_t type. - -2005-12-29 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_common::__acquire_output_mutex): Use - strace method rather than accessing field directly. - (fhandler_tty_common::__release_output_mutex): Ditto. - -2005-12-29 Christopher Faylor - - * child_info.h (CURR_CHILD_INFO_MAGIC): Reset. - (child_info::dwProcessId): Delete. - (child_info::straced): New variable. - (child_info::handle_fork): New member function. - * dcrt0.cc (in_forkee): New global variable. - (__cygwin_user_data::forkee): Mark as obsolete. - (do_global_ctors): Use in_forkee rather than user_data->forkee. - (get_cygwin_startup_info): Ditto. Deal with new straced field to allow - strace to deal with children of attached processes. - (initial_env): Accommodate changes to strace::hello. - (child_info_fork::handle_fork): Rename from plain old 'handle_fork'. - Move alloc_stack() call elsewhere. - (dll_crt0_0): Fill out more of user_data. Reference handle_fork via - fork_info. Add some debugging output. - (_dll_crt0): Don't wait for sync thread if sync_startup is invalid. - Zero sync_startup here. Call alloc_stack() here, if appropriate. - (dll_crt0_1): Use in_forkee rather than user_data->forkee. - (dll_crt0): Ditto. - * malloc_wrapper.cc (malloc_init): Ditto. - * dll_init.cc (in_forkee): Remove local static version of this - variable. - (dll_list::load_after_fork): Don't set in_forkee here. - * external.cc (cygwin_internal): Use strace method rather than - accessing field directly. - * fhandler.cc (fhandler_base::read): Ditto. - * fhandler_tty.cc (fhandler_tty_common::__acquire_output_mutex): Ditto. - * fork.cc (frok::parent): Invoke strace write_childpid to communicate - with potential strace. - (child_copy): Add more detail to debugging output. - * init.cc (calibration_id): New static variable. - (prime_threads): Set sync_startup to invalid handle if we already know - about thread_func_ix. Use static calibration_id to hold calibration - thread id. - * munge_threadfunc (munge_threadfunc): Don't try to debug if we don't - find threadfunc_ix. - (dll_entry): Avoid calling munge_threadfunc and _cygtls::remove on - non-cygwin threads invoked during process startup. - * pinfo.cc (set_myself): Always call strace.hello here regardless of - DEBUGGING. - * sigproc.cc (child_info::child_info): Remove spurious handling of - dwProcessId. Set straced as appropriate. - * spawn.cc (spawn_guts): Rename ciresrv to ch. Invoke strace - write_childpid to communicate with potential strace. - * strace.cc: Include child_info.h. - (strace::hello): Remove inited test. Use active() method to test if - strace has been activated. Handle case where we are started before - (mypid): New function. - (strace::vsprntf): Try to deal more intelligently with case where - progname may not be filled out. Put pid in parentheses if it is a - windows pid rather than a cygwin pid. myself has been filled out. - (strace::write_childpid): New function for notifying strace about the - creation of children. - (strace::vprntf): Use strace method rather than accessing field - directly. - (strace_printf): Ditto. - (strace::wm): Ditto. - * winsup.h (in_forkee): Declare. - * include/sys/strace.h (strace::write_childpid): Declare new function. - (strace::attached): Define new function. - (strace::active): Ditto. - (strace::active_val): Ditto. - (_STRACE_ON): Delete. - (_STRACE_OFF): Ditto. - (define_strace0): Use strace method rather than accessing field - directly. - (strace_printf_wrap): Ditto. - (strace_printf_wrap1): Ditto. - -2005-12-28 Christopher Faylor - - * environ.cc (win_env::add_cache): Don't add variables to the - environment during initialization. - -2005-12-27 Corinna Vinschen - - * exceptions.cc (_cygtls::handle_exceptions): Drop redundant `break'. - -2005-12-27 Corinna Vinschen - - * exceptions.cc (inside_kernel): Rename from interruptible. - Accommodate change throughout file. - -2005-12-27 Corinna Vinschen - - * exceptions.cc (interruptible): New function, code stripped from - _cygtls::interrupt_now. - (_cygtls::handle_exceptions): Handle STATUS_DATATYPE_MISALIGNMENT as - SIGBUS error. Differ between unmapped memory (SEGV_MAPERR) and access - violation (SEGV_ACCERR) in case of STATUS_ACCESS_VIOLATION. Write - kernel log message in case of uncatched STATUS_ACCESS_VIOLATION. - (_cygtls::interrupt_now): Just call interruptible now instead of - evaluating interruptibility here. - -2005-12-27 Corinna Vinschen - - * path.cc (path_conv::check): Rework loop removing trailing dots - and spaces. - - * syslog.cc (vklog): Set facility to LOG_KERN if not set. - -2005-12-26 Christopher Faylor - - * dcrt0.cc (__api_fatal): Simplify to just use strace mechamisms. - (do_exit): Move minimal_printf... - * pinfo.cc (pinfo::exit): ...into here. - * strace.cc (strace::vprntf): Guarantee output to the console when - system_printf/api_fatal. - - * heap.cc (heap_init): Wait a second before issuing an error when - ERROR_INVALID_ADDRESS since this is probably due to a CTRL-C handler - sneaking in, using the memory that we want to use for the heap, and, - eventually exiting. - -2005-12-23 Christopher Faylor - - * cygtls.cc (_cygtls::handle_threadlist_exception): Make an error - fatal. - * cygtls.h (sockaddr_in): Use header rather than defining our own - structure. - * exceptions.cc (_cygtls::interrupt_setup): Use exact contents of - sa_mask rather than assuming that current sig should be masked, too. - (_cygtls::call_signal_handler): Use more aggressive locking. - * gendef (_sigbe): Wait until later before releasing incyg. - (_sigreturn): Remove more arguments to accommodate quasi-sa_sigaction - support. - (_sigdelayed): Push arguments for sa_sigaction. More work needed here. - * signal.cc (sigaction): Implement SA_NODEFER. - * tlsoffsets.h: Regenerate. - - * sigproc.cc (wait_sig): Use default buffer size or Windows 9x - complains. - - * pinfo.cc (_onreturn::dummy_handle): Remove. - (_onreturn::h): Make this a pointer. - (_onreturn::~_onreturn): Detect whether pointer is NULL rather than - value is NULL. - (_onreturn::_onreturn): Set h to NULL initially. - (_onreturn::no_close_p_handle): Set h to NULL. - (winpids::add): Initialize onreturn with value from p.hProcess - immediately. - -2005-12-22 Christopher Faylor - - * fork.cc (fork): Honor error return from sig_send. Don't continue - with fork if we couldn't suspend signals. - * sigproc.cc (sig_send): Set sigCONT event when we see __SIGNOHOLD. - (wait_sig): Remove holding_signals. Create pipe with a buffer which - will theoretically cause blocking if there is nothing reading on the - pipe. Wait for sigCONT at end of loop when we have a __SIGHOLD. - -2005-12-22 Corinna Vinschen - - * fhandler.h (fhandler_base::issymlink): New method. - * syscalls.cc (open): Handle O_NOFOLLOW flag. - * include/fcntl.h (_FNOFOLLOW): New define. - (O_NOFOLLOW): Ditto. - * include/cygwin/version.h: Bump API minor number. - -2005-12-22 Christopher Faylor - - * pinfo.cc (winpids::add): Increment nelem when winpid is true since we - don't care if it's a cygwin process in that case. - -2005-12-22 Christopher Faylor - - * pinfo.cc (winpids::release): Fix typo. - -2005-12-21 Christopher Faylor - - * pinfo.cc (pinfo::init): Clarify comment slightly. - (_onreturn): New helper class. - (winpids:add): Remove copied stuff. Try to put process handle into - pinfo in question and use _onreturn class to control when to close it. - (winpids::release): Remove use of copied array. Free procinfo when - hProcess is NULL. Otherwise call release and call CloseHandle on - hProcess. - * pinfo.h (winpids::copied): Remove throughout class. - -2005-12-21 Christopher Faylor - - * pinfo.cc (pinfo::init): Remove spurious low_priority_sleep. - -2005-12-21 Christopher Faylor - - * spawn.cc (spawn_guts): Hide the window whenever ctty == -1, not just - when we have no console. - -2005-12-21 Christopher Faylor - - * cygheap.cc (init_cygheap::manage_console_count): Revert previous - change. Handle this a different way. - * external.cc (cygwin_internal): Accommodate extra - hook_or_detect_cygwin argument. - * hookapi.cc (cygwin_internal): Fill in subsys variable with the - subsystem of the executable. - * spawn.cc (av::iscui): New variable. - (spawn_guts): Hide window when we don't have a console and this isn't - NT/XP/2003. - (av::fixup): Set iscui flag. - * winsup.h (hook_or_detect_cygwin): Accommodate extra argument. - -2005-12-21 Christopher Faylor - - * cygheap.cc (init_cygheap::manage_console_count): Don't call - FreeConsole on 9x/Me. - -2005-12-21 Corinna Vinschen - - * (fhandler_disk_file::fchown): Remove execute bits from "sensible" - permissions. Use same setting as in symlink. - -2005-12-21 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_base::fstat_helper): Fix inode number - debug output. - (fhandler_disk_file::fchown): Always set sensible permission values - when creating the ACL for symlinks. - -2005-12-20 Corinna Vinschen - - * winsup.h (flush_file_buffers): Define as inline function. - * miscfuncs.cc (flush_file_buffers): Remove. - -2005-12-20 Corinna Vinschen - - * winsup.h (flush_file_buffers): Declare new function. - (FLushFileBuffers): New define. - * miscfuncs.cc (flush_file_buffers): Define new function. - -2005-12-20 Christopher Faylor - - * fhandler.h (fhandler_termios::fixup_after_exec): Make non-inlined. - * fhandler_termios.cc (fhandler_termios::fixup_after_exec): Don't call - fixup_after_fork if close_on_exec'ed. - -2005-12-19 Christopher Faylor - - * cygtls.h (_cygtls::interrupt_now): Subsume interruptible(). - (interruptible): Delete. - (setup_handler): Remove interruptible call and just use return from - interrupt_now. - -2005-12-19 Christopher Faylor - - * fhandler.h (set_console_state_for_spawn): Add an argument to the - declaration. - * fhandler_console.cc (set_console_state_for_spawn): Ditto for the - definition. Only set invisible console for non-cygwin process. Remove - debugging leftover. - * spawn.cc (spawn_guts): Pass argument denoting whether this is a - cygwin process to set_console_state_for_spawn and only call this - function when exec'ing. - -2005-12-19 Corinna Vinschen - - * mmap.cc (fhandler_dev_zero::mmap): Call VirtualFree(MEM_RELEASE) - with zero length parameter, otherwise it fails. - (fhandler_dev_zero::munmap): Ditto. - -2005-12-18 Christopher Faylor - - * fhandler.h (fhandler_console::invisible_console): Declare new - variable. - (fhandler_pipe::fixup_in_child): Declare new function. - (fhandler_console::need_invisible): Ditto. - (fhandler_console::has_a): Ditto. - * fhandler_console.cc (set_console_state_for_spawn): Eliminate return - value. Set up an invisible console if necessary prior to spawning. - (fhandler_console::invisible_console): Define. - * fhandler_tty.cc (fhandler_tty_slave::open): Use - fhandler_console::invisible_console to setup an invisible console. - * pipe.cc (fhandler_pipe::fixup_in_child): Define new function from - fixup_after_exec. - (fhandler_pipe::fixup_after_exec): Use fixup_in_child when appropriate. - (fhandler_pipe::fixup_after_fork): Ditto. - * spawn.cc (handle): Reorganize and modernize a little. - (spawn_guts): Rely on set_console_state_for_spawn to set the console - into the right state but don't create the process with "detached" flag - if we have no controlling tty since that confuses 'cmd'. - * dtable.cc (dtable::stdio_init): Don't set console as controlling - terminal if we have an invisible console. - - * sigproc.cc (child_info::sync): Use correct name in ForceCloseHandle1. - -2005-12-18 Christopher Faylor - - * include/sys/dirent.h: Change __deprecated_d_ino to __invalid_d_ino - throughout to make things a little clearer. - * dir.cc (readdir_worker): Reflect above change. - -2005-12-16 Christopher Faylor - - * winsup.h (child_copy): Change prototype to match new functionality. - * cygheap.cc (cygheap_fixup_in_child): Accommodate new child_copy - arguments. - * dcrt0.cc (dll_data_start): Move definition here from fork. - (dll_data_end): Ditto. - (dll_bss_start): Ditto. - (dll_bss_end): Ditto. - (handle_fork): New function. Called when forked to deal with fork - issues and copy data to this process from the parent. - (dll_crt0_0): Call handle_fork when _PROC_FORK condition. - (dll_crt0): Don't copy user_data when we've forked. Don't zero first - element of main_environment ever. - (cygwin_dll_init): Ditto. - * fork.cc (child_copy): Rename from fork_copy and change arguments so - that each pair of things to copy gets its own descriptor. - (frok::child): Remove fixup_mmaps_after_fork call here. Move to - handle_fork in dcrt0.cc. - (frok::parent): Use child_copy rather than fork_copy and accommodate - changes in parameters. - - * exceptions.cc (setup_handler): Delay test of whether we're locked - until after GetThreadContext has been called since there are apparently - cases where SuspendThread does not cause an immediate thread - suspension. - -2005-12-16 Christopher Faylor - - * init.cc (dll_entry): Call prime_threads after dll_crt0_0 to avoid - conflicts between heap allocation and thread stack allocation. - -2005-12-16 Christopher Faylor - - * hookapi.cc (putmem): Remove query of previous memory protection since - we get that for free the first time we call VirtualProtect. - -2005-12-15 Corinna Vinschen - - * mmap.cc (fhandler_dev_zero::fixup_mmap_after_fork): Use - system_printf like any other fixup_mmap_after_fork. - -2005-12-14 Corinna Vinschen - - * fhandler.cc (ACCFLAGS): Remove macro. - (fhandler_base::get_default_fmode): Use O_ACCMODE instead of ACCFLAGS - and or'ed read/write flags. - (fhandler_base::open_9x): Use O_ACCMODE instead of or'ed read/write - flags. - (fhandler_base::open): Ditto. - * fhandler_disk_file.cc (fhandler_base::open_fs): Ditto. - * fhandler_mem.cc (fhandler_dev_mem::open): Ditto. - * fhandler_raw.cc (fhandler_dev_raw::open): Ditto. - -2005-12-14 Corinna Vinschen - - * fhandler.cc (fhandler_base::open_9x): Handle O_SYNC and O_DIRECT - flags. - (fhandler_base::open): Ditto. - * fhandler_floppy.cc (fhandler_dev_floppy::open): Don't allocate devbuf - in O_DIRECT case. - * fhandler_raw.cc (fhandler_dev_raw::ioctl): Don't allow buffer - changes in O_DIRECT case. Allow returning a buffer size 0, which - indicates O_DIRECT. - * fhandler_tape.cc (fhandler_dev_tape::open): Use O_SYNC flag to - hand down the !buffer_writes case. Don't allocate devbuf in O_DIRECT - case. - (fhandler_dev_tape::raw_read): Don't mess with devbuf if it's NULL. - * include/fcntl.h: Define _FDIRECT, O_DIRECT, O_DSYNC and O_RSYNC. - * include/cygwin/version.h: Bump API minor version. - -2005-12-13 Christopher Faylor - - * cygtls.cc (_cygtls::remove): Don't bother if we're exiting. - * sigproc.cc (_cygtls::remove_wq): Ditto. - -2005-12-13 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty::open): Enhance comment. - -2005-12-13 Corinna Vinschen - - * fhandler_tty.cc (fhandler_tty::open): Close newly created window - station after switching to original window station. - -2005-12-13 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty::open): Add a comment. - -2005-12-12 Christopher Faylor - - * times.cc (hires_ms::usecs): Subtract from slop from system time or - we'll always end up priming the pump. - -2005-12-12 Nick Duffek - - * times.cc (systime): Correct precision referenced in comment. - -2005-12-12 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::open): Don't free original - windows station since that will cause strange problems displaying - fonts. Reset windows station to original station after creating - console. - * times.cc (hires_ms::usecs): Only reprime when calculated time is less - than system time. - -2005-12-12 Christopher Faylor - - * pinfo.cc (winpids::add): Don't copy procinfo when there is no cygwin - process associated with the pid, i.e., procinfo == NULL. - -2005-12-12 Christopher Faylor - - * times.cc (hires_ms::usecs): Correct order when checking if high - precision time is <= current time. - -2005-12-12 Christopher Faylor - - * pinfo.cc (size_copied): New convenience macro. - (winpids::add): Alias the element that we are working on for slightly - better clarity. Honor the "make_copy" flag. - (winpids::release): Free and zero procinfo field if it was allocated - via malloc. - (winpids::~winpids): Free copied array. - * pinfo.h (class pinfo): Make winpids class a friend. - (winpids::make_copy): New field. - (winpids::copied): New array. - (winpids::reset): Reset npids after releasing pinfos or suffer a memory - leak. - (winpids::winpids): Try harder to zero all fields in the class. - -2005-12-12 Corinna Vinschen - - * autoload.cc (GetSystemTimes): Remove. - -2005-12-12 Corinna Vinschen - - * fhandler_proc.cc (format_proc_uptime): Drop usage of GetSystemTimes. - Use NtQuerySystemInformation to evaluate uptime and idle_time from - all CPU's processor times. Fallback to GetTickCount. - -2005-12-12 Corinna Vinschen - - * mmap.cc (gen_create_protect): Always generate WRITECOPY protection - for private maps. - (fixup_mmaps_after_fork): Fix calculation of WRITECOPY protection for - VirtualProtect. Add some words to the comment. - -2005-12-10 Christopher Faylor - - * dirent.h: Change the rest of the d_ino's to __deprecated_d_ino. - -2005-12-10 Christopher Faylor - - * malloc.cc: Update to version 2.8.3. - * cygmalloc.h (MSPACE): Remove unneeded definition. - -2005-12-08 Corinna Vinschen - - * fhandler_raw.cc (fhandler_dev_raw::ioctl): Only allow 0, 1 or a - multiple of 512 as new buffersize. - -2005-12-08 Pekka Pessi - Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::recvfrom): Mask flags with - MSG_WINMASK for Windows socket calls. - (fhandler_socket::recvmsg): Ditto. - (fhandler_socket::sendmsg): Ditto. - -2005-12-07 Christopher Faylor - - * hires.h (hires_ms::initime_ms): Delete. - (hires_ms::initime_us): Just define as LONGLONG. - (hires_ms::uptime): New function. - * select.cc (select_stuff::wait): Use gtod for timing to attempt to - avoid windows 32 bit wraparound. - * times.cc (systime): New function. - (times): Replace GetTickCount with gtod.uptime. - (hires_us::prime): Use systime() to calculate system time rather than - calling GetSystemTimeAsFileTime directly. - (hires_ms::prime): Ditto. Eliminate initime_ms. - (hires_ms::usecs): Try harder to detect wraparound. - - * fhandler_proc.cc (format_proc_partitions): Set drive_size to zero to - avoid a compiler warning. - -2005-12-07 Corinna Vinschen - - * fhandler_proc.cc (format_proc_partitions): Use modern IOCTLs - to determine drive size as far as possible. - -2005-12-07 Corinna Vinschen - - * fhandler_raw.cc (fhandler_dev_raw::ioctl): Fix INVALID_PARAMETER - condition. Only copy devbuf to buf if buf is non-NULL. - -2005-12-07 Corinna Vinschen - - * fhandler_raw.cc (fhandler_dev_raw::ioctl): Fix setting devbuf - when rd_parm is 0 or 1. - -2005-12-07 Corinna Vinschen - - * fhandler_floppy.cc (fhandler_dev_floppy::lseek): Fix test for - valid file position at EOM. - -2005-12-07 Christopher Faylor - - * include/cygwin/stdlib.h: Guard compilation of *unsetenv* in newlib. - -2005-12-07 Corinna Vinschen - - * exceptions.cc (_cygtls::handle_exceptions): In case of a - STATUS_ACCESS_VIOLATION, check if the page is a mmaped page beyond - a file's EOF. Generate SIGBUS instead of SIGSEGV then. - * mmap.cc (__PROT_ATTACH): New define. - (__PROT_FILLER): Ditto. - (fh_anonymous): Rename from fh_paging_file; - (fh_disk_file): New global static variable. - (attached): New inline function. - (filler): Ditto. - (gen_create_protect): Split off from gen_protect to use the file's - access mode to create mapping always with maximum allowed protections. - (gen_protect): Accommodate pages attached beyond EOF. Use symbolic - values instead of numerics when possible. Drop create parameter. - (gen_access): Use file's access mode instead of protection. - (CreateMapping9x): Create named mapping names so that different - creation access modes result in different mappings. - (CreateMappingNT): Only reserve attached pages, don't commit them. - (MapViewNT): Ditto. Set AT_ROUND_TO_PAGE for all non-NULL base - addresses. - (mmap_func_t): Define CreateMapping and MapView function pointers - with additional openflags parameter. - (class mmap_record): Add openflags member. - (mmap_record::mmap_record): Add openflags parameter. - (mmap_record::get_openflags): New accessor. - (mmap_record::attached): Call global attached function. - (mmap_record::filler): Call global filler function. - (mmap_record::gen_create_protect): Call global gen_create_protect - function. - (mmap_record::gen_protect): Drop create parameter. - (mmap_record::alloc_fh): Set fhandler's access flags. - (list::search_record): Accommodate filler pages. - (list::set): Use inode number as hash value. - (map::get_list_by_fd): Check hash value against file's inode number. - (mmap_is_attached_page): New function to evaluate if a given address - is on a attached page. Called from _cygtls::handle_exceptions. - (mmap_worker): New function to do mapping and bookkeeping in a - single call. - (mmap64): Use roundup2 to round length to pagesize alignment. - Initialize global fhandlers. Simplify anonymous initialization. - Add SUSv3 compatible check of file open mode vs. requested protection. - Try creating new file handles to allow maximum page protection. - Allow creating attached pages in case of mapping beyond EOF. - Close new file handle if one has been created. - (munmap): Align len to pagesize. - (msync): Rework argument checks. Align len to pagesize. - (mprotect): Ditto. Accommodate attached pages. - (mlock): Use roundup/rounddown macros instead of homemade expressions. - (munlock): Add page alignment as in mlock. - (fhandler_dev_zero::munmap): Fix unmapping of non-private mappings. - (fhandler_dev_zero::fixup_mmap_after_fork): Accommodate filler pages. - (fixup_mmaps_after_fork): Don't fail if attached pages couldn't be - created in child. Avoid superfluous call to VirtualFree. Check for - original allocation protection to fix PAGE_WRITECOPY protection. - * ntdll.h: Revert deletion of AT_ROUND_TO_PAGE define. - * winsup.h (mmap_is_attached_page): Declare. - -2005-12-05 Christopher Faylor - - * include/cygwin/stdlib.h: New file. - * environ.cc (unsetenv): Change to return -1 on input error. - * include/cygwin/version.h: Add more description to latest api bump. - -2005-12-05 Christopher Faylor - - * dir.cc (readdir_workdir): Only fill out d_ino when linked into older - app. - * include/cygwin/version.h: Bump api minor number to 147, reflecting - obsolescence of d_ino. - (CYGWIN_VERSION_USER_API_VERSION_COMBINED): New convenience macro. - (CYGWIN_VERSION_CHECK_FOR_NEEDS_D_INO): New convenience macro. - * include/sys/dirent.h: Change d_ino field to __deprecated_d_ino. - -2005-12-05 Christopher Faylor - - Remove unneeded whitespace. - * cygtls.cc (_cygtls::set_state): Delete. - (_cygtls::reset_exception): Ditto. - (_cygtls::init_thread): Set initialized state directly here. - (_cygtls::push): Remove exception argument. Don't treat exceptions - specially. - * cygtls.h (_cygtls::push): Ditto. - (_cygtls::isinitialized): Don't treat exceptions specially. - (_cygtls::reset_exception): Delete. - (_cygtls::set_state): Ditto. - (_cygtls::handle_exceptions): Don't push ebp on the stack prior to - calling sig_send. Just set incyg instead. - (_cygtls::interrupt_setup): Accommodate _cygtls::push argument change. - (_cygtls::interrupt_now): Ditto. - (setup_handler): Don't treat exceptions specially. - * gendef (longjmp): Always zero incyg flag. - -2005-12-04 Corinna Vinschen - - * environ.cc (spenvs): Add "windir" as an "always export" variable - to accommodate WinSock on Windows 95. - -2005-12-02 Christopher Faylor - - * include/exceptions.h (exception_list): Revert previous change. - Windows doesn't care. - (exception_handler): Use real exception_list parameter type rather than - void * - * tlsoffsets.h: Regenerate. - * cygtls.h (_cygtls::handle_exceptions): Use real exception_list - parameter type rather than void *. - (handle_threadlist_exception): Ditto. - (init_exception_handler): Ditto. - * cygtls.cc (_cygtls::handle_threadlist_exception ): Ditto. - (_cygtls::init_exception_handler): Add kludge to terminate linked list - with a loop, which seems to solve problem of RtlUnwind causing problems - * exceptions.cc (rtl_unwind): Use real exception_list parameter type - rather than void *. - (_cygtls::handle_exceptions): Ditto. - -2005-12-02 Christopher Faylor - - * cygtls.h (_cygtls::el): New field. - (_cygtls::handle_exceptions): New function declaration. - (_cygtls::handle_threadlist_exception): Ditto. - (_cygtls::init_exception_handler): Ditto. - (_cygtls::init_threadlist_exceptions): Remove arg from declaration. - * cygtls.cc (_cygtls::call2): Don't initialize exceptions here. - (_cygtls::init_thread): Do it here instead and use member function. - (_cygtls::handle_threadlist_exception): Move into _cygtls class. - (_cygtls::init_exception_handler): Ditto. Rely on existence of 'el' - memmber in _cygtls. - (_cygtls::init_threadlist_exceptions): Ditto. - * dcrt0.cc (dll_crt0_1): Remove exception_list definition and setting - since it now commonly resides in the tls. - * exceptions.cc (init_exception_handler): Move to cygtls.cc. - (init_exceptions): Ditto. - (rtl_unwind): New, safe wrapper function for RtlUnwind. - (_cygtls::handle_exceptions): Move to _cygtls. Call rtl_unwind to - unwind frames and eliminate copying of structures. Put address of - failing instruction in si_addr, not the address on the stack. Return 0 - to indicate that we've handled this exception. - * external.cc (cygwin_internal): Make CW_INIT_EXCEPTIONS a no-op. - * sigproc.cc (wait_sig): Accommodate argument change to - _cygtls::init_threadlist_exceptions. - * tlsoffsets.h: Regenerate. - * include/exceptions.h (exception_list): Add more stuff to the - exception list. Apparently windows needs this? - (init_exceptions): Remove bogus declaration. - - * include/cygwin/signal.h (SI_USER): Redefine as zero as per SUSv3. - * include/cygwin/version.h: Bump API minor version number to 146. - - * thread.cc (pthread_kill): Set si_pid and si_uid. - - * timer.cc (timer_thread): Set si_code to SI_TIMER. - -2005-12-01 Christopher Faylor - - * dcrt0.cc (getstack): Try harder to modify memory. - (alloc_stack): Alloc page prior to stack top, too. - -2005-12-01 Christopher Faylor - - * devices.h (_major): Revert previous ill-advised change. - (_minor): Ditto. - -2005-12-01 Christopher Faylor - - * exceptions.cc (handle_exceptions): Translate a guard page exception - to a "SIGBUS". - -2005-12-01 Corinna Vinschen - - * mmap.cc: Make debug output more consistently. Fix some comments. - (gen_protect): Convert to inline function. - (gen_access): Ditto. - (mmap_record::gen_protect): Add create parameter as in global function. - (mmap_record::alloc_page_map): Change condition so that always the - correct protection setting is set after mapping has been established. - (mmap64): For anonymous mappings set offset always to 0. - (fixup_mmaps_after_fork): Always call fixup_mmap_after_fork method - with the MAP_FIXED flag set. - -2005-12-01 Christopher Faylor - - * devices.h (_minor): Coerce argument to proper type before - manipulating. - (_major): Ditto. - (device::is_fs_special): New function. - * fhandler_disk_file.cc (fhandler_base::fstat_helper): Set the size to - 0 for devices rather than reporting the size of the symlink. - (fhandler_disk_file::readdir): Use is_fs_special to determine if .lnk - should be stripped. - * path.cc: Rename symlink_info::is_symlink to symlink_info::issymlink - throughout. - (symlink_info::isdevice): New field. - (path_conv::check): Use 'isdevice' to determine if just-parsed entity - is a device rather than relying on non-zero major/minor. - (symlink_info::parse_device): Set isdevice to true if we've discovered - a device. - (symlink_info::check): Clear isdevice field prior to processing. Use - isdevice to control debugging output. - (symlink_info::set): Set isdevice to false. - * path.h (path_conv::is_fs_special): New function. - * devices.cc: Regenerate. - -2005-11-30 Christopher Faylor - - * times.cc (hires_ms::prime): Remove debugging stuff. - (hires_ms::usecs): Ditto. - -2005-11-30 Corinna Vinschen - - * mmap.cc (list::try_map): New method, implementing trying to map - within another already existing map, moved from mmap64 here. - (mmap64): Just call try_map now. - (fhandler_dev_zero::fixup_mmap_after_fork): Always create new private - map with PAGE_READWRITE protection. - (fixup_mmaps_after_fork): Fix comment. - -2005-11-29 Corinna Vinschen - - * include/cygwin/version.h: Bump API minor version. - -2005-11-29 Corinna Vinschen - - * fhandler.h (fhandler_dev_zero::mmap): Add method. - (fhandler_dev_zero::munmap): Ditto. - (fhandler_dev_zero::msync): Ditto. - (fhandler_dev_zero::fixup_mmap_after_fork): Ditto. - * mmap.cc: Implement anonymous mapping using fhandler_dev_zero class. - Implement private anonymous maps using VirtualAlloc/VirtualFree. Fix - or add some more comments. - (fh_paging_file): Change to type fhandler_dev_zero. - (priv): New static inline function to avoid having lots of flag bit - tests in the code. Use throughout were appropriate. - (fixed): Ditto. - (anonymous): Ditto. - (noreserve): Ditto. - (autogrow): Ditto. - (gen_protect): Never generate PAGE_WRITECOPY protection for - private anonymous maps. - (gen_access): Drop FILE_MAP_EXECUTE handling since it's not supported - correctly on 9x. - (VirtualProt9x): Move comment from mmap64 here. - (mmap_record::mmap_record): Gegerate correct device entry for - anonymous maps, though unused right now. - (mmap_record::priv): Call global priv function. - (mmap_record::fixed): Call global fixed function. - (mmap_record::anonymous): Call global anonymous function. - (mmap_record::noreserve): Call global noreserve function. - (mmap_record::autogrow): Call global autogrow function. - (list::anonymous): New method. Use throughout were appropriate. - (mmap_record::compatible_flags): Drop now useless ifdef. - (mmap_record::alloc_page_map): Accommodate private anonymous maps. - (mmap_record::map_pages): Accommodate MAP_NORESERVE mappings. - (mmap_record::unmap_pages): Accommodate private anonymous maps. - (mmap64): Simplify argument check. Don't remove the MAP_PRIVATE flag - for anonymous mappings on 9x anymore since that's now handled - gracefully. - (mprotect): Accommodate MAP_NORESERVE mappings. Fix case when - non-mmap areas are just MEM_RESERVEd. - (fhandler_dev_zero::mmap): Implement anonymous mapping here. - (fhandler_dev_zero::munmap): Ditto. - (fhandler_dev_zero::msyn): Ditto. - (fhandler_dev_zero::fixup_mmap_after_fork): Ditto. - (fixup_mmaps_after_fork): Accommodate private anonymous maps. Enhance - debug output in case VirtualProtect fails. - * include/sys/mman.h: Really define MAP_NORESERVE now. - -2005-11-28 Corinna Vinschen - - * autoload.cc (NtCreateSection): Define. - * cygheap.cc (_csbrk): Call getpagesize instead of getshmlba. - * dcrt0.cc (dll_crt0_0): Call mmap_init. - * external.cc (cygwin_internal): Call getpagesize instead of getshmlba. - * fhandler.h (fhandler_base::mmap): Change access to prot parameter. - (fhandler_base::fixup_mmap_after_fork): Ditto. - (fhandler_disk_file::mmap): Ditto. - (fhandler_disk_file::fixup_mmap_after_fork): Ditto. - (fhandler_dev_mem::mmap): Ditto. - (fhandler_dev_mem::fixup_mmap_after_fork): Ditto. - * fhandler_mem.cc (fhandler_dev_mem::write): Call getsystempagesize - instead of getpagesize. - (fhandler_dev_mem::read): Ditto. - (fhandler_dev_mem::fstat): Ditto. - (fhandler_dev_mem::mmap): Move to mmap.cc. - (fhandler_dev_mem::munmap): Ditto. - (fhandler_dev_mem::msync): Ditto. - (fhandler_dev_mem::fixup_mmap_after_fork): Ditto. - * fhandler_proc.cc (format_proc_meminfo): Call getsystempagesize - instead of getpagesize. - * fhandler_process.cc (format_process_stat): Ditto. - (format_process_status): Ditto. - (get_mem_values): Ditto. - * mmap.cc: Fix formatting. Try to make more readable and modular. - Take advantage of pagesize==granularity. - (gen_protect): New static function to evaluate Windows - protection bits from POSIX protection and flags. - (gen_access): Ditto for Windows access mode. - (VirtualProt9x): Wrapper function to call VirtualProtect on 9x. - (VirtualProtNT): Ditto for NT. - (VirtualProtEx9x): Ditto for VirtualProtectEx on 9x. - (VirtualProtExNT): Ditto for NT. - (CreateMapping9x): Wrapper function for creating a mapping handle on 9x. - (CreateMappingNT): Ditto for NT. - (MapView9x): Wrapper function to map a view on 9x. - (MapViewNT): Ditto for NT. - (mmap_funcs_9x): Structure containing function pointers to wrapper - functions for 9x. - (mmap_funcs_nt): Ditto for NT. - (mmap_func): Pointer to wrapper functions used in subsequent code. - (mmap_init): Initialize mmap_func depending on OS. - (class mmap_record): Use sensible member names. Add POSIX protection - member. Drop Windows access flags member. Constify more methods. - Use accessors instead of direct member access inside of own methods. - (mmap_record::gen_protect): Class wrapper to evaluate matching - Windows protection bits. - (mmap_record::gen_access): Ditto for Windows access flags. - (mmap_record::compatible_flags): New function to check if flags are - compatible with flags of existing map. - (list::add_record): Drop offset and length arguments. - (class map): Change counters to unsigned. Match usage throughout. - (mmapped_areas): Convert from pointer to global struct. - (mmap_record::alloc_page_map): Simplify. - (mmap_record::map_pages): Ditto. - (mmap_record::fixup_page_map): Delete. - (mmap64): Simplify. Add workaround for Windows 98 bug. Fix bug on - NT that existing anonymous mappings weren't searched for a match. - (munmap): Add workaround for Windows 98 bug. - (msync): Simplify. - (mprotect): Handle existing maps correctly. - (mlock): Add local pagesize variable and enlightening comment. - (fhandler_disk_file::mmap): Main functionality now in CreateMapping/ - MapView wrapper functions. - (fhandler_disk_file::fixup_mmap_after_fork): Call MapView wrapper. - (fhandler_dev_mem::mmap): Moved from fhandler_mem.cc. Simplify by - calling MapViewNT. - (fhandler_dev_mem::munmap): Moved from fhandler_mem.cc. - (fhandler_dev_mem::msync): Ditto. - (fhandler_dev_mem::fixup_mmap_after_fork): Ditto. Call MapViewNT. - (fixup_mmaps_after_fork): Restructure and hopefully speed up loop for - setting protection and memory content on MAP_PRIVATE maps. - * ntdll.h (AT_ROUND_TO_PAGE): Remove define. - (AT_EXTENDABLE_FILE): Add define. - (NtCreateSection): Add prototype. - * syscalls.cc (getpagesize): Return granularity as pagesize now. - (getsystempagesize): New function to retrieve "real" pagesize. - (getshmlba): Delete since it's replaced by getpagesize now. - * wincap.h (wincaps::has_mmap_alignment_bug): New element. - * wincap.cc: Implement above element throughout. - * winsup.h (getshmlba): Drop prototype. - (getsystempagesize): Add prototype. - (mmap_init): Ditto. - * include/sys/mman.h: (Not yet) define MAP_NORESERVE. - -2005-11-28 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_base::fstat_helper): Don't rely on - has_acl() state for evaluating inodes. Temporarily(?) enable "real" - inodes for remote drives. - -2005-11-25 Christopher Faylor - - * heap.cc: Remove spurious getpagesize declaration. - -2005-11-25 Christian Franke - - * exceptions.cc (ctrl_c_handler): Distinguish CTRL-BREAK from CTRL-C in - some cases. - -2005-11-23 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::open): Reset the current windows - station whenever ctty == -1 regardles of whether there's a windows - station already assigned. Close the old windows station in this - situation. - * pinfo.cc (_pinfo::set_ctty): Reinstate incrementing of console count - when recording ctty so that the current tty is always around. - * autoload.cc (CloseWindowStation): Define. - -2005-11-18 Christopher Faylor - - * strptime.cc (_strptime): Fix gcc warnings. - -2005-11-18 Christopher Faylor - - * memmem.cc: Move from here. - * lib/memmem.cc: Move to here. - -2005-11-18 Corinna Vinschen - - * libc: Add subdirectory. - * Makefile.in (VPATH): Add libc subdir. - (DLL_OFILES): Add strptime.o and timelocal.o. - * cygwin.din: Export timelocal and timegm. - * localtime.cc: Define STD_INSPIRED unconditionally. - * include/cygwin/time.h (timelocal): Add declaration. - (timegm): Ditto. - * include/cygwin/version.h: Bump API minor version. - * libc/strptime.cc: New file. - * libc/timelocal.cc: New file. - * libc/timelocal.h: New file. - -2005-11-18 Christopher Faylor - - * include/cygwin/sys_time.h: Move futimes and lutimes declaration here - from newlib. - -2005-11-18 Christopher Faylor - - * times.cc (timezone): Put back (void). - * include/cygwin/time.h: Add more cygwin stuff from newlib. - -2005-11-18 Christopher Faylor - - * include/cygwin/sys_time.h: Rename from include/cygwin/time.h. - * include/cygwin/time.h: New file. - -2005-11-17 Christopher Faylor - - * fork.cc (fork): Move top-of-stack calculation later. - - * pinfo.cc (_pinfo::set_ctty): Use __ctty to print current console in - debugging output. - -2005-11-17 Corinna Vinschen - - * fhandler_tty.cc (fhandler_tty_slave::open): Don't expect that - service applications have no window station attached. - -2005-11-16 Christopher Faylor - - * times.cc (hires_ms::prime): Don't escalate the priority. - -2005-11-14 Christopher Faylor - - * include/sys/elf64.h: Fix types to reflect linux usage. - -2005-11-14 Corinna Vinschen - Christopher Faylor - - * fhandler.h (fhandler_console::fixup_after_fork_exec): Define with - additional bool parameter. - (fhandler_console::fixup_after_exec): Accommodate - fixup_after_fork_exec's parameter. - (fhandler_console::fixup_after_fork): Ditto. - * fhandler_console.cc (fhandler_console::fixup_after_fork_exec): Avoid - opening new console only when close_on_exec AND execing. - -2005-11-14 Christopher Faylor - - * fhandler.h (fhandler_console::fixup_after_fork_exec): Declare new function. - (fhandler_console::fixup_after_fork): Use fixup_after_fork_exec. - (fhandler_console::fixup_after_exec): Ditto. - * fhandler_console.cc (fhandler_console::fixup_after_fork): Delete definition. - (fhandler_console::fixup_after_fork_exec): Rename from fixup_after_exec. - * pinfo.cc (_pinfo::set_ctty): Don't play with console count here. - * syscalls.cc (close_all_files): Don't close cygheap ctty if hExeced - since the child will be copying information from us. - (setsid): Use myctty() rather than raw ctty #. - -2005-11-13 Christopher Faylor - - * cygheap.h (init_cygheap::manage_console_count): Declare new function. - (init_cygheap::console_count): Renamed from open_fhs. Make private. - * cygheap.cc (init_cygheap::manage_console_count): Define new function. - * dtable.cc (dtable::fixup_after_exec): Always call fixup_after_exec on - elements of fd even when they are about to be closed. - * fhandler.h (report_tty_counts): Remove open_fhs from debugging - output. - * fhandler_console.cc (fhandler_console::open): Use - manage_console_count rather than manipulating count directly. - (fhandler_console::close): Ditto. - (fhandler_console::fixup_after_fork): Ditto. - (fhandler_console::fixup_after_exec): Ditto. Don't close handles if - close_on_exec. - * fhandler_tty.cc (fhandler_tty_slave::open): Use - manage_console_count() rather than manipulating count directly. - Reflect change in arguments to report_tty_counts(). - (fhandler_tty_slave::close): Ditto for both. - (fhandler_tty_slave::dup): Ditto for both. - (fhandler_tty_slave::ioctl): Use myctty() rather than raw ctty #. - (fhandler_tty_slave::fixup_after_fork): Reflect change in arguments to - report_tty_counts(). - (fhandler_tty_master::init_console): Use manage_console_count() rather - than manipulating count directly. - * fhandler_clipboard.cc (fhandler_dev_clipboard::fixup_after_exec): - Don't perform any operations if close_on_exec. - * fhandler_dsp.cc (fhandler_dev_dsp::fixup_after_exec): Ditto. - * fhandler_raw.cc (fhandler_dev_raw::fixup_after_exec): Ditto. - * fhandler_serial.cc (fhandler_serial::fixup_after_exec): Ditto. - * pinfo.h (_pinfo::_ctty): Declare new function. - (myctty): Declare new macro. - (__ctty): Declare new macro. - * pinfo.cc (_pinfo::_ctty): Define new function. - (_pinfo::set_ctty): Use manage_console_count() rather than manipulating - count directly. - * signal.cc (kill_pgrp): Use myctty() and __ctty() macros rather than - raw ctty #. - * syscalls.cc (setsid): Ditto. Use manage_console_count() rather than - manipulating count directly. - -2005-11-13 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::recvfrom): Just return 0 (EOF) - in case of WSAESHUTDOWN. - (fhandler_socket::recvmsg): Ditto. - * poll.cc (poll): Set revents to POLLIN instead of POLLHUP. Add comment. - -2005-11-11 Christopher Faylor - - * cygheap.h (init_cygheap::_gtod): Remove. - * cygwin.din: Export clock_getres and clock_setres. - * hires.h (hires_ms::minperiod): Delete declaration. - (hires_ms::began_period): Ditto. - (hires_ms::prime): Make void. - (hires_ms::resolution): Just define here. - (hires_ms::usecs): Remove unneeded argument. - (gtod): Redeclare as a variable. - * timer.cc (timer_thread): Eliminate argument to gtod.usecs(). - (timer_tracker::gettime): Ditto. - (timer_tracker::settime): Ditto. - * times.cc (gettimeofday): Ditto. - (hires_ms::began_period): Delete declaration. - (hires_us::prime): Remove debugging. - (hires_ms::prime): Make void. Eliminate period stuff. - (hires_ms::usecs): Eliminate argument to gtod.usecs(). - (hires_ms::resolution): New function. - (clock_getres): Ditto. - (clock_setres): Ditto. - * version.h: Bump API version to 143. - * include/cygwin/time.h: New file. - -2005-11-10 Christopher Faylor - - * times.cc (hires_ms::prime): Comment out call to timeBeginPeriod for - now. - (hires_ms::usecs): Call prime if haven't called began_period(). - - * param.h: Don't define stuff that is already defined in endian.h. - -2005-11-10 Christopher Faylor - - * include/endian.h: Remove USE_BSD ifdef since it is never defined on - Cygwin. - -2005-11-10 Corinna Vinschen - - * syslog.cc (setlogmask): Don't mask the mask. - (vsyslog): Fix priority check. - -2005-11-10 Scott Finneran - - * include/cygwin/signal.h: Add missing sigrelse prototype. - -2005-11-08 Christopher Faylor - - * fhandler_base.cc (fhandler_base::readv): Free buf, not a pointer into - the middle of buf. - -2005-11-08 Christopher Faylor - - * memmem.cc: New file. - * include/cygwin/version.h: Bump API version number to 142. - * cygwin.din: Export memmem. - * Makefile.in: Build memmem.o. - -2005-11-08 Christopher Faylor - - * environ.cc (spenvs): Make "SYSTEMDRIVE" an "always export". - -2005-11-07 Corinna Vinschen - - * times.cc (futimes): Redirect to utimes_worker if given file - descriptor is opened R/O. - -2005-11-06 Christopher Faylor - - * dcrt0.cc (dll_crt0_0): Initialize security data first so that it can - be used by subsequent handle creation. - -2005-11-04 Christopher Faylor - - * cygheap.h (init_cygheap::_gtod): New hires_ms element. - * hires.h (hires_ms::minperiod): Remove static designation. - (hires::began_period): New field. - * signal.cc: Include headers required for cygheap.h now that gtod lives - in the cygheap. - * timer.c: Ditto. - * times.cc (gtod): Delete variable. - (gtod::minperiod): Ditto. - (gtod::began_period): Define. - (hires_ms::prime): Add more debugging output. Call timeBeginPeriod - only when !began_period. - -2005-11-04 Christopher Faylor - - * times.cc (hires_ms::prime): More debugging. - (hires_ms::usecs): Ditto. - -2005-11-03 Christopher Faylor - - * times.cc (stupid_printf): Define and use throughout -- temporarily. - -2005-11-03 Christopher Faylor - - * times.cc (hires_ms::prime): Add lots of temporary debugging output. - -2005-11-02 Christopher Faylor - - * times.cc (hires_ms::minperiod): Make copy-on-fork. - (gettimeofday): Remove temporary debugging. - (hires_us::prime): Add lots of temporary debugging output. - -2005-11-02 Christopher Faylor - - * times.cc (gettimeofday): Add temporary debugging output. - -2005-11-01 Christopher Faylor - - * include/sys/cygwin.h: Define CYGWIN_SIGNAL_STRING. - * exceptins.cc (sigpacket::process): Send a _CYGWIN_SIGNAL_STRING to - gdb if the process is being debugged. A WIP. - -2005-10-29 Christopher Faylor - - * exceptions.cc (signal_exit): Eliminate setting of main thread - priority since process lock should make that unnecessary. - * fork.cc (stack_base): Eliminate. - (frok::parent): Subsume stack_base and just set stack stuff here. - Report on priority class in debugging output. - * spawn.cc (spawn_guts): Report on priority class in debugging output. - -2005-10-29 Christopher Faylor - - * fork.cc (frok::child): Change order of cleanup prior to return. - (fork): Save more of the stack. - - * gendef: Fix some comments. - - * sigproc.cc (wait_sig): Clarify debug output. - -2005-10-29 Christopher Faylor - - * child_info.h (CHILD_INFO_MAGIC): Reset. - -2005-10-24 Christopher Faylor - - * pinfo.cc (_pinfo::fds): Lock fdtab while enumerating. - -2005-10-24 Corinna Vinschen - - * spawn.cc (spawn_guts): Don't leave the function with return inside - pthread cleanup brackets. - -2005-10-24 Christopher Faylor - - * cygheap.h (cygheap_fdenum): Remove start_fd stuff. - (cygheap_fdenum::rewind): Ditto. - * pipe.cc (fhandler_pipe::open): Lock fdtab while enumerating. - * times.cc (utimes_worker): Ditto. - -2005-10-23 Christopher Faylor - - * cygheap.h (cygheap_fdenum::cygheap_fdenum): Record locked state or - suffer deadlocks. - (class locked_process): Move to another header. - * sync.h (lock_process): Define here. - * cygtls.cc (_cygtls::fixup_after_fork): Reset spinning state as well - as stacklock state. - * dcrt0.cc (lock_process::locker): Define. - (dtable::lock_cs): Delete. - (dll_crt0_0): Initialize process lock here ASAP. - * dtable.cc (dtable_init): Eliminate call to init_lock(). - (dtable::fixup_after_fork): Ditto. - (dtable::init_lock): Delete definition. - * dtable.h (dtable::init_lock): Delete declaration. - (dtable::lock): Use process lock rather than dtable-specific lock. - (dtable::unlock): Ditto. - - * sigproc.cc (sigproc_init): Minor change to debugging output. - - * times.cc (utime_worker): Use build_fh_pc rather than reinterpreting - the posix path name again. Return any error from path_conv immediately. - -2005-10-22 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::connect): Don't restrict - WSAEINVAL -> WSAEISCONN conversion to nonblocking sockets. - (fhandler_socket::accept): Use event driven technique to implement - interuptible accept. - (fhandler_socket::wait): Allow FD_ACCEPT handling. - * net.cc (cygwin_accept): Remove workaround for allowing blocking - accept. That's entirely in fhandler_socket::accept now. - -2005-10-22 Corinna Vinschen - - * fhandler.h (class fhandler_socket): Add timeout parameter to wait() - method. - * fhandler_socket.cc (fhandler_socket::connect): Use event driven - technique (prepare/wait/release) to implement interuptible connect. - (fhandler_socket::wait): Add timeout parameter. Allow FD_CONNECT - handling. - * net.cc (cygwin_connect): Remove braindead workaround for allowing - blocking connect. That's entirely in fhandler_socket::connect now. - -2005-10-22 Corinna Vinschen - - * include/cygwin/version.h: Fix typo. - -2005-10-21 Christopher Faylor - - * dir.cc (rmdir): Eliminate nonsensical code. - - * fork.cc (fork): Move exit debug_printf to last statement. - -2005-10-20 Corinna Vinschen - - * cygwin.din (futimes): Export. - (lutimes): Export. - * times.cc (utimes_worker): Created from utimes, add nofollow flag - to implement utimes and lutimes. - (utimes): Just call utimes_worker. - (lutimes): New function. - (futimes): Ditto. - * include/cygwin/version.h: Bump API minor version. - -2005-10-19 Christopher Faylor - - * sigproc.cc (child_info::sync): Move check for !wr_proc_pipe lower. - * spawn.cc (spawn_guts): Correct check for top-level process. - -2005-10-19 Corinna Vinschen - - * autoload.cc: Revert loading rcmd, rexec, rresvport and inet_network - from wsock32.dll since these symbols are not exported from ws2_32.dll. - -2005-10-19 Christopher Faylor - - * times.cc (utimes): Only consider fds opened with write access. - -2005-10-19 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_base::utimes_fs): Use existing handle - if fhandler has one. - * times.cc (utimes): Scan open fds for matching paths and use existing - fhandler if one exists. - -2005-10-19 Christopher Faylor - - * pinfo.cc (_pinfo::dup_proc_pipe): Make warning more severe by - actually printing it. - (_pinfo::alert_parent): Fix comment. Don't send to parent if we are in - an exec stub. - -2005-10-18 Christopher Faylor - - * cygtls.cc (handle_threadlist_exception): Improve diagnostic output. - - * sigproc.cc (child_info::sync): Only clear hProcess when execing. - (wait_sig): Protect readsig handle. - -2005-10-18 Corinna Vinschen - - * autoload.cc (NtLockVirtualMemory): Import. - (NtUnlockVirtualMemory): Import. - (GetProcessWorkingSetSize): Import. - (SetProcessWorkingSetSize): Import. - * cygwin.din (mlock): Export. - (munlock): Export. - * mmap.cc (mlock): New function. - (munlock): Ditto. - * ntdll.h (STATUS_WORKING_SET_QUOTA): Define. - (LOCK_VM_IN_WSL): Define. - (LOCK_VM_IN_RAM): Define. - (NtLockVirtualMemory): Declare. - (NtUnlockVirtualMemory): Declare. - * sysconf.cc (sysconf): Implement _SC_MEMLOCK_RANGE. - * wincap.h: Implement has_working_virtual_lock throughout. - * wincap.cc: Ditto. - * include/cygwin/version.h: Bump API minor version. - * include/sys/mman.h (mlock): Declare, - (munlock): Declare. - -2005-10-18 Christopher Faylor - - * sigproc.cc (child_info::sync): Use correct name when closing to - prevent warnings when DEBUGGING. - * spawn.cc (spawn_guts): Set myself.hProcess to pi.hProcess since this - may have been zeroed by the previous sync. - -2005-10-18 Christopher Faylor - - * sigproc.cc (child_info::sync): Fix typo which caused hProcess to - never be cleared. Only clear hProcess when not forking. - -2005-10-17 Christopher Faylor - - Change process_lock to lock_process throughout. - Change all calls to new cygthread to handle extra argument, throughout. - * cygthread.h (cygthread::callproc): Declare new method. - (cygthread::cygthread): Add optional length argument to allow copying - arguments to executing thread. - * cygthread.cc (cygthread::callproc): Define new method. - (cygthread::stub): Use callfunc to invoke thread func to allow - potentially allocating stack memory which will be returned. - (cygthread::simplestub): Ditto. - (cygthread::cygthread): Accept arglen argument. Reset ev here prior to - activating thread. Wait for ev after activating thread if we're - copying contents to the thread. Wait until the end before setting h, - to allow thread synchronization. - (cygthread::release): Don't reset ev here. Rely on that happening the next - time the thread is activated. - * pinfo.h (commune_process): Rename declaration from _pinfo::commune_process. - * pinfo.cc (commune_process): Ditto for definition. Modify slightly to allow - running as a separate cygthread. - * sigproc.cc (child_info::sync): Always wait for both subproc_ready and - any hProcess if we have a cygwin parent. - (talktome): Change argument to be a pointer to siginfo_t. Contiguously - allocate whole siginfo_t structure + any needed extra for eventual passing - to commune_process thread. - (wait_sig): Accommodate change in talktome argument. - - * pipe.cc (fhandler_pipe::fixup_after_exec): Remove debugging. - -2005-10-17 Corinna Vinschen - - * autoload.cc: Never load wsock32.dll. Load all wsock32 function - from ws2_32. Rearrange symbol order accordingly. None of the ws2_32 - functions is optional right now. - (wsadata): Move from net.cc here. Define NO_COPY. - (wsock_init): Drop unused symbols ws2_32_handle and wsock32_handle. - (load_wsock32): Remove. - (WSACleanup): Remove. - * fhandler_socket.cc: Drop Winsock 1 accommodations throughout. - (fhandler_socket::readv): Accommodate new POSIX style struct msghdr. - (fhandler_socket::writev): Ditto. - (fhandler_socket::recvmsg): Ditto. Handle "old" applications using - former struct msghdr correctly. - * net.cc: Drop Winsock 1 accommodations throughout. - (wsadata): Move definition to autoload.cc. - (set_socket_inheritance): Remove. - (convert_ws1_ip_optname): New static function to convert Winsock1 - IPPROTO_IP option values into Winsock2 IPPROTO_IP option values. - (cygwin_setsockopt): Remove wrong and incomplete cleartext printing - of optname. For "old" applications, convert optname from Winsock1 - to Winsock2 values before using them. Add comment to describe the - IP_TOS weirdness on W2K and above. - (cygwin_getsockopt): Remove wrong and incomplete cleartext printing - of optname. For "old" applications, convert optname from Winsock1 - to Winsock2 values before using them. - * select.cc (start_thread_socket): Forget about winsock2_active. - * winsup.h (wsock32_handle): Remove declaration. - (ws2_32_handle): Ditto. - (netapi32_handle): Ditto. - (wsadata): Ditto. - (winsock2_active): Remove definition. - * include/cygwin/socket.h: Change formatting slightly. - (socklen_t): Move definition up in file. - (struct msghdr): Convert to POSIX style. - (struct cmsghdr): New type. - (CMSG_ALIGN): New macro. - (CMSG_LEN): Ditto. - (CMSG_SPACE): Ditto. - (CMSG_FIRSTHDR): Ditto. - (CMSG_NXTHDR): Ditto. - (CMSG_DATA): Ditto. - (SCM_RIGHTS): Ditto. - (struct OLD_msghdr): Define old msghdr structure for Cygwin internal - purposes. - (MSG_TRUNC): New macro. - (MSG_CTRUNC): Ditto. - (IP_OPTIONS): Redefine IPPROTO_IP option values to Winsock2 values. - Keep Winsock1 values for Cygwin internal purposes. - * include/cygwin/version.h: Bump API minor version. - (CYGWIN_VERSION_CHECK_FOR_USING_ANCIENT_MSGHDR): Define to check for - applications using old struct msghdr. - (CYGWIN_VERSION_CHECK_FOR_USING_WINSOCK1_VALUES): Define to check for - applications using old Winsock1 IPPROTO_IP values. - -2005-10-13 David Rothenberger - Christopher Faylor - - * Makefile.in (MKDIRP): Just use raw $(INSTALL) rather than - $(INSTALL_DATA). Create directories with 755 permissions. - -2005-10-12 Christopher Faylor - - * dir.cc (mkdir): Abandon use of PC_WRITABLE. - (rmdir): Ditto. - * path.h (PC_WRITABLE): Delete. - * path.cc (path_conv::check): Remove PC_WRITABLE accommodations. - Revisit later. - -2005-10-12 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::rmdir): Convert an - ERROR_INVALID_FUNCTION into an ERROR_FILE_NOT_FOUND. Add comment - to explain why. - -2005-10-11 Christopher Faylor - - * Makefile.in: Make sure that directories are created prior to copying - to them. - -2005-10-11 Christopher Faylor - - * net.cc (cygwin_gethostbyname): Remove debugging. - -2005-10-11 Corinna Vinschen - - * syslog.cc (try_connect_syslogd): Add priority parameter. Use writev - to add the priority to the message in a syslog conformant way. - (vsyslog): If facility isn't set in the priority, use default facility - as given in call to openlog. Fix agressive use of spaces in syslog - output. Call try_connect_syslogd with priority parameter. - -2005-10-11 Christopher Faylor - - * (symlink_info::set_error): Change to return bool if input error - should be ignored. - (symlink_info::check): Treat path as a normal file if set_error returns - false. - -2005-10-03 Christopher Faylor - - * cygheap.h (class process_lock): New class. - * dtable.h (class dtable): Add class process_lock as a friend. - * dcrt0.cc (get_exit_lock): Delete. - (do_exit): Use process_lock class instead of get_exit_lock. - * exceptions.cc (signal_exit): Ditto. - * pinfo.cc (pinfo::exit): Ditto. - (_pinfo::commune_process): Set process lock around this whole function. - (_pinfo::commune_request): Use process_lock rather than myself.lock. - * pinfo.h (pinfo::_lock): Delete. - (pinfo::initialize_lock): Delete. - (pinfo::lock): Delete. - (pinfo::unlock): Delete. - * winsup.h (get_exit_lock): Delete declaration. - -2005-10-03 Corinna Vinschen - - * uname.cc (uname): Disable use of GetNativeSystemInfo. - -2005-10-01 Christopher Faylor - - * dcrt0.cc (get_exit_lock): Use myself.lock rather than exit_lock. - * exceptions.cc (exit_lock): Delete. - (events_init): Don't init exit_lock. - * (_pinfo::commune_process): Add per-PICOM debugging. - * sigproc.cc (talktome): Add some temporary debugging statements. - - * fhandler_proc.cc (format_proc_cpuinfo): Cosmetic change. - (format_proc_partitions): Ditto. - * syscalls.cc (locked_append): Ditto. - -2005-09-30 Christopher Faylor - - * dcrt0.cc (do_exit): Don't set ES_SET_MUTO here. Call get_exit_lock() - instead. - (get_exit_lock): New function. Grabs the lock and sets initial - exit_state. - * exceptions.cc (try_to_debug): Use low_priority_sleep. - (sigpacket::process): Avoid handler if this is an exec stub. - (signal_exit): Use get_exit_lock rather than manipulating the exit_lock - critical section directly. - * pinfo.cc (pinfo::exit): Ditto. - * winsup.h (get_exit_lock): Declare. - (exit_lock): Delete declaration. - -2005-09-30 Corinna Vinschen - - * fhandler_disk_file.cc: Change calls to pc.set_attributes into - calls to pc.file_attributes throughout. - * path.h (class path_conv): Remove superfluous set_attributes method. - -2005-09-30 Corinna Vinschen - - * fhandler_floppy.cc (fhandler_dev_floppy::get_drive_info): Use - fhandler method to access major device number. Add comment to - explain floppy weirdness. - -2005-09-30 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Also use - attributes stored in this->pc if call to GetFileInformationByHandle - failed. - -2005-09-30 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Only write - attributes if call to GetFileInformationByHandle was successful. - -2005-09-29 Christopher Faylor - - * fork.cc (frok::parent): Simplify error messages. Don't issue an - error when child.remember fails. - (fork): When appropriate, build up an error message from grouped.error. - -2005-09-29 Corinna Vinschen - - * fhandler_floppy.cc (fhandler_dev_floppy::get_drive_info): Don't call - EX ioctls on floppy drives. - -2005-09-29 Corinna Vinschen - - * dir.cc (mkdir): Check for trailing /. or /.. component. - (rmdir): Ditto. - * path.cc (has_dot_last_component): New function. - * path.h (has_dot_last_component): Add declaration. - -2005-09-29 Corinna Vinschen - - * crt0.cc: Remove PPC considerations. - (WinMainCRTStartup): Add symbol as alias to mainCRTStartup. - -2005-09-28 Christopher Faylor - - Change name from commune_recv to commune_process throughout. - Change name from commune_send to commune_request throughout. - * pinfo.h (PICOM_EXTRASTR): New flag. - (PICOM_FIFO): Define with new flag. - (_pinfo::hello_pid): Delete. - (_pinfo::tothem): Delete. - (_pinfo::fromthem): Delete. - (_pinfo::commune_process): Rename from commune_recv. Add a siginfo_t - argument to declaration. - (_pinfo::commune_request): Rename from commune_send. Change DWORD to - __uint32_t in declaration. - * pinfo.cc (_pinfo::commune_process): Rename from commune_recv. Add - siginfo_t argument. Use information from argument rather than reading - from another pipe. Synchronize with other process's commune event. - (_pinfo::commune_request): Rename from commune_send. Change DWORD to - __uint32 in argument. Fill out information in new siginfo_t element - and rely on extended operation of sig_send rather than trying to deal - with synchronization issues here. Use process handle and read pipe - information filled out by sig_send to gather information from the other - process. - * sigproc.cc (sig_send): Take special action if "communing" to ensure - synchronization with the other process and to return information about - the other process to the caller. - (talktome): Accept a siginfo_t and handle arguments. Read additional - information from the signal pipe when _si_commune._si_code has the - PICOM_EXTRASTR flag set. - (wait_sig): Pass the transmitted siginfo_t struct and the pipe handle - to talktome. Close pipe read handle as soon as possible after we - detect that we're exiting. - -2005-09-28 Christopher Faylor - - * hookapi.cc (hook_or_detect_cygwin): Correct inverted test for whether - to allocate a buffer by always allocating a buffer. - -2005-09-28 Corinna Vinschen - - * fhandler.h (class fhandler_dev_raw): Delete current_position and - eof_detected status flag. Delete is_eom and is_eof methods. - Move drive_size, bytes_per_sector, eom_detected status flag, as well - as the methods read_file, write_file, raw_read and raw_write to ... - (class fhandler_dev_floppy): ... here. Remove is_eom and is_eof - methods. Add dup method. - * fhandler_floppy.cc (IS_EOM): New macro. - (fhandler_dev_floppy::is_eom): Remove. - (fhandler_dev_floppy::is_eof): Remove. - (fhandler_dev_floppy::fhandler_dev_floppy): Initialize status flags. - (fhandler_dev_floppy::get_drive_info): Only call EX functions on - systems supporting them and stop suffering strange delays. - (fhandler_dev_floppy::read_file): Move here, drop setting - current_position. - (fhandler_dev_floppy::write_file): Move here, drop setting - current_position. - (fhandler_dev_floppy::open): Rearrange comment. - (fhandler_dev_floppy::dup): New method. - (fhandler_dev_floppy::get_current_position): New inline method. Use - instead of former current_position were appropriate. - (fhandler_dev_floppy::raw_read): Move here. Drop EOF handling. - (fhandler_dev_floppy::raw_write): Move here. Drop EOF handling. - (fhandler_dev_floppy::lseek): Remove useless conditions. Convert - sector_aligned_offset to LARGE_INTEGER to improve SetFilePointer call. - (fhandler_dev_floppy::ioctl): Move blocksize check in RDSETBLK case - to here. - * fhandler_raw.cc (fhandler_dev_raw::is_eom): Remove. - (fhandler_dev_raw::is_eof): Remove. - (fhandler_dev_raw::write_file): Remove. - (fhandler_dev_raw::read_file): Remove. - (fhandler_dev_raw::raw_read): Remove. - (fhandler_dev_raw::raw_write): Remove. - (fhandler_dev_raw::dup): Drop copying removed members. - (fhandler_dev_raw::ioctl): Drop blocksize testing. - * wincap.h: Implement has_disk_ex_ioctls throughout. - * wincap.cc: Ditto. - (wincap_vista): Preliminary wincaps for Windows Vista/Longhorn. - (wincapc::init): Add Vista/Longhorn handling. - -2005-09-28 Christopher Faylor - - * dcrt0.cc (getstack): New function. - (alloc_stack): Use tls stuff for stack info rather than calling - VirtualQuery. - (dll_crt0_0): Initialize _impure_ptr stuff much earlier. Move - init_console_handler here. - * fork.cc (class frok): New class renamed from local fork() struct. - (stack_base): Change argument type. Use tls stuff to determine stack - info rather than calling VirtualQuery. - (frok::child): Rename from fork_child. Eliminate now unneeded - arguments. - (frok::parent): Rename from fork_parent and ditto. Set error and errno - as appropriate. Fixup impersonation in cleanup, if needed. Try harder - to set errno appropriately. - (fork): Define "grouped" as a frok type. Deal with errors from - fork_parent here. - * init.cc (dll_entry): Remove init_console_handler call. - -2005-09-28 Christopher Faylor - - * pinfo.cc (_pinfo::dup_proc_pipe): Ignore error if the child process - has just gone away. - -2005-09-27 Christopher Faylor - - * init.cc (prime_threads): Make this static, as it should be. - (dll_entry): Apply cosmetic changes to define closer to the way MSDN - suggests. - -2005-09-27 Corinna Vinschen - - * pthread.cc (mangle_sem_name): Use cygheap->shared_prefix instead - of fiddling with wincap.has_terminal_services manually. - -2005-09-27 Corinna Vinschen - - * cygheap.cc (cygheap_init): Add GLOBAL_PRIV to hProcToken explicitely - since hProcImpToken isn't initialized here. - * shared.cc (open_shared): Always print mapname instead of name in - debug output. - -2005-09-27 Christopher Faylor - - * strace.cc (strace::vsprntf): Avoid printing a zero pid. - -2005-09-27 Corinna Vinschen - - * init.cc (dll_entry): Call IsWow64Process with GetCurrentProcess - as process handle since hMainProc isn't initialized here. - -2005-09-27 Corinna Vinschen - - * fhandler_floppy.cc (fhandler_dev_floppy::get_drive_info): Always - try IOCTL_DISK_GET_DRIVE_GEOMETRY_EX and - IOCTL_DISK_GET_PARTITION_INFO_EX ioctls first, to allow access to GPT - partitioned disks. Fall back to old non-EX ioctls otherwise. - Add comment to explain NT4 weirdness. - -2005-09-26 Corinna Vinschen - - * errno.cc (errmap): Map ERROR_SEEK and ERROR_SECTOR_NOT_FOUND. - -2005-09-26 Christopher Faylor - - * exceptions.cc (_cygtls::call_signal_handler): Minor cleanup. - -2005-09-26 Corinna Vinschen - - * fhandler.h (class fhandler_dev_raw): Add drive information members - drive_size, current_position and bytes_per_sector. - (fhandler_dev_floppy::get_drive_info): Declare. - * fhandler_floppy.cc (fhandler_dev_floppy::is_eom): Define ERROR_SEEK - and ERROR_SECTOR_NOT_FOUND as end-of-medium conditions. - (fhandler_dev_floppy::get_drive_info): New method to have one function - retrieving drive info. - (fhandler_dev_floppy::open): Call get_drive_info to get drive - information right from the start. - (fhandler_dev_floppy::lseek): Use and set drive information members. - Especially keep track of current_position. - (fhandler_dev_floppy::ioctl): Ditto. - * fhandler_raw.cc (fhandler_dev_raw::write_file): Keep track of - current_position. - (fhandler_dev_raw::read_file): Ditto. - (fhandler_dev_raw::raw_read): Never try to read beyond end-of-medium. - (fhandler_dev_raw::dup): Handle new drive information members. - -2005-09-26 Christopher Faylor - - * exceptions.cc (handle_exceptions): Just set si_code to SI_KERNEL - first and let it be overridden. - -2005-09-26 Yitzchak Scott-Thoennes - - * exceptions.cc (_cygtls::call_signal_handler): Call signal handler - with extra siginfo_t * and void * parameters when SA_SIGINFO flag is - set. - * signal.cc (signal): Clear SA_SIGINFO flag. - (sigqueue): Fix incorrect setting of si_code. - * sigproc.cc (signal_fixup_after_exec): Clear SA_SIGINFO flag when - setting handler to SIG_DFL. - -2005-09-26 Christopher Faylor - - * pinfo.cc (proc_waiter): Properly fill out si_code as according to SUSv3. - -2005-09-26 Christopher Faylor - - * exceptions.cc (handle_exceptions): Properly fill out si_code as - according to SUSv3. - -2005-09-25 Christopher Faylor - - * sigproc.cc (wait_sig): Cosmetic change. - * pinfo.cc (pinfo::exit): Don't explicitly remove myself since some - other thread may still be using it. - -2005-09-24 Christopher Faylor - - * sigproc.cc (sigproc_terminate): More reversion of - always-exit-from-sigthread change. - -2005-09-23 Christopher Faylor - - * shared.cc (open_shared): Add crucial bit of debugging info. - -2005-09-23 Christopher Faylor - - Semi-reversion of always-exit-from-sigthread change of 2005-09-15. - * exceptions.cc (sigpacket::process): Eliminate return after call to - reinstated noreturn function. - (signal_exit): Allow function to exit when a captive process has been - terminated. - * pinfo.cc (pinfo::exit): Enter exit_lock here. Once again exit here - under control of exit_lock. - * sigproc.cc (sig_send): Don't wait for completion if process is exiting. - Remove special __SIGEXIT accommodations. - (wait_sig): Just exit the thread when a __SIGEXIT has been detected. - Don't exit the process. - -2005-09-23 Christopher Faylor - - * net.cc (cygwin_gethostbyname): Remove debugging cruft. - -2005-09-23 Christopher Faylor - - * pinfo.cc (pinfo::exit): Call ExitProcess if called from signal - thread. - -2005-09-23 Christopher Faylor - - * pinfo.cc (pinfo::exit): Eliminate use of _my_tls.thread_handle. - * tlsoffsets.h: Regenerate. - -2005-09-23 Christopher Faylor - - * cygtls.h (struct _cygtls::thread_handle): Remove/revert. - * sigproc.h (struct sipacket::thread_handle): Put thread_handle here. - * sigproc.cc (sigproc_terminate): Move setting of thread_handle... - (sig_send): ...to here. Put it in packet being sent. Only close - pack.wakeup when we're waiting for completion. - (wait_sig): Use thread_handle directly from received packet. - -2005-09-22 Christopher Faylor - - * cygheap.cc (cygheap_fixup_in_child): It's not just for exec. - * cygtls.h (struct _cygtls::thread_handle): New field. - * dcrt0.cc (exit_lock): Remove declaration. - * winsup.h (exit_lock): Add declaration. - * exceptions.cc (sigpacket::process): Properly return after - signal_exit. - * pinfo.cc (pinfo::exit): Only exit the process if - _my_tls.thread_handle has not been filled out -- which should be an - impossible event. - * sigproc.cc (sigproc_terminate): Fillout _my_tls.thread_handle to - provide something for wait_sig to wait for. Use the siginfo_t version - of sig_send and fill out the tls argument with _my_tls. - (wait_sig): Wait for the thread specified in pack.tls or (for now) - complain bitterly if it doesn't exit. - * tlsoffsets.h: Regenerate. - -2005-09-22 Christopher Faylor - - * pinfo.cc (set_myself): Call strace.hello unconditionally when - DEBUGGING. - (pinfo::init): Sleep and issue debugging output before looping when a - PID_EXITED is found. - -2005-09-22 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_base::fstat_helper): Fix copy/paste - bug. - -2005-09-22 Christopher Faylor - - * strace.cc (strace::vsprntf): Avoid accessing myself->pid if !myself. - -2005-09-22 Christopher Faylor - - * include/sys/strace.h (_STRACE_ON): Remove semicolon from definition. - (_STRACE_OFF): Remove semicolon from definition. - -2005-09-22 Corinna Vinschen - - * fhandler.h (fhandler_base::fstat_helper): Declare with additional - file attributes argument. - * fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Use - file attributes evaluated from NtQueryFileInformation or - FileInformationByHandle in call to fstat_helper. - Set pc.fileattr from just evaluated file attributes here. - (fhandler_base::fstat_by_name): Use file attributes evaluated from - FindFileFirst or default attribute in call to fstat_helper. - Set pc.fileattr from just evaluated file attributes here. - (fhandler_base::fstat_helper): Use file attributes given as argument, - not file attributes stored in this fhandler, since this information - is potentially wrong. Add comment to explain this. - * path.h (has_attribute): New global inline function. - (path_conv::set_attributes): New method to change fileattr. - -2005-09-21 Christopher Faylor - - * cygthread.cc (cygthread::operator new): Just use getenv() to look for - CYGWIN_FREERANGE_NOCHECK since the Windows environment may be truncated - by being previously execed. - -2005-09-20 Christopher Faylor - - * spawn.cc (av::fixup): Just blindly run any file if it has a .bat or - .cmd extension. - -2005-09-19 Christopher Faylor - - * dcrt0.cc (do_exit): Only call sigproc_terminate from one location -- - pinfo::exit. - * pinfo.cc (pinfo::exit): Move sigproc_terminate later so that signals - can be processed while waiting for hExeced child. - (pinfo::maybe_set_exit_code_from_windows): Set exit code from sigExeced - if it is non-zero. Set exit_state to ES_EXEC_EXIT prior to waiting for - captive process exit code. - * exceptions.cc (sigExeced): New global variable. - (signal_exit): Remove noreturn attribute from declaration. - (signal_exit): Just terminate captive process and return if hExeced on - the theory that the exit will be subsequently handled in the main - thread. - * sigproc.cc (sigproc_terminate): Eliminate test for - ES_SIGPROCTERMINATE and use ES_FINAL instead. - (sig_send): Use no_signals_available instead of duplicate test. - * winsup.h (ES_EXEC_EXIT): New enum. - (ES_SIGPROCTERMINATE): Delete. - -2005-09-19 Christopher Faylor - - * sigproc.cc (talktome): Take siginfo_t argument. Don't scan all pids - trying to find one that's talking to me. Just use the pid from - siginfo_t. - (wait_pid): Pass siginfo_t argument to talktome. - -2005-09-17 Christopher Faylor - - * pipe.cc (fhandler_pipe::open): Use 'cfree' to free buffer since it is - now allocated by cmalloc. - -2005-09-17 Corinna Vinschen - - * net.cc (cygwin_inet_ntop): Change len argument to socklen_t to - follow SUSv3. - * include/arpa/inet.h (inet_ntop): Ditto. - * include/cygwin/in.h: Include cygwin/socket.h to get socklen_t. - -2005-09-16 Christopher Faylor - - * environ.cc (build_env): Use "kilo"bytes not "mega"bytes. Return - immediately on error. - * spawn.cc (spawn_guts): Set return value to -1 on error from - build_env. - -2005-09-16 Christopher Faylor - - * environ.cc (build_env): Clear envblock and return NULL on attempt to - use env var > 32K. - * spawn.cc (spawn_guts): Set E2BIG if build_env detects an error. - -2005-09-16 Christopher Faylor - - * environ.cc (environ_init): Protect with a 'myfault' in case - GetEnvironmentStrings misbehaves. - -2005-09-16 Christopher Faylor - - * environ.cc (environ_init): Add debugging output with value returned - from GetEnvironmentStrings. - -2005-09-16 Christopher Faylor - - * environ.cc (environ_init): Issue an error if GetEnvironmentStrings - fails and return. - -2005-09-15 Christopher Faylor - - * pinfo.h (EXITCODE_SET): Move out of range of Windows error. - (EXITCODE_NOSET): Ditto. - * sigproc.cc (no_signals_available): Remove check for hwait_sig. Just - rely on my_sendsig. Pass in an argument controlling when it is - appropriate to test EXITCODE_SET. - (proc_can_be_signalled): Remove checks for myself since this function - is never called in that context. - (sigproc_init): Pre-initialize my_sendsig to non-zero so that - proc_can_be_signalled will know that we expect to be signalable soon. - (sig_send): Change debugging output. - -2005-09-15 Christopher Faylor - - * sigproc.cc (no_signals_available): Return true if sending to self - from the signal thread. - (wait_sig): Correct so that WaitForSingleObject is called when - hMainThread is != 0, rather than the reverse. - - * cygheap.cc (cygheap_fixup_in_child): Clarify potential error message. - - * fork.cc (fork_copy): Cosmetic change. - -2005-09-15 Christopher Faylor - - * sigproc.cc (wait_sig): Reorganize exit case so that ExitProcess is - always called, since that is the intent of sending a __SIGEXIT. Wait - forever for main thread to go away since, presumably, the main thread - told us it was going away. - -2005-09-14 Christopher Faylor - - * spawn.cc (av::fixup): Avoid breaking out of the wrong "loop". - -2005-09-14 Christopher Faylor - - * hookapi.cc (hook_or_detect_cygwin): Simplify very slightly. - * spawn.cc (av::fixup): Guard against problems reading an executable - which does not match Microsoft's documentation about PE format. - -2005-09-14 Christopher Faylor - - * spawn.cc (av::error): Eliminate. - (av::av): Remove reference to error. - (av::replace0_maybe): Ditto. - (av::dup_maybe): Ditto. - (av::dup_all): Ditto. - (av::unshift): Ditto. - (spawn_guts): On a fault, return E2BIG only if ENOMEM has been set. - Otherwise return EFAULT. - -2005-09-14 Christopher Faylor - - * cygtls.h (san): New structure. - (cygtls::andreas): New element. Replaces _myfault and _myfault_errno. - (cygtls::fault_guarded): Use andreas. - (cygtls::return_from_fault): Ditto. - (cygtls::setup_fault): Add a parameter denoting where to store old - fault handler, if any and use it to "stack" faults. - (cygtls::reset_fault): Restore fault from parameter. - (myfault::sebastian): New variable. - (myfault::~myfault): Pass sebastian to reset_fault. - (myfault::myfault): Store old fault values in sebastian. - -2005-09-14 Christopher Faylor - - * heap.cc (heap_init): Revert 2005-09-11 patch as it seems to - inexplicably cause problems with emacs. - -2005-09-14 Christopher Faylor - - Remove some more unneeded 'return;'s throughout. - -2005-09-14 Christopher Faylor - - * sigproc.h: Protect declaration so that it only happens when - __INSIDE_CYGWIN__. - -2005-09-14 Christopher Faylor - - * exceptions.cc (sigtid): Remove declaration. - (handle_exceptions): Use _sig_tls rather than sigtid to determine if - this is the signal thread. - (set_signal_mask): Ditto for conditionalized CGF code. - * pinfo.cc (pinfo::exit): Exit the thread if we forcefully terminated - the main thread. - * sigproc.cc (sigtid): Delete. - (_sig_tls): Define. - (sig_clear): Use _sig_tls rather than sigtid to determine if this is - the signal thread. - (sig_dispatch_pending): Ditto. - (wait_sig): Set _sig_tls here. - -2005-09-13 Christopher Faylor - - * dcrt0.cc (do_exit): Move sigproc_terminate call later since signal - handling was still needed for subsequent stuff. Call sigproc_terminate - with new exit_state value. - * pinfo.cc (pinfo::exit): Call sigproc_terminate with new exit_state - value. - * sigproc.cc (proc_terminate): Remove unnecessary (void) parameter. - (sigproc_terminate): Ditto. Add new argument to accept exit state to - be set. - (wait_sig): Reorganize __SIGEXIT handling. Add more debugging output. - * winsup.h (sigproc_terminate): Declare with new exit_state argument. - (exit_states): Reorganize to reflect new exit ordering of - sigproc_terminate. - -2005-09-13 Christopher Faylor - - * dcrt0.cc (do_exit): Rely on sigproc_terminate to set exit_state - appropriately. - * pinfo.cc (pinfo::exit): Always call sigproc_terminate here. Rely on - sigproc_terminate to signal signal thread to handle eventual process - exit. - * sigproc.cc (no_signals_available): Change criteria for determining if - this process can handle signals to itself. - (my_sendsig): New variable. Copy of my sendsig handle. - (proc_can_be_signalled): Don't send signals if exit code is set. - (sigproc_terminate): Use and set exit_state appropriately to determine - when to do anything. Send __SIGEXIT to self to control process exit. - (sig_send): Use my_sendsig for sending signals. Don't call - proc_can_be_signalled for myself since the criteria is now different - for sending signals to myself. - (wait_sig): Copy myself->sendsig to my_sendsig for future use. Exit - signal loop when __SIGEXIT is received. Wait for main thread to exit - and use its exit status to actually exit process. - * sigproc.h (__SIGEXIT): New enum. - -2005-09-13 Christopher Faylor - - * dcrt0.cc (alloc_stack): Eliminate superfluous "return;". - * debug.cc (add_handle): Ditto. - * devices.in (device::parse): Ditto. - * dtable.cc (dtable::vfork_parent_restore): Ditto. - (dtable::vfork_child_fixup): Ditto. - * environ.cc (parse_options): Ditto. - * errno.cc (seterrno_from_win_error): Ditto. - * exceptions.cc (sig_handle_tty_stop): Ditto. - (set_signal_mask): Ditto. - * fhandler.cc (fhandler_base::read): Ditto. - (fhandler_base::operator delete): Ditto. - (fhandler_base::seekdir): Ditto. - (fhandler_base::rewinddir): Ditto. - * fhandler_console.cc (fhandler_console::read): Ditto. - (fhandler_console::fixup_after_exec): Ditto. - * sigproc.cc (sigproc_init): Ditto. - (sigproc_terminate): Ditto. - - * devices.cc: Regenerate. - -2005-09-13 Christopher Faylor - - * sigproc.cc (wait_sig): Be more defensive about detecting when we're - exiting. - -2005-09-12 Christopher Faylor - - * cygthread.cc (cygthread::cygthread): Add more info to fatal error. - - * fhandler_disk_file.cc (fhandler_disk_file::readdir): Temporarily - remove insertion of /dev into root directory. - * path.cc (path_conv::check): Ditto. - -2005-09-11 Christopher Faylor - - * heap.cc (heap_init): Allocate heap from top down as a hedge against - subsequent ERROR_INVALID_ADDRESS in forked processes when CTRL-C is - pressed. - -2005-09-09 Christopher Faylor - - * heap.cc (heap_init): Be slightly more aggressive when trying to - allocate heap. Change fatal error message to avoid confusion with - cygheap. - - * spawn.cc (linebuf::finish): New function. - (linebuf::add): Cosmetic change. - (spawn_guts): Only avoid building windows command line if the program - being executed was actually mounted with -X. Don't return E2BIG if we - hit the 32K size and we're executing a detected cygwin program. Just - silently truncate the windows command line, instead. - -2005-09-08 Christopher Faylor - - * fhandler_serial.cc (fhandler_serial::tcgetattr): Just zero c_cflag - here rather than clearing CBAUD after the fact. - * termios.cc (tcgetattr): Revert previous change. - -2005-09-08 Christopher Faylor - - * fhandler_serial.cc (fhandler_serial::ioctl): Always return 0 for - window size. - * termios.cc (tcgetattr): Clear out baud part of c_cflag since it is - always ignored. - -2005-09-08 Corinna Vinschen - - * exceptions.cc (ctrl_c_handler): Disable any special CTRL_LOGOFF_EVENT - handling and add longish comment about the reasons. - -2005-09-07 Christopher Faylor - - * hookapi.cc (rvadelta): Change argument to DWORD to eliminate a - compiler warning. - - * path.h (path_conv::set_cygexec): New function. - * spawn.cc (av::iscygwin): Eliminate. - (av::av): Don't initialize iscygwin. - (spawn_guts): Just use real_path.iscygexec for all tests. - (av::fixup): Short circuit test if .exe extension and known cygexec. - Set cygexec flag appropriately if we find that program uses cygwin1.dll. - -2005-09-06 Christopher Faylor - - * dcrt0.cc (initial_env): Don't attempt stracing if dynamically loaded. - (dll_crt0_0): Move console initialization earlier. - * init.cc (dll_entry): Move console initialization here. - * exceptions.cc (init_console_handler): Fully remove any old console - handler. - (handle_sigsuspend): Make cancelable when called from non-main thread. - - * spawn.cc (spawn_guts): Don't fill out windows argv if we've deduced - that this is a cygwin-using program. - (av::fixup): Always check executables to see if they are using - cygwin1.dll. Don't consider .com files to be scripts. - * hookapi.cc (rvadelta): New function. - (PEHeaderFromHModule): Simplify slightly. - (hook_or_detect_cygwin): Use passed in name argument for "HMODULE" - rather than incorrectly reading current program. Calculate delta - needed to read image data and file names if this isn't a real - "HMODULE". - -2005-09-06 Corinna Vinschen - - * thread.h: Revert patch from 2005-09-05. - * thread.cc (pthread_mutex::can_be_unlocked): Return true also if - mutex is owned by MUTEX_OWNER_ANONYMOUS. - -2005-09-05 Christopher Faylor - - * cygheap.cc (cygheap_init): Eliminate debugging #if. - - * fork.cc (fork_parent): Don't issue errors if "somebody" has set the - PID_EXITED flag on a child. Don't close process handle if it has - potentially already been closed. - * pinfo.cc (winpids::add): Eliminate PID_ALLPIDS handling which was - obsoleted by previous changes. - - * spawn.cc (av::fixup): Do win16 detection for .com files. Make sure - that buffer has been unmapped in all cases. - -2005-09-05 Corinna Vinschen - - * thread.h (pthread_mutex::get_pthread_self): Remove. - (pthread_mutex::lock): Use ::pthread_self as self parameter. - (pthread_mutex::trylock): Ditto. - (pthread_mutex::unlock): Ditto. - (pthread_mutex::destroy): Ditto. - -2005-09-02 Dave Korn - - * Makefile.in (CXXFLAGS): Use 'override' to correctly set flags to - generate dependencies when invoked from top-level make. - -2005-08-28 Christopher Faylor - - * exceptions.cc (set_process_mask_delta): Conditionalize debugging - output. - * sigproc.cc (proc_subproc): Make strace output a little more verbose. - -2005-08-28 Christopher Faylor - - * cygtls.h (__ljfault): Declare. - (_cygtls::return_from_fault): Use __ljfault. - * exceptions.cc (set_signal_mask): Revert previous checkin. - * gendef (__sjfault): Split out into a separate function which doesn't - bother with any special signal locking. - (_ljfault): Return from a __sjfault without bothering with signals. - -2005-08-28 Christopher Faylor - - * cygtls.h (_local_storage::strerror_buf): Allocate more space. - * errno.cc (strerror_worker): New function, adapted from strerror. - (strerror): Use strerror_worker. - * tlsoffsets.h: Regenerate. - - * exceptions.cc (set_signal_mask): Minimize time during which mask_sync - is held. - -2005-08-28 Christopher Faylor - - * cygwin.din: Correct readdir_r typo. - -2005-08-27 Bas van Gompel - - * dir.cc (readdir_r): Invert sense on error test. - -2005-08-25 Corinna Vinschen - - * path.cc (normalize_posix_path): Keep two leading slashes - intact throughout. - (normalize_win32_path): Revert to only checking for slash. - (realpath): Convert drive letters to cygdrive paths before - doing anything else. - * shared_info.h (mount_info::cygdrive_posix_path): Make public. - -2005-08-25 Corinna Vinschen - - * path.cc (realpath): Drop call to mount_info::conv_to_posix_path - in favor of calling path_conv with PC_POSIX flag. Align error - handling closer to POSIX. As on Linux, return user space allocated - memory if second parameter is NULL. - -2005-08-25 Corinna Vinschen - - * path.cc (normalize_win32_path): Honor network paths. Fold more - than two leading dir separators into one. Check for dir separator - instead of just slashes to handle incoming Win32 paths correctly. - -2005-08-25 Christopher Faylor - - * errno.cc (errmap): Translate ERROR_NO_MORE_ITEMS to ENMFILE. - -2005-08-24 Christopher Faylor - - * exceptions.cc (handle_sigsuspend): Just sleep forever if called from - non-main thread. - (sigpacket:process): Simplify logic which determines when and how a - signal is masked. Don't trigger sigwait if there is a signal handler. - * sigproc.cc (wait_sig): Update comment. Try to process a signal which - is in the queue if it isn't queued for the target thread (this is still - not right). - -2005-08-24 Christopher Faylor - - * spawn.cc (perhaps_suffix): Record errno-type error value in third - argument. - (find_exec): On error, set errno returned from perhaps_suffix. - (spawn_guts): Ditto. - -2005-08-24 Christopher Faylor - - * fhandler_virtual.cc (fhandler_virtual::close): Don't free filebuf if - it's NULL. - * pinfo.cc (_pinfo::commune_send): Fix test for incorrect number of - bytes read from pipe. - -2005-08-24 Corinna Vinschen - - * syscalls.cc (endusershell): Reset shell_fp to NULL to allow - subsequent getusershell calls. - -2005-08-24 Christopher Faylor - - * path.cc (path_conv::check): Fill in fileattr for /dev, defaulting to - directory if /dev doesn't actually exist. - (win32_device_name): Don't consider FH_DEV to be a device since it's - really a directory which should go through mount processing. - -2005-08-24 Christopher Faylor - - * cygheap.h (cygheap_types): Add HEAP_COMMUNE. - * fhandler_proc.cc: Use cygheap rather than user heap for allocation of - filebuf throughout. - * fhandler_registry.cc: Ditto. - * fhandler_virtual.cc: Ditto. - * fhandler_process.cc: Ditto. - (get_mem_values): Use malloc/realloc/free rather than new. - * pinfo.cc (_pinfo::commune_send): Allocate on cygwin heap rather than - user heap. Avoid calling ReadFile when correct number of characters - have been read or suffer buffer corruption. - (_pinfo::fd): Allocate on cygwin heap rather than user heap. - (_pinfo::fds): Ditto. - (_pinfo::root): Ditto. - (_pinfo::cwd): Ditto. - (_pinfo::cmdline): Ditto. - - * devices.h (FH_DEV): New define. - * devices.in: Detect lone /dev. - * devices.cc: Regenerate. - * path.cc (path_conv::check): Treat FH_DEV as a special case. - -2005-08-23 Christopher Faylor - - * sigproc.h (set_signal_mask): Remove default on second parameter and - make pass by reference. - * signal.cc (abort): Accommodate change to set_signal_mask. - * select.cc (pselect): Ditto. - * exceptions.cc (handle_sigsuspend): Ditto. - (ctrl_c_handler): Ditto. - (sighold): Ditto. - (sigrelse): Ditto. - (set_process_mask_delta): Ditto. - (_cygtls::call_signal_handler): Ditto. - - * fhandler_disk_file.cc (fhandler_disk_file::readdir): Return ENMFILE - if __handle is not set. Set __handle to NULL when out of files. - (fhandler_disk_file::rewinddir): Don't close handle if it's NULL. - (fhandler_disk_file::closedir): Ditto. - -2005-08-22 Christopher Faylor - - * dir.cc (readdir_worker): Make static. Only add '.' and '..' when - readdir fails due to ENMFILE. - * fhandler_disk_file.cc (fhandler_disk_file::readdir): Only close - handle on error != ENMFILE. - -2005-08-22 Corinna Vinschen - - * mtinfo.h (mtinfo_drive::error): Fix argument bug in debug_printf call. - -2005-08-20 Christopher Faylor - - * cygerrno.h (geterrno_from_win_error): Change declaration to default - to using GetLastError and EACCESS. - * cygwin.din: Export readdir_r. - * include/cygwin/version.h: Bump API version number to 138. - * syscalls.cc (readdir_worker): New function, renamed from old - readdir() function. - (readdir): Use readdir_worker. - (readdir_r): New function. - * fhandler.h (fhandler_base::readdir): Accommodate second argument - indicating dirent buffer. - (fhandler_disk_file::readdir): Ditto. - (fhandler_cygdrive::readdir): Ditto. - (fhandler_proc::readdir): Ditto. - (fhandler_netdrive::readdir): Ditto. - (fhandler_registry::readdir): Ditto. - (fhandler_process::readdir): Ditto. - * fhandler.cc (fhandler_base::readdir): Ditto. - * fhandler_disk_file.cc (fhandler_disk_file::readdir): Ditto. - * fhandler_cygdrive.cc (fhandler_cygdrive::readdir): Ditto. - * fhandler_proc.cc (fhandler_proc::readdir): Ditto. - * fhandler_netdrive.cc (fhandler_netdrive::readdir): Ditto. - * fhandler_registry.cc (fhandler_registry::readdir): Ditto. - * fhandler_process.cc (fhandler_process::readdir): Ditto. - * include/sys/dirent.h (readdir_r): Add declaration. - -2005-08-19 Christopher Faylor - - * fhandler.h (dirent_states): Add dirent_saw_proc. - * fhandler_disk_file.cc (fhandler_disk_file::readdir): Fill in "proc" - if it is the root dir and it is missing. - -2005-08-19 Christopher Faylor - - * fhandler.h (dirent_states): Add dirent_isroot, dirent_saw_cygdrive, - dirent_saw_dev. - * dir.cc (opendir): Don't zero __flags here. Push that responsibility - to opendir methods. - (seekdir): Preserve dirent_isroot in __flags. - (rewinddir): Ditto. - * fhandler_disk_file.cc (fhandler_disk_file::opendir): Set - dirent_isroot appropriately. - (fhandler_disk_file::readdir): Fill in "cygdrive" and "dev" if it is - the root dir and they are missing. - * fhandler_process.cc (fhandler_process::opendir): Set __flags here. - * fhandler_virtual.cc (fhandler_virtual::opendir): Set __flags here. - -2005-08-19 Christopher Faylor - - * winsup.h (create_pipe): Declare new function. - (CreatePipe): New define. - * miscfuncs.cc (create_pipe): Define new function. - -2005-08-18 Christopher Faylor - - * fhandler.h (fhandler_tty_common::lseek): Declare new method. - (fhandler_tty_slave::lseek): Delete old method. - (fhandler_tty_master::lseek): Delete old method. - * fhandler_tty.cc (fhandler_tty_common::lseek): Define new method. - -2005-08-18 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::recvfrom): Always initialize - ret to 0. - (fhandler_socket::recvmsg): Ditto. - -2005-08-18 Corinna Vinschen - - * errno.cc (strerror): Check errnum for underflow. - -2005-08-17 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Tweak debugging stuff. - -2005-08-17 Pavel Tsekov - - * fhandler_tty.cc (fhandler_tty_common::close): Rearrange the code so - that the master end of the input and output pipes is closed before - signalling an EOF event to the slave. - (fhandler_pty_master::close): Likewise. - -2005-08-14 Corinna Vinschen - - * init.cc (respawn_wow64_process): Make inline function. Remove - "noreturn" attribute. Add additional check if parent process is - actually a 64 bit process. - (dll_entry): Only test WOW64 processes with a stack in the usual - "dangerous" process space area. - -2005-08-11 Troy Curtiss - - * fhandler_serial.cc (fhandler_serial::tcgetattr): Return current baud - rate regardless of current DTR state. - -2005-08-11 Christopher Faylor - - * dcrt0.cc: Remove ld_preload declaration. - * winsup.h: Move ld_preload declaration here. - * fork.cc (fork_child): Call ld_preload() before returning. - -2005-08-11 Christopher Faylor - - * child_info. (CURR_CHILD_INFO_MAGIC): Refresh. - (child_info::child_info()): New constructor. - (child_info_spawn::child_info_spawn()): Ditto. - (child_info_spawn::operator new): New operator. - (child_info_spawn::set): New function. - * spawn.cc (av()): New constructor. - (av::operator new): New operator. - (av::set): New function. - (spawn_guts): Reorganize so that classes which allocate are defined - early in the function so that it can be properly cleaned up after an - efault. Set errno to E2BIG in the event of a SEGV situation. - -2005-08-08 Christopher Faylor - - * include/sys/cdefs.h: Remove extra line. - -2005-08-08 Corinna Vinschen - - * security.cc (get_reg_security): New static function. - (get_nt_object_security): Call get_reg_security for registry keys - to circumvent problems with predefined registry keys. - -2005-08-08 Corinna Vinschen - - * fhandler_process.cc (fhandler_process::open): Allow opening of - /proc//fd for reading. - * fhandler_registry.cc (fhandler_registry::open): Ditto for registry - keys. - -2005-08-08 Christopher Faylor - - * include/sys/cdefs.h (__CONCAT): Define. - * include/elf.h: New file. - * include/sys/elf32.h: Ditto. - * include/sys/elf64.h: Ditto. - * include/sys/elf_common.h: Ditto. - * include/sys/elf_generic.h: Ditto. - -2005-08-08 Christopher Faylor - - * cygwin.sc: Use simpler method to align .cygheap. - * dllfixdbg: Just copy .stab and .stabstr sections when making - cygwin1.dbg, rather than relying on objcopy to keep only the debug - sections since objcopy seems to get it wrong. - -2005-08-08 Corinna Vinschen - - * dtable.cc (build_fh_pc): Check setting fh to fhandler_nodevice for - NULL, too. - -2005-08-08 Corinna Vinschen - - * ftw.c: Include winsup.h. - * nftw.c: Ditto. - * include/ftw.h: Guard declarations appropriately. - -2005-08-08 Corinna Vinschen - - * Makefile.in (DLL_OFILES): Add fts.o, ftw.o, nftw.o. - * cygwin.din: Export fts_children, fts_close, fts_get_clientptr, - fts_get_stream, fts_open, fts_read, fts_set, fts_set_clientptr, - ftw, nftw. - * fts.c: New file, imported from FreeBSD. - * ftw.c: Ditto. - * nftw.c: Ditto. - * include/fts.h: Ditto. - * include/ftw.h: Ditto. - * include/cygwin/version.h: Bump API minor number. - -2005-08-07 Christopher Faylor - - * Makefile.in (dtable_CFLAGS): Use -fomit-frame-pointer and - -fcheck-new. - * cygheap.cc (cmalloc): Only emit system_printf warnings on failure if - DEBUGGING. - (crealloc): Ditto. - (ccalloc): Ditto. - * dtable.cc (build_fh_name): Treat NULL return from cnew as indicative - of EMFILE condition. - (build_fh_dev): Ditto. - (dtable::dup_worker): Handle NULL return from build_fh_pc. - (dtable::vfork_child_dup): Trust dup_worker to set errno. - * fhandler.h (fhandler_base::new): Mark as nothrow. - -2005-08-07 Christopher Faylor - - * dllfixdbg: New perl script. - * configure.in: Detect objcopy, objdump, strip. - * configure: Regenerate. - * Makefile.in: Pass target objcopy/objdump to new dllfixdbg script. - Remove previous perl check. - * cygwin.sc: Add .gnu_debuglink_overlay section for eventual - replacement with .gnu_debuglink section. Revert move of cygheap to end - of image. - -2005-08-06 Corinna Vinschen - - * Makefile.in: Allow previous patch to work in a 64 bit environment. - -2005-08-06 Christopher Faylor - - * Makefile.in: Warn when end of cygheap is not on 64k boundary. - * cygwin.sc: Try harder to ensure that cygheap is on a 64k boundary. - Move cygheap to end of image to stop interference from unstripped debug - regions. - -2005-08-06 Christopher Faylor - - * include/endian.h: Move everything into this file and define things - more like linux. - * include/cygwin/types.h: Include endian.h. - * include/sys/dirent.h: Define DT_* types and conversion macros. - - * pinfo.cc (pinfo::init): Remove special handling for PID_ALLPIDS and - execed code, even though it probably still isn't quite right. - -2005-08-05 Michael Gorse - - * thread.cc (pthread::create(3 args)): Make bool. - (pthread_null::create): Ditto. - (pthread::create(4 args)): Check return of inner create rather than - calling is_good_object(). - * thread.h: Ditto. - -2005-08-05 Vaclav Haisman - - * fhandler_tty.cc (fhandler_tty_slave::tcflush): Return either 0 or -1. - -2005-08-05 Corinna Vinschen - - * thread.cc (pthread_cond_timedwait): Check abstime for validity - according to SUSv3. Rewrite timeout check and waitlength calculation - to avoid overflow problems. - -2005-08-02 Yitzchak Scott-Thoennes - - * include/sys/termios.h: Define TIOCMBIS and TIOCMBIC. - * fhandler.h (class fhandler_serial): Declare switch_modem_lines. - * fhandler_serial.cc (fhandler_serial::switch_modem_lines): New - static function to set or clear DTR and/or RTS. - (fhandler_serial::ioctl): Use switch_modem_lines for TIOCMSET - and new TIOCMBIS and TIOCMBIC. - * include/cygwin/version.h: Bump API minor number. - -2005-07-29 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_base::pread): Don't move file offset - pointer after I/O. - (fhandler_base::pwrite): Ditto. - -2005-07-29 Christopher Faylor - - * fhandler.h (fhandler_base::pread): Declare new function. - (fhandler_base::pwrite): Ditto. - (fhandler_disk_file::pread): Ditto. - (fhandler_disk_file::pwrite): Ditto. - * fhandler.cc (fhandler_base::pread): Define new function. - (fhandler_base::pwrite): Ditto. - * fhandler_disk_file.cc (fhandler_base::pread): Ditto. - (fhandler_base::pwrite): Ditto. - * syscalls.cc (pread): Define new function. - (pwrite): Ditto. - * cygwin.din: Export pread, pwrite. - - * include/sys/ioctl.h: Guard some _IO* declarations to avoid conflict - with socket.h. - -2005-07-29 Christopher Faylor - - * include/sys/ioctl.h: Add some linux defines. - -2005-07-29 Christopher Faylor - - * pinfo.cc (pinfo::init): Put back accidentally removed debug_printf. - -2005-07-29 Arto Huusko - - * cygthread.cc (cygthread::simplestub): Wait for h to be filled out - by main thread before assigning it. - -2005-07-29 Arto Huusko - - * pinfo.cc (pinfo::init): Sleep before retrying open_shared(). - -2005-07-29 Arto Huusko - - * fork.cc (fork_parent): Fix null deref if pinfo creation fails. - -2005-07-28 Christopher Faylor - - * cygmalloc.h (MSPACES): Define. This dropped through the cracks after - the last malloc update. - * dcrt0.cc: Fix a comment. - * malloc.cc (internal_malloc): Fix definition so that it can be safely - coerced. - -2005-07-27 Christopher Faylor - - * include/cygwin/in.h (INET_ADDRSTRLEN): Add new definition. - -2005-07-27 Christopher Faylor - - * gendef: Use nocr to remove \r's from input. - gendef (nocr): New function. - -2005-07-27 Christopher Faylor - - * fhandler_clipboard.cc (fhandler_dev_clipboard::close): Set membuffer - to NULL. - (fhandler_dev_clipboard::fixup_after_exec): Don't call close here. - Just set variables directly. - -2005-07-25 Christopher Faylor - - * include/byteswap.h: New file. - -2005-07-25 Christopher Faylor - - * include/cygwin/types.h: Define loff_t. - -2005-07-16 Christopher Faylor - - * child_info.h (child_info::sync): Pass pid and HANDLE rather than - using pinfo. - (child_info::child_info): Accept an argument controlling whether to - create proc_subproc. - (child_info_spawn::child_info_spawn): Ditto. - * sigproc.cc (child_info::child_info): Ditto. - (child_info_spawn::child_info_spawn): Ditto. - (child_info::sync): Use passed in pid and HANDLE. - * fork.cc (fork_parent): Reflect additional arguments required for - child_info::sync. - * hookapi.cc (hook_or_detect_cygwin): Rename. Change so that NULL 'fn' - argument just returns "true", indicating that program uses cygwin1.dll. - * spawn.cc (av::win16_exe): New element. - * spawn.cc (av::iscygwin): New element. - (av::fixup): New function. - (spawn_guts): Protect against SEGV. Use fixup function to detect when - it is safe to wait for a spawned (as opposed to an execed) program. - Reflect changes in child_info::sync arguments. - * external.cc (cygwin_internal): Reflect function renaming to - hook_or_detect_cygwin. - - * cygheap.cc (cygheap_fixup_in_child): Close handle after debug fixup - has been done to prevent false positives in handle collision. - - * exceptions.cc (try_to_debug): Notify debugger if already being - debugged. - -2005-07-09 Christopher Faylor - - * path.cc (mount): Only check win32_path when we know we need it. - -2005-07-09 Nicholas Wourms - - * cygwin.din (getline): Export. - (getdelim): Export. - * include/sys/stdio.h (getline): Replace macro with function prototype. - (getdelim): Likewise. - * include/cygwin/version.h: Bump API minor number. - -2005-07-08 Corinna Vinschen - - * cygwin.din (__getline): Export. - (__getdelim): Export. - * include/sys/stdio.h (getline): Define as __getline. - (getdelim): Define as __getdelim. - * include/cygwin/version.h: Bump API minor number. - -2005-07-06 Christopher Faylor - - Eliminate (void) cast on standalone function calls throughout. - -2005-07-05 Christopher Faylor - - * dcrt0.cc (cygwin_exit): Mark as "noreturn". - * sigproc.cc (child_info::ready): Don't signal parent that we are a - cygwin process if we are dynamically loaded. - -2005-07-05 Christopher Faylor - - * malloc.cc: Update to version 2.8.2. - -2005-07-05 Corinna Vinschen - - * fhandler_tape.cc (fhandler_dev_tape::close): Don't do "extra stuff" - when we know we're execing. - -2005-07-04 Christopher Faylor - - Change foo (void) to foo () for all c++ functions throughout. - Remove all fhandler_*::dump functions throughout. - - * fhandler.h (fhandler_dev_mem::close): Remove pass-through function in - favor of virtual method. - (handler_dev_raw::close): Ditto. - (fhandler_dev_clipboard::fixup_after_exec): New method. - * fhandler_dev_mem.cc (fhandler_dev_mem::close): Eliminate pass through - function in favor of virtual method. - * fhandler_dev_raw.cc (fhandler_dev_raw::close): Ditto. - * fhandler_clipboard.cc (fhandler_dev_clipboard::close): Don't go to - extra effort when execing. - (fhandler_dev_clipboard::fixup_after_exec): New function. - * fhandler_console.cc (fhandler_console::close): Don't do "extra stuff" - when we know we're execing. - * fhandler_disk_file.cc (fhandler_disk_file::close): Ditto. - * fhandler_dsp.cc (fhandler_dev_dsp::close): Ditto. - * fhandler_fifo.cc (fhandler_fifo.cc::close): Ditto. function in favor - of base function. - * fhandler_random.cc (fhandler_dev_random::close): Ditto. - * fhandler_registry.cc (fhandler_registry::close): Ditto. - * fhandler_tty.cc (fhandler_tty_slave::close): Ditto. - * fhandler_virtual.cc (fhandler_virtual::close): Ditto. - - * pinfo.cc (proc_waiter): Remove unneeded hExeced declaration. - * sigproc.cc: Ditto. - * winsup.h (hExeced): Define here. - - * fhandler_virtual.cc (fhandler_virtual::fixup_after_exec): Just call - close() to reinitialize things to known state. - -2005-07-04 Christopher Faylor - - * cygtls.h (_cygtls): Perform minor reformatting. - - * winsup.h (close_all_files): Reflect argument change. - * dtable.cc (close_all_files): Ditto. - * dtable.h: Ditto. - * fhandler.h: Ditto. - * spawn.cc (spawn_guts): Move close_all_files back to its original - location in first P_OVERLAY test but use argument denoting that handles - are only supposed to be closed, not released (more work to be done - here). - * syscalls.cc (close_all_files): Take an argument denoting whether to - release closed files or not. - - * path.cc (symlink): Change argument names to reflect linux man page. - (symlink_worker): Ditto. Also appropriately set ENOENT for empty - strings. - - -2005-07-04 Pierre Humblet - - * cygheap.h (struct init_cygheap): Delete cygwin_regname member. - * external.cc (cygwin_internal): Use cygpsid::get_id for - CW_GET_UID_FROM_SID and CW_GET_GID_FROM_SID. - Turn CW_SET_CYGWIN_REGISTRY_NAME and CW_GET_CYGWIN_REGISTRY_NAME - into noops. - -2005-07-03 Christopher Faylor - - * thread.cc (pthread_mutex::init): Remove unneeded efault/mutex check. - -2005-07-02 Christopher Faylor - - * thread.h (verifyable_object_state verifyable_object_isvalid): Delete - function declaration that should have been static. - * thread.cc (verifyable_object_state verifyable_object_isvalid): Make - inline static. - (pthread*::is_good_object): Move to directly after - verifyable_object_state verifyable_object_isvalid and make inline. - (check_valid_pointer): Delete function. - (pthread_cond_timedwait): Use myfault to detect valid pointer. - (pthread_mutex::init): Ditto. - -2005-07-02 Christopher Faylor - - Replace valid memory checks with new myfault class "exception - handling", almost everywhere. Leave some thread.cc stuff alone for - now. - * cygtls.h: Kludge some definitions to avoid including a problematic - windows header. - (_cygtls::_myfault): New entry. - (_cygtls::_myfault_errno): Ditto. - (_cygtls::fault_guarded): New function. - (_cygtls::setup_fault): Ditto. - (_cygtls::return_from_fault): Ditto. - (_cygtls::clear_fault): Ditto. - (myfault): New class. - * exceptions.cc (handle_exceptions): Handle case of guarded fault in - system routine. - * gendef: Add another entry point for setjmp that the compiler doesn't - know about and won't complain about. - * gentls_offsets: Just include windows.h rather than kludging a HANDLE - def. - * miscfuncs.cc (check_null_str): Delete. - (check_null_empty_str): Ditto. - (check_null_empty_str_errno): Ditto. - (check_null_str_errno): Ditto. - (__check_null_invalid_struct): Ditto. - (__check_null_invalid_struct_errno): Ditto. - (__check_invalid_read_ptr): Ditto. - (__check_invalid_read_ptr_errno): Ditto. - (dummytest): New function. - (check_iovec_for_read): Delete. - (chec_iovec): Rename from check_iovec_for_write. Take a read/write - parameter. - * tlsoffsets.h: Regenerate. - * winsup.h: Remove check_* declarations. - (check_iovec_for_read): Delete declaration. Turn into a define - instead. - (check_iovec_for_write): Ditto. - (check_iovec): New declaration. - - * thread.h: Use ifdef guard name consistent with other header files. - -2005-07-02 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 19. - -2005-06-30 Corinna Vinschen - - * fhandler.cc (fhandler_base::readv): Use malloc/free instead of alloca. - (fhandler_base::writev): Ditto. - -2005-06-29 Christopher Faylor - - * cygerrno.h: Make multi-inclusion safe. - * fhandler_termios.cc (fhandler_termios::tcsetpgrp): Deal with EINTR. - * dcrt0.cc (dll_crt0_0): Accommodate init_console_handler argument - change. - * winsup.h: Ditto. - * fhandler_tty.cc (fhandler_tty_slave::open): Ditto. - * exceptions.cc (init_console_handler): Ditto. Ignore console events - if we're not attached to a terminal. - * fhandler_tty.cc (fhandler_tty_slave::open): Ditto. - * wincap.cc: Implement has_null_console_handler_routine throughout. - * wincap.h: Ditto. - -2005-06-29 Christopher Faylor - - * autoload.cc (LoadDLLprime): Use a more descriptive name for autoload - text sections. - * cygwin.sc: Ditto. - -2005-06-27 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::facl): Add missing break. - -2005-06-24 Corinna Vinschen - - * path.cc (path_conv::check): Don't strip trailing dots and spaces - at the start of the path. - -2005-06-24 Corinna Vinschen - - * fhandler.cc (rootdir): Don't set errno. - * syscalls.cc (statvfs): Set errno to ENOTDIR if rootdir() failed. - -2005-06-22 Corinna Vinschen - - * fhandler.h (class fhandler_dev_tape): Add declaration for - fixup_after_fork and set_close_on_exec. - * fhandler_tape.cc (fhandler_dev_tape::open): Create mt_mtx mutex - inheritable. - (fhandler_dev_tape::close): Close mt_mtx. - (fhandler_dev_tape::dup): Duplicate mt_mtx and mt_evt as necessary. - (fhandler_dev_tape::fixup_after_fork): New method. - (fhandler_dev_tape::set_close_on_exec): New method. - -2005-06-21 Corinna Vinschen - - * security.cc (get_initgroups_sidlist): Drop special_pgrp parameter. - (get_setgroups_sidlist): Avoid duplicate groups in group list. - (create_token): Remove special_pgrp local variable. Accommodate - change to get_initgroups_sidlist call. - -2005-06-21 Corinna Vinschen - - * uinfo.cc (uinfo_init): Call reimpersonate to set the main thread's - impersonation token. - -2005-06-20 Corinna Vinschen - - * fhandler_proc.cc (format_proc_partitions): Only list recognized - partitions. Use partition number given by PartitionNumber member. - -2005-06-18 Corinna Vinschen - - * glob.c: (glob0): New local variable `limit`. Use in calls to glob1 - and globextend. - (glob1): Add `limit' parameter. - (glob2): Ditto. - (glob3): Ditto. - (globextend): Ditto. Implement GLOB_LIMIT handling. - * include/glob.h (GLOB_LIMIT): New define. - * include/cygwin/version.h: Bump API minor number. - -2005-06-17 Christopher Faylor - - * wincap.h (wincaps::detect_win16_exe): Declare. - (wincapc::detect_win16_exe): Implement. - * wincap.cc: Populate detect_win16_exe where appropriate. - * spawn.cc (spawn_guts): Only go out of the way to detect 16-bit apps - on systems which are flummoxed by them. - -2005-06-17 Christopher Faylor - - * spawn.cc (spawn_guts): Detect when executing a 16-bit application and - avoid setting the process pipe since this causes conniptions in Windows - 9x. - -2005-06-17 Corinna Vinschen - - * cygwin.din (inet_pton): Export. - (inet_ntop): Export. - * net.cc (cygwin_inet_pton): Implement inet_pton for AF_INET for now. - (cygwin_inet_ntop): Implement inet_ntop for AF_INET for now. - * include/arpa/inet.h (inet_pton): Declare. - (inet_ntop): Declare. - * include/cygwin/version.h: Bump API minor number. - -2005-06-17 Corinna Vinschen - - * fhandler.h (fhandler_union): Add missing members corresponding to - fhandler_fifo and fhandler_netdrive. - -2005-06-16 Corinna Vinschen - - * syscalls.cc (statvfs): Handle the case when GetDiskFreeSpaceEx - succeeds but GetDiskFreeSpace fails by faking bytes-per-sector and - sectors-per-cluster values. - -2005-06-15 Christopher Faylor - - * cygthread.cc (cygthread::detach): Fix debugging output. - * dcrt0.cc (dll_crt0_1): Create signal_arrived early -- before any - filename manipulation. - * sigproc.cc (sigproc_init): Don't create signal_arrived here. - * fork.cc (fork_child): Ditto. - * sigproc.h (create_signal_arrived): Declare. - -2005-06-14 Christopher Faylor - - * path.cc (path_conv::check): Always reset to FH_FS when component != 0 - and FH_NETDRIVE to fix problems with strict case checking. - -2005-06-12 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::recvmsg): Avoid SEGV in OpenSSH - when trying to pass file descriptor by setting msg->msg_accrightslen - to 0. - -2005-06-11 Christopher Faylor - - * Makefile.in: Avoid initial heap allocation since cygwin has its own - heap. - -2005-06-11 Christopher Faylor - - * fhandler_console.cc (fhandler_console::read): Fix a compiler warning. - -2005-06-10 Christopher Faylor - - * include/pthread.h: Change PTHREAD_MUTEX_DEFAULT to - PTHREAD_MUTEX_NORMAL. Revert PTHREAD_MUTEX_INITIALIZER to - PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP since that is actually closer - to what linux does. - * thread.h (cw_cancel_action): New enum. - (cancelable_wait): Use cw_cancel_action as third argument. - * thread.cc (cancelable_wait): Ditto. Don't wait for cancel if - cancel_action == cw_no_cancel. - (pthread::create): Don't wait for cancel event since that is racy. - (pthread_mutex::pthread_mutex): Set default to PTHREAD_MUTEX_ERRORCHECK. - (pthread_mutexattr::pthread_mutexattr): Ditto. - (pthread_mutex::_lock): Tell cancelable_wait not to wait for - cancellation event. - (semaphore::_timedwait): Accommodate change in cancelable_wait args. - (pthread::join): Ditto. - -2005-06-10 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::sendto): Always initialize - ret to 0. - (fhandler_socket::sendmsg): Ditto. - -2005-06-10 Corinna Vinschen - - * cygwin.din (imaxabs): Export. - (imaxdiv): Export. - (llabs): Export. - (lldiv): Export. - (strtoimax): Export. - (strtoumax): Export. - * include/inttypes.h (imaxabs): Activate declaration. - (imaxdiv): Ditto. - (strtoimax): Ditto. - (strtoumax): Ditto. - * include/cygwin/version.h: Bump API minor. - -2005-06-09 Christopher Faylor - - * cygthread.cc (cygthread::detach): Improve diagnostics for what should - be an impossible failure condition. - -2005-06-09 Christopher Faylor - - * cygtls.h (_local_storage::setmode_file): New element. - (_local_storage::setmode_mode): New element. - * tlsoffsets.h: Regenerate. - * cygwin.din (setmode): Define as cygwin_getmode. - * syscalls.cc (setmode_helper): Use setmode_* variables from tls rather - than using unthreadsafe static. - (setmode): Break out fwalk stuff. - (cygwin_setmode): New function. Put fwalk stdio stuff here. - -2005-06-09 Christopher Faylor - - * thread.cc (pthread_mutex::_lock): Use cancelable_wait rather than - WaitForSingleObject. - -2005-06-09 Christopher Faylor - - * cygwin.sc: Place .cygwin_dll_common in a more sensible spot. - -2005-06-09 Christopher Faylor - - * cygwin.sc: Place .cygwin_dll_common. - * init.cc (threadfunc_ix): Use a more common name for the section name. - -2005-06-09 Christopher Faylor - - * include/pthread.h (PTHREAD_MUTEX_INITIALIZER): Change to - PTHREAD_NORMAL_MUTEX_INITIALIZER_NP to be closer to linux default. - -2005-06-09 Christopher Faylor - - * thread.cc (cancelable_wait): No-op change to make sure that res is - always a valid WFMO return. - -2005-06-09 Christopher Faylor - - Change pthread::cancelable_wait to just cancelable_wait, throughout. - * thread.h (cw_sig_wait): New enum. - (fast_mutex::lock): Use cancelable_wait with resumable signal. - (cancelable_wait): Change fourth argument to cw_sig_wait enum. - * thread.cc (cancelable_wait): Ditto. Loop on signal detection if - fourth argument == cw_sig_resume. - -2005-06-08 Christopher Faylor - - * cygwin.sc: Apparently nonloading sections need to go last. - -2005-06-08 Christopher Faylor - - * cygwin.sc: Restore resource and reloc sections and use more modern - syntax for stabs sections. - -2005-06-08 Christopher Faylor - - * environ.cc (spenvs): Remove cut/paste error which associated - CYGWIN_DEBUG with HOME. - -2005-06-08 Corinna Vinschen - - * security.cc (cygwin_logon_user): Run LogonUser in the primary - process token context. Fix potential handle leak. - -2005-06-07 Corinna Vinschen - - * pinfo.cc (pinfo::init): Define sa_buf as PSECURITY_ATTRIBUTES and - allocate dynamically. - (pinfo::set_acl): Replace sa_buf by dynamically allocated acl_buf. - * sec_acl.cc (setacl): Allocate acl dynamically. - * sec_helper.cc (sec_acl): Add test for alignment of acl when - DEBUGGING is defined. - (__sec_user): Same for sa_buf. - * security.cc (verify_token): Define sd_buf as PSECURITY_DESCRIPTOR - and allocate dynamically. - (alloc_sd): Allocate acl dynamically. - security.h (sec_user_nih): Change first parameter to - SECURITY_ATTRIBUTES *. - (sec_user): Ditto. - * sigproc.cc (wait_sig): Define sa_buf as PSECURITY_ATTRIBUTES and - allocate dynamically. - * syscalls.cc (seteuid32): Define dacl_buf as PACL and allocate - dynamically. - * uinfo.cc (cygheap_user::init): Define sa_buf as PSECURITY_ATTRIBUTES - and allocate dynamically. - * winbase.h (ilockincr): Mark first argument of inline assembly as - earlyclobber. - (ilockdecr): Ditto. - -2005-06-07 Christopher Faylor - - * cygthread.cc (cygthread::detach): Make error message a little more - detailed. - * fhandler.cc (fhandler_base::raw_read): Ditto for debug message. - * dcrt0.cc (do_exit): Add some more synchronization tests. - * fhandler_fifo.cc (fhandler_fifo::dup): Don't duplicate a nonexistent - handle. Use derived return value rather than always retuning 0. - * fhandler_netdrive.cc (fhandler_netdrive::exists): Wnet -> WNet. - * winsup.h (exit_states): Add a couple of new exit states. - -2005-06-06 Corinna Vinschen - - * path.cc (symlink_info::check): If GetFileAttributes returns - with ERROR_SHARING_VIOLATION, the file exists. - -2005-06-06 Corinna Vinschen - - * uname.cc (uname): Change "amd64" to "x86_64" as on Linux. - -2005-06-06 Corinna Vinschen - - * uname.cc (uname): Add missing break. - -2005-06-05 Christopher Faylor - - * Makefile.in: Build sync.o with -fomit-frame-pointer and -O3. - -2005-06-05 Christopher Faylor - - * sync.cc (muto::acquire): Remove unneeded brackets and fix whitespace. - -2005-06-04 Christopher Faylor - - * malloc.cc: Update to Doug Lea's malloc v2.8.0. - -2005-06-03 Max Kaehn - - * dcrt0.cc (cygwin_dll_init): Initialize main_environ and cygtls. Add - comment to explain the caveats of this method. - * how-cygtls-works.txt: New file. - -2005-06-02 Christopher Faylor - - * dlfcn.cc (get_full_path_of_dll): Use a relative path when converting - so that the standard Windows rules for finding a library will be used - if no path is given. Stop explicitly searching /usr/bin since that is - now in effect. - -2005-06-01 Christopher Faylor - - Revert 2005-05-30 close_all_files changes. - * spawn.cc (spawn_guts): When execing, close all files after the child - has synced with us. - -2005-06-01 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_disk_file::fchown): Make sure that - disk open is called in case we're passed in a non-existent device. - -2005-06-01 Christopher Faylor - - * include/machine/stdlib.h: New file. - -2005-06-01 Christopher Faylor - - * thread.h (List_remove): Revert most of 2005-05-30 change. - -2005-06-01 Christopher Faylor - - * cygwin.sc: Don't output .reloc or .rsrc sections. Clean up stuff - around .cygheap and use a workaround to get things working with newer - (broken?) binutils. - -2005-05-31 Christopher Faylor - - * cygheap.cc (cygheap_end): Remove bogus section attribute. - * cygwin.sc: Make __cygheap_mid absolute. Remove unused _cygheap_foo. - -2005-05-30 Christopher Faylor - - * child_info.h (child_info::cygheap_h): Delete. - (child_info::dwProcessId): New field. - * cygheap.cc (init_cheap): Delete. - (dup_now): Ditto. - (cygheap_setup_for_child): Ditto. - (cygheap_setup_for_child_cleanup): Ditto. - (cygheap_fixup_in_child): Simplify. Use new "child_copy" function to - copy heap from parent. - (_csbrk): Don't attempt allocation if within cygheap section. Fix so - that more than one allocation will succeed. - (cygheap_init): Reset possibly-nonzero region to zero. - * cygheap.h (cygheap_setup_for_child): Delete declaration. - (cygheap_setup_for_child_cleanup): Ditto. - (cygheap_start): Define as an array. - * cygwin.sc: Modernize. Remove unneeded sections. Define cygheap - here. - * dcrt0.cc (do_exit): Reflect argument change to close_all_files. - * dtable.cc (dtable::vfork_parent_restore): Ditto. - * dtable.h: Ditto. - * fhandler.h: Ditto. - * fork.cc (fork_copy): Call ReadProcessMemory if there is no thread - (indicating that we're execing). - (fork_child): Don't mess with hParent. - (fork_parent): Remove hParent stuff. It happens earlier now. - Remove call to cygheap_setup_for_child* stuff. - (fork): Put child_info_stuff in grouped structure. Issue error if - parent handle is not set. - (child_copy): New function. - * sigproc.cc (child_info::child_info): Put cygheap settings here. Set - parent handle. - (child_info::~child_info): Close parent handle if it exists. - * spawn.cc (spawn_guts): Reorganize so that ciresrv is allocated at - only the last minute so that cygheap changes are reflected. Delete - cygheap_setup* calls. - * syscalls.cc (close_all_files): Add an argument to flag when the fd - entry should be released. - * winsup.h (close_all_files): Add an argument to close_all_files - declaration. Declare child_copy. - -2005-05-30 Vaclav Haisman - - * thread.h (List_remove): Make node parameter const. Use simple - comparison and assignment rather than InterlockedCompareExchangePointer - since access is already synchronized. - -2005-05-30 Christopher Faylor - - * dlfcn.cc (set_dl_error): Use UNIX error rather than Windows error. - -2005-05-29 Christopher Faylor - - * cygmagic: Remove debugging cruft missed on 2005-05-21. - -2005-05-29 Corinna Vinschen - - * path.cc (path_conv::check): Move component to function scope. Set - PATH_RO only on *real* FH_NETDRIVEs or on non-FH_NETDRIVE virtual - paths. Allow non-retrievable shares to be handled as files. - -2005-05-29 Eric Blake - - * include/limits.h (LLONG_MIN, LLONG_MAX, ULLONG_MAX): Always define. - -2005-05-28 Christopher Faylor - - * thread.h (pthread_key::set): Inline. - (pthread_key::get): Ditto. - * thread.cc (pthread::set): Delete. - (pthread::get): Ditto. - -2005-05-28 Christopher Faylor - - * cygwin.din: Remove signal front end from pthread_[gs]etspecific. - -2005-05-28 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave:tcflush): Use signed comparison. - -2005-05-28 Christopher Faylor - - * times.cc (time_ms::usecs): Coerce comparison to signed or whole test - is a no-op. - -2005-05-27 Christopher Faylor - - * cygheap.h: Reference _cygheap_start via .cygheap section. - - * environ.cc: Fix force_into_environment typo throughout. - (spenvs): Export CYGWIN_DEBUG if DEBUGGING. - -2005-05-26 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 18. - -2005-05-25 Pierre Humblet - - * fhandler.h (fhandler_base::mkdir): New virtual method. - (fhandler_base::rmdir): Ditto. - (fhandler_disk_file:mkdir): New method. - (fhandler_disk_file:rmdir): Ditto. - * dir.cc (mkdir): Implement with fhandlers. - (rmdir): Ditto. - * fhandler.cc (fhandler_base::mkdir): New virtual method. - (fhandler_base::rmdir): Ditto. - (fhandler_disk_file::mkdir): New method. - (fhandler_disk_file::rmdir): Ditto. - -2005-05-24 Christopher Faylor - - * include/cygwin/version.h: Bump API minor number to 129. - -2005-05-24 Christopher Faylor - - * cygwin.din: Export mkdtemp. - * mktemp.cc: New file. - * Makefile.in (DLL_OFILES): Add mktemp.o - -2005-05-23 Eric Blake - - * include/stdint.h (INTMAX_C, UINTMAX_C): Fix definition. - -2005-05-21 Christopher Faylor - - * spawn.cc (find_exec): Accept a PATH-like string in place of an - environment variable. - * dlfcn.cc (get_full_path_of_dll): Search /usr/bin (for windows - compatibility) and /usr/lib (for UNIX compatibility) when looking for - shared libraries. - * environ.cc (conv_envvars): Put back LD_LIBRARY_PATH since it is used - by get_full_path_of_dll(). - * errno.cc (errmap): Map MOD_NOT_FOUND to ENOENT. - - * cygmagic: Remove debugging cruft. - -2005-05-19 Corinna Vinschen - - * include/cygwin/in.h: Add comment. - -2005-05-19 Corinna Vinschen - - * include/cygwin/in.h: Define IPPROTO_xxx values as macros to - accommodate SUSv3. - -2005-05-19 Christopher Faylor - - * include/limits.h: Include features.h, as on linux. - -2005-05-19 Christopher Faylor - - * include/endian.h: New file. - -2005-05-19 Corinna Vinschen - - * cygwin.sc: Add Dwarf-2 debug sections. - -2005-05-19 Corinna Vinschen - - * mmap.cc (mmap64): Make granularity an automatic variable. - -2005-05-19 Christopher Faylor - - * fhandler.h (fhandler_cygdrive::seekdir): Delete declaration. - (fhandler_cygdrive::seekdir): Delete. - -2005-05-19 Pierre Humblet - - * fhandler.h (fhandler_cygdrive::iscygdrive_root): Delete method. - (fhandler_cygdrive::telldir): Delete declaration. - * fhandler_disk_file.cc: Remove all uses of - fhandler_cygdrive::iscygdrive_root. - (fhandler_disk_file::mkdir): New method. - (fhandler_disk_file::rmdir): Ditto. - (fhandler_cygdrive::telldir): Delete. - -2005-05-18 Christopher Faylor - - * external.cc: Move pids declaration to file scope and use less - enthusiastic constructor. - * pinfo.h (winpids::winpids): Remove default setting. - * fhandler_fifo.cc (fhandler_fifo::open_not_mine): Accommodate removal - of default setting. - * fhandler_proc.cc (fhandler_proc::readdir): Ditto. - -2005-05-18 Christopher Faylor - - * cygtls.h (_local_storage::unknown_thread_name): New buffer. - * tlsoffsets.h: Regenerate. - * cygthread.cc (cygthread::name): Use new thread-local buffer. - * exceptions.cc (handle_exceptions): Avoid unnecessary initialization - of static variables to zero. - * fork.cc (slow_pid_reuse) Ditto. - -2005-05-18 Corinna Vinschen - - * mmap.cc (mmap64): Avoid compiler warning. - * ntea.cc (NTReadEA): Ditto. - * hires.h (hires_base): Remove useless usecs function. - -2005-05-18 Corinna Vinschen - - * fhandler_netdrive.cc (fhandler_netdrive::telldir): Remove since it's - equivalent to fhandler_virtual::telldir now anyway. - * fhandler.h (class fhandler_netdrive): Remove telldir. - -2005-05-18 Corinna Vinschen - - * fhandler_netdrive.cc (fhandler_netdrive::telldir): Implement. - (fhandler_netdrive::seekdir): Implement. - (fhandler_netdrive::closedir): Call rewinddir to have only one point - of calling WNetCloseEnum. - -2005-05-17 Corinna Vinschen - - * fhandler.h (class fhandler_netdrive): Add method rewinddir. - * fhandler_netdrive.cc (struct netdriveinf): New structure to - store thread arguments. - (thread_netdrive): Thread handling all potentially blocking - WNet... calls. - (create_thread_and_wait): Start and wait for above thread. - (fhandler_netdrive::exists): Change to call create_thread_and_wait - instead of calling WNet... function. - (fhandler_netdrive::readdir): Ditto. Fix error handling. - (fhandler_netdrive::rewinddir): New method. - -2005-05-17 Corinna Vinschen - - * external.cc (cygwin_internal): Avoid compiler warning. - -2005-05-16 Christopher Faylor - - * dcrt0.cc (dll_crt0_0): Don't do fixup_after_exec if dynamically - loaded since the state of fds is unknown at this point. - -2005-05-16 Christopher Faylor - - * include/sys/cygwin.h (enum cygwin_getinfo_types): Add CW_DEBUG_SELF. - * external.cc (cygwin_internal): Implement CW_DEBUG_SELF. - - * init.cc (dll_entry): Minor rearrangement of code. - -2005-05-16 Christopher Faylor - - * path.cc (path_conv::check): Remove embedded dots before slashes. - -2005-05-16 Corinna Vinschen - - * environ.cc (conv_envvars): Remove LD_LIBRARY_PATH entirely. - It doesn't belong here. - -2005-05-15 Corinna Vinschen - - * environ.cc (conv_envvars): Treat LD_LIBRARY_PATH as path list. - -2005-05-14 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Check - return code from GetFileSize and set file size to 0 if necessary. - * fhandler_netdrive.cc (fhandler_netdrive::fstat): Set permissions - to read/execute for all. - -2005-05-13 Christopher Faylor - - * path.cc (normalize_posix_path): Do normalization on . and .. after - a '//'. - -2005-05-13 Corinna Vinschen - - * fhandler.h (fhandler_netdrive::readdir): Remove useless comment. - -2005-05-13 Corinna Vinschen - - * autoload.cc (WNetGetResourceParentA): Import. - (WNetOpenEnumA): Import. - (WNetEnumResourceA): Import. - (WNetCloseEnum): Import. - * fhandler.h (fhandler_netdrive::telldir): Add declaration. - (fhandler_netdrive::seekdir): Ditto. - (fhandler_netdrive::closedir): Ditto. - * fhandler_netdrive.cc: Drop explicit including windows.h. Include - winnetwk.h instead of shlwapi.h. Include dirent.h. - (fhandler_netdrive::readdir): Implement. - (fhandler_netdrive::telldir): New method. - (fhandler_netdrive::seekdir): New method. - (fhandler_netdrive::closedir): Ditto. - -2005-05-13 Christopher Faylor - - Remove PC_FULL from path_conv usage throughout. - * path.h (enum pathconv_arg): Change PC_FULL to PC_NOFULL. - * path.cc (path_conv::check): Test for PC_NOFULL rather than !PC_FULL. - (cygwin_conv_to_win32_path): Use PC_NOFULL to force non-absolute path. - -2005-05-13 Christopher Faylor - - * fhandler_netdrive.cc (fhandler_netdrive::exists): Assert that "//" - exists. - -2005-05-12 Christopher Faylor - - * cygtls.cc (_cygtls::remove): Eliminate compiler warning. - - * dir.cc (mkdir): Check path for writability. - (rmdir): Ditto. Remove check for special directories. - * path.cc (path_conv::check): Set PATH_RO for virtual devices. Set - error if read-only and asked for writability. - * path.h (pathconv_arg): Add PC_WRITABLE. - (path_types): Add PATH_RO. - (path_conv::isro): Add (currently unused) check for read-only - filesystem. Return "ENOSHARE" when we know a share doesn't exist. - * include/sys/mount.h: Add MOUNT_RO flag. - * autoload.cc (WNetGetResourceInformationA): Import. - * fhandler_netdrive.cc (fhandler_netdrive::exists): Detect actual - existence of remote system rather than always assuming that it exists. - -2005-05-11 Christopher Faylor - - * dcrt0.cc (do_global_dtors): Don't call dll_global_dtors here. - (__main): Reinstate atexit of do_global_dtors. - (cygwin_exit): Call dll_global_dtors here. - (do_exit): And here. - - -2005-05-10 Christopher Faylor - - * cygtls.cc (_cygtls::remove): Clear exitsock after close. - * fhandler_console.cc (fhandler_console::write_normal): Store character - in a local variable for potential future inspection. - -2005-05-10 Corinna Vinschen - - * Makefile.in (DLL_OFILES): Add fhandler_mailslot.o. - * devices.h (FH_KMSG): Define new device. - * devices.in: Add "/dev/kmsg" entry. - * devices.cc: Regenerate. - * dtable.cc (build_fh_pc): Handle case FH_KMSG. - * fhandler.h (class fhandler_mailslot): New class. - (class select_stuff): Add device_specific_mailslot pointer. - * fhandler_mailslot.cc: New file. - * select.cc (peek_mailslot): New function. - (verify_mailslot): Ditto. - (struct mailslotinf): New stuct to handle select on mailslots. - (thread_mailslot): New function. - (start_thread_mailslot): Ditto. - (mailslot_cleanup): Ditto. - (fhandler_mailslot::select_read): New method. - * syslog.cc (klog_guard): New muto. - (dev_kmsg): Local mailslot for kernel message device. - (vklog): New function. - (klog): Ditto. - * winsup.h (vklog): Declare. - (klog): Ditto. - * include/sys/syslog.h: Define _PATH_KLOG. - -2005-05-10 Christopher Faylor - - * dcrt0.cc (dll_crt0_1): Call cygwin_exit to ensure that destructors - are handled correctly. - -2005-05-10 Corinna Vinschen - - * path.cc (path_conv::check): Set correct file attributes for socket - files. - -2005-05-09 Pierre Humblet - - * fhandler.h (class fhandler_netdrive): New class. - * fhandler_netdrive.cc (fhandler_netdrive::fhandler_netdrive): New constructor. - (fhandler_netdrive::exists): New method. - (fhandler_netdrive::fstat): Ditto. - (fhandler_netdrive::readdir): Ditto. - (fhandler_netdrive::open): Ditto. - * dtable.cc (build_fh_pc): Handle case FH_NETDRIVE. - * path.cc (isvirtual_dev): Add FH_NETDRIVE. - (mount_info::conv_to_win32_path): Detect netdrive device and bypass mount - search for network paths. - -2005-05-08 Christopher Faylor - - * dcrt0.cc (get_cygwin_startup_info): New function pulled from - dll_crt0_0. - (dll_crt0_0): Use get_cygwin_startup_info to retrieve cygwin-specific - startup pointer. - * external.cc (cygwin_internal): Implement CW_ARGV and CW_ENVP. - * include/sys/cygwin.h: Implement CW_ARGV and CW_ENVP. - -2005-05-07 Christopher Faylor - - * path.cc (normalize_posix_path): Don't treat '//' specially since - newer versions of bash now get this right. - -2005-05-07 Christopher Faylor - - * devices.cc: Regenerate with correct name for dev_netdrive_storage. - -2005-05-06 Christopher Faylor - - * Makefile.in (DLL_O_FILES): Add fhandler_netdrive.o. - * fhandler_netdrive.cc: Placeholder file for future development. - * devices.h (FH_NETDRIVE): Define new virtual device type. - (netdrive_dev): Define. - * devices.in (dev_netdrive_storage): Define. - * devices.cc: Regenerate. - -2005-05-04 Corinna Vinschen - - * cygerrno.h (__set_errno): Remove useless parentheses. - -2005-05-04 Corinna Vinschen - - * cygerrno.h (__set_errno): Define as inline function here. - (set_errno): Always define as call to __set_errno. - * debug.cc (__set_errno): Move to cygerrno.h. - -2005-05-03 Christopher Faylor - - * shared.cc (user_shared_initialize): Rework locking so that nothing is - checked until cb is non-zero. - -2005-05-03 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::fchmod): Don't treat - inability to open file as failure if only SetFileAttributes is - going to be called. Only call set_file_attribute if really necessary. - -2005-05-03 Corinna Vinschen - - * fhandler_socket.cc (get_inet_addr): Add missing __seterrno call. - -2005-05-01 Christopher Faylor - - * fhandler_tty.cc (fhandler_tty_slave::read): Actually read input when - vmin == vtime == 0. - -2005-04-30 Christopher Faylor - - * environ.cc (spenv::force_into_environment): Rename from add_always. - (spenv::add_if_exists): Rename from force. - (build_env): Accommodate name changes. Make sure that stuff that is - always supposed to be in the environment is actually added to the - environment. - - * shared.cc (open_shared): Restore VirtualFree eliminated by 2005-04-28 - change. - -2005-04-30 Christopher Faylor - - * errno.cc (errmap): Sort table. - -2005-04-29 Christopher Faylor - - * errno.cc (errmap): Map ERROR_NETNAME_DELETED to ENOSHARE. - -2005-04-28 Corinna Vinschen - - * shared_info.h (cygwin_shared_address): Bump to a higher value to avoid - collision with large data areas. - -2005-04-28 Christopher Faylor - - * fhandler_console.cc (fhandler_console::get_tty_stuff): Accommodate - changes to open_shared arguments. - * fhandler_tape.cc (mtinfo_init): Ditto. - * pinfo.cc (pinfo::init): Use open_shared rather than win32 mmap calls. - * shared.cc (user_shared_initialize): Ditto. - (memory_init): Ditto. - (open_shared): Change to allow use a smore general mmap handler. - * shared_info.h (shared_locations): Add SH_JUSTCREATE, SH_JUSTOPEN. - (open_shared): Change declaration to match new usage. - - * autoload.cc (LoadDLLfuncEx2): Define in terms of LoadDLLfuncEx3. - (LoadDLLfuncEx3): New macro. - -2005-04-27 Christopher Faylor - - * fhandler.cc (fhandler_base::open_9x): Remove (broken) check for - O_CREAT|O_EXCL. - * syscalls.cc (open): Do O_CREAT|O_EXCL check here first. - -2005-04-26 Christopher Faylor - - * environ.cc (build_env): Ensure that win32 array is properly filled in - when a missing value has to be generated. - -2005-04-26 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 17. - -2005-04-24 Pavel Tsekov - - * how-to-debug-cygwin.txt: Fix typo. - -2005-04-22 Christopher Faylor - - * shared.cc (user_shared_initialize): Implement locking similar to - shared_info when initializing shared region. - -2005-04-22 Christopher Faylor - - * fhandler.h (dev_console::set_color): Define new function. - (dev_console::set_default_attr): Ditto, moved from fhandler_console. - (dev_console::fillin_info): Ditto. Accommodate this change throughout - this file. - (fhandler_console::get_win32_attr): Eliminate. - * fhandler_console.cc (fhandler_console::get_tty_stuff): Properly set - default attributes on initialization. - (fhandler_console::open): Set current attributes rather than default - color on open. - (fhandler_console::get_win32_attr): Eliminate. - (dev_console::set_color): New function. Move get_win32_attr stuff - here. - (dev_console::set_default_attr): New function, moved from - fhandler_console. - (dev_console::fillin_info): Ditto. - (fhandler_console::char_command): Call set_color to set screen - characteristics. - -2005-04-22 Christopher Faylor - - * fhandler.cc (fhandler_base::read): Remove unused signal state tweaks. - * fhandler.h (fhandler_pipe::create_selectable): Declare. - (fhandler_fifo::close_one_end): Declare. - * fhandler_fifo.cc (fhandler_fifo::close_one_end): Define. - (fhandler_fifo::open_not_mine): Use close_one_end to close appropriate - end of pipe. - * pinfo.cc (_pinfo::commune_recv): Ditto. - * pipe.cc (fhandler_pipe::create_selectable): Rename from - create_selectable_pipe. Reorganize. - (fhandler_pipe::create): Use create_selectable. - -2005-04-21 Christopher Faylor - - * shared.cc (shared_info::initialize): Test previous version of shared - memory magic rather than current version when determining if there has - been a shared memory mismatch. - -2005-04-20 Christopher Faylor - - * sigproc.cc (proc_subproc): Fix handling of waiting for pids with zero - value. - - * strace.cc (strace::hello): Report parent pid of executing process. - -2005-04-20 Christopher Faylor - - * path.cc (path_conv::check): Fix problem reading symlinks introduced - in below change by reverting the change and adding an additional test - for nonexistent files in /proc. - -2005-04-20 Christopher Faylor - - * path.cc (path_conv::check): Punt when attempting to access a - nonexistent directory or file in /proc. - -2005-04-19 Corinna Vinschen - - * security.cc (alloc_sd): Remove DELETE bit from user's ACE if - allow_traverse is set. - -2005-04-19 Corinna Vinschen - - * cygwin.din (pselect): Export. - * select.cc (pselect): New function. - * include/cygwin/version.h: Bump API minor number. - * include/sys/select.h: Include signal.h. Declare pselect. - -2005-04-18 Corinna Vinschen - - * fhandler.h (enum conn_state): Add connect_failed state. - * fhandler_socket.cc (fhandler_socket::connect): Set connect_state to - connect_failed when connect failed. - * poll.cc (poll): Change errno to EINVAL if allocating memory fails, - according to SUSv3. Add socket descriptors always to except_fds. Test - for failed connect and set revents flags appropriately. - * select.cc (set_bits): Set connect_state to connect_failed when - select indicates failed nonblocking connect. - (fhandler_dev_null::select_except): Set except_ready to false so that - /dev/null is not always in except state. - (peek_socket): Fix bogus conditional. - (fhandler_socket::select_write): Treat all connect_states except - unconnected equivalent to return consistent results. - (fhandler_windows::select_except): Set except_ready to false so that - /dev/windows is not always in except state. - -2005-04-18 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 16. - -2005-04-18 Pierre Humblet - - * grp.cc (initgroups32): Return the correct value. - -2005-04-16 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_base::utimes_fs): Ignore - ERROR_NOT_SUPPORTED to workaround Win9x weirdness. - * path.cc (symlink_info::check): Remap ERROR_INVALID_FUNTION to - ERROR_FILE_NOT_FOUND for the same reason. - -2005-04-16 Corinna Vinschen - Pierre Humblet - - * security.h (cygsidlist::addfromgr): Allow duplicate entries. - (get_server_groups): Declare new function. - * security.cc (is_group_member): Simplify. - (get_server_groups): New function. - (get_initgroups_sidlist): Call get_server_groups. - (verify_token): Allow token when supplementary sids are not in - /etc/group but are in the token. - Streamline the code. - * grp.cc (initgroups32): New implementation. - (getgroups32): Handle case where the supplementary groups are set. - -2005-04-16 Corinna Vinschen - - * environ.cc (environ_init): Don't set traverse checking as default. - -2005-04-16 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_base::utimes_fs): Drop touching - ChangeTime. - -2005-04-16 Christopher Faylor - - * fhandler.cc (fhandler::dup): Duplicate flags, too. - * fhandler.h (fhandler_fifo::owner): Eliminate. - * fhandler_disk_file.cc (fhandler_base::fstat_fs): Handle on-disk - devices better. - (fhandler_base::fstat_helper): Ditto. - * fhandler_fifo.cc (fhandler_fifo::fhandler_fifo): Don't initialize - obsolete "owner". - (fhandler_fifo::open_not_mine): Add some debugging. Duplicate correct - handle when we own it. - (fhandler_fifo::open): Set flags from input, not from first pipe. Flag - that fork fixup is needed. - (fhandler_fifo::dup): Set errno correctly when DuplicateHandle fails. - * pinfo.cc (commune_send): Add debugging for fifo. - - * cygwin/version.h: Bump API minor version to 127 to reflect exporting - of sigrelese. - -2005-04-14 Kazuhiro Fujieda - - * syscalls.cc (setuid32): Correct debugging output. - -2005-04-14 Christopher Faylor - - * dcrt0.cc (do_global_dtors): Run DLL dtors. - (__main): Don't rely on atexit to run dtors. - (do_exit): Specifically call do_global_dtors here. - (cygwin_exit): Ditto. - * dll_init.cc (dll_global_dtors): Make global. Only run dtors once. - (dll_list::init): Just set flag that dtors should be run. Don't rely on atexit. - * dll_init.h (dll_global_dtors): Declare. - - * exceptions.cc (sigrelse): Define. - - * path.h (is_fs_device): New method. - (is_lnk_special): Ditto. - * fhandler_disk_file.cc (fhandler_disk_file::link): Use - "is_lnk_special" rather than "is_lnk_symlink". - * syscalls.cc (rename): Ditto. - - * hookapi.cc (ld_preload): Use colon as a separator rather than space. - -2005-04-13 Corinna Vinschen - - * fhandler.h (class fhandler_socket): Remove utimes. - * fhandler_socket.cc (fhandler_socket::utimes): Remove. - -2005-04-13 Corinna Vinschen - - * cygerrno.h (__seterrno_from_nt_status): Define. Always set Win32 - error code as well as errno. Use throughout where errno is set from - NT status. - (set_errno): Evaluate val only once. - * fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Fix typo in - debug output. - * fhandler_mem.cc (fhandler_dev_mem::open): Rely on - __seterrno_from_nt_status setting Win32 error code in debug output. - * fhandler_proc.cc (format_proc_uptime): Ditto. - (format_proc_stat): Ditto. - * fhandler_process.cc (format_process_stat): Ditto. - * sysconf.cc (sysconf): Ditto. - -2005-04-13 Christopher Faylor - - * fhandler.h (fhandler_base::utimes_fs): New method. - * fhandler.cc (fhandler_base::utimes): Call utimes_fs if on-disk - special file. - * fhandler_disk_file.cc (fhandler_disk_file::utimes): Use utimes_fs. - (fhandler_base::utimes_fs): Handle on-disk device files. - -2005-04-13 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::utimes): Don't set errno - if open fails, it has already been set by open. - -2005-04-12 Corinna Vinschen - - * autoload.cc (NtQueryVolumeInformationFile): Add. - * fhandler.cc (fhandler_base::raw_write): Don't touch has_changed flag. - * fhandler.h (enum change_state): Remove. - (fhandler_base::status): Revert has_changed to a simple bit. - (fhandler_base::fstat_helper): Add nAllocSize parameter. Rename - ftCreationTime to ftChangeTime. - * fhandler_disk_file.cc: Call fstat_helper with additional - allocation size throughout. - (fhandler_base::fstat_by_handle): Use NT native functions to get - full file information on NT. Call fstat_helper with LastWriteTime - as ctime, if ChangeTime is not available. - (fhandler_base::fstat_by_name): Call fstat_helper with LastWriteTime - as ctime. - (fhandler_base::fstat_helper): Add comment. Drop special FAT - handling since it's useless. Use nAllocSize for st_blocks if available. - (fhandler_disk_file::touch_ctime): Only touch LastWriteTime. - (fhandler_disk_file::fchmod): Set has_changed on 9x only. - (fhandler_disk_file::fchown): Don't set has_changed. - (fhandler_disk_file::facl): Ditto. - (fhandler_disk_file::ftruncate): Ditto. - (fhandler_disk_file::link): Set has_changed on 9x only and on original - file only. - (fhandler_base::open_fs): Don't set has_changed in O_TRUNC case. - * ntdll.h (FILE_BASIC_INFORMATION): Define. - (FILE_STANDARD_INFORMATION): Define. - (FILE_INTERNAL_INFORMATION): Define. - (FILE_EA_INFORMATION): Define. - (FILE_ACCESS_INFORMATION): Define. - (FILE_POSITION_INFORMATION): Define. - (FILE_MODE_INFORMATION): Define. - (FILE_ALIGNMENT_INFORMATION): Define. - (FILE_NAME_INFORMATION): Don't define with arbitrary FileName size. - (FILE_ALL_INFORMATION): Define. - (FILE_INFORMATION_CLASS): Add FileAllInformation. - (FILE_FS_VOLUME_INFORMATION): Define. - (FS_INFORMATION_CLASS): Define. - (NtQueryVolumeInformationFile): Define. - -2005-04-11 Corinna Vinschen - - Revert previous patch. - * autoload.cc (GetVolumePathNamesForVolumeNameA): Remove. - (GetVolumeNameForVolumeMountPointA): Add. - * syscalls.cc (sync): Rewrite guid case to skip floppies also on - Windows 2000. - -2005-04-11 Corinna Vinschen - - * syscalls.cc (sync): Use renamed has_get_volume_pathnames wincap. - * wincap.h (wincaps::has_get_volume_pathnames): Rename from - has_guid_volumes - * wincap.cc: Accommodate above rename throughout. Set to false on - Windows 2000. - -2005-04-08 Christopher Faylor - - * pipe.cc (fhandler_pipe::open): Remove O_CREAT limitation. - -2005-04-07 Corinna Vinschen - - * syslog.cc (try_connect_guard): Remove useless conditionalized code. - -2005-04-07 Corinna Vinschen - - * syslog.cc: Include sys/socket.h. - (try_connect_guard): New static variable. - (syslogd_inited): Ditto. - (syslogd_sock): Ditto. - (try_connect_syslogd): New function to connect and write syslog to - local syslogd. - (vsyslog): Log to stderr if LOG_PERROR flag has been given to openlog. - Try logging to syslogd. Use Event Log resp. log file as fallback. - (closelog): Close socket to syslogd. - * include/sys/syslog.h (_PATH_LOG): Define. - (INTERNAL_NOPRI): Define if SYSLOG_NAMES is defined. - (INTERNAL_MARK): Ditto. - (struct _code): Ditto. - (prioritynames): Ditto. - (facilitynames): Ditto. - -2005-04-06 Corinna Vinschen - - * fhandler_socket.cc (get_inet_addr): Add type parameter to return - unix socket type. Read socket type from unix socket file. - (fhandler_socket::bind): Write socket type to unix socket file. - (fhandler_socket::connect): Return with errno EPROTOTYPE if - socket type of socket doesn't match socket type of unix socket - trying to connect to. - -2005-04-06 Pierre Humblet - - * security.h (cygsidlist::addfromgr): Avoid duplicate entries. - * grp.cc (initgrousp): Add syscall_printf. - (setgroups): Add syscall_printf and make sure sids are added only once. - -2005-04-06 Christopher Faylor - - * net.cc (cygwin_getservbyname): Return (possibly NULL) return value of - dup_ent rather than assuming that tls buffer is valid. - (cygwin_getservbyport): Ditto. - (cygwin_gethostbyname): Ditto. - (cygwin_gethostbyaddr): Ditto. - -2005-04-05 Christopher Faylor - - * cygtls.cc (_cygtls::remove): Don't free or close stuff if we're being - called in a "non-standard" way. - -2005-04-05 Christopher Faylor - - * sync.h (muto::initforce): Delete flawed implementation. - * pwdgrp.h (pwdgrp::pglock): Make static. - * grp.cc (pwdgrp::pwdgrp): Eliminate use of initforce. - -2005-04-05 Christopher Faylor - - * sync.h (muto::initforce): Force initialization even when name != - NULL. - * grp.cc (pwdgrp::pwdgrp): Use initforce since the enclosing structure - is !NO_COPY. - -2005-04-05 Christopher Faylor - - * sync.h (muto::operator int): New operator. - (locker): Remove unused class. - (new_muto): Delete. - (new_muto1): Ditto. - (new_muto_name): Ditto. - * cygheap.cc (cygheap_setup_for_child): Reflect use of static storage - for muto rather than pointer. - (_csbrk): Ditto. - (_cmalloc): Ditto. - (_cmalloc): Ditto. - (_cfree): Ditto. - * cygheap.h (cwdstuff::cwd_lock): Ditto. - (cwdstuff::get_drive): Ditto. - * cygmalloc.h (__malloc_lock): Ditto. - (__malloc_unlock): Ditto. - * cygtls.cc (sentry::lock): Ditto. - (sentry::sentry): Ditto. - (~sentry): Ditto. - (_cygtls::init): Ditto. - * dcrt0.cc: Ditto. - (cygwin_atexit): Ditto. - (cygwin_exit): Ditto. - * debug.cc (lock_debug::locker): Ditto. - (lock_debug::lock_debug): Ditto. - (lock_debug::unlock): Ditto. - (debug_init): Ditto. - * dtable.cc (dtable::init_lock): Ditto. - * dtable.h (dtable::lock_cs): Ditto. - (dtable::lock): Ditto. - (dtable::unlock): Ditto. - * exceptions.cc (mask_sync): Ditto. - (sighold): Ditto. - (set_process_mask_delta): Ditto. - (set_signal_mask): Ditto. - (events_init): Ditto. - * grp.cc (pwdgrp::pwdgrp): Ditto. - * malloc_wrapper.cc (mallock): Ditto. - (malloc_init): Ditto. - * path.cc (cwdstuff::cwd_lock): Ditto. - (cwdstuff::get_hash): Ditto. - (cwdstuff::get_hash): Ditto. - (cwdstuff::init): Ditto. - (cwdstuff::set): Ditto. - (cwdstuff::get): Ditto. - * pwdgrp.h (pwdgrp::pglock): Ditto. - (pwdgrp::refresh): Ditto. - * sigproc.cc (sync_proc_subproc): Ditto. - (get_proc_lock): Ditto. - (proc_subproc): Ditto. - (_cygtls::remove_wq): Ditto. - (proc_terminate): Ditto. - (sigproc_init): Ditto. - * timer.cc (lock_timer_tracker::protect): Ditto. - (lock_timer_tracker::lock_timer_tracker): Ditto. - (lock_timer_tracker::~lock_timer_tracker): Ditto. - * wininfo.cc (wininfo::_lock;): Ditto. - (wininfo::winthread): Ditto. - (operator HWND): Ditto. - (wininfo::lock): Ditto. - (wininfo::release): Ditto. - * wininfo.h (wininfo::_lock;): Ditto. - -2005-04-04 Christopher Faylor - - * path.cc (path_conv::check): Only check for PC_NO_ACCESS_CHECK in end - component. - -2005-04-04 Corinna Vinschen - - * dcrt0.cc (dll_crt0_1): Don't call set_cygwin_privileges on 9x. - - * fhandler.h (enum change_state): Add. - (fhandler_base::status): Add a bit to has_changed flag. - (fhandler_base::has_changed): Implement with type change_state. - * fhandler.cc (fhandler_base::raw_write): Accommodate type change - of has_changed. - * fhandler_disk_file.cc (fhandler_disk_file::touch_ctime): Also - touch modification time if has_changed == data_changed. - (fhandler_disk_file::fchmod): Also open on 9x, otherwise we can't - touch ctime. Accommodate type change of has_changed. - (fhandler_disk_file::fchown): Accommodate type change of has_changed. - (fhandler_disk_file::facl): Ditto. - (fhandler_disk_file::ftruncate): Ditto. - (fhandler_disk_file::link): Ditto. - (fhandler_base::open_fs): Ditto. - -2005-04-03 Corinna Vinschen - - * cygheap.cc (cygheap_init): Accommodate set_process_privilege change. - * cygheap.h (cygheap_user::curr_primary_token): New member. - (cygheap_user::primary_token): New method. - (cygheap_user::deimpersonate): Always revert to processes' - impersonation token. - (cygheap_user::reimpersonate): Set processes' or setuid token as - necessary. - (cygheap_user::has_impersonation_tokens): Look for curr_primary_token - value. - (cygheap_user::close_impersonation_tokens): Close curr_primary_token - here if necessary. Don't reset token values to NO_IMPERSONATION since - that's done in uinfo_init anyway. - (init_cygheap::luid): New LUID array keeping privilege LUIDs. - * cygtls.cc (_cygtls::init_thread): Call cygheap->user.reimpersonate. - * dcrt0.cc (hProcToken): New global variable to keep process token. - (hProcImpToken): Ditto for process impersonation token. - (dll_crt0_0): Open process token here once. Duplicate to create - hProcImpToken. - (dll_crt0_1): Call set_cygwin_privileges. - * environ.cc (allow_ntea): Drop duplicate declaration. - (allow_smbntsec): Ditto. - (set_traverse): Only set allow_traverse here. - (environ_init): Ditto. - * fhandler_disk_file.cc (fhandler_disk_file::fchmod): Drop call to - enable_restore_privilege. - (fhandler_disk_file::fchown): Ditto. - (fhandler_disk_file::facl): Ditto. - * fork.cc (fork_child): Move call to cygheap->user.reimpersonate after - syn with parent. Call set_cygwin_privileges. - * grp.cc (internal_getgroups): Use hProcImpToken instead of opening - process token. - * path.cc (fs_info::update): Bypass traverse checking when retrieving - volume information using push/pop_thread_privileges. - * registry.cc (load_registry_hive): Drop setting restore privilege - since it's already set if available. - * sec_helper.cc: Include cygtls.h. - (cygpriv): Privilege string array. - (privilege_luid): New function, evaluate LUID from cygpriv_idx. - (privilege_luid_by_name): New function, evaluate LUID from privilege - string. - (privilege_name): New function, evaluate privilege string from - cygpriv_idx. - (set_privilege): New static function called by set_process_privilege - and set_thread_privilege. Call privilege_luid to get privilege LUID. - Fix bug in return value evaluation. Improve debug output. - (set_cygwin_privileges): New function. - (set_process_privilege): Remove. - (enable_restore_privilege): Remove. - * security.cc (allow_traverse): New global variable. - (sys_privs): Change type to cygpriv_idx and store privilege indices - instead of strings. - (SYSTEM_PRIVILEGES_COUNT): Renamed from SYSTEM_PERMISSION_COUNT. - (get_system_priv_list): Don't use numerical constant in malloc call. - Use privilege_luid to get privilege LUIDs. - (get_priv_list): Call privilege_luid_by_name to get LUIDs. Improve - inner privilege LUID comparison loop. - (create_token): Enable create token privilege using - push/pop_self_privileges. Use hProcToken instead of opening process - token. Use default DACL when duplicating token. - (subauth): Enable tcb privilege using push/pop_self_privileges. - Use sec_none instead of homw made security attributes when duplicating - token. - (check_file_access): Don't duplicate access token, use active - impersonation token as is. - * security.h (enum cygpriv_idx): New enumeration type enumerating - possible privileges. - (privilege_luid): Declare new function. - (privilege_luid_by_name): Ditto. - (privilege_name): Ditto. - (allow_traverse): Declare. - (set_privilege): Declare function. - (set_process_privilege): Define as macro. - (enable_restore_privilege): Remove declaration. - (_push_thread_privilege): Define macro. - (push_thread_privilege): Ditto. - (pop_thread_privilege): Ditto. - (pop_self_privilege): Ditto. - * spawn.cc (spawn_guts): Use cygheap->user.primary_token instead of - cygheap->user.token. - * syscalls.cc (statvfs): Bypass traverse checking when retrieving - volume information using push/pop_thread_privileges. Rearrange code - to simplify push/pop bracketing. - (seteuid32): Use hProcToken instead of opening process token. Call - cygheap->user.deimpersonate instead of RevertToSelf. Create - impersonation token from primary internal or external token. Set - cygheap->user.curr_primary_token and cygheap->user.current_token - privileges once here. Drop "failed" and "failed_ptok" labels. - Drop setting DefaultDacl of process token. - (setegid32): Use hProcToken and hProcImpToken instead of opening - process token. Always reimpersonate afterwards. - * uinfo.cc (cygheap_user::init): Use hProcToken instead of opening - process token. - (internal_getlogin): Ditto. Set hProcImpToken, too. - (uinfo_init): Initialize cygheap->user.curr_primary_token. - * winsup.h (hProcToken): Declare. - (hProcImpToken): Declare. - -2005-04-03 Corinna Vinschen - - Unify usage of CYG_MAX_PATH throughout. Change buffers from - size CYG_MAX_PATH + 1 to CYG_MAX_PATH. Change length tests - accordingly. - -2005-04-02 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 15. - -2005-04-01 Corinna Vinschen - - * fork.cc (fork_child): Add missing __stdcall. - -2005-04-01 Christopher Faylor - - * sigproc.cc (create_signal_arrive): New (temporary?) function to - create signal_arrived event. - (sigproc_init): Use create_signal_arrived. - * fork.cc (fork_child): Create signal_arrived early. - -2005-04-01 Corinna Vinschen - - * fork.cc (fork_child): Fixup SYSV IPC shared memory before fixing - up fdtab. - -2005-03-31 Corinna Vinschen - - * gentls_offsets: Add '-m32' flag to native compiler call to satisfy - cross platform builds. - -2005-03-31 Corinna Vinschen - - * errno.cc (NO_SYSTEM_RESOURCES): Map to EAGAIN. - (NONPAGED_SYSTEM_RESOURCES): Ditto. - (PAGED_SYSTEM_RESOURCES): Ditto. - (WORKING_SET_QUOTA): Ditto. - (PAGEFILE_QUOTA): Ditto. - (COMMITMENT_LIMIT): Ditto. - -2005-03-30 Christopher Faylor - - * environ.cc (spenvs): Re-force SYSTEMROOT to always be included in - environment. - (build_env): Ditto. - -2005-03-30 Christopher Faylor - - * environ.cc (spenv::retrieve): Revert most of previous change. - (build_env): Ditto. Rework to track environment variables which need - to always be in the windows environment in a separate array. - -2005-03-30 Igor Pechtchanski - - * path.cc (symlink_info::case_check): Ignore trailing characters - in paths when comparing case. - -2005-03-30 Christopher Faylor - - * environ.h (win_env::immediate): Declare new field. - (win_env::operator = ): Declare new operator. - (win_env::reset): Declare new function. - (win_env::~win_env): Declare new destructor. - (getwinenv): Add optional third argument to declaration. - * environ.cc (conv_envvars): Accommodate immediate field. - (win_env::operator =): Define new operator. - (win_env::~win_env): Define new destructor. - (win_env::add_cache): Add value to environment immediately if - "immediate" is set. - (getwinenv): Accept optional third argument which will be used to store - "cached" values to avoid overwriting real cache. - (spenv::force): Declare new field. - (spenvs): Accommodate force field. Add "PATH=" with force set to true. - (spenv::retrieve): Avoid duping anything if we're not building an - envblock. - (build_env): Ditto. Use size of potentially constructed new - environment block to determine if we need to create an environment - block. Pass getwinenv temporary storage to avoid inappropriately - overwriting the environment cache. - -2005-03-29 Eric Blake - - * include/limits.h (NAME_MAX): New define. - (PATH_MAX): POSIX allows PATH_MAX to include trailing NUL. - -2005-03-29 Corinna Vinschen - - * path.cc (is_floppy): Make externally available. - * path.h (is_floppy): Declare. - * syscalls.cc (sync): Check for floppies on A: and B: in guid case. - Don't call setmntent in non-guid case but evaluate drive bit mask - locally. - -2005-03-29 Corinna Vinschen - - * fhandler_process.cc: Re-add exename. - -2005-03-28 Christopher Faylor - - * include/ctype.h: Accommodate building in newlib. - -2005-03-28 Christopher Faylor - - * timer.cc (getitimer): Check that ovalue is a valid pointer, not just - NULL. - -2005-03-28 Christopher Faylor - - * timer.cc (timer_tracker::settime): Set times to zero when just - cancelling a timer. - -2005-03-28 Christopher Faylor - - * cygthread.cc (cygthread::detach): Revert to just waiting for thread - event since waiting for anything else is racy. - * timer.cc (timer_tracker::hcancel): Rename from cancel. - (timer_tracker::cancel): New method. - (timer_tracker::th): Remove. - (timer_tracker::~timer_tracker): Call cancel method. - (timer_tracker::timer_tracker): Ditto. - (timer_tracker::timer_tracker): Always, clear cancel, even though it is - probably not strictly necessary for ttstart. - (timer_thread): Accommodate cancel -> hcancel rename. - (timer_tracker::settime): Ditto. - (timer_tracker::gettime): Ditto. - (timer_delete): Ditto. - - * cygwin.din: Export _ctype_. - * include/ctype.h: Mark that _ctype_ is imported. - -2005-03-28 Christopher Faylor - - * timer.cc (timer_tracker::timer_tracker): Eliminate simple - constructor. - (ttstart): Fully initialize. - - * errno.cc: Fix typo introduced in previous change. - -2005-03-28 Eric Blake - - * errno.cc (FILENAME_EXCED_RANGE): Map to ENAMETOOLONG. - -2005-03-27 Christopher Faylor - - * signal.cc (nanosleep): Revert tv_sec < 0 check as it is fixed - properly in the below change to hires.h. - -2005-03-27 Pierre Humblet - - * times.cc (hires_ms::usecs): Compare the difference. - * hires.h: Add parentheses to HIRES_DELAY_MAX. - -2005-03-26 Christopher Faylor - - * timer.cc (nanosleep): Treat tv_sec < 0 as invalid. - - * include/search.h: Make declarations consistent with newlib. - -2005-03-26 Pierre Humblet - Christopher Faylor - - * wininfo.h (wininfo::timer_active): Delete. - (wininfo::itv): Ditto. - (wininfo::start_time): Ditto. - (wininfo::window_started): Ditto. - (wininfo::getitimer): Ditto. - (wininfo::setitimer): Ditto. - (wininfo::wininfo): Ditto. - (wininfo::lock): New method. - (wininfo::release): Ditto. - * window.cc: Use new lock/acquire wininfo methods throughout. - (wininfo::wininfo): Delete - (wininfo::getitimer): Ditto. - (wininfo::setitimer): Ditto. - (getitimer): Ditto. - (setitimer): Ditto. - (ualarm): Ditto. - (alarm): Ditto. - (wininfo::lock): Define new function. - (wininfo::release): Ditto. - (wininfo::process): Delete WM_TIMER handling. - * timer.cc (struct timetracker): Delete it, flags. Add it_interval, - interval_us, sleepto_us, running, init_muto(), syncthread, and - gettime(). - (ttstart): Make NO_COPY. - (lock_timer_tracker): New class. - (timer_tracker::timer_tracker): Distinguish ttstart case. - (timer_tracker::~timer_tracker): New destructor. Clean out events, and - reset magic. - (timer_tracker::init_muto): New method. - (to_us): Round up as per POSIX. - (timer_thread): Reorganize to match timer_tracker::settime and - timer_tracker::gettime. Call sig_send without wait. Call - auto_release. - (timer_tracker::settime): Reorganize logic to avoid race. Call gettime - to recover old value. - (timer_tracker::gettime): New method. - (timer_create): Properly set errno on invalid timerid. Use new - lock_timer_tracker method. - (timer_delete): Ditto. Simplify code slightly. - (timer_gettime): New function. - (fixup_timers_after_fork): Reinit ttstart. - (getitimer): New implementation. - (setitimer): Ditto. - (ualarm): Ditto. - (alarm): Ditto. - * cygwin.din: Export timer_gettime. - * winsup.h: Remove has has_visible_window_station declaration. - -2005-03-26 Christopher Faylor - - * Makefile.in (DLL_OFILES): Add lsearch.o. - * cygthread.h (cygthread::notify_detached): New element. - (cygthread::cygthread): Take optional fourth argument signifying event - to signal on thread completion. - * cygthread.cc (cygthread::stub): Signal notify_detached event, if it - exists. - (cygthread::cygthread): Initialize notify_detached from fourth argument. - (cygthread::detach): Wait for notify_detached field is present. - - * lsearch.cc: New file. - * search.h: Ditto. - * include/cygwin/version.h: Bump API minor number to 126. - * cygwin.din: Export lsearch, lfind. - -2005-03-23 Corinna Vinschen - - * fhandler.h (fhandler_socket::secret_event): Remove. - (fhandler_socket::af_local_set_secret): New function combining former - set_connect_secret and get_connect_secret into one function. - (fhandler_socket::af_local_setblocking): Rename from eid_setblocking. - (fhandler_socket::af_local_unsetblocking): Rename from - eid_unsetblocking. - (fhandler_socket::af_local_set_cred): New method. - (fhandler_socket::af_local_copy): New method. - (fhandler_socket::af_local_recv_secret): New method. - (fhandler_socket::af_local_send_secret): New method. - (fhandler_socket::af_local_recv_cred): Rename from eid_recv. - (fhandler_socket::af_local_send_cred): Rename from eid_send. - (fhandler_socket::af_local_accept): New method. - (fhandler_socket::af_local_set_sockpair_cred): Rename from - set_socketpair_eids. - (fhandler_socket::eid_accept): Remove. - (fhandler_socket::eid_connect): Remove. - (fhandler_socket::set_connect_secret): Remove. - (fhandler_socket::get_connect_secret): Remove. - (fhandler_socket::create_secret_event): Remove. - (fhandler_socket::check_peer_secret_event): Remove. - (fhandler_socket::signal_secret_event): Remove. - (fhandler_socket::close_secret_event): Remove. - (fhandler_socket::sec_event_accept): Remove. - (fhandler_socket::sec_event_connect): Remove. - * fhandler_socket.cc (secret_event_name): Remove. - (fhandler_socket::af_local_set_sockpair_cred): Rename from - set_socketpair_eids. - (fhandler_socket::af_local_setblocking): Rename from eid_setblocking. - (fhandler_socket::af_local_unsetblocking): Rename from - eid_unsetblocking. - (fhandler_socket::af_local_recv_secret): New function to receive - AF_LOCAL connect secret over socket itself. - (fhandler_socket::af_local_send_secret): New function to send AF_LOCAL - connect secret over socket itself. - (fhandler_socket::af_local_recv_cred): Rename from eid_recv. - (fhandler_socket::af_local_send_cred): Rename from eid_send. - (fhandler_socket::eid_connect): Remove. - (fhandler_socket::af_local_connect): Take over connect side handling - of AF_LOCAL secret and credential handshake. - (fhandler_socket::eid_accept): Remove. - (fhandler_socket::af_local_accept): New method, take over accept side - handling of AF_LOCAL secret and credential handshake. - (fhandler_socket::af_local_set_cred): New method, set eid credentials - to start values. - (fhandler_socket::af_local_copy): New method, copy secret and - credentials to another socket. - (fhandler_socket::af_local_set_secret): New function combining former - set_connect_secret and get_connect_secret into one function. - (fhandler_socket::create_secret_event): Remove. - (fhandler_socket::signal_secret_event): Remove. - (fhandler_socket::close_secret_event): Remove. - (fhandler_socket::check_peer_secret_event): Remove. - (fhandler_socket::sec_event_connect): Remove. - (fhandler_socket::sec_event_accept): Remove. - (fhandler_socket::fixup_after_fork): Drop secret_event handling. - (fhandler_socket::bind): Call af_local_set_secret. - (fhandler_socket::connect): Call af_local_set_cred and af_local_connect. - (fhandler_socket::listen): Call af_local_set_cred. - (fhandler_socket::accept): Call af_local_copy and af_local_accept on - accepted socket. - (fhandler_socket::close): Don't call close_secret_event. - (fhandler_socket::set_close_on_exec): Don't set secret_event - inheritance. - * net.cc (cygwin_getsockopt): Add debug output. - (socketpair): Call af_local_set_sockpair_cred instead of - set_socketpair_eids. - * select.cc (set_bits): Drop AF_LOCAL special handling in case - of except bit set. - -2005-03-23 Christopher Faylor - - * include/ctype.h: Always define macros when inside cygwin. - (isblank): New macro. - -2005-03-23 Corinna Vinschen - - * fhandler.h (fhandler_socket::eid_connect): Make private. - (fhandler_socket::set_connect_secret): Ditto. - (fhandler_socket::get_connect_secret): Ditto. - (fhandler_socket::create_secret_event): Ditto. Remove secret argument. - (fhandler_socket::check_peer_secret_event): Ditto. - (fhandler_socket::signal_secret_event): Make private. - (fhandler_socket::close_secret_event): Ditto. - (fhandler_socket::sec_event_accept): New private method. - (fhandler_socket::sec_event_connect): Ditto. - (fhandler_socket::af_local_connect): New public method. - * fhandler_socket.cc: Use 'struct sockaddr' and 'struct sockaddr_in' - rather than just 'sockaddr' and 'sockaddr_in' throughout. - (fhandler_socket::eid_connect): Drop AF_LOCAL/SOCK_STREAM test. - (fhandler_socket::create_secret_event): Remove secret argument. - Always use connect_secret instead. - (fhandler_socket::check_peer_secret_event): Ditto. - (fhandler_socket::sec_event_connect): New method, combining entire - secret event handshake on connect side. - (fhandler_socket::af_local_connect): New method, combining secret - event handshake and eid credential transaction on connect side, to - be called from select. - (fhandler_socket::sec_event_accept): New method, combining entire - secret event handshake on accept side. - (fhandler_socket::connect): Drop secret, use connect_secret instead. - Move entire secret event handshake to sec_event_connect. - (fhandler_socket::accept): Move entire secret event handshake to - sec_event_accept. - * select.cc (set_bits): Just call af_local_connect here. - -2005-03-23 Christopher Faylor - - * include/cygwin/version.h: Change comment for most recent API version - bump to reflect new additions to the DLL and to remove change obsoleted - by the previous checkin. - -2005-03-23 Christopher Faylor - - * include/ctype.h: New file. - * ctype.cc: Ditto. - * Makefile.in: Add ctype.o to DLL_OFILES. - * cygwin.din: Remove _ctype_ptr (for now?). - -2005-03-22 Christopher Faylor - - * Makefile.in (DLL_OFILES): Add hookapi.o. Eliminate some cruft. - * cygheap.h (cygheap_types): Add new enum: HEAP_1_HOOK. - (hook_chain): New struct. - (init_cygheap::hooks): Define new element. - * cygheap.cc (cygheap_fixup_in_child): Zero hook chain on exec. - * dcrt0.cc (dll_crt0_1): Call ld_preload just before calling main function. - * external.cc (cygwin_internal): Implement CW_HOOK. - * fork.cc (fork_child): Call fixup_hooks_after_fork. - * init.cc (cygwin_hmodule): Reinstate after a long absence. - * include/sys/cygwin.h: Define CW_HOOK. - * hookapi.cc: New file. - - * select.cc (start_thread_socket): Add debugging output. - - * fhandler_disk_file.cc (fhandler_disk_file::fchmod): gcc 4.x - accommodation. - - * fhandler_socket.cc (fhandler_socket::connect): Make sure that err is - initialized. - -2005-03-22 Corinna Vinschen - - * cygwin.din (__ctype_ptr): Export. - * include/cygwin/version.h: Bump API minor version. - -2005-03-21 Corinna Vinschen - - * fhandler.h (class cygthread): Remove forward declaration. - -2005-03-21 Corinna Vinschen - - * fhandler.h (class cygthread): Forward declare. - (fhandler_socket::sec_pipe): Remove. - (fhandler_socket::eid_pipe_name): Remove. - (fhandler_socket::eid_setblocking): New private method. - (fhandler_socket::eid_unsetblocking): Ditto - (fhandler_socket::eid_recv): Ditto - (fhandler_socket::eid_send): Ditto - (fhandler_socket::eid_accept): Ditto - (fhandler_socket::eid_connect): New public method. - * fhandler_socket.cc (ASYNC_MASK): Move to beginning of file. - (fhandler_socket::eid_pipe_name): Remove. - (fhandler_socket::set_socketpair_eids): Move down to fhandler_socket - methods. - (fhandler_socket::fhandler_socket): Drop initializing sec_pipe. - (fhandler_socket::~fhandler_socket): Drop closing sec_pipe. - (fhandler_socket::eid_setblocking): New method. - (fhandler_socket::eid_unsetblocking): New method. - (fhandler_socket::eid_recv): New method. - (fhandler_socket::eid_send): New method. - (fhandler_socket::eid_connect): New method. - (fhandler_socket::eid_accept): New method. - (fhandler_socket::dup): Drop sec_pipe handling. - (fhandler_socket::connect): Fix WinSock error handling. Prepare - eid credential transaction. Call eid_connect on successful connect. - (fhandler_socket::listen): Drop creating sec_pipe. - (fhandler_socket::accept): Slightly simplify code. Call eid_accept - on accepted socket. - (fhandler_socket::getpeereid): Reshuffle code for readability. Fix - test for invalid pid. - * select.cc (set_bits): Call eid_connect on successfully connected - socket. - -2005-03-19 Christopher Faylor - - * child_info.h (fork_info): Use different method to alias variable. - (spawn_info): Ditto. - * cxx.cc (__cxa_guard_acquire): New function (needed for gcc 4.x). - (__cxa_guard_release): Ditto. - * devices.in: Make sure stuff is correctly bracketed (for gcc 4.x). - * devices.cc: Regenerate. - * fhandler.h (fhandler_disk_file::fchmod): Avoid left coercion (for gcc - 4.x). - * smallprint.c (__rn): Declare as __fastcall since gcc 4.x complains - about use of regparm, for some reason. - * sync.h (sync::init_lock): Remove. - * sync.cc (sync::init_lock): Ditto. - -2005-03-18 Christopher Faylor - - * net.cc (cygwin_getprotobyname): Don't try to be fancy with return - values. - (cygwin_getprotobynumber): Ditto. - -2005-03-17 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::utimes): Handle opening - directories under 9x gracefully. - -2005-03-17 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::connect): Always set sun_path - in case of a successful or pending connect. - (fhandler_socket::accept): Don't run secret event and eid credential - transactions if OS accept returned WSAEWOULDBLOCK. - -2005-03-16 Christopher Faylor - - * fhandler_tape.cc (get_ll): This is a generally useful function so - move it - * winsup.h (get_ll): to here. - * security.cc (get_token_group_sidlist): Use get_ll to figure out the - long long version of the luid since QuadPart is not part of the - standard Windows API. - -2005-03-16 Christopher Faylor - - * dir.cc: Rename opendir_* to dirent_* throughout. - (opendir_states): Move and rename. - * fhandler.h (dirent_states): to here. - * fhandler_disk_file.cc (fhandler_disk_file::readdir): Use raw readdir - when skipping through entries since it is keeping track of "." and - "..". - (fhandler_cygdrive::seekdir): Use fhandler_disk_file::readdir to do - everything. - * fhandler_virtual.cc (fhandler_virtual::opendir): Set flag indicating - that we provide . and .. - (fhandler_virtual::seekdir): Ditto. - (fhandler_virtual::rewinddir): Ditto. - * fhandler_registry.cc (fhandler_registry::rewinddir): Ditto. - -2005-03-16 Christopher Faylor - - * cygtls.cc (free_local): New macro. - (_cygtls::remove): Use free_local to free known-malloced local - variables. - * cygtls.h: Mark some variables as "malloced". - * net.cc (enum struct_type): Rename from is_* to t_* for clarity. - (dump_protoent): Delete. - (dup_ent): New macro. - (__dup_ent): Renamed from dup_ent. Change arguments for convenience. - Replace first argument with newly alloced value. Allocate a rounded - number of bytes in an attempt to try to reuse space. Subsume - "dump_protent". - (cygwin_getprotobyname): Simplify using new dup_ent functionality. - (cygwin_getprotobynumber): Ditto. - (cygwin_getservbyname): Ditto. - (cygwin_getservbyport): Ditto. - (cygwin_gethostname): Ditto. - (cygwin_gethostbyname): Ditto. - * tlsoffsets.h: Regenerate. - - * syslog.cc (openlog): Use NULL rather than 0, for consistency with the - rest of cygwin. - (pass_handler::initialize): Use unbuffered I/O in pass one. - -2005-03-15 Christopher Faylor - - * errno.cc (errmap): Correct typo in previous change. - -2005-03-15 Christopher Faylor - - * cygtls.cc (_cygtls::remove): Free process_ident, if it exists. - - * errno.cc (errmap): ERROR_DISK_CORRUPT -> EIO. - -2005-03-11 Christopher Faylor - - * path.h (pathconv_arg): Define PC_NO_ACCESS_CHECK. - (path_types): Define PATH_NO_ACCESS_CHECK == PC_NO_ACCESS_CHECK. - * path.cc (symlink_info::check_sysfile): Move to symlink_info class and - eliminate arguments that are part of class. Use set_error. - (symlink_info::check_shortcut): Ditto. - (symlink_info::set_error): New function. - (path_conv::check): Pass PC_NO_ACCESS_CHECK to symlink_info::check. - (symlink_info::check): Preserve PC_NO_ACCESS_CHECK in pflags. Use - set_error. - -2005-03-10 Corinna Vinschen - - * path.cc (is_floppy): New function. - (setmntent): Drop floppy drives on A: and B: from logical drive DWORD. - * syscalls.cc (sync): Don't sync floppies on A: and B:. - -2005-03-10 Christopher Faylor - - * autoload.cc (LoadDLLprime): Use nocopy segment or forked processes - will not initialize properly. - -2005-03-10 Christopher Faylor - - * autoload.cc (LoadDLLprime): Scrap use of .linkonce and just use an - ifdef guard to load .foo_init into data segment. - - * dcrt0.cc (initial_env): Allow colon or space as CYGWIN_DEBUG - separator for consistency. - -2005-03-09 Christopher Faylor - - * pinfo.h (pinfo::pinfo): Clear more elements in the constructor. - -2005-03-09 Christopher Faylor - - * net.cc (dup_ent): Revert older stupid test for null. Don't copy name - if it is NULL. - -2005-03-09 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::eid_pipe_name): Fix format - string. - (fhandler_socket::connect): Set sun_path before running eid credential - transaction. Run transaction only if OS connect was successful. - (fhandler_socket::accept): Run transaction only if OS accept was - successful. - -2005-03-09 Corinna Vinschen - - * signal.cc (sigprocmask): Rename first parameter to "how". - (handle_sigprocmask): Ditto. Check "how" for being a valid "how" value. - Fix call order in case of wrong "how" value. - -2005-03-09 Christopher Faylor - - * net.cc (dup_ent): Revert previous stupid change. - -2005-03-09 Christopher Faylor - - * net.cc (dup_ent): Avoid dereferencing a null pointer in a debug_printf. - -2005-03-09 Christopher Faylor - - * path.cc (path_conv::check): Treat ENOSHARE similarly to ENOENT when - determining if there was a problem with a symlink. - -2005-03-08 Corinna Vinschen - - * fhandler_socket.cc (fhandler_socket::listen): Don't limit the number - of pipe instances. - -2005-03-08 Christopher Faylor - - * pinfo.cc (pinfo::exit): Right shift exit value by eight when not - started in a cygwin environment. - -2005-03-07 Corinna Vinschen - - * mmap.cc (mmap64): Handle MAP_AUTOGROW flag. - (fhandler_disk_file::mmap): Ditto. Clean conditional for readability. - * include/sys/mman.h: Add MAP_AUTOGROW flag. - * include/cygwin/version.h: Bump API minor version. - -2005-03-08 Christopher Faylor - - * dcrt0.cc (dll_crt0_0): Eliminate muto::init call. - * sync.h (locker): New, currently unused class. - (muto::init): Eliminate. - * sync.cc (muto::init): Ditto. - (muto::init): Eliminate critical section lock and instead use name as a - guard to prevent against multiple attempts to initialize the same muto. - - * pinfo.cc (pinfo::init): Set myself procinfo when not execing and pid - matches windows pid or cygwin pid. - -2005-03-06 Pavel Tsekov - - * path.cc (mount_info::read_cygdrive_info_from_registry): Use the user - prefix if it exists. - -2005-03-06 Christopher Faylor - - * sync.h (sync::init_lock): Declare new static member. - (sync::init()): Declare new static function. - * sync.cc (sync::init): Define. - (sync::init): Lock attempt to initialize a muto to stop multiple - threads from colliding. - * dcrt0.cc (dll_crt0_0): Initialize muto environment. - -2005-03-06 Christopher Faylor - - * path.cc (special_name): Reorganize to always detect the use of - special names first, before detecting special characters. - -2005-03-04 Christopher Faylor - - * fhandler_clipboard.cc: Use int for cygnativeformat rather than UINT - as that is what is returned by GetPriorityClipboardFormat. - (fhandler_dev_clipboard::read): Ditto for the format variable. - -2005-03-04 Corinna Vinschen - - * fhandler.cc (fhandler_base::open_9x): Satisfy query_open values. - -2005-03-04 Pierre Humblet - - * fhandler_socket.cc (fhandler_socket::ioctl): Only cancel - WSAAsyncSelect when async mode is on. - -2005-03-03 Corinna Vinschen - - * cygwin.din (utmpxname): Export. - * syscalls.cc (utmpxname): Create export alias to utmpname. - * include/utmpx.h: Define ut_name and ut_xtime if not already defined. - (utmpxname): Add prototype. - * include/sys/utmp.h: Only define ut_name if not already defined. - * include/cygwin/version.h: Bump API minor version. - -2005-03-03 Christopher Faylor - - * cygthread.cc (cygthread::detach): Use a slightly higher priority when - waiting for thread signalling. - -2005-03-02 Christopher Faylor - - * autoload.cc (std_dll_init): Save and restore fpu control register - around LoadAddress to prevent loaded dlls (like msvcrt.dll) from - setting unwanted stuff. - -2005-03-02 Christopher Faylor - - * cygtls.cc (_cygtls::remove): Don't attempt any removal activities if - exitsock is zero. - -2005-03-02 Christopher Faylor - - * cygtls.cc (_cygtls::init_thread): Move exitsock setting later. It - should always be set. - (_cygtls::remove): Detect zero exitsock. Not quite sure why this is needed. - -2005-03-02 Christopher Faylor - - * autoload.cc (LoadDLLprime): Mask error code to low-order 16 bits. - (noload): Preserve sign when returning error code. - -2005-03-02 Christopher Faylor - - * spawn.cc (do_cleanup): Properly restore SIGINT/SIGQUIT even if they - had previously been SIG_DFL. - -2005-03-01 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::touch_ctime): Replace - GetSystemTime/SystemTimeToFileTime with GetSystemTimeAsFileTime. - * times.cc (time_as_timestruc_t): Ditto. - (time): Ditto. - -2005-03-01 Christopher Faylor - - * include/cygwin/version.h: Bump DLL minor number to 14. - -2005-03-01 Corinna Vinschen - - * fhandler_clipboard.cc (fhandler_dev_clipboard::write): Never set - errno to 0. - (fhandler_dev_clipboard::read): Ditto. - * fhandler_windows.cc (fhandler_windows::read): Ditto. - * scandir.cc (scandir): Ditto. - * syscalls.cc (_fstat64_r): Ditto. - (_fstat_r): Ditto. - (_stat64_r): Ditto. - (_stat_r): Ditto. - - * mmap.cc (mmap64): Fix /dev/zero mapping. - -2005-02-28 Corinna Vinschen - - * fhandler.h (class fhandler_socket): Declare new method - set_socketpair_eids. - * fhandler_socket.cc (fhandler_socket::set_socketpair_eids): New method. - (fhandler_socket::dup): Duplicate sec_pipe if necessary. - (fhandler_socket::listen): Only create sec_pipe if named pipes are - available. Initialized sec_peer_pid to 0 as on Linux. - (fhandler_socket::connect): Only run eid credential transaction if - named pipes are available. Fake otherwise. Initialized sec_peer_pid - to 0 as on Linux. - (fhandler_socket::accept): Ditto. - (fhandler_socket::close): Move closing sec_pipe handle from here... - (fhandler_socket::~fhandler_socket): ... to here. - * net.cc (socketpair): Set eid credentials by calling - fhandler_socket::set_socketpair_eids() on both socket ends. - * wincap.h (wincaps::has_named_pipes): New element. - * wincap.cc: Implement above element throughout. - -2005-02-26 Christopher Faylor - - * sigproc.cc (_pinfo::set_ctty): Move function - * pinfo.cc (_pinfo::set_ctty): to here. - - * fhandler_mem.cc (fhandler_dev_mem::fstat): Don't fill out structure - if this is an on-disk device rather than an "auto" device. - * fhandler_raw.cc (fhandler_dev_raw::fstat): Ditto. - - * path.cc (normalize_posix_path): Don't treat a standalone '//' as - introducing a UNC path. - (normalize_win32_path): Ditto. - -2005-02-26 Christopher Faylor - - * debug.cc (delete_handle): Report on handle value in debugging output. - - * pinfo.h (_pinfo::exists): Declare "new" function. - (_pinfo::kill): Ditto. - * fhandler_termios.cc (tty_min::kill_pgrp): Use _pinfo::exists rather - than proc_exists. - * pinfo.cc (pinfo::init): Ditto. Don't do a low_priority_sleep(0) when - looping to find exec'ed procinfo. - (pinfo::release): Be more careful about unmapping and closing. - * signal.cc (_pinfo::kill): Rename from kill_worker. Accommodate entry - into _pinfo class. - (kill0): Use _pinfo::kill rather than kill_worker. - (kill_pgrp): Ditto. Use _pinfo::exists rather than proc_exists. - * sigproc.cc (_pinfo::exists): Rename from proc_exists. - (pid_exists): Use _pinfo::exists rather than proc_exists. - (remove_proc): Ditto. - * sigproc.h (proc_exists): Delete declaration. - -2005-02-25 Corinna Vinschen - - * fhandler.h (class fhandler_base): Declare fixup_mmap_after_fork - with additional flags parameter. Change offset parameter to _off64_t. - (class fhandler_disk_file): Ditto. - (class fhandler_dev_mem): Ditto. - * fhandler_mem.cc (fhandler_dev_mem::fixup_mmap_after_fork): - Accommodate new parameters. - * mmap.cc: Include ntdll.h. - (class mmap_record): Add flags member. - (mmap_record::mmap_record): Add flags parameter. - (mmap_record::get_flags): New method. - (class map): Add next_anon_addr member to store next anonymous mapping - address suggestion. - (map::get_next_anon_addr): New method. - (map::set_next_anon_addr): New method. - (mmap64): Don't align offset and length to granularity in case of - MAP_ANONYMOUS on NT. Check for already existing mapping only on 9x. - Call mmap_record::mmap_record with additional flags argument. - (fhandler_base::fixup_mmap_after_fork): Accommodate new parameters. - (fhandler_disk_file::mmap): Use NtMapViewOfSection with - AT_ROUND_TO_PAGE flag for anonymous mappings on NT. If addr is NULL, - try to map adjacent to previous mapping. - (fhandler_disk_file::fixup_mmap_after_fork): Add flags argument. - Change offset parameter to _off64_t. Use NtMapViewOfSection to - re-create anonymous mappings on NT. - (fixup_mmaps_after_fork): Accommodate new parameters when calling - fhandler's fixup_mmaps_after_fork function. - * ntdll.h (AT_ROUND_TO_PAGE): New define. - -2005-02-25 Corinna Vinschen - - * mmap.cc (mmap64): Handle anonymous MAP_FIXED request on - non-granulation boundary. - -2005-02-25 Corinna Vinschen - - * mmap.cc (class mmap_record): Declare new map_pages method with - address parameter. - (mmap_record::map_pages): New method with address parameter. - (mmap64): Evaluate access mode before checking if already existing - mapping can be used. - Only use existing mapping if requested access mode matches the one - in the existing mapping. - Add check for existing mapping for anonymous MAP_FIXED case. - -2005-02-23 Corinna Vinschen - - * localtime.cc: Implement setting __tzrule's offset member using - newlib's __gettzinfo () interface. - (__tzrule): Remove. - (timezone): Define as long according to POSIX. - -2005-02-23 Eric Blake - - * devices.in (parsedisk): Fix typo. - * devices.cc: Regenerate. - -2005-02-23 Corinna Vinschen - - * cygwin.din (getpeereid): Export. - * fhandler.h (class fhandler_socket): Add pipe and id members to - exchange eid credentials for AF_LOCAL sockets. - (eid_pipe_name): Declare new method. - (getpeereid): Ditto. - * fhandler_socket.cc (fhandler_socket::eid_pipe_name): New method. - (fhandler_socket::fhandler_socket): Initialize sec_pipe. - (fhandler_socket::connect): Exchange eid credentials with accepting - socket process. - (fhandler_socket::listen): Prepare eid credential transaction. - (fhandler_socket::accept): Exchange eid credentials with connecting - socket process. - (fhandler_socket::close): Close eid credentials pipe if open. - (fhandler_socket::getpeereid): New method. - * net.cc (cygwin_getsockopt): Add SO_PEERCRED handling. - (getpeereid): New function. - * include/asm/socket.h (SO_PEERCRED): Define. - * include/cygwin/socket.h (struct ucred): Define new type. - * include/cygwin/version.h: Bump API minor version. - -2005-02-23 Corinna Vinschen - - * include/sys/statvfs.h (ST_RDONLY): Define. - (ST_NOSUID): Define. - -2005-02-23 Corinna Vinschen - - * cygwin.din (fstatvfs): Export. - (statvfs): Export. - * syscalls.cc: Include sys/statvfs.h. - (statvfs): New function. Move statfs functionality here. - (fstatvfs): New function. - (statfs): Just call statvfs and copy structure. Check validity of - incoming struct statfs pointer. - * include/cygwin/types.h (fsblkcnt_t): Define. - (fsfilcnt_t): Define. - * include/cygwin/version.h: Bump API minor version. - * include/sys/statvfs.h: New file. - -2005-02-23 Corinna Vinschen - - * devices.h: Switch FH_ZERO and FH_PORT as on Linux. Add FH_FULL. - * devices.in: Add /dev/full. - * devices.cc: Regenerate. - * dtable.cc (build_fh_pc): Add FH_FULL. - * fhandler.cc (fhandler_base::fstat): Set FH_FULL permission bits - correctly. - * fhandler_zero.cc (fhandler_dev_zero::write): Set errno to ENOSPC - and return -1 if device is FH_FULL. - -2005-02-22 Christopher Faylor - - * fhandler_disk_file.cc (fhandler_cygdrive::closedir): Return 0 when - closing cygdrive_root. - -2005-02-22 Corinna Vinschen - - * cygwin.din (basename): Export. - (dirname): Export. - * path.cc (basename): New function. - (dirname): New function. - * include/libgen.h: New file. - * include/cygwin/version.h: Bump API minor version. - -2005-02-22 Corinna Vinschen - - * select.cc (peek_pipe): Disable new pipe code until there's - a working substitute. - -2005-02-22 Corinna Vinschen - - * cygwin.din (fdatasync): Export. - * fhandler.cc (fhandler_base::fsync): Return with EINVAL if no - handle is available. - * syscalls.cc (fdatasync): Create export alias to fsync. - * include/cygwin/version.h: Bump API minor version. - -2005-02-20 Corinna Vinschen - - * fhandler.h (fhandler_base::fstat_helper): Declare with additional - dwVolumeSerialNumber argument. Drop default values for last three - arguments. - * fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Pass - dwVolumeSerialNumber from GetFileInformationByHandle to fstat_helper. - (fhandler_base::fstat_by_name): Pass pc.volser () to fstat_helper. - Accommodate dropping default values for last three arguments of - fstat_helper. - (fhandler_base::fstat_helper): Add dwVolumeSerialNumber argument. - Use for st_dev member unless 0 in which case pc.volser () is used. - -2005-02-20 Corinna Vinschen - - * autoload.cc (FindFirstVolumeA): Add. - (FindNextVolumeA): Add. - (FindVolumeClose): Add. - (GetVolumePathNamesForVolumeNameA): Add. - * fhandler.h (class fhandler_base): Declare new method fsync. - * fhandler.cc (fhandler_base::fsync): New method. - * syscalls.cc (fsync): Move functionality into fhandler method fsync. - Just call this method from here. - (sync_worker): New static function. - (sync): Fill with life for NT systems. - * wincap.h (wincaps::has_guid_volumes): New element. - * wincap.cc: Implement above element throughout. - -2005-02-20 Corinna Vinschen - - * fhandler.h (enum query_state): Add query_write_attributes state. - (fhandler_base::status.query_open): Add a bit to make room for more - states. - (class fhandler_base): Declare new method utimes. - (class fhandler_socket): Ditto. - (class fhandler_disk_file): Ditto. - (fhandler_disk_file::fhandler_disk_file): Add constructor with - path_conv parameter. - * fhandler.cc (fhandler_base::open): Add query_write_attributes - handling. - (fhandler_base::utimes): New method. - * fhandler_disk_file.cc (fhandler_disk_file::link): Simplify. - Open file with query_write_attributes instead of query_write_control. - (fhandler_disk_file::utimes): New method. - (fhandler_disk_file::fhandler_disk_file): Add constructor with - path_conv parameter setting pc member immediately. - * fhandler_socket.cc (fhandler_socket::fchmod): Use new - fhandler_disk_file constructor. - (fhandler_socket::fchown): Ditto. - (fhandler_socket::facl): Ditto. - (fhandler_socket::link): Ditto. - (fhandler_socket::utimes): New method. - * times.cc: Include dtable.h. - (timeval_to_filetime): Make non-static. - (utimes): Move functionality into fhandler method utimes. Just call - this method from here. - * winsup.h: Simplify declarations of time helper functions. - (timeval_to_filetime): Add extern declaration. - -2005-02-19 Corinna Vinschen - - * fhandler.h (class fhandler_base): Declare new method link. - (class fhandler_socket): Ditto. - (class fhandler_disk_file): Ditto. - * fhandler.cc (fhandler_base::open): Add FILE_WRITE_ATTRIBUTES - to query_write_control access flags. - (fhandler_base::link): New method. - * fhandler_disk_file.cc (fhandler_disk_file::fchmod): Don't try to - open with O_WRONLY since query_write_control includes - FILE_WRITE_ATTRIBUTES. - (fhandler_disk_file::fchown): Ditto. - (fhandler_disk_file::facl): Ditto. - (fhandler_disk_file::link): New method. Touch st_ctime on successful - link. - * fhandler_socket.cc (fhandler_socket::link): New method. - * syscalls.cc (link): Move functionality into fhandler method link. - Just call this method from here. - -2005-02-19 Corinna Vinschen - - * fhandler.h (class fhandler_socket): Declare new methods fchown, - fchmod and facl. - * fhandler_socket.cc (fhandler_socket::fstat): Handle AF_LOCAL - sockets. - (fhandler_socket::fchmod): New method. - (fhandler_socket::fchown): New method. - (fhandler_socket::facl): New method. - -2005-02-19 Corinna Vinschen - - * localtime.cc: Temporary implementation of setting __tzrule's offset - member to be used by strftime. - (__tzrule): New global variable. - (tzparse): Set __tzrule's offset member appropriately. - -2005-02-17 Christopher Faylor - - * path.cc (path_conv::check): Set fs flag when a unix-domain socket - is detected. - -2005-02-17 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::fstat): Set st_ctime if - has_changed flag is set. - (fhandler_disk_file::touch_ctime): Reset has_changed flag on success. - -2005-02-17 Corinna Vinschen - - * times.cc (utimes): Open files with FILE_WRITE_ATTRIBUTES first, - if that fails, try opeing with GENERIC_WRITE. Fix comments. - -2005-02-15 Christopher Faylor - - * path.h (path_conv::issocket): Return true if device == FH_UNIX rather - than expecting path_conv to set a flag. - -2005-02-11 Corinna Vinschen - - * fhandler.cc (fhandler_base::raw_write): Mark as changed on - successful write. - * fhandler.h (fhandler_base::status_flags): Add 'has_changed' flag. - * fhandler_disk_file.cc (fhandler_disk_file::fchmod): Call - fhandler_disk_file's own open and close instead of open_fs and - close_fs. Mark as changed on success. - (fhandler_disk_file::fchown): Ditto. - (fhandler_disk_file::facl): Ditto. - (fhandler_disk_file::ftruncate): Ditto. - (fhandler_base::open_fs): Mark as changed when O_TRUNC flag on existing - file is set. - (fhandler_disk_file::close): Set st_ctime if has_changed flag is set. - -2005-02-11 Christopher Faylor - - * cygthread.cc (cygthread::release): Reset ev here if it exists. - (cygthread::terminate_thread): Eliminate racy code which reset ev and - thread_sync. Remove a few nonsensical inuse checks. Exit at the - bottom. - (cygthread::detach): Rewrite to again try to ensure that we don't say - we're signalled when we are not signalled. - * fhandler.cc (fhandler_base::raw_read): Revert to signalling read - success quickly. - * pipe.cc (fhandler_pipe::close): Use base method to close handle. - * sigproc.h (WAIT_SIG_PRIORITY): Just trundle along at normal priority - to allow the pipe thread to do its thing if possible. - - * pinfo.h (pinfo::zap_cwd): Declare new function. - (pinfo::zap_cwd): Move 'cd out of the way code' here. - (pinfo::exit): Use it here. - * spawn.cc (spawn_guts): And here. - -2005-02-11 Corinna Vinschen - - * times.cc (utimes): Open files with GENERIC_WRITE on file systems - not supporting ACLs. - -2005-02-09 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::ftruncate): Fix checking - lseek return code. - -2005-02-08 Corinna Vinschen - - * times.cc (timeval_to_filetime): Define first parameter const. - (utimes): Define second parameter to const according to SUSv3. - (utime): Ditto. - * include/sys/utime.h (utime) : Change declaration accordingly. - -2005-02-08 Corinna Vinschen - - * cygthread.cc (cygthread::detach): Just test thread handle after - signal arrived, don't wait infinitely for it. - -2005-02-08 Christopher Faylor - - * pipe.cc (fhandler_pipe::read): Remove hold over from old read_state - implementation. - -2005-02-06 Yitzchak Scott-Thoennes - - * net.cc (cygwin_gethostbyname): Be more picky about what's a numeric - address string, and use tls in that case too. - -2005-02-07 Christopher Faylor - - * exceptions.cc: Make windows_system_directory non-static. - * pinfo.cc (pinfo::exit): Change innocuous cd'ed location to one that - is more likely to exist. - -2005-02-06 Corinna Vinschen - - * path.cc (path_conv::check): Leave symlink expansion loop in case - a not-ENOENT error happens. - - * cygheap.h (cygheap_fdmanip::fhandler_pipe *): New cast operator. - * pinfo.cc (_pinfo::commune_recv): Add PICOM_PIPE_FHANDLER handling. - (_pinfo::commune_send): Ditto. - (_pinfo::pipe_fhandler): New method. - * pinfo.h (enum picom): Add PICOM_PIPE_FHANDLER. - (_pinfo::pipe_fhandler): Declare. - * pipe.cc (fhandler_pipe::open): Rewrite. Allow to open foreign - pipe handles. - -2005-02-03 Christopher Faylor - - * cygthread.h (cygthread::terminate_thread): Reflect return value. - * cygthread.cc (cygthread::detach): Be more careful about ensuring that - sigwait is properly waited for to avoid later missynchronization. - (cygthread::terminate_thread): Return true if thread was actually - terminated and all handles were closed. - * fhandler_base.cc (fhandler_base::raw_read): Use signal_read_state - rather than raw calls to win32 api. - (fhandler_base::read): Ditto. - * fhandler.h (fhandler_pipe::fixup_after_exec): Use method to create - read_state signalling. - (fhandler_pipe::create): Ditto. - - * Makefile.in: Make some more files -fomit-frame-pointer. - -2005-02-02 Corinna Vinschen - - * fhandler.h (fhandler_base::ftruncate): Define new virtual method. - (fhandler_disk_file::ftruncate): Ditto. - * fhandler.cc (fhandler_base::ftruncate): New method. - * fhandler_disk_file.cc (fhandler_disk_file::ftruncate): Ditto. - * syscalls.cc (ftruncate64): Move functionality into fhandlers. - Call fhandler method from here. - -2005-02-02 Corinna Vinschen - - * pipe.cc (fhandler_pipe::dup): Fix conditionals in case of error. - -2005-02-02 Corinna Vinschen - - * times.cc (utimes): Mark st_ctime for update according to SUSv3. - -2005-02-01 Christopher Faylor - - * fhandler_proc.cc (format_proc_partitions): Remove PartitionType check - since it could skip over partitions that are actually interesting. - -2005-02-01 Christopher Faylor - - * cygthread.cc (cygthread::terminate_thread): Wait briefly for - notification event in the event that the thread was actually in the - process of exiting. - - * pipe.cc (fhandler_pipe::dup): read_state is not supposed to be - inheritable. Fix that. - - * path.cc (path_conv::check): Set symlen = 0 to avoid a compiler - warning. - - * devices.h (devices::parsedisk): Declare new function. - * devices.in (devices::parsedisk): Define new function. - * dtable.cc (dtable::init_std_file_from_handle): Use device numbers - rather than name. - * fhandler_proc.cc (format_proc_partitions): Use parsedisk to generate - disk names from numeric codes. (This was broken on two of my - systems previously and is still broken now) - -2005-02-01 Corinna Vinschen - - * pipe.cc (fhandler_pipe::open): Allow re-opening of /proc//fd - pipes of the current process. - -2005-02-01 Corinna Vinschen - - * fhandler.cc (fhandler_base::get_proc_fd_name): Don't generate - "device:" entry. - * fhandler.h (fhandler_socket::open): New method. - (fhandler_pipe::open): New method. - * fhandler_proc.cc (fhandler_proc::exists): Return -2 in case of - /proc/self. - * fhandler_process.cc (fhandler_process::exists): Return -2 in - case of symlinks, -3 for pipes and -4 for sockets. - (fhandler_process::fstat): Handle pipes and sockets. - (fhandler_process::open): Handle opening /proc//fd. - (fhandler_process::fill_filebuf): Generate empty names for - non exisiting file descriptors. - * fhandler_socket.cc (fhandler_socket::get_proc_fd_name): Always - generate "socket:[number]" strings as on Linux. - (fhandler_socket::open): New method. - (fhandler_socket::fstat): Always return socket type. - * path.cc (symlink_info::set): Remove unused second parameter. - (path_conv::check): Handle pipes and sockets in /proc. - Set correct device type for AF_LOCAL sockets. - * pinfo.cc (_pinfo::commune_recv): Generate empty names for - non exisiting file descriptors. - (_pinfo::fd): Ditto. - * pipe.cc (fhandler_pipe::open): New method. - -2005-01-31 Christopher Faylor - - * path.h (path_conv::set_name): Declare new function. - * path.cc (path_conv::set_name): Define new function. - * fhandler.h (fhandler_dev_null::open): Declare new function. - * fhandler.cc (fhandler_dev_null::open): Define new function. - -2005-01-31 Christopher Faylor - - * smallprint.c (rnarg): Use long rather than unsigned long so that we - get proper sign extension. - -2005-01-31 Corinna Vinschen - - * environ.cc (set_traverse): New function. - (parse_thing): Add "traverse" option. Sort options alphabetically. - (environ_init): On NT, switch on traverse checking by default. - -2005-01-31 Christopher Faylor - - * smallprint.c (__rn): Regparmize. - -2005-01-31 Christopher Faylor - - * smallprint.c (rnarg): New macro. - (rnargLL): Ditto. - (__rn): Rename from 'rn', add a mask argument, and use the mask - argument to control how many significant digits to care about. - (__small_vsprintf): Use __rn, rnarg, rnargLL, as appropriate. - -2005-01-31 Christopher Faylor - - * pinfo.cc (pinfo::exit): Only return low-order 16 bits when exiting. - -2005-01-31 Corinna Vinschen - - * fhandler_process.cc (format_process_maps): Get destbuf argument by - reference. Allow resizing of destbuf as necessary. Fix string - handling. - -2005-01-31 Corinna Vinschen - - * cygheap.h (class cygheap_fdenum): New class to enumerate used - fhandlers. - * dtable.h (class dtable): Add cygheap_fdenum as friend class. - * fhandler.h (fhandler_base::get_proc_fd_name): New virtual method - to return a name for /proc//fd. - (fhandler_socket::get_proc_fd_name): Ditto. - (fhandler_pipe::get_proc_fd_name): Ditto. - (fhandler_virtual::opendir): Make virtual method. - (fhandler_process::opendir): New method. - * fhandler.cc (fhandler_base::get_proc_fd_name): New method. - * fhandler_process.cc: Include ctype.h. - (PROCESS_FD): Define. - (process_listing): Add "fd". - (fhandler_process::exists): Fix comment. Return 1 in case of "fd" - directory. Handle files below "fd". - (fhandler_process::fstat): Drop "self" handling. Set correct link - count for directories. - (fhandler_process::opendir): New method to handle "fd" directory. - (fhandler_process::readdir): Add "fd" handling. - (fhandler_process::open): Drop "self" handling. - (fhandler_process::fill_filebuf): Ditto. Add "fd" handling. Fix - "maps" output string. - * fhandler_registry.cc (fhandler_registry::fstat): Set correct link - count for directories. - * fhandler_socket.cc (fhandler_socket::get_proc_fd_name): New method. - * path.cc (symlink_info::set): Fix thinko. - * pinfo.cc (_pinfo::commune_recv): Rename pathbuf to path throughout. - Drop local path variable in PICOM_FIFO case. Fix debug output. - Close handles as early as possible. Add PICOM_FDS and PICOM_FD - handling. - (_pinfo::commune_send): Add PICOM_FDS and PICOM_FD handling. - (_pinfo::fd): New method. - (_pinfo::fds): New method. - * pinfo.h (enum picom): Add PICOM_FDS and PICOM_FD. - (_pinfo::fd): Declare. - (_pinfo::fds): Declare. - * pipe.cc (fhandler_pipe::get_proc_fd_name): New method. - -2005-01-29 Corinna Vinschen - - * smallprint.c (rn): Change uval to unsigned long long to fix 64 bit - handling. - * fhandler_process.cc (format_process_maps): Print major, minor and - inode numbers correctly. - -2005-01-29 Corinna Vinschen - - * autoload.cc (GetModuleFileNameExA): Add. - (GetModuleInformation): Add. - (QueryWorkingSet): Add. - * fhandler.h (fhandler_virtual::get_filebuf): New method. - * fhandler_proc.cc (PROC_SELF): Define. - (proc_fhandlers): Change type of self to FH_PROC. - (fhandler_proc::exists): Return -3 if self. - (fhandler_proc::fstat): Handle self as symlink. - (fhandler_proc::fill_filebuf): Handle self. - * fhandler_process.cc: Include psapi.h. - (PROCESS_EXENAME): Remove. - (PROCESS_MAPS): Define. - (PROCESS_ROOT): Define. - (PROCESS_EXE): Define. - (PROCESS_CWD): Define. - (process_listing): Remove "exename", add "maps, "root", "exe" and - "cwd" elements. - (fhandler_process::exists): Return -2 for symlinks. - (fhandler_process::fstat): Handle symlinks. - (fill_filebuf): Evaluate pid if pid is 0. Use exename handling for - exe. Handle maps, root and cwd. - (format_process_maps): New function evaluating "maps". - * path.cc (symlink_info::set): New method to fill symlink_info - with data matching virtual symlinks. - (path_conv::check): Handle virtual symlinks. - * pinfo.cc (_pinfo::commune_recv): Add PICOM_CWD and PICOM_ROOT - handling. - (_pinfo::commune_send): Ditto. - (_pinfo::root): New function. - (_pinfo::cwd): New function. - * pinfo.h (enum picom): Add PICOM_CWD and PICOM_ROOT. - (_pinfo::root): Declare. - (_pinfo::cwd): Declare. - -2005-01-29 Christopher Faylor - - * cygthread.cc (new): Add a little more debugging. - * thread.cc (pthread_null::exit): Add a _my_tls.remove() for safety. - -2005-01-28 Christopher Faylor - - * cygtls.cc (cygtls::call2): Move socket cleanup. - (cygtls::remove): Move socket cleanup here. Don't use _my_tls to - reference it. - -2005-01-26 Christopher Faylor - - * pinfo.cc (pinfo::init): Avoid a compiler warning. - -2005-01-25 Corinna Vinschen - - * syscalls.cc (setpriority): Implement PRIO_PGRP, PRIO_USER and - setting priority in other Cygwin processes. - (getpriority): Implement PRIO_PGRP, PRIO_USER and getting nice value - from other processes. - -2005-01-26 Pierre Humblet - - * path.cc (path_conv::check): Return ENOTDIR rather than ENOENT - when a component is not a directory. Remove unreachable code. - (digits): Delete. - -2005-01-25 Christopher Faylor - - * pinfo.h (pinfo::init): Make third parameter non-optional and - propagate change throughout. - * pinfo.cc (set_myself): Pass INVALID_HANDLE_POINTER if h is NULL. - (pinfo::init): Make third parameter non-optional. Eliminate use of - PID_EXECED as an argument. Put setting of handle back inside loop but - reorganize to try to open it only when necessary. - -2005-01-25 Corinna Vinschen - - * cygwin.din: Export getpriority and setpriority. - * fork.cc (fork_parent): Copy parent's nice value into child. - * spawn.cc (spawn_guts): Ditto. - * miscfuncs.cc (winprio_to_nice): New function. - (nice_to_winprio): Ditto. - * pinfo.cc (pinfo_init): If parent is not a Cygwin process, set - default nice value according to current Win32 priority class. - * pinfo.h (class _pinfo): Add nice member. - * syscalls.cc (setpriority): New function, only implementing - PRIO_PROCESS for now. - (getpriority): Ditto. - (nice): Just call setpriority. - * wincap.h (wincaps::has_extended_priority_class): New element. - * wincap.cc: Implement above element throughout. - * winsup.h: Add prototypes for winprio_to_nice and nice_to_winprio. - * include/limits.h (NZERO): New define. - * include/cygwin/types.h (id_t): New datatype. - * include/cygwin/version.h: Bump API minor version. - * include/sys/resource.h: Add PRIO_XXX defines and prototypes for - getpriority and setpriority. - -2005-01-25 Corinna Vinschen - - * path.cc (realpath): Allow to expand with .exe suffix. - -2005-01-22 Christopher Faylor - - * spawn.cc (spawn_guts): Perform same "cd" as in pinfo::exit below to - make sure that a stub process does not keep the current working - directory busy after the "execed" process has exited. - -2005-01-22 Christopher Faylor - - * pinfo.cc (pinfo::init): Move everything but the MapViewOfFileEx out - of the loop since trying multiple times to call CreateFileMapping - doesn't make much sense. Try to structure the loop a little better so - that exiting with a break does the right thing. - (pinfo::release): Release shared memory area if it exists and close - handle if it exists. - -2005-01-22 Christopher Faylor - - * pinfo.cc (pinfo::maybe_set_exit_code_from_windows): Make sure that - process has exited before getting an error code. - (pinfo::exit): "cd" to innocuous location before exiting to make sure - that process does not keep the current working directory busy while it - is in the process of really exiting. - -2005-01-18 Corinna Vinschen - - * autoload.cc (CoInitialize): Remove. - (CoUninitialize): Remove. - (CoCreateInstance): Remove. - (CoTaskMemFree): Add. - (SHGetDesktopFolder): Add. - * path.cc (shortcut_header): Remove. - (shortcut_initalized): Remove. - (GUID_shortcut): New static GUID. - (struct win_shortcut_hdr): New struct describing Windows shortcut - header structure. - (symlink_worker): Rewrite creating Windows shortcuts. Create - ITEMIDLIST if target exists. Only write once. - (cmp_shortcut_header): Use win_shortcut_hdr structure for comparison. - (check_shortcut): Rewrite to read only once from file. Allow skipping - an ITIMIDLIST in the file. - -2005-01-16 Christopher Faylor - - * pinfo.h (maybe_set_exit_code_from_windows): Renamed from - set_exit_state. - * pinfo.cc (pinfo::exit): Use renamed function. - (proc_waiter): Ditto. Make a copy of input argument to avoid problems - when procs array is shuffled. Flag when copy is made so that - remove_proc knows when it is safe to reshuffle. - * sigproc.cc (proc_terminate): Don't flag process_state as PID_EXITED. - (remove_proc): Wait for waiter to finish copying pinfo element before - moving it (an actual wait should be an extremely rare event). - -2005-01-15 Christopher Faylor - - * init.cc (dll_entry): Remove unused extern. - - * include/sys/cygwin.h: Remove PID_ZOMBIE. - * pinfo.h: Rename EXITCODE_* defines. - (pinfo::set_exit_state): Remove parameter. - * pinfo.cc (set_exit_state): Remove parameter. Reverse sense of test - so that exitcode is checked for having been set rather than not having - been set. Set flag when exitcode has been established. Don't set - PID_STATE here. - (pinfo::init): Remove exitcode initialization. - (pinfo::exit): Reflect change in EXITCODE_* naming. Set flag when - exitcode has been established. Reflect change in arguments to - set_process_state. - (proc_waiter): Reflect change in arguments to set_process_state. Set - process_state here and only here. - * fhandler_process.cc (fhandler_process::fill_filebuf): Reflect removal - of PID_ZOMBIE define. - (format_process_stat): Ditto. - (format_process_status): Ditto. - * sigproc.cc (pid_exists): Ditto. - (stopped_or_terminated): Ditto. Make sure that only low-order 16 bits of - exitcode are used. - * spawn.cc (spawn_guts): Reflect change in EXITCODE_* naming. - -2005-01-15 Christopher Faylor - - * sigproc.cc (sig_send): Don't complain if attempt to send signal to - myself fails after I've "execed". - -2005-01-14 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_disk_file::facl): Pretend successful - SETACL if no acls are available. - * fhandler.cc (fhandler_base::facl): Implement to return sensible - values on GETACL and GETACLCNT. Pretend successful SETACL. - * fhandler_virtual.cc (fhandler_virtual::facl): Ditto. - -2005-01-13 Corinna Vinschen - - * fhandler.h (fhandler_disk_file::touch_ctime): Declare. - * fhandler_disk_file.cc (fhandler_disk_file::touch_ctime): New method - to set file's ctime. - (fhandler_disk_file::fchmod): Try opening file for writing first. - Set file's ctime on success. - (fhandler_disk_file::fchown): Ditto. - (fhandler_disk_file::facl): Ditto. - -2005-01-13 Corinna Vinschen - - * pinfo.cc (pinfo::exit): Don't access self after releasing it. - * path.h (path_conv::path_conv): Fill path with native device - name in case of device argument. - -2005-01-13 Corinna Vinschen - - * fhandler_serial.cc (fhandler_serial::dup): Call overlapped_setup - for child, not for parent. - -2005-01-13 Christopher Faylor - - * init.cc (dll_entry): Nuke attempt to set exit code since parent will - use windows exit code if needed. - * pinfo.cc (pinfo::exit): Move release() here to minimize pid creation - race (suggested by Pierre Humblet). - -2005-01-12 Christopher Faylor - - Reorganize header file inclusion throughout so that cygerrno.h comes - first. - * fhandler.h (select_record::thread_errno): Save any encountered errno - here. - (select_record::set_select_errno): New function. - (select_record::saw_error): New function. - (select_record::select_record): Initialize thread_errno to zero. - * select.cc (set_handle_or_return_if_not_open): Set thread_errno on - failure. - (select_stuff::wait): Record errno for later resurrection in calling - thread. - (peek_serial): Ditto. - -2005-01-12 Christopher Faylor - - * syscalls.cc (system): Use "/bin/sh" as per linux and (sorta) SUSv3. - -2005-01-12 Christopher Faylor - - * pinfo.cc (pinfo::exit): Don't assume that this == myself. - -2005-01-11 Christopher Faylor - - * pinfo.cc (pinfo::init): Don't close input handle on temporary (?) - failure. - -2005-01-11 Christopher Faylor - - * pinfo.h (_pinfo::set_exit_state): Declare new function. - (pinfo::exit): Move here from _pinfo::exit. - * sigproc.cc (child_info::sync): Use new function to set exitcode and - process_state. - * pinfo.cc (_pinfo::exit): Ditto. - (proc_waiter): Ditto. - (_pinfo::set_exit_state): Define new function. - (_pinfo::dup_proc_pipe): Close handle when there is no parent process - around to care about the exit value. - * dcrt0.cc (dll_crt0_0): Move subproc_ready synchronization later to - make sure that myself is still mapped in parent. - (do_exit): Reflect movement to pinfo::exit. - (__api_fatal): Ditto. - * exceptions.cc (signal_exit): Ditto. - * errno.cc (errmap): Map PROC_NOT_FOUND. - * init.cc (dll_entry): Release myself before exiting. - * sigproc.cc (proc_can_be_signalled): Set errno appropriately. - (sig_send): Ditto. Also remove ill-advised test for !myself->sendsig - since this is an indication of a process which is still initializating - -- it is not an error. - (child_info::sync): Don't set exitcode here. Assume that will happen - in proc_waiter, if necessary. - * spawn.cc (spawn_guts): Delay "wait_for_myself" logic until later. - Don't wait at all if the process has already exited. Reflect movement - to pinfo::exit. - -2005-01-11 Corinna Vinschen - - * environ.cc (build_env): Disallow empty strings and strings starting - with '=' in Win32 environment. - -2005-01-08 Pierre Humblet - - * syscalls.cc (seteuid32): Only change the default dacl when - seteuid succeeds. Do not close HKCU. - -2005-01-06 Corinna Vinschen - - * fhandler_process.cc: Use strcasematch instead of strcasecmp - throughout. - -2005-01-06 Corinna Vinschen - - * syscalls.cc (rename): Fix behaviour in case of renaming directories - according to SUSv3. - -2005-01-06 Corinna Vinschen - - * fhandler_disk_file.cc (fhandler_base::open_fs): Don't allow - opening directories for writing. - -2005-01-06 Christopher Faylor - - * timer.cc (timer_thread): Pass sigev pointer value as per SuSv3 rather - than pointer to sigev. - -2005-01-05 Christopher Faylor - - * dcrt0.cc (multiple_cygwin_problem): Reorganize error message to not - always talk about a "version" when it's not a version. - (dll_crt0_0): Change info passed to multiple_cygwin_problem to be a - little more precise. - * shared.cc (user_shared_initialize): Ditto. - (shared_info::initialize): Ditto. - -2005-01-03 Christopher Faylor - - * pinfo.cc (_pinfo::dup_proc_pipe): Can't close proc pipe when execing - or we will suffer an exit code race. - -2005-01-03 Corinna Vinschen - - * signal.cc (abort): Call _GLOBAL_REENT's __cleanup. - -2005-01-03 Corinna Vinschen - - * syscalls.cc (setmode): Call _fwalk with _GLOBAL_REENT. - -2005-01-01 Christopher Faylor - - * cygthread.cc (cygthread::stub): Set inuse to false when exiting. - (cygthread::cygthread): Actually pass name as argument to debugging - output to avoid SEGV when strace'ing. - (cygthread::release): Don't set stack_ptr to NULL, since it is only set - once on first entry to a stub not on each stub iteration. - (cygthead::exit_thread): Remove obsolete function. - * cygthread.h (cygthread::exit_thread): Ditto. - -2005-01-01 Christopher Faylor - - * shared.cc (open_shared): Don't attempt VirtualAlloc magic if first - attempt to map memory fails. diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in deleted file mode 100644 index 665257c63..000000000 --- a/winsup/cygwin/Makefile.in +++ /dev/null @@ -1,472 +0,0 @@ -# Makefile.in for Cygwin. -# Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. -# -# This file is part of Cygwin. -# -# This software is a copyrighted work licensed under the terms of the -# Cygwin license. Please consult the file "CYGWIN_LICENSE" for -# details. - -# This makefile requires GNU make. - -SHELL:=@SHELL@ -srcdir:=@srcdir@ -objdir:=. - -CONFIG_DIR:=$(srcdir)/config/@CONFIG_DIR@ -VPATH:=$(srcdir):$(CONFIG_DIR):$(srcdir)/regex:$(srcdir)/regexp:$(srcdir)/lib:$(srcdir)/libc - -target_alias:=@target_alias@ -build_alias:=@build_alias@ -host_alias:=@host_alias@ -prefix:=@prefix@ - -program_transform_name:=@program_transform_name@ -exec_prefix:=@exec_prefix@ -bindir:=@bindir@ -libdir:=@libdir@ -mandir:=@mandir@ -ifeq ($(target_alias),$(host_alias)) -ifeq ($(build_alias),$(host_alias)) -tooldir:=$(exec_prefix) -else -tooldir:=$(exec_prefix)/$(target_alias) -endif -else -tooldir:=$(exec_prefix)/$(target_alias) -endif -datadir:=@datadir@ -infodir:=@infodir@ -includedir:=@includedir@ - -override INSTALL:=@INSTALL@ -override INSTALL_PROGRAM:=@INSTALL_PROGRAM@ -override INSTALL_DATA:=@INSTALL_DATA@ - -# -# --enable options from configure -# -MT_SAFE:=@MT_SAFE@ -DEFS:=@DEFS@ -CCEXTRA:= -CC:=@CC@ -# FIXME: Which is it, CC or CC_FOR_TARGET? -CC_FOR_TARGET:=$(CC) -CFLAGS=@CFLAGS@ -override CFLAGS+=-MMD ${$(*F)_CFLAGS} -fmerge-constants -ftracer $(CCEXTRA) -CXX=@CXX@ -override CXXFLAGS=@CXXFLAGS@ - -AR:=@AR@ -AR_FLAGS:=qv -RANLIB:=@RANLIB@ -LD:=@LD@ -DLLTOOL:=@DLLTOOL@ -WINDRES:=@WINDRES@ -AS:=@AS@ -NM:=@NM@ -OBJCOPY:=@OBJCOPY@ -OBJDUMP:=@OBJDUMP@ -STRIP:=@STRIP@ -LDSCRIPT:=cygwin.sc -MKDIRP:=$(INSTALL) -m 755 -d - -# -# Include common definitions for winsup directory -# -include $(srcdir)/../Makefile.common - -@SET_MAKE@ - -# Setup the testing framework, if you have one -EXPECT = `if [ -f $${rootme}/../../expect/expect$(EXEEXT) ] ; then \ - echo $${rootme}/../../expect/expect$(EXEEXT) ; \ - else echo expect ; fi` - -RUNTEST = `if [ -f $${srcdir}/../dejagnu/runtest ] ; then \ - echo $${srcdir}/../dejagnu/runtest ; \ - else echo runtest; fi` -RUNTESTFLAGS = - -# Parameters used in building the cygwin.dll. -# We build as cygwin0.dll and rename at install time to overcome -# native rebuilding issues (we don't want the build tools to see a partially -# built cygwin.dll and attempt to use it instead of the old one). - -DLL_NAME:=cygwin1.dll -TEST_DLL_NAME:=cygwin0.dll -TEST_LIB_NAME:=libcygwin0.a -DEF_FILE:=cygwin.def -DLL_ENTRY:=@DLL_ENTRY@ - -LIBGMON_A:=libgmon.a -CYGWIN_START:=crt0.o -GMON_START:=gcrt0.o - -# Some things want these from libc, but they have their own static -# data which apps can get to, which is a pain in the dll, so we -# include them directly into the library. - -LIBCOS:=${sort ${addsuffix .o,${basename ${notdir ${wildcard $(srcdir)/lib/*.c}}}} \ - ${addsuffix .o,${basename ${notdir ${wildcard $(srcdir)/lib/*.cc}}}}} - -# Build all source files in the config directory - -EXTRA_DLL_OFILES:=${addsuffix .o,${basename ${notdir ${wildcard $(CONFIG_DIR)/*.c}}}} - -EXTRA_OFILES=$(bupdir1)/libiberty/random.o - -MALLOC_OFILES=@MALLOC_OFILES@ - -DLL_IMPORTS:=$(w32api_lib)/libkernel32.a $(w32api_lib)/libadvapi32.a - -MT_SAFE_OBJECTS:= -# Please maintain this list in sorted order, with maximum files per 86 col line -# -DLL_OFILES:=assert.o autoload.o bsdlib.o ctype.o cxx.o cygheap.o cygthread.o \ - cygtls.o dcrt0.o debug.o delqueue.o devices.o dir.o dlfcn.o dll_init.o \ - dtable.o environ.o errno.o exceptions.o exec.o external.o fcntl.o \ - fhandler.o fhandler_clipboard.o fhandler_console.o fhandler_disk_file.o \ - fhandler_dsp.o fhandler_fifo.o fhandler_floppy.o fhandler_mailslot.o \ - fhandler_mem.o fhandler_netdrive.o fhandler_nodevice.o fhandler_proc.o \ - fhandler_process.o fhandler_random.o fhandler_raw.o fhandler_registry.o \ - fhandler_serial.o fhandler_socket.o fhandler_tape.o fhandler_termios.o \ - fhandler_tty.o fhandler_virtual.o fhandler_windows.o fhandler_zero.o \ - flock.o fnmatch.o fork.o fts.o ftw.o getopt.o glob.o grp.o heap.o \ - hookapi.o init.o ioctl.o ipc.o iruserok.o localtime.o lsearch.o \ - malloc_wrapper.o memmem.o miscfuncs.o mktemp.o mmap.o msg.o net.o netdb.o \ - nftw.o ntea.o passwd.o path.o pinfo.o pipe.o poll.o pthread.o regcomp.o \ - regerror.o regexec.o regfree.o registry.o resource.o scandir.o sched.o \ - sec_acl.o sec_helper.o security.o select.o sem.o shared.o shm.o \ - sigfe.o signal.o sigproc.o smallprint.o spawn.o strace.o strptime.o \ - strsep.o strsig.o sync.o syscalls.o sysconf.o syslog.o termios.o thread.o \ - timelocal.o timer.o times.o tty.o uinfo.o uname.o v8_regexp.o \ - v8_regerror.o v8_regsub.o wait.o wincap.o window.o \ - $(EXTRA_DLL_OFILES) $(EXTRA_OFILES) $(MALLOC_OFILES) $(MT_SAFE_OBJECTS) - -GMON_OFILES:=gmon.o mcount.o profil.o - -OBSOLETE_FUNCTIONS:=regcomp regerror regexec regfree regsub \ - open acl aclcheck aclfrommode aclfrompbits \ - aclfromtext aclsort acltomode acltopbits \ - acltotext chown facl fchown fcntl fdopen fgetpos fopen \ - freopen fseeko fsetpos fstat ftello ftruncate \ - getegid geteuid getgid getgrent getgrgid getgrnam \ - getgroups getpwuid getpwuid_r getuid initgroups \ - lchown lseek lstat mknod mmap seekdir setegid seteuid \ - setgid setgroups setregid setreuid setuid stat \ - telldir tmpfile truncate - -NEW_FUNCTIONS:=regcomp posix_regcomp \ - regerror posix_regerror \ - regexec posix_regexec \ - regfree posix_regfree \ - open _open64 \ - acl _acl32 \ - aclcheck _aclcheck32 \ - aclfrommode _aclfrommode32 \ - aclfrompbits _aclfrompbits32 \ - aclfromtext _aclfromtext32 \ - aclsort _aclsort32 \ - acltomode _acltomode32 \ - acltopbits _acltopbits32 \ - acltotext _acltotext32 \ - chown _chown32 \ - facl _facl32 \ - fchown _fchown32 \ - fcntl _fcntl64 \ - fdopen _fdopen64 \ - fgetpos _fgetpos64 \ - fopen _fopen64 \ - freopen _freopen64 \ - fseeko _fseeko64 \ - fsetpos _fsetpos64 \ - fstat _fstat64 \ - ftello _ftello64 \ - ftruncate _ftruncate64 \ - getegid _getegid32 \ - geteuid _geteuid32 \ - getgid _getgid32 \ - getgrent _getgrent32 \ - getgrgid _getgrgid32 \ - getgrnam _getgrnam32 \ - getgroups _getgroups32 \ - getpwuid _getpwuid32 \ - getpwuid_r _getpwuid_r32 \ - getuid _getuid32 \ - initgroups _initgroups32 \ - lchown _lchown32 \ - lseek _lseek64 \ - lstat _lstat64 \ - mknod _mknod32 \ - mmap _mmap64 \ - seekdir _seekdir64 \ - setegid _setegid32 \ - seteuid _seteuid32 \ - setgid _setgid32 \ - setgroups _setgroups32 \ - setregid _setregid32 \ - setreuid _setreuid32 \ - setuid _setuid32 \ - stat _stat64 \ - telldir _telldir64 \ - tmpfile _tmpfile64 \ - truncate _truncate64 - -API_VER:=$(srcdir)/include/cygwin/version.h - -PWD:=${shell pwd} -LIB_NAME:=$(PWD)/libcygwin.a -LIBSERVER:=@LIBSERVER@ -SUBLIBS:=$(PWD)/libpthread.a $(PWD)/libutil.a $(PWD)/libm.a $(PWD)/libc.a -EXTRALIBS:=libautomode.a libbinmode.a libtextmode.a libtextreadmode.a -INSTOBJS:=automode.o binmode.o textmode.o textreadmode.o -TARGET_LIBS:=$(LIB_NAME) $(CYGWIN_START) $(GMON_START) $(LIBGMON_A) $(SUBLIBS) $(INSTOBJS) $(EXTRALIBS) - -ifneq "${filter -O%,$(CFLAGS)}" "" -cygheap_CFLAGS:=-fomit-frame-pointer -cygthread_CFLAGS:=-fomit-frame-pointer -cygtls_CFLAGS:=-fomit-frame-pointer -delqueue_CFLAGS:=-fomit-frame-pointer -devices_CFLAGS:=-fomit-frame-pointer -Os -dir_CFLAGS:=-fomit-frame-pointer -dlfcn_CFLAGS:=-fomit-frame-pointer -dll_init_CFLAGS:=-fomit-frame-pointer -dtable_CFLAGS:=-fomit-frame-pointer -fcheck-new -fcntl_CFLAGS:=-fomit-frame-pointer -fhandler_CFLAGS:=-fomit-frame-pointer -fhandler_clipboard_CFLAGS:=-fomit-frame-pointer -fhandler_console_CFLAGS:=-fomit-frame-pointer -fhandler_disk_file_CFLAGS:=-fomit-frame-pointer -fhandler_dsp_CFLAGS:=-fomit-frame-pointer -fhandler_floppy_CFLAGS:=-fomit-frame-pointer -fhandler_mem_CFLAGS:=-fomit-frame-pointer -fhandler_netdrive_CFLAGS:=-fomit-frame-pointer -fhandler_proc_CFLAGS:=-fomit-frame-pointer -fhandler_process_CFLAGS:=-fomit-frame-pointer -fhandler_random_CFLAGS:=-fomit-frame-pointer -fhandler_raw_CFLAGS:=-fomit-frame-pointer -fhandler_registry_CFLAGS:=-fomit-frame-pointer -fhandler_serial_CFLAGS:=-fomit-frame-pointer -fhandler_socket_CFLAGS:=-fomit-frame-pointer -fhandler_syslog_CFLAGS:=-fomit-frame-pointer -fhandler_tape_CFLAGS:=-fomit-frame-pointer -fhandler_termios_CFLAGS:=-fomit-frame-pointer -fhandler_tty_CFLAGS:=-fomit-frame-pointer -fhandler_virtual_CFLAGS:=-fomit-frame-pointer -fhandler_windows_CFLAGS:=-fomit-frame-pointer -fhandler_zero_CFLAGS:=-fomit-frame-pointer -flock_CFLAGS:=-fomit-frame-pointer -grp_CFLAGS:=-fomit-frame-pointer -malloc_CFLAGS:=-fomit-frame-pointer -malloc_wrapper_CFLAGS:=-fomit-frame-pointer -miscfuncs_CFLAGS:=-fomit-frame-pointer -net_CFLAGS:=-fomit-frame-pointer -passwd_CFLAGS:=-fomit-frame-pointer -regcomp_CFLAGS=-fomit-frame-pointer -regerror_CFLAGS=-fomit-frame-pointer -regexec_CFLAGS=-fomit-frame-pointer -regfree_CFLAGS=-fomit-frame-pointer -shared_CFLAGS:=-fomit-frame-pointer -sync_CFLAGS:=-fomit-frame-pointer -O3 -smallprint_CFLAGS:=-fomit-frame-pointer -syscalls_CFLAGS:=-fomit-frame-pointer -sysconf_CFLAGS:=-fomit-frame-pointer -uinfo_CFLAGS:=-fomit-frame-pointer -endif - -.PHONY: all force dll_ofiles install all_target install_target all_host install_host \ - install install-libs install-headers - -.SUFFIXES: -.SUFFIXES: .c .cc .def .a .o .d .s - -all_host=@all_host@ -install_host=@install_host@ - -all: all_target $(all_host) - -all_target: $(TARGET_LIBS) - -all_host: $(TEST_LIB_NAME) - -force: - -install: install-libs install-headers install-man install_target \ - $(install_host) $(install_target) - -uninstall: uninstall-libs uninstall-headers uninstall-man - -install-libs: $(TARGET_LIBS) - @$(MKDIRP) $(bindir) - $(INSTALL_PROGRAM) $(TEST_DLL_NAME) $(bindir)/$(DLL_NAME); \ - for i in $^; do \ - $(INSTALL_DATA) $$i $(tooldir)/lib/`basename $$i` ; \ - done - -install-headers: - cd $(srcdir); \ - for sub in `find include -name '[a-z]*' -type d -print | sort`; do \ - $(MKDIRP) $(tooldir)/$$sub; \ - for i in $$sub/*.h ; do \ - $(INSTALL_DATA) $$i $(tooldir)/$$sub/`basename $$i` ; \ - done ; \ - done ; \ - $(INSTALL_DATA) regex/regex.h $(tooldir)/include/regex.h - -install-man: - @$(MKDIRP) $(mandir)/man2 $(mandir)/man3 $(mandir)/man5 $(mandir)/man7 - cd $(srcdir); \ - for i in `find . -type f -name '*.2'`; do \ - $(INSTALL_DATA) $$i $(mandir)/man2/`basename $$i` ; \ - done; \ - for i in `find . -type f -name '*.3'`; do \ - $(INSTALL_DATA) $$i $(mandir)/man3/`basename $$i` ; \ - done; \ - for i in `find . -type f -name '*.5'`; do \ - $(INSTALL_DATA) $$i $(mandir)/man5/`basename $$i` ; \ - done; \ - for i in `find . -type f -name '*.7'`; do \ - $(INSTALL_DATA) $$i $(mandir)/man7/`basename $$i` ; \ - done - -install_target: - -install_host: - -uninstall-libs: $(TARGET_LIBS) - rm -f $(bindir)/$(DLL_NAME); \ - for i in $^; do \ - rm -f $(tooldir)/lib/$$i ; \ - done - -uninstall-headers: - cd $(srcdir); \ - for sub in `find include -name '[a-z]*' -type d -print | sort`; do \ - for i in $$sub/*.h ; do \ - rm -f $(tooldir)/$$sub/`basename $$i` ; \ - done ; \ - done ; \ - rm -f $(tooldir)/include/regex.h - -uninstall-man: - cd $(srcdir); \ - for i in `find . -type f -name '*.2'`; do \ - rm -f $(tooldir)/man/man2/`basename $$i` ; \ - done; \ - for i in `find . -type f -name '*.3'`; do \ - rm -f $(tooldir)/man/man3/`basename $$i` ; \ - done; \ - for i in `find . -type f -name '*.5'`; do \ - rm -f $(tooldir)/man/man5/`basename $$i` ; \ - done; \ - for i in `find . -type f -name '*.7'`; do \ - rm -f $(tooldir)/man/man7/`basename $$i` ; \ - done - -clean: - -rm -f *.o *.dll *.a *.exp junk *.base version.cc regexp/*.o winver_stamp *.exe *.d *stamp* *_magic.h sigfe.s cygwin.def - -@$(MAKE) -C $(bupdir)/cygserver libclean - -maintainer-clean realclean: clean - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -rm -fr configure - - -# Rule to build cygwin.dll -$(TEST_DLL_NAME): $(LDSCRIPT) dllfixdbg $(DLL_OFILES) $(DLL_IMPORTS) $(LIBSERVER) $(LIBC) $(LIBM) $(API_VER) Makefile winver_stamp - $(CXX) $(CXXFLAGS) -Wl,--gc-sections $(nostdlib) -Wl,-T$(firstword $^) \ - -Wl,--heap=0 -Wl,--out-implib,cygdll.a -shared -o $@ \ - -e $(DLL_ENTRY) $(DEF_FILE) $(DLL_OFILES) version.o winver.o \ - $(MALLOC_OBJ) $(LIBSERVER) $(LIBM) $(LIBC) \ - -lgcc $(DLL_IMPORTS) - @$(word 2,$^) $(OBJDUMP) $(OBJCOPY) $@ ${patsubst %0.dll,%1.dbg,$@} - @ln -f $@ new-$(DLL_NAME) - -# Rule to build libcygwin.a -$(LIB_NAME): rmsym newsym $(TEST_DLL_NAME) $(LIBCOS) - /bin/sh ${word 1,$^} ./cygdll.a "$(NM)" "$(AR)" $(OBSOLETE_FUNCTIONS) || exit 0 - /bin/sh ${word 2,$^} ./cygdll.a "$(AS)" "$(AR)" $(NEW_FUNCTIONS) || exit 0 - (echo create $(LIB_NAME); echo addmod $(LIBCOS); echo addlib cygdll.a; echo save) | $(AR) -M - $(RANLIB) $@ - -# Rule to make stub library used by testsuite -# dependency set to $(LIB_NAME) to accommodate make -j2. -# Otherwise dlltool gets confused. cgf (11-16-2000) -$(TEST_LIB_NAME): $(LIB_NAME) - perl -p -e 'BEGIN{binmode(STDIN); binmode(STDOUT);}; s/cygwin1/cygwin0/g' < $? > $@ - -$(LIBSERVER): $(bupdir)/cygserver/Makefile - $(MAKE) -C $(bupdir)/cygserver libcygserver.a - -dll_ofiles: $(DLL_OFILES) - -$(LIBGMON_A): $(GMON_OFILES) $(GMON_START) - $(AR) rcv $(LIBGMON_A) $(GMON_OFILES) - -$(API_VER): $(srcdir)/cygwin.din - @echo Error: Version info is older than DLL API! - -version.cc winver.o: winver_stamp - @ : - -shared_info_magic.h: cygmagic shared_info.h - /bin/sh ${word 1,$^} $@ "$(CC) -x c" ${word 2,$^} USER_MAGIC 'class user_info' SHARED_MAGIC 'class shared_info' - -child_info_magic.h: cygmagic child_info.h - /bin/sh ${word 1,$^} $@ "$(CC) -x c" ${word 2,$^} CHILD_INFO_MAGIC 'class child_info' - -dcrt0.o sigproc.o: child_info_magic.h - -shared.o: shared_info_magic.h - -$(srcdir)/qevices.cc: cygwin-gperf devices.gperf devices.h - $^ > $@ - -$(srcdir)/devices.cc: gendevices devices.in devices.h - ${wordlist 1,2,$^} $@ - -$(PWD)/libpthread.a: speclib $(LIB_NAME) pthread.o thread.o - /bin/sh ${word 1, $^} $@ "${NM}" "$(AR)" ${wordlist 2, 99, $^} - -$(PWD)/libutil.a: speclib $(LIB_NAME) bsdlib.o - /bin/sh ${word 1, $^} $@ "${NM}" "$(AR)" ${wordlist 2, 99, $^} - -$(PWD)/libm.a: speclib $(LIB_NAME) $(LIBM) - /bin/sh ${word 1, $^} $@ "${NM}" "$(AR)" ${wordlist 2, 99, $^} - -$(PWD)/libc.a: speclib $(LIB_NAME) $(PWD)/libm.a libpthread.a libutil.a - /bin/sh ${word 1, $^} -v $@ "${NM}" "$(AR)" ${wordlist 2, 99, $^} - -lib%.a: %.o - $(AR) cru $@ $? - -winver_stamp: mkvers.sh include/cygwin/version.h winver.rc $(DLL_OFILES) - @echo "Making version.o and winver.o";\ - $(SHELL) ${word 1,$^} ${word 2,$^} ${word 3,$^} $(WINDRES) && \ - $(COMPILE_CXX) -o version.o version.cc && \ - touch $@ - -Makefile: cygwin.din - -$(DEF_FILE): gendef cygwin.din $(srcdir)/tlsoffsets.h - $^ $@ sigfe.s - -$(srcdir)/tlsoffsets.h: gentls_offsets cygtls.h - $^ $@ $(COMPILE_CXX) - -sigfe.s: $(DEF_FILE) - @[ -s $@ ] || \ - { rm -f $(DEF_FILE); $(MAKE) -s -j1 $(DEF_FILE); }; \ - [ -s $@ ] && touch $@ - -sigfe.o: sigfe.s - $(CC) -c -o $@ $? - -winsup.h: config.h - -deps:=${wildcard *.d} -ifneq (,$(deps)) -include $(deps) -endif diff --git a/winsup/cygwin/ROADMAP b/winsup/cygwin/ROADMAP deleted file mode 100644 index fd0387d59..000000000 --- a/winsup/cygwin/ROADMAP +++ /dev/null @@ -1,129 +0,0 @@ - - WINSUP ROADMAP - -The purpose of this document is to give the briefest overview of how -the various parts of cygwin work together and where everything can be -found. The intended audience is people developing the cygwin dll -itself. Comments to dj@cygnus.com. - -=== cygwin1.dll source files - -- overhead -.h winsup autoload debug external shared sync -.cc assert dcrt0 debug external init ntea registry security - shared smallprint strace sync -.din cygwin -.rc winver -.sgml external shared - -- processes -.h sigproc -.cc exec fork pinfo resource signal sigproc spawn wait - -- signals -.cc exceptions window - -- files and I/O -.h delqueue fhandler path select -.cc delqueue dir fhandler* dtable path pipe select tty -.sgml dtable path - -- common unix functions -.h dll_init tz_posixrules -.cc dlfcn dll_init environ errno fcntl flog grp ioctl localtime - malloc passwd scandir strsep syscalls sysconf syslog termios -.c longjmp setjmp -.sgml dll_init - -- unix emulation -.cc heap mmap net times unifo uname - - ---- if MT_SAFE -.h thread -.cc pthread thread - ---- from other places -regex/* -../libiberty/{random,strsignal} -../newlib/* (libc) - -=== libcygwin.a source files - -libccrt0.cc -libcmain.cc -dll_entry.cc -dll_main.cc -getopt.c - -=== gmon (profiling, -pg) - -gcrt0.c -gmon.c gmon.h -mcount.c -profil.c profil.h - -=== entry points - -- normal cygwin program - -newlib/libc/sys/cygwin/crt0.c has mainCRTStartup() and calls cygwin_crt0() - -libccrt0.cc has cygwin_crt0() and calls dll_crt0() - -dcrt0.cc - has dll_crt0() - -Note: dll_init.cc has nothing to do with initializing the cygwin dll. -It initializes the dlls you have dl_open'd. - -- cygwin-built dll - -dll_entry.cc - has a macro for wrapping your dll startup function - (equivalent of DllMain()) in such a way that you get your - cygwin environment set up automatically when your dll is - loaded. - -dll_main.cc - has empty DllMain() in case you don't have your own - -- manually loading cygwin1.dll - -init.cc - has dll_entry() which is called by the OS when the dll is - loaded. It doesn't do much except note if you linked - cygwin1.dll or are manually loading it. - -=== About "fhandlers" - -An fhandler is a file type handler. This is where the unix device -emulation happens. - -dtable.cc maps posix file descriptors to a table of file handlers (type -fhandler) in the dll. It's mostly concerned with managing the table -of descriptors (open, dup, fork, select). Most of the posix I/O -system calls (syscalls.cc) use the fdtab table to call the right -fhandler directly. - -fhandler.cc is the base class; specific types are derived as -appropriate (see fhandler.h). dtable.cc is in charge of selecting and -creating a suitable fhandler when you open a file. path.cc handles -emulated files in /dev (like /dev/null) by returning an FH_* value -from get_device_number (which dtable.cc calls in dtable::build_fhandler). - -Note: if you're looking for read() and write(), they call _read() and -_write() in syscalls.cc. The non-underscored ones are in -newlib/libc/syscalls and just call the underscored ones. - -=== How "fork" works - -It all starts in fork() in fork.cc. - -Set up a pid in the shared memory area for the new child. Use -setjmp() to capture state. First time (parent), set up some stuff and -use CreateProcess to run a second copy of the same executable. The -second copy will note in the shared memory area that it's a fork, and -do the longjmp. They sync up and the parent copies all it's program -memory to the child's address space. There's also code to reload -dlls, map shared memory and mmap'd files, etc. - -Handling the special startup for the child is done in dcrt0.cc in many -places. This case is triggered by a special StartupInfo structure -that's passed from the parent to the child in CreateProcessA. diff --git a/winsup/cygwin/acconfig.h b/winsup/cygwin/acconfig.h deleted file mode 100644 index 53ac1fc74..000000000 --- a/winsup/cygwin/acconfig.h +++ /dev/null @@ -1,14 +0,0 @@ -/* Define if DEBUGGING support is requested. */ -#undef DEBUGGING - -/* Define if GCC supports builtin memset. */ -#undef HAVE_BUILTIN_MEMSET - -/* Define if MALLOC_DEBUGGING support is requested. */ -#undef MALLOC_DEBUG - -/* Define if using new vfork functionality. */ -#undef NEWVFORK - -/* Define if using cygserver */ -#undef USE_SERVER diff --git a/winsup/cygwin/analyze_sigfe b/winsup/cygwin/analyze_sigfe deleted file mode 100755 index 0b9b7219f..000000000 --- a/winsup/cygwin/analyze_sigfe +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/perl -s -# Copyright 2006 Red Hat, Inc. -# -# This file is part of Cygwin. -# -# This software is a copyrighted work licensed under the terms of the -# Cygwin license. Please consult the file "CYGWIN_LICENSE" for -# details. - -# This will do a crude test to see if the (NO)?SIGFE stuff is used properly -# in cygwin.din. It is not perfect so do not use it to do a wholesale replacement. -# -# Input is the output of 'objdump --disassemble --demangle cygwin0.dll'. -# -use strict; -use vars qw'$v'; -sub star($); - -my %funcs; -my $func = ''; - -$| = 1; -while (<>) { - /^610.....\s+<([^\(>]+).*?:/o and do { - $func = $1; - $funcs{$func} = {} unless defined $funcs{$func}; - next; - }; - $func and /call\s+\S+\s+<([^\(>]+)/o and do { - my $called = $1; - $funcs{$func}{$called} = 1; - if ($called =~ /^[A-Z].*@/o || ($called = $funcs{$called}{-uses_kernel})) { - $funcs{$func}{-uses_kernel} ||= $called; - my @a = ($func); - while (my $f = shift @a) { - for my $k (keys %funcs) { - if ($funcs{$k}{$f} && !$funcs{$k}{-uses_kernel}) { - $funcs{$k}{-uses_kernel} = $called; - push(@a, $k); - } - } - } - } - next; - }; -} - -if ($v) { - for my $k (sort keys %funcs) { - print star($funcs{$k}), $k, $funcs{$k}{-uses_kernel} ? " ($funcs{$k}{-uses_kernel})\n" : "\n"; - my $indent = ' '; - for (sort keys %{$funcs{$k}}) { - next if /^-/o; - print $indent, $_, star($funcs{$k}); - $indent = ' '; - } - print "\n"; - } -} - -open(DIN, '<', 'cygwin.din') or die "$0: couldn't open cygwin.din - $!\n"; -while () { - my $line = $_; - /^LIBRARY\s+/o and next; - /^\s*$/ and next; - /^EXPORTS/o and next; - / DATA$/o and next; - my $sigfe = (/\s+((?:NO)?SIGFE)\s*$/o)[0] !~ /^NO/o; - s/\s+((?:NO)?SIGFE)\s*$//o; - my $func = (/\s+=\s+(\S+)/o)[0] || (/^\s*(\S+)/o)[0]; - if (!defined($funcs{$func})) { - warn "hmm. couldn't find $func in disassembled output\n"; - } elsif (!!$funcs{$func}{-uses_kernel} != $sigfe) { - warn "mismatch detected: $line"; - } -} - -sub star($) { - return $_[0]->{-uses_kernel} ? '*' : ''; -} diff --git a/winsup/cygwin/ansi.sgml b/winsup/cygwin/ansi.sgml deleted file mode 100644 index 4bce1d360..000000000 --- a/winsup/cygwin/ansi.sgml +++ /dev/null @@ -1,59 +0,0 @@ - -Compatibility with ANSI - -The following functions are compatible with ANSI: - -stdio - -clearerr, fclose, feof, ferror, fflush, fgetc, fgetpos, fgets, fopen, -fprintf, fputc, fputs, fread, freopen, fscanf, fseek, fsetpos, ftell, -fwrite, getc, getchar, gets, perror, printf, putc, putchar, puts, -remove, rename, rewind, scanf, setbuf, setvbuf, sprintf, sscanf, -tmpfile, tmpnam, vfprintf, ungetc, vprintf, vsprintf, - - -string - -memchr, memcmp, memcpy, memmove, memset, strcat, strchr, strcmp, -strcoll, strcpy, strcspn, strerror, strlen, strncat, strncmp, strncpy, -strpbrk, strrchr, strspn, strstr, strtok, strxfrm - - -stdlib - -abort, abs, assert, atexit, atof, atoi, atol, bsearch, calloc, div, -exit, free, getenv, labs, ldiv, longjmp, malloc, mblen, mbstowcs, -mbtowc, qsort, rand, realloc, setjmp, srand, strtod, strtol, strtoul, -system, wcstombs, wctomb - - -time - -asctime, gmtime, localtime, time, clock, ctime, difftime, mktime, -strftime - - -signals - -raise, signal - - -ctype - -isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint, -ispunct, isspace, isupper, isxdigit, tolower, toupper - - -math - -acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor, fmod, -frexp, ldexp, log, log10, modf, pow, sin, sinh, sqrt, tan, tanh - - -misc - -localeconv, setlocale, va_arg, va_end, va_start - - - - diff --git a/winsup/cygwin/assert.cc b/winsup/cygwin/assert.cc deleted file mode 100644 index 063c7b852..000000000 --- a/winsup/cygwin/assert.cc +++ /dev/null @@ -1,55 +0,0 @@ -/* assert.cc: Handle the assert macro for WIN32. - - Copyright 1997, 1998, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include "security.h" -#include -#include - -#include -#include -#include - -/* This function is called when the assert macro fails. This will - override the function of the same name in newlib. */ - -extern "C" void -__assert (const char *file, int line, const char *failedexpr) -{ - HANDLE h; - - /* If we don't have a console in a Windows program, then bring up a - message box for the assertion failure. */ - - h = CreateFile ("CONOUT$", GENERIC_WRITE, FILE_SHARE_WRITE, &sec_none_nih, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (h == INVALID_HANDLE_VALUE) - { - char *buf; - - buf = (char *) alloca (100 + strlen (failedexpr)); - __small_sprintf (buf, "Failed assertion\n\t%s\nat line %d of file %s", - failedexpr, line, file); - MessageBox (NULL, buf, NULL, MB_OK | MB_ICONERROR | MB_TASKMODAL); - } - else - { - CloseHandle (h); - small_printf ("assertion \"%s\" failed: file \"%s\", line %d\n", - failedexpr, file, line); - } - -#ifdef DEBUGGING - try_to_debug (); -#endif - abort (); // FIXME: Someday this should work. - - /* NOTREACHED */ -} diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc deleted file mode 100644 index c6ce11317..000000000 --- a/winsup/cygwin/autoload.cc +++ /dev/null @@ -1,569 +0,0 @@ -/* autoload.cc: all dynamic load stuff. - - Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#define USE_SYS_TYPES_FD_SET -#include - -/* Macro for defining "auto-load" functions. - * Note that this is self-modifying code *gasp*. - * The first invocation of a routine will trigger the loading of - * the DLL. This will then be followed by the discovery of - * the procedure's entry point, which is placed into the location - * pointed to by the stack pointer. This code then changes - * the "call" operand which invoked it to a "jmp" which will - * transfer directly to the DLL function on the next invocation. - * - * Subsequent calls to routines whose transfer address has not been - * determined will skip the "load the dll" step, starting at the - * "discovery of the entry point" step. - * - * So, immediately following the the call to one of the above routines - * we have: - * DLL info (4 bytes) Pointer to a block of information concerning - * the DLL (see below). - * DLL args (4 bytes) The number of arguments pushed on the stack by - * the call. If this is an odd value then this - * is a flag that non-existence of this function - * is not a fatal error - * func name (n bytes) asciz string containing the name of the function - * to be loaded. - * - * The DLL info block consists of the following - * load_state (4 bytes) Pointer to a word containing the routine used - * to eventually invoke the function. Initially - * points to an init function which loads the - * DLL, gets the process's load address, - * changes the contents here to point to the - * function address, and changes the call *(%eax) - * to a jmp func. If the initialization has been - * done, only the load part is done. - * DLL handle (4 bytes) The handle to use when loading the DLL. - * DLL locker (4 bytes) Word to use to avoid multi-thread access during - * initialization. - * extra init (4 bytes) Extra initialization function. - * DLL name (n bytes) asciz string containing the name of the DLL. - */ - -/* LoadDLLprime is used to prime the DLL info information, providing an - additional initialization routine to call prior to calling the first - function. */ -#define LoadDLLprime(dllname, init_also) __asm__ (" \n\ -.ifndef " #dllname "_primed \n\ - .section .data_cygwin_nocopy,\"w\" \n\ - .align 4 \n\ -."#dllname "_info: \n\ - .long _std_dll_init \n\ - .long 0 \n\ - .long -1 \n\ - .long " #init_also " \n\ - .asciz \"" #dllname "\" \n\ - .text \n\ - .set " #dllname "_primed, 1 \n\ -.endif \n\ -"); - -/* Create a "decorated" name */ -#define mangle(name, n) #name "@" #n - -/* Standard DLL load macro. May invoke a fatal error if the function isn't - found. */ -#define LoadDLLfunc(name, n, dllname) \ - LoadDLLfuncEx (name, n, dllname, 0) -#define LoadDLLfuncEx(name, n, dllname, notimp) \ - LoadDLLfuncEx2(name, n, dllname, notimp, 0) -#define LoadDLLfuncEx2(name, n, dllname, notimp, err) \ - LoadDLLfuncEx3(name, n, dllname, notimp, err, 0) - -/* Main DLL setup stuff. */ -#define LoadDLLfuncEx3(name, n, dllname, notimp, err, fn) \ - LoadDLLprime (dllname, dll_func_load) \ - __asm__ (" \n\ - .section ." #dllname "_autoload_text,\"wx\" \n\ - .global _" mangle (name, n) " \n\ - .global _win32_" mangle (name, n) " \n\ - .align 8 \n\ -_" mangle (name, n) ": \n\ -_win32_" mangle (name, n) ": \n\ - .byte 0xe9 \n\ - .long -4 + 1f - . \n\ -1:movl (2f),%eax \n\ - call *(%eax) \n\ -2:.long ." #dllname "_info \n\ - .long (" #n "+" #notimp ") | (((" #err ") & 0xff) <<16) | (((" #fn ") & 0xff) << 24) \n\ - .asciz \"" #name "\" \n\ - .text \n\ -"); - -/* DLL loader helper functions used during initialization. */ - -/* The function which finds the address, given the name and overwrites - the call so that future invocations go straight to the function in - the DLL. */ -extern "C" void dll_func_load () __asm__ ("dll_func_load"); - -/* Called by the primary initialization function "init_std_dll" to - setup the stack and eliminate future calls to init_std_dll for other - functions from this DLL. */ -extern "C" void dll_chain () __asm__ ("dll_chain"); - -extern "C" { - -__asm__ (" \n\ -msg1: \n\ - .ascii \"couldn't dynamically determine load address for '%s' (handle %p), %E\\0\"\n\ - \n\ - .align 32 \n\ -noload: \n\ - popl %edx # Get the address of the information block\n\ - movl 4(%edx),%eax # Should we 'ignore' the lack \n\ - test $1,%eax # of this function? \n\ - jz 1f # Nope. \n\ - decl %eax # Yes. This is the # of bytes + 1 \n\ - popl %edx # Caller's caller \n\ - addl %eax,%esp # Pop off bytes \n\ - andl $0xffff0000,%eax# upper word \n\ - subl %eax,%esp # adjust for possible return value \n\ - pushl %eax # Save for later \n\ - movl $127,%eax # ERROR_PROC_NOT_FOUND \n\ - pushl %eax # First argument \n\ - call _SetLastError@4 # Set it \n\ - popl %eax # Get back argument \n\ - sarl $16,%eax # return value in high order word \n\ - jmp *%edx # Return \n\ -1: \n\ - movl (%edx),%eax # Handle value \n\ - pushl 4(%eax) \n\ - leal 8(%edx),%eax # Location of name of function \n\ - push %eax \n\ - push $msg1 # The message \n\ - call ___api_fatal # Print message. Never returns \n\ - \n\ - .globl dll_func_load \n\ -dll_func_load: \n\ - movl (%esp),%eax # 'Return address' contains load info \n\ - addl $8,%eax # Address of name of function to load \n\ - pushl %eax # Second argument \n\ - movl -8(%eax),%eax # Where handle lives \n\ - movl 4(%eax),%eax # Address of Handle to DLL \n\ - pushl %eax # Handle to DLL \n\ - call _GetProcAddress@8# Load it \n\ - test %eax,%eax # Success? \n\ - jne gotit # Yes \n\ - jmp noload # Issue an error or return \n\ -gotit: \n\ - popl %edx # Pointer to 'return address' \n\ - subl %edx,%eax # Make it relative \n\ - addl $7,%eax # Tweak \n\ - subl $12,%edx # Point to jmp \n\ - movl %eax,1(%edx) # Move relative address after jump \n\ - jmp *%edx # Jump to actual function \n\ - \n\ - .global dll_chain \n\ -dll_chain: \n\ - pushl %eax # Restore 'return address' \n\ - jmp *%edx # Jump to next init function \n\ -"); - -/* C representations of the two info blocks described above. - FIXME: These structures confuse gdb for some reason. GDB can print - the whole structure but has problems with the name field? */ -struct dll_info -{ - DWORD load_state; - HANDLE handle; - LONG here; - void (*init) (); - char name[]; -}; - -struct func_info -{ - struct dll_info *dll; - LONG decoration; - char name[]; -}; - -/* Mechanism for setting up info for passing to dll_chain routines. */ -union retchain -{ - struct {long high; long low;}; - long long ll; -}; - -/* The standard DLL initialization routine. */ -__attribute__ ((used, noinline)) static long long -std_dll_init () -{ - HANDLE h; - struct func_info *func = (struct func_info *) __builtin_return_address (0); - struct dll_info *dll = func->dll; - retchain ret; - - if (InterlockedIncrement (&dll->here)) - do - { - InterlockedDecrement (&dll->here); - low_priority_sleep (0); - } - while (InterlockedIncrement (&dll->here)); - else if (!dll->handle) - { - unsigned fpu_control = 0; - __asm__ __volatile__ ("fnstcw %0": "=m" (fpu_control)); - if ((h = LoadLibrary (dll->name)) != NULL) - { - __asm__ __volatile__ ("fldcw %0": : "m" (fpu_control)); - dll->handle = h; - } - else if (!(func->decoration & 1)) - api_fatal ("could not load %s, %E", dll->name); - else - dll->handle = INVALID_HANDLE_VALUE; - } - - InterlockedDecrement (&dll->here); - - /* Kludge alert. Redirects the return address to dll_chain. */ - __asm__ __volatile__ (" \n\ - movl $dll_chain,4(%ebp) \n\ - "); - - /* Set "arguments for dll_chain. */ - ret.low = (long) dll->init; - ret.high = (long) func; - return ret.ll; -} - -/* Initialization function for winsock stuff. */ -bool NO_COPY wsock_started = 0; -WSADATA NO_COPY wsadata; -__attribute__ ((used, noinline, regparm(1))) static long long -wsock_init () -{ - static LONG NO_COPY here = -1L; - struct func_info *func = (struct func_info *) __builtin_return_address (0); - struct dll_info *dll = func->dll; - - while (InterlockedIncrement (&here)) - { - InterlockedDecrement (&here); - low_priority_sleep (0); - } - - if (!wsock_started) - { - int (*wsastartup) (int, WSADATA *); - - /* Don't use autoload to load WSAStartup to eliminate recursion. */ - wsastartup = (int (*)(int, WSADATA *)) - GetProcAddress ((HMODULE) (dll->handle), "WSAStartup"); - if (wsastartup) - { - int res = wsastartup ((2<<8) | 2, &wsadata); - - debug_printf ("res %d", res); - debug_printf ("wVersion %d", wsadata.wVersion); - debug_printf ("wHighVersion %d", wsadata.wHighVersion); - debug_printf ("szDescription %s", wsadata.szDescription); - debug_printf ("szSystemStatus %s", wsadata.szSystemStatus); - debug_printf ("iMaxSockets %d", wsadata.iMaxSockets); - debug_printf ("iMaxUdpDg %d", wsadata.iMaxUdpDg); - debug_printf ("lpVendorInfo %d", wsadata.lpVendorInfo); - - wsock_started = 1; - } - } - - /* Kludge alert. Redirects the return address to dll_chain. */ - __asm__ __volatile__ (" \n\ - movl $dll_chain,4(%ebp) \n\ - "); - - InterlockedDecrement (&here); - - volatile retchain ret; - /* Set "arguments for dll_chain. */ - ret.low = (long) dll_func_load; - ret.high = (long) func; - return ret.ll; -} - -LoadDLLprime (wsock32, _wsock_init) -LoadDLLprime (ws2_32, _wsock_init) - -LoadDLLfunc (AccessCheck, 32, advapi32) -LoadDLLfunc (AddAccessAllowedAce, 16, advapi32) -LoadDLLfunc (AddAccessDeniedAce, 16, advapi32) -LoadDLLfunc (AddAce, 20, advapi32) -LoadDLLfunc (AdjustTokenPrivileges, 24, advapi32) -LoadDLLfuncEx (AllocateLocallyUniqueId, 4, advapi32, 1) -LoadDLLfunc (CopySid, 12, advapi32) -LoadDLLfunc (CreateProcessAsUserA, 44, advapi32) -LoadDLLfuncEx (CryptAcquireContextA, 20, advapi32, 1) -LoadDLLfuncEx (CryptGenRandom, 12, advapi32, 1) -LoadDLLfuncEx (CryptReleaseContext, 8, advapi32, 1) -LoadDLLfunc (DeregisterEventSource, 4, advapi32) -LoadDLLfunc (DuplicateToken, 12, advapi32) -LoadDLLfuncEx (DuplicateTokenEx, 24, advapi32, 1) -LoadDLLfunc (EqualSid, 8, advapi32) -LoadDLLfunc (FindFirstFreeAce, 8, advapi32) -LoadDLLfunc (GetAce, 12, advapi32) -LoadDLLfunc (GetFileSecurityA, 20, advapi32) -LoadDLLfunc (GetKernelObjectSecurity, 20, advapi32) -LoadDLLfunc (GetLengthSid, 4, advapi32) -LoadDLLfunc (GetSecurityDescriptorDacl, 16, advapi32) -LoadDLLfunc (GetSecurityDescriptorGroup, 12, advapi32) -LoadDLLfunc (GetSecurityDescriptorOwner, 12, advapi32) -LoadDLLfunc (GetSecurityInfo, 32, advapi32) -LoadDLLfunc (GetSidIdentifierAuthority, 4, advapi32) -LoadDLLfunc (GetSidSubAuthority, 8, advapi32) -LoadDLLfunc (GetSidSubAuthorityCount, 4, advapi32) -LoadDLLfunc (GetTokenInformation, 20, advapi32) -LoadDLLfunc (GetUserNameA, 8, advapi32) -LoadDLLfunc (ImpersonateLoggedOnUser, 4, advapi32) -LoadDLLfunc (ImpersonateNamedPipeClient, 4, advapi32) -LoadDLLfunc (InitializeAcl, 12, advapi32) -LoadDLLfunc (InitializeSecurityDescriptor, 8, advapi32) -LoadDLLfunc (InitializeSid, 12, advapi32) -LoadDLLfunc (IsValidSid, 4, advapi32) -LoadDLLfunc (LogonUserA, 24, advapi32) -LoadDLLfunc (LookupAccountNameA, 28, advapi32) -LoadDLLfunc (LookupAccountNameW, 28, advapi32) -LoadDLLfunc (LookupAccountSidA, 28, advapi32) -LoadDLLfunc (LookupPrivilegeValueA, 12, advapi32) -LoadDLLfunc (LsaClose, 4, advapi32) -LoadDLLfunc (LsaEnumerateAccountRights, 16, advapi32) -LoadDLLfunc (LsaFreeMemory, 4, advapi32) -LoadDLLfunc (LsaNtStatusToWinError, 4, advapi32) -LoadDLLfunc (LsaOpenPolicy, 16, advapi32) -LoadDLLfunc (LsaQueryInformationPolicy, 12, advapi32) -LoadDLLfunc (MakeSelfRelativeSD, 12, advapi32) -LoadDLLfunc (OpenProcessToken, 12, advapi32) -LoadDLLfunc (OpenThreadToken, 16, advapi32) -// LoadDLLfunc (RegCloseKey, 4, advapi32) -LoadDLLfunc (RegCreateKeyExA, 36, advapi32) -LoadDLLfunc (RegDeleteKeyA, 8, advapi32) -LoadDLLfunc (RegDeleteValueA, 8, advapi32) -LoadDLLfunc (RegLoadKeyA, 12, advapi32) -LoadDLLfunc (RegEnumKeyExA, 32, advapi32) -LoadDLLfunc (RegEnumValueA, 32, advapi32) -LoadDLLfunc (RegOpenKeyExA, 20, advapi32) -LoadDLLfunc (RegQueryInfoKeyA, 48, advapi32) -LoadDLLfunc (RegQueryValueExA, 24, advapi32) -LoadDLLfunc (RegSetValueExA, 24, advapi32) -LoadDLLfunc (RegisterEventSourceA, 8, advapi32) -LoadDLLfunc (ReportEventA, 36, advapi32) -LoadDLLfunc (RevertToSelf, 0, advapi32) -LoadDLLfunc (SetKernelObjectSecurity, 12, advapi32) -LoadDLLfunc (SetSecurityDescriptorControl, 12, advapi32) -LoadDLLfunc (SetSecurityDescriptorDacl, 16, advapi32) -LoadDLLfunc (SetSecurityDescriptorGroup, 12, advapi32) -LoadDLLfunc (SetSecurityDescriptorOwner, 12, advapi32) -LoadDLLfunc (SetTokenInformation, 16, advapi32) -LoadDLLfunc (RegGetKeySecurity, 16, advapi32) - -LoadDLLfunc (NetApiBufferFree, 4, netapi32) -LoadDLLfuncEx (NetGetDCName, 12, netapi32, 1) -LoadDLLfunc (NetLocalGroupEnum, 28, netapi32) -LoadDLLfunc (NetLocalGroupGetMembers, 32, netapi32) -LoadDLLfunc (NetUserGetGroups, 28, netapi32) -LoadDLLfunc (NetUserGetInfo, 16, netapi32) -LoadDLLfunc (NetWkstaUserGetInfo, 12, netapi32) - -/* 0xc000007a == STATUS_PROCEDURE_NOT_FOUND */ -#define LoadDLLfuncNt(name, n, dllname) \ - LoadDLLfuncEx2(name, n, dllname, 1, 0xc000007a) -LoadDLLfuncNt (NtClose, 4, ntdll) -LoadDLLfuncNt (NtCreateFile, 44, ntdll) -LoadDLLfuncNt (NtCreateSection, 28, ntdll) -LoadDLLfuncNt (NtCreateToken, 52, ntdll) -LoadDLLfuncNt (NtLockVirtualMemory, 16, ntdll) -LoadDLLfuncNt (NtMapViewOfSection, 40, ntdll) -LoadDLLfuncNt (NtOpenDirectoryObject, 12, ntdll) -LoadDLLfuncNt (NtOpenFile, 24, ntdll) -LoadDLLfuncNt (NtOpenSection, 12, ntdll) -LoadDLLfuncNt (NtQueryDirectoryObject, 28, ntdll) -LoadDLLfuncNt (NtQueryDirectoryFile, 44, ntdll) -LoadDLLfuncNt (NtQueryInformationFile, 20, ntdll) -LoadDLLfuncNt (NtQueryInformationProcess, 20, ntdll) -LoadDLLfuncNt (NtQueryObject, 20, ntdll) -LoadDLLfuncNt (NtQuerySystemInformation, 16, ntdll) -LoadDLLfuncNt (NtQuerySecurityObject, 20, ntdll) -LoadDLLfuncNt (NtQueryVirtualMemory, 24, ntdll) -LoadDLLfuncNt (NtQueryVolumeInformationFile, 20, ntdll) -LoadDLLfuncNt (NtSetSecurityObject, 12, ntdll) -LoadDLLfuncNt (NtUnlockVirtualMemory, 16, ntdll) -LoadDLLfuncNt (NtUnmapViewOfSection, 8, ntdll) -LoadDLLfuncNt (RtlInitUnicodeString, 8, ntdll) -LoadDLLfuncNt (RtlIsDosDeviceName_U, 4, ntdll) -LoadDLLfuncNt (RtlNtStatusToDosError, 4, ntdll) - -LoadDLLfuncEx (EnumProcessModules, 16, psapi, 1) -LoadDLLfuncEx (GetModuleFileNameExA, 16, psapi, 1) -LoadDLLfuncEx (GetModuleInformation, 16, psapi, 1) -LoadDLLfuncEx (GetProcessMemoryInfo, 12, psapi, 1) -LoadDLLfuncEx (QueryWorkingSet, 12, psapi, 1) - -LoadDLLfuncEx (LsaDeregisterLogonProcess, 4, secur32, 1) -LoadDLLfuncEx (LsaFreeReturnBuffer, 4, secur32, 1) -LoadDLLfuncEx (LsaLogonUser, 56, secur32, 1) -LoadDLLfuncEx (LsaLookupAuthenticationPackage, 12, secur32, 1) -LoadDLLfuncEx (LsaRegisterLogonProcess, 12, secur32, 1) - -LoadDLLfunc (CharToOemA, 8, user32) -LoadDLLfunc (CharToOemBuffA, 12, user32) -LoadDLLfunc (CloseClipboard, 0, user32) -LoadDLLfunc (CloseWindowStation, 4, user32) -LoadDLLfunc (CreateWindowExA, 48, user32) -LoadDLLfunc (CreateWindowStationA, 16, user32) -LoadDLLfunc (DefWindowProcA, 16, user32) -LoadDLLfunc (DispatchMessageA, 4, user32) -LoadDLLfunc (EmptyClipboard, 0, user32) -LoadDLLfunc (FindWindowA, 8, user32) -LoadDLLfunc (GetClipboardData, 4, user32) -LoadDLLfunc (GetForegroundWindow, 0, user32) -LoadDLLfunc (GetKeyboardLayout, 4, user32) -LoadDLLfunc (GetMessageA, 16, user32) -LoadDLLfunc (GetPriorityClipboardFormat, 8, user32) -LoadDLLfunc (GetProcessWindowStation, 0, user32) -LoadDLLfunc (GetThreadDesktop, 4, user32) -LoadDLLfunc (GetWindowThreadProcessId, 8, user32) -LoadDLLfunc (GetUserObjectInformationA, 20, user32) -LoadDLLfunc (KillTimer, 8, user32) -LoadDLLfunc (MessageBeep, 4, user32) -LoadDLLfunc (MessageBoxA, 16, user32) -LoadDLLfunc (MsgWaitForMultipleObjects, 20, user32) -LoadDLLfunc (OemToCharBuffA, 12, user32) -LoadDLLfunc (OpenClipboard, 4, user32) -LoadDLLfunc (PeekMessageA, 20, user32) -LoadDLLfunc (PostMessageA, 16, user32) -LoadDLLfunc (PostQuitMessage, 4, user32) -LoadDLLfunc (RegisterClassA, 4, user32) -LoadDLLfunc (RegisterClipboardFormatA, 4, user32) -LoadDLLfunc (SendMessageA, 16, user32) -LoadDLLfunc (SetClipboardData, 8, user32) -LoadDLLfunc (SetProcessWindowStation, 4, user32) -LoadDLLfunc (SetTimer, 16, user32) -LoadDLLfunc (SetUserObjectSecurity, 12, user32) - -LoadDLLfunc (inet_network, 4, wsock32) -LoadDLLfunc (rcmd, 24, wsock32) -LoadDLLfunc (rexec, 24, wsock32) - -LoadDLLfunc (accept, 12, ws2_32) -LoadDLLfunc (bind, 12, ws2_32) -LoadDLLfunc (closesocket, 4, ws2_32) -LoadDLLfunc (connect, 12, ws2_32) -LoadDLLfunc (gethostbyaddr, 12, ws2_32) -LoadDLLfunc (gethostbyname, 4, ws2_32) -LoadDLLfuncEx2 (gethostname, 8, ws2_32, 1, 1) -LoadDLLfunc (getpeername, 12, ws2_32) -LoadDLLfunc (getprotobyname, 4, ws2_32) -LoadDLLfunc (getprotobynumber, 4, ws2_32) -LoadDLLfunc (getservbyname, 8, ws2_32) -LoadDLLfunc (getservbyport, 8, ws2_32) -LoadDLLfunc (getsockname, 12, ws2_32) -LoadDLLfunc (getsockopt, 20, ws2_32) -LoadDLLfunc (inet_addr, 4, ws2_32) -LoadDLLfunc (inet_ntoa, 4, ws2_32) -LoadDLLfunc (ioctlsocket, 12, ws2_32) -LoadDLLfunc (listen, 8, ws2_32) -LoadDLLfunc (recv, 16, ws2_32) -LoadDLLfunc (recvfrom, 24, ws2_32) -LoadDLLfunc (select, 20, ws2_32) -LoadDLLfunc (send, 16, ws2_32) -LoadDLLfunc (sendto, 24, ws2_32) -LoadDLLfunc (setsockopt, 20, ws2_32) -LoadDLLfunc (shutdown, 8, ws2_32) -LoadDLLfunc (socket, 12, ws2_32) -LoadDLLfunc (WSAAsyncSelect, 16, ws2_32) -LoadDLLfunc (WSACloseEvent, 4, ws2_32) -LoadDLLfunc (WSACreateEvent, 0, ws2_32) -LoadDLLfunc (WSADuplicateSocketA, 12, ws2_32) -LoadDLLfunc (WSAGetLastError, 0, ws2_32) -LoadDLLfunc (WSAGetOverlappedResult, 20, ws2_32) -LoadDLLfunc (WSARecv, 28, ws2_32) -LoadDLLfunc (WSARecvFrom, 36, ws2_32) -LoadDLLfunc (WSASend, 28, ws2_32) -LoadDLLfunc (WSASendTo, 36, ws2_32) -LoadDLLfunc (WSASetEvent, 4, ws2_32) -LoadDLLfunc (WSASetLastError, 4, ws2_32) -LoadDLLfunc (WSASocketA, 24, ws2_32) -// LoadDLLfunc (WSAStartup, 8, ws2_32) -LoadDLLfunc (WSAWaitForMultipleEvents, 20, ws2_32) -LoadDLLfunc (WSAEventSelect, 12, ws2_32) -LoadDLLfunc (WSAEnumNetworkEvents, 12, ws2_32) -LoadDLLfunc (__WSAFDIsSet, 8, ws2_32) - -LoadDLLfuncEx (GetIfTable, 12, iphlpapi, 1) -LoadDLLfuncEx (GetIfEntry, 4, iphlpapi, 1) -LoadDLLfuncEx (GetIpAddrTable, 12, iphlpapi, 1) -LoadDLLfuncEx (GetNetworkParams, 8, iphlpapi, 1) -LoadDLLfuncEx (GetTcpTable, 12, iphlpapi, 1) - -LoadDLLfunc (CoTaskMemFree, 4, ole32) - -LoadDLLfuncEx (CancelIo, 4, kernel32, 1) -LoadDLLfuncEx (CreateHardLinkA, 12, kernel32, 1) -LoadDLLfuncEx (CreateToolhelp32Snapshot, 8, kernel32, 1) -LoadDLLfuncEx (FindFirstVolumeA, 8, kernel32, 1) -LoadDLLfuncEx (FindNextVolumeA, 12, kernel32, 1) -LoadDLLfuncEx (FindVolumeClose, 4, kernel32, 1) -LoadDLLfuncEx2 (GetCompressedFileSizeA, 8, kernel32, 1, 0xffffffff) -LoadDLLfuncEx (GetConsoleWindow, 0, kernel32, 1) -LoadDLLfuncEx (GetDiskFreeSpaceEx, 16, kernel32, 1) -LoadDLLfuncEx (GetNativeSystemInfo, 4, kernel32, 1) -LoadDLLfuncEx (GetProcessWorkingSetSize, 12, kernel32, 1) -LoadDLLfuncEx (GetVolumeNameForVolumeMountPointA, 12, kernel32, 1) -LoadDLLfuncEx2 (IsDebuggerPresent, 0, kernel32, 1, 1) -LoadDLLfunc (IsProcessorFeaturePresent, 4, kernel32); -LoadDLLfuncEx (IsWow64Process, 8, kernel32, 1); -LoadDLLfuncEx (Process32First, 8, kernel32, 1) -LoadDLLfuncEx (Process32Next, 8, kernel32, 1) -LoadDLLfuncEx (RegisterServiceProcess, 8, kernel32, 1) -LoadDLLfuncEx (SetProcessWorkingSetSize, 12, kernel32, 1) -LoadDLLfuncEx (SignalObjectAndWait, 16, kernel32, 1) -LoadDLLfuncEx (SwitchToThread, 0, kernel32, 1) - -LoadDLLfunc (SHGetDesktopFolder, 4, shell32) - -LoadDLLfuncEx (waveOutGetNumDevs, 0, winmm, 1) -LoadDLLfuncEx (waveOutOpen, 24, winmm, 1) -LoadDLLfuncEx (waveOutReset, 4, winmm, 1) -LoadDLLfuncEx (waveOutClose, 4, winmm, 1) -LoadDLLfuncEx (waveOutGetVolume, 8, winmm, 1) -LoadDLLfuncEx (waveOutSetVolume, 8, winmm, 1) -LoadDLLfuncEx (waveOutUnprepareHeader, 12, winmm, 1) -LoadDLLfuncEx (waveOutPrepareHeader, 12, winmm, 1) -LoadDLLfuncEx (waveOutWrite, 12, winmm, 1) -LoadDLLfuncEx (timeGetDevCaps, 8, winmm, 1) -LoadDLLfuncEx (timeGetTime, 0, winmm, 1) -LoadDLLfuncEx (timeBeginPeriod, 4, winmm, 1) -LoadDLLfuncEx (timeEndPeriod, 4, winmm, 1) - -LoadDLLfuncEx (waveInGetNumDevs, 0, winmm, 1) -LoadDLLfuncEx (waveInOpen, 24, winmm, 1) -LoadDLLfuncEx (waveInUnprepareHeader, 12, winmm, 1) -LoadDLLfuncEx (waveInPrepareHeader, 12, winmm, 1) -LoadDLLfuncEx (waveInAddBuffer, 12, winmm, 1) -LoadDLLfuncEx (waveInStart, 4, winmm, 1) -LoadDLLfuncEx (waveInReset, 4, winmm, 1) -LoadDLLfuncEx (waveInClose, 4, winmm, 1) - -LoadDLLfunc (WNetGetResourceInformationA, 16, mpr) -LoadDLLfunc (WNetGetResourceParentA, 12, mpr) -LoadDLLfunc (WNetOpenEnumA, 20, mpr) -LoadDLLfunc (WNetEnumResourceA, 16, mpr) -LoadDLLfunc (WNetCloseEnum, 4, mpr) - -LoadDLLfuncEx (UuidCreate, 4, rpcrt4, 1) -LoadDLLfuncEx (UuidCreateSequential, 4, rpcrt4, 1) -} diff --git a/winsup/cygwin/automode.c b/winsup/cygwin/automode.c deleted file mode 100644 index f7cddfeec..000000000 --- a/winsup/cygwin/automode.c +++ /dev/null @@ -1,26 +0,0 @@ -/* automode.c - - Copyright 2000 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include -#include -#include - -extern int _fmode; -void -cygwin_premain0 (int argc, char **argv, struct per_process *myself) -{ - static struct __cygwin_perfile pf[] = - { - {"", O_RDONLY | O_TEXT}, - {"", O_WRONLY | O_BINARY}, - {NULL, 0} - }; - cygwin_internal (CW_PERFILE, pf); -} diff --git a/winsup/cygwin/binmode.c b/winsup/cygwin/binmode.c deleted file mode 100644 index 50efff46f..000000000 --- a/winsup/cygwin/binmode.c +++ /dev/null @@ -1,21 +0,0 @@ -/* binmode.c - - Copyright 2000 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include -#include -#include - -extern int _fmode; -void -cygwin_premain0 (int argc, char **argv, struct per_process *myself) -{ - _fmode &= ~_O_TEXT; - _fmode |= _O_BINARY; -} diff --git a/winsup/cygwin/child_info.h b/winsup/cygwin/child_info.h deleted file mode 100644 index e6599e845..000000000 --- a/winsup/cygwin/child_info.h +++ /dev/null @@ -1,136 +0,0 @@ -/* child_info.h: shared child info for cygwin - - Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include - -enum child_info_types -{ - _PROC_EXEC, - _PROC_SPAWN, - _PROC_FORK, - _PROC_WHOOPS -}; - -enum child_status -{ - _CI_STRACED = 0x01, - _CI_ISCYGWIN = 0x0 -}; - -#define OPROC_MAGIC_MASK 0xff00ff00 -#define OPROC_MAGIC_GENERIC 0xaf00f000 - -#define PROC_MAGIC_GENERIC 0xaf00fa00 - -#define PROC_EXEC (_PROC_EXEC) -#define PROC_SPAWN (_PROC_SPAWN) -#define PROC_FORK (_PROC_FORK) - -#define EXEC_MAGIC_SIZE sizeof(child_info) - -/* Change this value if you get a message indicating that it is out-of-sync. */ -#define CURR_CHILD_INFO_MAGIC 0xa189e57U - -/* NOTE: Do not make gratuitous changes to the names or organization of the - below class. The layout is checksummed to determine compatibility between - different cygwin versions. */ -class child_info -{ -public: - DWORD zero[4]; // must be zeroed - DWORD cb; // size of this record - DWORD intro; // improbable string - unsigned long magic; // magic number unique to child_info - unsigned short type; // type of record, exec, spawn, fork - HANDLE subproc_ready; // used for synchronization with parent - HANDLE user_h; - HANDLE parent; - init_cygheap *cygheap; - void *cygheap_max; - DWORD cygheap_reserve_sz; - unsigned char flag; - unsigned fhandler_union_cb; - int retry; // number of times we've tried to start child process - DWORD exit_code; // process exit code - static int retry_count;// retry count; - child_info (unsigned, child_info_types, bool); - child_info (): subproc_ready (NULL), parent (NULL) {} - ~child_info (); - void ready (bool); - bool sync (int, HANDLE&, DWORD) __attribute__ ((regparm (3))); - DWORD proc_retry (HANDLE) __attribute__ ((regparm (2))); - bool isstraced () const {return flag & _CI_STRACED;} - bool iscygwin () const {return flag & _CI_ISCYGWIN;} -}; - -class mount_info; -class _pinfo; - -class child_info_fork: public child_info -{ -public: - HANDLE forker_finished;// for synchronization with child - DWORD stacksize; // size of parent stack - jmp_buf jmp; // where child will jump to - void *stacktop; // location of top of parent stack - void *stackbottom; // location of bottom of parent stack - child_info_fork (); - void handle_fork () __attribute__ ((regparm (1)));; - bool handle_failure (DWORD) __attribute__ ((regparm (2))); -}; - -class fhandler_base; - -class cygheap_exec_info -{ -public: - char *old_title; - int argc; - char **argv; - int envc; - char **envp; - HANDLE myself_pinfo; -}; - -class child_info_spawn: public child_info -{ -public: - cygheap_exec_info *moreinfo; - - ~child_info_spawn () - { - if (moreinfo) - { - if (moreinfo->old_title) - cfree (moreinfo->old_title); - if (moreinfo->envp) - { - for (char **e = moreinfo->envp; *e; e++) - cfree (*e); - cfree (moreinfo->envp); - } - CloseHandle (moreinfo->myself_pinfo); - cfree (moreinfo); - } - } - child_info_spawn (): moreinfo (NULL) {}; - child_info_spawn (child_info_types, bool); - void *operator new (size_t, void *p) __attribute__ ((nothrow)) {return p;} - void set (child_info_types ci, bool b) { new (this) child_info_spawn (ci, b);} - void handle_spawn () __attribute__ ((regparm (1))); -}; - -void __stdcall init_child_info (DWORD, child_info *, HANDLE); - -extern "C" { -extern child_info *child_proc_info; -extern child_info_spawn *spawn_info asm ("_child_proc_info"); -extern child_info_fork *fork_info asm ("_child_proc_info"); -} diff --git a/winsup/cygwin/config.h.in b/winsup/cygwin/config.h.in deleted file mode 100644 index edfbfeee0..000000000 --- a/winsup/cygwin/config.h.in +++ /dev/null @@ -1,53 +0,0 @@ -/* config.h.in. Generated from configure.in by autoheader. */ -/* Define if DEBUGGING support is requested. */ -#undef DEBUGGING - -/* Define if GCC supports builtin memset. */ -#undef HAVE_BUILTIN_MEMSET - -/* Define if MALLOC_DEBUGGING support is requested. */ -#undef MALLOC_DEBUG - -/* Define if using new vfork functionality. */ -#undef NEWVFORK - -/* Define if using cygserver */ -#undef USE_SERVER - -/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP - systems. This function is required for `alloca.c' support on those systems. - */ -#undef CRAY_STACKSEG_END - -/* Define to 1 if using `alloca.c'. */ -#undef C_ALLOCA - -/* Define to 1 if you have `alloca', as a function or macro. */ -#undef HAVE_ALLOCA - -/* Define to 1 if you have and it should be used (not on Ultrix). - */ -#undef HAVE_ALLOCA_H - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at run-time. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown */ -#undef STACK_DIRECTION diff --git a/winsup/cygwin/config/i386/profile.h b/winsup/cygwin/config/i386/profile.h deleted file mode 100644 index ad5f625d0..000000000 --- a/winsup/cygwin/config/i386/profile.h +++ /dev/null @@ -1,58 +0,0 @@ -/* $NetBSD: profile.h,v 1.6 1995/03/28 18:17:08 jtc Exp $ */ - -/* - * Copyright (c) 1992, 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. - * - * @(#)profile.h 8.1 (Berkeley) 6/11/93 - */ - -#define _MCOUNT_DECL static inline void _mcount - -#define MCOUNT \ -void \ -mcount() \ -{ \ - int selfpc, frompcindex; \ - /* \ - * find the return address for mcount, \ - * and the return address for mcount's caller. \ - * \ - * selfpc = pc pushed by mcount call \ - */ \ - __asm("movl 4(%%ebp),%0" : "=r" (selfpc)); \ - /* \ - * frompcindex = pc pushed by call into self. \ - */ \ - __asm("movl (%%ebp),%0;movl 4(%0),%0" : "=r" (frompcindex)); \ - _mcount(frompcindex, selfpc); \ -} - diff --git a/winsup/cygwin/configure b/winsup/cygwin/configure deleted file mode 100755 index e2e87da3d..000000000 --- a/winsup/cygwin/configure +++ /dev/null @@ -1,2541 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --enable-debugging Build a cygwin DLL which has more consistency checking for debugging" -ac_help="$ac_help - --enable-server Build a cygwin DLL which can communicate with cygserver" -ac_help="$ac_help - --enable-malloc-debugging Build a cygwin DLL with heap sanity checking (this is very slow, use only if you have heap corruption problems)" -ac_help="$ac_help - --enable-vfork Build a cygwin DLL which uses experimental vfork code" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -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=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -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 ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$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" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$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) - # 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 << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --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 -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$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" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - 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) - 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" ;; - - -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 ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.13" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=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" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=init.cc - -# 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 its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - 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 - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -ac_exeext= -ac_objext=o -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - - - -INSTALL="/bin/sh "`cd $srcdir/../..; echo $(pwd)/install-sh -c` - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $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 - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - -# 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 -# 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" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:568: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/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 - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -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. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&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_PROGRAM}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - - - - - - - - -# Do some error checking and defaulting for the host and target type. -# The inputs are: -# configure --host=HOST --target=TARGET --build=BUILD NONOPT -# -# The rules are: -# 1. You are not allowed to specify --host, --target, and nonopt at the -# same time. -# 2. Host defaults to nonopt. -# 3. If nonopt is not specified, then host defaults to the current host, -# as determined by config.guess. -# 4. Target and build default to nonopt. -# 5. If nonopt is not specified, then target and build default to host. - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -case $host---$target---$nonopt in -NONE---*---* | *---NONE---* | *---*---NONE) ;; -*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;; -esac - - -# Make sure we can run config.sub. -if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : -else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } -fi - -echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:654: checking host system type" >&5 - -host_alias=$host -case "$host_alias" in -NONE) - case $nonopt in - NONE) - if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : - else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } - fi ;; - *) host_alias=$nonopt ;; - esac ;; -esac - -host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` -host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$host" 1>&6 - -echo $ac_n "checking target system type""... $ac_c" 1>&6 -echo "configure:675: checking target system type" >&5 - -target_alias=$target -case "$target_alias" in -NONE) - case $nonopt in - NONE) target_alias=$host_alias ;; - *) target_alias=$nonopt ;; - esac ;; -esac - -target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias` -target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$target" 1>&6 - -echo $ac_n "checking build system type""... $ac_c" 1>&6 -echo "configure:693: checking build system type" >&5 - -build_alias=$build -case "$build_alias" in -NONE) - case $nonopt in - NONE) build_alias=$host_alias ;; - *) build_alias=$nonopt ;; - esac ;; -esac - -build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` -build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$build" 1>&6 - -test "$host_alias" != "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - - -if test $host != $build; then - ac_tool_prefix=${host_alias}- -else - ac_tool_prefix= -fi - -# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:725: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_CC"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:757: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="gcc" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - CC="gcc" -fi -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 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:793: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_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 $# -gt 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 - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:842: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes - ac_test_CFLAGS="${CFLAGS+set}" - ac_save_CFLAGS="$CFLAGS" - CFLAGS= - echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:866: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 - if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" - elif test $ac_cv_prog_cc_g = yes; then - CFLAGS="-gstabs+ -O2" - else - CFLAGS="-O2" - fi -else - GCC= - test "${CFLAGS+set}" = set || CFLAGS="-g" -fi - -# Extract the first word of "${ac_tool_prefix}g++", so it can be a program name with args. -set dummy ${ac_tool_prefix}g++; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:896: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CXX="${ac_tool_prefix}g++" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CXX="$ac_cv_prog_CXX" -if test -n "$CXX"; then - echo "$ac_t""$CXX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_CXX"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "g++", so it can be a program name with args. -set dummy g++; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:928: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CXX="g++" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_CXX" && ac_cv_prog_CXX="g++" -fi -fi -CXX="$ac_cv_prog_CXX" -if test -n "$CXX"; then - echo "$ac_t""$CXX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - CXX="g++" -fi -fi - -if test -z "$CXX"; then - # Extract the first word of "c++", so it can be a program name with args. -set dummy c++; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:964: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CXX="c++" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CXX="$ac_cv_prog_CXX" -if test -n "$CXX"; then - echo "$ac_t""$CXX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -CXXFLAGS='$(CFLAGS)' - - -case "$with_cross_host" in - ""|*cygwin*) - all_host="all_host" - install_host="install_host" - LIBSERVER='$(bupdir)/cygserver/libcygserver.a' - ;; - *) - all_host= - install_host= - LIBSERVER= - ;; -esac - -test -n "$LIBSERVER" && cat >> confdefs.h <<\EOF -#define USE_SERVER 1 -EOF - - - - - -# 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 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1020: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_AR="${ac_tool_prefix}ar" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -AR="$ac_cv_prog_AR" -if test -n "$AR"; then - echo "$ac_t""$AR" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_AR"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1052: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_AR="ar" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar" -fi -fi -AR="$ac_cv_prog_AR" -if test -n "$AR"; then - echo "$ac_t""$AR" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - AR="ar" -fi -fi - -# 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 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1087: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$AS"; then - ac_cv_prog_AS="$AS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_AS="${ac_tool_prefix}as" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -AS="$ac_cv_prog_AS" -if test -n "$AS"; then - echo "$ac_t""$AS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_AS"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "as", so it can be a program name with args. -set dummy as; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1119: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$AS"; then - ac_cv_prog_AS="$AS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_AS="as" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="as" -fi -fi -AS="$ac_cv_prog_AS" -if test -n "$AS"; then - echo "$ac_t""$AS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - AS="as" -fi -fi - -# Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1154: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -DLLTOOL="$ac_cv_prog_DLLTOOL" -if test -n "$DLLTOOL"; then - echo "$ac_t""$DLLTOOL" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_DLLTOOL"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1186: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_DLLTOOL="dlltool" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_DLLTOOL" && ac_cv_prog_DLLTOOL="dlltool" -fi -fi -DLLTOOL="$ac_cv_prog_DLLTOOL" -if test -n "$DLLTOOL"; then - echo "$ac_t""$DLLTOOL" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - DLLTOOL="dlltool" -fi -fi - -# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args. -set dummy ${ac_tool_prefix}ld; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1221: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$LD"; then - ac_cv_prog_LD="$LD" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_LD="${ac_tool_prefix}ld" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -LD="$ac_cv_prog_LD" -if test -n "$LD"; then - echo "$ac_t""$LD" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_LD"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "ld", so it can be a program name with args. -set dummy ld; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1253: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$LD"; then - ac_cv_prog_LD="$LD" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_LD="ld" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_LD" && ac_cv_prog_LD="ld" -fi -fi -LD="$ac_cv_prog_LD" -if test -n "$LD"; then - echo "$ac_t""$LD" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - LD="ld" -fi -fi - -# Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. -set dummy ${ac_tool_prefix}nm; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1288: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_NM'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$NM"; then - ac_cv_prog_NM="$NM" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_NM="${ac_tool_prefix}nm" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -NM="$ac_cv_prog_NM" -if test -n "$NM"; then - echo "$ac_t""$NM" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_NM"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "nm", so it can be a program name with args. -set dummy nm; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1320: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_NM'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$NM"; then - ac_cv_prog_NM="$NM" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_NM="nm" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_NM" && ac_cv_prog_NM="nm" -fi -fi -NM="$ac_cv_prog_NM" -if test -n "$NM"; then - echo "$ac_t""$NM" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - NM="nm" -fi -fi - -# Extract the first word of "${ac_tool_prefix}objcopy", so it can be a program name with args. -set dummy ${ac_tool_prefix}objcopy; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1355: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_OBJCOPY'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$OBJCOPY"; then - ac_cv_prog_OBJCOPY="$OBJCOPY" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_OBJCOPY="${ac_tool_prefix}objcopy" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -OBJCOPY="$ac_cv_prog_OBJCOPY" -if test -n "$OBJCOPY"; then - echo "$ac_t""$OBJCOPY" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_OBJCOPY"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "objcopy", so it can be a program name with args. -set dummy objcopy; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1387: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_OBJCOPY'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$OBJCOPY"; then - ac_cv_prog_OBJCOPY="$OBJCOPY" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_OBJCOPY="objcopy" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_OBJCOPY" && ac_cv_prog_OBJCOPY="objcopy" -fi -fi -OBJCOPY="$ac_cv_prog_OBJCOPY" -if test -n "$OBJCOPY"; then - echo "$ac_t""$OBJCOPY" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - OBJCOPY="objcopy" -fi -fi - -# Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1422: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_OBJDUMP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -OBJDUMP="$ac_cv_prog_OBJDUMP" -if test -n "$OBJDUMP"; then - echo "$ac_t""$OBJDUMP" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_OBJDUMP"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1454: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_OBJDUMP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_OBJDUMP="objdump" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_OBJDUMP" && ac_cv_prog_OBJDUMP="objdump" -fi -fi -OBJDUMP="$ac_cv_prog_OBJDUMP" -if test -n "$OBJDUMP"; then - echo "$ac_t""$OBJDUMP" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - OBJDUMP="objdump" -fi -fi - -# 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 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1489: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_RANLIB"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1521: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB="ranlib" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - RANLIB="ranlib" -fi -fi - -# 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 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1556: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -STRIP="$ac_cv_prog_STRIP" -if test -n "$STRIP"; then - echo "$ac_t""$STRIP" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_STRIP"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1588: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_STRIP="strip" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_STRIP" && ac_cv_prog_STRIP="strip" -fi -fi -STRIP="$ac_cv_prog_STRIP" -if test -n "$STRIP"; then - echo "$ac_t""$STRIP" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - STRIP="strip" -fi -fi - -# Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. -set dummy ${ac_tool_prefix}windres; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1623: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$WINDRES"; then - ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_WINDRES="${ac_tool_prefix}windres" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -WINDRES="$ac_cv_prog_WINDRES" -if test -n "$WINDRES"; then - echo "$ac_t""$WINDRES" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_WINDRES"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "windres", so it can be a program name with args. -set dummy windres; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1655: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$WINDRES"; then - ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_WINDRES="windres" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_WINDRES" && ac_cv_prog_WINDRES="windres" -fi -fi -WINDRES="$ac_cv_prog_WINDRES" -if test -n "$WINDRES"; then - echo "$ac_t""$WINDRES" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - WINDRES="windres" -fi -fi - - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1689: checking how to run the C preprocessor" >&5 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1710: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1727: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -nologo -E" - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1744: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works -# for constant arguments. Useless! -echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 -echo "configure:1771: checking for working alloca.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { -char *p = alloca(2 * sizeof(int)); -; return 0; } -EOF -if { (eval echo configure:1783: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_header_alloca_h=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_alloca_h=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 -if test $ac_cv_header_alloca_h = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA_H 1 -EOF - -fi - -echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:1804: checking for alloca" >&5 -if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -# define alloca _alloca -# else -# if HAVE_ALLOCA_H -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -# endif -# endif -# endif -# endif -#endif - -int main() { -char *p = (char *) alloca(1); -; return 0; } -EOF -if { (eval echo configure:1837: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_func_alloca_works=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_func_alloca_works=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_func_alloca_works" 1>&6 -if test $ac_cv_func_alloca_works = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA 1 -EOF - -fi - -if test $ac_cv_func_alloca_works = no; then - # The SVR3 libPW and SVR4 libucb both contain incompatible functions - # that cause trouble. Some versions do not even contain alloca or - # contain a buggy version. If you still want to use their alloca, - # use ar to extract alloca.o from them instead of compiling alloca.c. - ALLOCA=alloca.${ac_objext} - cat >> confdefs.h <<\EOF -#define C_ALLOCA 1 -EOF - - -echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:1869: checking whether alloca needs Cray hooks" >&5 -if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <&5 | - egrep "webecray" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_os_cray=yes -else - rm -rf conftest* - ac_cv_os_cray=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_os_cray" 1>&6 -if test $ac_cv_os_cray = yes; then -for ac_func in _getb67 GETB67 getb67; do - echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:1899: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1927: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <&6 -fi - -done -fi - -echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:1954: checking stack direction for C alloca" >&5 -if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_stack_direction=0 -else - cat > conftest.$ac_ext < addr) ? 1 : -1; -} -main () -{ - exit (find_stack_direction() < 0); -} -EOF -if { (eval echo configure:1981: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - ac_cv_c_stack_direction=1 -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_c_stack_direction=-1 -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 -cat >> confdefs.h <&6 -echo "configure:2003: checking whether ${MAKE-make} sets \${MAKE}" >&5 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ac_t""yes" 1>&6 - SET_MAKE= -else - echo "$ac_t""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - - -# Test for builtin mem* functions. - -ac_ext=C -# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cxx_cross - -cat > conftest.$ac_ext < -void foo(char *s, int c, size_t n) -{ - __builtin_memset(s, c, n); -} - -int main() { - -; return 0; } -EOF -if { (eval echo configure:2053: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - use_builtin_memset=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - use_builtin_memset=no -fi -rm -f conftest* -if test $use_builtin_memset = "yes"; then - cat >> confdefs.h <<\EOF -#define HAVE_BUILTIN_MEMSET 1 -EOF - -fi -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - - -# Check whether --enable-debugging or --disable-debugging was given. -if test "${enable_debugging+set}" = set; then - enableval="$enable_debugging" - case "${enableval}" in -yes) cat >> confdefs.h <<\EOF -#define DEBUGGING 1 -EOF - ;; -no) ;; -esac - -fi - - -# Check whether --enable-server or --disable-server was given. -if test "${enable_server+set}" = set; then - enableval="$enable_server" - case "${enableval}" in -yes) ;; -no) LIBSERVER=;; -esac - -fi - - -MALLOC_OFILES=malloc.o -# Check whether --enable-malloc-debugging or --disable-malloc-debugging was given. -if test "${enable_malloc_debugging+set}" = set; then - enableval="$enable_malloc_debugging" - case "${enableval}" in -yes) cat >> confdefs.h <<\EOF -#define MALLOC_DEBUG 1 -EOF - - MALLOC_OFILES=dlmalloc.o - ;; -no) ;; -esac - -fi - - -# Check whether --enable-vfork or --disable-vfork was given. -if test "${enable_vfork+set}" = set; then - enableval="$enable_vfork" - vfork="${enableval}" -] -fi - - -case "$vfork" in -no) ;; -yes) cat >> confdefs.h <&2; exit 1; } ;; -esac - - - - - - - -trap '' 1 2 15 -cat > confcache <<\EOF -# 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. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# 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. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -DEFS=-DHAVE_CONFIG_H - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.13" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@SHELL@%$SHELL%g -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@FFLAGS@%$FFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@host@%$host%g -s%@host_alias@%$host_alias%g -s%@host_cpu@%$host_cpu%g -s%@host_vendor@%$host_vendor%g -s%@host_os@%$host_os%g -s%@target@%$target%g -s%@target_alias@%$target_alias%g -s%@target_cpu@%$target_cpu%g -s%@target_vendor@%$target_vendor%g -s%@target_os@%$target_os%g -s%@build@%$build%g -s%@build_alias@%$build_alias%g -s%@build_cpu@%$build_cpu%g -s%@build_vendor@%$build_vendor%g -s%@build_os@%$build_os%g -s%@CC@%$CC%g -s%@CXX@%$CXX%g -s%@all_host@%$all_host%g -s%@install_host@%$install_host%g -s%@AR@%$AR%g -s%@AS@%$AS%g -s%@DLLTOOL@%$DLLTOOL%g -s%@LD@%$LD%g -s%@NM@%$NM%g -s%@OBJCOPY@%$OBJCOPY%g -s%@OBJDUMP@%$OBJDUMP%g -s%@RANLIB@%$RANLIB%g -s%@STRIP@%$STRIP%g -s%@WINDRES@%$WINDRES%g -s%@CPP@%$CPP%g -s%@ALLOCA@%$ALLOCA%g -s%@SET_MAKE@%$SET_MAKE%g -s%@MALLOC_OFILES@%$MALLOC_OFILES%g -s%@LIBSERVER@%$LIBSERVER%g -s%@DLL_ENTRY@%$DLL_ENTRY%g -s%@DEF_DLL_ENTRY@%$DEF_DLL_ENTRY%g -s%@CONFIG_DIR@%$CONFIG_DIR%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' -ac_dC='\3' -ac_dD='%g' -# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". -ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='\([ ]\)%\1#\2define\3' -ac_uC=' ' -ac_uD='\4%g' -# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_eB='$%\1#\2define\3' -ac_eC=' ' -ac_eD='%g' - -if test "${CONFIG_HEADERS+set}" != set; then -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -fi -for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - echo creating $ac_file - - rm -f conftest.frag conftest.in conftest.out - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - cat $ac_file_inputs > conftest.in - -EOF - -# Transform confdefs.h into a sed script conftest.vals that substitutes -# the proper values into config.h.in to produce config.h. And first: -# Protect against being on the right side of a sed subst in config.status. -# Protect against being in an unquoted here document in config.status. -rm -f conftest.vals -cat > conftest.hdr <<\EOF -s/[\\&%]/\\&/g -s%[\\$`]%\\&%g -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp -s%ac_d%ac_u%gp -s%ac_u%ac_e%gp -EOF -sed -n -f conftest.hdr confdefs.h > conftest.vals -rm -f conftest.hdr - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >> conftest.vals <<\EOF -s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% -EOF - -# Break up conftest.vals because some shells have a limit on -# the size of here documents, and old seds have small limits too. - -rm -f conftest.tail -while : -do - ac_lines=`grep -c . conftest.vals` - # grep -c gives empty output for an empty file on some AIX systems. - if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi - # Write a limited-size here document to conftest.frag. - echo ' cat > conftest.frag <> $CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS - echo 'CEOF - sed -f conftest.frag conftest.in > conftest.out - rm -f conftest.in - mv conftest.out conftest.in -' >> $CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail - rm -f conftest.vals - mv conftest.tail conftest.vals -done -rm -f conftest.vals - -cat >> $CONFIG_STATUS <<\EOF - rm -f conftest.frag conftest.h - echo "/* $ac_file. Generated automatically by configure. */" > conftest.h - cat conftest.in >> conftest.h - rm -f conftest.in - if cmp -s $ac_file conftest.h 2>/dev/null; then - echo "$ac_file is unchanged" - rm -f conftest.h - else - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - fi - rm -f $ac_file - mv conftest.h $ac_file - fi -fi; done - -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/winsup/cygwin/configure.in b/winsup/cygwin/configure.in deleted file mode 100644 index 2b0d867dc..000000000 --- a/winsup/cygwin/configure.in +++ /dev/null @@ -1,189 +0,0 @@ -dnl Autoconf configure script for Cygwin. -dnl Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003 Red Hat, Inc. -dnl -dnl This file is part of Cygwin. -dnl -dnl This software is a copyrighted work licensed under the terms of the -dnl Cygwin license. Please consult the file "CYGWIN_LICENSE" for -dnl details. -dnl -dnl Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.12)dnl -AC_INIT(init.cc) -AC_CONFIG_HEADER(config.h) - -INSTALL="/bin/sh "`cd $srcdir/../..; echo $(pwd)/install-sh -c` - -AC_PROG_INSTALL - -dnl FIXME: We temporarily define our own version of AC_PROG_CC. This is -dnl copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We -dnl are probably using a cross compiler, which will not be able to fully -dnl link an executable. This should really be fixed in autoconf -dnl itself. - -AC_DEFUN(LIB_AC_PROG_CC, -[AC_BEFORE([$0], [AC_PROG_CPP])dnl -AC_CHECK_TOOL(CC, gcc, gcc) -if test -z "$CC"; then - AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc) - test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH]) -fi - -AC_PROG_CC_GNU - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -dnl Check whether -g works, even if CFLAGS is set, in case the package -dnl plays around with CFLAGS (such as to build both debugging and -dnl normal versions of a library), tasteless as that idea is. - ac_test_CFLAGS="${CFLAGS+set}" - ac_save_CFLAGS="$CFLAGS" - CFLAGS= - AC_PROG_CC_G - if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" - elif test $ac_cv_prog_cc_g = yes; then - CFLAGS="-gstabs+ -O2" - else - CFLAGS="-O2" - fi -else - GCC= - test "${CFLAGS+set}" = set || CFLAGS="-g" -fi -]) - -AC_DEFUN(LIB_AC_PROG_CXX, -[AC_BEFORE([$0], [AC_PROG_CPP])dnl -AC_CHECK_TOOL(CXX, g++, g++) -if test -z "$CXX"; then - AC_CHECK_PROG(CXX, c++, c++, , , ) - test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH]) -fi - -CXXFLAGS='$(CFLAGS)' -]) - -AC_CANONICAL_SYSTEM - -LIB_AC_PROG_CC -LIB_AC_PROG_CXX - -case "$with_cross_host" in - ""|*cygwin*) - all_host="all_host" - install_host="install_host" - LIBSERVER='$(bupdir)/cygserver/libcygserver.a' - ;; - *) - all_host= - install_host= - LIBSERVER= - ;; -esac - -test -n "$LIBSERVER" && AC_DEFINE(USE_SERVER) - -AC_SUBST(all_host) -AC_SUBST(install_host) - -AC_CHECK_TOOL(AR, ar, ar) -AC_CHECK_TOOL(AS, as, as) -AC_CHECK_TOOL(DLLTOOL, dlltool, dlltool) -AC_CHECK_TOOL(LD, ld, ld) -AC_CHECK_TOOL(NM, nm, nm) -AC_CHECK_TOOL(OBJCOPY, objcopy, objcopy) -AC_CHECK_TOOL(OBJDUMP, objdump, objdump) -AC_CHECK_TOOL(RANLIB, ranlib, ranlib) -AC_CHECK_TOOL(STRIP, strip, strip) -AC_CHECK_TOOL(WINDRES, windres, windres) - -AC_ALLOCA -AC_PROG_MAKE_SET - -dnl check whether gcc supports __builtin_memset. -# Test for builtin mem* functions. -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -AC_TRY_COMPILE([ -#include -void foo(char *s, int c, size_t n) -{ - __builtin_memset(s, c, n); -} -], [ ], -use_builtin_memset=yes, use_builtin_memset=no) -if test $use_builtin_memset = "yes"; then - AC_DEFINE(HAVE_BUILTIN_MEMSET) -fi -AC_LANG_RESTORE - -AC_ARG_ENABLE(debugging, -[ --enable-debugging Build a cygwin DLL which has more consistency checking for debugging], -[case "${enableval}" in -yes) AC_DEFINE(DEBUGGING) ;; -no) ;; -esac -]) - -AC_ARG_ENABLE(server, -[ --enable-server Build a cygwin DLL which can communicate with cygserver], -[case "${enableval}" in -yes) ;; -no) LIBSERVER=;; -esac -]) - -MALLOC_OFILES=malloc.o -AC_ARG_ENABLE(malloc-debugging, -[ --enable-malloc-debugging Build a cygwin DLL with heap sanity checking (this is very slow, use only if you have heap corruption problems)], -[case "${enableval}" in -yes) AC_DEFINE(MALLOC_DEBUG) - MALLOC_OFILES=dlmalloc.o - ;; -no) ;; -esac -]) - -AC_ARG_ENABLE(vfork, -[ --enable-vfork Build a cygwin DLL which uses experimental vfork code], -vfork="${enableval}" -]) - -case "$vfork" in -no) ;; -yes) AC_DEFINE_UNQUOTED(NEWVFORK) ;; -esac - -dnl The only time we might want to transform the install names -dnl is for unix x cygwin. Otherwise we don't. For now we don't -dnl transform names. - -dnl if test "x$cross_compiling" = "xno" -a ; then -dnl if test "x$program_transform_name" = "xs,x,x,"; then -dnl program_transform_name="" -dnl fi -dnl if test "x$program_transform_name" = "x"; then -dnl program_transform_name="s,^,$target_alias-," -dnl else -dnl program_transform_name="$program_transform_name -e s,^,$target_alias-," -dnl fi -dnl fi - -case "$target_cpu" in - i?86) DLL_ENTRY="_dll_entry@12" - DEF_DLL_ENTRY="dll_entry@12" - ALLOCA="_alloca" - CONFIG_DIR="i386" ;; - *) AC_MSG_ERROR(Invalid target processor \"$target_cpu\") ;; -esac - -AC_SUBST(MALLOC_OFILES) -AC_SUBST(LIBSERVER) -AC_SUBST(DLL_ENTRY) -AC_SUBST(DEF_DLL_ENTRY) -AC_SUBST(ALLOCA) -AC_SUBST(CONFIG_DIR) -AC_OUTPUT(Makefile) diff --git a/winsup/cygwin/cpuid.h b/winsup/cygwin/cpuid.h deleted file mode 100644 index 998bbbf91..000000000 --- a/winsup/cygwin/cpuid.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef CPUID_H -#define CPUID_H - -extern inline void -cpuid (unsigned *a, unsigned *b, unsigned *c, unsigned *d, unsigned in) -{ - asm ("cpuid" - : "=a" (*a), - "=b" (*b), - "=c" (*c), - "=d" (*d) - : "a" (in)); -} - -extern inline bool -can_set_flag (unsigned flag) -{ - unsigned r1, r2; - asm("pushfl\n" - "popl %0\n" - "movl %0, %1\n" - "xorl %2, %0\n" - "pushl %0\n" - "popfl\n" - "pushfl\n" - "popl %0\n" - "pushl %1\n" - "popfl\n" - : "=&r" (r1), "=&r" (r2) - : "ir" (flag) - ); - return ((r1 ^ r2) & flag) != 0; -} - -#endif // !CPUID_H diff --git a/winsup/cygwin/crt0.c b/winsup/cygwin/crt0.c deleted file mode 100644 index 1421f6566..000000000 --- a/winsup/cygwin/crt0.c +++ /dev/null @@ -1,55 +0,0 @@ -/* crt0.c. - - Copyright 2001, 2005 Red Hat, Inc. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* In the following ifdef'd i386 code, the FPU precision is set to 80 bits - and all FPU exceptions are masked. The former is needed to make long - doubles work correctly. The latter causes the FPU to generate NaNs and - Infinities instead of signals for certain operations. -*/ - -#ifdef __i386__ -#define FPU_RESERVED 0xF0C0 -#define FPU_DEFAULT 0x033f - -/* For debugging on *#!$@ windbg. bp for breakpoint. */ -int __cygwin_crt0_bp = 0; -#endif - -extern int main (int argc, char **argv); - -void cygwin_crt0 (int (*main) (int, char **)); - -void -mainCRTStartup () -{ -#ifdef __i386__ - (void)__builtin_return_address(1); - asm volatile ("andl $-16,%%esp" ::: "%esp"); - if (__cygwin_crt0_bp) - asm volatile ("int3"); - - { - volatile unsigned short cw; - - /* Get Control Word */ - __asm__ volatile ("fnstcw %0" : "=m" (cw) : ); - - /* mask in */ - cw &= FPU_RESERVED; - cw |= FPU_DEFAULT; - - /* set cw */ - __asm__ volatile ("fldcw %0" :: "m" (cw)); - } -#endif - - cygwin_crt0 (main); -} - -void WinMainCRTStartup(void) __attribute__ ((alias("mainCRTStartup"))); - diff --git a/winsup/cygwin/ctype.cc b/winsup/cygwin/ctype.cc deleted file mode 100644 index b656d3e08..000000000 --- a/winsup/cygwin/ctype.cc +++ /dev/null @@ -1,112 +0,0 @@ -#include "winsup.h" -extern "C" { -#include - -#define _CTYPE_DATA_0_127 \ - _C, _C, _C, _C, _C, _C, _C, _C, \ - _C, _C|_S, _C|_S, _C|_S, _C|_S, _C|_S, _C, _C, \ - _C, _C, _C, _C, _C, _C, _C, _C, \ - _C, _C, _C, _C, _C, _C, _C, _C, \ - _S|_B, _P, _P, _P, _P, _P, _P, _P, \ - _P, _P, _P, _P, _P, _P, _P, _P, \ - _N, _N, _N, _N, _N, _N, _N, _N, \ - _N, _N, _P, _P, _P, _P, _P, _P, \ - _P, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U, \ - _U, _U, _U, _U, _U, _U, _U, _U, \ - _U, _U, _U, _U, _U, _U, _U, _U, \ - _U, _U, _U, _P, _P, _P, _P, _P, \ - _P, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L, \ - _L, _L, _L, _L, _L, _L, _L, _L, \ - _L, _L, _L, _L, _L, _L, _L, _L, \ - _L, _L, _L, _P, _P, _P, _P, _C - -#define _CTYPE_DATA_128_256 \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0 - -char ctype_b[128 + 256] = { - _CTYPE_DATA_128_256, - _CTYPE_DATA_0_127, - _CTYPE_DATA_128_256 -}; - -__asm__ (" \n\ - .data \n\ - .globl __ctype_ \n\ - .set __ctype_,_ctype_b+127 \n\ - .text \n\ -"); - -#define makefunc(x) \ - static int __cdecl \ - c_##x (int c) \ - { \ - return x (c); \ - } \ - EXPORT_ALIAS(c_##x, x) - -makefunc(isalnum) -makefunc(isalpha) -makefunc(iscntrl) -makefunc(isdigit) -makefunc(isgraph) -makefunc(islower) -makefunc(isprint) -makefunc(ispunct) -makefunc(isspace) -makefunc(isupper) -makefunc(isxdigit) -makefunc(tolower) -makefunc(toupper) -makefunc(isblank) -makefunc(isascii) -makefunc(toascii) -} - -/* - * Copyright (c) 1989 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. - */ - diff --git a/winsup/cygwin/cxx.cc b/winsup/cygwin/cxx.cc deleted file mode 100644 index 1cee576f4..000000000 --- a/winsup/cygwin/cxx.cc +++ /dev/null @@ -1,56 +0,0 @@ -/* cxx.cc - - Copyright 2002, 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#if (__GNUC__ >= 3) - -#include "winsup.h" -#include - -void * -operator new (size_t s) -{ - void *p = calloc (1, s); - return p; -} - -void -operator delete (void *p) -{ - free (p); -} - -void * -operator new[] (size_t s) -{ - return ::operator new (s); -} - -void -operator delete[] (void *p) -{ - ::operator delete (p); -} - -extern "C" void -__cxa_pure_virtual (void) -{ - api_fatal ("pure virtual method called"); -} - -extern "C" void -__cxa_guard_acquire () -{ -} - -extern "C" void -__cxa_guard_release () -{ -} -#endif diff --git a/winsup/cygwin/cygerrno.h b/winsup/cygwin/cygerrno.h deleted file mode 100644 index e3b1011ba..000000000 --- a/winsup/cygwin/cygerrno.h +++ /dev/null @@ -1,52 +0,0 @@ -/* cygerrno.h: main Cygwin header file. - - Copyright 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGERRNO_H -#define _CYGERRNO_H -#include - -void __stdcall seterrno_from_win_error (const char *file, int line, DWORD code) __attribute__ ((regparm(3))); -void __stdcall seterrno (const char *, int line) __attribute__ ((regparm(2))); -int __stdcall geterrno_from_win_error (DWORD code = GetLastError (), int deferrno = 13 /*EACCESS*/) __attribute__ ((regparm(2))); - -#define __seterrno() seterrno (__FILE__, __LINE__) -#define __seterrno_from_win_error(val) seterrno_from_win_error (__FILE__, __LINE__, val) -#define __seterrno_from_nt_status(status) \ - ({ \ - DWORD winerr = RtlNtStatusToDosError (status); \ - SetLastError (winerr); \ - __seterrno_from_win_error (winerr); \ - }) - -inline int -__set_errno (const char *fn, int ln, int val) -{ - debug_printf ("%s:%d val %d", fn, ln, val); - return errno = _impure_ptr->_errno = val; -} -#define set_errno(val) __set_errno (__PRETTY_FUNCTION__, __LINE__, (val)) - -#define get_errno() (errno) -extern "C" void __stdcall set_sig_errno (int e); - -class save_errno - { - int saved; - public: - save_errno () {saved = get_errno ();} - save_errno (int what) {saved = get_errno (); set_errno (what); } - void set (int what) {set_errno (what); saved = what;} - void reset () {saved = get_errno ();} - ~save_errno () {set_errno (saved);} - }; - -extern const char *__sp_fn; -extern int __sp_ln; -#endif /*_CYGERRNO_H*/ diff --git a/winsup/cygwin/cygheap.cc b/winsup/cygwin/cygheap.cc deleted file mode 100644 index 0c555e37e..000000000 --- a/winsup/cygwin/cygheap.cc +++ /dev/null @@ -1,436 +0,0 @@ -/* cygheap.cc: Cygwin heap manager. - - Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include "winsup.h" -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "child_info.h" -#include "heap.h" -#include "sync.h" -#include "sigproc.h" -#include "pinfo.h" -#include - -init_cygheap NO_COPY *cygheap; -void NO_COPY *cygheap_max; - -extern "C" char _cygheap_mid[] __attribute__((section(".cygheap"))); -extern "C" char _cygheap_end[]; - -static NO_COPY muto cygheap_protect; - -struct cygheap_entry - { - int type; - struct cygheap_entry *next; - char data[0]; - }; - -#define NBUCKETS (sizeof (cygheap->buckets) / sizeof (cygheap->buckets[0])) -#define N0 ((_cmalloc_entry *) NULL) -#define to_cmalloc(s) ((_cmalloc_entry *) (((char *) (s)) - (unsigned) (N0->data))) - -#define CFMAP_OPTIONS (SEC_RESERVE | PAGE_READWRITE) -#define MVMAP_OPTIONS (FILE_MAP_WRITE) - -extern "C" { -static void __stdcall _cfree (void *) __attribute__((regparm(1))); -static void *__stdcall _csbrk (int); -} - -/* Called by fork or spawn to reallocate cygwin heap */ -void __stdcall -cygheap_fixup_in_child (bool execed) -{ - cygheap_max = child_proc_info->cygheap; - cygheap = (init_cygheap *) cygheap_max; - _csbrk ((char *) child_proc_info->cygheap_max - (char *) cygheap); - child_copy (child_proc_info->parent, false, "cygheap", cygheap, cygheap_max, NULL); - cygheap_init (); - debug_fixup_after_fork_exec (); - - /* Need to do this after debug_fixup_after_fork_exec or DEBUGGING handling of - handles might get confused. */ - if (execed) - { - CloseHandle (child_proc_info->parent); - child_proc_info->parent = NULL; - } - - if (execed) - { - cygheap->hooks.next = NULL; - cygheap->user_heap.base = NULL; /* We can allocate the heap anywhere */ - /* Walk the allocated memory chain looking for orphaned memory from - previous execs */ - for (_cmalloc_entry *rvc = cygheap->chain; rvc; rvc = rvc->prev) - { - cygheap_entry *ce = (cygheap_entry *) rvc->data; - if (!rvc->ptr || rvc->b >= NBUCKETS || ce->type <= HEAP_1_START) - continue; - else if (ce->type < HEAP_1_MAX) - ce->type += HEAP_1_MAX; /* Mark for freeing after next exec */ - else - _cfree (ce); /* Marked by parent for freeing in child */ - } - } -} - -int -init_cygheap::manage_console_count (const char *something, int amount, bool avoid_freeing_console) -{ - if (console_count == 0 && amount > 0) - init_console_handler (true); - console_count += amount; - debug_printf ("%s: console_count %d, amount %d, %s, avoid_freeing_console %d", - something, console_count, amount, myctty (), avoid_freeing_console); - if (!avoid_freeing_console && amount <= 0 && !console_count && myself->ctty == -1) - { - BOOL res = FreeConsole (); - debug_printf ("freed console, res %d", res); - init_console_handler (false); - } - return console_count; -} - -void -init_cygheap::close_ctty () -{ - debug_printf ("closing cygheap->ctty %p", cygheap->ctty); -#ifdef NEWVFORK - int usecount = cygheap->ctty->usecount; -#endif - cygheap->ctty->close (); -#ifndef NEWVFORK - cygheap->ctty = NULL; -#else // FIXME: This code ain't right - if (cygheap->ctty_on_hold == cygheap->ctty) - cygheap->ctty_on_hold = NULL; - if (usecount == 1) - { - cygheap->ctty = NULL; - debug_printf ("setting cygheap->ctty to NULL"); - } -#endif -} - -#define nextpage(x) ((char *) (((DWORD) ((char *) x + granmask)) & ~granmask)) -#define allocsize(x) ((DWORD) nextpage (x)) -#ifdef DEBUGGING -#define somekinda_printf debug_printf -#else -#define somekinda_printf malloc_printf -#endif - -static void *__stdcall -_csbrk (int sbs) -{ - void *prebrk = cygheap_max; - size_t granmask = getpagesize () - 1; - char *newbase = nextpage (prebrk); - cygheap_max = (char *) cygheap_max + sbs; - if (!sbs || (newbase > cygheap_max) || (cygheap_max < _cygheap_end)) - /* nothing to do */; - else - { - if (prebrk <= _cygheap_end) - newbase = _cygheap_end; - - DWORD adjsbs = allocsize ((char *) cygheap_max - newbase); - if (!VirtualAlloc (newbase, adjsbs, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE)) - { - MEMORY_BASIC_INFORMATION m; - if (!VirtualQuery (newbase, &m, sizeof m)) - system_printf ("couldn't get memory info, %E"); - somekinda_printf ("Couldn't reserve/commit %d bytes of space for cygwin's heap, %E", - adjsbs); - somekinda_printf ("AllocationBase %p, BaseAddress %p, RegionSize %p, State %p\n", - m.AllocationBase, m.BaseAddress, m.RegionSize, m.State); - __seterrno (); - cygheap_max = (char *) cygheap_max - sbs; - return NULL; - } - } - - return prebrk; -} - -extern "C" void __stdcall -cygheap_init () -{ - cygheap_protect.init ("cygheap_protect"); - if (!cygheap) - { - cygheap = (init_cygheap *) memset (_cygheap_start, 0, _cygheap_mid - _cygheap_start); - cygheap_max = cygheap; - _csbrk (sizeof (*cygheap)); - } - if (!cygheap->fdtab) - cygheap->fdtab.init (); - if (!cygheap->sigs) - sigalloc (); - - if (!cygheap->shared_prefix) - cygheap->shared_prefix = cstrdup ( - wincap.has_terminal_services () - && (set_privilege (hProcToken, SE_CREATE_GLOBAL_PRIV, true) >= 0 - || GetLastError () == ERROR_NO_SUCH_PRIVILEGE) - ? "Global\\" : ""); -} - -/* Copyright (C) 1997, 2000 DJ Delorie */ - -static void *_cmalloc (unsigned size) __attribute ((regparm(1))); -static void *__stdcall _crealloc (void *ptr, unsigned size) __attribute ((regparm(2))); - -static void *__stdcall -_cmalloc (unsigned size) -{ - _cmalloc_entry *rvc; - unsigned b, sz; - - /* Calculate "bit bucket" and size as a power of two. */ - for (b = 3, sz = 8; sz && sz < size; b++, sz <<= 1) - continue; - - cygheap_protect.acquire (); - if (cygheap->buckets[b]) - { - rvc = (_cmalloc_entry *) cygheap->buckets[b]; - cygheap->buckets[b] = rvc->ptr; - rvc->b = b; - } - else - { - rvc = (_cmalloc_entry *) _csbrk (sz + sizeof (_cmalloc_entry)); - if (!rvc) - { - cygheap_protect.release (); - return NULL; - } - - rvc->b = b; - rvc->prev = cygheap->chain; - cygheap->chain = rvc; - } - cygheap_protect.release (); - return rvc->data; -} - -static void __stdcall -_cfree (void *ptr) -{ - cygheap_protect.acquire (); - _cmalloc_entry *rvc = to_cmalloc (ptr); - DWORD b = rvc->b; - rvc->ptr = cygheap->buckets[b]; - cygheap->buckets[b] = (char *) rvc; - cygheap_protect.release (); -} - -static void *__stdcall -_crealloc (void *ptr, unsigned size) -{ - void *newptr; - if (ptr == NULL) - newptr = _cmalloc (size); - else - { - unsigned oldsize = 1 << to_cmalloc (ptr)->b; - if (size <= oldsize) - return ptr; - newptr = _cmalloc (size); - memcpy (newptr, ptr, oldsize); - _cfree (ptr); - } - return newptr; -} - -/* End Copyright (C) 1997 DJ Delorie */ - -#define sizeof_cygheap(n) ((n) + sizeof (cygheap_entry)) - -#define N ((cygheap_entry *) NULL) -#define tocygheap(s) ((cygheap_entry *) (((char *) (s)) - (int) (N->data))) - -inline static void * -creturn (cygheap_types x, cygheap_entry * c, unsigned len) -{ - if (!c) - { - set_errno (ENOMEM); - return NULL; - } - c->type = x; - char *cend = ((char *) c + sizeof (*c) + len); - if (cygheap_max < cend) - cygheap_max = cend; - MALLOC_CHECK; - return (void *) c->data; -} - -extern "C" void *__stdcall -cmalloc (cygheap_types x, DWORD n) -{ - cygheap_entry *c; - MALLOC_CHECK; - c = (cygheap_entry *) _cmalloc (sizeof_cygheap (n)); - if (!c) - { -#ifdef DEBUGGING - system_printf ("cmalloc returned NULL"); - try_to_debug (); -#endif - } - return creturn (x, c, n); -} - -extern "C" void *__stdcall -crealloc (void *s, DWORD n) -{ - MALLOC_CHECK; - if (s == NULL) - return cmalloc (HEAP_STR, n); // kludge - - assert (!inheap (s)); - cygheap_entry *c = tocygheap (s); - cygheap_types t = (cygheap_types) c->type; - c = (cygheap_entry *) _crealloc (c, sizeof_cygheap (n)); -#ifdef DEBUGGING - if (!c) - system_printf ("crealloc returned NULL"); -#endif - return creturn (t, c, n); -} - -extern "C" void __stdcall -cfree (void *s) -{ - assert (!inheap (s)); - _cfree (tocygheap (s)); - MALLOC_CHECK; -} - -extern "C" void __stdcall -cfree_and_set (char *&s, char *what) -{ - if (s && s != almost_null) - cfree (s); - s = what; -} - -extern "C" void *__stdcall -ccalloc (cygheap_types x, DWORD n, DWORD size) -{ - cygheap_entry *c; - MALLOC_CHECK; - n *= size; - c = (cygheap_entry *) _cmalloc (sizeof_cygheap (n)); - if (c) - memset (c->data, 0, n); -#ifdef DEBUGGING - if (!c) - system_printf ("ccalloc returned NULL"); -#endif - return creturn (x, c, n); -} - -extern "C" char *__stdcall -cstrdup (const char *s) -{ - MALLOC_CHECK; - char *p = (char *) cmalloc (HEAP_STR, strlen (s) + 1); - if (!p) - return NULL; - strcpy (p, s); - MALLOC_CHECK; - return p; -} - -extern "C" char *__stdcall -cstrdup1 (const char *s) -{ - MALLOC_CHECK; - char *p = (char *) cmalloc (HEAP_1_STR, strlen (s) + 1); - if (!p) - return NULL; - strcpy (p, s); - MALLOC_CHECK; - return p; -} - -void -cygheap_root::set (const char *posix, const char *native) -{ - if (*posix == '/' && posix[1] == '\0') - { - if (m) - { - cfree (m); - m = NULL; - } - return; - } - if (!m) - m = (struct cygheap_root_mount_info *) ccalloc (HEAP_MOUNT, 1, sizeof (*m)); - strcpy (m->posix_path, posix); - m->posix_pathlen = strlen (posix); - if (m->posix_pathlen >= 1 && m->posix_path[m->posix_pathlen - 1] == '/') - m->posix_path[--m->posix_pathlen] = '\0'; - - strcpy (m->native_path, native); - m->native_pathlen = strlen (native); - if (m->native_pathlen >= 1 && m->native_path[m->native_pathlen - 1] == '\\') - m->native_path[--m->native_pathlen] = '\0'; -} - -cygheap_user::~cygheap_user () -{ -#if 0 - if (pname) - cfree (pname); - if (plogsrv) - cfree (plogsrv - 2); - if (pdomain) - cfree (pdomain); - if (psid) - cfree (psid); -#endif -} - -void -cygheap_user::set_name (const char *new_name) -{ - bool allocated = !!pname; - - if (allocated) - { - if (strcasematch (new_name, pname)) - return; - cfree (pname); - } - - pname = cstrdup (new_name ? new_name : ""); - if (!allocated) - return; /* Initializing. Don't bother with other stuff. */ - - cfree_and_set (homedrive); - cfree_and_set (homepath); - cfree_and_set (plogsrv); - cfree_and_set (pdomain); - cfree_and_set (pwinname); -} diff --git a/winsup/cygwin/cygheap.h b/winsup/cygwin/cygheap.h deleted file mode 100644 index 100d8d92d..000000000 --- a/winsup/cygwin/cygheap.h +++ /dev/null @@ -1,435 +0,0 @@ -/* cygheap.h: Cygwin heap manager. - - Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "hires.h" - -#undef cfree - -enum cygheap_types -{ - HEAP_FHANDLER, - HEAP_STR, - HEAP_ARGV, - HEAP_BUF, - HEAP_MOUNT, - HEAP_SIGS, - HEAP_ARCHETYPES, - HEAP_TLS, - HEAP_COMMUNE, - HEAP_1_START, - HEAP_1_HOOK, - HEAP_1_STR, - HEAP_1_ARGV, - HEAP_1_BUF, - HEAP_1_EXEC, - HEAP_1_MAX = 100, - HEAP_MMAP = 200 -}; - -#define incygheap(s) (cygheap && ((char *) (s) >= (char *) cygheap) && ((char *) (s) <= ((char *) cygheap_max))) - -struct _cmalloc_entry -{ - union - { - DWORD b; - char *ptr; - }; - struct _cmalloc_entry *prev; - char data[0]; -}; - -struct cygheap_root_mount_info -{ - char posix_path[CYG_MAX_PATH]; - unsigned posix_pathlen; - char native_path[CYG_MAX_PATH]; - unsigned native_pathlen; -}; - -/* CGF: FIXME This doesn't belong here */ - -class cygheap_root -{ - /* Root directory information. - This is used after a chroot is called. */ - struct cygheap_root_mount_info *m; - -public: - bool posix_ok (const char *path) - { - if (!m) - return 1; - return path_prefix_p (m->posix_path, path, m->posix_pathlen); - } - bool ischroot_native (const char *path) - { - if (!m) - return 1; - return strncasematch (m->native_path, path, m->native_pathlen) - && (path[m->native_pathlen] == '\\' || !path[m->native_pathlen]); - } - const char *unchroot (const char *path) - { - if (!m) - return path; - const char *p = path + m->posix_pathlen; - if (!*p) - p = "/"; - return p; - } - bool exists () {return !!m;} - void set (const char *, const char *); - size_t posix_length () const { return m->posix_pathlen; } - const char *posix_path () const { return m->posix_path; } - size_t native_length () const { return m->native_pathlen; } - const char *native_path () const { return m->native_path; } -}; - -enum homebodies -{ - CH_HOMEDRIVE, - CH_HOMEPATH, - CH_HOME -}; - -class cygheap_user -{ - /* Extendend user information. - The information is derived from the internal_getlogin call - when on a NT system. */ - char *pname; /* user's name */ - char *plogsrv; /* Logon server, may be FQDN */ - char *pdomain; /* Logon domain of the user */ - char *homedrive; /* User's home drive */ - char *homepath; /* User's home path */ - char *psystemroot; /* Value of SYSTEMROOT */ - char *pwinname; /* User's name as far as Windows knows it */ - char *puserprof; /* User profile */ - cygsid effec_cygsid; /* buffer for user's SID */ - cygsid saved_cygsid; /* Remains intact even after impersonation */ -public: - __uid32_t saved_uid; /* Remains intact even after impersonation */ - __gid32_t saved_gid; /* Ditto */ - __uid32_t real_uid; /* Remains intact on seteuid, replaced by setuid */ - __gid32_t real_gid; /* Ditto */ - user_groups groups; /* Primary and supp SIDs */ - - /* token is needed if set(e)uid should be called. It can be set by a call - to `set_impersonation_token()'. */ - HANDLE external_token; - HANDLE internal_token; - HANDLE curr_primary_token; - HANDLE current_token; - - /* CGF 2002-06-27. I removed the initializaton from this constructor - since this class is always allocated statically. That means that everything - is zero anyway so there is no need to initialize it to zero. Since the - token initialization is always handled during process startup as well, - I've removed the constructor entirely. Please reinstate this if this - situation ever changes. - cygheap_user () : pname (NULL), plogsrv (NULL), pdomain (NULL), - homedrive (NULL), homepath (NULL), - token (INVALID_HANDLE_VALUE) {} - */ - - ~cygheap_user (); - - void init (); - void set_name (const char *new_name); - const char *name () const { return pname; } - - const char *env_logsrv (const char *, size_t); - const char *env_homepath (const char *, size_t); - const char *env_homedrive (const char *, size_t); - const char *env_userprofile (const char *, size_t); - const char *env_domain (const char *, size_t); - const char *env_name (const char *, size_t); - const char *env_systemroot (const char *, size_t); - - const char *logsrv () - { - const char *p = env_logsrv ("LOGONSERVER=", sizeof ("LOGONSERVER=") - 1); - return (p == almost_null) ? NULL : p; - } - const char *winname () - { - const char *p = env_name ("USERNAME=", sizeof ("USERNAME=") - 1); - return (p == almost_null) ? NULL : p; - } - const char *domain () - { - const char *p = env_domain ("USERDOMAIN=", sizeof ("USERDOMAIN=") - 1); - return (p == almost_null) ? NULL : p; - } - BOOL set_sid (PSID new_sid) {return (BOOL) (effec_cygsid = new_sid);} - BOOL set_saved_sid () { return (BOOL) (saved_cygsid = effec_cygsid); } - PSID sid () { return effec_cygsid; } - PSID saved_sid () { return saved_cygsid; } - const char *ontherange (homebodies what, struct passwd * = NULL); -#define NO_IMPERSONATION NULL - bool issetuid () const { return current_token != NO_IMPERSONATION; } - HANDLE primary_token () { return curr_primary_token; } - HANDLE token () { return current_token; } - void deimpersonate () - { - if (issetuid ()) - { - RevertToSelf (); - ImpersonateLoggedOnUser (hProcImpToken); - } - } - bool reimpersonate () - { - return ImpersonateLoggedOnUser (issetuid () ? token () : hProcImpToken); - } - bool has_impersonation_tokens () - { return external_token != NO_IMPERSONATION - || internal_token != NO_IMPERSONATION - || curr_primary_token != NO_IMPERSONATION; } - void close_impersonation_tokens () - { - if (current_token != NO_IMPERSONATION) - CloseHandle (current_token); - if (curr_primary_token != NO_IMPERSONATION - && curr_primary_token != external_token - && curr_primary_token != internal_token) - CloseHandle (curr_primary_token); - if (external_token != NO_IMPERSONATION) - CloseHandle (external_token); - if (internal_token != NO_IMPERSONATION) - CloseHandle (internal_token); - } - char * get_windows_id (char * buf) - { - if (wincap.is_winnt ()) - return effec_cygsid.string (buf); - else - return strcpy (buf, name ()); - } - - const char *cygheap_user::test_uid (char *&, const char *, size_t) - __attribute__ ((regparm (3))); -}; - -/* cwd cache stuff. */ - -class muto; - -struct cwdstuff -{ - char *posix; - char *win32; - DWORD hash; - DWORD drive_length; - static muto cwd_lock; - char *get (char *, int = 1, int = 0, unsigned = CYG_MAX_PATH); - DWORD get_hash (); - DWORD get_drive (char * dst) - { - get_initial (); - memcpy (dst, win32, drive_length); - cwd_lock.release (); - return drive_length; - } - void init (); - void fixup_after_exec (char *, char *, DWORD); - bool get_initial (); - int set (const char *, const char *, bool); -}; - -#ifdef DEBUGGING -struct cygheap_debug -{ - handle_list starth; - handle_list *endh; - handle_list freeh[500]; -}; -#endif - -struct user_heap_info -{ - void *base; - void *ptr; - void *top; - void *max; - unsigned chunk; -}; - -struct hook_chain -{ - void **loc; - const void *func; - struct hook_chain *next; -}; - -struct init_cygheap -{ - _cmalloc_entry *chain; - char *buckets[32]; - cygheap_root root; - cygheap_user user; - user_heap_info user_heap; - mode_t umask; - HANDLE shared_h; - HANDLE console_h; - HANDLE mt_h; - cwdstuff cwd; - dtable fdtab; - LUID luid[SE_NUM_PRIVS]; - const char *shared_prefix; -#ifdef DEBUGGING - cygheap_debug debug; -#endif - struct sigaction *sigs; - - fhandler_tty_slave *ctty; /* Current tty */ -#ifdef NEWVFORK - fhandler_tty_slave *ctty_on_hold; -#endif - struct _cygtls **threadlist; - size_t sthreads; - pid_t pid; /* my pid */ - HANDLE pid_handle; /* handle for my pid */ - hook_chain hooks; - void close_ctty (); - int manage_console_count (const char *, int, bool = false) __attribute__ ((regparm (3))); -private: - int console_count; -}; - - -#define _CYGHEAPSIZE_SLOP (128 * 1024) -#define CYGHEAPSIZE (sizeof (init_cygheap) + (20000 * sizeof (fhandler_union)) + _CYGHEAPSIZE_SLOP) -#define CYGHEAPSIZE_MIN (sizeof (init_cygheap) + (10000 * sizeof (fhandler_union))) - -extern init_cygheap *cygheap; -extern void *cygheap_max; - -class cygheap_fdmanip -{ - protected: - int fd; - fhandler_base **fh; - bool locked; - public: - cygheap_fdmanip (): fh (NULL) {} - virtual ~cygheap_fdmanip () - { - if (locked) - cygheap->fdtab.unlock (); - } - void release () - { - cygheap->fdtab.release (fd); - } - operator int &() {return fd;} - operator fhandler_base* &() {return *fh;} - operator fhandler_socket* () const {return reinterpret_cast (*fh);} - operator fhandler_pipe* () const {return reinterpret_cast (*fh);} - void operator = (fhandler_base *fh) {*this->fh = fh;} - fhandler_base *operator -> () const {return *fh;} - bool isopen () const - { - if (*fh) - return true; - set_errno (EBADF); - return false; - } -}; - -class cygheap_fdnew : public cygheap_fdmanip -{ - public: - cygheap_fdnew (int seed_fd = -1, bool lockit = true) - { - if (lockit) - cygheap->fdtab.lock (); - if (seed_fd < 0) - fd = cygheap->fdtab.find_unused_handle (); - else - fd = cygheap->fdtab.find_unused_handle (seed_fd + 1); - if (fd >= 0) - { - locked = lockit; - fh = cygheap->fdtab + fd; - } - else - { - set_errno (EMFILE); - if (lockit) - cygheap->fdtab.unlock (); - locked = false; - } - } - void operator = (fhandler_base *fh) {*this->fh = fh;} -}; - -class cygheap_fdget : public cygheap_fdmanip -{ - public: - cygheap_fdget (int fd, bool lockit = false, bool do_set_errno = true) - { - if (lockit) - cygheap->fdtab.lock (); - if (fd >= 0 && fd < (int) cygheap->fdtab.size - && *(fh = cygheap->fdtab + fd) != NULL) - { - this->fd = fd; - locked = lockit; - } - else - { - this->fd = -1; - if (do_set_errno) - set_errno (EBADF); - if (lockit) - cygheap->fdtab.unlock (); - locked = false; - } - } -}; - -class cygheap_fdenum : public cygheap_fdmanip -{ - public: - cygheap_fdenum (bool lockit = false) - { - locked = lockit; - if (lockit) - cygheap->fdtab.lock (); - fd = -1; - } - int next () - { - while (++fd < (int) cygheap->fdtab.size) - if (*(fh = cygheap->fdtab + fd) != NULL) - return fd; - return -1; - } - void rewind () - { - fd = -1; - } -}; - -class child_info; -void __stdcall cygheap_fixup_in_child (bool); -extern "C" { -void __stdcall cfree (void *) __attribute__ ((regparm(1))); -void *__stdcall cmalloc (cygheap_types, DWORD) __attribute__ ((regparm(2))); -void *__stdcall crealloc (void *, DWORD) __attribute__ ((regparm(2))); -void *__stdcall ccalloc (cygheap_types, DWORD, DWORD) __attribute__ ((regparm(3))); -char *__stdcall cstrdup (const char *) __attribute__ ((regparm(1))); -char *__stdcall cstrdup1 (const char *) __attribute__ ((regparm(1))); -void __stdcall cfree_and_set (char *&, char * = NULL) __attribute__ ((regparm(2))); -void __stdcall cygheap_init (); -extern char _cygheap_start[] __attribute__((section(".idata"))); -} diff --git a/winsup/cygwin/cygmagic b/winsup/cygwin/cygmagic deleted file mode 100755 index a8ccc8c76..000000000 --- a/winsup/cygwin/cygmagic +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh -# cygmagic - Generate "magic numbers" from a structure. -# -# Copyright 2001, 2002 Red Hat, Inc. -# -# This file is part of Cygwin. -# -# This software is a copyrighted work licensed under the terms of the -# Cygwin license. Please consult the file "CYGWIN_LICENSE" for -# details. - -file_magic=$1; shift -gcc=$1; shift -file=$1; shift -trap "rm -f /tmp/$$.magic" 0 1 2 15 -cat < $file_magic -/* autogenerated - do not edit */ -#include "$file" -EOF -sumit() { - cksum $* -} - -while [ -n "$1" ]; do - define=$1; shift - struct=$1; shift - sum=`$gcc -E $file | sed -n "/^$struct/,/^};/p" | sed -e 's/[ ]//g' -e '/^$/d' | sumit | awk '{printf "0x%xU", $1}'` - echo "#define $define $sum" - curr=`sed -n "s/^#[ ]*define CURR_$define[ ][ ]*\([^ ][^ ]*\)/\1/p" $file` - [ "$curr" != "$sum" ] && echo "*** WARNING WARNING WARNING WARNING WARNING *** -*** $file: magic number for $define changed old $curr != new $sum -*** WARNING WARNING WARNING WARNING WARNING ***" 1>&2 -done >> $file_magic -exit 0 diff --git a/winsup/cygwin/cygmalloc.h b/winsup/cygwin/cygmalloc.h deleted file mode 100644 index eeb7ff178..000000000 --- a/winsup/cygwin/cygmalloc.h +++ /dev/null @@ -1,34 +0,0 @@ -/* cygmalloc.h: cygwin DLL malloc stuff - - Copyright 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifdef __cplusplus -extern "C" { -#endif -void dlfree (void *p) __attribute__ ((regparm (1))); -void *dlmalloc (unsigned size) __attribute__ ((regparm (1))); -void *dlrealloc (void *p, unsigned size) __attribute__ ((regparm (2))); -void *dlcalloc (size_t nmemb, size_t size) __attribute__ ((regparm (2))); -void *dlmemalign (size_t alignment, size_t bytes) __attribute__ ((regparm (2))); -void *dlvalloc (size_t bytes) __attribute__ ((regparm (1))); -size_t dlmalloc_usable_size (void *p) __attribute__ ((regparm (1))); -int dlmalloc_trim (size_t) __attribute__ ((regparm (1))); -int dlmallopt (int p, int v) __attribute__ ((regparm (2))); -void dlmalloc_stats (); - -#ifndef __INSIDE_CYGWIN__ -# define USE_DL_PREFIX 1 -#else -# define __malloc_lock() mallock.acquire () -# define __malloc_unlock() mallock.release () -extern muto mallock; -#endif -#ifdef __cplusplus -} -#endif diff --git a/winsup/cygwin/cygserver.h b/winsup/cygwin/cygserver.h deleted file mode 100644 index 09ab78a9f..000000000 --- a/winsup/cygwin/cygserver.h +++ /dev/null @@ -1,190 +0,0 @@ -/* cygserver.h - - Copyright 2001, 2002, 2003, 2004 Red Hat Inc. - - Written by Egor Duda - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGSERVER_H_ -#define _CYGSERVER_H_ - -#ifdef __GNUC__ -#define CYGSERVER_PACKED __attribute__ ((packed)) -#else -#define CYGSERVER_PACKED -#endif - -#define CYGWIN_SERVER_VERSION_MAJOR 1 -#define CYGWIN_SERVER_VERSION_API 3 -#define CYGWIN_SERVER_VERSION_MINOR 0 -#define CYGWIN_SERVER_VERSION_PATCH 0 - -typedef enum { - CYGSERVER_UNKNOWN = 0, - CYGSERVER_OK, - CYGSERVER_UNAVAIL -} cygserver_states; - -/*---------------------------------------------------------------------------* - * class client_request - *---------------------------------------------------------------------------*/ - -class transport_layer_base; - -#ifndef __INSIDE_CYGWIN__ -class process_cache; -#endif - -class client_request -{ -protected: - typedef enum { - CYGSERVER_REQUEST_INVALID, - CYGSERVER_REQUEST_GET_VERSION, - CYGSERVER_REQUEST_SHUTDOWN, - CYGSERVER_REQUEST_ATTACH_TTY, - CYGSERVER_REQUEST_MSG, - CYGSERVER_REQUEST_SEM, - CYGSERVER_REQUEST_SHM, - CYGSERVER_REQUEST_LAST - } request_code_t; - - struct header_t - { - size_t msglen; - union - { - request_code_t request_code; - ssize_t error_code; - }; - - header_t () {}; - header_t (request_code_t, size_t); - } CYGSERVER_PACKED; - -public: -#ifndef __INSIDE_CYGWIN__ - static void handle_request (transport_layer_base *, process_cache *); -#endif - - client_request (request_code_t request_code, - void *buf = NULL, - size_t bufsiz = 0); - virtual ~client_request (); - - request_code_t request_code () const { return _header.request_code; } - - ssize_t error_code () const { return _header.error_code; }; - void error_code (ssize_t error_code) { _header.error_code = error_code; }; - - size_t msglen () const { return _header.msglen; }; - void msglen (size_t len) { _header.msglen = len; }; - - int make_request (); - -protected: - virtual void send (transport_layer_base *); - -private: - header_t _header; - void * const _buf; - const size_t _buflen; - -#ifndef __INSIDE_CYGWIN__ - void handle (transport_layer_base *, process_cache *); - virtual void serve (transport_layer_base *, process_cache *) = 0; -#endif -}; - -/*---------------------------------------------------------------------------* - * class client_request_get_version - *---------------------------------------------------------------------------*/ - -class client_request_get_version : public client_request -{ -private: - struct request_get_version - { - DWORD major, api, minor, patch; - } CYGSERVER_PACKED; - -public: - client_request_get_version (); - bool check_version () const; - -private: - struct request_get_version version; - -#ifndef __INSIDE_CYGWIN__ - virtual void serve (transport_layer_base *, process_cache *); -#endif -}; - -/*---------------------------------------------------------------------------* - * class client_request_shutdown - * - * Nb. This whole class is only !__INSIDE_CYGWIN__ since it is used - * solely by cygserver itself. - *---------------------------------------------------------------------------*/ - -#ifndef __INSIDE_CYGWIN__ - -class client_request_shutdown : public client_request -{ -public: - client_request_shutdown (); - -private: - virtual void serve (transport_layer_base *, process_cache *); -}; - -#endif /* !__INSIDE_CYGWIN__ */ - -/*---------------------------------------------------------------------------* - * class client_request_attach_tty - *---------------------------------------------------------------------------*/ - -class client_request_attach_tty : public client_request -{ -private: - struct request_attach_tty - { - DWORD pid, master_pid; - HANDLE from_master, to_master; - } CYGSERVER_PACKED; - -public: -#ifdef __INSIDE_CYGWIN__ - client_request_attach_tty (DWORD nmaster_pid, - HANDLE nfrom_master, HANDLE nto_master); -#else - client_request_attach_tty (); -#endif - - HANDLE from_master () const { return req.from_master; }; - HANDLE to_master () const { return req.to_master; }; - -protected: - virtual void send (transport_layer_base *); - -private: - struct request_attach_tty req; - -#ifndef __INSIDE_CYGWIN__ - virtual void serve (transport_layer_base *, process_cache *); -#endif -}; - -#ifndef __INSIDE_CYGWIN__ -extern PSID admininstrator_group_sid; -#endif - -extern bool check_cygserver_available (); -extern void cygserver_init (); - -#endif /* _CYGSERVER_H_ */ diff --git a/winsup/cygwin/cygserver_ipc.h b/winsup/cygwin/cygserver_ipc.h deleted file mode 100644 index d25a3bdeb..000000000 --- a/winsup/cygwin/cygserver_ipc.h +++ /dev/null @@ -1,84 +0,0 @@ -/* cygserver_ipc.h - - Copyright 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef __CYGSERVER_IPC_H__ -#define __CYGSERVER_IPC_H__ - -/* - * Datastructure which is part of any IPC input parameter block. - */ -struct vmspace { - void *vm_map; /* UNUSED */ - struct shmmap_state *vm_shm; -}; - -struct proc { - pid_t cygpid; - DWORD winpid; - __uid32_t uid; - __gid32_t gid; - int gidcnt; - __gid32_t *gidlist; - bool is_admin; - struct vmspace *p_vmspace; - HANDLE signal_arrived; -}; - -#ifdef __INSIDE_CYGWIN__ -inline void -ipc_set_proc_info (proc &blk) -{ - blk.cygpid = getpid (); - blk.winpid = GetCurrentProcessId (); - blk.uid = geteuid32 (); - blk.gid = getegid32 (); - blk.gidcnt = 0; - blk.gidlist = NULL; - blk.is_admin = false; - blk.signal_arrived = signal_arrived; -} -#endif /* __INSIDE_CYGWIN__ */ - -#ifndef __INSIDE_CYGWIN__ -class ipc_retval { -private: - union { - int i; - unsigned int u; - vm_offset_t off; - vm_object_t obj; - }; - -public: - ipc_retval (int ni) { i = ni; } - - operator int () const { return i; } - int operator = (int ni) { return i = ni; } - - operator unsigned int () const { return u; } - unsigned int operator = (unsigned int nu) { return u = nu; } - - operator vm_offset_t () const { return off; } - vm_offset_t operator = (vm_offset_t noff) { return off = noff; } - - operator vm_object_t () const { return obj; } - vm_object_t operator = (vm_object_t nobj) { return obj = nobj; } -}; - -struct thread { - class process *client; - proc *ipcblk; - ipc_retval td_retval[2]; -}; -#define td_proc ipcblk -#define p_pid cygpid -#endif - -#endif /* __CYGSERVER_IPC_H__ */ diff --git a/winsup/cygwin/cygserver_msg.h b/winsup/cygwin/cygserver_msg.h deleted file mode 100644 index 7fbb12cab..000000000 --- a/winsup/cygwin/cygserver_msg.h +++ /dev/null @@ -1,91 +0,0 @@ -/* cygserver_msg.h: Single unix specification IPC interface for Cygwin. - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef __CYGSERVER_MSG_H__ -#define __CYGSERVER_MSG_H__ - -#include -#include -#ifndef _KERNEL -#define _KERNEL 1 -#endif -#include - -#include "cygserver.h" -#include "cygserver_ipc.h" - -#ifndef __INSIDE_CYGWIN__ -class transport_layer_base; -class process_cache; -#endif - -class client_request_msg : public client_request -{ - friend class client_request; - -public: - enum msgop_t - { - MSGOP_msgctl, - MSGOP_msgget, - MSGOP_msgrcv, - MSGOP_msgsnd - }; - -private: - union - { - struct - { - msgop_t msgop; - proc ipcblk; - union - { - struct msgctl_args ctlargs; - struct msgget_args getargs; - struct msgrcv_args rcvargs; - struct msgsnd_args sndargs; - }; - } in; - - union { - int ret; - ssize_t rcv; - } out; - } _parameters; - -#ifndef __INSIDE_CYGWIN__ - client_request_msg (); - virtual void serve (transport_layer_base *, process_cache *); -#endif - -public: - -#ifdef __INSIDE_CYGWIN__ - client_request_msg (int, int, struct msqid_ds *); // msgctl - client_request_msg (key_t, int); // msgget - client_request_msg (int, void *, size_t, long, int); // msgrcv - client_request_msg (int, const void *, size_t, int); // msgsnd -#endif - - int retval () const { return _parameters.out.ret; } - ssize_t rcvval () const { return _parameters.out.rcv; } -}; - -#ifndef __INSIDE_CYGWIN__ -int msginit (); -int msgunload (); -int msgctl (struct thread *, struct msgctl_args *); -int msgget (struct thread *, struct msgget_args *); -int msgsnd (struct thread *, struct msgsnd_args *); -int msgrcv (struct thread *, struct msgrcv_args *); -#endif - -#endif /* __CYGSERVER_MSG_H__ */ diff --git a/winsup/cygwin/cygserver_sem.h b/winsup/cygwin/cygserver_sem.h deleted file mode 100644 index 225d8f215..000000000 --- a/winsup/cygwin/cygserver_sem.h +++ /dev/null @@ -1,87 +0,0 @@ -/* cygserver_sem.h: Single unix specification IPC interface for Cygwin. - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef __CYGSERVER_SEM_H__ -#define __CYGSERVER_SEM_H__ - -#include -#include -#ifndef _KERNEL -#define _KERNEL 1 -#endif -#include - -#include "cygserver.h" -#include "cygserver_ipc.h" - -#ifndef __INSIDE_CYGWIN__ -class transport_layer_base; -class process_cache; -#endif - -class client_request_sem : public client_request -{ - friend class client_request; - -public: - enum semop_t - { - SEMOP_semctl, - SEMOP_semget, - SEMOP_semop - }; - -private: - union - { - struct - { - semop_t semop; - proc ipcblk; - union - { - struct semctl_args ctlargs; - struct semget_args getargs; - struct semop_args opargs; - }; - } in; - - union { - int ret; - } out; - } _parameters; - -#ifndef __INSIDE_CYGWIN__ - client_request_sem (); - virtual void serve (transport_layer_base *, process_cache *); -#endif - -public: - -#ifdef __INSIDE_CYGWIN__ - client_request_sem (int, int, int, union semun *); // semctl - client_request_sem (key_t, int, int); // semget - client_request_sem (int, struct sembuf *, size_t); // semop -#endif - - int retval () const { return _parameters.out.ret; } -}; - -#ifndef __INSIDE_CYGWIN__ -int seminit (); -int semunload (); -void semexit_myhook(void *arg, struct proc *p); - -int semctl (struct thread *, struct semctl_args *); -int semget (struct thread *, struct semget_args *); -int semop (struct thread *, struct semop_args *); -#endif - -#endif /* __CYGSERVER_SEM_H__ */ diff --git a/winsup/cygwin/cygserver_shm.h b/winsup/cygwin/cygserver_shm.h deleted file mode 100644 index 2948f6725..000000000 --- a/winsup/cygwin/cygserver_shm.h +++ /dev/null @@ -1,98 +0,0 @@ -/* cygserver_shm.h: Single unix specification IPC interface for Cygwin. - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef __CYGSERVER_SHM_H__ -#define __CYGSERVER_SHM_H__ - -#include -#include -#ifndef _KERNEL -#define _KERNEL 1 -#endif -#include - -#include "cygserver.h" -#include "cygserver_ipc.h" - -#ifndef __INSIDE_CYGWIN__ -class transport_layer_base; -class process_cache; -#endif - -class client_request_shm : public client_request -{ - friend class client_request; - -public: - enum shmop_t - { - SHMOP_shmat, - SHMOP_shmctl, - SHMOP_shmdt, - SHMOP_shmget, - SHMOP_shmfork /* Called on fixup_after_fork */ - }; - -private: - union - { - struct - { - shmop_t shmop; - proc ipcblk; - struct shmat_args atargs; - struct shmctl_args ctlargs; - struct shmdt_args dtargs; - struct shmget_args getargs; - struct proc forkargs; - } in; - - struct { - union { - int ret; - vm_offset_t ptr; - }; - vm_object_t obj; - } out; - } _parameters; - -#ifndef __INSIDE_CYGWIN__ - client_request_shm (); - virtual void serve (transport_layer_base *, process_cache *); -#endif - -public: - -#ifdef __INSIDE_CYGWIN__ - client_request_shm (int, const void *, int); // shmat - client_request_shm (int, int, struct shmid_ds *); // shmctl - client_request_shm (const void *); // shmdt - client_request_shm (key_t, size_t, int); // shmget - client_request_shm (proc *); // shmfork -#endif - - int retval () const { return _parameters.out.ret; } - void *ptrval () const { return (void *)_parameters.out.ptr; } - vm_object_t objval () const { return _parameters.out.obj; } -}; - -#ifndef __INSIDE_CYGWIN__ -void shminit (); -int shmunload (); -void shmexit_myhook (struct vmspace *vm); -int cygwin_shmfork_myhook (struct thread *, struct proc *); - -int shmat (struct thread *, struct shmat_args *); -int shmctl (struct thread *, struct shmctl_args *); -int shmdt (struct thread *, struct shmdt_args *); -int shmget (struct thread *, struct shmget_args *); -#endif - -#endif /* __CYGSERVER_SHM_H__ */ diff --git a/winsup/cygwin/cygthread.cc b/winsup/cygwin/cygthread.cc deleted file mode 100644 index 407454310..000000000 --- a/winsup/cygwin/cygthread.cc +++ /dev/null @@ -1,514 +0,0 @@ -/* cygthread.cc - - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include "exceptions.h" -#include "security.h" -#include "sync.h" -#include "cygerrno.h" -#include "sigproc.h" -#include "thread.h" -#include "cygtls.h" - -#undef CloseHandle - -static cygthread NO_COPY threads[32]; -#define NTHREADS (sizeof (threads) / sizeof (threads[0])) - -DWORD NO_COPY cygthread::main_thread_id; -bool NO_COPY cygthread::exiting; - -void -cygthread::callfunc (bool issimplestub) -{ - void *pass_arg; - if (arg == cygself) - pass_arg = this; - else if (!arglen) - pass_arg = arg; - else - { - if (issimplestub) - ev = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); - pass_arg = alloca (arglen); - memcpy (pass_arg, arg, arglen); - SetEvent (ev); - } - if (issimplestub) - { - /* Wait for main thread to assign 'h' */ - while (!h) - low_priority_sleep (0); - if (ev) - CloseHandle (ev); - ev = h; - } - /* Cygwin threads should not call ExitThread directly */ - func (pass_arg); - /* ...so the above should always return */ -} - -/* Initial stub called by cygthread constructor. Performs initial - per-thread initialization and loops waiting for another thread function - to execute. */ -DWORD WINAPI -cygthread::stub (VOID *arg) -{ - cygthread *info = (cygthread *) arg; - _my_tls._ctinfo = info; - if (info->arg == cygself) - { - if (info->ev) - { - CloseHandle (info->ev); - CloseHandle (info->thread_sync); - } - info->ev = info->thread_sync = info->stack_ptr = NULL; - } - else - { - info->stack_ptr = &arg; - debug_printf ("thread '%s', id %p, stack_ptr %p", info->name (), info->id, info->stack_ptr); - if (!info->ev) - { - info->ev = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); - info->thread_sync = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); - } - } - - while (1) - { - if (!info->__name) -#ifdef DEBUGGING - system_printf ("erroneous thread activation, name is NULL prev thread name = '%s'", info->__oldname); -#else - system_printf ("erroneous thread activation, name is NULL"); -#endif - else - { - if (exiting) - { - info->inuse = false; // FIXME: Do we need this? - return 0; - } - - info->callfunc (false); - - HANDLE notify = info->notify_detached; - /* If func is NULL, the above function has set that to indicate - that it doesn't want to alert anyone with a SetEvent and should - just be marked as no longer inuse. Hopefully the function knows - what it is doing. */ - if (!info->func) - info->release (false); - else - { -#ifdef DEBUGGING - info->func = NULL; // catch erroneous activation - info->__oldname = info->__name; -#endif - info->__name = NULL; - SetEvent (info->ev); - } - if (notify) - SetEvent (notify); - } - switch (WaitForSingleObject (info->thread_sync, INFINITE)) - { - case WAIT_OBJECT_0: - continue; - default: - api_fatal ("WFSO failed, %E"); - break; - } - } -} - -/* Overflow stub called by cygthread constructor. Calls specified function - and then exits the thread. */ -DWORD WINAPI -cygthread::simplestub (VOID *arg) -{ - cygthread *info = (cygthread *) arg; - _my_tls._ctinfo = info; - info->stack_ptr = &arg; - info->callfunc (true); - return 0; -} - -/* Start things going. Called from dll_crt0_1. */ -void -cygthread::init () -{ - main_thread_id = GetCurrentThreadId (); -} - -cygthread * -cygthread::freerange () -{ - cygthread *self = (cygthread *) calloc (1, sizeof (*self)); - self->is_freerange = true; - self->inuse = 1; - return self; -} - -void * cygthread::operator -new (size_t) -{ - cygthread *info; - - /* Search the threads array for an empty slot to use */ - for (info = threads; info < threads + NTHREADS; info++) - if (!InterlockedExchange (&info->inuse, 1)) - { - /* available */ -#ifdef DEBUGGING - if (info->__name) - api_fatal ("name not NULL? %s, id %p, i %d", info->__name, info->id, info - threads); -#endif - goto out; - } - -#ifdef DEBUGGING - if (!getenv ("CYGWIN_FREERANGE_NOCHECK")) - api_fatal ("overflowed cygwin thread pool"); - else - thread_printf ("overflowed cygwin thread pool"); -#endif - - info = freerange (); /* exhausted thread pool */ - -out: - return info; -} - -cygthread::cygthread (LPTHREAD_START_ROUTINE start, size_t n, void *param, - const char *name, HANDLE notify) - : __name (name), func (start), arglen (n), arg (param), notify_detached (notify) -{ - thread_printf ("name %s, id %p", name, id); - HANDLE htobe; - if (h) - { - if (ev) - ResetEvent (ev); - while (!thread_sync) - low_priority_sleep (0); - SetEvent (thread_sync); - thread_printf ("activated name '%s', thread_sync %p for thread %p", name, thread_sync, id); - htobe = h; - } - else - { - stack_ptr = NULL; - htobe = CreateThread (&sec_none_nih, 0, is_freerange ? simplestub : stub, - this, 0, &id); - if (!htobe) - api_fatal ("CreateThread failed for %s - %p<%p>, %E", name, h, id); - thread_printf ("created name '%s', thread %p, id %p", name, h, id); -#ifdef DEBUGGING - terminated = false; -#endif - } - - if (n) - { - while (!ev) - low_priority_sleep (0); - WaitForSingleObject (ev, INFINITE); - ResetEvent (ev); - } - h = htobe; -} - -/* Return the symbolic name of the current thread for debugging. - */ -const char * -cygthread::name (DWORD tid) -{ - const char *res = NULL; - if (!tid) - tid = GetCurrentThreadId (); - - if (tid == main_thread_id) - return "main"; - - for (DWORD i = 0; i < NTHREADS; i++) - if (threads[i].id == tid) - { - res = threads[i].__name ?: "exiting thread"; - break; - } - - if (!res) - { - __small_sprintf (_my_tls.locals.unknown_thread_name, "unknown (%p)", tid); - res = _my_tls.locals.unknown_thread_name; - } - - return res; -} - -cygthread::operator -HANDLE () -{ - while (!ev) - low_priority_sleep (0); - return ev; -} - -void -cygthread::release (bool nuke_h) -{ - if (nuke_h) - h = NULL; -#ifdef DEBUGGING - __oldname = __name; - debug_printf ("released thread '%s'", __oldname); -#endif - __name = NULL; - func = NULL; - /* Must be last */ - if (!InterlockedExchange (&inuse, 0)) -#ifdef DEBUGGING - api_fatal ("released a thread that was not inuse"); -#else - system_printf ("released a thread that was not inuse"); -#endif -} - -/* Forcibly terminate a thread. */ -bool -cygthread::terminate_thread () -{ - bool terminated = true; - debug_printf ("thread '%s', id %p, inuse %d, stack_ptr %p", name (), id, inuse, stack_ptr); - while (inuse && !stack_ptr) - low_priority_sleep (0); - - if (!inuse) - goto force_notterminated; - - TerminateThread (h, 0); - WaitForSingleObject (h, INFINITE); - CloseHandle (h); - - if (!inuse || exiting) - goto force_notterminated; - - if (ev && !(terminated = WaitForSingleObject (ev, 0) != WAIT_OBJECT_0)) - ResetEvent (ev); - - MEMORY_BASIC_INFORMATION m; - memset (&m, 0, sizeof (m)); - VirtualQuery (stack_ptr, &m, sizeof m); - - if (!m.RegionSize) - system_printf ("m.RegionSize 0? stack_ptr %p", stack_ptr); - else if (!VirtualFree (m.AllocationBase, 0, MEM_RELEASE)) - debug_printf ("VirtualFree of allocation base %p<%p> failed, %E", - stack_ptr, m.AllocationBase); - - if (is_freerange) - free (this); - else - { -#ifdef DEBUGGING - terminated = true; -#endif - release (true); - } - - goto out; - -force_notterminated: - terminated = false; -out: - return terminated; -} - -/* Detach the cygthread from the current thread. Note that the - theory is that cygthreads are only associated with one thread. - So, there should be never be multiple threads doing waits - on the same cygthread. */ -bool -cygthread::detach (HANDLE sigwait) -{ - bool signalled = false; - bool thread_was_reset = false; - if (!inuse) - system_printf ("called detach but inuse %d, thread %p?", inuse, id); - else - { - DWORD res; - - if (!sigwait) - /* If the caller specified a special handle for notification, wait for that. - This assumes that the thread in question is auto releasing. */ - res = WaitForSingleObject (*this, INFINITE); - else - { - /* Lower our priority and give priority to the read thread */ - HANDLE hth = GetCurrentThread (); - LONG prio = GetThreadPriority (hth); - ::SetThreadPriority (hth, THREAD_PRIORITY_BELOW_NORMAL); - - HANDLE w4[2]; - unsigned n = 2; - DWORD howlong = INFINITE; - w4[0] = sigwait; - w4[1] = signal_arrived; - /* For a description of the below loop see the end of this file */ - for (int i = 0; i < 2; i++) - switch (res = WaitForMultipleObjects (n, w4, FALSE, howlong)) - { - case WAIT_OBJECT_0: - if (n == 1) - howlong = 50; - break; - case WAIT_OBJECT_0 + 1: - n = 1; - if (i--) - howlong = 50; - break; - case WAIT_TIMEOUT: - break; - default: - if (!exiting) - { - system_printf ("WFMO failed waiting for cygthread '%s', %E", __name); - for (unsigned j = 0; j < n; j++) - switch (WaitForSingleObject (w4[j], 0)) - { - case WAIT_OBJECT_0: - case WAIT_TIMEOUT: - break; - default: - system_printf ("%s handle %p is bad", (j ? "signal_arrived" : "semaphore"), w4[j]); - break; - } - api_fatal ("exiting on fatal error"); - } - break; - } - /* WAIT_OBJECT_0 means that the thread successfully read something, - so wait for the cygthread to "terminate". */ - if (res == WAIT_OBJECT_0) - WaitForSingleObject (*this, INFINITE); - else - { - /* Thread didn't terminate on its own, so maybe we have to - do it. */ - signalled = terminate_thread (); - /* Possibly the thread completed *just* before it was - terminated. Detect this. If this happened then the - read was not terminated on a signal. */ - if (WaitForSingleObject (sigwait, 0) == WAIT_OBJECT_0) - signalled = false; - if (signalled) - set_sig_errno (EINTR); - thread_was_reset = true; - } - ::SetThreadPriority (hth, prio); - } - - thread_printf ("%s returns %d, id %p", sigwait ? "WFMO" : "WFSO", - res, id); - - if (thread_was_reset) - /* already handled */; - else if (is_freerange) - { - CloseHandle (h); - free (this); - } - else - { - ResetEvent (*this); - /* Mark the thread as available by setting inuse to zero */ - InterlockedExchange (&inuse, 0); - } - } - return signalled; -} - -void -cygthread::terminate () -{ - exiting = 1; -} - -/* The below is an explanation of synchronization loop in cygthread::detach. - The intent is that the loop will always try hard to wait for both - synchronization events from the reader thread but will exit with - res == WAIT_TIMEOUT if a signal occurred and the reader thread is - still blocked. - - case 0 - no signal - - i == 0 (howlong == INFINITE) - W0 activated - howlong not set because n != 1 - just loop - - i == 1 (howlong == INFINITE) - W0 activated - howlong not set because n != 1 - just loop (to exit loop) - no signal - - i == 2 (howlong == INFINITE) - exit loop - - case 1 - signal before thread initialized - - i == 0 (howlong == INFINITE) - WO + 1 activated - n set to 1 - howlong untouched because i-- == 0 - loop - - i == 0 (howlong == INFINITE) - W0 must be activated - howlong set to 50 because n == 1 - - i == 1 (howlong == 50) - W0 activated - loop (to exit loop) - no signal - - WAIT_TIMEOUT activated - signal potentially detected - loop (to exit loop) - - i == 2 (howlong == 50) - exit loop - - case 2 - signal after thread initialized - - i == 0 (howlong == INFINITE) - W0 activated - howlong not set because n != 1 - loop - - i == 1 (howlong == INFINITE) - W0 + 1 activated - n set to 1 - howlong set to 50 because i-- != 0 - loop - - i == 1 (howlong == 50) - W0 activated - loop (to exit loop) - no signal - - WAIT_TIMEOUT activated - loop (to exit loop) - signal - - i == 2 (howlong == 50) - exit loop -*/ diff --git a/winsup/cygwin/cygthread.h b/winsup/cygwin/cygthread.h deleted file mode 100644 index da7172e63..000000000 --- a/winsup/cygwin/cygthread.h +++ /dev/null @@ -1,57 +0,0 @@ -/* cygthread.h - - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGTHREAD_H -#define _CYGTHREAD_H - -class cygthread -{ - LONG inuse; - DWORD id; - HANDLE h; - HANDLE ev; - HANDLE thread_sync; - void *stack_ptr; - const char *__name; -#ifdef DEBUGGING - const char *__oldname; - bool terminated; -#endif - LPTHREAD_START_ROUTINE func; - unsigned arglen; - VOID *arg; - bool is_freerange; - static bool exiting; - HANDLE notify_detached; - public: - bool terminate_thread (); - static DWORD WINAPI stub (VOID *); - static DWORD WINAPI simplestub (VOID *); - static DWORD main_thread_id; - static const char * name (DWORD = 0); - void callfunc (bool) __attribute__ ((noinline, regparm (2))); - void auto_release () {func = NULL;} - void release (bool); - cygthread (LPTHREAD_START_ROUTINE, unsigned, LPVOID, const char *, HANDLE = NULL); - cygthread () {}; - static void init (); - bool detach (HANDLE = NULL); - operator HANDLE (); - void * operator new (size_t); - static cygthread *freerange (); - static void terminate (); - bool SetThreadPriority (int nPriority) {return ::SetThreadPriority (h, nPriority);} - void zap_h () - { - CloseHandle (h); - h = NULL; - } -}; - -#define cygself NULL -#endif /*_CYGTHREAD_H*/ diff --git a/winsup/cygwin/cygtls.cc b/winsup/cygwin/cygtls.cc deleted file mode 100644 index 70f5a56d8..000000000 --- a/winsup/cygwin/cygtls.cc +++ /dev/null @@ -1,275 +0,0 @@ -/* cygtls.cc - - Copyright 2003, 2004, 2005, 2006 Red Hat, Inc. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#define USE_SYS_TYPES_FD_SET -#include -#include "thread.h" -#include "cygtls.h" -#include "assert.h" -#include -#include -#include -#include "exceptions.h" -#include "sync.h" -#include "cygerrno.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "pinfo.h" -#include "sigproc.h" - -class sentry -{ - static muto lock; - int destroy; -public: - void init (); - bool acquired () {return lock.acquired ();} - sentry () {destroy = 0;} - sentry (DWORD wait) {destroy = lock.acquire (wait);} - ~sentry () {if (destroy) lock.release ();} - friend void _cygtls::init (); -}; - -muto NO_COPY sentry::lock; - -static size_t NO_COPY nthreads; - -#define THREADLIST_CHUNK 256 - -void -_cygtls::init () -{ - if (cygheap->threadlist) - memset (cygheap->threadlist, 0, cygheap->sthreads * sizeof (cygheap->threadlist[0])); - else - { - cygheap->sthreads = THREADLIST_CHUNK; - cygheap->threadlist = (_cygtls **) ccalloc (HEAP_TLS, cygheap->sthreads, - sizeof (cygheap->threadlist[0])); - } - sentry::lock.init ("sentry_lock"); -} - -/* Two calls to get the stack right... */ -void -_cygtls::call (DWORD (*func) (void *, void *), void *arg) -{ - char buf[CYGTLS_PADSIZE]; - call2 (func, arg, buf); -} - -void -_cygtls::call2 (DWORD (*func) (void *, void *), void *arg, void *buf) -{ - _my_tls.init_thread (buf, func); - DWORD res = func (arg, buf); - _my_tls.remove (INFINITE); - ExitThread (res); -} - -void -_cygtls::init_thread (void *x, DWORD (*func) (void *, void *)) -{ - if (x) - { - memset (this, 0, CYGTLS_PADSIZE); - stackptr = stack; - if (_GLOBAL_REENT) - { - local_clib._stdin = _GLOBAL_REENT->_stdin; - local_clib._stdout = _GLOBAL_REENT->_stdout; - local_clib._stderr = _GLOBAL_REENT->_stderr; - local_clib.__sdidinit = _GLOBAL_REENT->__sdidinit ? -1 : 0; - local_clib.__cleanup = _GLOBAL_REENT->__cleanup; - local_clib.__sglue._niobs = 3; - local_clib.__sglue._iobs = &_GLOBAL_REENT->__sf[0]; - } - local_clib._current_locale = "C"; - locals.process_logmask = LOG_UPTO (LOG_DEBUG); - /* Initialize this thread's ability to respond to things like - SIGSEGV or SIGFPE. */ - init_exception_handler (handle_exceptions); - } - - thread_id = GetCurrentThreadId (); - initialized = CYGTLS_INITIALIZED; - locals.exitsock = INVALID_SOCKET; - errno_addr = &(local_clib._errno); - - if ((void *) func == (void *) cygthread::stub - || (void *) func == (void *) cygthread::simplestub) - return; - - if (wincap.has_security ()) - cygheap->user.reimpersonate (); - - sentry here (INFINITE); - if (nthreads >= cygheap->sthreads) - { - cygheap->threadlist = (_cygtls **) - crealloc (cygheap->threadlist, (cygheap->sthreads += THREADLIST_CHUNK) - * sizeof (cygheap->threadlist[0])); - memset (cygheap->threadlist + nthreads, 0, THREADLIST_CHUNK * sizeof (cygheap->threadlist[0])); - } - - cygheap->threadlist[nthreads++] = this; -} - -void -_cygtls::fixup_after_fork () -{ - if (sig) - { - pop (); - sig = 0; - } - stacklock = spinning = 0; - locals.exitsock = INVALID_SOCKET; - wq.thread_ev = NULL; -} - -#define free_local(x) \ - if (locals.x) \ - { \ - free (locals.x); \ - locals.x = NULL; \ - } - -void -_cygtls::remove (DWORD wait) -{ - if (!isinitialized ()) - return; - initialized = 0; - if (!locals.exitsock || exit_state >= ES_FINAL) - return; - - debug_printf ("wait %p", wait); - if (wait) - { - /* FIXME: Need some sort of atthreadexit function to allow things like - select to control this themselves. */ - if (locals.exitsock != INVALID_SOCKET) - { - closesocket (locals.exitsock); - locals.exitsock = (SOCKET) NULL; - } - free_local (process_ident); - free_local (ntoa_buf); - free_local (protoent_buf); - free_local (servent_buf); - free_local (hostent_buf); - } - - do - { - sentry here (wait); - if (here.acquired ()) - { - for (size_t i = 0; i < nthreads; i++) - if (this == cygheap->threadlist[i]) - { - if (i < --nthreads) - cygheap->threadlist[i] = cygheap->threadlist[nthreads]; - debug_printf ("removed %p element %d", this, i); - break; - } - } - } while (0); - remove_wq (wait); -} - -void -_cygtls::push (__stack_t addr) -{ - *stackptr++ = (__stack_t) addr; -} - -#define BAD_IX ((size_t) -1) -static size_t NO_COPY threadlist_ix = BAD_IX; - -_cygtls * -_cygtls::find_tls (int sig) -{ - debug_printf ("sig %d\n", sig); - sentry here (INFINITE); - __asm__ volatile (".equ _threadlist_exception_return,."); - _cygtls *res = NULL; - for (threadlist_ix = 0; threadlist_ix < nthreads; threadlist_ix++) - if (sigismember (&(cygheap->threadlist[threadlist_ix]->sigwait_mask), sig)) - { - res = cygheap->threadlist[threadlist_ix]; - break; - } - threadlist_ix = BAD_IX; - return res; -} - -void -_cygtls::set_siginfo (sigpacket *pack) -{ - infodata = pack->si; -} - -extern "C" DWORD __stdcall RtlUnwind (void *, void *, void *, DWORD); -int -_cygtls::handle_threadlist_exception (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *c, void *) -{ - if (e->ExceptionCode != STATUS_ACCESS_VIOLATION) - { - system_printf ("unhandled exception %p at %p", e->ExceptionCode, c->Eip); - return 1; - } - - sentry here; - if (threadlist_ix == BAD_IX) - { - api_fatal ("called with threadlist_ix %d", BAD_IX); - return 1; - } - - if (!here.acquired ()) - { - system_printf ("couldn't aquire muto"); - return 1; - } - - extern void *threadlist_exception_return; - cygheap->threadlist[threadlist_ix]->remove (INFINITE); - threadlist_ix = 0; - RtlUnwind (frame, threadlist_exception_return, e, 0); - return 0; -} - -/* Set up the exception handler for the current thread. The PowerPC & Mips - use compiler generated tables to set up the exception handlers for each - region of code, and the kernel walks the call list until it finds a region - of code that handles exceptions. The x86 on the other hand uses segment - register fs, offset 0 to point to the current exception handler. */ - -extern exception_list *_except_list asm ("%fs:0"); - -void -_cygtls::init_exception_handler (exception_handler *eh) -{ - el.handler = eh; - el.prev = _except_list; - if (!el.prev->prev && !el.prev->handler) - el.prev = ⪙ - _except_list = ⪙ -} - -void -_cygtls::init_threadlist_exceptions () -{ - init_exception_handler (handle_threadlist_exception); -} diff --git a/winsup/cygwin/cygtls.h b/winsup/cygwin/cygtls.h deleted file mode 100644 index 030680be0..000000000 --- a/winsup/cygwin/cygtls.h +++ /dev/null @@ -1,261 +0,0 @@ -/* cygtls.h - - Copyright 2003, 2004, 2005 Red Hat, Inc. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGTLS_H -#define _CYGTLS_H - -#include -#include -#include -#include -#define _NOMNTENT_FUNCS -#include -#undef _NOMNTENT_FUNCS -#include -#include -#ifndef _WINSOCK_H -#include -typedef unsigned int SOCKET; -#endif - -#define CYGTLS_INITIALIZED 0xc763173f - -#ifndef CYG_MAX_PATH -# define CYG_MAX_PATH 260 -#endif - -#ifndef UNLEN -# define UNLEN 256 -#endif - -#define TLS_STACK_SIZE 256 - -#include "cygthread.h" - -#pragma pack(push,4) -struct _local_storage -{ - /* - Needed for the group functions - */ - struct __group16 grp; - char *namearray[2]; - int grp_pos; - - /* console.cc */ - unsigned rarg; - - /* dlfcn.cc */ - int dl_error; - char dl_buffer[256]; - - /* passwd.cc */ - struct passwd res; - char pass[_PASSWORD_LEN]; - int pw_pos; - - /* path.cc */ - struct mntent mntbuf; - int iteration; - unsigned available_drives; - char mnt_type[80]; - char mnt_opts[80]; - char mnt_fsname[CYG_MAX_PATH]; - char mnt_dir[CYG_MAX_PATH]; - - /* select.cc */ - SOCKET exitsock; - struct sockaddr_in exitsock_sin; - - /* strerror */ - char strerror_buf[sizeof ("Unknown error 4294967295")]; - - /* sysloc.cc */ - char *process_ident; // note: malloced - int process_logopt; - int process_facility; - int process_logmask; - - /* times.cc */ - char timezone_buf[20]; - struct tm _localtime_buf; - - /* uinfo.cc */ - char username[UNLEN + 1]; - - /* net.cc */ - char *ntoa_buf; // note: malloced - struct protoent *protoent_buf; // note: malloced - struct servent *servent_buf; // note: malloced - struct hostent *hostent_buf; // note: malloced - char signamebuf[sizeof ("Unknown signal 4294967295 ")]; - - /* cygthread.cc */ - char unknown_thread_name[30]; - - /* syscalls.cc */ - int setmode_file; - int setmode_mode; -}; - -typedef struct struct_waitq -{ - int pid; - int options; - int status; - HANDLE ev; - void *rusage; /* pointer to potential rusage */ - struct struct_waitq *next; - HANDLE thread_ev; -} waitq; - -typedef struct -{ - void *_myfault; - int _myfault_errno; -} san; - -/* Changes to the below structure may require acompanying changes to the very - simple parser in the perl script 'gentls_offsets' (<<-- start parsing here). - The union in this structure is used to force alignment between the version - of the compiler used to generate tlsoffsets.h and the cygwin cross compiler. -*/ - -/*gentls_offsets*/ -#include "cygerrno.h" - -extern "C" int __sjfault (jmp_buf); -extern "C" int __ljfault (jmp_buf, int); - -/*gentls_offsets*/ - -typedef __uint32_t __stack_t; -struct _cygtls -{ - void (*func) /*gentls_offsets*/(int)/*gentls_offsets*/; - int saved_errno; - int sa_flags; - sigset_t oldmask; - sigset_t deltamask; - HANDLE event; - int *errno_addr; - sigset_t sigmask; - sigset_t sigwait_mask; - siginfo_t *sigwait_info; - struct ucontext thread_context; - DWORD thread_id; - unsigned threadkill; - siginfo_t infodata; - struct pthread *tid; - union - { - struct _reent local_clib; - char __dontuse[8 * ((sizeof(struct _reent) + 4) / 8)]; - }; - struct _local_storage locals; - class cygthread *_ctinfo; - exception_list el; - san andreas; - waitq wq; - struct _cygtls *prev, *next; - int sig; - unsigned incyg; - unsigned spinning; - unsigned stacklock; - __stack_t *stackptr; - __stack_t stack[TLS_STACK_SIZE]; - unsigned initialized; - unsigned padding[0]; - - /*gentls_offsets*/ - static CRITICAL_SECTION protect_linked_list; - static void init (); - void init_thread (void *, DWORD (*) (void *, void *)); - static void call (DWORD (*) (void *, void *), void *); - static void call2 (DWORD (*) (void *, void *), void *, void *) __attribute__ ((regparm (3))); - static struct _cygtls *find_tls (int sig); - void remove (DWORD); - void push (__stack_t) __attribute__ ((regparm (2))); - __stack_t pop () __attribute__ ((regparm (1))); - __stack_t retaddr () {return stackptr[-1];} - bool isinitialized () const {return initialized == CYGTLS_INITIALIZED;} - bool interrupt_now (CONTEXT *, int, void *, struct sigaction&) - __attribute__((regparm(3))); - void __stdcall interrupt_setup (int sig, void *handler, - struct sigaction& siga) - __attribute__((regparm(3))); - - /* exception handling */ - static int handle_exceptions (EXCEPTION_RECORD *, exception_list *, CONTEXT *, void *); - static int handle_threadlist_exception (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *c, void *); - void init_exception_handler (int (*) (EXCEPTION_RECORD *, exception_list *, CONTEXT *, void*)); - void init_threadlist_exceptions (); - void signal_exit (int) __attribute__ ((noreturn, regparm(2))); - void copy_context (CONTEXT *) __attribute__ ((regparm(2))); - void signal_debugger (int) __attribute__ ((regparm(2))); - -#ifdef _THREAD_H - operator HANDLE () const {return tid->win32_obj_id;} -#endif - void set_siginfo (struct sigpacket *) __attribute__ ((regparm (3))); - void set_threadkill () {threadkill = true;} - void reset_threadkill () {threadkill = false;} - int call_signal_handler () __attribute__ ((regparm (1))); - void remove_wq (DWORD) __attribute__ ((regparm (1))); - void fixup_after_fork () __attribute__ ((regparm (1))); - void lock () __attribute__ ((regparm (1))); - void unlock () __attribute__ ((regparm (1))); - bool locked () __attribute__ ((regparm (1))); - void*& fault_guarded () {return andreas._myfault;} - void return_from_fault () - { - if (andreas._myfault_errno) - set_errno (andreas._myfault_errno); - __ljfault ((int *) andreas._myfault, 1); - } - int setup_fault (jmp_buf j, san& old_j, int myerrno) __attribute__ ((always_inline)) - { - old_j._myfault = andreas._myfault; - old_j._myfault_errno = andreas._myfault_errno; - andreas._myfault = (void *) j; - andreas._myfault_errno = myerrno; - return __sjfault (j); - } - void reset_fault (san& old_j) __attribute__ ((always_inline)) - { - andreas._myfault = old_j._myfault; - andreas._myfault_errno = old_j._myfault_errno; - } - /*gentls_offsets*/ -}; -#pragma pack(pop) - -extern char *_tlsbase __asm__ ("%fs:4"); -extern char *_tlstop __asm__ ("%fs:8"); -#define _my_tls (((_cygtls *) _tlsbase)[-1]) -extern _cygtls *_main_tls; -extern _cygtls *_sig_tls; - -/*gentls_offsets*/ -class myfault -{ - jmp_buf buf; - san sebastian; -public: - ~myfault () __attribute__ ((always_inline)) { _my_tls.reset_fault (sebastian); } - inline int faulted (int myerrno = 0) __attribute__ ((always_inline)) - { - return _my_tls.setup_fault (buf, sebastian, myerrno); - } -}; -/*gentls_offsets*/ - -#define __getreent() (&_my_tls.local_clib) - -const int CYGTLS_PADSIZE = (((char *) _main_tls->padding) - ((char *) _main_tls)); -#endif /*_CYGTLS_H*/ diff --git a/winsup/cygwin/cygwin-shilka b/winsup/cygwin/cygwin-shilka deleted file mode 100755 index 433d9b5df..000000000 --- a/winsup/cygwin/cygwin-shilka +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -c="$(basename $1 .shilka).c" -shilka -length -strip -no-definitions $1 && \ -sed -e '1,4d' -e '/KR_reset.*;/d' -e '/KR_output_statistics.*;/d' \ - -e '/KR_reset.*)/,/}/d' -e '/KR_output_statistics.*)/,/}/d' \ - -e '/# *line/d' "$c" > $2 && -rm -f "$c" -# -e "s%$c"'"%'"$2"'"%g' diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din deleted file mode 100644 index 9fc71162a..000000000 --- a/winsup/cygwin/cygwin.din +++ /dev/null @@ -1,1621 +0,0 @@ -LIBRARY "cygwin1.dll" BASE=0x61000000 - -EXPORTS -__argc DATA -__argv DATA -__check_rhosts_file DATA -_ctype_ DATA -__cygwin_environ DATA -__cygwin_user_data DATA -__mb_cur_max DATA -__progname DATA -__rcmd_errstr DATA -_check_for_executable DATA -_ctype_ DATA -_daylight DATA -_impure_ptr DATA -_sys_errlist DATA -sys_errlist = _sys_errlist DATA -_sys_nerr DATA -sys_nerr = _sys_nerr DATA -_timezone DATA -_tzname DATA -h_errno DATA -optarg DATA -opterr DATA -optind DATA -optopt DATA -optreset DATA -reent_data DATA -_alloca NOSIGFE -dll_entry@12 NOSIGFE -__assert SIGFE -__assertfail SIGFE -__eprintf SIGFE -__errno NOSIGFE -__fpclassifyd NOSIGFE -__fpclassifyf NOSIGFE -__getreent NOSIGFE -__infinity NOSIGFE -__isinff NOSIGFE -__isinfd NOSIGFE -__isnanf NOSIGFE -__isnand NOSIGFE -__main NOSIGFE -__signbitd NOSIGFE -__signbitf NOSIGFE -__signgam NOSIGFE -__srget SIGFE -__swbuf SIGFE -_asprintf_r SIGFE -asprintf_r = _asprintf_r SIGFE -_dll_crt0@0 NOSIGFE -_exit SIGFE -_f_atan2 NOSIGFE -__f_atan2 = _f_atan2 NOSIGFE -_f_atan2f NOSIGFE -__f_atan2f = _f_atan2f NOSIGFE -_f_exp NOSIGFE -__f_exp = _f_exp NOSIGFE -_f_expf NOSIGFE -__f_expf = _f_expf NOSIGFE -_f_frexp NOSIGFE -__f_frexp = _f_frexp NOSIGFE -_f_frexpf NOSIGFE -__f_frexpf = _f_frexpf NOSIGFE -_f_ldexp NOSIGFE -__f_ldexp = _f_ldexp NOSIGFE -_f_ldexpf NOSIGFE -__f_ldexpf = _f_ldexpf NOSIGFE -_f_log NOSIGFE -__f_log = _f_log NOSIGFE -_f_log10 NOSIGFE -__f_log10 = _f_log10 NOSIGFE -_f_log10f NOSIGFE -__f_log10f = _f_log10f NOSIGFE -_f_logf NOSIGFE -__f_logf = _f_logf NOSIGFE -_f_pow NOSIGFE -__f_pow = _f_pow NOSIGFE -_f_powf NOSIGFE -__f_powf = _f_powf NOSIGFE -_f_tan NOSIGFE -__f_tan = _f_tan NOSIGFE -_f_tanf NOSIGFE -__f_tanf = _f_tanf NOSIGFE -_fcloseall_r SIGFE -fcloseall_r = _fcloseall_r SIGFE -_fscanf_r SIGFE -fscanf_r = _fscanf_r SIGFE -fstat SIGFE -_fstat = fstat SIGFE -_pipe SIGFE -_pthread_cleanup_pop SIGFE -_pthread_cleanup_push SIGFE -_scanf_r SIGFE -scanf_r = _scanf_r SIGFE -_sscanf_r SIGFE -sscanf_r = _sscanf_r SIGFE -stat SIGFE -_stat = stat SIGFE -_strtold SIGFE -trunc NOSIGFE -_vasprintf_r SIGFE -vasprintf_r = _vasprintf_r SIGFE -_vfscanf_r SIGFE -vfscanf_r = _vfscanf_r SIGFE -_vscanf_r SIGFE -vscanf_r = _vscanf_r SIGFE -_vsscanf_r SIGFE -vsscanf_r = _vsscanf_r SIGFE -a64l NOSIGFE -abort SIGFE -_abort = abort SIGFE -abs NOSIGFE -_abs = abs NOSIGFE -access SIGFE -_access = access SIGFE -acl SIGFE -_acl = acl SIGFE -_acl32 = acl32 SIGFE -aclcheck NOSIGFE -_aclcheck = aclcheck NOSIGFE -_aclcheck32 = aclcheck32 NOSIGFE -aclfrommode SIGFE -_aclfrommode = aclfrommode SIGFE -_aclfrommode32 = aclfrommode32 SIGFE -aclfrompbits SIGFE -_aclfrompbits = aclfrompbits SIGFE -_aclfrompbits32 = aclfrompbits32 SIGFE -aclfromtext SIGFE -_aclfromtext = aclfromtext SIGFE -_aclfromtext32 = aclfromtext32 SIGFE -aclsort SIGFE -_aclsort = aclsort SIGFE -_aclsort32 = aclsort32 SIGFE -acltomode SIGFE -_acltomode = acltomode SIGFE -_acltomode32 = acltomode32 SIGFE -acltopbits SIGFE -_acltopbits = acltopbits SIGFE -_acltopbits32 = acltopbits32 SIGFE -acltotext SIGFE -_acltotext = acltotext SIGFE -_acltotext32 = acltotext32 SIGFE -acos NOSIGFE -_acos = acos NOSIGFE -acosf NOSIGFE -_acosf = acosf NOSIGFE -acosh NOSIGFE -_acosh = acosh NOSIGFE -acoshf NOSIGFE -_acoshf = acoshf NOSIGFE -alarm SIGFE -_alarm = alarm SIGFE -alphasort NOSIGFE -_alphasort = alphasort NOSIGFE -argz_add SIGFE -__argz_add = argz_add SIGFE -argz_add_sep SIGFE -__argz_add_sep = argz_add_sep SIGFE -argz_append SIGFE -__argz_append = argz_append SIGFE -argz_count NOSIGFE -__argz_count = argz_count NOSIGFE -argz_create SIGFE -__argz_create = argz_create SIGFE -argz_create_sep SIGFE -__argz_create_sep = argz_create_sep SIGFE -argz_delete SIGFE -__argz_delete = argz_delete SIGFE -argz_extract NOSIGFE -__argz_extract = argz_extract NOSIGFE -argz_insert SIGFE -__argz_insert = argz_insert SIGFE -argz_next NOSIGFE -__argz_next = argz_next NOSIGFE -argz_replace SIGFE -__argz_replace = argz_replace SIGFE -argz_stringify NOSIGFE -__argz_stringify = argz_stringify NOSIGFE -asctime SIGFE -_asctime = asctime SIGFE -asctime_r SIGFE -_asctime_r = asctime_r SIGFE -asin NOSIGFE -_asin = asin NOSIGFE -asinf NOSIGFE -_asinf = asinf NOSIGFE -asinh NOSIGFE -_asinh = asinh NOSIGFE -asinhf NOSIGFE -_asinhf = asinhf NOSIGFE -asprintf SIGFE -_asprintf = asprintf SIGFE -atan NOSIGFE -_atan = atan NOSIGFE -atan2 NOSIGFE -_atan2 = atan2 NOSIGFE -atan2f NOSIGFE -_atan2f = atan2f NOSIGFE -atanf NOSIGFE -_atanf = atanf NOSIGFE -atanh NOSIGFE -_atanh = atanh NOSIGFE -atanhf NOSIGFE -_atanhf = atanhf NOSIGFE -atexit = cygwin_atexit SIGFE -_atexit = cygwin_atexit SIGFE -atof SIGFE -_atof = atof SIGFE -atoff SIGFE -_atoff = atoff SIGFE -atoi NOSIGFE -_atoi = atoi NOSIGFE -atol NOSIGFE -_atol = atol NOSIGFE -atoll NOSIGFE -basename NOSIGFE -bcmp NOSIGFE -_bcmp = bcmp NOSIGFE -bcopy NOSIGFE -_bcopy = bcopy NOSIGFE -bsearch NOSIGFE -_bsearch = bsearch NOSIGFE -btowc NOSIGFE -bzero NOSIGFE -_bzero = bzero NOSIGFE -cabs NOSIGFE -_cabs = cabs NOSIGFE -cabsf NOSIGFE -_cabsf = cabsf NOSIGFE -calloc SIGFE -_calloc = calloc SIGFE -cbrt NOSIGFE -_cbrt = cbrt NOSIGFE -cbrtf NOSIGFE -_cbrtf = cbrtf NOSIGFE -ceil NOSIGFE -_ceil = ceil NOSIGFE -ceilf NOSIGFE -_ceilf = ceilf NOSIGFE -cfgetispeed NOSIGFE -cfgetospeed NOSIGFE -cfsetispeed SIGFE -cfsetospeed SIGFE -chdir SIGFE -_chdir = chdir SIGFE -chmod SIGFE -_chmod = chmod SIGFE -chown SIGFE -_chown = chown SIGFE -_chown32 = chown32 SIGFE -chroot SIGFE -_chroot = chroot SIGFE -cleanup_glue NOSIGFE -clearerr SIGFE -_clearerr = clearerr SIGFE -clock SIGFE -_clock = clock SIGFE -clock_gettime SIGFE -clock_getres SIGFE -clock_setres SIGFE -close SIGFE -_close = close SIGFE -closedir SIGFE -_closedir = closedir SIGFE -closelog SIGFE -copysign NOSIGFE -_copysign = copysign NOSIGFE -copysignf NOSIGFE -_copysignf = copysignf NOSIGFE -cos NOSIGFE -_cos = cos NOSIGFE -cosf NOSIGFE -_cosf = cosf NOSIGFE -cosh NOSIGFE -_cosh = cosh NOSIGFE -coshf NOSIGFE -_coshf = coshf NOSIGFE -creat SIGFE -_creat = creat SIGFE -ctermid SIGFE -ctime SIGFE -_ctime = ctime SIGFE -ctime_r SIGFE -_ctime_r = ctime_r SIGFE -cuserid NOSIGFE -_cuserid = cuserid NOSIGFE -cwait SIGFE -_cwait = cwait SIGFE -accept = cygwin_accept SIGFE -cygwin_attach_handle_to_fd SIGFE -cygwin32_attach_handle_to_fd = cygwin_attach_handle_to_fd SIGFE -bind = cygwin_bind SIGFE -connect = cygwin_connect SIGFE -cygwin_conv_to_full_posix_path SIGFE -cygwin32_conv_to_full_posix_path = cygwin_conv_to_full_posix_path SIGFE -cygwin_conv_to_full_win32_path SIGFE -cygwin32_conv_to_full_win32_path = cygwin_conv_to_full_win32_path SIGFE -cygwin_conv_to_posix_path SIGFE -cygwin32_conv_to_posix_path = cygwin_conv_to_posix_path SIGFE -cygwin_conv_to_win32_path SIGFE -cygwin32_conv_to_win32_path = cygwin_conv_to_win32_path SIGFE -cygwin_detach_dll SIGFE_MAYBE -cygwin32_detach_dll = cygwin_detach_dll SIGFE_MAYBE -cygwin_dll_init NOSIGFE -endprotoent = cygwin_endprotoent SIGFE -endservent = cygwin_endservent SIGFE -endusershell SIGFE -err SIGFE -errx SIGFE -gethostbyaddr = cygwin_gethostbyaddr SIGFE -gethostbyname = cygwin_gethostbyname SIGFE -_gethostname = cygwin_gethostname SIGFE -gethostname = cygwin_gethostname SIGFE -getpeereid SIGFE -getpeername = cygwin_getpeername SIGFE -getprogname NOSIGFE -getprotobyname = cygwin_getprotobyname SIGFE -getprotobynumber = cygwin_getprotobynumber SIGFE -getprotoent = cygwin_getprotoent SIGFE -getservbyname = cygwin_getservbyname SIGFE -getservbyport = cygwin_getservbyport SIGFE -getservent = cygwin_getservent SIGFE -getsockname = cygwin_getsockname SIGFE -getsockopt = cygwin_getsockopt SIGFE -getsubopt NOSIGFE -getusershell SIGFE -herror = cygwin_herror SIGFE -hstrerror = cygwin_hstrerror NOSIGFE -inet_addr = cygwin_inet_addr SIGFE -inet_aton = cygwin_inet_aton SIGFE -inet_pton = cygwin_inet_pton SIGFE -inet_network = cygwin_inet_network SIGFE -inet_ntoa = cygwin_inet_ntoa SIGFE -inet_ntop = cygwin_inet_ntop SIGFE -cygwin_internal NOSIGFE -cygwin32_internal = cygwin_internal SIGFE -listen = cygwin_listen SIGFE -cygwin_logon_user SIGFE -lstat SIGFE -_lstat = lstat SIGFE -cygwin_posix_path_list_p NOSIGFE -cygwin32_posix_path_list_p = cygwin_posix_path_list_p NOSIGFE -cygwin_posix_to_win32_path_list SIGFE -cygwin32_posix_to_win32_path_list = cygwin_posix_to_win32_path_list SIGFE -cygwin_posix_to_win32_path_list_buf_size SIGFE -cygwin32_posix_to_win32_path_list_buf_size = cygwin_posix_to_win32_path_list_buf_size SIGFE -rcmd = cygwin_rcmd SIGFE -recv = cygwin_recv SIGFE -recvfrom = cygwin_recvfrom SIGFE -recvmsg = cygwin_recvmsg SIGFE -rexec = cygwin_rexec SIGFE -rresvport = cygwin_rresvport SIGFE -_select = cygwin_select SIGFE -select = cygwin_select SIGFE -pread SIGFE -pwrite SIGFE -pselect SIGFE -send = cygwin_send SIGFE -sendmsg = cygwin_sendmsg SIGFE -sendto = cygwin_sendto SIGFE -cygwin_set_impersonation_token SIGFE -setprogname NOSIGFE -setprotoent = cygwin_setprotoent SIGFE -setservent = cygwin_setservent SIGFE -setsockopt = cygwin_setsockopt SIGFE -setusershell SIGFE -shutdown = cygwin_shutdown SIGFE -socket = cygwin_socket SIGFE -cygwin_split_path NOSIGFE -cygwin32_split_path = cygwin_split_path NOSIGFE -cygwin_stackdump SIGFE -cygwin_umount SIGFE -cygwin_win32_to_posix_path_list SIGFE -cygwin32_win32_to_posix_path_list = cygwin_win32_to_posix_path_list SIGFE -cygwin_win32_to_posix_path_list_buf_size SIGFE -cygwin32_win32_to_posix_path_list_buf_size = cygwin_win32_to_posix_path_list_buf_size SIGFE -cygwin_winpid_to_pid SIGFE -cygwin32_winpid_to_pid = cygwin_winpid_to_pid SIGFE -daemon SIGFE -difftime NOSIGFE -_difftime = difftime NOSIGFE -dirfd SIGFE -_dirfd = dirfd SIGFE -dirname NOSIGFE -div NOSIGFE -_div = div NOSIGFE -dlclose SIGFE -dlerror NOSIGFE -dlfork NOSIGFE -dll_crt0__FP11per_process NOSIGFE -dll_dllcrt0 NOSIGFE -dll_noncygwin_dllcrt0 NOSIGFE -dlopen SIGFE -dlsym SIGFE -drand48 NOSIGFE -_drand48 = drand48 NOSIGFE -drem NOSIGFE -_drem = drem NOSIGFE -dremf NOSIGFE -_dremf = dremf NOSIGFE -dup SIGFE -_dup = dup SIGFE -dup2 SIGFE -_dup2 = dup2 SIGFE -ecvt SIGFE -_ecvt = ecvt SIGFE -ecvtbuf SIGFE -_ecvtbuf = ecvtbuf SIGFE -ecvtf SIGFE -_ecvtf = ecvtf SIGFE -endgrent NOSIGFE -_endgrent = endgrent NOSIGFE -endhostent NOSIGFE -endmntent NOSIGFE -_endmntent = endmntent NOSIGFE -endpwent NOSIGFE -_endpwent = endpwent NOSIGFE -endutent SIGFE -_endutent = endutent SIGFE -endutxent SIGFE -envz_add SIGFE -__envz_add = envz_add SIGFE -envz_entry NOSIGFE -__envz_entry = envz_entry NOSIGFE -envz_get NOSIGFE -__envz_get = envz_get NOSIGFE -envz_merge SIGFE -__envz_merge = envz_merge SIGFE -envz_remove SIGFE -__envz_remove = envz_remove SIGFE -envz_strip SIGFE -__envz_strip = envz_strip SIGFE -erand48 NOSIGFE -_erand48 = erand48 NOSIGFE -erf NOSIGFE -_erf = erf NOSIGFE -erfc NOSIGFE -_erfc = erfc NOSIGFE -erfcf NOSIGFE -_erfcf = erfcf NOSIGFE -erff NOSIGFE -_erff = erff NOSIGFE -execl SIGFE -_execl = execl SIGFE -execle SIGFE -_execle = execle SIGFE -execlp SIGFE -_execlp = execlp SIGFE -execv SIGFE -_execv = execv SIGFE -execve SIGFE -_execve = execve SIGFE -execvp SIGFE -_execvp = execvp SIGFE -exit = cygwin_exit SIGFE -exp NOSIGFE -_exp = exp NOSIGFE -exp2 NOSIGFE -exp2f NOSIGFE -expf NOSIGFE -_expf = expf NOSIGFE -expm1 NOSIGFE -_expm1 = expm1 NOSIGFE -expm1f NOSIGFE -_expm1f = expm1f NOSIGFE -fabs NOSIGFE -_fabs = fabs NOSIGFE -fabsf NOSIGFE -_fabsf = fabsf NOSIGFE -facl SIGFE -_facl = facl SIGFE -_facl32 = facl32 SIGFE -fchdir SIGFE -_fchdir = fchdir SIGFE -fchmod SIGFE -_fchmod = fchmod SIGFE -fchown SIGFE -_fchown = fchown SIGFE -_fchown32 = fchown32 SIGFE -fclose SIGFE -_fclose = fclose SIGFE -fcloseall SIGFE -_fcloseall = fcloseall SIGFE -fcntl SIGFE -_fcntl = fcntl SIGFE -_fcntl64 = fcntl64 SIGFE -fcvt SIGFE -_fcvt = fcvt SIGFE -fcvtbuf SIGFE -_fcvtbuf = fcvtbuf SIGFE -fcvtf SIGFE -_fcvtf = fcvtf SIGFE -fdim NOSIGFE -fdimf NOSIGFE -fdopen SIGFE -_fdopen = fdopen SIGFE -_fdopen64 = fdopen64 SIGFE -feof SIGFE -_feof = feof SIGFE -ferror SIGFE -_ferror = ferror SIGFE -fflush SIGFE -_fflush = fflush SIGFE -ffs NOSIGFE -_ffs = ffs NOSIGFE -fgetc SIGFE -_fgetc = fgetc SIGFE -fgetpos SIGFE -_fgetpos = fgetpos SIGFE -_fgetpos64 = fgetpos64 SIGFE -fgets SIGFE -_fgets = fgets SIGFE -fileno SIGFE -_fileno = fileno SIGFE -finite NOSIGFE -_finite = finite NOSIGFE -finitef NOSIGFE -_finitef = finitef NOSIGFE -fiprintf SIGFE -_fiprintf = fiprintf SIGFE -flock SIGFE -flockfile SIGFE -ftrylockfile SIGFE -fts_children SIGFE -fts_close SIGFE -fts_get_clientptr NOSIGFE -fts_get_stream NOSIGFE -fts_open SIGFE -fts_read SIGFE -fts_set NOSIGFE -fts_set_clientptr NOSIGFE -ftw SIGFE -nftw SIGFE -funlockfile SIGFE -floor NOSIGFE -_floor = floor NOSIGFE -floorf NOSIGFE -_floorf = floorf NOSIGFE -fma NOSIGFE -fmaf NOSIGFE -fmax NOSIGFE -fmaxf NOSIGFE -fmin NOSIGFE -fminf NOSIGFE -fmod NOSIGFE -_fmod = fmod NOSIGFE -fmodf NOSIGFE -_fmodf = fmodf NOSIGFE -fnmatch NOSIGFE -_fnmatch = fnmatch NOSIGFE -fopen SIGFE -_fopen = fopen SIGFE -_fopen64 = fopen64 SIGFE -fork SIGFE -_fork = fork SIGFE -forkpty SIGFE -fpathconf SIGFE -fprintf SIGFE -_fprintf = fprintf SIGFE -fputc SIGFE -_fputc = fputc SIGFE -fputs SIGFE -_fputs = fputs SIGFE -fread SIGFE -_fread = fread SIGFE -free SIGFE -_free = free SIGFE -freopen SIGFE -_freopen = freopen SIGFE -_freopen64 = freopen64 SIGFE -frexp NOSIGFE -_frexp = frexp NOSIGFE -frexpf NOSIGFE -_frexpf = frexpf NOSIGFE -fscanf SIGFE -_fscanf = fscanf SIGFE -fseek SIGFE -_fseek = fseek SIGFE -fseeko SIGFE -_fseeko = fseeko SIGFE -_fseeko64 = fseeko64 SIGFE -fsetpos SIGFE -_fsetpos = fsetpos SIGFE -_fsetpos64 = fsetpos64 SIGFE -_fstat64 = fstat64 SIGFE -fstatfs SIGFE -_fstatfs = fstatfs SIGFE -fstatvfs SIGFE -fdatasync SIGFE -fsync SIGFE -_fsync = fsync SIGFE -ftell SIGFE -_ftell = ftell SIGFE -ftello SIGFE -_ftello = ftello SIGFE -_ftello64 = ftello64 SIGFE -ftime SIGFE -_ftime = ftime SIGFE -ftok SIGFE -_ftok = ftok SIGFE -ftruncate SIGFE -_ftruncate = ftruncate SIGFE -_ftruncate64 = ftruncate64 SIGFE -fwrite SIGFE -_fwrite = fwrite SIGFE -gamma NOSIGFE -_gamma = gamma NOSIGFE -gamma_r NOSIGFE -_gamma_r = gamma_r NOSIGFE -gammaf NOSIGFE -_gammaf = gammaf NOSIGFE -gammaf_r NOSIGFE -_gammaf_r = gammaf_r NOSIGFE -gcvt SIGFE -_gcvt = gcvt SIGFE -gcvtf SIGFE -_gcvtf = gcvtf SIGFE -get_osfhandle SIGFE -_get_osfhandle = get_osfhandle SIGFE -getc SIGFE -_getc = getc SIGFE -getc_unlocked SIGFE -_getc_unlocked = getc_unlocked SIGFE -getchar SIGFE -_getchar = getchar SIGFE -getchar_unlocked SIGFE -_getchar_unlocked = getchar_unlocked SIGFE -getcwd SIGFE -_getcwd = getcwd SIGFE -__getdelim SIGFE -getdelim = __getdelim SIGFE -getdomainname SIGFE -_getdomainname = getdomainname SIGFE -getdtablesize NOSIGFE -_getdtablesize = getdtablesize NOSIGFE -getegid NOSIGFE -_getegid = getegid NOSIGFE -_getegid32 = getegid32 NOSIGFE -getenv NOSIGFE -_getenv = getenv NOSIGFE -geteuid NOSIGFE -_geteuid = geteuid NOSIGFE -_geteuid32 = geteuid32 NOSIGFE -getgid NOSIGFE -_getgid = getgid NOSIGFE -_getgid32 = getgid32 NOSIGFE -getgrent SIGFE -_getgrent = getgrent SIGFE -_getgrent32 = getgrent32 SIGFE -getgrgid_r SIGFE -getgrgid SIGFE -_getgrgid = getgrgid SIGFE -_getgrgid32 = getgrgid32 SIGFE -getgrnam_r SIGFE -getgrnam SIGFE -_getgrnam = getgrnam SIGFE -_getgrnam32 = getgrnam32 SIGFE -getgroups SIGFE -_getgroups = getgroups SIGFE -_getgroups32 = getgroups32 SIGFE -gethostid SIGFE -getitimer SIGFE -__getline SIGFE -getline = __getline SIGFE -getlogin_r NOSIGFE -getlogin NOSIGFE -_getlogin = getlogin NOSIGFE -getmntent SIGFE -_getmntent = getmntent SIGFE -getmode SIGFE -_getmode = getmode SIGFE -getopt SIGFE -getopt_long SIGFE -getopt_long_only SIGFE -getpagesize SIGFE -_getpagesize = getpagesize SIGFE -getpass SIGFE -_getpass = getpass SIGFE -getpgid SIGFE -getpgrp SIGFE -_getpgrp = getpgrp SIGFE -getpid NOSIGFE -_getpid = getpid NOSIGFE -getppid NOSIGFE -_getppid = getppid NOSIGFE -getpriority SIGFE -getpwduid NOSIGFE -_getpwduid = getpwduid NOSIGFE -getpwent SIGFE -_getpwent = getpwent SIGFE -getpwnam SIGFE -_getpwnam = getpwnam SIGFE -getpwnam_r SIGFE -getpwuid SIGFE -_getpwuid = getpwuid SIGFE -_getpwuid32 = getpwuid32 SIGFE -getpwuid_r SIGFE -_getpwuid_r32 = getpwuid_r32 SIGFE -getrlimit SIGFE -_getrlimit = getrlimit SIGFE -getrusage SIGFE -_getrusage = getrusage SIGFE -gets SIGFE -_gets = gets SIGFE -getsid SIGFE -gettimeofday SIGFE -_gettimeofday = gettimeofday SIGFE -getuid NOSIGFE -_getuid = getuid NOSIGFE -_getuid32 = getuid32 NOSIGFE -getutent SIGFE -_getutent = getutent SIGFE -getutid SIGFE -_getutid = getutid SIGFE -getutline SIGFE -_getutline = getutline SIGFE -getutxent SIGFE -getutxid SIGFE -getutxline SIGFE -getw SIGFE -_getw = getw SIGFE -getwd SIGFE -_getwd = getwd SIGFE -glob SIGFE -_glob = glob SIGFE -globfree SIGFE -_globfree = globfree SIGFE -gmtime SIGFE -_gmtime = gmtime SIGFE -gmtime_r SIGFE -_gmtime_r = gmtime_r SIGFE -grantpt NOSIGFE -hcreate SIGFE -hcreate_r SIGFE -hdestroy SIGFE -hdestroy_r SIGFE -hsearch SIGFE -hsearch_r SIGFE -htonl NOSIGFE -_htonl = htonl NOSIGFE -htons NOSIGFE -_htons = htons NOSIGFE -hypot NOSIGFE -_hypot = hypot NOSIGFE -hypotf NOSIGFE -_hypotf = hypotf NOSIGFE -ilogb NOSIGFE -_ilogb = ilogb NOSIGFE -ilogbf NOSIGFE -_ilogbf = ilogbf NOSIGFE -imaxabs = llabs NOSIGFE -imaxdiv = lldiv NOSIGFE -index NOSIGFE -_index = index NOSIGFE -inet_makeaddr NOSIGFE -inet_netof NOSIGFE -infinity NOSIGFE -_infinity = infinity NOSIGFE -infinityf NOSIGFE -_infinityf = infinityf NOSIGFE -initgroups SIGFE -_initgroups32 = initgroups32 SIGFE -initstate NOSIGFE -ioctl SIGFE -_ioctl = ioctl SIGFE -iprintf SIGFE -_iprintf = iprintf SIGFE -iruserok SIGFE -ruserok SIGFE -isalnum NOSIGFE -_isalnum = isalnum NOSIGFE -isalpha NOSIGFE -_isalpha = isalpha NOSIGFE -isascii NOSIGFE -_isascii = isascii NOSIGFE -isatty SIGFE -_isatty = isatty SIGFE -isblank NOSIGFE -iscntrl NOSIGFE -_iscntrl = iscntrl NOSIGFE -isdigit NOSIGFE -_isdigit = isdigit NOSIGFE -isgraph NOSIGFE -_isgraph = isgraph NOSIGFE -isinf NOSIGFE -_isinf = isinf NOSIGFE -isinff NOSIGFE -_isinff = isinff NOSIGFE -islower NOSIGFE -_islower = islower NOSIGFE -isnan NOSIGFE -_isnan = isnan NOSIGFE -isnanf NOSIGFE -_isnanf = isnanf NOSIGFE -isprint NOSIGFE -_isprint = isprint NOSIGFE -ispunct NOSIGFE -_ispunct = ispunct NOSIGFE -isspace NOSIGFE -_isspace = isspace NOSIGFE -isupper NOSIGFE -_isupper = isupper NOSIGFE -iswalnum NOSIGFE -iswalpha NOSIGFE -iswblank NOSIGFE -iswcntrl NOSIGFE -iswctype NOSIGFE -iswdigit NOSIGFE -iswgraph NOSIGFE -iswlower NOSIGFE -iswprint NOSIGFE -iswpunct NOSIGFE -iswspace NOSIGFE -iswupper NOSIGFE -iswxdigit NOSIGFE -isxdigit NOSIGFE -_isxdigit = isxdigit NOSIGFE -j0 NOSIGFE -_j0 = j0 NOSIGFE -j0f NOSIGFE -_j0f = j0f NOSIGFE -j1 NOSIGFE -_j1 = j1 NOSIGFE -j1f NOSIGFE -_j1f = j1f NOSIGFE -jn NOSIGFE -_jn = jn NOSIGFE -jnf NOSIGFE -_jnf = jnf NOSIGFE -jrand48 NOSIGFE -_jrand48 = jrand48 NOSIGFE -kill SIGFE -_kill = kill SIGFE -killpg SIGFE -l64a NOSIGFE -labs NOSIGFE -_labs = labs NOSIGFE -lacl SIGFE -_lacl = lacl SIGFE -lchown SIGFE -_lchown = lchown SIGFE -_lchown32 = lchown32 SIGFE -lcong48 NOSIGFE -_lcong48 = lcong48 NOSIGFE -ldexp NOSIGFE -_ldexp = ldexp NOSIGFE -ldexpf NOSIGFE -_ldexpf = ldexpf NOSIGFE -ldiv NOSIGFE -_ldiv = ldiv NOSIGFE -lfind NOSIGFE -lgamma NOSIGFE -_lgamma = lgamma NOSIGFE -lgamma_r NOSIGFE -_lgamma_r = lgamma_r NOSIGFE -lgammaf NOSIGFE -_lgammaf = lgammaf NOSIGFE -lgammaf_r NOSIGFE -_lgammaf_r = lgammaf_r NOSIGFE -link SIGFE -_link = link SIGFE -llabs NOSIGFE -lldiv NOSIGFE -localeconv NOSIGFE -_localeconv = localeconv NOSIGFE -localtime SIGFE -_localtime = localtime SIGFE -localtime_r SIGFE -_localtime_r = localtime_r SIGFE -log NOSIGFE -_log = log NOSIGFE -log10 NOSIGFE -_log10 = log10 NOSIGFE -log10f NOSIGFE -_log10f = log10f NOSIGFE -log1p NOSIGFE -_log1p = log1p NOSIGFE -log1pf NOSIGFE -_log1pf = log1pf NOSIGFE -logb NOSIGFE -_logb = logb NOSIGFE -logbf NOSIGFE -_logbf = logbf NOSIGFE -logf NOSIGFE -_logf = logf NOSIGFE -login SIGFE -login_tty SIGFE -logout SIGFE -logwtmp SIGFE -updwtmp SIGFE -updwtmpx SIGFE -longjmp NOSIGFE -_longjmp = longjmp NOSIGFE -lrand48 NOSIGFE -_lrand48 = lrand48 NOSIGFE -lrint NOSIGFE -lrintf NOSIGFE -lround NOSIGFE -lroundf NOSIGFE -lsearch NOSIGFE -lseek SIGFE -_lseek = lseek SIGFE -_lseek64 = lseek64 SIGFE -_lstat64 = lstat64 SIGFE -mallinfo SIGFE -malloc SIGFE -_malloc = malloc SIGFE -malloc_stats SIGFE -malloc_trim SIGFE -malloc_usable_size SIGFE -mallopt SIGFE -matherr NOSIGFE -_matherr = matherr NOSIGFE -mblen NOSIGFE -_mblen = mblen NOSIGFE -mbrlen NOSIGFE -mbrtowc NOSIGFE -mbsinit NOSIGFE -mbsrtowcs NOSIGFE -mbstowcs NOSIGFE -_mbstowcs = mbstowcs NOSIGFE -mbtowc NOSIGFE -_mbtowc = mbtowc NOSIGFE -memalign SIGFE -memccpy NOSIGFE -_memccpy = memccpy NOSIGFE -memchr NOSIGFE -_memchr = memchr NOSIGFE -memcmp NOSIGFE -_memcmp = memcmp NOSIGFE -memcpy NOSIGFE -_memcpy = memcpy NOSIGFE -memmove NOSIGFE -_memmove = memmove NOSIGFE -mempcpy NOSIGFE -__mempcpy = mempcpy NOSIGFE -memmem NOSIGFE -memset NOSIGFE -_memset = memset NOSIGFE -mkdir SIGFE -_mkdir = mkdir SIGFE -mkdtemp SIGFE -mkfifo SIGFE -mknod SIGFE -_mknod = mknod SIGFE -_mknod32 = mknod32 SIGFE -mkstemp SIGFE -_mkstemp = mkstemp SIGFE -mktemp SIGFE -_mktemp = mktemp SIGFE -mktime SIGFE -_mktime = mktime SIGFE -mmap SIGFE -_mmap64 = mmap64 SIGFE -modf NOSIGFE -_modf = modf NOSIGFE -modff NOSIGFE -_modff = modff NOSIGFE -mount SIGFE -_mount = mount SIGFE -mprotect SIGFE -mlock SIGFE -munlock SIGFE -mrand48 NOSIGFE -msgctl SIGFE -msgget SIGFE -msgrcv SIGFE -msgsnd SIGFE -msync SIGFE -munmap SIGFE -nan NOSIGFE -_nan = nan NOSIGFE -nanf NOSIGFE -_nanf = nanf NOSIGFE -nanosleep SIGFE -_nanosleep = nanosleep SIGFE -nearbyint NOSIGFE -nearbyintf NOSIGFE -nextafter NOSIGFE -_nextafter = nextafter NOSIGFE -nextafterf NOSIGFE -_nextafterf = nextafterf NOSIGFE -nice SIGFE -_nice = nice SIGFE -nl_langinfo SIGFE -_nl_langinfo = nl_langinfo SIGFE -nrand48 NOSIGFE -_nrand48 = nrand48 NOSIGFE -ntohl NOSIGFE -_ntohl = ntohl NOSIGFE -ntohs NOSIGFE -_ntohs = ntohs NOSIGFE -on_exit SIGFE -open SIGFE -_open = open SIGFE -_open64 -opendir SIGFE -__opendir_with_d_ino SIGFE -openlog SIGFE -_openlog = openlog SIGFE -openpty SIGFE -pathconf SIGFE -_pathconf = pathconf SIGFE -pause SIGFE -pclose SIGFE -_pclose = pclose SIGFE -perror SIGFE -_perror = perror SIGFE -pipe SIGFE -poll SIGFE -_poll = poll SIGFE -popen SIGFE -_popen = popen SIGFE -posix_regcomp SIGFE -posix_regerror SIGFE -posix_regexec SIGFE -posix_regfree SIGFE -pow NOSIGFE -_pow = pow NOSIGFE -powf NOSIGFE -_powf = powf NOSIGFE -printf SIGFE -_printf = printf SIGFE -pthread_atfork SIGFE -pthread_attr_destroy SIGFE -pthread_attr_getdetachstate SIGFE -pthread_attr_getinheritsched SIGFE -pthread_attr_getschedparam SIGFE -pthread_attr_getschedpolicy SIGFE -pthread_attr_getscope SIGFE -pthread_attr_getstacksize SIGFE -pthread_attr_init SIGFE -pthread_attr_setdetachstate SIGFE -pthread_attr_setinheritsched SIGFE -pthread_attr_setschedparam SIGFE -pthread_attr_setschedpolicy SIGFE -pthread_attr_setscope SIGFE -pthread_attr_setstacksize SIGFE -pthread_cancel SIGFE -pthread_cond_broadcast SIGFE -pthread_cond_destroy SIGFE -pthread_cond_init SIGFE -pthread_cond_signal SIGFE -pthread_cond_timedwait SIGFE -pthread_cond_wait SIGFE -pthread_condattr_destroy SIGFE -pthread_condattr_getpshared SIGFE -pthread_condattr_init SIGFE -pthread_condattr_setpshared SIGFE -pthread_continue SIGFE -pthread_create SIGFE -pthread_detach SIGFE -pthread_equal SIGFE -pthread_exit SIGFE -pthread_getconcurrency SIGFE -pthread_getschedparam SIGFE -pthread_getsequence_np SIGFE -pthread_getspecific SIGFE -pthread_join SIGFE -pthread_key_create SIGFE -pthread_key_delete SIGFE -pthread_kill SIGFE -pthread_mutex_destroy SIGFE -pthread_mutex_getprioceiling SIGFE -pthread_mutex_init SIGFE -pthread_mutex_lock SIGFE -pthread_mutex_setprioceiling SIGFE -pthread_mutex_trylock SIGFE -pthread_mutex_unlock SIGFE -pthread_mutexattr_destroy SIGFE -pthread_mutexattr_getprioceiling SIGFE -pthread_mutexattr_getprotocol SIGFE -pthread_mutexattr_getpshared SIGFE -pthread_mutexattr_gettype SIGFE -pthread_mutexattr_init SIGFE -pthread_mutexattr_setprioceiling SIGFE -pthread_mutexattr_setprotocol SIGFE -pthread_mutexattr_setpshared SIGFE -pthread_mutexattr_settype SIGFE -pthread_once SIGFE -pthread_rwlock_destroy SIGFE -pthread_rwlock_init SIGFE -pthread_rwlock_rdlock SIGFE -pthread_rwlock_tryrdlock SIGFE -pthread_rwlock_wrlock SIGFE -pthread_rwlock_trywrlock SIGFE -pthread_rwlock_unlock SIGFE -pthread_rwlockattr_init SIGFE -pthread_rwlockattr_getpshared SIGFE -pthread_rwlockattr_setpshared SIGFE -pthread_rwlockattr_destroy SIGFE -pthread_self SIGFE -pthread_setcancelstate SIGFE -pthread_setcanceltype SIGFE -pthread_setconcurrency SIGFE -pthread_setschedparam SIGFE -pthread_setspecific SIGFE -pthread_sigmask SIGFE -pthread_suspend SIGFE -pthread_testcancel SIGFE -ptsname SIGFE -putc SIGFE -_putc = putc SIGFE -putc_unlocked SIGFE -_putc_unlocked = putc_unlocked SIGFE -putchar SIGFE -_putchar = putchar SIGFE -putchar_unlocked SIGFE -_putchar_unlocked = putchar_unlocked SIGFE -putenv SIGFE -_putenv = putenv SIGFE -puts SIGFE -_puts = puts SIGFE -pututline SIGFE -_pututline = pututline SIGFE -pututxline SIGFE -putw SIGFE -_putw = putw SIGFE -qsort NOSIGFE -_qsort = qsort NOSIGFE -raise SIGFE -_raise = raise SIGFE -rand NOSIGFE -_rand = rand NOSIGFE -rand_r NOSIGFE -random NOSIGFE -read SIGFE -_read = read SIGFE -readdir SIGFE -_readdir = readdir SIGFE -readdir_r SIGFE -readlink SIGFE -_readlink = readlink SIGFE -readv SIGFE -_readv = readv SIGFE -realloc SIGFE -_realloc = realloc SIGFE -realpath SIGFE -remainder NOSIGFE -_remainder = remainder NOSIGFE -remainderf NOSIGFE -_remainderf = remainderf NOSIGFE -remove SIGFE -_remove = remove SIGFE -remquo NOSIGFE -remquof NOSIGFE -rename SIGFE -_rename = rename SIGFE -revoke SIGFE -rewind SIGFE -_rewind = rewind SIGFE -rewinddir SIGFE -_rewinddir = rewinddir SIGFE -rindex NOSIGFE -_rindex = rindex NOSIGFE -rint NOSIGFE -_rint = rint NOSIGFE -rintf NOSIGFE -_rintf = rintf NOSIGFE -rmdir SIGFE -_rmdir = rmdir SIGFE -round NOSIGFE -roundf NOSIGFE -sbrk SIGFE -_sbrk = sbrk SIGFE -scalb NOSIGFE -_scalb = scalb NOSIGFE -scalbf NOSIGFE -_scalbf = scalbf NOSIGFE -scalbln NOSIGFE -scalblnf NOSIGFE -scalbn NOSIGFE -_scalbn = scalbn NOSIGFE -scalbnf NOSIGFE -_scalbnf = scalbnf NOSIGFE -scandir SIGFE -_scandir = scandir SIGFE -scanf SIGFE -_scanf = scanf SIGFE -sched_get_priority_max SIGFE -sched_get_priority_min SIGFE -sched_getparam SIGFE -sched_getscheduler NOSIGFE -sched_rr_get_interval SIGFE -sched_setparam SIGFE -sched_setscheduler SIGFE -sched_yield SIGFE -seed48 NOSIGFE -_seed48 = seed48 NOSIGFE -seekdir SIGFE -_seekdir = seekdir SIGFE -_seekdir64 = seekdir64 SIGFE -sem_close SIGFE -sem_destroy SIGFE -sem_getvalue SIGFE -sem_init SIGFE -sem_open SIGFE -sem_post SIGFE -sem_timedwait SIGFE -sem_trywait SIGFE -sem_wait SIGFE -semctl SIGFE -semget SIGFE -semop SIGFE -setbuf SIGFE -_setbuf = setbuf SIGFE -setbuffer SIGFE -setdtablesize SIGFE -_setdtablesize = setdtablesize SIGFE -setegid SIGFE -_setegid = setegid SIGFE -_setegid32 = setegid32 SIGFE -setenv SIGFE -_setenv = setenv SIGFE -seteuid SIGFE -_seteuid = seteuid SIGFE -_seteuid32 = seteuid32 SIGFE -setgid SIGFE -_setgid = setgid SIGFE -_setgid32 = setgid32 SIGFE -setgrent NOSIGFE -_setgrent = setgrent NOSIGFE -setgroups SIGFE -_setgroups = setgroups SIGFE -_setgroups32 = setgroups32 SIGFE -sethostent NOSIGFE -setitimer SIGFE -setjmp NOSIGFE -_setjmp = setjmp NOSIGFE -setlinebuf SIGFE -setlocale NOSIGFE -_setlocale = setlocale NOSIGFE -setlogmask NOSIGFE -setmntent SIGFE -_setmntent = setmntent SIGFE -setmode = cygwin_setmode SIGFE -_setmode = cygwin_setmode SIGFE -setpassent NOSIGFE -_setpassent = setpassent NOSIGFE -setpgid SIGFE -_setpgid = setpgid SIGFE -setpgrp SIGFE -_setpgrp = setpgrp SIGFE -setpriority SIGFE -setpwent NOSIGFE -_setpwent = setpwent NOSIGFE -setregid SIGFE -_setregid = setregid SIGFE -setregid32 SIGFE -_setregid32 = setregid32 SIGFE -setreuid SIGFE -_setreuid = setreuid SIGFE -setreuid32 SIGFE -_setreuid32 = setreuid32 SIGFE -setrlimit SIGFE -_setrlimit = setrlimit SIGFE -setsid SIGFE -_setsid = setsid SIGFE -setstate NOSIGFE -settimeofday SIGFE -_settimeofday = settimeofday SIGFE -setuid SIGFE -_setuid = setuid SIGFE -_setuid32 = setuid32 SIGFE -setutent SIGFE -_setutent = setutent SIGFE -setutxent SIGFE -setvbuf SIGFE -_setvbuf = setvbuf SIGFE -sexecl = sexecve_is_bad SIGFE -sexecle = sexecve_is_bad SIGFE -sexeclp = sexecve_is_bad SIGFE -sexeclpe = sexecve_is_bad SIGFE -sexecp = sexecve_is_bad SIGFE -sexecv = sexecve_is_bad SIGFE -sexecve = sexecve_is_bad SIGFE -sexecvpe = sexecve_is_bad SIGFE -shmat SIGFE -shmctl SIGFE -shmdt SIGFE -shmget SIGFE -sigaction SIGFE -sigaddset SIGFE -sigdelset SIGFE -sigemptyset NOSIGFE -sigfillset NOSIGFE -sighold SIGFE -sigignore SIGFE -sigqueue SIGFE -siginterrupt SIGFE -sigismember SIGFE -signal SIGFE -significand NOSIGFE -significandf NOSIGFE -sigpause SIGFE -sigpending SIGFE -sigprocmask SIGFE -sigrelse SIGFE -sigset SIGFE -sigsuspend SIGFE -sigwait SIGFE -sigwaitinfo SIGFE -sin NOSIGFE -_sin = sin NOSIGFE -sincos NOSIGFE -sincosf NOSIGFE -sinf NOSIGFE -_sinf = sinf NOSIGFE -sinh NOSIGFE -_sinh = sinh NOSIGFE -sinhf NOSIGFE -_sinhf = sinhf NOSIGFE -siprintf SIGFE -_siprintf = siprintf SIGFE -sleep SIGFE -_sleep = sleep SIGFE -snprintf SIGFE -_snprintf = snprintf SIGFE -socketpair SIGFE -spawnl SIGFE -_spawnl = spawnl SIGFE -spawnle SIGFE -_spawnle = spawnle SIGFE -spawnlp SIGFE -_spawnlp = spawnlp SIGFE -spawnlpe SIGFE -_spawnlpe = spawnlpe SIGFE -spawnv SIGFE -_spawnv = spawnv SIGFE -spawnve SIGFE -_spawnve = spawnve SIGFE -spawnvp SIGFE -_spawnvp = spawnvp SIGFE -spawnvpe SIGFE -_spawnvpe = spawnvpe SIGFE -sprintf SIGFE -_sprintf = sprintf SIGFE -sqrt NOSIGFE -_sqrt = sqrt NOSIGFE -sqrtf NOSIGFE -_sqrtf = sqrtf NOSIGFE -srand NOSIGFE -_srand = srand NOSIGFE -srand48 NOSIGFE -_srand48 = srand48 NOSIGFE -srandom NOSIGFE -sscanf SIGFE -_sscanf = sscanf SIGFE -_stat64 = stat64 SIGFE -statfs SIGFE -_statfs = statfs SIGFE -statvfs SIGFE -strcasecmp NOSIGFE -_strcasecmp = strcasecmp NOSIGFE -strcat NOSIGFE -_strcat = strcat NOSIGFE -strchr NOSIGFE -_strchr = strchr NOSIGFE -strcmp NOSIGFE -_strcmp = strcmp NOSIGFE -strcoll NOSIGFE -_strcoll = strcoll NOSIGFE -strcpy NOSIGFE -_strcpy = strcpy NOSIGFE -strcspn NOSIGFE -_strcspn = strcspn NOSIGFE -strdup SIGFE -_strdup = strdup SIGFE -strerror SIGFE -_strerror = strerror SIGFE -strerror_r SIGFE -_strerror_r = strerror_r SIGFE -strftime SIGFE -_strftime = strftime SIGFE -strlcat NOSIGFE -_strlcat = strlcat NOSIGFE -strlcpy NOSIGFE -_strlcpy = strlcpy NOSIGFE -strlen NOSIGFE -_strlen = strlen NOSIGFE -strlwr NOSIGFE -_strlwr = strlwr NOSIGFE -strncasecmp NOSIGFE -_strncasecmp = strncasecmp NOSIGFE -strncat NOSIGFE -_strncat = strncat NOSIGFE -strncmp NOSIGFE -_strncmp = strncmp NOSIGFE -strncpy NOSIGFE -_strncpy = strncpy NOSIGFE -strndup SIGFE -strnlen NOSIGFE -strpbrk NOSIGFE -_strpbrk = strpbrk NOSIGFE -strptime SIGFE -_strptime = strptime SIGFE -strrchr NOSIGFE -_strrchr = strrchr NOSIGFE -strsep NOSIGFE -_strsep = strsep NOSIGFE -strsignal SIGFE -strspn NOSIGFE -_strspn = strspn NOSIGFE -strstr NOSIGFE -_strstr = strstr NOSIGFE -strtod SIGFE -_strtod = strtod SIGFE -strtof SIGFE -_strtodf = strtof SIGFE -strtodf = strtof SIGFE -strtok NOSIGFE -_strtok = strtok NOSIGFE -strtok_r NOSIGFE -_strtok_r = strtok_r NOSIGFE -strtol NOSIGFE -_strtol = strtol NOSIGFE -strtoll NOSIGFE -_strtoll = strtoll NOSIGFE -strtoimax = strtoll NOSIGFE -strtosigno NOSIGFE -strtoul NOSIGFE -_strtoul = strtoul NOSIGFE -strtoull NOSIGFE -_strtoull = strtoull NOSIGFE -strtoumax = strtoull NOSIGFE -strupr NOSIGFE -_strupr = strupr NOSIGFE -strxfrm NOSIGFE -_strxfrm = strxfrm NOSIGFE -swab NOSIGFE -_swab = swab NOSIGFE -symlink SIGFE -_symlink = symlink SIGFE -sync SIGFE -sysconf SIGFE -_sysconf = sysconf SIGFE -syslog SIGFE -_syslog = syslog SIGFE -vsyslog SIGFE -system SIGFE -_system = system SIGFE -tan NOSIGFE -_tan = tan NOSIGFE -tanf NOSIGFE -_tanf = tanf NOSIGFE -tanh NOSIGFE -_tanh = tanh NOSIGFE -tanhf NOSIGFE -_tanhf = tanhf NOSIGFE -tcdrain SIGFE -_tcdrain = tcdrain SIGFE -tcflow SIGFE -_tcflow = tcflow SIGFE -tcflush SIGFE -_tcflush = tcflush SIGFE -tcgetattr SIGFE -_tcgetattr = tcgetattr SIGFE -tcgetpgrp SIGFE -_tcgetpgrp = tcgetpgrp SIGFE -tcsendbreak SIGFE -_tcsendbreak = tcsendbreak SIGFE -tcsetattr SIGFE -_tcsetattr = tcsetattr SIGFE -tcsetpgrp SIGFE -_tcsetpgrp = tcsetpgrp SIGFE -tdelete SIGFE -tdestroy NOSIGFE -telldir SIGFE -_telldir = telldir SIGFE -_telldir64 = telldir64 SIGFE -tempnam SIGFE -_tempnam = tempnam SIGFE -tfind NOSIGFE -tgamma NOSIGFE -tgammaf NOSIGFE -time SIGFE -timelocal SIGFE -timegm NOSIGFE -_time = time SIGFE -timer_create SIGFE -timer_delete SIGFE -timer_gettime SIGFE -timer_settime SIGFE -times SIGFE -_times = times SIGFE -timezone SIGFE -tmpfile SIGFE -_tmpfile = tmpfile SIGFE -_tmpfile64 = tmpfile64 SIGFE -tmpnam SIGFE -_tmpnam = tmpnam SIGFE -toascii NOSIGFE -_toascii = toascii NOSIGFE -tolower NOSIGFE -_tolower = tolower NOSIGFE -toupper NOSIGFE -_toupper = toupper NOSIGFE -towctrans NOSIGFE -towlower NOSIGFE -towupper NOSIGFE -truncate SIGFE -_truncate = truncate SIGFE -_truncate64 = truncate64 SIGFE -truncf NOSIGFE -tsearch SIGFE -ttyname SIGFE -_ttyname = ttyname SIGFE -ttyname_r SIGFE -ttyslot NOSIGFE -twalk NOSIGFE -tzset SIGFE -_tzset = tzset SIGFE -ualarm SIGFE -_ualarm = ualarm SIGFE -umask NOSIGFE -_umask = umask NOSIGFE -umount SIGFE -_umount = umount SIGFE -uname SIGFE -_uname = uname SIGFE -ungetc SIGFE -_ungetc = ungetc SIGFE -unlink SIGFE -_unlink = unlink SIGFE -unlockpt NOSIGFE -unsetenv SIGFE -_unsetenv = unsetenv SIGFE -usleep SIGFE -_usleep = usleep SIGFE -utime SIGFE -_utime = utime SIGFE -utimes SIGFE -_utimes = utimes SIGFE -futimes SIGFE -lutimes SIGFE -utmpname SIGFE -_utmpname = utmpname SIGFE -utmpxname SIGFE -valloc SIGFE -vasprintf SIGFE -_vasprintf = vasprintf SIGFE -verr SIGFE -verrx SIGFE -vwarn SIGFE -vwarnx SIGFE -vfiprintf SIGFE -_vfiprintf = vfiprintf SIGFE -vfork SIGFE -_vfork = vfork SIGFE -vfprintf SIGFE -_vfprintf = vfprintf SIGFE -vfscanf SIGFE -_vfscanf = vfscanf SIGFE -vhangup SIGFE -_vhangup = vhangup SIGFE -vprintf SIGFE -_vprintf = vprintf SIGFE -vscanf SIGFE -_vscanf = vscanf SIGFE -vsnprintf SIGFE -_vsnprintf = vsnprintf SIGFE -vsprintf SIGFE -_vsprintf = vsprintf SIGFE -vsscanf SIGFE -_vsscanf = vsscanf SIGFE -wait SIGFE -_wait = wait SIGFE -wait3 SIGFE -wait4 SIGFE -waitpid SIGFE -_waitpid = waitpid SIGFE -warn SIGFE -warnx SIGFE -wcrtomb NOSIGFE -wcscat NOSIGFE -wcschr NOSIGFE -wcscmp NOSIGFE -_wcscmp = wcscmp NOSIGFE -wcscoll NOSIGFE -wcscpy NOSIGFE -wcscspn NOSIGFE -wcslcat NOSIGFE -wcslcpy NOSIGFE -wcslen NOSIGFE -_wcslen = wcslen NOSIGFE -wcsncat NOSIGFE -wcsncmp NOSIGFE -wcsncpy NOSIGFE -wcspbrk NOSIGFE -wcsrchr NOSIGFE -wcsrtombs NOSIGFE -wcsspn NOSIGFE -wcsstr NOSIGFE -wcstombs NOSIGFE -_wcstombs = wcstombs NOSIGFE -wcswidth NOSIGFE -wctob NOSIGFE -wctomb NOSIGFE -_wctomb = wctomb NOSIGFE -wctrans NOSIGFE -wctype NOSIGFE -wcwidth NOSIGFE -wmemchr NOSIGFE -wmemcmp NOSIGFE -wmemcpy NOSIGFE -wmemmove NOSIGFE -wmemset NOSIGFE -wprintf SIGFE -_wprintf = wprintf SIGFE -write SIGFE -_write = write SIGFE -writev SIGFE -_writev = writev SIGFE -y0 NOSIGFE -y0f NOSIGFE -y1 NOSIGFE -y1f NOSIGFE -yn NOSIGFE -ynf NOSIGFE diff --git a/winsup/cygwin/cygwin.sc b/winsup/cygwin/cygwin.sc deleted file mode 100644 index cc2b9e6c6..000000000 --- a/winsup/cygwin/cygwin.sc +++ /dev/null @@ -1,142 +0,0 @@ -OUTPUT_FORMAT(pei-i386) -SECTIONS -{ - .text __image_base__ + __section_alignment__ : - { - *(.init) - *(.text) - *(SORT(.text$*)) - *(.glue_7t) - *(.glue_7) - ___CTOR_LIST__ = .; __CTOR_LIST__ = .; - LONG (-1); *(SORT(.ctors.*)); *(.ctors); *(.ctor); LONG (0); - ___DTOR_LIST__ = .; __DTOR_LIST__ = .; - LONG (-1); *(SORT(.dtors.*)); *(.dtors); *(.dtor); LONG (0); - *(.fini) - /* ??? Why is .gcc_exc here? */ - *(.gcc_exc) - etext = .; - *(.gcc_except_table) - } - .autoload_text ALIGN(__section_alignment__) : - { - *(.*_autoload_text); - } - /* The Cygwin DLL uses a section to avoid copying certain data - on fork. This used to be named ".data". The linker used - to include this between __data_start__ and __data_end__, but that - breaks building the cygwin32 dll. Instead, we name the section - ".data_cygwin_nocopy" and explictly include it after __data_end__. */ - .data ALIGN(__section_alignment__) : - { - __data_start__ = .; - *(.data) - *(.data2) - *(SORT(.data$*)) - __data_end__ = .; - *(.data_cygwin_nocopy) - } - .rdata ALIGN(__section_alignment__) : - { - *(.rdata) - *(SORT(.rdata$*)) - *(.eh_frame) - } - .pdata ALIGN(__section_alignment__) : - { - *(.pdata) - } - .bss ALIGN(__section_alignment__) : - { - __bss_start__ = .; - *(.bss) - *(COMMON) - __bss_end__ = .; - } - .edata ALIGN(__section_alignment__) : - { - *(.edata) - } - .rsrc BLOCK(__section_alignment__) : - { - *(.rsrc) - *(SORT(.rsrc$*)) - } - .reloc BLOCK(__section_alignment__) : - { - *(.reloc) - } - .cygwin_dll_common ALIGN(__section_alignment__): - { - *(.cygwin_dll_common) - } - .gnu_debuglink_overlay ALIGN(__section_alignment__) (NOLOAD): - { - BYTE(0) /* c */ - BYTE(0) /* y */ - BYTE(0) /* g */ - BYTE(0) /* w */ - BYTE(0) /* i */ - BYTE(0) /* n */ - BYTE(0) /* 1 */ - BYTE(0) /* . */ - BYTE(0) /* d */ - BYTE(0) /* b */ - BYTE(0) /* g */ - BYTE(0) /* \0 */ - LONG(0) /* checksum */ - } - .idata ALIGN(__section_alignment__) : - { - /* This cannot currently be handled with grouped sections. - See pe.em:sort_sections. */ - SORT(*)(.idata$2) - SORT(*)(.idata$3) - /* These zeroes mark the end of the import list. */ - LONG (0); LONG (0); LONG (0); LONG (0); LONG (0); - SORT(*)(.idata$4) - SORT(*)(.idata$5) - SORT(*)(.idata$6) - SORT(*)(.idata$7) - . = ALIGN(16); - __cygheap_start = ABSOLUTE(.); - . = ALIGN(0x10000); - } - .cygheap ALIGN(__section_alignment__) : - { - __cygheap_mid = .; - *(.cygheap) - . = ALIGN(512 * 1024); - } - __cygheap_end = ABSOLUTE(.); - __cygheap_end1 = __cygheap_mid + SIZEOF(.cygheap); - __cygwin_debug_size = SIZEOF(.gnu_debuglink); - /DISCARD/ : - { - *(.debug$S) - *(.debug$T) - *(.debug$F) - *(.drectve) - } - .stab ALIGN(__section_alignment__) (NOLOAD) : - { - *(.stab) - } - .stabstr ALIGN(__section_alignment__) (NOLOAD) : - { - *(.stabstr) - } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_aranges) } - .debug_pubnames ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_pubnames) } - /* DWARF 2 */ - .debug_info ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_info) } - .debug_abbrev ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_abbrev) } - .debug_line ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_line) } - .debug_frame ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_frame) } - .debug_str ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_str) } - .debug_loc ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_loc) } - .debug_macinfo ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_macinfo) } - .debug_macinfo ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_macinfo) } - .debug_ranges ALIGN(__section_alignment__) (NOLOAD) : { *(.debug_ranges) } -} diff --git a/winsup/cygwin/cygwin_version.h b/winsup/cygwin/cygwin_version.h deleted file mode 100644 index 18bdf2416..000000000 --- a/winsup/cygwin/cygwin_version.h +++ /dev/null @@ -1,31 +0,0 @@ -/* cygwin_version.h: shared info for cygwin - - Copyright 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include - -extern "C" { -/* This is for programs that want to access the shared data. */ -class shared_info *cygwin_getshared (void); - -struct cygwin_version_info -{ - unsigned short api_major; - unsigned short api_minor; - unsigned short dll_major; - unsigned short dll_minor; - unsigned short shared_data; - unsigned short mount_registry; - const char *dll_build_date; - char shared_id[sizeof (CYGWIN_VERSION_DLL_IDENTIFIER) + 64]; -}; - -extern cygwin_version_info cygwin_version; -extern const char *cygwin_version_strings; -} diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc deleted file mode 100644 index 0518ac28f..000000000 --- a/winsup/cygwin/dcrt0.cc +++ /dev/null @@ -1,1205 +0,0 @@ -/* dcrt0.cc -- essentially the main() for the Cygwin dll - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include "glob.h" -#include "exceptions.h" -#include -#include -#include -#include -#include "sigproc.h" -#include "pinfo.h" -#include "cygerrno.h" -#define NEED_VFORK -#include "perprocess.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "child_info_magic.h" -#include "cygtls.h" -#include "shared_info.h" -#include "cygwin_version.h" -#include "dll_init.h" -#include "sync.h" -#include "heap.h" -#include "environ.h" - -#define MAX_AT_FILE_LEVEL 10 - -#define PREMAIN_LEN (sizeof (user_data->premain) / sizeof (user_data->premain[0])) - -extern "C" void cygwin_exit (int) __attribute__ ((noreturn)); - -HANDLE NO_COPY hMainProc = (HANDLE) -1; -HANDLE NO_COPY hMainThread; -HANDLE NO_COPY hProcToken; -HANDLE NO_COPY hProcImpToken; - -muto NO_COPY lock_process::locker; - -bool display_title; -bool strip_title_path; -bool allow_glob = true; -bool NO_COPY in_forkee; -codepage_type current_codepage = ansi_cp; - -int __argc_safe; -int _declspec(dllexport) __argc; -char _declspec(dllexport) **__argv; -#ifdef NEWVFORK -vfork_save NO_COPY *main_vfork; -#endif - -static int NO_COPY envc; -char NO_COPY **envp; - -extern "C" void __sinit (_reent *); - -_cygtls NO_COPY *_main_tls; - -bool NO_COPY cygwin_finished_initializing; - -/* Used in SIGTOMASK for generating a bit for insertion into a sigset_t. - This is subtracted from the signal number prior to shifting the bit. - In older versions of cygwin, the signal was used as-is to shift the - bit for masking. So, we'll temporarily detect this and set it to zero - for programs that are linked using older cygwins. This is just a stopgap - measure to allow an orderly transfer to the new, correct sigmask method. */ -unsigned NO_COPY int signal_shift_subtract = 1; - -ResourceLocks _reslock NO_COPY; -MTinterface _mtinterf; - -bool NO_COPY _cygwin_testing; - -char NO_COPY almost_null[1]; - -extern "C" -{ - /* This is an exported copy of environ which can be used by DLLs - which use cygwin.dll. */ - char **__cygwin_environ; - char ***main_environ = &__cygwin_environ; - /* __progname used in getopt error message */ - char *__progname; - struct per_process __cygwin_user_data = - {/* initial_sp */ 0, /* magic_biscuit */ 0, - /* dll_major */ CYGWIN_VERSION_DLL_MAJOR, - /* dll_major */ CYGWIN_VERSION_DLL_MINOR, - /* impure_ptr_ptr */ NULL, /* envptr */ NULL, - /* malloc */ malloc, /* free */ free, - /* realloc */ realloc, - /* fmode_ptr */ NULL, /* main */ NULL, /* ctors */ NULL, - /* dtors */ NULL, /* data_start */ NULL, /* data_end */ NULL, - /* bss_start */ NULL, /* bss_end */ NULL, - /* calloc */ calloc, - /* premain */ {NULL, NULL, NULL, NULL}, - /* run_ctors_p */ 0, - /* unused */ {0, 0, 0, 0, 0, 0, 0}, - /* UNUSED forkee */ 0, - /* hmodule */ NULL, - /* api_major */ CYGWIN_VERSION_API_MAJOR, - /* api_minor */ CYGWIN_VERSION_API_MINOR, - /* unused2 */ {0, 0, 0, 0, 0}, - /* resourcelocks */ &_reslock, /* threadinterface */ &_mtinterf, - /* impure_ptr */ _GLOBAL_REENT, - }; - bool ignore_case_with_glob; - int __declspec (dllexport) _check_for_executable = true; -#ifdef DEBUGGING - int pinger; -#endif - int NO_COPY __api_fatal_exit_val = 1; -}; - -char *old_title; -char title_buf[TITLESIZE + 1]; - -static void -do_global_dtors () -{ - void (**pfunc) () = user_data->dtors; - if (pfunc) - { - user_data->dtors = NULL; - while (*++pfunc) - (*pfunc) (); - } -} - -static void __stdcall -do_global_ctors (void (**in_pfunc)(), int force) -{ - if (!force && in_forkee) - return; // inherit constructed stuff from parent pid - - /* Run ctors backwards, so skip the first entry and find how many - there are, then run them. */ - - void (**pfunc) () = in_pfunc; - - while (*++pfunc) - ; - while (--pfunc > in_pfunc) - (*pfunc) (); -} - -/* - * Replaces @file in the command line with the contents of the file. - * There may be multiple @file's in a single command line - * A \@file is replaced with @file so that echo \@foo would print - * @foo and not the contents of foo. - */ -static bool __stdcall -insert_file (char *name, char *&cmd) -{ - HANDLE f; - DWORD size; - - f = CreateFile (name + 1, - GENERIC_READ, /* open for reading */ - FILE_SHARE_READ, /* share for reading */ - &sec_none_nih, /* no security */ - OPEN_EXISTING, /* existing file only */ - FILE_ATTRIBUTE_NORMAL, /* normal file */ - NULL); /* no attr. template */ - - if (f == INVALID_HANDLE_VALUE) - { - debug_printf ("couldn't open file '%s', %E", name); - return false; - } - - /* This only supports files up to about 4 billion bytes in - size. I am making the bold assumption that this is big - enough for this feature */ - size = GetFileSize (f, NULL); - if (size == 0xFFFFFFFF) - { - debug_printf ("couldn't get file size for '%s', %E", name); - return false; - } - - int new_size = strlen (cmd) + size + 2; - char *tmp = (char *) malloc (new_size); - if (!tmp) - { - debug_printf ("malloc failed, %E"); - return false; - } - - /* realloc passed as it should */ - DWORD rf_read; - BOOL rf_result; - rf_result = ReadFile (f, tmp, size, &rf_read, NULL); - CloseHandle (f); - if (!rf_result || (rf_read != size)) - { - debug_printf ("ReadFile failed, %E"); - return false; - } - - tmp[size++] = ' '; - strcpy (tmp + size, cmd); - cmd = tmp; - return true; -} - -static inline int -isquote (char c) -{ - char ch = c; - return ch == '"' || ch == '\''; -} - -/* Step over a run of characters delimited by quotes */ -static /*__inline*/ char * -quoted (char *cmd, int winshell) -{ - char *p; - char quote = *cmd; - - if (!winshell) - { - char *p; - strcpy (cmd, cmd + 1); - if (*(p = strechr (cmd, quote))) - strcpy (p, p + 1); - return p; - } - - const char *s = quote == '\'' ? "'" : "\\\""; - /* This must have been run from a Windows shell, so preserve - quotes for globify to play with later. */ - while (*cmd && *++cmd) - if ((p = strpbrk (cmd, s)) == NULL) - { - cmd = strchr (cmd, '\0'); // no closing quote - break; - } - else if (*p == '\\') - cmd = ++p; - else if (quote == '"' && p[1] == '"') - { - *p = '\\'; - cmd = ++p; // a quoted quote - } - else - { - cmd = p + 1; // point to after end - break; - } - return cmd; -} - -/* Perform a glob on word if it contains wildcard characters. - Also quote every character between quotes to force glob to - treat the characters literally. */ -static int __stdcall -globify (char *word, char **&argv, int &argc, int &argvlen) -{ - if (*word != '~' && strpbrk (word, "?*[\"\'(){}") == NULL) - return 0; - - int n = 0; - char *p, *s; - int dos_spec = isdrive (word); - if (!dos_spec && isquote (*word) && word[1] && word[2]) - dos_spec = isdrive (word + 1); - - /* We'll need more space if there are quoting characters in - word. If that is the case, doubling the size of the - string should provide more than enough space. */ - if (strpbrk (word, "'\"")) - n = strlen (word); - char pattern[strlen (word) + ((dos_spec + 1) * n) + 1]; - - /* Fill pattern with characters from word, quoting any - characters found within quotes. */ - for (p = pattern, s = word; *s != '\000'; s++, p++) - if (!isquote (*s)) - { - if (dos_spec && *s == '\\') - *p++ = '\\'; - *p = *s; - } - else - { - char quote = *s; - while (*++s && *s != quote) - { - if (dos_spec || *s != '\\') - /* nothing */; - else if (s[1] == quote || s[1] == '\\') - s++; - *p++ = '\\'; - *p++ = *s; - } - if (*s == quote) - p--; - if (*s == '\0') - break; - } - - *p = '\0'; - - glob_t gl; - gl.gl_offs = 0; - - /* Attempt to match the argument. Return just word (minus quoting) if no match. */ - if (glob (pattern, GLOB_TILDE | GLOB_NOCHECK | GLOB_BRACE | GLOB_QUOTE, NULL, &gl) || !gl.gl_pathc) - return 0; - - /* Allocate enough space in argv for the matched filenames. */ - n = argc; - if ((argc += gl.gl_pathc) > argvlen) - { - argvlen = argc + 10; - argv = (char **) realloc (argv, (1 + argvlen) * sizeof (argv[0])); - } - - /* Copy the matched filenames to argv. */ - char **gv = gl.gl_pathv; - char **av = argv + n; - while (*gv) - { - debug_printf ("argv[%d] = '%s'", n++, *gv); - *av++ = *gv++; - } - - /* Clean up after glob. */ - free (gl.gl_pathv); - return 1; -} - -/* Build argv, argc from string passed from Windows. */ - -static void __stdcall -build_argv (char *cmd, char **&argv, int &argc, int winshell) -{ - int argvlen = 0; - int nesting = 0; // monitor "nesting" from insert_file - - argc = 0; - argvlen = 0; - argv = NULL; - - /* Scan command line until there is nothing left. */ - while (*cmd) - { - /* Ignore spaces */ - if (issep (*cmd)) - { - cmd++; - continue; - } - - /* Found the beginning of an argument. */ - char *word = cmd; - char *sawquote = NULL; - while (*cmd) - { - if (*cmd != '"' && (!winshell || *cmd != '\'')) - cmd++; // Skip over this character - else - /* Skip over characters until the closing quote */ - { - sawquote = cmd; - cmd = quoted (cmd, winshell && argc > 0); - } - if (issep (*cmd)) // End of argument if space - break; - } - if (*cmd) - *cmd++ = '\0'; // Terminate `word' - - /* Possibly look for @file construction assuming that this isn't - the very first argument and the @ wasn't quoted */ - if (argc && sawquote != word && *word == '@') - { - if (++nesting > MAX_AT_FILE_LEVEL) - api_fatal ("Too many levels of nesting for %s", word); - if (insert_file (word, cmd)) - continue; // There's new stuff in cmd now - } - - /* See if we need to allocate more space for argv */ - if (argc >= argvlen) - { - argvlen = argc + 10; - argv = (char **) realloc (argv, (1 + argvlen) * sizeof (argv[0])); - } - - /* Add word to argv file after (optional) wildcard expansion. */ - if (!winshell || !argc || !globify (word, argv, argc, argvlen)) - { - debug_printf ("argv[%d] = '%s'", argc, word); - argv[argc++] = word; - } - } - - argv[argc] = NULL; - - debug_printf ("argc %d", argc); -} - -/* sanity and sync check */ -void __stdcall -check_sanity_and_sync (per_process *p) -{ - /* Sanity check to make sure developers didn't change the per_process */ - /* struct without updating SIZEOF_PER_PROCESS [it makes them think twice */ - /* about changing it]. */ - if (sizeof (per_process) != SIZEOF_PER_PROCESS) - { - api_fatal ("per_process sanity check failed"); - } - - /* Make sure that the app and the dll are in sync. */ - - /* Complain if older than last incompatible change */ - if (p->dll_major < CYGWIN_VERSION_DLL_EPOCH) - api_fatal ("cygwin DLL and APP are out of sync -- DLL version mismatch %d < %d", - p->dll_major, CYGWIN_VERSION_DLL_EPOCH); - - /* magic_biscuit != 0 if using the old style version numbering scheme. */ - if (p->magic_biscuit != SIZEOF_PER_PROCESS) - api_fatal ("Incompatible cygwin .dll -- incompatible per_process info %d != %d", - p->magic_biscuit, SIZEOF_PER_PROCESS); - - /* Complain if incompatible API changes made */ - if (p->api_major > cygwin_version.api_major) - api_fatal ("cygwin DLL and APP are out of sync -- API version mismatch %d > %d", - p->api_major, cygwin_version.api_major); - - if (CYGWIN_VERSION_DLL_MAKE_COMBINED (p->dll_major, p->dll_minor) <= - CYGWIN_VERSION_DLL_BAD_SIGNAL_MASK) - signal_shift_subtract = 0; -} - -child_info NO_COPY *child_proc_info = NULL; -static MEMORY_BASIC_INFORMATION NO_COPY sm; - -#define CYGWIN_GUARD ((wincap.has_page_guard ()) ? \ - PAGE_EXECUTE_READWRITE|PAGE_GUARD : PAGE_NOACCESS) - -static void -alloc_stack_hard_way (child_info_fork *ci, volatile char *b) -{ - void *new_stack_pointer; - MEMORY_BASIC_INFORMATION m; - void *newbase; - int newlen; - LPBYTE curbot = (LPBYTE) sm.BaseAddress + sm.RegionSize; - bool noguard; - - if (ci->stacktop > (LPBYTE) sm.AllocationBase && ci->stacktop < curbot) - { - newbase = curbot; - newlen = (LPBYTE) ci->stackbottom - (LPBYTE) curbot; - noguard = 1; - } - else - { - newbase = ci->stacktop; - newlen = (DWORD) ci->stackbottom - (DWORD) ci->stacktop; - noguard = 0; - } - if (!VirtualAlloc (newbase, newlen, MEM_RESERVE, PAGE_NOACCESS)) - api_fatal ("fork: can't reserve memory for stack %p - %p, %E", - ci->stacktop, ci->stackbottom); - - new_stack_pointer = (void *) ((LPBYTE) ci->stackbottom - ci->stacksize); - - if (!VirtualAlloc (new_stack_pointer, ci->stacksize, MEM_COMMIT, - PAGE_EXECUTE_READWRITE)) - api_fatal ("fork: can't commit memory for stack %p(%d), %E", - new_stack_pointer, ci->stacksize); - if (!VirtualQuery ((LPCVOID) new_stack_pointer, &m, sizeof m)) - api_fatal ("fork: couldn't get new stack info, %E"); - if (!noguard) - { - m.BaseAddress = (LPVOID) ((DWORD) m.BaseAddress - 1); - if (!VirtualAlloc ((LPVOID) m.BaseAddress, 1, MEM_COMMIT, - CYGWIN_GUARD)) - api_fatal ("fork: couldn't allocate new stack guard page %p, %E", - m.BaseAddress); - } - if (!VirtualQuery ((LPCVOID) m.BaseAddress, &m, sizeof m)) - api_fatal ("fork: couldn't get new stack info, %E"); - ci->stacktop = m.BaseAddress; - b[0] = '\0'; -} - -void *getstack (void *) __attribute__ ((noinline)); -volatile char * -getstack (volatile char * volatile p) -{ - *p ^= 1; - *p ^= 1; - return p - 4096; -} - -/* extend the stack prior to fork longjmp */ - -static void -alloc_stack (child_info_fork *ci) -{ - volatile char * volatile esp; - __asm__ volatile ("movl %%esp,%0": "=r" (esp)); - if (_tlsbase != ci->stackbottom) - alloc_stack_hard_way (ci, esp); - else - { - char *stacktop = (char *) ci->stacktop - 4096; - while (_tlstop >= stacktop) - esp = getstack (esp); - ci->stacksize = 0; - } -} - -#ifdef DEBUGGING -void -break_here () -{ - debug_printf ("break here"); -} -#endif - -static void -initial_env () -{ - char buf[CYG_MAX_PATH]; - if (GetEnvironmentVariable ("CYGWIN_TESTING", buf, sizeof (buf) - 1)) - _cygwin_testing = 1; - -#ifdef DEBUGGING - DWORD len; - - if (GetEnvironmentVariable ("CYGWIN_SLEEP", buf, sizeof (buf) - 1)) - { - DWORD ms = atoi (buf); - buf[0] = '\0'; - len = GetModuleFileName (NULL, buf, CYG_MAX_PATH); - console_printf ("Sleeping %d, pid %u %s\n", ms, GetCurrentProcessId (), buf); - Sleep (ms); - if (!strace.active () && !dynamically_loaded) - strace.hello (); - } - if (GetEnvironmentVariable ("CYGWIN_DEBUG", buf, sizeof (buf) - 1)) - { - char buf1[CYG_MAX_PATH]; - len = GetModuleFileName (NULL, buf1, CYG_MAX_PATH); - strlwr (buf1); - strlwr (buf); - char *p = strpbrk (buf, ":="); - if (!p) - p = (char *) "gdb.exe -nw"; - else - *p++ = '\0'; - if (strstr (buf1, buf)) - { - error_start_init (p); - try_to_debug (); - console_printf ("*** Sending Break. gdb may issue spurious SIGTRAP message.\n"); - DebugBreak (); - break_here (); - } - } -#endif - -} - -child_info * -get_cygwin_startup_info () -{ - STARTUPINFO si; - char zeros[sizeof (child_proc_info->zero)] = {0}; - - GetStartupInfo (&si); - child_info *res = (child_info *) si.lpReserved2; - if (si.cbReserved2 < EXEC_MAGIC_SIZE || !res - || memcmp (res->zero, zeros, sizeof (res->zero)) != 0) - res = NULL; - else - { - if ((res->intro & OPROC_MAGIC_MASK) == OPROC_MAGIC_GENERIC) - multiple_cygwin_problem ("proc intro", res->intro, 0); - else if (res->intro == PROC_MAGIC_GENERIC - && res->magic != CHILD_INFO_MAGIC) - multiple_cygwin_problem ("proc magic", res->magic, - CHILD_INFO_MAGIC); - else if (res->cygheap != (void *) &_cygheap_start) - multiple_cygwin_problem ("cygheap base", (DWORD) res->cygheap, - (DWORD) &_cygheap_start); - - unsigned should_be_cb = 0; - switch (res->type) - { - case _PROC_FORK: - in_forkee = true; - should_be_cb = sizeof (child_info_fork); - /* fall through */; - case _PROC_SPAWN: - case _PROC_EXEC: - if (!should_be_cb) - should_be_cb = sizeof (child_info_spawn); - if (should_be_cb != res->cb) - multiple_cygwin_problem ("proc size", res->cb, should_be_cb); - else if (sizeof (fhandler_union) != res->fhandler_union_cb) - multiple_cygwin_problem ("fhandler size", res->fhandler_union_cb, sizeof (fhandler_union)); - if (res->isstraced ()) - { - res->ready (false); - for (unsigned i = 0; !being_debugged () && i < 10000; i++) - low_priority_sleep (0); - strace.hello (); - } - break; - default: - system_printf ("unknown exec type %d", res->type); - /* intentionally fall through */ - case _PROC_WHOOPS: - res = NULL; - break; - } - } - - return res; -} - -#define dll_data_start &_data_start__ -#define dll_data_end &_data_end__ -#define dll_bss_start &_bss_start__ -#define dll_bss_end &_bss_end__ - -void -child_info_fork::handle_fork () -{ - cygheap_fixup_in_child (false); - memory_init (); - set_myself (NULL); - child_copy (parent, false, - "dll data", dll_data_start, dll_data_end, - "dll bss", dll_bss_start, dll_bss_end, - "user heap", cygheap->user_heap.base, cygheap->user_heap.ptr, - NULL); - /* step 2 now that the dll has its heap filled in, we can fill in the - user's data and bss since user_data is now filled out. */ - child_copy (parent, false, - "data", user_data->data_start, user_data->data_end, - "bss", user_data->bss_start, user_data->bss_end, - NULL); - - if (fixup_mmaps_after_fork (parent)) - api_fatal ("recreate_mmaps_after_fork_failed"); -} - -void -child_info_spawn::handle_spawn () -{ - HANDLE h; - cygheap_fixup_in_child (true); - memory_init (); - if (!moreinfo->myself_pinfo || - !DuplicateHandle (hMainProc, moreinfo->myself_pinfo, hMainProc, &h, 0, - FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE)) - h = NULL; - set_myself (h); - ready (true); - __argc = moreinfo->argc; - __argv = moreinfo->argv; - envp = moreinfo->envp; - envc = moreinfo->envc; - if (!dynamically_loaded) - cygheap->fdtab.fixup_after_exec (); - signal_fixup_after_exec (); - if (moreinfo->old_title) - { - old_title = strcpy (title_buf, moreinfo->old_title); - cfree (moreinfo->old_title); - } - init_console_handler (myself->ctty >= 0); -} - -void __stdcall -dll_crt0_0 () -{ - init_global_security (); - initial_env (); - - /* Initialize signal processing here, early, in the hopes that the creation - of a thread early in the process will cause more predictability in memory - layout for the main thread. */ - sigproc_init (); - - lock_process::init (); - _impure_ptr = _GLOBAL_REENT; - _impure_ptr->_stdin = &_impure_ptr->__sf[0]; - _impure_ptr->_stdout = &_impure_ptr->__sf[1]; - _impure_ptr->_stderr = &_impure_ptr->__sf[2]; - _impure_ptr->_current_locale = "C"; - user_data->impure_ptr = _impure_ptr; - user_data->impure_ptr_ptr = &_impure_ptr; - mmap_init (); - - if (!DuplicateHandle (GetCurrentProcess (), GetCurrentProcess (), - GetCurrentProcess (), &hMainProc, 0, FALSE, - DUPLICATE_SAME_ACCESS)) - hMainProc = GetCurrentProcess (); - - DuplicateHandle (hMainProc, GetCurrentThread (), hMainProc, - &hMainThread, 0, false, DUPLICATE_SAME_ACCESS); - if (wincap.has_security ()) - OpenProcessToken (hMainProc, MAXIMUM_ALLOWED, &hProcToken); - - SetErrorMode (SEM_FAILCRITICALERRORS); - device::init (); - do_global_ctors (&__CTOR_LIST__, 1); - cygthread::init (); - - child_proc_info = get_cygwin_startup_info (); - if (!child_proc_info) - memory_init (); - else - { - cygwin_user_h = child_proc_info->user_h; - switch (child_proc_info->type) - { - case _PROC_FORK: - fork_info->handle_fork (); - break; - case _PROC_SPAWN: - case _PROC_EXEC: - spawn_info->handle_spawn (); - break; - } - } - - user_data->resourcelocks->Init (); - user_data->threadinterface->Init (); - - if (!in_forkee) - { - pinfo_init (envp, envc); - uinfo_init (); /* initialize user info */ - } - - _cygtls::init (); - - /* Initialize events */ - events_init (); - - cygheap->cwd.init (); - - /* Late duplicate simplifies tweaking the process token in uinfo.cc. */ - if (wincap.has_security ()) - DuplicateTokenEx (hProcToken, MAXIMUM_ALLOWED, NULL, - SecurityImpersonation, TokenImpersonation, - &hProcImpToken); - debug_printf ("finished dll_crt0_0 initialization"); -} - -/* Take over from libc's crt0.o and start the application. Note the - various special cases when Cygwin DLL is being runtime loaded (as - opposed to being link-time loaded by Cygwin apps) from a non - cygwin app via LoadLibrary. */ -static void -dll_crt0_1 (char *) -{ - check_sanity_and_sync (user_data); - malloc_init (); -#ifdef CGF - int i = 0; - const int n = 2 * 1024 * 1024; - while (i--) - small_printf ("cmalloc returns %p\n", cmalloc (HEAP_STR, n)); -#endif - - ProtectHandle (hMainProc); - ProtectHandle (hMainThread); - - /* Initialize pthread mainthread when not forked and it is safe to call new, - otherwise it is reinitalized in fixup_after_fork */ - if (!in_forkee) - pthread::init_mainthread (); - -#ifdef DEBUGGING - strace.microseconds (); -#endif - - create_signal_arrived (); - - /* Initialize debug muto, if DLL is built with --enable-debugging. - Need to do this before any helper threads start. */ - debug_init (); - -#ifdef NEWVFORK - cygheap->fdtab.vfork_child_fixup (); - main_vfork = vfork_storage.create (); -#endif - - cygbench ("pre-forkee"); - if (in_forkee) - { - /* If we've played with the stack, stacksize != 0. That means that - fork() was invoked from other than the main thread. Make sure that - frame pointer is referencing the new stack so that the OS knows what - to do when it needs to increase the size of the stack. - - NOTE: Don't do anything that involves the stack until you've completed - this step. */ - if (fork_info->stacksize) - { - _tlsbase = (char *) fork_info->stackbottom; - _tlstop = (char *) fork_info->stacktop; - } - longjmp (fork_info->jmp, true); - } - -#ifdef DEBUGGING - { - extern void fork_init (); - fork_init (); - } -#endif - - /* Can be set only after environment has been initialized. */ - if (wincap.has_security ()) - set_cygwin_privileges (hProcImpToken); - - if (!old_title && GetConsoleTitle (title_buf, TITLESIZE)) - old_title = title_buf; - - /* Allocate cygheap->fdtab */ - dtable_init (); - - /* Connect to tty. */ - tty_init (); - - if (!__argc) - { - char *line = GetCommandLineA (); - line = strcpy ((char *) alloca (strlen (line) + 1), line); - - if (current_codepage == oem_cp) - CharToOemA (line, line); - - /* Scan the command line and build argv. Expand wildcards if not - called from another cygwin process. */ - build_argv (line, __argv, __argc, - NOTSTATE (myself, PID_CYGPARENT) && allow_glob); - - /* Convert argv[0] to posix rules if it's currently blatantly - win32 style. */ - if ((strchr (__argv[0], ':')) || (strchr (__argv[0], '\\'))) - { - char *new_argv0 = (char *) malloc (CYG_MAX_PATH); - cygwin_conv_to_posix_path (__argv[0], new_argv0); - __argv[0] = (char *) realloc (new_argv0, strlen (new_argv0) + 1); - } - } - - __argc_safe = __argc; - if (user_data->premain[0]) - for (unsigned int i = 0; i < PREMAIN_LEN / 2; i++) - user_data->premain[i] (__argc, __argv, user_data); - - /* Set up standard fds in file descriptor table. */ - cygheap->fdtab.stdio_init (); - - /* Set up __progname for getopt error call. */ - if (__argv[0] && (__progname = strrchr (__argv[0], '/'))) - ++__progname; - else - __progname = __argv[0]; - if (__progname) - { - char *cp = strchr (__progname, '\0') - 4; - if (cp > __progname && strcasematch (cp, ".exe")) - *cp = '\0'; - } - - /* Set new console title if appropriate. */ - - if (display_title && !dynamically_loaded) - { - char *cp = __progname; - if (strip_title_path) - for (char *ptr = cp; *ptr && *ptr != ' '; ptr++) - if (isdirsep (*ptr)) - cp = ptr + 1; - set_console_title (cp); - } - - cygwin_finished_initializing = true; - /* Call init of loaded dlls. */ - dlls.init (); - - /* Execute any specified "premain" functions */ - if (user_data->premain[PREMAIN_LEN / 2]) - for (unsigned int i = PREMAIN_LEN / 2; i < PREMAIN_LEN; i++) - user_data->premain[i] (__argc, __argv, user_data); - - debug_printf ("user_data->main %p", user_data->main); - - if (dynamically_loaded) - { - set_errno (0); - return; - } - - /* Disable case-insensitive globbing */ - ignore_case_with_glob = false; - - set_errno (0); - - MALLOC_CHECK; - cygbench (__progname); - - /* Flush signals and ensure that signal thread is up and running. Can't - do this for noncygwin case since the signal thread is blocked due to - LoadLibrary serialization. */ - ld_preload (); - if (user_data->main) - cygwin_exit (user_data->main (__argc, __argv, *user_data->envptr)); -} - -struct _reent * -initialize_main_tls (char *padding) -{ - if (!_main_tls) - { - _main_tls = &_my_tls; - _main_tls->init_thread (padding, NULL); - } - return &_main_tls->local_clib; -} - -/* Wrap the real one, otherwise gdb gets confused about - two symbols with the same name, but different addresses. - - UPTR is a pointer to global data that lives on the libc side of the - line [if one distinguishes the application from the dll]. */ - -extern "C" void __stdcall -_dll_crt0 () -{ - extern DWORD threadfunc_ix; - wait_for_sigthread (); - if (!threadfunc_ix) - system_printf ("internal error: couldn't determine location of thread function on stack. Expect signal problems."); - - main_environ = user_data->envptr; - update_envptrs (); - - char padding[CYGTLS_PADSIZE]; - - if (in_forkee) - alloc_stack (fork_info); - else - __sinit (_impure_ptr); - - initialize_main_tls (padding); - dll_crt0_1 (padding); -} - -void -dll_crt0 (per_process *uptr) -{ - /* Set the local copy of the pointer into the user space. */ - if (!in_forkee && uptr && uptr != user_data) - { - memcpy (user_data, uptr, per_process_overwrite); - *(user_data->impure_ptr_ptr) = _GLOBAL_REENT; - } - _dll_crt0 (); -} - -/* This must be called by anyone who uses LoadLibrary to load cygwin1.dll. - You must have CYGTLS_PADSIZE bytes reserved at the bottom of the stack - calling this function, and that storage must not be overwritten until you - unload cygwin1.dll, as it is used for _my_tls. It is best to load - cygwin1.dll before spawning any additional threads in your process. - - See winsup/testsuite/cygload for an example of how to use cygwin1.dll - from MSVC and non-cygwin MinGW applications. */ -extern "C" void -cygwin_dll_init () -{ - static char **envp; - static int _fmode; - - user_data->magic_biscuit = sizeof (per_process); - - user_data->envptr = &envp; - user_data->fmode_ptr = &_fmode; - - _dll_crt0 (); -} - -extern "C" void -__main (void) -{ - do_global_ctors (user_data->ctors, false); - atexit (do_global_dtors); -} - -exit_states NO_COPY exit_state; - -void __stdcall -do_exit (int status) -{ - syscall_printf ("do_exit (%d), exit_state %d", status, exit_state); - -#ifdef NEWVFORK - vfork_save *vf = vfork_storage.val (); - if (vf != NULL && vf->pid < 0) - { - exit_state = ES_NOT_EXITING; - vf->restore_exit (status); - } -#endif - - lock_process until_exit (true); - - if (exit_state < ES_GLOBAL_DTORS) - { - exit_state = ES_GLOBAL_DTORS; - dll_global_dtors (); - } - - if (exit_state < ES_EVENTS_TERMINATE) - { - exit_state = ES_EVENTS_TERMINATE; - events_terminate (); - } - - UINT n = (UINT) status; - if (exit_state < ES_THREADTERM) - { - exit_state = ES_THREADTERM; - cygthread::terminate (); - } - - if (exit_state < ES_SIGNAL) - { - exit_state = ES_SIGNAL; - signal (SIGCHLD, SIG_IGN); - signal (SIGHUP, SIG_IGN); - signal (SIGINT, SIG_IGN); - signal (SIGQUIT, SIG_IGN); - } - - if (exit_state < ES_CLOSEALL) - { - exit_state = ES_CLOSEALL; - close_all_files (); - } - - myself->stopsig = 0; - - if (exit_state < ES_HUP_PGRP) - { - exit_state = ES_HUP_PGRP; - /* Kill orphaned children on group leader exit */ - if (myself->has_pgid_children && myself->pid == myself->pgid) - { - siginfo_t si = {0}; - si.si_signo = -SIGHUP; - si.si_code = SI_KERNEL; - sigproc_printf ("%d == pgrp %d, send SIG{HUP,CONT} to stopped children", - myself->pid, myself->pgid); - kill_pgrp (myself->pgid, si); - } - } - - if (exit_state < ES_HUP_SID) - { - exit_state = ES_HUP_SID; - /* Kill the foreground process group on session leader exit */ - if (getpgrp () > 0 && myself->pid == myself->sid && real_tty_attached (myself)) - { - tty *tp = cygwin_shared->tty[myself->ctty]; - sigproc_printf ("%d == sid %d, send SIGHUP to children", - myself->pid, myself->sid); - - /* CGF FIXME: This can't be right. */ - if (tp->getsid () == myself->sid) - tp->kill_pgrp (SIGHUP); - } - - } - - if (exit_state < ES_TITLE) - { - exit_state = ES_TITLE; - /* restore console title */ - if (old_title && display_title) - set_console_title (old_title); - } - - if (exit_state < ES_TTY_TERMINATE) - { - exit_state = ES_TTY_TERMINATE; - tty_terminate (); - } - - myself.exit (n); -} - -static NO_COPY muto atexit_lock; - -extern "C" int -cygwin_atexit (void (*function)(void)) -{ - int res; - atexit_lock.init ("atexit_lock"); - atexit_lock.acquire (); - res = atexit (function); - atexit_lock.release (); - return res; -} - -extern "C" void -cygwin_exit (int n) -{ - dll_global_dtors (); - if (atexit_lock) - atexit_lock.acquire (); - exit (n); -} - -extern "C" void -_exit (int n) -{ - do_exit (((DWORD) n & 0xff) << 8); -} - -extern "C" void -__api_fatal (const char *fmt, ...) -{ - char buf[4096]; - va_list ap; - - va_start (ap, fmt); - int n = __small_sprintf (buf, "%P: *** fatal error - ", cygwin_pid (GetCurrentProcessId ())); - __small_vsprintf (buf + n, fmt, ap); - va_end (ap); - strace.prntf (_STRACE_SYSTEM, NULL, "%s", buf); - -#ifdef DEBUGGING - try_to_debug (); -#endif - myself.exit (__api_fatal_exit_val); -} - -void -multiple_cygwin_problem (const char *what, unsigned magic_version, unsigned version) -{ - if (_cygwin_testing && (strstr (what, "proc") || strstr (what, "cygheap"))) - { - child_proc_info->type = _PROC_WHOOPS; - return; - } - - char buf[1024]; - if (GetEnvironmentVariable ("CYGWIN_MISMATCH_OK", buf, sizeof (buf))) - return; - - if (CYGWIN_VERSION_MAGIC_VERSION (magic_version) == version) - system_printf ("%s magic number mismatch detected - %p/%p", what, magic_version, version); - else - api_fatal ("%s mismatch detected - %p/%p.\n\ -This problem is probably due to using incompatible versions of the cygwin DLL.\n\ -Search for cygwin1.dll using the Windows Start->Find/Search facility\n\ -and delete all but the most recent version. The most recent version *should*\n\ -reside in x:\\cygwin\\bin, where 'x' is the drive on which you have\n\ -installed the cygwin distribution. Rebooting is also suggested if you\n\ -are unable to find another cygwin DLL.", - what, magic_version, version); -} - -#ifdef DEBUGGING -void __stdcall -cygbench (const char *s) -{ - char buf[1024]; - if (GetEnvironmentVariable ("CYGWIN_BENCH", buf, sizeof (buf))) - small_printf ("%05d ***** %s : %10d\n", GetCurrentProcessId (), s, strace.microseconds ()); -} -#endif diff --git a/winsup/cygwin/debug.cc b/winsup/cygwin/debug.cc deleted file mode 100644 index be256b01b..000000000 --- a/winsup/cygwin/debug.cc +++ /dev/null @@ -1,231 +0,0 @@ -/* debug.cc - - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include "sync.h" -#include "sigproc.h" -#include "pinfo.h" -#include "perprocess.h" -#include "security.h" -#include "cygerrno.h" -#ifdef DEBUGGING -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#endif - -#undef CloseHandle - -#ifdef DEBUGGING -/* Here lies extra debugging routines which help track down internal - Cygwin problems when compiled with -DDEBUGGING . */ -#include -#define NFREEH (sizeof (cygheap->debug.freeh) / sizeof (cygheap->debug.freeh[0])) - -class lock_debug -{ - static muto locker; - bool acquired; - public: - lock_debug () : acquired (0) - { - if (locker.name && !exit_state) - acquired = !!locker.acquire (INFINITE); - } - void unlock () - { - if (locker.name && acquired) - { - locker.release (); - acquired = false; - } - } - ~lock_debug () {unlock ();} - friend void debug_init (); -}; - -muto NO_COPY lock_debug::locker; - -static bool __stdcall mark_closed (const char *, int, HANDLE, const char *, bool); - -void -debug_init () -{ - lock_debug::locker.init ("debug_lock"); -} - -/* Find a registered handle in the linked list of handles. */ -static handle_list * __stdcall -find_handle (HANDLE h) -{ - handle_list *hl; - for (hl = &cygheap->debug.starth; hl->next != NULL; hl = hl->next) - if (hl->next->h == h) - goto out; - cygheap->debug.endh = hl; - hl = NULL; - -out: - return hl; -} - -void -verify_handle (const char *func, int ln, HANDLE h) -{ - handle_list *hl = find_handle (h); - if (!hl) - return; - system_printf ("%s:%d - multiple attempts to add handle %p", func, ln, h); - - system_printf (" previously allocated by %s:%d(%s<%p>) winpid %d", - hl->func, hl->ln, hl->name, hl->h, hl->pid); -} - -void -setclexec (HANDLE oh, HANDLE nh, bool not_inheriting) -{ - handle_list *hl = find_handle (oh); - if (hl) - { - hl = hl->next; - hl->inherited = !not_inheriting; - hl->h = nh; - } -} - -/* Create a new handle record */ -static handle_list * __stdcall -newh () -{ - handle_list *hl; - lock_debug here; - - for (hl = cygheap->debug.freeh; hl < cygheap->debug.freeh + NFREEH; hl++) - if (hl->name == NULL) - return hl; - - return NULL; -} - -/* Add a handle to the linked list of known handles. */ -void __stdcall -add_handle (const char *func, int ln, HANDLE h, const char *name, bool inh) -{ - handle_list *hl; - lock_debug here; - - if (!cygheap) - return; - - if ((hl = find_handle (h))) - { - hl = hl->next; - if (hl->name == name && hl->func == func && hl->ln == ln) - return; - system_printf ("%s:%d - multiple attempts to add handle %s<%p>", func, - ln, name, h); - system_printf (" previously allocated by %s:%d(%s<%p>) winpid %d", - hl->func, hl->ln, hl->name, hl->h, hl->pid); - return; - } - - if ((hl = newh ()) == NULL) - { - here.unlock (); - debug_printf ("couldn't allocate memory for %s(%d): %s(%p)", - func, ln, name, h); - return; - } - hl->h = h; - hl->name = name; - hl->func = func; - hl->ln = ln; - hl->next = NULL; - hl->inherited = inh; - hl->pid = GetCurrentProcessId (); - cygheap->debug.endh->next = hl; - cygheap->debug.endh = hl; - debug_printf ("protecting handle '%s', inherited flag %d", hl->name, hl->inherited); -} - -static void __stdcall -delete_handle (handle_list *hl) -{ - handle_list *hnuke = hl->next; - debug_printf ("nuking handle '%s' (%p)", hnuke->name, hnuke->h); - hl->next = hl->next->next; - memset (hnuke, 0, sizeof (*hnuke)); -} - -void -debug_fixup_after_fork_exec () -{ - /* No lock needed at this point */ - handle_list *hl; - for (hl = &cygheap->debug.starth; hl->next != NULL; /* nothing */) - if (hl->next->inherited) - hl = hl->next; - else - delete_handle (hl); // removes hl->next -} - -static bool __stdcall -mark_closed (const char *func, int ln, HANDLE h, const char *name, bool force) -{ - handle_list *hl; - lock_debug here; - - if (!cygheap) - return true; - - if ((hl = find_handle (h)) && !force) - { - hl = hl->next; - here.unlock (); // race here - system_printf ("attempt to close protected handle %s:%d(%s<%p>) winpid %d", - hl->func, hl->ln, hl->name, hl->h, hl->pid); - system_printf (" by %s:%d(%s<%p>)", func, ln, name, h); - return false; - } - - handle_list *hln; - if (hl && (hln = hl->next) && strcmp (name, hln->name)) - { - system_printf ("closing protected handle %s:%d(%s<%p>)", - hln->func, hln->ln, hln->name, hln->h); - system_printf (" by %s:%d(%s<%p>)", func, ln, name, h); - } - - if (hl) - delete_handle (hl); - - return true; -} - -/* Close a known handle. Complain if !force and closing a known handle or - if the name of the handle being closed does not match the registered name. */ -bool __stdcall -close_handle (const char *func, int ln, HANDLE h, const char *name, bool force) -{ - bool ret; - lock_debug here; - - if (!mark_closed (func, ln, h, name, force)) - return false; - - ret = CloseHandle (h); - -#if 0 /* Uncomment to see CloseHandle failures */ - if (!ret) - small_printf ("CloseHandle(%s) failed %s:%d\n", name, func, ln); -#endif - return ret; -} -#endif /*DEBUGGING*/ diff --git a/winsup/cygwin/debug.h b/winsup/cygwin/debug.h deleted file mode 100644 index 94d4c5a2b..000000000 --- a/winsup/cygwin/debug.h +++ /dev/null @@ -1,91 +0,0 @@ -/* debug.h - - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef MALLOC_DEBUG -#define MALLOC_CHECK do {} while (0) -#else -#include -#include "dlmalloc.h" -#define MALLOC_CHECK ({\ - debug_printf ("checking malloc pool");\ - mallinfo ();\ -}) -#endif - -#if !defined(_DEBUG_H_) -#define _DEBUG_H_ - -#define being_debugged() \ - (IsDebuggerPresent () /* || GetLastError () == ERROR_PROC_NOT_FOUND*/) - -#ifndef DEBUGGING -# define cygbench(s) -# define ForceCloseHandle CloseHandle -# define ForceCloseHandle1(h, n) CloseHandle (h) -# define ForceCloseHandle2(h, n) CloseHandle (h) -# define ProtectHandle(h) do {} while (0) -# define ProtectHandle1(h,n) do {} while (0) -# define ProtectHandle2(h,n) do {} while (0) -# define ProtectHandleINH(h) do {} while (0) -# define ProtectHandle1INH(h,n) do {} while (0) -# define ProtectHandle2INH(h,n) do {} while (0) -# define debug_init() do {} while (0) -# define setclexec(h, nh, b) do {} while (0) -# define debug_fixup_after_fork_exec() do {} while (0) -# define VerifyHandle(h) do {} while (0) -# define console_printf small_printf - -#else - -# ifdef NO_DEBUG_DEFINES -# undef NO_DEBUG_DEFINES -# else -# define CloseHandle(h) \ - close_handle (__PRETTY_FUNCTION__, __LINE__, (h), #h, FALSE) -# define ForceCloseHandle(h) \ - close_handle (__PRETTY_FUNCTION__, __LINE__, (h), #h, TRUE) -# define ForceCloseHandle1(h,n) \ - close_handle (__PRETTY_FUNCTION__, __LINE__, (h), #n, TRUE) -# define ForceCloseHandle2(h,n) \ - close_handle (__PRETTY_FUNCTION__, __LINE__, (h), n, TRUE) -# endif - -# define ProtectHandle(h) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), #h) -# define ProtectHandle1(h, n) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), #n) -# define ProtectHandle2(h, n) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), n) -# define ProtectHandleINH(h) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), #h, 1) -# define ProtectHandle1INH(h, n) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), #n, 1) -# define ProtectHandle2INH(h, n) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), n, 1) -# define VerifyHandle(h) verify_handle (__PRETTY_FUNCTION__, __LINE__, (h)) - -void debug_init (); -void __stdcall add_handle (const char *, int, HANDLE, const char *, bool = false) - __attribute__ ((regparm (3))); -void __stdcall verify_handle (const char *, int, HANDLE) - __attribute__ ((regparm (3))); -bool __stdcall close_handle (const char *, int, HANDLE, const char *, bool) - __attribute__ ((regparm (3))); -void __stdcall cygbench (const char *s) __attribute__ ((regparm (1))); -extern "C" void console_printf (const char *fmt,...); -void setclexec (HANDLE, HANDLE, bool); -void debug_fixup_after_fork_exec (); -extern int pinger; - -struct handle_list - { - HANDLE h; - const char *name; - const char *func; - int ln; - bool inherited; - DWORD pid; - struct handle_list *next; - }; - -#endif /*DEBUGGING*/ -#endif /*_DEBUG_H_*/ diff --git a/winsup/cygwin/delqueue.cc b/winsup/cygwin/delqueue.cc deleted file mode 100644 index 76f2d6d19..000000000 --- a/winsup/cygwin/delqueue.cc +++ /dev/null @@ -1,103 +0,0 @@ -/* delqueue.cc - - Copyright 1996, 1998, 1999, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include "shared_info.h" - -/* FIXME: this delqueue module is very flawed and should be rewritten. - First, having an array of a fixed size for keeping track of the - unlinked but not yet deleted files is bad. Second, some programs - will unlink files and then create a new one in the same location - and this behavior is not supported in the current code. Probably - we should find a move/rename function that will work on open files, - and move delqueue files to some special location or some such - hack... */ - -void -delqueue_list::init () -{ - empty = 1; - memset (inuse, 0, MAX_DELQUEUES_PENDING); -} - -void -delqueue_list::queue_file (const char *dosname) -{ - char temp[CYG_MAX_PATH], *end; - GetFullPathName (dosname, sizeof (temp), temp, &end); - - /* Note about race conditions: The only time we get to this point is - when a delete fails because someone's holding the descriptor open. - In those cases, other programs will be unable to delete the file - also, so any entries referring to that file will not be removed - from the queue while we're here. */ - - if (!empty) - { - /* check for duplicates */ - for (int i=0; i < MAX_DELQUEUES_PENDING; i++) - if (inuse[i] && strcmp (name[i], temp) == 0) - return; - } - - for (int i = 0; i < MAX_DELQUEUES_PENDING; i++) - if (!inuse[i]) - { - /* set the name first, in case someone else is running the - queue they'll get a valid name */ - strcpy (name[i], temp); - inuse[i] = 1; - empty = 0; - debug_printf ("adding '%s' to queue %d", temp, i); - return; - } - - system_printf ("Out of queue slots"); -} - -void -delqueue_list::process_queue () -{ - if (empty) - return; - /* We set empty to 1 here, rather than later, to avoid a race - condition - some other program might queue up a file while we're - processing, and it will zero out empty also. */ - empty = 1; /* but might get set to zero again, below */ - - syscall_printf ("Running delqueue"); - - for (int i = 0; i < MAX_DELQUEUES_PENDING; i++) - if (inuse[i]) - { - if (DeleteFileA (name[i])) - { - syscall_printf ("Deleted %s", name[i]); - inuse[i] = 0; - } - else - { - int res = GetLastError (); - empty = 0; - if (res == ERROR_SHARING_VIOLATION || - (wincap.access_denied_on_delete () - && res == ERROR_ACCESS_DENIED)) - { - /* File still inuse, that's ok */ - syscall_printf ("Still using %s", name[i]); - } - else - { - syscall_printf ("Hmm, don't know what to do with '%s', %E", name[i]); - inuse[i] = 0; - } - } - } -} diff --git a/winsup/cygwin/devices.cc b/winsup/cygwin/devices.cc deleted file mode 100644 index 0d469a85b..000000000 --- a/winsup/cygwin/devices.cc +++ /dev/null @@ -1,14933 +0,0 @@ - - -#include "winsup.h" -#include -#include -#include -#include -#include "devices.h" -#include "sys/cygwin.h" -#include "tty.h" -#include "pinfo.h" -typedef const device *KR_device_t; - - -static KR_device_t KR_find_keyword (const char *KR_keyword, int KR_length); - - - -const device dev_cygdrive_storage = - {"/cygdrive", {FH_CYGDRIVE}, "/cygdrive"}; - -const device dev_fs_storage = - {"", {FH_FS}, ""}; - -const device dev_proc_storage = - {"", {FH_PROC}, ""}; - -const device dev_netdrive_storage = - {"", {FH_NETDRIVE}, ""}; - -#if 0 -const device dev_dev_storage = - {"/dev", {FH_DEV}, "/dev"}; -#endif - -const device dev_registry_storage = - {"", {FH_REGISTRY}, ""}; - -const device dev_piper_storage = - {"", {FH_PIPER}, ""}; - -const device dev_pipew_storage = - {"", {FH_PIPEW}, ""}; - -const device dev_tcp_storage = - {"", {FH_TCP}, ""}; - -const device dev_udp_storage = - {"", {FH_UDP}, ""}; - -const device dev_stream_storage = - {"", {FH_STREAM}, ""}; - -const device dev_dgram_storage = - {"", {FH_DGRAM}, ""}; - -const device dev_bad_storage = - {"", {FH_BAD}, ""}; -#define BRACK(x) {x} - -static const device dev_storage[] = -{ - {"/dev", BRACK(FH_DEV), "/dev"}, - {"/dev/clipboard", BRACK(FH_CLIPBOARD), "\\dev\\clipboard"}, - {"/dev/com1", BRACK(FHDEV(DEV_SERIAL_MAJOR, 1)), "\\\\.\\com1"}, - {"/dev/com2", BRACK(FHDEV(DEV_SERIAL_MAJOR, 2)), "\\\\.\\com2"}, - {"/dev/com3", BRACK(FHDEV(DEV_SERIAL_MAJOR, 3)), "\\\\.\\com3"}, - {"/dev/com4", BRACK(FHDEV(DEV_SERIAL_MAJOR, 4)), "\\\\.\\com4"}, - {"/dev/com5", BRACK(FHDEV(DEV_SERIAL_MAJOR, 5)), "\\\\.\\com5"}, - {"/dev/com6", BRACK(FHDEV(DEV_SERIAL_MAJOR, 6)), "\\\\.\\com6"}, - {"/dev/com7", BRACK(FHDEV(DEV_SERIAL_MAJOR, 7)), "\\\\.\\com7"}, - {"/dev/com8", BRACK(FHDEV(DEV_SERIAL_MAJOR, 8)), "\\\\.\\com8"}, - {"/dev/com9", BRACK(FHDEV(DEV_SERIAL_MAJOR, 9)), "\\\\.\\com9"}, - {"/dev/com10", BRACK(FHDEV(DEV_SERIAL_MAJOR, 10)), "\\\\.\\com10"}, - {"/dev/com11", BRACK(FHDEV(DEV_SERIAL_MAJOR, 11)), "\\\\.\\com11"}, - {"/dev/com12", BRACK(FHDEV(DEV_SERIAL_MAJOR, 12)), "\\\\.\\com12"}, - {"/dev/com13", BRACK(FHDEV(DEV_SERIAL_MAJOR, 13)), "\\\\.\\com13"}, - {"/dev/com14", BRACK(FHDEV(DEV_SERIAL_MAJOR, 14)), "\\\\.\\com14"}, - {"/dev/com15", BRACK(FHDEV(DEV_SERIAL_MAJOR, 15)), "\\\\.\\com15"}, - {"/dev/com16", BRACK(FHDEV(DEV_SERIAL_MAJOR, 16)), "\\\\.\\com16"}, - {"/dev/conin", BRACK(FH_CONIN), "conin"}, - {"/dev/conout", BRACK(FH_CONOUT), "conout"}, - {"/dev/console", BRACK(FH_CONSOLE), "\\dev\\console"}, - {"/dev/dsp", BRACK(FH_OSS_DSP), "\\dev\\dsp"}, - {"/dev/fd0", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 0)), "\\Device\\Floppy0"}, - {"/dev/fd1", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 1)), "\\Device\\Floppy1"}, - {"/dev/fd2", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 2)), "\\Device\\Floppy2"}, - {"/dev/fd3", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 3)), "\\Device\\Floppy3"}, - {"/dev/fd4", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 4)), "\\Device\\Floppy4"}, - {"/dev/fd5", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 5)), "\\Device\\Floppy5"}, - {"/dev/fd6", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 6)), "\\Device\\Floppy6"}, - {"/dev/fd7", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 7)), "\\Device\\Floppy7"}, - {"/dev/fd8", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 8)), "\\Device\\Floppy8"}, - {"/dev/fd9", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 9)), "\\Device\\Floppy9"}, - {"/dev/fd10", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 10)), "\\Device\\Floppy10"}, - {"/dev/fd11", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 11)), "\\Device\\Floppy11"}, - {"/dev/fd12", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 12)), "\\Device\\Floppy12"}, - {"/dev/fd13", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 13)), "\\Device\\Floppy13"}, - {"/dev/fd14", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 14)), "\\Device\\Floppy14"}, - {"/dev/fd15", BRACK(FHDEV(DEV_FLOPPY_MAJOR, 15)), "\\Device\\Floppy15"}, - {"/dev/fifo", BRACK(FH_FIFO), "\\dev\\fifo"}, - {"/dev/full", BRACK(FH_FULL), "\\dev\\full"}, - {"/dev/kmem", BRACK(FH_KMEM), "\\dev\\mem"}, - {"/dev/kmsg", BRACK(FH_KMSG), "\\\\.\\mailslot\\cygwin\\dev\\kmsg"}, - {"/dev/mem", BRACK(FH_MEM), "\\dev\\mem"}, - {"/dev/nst0", BRACK(FHDEV(DEV_TAPE_MAJOR, 128)), "\\Device\\Tape0"}, - {"/dev/nst1", BRACK(FHDEV(DEV_TAPE_MAJOR, 129)), "\\Device\\Tape1"}, - {"/dev/nst2", BRACK(FHDEV(DEV_TAPE_MAJOR, 130)), "\\Device\\Tape2"}, - {"/dev/nst3", BRACK(FHDEV(DEV_TAPE_MAJOR, 131)), "\\Device\\Tape3"}, - {"/dev/nst4", BRACK(FHDEV(DEV_TAPE_MAJOR, 132)), "\\Device\\Tape4"}, - {"/dev/nst5", BRACK(FHDEV(DEV_TAPE_MAJOR, 133)), "\\Device\\Tape5"}, - {"/dev/nst6", BRACK(FHDEV(DEV_TAPE_MAJOR, 134)), "\\Device\\Tape6"}, - {"/dev/nst7", BRACK(FHDEV(DEV_TAPE_MAJOR, 135)), "\\Device\\Tape7"}, - {"/dev/nst8", BRACK(FHDEV(DEV_TAPE_MAJOR, 136)), "\\Device\\Tape8"}, - {"/dev/nst9", BRACK(FHDEV(DEV_TAPE_MAJOR, 137)), "\\Device\\Tape9"}, - {"/dev/nst10", BRACK(FHDEV(DEV_TAPE_MAJOR, 138)), "\\Device\\Tape10"}, - {"/dev/nst11", BRACK(FHDEV(DEV_TAPE_MAJOR, 139)), "\\Device\\Tape11"}, - {"/dev/nst12", BRACK(FHDEV(DEV_TAPE_MAJOR, 140)), "\\Device\\Tape12"}, - {"/dev/nst13", BRACK(FHDEV(DEV_TAPE_MAJOR, 141)), "\\Device\\Tape13"}, - {"/dev/nst14", BRACK(FHDEV(DEV_TAPE_MAJOR, 142)), "\\Device\\Tape14"}, - {"/dev/nst15", BRACK(FHDEV(DEV_TAPE_MAJOR, 143)), "\\Device\\Tape15"}, - {"/dev/nst16", BRACK(FHDEV(DEV_TAPE_MAJOR, 144)), "\\Device\\Tape16"}, - {"/dev/nst17", BRACK(FHDEV(DEV_TAPE_MAJOR, 145)), "\\Device\\Tape17"}, - {"/dev/nst18", BRACK(FHDEV(DEV_TAPE_MAJOR, 146)), "\\Device\\Tape18"}, - {"/dev/nst19", BRACK(FHDEV(DEV_TAPE_MAJOR, 147)), "\\Device\\Tape19"}, - {"/dev/nst20", BRACK(FHDEV(DEV_TAPE_MAJOR, 148)), "\\Device\\Tape20"}, - {"/dev/nst21", BRACK(FHDEV(DEV_TAPE_MAJOR, 149)), "\\Device\\Tape21"}, - {"/dev/nst22", BRACK(FHDEV(DEV_TAPE_MAJOR, 150)), "\\Device\\Tape22"}, - {"/dev/nst23", BRACK(FHDEV(DEV_TAPE_MAJOR, 151)), "\\Device\\Tape23"}, - {"/dev/nst24", BRACK(FHDEV(DEV_TAPE_MAJOR, 152)), "\\Device\\Tape24"}, - {"/dev/nst25", BRACK(FHDEV(DEV_TAPE_MAJOR, 153)), "\\Device\\Tape25"}, - {"/dev/nst26", BRACK(FHDEV(DEV_TAPE_MAJOR, 154)), "\\Device\\Tape26"}, - {"/dev/nst27", BRACK(FHDEV(DEV_TAPE_MAJOR, 155)), "\\Device\\Tape27"}, - {"/dev/nst28", BRACK(FHDEV(DEV_TAPE_MAJOR, 156)), "\\Device\\Tape28"}, - {"/dev/nst29", BRACK(FHDEV(DEV_TAPE_MAJOR, 157)), "\\Device\\Tape29"}, - {"/dev/nst30", BRACK(FHDEV(DEV_TAPE_MAJOR, 158)), "\\Device\\Tape30"}, - {"/dev/nst31", BRACK(FHDEV(DEV_TAPE_MAJOR, 159)), "\\Device\\Tape31"}, - {"/dev/nst32", BRACK(FHDEV(DEV_TAPE_MAJOR, 160)), "\\Device\\Tape32"}, - {"/dev/nst33", BRACK(FHDEV(DEV_TAPE_MAJOR, 161)), "\\Device\\Tape33"}, - {"/dev/nst34", BRACK(FHDEV(DEV_TAPE_MAJOR, 162)), "\\Device\\Tape34"}, - {"/dev/nst35", BRACK(FHDEV(DEV_TAPE_MAJOR, 163)), "\\Device\\Tape35"}, - {"/dev/nst36", BRACK(FHDEV(DEV_TAPE_MAJOR, 164)), "\\Device\\Tape36"}, - {"/dev/nst37", BRACK(FHDEV(DEV_TAPE_MAJOR, 165)), "\\Device\\Tape37"}, - {"/dev/nst38", BRACK(FHDEV(DEV_TAPE_MAJOR, 166)), "\\Device\\Tape38"}, - {"/dev/nst39", BRACK(FHDEV(DEV_TAPE_MAJOR, 167)), "\\Device\\Tape39"}, - {"/dev/nst40", BRACK(FHDEV(DEV_TAPE_MAJOR, 168)), "\\Device\\Tape40"}, - {"/dev/nst41", BRACK(FHDEV(DEV_TAPE_MAJOR, 169)), "\\Device\\Tape41"}, - {"/dev/nst42", BRACK(FHDEV(DEV_TAPE_MAJOR, 170)), "\\Device\\Tape42"}, - {"/dev/nst43", BRACK(FHDEV(DEV_TAPE_MAJOR, 171)), "\\Device\\Tape43"}, - {"/dev/nst44", BRACK(FHDEV(DEV_TAPE_MAJOR, 172)), "\\Device\\Tape44"}, - {"/dev/nst45", BRACK(FHDEV(DEV_TAPE_MAJOR, 173)), "\\Device\\Tape45"}, - {"/dev/nst46", BRACK(FHDEV(DEV_TAPE_MAJOR, 174)), "\\Device\\Tape46"}, - {"/dev/nst47", BRACK(FHDEV(DEV_TAPE_MAJOR, 175)), "\\Device\\Tape47"}, - {"/dev/nst48", BRACK(FHDEV(DEV_TAPE_MAJOR, 176)), "\\Device\\Tape48"}, - {"/dev/nst49", BRACK(FHDEV(DEV_TAPE_MAJOR, 177)), "\\Device\\Tape49"}, - {"/dev/nst50", BRACK(FHDEV(DEV_TAPE_MAJOR, 178)), "\\Device\\Tape50"}, - {"/dev/nst51", BRACK(FHDEV(DEV_TAPE_MAJOR, 179)), "\\Device\\Tape51"}, - {"/dev/nst52", BRACK(FHDEV(DEV_TAPE_MAJOR, 180)), "\\Device\\Tape52"}, - {"/dev/nst53", BRACK(FHDEV(DEV_TAPE_MAJOR, 181)), "\\Device\\Tape53"}, - {"/dev/nst54", BRACK(FHDEV(DEV_TAPE_MAJOR, 182)), "\\Device\\Tape54"}, - {"/dev/nst55", BRACK(FHDEV(DEV_TAPE_MAJOR, 183)), "\\Device\\Tape55"}, - {"/dev/nst56", BRACK(FHDEV(DEV_TAPE_MAJOR, 184)), "\\Device\\Tape56"}, - {"/dev/nst57", BRACK(FHDEV(DEV_TAPE_MAJOR, 185)), "\\Device\\Tape57"}, - {"/dev/nst58", BRACK(FHDEV(DEV_TAPE_MAJOR, 186)), "\\Device\\Tape58"}, - {"/dev/nst59", BRACK(FHDEV(DEV_TAPE_MAJOR, 187)), "\\Device\\Tape59"}, - {"/dev/nst60", BRACK(FHDEV(DEV_TAPE_MAJOR, 188)), "\\Device\\Tape60"}, - {"/dev/nst61", BRACK(FHDEV(DEV_TAPE_MAJOR, 189)), "\\Device\\Tape61"}, - {"/dev/nst62", BRACK(FHDEV(DEV_TAPE_MAJOR, 190)), "\\Device\\Tape62"}, - {"/dev/nst63", BRACK(FHDEV(DEV_TAPE_MAJOR, 191)), "\\Device\\Tape63"}, - {"/dev/nst64", BRACK(FHDEV(DEV_TAPE_MAJOR, 192)), "\\Device\\Tape64"}, - {"/dev/nst65", BRACK(FHDEV(DEV_TAPE_MAJOR, 193)), "\\Device\\Tape65"}, - {"/dev/nst66", BRACK(FHDEV(DEV_TAPE_MAJOR, 194)), "\\Device\\Tape66"}, - {"/dev/nst67", BRACK(FHDEV(DEV_TAPE_MAJOR, 195)), "\\Device\\Tape67"}, - {"/dev/nst68", BRACK(FHDEV(DEV_TAPE_MAJOR, 196)), "\\Device\\Tape68"}, - {"/dev/nst69", BRACK(FHDEV(DEV_TAPE_MAJOR, 197)), "\\Device\\Tape69"}, - {"/dev/nst70", BRACK(FHDEV(DEV_TAPE_MAJOR, 198)), "\\Device\\Tape70"}, - {"/dev/nst71", BRACK(FHDEV(DEV_TAPE_MAJOR, 199)), "\\Device\\Tape71"}, - {"/dev/nst72", BRACK(FHDEV(DEV_TAPE_MAJOR, 200)), "\\Device\\Tape72"}, - {"/dev/nst73", BRACK(FHDEV(DEV_TAPE_MAJOR, 201)), "\\Device\\Tape73"}, - {"/dev/nst74", BRACK(FHDEV(DEV_TAPE_MAJOR, 202)), "\\Device\\Tape74"}, - {"/dev/nst75", BRACK(FHDEV(DEV_TAPE_MAJOR, 203)), "\\Device\\Tape75"}, - {"/dev/nst76", BRACK(FHDEV(DEV_TAPE_MAJOR, 204)), "\\Device\\Tape76"}, - {"/dev/nst77", BRACK(FHDEV(DEV_TAPE_MAJOR, 205)), "\\Device\\Tape77"}, - {"/dev/nst78", BRACK(FHDEV(DEV_TAPE_MAJOR, 206)), "\\Device\\Tape78"}, - {"/dev/nst79", BRACK(FHDEV(DEV_TAPE_MAJOR, 207)), "\\Device\\Tape79"}, - {"/dev/nst80", BRACK(FHDEV(DEV_TAPE_MAJOR, 208)), "\\Device\\Tape80"}, - {"/dev/nst81", BRACK(FHDEV(DEV_TAPE_MAJOR, 209)), "\\Device\\Tape81"}, - {"/dev/nst82", BRACK(FHDEV(DEV_TAPE_MAJOR, 210)), "\\Device\\Tape82"}, - {"/dev/nst83", BRACK(FHDEV(DEV_TAPE_MAJOR, 211)), "\\Device\\Tape83"}, - {"/dev/nst84", BRACK(FHDEV(DEV_TAPE_MAJOR, 212)), "\\Device\\Tape84"}, - {"/dev/nst85", BRACK(FHDEV(DEV_TAPE_MAJOR, 213)), "\\Device\\Tape85"}, - {"/dev/nst86", BRACK(FHDEV(DEV_TAPE_MAJOR, 214)), "\\Device\\Tape86"}, - {"/dev/nst87", BRACK(FHDEV(DEV_TAPE_MAJOR, 215)), "\\Device\\Tape87"}, - {"/dev/nst88", BRACK(FHDEV(DEV_TAPE_MAJOR, 216)), "\\Device\\Tape88"}, - {"/dev/nst89", BRACK(FHDEV(DEV_TAPE_MAJOR, 217)), "\\Device\\Tape89"}, - {"/dev/nst90", BRACK(FHDEV(DEV_TAPE_MAJOR, 218)), "\\Device\\Tape90"}, - {"/dev/nst91", BRACK(FHDEV(DEV_TAPE_MAJOR, 219)), "\\Device\\Tape91"}, - {"/dev/nst92", BRACK(FHDEV(DEV_TAPE_MAJOR, 220)), "\\Device\\Tape92"}, - {"/dev/nst93", BRACK(FHDEV(DEV_TAPE_MAJOR, 221)), "\\Device\\Tape93"}, - {"/dev/nst94", BRACK(FHDEV(DEV_TAPE_MAJOR, 222)), "\\Device\\Tape94"}, - {"/dev/nst95", BRACK(FHDEV(DEV_TAPE_MAJOR, 223)), "\\Device\\Tape95"}, - {"/dev/nst96", BRACK(FHDEV(DEV_TAPE_MAJOR, 224)), "\\Device\\Tape96"}, - {"/dev/nst97", BRACK(FHDEV(DEV_TAPE_MAJOR, 225)), "\\Device\\Tape97"}, - {"/dev/nst98", BRACK(FHDEV(DEV_TAPE_MAJOR, 226)), "\\Device\\Tape98"}, - {"/dev/nst99", BRACK(FHDEV(DEV_TAPE_MAJOR, 227)), "\\Device\\Tape99"}, - {"/dev/nst100", BRACK(FHDEV(DEV_TAPE_MAJOR, 228)), "\\Device\\Tape100"}, - {"/dev/nst101", BRACK(FHDEV(DEV_TAPE_MAJOR, 229)), "\\Device\\Tape101"}, - {"/dev/nst102", BRACK(FHDEV(DEV_TAPE_MAJOR, 230)), "\\Device\\Tape102"}, - {"/dev/nst103", BRACK(FHDEV(DEV_TAPE_MAJOR, 231)), "\\Device\\Tape103"}, - {"/dev/nst104", BRACK(FHDEV(DEV_TAPE_MAJOR, 232)), "\\Device\\Tape104"}, - {"/dev/nst105", BRACK(FHDEV(DEV_TAPE_MAJOR, 233)), "\\Device\\Tape105"}, - {"/dev/nst106", BRACK(FHDEV(DEV_TAPE_MAJOR, 234)), "\\Device\\Tape106"}, - {"/dev/nst107", BRACK(FHDEV(DEV_TAPE_MAJOR, 235)), "\\Device\\Tape107"}, - {"/dev/nst108", BRACK(FHDEV(DEV_TAPE_MAJOR, 236)), "\\Device\\Tape108"}, - {"/dev/nst109", BRACK(FHDEV(DEV_TAPE_MAJOR, 237)), "\\Device\\Tape109"}, - {"/dev/nst110", BRACK(FHDEV(DEV_TAPE_MAJOR, 238)), "\\Device\\Tape110"}, - {"/dev/nst111", BRACK(FHDEV(DEV_TAPE_MAJOR, 239)), "\\Device\\Tape111"}, - {"/dev/nst112", BRACK(FHDEV(DEV_TAPE_MAJOR, 240)), "\\Device\\Tape112"}, - {"/dev/nst113", BRACK(FHDEV(DEV_TAPE_MAJOR, 241)), "\\Device\\Tape113"}, - {"/dev/nst114", BRACK(FHDEV(DEV_TAPE_MAJOR, 242)), "\\Device\\Tape114"}, - {"/dev/nst115", BRACK(FHDEV(DEV_TAPE_MAJOR, 243)), "\\Device\\Tape115"}, - {"/dev/nst116", BRACK(FHDEV(DEV_TAPE_MAJOR, 244)), "\\Device\\Tape116"}, - {"/dev/nst117", BRACK(FHDEV(DEV_TAPE_MAJOR, 245)), "\\Device\\Tape117"}, - {"/dev/nst118", BRACK(FHDEV(DEV_TAPE_MAJOR, 246)), "\\Device\\Tape118"}, - {"/dev/nst119", BRACK(FHDEV(DEV_TAPE_MAJOR, 247)), "\\Device\\Tape119"}, - {"/dev/nst120", BRACK(FHDEV(DEV_TAPE_MAJOR, 248)), "\\Device\\Tape120"}, - {"/dev/nst121", BRACK(FHDEV(DEV_TAPE_MAJOR, 249)), "\\Device\\Tape121"}, - {"/dev/nst122", BRACK(FHDEV(DEV_TAPE_MAJOR, 250)), "\\Device\\Tape122"}, - {"/dev/nst123", BRACK(FHDEV(DEV_TAPE_MAJOR, 251)), "\\Device\\Tape123"}, - {"/dev/nst124", BRACK(FHDEV(DEV_TAPE_MAJOR, 252)), "\\Device\\Tape124"}, - {"/dev/nst125", BRACK(FHDEV(DEV_TAPE_MAJOR, 253)), "\\Device\\Tape125"}, - {"/dev/nst126", BRACK(FHDEV(DEV_TAPE_MAJOR, 254)), "\\Device\\Tape126"}, - {"/dev/nst127", BRACK(FHDEV(DEV_TAPE_MAJOR, 255)), "\\Device\\Tape127"}, - {"/dev/null", BRACK(FH_NULL), "nul"}, - {"/dev/pipe", BRACK(FH_PIPE), "\\dev\\pipe"}, - {"/dev/port", BRACK(FH_PORT), "\\dev\\port"}, - {"/dev/ptmx", BRACK(FH_PTYM), "\\dev\\ptmx"}, - {"/dev/random", BRACK(FH_RANDOM), "\\dev\\random"}, - {"/dev/scd0", BRACK(FHDEV(DEV_CDROM_MAJOR, 0)), "\\Device\\CdRom0"}, - {"/dev/scd1", BRACK(FHDEV(DEV_CDROM_MAJOR, 1)), "\\Device\\CdRom1"}, - {"/dev/scd2", BRACK(FHDEV(DEV_CDROM_MAJOR, 2)), "\\Device\\CdRom2"}, - {"/dev/scd3", BRACK(FHDEV(DEV_CDROM_MAJOR, 3)), "\\Device\\CdRom3"}, - {"/dev/scd4", BRACK(FHDEV(DEV_CDROM_MAJOR, 4)), "\\Device\\CdRom4"}, - {"/dev/scd5", BRACK(FHDEV(DEV_CDROM_MAJOR, 5)), "\\Device\\CdRom5"}, - {"/dev/scd6", BRACK(FHDEV(DEV_CDROM_MAJOR, 6)), "\\Device\\CdRom6"}, - {"/dev/scd7", BRACK(FHDEV(DEV_CDROM_MAJOR, 7)), "\\Device\\CdRom7"}, - {"/dev/scd8", BRACK(FHDEV(DEV_CDROM_MAJOR, 8)), "\\Device\\CdRom8"}, - {"/dev/scd9", BRACK(FHDEV(DEV_CDROM_MAJOR, 9)), "\\Device\\CdRom9"}, - {"/dev/scd10", BRACK(FHDEV(DEV_CDROM_MAJOR, 10)), "\\Device\\CdRom10"}, - {"/dev/scd11", BRACK(FHDEV(DEV_CDROM_MAJOR, 11)), "\\Device\\CdRom11"}, - {"/dev/scd12", BRACK(FHDEV(DEV_CDROM_MAJOR, 12)), "\\Device\\CdRom12"}, - {"/dev/scd13", BRACK(FHDEV(DEV_CDROM_MAJOR, 13)), "\\Device\\CdRom13"}, - {"/dev/scd14", BRACK(FHDEV(DEV_CDROM_MAJOR, 14)), "\\Device\\CdRom14"}, - {"/dev/scd15", BRACK(FHDEV(DEV_CDROM_MAJOR, 15)), "\\Device\\CdRom15"}, - {"/dev/sda", BRACK(FH_SDA), "\\Device\\Harddisk0\\Partition0"}, - {"/dev/sdb", BRACK(FH_SDB), "\\Device\\Harddisk1\\Partition0"}, - {"/dev/sdc", BRACK(FH_SDC), "\\Device\\Harddisk2\\Partition0"}, - {"/dev/sdd", BRACK(FH_SDD), "\\Device\\Harddisk3\\Partition0"}, - {"/dev/sde", BRACK(FH_SDE), "\\Device\\Harddisk4\\Partition0"}, - {"/dev/sdf", BRACK(FH_SDF), "\\Device\\Harddisk5\\Partition0"}, - {"/dev/sdg", BRACK(FH_SDG), "\\Device\\Harddisk6\\Partition0"}, - {"/dev/sdh", BRACK(FH_SDH), "\\Device\\Harddisk7\\Partition0"}, - {"/dev/sdi", BRACK(FH_SDI), "\\Device\\Harddisk8\\Partition0"}, - {"/dev/sdj", BRACK(FH_SDJ), "\\Device\\Harddisk9\\Partition0"}, - {"/dev/sdk", BRACK(FH_SDK), "\\Device\\Harddisk10\\Partition0"}, - {"/dev/sdl", BRACK(FH_SDL), "\\Device\\Harddisk11\\Partition0"}, - {"/dev/sdm", BRACK(FH_SDM), "\\Device\\Harddisk12\\Partition0"}, - {"/dev/sdn", BRACK(FH_SDN), "\\Device\\Harddisk13\\Partition0"}, - {"/dev/sdo", BRACK(FH_SDO), "\\Device\\Harddisk14\\Partition0"}, - {"/dev/sdp", BRACK(FH_SDP), "\\Device\\Harddisk15\\Partition0"}, - {"/dev/sdq", BRACK(FH_SDQ), "\\Device\\Harddisk16\\Partition0"}, - {"/dev/sdr", BRACK(FH_SDR), "\\Device\\Harddisk17\\Partition0"}, - {"/dev/sds", BRACK(FH_SDS), "\\Device\\Harddisk18\\Partition0"}, - {"/dev/sdt", BRACK(FH_SDT), "\\Device\\Harddisk19\\Partition0"}, - {"/dev/sdu", BRACK(FH_SDU), "\\Device\\Harddisk20\\Partition0"}, - {"/dev/sdv", BRACK(FH_SDV), "\\Device\\Harddisk21\\Partition0"}, - {"/dev/sdw", BRACK(FH_SDW), "\\Device\\Harddisk22\\Partition0"}, - {"/dev/sdx", BRACK(FH_SDX), "\\Device\\Harddisk23\\Partition0"}, - {"/dev/sdy", BRACK(FH_SDY), "\\Device\\Harddisk24\\Partition0"}, - {"/dev/sdz", BRACK(FH_SDZ), "\\Device\\Harddisk25\\Partition0"}, - {"/dev/sda1", BRACK(FH_SDA | 1), "\\Device\\Harddisk0\\Partition1"}, - {"/dev/sda2", BRACK(FH_SDA | 2), "\\Device\\Harddisk0\\Partition2"}, - {"/dev/sda3", BRACK(FH_SDA | 3), "\\Device\\Harddisk0\\Partition3"}, - {"/dev/sda4", BRACK(FH_SDA | 4), "\\Device\\Harddisk0\\Partition4"}, - {"/dev/sda5", BRACK(FH_SDA | 5), "\\Device\\Harddisk0\\Partition5"}, - {"/dev/sda6", BRACK(FH_SDA | 6), "\\Device\\Harddisk0\\Partition6"}, - {"/dev/sda7", BRACK(FH_SDA | 7), "\\Device\\Harddisk0\\Partition7"}, - {"/dev/sda8", BRACK(FH_SDA | 8), "\\Device\\Harddisk0\\Partition8"}, - {"/dev/sda9", BRACK(FH_SDA | 9), "\\Device\\Harddisk0\\Partition9"}, - {"/dev/sda10", BRACK(FH_SDA | 10), "\\Device\\Harddisk0\\Partition10"}, - {"/dev/sda11", BRACK(FH_SDA | 11), "\\Device\\Harddisk0\\Partition11"}, - {"/dev/sda12", BRACK(FH_SDA | 12), "\\Device\\Harddisk0\\Partition12"}, - {"/dev/sda13", BRACK(FH_SDA | 13), "\\Device\\Harddisk0\\Partition13"}, - {"/dev/sda14", BRACK(FH_SDA | 14), "\\Device\\Harddisk0\\Partition14"}, - {"/dev/sda15", BRACK(FH_SDA | 15), "\\Device\\Harddisk0\\Partition15"}, - {"/dev/sdb1", BRACK(FH_SDB | 1), "\\Device\\Harddisk1\\Partition1"}, - {"/dev/sdb2", BRACK(FH_SDB | 2), "\\Device\\Harddisk1\\Partition2"}, - {"/dev/sdb3", BRACK(FH_SDB | 3), "\\Device\\Harddisk1\\Partition3"}, - {"/dev/sdb4", BRACK(FH_SDB | 4), "\\Device\\Harddisk1\\Partition4"}, - {"/dev/sdb5", BRACK(FH_SDB | 5), "\\Device\\Harddisk1\\Partition5"}, - {"/dev/sdb6", BRACK(FH_SDB | 6), "\\Device\\Harddisk1\\Partition6"}, - {"/dev/sdb7", BRACK(FH_SDB | 7), "\\Device\\Harddisk1\\Partition7"}, - {"/dev/sdb8", BRACK(FH_SDB | 8), "\\Device\\Harddisk1\\Partition8"}, - {"/dev/sdb9", BRACK(FH_SDB | 9), "\\Device\\Harddisk1\\Partition9"}, - {"/dev/sdb10", BRACK(FH_SDB | 10), "\\Device\\Harddisk1\\Partition10"}, - {"/dev/sdb11", BRACK(FH_SDB | 11), "\\Device\\Harddisk1\\Partition11"}, - {"/dev/sdb12", BRACK(FH_SDB | 12), "\\Device\\Harddisk1\\Partition12"}, - {"/dev/sdb13", BRACK(FH_SDB | 13), "\\Device\\Harddisk1\\Partition13"}, - {"/dev/sdb14", BRACK(FH_SDB | 14), "\\Device\\Harddisk1\\Partition14"}, - {"/dev/sdb15", BRACK(FH_SDB | 15), "\\Device\\Harddisk1\\Partition15"}, - {"/dev/sdc1", BRACK(FH_SDC | 1), "\\Device\\Harddisk2\\Partition1"}, - {"/dev/sdc2", BRACK(FH_SDC | 2), "\\Device\\Harddisk2\\Partition2"}, - {"/dev/sdc3", BRACK(FH_SDC | 3), "\\Device\\Harddisk2\\Partition3"}, - {"/dev/sdc4", BRACK(FH_SDC | 4), "\\Device\\Harddisk2\\Partition4"}, - {"/dev/sdc5", BRACK(FH_SDC | 5), "\\Device\\Harddisk2\\Partition5"}, - {"/dev/sdc6", BRACK(FH_SDC | 6), "\\Device\\Harddisk2\\Partition6"}, - {"/dev/sdc7", BRACK(FH_SDC | 7), "\\Device\\Harddisk2\\Partition7"}, - {"/dev/sdc8", BRACK(FH_SDC | 8), "\\Device\\Harddisk2\\Partition8"}, - {"/dev/sdc9", BRACK(FH_SDC | 9), "\\Device\\Harddisk2\\Partition9"}, - {"/dev/sdc10", BRACK(FH_SDC | 10), "\\Device\\Harddisk2\\Partition10"}, - {"/dev/sdc11", BRACK(FH_SDC | 11), "\\Device\\Harddisk2\\Partition11"}, - {"/dev/sdc12", BRACK(FH_SDC | 12), "\\Device\\Harddisk2\\Partition12"}, - {"/dev/sdc13", BRACK(FH_SDC | 13), "\\Device\\Harddisk2\\Partition13"}, - {"/dev/sdc14", BRACK(FH_SDC | 14), "\\Device\\Harddisk2\\Partition14"}, - {"/dev/sdc15", BRACK(FH_SDC | 15), "\\Device\\Harddisk2\\Partition15"}, - {"/dev/sdd1", BRACK(FH_SDD | 1), "\\Device\\Harddisk3\\Partition1"}, - {"/dev/sdd2", BRACK(FH_SDD | 2), "\\Device\\Harddisk3\\Partition2"}, - {"/dev/sdd3", BRACK(FH_SDD | 3), "\\Device\\Harddisk3\\Partition3"}, - {"/dev/sdd4", BRACK(FH_SDD | 4), "\\Device\\Harddisk3\\Partition4"}, - {"/dev/sdd5", BRACK(FH_SDD | 5), "\\Device\\Harddisk3\\Partition5"}, - {"/dev/sdd6", BRACK(FH_SDD | 6), "\\Device\\Harddisk3\\Partition6"}, - {"/dev/sdd7", BRACK(FH_SDD | 7), "\\Device\\Harddisk3\\Partition7"}, - {"/dev/sdd8", BRACK(FH_SDD | 8), "\\Device\\Harddisk3\\Partition8"}, - {"/dev/sdd9", BRACK(FH_SDD | 9), "\\Device\\Harddisk3\\Partition9"}, - {"/dev/sdd10", BRACK(FH_SDD | 10), "\\Device\\Harddisk3\\Partition10"}, - {"/dev/sdd11", BRACK(FH_SDD | 11), "\\Device\\Harddisk3\\Partition11"}, - {"/dev/sdd12", BRACK(FH_SDD | 12), "\\Device\\Harddisk3\\Partition12"}, - {"/dev/sdd13", BRACK(FH_SDD | 13), "\\Device\\Harddisk3\\Partition13"}, - {"/dev/sdd14", BRACK(FH_SDD | 14), "\\Device\\Harddisk3\\Partition14"}, - {"/dev/sdd15", BRACK(FH_SDD | 15), "\\Device\\Harddisk3\\Partition15"}, - {"/dev/sde1", BRACK(FH_SDE | 1), "\\Device\\Harddisk4\\Partition1"}, - {"/dev/sde2", BRACK(FH_SDE | 2), "\\Device\\Harddisk4\\Partition2"}, - {"/dev/sde3", BRACK(FH_SDE | 3), "\\Device\\Harddisk4\\Partition3"}, - {"/dev/sde4", BRACK(FH_SDE | 4), "\\Device\\Harddisk4\\Partition4"}, - {"/dev/sde5", BRACK(FH_SDE | 5), "\\Device\\Harddisk4\\Partition5"}, - {"/dev/sde6", BRACK(FH_SDE | 6), "\\Device\\Harddisk4\\Partition6"}, - {"/dev/sde7", BRACK(FH_SDE | 7), "\\Device\\Harddisk4\\Partition7"}, - {"/dev/sde8", BRACK(FH_SDE | 8), "\\Device\\Harddisk4\\Partition8"}, - {"/dev/sde9", BRACK(FH_SDE | 9), "\\Device\\Harddisk4\\Partition9"}, - {"/dev/sde10", BRACK(FH_SDE | 10), "\\Device\\Harddisk4\\Partition10"}, - {"/dev/sde11", BRACK(FH_SDE | 11), "\\Device\\Harddisk4\\Partition11"}, - {"/dev/sde12", BRACK(FH_SDE | 12), "\\Device\\Harddisk4\\Partition12"}, - {"/dev/sde13", BRACK(FH_SDE | 13), "\\Device\\Harddisk4\\Partition13"}, - {"/dev/sde14", BRACK(FH_SDE | 14), "\\Device\\Harddisk4\\Partition14"}, - {"/dev/sde15", BRACK(FH_SDE | 15), "\\Device\\Harddisk4\\Partition15"}, - {"/dev/sdf1", BRACK(FH_SDF | 1), "\\Device\\Harddisk5\\Partition1"}, - {"/dev/sdf2", BRACK(FH_SDF | 2), "\\Device\\Harddisk5\\Partition2"}, - {"/dev/sdf3", BRACK(FH_SDF | 3), "\\Device\\Harddisk5\\Partition3"}, - {"/dev/sdf4", BRACK(FH_SDF | 4), "\\Device\\Harddisk5\\Partition4"}, - {"/dev/sdf5", BRACK(FH_SDF | 5), "\\Device\\Harddisk5\\Partition5"}, - {"/dev/sdf6", BRACK(FH_SDF | 6), "\\Device\\Harddisk5\\Partition6"}, - {"/dev/sdf7", BRACK(FH_SDF | 7), "\\Device\\Harddisk5\\Partition7"}, - {"/dev/sdf8", BRACK(FH_SDF | 8), "\\Device\\Harddisk5\\Partition8"}, - {"/dev/sdf9", BRACK(FH_SDF | 9), "\\Device\\Harddisk5\\Partition9"}, - {"/dev/sdf10", BRACK(FH_SDF | 10), "\\Device\\Harddisk5\\Partition10"}, - {"/dev/sdf11", BRACK(FH_SDF | 11), "\\Device\\Harddisk5\\Partition11"}, - {"/dev/sdf12", BRACK(FH_SDF | 12), "\\Device\\Harddisk5\\Partition12"}, - {"/dev/sdf13", BRACK(FH_SDF | 13), "\\Device\\Harddisk5\\Partition13"}, - {"/dev/sdf14", BRACK(FH_SDF | 14), "\\Device\\Harddisk5\\Partition14"}, - {"/dev/sdf15", BRACK(FH_SDF | 15), "\\Device\\Harddisk5\\Partition15"}, - {"/dev/sdg1", BRACK(FH_SDG | 1), "\\Device\\Harddisk6\\Partition1"}, - {"/dev/sdg2", BRACK(FH_SDG | 2), "\\Device\\Harddisk6\\Partition2"}, - {"/dev/sdg3", BRACK(FH_SDG | 3), "\\Device\\Harddisk6\\Partition3"}, - {"/dev/sdg4", BRACK(FH_SDG | 4), "\\Device\\Harddisk6\\Partition4"}, - {"/dev/sdg5", BRACK(FH_SDG | 5), "\\Device\\Harddisk6\\Partition5"}, - {"/dev/sdg6", BRACK(FH_SDG | 6), "\\Device\\Harddisk6\\Partition6"}, - {"/dev/sdg7", BRACK(FH_SDG | 7), "\\Device\\Harddisk6\\Partition7"}, - {"/dev/sdg8", BRACK(FH_SDG | 8), "\\Device\\Harddisk6\\Partition8"}, - {"/dev/sdg9", BRACK(FH_SDG | 9), "\\Device\\Harddisk6\\Partition9"}, - {"/dev/sdg10", BRACK(FH_SDG | 10), "\\Device\\Harddisk6\\Partition10"}, - {"/dev/sdg11", BRACK(FH_SDG | 11), "\\Device\\Harddisk6\\Partition11"}, - {"/dev/sdg12", BRACK(FH_SDG | 12), "\\Device\\Harddisk6\\Partition12"}, - {"/dev/sdg13", BRACK(FH_SDG | 13), "\\Device\\Harddisk6\\Partition13"}, - {"/dev/sdg14", BRACK(FH_SDG | 14), "\\Device\\Harddisk6\\Partition14"}, - {"/dev/sdg15", BRACK(FH_SDG | 15), "\\Device\\Harddisk6\\Partition15"}, - {"/dev/sdh1", BRACK(FH_SDH | 1), "\\Device\\Harddisk7\\Partition1"}, - {"/dev/sdh2", BRACK(FH_SDH | 2), "\\Device\\Harddisk7\\Partition2"}, - {"/dev/sdh3", BRACK(FH_SDH | 3), "\\Device\\Harddisk7\\Partition3"}, - {"/dev/sdh4", BRACK(FH_SDH | 4), "\\Device\\Harddisk7\\Partition4"}, - {"/dev/sdh5", BRACK(FH_SDH | 5), "\\Device\\Harddisk7\\Partition5"}, - {"/dev/sdh6", BRACK(FH_SDH | 6), "\\Device\\Harddisk7\\Partition6"}, - {"/dev/sdh7", BRACK(FH_SDH | 7), "\\Device\\Harddisk7\\Partition7"}, - {"/dev/sdh8", BRACK(FH_SDH | 8), "\\Device\\Harddisk7\\Partition8"}, - {"/dev/sdh9", BRACK(FH_SDH | 9), "\\Device\\Harddisk7\\Partition9"}, - {"/dev/sdh10", BRACK(FH_SDH | 10), "\\Device\\Harddisk7\\Partition10"}, - {"/dev/sdh11", BRACK(FH_SDH | 11), "\\Device\\Harddisk7\\Partition11"}, - {"/dev/sdh12", BRACK(FH_SDH | 12), "\\Device\\Harddisk7\\Partition12"}, - {"/dev/sdh13", BRACK(FH_SDH | 13), "\\Device\\Harddisk7\\Partition13"}, - {"/dev/sdh14", BRACK(FH_SDH | 14), "\\Device\\Harddisk7\\Partition14"}, - {"/dev/sdh15", BRACK(FH_SDH | 15), "\\Device\\Harddisk7\\Partition15"}, - {"/dev/sdi1", BRACK(FH_SDI | 1), "\\Device\\Harddisk8\\Partition1"}, - {"/dev/sdi2", BRACK(FH_SDI | 2), "\\Device\\Harddisk8\\Partition2"}, - {"/dev/sdi3", BRACK(FH_SDI | 3), "\\Device\\Harddisk8\\Partition3"}, - {"/dev/sdi4", BRACK(FH_SDI | 4), "\\Device\\Harddisk8\\Partition4"}, - {"/dev/sdi5", BRACK(FH_SDI | 5), "\\Device\\Harddisk8\\Partition5"}, - {"/dev/sdi6", BRACK(FH_SDI | 6), "\\Device\\Harddisk8\\Partition6"}, - {"/dev/sdi7", BRACK(FH_SDI | 7), "\\Device\\Harddisk8\\Partition7"}, - {"/dev/sdi8", BRACK(FH_SDI | 8), "\\Device\\Harddisk8\\Partition8"}, - {"/dev/sdi9", BRACK(FH_SDI | 9), "\\Device\\Harddisk8\\Partition9"}, - {"/dev/sdi10", BRACK(FH_SDI | 10), "\\Device\\Harddisk8\\Partition10"}, - {"/dev/sdi11", BRACK(FH_SDI | 11), "\\Device\\Harddisk8\\Partition11"}, - {"/dev/sdi12", BRACK(FH_SDI | 12), "\\Device\\Harddisk8\\Partition12"}, - {"/dev/sdi13", BRACK(FH_SDI | 13), "\\Device\\Harddisk8\\Partition13"}, - {"/dev/sdi14", BRACK(FH_SDI | 14), "\\Device\\Harddisk8\\Partition14"}, - {"/dev/sdi15", BRACK(FH_SDI | 15), "\\Device\\Harddisk8\\Partition15"}, - {"/dev/sdj1", BRACK(FH_SDJ | 1), "\\Device\\Harddisk9\\Partition1"}, - {"/dev/sdj2", BRACK(FH_SDJ | 2), "\\Device\\Harddisk9\\Partition2"}, - {"/dev/sdj3", BRACK(FH_SDJ | 3), "\\Device\\Harddisk9\\Partition3"}, - {"/dev/sdj4", BRACK(FH_SDJ | 4), "\\Device\\Harddisk9\\Partition4"}, - {"/dev/sdj5", BRACK(FH_SDJ | 5), "\\Device\\Harddisk9\\Partition5"}, - {"/dev/sdj6", BRACK(FH_SDJ | 6), "\\Device\\Harddisk9\\Partition6"}, - {"/dev/sdj7", BRACK(FH_SDJ | 7), "\\Device\\Harddisk9\\Partition7"}, - {"/dev/sdj8", BRACK(FH_SDJ | 8), "\\Device\\Harddisk9\\Partition8"}, - {"/dev/sdj9", BRACK(FH_SDJ | 9), "\\Device\\Harddisk9\\Partition9"}, - {"/dev/sdj10", BRACK(FH_SDJ | 10), "\\Device\\Harddisk9\\Partition10"}, - {"/dev/sdj11", BRACK(FH_SDJ | 11), "\\Device\\Harddisk9\\Partition11"}, - {"/dev/sdj12", BRACK(FH_SDJ | 12), "\\Device\\Harddisk9\\Partition12"}, - {"/dev/sdj13", BRACK(FH_SDJ | 13), "\\Device\\Harddisk9\\Partition13"}, - {"/dev/sdj14", BRACK(FH_SDJ | 14), "\\Device\\Harddisk9\\Partition14"}, - {"/dev/sdj15", BRACK(FH_SDJ | 15), "\\Device\\Harddisk9\\Partition15"}, - {"/dev/sdk1", BRACK(FH_SDK | 1), "\\Device\\Harddisk10\\Partition1"}, - {"/dev/sdk2", BRACK(FH_SDK | 2), "\\Device\\Harddisk10\\Partition2"}, - {"/dev/sdk3", BRACK(FH_SDK | 3), "\\Device\\Harddisk10\\Partition3"}, - {"/dev/sdk4", BRACK(FH_SDK | 4), "\\Device\\Harddisk10\\Partition4"}, - {"/dev/sdk5", BRACK(FH_SDK | 5), "\\Device\\Harddisk10\\Partition5"}, - {"/dev/sdk6", BRACK(FH_SDK | 6), "\\Device\\Harddisk10\\Partition6"}, - {"/dev/sdk7", BRACK(FH_SDK | 7), "\\Device\\Harddisk10\\Partition7"}, - {"/dev/sdk8", BRACK(FH_SDK | 8), "\\Device\\Harddisk10\\Partition8"}, - {"/dev/sdk9", BRACK(FH_SDK | 9), "\\Device\\Harddisk10\\Partition9"}, - {"/dev/sdk10", BRACK(FH_SDK | 10), "\\Device\\Harddisk10\\Partition10"}, - {"/dev/sdk11", BRACK(FH_SDK | 11), "\\Device\\Harddisk10\\Partition11"}, - {"/dev/sdk12", BRACK(FH_SDK | 12), "\\Device\\Harddisk10\\Partition12"}, - {"/dev/sdk13", BRACK(FH_SDK | 13), "\\Device\\Harddisk10\\Partition13"}, - {"/dev/sdk14", BRACK(FH_SDK | 14), "\\Device\\Harddisk10\\Partition14"}, - {"/dev/sdk15", BRACK(FH_SDK | 15), "\\Device\\Harddisk10\\Partition15"}, - {"/dev/sdl1", BRACK(FH_SDL | 1), "\\Device\\Harddisk11\\Partition1"}, - {"/dev/sdl2", BRACK(FH_SDL | 2), "\\Device\\Harddisk11\\Partition2"}, - {"/dev/sdl3", BRACK(FH_SDL | 3), "\\Device\\Harddisk11\\Partition3"}, - {"/dev/sdl4", BRACK(FH_SDL | 4), "\\Device\\Harddisk11\\Partition4"}, - {"/dev/sdl5", BRACK(FH_SDL | 5), "\\Device\\Harddisk11\\Partition5"}, - {"/dev/sdl6", BRACK(FH_SDL | 6), "\\Device\\Harddisk11\\Partition6"}, - {"/dev/sdl7", BRACK(FH_SDL | 7), "\\Device\\Harddisk11\\Partition7"}, - {"/dev/sdl8", BRACK(FH_SDL | 8), "\\Device\\Harddisk11\\Partition8"}, - {"/dev/sdl9", BRACK(FH_SDL | 9), "\\Device\\Harddisk11\\Partition9"}, - {"/dev/sdl10", BRACK(FH_SDL | 10), "\\Device\\Harddisk11\\Partition10"}, - {"/dev/sdl11", BRACK(FH_SDL | 11), "\\Device\\Harddisk11\\Partition11"}, - {"/dev/sdl12", BRACK(FH_SDL | 12), "\\Device\\Harddisk11\\Partition12"}, - {"/dev/sdl13", BRACK(FH_SDL | 13), "\\Device\\Harddisk11\\Partition13"}, - {"/dev/sdl14", BRACK(FH_SDL | 14), "\\Device\\Harddisk11\\Partition14"}, - {"/dev/sdl15", BRACK(FH_SDL | 15), "\\Device\\Harddisk11\\Partition15"}, - {"/dev/sdm1", BRACK(FH_SDM | 1), "\\Device\\Harddisk12\\Partition1"}, - {"/dev/sdm2", BRACK(FH_SDM | 2), "\\Device\\Harddisk12\\Partition2"}, - {"/dev/sdm3", BRACK(FH_SDM | 3), "\\Device\\Harddisk12\\Partition3"}, - {"/dev/sdm4", BRACK(FH_SDM | 4), "\\Device\\Harddisk12\\Partition4"}, - {"/dev/sdm5", BRACK(FH_SDM | 5), "\\Device\\Harddisk12\\Partition5"}, - {"/dev/sdm6", BRACK(FH_SDM | 6), "\\Device\\Harddisk12\\Partition6"}, - {"/dev/sdm7", BRACK(FH_SDM | 7), "\\Device\\Harddisk12\\Partition7"}, - {"/dev/sdm8", BRACK(FH_SDM | 8), "\\Device\\Harddisk12\\Partition8"}, - {"/dev/sdm9", BRACK(FH_SDM | 9), "\\Device\\Harddisk12\\Partition9"}, - {"/dev/sdm10", BRACK(FH_SDM | 10), "\\Device\\Harddisk12\\Partition10"}, - {"/dev/sdm11", BRACK(FH_SDM | 11), "\\Device\\Harddisk12\\Partition11"}, - {"/dev/sdm12", BRACK(FH_SDM | 12), "\\Device\\Harddisk12\\Partition12"}, - {"/dev/sdm13", BRACK(FH_SDM | 13), "\\Device\\Harddisk12\\Partition13"}, - {"/dev/sdm14", BRACK(FH_SDM | 14), "\\Device\\Harddisk12\\Partition14"}, - {"/dev/sdm15", BRACK(FH_SDM | 15), "\\Device\\Harddisk12\\Partition15"}, - {"/dev/sdn1", BRACK(FH_SDN | 1), "\\Device\\Harddisk13\\Partition1"}, - {"/dev/sdn2", BRACK(FH_SDN | 2), "\\Device\\Harddisk13\\Partition2"}, - {"/dev/sdn3", BRACK(FH_SDN | 3), "\\Device\\Harddisk13\\Partition3"}, - {"/dev/sdn4", BRACK(FH_SDN | 4), "\\Device\\Harddisk13\\Partition4"}, - {"/dev/sdn5", BRACK(FH_SDN | 5), "\\Device\\Harddisk13\\Partition5"}, - {"/dev/sdn6", BRACK(FH_SDN | 6), "\\Device\\Harddisk13\\Partition6"}, - {"/dev/sdn7", BRACK(FH_SDN | 7), "\\Device\\Harddisk13\\Partition7"}, - {"/dev/sdn8", BRACK(FH_SDN | 8), "\\Device\\Harddisk13\\Partition8"}, - {"/dev/sdn9", BRACK(FH_SDN | 9), "\\Device\\Harddisk13\\Partition9"}, - {"/dev/sdn10", BRACK(FH_SDN | 10), "\\Device\\Harddisk13\\Partition10"}, - {"/dev/sdn11", BRACK(FH_SDN | 11), "\\Device\\Harddisk13\\Partition11"}, - {"/dev/sdn12", BRACK(FH_SDN | 12), "\\Device\\Harddisk13\\Partition12"}, - {"/dev/sdn13", BRACK(FH_SDN | 13), "\\Device\\Harddisk13\\Partition13"}, - {"/dev/sdn14", BRACK(FH_SDN | 14), "\\Device\\Harddisk13\\Partition14"}, - {"/dev/sdn15", BRACK(FH_SDN | 15), "\\Device\\Harddisk13\\Partition15"}, - {"/dev/sdo1", BRACK(FH_SDO | 1), "\\Device\\Harddisk14\\Partition1"}, - {"/dev/sdo2", BRACK(FH_SDO | 2), "\\Device\\Harddisk14\\Partition2"}, - {"/dev/sdo3", BRACK(FH_SDO | 3), "\\Device\\Harddisk14\\Partition3"}, - {"/dev/sdo4", BRACK(FH_SDO | 4), "\\Device\\Harddisk14\\Partition4"}, - {"/dev/sdo5", BRACK(FH_SDO | 5), "\\Device\\Harddisk14\\Partition5"}, - {"/dev/sdo6", BRACK(FH_SDO | 6), "\\Device\\Harddisk14\\Partition6"}, - {"/dev/sdo7", BRACK(FH_SDO | 7), "\\Device\\Harddisk14\\Partition7"}, - {"/dev/sdo8", BRACK(FH_SDO | 8), "\\Device\\Harddisk14\\Partition8"}, - {"/dev/sdo9", BRACK(FH_SDO | 9), "\\Device\\Harddisk14\\Partition9"}, - {"/dev/sdo10", BRACK(FH_SDO | 10), "\\Device\\Harddisk14\\Partition10"}, - {"/dev/sdo11", BRACK(FH_SDO | 11), "\\Device\\Harddisk14\\Partition11"}, - {"/dev/sdo12", BRACK(FH_SDO | 12), "\\Device\\Harddisk14\\Partition12"}, - {"/dev/sdo13", BRACK(FH_SDO | 13), "\\Device\\Harddisk14\\Partition13"}, - {"/dev/sdo14", BRACK(FH_SDO | 14), "\\Device\\Harddisk14\\Partition14"}, - {"/dev/sdo15", BRACK(FH_SDO | 15), "\\Device\\Harddisk14\\Partition15"}, - {"/dev/sdp1", BRACK(FH_SDP | 1), "\\Device\\Harddisk15\\Partition1"}, - {"/dev/sdp2", BRACK(FH_SDP | 2), "\\Device\\Harddisk15\\Partition2"}, - {"/dev/sdp3", BRACK(FH_SDP | 3), "\\Device\\Harddisk15\\Partition3"}, - {"/dev/sdp4", BRACK(FH_SDP | 4), "\\Device\\Harddisk15\\Partition4"}, - {"/dev/sdp5", BRACK(FH_SDP | 5), "\\Device\\Harddisk15\\Partition5"}, - {"/dev/sdp6", BRACK(FH_SDP | 6), "\\Device\\Harddisk15\\Partition6"}, - {"/dev/sdp7", BRACK(FH_SDP | 7), "\\Device\\Harddisk15\\Partition7"}, - {"/dev/sdp8", BRACK(FH_SDP | 8), "\\Device\\Harddisk15\\Partition8"}, - {"/dev/sdp9", BRACK(FH_SDP | 9), "\\Device\\Harddisk15\\Partition9"}, - {"/dev/sdp10", BRACK(FH_SDP | 10), "\\Device\\Harddisk15\\Partition10"}, - {"/dev/sdp11", BRACK(FH_SDP | 11), "\\Device\\Harddisk15\\Partition11"}, - {"/dev/sdp12", BRACK(FH_SDP | 12), "\\Device\\Harddisk15\\Partition12"}, - {"/dev/sdp13", BRACK(FH_SDP | 13), "\\Device\\Harddisk15\\Partition13"}, - {"/dev/sdp14", BRACK(FH_SDP | 14), "\\Device\\Harddisk15\\Partition14"}, - {"/dev/sdp15", BRACK(FH_SDP | 15), "\\Device\\Harddisk15\\Partition15"}, - {"/dev/sdq1", BRACK(FH_SDQ | 1), "\\Device\\Harddisk16\\Partition1"}, - {"/dev/sdq2", BRACK(FH_SDQ | 2), "\\Device\\Harddisk16\\Partition2"}, - {"/dev/sdq3", BRACK(FH_SDQ | 3), "\\Device\\Harddisk16\\Partition3"}, - {"/dev/sdq4", BRACK(FH_SDQ | 4), "\\Device\\Harddisk16\\Partition4"}, - {"/dev/sdq5", BRACK(FH_SDQ | 5), "\\Device\\Harddisk16\\Partition5"}, - {"/dev/sdq6", BRACK(FH_SDQ | 6), "\\Device\\Harddisk16\\Partition6"}, - {"/dev/sdq7", BRACK(FH_SDQ | 7), "\\Device\\Harddisk16\\Partition7"}, - {"/dev/sdq8", BRACK(FH_SDQ | 8), "\\Device\\Harddisk16\\Partition8"}, - {"/dev/sdq9", BRACK(FH_SDQ | 9), "\\Device\\Harddisk16\\Partition9"}, - {"/dev/sdq10", BRACK(FH_SDQ | 10), "\\Device\\Harddisk16\\Partition10"}, - {"/dev/sdq11", BRACK(FH_SDQ | 11), "\\Device\\Harddisk16\\Partition11"}, - {"/dev/sdq12", BRACK(FH_SDQ | 12), "\\Device\\Harddisk16\\Partition12"}, - {"/dev/sdq13", BRACK(FH_SDQ | 13), "\\Device\\Harddisk16\\Partition13"}, - {"/dev/sdq14", BRACK(FH_SDQ | 14), "\\Device\\Harddisk16\\Partition14"}, - {"/dev/sdq15", BRACK(FH_SDQ | 15), "\\Device\\Harddisk16\\Partition15"}, - {"/dev/sdr1", BRACK(FH_SDR | 1), "\\Device\\Harddisk17\\Partition1"}, - {"/dev/sdr2", BRACK(FH_SDR | 2), "\\Device\\Harddisk17\\Partition2"}, - {"/dev/sdr3", BRACK(FH_SDR | 3), "\\Device\\Harddisk17\\Partition3"}, - {"/dev/sdr4", BRACK(FH_SDR | 4), "\\Device\\Harddisk17\\Partition4"}, - {"/dev/sdr5", BRACK(FH_SDR | 5), "\\Device\\Harddisk17\\Partition5"}, - {"/dev/sdr6", BRACK(FH_SDR | 6), "\\Device\\Harddisk17\\Partition6"}, - {"/dev/sdr7", BRACK(FH_SDR | 7), "\\Device\\Harddisk17\\Partition7"}, - {"/dev/sdr8", BRACK(FH_SDR | 8), "\\Device\\Harddisk17\\Partition8"}, - {"/dev/sdr9", BRACK(FH_SDR | 9), "\\Device\\Harddisk17\\Partition9"}, - {"/dev/sdr10", BRACK(FH_SDR | 10), "\\Device\\Harddisk17\\Partition10"}, - {"/dev/sdr11", BRACK(FH_SDR | 11), "\\Device\\Harddisk17\\Partition11"}, - {"/dev/sdr12", BRACK(FH_SDR | 12), "\\Device\\Harddisk17\\Partition12"}, - {"/dev/sdr13", BRACK(FH_SDR | 13), "\\Device\\Harddisk17\\Partition13"}, - {"/dev/sdr14", BRACK(FH_SDR | 14), "\\Device\\Harddisk17\\Partition14"}, - {"/dev/sdr15", BRACK(FH_SDR | 15), "\\Device\\Harddisk17\\Partition15"}, - {"/dev/sds1", BRACK(FH_SDS | 1), "\\Device\\Harddisk18\\Partition1"}, - {"/dev/sds2", BRACK(FH_SDS | 2), "\\Device\\Harddisk18\\Partition2"}, - {"/dev/sds3", BRACK(FH_SDS | 3), "\\Device\\Harddisk18\\Partition3"}, - {"/dev/sds4", BRACK(FH_SDS | 4), "\\Device\\Harddisk18\\Partition4"}, - {"/dev/sds5", BRACK(FH_SDS | 5), "\\Device\\Harddisk18\\Partition5"}, - {"/dev/sds6", BRACK(FH_SDS | 6), "\\Device\\Harddisk18\\Partition6"}, - {"/dev/sds7", BRACK(FH_SDS | 7), "\\Device\\Harddisk18\\Partition7"}, - {"/dev/sds8", BRACK(FH_SDS | 8), "\\Device\\Harddisk18\\Partition8"}, - {"/dev/sds9", BRACK(FH_SDS | 9), "\\Device\\Harddisk18\\Partition9"}, - {"/dev/sds10", BRACK(FH_SDS | 10), "\\Device\\Harddisk18\\Partition10"}, - {"/dev/sds11", BRACK(FH_SDS | 11), "\\Device\\Harddisk18\\Partition11"}, - {"/dev/sds12", BRACK(FH_SDS | 12), "\\Device\\Harddisk18\\Partition12"}, - {"/dev/sds13", BRACK(FH_SDS | 13), "\\Device\\Harddisk18\\Partition13"}, - {"/dev/sds14", BRACK(FH_SDS | 14), "\\Device\\Harddisk18\\Partition14"}, - {"/dev/sds15", BRACK(FH_SDS | 15), "\\Device\\Harddisk18\\Partition15"}, - {"/dev/sdt1", BRACK(FH_SDT | 1), "\\Device\\Harddisk19\\Partition1"}, - {"/dev/sdt2", BRACK(FH_SDT | 2), "\\Device\\Harddisk19\\Partition2"}, - {"/dev/sdt3", BRACK(FH_SDT | 3), "\\Device\\Harddisk19\\Partition3"}, - {"/dev/sdt4", BRACK(FH_SDT | 4), "\\Device\\Harddisk19\\Partition4"}, - {"/dev/sdt5", BRACK(FH_SDT | 5), "\\Device\\Harddisk19\\Partition5"}, - {"/dev/sdt6", BRACK(FH_SDT | 6), "\\Device\\Harddisk19\\Partition6"}, - {"/dev/sdt7", BRACK(FH_SDT | 7), "\\Device\\Harddisk19\\Partition7"}, - {"/dev/sdt8", BRACK(FH_SDT | 8), "\\Device\\Harddisk19\\Partition8"}, - {"/dev/sdt9", BRACK(FH_SDT | 9), "\\Device\\Harddisk19\\Partition9"}, - {"/dev/sdt10", BRACK(FH_SDT | 10), "\\Device\\Harddisk19\\Partition10"}, - {"/dev/sdt11", BRACK(FH_SDT | 11), "\\Device\\Harddisk19\\Partition11"}, - {"/dev/sdt12", BRACK(FH_SDT | 12), "\\Device\\Harddisk19\\Partition12"}, - {"/dev/sdt13", BRACK(FH_SDT | 13), "\\Device\\Harddisk19\\Partition13"}, - {"/dev/sdt14", BRACK(FH_SDT | 14), "\\Device\\Harddisk19\\Partition14"}, - {"/dev/sdt15", BRACK(FH_SDT | 15), "\\Device\\Harddisk19\\Partition15"}, - {"/dev/sdu1", BRACK(FH_SDU | 1), "\\Device\\Harddisk20\\Partition1"}, - {"/dev/sdu2", BRACK(FH_SDU | 2), "\\Device\\Harddisk20\\Partition2"}, - {"/dev/sdu3", BRACK(FH_SDU | 3), "\\Device\\Harddisk20\\Partition3"}, - {"/dev/sdu4", BRACK(FH_SDU | 4), "\\Device\\Harddisk20\\Partition4"}, - {"/dev/sdu5", BRACK(FH_SDU | 5), "\\Device\\Harddisk20\\Partition5"}, - {"/dev/sdu6", BRACK(FH_SDU | 6), "\\Device\\Harddisk20\\Partition6"}, - {"/dev/sdu7", BRACK(FH_SDU | 7), "\\Device\\Harddisk20\\Partition7"}, - {"/dev/sdu8", BRACK(FH_SDU | 8), "\\Device\\Harddisk20\\Partition8"}, - {"/dev/sdu9", BRACK(FH_SDU | 9), "\\Device\\Harddisk20\\Partition9"}, - {"/dev/sdu10", BRACK(FH_SDU | 10), "\\Device\\Harddisk20\\Partition10"}, - {"/dev/sdu11", BRACK(FH_SDU | 11), "\\Device\\Harddisk20\\Partition11"}, - {"/dev/sdu12", BRACK(FH_SDU | 12), "\\Device\\Harddisk20\\Partition12"}, - {"/dev/sdu13", BRACK(FH_SDU | 13), "\\Device\\Harddisk20\\Partition13"}, - {"/dev/sdu14", BRACK(FH_SDU | 14), "\\Device\\Harddisk20\\Partition14"}, - {"/dev/sdu15", BRACK(FH_SDU | 15), "\\Device\\Harddisk20\\Partition15"}, - {"/dev/sdv1", BRACK(FH_SDV | 1), "\\Device\\Harddisk21\\Partition1"}, - {"/dev/sdv2", BRACK(FH_SDV | 2), "\\Device\\Harddisk21\\Partition2"}, - {"/dev/sdv3", BRACK(FH_SDV | 3), "\\Device\\Harddisk21\\Partition3"}, - {"/dev/sdv4", BRACK(FH_SDV | 4), "\\Device\\Harddisk21\\Partition4"}, - {"/dev/sdv5", BRACK(FH_SDV | 5), "\\Device\\Harddisk21\\Partition5"}, - {"/dev/sdv6", BRACK(FH_SDV | 6), "\\Device\\Harddisk21\\Partition6"}, - {"/dev/sdv7", BRACK(FH_SDV | 7), "\\Device\\Harddisk21\\Partition7"}, - {"/dev/sdv8", BRACK(FH_SDV | 8), "\\Device\\Harddisk21\\Partition8"}, - {"/dev/sdv9", BRACK(FH_SDV | 9), "\\Device\\Harddisk21\\Partition9"}, - {"/dev/sdv10", BRACK(FH_SDV | 10), "\\Device\\Harddisk21\\Partition10"}, - {"/dev/sdv11", BRACK(FH_SDV | 11), "\\Device\\Harddisk21\\Partition11"}, - {"/dev/sdv12", BRACK(FH_SDV | 12), "\\Device\\Harddisk21\\Partition12"}, - {"/dev/sdv13", BRACK(FH_SDV | 13), "\\Device\\Harddisk21\\Partition13"}, - {"/dev/sdv14", BRACK(FH_SDV | 14), "\\Device\\Harddisk21\\Partition14"}, - {"/dev/sdv15", BRACK(FH_SDV | 15), "\\Device\\Harddisk21\\Partition15"}, - {"/dev/sdw1", BRACK(FH_SDW | 1), "\\Device\\Harddisk22\\Partition1"}, - {"/dev/sdw2", BRACK(FH_SDW | 2), "\\Device\\Harddisk22\\Partition2"}, - {"/dev/sdw3", BRACK(FH_SDW | 3), "\\Device\\Harddisk22\\Partition3"}, - {"/dev/sdw4", BRACK(FH_SDW | 4), "\\Device\\Harddisk22\\Partition4"}, - {"/dev/sdw5", BRACK(FH_SDW | 5), "\\Device\\Harddisk22\\Partition5"}, - {"/dev/sdw6", BRACK(FH_SDW | 6), "\\Device\\Harddisk22\\Partition6"}, - {"/dev/sdw7", BRACK(FH_SDW | 7), "\\Device\\Harddisk22\\Partition7"}, - {"/dev/sdw8", BRACK(FH_SDW | 8), "\\Device\\Harddisk22\\Partition8"}, - {"/dev/sdw9", BRACK(FH_SDW | 9), "\\Device\\Harddisk22\\Partition9"}, - {"/dev/sdw10", BRACK(FH_SDW | 10), "\\Device\\Harddisk22\\Partition10"}, - {"/dev/sdw11", BRACK(FH_SDW | 11), "\\Device\\Harddisk22\\Partition11"}, - {"/dev/sdw12", BRACK(FH_SDW | 12), "\\Device\\Harddisk22\\Partition12"}, - {"/dev/sdw13", BRACK(FH_SDW | 13), "\\Device\\Harddisk22\\Partition13"}, - {"/dev/sdw14", BRACK(FH_SDW | 14), "\\Device\\Harddisk22\\Partition14"}, - {"/dev/sdw15", BRACK(FH_SDW | 15), "\\Device\\Harddisk22\\Partition15"}, - {"/dev/sdx1", BRACK(FH_SDX | 1), "\\Device\\Harddisk23\\Partition1"}, - {"/dev/sdx2", BRACK(FH_SDX | 2), "\\Device\\Harddisk23\\Partition2"}, - {"/dev/sdx3", BRACK(FH_SDX | 3), "\\Device\\Harddisk23\\Partition3"}, - {"/dev/sdx4", BRACK(FH_SDX | 4), "\\Device\\Harddisk23\\Partition4"}, - {"/dev/sdx5", BRACK(FH_SDX | 5), "\\Device\\Harddisk23\\Partition5"}, - {"/dev/sdx6", BRACK(FH_SDX | 6), "\\Device\\Harddisk23\\Partition6"}, - {"/dev/sdx7", BRACK(FH_SDX | 7), "\\Device\\Harddisk23\\Partition7"}, - {"/dev/sdx8", BRACK(FH_SDX | 8), "\\Device\\Harddisk23\\Partition8"}, - {"/dev/sdx9", BRACK(FH_SDX | 9), "\\Device\\Harddisk23\\Partition9"}, - {"/dev/sdx10", BRACK(FH_SDX | 10), "\\Device\\Harddisk23\\Partition10"}, - {"/dev/sdx11", BRACK(FH_SDX | 11), "\\Device\\Harddisk23\\Partition11"}, - {"/dev/sdx12", BRACK(FH_SDX | 12), "\\Device\\Harddisk23\\Partition12"}, - {"/dev/sdx13", BRACK(FH_SDX | 13), "\\Device\\Harddisk23\\Partition13"}, - {"/dev/sdx14", BRACK(FH_SDX | 14), "\\Device\\Harddisk23\\Partition14"}, - {"/dev/sdx15", BRACK(FH_SDX | 15), "\\Device\\Harddisk23\\Partition15"}, - {"/dev/sdy1", BRACK(FH_SDY | 1), "\\Device\\Harddisk24\\Partition1"}, - {"/dev/sdy2", BRACK(FH_SDY | 2), "\\Device\\Harddisk24\\Partition2"}, - {"/dev/sdy3", BRACK(FH_SDY | 3), "\\Device\\Harddisk24\\Partition3"}, - {"/dev/sdy4", BRACK(FH_SDY | 4), "\\Device\\Harddisk24\\Partition4"}, - {"/dev/sdy5", BRACK(FH_SDY | 5), "\\Device\\Harddisk24\\Partition5"}, - {"/dev/sdy6", BRACK(FH_SDY | 6), "\\Device\\Harddisk24\\Partition6"}, - {"/dev/sdy7", BRACK(FH_SDY | 7), "\\Device\\Harddisk24\\Partition7"}, - {"/dev/sdy8", BRACK(FH_SDY | 8), "\\Device\\Harddisk24\\Partition8"}, - {"/dev/sdy9", BRACK(FH_SDY | 9), "\\Device\\Harddisk24\\Partition9"}, - {"/dev/sdy10", BRACK(FH_SDY | 10), "\\Device\\Harddisk24\\Partition10"}, - {"/dev/sdy11", BRACK(FH_SDY | 11), "\\Device\\Harddisk24\\Partition11"}, - {"/dev/sdy12", BRACK(FH_SDY | 12), "\\Device\\Harddisk24\\Partition12"}, - {"/dev/sdy13", BRACK(FH_SDY | 13), "\\Device\\Harddisk24\\Partition13"}, - {"/dev/sdy14", BRACK(FH_SDY | 14), "\\Device\\Harddisk24\\Partition14"}, - {"/dev/sdy15", BRACK(FH_SDY | 15), "\\Device\\Harddisk24\\Partition15"}, - {"/dev/sdz1", BRACK(FH_SDZ | 1), "\\Device\\Harddisk25\\Partition1"}, - {"/dev/sdz2", BRACK(FH_SDZ | 2), "\\Device\\Harddisk25\\Partition2"}, - {"/dev/sdz3", BRACK(FH_SDZ | 3), "\\Device\\Harddisk25\\Partition3"}, - {"/dev/sdz4", BRACK(FH_SDZ | 4), "\\Device\\Harddisk25\\Partition4"}, - {"/dev/sdz5", BRACK(FH_SDZ | 5), "\\Device\\Harddisk25\\Partition5"}, - {"/dev/sdz6", BRACK(FH_SDZ | 6), "\\Device\\Harddisk25\\Partition6"}, - {"/dev/sdz7", BRACK(FH_SDZ | 7), "\\Device\\Harddisk25\\Partition7"}, - {"/dev/sdz8", BRACK(FH_SDZ | 8), "\\Device\\Harddisk25\\Partition8"}, - {"/dev/sdz9", BRACK(FH_SDZ | 9), "\\Device\\Harddisk25\\Partition9"}, - {"/dev/sdz10", BRACK(FH_SDZ | 10), "\\Device\\Harddisk25\\Partition10"}, - {"/dev/sdz11", BRACK(FH_SDZ | 11), "\\Device\\Harddisk25\\Partition11"}, - {"/dev/sdz12", BRACK(FH_SDZ | 12), "\\Device\\Harddisk25\\Partition12"}, - {"/dev/sdz13", BRACK(FH_SDZ | 13), "\\Device\\Harddisk25\\Partition13"}, - {"/dev/sdz14", BRACK(FH_SDZ | 14), "\\Device\\Harddisk25\\Partition14"}, - {"/dev/sdz15", BRACK(FH_SDZ | 15), "\\Device\\Harddisk25\\Partition15"}, - {"/dev/sr0", BRACK(FHDEV(DEV_CDROM_MAJOR, 0)), "\\Device\\CdRom0"}, - {"/dev/sr1", BRACK(FHDEV(DEV_CDROM_MAJOR, 1)), "\\Device\\CdRom1"}, - {"/dev/sr2", BRACK(FHDEV(DEV_CDROM_MAJOR, 2)), "\\Device\\CdRom2"}, - {"/dev/sr3", BRACK(FHDEV(DEV_CDROM_MAJOR, 3)), "\\Device\\CdRom3"}, - {"/dev/sr4", BRACK(FHDEV(DEV_CDROM_MAJOR, 4)), "\\Device\\CdRom4"}, - {"/dev/sr5", BRACK(FHDEV(DEV_CDROM_MAJOR, 5)), "\\Device\\CdRom5"}, - {"/dev/sr6", BRACK(FHDEV(DEV_CDROM_MAJOR, 6)), "\\Device\\CdRom6"}, - {"/dev/sr7", BRACK(FHDEV(DEV_CDROM_MAJOR, 7)), "\\Device\\CdRom7"}, - {"/dev/sr8", BRACK(FHDEV(DEV_CDROM_MAJOR, 8)), "\\Device\\CdRom8"}, - {"/dev/sr9", BRACK(FHDEV(DEV_CDROM_MAJOR, 9)), "\\Device\\CdRom9"}, - {"/dev/sr10", BRACK(FHDEV(DEV_CDROM_MAJOR, 10)), "\\Device\\CdRom10"}, - {"/dev/sr11", BRACK(FHDEV(DEV_CDROM_MAJOR, 11)), "\\Device\\CdRom11"}, - {"/dev/sr12", BRACK(FHDEV(DEV_CDROM_MAJOR, 12)), "\\Device\\CdRom12"}, - {"/dev/sr13", BRACK(FHDEV(DEV_CDROM_MAJOR, 13)), "\\Device\\CdRom13"}, - {"/dev/sr14", BRACK(FHDEV(DEV_CDROM_MAJOR, 14)), "\\Device\\CdRom14"}, - {"/dev/sr15", BRACK(FHDEV(DEV_CDROM_MAJOR, 15)), "\\Device\\CdRom15"}, - {"/dev/st0", BRACK(FHDEV(DEV_TAPE_MAJOR, 0)), "\\Device\\Tape0"}, - {"/dev/st1", BRACK(FHDEV(DEV_TAPE_MAJOR, 1)), "\\Device\\Tape1"}, - {"/dev/st2", BRACK(FHDEV(DEV_TAPE_MAJOR, 2)), "\\Device\\Tape2"}, - {"/dev/st3", BRACK(FHDEV(DEV_TAPE_MAJOR, 3)), "\\Device\\Tape3"}, - {"/dev/st4", BRACK(FHDEV(DEV_TAPE_MAJOR, 4)), "\\Device\\Tape4"}, - {"/dev/st5", BRACK(FHDEV(DEV_TAPE_MAJOR, 5)), "\\Device\\Tape5"}, - {"/dev/st6", BRACK(FHDEV(DEV_TAPE_MAJOR, 6)), "\\Device\\Tape6"}, - {"/dev/st7", BRACK(FHDEV(DEV_TAPE_MAJOR, 7)), "\\Device\\Tape7"}, - {"/dev/st8", BRACK(FHDEV(DEV_TAPE_MAJOR, 8)), "\\Device\\Tape8"}, - {"/dev/st9", BRACK(FHDEV(DEV_TAPE_MAJOR, 9)), "\\Device\\Tape9"}, - {"/dev/st10", BRACK(FHDEV(DEV_TAPE_MAJOR, 10)), "\\Device\\Tape10"}, - {"/dev/st11", BRACK(FHDEV(DEV_TAPE_MAJOR, 11)), "\\Device\\Tape11"}, - {"/dev/st12", BRACK(FHDEV(DEV_TAPE_MAJOR, 12)), "\\Device\\Tape12"}, - {"/dev/st13", BRACK(FHDEV(DEV_TAPE_MAJOR, 13)), "\\Device\\Tape13"}, - {"/dev/st14", BRACK(FHDEV(DEV_TAPE_MAJOR, 14)), "\\Device\\Tape14"}, - {"/dev/st15", BRACK(FHDEV(DEV_TAPE_MAJOR, 15)), "\\Device\\Tape15"}, - {"/dev/st16", BRACK(FHDEV(DEV_TAPE_MAJOR, 16)), "\\Device\\Tape16"}, - {"/dev/st17", BRACK(FHDEV(DEV_TAPE_MAJOR, 17)), "\\Device\\Tape17"}, - {"/dev/st18", BRACK(FHDEV(DEV_TAPE_MAJOR, 18)), "\\Device\\Tape18"}, - {"/dev/st19", BRACK(FHDEV(DEV_TAPE_MAJOR, 19)), "\\Device\\Tape19"}, - {"/dev/st20", BRACK(FHDEV(DEV_TAPE_MAJOR, 20)), "\\Device\\Tape20"}, - {"/dev/st21", BRACK(FHDEV(DEV_TAPE_MAJOR, 21)), "\\Device\\Tape21"}, - {"/dev/st22", BRACK(FHDEV(DEV_TAPE_MAJOR, 22)), "\\Device\\Tape22"}, - {"/dev/st23", BRACK(FHDEV(DEV_TAPE_MAJOR, 23)), "\\Device\\Tape23"}, - {"/dev/st24", BRACK(FHDEV(DEV_TAPE_MAJOR, 24)), "\\Device\\Tape24"}, - {"/dev/st25", BRACK(FHDEV(DEV_TAPE_MAJOR, 25)), "\\Device\\Tape25"}, - {"/dev/st26", BRACK(FHDEV(DEV_TAPE_MAJOR, 26)), "\\Device\\Tape26"}, - {"/dev/st27", BRACK(FHDEV(DEV_TAPE_MAJOR, 27)), "\\Device\\Tape27"}, - {"/dev/st28", BRACK(FHDEV(DEV_TAPE_MAJOR, 28)), "\\Device\\Tape28"}, - {"/dev/st29", BRACK(FHDEV(DEV_TAPE_MAJOR, 29)), "\\Device\\Tape29"}, - {"/dev/st30", BRACK(FHDEV(DEV_TAPE_MAJOR, 30)), "\\Device\\Tape30"}, - {"/dev/st31", BRACK(FHDEV(DEV_TAPE_MAJOR, 31)), "\\Device\\Tape31"}, - {"/dev/st32", BRACK(FHDEV(DEV_TAPE_MAJOR, 32)), "\\Device\\Tape32"}, - {"/dev/st33", BRACK(FHDEV(DEV_TAPE_MAJOR, 33)), "\\Device\\Tape33"}, - {"/dev/st34", BRACK(FHDEV(DEV_TAPE_MAJOR, 34)), "\\Device\\Tape34"}, - {"/dev/st35", BRACK(FHDEV(DEV_TAPE_MAJOR, 35)), "\\Device\\Tape35"}, - {"/dev/st36", BRACK(FHDEV(DEV_TAPE_MAJOR, 36)), "\\Device\\Tape36"}, - {"/dev/st37", BRACK(FHDEV(DEV_TAPE_MAJOR, 37)), "\\Device\\Tape37"}, - {"/dev/st38", BRACK(FHDEV(DEV_TAPE_MAJOR, 38)), "\\Device\\Tape38"}, - {"/dev/st39", BRACK(FHDEV(DEV_TAPE_MAJOR, 39)), "\\Device\\Tape39"}, - {"/dev/st40", BRACK(FHDEV(DEV_TAPE_MAJOR, 40)), "\\Device\\Tape40"}, - {"/dev/st41", BRACK(FHDEV(DEV_TAPE_MAJOR, 41)), "\\Device\\Tape41"}, - {"/dev/st42", BRACK(FHDEV(DEV_TAPE_MAJOR, 42)), "\\Device\\Tape42"}, - {"/dev/st43", BRACK(FHDEV(DEV_TAPE_MAJOR, 43)), "\\Device\\Tape43"}, - {"/dev/st44", BRACK(FHDEV(DEV_TAPE_MAJOR, 44)), "\\Device\\Tape44"}, - {"/dev/st45", BRACK(FHDEV(DEV_TAPE_MAJOR, 45)), "\\Device\\Tape45"}, - {"/dev/st46", BRACK(FHDEV(DEV_TAPE_MAJOR, 46)), "\\Device\\Tape46"}, - {"/dev/st47", BRACK(FHDEV(DEV_TAPE_MAJOR, 47)), "\\Device\\Tape47"}, - {"/dev/st48", BRACK(FHDEV(DEV_TAPE_MAJOR, 48)), "\\Device\\Tape48"}, - {"/dev/st49", BRACK(FHDEV(DEV_TAPE_MAJOR, 49)), "\\Device\\Tape49"}, - {"/dev/st50", BRACK(FHDEV(DEV_TAPE_MAJOR, 50)), "\\Device\\Tape50"}, - {"/dev/st51", BRACK(FHDEV(DEV_TAPE_MAJOR, 51)), "\\Device\\Tape51"}, - {"/dev/st52", BRACK(FHDEV(DEV_TAPE_MAJOR, 52)), "\\Device\\Tape52"}, - {"/dev/st53", BRACK(FHDEV(DEV_TAPE_MAJOR, 53)), "\\Device\\Tape53"}, - {"/dev/st54", BRACK(FHDEV(DEV_TAPE_MAJOR, 54)), "\\Device\\Tape54"}, - {"/dev/st55", BRACK(FHDEV(DEV_TAPE_MAJOR, 55)), "\\Device\\Tape55"}, - {"/dev/st56", BRACK(FHDEV(DEV_TAPE_MAJOR, 56)), "\\Device\\Tape56"}, - {"/dev/st57", BRACK(FHDEV(DEV_TAPE_MAJOR, 57)), "\\Device\\Tape57"}, - {"/dev/st58", BRACK(FHDEV(DEV_TAPE_MAJOR, 58)), "\\Device\\Tape58"}, - {"/dev/st59", BRACK(FHDEV(DEV_TAPE_MAJOR, 59)), "\\Device\\Tape59"}, - {"/dev/st60", BRACK(FHDEV(DEV_TAPE_MAJOR, 60)), "\\Device\\Tape60"}, - {"/dev/st61", BRACK(FHDEV(DEV_TAPE_MAJOR, 61)), "\\Device\\Tape61"}, - {"/dev/st62", BRACK(FHDEV(DEV_TAPE_MAJOR, 62)), "\\Device\\Tape62"}, - {"/dev/st63", BRACK(FHDEV(DEV_TAPE_MAJOR, 63)), "\\Device\\Tape63"}, - {"/dev/st64", BRACK(FHDEV(DEV_TAPE_MAJOR, 64)), "\\Device\\Tape64"}, - {"/dev/st65", BRACK(FHDEV(DEV_TAPE_MAJOR, 65)), "\\Device\\Tape65"}, - {"/dev/st66", BRACK(FHDEV(DEV_TAPE_MAJOR, 66)), "\\Device\\Tape66"}, - {"/dev/st67", BRACK(FHDEV(DEV_TAPE_MAJOR, 67)), "\\Device\\Tape67"}, - {"/dev/st68", BRACK(FHDEV(DEV_TAPE_MAJOR, 68)), "\\Device\\Tape68"}, - {"/dev/st69", BRACK(FHDEV(DEV_TAPE_MAJOR, 69)), "\\Device\\Tape69"}, - {"/dev/st70", BRACK(FHDEV(DEV_TAPE_MAJOR, 70)), "\\Device\\Tape70"}, - {"/dev/st71", BRACK(FHDEV(DEV_TAPE_MAJOR, 71)), "\\Device\\Tape71"}, - {"/dev/st72", BRACK(FHDEV(DEV_TAPE_MAJOR, 72)), "\\Device\\Tape72"}, - {"/dev/st73", BRACK(FHDEV(DEV_TAPE_MAJOR, 73)), "\\Device\\Tape73"}, - {"/dev/st74", BRACK(FHDEV(DEV_TAPE_MAJOR, 74)), "\\Device\\Tape74"}, - {"/dev/st75", BRACK(FHDEV(DEV_TAPE_MAJOR, 75)), "\\Device\\Tape75"}, - {"/dev/st76", BRACK(FHDEV(DEV_TAPE_MAJOR, 76)), "\\Device\\Tape76"}, - {"/dev/st77", BRACK(FHDEV(DEV_TAPE_MAJOR, 77)), "\\Device\\Tape77"}, - {"/dev/st78", BRACK(FHDEV(DEV_TAPE_MAJOR, 78)), "\\Device\\Tape78"}, - {"/dev/st79", BRACK(FHDEV(DEV_TAPE_MAJOR, 79)), "\\Device\\Tape79"}, - {"/dev/st80", BRACK(FHDEV(DEV_TAPE_MAJOR, 80)), "\\Device\\Tape80"}, - {"/dev/st81", BRACK(FHDEV(DEV_TAPE_MAJOR, 81)), "\\Device\\Tape81"}, - {"/dev/st82", BRACK(FHDEV(DEV_TAPE_MAJOR, 82)), "\\Device\\Tape82"}, - {"/dev/st83", BRACK(FHDEV(DEV_TAPE_MAJOR, 83)), "\\Device\\Tape83"}, - {"/dev/st84", BRACK(FHDEV(DEV_TAPE_MAJOR, 84)), "\\Device\\Tape84"}, - {"/dev/st85", BRACK(FHDEV(DEV_TAPE_MAJOR, 85)), "\\Device\\Tape85"}, - {"/dev/st86", BRACK(FHDEV(DEV_TAPE_MAJOR, 86)), "\\Device\\Tape86"}, - {"/dev/st87", BRACK(FHDEV(DEV_TAPE_MAJOR, 87)), "\\Device\\Tape87"}, - {"/dev/st88", BRACK(FHDEV(DEV_TAPE_MAJOR, 88)), "\\Device\\Tape88"}, - {"/dev/st89", BRACK(FHDEV(DEV_TAPE_MAJOR, 89)), "\\Device\\Tape89"}, - {"/dev/st90", BRACK(FHDEV(DEV_TAPE_MAJOR, 90)), "\\Device\\Tape90"}, - {"/dev/st91", BRACK(FHDEV(DEV_TAPE_MAJOR, 91)), "\\Device\\Tape91"}, - {"/dev/st92", BRACK(FHDEV(DEV_TAPE_MAJOR, 92)), "\\Device\\Tape92"}, - {"/dev/st93", BRACK(FHDEV(DEV_TAPE_MAJOR, 93)), "\\Device\\Tape93"}, - {"/dev/st94", BRACK(FHDEV(DEV_TAPE_MAJOR, 94)), "\\Device\\Tape94"}, - {"/dev/st95", BRACK(FHDEV(DEV_TAPE_MAJOR, 95)), "\\Device\\Tape95"}, - {"/dev/st96", BRACK(FHDEV(DEV_TAPE_MAJOR, 96)), "\\Device\\Tape96"}, - {"/dev/st97", BRACK(FHDEV(DEV_TAPE_MAJOR, 97)), "\\Device\\Tape97"}, - {"/dev/st98", BRACK(FHDEV(DEV_TAPE_MAJOR, 98)), "\\Device\\Tape98"}, - {"/dev/st99", BRACK(FHDEV(DEV_TAPE_MAJOR, 99)), "\\Device\\Tape99"}, - {"/dev/st100", BRACK(FHDEV(DEV_TAPE_MAJOR, 100)), "\\Device\\Tape100"}, - {"/dev/st101", BRACK(FHDEV(DEV_TAPE_MAJOR, 101)), "\\Device\\Tape101"}, - {"/dev/st102", BRACK(FHDEV(DEV_TAPE_MAJOR, 102)), "\\Device\\Tape102"}, - {"/dev/st103", BRACK(FHDEV(DEV_TAPE_MAJOR, 103)), "\\Device\\Tape103"}, - {"/dev/st104", BRACK(FHDEV(DEV_TAPE_MAJOR, 104)), "\\Device\\Tape104"}, - {"/dev/st105", BRACK(FHDEV(DEV_TAPE_MAJOR, 105)), "\\Device\\Tape105"}, - {"/dev/st106", BRACK(FHDEV(DEV_TAPE_MAJOR, 106)), "\\Device\\Tape106"}, - {"/dev/st107", BRACK(FHDEV(DEV_TAPE_MAJOR, 107)), "\\Device\\Tape107"}, - {"/dev/st108", BRACK(FHDEV(DEV_TAPE_MAJOR, 108)), "\\Device\\Tape108"}, - {"/dev/st109", BRACK(FHDEV(DEV_TAPE_MAJOR, 109)), "\\Device\\Tape109"}, - {"/dev/st110", BRACK(FHDEV(DEV_TAPE_MAJOR, 110)), "\\Device\\Tape110"}, - {"/dev/st111", BRACK(FHDEV(DEV_TAPE_MAJOR, 111)), "\\Device\\Tape111"}, - {"/dev/st112", BRACK(FHDEV(DEV_TAPE_MAJOR, 112)), "\\Device\\Tape112"}, - {"/dev/st113", BRACK(FHDEV(DEV_TAPE_MAJOR, 113)), "\\Device\\Tape113"}, - {"/dev/st114", BRACK(FHDEV(DEV_TAPE_MAJOR, 114)), "\\Device\\Tape114"}, - {"/dev/st115", BRACK(FHDEV(DEV_TAPE_MAJOR, 115)), "\\Device\\Tape115"}, - {"/dev/st116", BRACK(FHDEV(DEV_TAPE_MAJOR, 116)), "\\Device\\Tape116"}, - {"/dev/st117", BRACK(FHDEV(DEV_TAPE_MAJOR, 117)), "\\Device\\Tape117"}, - {"/dev/st118", BRACK(FHDEV(DEV_TAPE_MAJOR, 118)), "\\Device\\Tape118"}, - {"/dev/st119", BRACK(FHDEV(DEV_TAPE_MAJOR, 119)), "\\Device\\Tape119"}, - {"/dev/st120", BRACK(FHDEV(DEV_TAPE_MAJOR, 120)), "\\Device\\Tape120"}, - {"/dev/st121", BRACK(FHDEV(DEV_TAPE_MAJOR, 121)), "\\Device\\Tape121"}, - {"/dev/st122", BRACK(FHDEV(DEV_TAPE_MAJOR, 122)), "\\Device\\Tape122"}, - {"/dev/st123", BRACK(FHDEV(DEV_TAPE_MAJOR, 123)), "\\Device\\Tape123"}, - {"/dev/st124", BRACK(FHDEV(DEV_TAPE_MAJOR, 124)), "\\Device\\Tape124"}, - {"/dev/st125", BRACK(FHDEV(DEV_TAPE_MAJOR, 125)), "\\Device\\Tape125"}, - {"/dev/st126", BRACK(FHDEV(DEV_TAPE_MAJOR, 126)), "\\Device\\Tape126"}, - {"/dev/st127", BRACK(FHDEV(DEV_TAPE_MAJOR, 127)), "\\Device\\Tape127"}, - {"/dev/tty", BRACK(FH_TTY), "\\dev\\tty"}, - {"/dev/tty0", BRACK(FHDEV(DEV_TTYS_MAJOR, 0)), "\\dev\\tty0"}, - {"/dev/tty1", BRACK(FHDEV(DEV_TTYS_MAJOR, 1)), "\\dev\\tty1"}, - {"/dev/tty2", BRACK(FHDEV(DEV_TTYS_MAJOR, 2)), "\\dev\\tty2"}, - {"/dev/tty3", BRACK(FHDEV(DEV_TTYS_MAJOR, 3)), "\\dev\\tty3"}, - {"/dev/tty4", BRACK(FHDEV(DEV_TTYS_MAJOR, 4)), "\\dev\\tty4"}, - {"/dev/tty5", BRACK(FHDEV(DEV_TTYS_MAJOR, 5)), "\\dev\\tty5"}, - {"/dev/tty6", BRACK(FHDEV(DEV_TTYS_MAJOR, 6)), "\\dev\\tty6"}, - {"/dev/tty7", BRACK(FHDEV(DEV_TTYS_MAJOR, 7)), "\\dev\\tty7"}, - {"/dev/tty8", BRACK(FHDEV(DEV_TTYS_MAJOR, 8)), "\\dev\\tty8"}, - {"/dev/tty9", BRACK(FHDEV(DEV_TTYS_MAJOR, 9)), "\\dev\\tty9"}, - {"/dev/tty10", BRACK(FHDEV(DEV_TTYS_MAJOR, 10)), "\\dev\\tty10"}, - {"/dev/tty11", BRACK(FHDEV(DEV_TTYS_MAJOR, 11)), "\\dev\\tty11"}, - {"/dev/tty12", BRACK(FHDEV(DEV_TTYS_MAJOR, 12)), "\\dev\\tty12"}, - {"/dev/tty13", BRACK(FHDEV(DEV_TTYS_MAJOR, 13)), "\\dev\\tty13"}, - {"/dev/tty14", BRACK(FHDEV(DEV_TTYS_MAJOR, 14)), "\\dev\\tty14"}, - {"/dev/tty15", BRACK(FHDEV(DEV_TTYS_MAJOR, 15)), "\\dev\\tty15"}, - {"/dev/tty16", BRACK(FHDEV(DEV_TTYS_MAJOR, 16)), "\\dev\\tty16"}, - {"/dev/tty17", BRACK(FHDEV(DEV_TTYS_MAJOR, 17)), "\\dev\\tty17"}, - {"/dev/tty18", BRACK(FHDEV(DEV_TTYS_MAJOR, 18)), "\\dev\\tty18"}, - {"/dev/tty19", BRACK(FHDEV(DEV_TTYS_MAJOR, 19)), "\\dev\\tty19"}, - {"/dev/tty20", BRACK(FHDEV(DEV_TTYS_MAJOR, 20)), "\\dev\\tty20"}, - {"/dev/tty21", BRACK(FHDEV(DEV_TTYS_MAJOR, 21)), "\\dev\\tty21"}, - {"/dev/tty22", BRACK(FHDEV(DEV_TTYS_MAJOR, 22)), "\\dev\\tty22"}, - {"/dev/tty23", BRACK(FHDEV(DEV_TTYS_MAJOR, 23)), "\\dev\\tty23"}, - {"/dev/tty24", BRACK(FHDEV(DEV_TTYS_MAJOR, 24)), "\\dev\\tty24"}, - {"/dev/tty25", BRACK(FHDEV(DEV_TTYS_MAJOR, 25)), "\\dev\\tty25"}, - {"/dev/tty26", BRACK(FHDEV(DEV_TTYS_MAJOR, 26)), "\\dev\\tty26"}, - {"/dev/tty27", BRACK(FHDEV(DEV_TTYS_MAJOR, 27)), "\\dev\\tty27"}, - {"/dev/tty28", BRACK(FHDEV(DEV_TTYS_MAJOR, 28)), "\\dev\\tty28"}, - {"/dev/tty29", BRACK(FHDEV(DEV_TTYS_MAJOR, 29)), "\\dev\\tty29"}, - {"/dev/tty30", BRACK(FHDEV(DEV_TTYS_MAJOR, 30)), "\\dev\\tty30"}, - {"/dev/tty31", BRACK(FHDEV(DEV_TTYS_MAJOR, 31)), "\\dev\\tty31"}, - {"/dev/tty32", BRACK(FHDEV(DEV_TTYS_MAJOR, 32)), "\\dev\\tty32"}, - {"/dev/tty33", BRACK(FHDEV(DEV_TTYS_MAJOR, 33)), "\\dev\\tty33"}, - {"/dev/tty34", BRACK(FHDEV(DEV_TTYS_MAJOR, 34)), "\\dev\\tty34"}, - {"/dev/tty35", BRACK(FHDEV(DEV_TTYS_MAJOR, 35)), "\\dev\\tty35"}, - {"/dev/tty36", BRACK(FHDEV(DEV_TTYS_MAJOR, 36)), "\\dev\\tty36"}, - {"/dev/tty37", BRACK(FHDEV(DEV_TTYS_MAJOR, 37)), "\\dev\\tty37"}, - {"/dev/tty38", BRACK(FHDEV(DEV_TTYS_MAJOR, 38)), "\\dev\\tty38"}, - {"/dev/tty39", BRACK(FHDEV(DEV_TTYS_MAJOR, 39)), "\\dev\\tty39"}, - {"/dev/tty40", BRACK(FHDEV(DEV_TTYS_MAJOR, 40)), "\\dev\\tty40"}, - {"/dev/tty41", BRACK(FHDEV(DEV_TTYS_MAJOR, 41)), "\\dev\\tty41"}, - {"/dev/tty42", BRACK(FHDEV(DEV_TTYS_MAJOR, 42)), "\\dev\\tty42"}, - {"/dev/tty43", BRACK(FHDEV(DEV_TTYS_MAJOR, 43)), "\\dev\\tty43"}, - {"/dev/tty44", BRACK(FHDEV(DEV_TTYS_MAJOR, 44)), "\\dev\\tty44"}, - {"/dev/tty45", BRACK(FHDEV(DEV_TTYS_MAJOR, 45)), "\\dev\\tty45"}, - {"/dev/tty46", BRACK(FHDEV(DEV_TTYS_MAJOR, 46)), "\\dev\\tty46"}, - {"/dev/tty47", BRACK(FHDEV(DEV_TTYS_MAJOR, 47)), "\\dev\\tty47"}, - {"/dev/tty48", BRACK(FHDEV(DEV_TTYS_MAJOR, 48)), "\\dev\\tty48"}, - {"/dev/tty49", BRACK(FHDEV(DEV_TTYS_MAJOR, 49)), "\\dev\\tty49"}, - {"/dev/tty50", BRACK(FHDEV(DEV_TTYS_MAJOR, 50)), "\\dev\\tty50"}, - {"/dev/tty51", BRACK(FHDEV(DEV_TTYS_MAJOR, 51)), "\\dev\\tty51"}, - {"/dev/tty52", BRACK(FHDEV(DEV_TTYS_MAJOR, 52)), "\\dev\\tty52"}, - {"/dev/tty53", BRACK(FHDEV(DEV_TTYS_MAJOR, 53)), "\\dev\\tty53"}, - {"/dev/tty54", BRACK(FHDEV(DEV_TTYS_MAJOR, 54)), "\\dev\\tty54"}, - {"/dev/tty55", BRACK(FHDEV(DEV_TTYS_MAJOR, 55)), "\\dev\\tty55"}, - {"/dev/tty56", BRACK(FHDEV(DEV_TTYS_MAJOR, 56)), "\\dev\\tty56"}, - {"/dev/tty57", BRACK(FHDEV(DEV_TTYS_MAJOR, 57)), "\\dev\\tty57"}, - {"/dev/tty58", BRACK(FHDEV(DEV_TTYS_MAJOR, 58)), "\\dev\\tty58"}, - {"/dev/tty59", BRACK(FHDEV(DEV_TTYS_MAJOR, 59)), "\\dev\\tty59"}, - {"/dev/tty60", BRACK(FHDEV(DEV_TTYS_MAJOR, 60)), "\\dev\\tty60"}, - {"/dev/tty61", BRACK(FHDEV(DEV_TTYS_MAJOR, 61)), "\\dev\\tty61"}, - {"/dev/tty62", BRACK(FHDEV(DEV_TTYS_MAJOR, 62)), "\\dev\\tty62"}, - {"/dev/tty63", BRACK(FHDEV(DEV_TTYS_MAJOR, 63)), "\\dev\\tty63"}, - {"/dev/ttyS0", BRACK(FHDEV(DEV_SERIAL_MAJOR, 1)), "\\\\.\\com1"}, - {"/dev/ttyS1", BRACK(FHDEV(DEV_SERIAL_MAJOR, 2)), "\\\\.\\com2"}, - {"/dev/ttyS2", BRACK(FHDEV(DEV_SERIAL_MAJOR, 3)), "\\\\.\\com3"}, - {"/dev/ttyS3", BRACK(FHDEV(DEV_SERIAL_MAJOR, 4)), "\\\\.\\com4"}, - {"/dev/ttyS4", BRACK(FHDEV(DEV_SERIAL_MAJOR, 5)), "\\\\.\\com5"}, - {"/dev/ttyS5", BRACK(FHDEV(DEV_SERIAL_MAJOR, 6)), "\\\\.\\com6"}, - {"/dev/ttyS6", BRACK(FHDEV(DEV_SERIAL_MAJOR, 7)), "\\\\.\\com7"}, - {"/dev/ttyS7", BRACK(FHDEV(DEV_SERIAL_MAJOR, 8)), "\\\\.\\com8"}, - {"/dev/ttyS8", BRACK(FHDEV(DEV_SERIAL_MAJOR, 9)), "\\\\.\\com9"}, - {"/dev/ttyS9", BRACK(FHDEV(DEV_SERIAL_MAJOR, 10)), "\\\\.\\com10"}, - {"/dev/ttyS10", BRACK(FHDEV(DEV_SERIAL_MAJOR, 11)), "\\\\.\\com11"}, - {"/dev/ttyS11", BRACK(FHDEV(DEV_SERIAL_MAJOR, 12)), "\\\\.\\com12"}, - {"/dev/ttyS12", BRACK(FHDEV(DEV_SERIAL_MAJOR, 13)), "\\\\.\\com13"}, - {"/dev/ttyS13", BRACK(FHDEV(DEV_SERIAL_MAJOR, 14)), "\\\\.\\com14"}, - {"/dev/ttyS14", BRACK(FHDEV(DEV_SERIAL_MAJOR, 15)), "\\\\.\\com15"}, - {"/dev/ttyS15", BRACK(FHDEV(DEV_SERIAL_MAJOR, 16)), "\\\\.\\com16"}, - {"/dev/ttym", BRACK(FH_TTYM), "\\dev\\ttym"}, - {"/dev/urandom", BRACK(FH_URANDOM), "\\dev\\urandom"}, - {"/dev/windows", BRACK(FH_WINDOWS), "\\dev\\windows"}, - {"/dev/zero", BRACK(FH_ZERO), "\\dev\\zero"} -}; - -const device *console_dev = dev_storage + 20; -const device *ttym_dev = dev_storage + 833; -const device *ttys_dev = dev_storage + 753; -const device *urandom_dev = dev_storage + 834; - - -static KR_device_t KR_find_keyword (const char *KR_keyword, int KR_length) -{ - - switch (KR_length) - { - case 4: - if (strncmp (KR_keyword, "/dev", 4) == 0) - { -{ -return dev_storage + 0; - -} - } - else - { -{ -return NULL; - -} - } - case 8: - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz", 8) == 0) - { -{ -return dev_storage + 217; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty", 8) == 0) - { -{ -return dev_storage + 752; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy", 8) == 0) - { -{ -return dev_storage + 216; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx", 8) == 0) - { -{ -return dev_storage + 215; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw", 8) == 0) - { -{ -return dev_storage + 214; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv", 8) == 0) - { -{ -return dev_storage + 213; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu", 8) == 0) - { -{ -return dev_storage + 212; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - if (strncmp (KR_keyword, "/dev/sdt", 8) == 0) - { -{ -return dev_storage + 211; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds", 8) == 0) - { -{ -return dev_storage + 210; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr", 8) == 0) - { -{ -return dev_storage + 209; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq", 8) == 0) - { -{ -return dev_storage + 208; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdp", 8) == 0) - { -{ -return dev_storage + 207; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/dsp", 8) == 0) - { -{ -return dev_storage + 21; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo", 8) == 0) - { -{ -return dev_storage + 206; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn", 8) == 0) - { -{ -return dev_storage + 205; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm", 8) == 0) - { -{ -return dev_storage + 204; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - if (strncmp (KR_keyword, "/dev/mem", 8) == 0) - { -{ -return dev_storage + 42; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl", 8) == 0) - { -{ -return dev_storage + 203; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk", 8) == 0) - { -{ -return dev_storage + 202; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj", 8) == 0) - { -{ -return dev_storage + 201; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi", 8) == 0) - { -{ -return dev_storage + 200; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh", 8) == 0) - { -{ -return dev_storage + 199; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg", 8) == 0) - { -{ -return dev_storage + 198; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf", 8) == 0) - { -{ -return dev_storage + 197; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde", 8) == 0) - { -{ -return dev_storage + 196; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/sdd", 8) == 0) - { -{ -return dev_storage + 195; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc", 8) == 0) - { -{ -return dev_storage + 194; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb", 8) == 0) - { -{ -return dev_storage + 193; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda", 8) == 0) - { -{ -return dev_storage + 192; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st9", 8) == 0) - { -{ -return dev_storage + 633; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr9", 8) == 0) - { -{ -return dev_storage + 617; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd9", 8) == 0) - { -{ -return dev_storage + 31; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '8': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st8", 8) == 0) - { -{ -return dev_storage + 632; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr8", 8) == 0) - { -{ -return dev_storage + 616; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd8", 8) == 0) - { -{ -return dev_storage + 30; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '7': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st7", 8) == 0) - { -{ -return dev_storage + 631; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr7", 8) == 0) - { -{ -return dev_storage + 615; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd7", 8) == 0) - { -{ -return dev_storage + 29; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '6': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st6", 8) == 0) - { -{ -return dev_storage + 630; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr6", 8) == 0) - { -{ -return dev_storage + 614; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd6", 8) == 0) - { -{ -return dev_storage + 28; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '5': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st5", 8) == 0) - { -{ -return dev_storage + 629; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr5", 8) == 0) - { -{ -return dev_storage + 613; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd5", 8) == 0) - { -{ -return dev_storage + 27; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '4': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st4", 8) == 0) - { -{ -return dev_storage + 628; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr4", 8) == 0) - { -{ -return dev_storage + 612; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd4", 8) == 0) - { -{ -return dev_storage + 26; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '3': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st3", 8) == 0) - { -{ -return dev_storage + 627; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr3", 8) == 0) - { -{ -return dev_storage + 611; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd3", 8) == 0) - { -{ -return dev_storage + 25; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '2': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st2", 8) == 0) - { -{ -return dev_storage + 626; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr2", 8) == 0) - { -{ -return dev_storage + 610; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd2", 8) == 0) - { -{ -return dev_storage + 24; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st1", 8) == 0) - { -{ -return dev_storage + 625; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr1", 8) == 0) - { -{ -return dev_storage + 609; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd1", 8) == 0) - { -{ -return dev_storage + 23; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '0': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st0", 8) == 0) - { -{ -return dev_storage + 624; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr0", 8) == 0) - { -{ -return dev_storage + 608; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd0", 8) == 0) - { -{ -return dev_storage + 22; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 9: - switch (KR_keyword [8]) - { - case 'x': - if (strncmp (KR_keyword, "/dev/ptmx", 9) == 0) - { -{ -return dev_storage + 174; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - if (strncmp (KR_keyword, "/dev/port", 9) == 0) - { -{ -return dev_storage + 173; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - switch (KR_keyword [5]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/zero", 9) == 0) - { -{ -return dev_storage + 836; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/fifo", 9) == 0) - { -{ -return dev_storage + 38; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/ttym", 9) == 0) - { -{ -return dev_storage + 833; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/kmem", 9) == 0) - { -{ -return dev_storage + 40; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - switch (KR_keyword [5]) - { - case 'n': - if (strncmp (KR_keyword, "/dev/null", 9) == 0) - { -{ -return dev_storage + 171; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/full", 9) == 0) - { -{ -return dev_storage + 39; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/kmsg", 9) == 0) - { -{ -return dev_storage + 41; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/pipe", 9) == 0) - { -{ -return dev_storage + 172; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz9", 9) == 0) - { -{ -return dev_storage + 601; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty9", 9) == 0) - { -{ -return dev_storage + 762; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy9", 9) == 0) - { -{ -return dev_storage + 586; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx9", 9) == 0) - { -{ -return dev_storage + 571; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw9", 9) == 0) - { -{ -return dev_storage + 556; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv9", 9) == 0) - { -{ -return dev_storage + 541; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu9", 9) == 0) - { -{ -return dev_storage + 526; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt9", 9) == 0) - { -{ -return dev_storage + 511; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst9", 9) == 0) - { -{ -return dev_storage + 52; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds9", 9) == 0) - { -{ -return dev_storage + 496; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr9", 9) == 0) - { -{ -return dev_storage + 481; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq9", 9) == 0) - { -{ -return dev_storage + 466; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp9", 9) == 0) - { -{ -return dev_storage + 451; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo9", 9) == 0) - { -{ -return dev_storage + 436; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn9", 9) == 0) - { -{ -return dev_storage + 421; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm9", 9) == 0) - { -{ -return dev_storage + 406; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com9", 9) == 0) - { -{ -return dev_storage + 10; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl9", 9) == 0) - { -{ -return dev_storage + 391; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk9", 9) == 0) - { -{ -return dev_storage + 376; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj9", 9) == 0) - { -{ -return dev_storage + 361; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi9", 9) == 0) - { -{ -return dev_storage + 346; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh9", 9) == 0) - { -{ -return dev_storage + 331; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg9", 9) == 0) - { -{ -return dev_storage + 316; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf9", 9) == 0) - { -{ -return dev_storage + 301; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde9", 9) == 0) - { -{ -return dev_storage + 286; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd9", 9) == 0) - { -{ -return dev_storage + 271; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd9", 9) == 0) - { -{ -return dev_storage + 185; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc9", 9) == 0) - { -{ -return dev_storage + 256; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb9", 9) == 0) - { -{ -return dev_storage + 241; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda9", 9) == 0) - { -{ -return dev_storage + 226; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/st99", 9) == 0) - { -{ -return dev_storage + 723; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/st89", 9) == 0) - { -{ -return dev_storage + 713; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/st79", 9) == 0) - { -{ -return dev_storage + 703; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/st69", 9) == 0) - { -{ -return dev_storage + 693; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/st59", 9) == 0) - { -{ -return dev_storage + 683; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/st49", 9) == 0) - { -{ -return dev_storage + 673; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/st39", 9) == 0) - { -{ -return dev_storage + 663; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/st29", 9) == 0) - { -{ -return dev_storage + 653; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - if (strncmp (KR_keyword, "/dev/st19", 9) == 0) - { -{ -return dev_storage + 643; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '8': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz8", 9) == 0) - { -{ -return dev_storage + 600; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty8", 9) == 0) - { -{ -return dev_storage + 761; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy8", 9) == 0) - { -{ -return dev_storage + 585; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx8", 9) == 0) - { -{ -return dev_storage + 570; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw8", 9) == 0) - { -{ -return dev_storage + 555; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv8", 9) == 0) - { -{ -return dev_storage + 540; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu8", 9) == 0) - { -{ -return dev_storage + 525; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt8", 9) == 0) - { -{ -return dev_storage + 510; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst8", 9) == 0) - { -{ -return dev_storage + 51; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds8", 9) == 0) - { -{ -return dev_storage + 495; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr8", 9) == 0) - { -{ -return dev_storage + 480; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq8", 9) == 0) - { -{ -return dev_storage + 465; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp8", 9) == 0) - { -{ -return dev_storage + 450; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo8", 9) == 0) - { -{ -return dev_storage + 435; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn8", 9) == 0) - { -{ -return dev_storage + 420; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm8", 9) == 0) - { -{ -return dev_storage + 405; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com8", 9) == 0) - { -{ -return dev_storage + 9; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl8", 9) == 0) - { -{ -return dev_storage + 390; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk8", 9) == 0) - { -{ -return dev_storage + 375; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj8", 9) == 0) - { -{ -return dev_storage + 360; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi8", 9) == 0) - { -{ -return dev_storage + 345; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh8", 9) == 0) - { -{ -return dev_storage + 330; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg8", 9) == 0) - { -{ -return dev_storage + 315; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf8", 9) == 0) - { -{ -return dev_storage + 300; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde8", 9) == 0) - { -{ -return dev_storage + 285; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd8", 9) == 0) - { -{ -return dev_storage + 270; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd8", 9) == 0) - { -{ -return dev_storage + 184; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc8", 9) == 0) - { -{ -return dev_storage + 255; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb8", 9) == 0) - { -{ -return dev_storage + 240; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda8", 9) == 0) - { -{ -return dev_storage + 225; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/st98", 9) == 0) - { -{ -return dev_storage + 722; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/st88", 9) == 0) - { -{ -return dev_storage + 712; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/st78", 9) == 0) - { -{ -return dev_storage + 702; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/st68", 9) == 0) - { -{ -return dev_storage + 692; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/st58", 9) == 0) - { -{ -return dev_storage + 682; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/st48", 9) == 0) - { -{ -return dev_storage + 672; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/st38", 9) == 0) - { -{ -return dev_storage + 662; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/st28", 9) == 0) - { -{ -return dev_storage + 652; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - if (strncmp (KR_keyword, "/dev/st18", 9) == 0) - { -{ -return dev_storage + 642; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '7': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz7", 9) == 0) - { -{ -return dev_storage + 599; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty7", 9) == 0) - { -{ -return dev_storage + 760; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy7", 9) == 0) - { -{ -return dev_storage + 584; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx7", 9) == 0) - { -{ -return dev_storage + 569; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw7", 9) == 0) - { -{ -return dev_storage + 554; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv7", 9) == 0) - { -{ -return dev_storage + 539; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu7", 9) == 0) - { -{ -return dev_storage + 524; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt7", 9) == 0) - { -{ -return dev_storage + 509; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst7", 9) == 0) - { -{ -return dev_storage + 50; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds7", 9) == 0) - { -{ -return dev_storage + 494; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr7", 9) == 0) - { -{ -return dev_storage + 479; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq7", 9) == 0) - { -{ -return dev_storage + 464; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp7", 9) == 0) - { -{ -return dev_storage + 449; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo7", 9) == 0) - { -{ -return dev_storage + 434; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn7", 9) == 0) - { -{ -return dev_storage + 419; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm7", 9) == 0) - { -{ -return dev_storage + 404; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com7", 9) == 0) - { -{ -return dev_storage + 8; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl7", 9) == 0) - { -{ -return dev_storage + 389; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk7", 9) == 0) - { -{ -return dev_storage + 374; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj7", 9) == 0) - { -{ -return dev_storage + 359; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi7", 9) == 0) - { -{ -return dev_storage + 344; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh7", 9) == 0) - { -{ -return dev_storage + 329; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg7", 9) == 0) - { -{ -return dev_storage + 314; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf7", 9) == 0) - { -{ -return dev_storage + 299; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde7", 9) == 0) - { -{ -return dev_storage + 284; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd7", 9) == 0) - { -{ -return dev_storage + 269; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd7", 9) == 0) - { -{ -return dev_storage + 183; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc7", 9) == 0) - { -{ -return dev_storage + 254; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb7", 9) == 0) - { -{ -return dev_storage + 239; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda7", 9) == 0) - { -{ -return dev_storage + 224; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/st97", 9) == 0) - { -{ -return dev_storage + 721; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/st87", 9) == 0) - { -{ -return dev_storage + 711; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/st77", 9) == 0) - { -{ -return dev_storage + 701; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/st67", 9) == 0) - { -{ -return dev_storage + 691; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/st57", 9) == 0) - { -{ -return dev_storage + 681; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/st47", 9) == 0) - { -{ -return dev_storage + 671; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/st37", 9) == 0) - { -{ -return dev_storage + 661; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/st27", 9) == 0) - { -{ -return dev_storage + 651; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - if (strncmp (KR_keyword, "/dev/st17", 9) == 0) - { -{ -return dev_storage + 641; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '6': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz6", 9) == 0) - { -{ -return dev_storage + 598; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty6", 9) == 0) - { -{ -return dev_storage + 759; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy6", 9) == 0) - { -{ -return dev_storage + 583; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx6", 9) == 0) - { -{ -return dev_storage + 568; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw6", 9) == 0) - { -{ -return dev_storage + 553; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv6", 9) == 0) - { -{ -return dev_storage + 538; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu6", 9) == 0) - { -{ -return dev_storage + 523; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt6", 9) == 0) - { -{ -return dev_storage + 508; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst6", 9) == 0) - { -{ -return dev_storage + 49; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds6", 9) == 0) - { -{ -return dev_storage + 493; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr6", 9) == 0) - { -{ -return dev_storage + 478; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq6", 9) == 0) - { -{ -return dev_storage + 463; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp6", 9) == 0) - { -{ -return dev_storage + 448; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo6", 9) == 0) - { -{ -return dev_storage + 433; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn6", 9) == 0) - { -{ -return dev_storage + 418; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm6", 9) == 0) - { -{ -return dev_storage + 403; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com6", 9) == 0) - { -{ -return dev_storage + 7; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl6", 9) == 0) - { -{ -return dev_storage + 388; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk6", 9) == 0) - { -{ -return dev_storage + 373; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj6", 9) == 0) - { -{ -return dev_storage + 358; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi6", 9) == 0) - { -{ -return dev_storage + 343; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh6", 9) == 0) - { -{ -return dev_storage + 328; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg6", 9) == 0) - { -{ -return dev_storage + 313; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf6", 9) == 0) - { -{ -return dev_storage + 298; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde6", 9) == 0) - { -{ -return dev_storage + 283; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd6", 9) == 0) - { -{ -return dev_storage + 268; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd6", 9) == 0) - { -{ -return dev_storage + 182; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc6", 9) == 0) - { -{ -return dev_storage + 253; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb6", 9) == 0) - { -{ -return dev_storage + 238; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda6", 9) == 0) - { -{ -return dev_storage + 223; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/st96", 9) == 0) - { -{ -return dev_storage + 720; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/st86", 9) == 0) - { -{ -return dev_storage + 710; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/st76", 9) == 0) - { -{ -return dev_storage + 700; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/st66", 9) == 0) - { -{ -return dev_storage + 690; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/st56", 9) == 0) - { -{ -return dev_storage + 680; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/st46", 9) == 0) - { -{ -return dev_storage + 670; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/st36", 9) == 0) - { -{ -return dev_storage + 660; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/st26", 9) == 0) - { -{ -return dev_storage + 650; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - if (strncmp (KR_keyword, "/dev/st16", 9) == 0) - { -{ -return dev_storage + 640; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '5': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz5", 9) == 0) - { -{ -return dev_storage + 597; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty5", 9) == 0) - { -{ -return dev_storage + 758; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy5", 9) == 0) - { -{ -return dev_storage + 582; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx5", 9) == 0) - { -{ -return dev_storage + 567; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw5", 9) == 0) - { -{ -return dev_storage + 552; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv5", 9) == 0) - { -{ -return dev_storage + 537; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu5", 9) == 0) - { -{ -return dev_storage + 522; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt5", 9) == 0) - { -{ -return dev_storage + 507; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst5", 9) == 0) - { -{ -return dev_storage + 48; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds5", 9) == 0) - { -{ -return dev_storage + 492; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr5", 9) == 0) - { -{ -return dev_storage + 477; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq5", 9) == 0) - { -{ -return dev_storage + 462; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp5", 9) == 0) - { -{ -return dev_storage + 447; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo5", 9) == 0) - { -{ -return dev_storage + 432; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn5", 9) == 0) - { -{ -return dev_storage + 417; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm5", 9) == 0) - { -{ -return dev_storage + 402; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com5", 9) == 0) - { -{ -return dev_storage + 6; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl5", 9) == 0) - { -{ -return dev_storage + 387; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk5", 9) == 0) - { -{ -return dev_storage + 372; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj5", 9) == 0) - { -{ -return dev_storage + 357; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi5", 9) == 0) - { -{ -return dev_storage + 342; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh5", 9) == 0) - { -{ -return dev_storage + 327; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg5", 9) == 0) - { -{ -return dev_storage + 312; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf5", 9) == 0) - { -{ -return dev_storage + 297; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde5", 9) == 0) - { -{ -return dev_storage + 282; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd5", 9) == 0) - { -{ -return dev_storage + 267; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd5", 9) == 0) - { -{ -return dev_storage + 181; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc5", 9) == 0) - { -{ -return dev_storage + 252; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb5", 9) == 0) - { -{ -return dev_storage + 237; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda5", 9) == 0) - { -{ -return dev_storage + 222; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/st95", 9) == 0) - { -{ -return dev_storage + 719; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/st85", 9) == 0) - { -{ -return dev_storage + 709; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/st75", 9) == 0) - { -{ -return dev_storage + 699; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/st65", 9) == 0) - { -{ -return dev_storage + 689; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/st55", 9) == 0) - { -{ -return dev_storage + 679; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/st45", 9) == 0) - { -{ -return dev_storage + 669; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/st35", 9) == 0) - { -{ -return dev_storage + 659; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/st25", 9) == 0) - { -{ -return dev_storage + 649; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st15", 9) == 0) - { -{ -return dev_storage + 639; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr15", 9) == 0) - { -{ -return dev_storage + 623; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd15", 9) == 0) - { -{ -return dev_storage + 37; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '4': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz4", 9) == 0) - { -{ -return dev_storage + 596; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty4", 9) == 0) - { -{ -return dev_storage + 757; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy4", 9) == 0) - { -{ -return dev_storage + 581; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx4", 9) == 0) - { -{ -return dev_storage + 566; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw4", 9) == 0) - { -{ -return dev_storage + 551; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv4", 9) == 0) - { -{ -return dev_storage + 536; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu4", 9) == 0) - { -{ -return dev_storage + 521; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt4", 9) == 0) - { -{ -return dev_storage + 506; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst4", 9) == 0) - { -{ -return dev_storage + 47; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds4", 9) == 0) - { -{ -return dev_storage + 491; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr4", 9) == 0) - { -{ -return dev_storage + 476; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq4", 9) == 0) - { -{ -return dev_storage + 461; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp4", 9) == 0) - { -{ -return dev_storage + 446; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo4", 9) == 0) - { -{ -return dev_storage + 431; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn4", 9) == 0) - { -{ -return dev_storage + 416; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm4", 9) == 0) - { -{ -return dev_storage + 401; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com4", 9) == 0) - { -{ -return dev_storage + 5; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl4", 9) == 0) - { -{ -return dev_storage + 386; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk4", 9) == 0) - { -{ -return dev_storage + 371; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj4", 9) == 0) - { -{ -return dev_storage + 356; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi4", 9) == 0) - { -{ -return dev_storage + 341; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh4", 9) == 0) - { -{ -return dev_storage + 326; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg4", 9) == 0) - { -{ -return dev_storage + 311; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf4", 9) == 0) - { -{ -return dev_storage + 296; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde4", 9) == 0) - { -{ -return dev_storage + 281; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd4", 9) == 0) - { -{ -return dev_storage + 266; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd4", 9) == 0) - { -{ -return dev_storage + 180; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc4", 9) == 0) - { -{ -return dev_storage + 251; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb4", 9) == 0) - { -{ -return dev_storage + 236; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda4", 9) == 0) - { -{ -return dev_storage + 221; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/st94", 9) == 0) - { -{ -return dev_storage + 718; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/st84", 9) == 0) - { -{ -return dev_storage + 708; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/st74", 9) == 0) - { -{ -return dev_storage + 698; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/st64", 9) == 0) - { -{ -return dev_storage + 688; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/st54", 9) == 0) - { -{ -return dev_storage + 678; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/st44", 9) == 0) - { -{ -return dev_storage + 668; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/st34", 9) == 0) - { -{ -return dev_storage + 658; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/st24", 9) == 0) - { -{ -return dev_storage + 648; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st14", 9) == 0) - { -{ -return dev_storage + 638; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr14", 9) == 0) - { -{ -return dev_storage + 622; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd14", 9) == 0) - { -{ -return dev_storage + 36; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '3': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz3", 9) == 0) - { -{ -return dev_storage + 595; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty3", 9) == 0) - { -{ -return dev_storage + 756; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy3", 9) == 0) - { -{ -return dev_storage + 580; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx3", 9) == 0) - { -{ -return dev_storage + 565; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw3", 9) == 0) - { -{ -return dev_storage + 550; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv3", 9) == 0) - { -{ -return dev_storage + 535; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu3", 9) == 0) - { -{ -return dev_storage + 520; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt3", 9) == 0) - { -{ -return dev_storage + 505; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst3", 9) == 0) - { -{ -return dev_storage + 46; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds3", 9) == 0) - { -{ -return dev_storage + 490; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr3", 9) == 0) - { -{ -return dev_storage + 475; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq3", 9) == 0) - { -{ -return dev_storage + 460; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp3", 9) == 0) - { -{ -return dev_storage + 445; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo3", 9) == 0) - { -{ -return dev_storage + 430; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn3", 9) == 0) - { -{ -return dev_storage + 415; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm3", 9) == 0) - { -{ -return dev_storage + 400; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com3", 9) == 0) - { -{ -return dev_storage + 4; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl3", 9) == 0) - { -{ -return dev_storage + 385; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk3", 9) == 0) - { -{ -return dev_storage + 370; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj3", 9) == 0) - { -{ -return dev_storage + 355; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi3", 9) == 0) - { -{ -return dev_storage + 340; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh3", 9) == 0) - { -{ -return dev_storage + 325; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg3", 9) == 0) - { -{ -return dev_storage + 310; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf3", 9) == 0) - { -{ -return dev_storage + 295; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde3", 9) == 0) - { -{ -return dev_storage + 280; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd3", 9) == 0) - { -{ -return dev_storage + 265; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd3", 9) == 0) - { -{ -return dev_storage + 179; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc3", 9) == 0) - { -{ -return dev_storage + 250; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb3", 9) == 0) - { -{ -return dev_storage + 235; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda3", 9) == 0) - { -{ -return dev_storage + 220; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/st93", 9) == 0) - { -{ -return dev_storage + 717; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/st83", 9) == 0) - { -{ -return dev_storage + 707; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/st73", 9) == 0) - { -{ -return dev_storage + 697; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/st63", 9) == 0) - { -{ -return dev_storage + 687; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/st53", 9) == 0) - { -{ -return dev_storage + 677; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/st43", 9) == 0) - { -{ -return dev_storage + 667; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/st33", 9) == 0) - { -{ -return dev_storage + 657; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/st23", 9) == 0) - { -{ -return dev_storage + 647; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st13", 9) == 0) - { -{ -return dev_storage + 637; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr13", 9) == 0) - { -{ -return dev_storage + 621; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd13", 9) == 0) - { -{ -return dev_storage + 35; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '2': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz2", 9) == 0) - { -{ -return dev_storage + 594; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty2", 9) == 0) - { -{ -return dev_storage + 755; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy2", 9) == 0) - { -{ -return dev_storage + 579; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx2", 9) == 0) - { -{ -return dev_storage + 564; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw2", 9) == 0) - { -{ -return dev_storage + 549; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv2", 9) == 0) - { -{ -return dev_storage + 534; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu2", 9) == 0) - { -{ -return dev_storage + 519; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt2", 9) == 0) - { -{ -return dev_storage + 504; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst2", 9) == 0) - { -{ -return dev_storage + 45; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds2", 9) == 0) - { -{ -return dev_storage + 489; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr2", 9) == 0) - { -{ -return dev_storage + 474; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq2", 9) == 0) - { -{ -return dev_storage + 459; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp2", 9) == 0) - { -{ -return dev_storage + 444; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo2", 9) == 0) - { -{ -return dev_storage + 429; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn2", 9) == 0) - { -{ -return dev_storage + 414; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm2", 9) == 0) - { -{ -return dev_storage + 399; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com2", 9) == 0) - { -{ -return dev_storage + 3; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl2", 9) == 0) - { -{ -return dev_storage + 384; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk2", 9) == 0) - { -{ -return dev_storage + 369; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj2", 9) == 0) - { -{ -return dev_storage + 354; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi2", 9) == 0) - { -{ -return dev_storage + 339; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh2", 9) == 0) - { -{ -return dev_storage + 324; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg2", 9) == 0) - { -{ -return dev_storage + 309; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf2", 9) == 0) - { -{ -return dev_storage + 294; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde2", 9) == 0) - { -{ -return dev_storage + 279; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd2", 9) == 0) - { -{ -return dev_storage + 264; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd2", 9) == 0) - { -{ -return dev_storage + 178; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc2", 9) == 0) - { -{ -return dev_storage + 249; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb2", 9) == 0) - { -{ -return dev_storage + 234; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda2", 9) == 0) - { -{ -return dev_storage + 219; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/st92", 9) == 0) - { -{ -return dev_storage + 716; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/st82", 9) == 0) - { -{ -return dev_storage + 706; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/st72", 9) == 0) - { -{ -return dev_storage + 696; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/st62", 9) == 0) - { -{ -return dev_storage + 686; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/st52", 9) == 0) - { -{ -return dev_storage + 676; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/st42", 9) == 0) - { -{ -return dev_storage + 666; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/st32", 9) == 0) - { -{ -return dev_storage + 656; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/st22", 9) == 0) - { -{ -return dev_storage + 646; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st12", 9) == 0) - { -{ -return dev_storage + 636; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr12", 9) == 0) - { -{ -return dev_storage + 620; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd12", 9) == 0) - { -{ -return dev_storage + 34; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz1", 9) == 0) - { -{ -return dev_storage + 593; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty1", 9) == 0) - { -{ -return dev_storage + 754; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy1", 9) == 0) - { -{ -return dev_storage + 578; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx1", 9) == 0) - { -{ -return dev_storage + 563; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw1", 9) == 0) - { -{ -return dev_storage + 548; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv1", 9) == 0) - { -{ -return dev_storage + 533; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu1", 9) == 0) - { -{ -return dev_storage + 518; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt1", 9) == 0) - { -{ -return dev_storage + 503; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst1", 9) == 0) - { -{ -return dev_storage + 44; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds1", 9) == 0) - { -{ -return dev_storage + 488; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr1", 9) == 0) - { -{ -return dev_storage + 473; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq1", 9) == 0) - { -{ -return dev_storage + 458; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp1", 9) == 0) - { -{ -return dev_storage + 443; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo1", 9) == 0) - { -{ -return dev_storage + 428; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn1", 9) == 0) - { -{ -return dev_storage + 413; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm1", 9) == 0) - { -{ -return dev_storage + 398; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com1", 9) == 0) - { -{ -return dev_storage + 2; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl1", 9) == 0) - { -{ -return dev_storage + 383; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk1", 9) == 0) - { -{ -return dev_storage + 368; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj1", 9) == 0) - { -{ -return dev_storage + 353; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi1", 9) == 0) - { -{ -return dev_storage + 338; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh1", 9) == 0) - { -{ -return dev_storage + 323; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg1", 9) == 0) - { -{ -return dev_storage + 308; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf1", 9) == 0) - { -{ -return dev_storage + 293; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde1", 9) == 0) - { -{ -return dev_storage + 278; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd1", 9) == 0) - { -{ -return dev_storage + 263; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd1", 9) == 0) - { -{ -return dev_storage + 177; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc1", 9) == 0) - { -{ -return dev_storage + 248; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb1", 9) == 0) - { -{ -return dev_storage + 233; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda1", 9) == 0) - { -{ -return dev_storage + 218; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/st91", 9) == 0) - { -{ -return dev_storage + 715; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/st81", 9) == 0) - { -{ -return dev_storage + 705; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/st71", 9) == 0) - { -{ -return dev_storage + 695; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/st61", 9) == 0) - { -{ -return dev_storage + 685; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/st51", 9) == 0) - { -{ -return dev_storage + 675; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/st41", 9) == 0) - { -{ -return dev_storage + 665; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/st31", 9) == 0) - { -{ -return dev_storage + 655; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/st21", 9) == 0) - { -{ -return dev_storage + 645; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st11", 9) == 0) - { -{ -return dev_storage + 635; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr11", 9) == 0) - { -{ -return dev_storage + 619; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd11", 9) == 0) - { -{ -return dev_storage + 33; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '0': - switch (KR_keyword [7]) - { - case 'y': - if (strncmp (KR_keyword, "/dev/tty0", 9) == 0) - { -{ -return dev_storage + 753; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - if (strncmp (KR_keyword, "/dev/nst0", 9) == 0) - { -{ -return dev_storage + 43; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/scd0", 9) == 0) - { -{ -return dev_storage + 176; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/st90", 9) == 0) - { -{ -return dev_storage + 714; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/st80", 9) == 0) - { -{ -return dev_storage + 704; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/st70", 9) == 0) - { -{ -return dev_storage + 694; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/st60", 9) == 0) - { -{ -return dev_storage + 684; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/st50", 9) == 0) - { -{ -return dev_storage + 674; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/st40", 9) == 0) - { -{ -return dev_storage + 664; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/st30", 9) == 0) - { -{ -return dev_storage + 654; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/st20", 9) == 0) - { -{ -return dev_storage + 644; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [6]) - { - case 't': - if (strncmp (KR_keyword, "/dev/st10", 9) == 0) - { -{ -return dev_storage + 634; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sr10", 9) == 0) - { -{ -return dev_storage + 618; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - if (strncmp (KR_keyword, "/dev/fd10", 9) == 0) - { -{ -return dev_storage + 32; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 10: - switch (KR_keyword [9]) - { - case 'n': - if (strncmp (KR_keyword, "/dev/conin", 10) == 0) - { -{ -return dev_storage + 18; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - switch (KR_keyword [8]) - { - case 'S': - if (strncmp (KR_keyword, "/dev/ttyS9", 10) == 0) - { -{ -return dev_storage + 826; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/nst99", 10) == 0) - { -{ -return dev_storage + 142; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/nst89", 10) == 0) - { -{ -return dev_storage + 132; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/nst79", 10) == 0) - { -{ -return dev_storage + 122; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/nst69", 10) == 0) - { -{ -return dev_storage + 112; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty59", 10) == 0) - { -{ -return dev_storage + 812; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst59", 10) == 0) - { -{ -return dev_storage + 102; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '4': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty49", 10) == 0) - { -{ -return dev_storage + 802; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst49", 10) == 0) - { -{ -return dev_storage + 92; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '3': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty39", 10) == 0) - { -{ -return dev_storage + 792; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst39", 10) == 0) - { -{ -return dev_storage + 82; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '2': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty29", 10) == 0) - { -{ -return dev_storage + 782; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst29", 10) == 0) - { -{ -return dev_storage + 72; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty19", 10) == 0) - { -{ -return dev_storage + 772; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/st119", 10) == 0) - { -{ -return dev_storage + 743; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst19", 10) == 0) - { -{ -return dev_storage + 62; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '0': - if (strncmp (KR_keyword, "/dev/st109", 10) == 0) - { -{ -return dev_storage + 733; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '8': - switch (KR_keyword [8]) - { - case 'S': - if (strncmp (KR_keyword, "/dev/ttyS8", 10) == 0) - { -{ -return dev_storage + 825; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/nst98", 10) == 0) - { -{ -return dev_storage + 141; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/nst88", 10) == 0) - { -{ -return dev_storage + 131; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/nst78", 10) == 0) - { -{ -return dev_storage + 121; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/nst68", 10) == 0) - { -{ -return dev_storage + 111; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty58", 10) == 0) - { -{ -return dev_storage + 811; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst58", 10) == 0) - { -{ -return dev_storage + 101; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '4': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty48", 10) == 0) - { -{ -return dev_storage + 801; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst48", 10) == 0) - { -{ -return dev_storage + 91; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '3': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty38", 10) == 0) - { -{ -return dev_storage + 791; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst38", 10) == 0) - { -{ -return dev_storage + 81; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '2': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty28", 10) == 0) - { -{ -return dev_storage + 781; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst28", 10) == 0) - { -{ -return dev_storage + 71; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty18", 10) == 0) - { -{ -return dev_storage + 771; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/st118", 10) == 0) - { -{ -return dev_storage + 742; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst18", 10) == 0) - { -{ -return dev_storage + 61; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '0': - if (strncmp (KR_keyword, "/dev/st108", 10) == 0) - { -{ -return dev_storage + 732; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '7': - switch (KR_keyword [8]) - { - case 'S': - if (strncmp (KR_keyword, "/dev/ttyS7", 10) == 0) - { -{ -return dev_storage + 824; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/nst97", 10) == 0) - { -{ -return dev_storage + 140; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/nst87", 10) == 0) - { -{ -return dev_storage + 130; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/nst77", 10) == 0) - { -{ -return dev_storage + 120; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/nst67", 10) == 0) - { -{ -return dev_storage + 110; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty57", 10) == 0) - { -{ -return dev_storage + 810; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst57", 10) == 0) - { -{ -return dev_storage + 100; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '4': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty47", 10) == 0) - { -{ -return dev_storage + 800; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst47", 10) == 0) - { -{ -return dev_storage + 90; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '3': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty37", 10) == 0) - { -{ -return dev_storage + 790; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst37", 10) == 0) - { -{ -return dev_storage + 80; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '2': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty27", 10) == 0) - { -{ -return dev_storage + 780; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/st127", 10) == 0) - { -{ -return dev_storage + 751; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst27", 10) == 0) - { -{ -return dev_storage + 70; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty17", 10) == 0) - { -{ -return dev_storage + 770; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/st117", 10) == 0) - { -{ -return dev_storage + 741; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst17", 10) == 0) - { -{ -return dev_storage + 60; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '0': - if (strncmp (KR_keyword, "/dev/st107", 10) == 0) - { -{ -return dev_storage + 731; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '6': - switch (KR_keyword [8]) - { - case 'S': - if (strncmp (KR_keyword, "/dev/ttyS6", 10) == 0) - { -{ -return dev_storage + 823; - -} - } - else - { -{ -return NULL; - -} - } - case '9': - if (strncmp (KR_keyword, "/dev/nst96", 10) == 0) - { -{ -return dev_storage + 139; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/nst86", 10) == 0) - { -{ -return dev_storage + 129; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/nst76", 10) == 0) - { -{ -return dev_storage + 119; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/nst66", 10) == 0) - { -{ -return dev_storage + 109; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty56", 10) == 0) - { -{ -return dev_storage + 809; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst56", 10) == 0) - { -{ -return dev_storage + 99; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '4': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty46", 10) == 0) - { -{ -return dev_storage + 799; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst46", 10) == 0) - { -{ -return dev_storage + 89; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '3': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty36", 10) == 0) - { -{ -return dev_storage + 789; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst36", 10) == 0) - { -{ -return dev_storage + 79; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '2': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty26", 10) == 0) - { -{ -return dev_storage + 779; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/st126", 10) == 0) - { -{ -return dev_storage + 750; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst26", 10) == 0) - { -{ -return dev_storage + 69; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty16", 10) == 0) - { -{ -return dev_storage + 769; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/st116", 10) == 0) - { -{ -return dev_storage + 740; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst16", 10) == 0) - { -{ -return dev_storage + 59; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com16", 10) == 0) - { -{ -return dev_storage + 17; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '0': - if (strncmp (KR_keyword, "/dev/st106", 10) == 0) - { -{ -return dev_storage + 730; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '5': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz15", 10) == 0) - { -{ -return dev_storage + 607; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [8]) - { - case 'S': - if (strncmp (KR_keyword, "/dev/ttyS5", 10) == 0) - { -{ -return dev_storage + 822; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/tty55", 10) == 0) - { -{ -return dev_storage + 808; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/tty45", 10) == 0) - { -{ -return dev_storage + 798; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/tty35", 10) == 0) - { -{ -return dev_storage + 788; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/tty25", 10) == 0) - { -{ -return dev_storage + 778; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty15", 10) == 0) - { -{ -return dev_storage + 768; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy15", 10) == 0) - { -{ -return dev_storage + 592; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx15", 10) == 0) - { -{ -return dev_storage + 577; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw15", 10) == 0) - { -{ -return dev_storage + 562; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv15", 10) == 0) - { -{ -return dev_storage + 547; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu15", 10) == 0) - { -{ -return dev_storage + 532; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [8]) - { - case '9': - if (strncmp (KR_keyword, "/dev/nst95", 10) == 0) - { -{ -return dev_storage + 138; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/nst85", 10) == 0) - { -{ -return dev_storage + 128; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/nst75", 10) == 0) - { -{ -return dev_storage + 118; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/nst65", 10) == 0) - { -{ -return dev_storage + 108; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/nst55", 10) == 0) - { -{ -return dev_storage + 98; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/nst45", 10) == 0) - { -{ -return dev_storage + 88; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/nst35", 10) == 0) - { -{ -return dev_storage + 78; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/nst25", 10) == 0) - { -{ -return dev_storage + 68; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt15", 10) == 0) - { -{ -return dev_storage + 517; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst15", 10) == 0) - { -{ -return dev_storage + 58; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds15", 10) == 0) - { -{ -return dev_storage + 502; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr15", 10) == 0) - { -{ -return dev_storage + 487; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq15", 10) == 0) - { -{ -return dev_storage + 472; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp15", 10) == 0) - { -{ -return dev_storage + 457; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo15", 10) == 0) - { -{ -return dev_storage + 442; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn15", 10) == 0) - { -{ -return dev_storage + 427; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm15", 10) == 0) - { -{ -return dev_storage + 412; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com15", 10) == 0) - { -{ -return dev_storage + 16; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl15", 10) == 0) - { -{ -return dev_storage + 397; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk15", 10) == 0) - { -{ -return dev_storage + 382; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj15", 10) == 0) - { -{ -return dev_storage + 367; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi15", 10) == 0) - { -{ -return dev_storage + 352; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh15", 10) == 0) - { -{ -return dev_storage + 337; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg15", 10) == 0) - { -{ -return dev_storage + 322; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf15", 10) == 0) - { -{ -return dev_storage + 307; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde15", 10) == 0) - { -{ -return dev_storage + 292; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd15", 10) == 0) - { -{ -return dev_storage + 277; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd15", 10) == 0) - { -{ -return dev_storage + 191; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc15", 10) == 0) - { -{ -return dev_storage + 262; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb15", 10) == 0) - { -{ -return dev_storage + 247; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda15", 10) == 0) - { -{ -return dev_storage + 232; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [8]) - { - case '2': - if (strncmp (KR_keyword, "/dev/st125", 10) == 0) - { -{ -return dev_storage + 749; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - if (strncmp (KR_keyword, "/dev/st115", 10) == 0) - { -{ -return dev_storage + 739; - -} - } - else - { -{ -return NULL; - -} - } - case '0': - if (strncmp (KR_keyword, "/dev/st105", 10) == 0) - { -{ -return dev_storage + 729; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '4': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz14", 10) == 0) - { -{ -return dev_storage + 606; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [8]) - { - case 'S': - if (strncmp (KR_keyword, "/dev/ttyS4", 10) == 0) - { -{ -return dev_storage + 821; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/tty54", 10) == 0) - { -{ -return dev_storage + 807; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/tty44", 10) == 0) - { -{ -return dev_storage + 797; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/tty34", 10) == 0) - { -{ -return dev_storage + 787; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/tty24", 10) == 0) - { -{ -return dev_storage + 777; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty14", 10) == 0) - { -{ -return dev_storage + 767; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy14", 10) == 0) - { -{ -return dev_storage + 591; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx14", 10) == 0) - { -{ -return dev_storage + 576; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw14", 10) == 0) - { -{ -return dev_storage + 561; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv14", 10) == 0) - { -{ -return dev_storage + 546; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu14", 10) == 0) - { -{ -return dev_storage + 531; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [8]) - { - case '9': - if (strncmp (KR_keyword, "/dev/nst94", 10) == 0) - { -{ -return dev_storage + 137; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/nst84", 10) == 0) - { -{ -return dev_storage + 127; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/nst74", 10) == 0) - { -{ -return dev_storage + 117; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/nst64", 10) == 0) - { -{ -return dev_storage + 107; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/nst54", 10) == 0) - { -{ -return dev_storage + 97; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/nst44", 10) == 0) - { -{ -return dev_storage + 87; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/nst34", 10) == 0) - { -{ -return dev_storage + 77; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/nst24", 10) == 0) - { -{ -return dev_storage + 67; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt14", 10) == 0) - { -{ -return dev_storage + 516; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst14", 10) == 0) - { -{ -return dev_storage + 57; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds14", 10) == 0) - { -{ -return dev_storage + 501; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr14", 10) == 0) - { -{ -return dev_storage + 486; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq14", 10) == 0) - { -{ -return dev_storage + 471; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp14", 10) == 0) - { -{ -return dev_storage + 456; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo14", 10) == 0) - { -{ -return dev_storage + 441; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn14", 10) == 0) - { -{ -return dev_storage + 426; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm14", 10) == 0) - { -{ -return dev_storage + 411; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com14", 10) == 0) - { -{ -return dev_storage + 15; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl14", 10) == 0) - { -{ -return dev_storage + 396; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk14", 10) == 0) - { -{ -return dev_storage + 381; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj14", 10) == 0) - { -{ -return dev_storage + 366; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi14", 10) == 0) - { -{ -return dev_storage + 351; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh14", 10) == 0) - { -{ -return dev_storage + 336; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg14", 10) == 0) - { -{ -return dev_storage + 321; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf14", 10) == 0) - { -{ -return dev_storage + 306; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde14", 10) == 0) - { -{ -return dev_storage + 291; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd14", 10) == 0) - { -{ -return dev_storage + 276; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd14", 10) == 0) - { -{ -return dev_storage + 190; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc14", 10) == 0) - { -{ -return dev_storage + 261; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb14", 10) == 0) - { -{ -return dev_storage + 246; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda14", 10) == 0) - { -{ -return dev_storage + 231; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [8]) - { - case '2': - if (strncmp (KR_keyword, "/dev/st124", 10) == 0) - { -{ -return dev_storage + 748; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - if (strncmp (KR_keyword, "/dev/st114", 10) == 0) - { -{ -return dev_storage + 738; - -} - } - else - { -{ -return NULL; - -} - } - case '0': - if (strncmp (KR_keyword, "/dev/st104", 10) == 0) - { -{ -return dev_storage + 728; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '3': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz13", 10) == 0) - { -{ -return dev_storage + 605; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [8]) - { - case 'S': - if (strncmp (KR_keyword, "/dev/ttyS3", 10) == 0) - { -{ -return dev_storage + 820; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/tty63", 10) == 0) - { -{ -return dev_storage + 816; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/tty53", 10) == 0) - { -{ -return dev_storage + 806; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/tty43", 10) == 0) - { -{ -return dev_storage + 796; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/tty33", 10) == 0) - { -{ -return dev_storage + 786; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/tty23", 10) == 0) - { -{ -return dev_storage + 776; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty13", 10) == 0) - { -{ -return dev_storage + 766; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy13", 10) == 0) - { -{ -return dev_storage + 590; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx13", 10) == 0) - { -{ -return dev_storage + 575; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw13", 10) == 0) - { -{ -return dev_storage + 560; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv13", 10) == 0) - { -{ -return dev_storage + 545; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu13", 10) == 0) - { -{ -return dev_storage + 530; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [8]) - { - case '9': - if (strncmp (KR_keyword, "/dev/nst93", 10) == 0) - { -{ -return dev_storage + 136; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/nst83", 10) == 0) - { -{ -return dev_storage + 126; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/nst73", 10) == 0) - { -{ -return dev_storage + 116; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/nst63", 10) == 0) - { -{ -return dev_storage + 106; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/nst53", 10) == 0) - { -{ -return dev_storage + 96; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/nst43", 10) == 0) - { -{ -return dev_storage + 86; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/nst33", 10) == 0) - { -{ -return dev_storage + 76; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/nst23", 10) == 0) - { -{ -return dev_storage + 66; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt13", 10) == 0) - { -{ -return dev_storage + 515; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst13", 10) == 0) - { -{ -return dev_storage + 56; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds13", 10) == 0) - { -{ -return dev_storage + 500; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr13", 10) == 0) - { -{ -return dev_storage + 485; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq13", 10) == 0) - { -{ -return dev_storage + 470; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp13", 10) == 0) - { -{ -return dev_storage + 455; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo13", 10) == 0) - { -{ -return dev_storage + 440; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn13", 10) == 0) - { -{ -return dev_storage + 425; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm13", 10) == 0) - { -{ -return dev_storage + 410; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com13", 10) == 0) - { -{ -return dev_storage + 14; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl13", 10) == 0) - { -{ -return dev_storage + 395; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk13", 10) == 0) - { -{ -return dev_storage + 380; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj13", 10) == 0) - { -{ -return dev_storage + 365; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi13", 10) == 0) - { -{ -return dev_storage + 350; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh13", 10) == 0) - { -{ -return dev_storage + 335; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg13", 10) == 0) - { -{ -return dev_storage + 320; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf13", 10) == 0) - { -{ -return dev_storage + 305; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde13", 10) == 0) - { -{ -return dev_storage + 290; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd13", 10) == 0) - { -{ -return dev_storage + 275; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd13", 10) == 0) - { -{ -return dev_storage + 189; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc13", 10) == 0) - { -{ -return dev_storage + 260; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb13", 10) == 0) - { -{ -return dev_storage + 245; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda13", 10) == 0) - { -{ -return dev_storage + 230; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [8]) - { - case '2': - if (strncmp (KR_keyword, "/dev/st123", 10) == 0) - { -{ -return dev_storage + 747; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - if (strncmp (KR_keyword, "/dev/st113", 10) == 0) - { -{ -return dev_storage + 737; - -} - } - else - { -{ -return NULL; - -} - } - case '0': - if (strncmp (KR_keyword, "/dev/st103", 10) == 0) - { -{ -return dev_storage + 727; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '2': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz12", 10) == 0) - { -{ -return dev_storage + 604; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [8]) - { - case 'S': - if (strncmp (KR_keyword, "/dev/ttyS2", 10) == 0) - { -{ -return dev_storage + 819; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/tty62", 10) == 0) - { -{ -return dev_storage + 815; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/tty52", 10) == 0) - { -{ -return dev_storage + 805; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/tty42", 10) == 0) - { -{ -return dev_storage + 795; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/tty32", 10) == 0) - { -{ -return dev_storage + 785; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/tty22", 10) == 0) - { -{ -return dev_storage + 775; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty12", 10) == 0) - { -{ -return dev_storage + 765; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy12", 10) == 0) - { -{ -return dev_storage + 589; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx12", 10) == 0) - { -{ -return dev_storage + 574; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw12", 10) == 0) - { -{ -return dev_storage + 559; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv12", 10) == 0) - { -{ -return dev_storage + 544; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu12", 10) == 0) - { -{ -return dev_storage + 529; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [8]) - { - case '9': - if (strncmp (KR_keyword, "/dev/nst92", 10) == 0) - { -{ -return dev_storage + 135; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/nst82", 10) == 0) - { -{ -return dev_storage + 125; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/nst72", 10) == 0) - { -{ -return dev_storage + 115; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/nst62", 10) == 0) - { -{ -return dev_storage + 105; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/nst52", 10) == 0) - { -{ -return dev_storage + 95; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/nst42", 10) == 0) - { -{ -return dev_storage + 85; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/nst32", 10) == 0) - { -{ -return dev_storage + 75; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/nst22", 10) == 0) - { -{ -return dev_storage + 65; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt12", 10) == 0) - { -{ -return dev_storage + 514; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst12", 10) == 0) - { -{ -return dev_storage + 55; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds12", 10) == 0) - { -{ -return dev_storage + 499; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr12", 10) == 0) - { -{ -return dev_storage + 484; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq12", 10) == 0) - { -{ -return dev_storage + 469; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp12", 10) == 0) - { -{ -return dev_storage + 454; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo12", 10) == 0) - { -{ -return dev_storage + 439; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn12", 10) == 0) - { -{ -return dev_storage + 424; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm12", 10) == 0) - { -{ -return dev_storage + 409; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com12", 10) == 0) - { -{ -return dev_storage + 13; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl12", 10) == 0) - { -{ -return dev_storage + 394; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk12", 10) == 0) - { -{ -return dev_storage + 379; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj12", 10) == 0) - { -{ -return dev_storage + 364; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi12", 10) == 0) - { -{ -return dev_storage + 349; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh12", 10) == 0) - { -{ -return dev_storage + 334; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg12", 10) == 0) - { -{ -return dev_storage + 319; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf12", 10) == 0) - { -{ -return dev_storage + 304; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde12", 10) == 0) - { -{ -return dev_storage + 289; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd12", 10) == 0) - { -{ -return dev_storage + 274; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd12", 10) == 0) - { -{ -return dev_storage + 188; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc12", 10) == 0) - { -{ -return dev_storage + 259; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb12", 10) == 0) - { -{ -return dev_storage + 244; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda12", 10) == 0) - { -{ -return dev_storage + 229; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [8]) - { - case '2': - if (strncmp (KR_keyword, "/dev/st122", 10) == 0) - { -{ -return dev_storage + 746; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - if (strncmp (KR_keyword, "/dev/st112", 10) == 0) - { -{ -return dev_storage + 736; - -} - } - else - { -{ -return NULL; - -} - } - case '0': - if (strncmp (KR_keyword, "/dev/st102", 10) == 0) - { -{ -return dev_storage + 726; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz11", 10) == 0) - { -{ -return dev_storage + 603; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [8]) - { - case 'S': - if (strncmp (KR_keyword, "/dev/ttyS1", 10) == 0) - { -{ -return dev_storage + 818; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/tty61", 10) == 0) - { -{ -return dev_storage + 814; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/tty51", 10) == 0) - { -{ -return dev_storage + 804; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/tty41", 10) == 0) - { -{ -return dev_storage + 794; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/tty31", 10) == 0) - { -{ -return dev_storage + 784; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/tty21", 10) == 0) - { -{ -return dev_storage + 774; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty11", 10) == 0) - { -{ -return dev_storage + 764; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy11", 10) == 0) - { -{ -return dev_storage + 588; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx11", 10) == 0) - { -{ -return dev_storage + 573; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw11", 10) == 0) - { -{ -return dev_storage + 558; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv11", 10) == 0) - { -{ -return dev_storage + 543; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu11", 10) == 0) - { -{ -return dev_storage + 528; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [8]) - { - case '9': - if (strncmp (KR_keyword, "/dev/nst91", 10) == 0) - { -{ -return dev_storage + 134; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/nst81", 10) == 0) - { -{ -return dev_storage + 124; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/nst71", 10) == 0) - { -{ -return dev_storage + 114; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/nst61", 10) == 0) - { -{ -return dev_storage + 104; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/nst51", 10) == 0) - { -{ -return dev_storage + 94; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/nst41", 10) == 0) - { -{ -return dev_storage + 84; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/nst31", 10) == 0) - { -{ -return dev_storage + 74; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/nst21", 10) == 0) - { -{ -return dev_storage + 64; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt11", 10) == 0) - { -{ -return dev_storage + 513; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst11", 10) == 0) - { -{ -return dev_storage + 54; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds11", 10) == 0) - { -{ -return dev_storage + 498; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr11", 10) == 0) - { -{ -return dev_storage + 483; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq11", 10) == 0) - { -{ -return dev_storage + 468; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp11", 10) == 0) - { -{ -return dev_storage + 453; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo11", 10) == 0) - { -{ -return dev_storage + 438; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn11", 10) == 0) - { -{ -return dev_storage + 423; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm11", 10) == 0) - { -{ -return dev_storage + 408; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com11", 10) == 0) - { -{ -return dev_storage + 12; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl11", 10) == 0) - { -{ -return dev_storage + 393; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk11", 10) == 0) - { -{ -return dev_storage + 378; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj11", 10) == 0) - { -{ -return dev_storage + 363; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi11", 10) == 0) - { -{ -return dev_storage + 348; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh11", 10) == 0) - { -{ -return dev_storage + 333; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg11", 10) == 0) - { -{ -return dev_storage + 318; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf11", 10) == 0) - { -{ -return dev_storage + 303; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde11", 10) == 0) - { -{ -return dev_storage + 288; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd11", 10) == 0) - { -{ -return dev_storage + 273; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd11", 10) == 0) - { -{ -return dev_storage + 187; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc11", 10) == 0) - { -{ -return dev_storage + 258; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb11", 10) == 0) - { -{ -return dev_storage + 243; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda11", 10) == 0) - { -{ -return dev_storage + 228; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [8]) - { - case '2': - if (strncmp (KR_keyword, "/dev/st121", 10) == 0) - { -{ -return dev_storage + 745; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - if (strncmp (KR_keyword, "/dev/st111", 10) == 0) - { -{ -return dev_storage + 735; - -} - } - else - { -{ -return NULL; - -} - } - case '0': - if (strncmp (KR_keyword, "/dev/st101", 10) == 0) - { -{ -return dev_storage + 725; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '0': - switch (KR_keyword [7]) - { - case 'z': - if (strncmp (KR_keyword, "/dev/sdz10", 10) == 0) - { -{ -return dev_storage + 602; - -} - } - else - { -{ -return NULL; - -} - } - case 'y': - switch (KR_keyword [8]) - { - case 'S': - if (strncmp (KR_keyword, "/dev/ttyS0", 10) == 0) - { -{ -return dev_storage + 817; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/tty60", 10) == 0) - { -{ -return dev_storage + 813; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/tty50", 10) == 0) - { -{ -return dev_storage + 803; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/tty40", 10) == 0) - { -{ -return dev_storage + 793; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/tty30", 10) == 0) - { -{ -return dev_storage + 783; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/tty20", 10) == 0) - { -{ -return dev_storage + 773; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/tty10", 10) == 0) - { -{ -return dev_storage + 763; - -} - } - else - { -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sdy10", 10) == 0) - { -{ -return dev_storage + 587; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'x': - if (strncmp (KR_keyword, "/dev/sdx10", 10) == 0) - { -{ -return dev_storage + 572; - -} - } - else - { -{ -return NULL; - -} - } - case 'w': - if (strncmp (KR_keyword, "/dev/sdw10", 10) == 0) - { -{ -return dev_storage + 557; - -} - } - else - { -{ -return NULL; - -} - } - case 'v': - if (strncmp (KR_keyword, "/dev/sdv10", 10) == 0) - { -{ -return dev_storage + 542; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/sdu10", 10) == 0) - { -{ -return dev_storage + 527; - -} - } - else - { -{ -return NULL; - -} - } - case 't': - switch (KR_keyword [8]) - { - case '9': - if (strncmp (KR_keyword, "/dev/nst90", 10) == 0) - { -{ -return dev_storage + 133; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/nst80", 10) == 0) - { -{ -return dev_storage + 123; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/nst70", 10) == 0) - { -{ -return dev_storage + 113; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/nst60", 10) == 0) - { -{ -return dev_storage + 103; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/nst50", 10) == 0) - { -{ -return dev_storage + 93; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/nst40", 10) == 0) - { -{ -return dev_storage + 83; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/nst30", 10) == 0) - { -{ -return dev_storage + 73; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/nst20", 10) == 0) - { -{ -return dev_storage + 63; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdt10", 10) == 0) - { -{ -return dev_storage + 512; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst10", 10) == 0) - { -{ -return dev_storage + 53; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 's': - if (strncmp (KR_keyword, "/dev/sds10", 10) == 0) - { -{ -return dev_storage + 497; - -} - } - else - { -{ -return NULL; - -} - } - case 'r': - if (strncmp (KR_keyword, "/dev/sdr10", 10) == 0) - { -{ -return dev_storage + 482; - -} - } - else - { -{ -return NULL; - -} - } - case 'q': - if (strncmp (KR_keyword, "/dev/sdq10", 10) == 0) - { -{ -return dev_storage + 467; - -} - } - else - { -{ -return NULL; - -} - } - case 'p': - if (strncmp (KR_keyword, "/dev/sdp10", 10) == 0) - { -{ -return dev_storage + 452; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/sdo10", 10) == 0) - { -{ -return dev_storage + 437; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/sdn10", 10) == 0) - { -{ -return dev_storage + 422; - -} - } - else - { -{ -return NULL; - -} - } - case 'm': - switch (KR_keyword [5]) - { - case 's': - if (strncmp (KR_keyword, "/dev/sdm10", 10) == 0) - { -{ -return dev_storage + 407; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/com10", 10) == 0) - { -{ -return dev_storage + 11; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'l': - if (strncmp (KR_keyword, "/dev/sdl10", 10) == 0) - { -{ -return dev_storage + 392; - -} - } - else - { -{ -return NULL; - -} - } - case 'k': - if (strncmp (KR_keyword, "/dev/sdk10", 10) == 0) - { -{ -return dev_storage + 377; - -} - } - else - { -{ -return NULL; - -} - } - case 'j': - if (strncmp (KR_keyword, "/dev/sdj10", 10) == 0) - { -{ -return dev_storage + 362; - -} - } - else - { -{ -return NULL; - -} - } - case 'i': - if (strncmp (KR_keyword, "/dev/sdi10", 10) == 0) - { -{ -return dev_storage + 347; - -} - } - else - { -{ -return NULL; - -} - } - case 'h': - if (strncmp (KR_keyword, "/dev/sdh10", 10) == 0) - { -{ -return dev_storage + 332; - -} - } - else - { -{ -return NULL; - -} - } - case 'g': - if (strncmp (KR_keyword, "/dev/sdg10", 10) == 0) - { -{ -return dev_storage + 317; - -} - } - else - { -{ -return NULL; - -} - } - case 'f': - if (strncmp (KR_keyword, "/dev/sdf10", 10) == 0) - { -{ -return dev_storage + 302; - -} - } - else - { -{ -return NULL; - -} - } - case 'e': - if (strncmp (KR_keyword, "/dev/sde10", 10) == 0) - { -{ -return dev_storage + 287; - -} - } - else - { -{ -return NULL; - -} - } - case 'd': - switch (KR_keyword [6]) - { - case 'd': - if (strncmp (KR_keyword, "/dev/sdd10", 10) == 0) - { -{ -return dev_storage + 272; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/scd10", 10) == 0) - { -{ -return dev_storage + 186; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/sdc10", 10) == 0) - { -{ -return dev_storage + 257; - -} - } - else - { -{ -return NULL; - -} - } - case 'b': - if (strncmp (KR_keyword, "/dev/sdb10", 10) == 0) - { -{ -return dev_storage + 242; - -} - } - else - { -{ -return NULL; - -} - } - case 'a': - if (strncmp (KR_keyword, "/dev/sda10", 10) == 0) - { -{ -return dev_storage + 227; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [8]) - { - case '2': - if (strncmp (KR_keyword, "/dev/st120", 10) == 0) - { -{ -return dev_storage + 744; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - if (strncmp (KR_keyword, "/dev/st110", 10) == 0) - { -{ -return dev_storage + 734; - -} - } - else - { -{ -return NULL; - -} - } - case '0': - if (strncmp (KR_keyword, "/dev/st100", 10) == 0) - { -{ -return dev_storage + 724; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 11: - switch (KR_keyword [9]) - { - case 'u': - if (strncmp (KR_keyword, "/dev/conout", 11) == 0) - { -{ -return dev_storage + 19; - -} - } - else - { -{ -return NULL; - -} - } - case 'o': - if (strncmp (KR_keyword, "/dev/random", 11) == 0) - { -{ -return dev_storage + 175; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - switch (KR_keyword [10]) - { - case '7': - if (strncmp (KR_keyword, "/dev/nst127", 11) == 0) - { -{ -return dev_storage + 170; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/nst126", 11) == 0) - { -{ -return dev_storage + 169; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/nst125", 11) == 0) - { -{ -return dev_storage + 168; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/nst124", 11) == 0) - { -{ -return dev_storage + 167; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/nst123", 11) == 0) - { -{ -return dev_storage + 166; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/nst122", 11) == 0) - { -{ -return dev_storage + 165; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - if (strncmp (KR_keyword, "/dev/nst121", 11) == 0) - { -{ -return dev_storage + 164; - -} - } - else - { -{ -return NULL; - -} - } - case '0': - if (strncmp (KR_keyword, "/dev/nst120", 11) == 0) - { -{ -return dev_storage + 163; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [10]) - { - case '9': - if (strncmp (KR_keyword, "/dev/nst119", 11) == 0) - { -{ -return dev_storage + 162; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/nst118", 11) == 0) - { -{ -return dev_storage + 161; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/nst117", 11) == 0) - { -{ -return dev_storage + 160; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/nst116", 11) == 0) - { -{ -return dev_storage + 159; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/ttyS15", 11) == 0) - { -{ -return dev_storage + 832; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst115", 11) == 0) - { -{ -return dev_storage + 158; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '4': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/ttyS14", 11) == 0) - { -{ -return dev_storage + 831; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst114", 11) == 0) - { -{ -return dev_storage + 157; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '3': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/ttyS13", 11) == 0) - { -{ -return dev_storage + 830; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst113", 11) == 0) - { -{ -return dev_storage + 156; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '2': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/ttyS12", 11) == 0) - { -{ -return dev_storage + 829; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst112", 11) == 0) - { -{ -return dev_storage + 155; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '1': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/ttyS11", 11) == 0) - { -{ -return dev_storage + 828; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst111", 11) == 0) - { -{ -return dev_storage + 154; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '0': - switch (KR_keyword [5]) - { - case 't': - if (strncmp (KR_keyword, "/dev/ttyS10", 11) == 0) - { -{ -return dev_storage + 827; - -} - } - else - { -{ -return NULL; - -} - } - case 'n': - if (strncmp (KR_keyword, "/dev/nst110", 11) == 0) - { -{ -return dev_storage + 153; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case '0': - switch (KR_keyword [10]) - { - case '9': - if (strncmp (KR_keyword, "/dev/nst109", 11) == 0) - { -{ -return dev_storage + 152; - -} - } - else - { -{ -return NULL; - -} - } - case '8': - if (strncmp (KR_keyword, "/dev/nst108", 11) == 0) - { -{ -return dev_storage + 151; - -} - } - else - { -{ -return NULL; - -} - } - case '7': - if (strncmp (KR_keyword, "/dev/nst107", 11) == 0) - { -{ -return dev_storage + 150; - -} - } - else - { -{ -return NULL; - -} - } - case '6': - if (strncmp (KR_keyword, "/dev/nst106", 11) == 0) - { -{ -return dev_storage + 149; - -} - } - else - { -{ -return NULL; - -} - } - case '5': - if (strncmp (KR_keyword, "/dev/nst105", 11) == 0) - { -{ -return dev_storage + 148; - -} - } - else - { -{ -return NULL; - -} - } - case '4': - if (strncmp (KR_keyword, "/dev/nst104", 11) == 0) - { -{ -return dev_storage + 147; - -} - } - else - { -{ -return NULL; - -} - } - case '3': - if (strncmp (KR_keyword, "/dev/nst103", 11) == 0) - { -{ -return dev_storage + 146; - -} - } - else - { -{ -return NULL; - -} - } - case '2': - if (strncmp (KR_keyword, "/dev/nst102", 11) == 0) - { -{ -return dev_storage + 145; - -} - } - else - { -{ -return NULL; - -} - } - case '1': - if (strncmp (KR_keyword, "/dev/nst101", 11) == 0) - { -{ -return dev_storage + 144; - -} - } - else - { -{ -return NULL; - -} - } - case '0': - if (strncmp (KR_keyword, "/dev/nst100", 11) == 0) - { -{ -return dev_storage + 143; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 12: - switch (KR_keyword [5]) - { - case 'w': - if (strncmp (KR_keyword, "/dev/windows", 12) == 0) - { -{ -return dev_storage + 835; - -} - } - else - { -{ -return NULL; - -} - } - case 'u': - if (strncmp (KR_keyword, "/dev/urandom", 12) == 0) - { -{ -return dev_storage + 834; - -} - } - else - { -{ -return NULL; - -} - } - case 'c': - if (strncmp (KR_keyword, "/dev/console", 12) == 0) - { -{ -return dev_storage + 20; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } - case 14: - if (strncmp (KR_keyword, "/dev/clipboard", 14) == 0) - { -{ -return dev_storage + 1; - -} - } - else - { -{ -return NULL; - -} - } - default: -{ -return NULL; - -} - } -} - - - - - - -#undef BRACK -void -device::parse (const char *s) -{ - size_t len = strlen (s); - const device *dev = KR_find_keyword (s, len); - - if (!dev) - *this = *fs_dev; - else - *this = *dev; -} - -void -device::init () -{ - /* nothing to do... yet */ -} - -void -device::parse (_major_t major, _minor_t minor) -{ - _dev_t dev = FHDEV (major, minor); - - devn = 0; - - for (unsigned i = 0; i < (sizeof (dev_storage) / sizeof (dev_storage[0])); i++) - if (dev_storage[i].devn == dev) - { - *this = dev_storage[i]; - break; - } - - if (!*this) - devn = FHDEV (major, minor); -} - -void -device::parse (_dev_t dev) -{ - parse (_major (dev), _minor (dev)); -} - -void -device::tty_to_real_device () -{ - if (!real_tty_attached (myself)) - *this = myself->ctty < 0 ? dev_bad_storage : *console_dev; - else - parse (DEV_TTYS_MAJOR, myself->ctty); -} - -void -device::parsedisk (int drive, int part) -{ - int base; - if (drive < ('q' - 'a')) - base = DEV_SD_MAJOR; - else - { - base = DEV_SD1_MAJOR; - drive -= 'q' - 'a'; - } - parse (base, part + (drive * 16)); -} - - diff --git a/winsup/cygwin/devices.h b/winsup/cygwin/devices.h deleted file mode 100644 index 5d294ffbe..000000000 --- a/winsup/cygwin/devices.h +++ /dev/null @@ -1,182 +0,0 @@ -/* devices.h - - Copyright 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -typedef unsigned short _major_t; -typedef unsigned short _minor_t; -typedef mode_t _mode_t; -typedef __dev32_t _dev_t; - -#define FHDEV(maj, min) ((((unsigned) (maj)) << (sizeof (_major_t) * 8)) | (unsigned) (min)) -#define _minor(dev) ((dev) & ((1 << (sizeof (_minor_t) * 8)) - 1)) -#define _major(dev) ((dev) >> (sizeof (_major_t) * 8)) - -enum fh_devices -{ - FH_TTY = FHDEV (5, 0), - FH_CONSOLE = FHDEV (5, 1), - FH_PTYM = FHDEV (5, 2), /* /dev/ptmx */ - FH_CONIN = FHDEV (5, 255), - FH_CONOUT = FHDEV (5, 254), - - DEV_TTYM_MAJOR = 128, - FH_TTYM = FHDEV (DEV_TTYM_MAJOR, 0), - FH_TTYM_MAX= FHDEV (DEV_TTYM_MAJOR, 255), - - DEV_TTYS_MAJOR = 136, - FH_TTYS = FHDEV (DEV_TTYS_MAJOR, 0), /* FIXME: Should separate ttys and ptys */ - FH_TTYS_MAX= FHDEV (DEV_TTYS_MAJOR, 255), /* FIXME: Should separate ttys and ptys */ - - DEV_SERIAL_MAJOR = 117, - FH_SERIAL = FHDEV (117, 0), /* /dev/ttyS? */ - - FH_WINDOWS = FHDEV (13, 255), - FH_CLIPBOARD=FHDEV (13, 254), - - FH_PIPE = FHDEV (0, 255), - FH_PIPER = FHDEV (0, 254), - FH_PIPEW = FHDEV (0, 253), - FH_FIFO = FHDEV (0, 252), - FH_PROC = FHDEV (0, 250), - FH_REGISTRY= FHDEV (0, 249), - FH_PROCESS = FHDEV (0, 248), - - FH_FS = FHDEV (0, 247), /* filesystem based device */ - - FH_NETDRIVE= FHDEV (0, 246), - FH_DEV = FHDEV (0, 245), - - DEV_FLOPPY_MAJOR = 2, - FH_FLOPPY = FHDEV (DEV_FLOPPY_MAJOR, 0), - - DEV_CDROM_MAJOR = 11, - FH_CDROM = FHDEV (DEV_CDROM_MAJOR, 0), - - DEV_TAPE_MAJOR = 9, - FH_TAPE = FHDEV (DEV_TAPE_MAJOR, 0), - FH_NTAPE = FHDEV (DEV_TAPE_MAJOR, 128), - FH_MAXNTAPE= FHDEV (DEV_TAPE_MAJOR, 255), - - DEV_SD_MAJOR = 8, - DEV_SD1_MAJOR = 65, - FH_SD = FHDEV (DEV_SD_MAJOR, 0), - FH_SD1 = FHDEV (DEV_SD1_MAJOR, 0), - FH_SDA = FHDEV (DEV_SD_MAJOR, 0), - FH_SDB = FHDEV (DEV_SD_MAJOR, 16), - FH_SDC = FHDEV (DEV_SD_MAJOR, 32), - FH_SDD = FHDEV (DEV_SD_MAJOR, 48), - FH_SDE = FHDEV (DEV_SD_MAJOR, 64), - FH_SDF = FHDEV (DEV_SD_MAJOR, 80), - FH_SDG = FHDEV (DEV_SD_MAJOR, 96), - FH_SDH = FHDEV (DEV_SD_MAJOR, 112), - FH_SDI = FHDEV (DEV_SD_MAJOR, 128), - FH_SDJ = FHDEV (DEV_SD_MAJOR, 144), - FH_SDK = FHDEV (DEV_SD_MAJOR, 160), - FH_SDL = FHDEV (DEV_SD_MAJOR, 176), - FH_SDM = FHDEV (DEV_SD_MAJOR, 192), - FH_SDN = FHDEV (DEV_SD_MAJOR, 208), - FH_SDO = FHDEV (DEV_SD_MAJOR, 224), - FH_SDP = FHDEV (DEV_SD_MAJOR, 240), - FH_SDQ = FHDEV (DEV_SD1_MAJOR, 0), - FH_SDR = FHDEV (DEV_SD1_MAJOR, 16), - FH_SDS = FHDEV (DEV_SD1_MAJOR, 32), - FH_SDT = FHDEV (DEV_SD1_MAJOR, 48), - FH_SDU = FHDEV (DEV_SD1_MAJOR, 64), - FH_SDV = FHDEV (DEV_SD1_MAJOR, 80), - FH_SDW = FHDEV (DEV_SD1_MAJOR, 96), - FH_SDX = FHDEV (DEV_SD1_MAJOR, 112), - FH_SDY = FHDEV (DEV_SD1_MAJOR, 128), - FH_SDZ = FHDEV (DEV_SD1_MAJOR, 144), - - FH_MEM = FHDEV (1, 1), - FH_KMEM = FHDEV (1, 2), /* not implemented yet */ - FH_NULL = FHDEV (1, 3), - FH_PORT = FHDEV (1, 4), - FH_ZERO = FHDEV (1, 5), - FH_FULL = FHDEV (1, 7), - FH_RANDOM = FHDEV (1, 8), - FH_URANDOM = FHDEV (1, 9), - FH_KMSG = FHDEV (1, 11), - FH_OSS_DSP = FHDEV (14, 3), - - DEV_CYGDRIVE_MAJOR = 98, - FH_CYGDRIVE= FHDEV (DEV_CYGDRIVE_MAJOR, 0), - - DEV_TCP_MAJOR = 30, - FH_TCP = FHDEV (DEV_TCP_MAJOR, 36), - FH_UDP = FHDEV (DEV_TCP_MAJOR, 39), - FH_ICMP = FHDEV (DEV_TCP_MAJOR, 33), - FH_UNIX = FHDEV (DEV_TCP_MAJOR, 120), - FH_STREAM = FHDEV (DEV_TCP_MAJOR, 121), - FH_DGRAM = FHDEV (DEV_TCP_MAJOR, 122), - - FH_BAD = FHDEV (0, 0) -}; - -struct device -{ - const char *name; - union - { - _dev_t devn; - struct - { - _minor_t minor; - _major_t major; - }; - }; - const char *native; - _mode_t mode; - bool dev_on_fs; - static const device *lookup (const char *, unsigned int = UINT32_MAX); - void parse (const char *); - void parse (_major_t major, _minor_t minor); - void parse (_dev_t dev); - void parsedisk (int, int); - inline bool setunit (unsigned n) - { - minor = n; - return true; - } - static void init (); - void tty_to_real_device (); - inline operator int () const {return devn;} - inline void setfs (bool x) {dev_on_fs = x;} - inline bool isfs () const {return dev_on_fs || devn == FH_FS;} - inline bool is_fs_special () const {return dev_on_fs && devn != FH_FS;} -}; - -extern const device *console_dev; -extern const device *ttym_dev; -extern const device *ttys_dev; -extern const device *urandom_dev; - -extern const device dev_dgram_storage; -#define dgram_dev (&dev_dgram_storage) -extern const device dev_stream_storage; -#define stream_dev (&dev_stream_storage) -extern const device dev_tcp_storage; -#define tcp_dev (&dev_tcp_storage) -extern const device dev_udp_storage; -#define udp_dev (&dev_udp_storage) - -extern const device dev_piper_storage; -#define piper_dev (&dev_piper_storage) -extern const device dev_pipew_storage; -#define pipew_dev (&dev_pipew_storage) -extern const device dev_proc_storage; -#define proc_dev (&dev_proc_storage) -extern const device dev_netdrive_storage; -#define netdrive_dev (&dev_netdrive_storage) -extern const device dev_cygdrive_storage; -#define cygdrive_dev (&dev_cygdrive_storage) -extern const device dev_fh_storage; -#define fh_dev (&dev_fh_storage) -extern const device dev_fs_storage; -#define fs_dev (&dev_fs_storage) diff --git a/winsup/cygwin/devices.in b/winsup/cygwin/devices.in deleted file mode 100644 index 63a677eb9..000000000 --- a/winsup/cygwin/devices.in +++ /dev/null @@ -1,157 +0,0 @@ -%import { -#include "winsup.h" -#include -#include -#include -#include -#include "devices.h" -#include "sys/cygwin.h" -#include "tty.h" -#include "pinfo.h" -typedef const device *KR_device_t; -} -%type KR_device_t -%local { -const device dev_cygdrive_storage = - {"/cygdrive", {FH_CYGDRIVE}, "/cygdrive"}; - -const device dev_fs_storage = - {"", {FH_FS}, ""}; - -const device dev_proc_storage = - {"", {FH_PROC}, ""}; - -const device dev_netdrive_storage = - {"", {FH_NETDRIVE}, ""}; - -#if 0 -const device dev_dev_storage = - {"/dev", {FH_DEV}, "/dev"}; -#endif - -const device dev_registry_storage = - {"", {FH_REGISTRY}, ""}; - -const device dev_piper_storage = - {"", {FH_PIPER}, ""}; - -const device dev_pipew_storage = - {"", {FH_PIPEW}, ""}; - -const device dev_tcp_storage = - {"", {FH_TCP}, ""}; - -const device dev_udp_storage = - {"", {FH_UDP}, ""}; - -const device dev_stream_storage = - {"", {FH_STREAM}, ""}; - -const device dev_dgram_storage = - {"", {FH_DGRAM}, ""}; - -const device dev_bad_storage = - {"", {FH_BAD}, ""}; -#define BRACK(x) {x} - -%storage_here -} -%% -"/dev/tty", BRACK(FH_TTY), "\\dev\\tty" -"/dev/tty%(0-63)d", BRACK(FHDEV(DEV_TTYS_MAJOR, {$1})), "\\dev\\tty{$1}", ttys_dev -"/dev/console", BRACK(FH_CONSOLE), "\\dev\\console", console_dev -"/dev/ttym", BRACK(FH_TTYM), "\\dev\\ttym", ttym_dev -"/dev/ptmx", BRACK(FH_PTYM), "\\dev\\ptmx" -"/dev/windows", BRACK(FH_WINDOWS), "\\dev\\windows" -"/dev/dsp", BRACK(FH_OSS_DSP), "\\dev\\dsp" -"/dev/conin", BRACK(FH_CONIN), "conin" -"/dev/conout", BRACK(FH_CONOUT), "conout" -"/dev/null", BRACK(FH_NULL), "nul" -"/dev/zero", BRACK(FH_ZERO), "\\dev\\zero" -"/dev/full", BRACK(FH_FULL), "\\dev\\full" -"/dev/random", BRACK(FH_RANDOM), "\\dev\\random" -"/dev/urandom", BRACK(FH_URANDOM), "\\dev\\urandom", urandom_dev -"/dev/mem", BRACK(FH_MEM), "\\dev\\mem" -"/dev/kmem", BRACK(FH_KMEM), "\\dev\\mem" -"/dev/clipboard", BRACK(FH_CLIPBOARD), "\\dev\\clipboard" -"/dev/port", BRACK(FH_PORT), "\\dev\\port" -"/dev/com%(1-16)d", BRACK(FHDEV(DEV_SERIAL_MAJOR, {$1})), "\\\\.\\com{$1}" -"/dev/ttyS%(0-15)d", BRACK(FHDEV(DEV_SERIAL_MAJOR, {$1 + 1})), "\\\\.\\com{$1 + 1}" -"/dev/pipe", BRACK(FH_PIPE), "\\dev\\pipe" -"/dev/fifo", BRACK(FH_FIFO), "\\dev\\fifo" -"/dev/st%(0-127)d", BRACK(FHDEV(DEV_TAPE_MAJOR, {$1})), "\\Device\\Tape{$1}" -"/dev/nst%(0-127)d", BRACK(FHDEV(DEV_TAPE_MAJOR, {$1 + 128})), "\\Device\\Tape{$1}" -"/dev/fd%(0-15)d", BRACK(FHDEV(DEV_FLOPPY_MAJOR, {$1})), "\\Device\\Floppy{$1}" -"/dev/scd%(0-15)d", BRACK(FHDEV(DEV_CDROM_MAJOR, {$1})), "\\Device\\CdRom{$1}" -"/dev/sr%(0-15)d", BRACK(FHDEV(DEV_CDROM_MAJOR, {$1})), "\\Device\\CdRom{$1}" -"/dev/sd%{a-z}s", BRACK(FH_SD{uc $1}), "\\Device\\Harddisk{ord($1) - ord('a')}\\Partition0" -"/dev/sd%{a-z}s%(1-15)d", BRACK(FH_SD{uc $1} | {$2}), "\\Device\\Harddisk{ord($1) - ord('a')}\\Partition{$2 % 16}" -"/dev/kmsg", BRACK(FH_KMSG), "\\\\.\\mailslot\\cygwin\\dev\\kmsg" -"/dev", BRACK(FH_DEV), "/dev" -%other {return NULL;} -%% -#undef BRACK -void -device::parse (const char *s) -{ - size_t len = strlen (s); - const device *dev = KR_find_keyword (s, len); - - if (!dev) - *this = *fs_dev; - else - *this = *dev; -} - -void -device::init () -{ - /* nothing to do... yet */ -} - -void -device::parse (_major_t major, _minor_t minor) -{ - _dev_t dev = FHDEV (major, minor); - - devn = 0; - - for (unsigned i = 0; i < (sizeof (dev_storage) / sizeof (dev_storage[0])); i++) - if (dev_storage[i].devn == dev) - { - *this = dev_storage[i]; - break; - } - - if (!*this) - devn = FHDEV (major, minor); -} - -void -device::parse (_dev_t dev) -{ - parse (_major (dev), _minor (dev)); -} - -void -device::tty_to_real_device () -{ - if (!real_tty_attached (myself)) - *this = myself->ctty < 0 ? dev_bad_storage : *console_dev; - else - parse (DEV_TTYS_MAJOR, myself->ctty); -} - -void -device::parsedisk (int drive, int part) -{ - int base; - if (drive < ('q' - 'a')) - base = DEV_SD_MAJOR; - else - { - base = DEV_SD1_MAJOR; - drive -= 'q' - 'a'; - } - parse (base, part + (drive * 16)); -} diff --git a/winsup/cygwin/dir.cc b/winsup/cygwin/dir.cc deleted file mode 100644 index c40401258..000000000 --- a/winsup/cygwin/dir.cc +++ /dev/null @@ -1,320 +0,0 @@ -/* dir.cc: Posix directory-related routines - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include - -#define _COMPILING_NEWLIB -#include - -#include "pinfo.h" -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "cygtls.h" -#include "perprocess.h" -#include "cygwin/version.h" - -extern "C" int -dirfd (DIR *dir) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (dir->__d_cookie != __DIRENT_COOKIE) - { - set_errno (EBADF); - syscall_printf ("-1 = dirfd (%p)", dir); - return -1; - } - return dir->__d_fd; -} - -/* Symbol kept for backward compatibility. Don't remove. Don't declare - in public header file. */ -extern "C" DIR * -__opendir_with_d_ino (const char *name) -{ - return opendir (name); -} - -/* opendir: POSIX 5.1.2.1 */ -extern "C" DIR * -opendir (const char *name) -{ - fhandler_base *fh; - DIR *res; - - fh = build_fh_name (name, NULL, PC_SYM_FOLLOW); - if (!fh) - res = NULL; - else if (fh->exists ()) - res = fh->opendir (); - else - { - set_errno (ENOENT); - res = NULL; - } - - if (!res && fh) - delete fh; - return res; -} - -static int -readdir_worker (DIR *dir, dirent *de) -{ - myfault efault; - if (efault.faulted ()) - return EFAULT; - - if (dir->__d_cookie != __DIRENT_COOKIE) - { - syscall_printf ("%p = readdir (%p)", NULL, dir); - return EBADF; - } - - de->d_ino = 0; - int res = ((fhandler_base *) dir->__fh)->readdir (dir, de); - - if (res == ENMFILE) - { - if (!(dir->__flags & dirent_saw_dot)) - { - strcpy (de->d_name, "."); - dir->__flags |= dirent_saw_dot; - dir->__d_position++; - res = 0; - } - else if (!(dir->__flags & dirent_saw_dot_dot)) - { - strcpy (de->d_name, ".."); - dir->__flags |= dirent_saw_dot_dot; - dir->__d_position++; - res = 0; - } - } - - if (!res && !de->d_ino) - { - bool is_dot = false; - bool is_dot_dot = false; - - if (de->d_name[0] == '.') - { - if (de->d_name[1] == '\0') - is_dot = true; - else if (de->d_name[1] == '.' && de->d_name[2] == '\0') - is_dot_dot = true; - } - - if (is_dot_dot && !(dir->__flags & dirent_isroot)) - de->d_ino = readdir_get_ino (dir, - ((fhandler_base *) dir->__fh)->get_name (), - true); - else - { - /* Compute d_ino by combining filename hash with directory hash. */ - de->d_ino = ((fhandler_base *) dir->__fh)->get_namehash (); - if (!is_dot && !is_dot_dot) - { - const char *w32name = ((fhandler_base *) dir->__fh)->get_win32_name (); - DWORD devn = ((fhandler_base *) dir->__fh)->get_device (); - /* Paths below /proc don't have a Win32 pendant. */ - if (devn == FH_PROC || devn == FH_PROCESS || devn == FH_REGISTRY) - de->d_ino = hash_path_name (de->d_ino, "/"); - /* A drive's root dir has a trailing backslash already. */ - else if (w32name[1] != ':' || w32name[2] != '\\' || w32name[3]) - de->d_ino = hash_path_name (de->d_ino, "\\"); - de->d_ino = hash_path_name (de->d_ino, de->d_name); - } - } - } - /* This fills out the old 32 bit d_ino field for old applications, - build under Cygwin before 1.5.x. */ - de->__d_internal1 = de->d_ino; - - return res; -} - -/* readdir: POSIX 5.1.2.1 */ -extern "C" struct dirent * -readdir (DIR *dir) -{ - int res = readdir_worker (dir, dir->__d_dirent); - if (res == 0) - return dir->__d_dirent; - if (res != ENMFILE) - set_errno (res); - return NULL; -} - -extern "C" int -readdir_r (DIR *dir, dirent *de, dirent **ode) -{ - int res = readdir_worker (dir, de); - if (!res) - *ode = de; - else - { - *ode = NULL; - if (res == ENMFILE) - res = 0; - } - return res; -} - -extern "C" _off64_t -telldir64 (DIR *dir) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - if (dir->__d_cookie != __DIRENT_COOKIE) - return 0; - return ((fhandler_base *) dir->__fh)->telldir (dir); -} - -/* telldir */ -extern "C" _off_t -telldir (DIR *dir) -{ - return telldir64 (dir); -} - -extern "C" void -seekdir64 (DIR *dir, _off64_t loc) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return; - - if (dir->__d_cookie != __DIRENT_COOKIE) - return; - dir->__flags &= (dirent_isroot | dirent_get_d_ino | dirent_set_d_ino); - return ((fhandler_base *) dir->__fh)->seekdir (dir, loc); -} - -/* seekdir */ -extern "C" void -seekdir (DIR *dir, _off_t loc) -{ - seekdir64 (dir, (_off64_t)loc); -} - -/* rewinddir: POSIX 5.1.2.1 */ -extern "C" void -rewinddir (DIR *dir) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return; - - if (dir->__d_cookie != __DIRENT_COOKIE) - return; - dir->__flags &= (dirent_isroot | dirent_get_d_ino | dirent_set_d_ino); - return ((fhandler_base *) dir->__fh)->rewinddir (dir); -} - -/* closedir: POSIX 5.1.2.1 */ -extern "C" int -closedir (DIR *dir) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - if (dir->__d_cookie != __DIRENT_COOKIE) - { - set_errno (EBADF); - syscall_printf ("-1 = closedir (%p)", dir); - return -1; - } - - /* Reset the marker in case the caller tries to use `dir' again. */ - dir->__d_cookie = 0; - - int res = ((fhandler_base *) dir->__fh)->closedir (dir); - - cygheap->fdtab.release (dir->__d_fd); - - free (dir->__d_dirname); - free (dir->__d_dirent); - free (dir); - syscall_printf ("%d = closedir (%p)", res); - return res; -} - -/* mkdir: POSIX 5.4.1.1 */ -extern "C" int -mkdir (const char *dir, mode_t mode) -{ - int res = -1; - fhandler_base *fh = NULL; - - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - if (!(fh = build_fh_name (dir, NULL, PC_SYM_NOFOLLOW))) - goto done; /* errno already set */; - - if (fh->error ()) - { - debug_printf ("got %d error from build_fh_name", fh->error ()); - set_errno (fh->error ()); - } - else if (has_dot_last_component (dir)) - set_errno (fh->exists () ? EEXIST : ENOENT); - else if (!fh->mkdir (mode)) - res = 0; - delete fh; - - done: - syscall_printf ("%d = mkdir (%s, %d)", res, dir, mode); - return res; -} - -/* rmdir: POSIX 5.5.2.1 */ -extern "C" int -rmdir (const char *dir) -{ - int res = -1; - fhandler_base *fh = NULL; - - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - if (!(fh = build_fh_name (dir, NULL, PC_SYM_NOFOLLOW))) - goto done; /* errno already set */; - - if (fh->error ()) - { - debug_printf ("got %d error from build_fh_name", fh->error ()); - set_errno (fh->error ()); - } - else if (has_dot_last_component (dir)) - set_errno (fh->exists () ? EINVAL : ENOENT); - else if (!fh->rmdir ()) - res = 0; - - delete fh; - - done: - syscall_printf ("%d = rmdir (%s)", res, dir); - return res; -} diff --git a/winsup/cygwin/dlfcn.cc b/winsup/cygwin/dlfcn.cc deleted file mode 100644 index 5bea77419..000000000 --- a/winsup/cygwin/dlfcn.cc +++ /dev/null @@ -1,169 +0,0 @@ -/* dlfcn.cc - - Copyright 1998, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "perprocess.h" -#include "thread.h" -#include "dlfcn.h" -#include "dll_init.h" -#include "cygtls.h" - -static void __stdcall -set_dl_error (const char *str) -{ - strcpy (_my_tls.locals.dl_buffer, strerror (get_errno ())); - _my_tls.locals.dl_error = 1; -} - -/* Look for an executable file given the name and the environment - variable to use for searching (eg., PATH); returns the full - pathname (static buffer) if found or NULL if not. */ -inline const char * __stdcall -check_path_access (const char *mywinenv, const char *name, path_conv& buf) -{ - return find_exec (name, buf, mywinenv, FE_NNF | FE_NATIVE | FE_CWD | FE_DLL); -} - -/* Search LD_LIBRARY_PATH for dll, if it exists. - Return Windows version of given path. */ -static const char * __stdcall -get_full_path_of_dll (const char* str, char *name) -{ - int len = strlen (str); - - /* empty string or too long to be legal win32 pathname? */ - if (len == 0 || len >= CYG_MAX_PATH) - return str; /* Yes. Let caller deal with it. */ - - const char *ret; - - strcpy (name, str); /* Put it somewhere where we can manipulate it. */ - - /* Add extension if necessary */ - if (str[len - 1] != '.') - { - /* Add .dll only if no extension provided. */ - const char *p = strrchr (str, '.'); - if (!p || strpbrk (p, "\\/")) - strcat (name, ".dll"); - } - - path_conv real_filename; - - if (isabspath (name) || - (ret = check_path_access ("LD_LIBRARY_PATH=", name, real_filename) - ?: check_path_access ("/usr/lib", name, real_filename)) == NULL) - real_filename.check (name, PC_SYM_FOLLOW | PC_NOFULL | PC_NULLEMPTY); /* Convert */ - - if (!real_filename.error) - ret = strcpy (name, real_filename); - else - { - set_errno (real_filename.error); - ret = NULL; - } - - return ret; -} - -void * -dlopen (const char *name, int) -{ - void *ret; - - if (name == NULL) - ret = (void *) GetModuleHandle (NULL); /* handle for the current module */ - else - { - char buf[CYG_MAX_PATH]; - /* handle for the named library */ - const char *fullpath = get_full_path_of_dll (name, buf); - if (!fullpath) - ret = NULL; - else - { - ret = (void *) LoadLibrary (fullpath); - if (ret == NULL) - __seterrno (); - } - } - - if (!ret) - set_dl_error ("dlopen"); - debug_printf ("ret %p", ret); - - return ret; -} - -void * -dlsym (void *handle, const char *name) -{ - void *ret = NULL; - if (handle == RTLD_DEFAULT) - { /* search all modules */ - HANDLE cur_proc = GetCurrentProcess (); - HMODULE *modules; - DWORD needed, i; - if (!EnumProcessModules (cur_proc, NULL, 0, &needed)) - { - dlsym_fail: - set_dl_error ("dlsym"); - return NULL; - } - modules = (HMODULE*) alloca (needed); - if (!EnumProcessModules (cur_proc, modules, needed, &needed)) - goto dlsym_fail; - for (i = 0; i < needed / sizeof (HMODULE); i++) - if ((ret = (void *) GetProcAddress (modules[i], name))) - break; - } - else - ret = (void *) GetProcAddress ((HMODULE)handle, name); - if (!ret) - set_dl_error ("dlsym"); - debug_printf ("ret %p", ret); - return ret; -} - -int -dlclose (void *handle) -{ - int ret = -1; - void *temphandle = (void *) GetModuleHandle (NULL); - if (temphandle == handle || FreeLibrary ((HMODULE) handle)) - ret = 0; - if (ret) - set_dl_error ("dlclose"); - CloseHandle ((HMODULE) temphandle); - return ret; -} - -char * -dlerror () -{ - char *res; - if (!_my_tls.locals.dl_error) - res = NULL; - else - { - _my_tls.locals.dl_error = 0; - res = _my_tls.locals.dl_buffer; - } - return res; -} diff --git a/winsup/cygwin/dll_init.cc b/winsup/cygwin/dll_init.cc deleted file mode 100644 index b1aceec18..000000000 --- a/winsup/cygwin/dll_init.cc +++ /dev/null @@ -1,430 +0,0 @@ -/* dll_init.cc - - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include "cygerrno.h" -#include "perprocess.h" -#include "dll_init.h" -#include "environ.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "pinfo.h" -#include "cygtls.h" - -extern void __stdcall check_sanity_and_sync (per_process *); - -dll_list NO_COPY dlls; - -static bool dll_global_dtors_recorded; - -/* Run destructors for all DLLs on exit. */ -void -dll_global_dtors () -{ - int recorded = dll_global_dtors_recorded; - dll_global_dtors_recorded = false; - if (recorded) - for (dll *d = dlls.istart (DLL_ANY); d; d = dlls.inext ()) - d->p.run_dtors (); -} - -/* Run all constructors associated with a dll */ -void -per_module::run_ctors () -{ - void (**pfunc)() = ctors; - - /* Run ctors backwards, so skip the first entry and find how many - there are, then run them. */ - - if (pfunc) - { - int i; - for (i = 1; pfunc[i]; i++); - - for (int j = i - 1; j > 0; j--) - (pfunc[j]) (); - } -} - -/* Run all destructors associated with a dll */ -void -per_module::run_dtors () -{ - void (**pfunc)() = dtors; - for (int i = 1; pfunc[i]; i++) - (pfunc[i]) (); -} - -/* Initialize an individual DLL */ -int -dll::init () -{ - int ret = 1; - - /* Why didn't we just import this variable? */ - *(p.envptr) = __cygwin_environ; - - /* Don't run constructors or the "main" if we've forked. */ - if (!in_forkee) - { - /* global contructors */ - p.run_ctors (); - - /* entry point of dll (use main of per_process with null args...) */ - if (p.main) - ret = (*(p.main)) (0, 0, 0); - } - - return ret; -} - -/* Look for a dll based on name */ -dll * -dll_list::operator[] (const char *name) -{ - dll *d = &start; - while ((d = d->next) != NULL) - if (strcasematch (name, d->name)) - return d; - - return NULL; -} - -#define RETRIES 1000 - -/* Allocate space for a dll struct contiguous with the just-loaded dll. */ -dll * -dll_list::alloc (HINSTANCE h, per_process *p, dll_type type) -{ - char name[CYG_MAX_PATH]; - DWORD namelen = GetModuleFileName (h, name, sizeof (name)); - - /* Already loaded? */ - dll *d = dlls[name]; - if (d) - { - d->count++; /* Yes. Bump the usage count. */ - return d; /* Return previously allocated pointer. */ - } - - SYSTEM_INFO s1; - GetSystemInfo (&s1); - - int i; - void *s = p->bss_end; - DWORD n; - MEMORY_BASIC_INFORMATION m; - /* Search for space after the DLL */ - for (i = 0; i <= RETRIES; i++, s = (char *) m.BaseAddress + m.RegionSize) - { - if (!VirtualQuery (s, &m, sizeof (m))) - return NULL; /* Can't do it. */ - if (m.State == MEM_FREE) - { - /* Couldn't find any. Uh oh. FIXME: Issue an error? */ - if (i == RETRIES) - return NULL; /* Oh well. Couldn't locate free space. */ - - /* Ensure that this is rounded to the nearest page boundary. - FIXME: Should this be ensured by VirtualQuery? */ - n = (DWORD) m.BaseAddress; - DWORD r = n % s1.dwAllocationGranularity; - - if (r) - n = ((n - r) + s1.dwAllocationGranularity); - - /* First reserve the area of memory, then commit it. */ - if (VirtualAlloc ((void *) n, sizeof (dll), MEM_RESERVE, PAGE_READWRITE)) - d = (dll *) VirtualAlloc ((void *) n, sizeof (dll), MEM_COMMIT, - PAGE_READWRITE); - if (d) - break; - } - } - - /* Did we succeed? */ - if (d == NULL) - { /* Nope. */ -#ifdef DEBUGGING - system_printf ("VirtualAlloc failed, %E"); -#endif - __seterrno (); - return NULL; - } - - /* Now we've allocated a block of information. Fill it in with the supplied - info about this DLL. */ - d->count = 1; - d->namelen = namelen; - strcpy (d->name, name); - d->handle = h; - d->p = p; - d->type = type; - if (end == NULL) - end = &start; /* Point to "end" of dll chain. */ - end->next = d; /* Standard linked list stuff. */ - d->next = NULL; - d->prev = end; - end = d; - tot++; - if (type == DLL_LOAD) - loaded_dlls++; - return d; -} - -/* Detach a DLL from the chain. */ -void -dll_list::detach (void *retaddr) -{ - if (!myself || exit_state) - return; - MEMORY_BASIC_INFORMATION m; - if (!VirtualQuery (retaddr, &m, sizeof m)) - return; - HMODULE h = (HMODULE) m.AllocationBase; - - dll *d = &start; - while ((d = d->next)) - if (d->handle != h) - continue; - else if (d->count <= 0) - system_printf ("WARNING: trying to detach an already detached dll ..."); - else if (--d->count == 0) - { - d->p.run_dtors (); - d->prev->next = d->next; - if (d->next) - d->next->prev = d->prev; - if (d->type == DLL_LOAD) - loaded_dlls--; - if (end == d) - end = d->prev; - VirtualFree (d, 0, MEM_RELEASE); - break; - } -} - -/* Initialization for all linked DLLs, called by dll_crt0_1. */ -void -dll_list::init () -{ - dll_global_dtors_recorded = true; - - /* Walk the dll chain, initializing each dll */ - dll *d = &start; - while ((d = d->next)) - d->init (); -} - -#define A64K (64 * 1024) - -/* Mark every memory address up to "here" as reserved. This may force - Windows NT to load a DLL in the next available, lowest slot. */ -static void -reserve_upto (const char *name, DWORD here) -{ - DWORD size; - MEMORY_BASIC_INFORMATION mb; - for (DWORD start = 0x10000; start < here; start += size) - if (!VirtualQuery ((void *) start, &mb, sizeof (mb))) - size = A64K; - else - { - size = A64K * ((mb.RegionSize + A64K - 1) / A64K); - start = A64K * (((DWORD) mb.BaseAddress + A64K - 1) / A64K); - - if (start + size > here) - size = here - start; - if (mb.State == MEM_FREE && - !VirtualAlloc ((void *) start, size, MEM_RESERVE, PAGE_NOACCESS)) - api_fatal ("couldn't allocate memory %p(%d) for '%s' alignment, %E\n", - start, size, name); - } -} - -/* Release all of the memory previously allocated by "upto" above. - Note that this may also free otherwise reserved memory. If that becomes - a problem, we'll have to keep track of the memory that we reserve above. */ -static void -release_upto (const char *name, DWORD here) -{ - DWORD size; - MEMORY_BASIC_INFORMATION mb; - for (DWORD start = 0x10000; start < here; start += size) - if (!VirtualQuery ((void *) start, &mb, sizeof (mb))) - size = 64 * 1024; - else - { - size = mb.RegionSize; - if (!(mb.State == MEM_RESERVE && mb.AllocationProtect == PAGE_NOACCESS && - (((void *) start < cygheap->user_heap.base - || (void *) start > cygheap->user_heap.top) && - ((void *) start < (void *) cygheap - | (void *) start > (void *) ((char *) cygheap + CYGHEAPSIZE))))) - continue; - if (!VirtualFree ((void *) start, 0, MEM_RELEASE)) - api_fatal ("couldn't release memory %p(%d) for '%s' alignment, %E\n", - start, size, name); - } -} - -/* Reload DLLs after a fork. Iterates over the list of dynamically loaded DLLs - and attempts to load them in the same place as they were loaded in the parent. */ -void -dll_list::load_after_fork (HANDLE parent, dll *first) -{ - int try2 = 0; - dll d; - - void *next = first; - while (next) - { - DWORD nb; - /* Read the dll structure from the parent. */ - if (!ReadProcessMemory (parent, next, &d, sizeof (dll), &nb) || - nb != sizeof (dll)) - return; - - /* We're only interested in dynamically loaded dlls. - Hopefully, this function wouldn't even have been called unless - the parent had some of those. */ - if (d.type == DLL_LOAD) - { - bool unload = true; - HMODULE h = LoadLibraryEx (d.name, NULL, DONT_RESOLVE_DLL_REFERENCES); - - if (!h) - system_printf ("can't reload %s", d.name); - /* See if DLL will load in proper place. If so, free it and reload - it the right way. - It sort of stinks that we can't invert the order of the FreeLibrary - and LoadLibrary since Microsoft documentation seems to imply that that - should do what we want. However, since the library was loaded above, - the second LoadLibrary does not execute it's startup code unless it - is first unloaded. */ - else if (h == d.handle) - { - if (unload) - { - FreeLibrary (h); - LoadLibrary (d.name); - } - } - else if (try2) - api_fatal ("unable to remap %s to same address as parent(%p) != %p", - d.name, d.handle, h); - else - { - /* It loaded in the wrong place. Dunno why this happens but it always - seems to happen when there are multiple DLLs attempting to load into - the same address space. In the "forked" process, the second DLL always - loads into a different location. */ - FreeLibrary (h); - /* Block all of the memory up to the new load address. */ - reserve_upto (d.name, (DWORD) d.handle); - try2 = 1; /* And try */ - continue; /* again. */ - } - /* If we reached here, and try2 is set, then there is a lot of memory to - release. */ - if (try2) - { - release_upto (d.name, (DWORD) d.handle); - try2 = 0; - } - } - next = d.next; /* Get the address of the next DLL. */ - } - in_forkee = false; -} - -extern "C" int -dll_dllcrt0 (HMODULE h, per_process *p) -{ - if (p == NULL) - p = &__cygwin_user_data; - else - *(p->impure_ptr_ptr) = __cygwin_user_data.impure_ptr; - bool initializing = in_forkee || cygwin_finished_initializing; - - /* Partially initialize Cygwin guts for non-cygwin apps. */ - if (dynamically_loaded && user_data->magic_biscuit == 0) - dll_crt0 (p); - else - check_sanity_and_sync (p); - - dll_type type; - - /* If this function is called before cygwin has finished - initializing, then the DLL must be a cygwin-aware DLL - that was explicitly linked into the program rather than - a dlopened DLL. */ - if (!initializing) - type = DLL_LINK; - else - { - type = DLL_LOAD; - dlls.reload_on_fork = 1; - } - - /* Allocate and initialize space for the DLL. */ - dll *d = dlls.alloc (h, p, type); - - /* If d == NULL, then something is broken. - Otherwise, if we've finished initializing, it's ok to - initialize the DLL. If we haven't finished initializing, - it may not be safe to call the dll's "main" since not - all of cygwin's internal structures may have been set up. */ - if (!d || (initializing && !d->init ())) - return -1; - - return (DWORD) d; -} - -/* OBSOLETE: This function is obsolescent and will go away in the - future. Cygwin can now handle being loaded from a noncygwin app - using the same entry point. */ - -extern "C" int -dll_noncygwin_dllcrt0 (HMODULE h, per_process *p) -{ - return dll_dllcrt0 (h, p); -} - -extern "C" void -cygwin_detach_dll (dll *) -{ - HANDLE retaddr; - if (_my_tls.isinitialized ()) - retaddr = (HANDLE) _my_tls.retaddr (); - else - retaddr = __builtin_return_address (0); - dlls.detach (retaddr); -} - -extern "C" void -dlfork (int val) -{ - dlls.reload_on_fork = val; -} - -/* Called from various places to update all of the individual - ideas of the environ block. Explain to me again why we didn't - just import __cygwin_environ? */ -void __stdcall -update_envptrs () -{ - for (dll *d = dlls.istart (DLL_ANY); d; d = dlls.inext ()) - *(d->p.envptr) = __cygwin_environ; - *main_environ = __cygwin_environ; -} diff --git a/winsup/cygwin/dll_init.h b/winsup/cygwin/dll_init.h deleted file mode 100644 index 2c4fb49c3..000000000 --- a/winsup/cygwin/dll_init.h +++ /dev/null @@ -1,92 +0,0 @@ -/* dll_init.h - - Copyright 1998, 1999, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -struct per_module -{ - char ***envptr; - void (**ctors)(void); - void (**dtors)(void); - void *data_start; - void *data_end; - void *bss_start; - void *bss_end; - int (*main)(int, char **, char **); - per_module &operator = (per_process *p) - { - envptr = p->envptr; - ctors = p->ctors; - dtors = p->dtors; - data_start = p->data_start; - data_end = p->data_end; - bss_start = p->bss_start; - bss_end = p->bss_end; - main = p->main; - return *this; - } - void run_ctors (); - void run_dtors (); -}; - - -typedef enum -{ - DLL_NONE, - DLL_LINK, - DLL_LOAD, - DLL_ANY -} dll_type; - -struct dll -{ - struct dll *next, *prev; - per_module p; - HMODULE handle; - int count; - dll_type type; - int namelen; - char name[CYG_MAX_PATH]; - void detach (); - int init (); -}; - -#define MAX_DLL_BEFORE_INIT 100 - -class dll_list -{ - dll *end; - dll *hold; - dll_type hold_type; -public: - dll start; - int tot; - int loaded_dlls; - int reload_on_fork; - dll *operator [] (const char *name); - dll *alloc (HINSTANCE, per_process *, dll_type); - void detach (void *); - void init (); - void load_after_fork (HANDLE, dll *); - dll *inext () - { - while ((hold = hold->next)) - if (hold_type == DLL_ANY || hold->type == hold_type) - break; - return hold; - } - dll *istart (dll_type t) - { - hold_type = t; - hold = &start; - return inext (); - } -}; - -extern dll_list dlls; -void dll_global_dtors (); diff --git a/winsup/cygwin/dll_init.sgml b/winsup/cygwin/dll_init.sgml deleted file mode 100644 index a66c43cb6..000000000 --- a/winsup/cygwin/dll_init.sgml +++ /dev/null @@ -1,11 +0,0 @@ - - -cygwin_detach_dll - - -extern "C" void -cygwin_detach_dll -int dll_index - - - diff --git a/winsup/cygwin/dllfixdbg b/winsup/cygwin/dllfixdbg deleted file mode 100755 index 909d11355..000000000 --- a/winsup/cygwin/dllfixdbg +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/perl -# Copyright 2006 Red Hat, Inc. -# -# This file is part of Cygwin. -# -# This software is a copyrighted work licensed under the terms of the -# Cygwin license. Please consult the file "CYGWIN_LICENSE" for -# details. -# -use integer; -use strict; -sub xit($@); -my $strip = $ARGV[0] eq '-s'; -shift if $strip; -my $objdump = shift; -my @objcopy = ((shift)); -my $dll = shift; -my $dbg = shift; -xit 0, @objcopy, '-j', '.stab', '-j', '.stabstr', $dll, $dbg; -xit 0, @objcopy, '-g', '--add-gnu-debuglink=' . $dbg, $dll; -open(OBJDUMP, '-|', "$objdump --headers $dll"); -my %section; -while () { - my ($idx, $name, $size, $vma, $lma, $fileoff, $algn) = /^\s*(\d+)\s+(\.\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s*$/; - if ($name eq '.gnu_debuglink') { - push(@objcopy, '--set-section-flag', '.gnu_debuglink=contents,readonly,debug,noload'); - } elsif ($name eq '.gnu_debuglink_overlay') { - push (@objcopy, '-R', '.gnu_debuglink_overlay'); - $section{'.gnu_debuglink'}{-idx} = $idx if $section{'.gnu_debuglink'}; - next; - } - defined($idx) and - $section{$name} = {-idx=>int($idx), -size=>hex($size), -vma=>hex($vma), -lma=>hex($lma), -fileoff=>hex($fileoff), - -algn=>0x00001000}; -} -close OBJDUMP; -my $vma; -for my $k (sort {$section{$a}{-idx} <=> $section{$b}{-idx}} keys %section) { - if ($strip && $k =~ /\.(?:stab|debug)/o) { - push(@objcopy, '-R', $k); - next; - } - if (!defined($vma)) { - $vma = $section{$k}{-vma}; - } - if ($vma != $section{$k}{-vma}) { - my $newvma = align($vma, $section{$k}{-algn}); - if ($newvma != $vma) { - printf STDERR "$0: ERROR $k VMA 0x%08x != 0x%08x\n", $vma, $newvma; - exit 1; - } - push(@objcopy, '--change-section-address', sprintf "$k=0x%08x", $vma); - } - $vma = align($vma + $section{$k}{-size}, $section{$k}{-algn}); -} -warn "$0: ERROR final VMA (" . sprintf("0x%08x", $vma) . ") not on 64K boundary\n" if $vma != align($vma, 64 * 1024); -push(@objcopy, $dll, @ARGV); -xit 1, @objcopy; -sub align { - my $n = $_[0]; - my $align = $_[1] - 1; - return ($n + $align) & ~$align; -} - -sub xit($@) { - my $execit = shift; - print "+ @_\n"; - if ($execit) { - exec @_ or die "$0: couldn't exec $_[0] - $!\n"; - } else { - system @_ and die "$0: couldn't exec $_[0] - $!\n"; - } -} diff --git a/winsup/cygwin/dlmalloc.c b/winsup/cygwin/dlmalloc.c deleted file mode 100644 index b64bed8eb..000000000 --- a/winsup/cygwin/dlmalloc.c +++ /dev/null @@ -1,3815 +0,0 @@ -/* - * To do: - * - strdup? maybe shouldn't bother yet, it seems difficult to get includes - * right using dlmalloc.h - * - add STD_C prototyping - * - adhere to comment conventions - * - maybe fix ALLOCFILL vs. MOATFILL in do_init_realloced_chunk() - * - keep a list of mmaped regions for checking in malloc_update_mallinfo() - * - I think memalign() is wrong: it aligns the chunk rather than the memory - * portion of the chunk. - * - "& -alignment" in memalign() is suspect: should use "& ~alignment" - * instead? - * - malloc.h doesn't need malloc_COPY or probably a bunch of other stuff - * - add mallopt options for e.g. fill? - * - come up with a non-BBC version of M_C - * - document necessity of checking chunk address in do_check_chunk prior to - * accessing any of its fields - * Done: - * minor speedup due to extend check before mremap - * minor speedup due to returning malloc() result in memalign() if aligned - * made malloc_update_mallinfo() check alloced regions at start of sbrk area - * fixed bug: After discovering foreign sbrk, if old_top was MINSIZE, would - * reduce old_top_size to 0, thus making inuse(old_top) return 0; other - * functions would consequently attempt to access old_top->{fd,bk}, which - * were invalid. This is in malloc_extend_top(), in the "double - * fencepost" section. - * Documentation: - * malloc_usable_size(P) is equivalent to realloc(P, malloc_usable_size(P)) - * - * $Log$ - * Revision 1.9 2004/05/12 16:21:18 cgf - * remove keyword stuff - * - * Revision 1.1 1997/12/24 18:34:47 nsd - * Initial revision - * - */ -/* ---------- To make a malloc.h, start cutting here ------------ */ - -/* - A version of malloc/free/realloc written by Doug Lea and released to the - public domain. Send questions/comments/complaints/performance data - to dl@cs.oswego.edu - -* VERSION 2.6.4 Thu Nov 28 07:54:55 1996 Doug Lea (dl at gee) - - Note: There may be an updated version of this malloc obtainable at - ftp://g.oswego.edu/pub/misc/malloc.c - Check before installing! - -* Why use this malloc? - - This is not the fastest, most space-conserving, most portable, or - most tunable malloc ever written. However it is among the fastest - while also being among the most space-conserving, portable and tunable. - Consistent balance across these factors results in a good general-purpose - allocator. For a high-level description, see - http://g.oswego.edu/dl/html/malloc.html - -* Synopsis of public routines - - (Much fuller descriptions are contained in the program documentation below.) - - malloc(size_t n); - Return a pointer to a newly allocated chunk of at least n bytes, or null - if no space is available. - free(Void_t* p); - Release the chunk of memory pointed to by p, or no effect if p is null. - realloc(Void_t* p, size_t n); - Return a pointer to a chunk of size n that contains the same data - as does chunk p up to the minimum of (n, p's size) bytes, or null - if no space is available. The returned pointer may or may not be - the same as p. If p is null, equivalent to malloc. Unless the - #define realloc_ZERO_BYTES_FREES below is set, realloc with a - size argument of zero (re)allocates a minimum-sized chunk. - memalign(size_t alignment, size_t n); - Return a pointer to a newly allocated chunk of n bytes, aligned - in accord with the alignment argument, which must be a power of - two. - valloc(size_t n); - Equivalent to memalign(pagesize, n), where pagesize is the page - size of the system (or as near to this as can be figured out from - all the includes/defines below.) - pvalloc(size_t n); - Equivalent to valloc(minimum-page-that-holds(n)), that is, - round up n to nearest pagesize. - calloc(size_t unit, size_t quantity); - Returns a pointer to quantity * unit bytes, with all locations - set to zero. - cfree(Void_t* p); - Equivalent to free(p). - malloc_trim(size_t pad); - Release all but pad bytes of freed top-most memory back - to the system. Return 1 if successful, else 0. - malloc_usable_size(Void_t* p); - Report the number usable allocated bytes associated with allocated - chunk p. This may or may not report more bytes than were requested, - due to alignment and minimum size constraints. - malloc_stats(); - Prints brief summary statistics on stderr. - mallinfo() - Returns (by copy) a struct containing various summary statistics. - mallopt(int parameter_number, int parameter_value) - Changes one of the tunable parameters described below. Returns - 1 if successful in changing the parameter, else 0. - -* Vital statistics: - - Alignment: 8-byte - 8 byte alignment is currently hardwired into the design. This - seems to suffice for all current machines and C compilers. - - Assumed pointer representation: 4 or 8 bytes - Code for 8-byte pointers is untested by me but has worked - reliably by Wolfram Gloger, who contributed most of the - changes supporting this. - - Assumed size_t representation: 4 or 8 bytes - Note that size_t is allowed to be 4 bytes even if pointers are 8. - - Minimum overhead per allocated chunk: 4 or 8 bytes - Each malloced chunk has a hidden overhead of 4 bytes holding size - and status information. - - Minimum allocated size: 4-byte ptrs: 16 bytes (including 4 overhead) - 8-byte ptrs: 24/32 bytes (including, 4/8 overhead) - - When a chunk is freed, 12 (for 4byte ptrs) or 20 (for 8 byte - ptrs but 4 byte size) or 24 (for 8/8) additional bytes are - needed; 4 (8) for a trailing size field - and 8 (16) bytes for free list pointers. Thus, the minimum - allocatable size is 16/24/32 bytes. - - Even a request for zero bytes (i.e., malloc(0)) returns a - pointer to something of the minimum allocatable size. - - Maximum allocated size: 4-byte size_t: 2^31 - 8 bytes - 8-byte size_t: 2^63 - 16 bytes - - It is assumed that (possibly signed) size_t bit values suffice to - represent chunk sizes. `Possibly signed' is due to the fact - that `size_t' may be defined on a system as either a signed or - an unsigned type. To be conservative, values that would appear - as negative numbers are avoided. - Requests for sizes with a negative sign bit will return a - minimum-sized chunk. - - Maximum overhead wastage per allocated chunk: normally 15 bytes - - Alignnment demands, plus the minimum allocatable size restriction - make the normal worst-case wastage 15 bytes (i.e., up to 15 - more bytes will be allocated than were requested in malloc), with - two exceptions: - 1. Because requests for zero bytes allocate non-zero space, - the worst case wastage for a request of zero bytes is 24 bytes. - 2. For requests >= mmap_threshold that are serviced via - mmap(), the worst case wastage is 8 bytes plus the remainder - from a system page (the minimal mmap unit); typically 4096 bytes. - -* Limitations - - Here are some features that are NOT currently supported - - * No user-definable hooks for callbacks and the like. - * No automated mechanism for fully checking that all accesses - to malloced memory stay within their bounds. - * No support for compaction. - -* Synopsis of compile-time options: - - People have reported using previous versions of this malloc on all - versions of Unix, sometimes by tweaking some of the defines - below. It has been tested most extensively on Solaris and - Linux. It is also reported to work on WIN32 platforms. - People have also reported adapting this malloc for use in - stand-alone embedded systems. - - The implementation is in straight, hand-tuned ANSI C. Among other - consequences, it uses a lot of macros. Because of this, to be at - all usable, this code should be compiled using an optimizing compiler - (for example gcc -O2) that can simplify expressions and control - paths. - - __STD_C (default: derived from C compiler defines) - Nonzero if using ANSI-standard C compiler, a C++ compiler, or - a C compiler sufficiently close to ANSI to get away with it. - DEBUG (default: NOT defined) - Define to enable debugging. Adds fairly extensive assertion-based - checking to help track down memory errors, but noticeably slows down - execution. - realloc_ZERO_BYTES_FREES (default: NOT defined) - Define this if you think that realloc(p, 0) should be equivalent - to free(p). Otherwise, since malloc returns a unique pointer for - malloc(0), so does realloc(p, 0). - HAVE_memcpy (default: defined) - Define if you are not otherwise using ANSI STD C, but still - have memcpy and memset in your C library and want to use them. - Otherwise, simple internal versions are supplied. - USE_memcpy (default: 1 if HAVE_memcpy is defined, 0 otherwise) - Define as 1 if you want the C library versions of memset and - memcpy called in realloc and calloc (otherwise macro versions are used). - At least on some platforms, the simple macro versions usually - outperform libc versions. - HAVE_MMAP (default: defined as 1) - Define to non-zero to optionally make malloc() use mmap() to - allocate very large blocks. - HAVE_MREMAP (default: defined as 0 unless Linux libc set) - Define to non-zero to optionally make realloc() use mremap() to - reallocate very large blocks. - malloc_getpagesize (default: derived from system #includes) - Either a constant or routine call returning the system page size. - HAVE_USR_INCLUDE_malloc_H (default: NOT defined) - Optionally define if you are on a system with a /usr/include/malloc.h - that declares struct mallinfo. It is not at all necessary to - define this even if you do, but will ensure consistency. - INTERNAL_SIZE_T (default: size_t) - Define to a 32-bit type (probably `unsigned int') if you are on a - 64-bit machine, yet do not want or need to allow malloc requests of - greater than 2^31 to be handled. This saves space, especially for - very small chunks. - INTERNAL_LINUX_C_LIB (default: NOT defined) - Defined only when compiled as part of Linux libc. - Also note that there is some odd internal name-mangling via defines - (for example, internally, `malloc' is named `mALLOc') needed - when compiling in this case. These look funny but don't otherwise - affect anything. - WIN32 (default: undefined) - Define this on MS win (95, nt) platforms to compile in sbrk emulation. - LACKS_UNISTD_H (default: undefined) - Define this if your system does not have a . - MORECORE (default: sbrk) - The name of the routine to call to obtain more memory from the system. - MORECORE_FAILURE (default: -1) - The value returned upon failure of MORECORE. - MORECORE_CLEARS (default 0) - True (1) if the routine mapped to MORECORE zeroes out memory (which - holds for sbrk). - DEFAULT_TRIM_THRESHOLD - DEFAULT_TOP_PAD - DEFAULT_MMAP_THRESHOLD - DEFAULT_MMAP_MAX - Default values of tunable parameters (described in detail below) - controlling interaction with host system routines (sbrk, mmap, etc). - These values may also be changed dynamically via mallopt(). The - preset defaults are those that give best performance for typical - programs/systems. - - -*/ - - - - -/* Preliminaries */ - - -#ifndef __STD_C -#ifdef __STDC__ -#define __STD_C 1 -#else -#if __cplusplus -#define __STD_C 1 -#else -#define __STD_C 0 -#endif /*__cplusplus*/ -#endif /*__STDC__*/ -#endif /*__STD_C*/ - -#ifndef Void_t -#if __STD_C -#define Void_t void -#else -#define Void_t char -#endif -#endif /*Void_t*/ - -#define __MALLOC_H_INCLUDED - -#if __STD_C -#include /* for size_t */ -#else -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "cygmalloc.h" -#define __INSIDE_CYGWIN__ -#include /* needed for malloc_stats */ -#include - -/* - Compile-time options -*/ - - -/* - Debugging: - - Because freed chunks may be overwritten with link fields, this - malloc will often die when freed memory is overwritten by user - programs. This can be very effective (albeit in an annoying way) - in helping track down dangling pointers. - - If you compile with -DDEBUG, a number of assertion checks are - enabled that will catch more memory errors. You probably won't be - able to make much sense of the actual assertion errors, but they - should help you locate incorrectly overwritten memory. The - checking is fairly extensive, and will slow down execution - noticeably. Calling malloc_stats or mallinfo with DEBUG set will - attempt to check every non-mmapped allocated and free chunk in the - course of computing the summmaries. (By nature, mmapped regions - cannot be checked very much automatically.) - - Setting DEBUG may also be helpful if you are trying to modify - this code. The assertions in the check routines spell out in more - detail the assumptions and invariants underlying the algorithms. - -*/ - -#ifdef MALLOC_DEBUG -#define DEBUG 1 -#define DEBUG1 1 -#define DEBUG2 1 -#define DEBUG3 1 -#endif - -#if DEBUG -#include -#else -#define assert(x) ((void)0) -#endif - -/* - INTERNAL_SIZE_T is the word-size used for internal bookkeeping - of chunk sizes. On a 64-bit machine, you can reduce malloc - overhead by defining INTERNAL_SIZE_T to be a 32 bit `unsigned int' - at the expense of not being able to handle requests greater than - 2^31. This limitation is hardly ever a concern; you are encouraged - to set this. However, the default version is the same as size_t. -*/ - -#ifndef INTERNAL_SIZE_T -#define INTERNAL_SIZE_T size_t -#endif - -/* - realloc_ZERO_BYTES_FREES should be set if a call to - realloc with zero bytes should be the same as a call to free. - Some people think it should. Otherwise, since this malloc - returns a unique pointer for malloc(0), so does realloc(p, 0). -*/ - - -/* #define realloc_ZERO_BYTES_FREES */ - - -/* - WIN32 causes an emulation of sbrk to be compiled in - mmap-based options are not currently supported in WIN32. -*/ - -/* #define WIN32 */ -#ifdef WIN32 -#define MORECORE wsbrk -#define HAVE_MMAP 0 -#endif - - -/* - HAVE_memcpy should be defined if you are not otherwise using - ANSI STD C, but still have memcpy and memset in your C library - and want to use them in calloc and realloc. Otherwise simple - macro versions are defined here. - - USE_memcpy should be defined as 1 if you actually want to - have memset and memcpy called. People report that the macro - versions are often enough faster than libc versions on many - systems that it is better to use them. - -*/ - -#define HAVE_memcpy - -#ifndef USE_memcpy -#ifdef HAVE_memcpy -#define USE_memcpy 1 -#else -#define USE_memcpy 0 -#endif -#endif - -#if (__STD_C || defined(HAVE_memcpy)) - -#if __STD_C -void* memset(void*, int, size_t); -void* memcpy(void*, const void*, size_t); -#else -Void_t* memset(); -Void_t* memcpy(); -#endif -#endif - -#ifndef DEBUG3 - -#if USE_memcpy - -/* The following macros are only invoked with (2n+1)-multiples of - INTERNAL_SIZE_T units, with a positive integer n. This is exploited - for fast inline execution when n is small. */ - -#define malloc_ZERO(charp, nbytes) \ -do { \ - INTERNAL_SIZE_T mzsz = (nbytes); \ - if(mzsz <= 9*sizeof(mzsz)) { \ - INTERNAL_SIZE_T* mz = (INTERNAL_SIZE_T*) (charp); \ - if(mzsz >= 5*sizeof(mzsz)) { *mz++ = 0; \ - *mz++ = 0; \ - if(mzsz >= 7*sizeof(mzsz)) { *mz++ = 0; \ - *mz++ = 0; \ - if(mzsz >= 9*sizeof(mzsz)) { *mz++ = 0; \ - *mz++ = 0; }}} \ - *mz++ = 0; \ - *mz++ = 0; \ - *mz = 0; \ - } else memset((charp), 0, mzsz); \ -} while(0) - -#define malloc_COPY(dest,src,nbytes) \ -do { \ - INTERNAL_SIZE_T mcsz = (nbytes); \ - if(mcsz <= 9*sizeof(mcsz)) { \ - INTERNAL_SIZE_T* mcsrc = (INTERNAL_SIZE_T*) (src); \ - INTERNAL_SIZE_T* mcdst = (INTERNAL_SIZE_T*) (dest); \ - if(mcsz >= 5*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \ - *mcdst++ = *mcsrc++; \ - if(mcsz >= 7*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \ - *mcdst++ = *mcsrc++; \ - if(mcsz >= 9*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \ - *mcdst++ = *mcsrc++; }}} \ - *mcdst++ = *mcsrc++; \ - *mcdst++ = *mcsrc++; \ - *mcdst = *mcsrc ; \ - } else memcpy(dest, src, mcsz); \ -} while(0) - -#else /* !USE_memcpy */ - -/* Use Duff's device for good zeroing/copying performance. */ - -#define malloc_ZERO(charp, nbytes) \ -do { \ - INTERNAL_SIZE_T* mzp = (INTERNAL_SIZE_T*)(charp); \ - long mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T), mcn; \ - if (mctmp < 8) mcn = 0; else { mcn = (mctmp-1)/8; mctmp %= 8; } \ - switch (mctmp) { \ - case 0: for(;;) { *mzp++ = 0; \ - case 7: *mzp++ = 0; \ - case 6: *mzp++ = 0; \ - case 5: *mzp++ = 0; \ - case 4: *mzp++ = 0; \ - case 3: *mzp++ = 0; \ - case 2: *mzp++ = 0; \ - case 1: *mzp++ = 0; if(mcn <= 0) break; mcn--; } \ - } \ -} while(0) - -#define malloc_COPY(dest,src,nbytes) \ -do { \ - INTERNAL_SIZE_T* mcsrc = (INTERNAL_SIZE_T*) src; \ - INTERNAL_SIZE_T* mcdst = (INTERNAL_SIZE_T*) dest; \ - long mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T), mcn; \ - if (mctmp < 8) mcn = 0; else { mcn = (mctmp-1)/8; mctmp %= 8; } \ - switch (mctmp) { \ - case 0: for(;;) { *mcdst++ = *mcsrc++; \ - case 7: *mcdst++ = *mcsrc++; \ - case 6: *mcdst++ = *mcsrc++; \ - case 5: *mcdst++ = *mcsrc++; \ - case 4: *mcdst++ = *mcsrc++; \ - case 3: *mcdst++ = *mcsrc++; \ - case 2: *mcdst++ = *mcsrc++; \ - case 1: *mcdst++ = *mcsrc++; if(mcn <= 0) break; mcn--; } \ - } \ -} while(0) - -#endif - -#else /* DEBUG3 */ - -/* The trailing moat invalidates the above prediction about the nbytes - parameter to malloc_ZERO and malloc_COPY. */ - -#define malloc_ZERO(charp, nbytes) \ -do { \ - char *mzp = (char *)(charp); \ - long mzn = (nbytes); \ - while (mzn--) \ - *mzp++ = '\0'; \ -} while(0) - -#define malloc_COPY(dest,src,nbytes) \ -do { \ - char *mcsrc = (char *)(src); \ - char *mcdst = (char *)(dest); \ - long mcn = (nbytes); \ - while (mcn--) \ - *mcdst++ = *mcsrc++; \ -} while(0) - -#endif /* DEBUG3 */ - -/* - Define HAVE_MMAP to optionally make malloc() use mmap() to - allocate very large blocks. These will be returned to the - operating system immediately after a free(). -*/ - -#ifndef HAVE_MMAP -#define HAVE_MMAP 1 -#endif - -/* - Define HAVE_MREMAP to make realloc() use mremap() to re-allocate - large blocks. This is currently only possible on Linux with - kernel versions newer than 1.3.77. -*/ - -#ifndef HAVE_MREMAP -#ifdef INTERNAL_LINUX_C_LIB -#define HAVE_MREMAP 1 -#else -#define HAVE_MREMAP 0 -#endif -#endif - -#if HAVE_MMAP - -#include -#include -#include - -#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) -#define MAP_ANONYMOUS MAP_ANON -#endif - -#endif /* HAVE_MMAP */ - -/* - Access to system page size. To the extent possible, this malloc - manages memory from the system in page-size units. - - The following mechanics for getpagesize were adapted from - bsd/gnu getpagesize.h -*/ - -#ifndef LACKS_UNISTD_H -# include -#endif - -#ifndef malloc_getpagesize -# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ -# ifndef _SC_PAGE_SIZE -# define _SC_PAGE_SIZE _SC_PAGESIZE -# endif -# endif -# ifdef _SC_PAGE_SIZE -# define malloc_getpagesize sysconf(_SC_PAGE_SIZE) -# else -# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) -# if __STD_C - extern size_t getpagesize(void); -# else - extern size_t getpagesize(); -# endif -# define malloc_getpagesize getpagesize() -# else -# include -# ifdef EXEC_PAGESIZE -# define malloc_getpagesize EXEC_PAGESIZE -# else -# ifdef NBPG -# ifndef CLSIZE -# define malloc_getpagesize NBPG -# else -# define malloc_getpagesize (NBPG * CLSIZE) -# endif -# else -# ifdef NBPC -# define malloc_getpagesize NBPC -# else -# ifdef PAGESIZE -# define malloc_getpagesize PAGESIZE -# else -# define malloc_getpagesize (4096) /* just guess */ -# endif -# endif -# endif -# endif -# endif -# endif -#endif - - - -/* - - This version of malloc supports the standard SVID/XPG mallinfo - routine that returns a struct containing the same kind of - information you can get from malloc_stats. It should work on - any SVID/XPG compliant system that has a /usr/include/malloc.h - defining struct mallinfo. (If you'd like to install such a thing - yourself, cut out the preliminary declarations as described above - and below and save them in a malloc.h file. But there's no - compelling reason to bother to do this.) - - The main declaration needed is the mallinfo struct that is returned - (by-copy) by mallinfo(). The SVID/XPG malloinfo struct contains a - bunch of fields, most of which are not even meaningful in this - version of malloc. Some of these fields are are instead filled by - mallinfo() with other numbers that might possibly be of interest. - - HAVE_USR_INCLUDE_malloc_H should be set if you have a - /usr/include/malloc.h file that includes a declaration of struct - mallinfo. If so, it is included; else an SVID2/XPG2 compliant - version is declared below. These must be precisely the same for - mallinfo() to work. - -*/ - -/* #define HAVE_USR_INCLUDE_malloc_H */ - -#if HAVE_USR_INCLUDE_malloc_H -#include "/usr/include/malloc.h" -#else - -/* SVID2/XPG mallinfo structure */ - -struct mallinfo { - int arena; /* total space allocated from system */ - int ordblks; /* number of non-inuse chunks */ - int smblks; /* unused -- always zero */ - int hblks; /* number of mmapped regions */ - int hblkhd; /* total space in mmapped regions */ - int usmblks; /* unused -- always zero */ - int fsmblks; /* unused -- always zero */ - int uordblks; /* total allocated space */ - int fordblks; /* total non-inuse space */ - int keepcost; /* top-most, releasable (via malloc_trim) space */ -}; - -/* SVID2/XPG mallopt options */ - -#define M_MXFAST 1 /* UNUSED in this malloc */ -#define M_NLBLKS 2 /* UNUSED in this malloc */ -#define M_GRAIN 3 /* UNUSED in this malloc */ -#define M_KEEP 4 /* UNUSED in this malloc */ - -#endif - -/* mallopt options that actually do something */ - -#define M_TRIM_THRESHOLD -1 -#define M_TOP_PAD -2 -#define M_MMAP_THRESHOLD -3 -#define M_MMAP_MAX -4 -#define M_SCANHEAP -5 -#define M_FILL - - - -#ifndef DEFAULT_TRIM_THRESHOLD -#define DEFAULT_TRIM_THRESHOLD (128 * 1024) -#endif - -/* - M_TRIM_THRESHOLD is the maximum amount of unused top-most memory - to keep before releasing via malloc_trim in free(). - - Automatic trimming is mainly useful in long-lived programs. - Because trimming via sbrk can be slow on some systems, and can - sometimes be wasteful (in cases where programs immediately - afterward allocate more large chunks) the value should be high - enough so that your overall system performance would improve by - releasing. - - The trim threshold and the mmap control parameters (see below) - can be traded off with one another. Trimming and mmapping are - two different ways of releasing unused memory back to the - system. Between these two, it is often possible to keep - system-level demands of a long-lived program down to a bare - minimum. For example, in one test suite of sessions measuring - the XF86 X server on Linux, using a trim threshold of 128K and a - mmap threshold of 192K led to near-minimal long term resource - consumption. - - If you are using this malloc in a long-lived program, it should - pay to experiment with these values. As a rough guide, you - might set to a value close to the average size of a process - (program) running on your system. Releasing this much memory - would allow such a process to run in memory. Generally, it's - worth it to tune for trimming rather tham memory mapping when a - program undergoes phases where several large chunks are - allocated and released in ways that can reuse each other's - storage, perhaps mixed with phases where there are no such - chunks at all. And in well-behaved long-lived programs, - controlling release of large blocks via trimming versus mapping - is usually faster. - - However, in most programs, these parameters serve mainly as - protection against the system-level effects of carrying around - massive amounts of unneeded memory. Since frequent calls to - sbrk, mmap, and munmap otherwise degrade performance, the default - parameters are set to relatively high values that serve only as - safeguards. - - The default trim value is high enough to cause trimming only in - fairly extreme (by current memory consumption standards) cases. - It must be greater than page size to have any useful effect. To - disable trimming completely, you can set to (unsigned long)(-1); - - -*/ - - -#ifndef DEFAULT_TOP_PAD -#define DEFAULT_TOP_PAD (0) -#endif - -/* - M_TOP_PAD is the amount of extra `padding' space to allocate or - retain whenever sbrk is called. It is used in two ways internally: - - * When sbrk is called to extend the top of the arena to satisfy - a new malloc request, this much padding is added to the sbrk - request. - - * When malloc_trim is called automatically from free(), - it is used as the `pad' argument. - - In both cases, the actual amount of padding is rounded - so that the end of the arena is always a system page boundary. - - The main reason for using padding is to avoid calling sbrk so - often. Having even a small pad greatly reduces the likelihood - that nearly every malloc request during program start-up (or - after trimming) will invoke sbrk, which needlessly wastes - time. - - Automatic rounding-up to page-size units is normally sufficient - to avoid measurable overhead, so the default is 0. However, in - systems where sbrk is relatively slow, it can pay to increase - this value, at the expense of carrying around more memory than - the program needs. - -*/ - - -#ifndef DEFAULT_MMAP_THRESHOLD -#define DEFAULT_MMAP_THRESHOLD (128 * 1024) -#endif - -/* - - M_MMAP_THRESHOLD is the request size threshold for using mmap() - to service a request. Requests of at least this size that cannot - be allocated using already-existing space will be serviced via mmap. - (If enough normal freed space already exists it is used instead.) - - Using mmap segregates relatively large chunks of memory so that - they can be individually obtained and released from the host - system. A request serviced through mmap is never reused by any - other request (at least not directly; the system may just so - happen to remap successive requests to the same locations). - - Segregating space in this way has the benefit that mmapped space - can ALWAYS be individually released back to the system, which - helps keep the system level memory demands of a long-lived - program low. Mapped memory can never become `locked' between - other chunks, as can happen with normally allocated chunks, which - menas that even trimming via malloc_trim would not release them. - - However, it has the disadvantages that: - - 1. The space cannot be reclaimed, consolidated, and then - used to service later requests, as happens with normal chunks. - 2. It can lead to more wastage because of mmap page alignment - requirements - 3. It causes malloc performance to be more dependent on host - system memory management support routines which may vary in - implementation quality and may impose arbitrary - limitations. Generally, servicing a request via normal - malloc steps is faster than going through a system's mmap. - - All together, these considerations should lead you to use mmap - only for relatively large requests. - - -*/ - - - -#ifndef DEFAULT_MMAP_MAX -#if HAVE_MMAP -#define DEFAULT_MMAP_MAX (64) -#else -#define DEFAULT_MMAP_MAX (0) -#endif -#endif - -/* - M_MMAP_MAX is the maximum number of requests to simultaneously - service using mmap. This parameter exists because: - - 1. Some systems have a limited number of internal tables for - use by mmap. - 2. In most systems, overreliance on mmap can degrade overall - performance. - 3. If a program allocates many large regions, it is probably - better off using normal sbrk-based allocation routines that - can reclaim and reallocate normal heap memory. Using a - small value allows transition into this mode after the - first few allocations. - - Setting to 0 disables all use of mmap. If HAVE_MMAP is not set, - the default value is 0, and attempts to set it to non-zero values - in mallopt will fail. -*/ - - - - -/* - - Special defines for linux libc - - Except when compiled using these special defines for Linux libc - using weak aliases, this malloc is NOT designed to work in - multithreaded applications. No semaphores or other concurrency - control are provided to ensure that multiple malloc or free calls - don't run at the same time, which could be disasterous. A single - semaphore could be used across malloc, realloc, and free (which is - essentially the effect of the linux weak alias approach). It would - be hard to obtain finer granularity. - -*/ - - -#ifdef INTERNAL_LINUX_C_LIB - -#if __STD_C - -Void_t * __default_morecore_init (ptrdiff_t); -Void_t *(*__morecore)(ptrdiff_t) = __default_morecore_init; - -#else - -Void_t * __default_morecore_init (); -Void_t *(*__morecore)() = __default_morecore_init; - -#endif - -#define MORECORE (*__morecore) -#define MORECORE_FAILURE 0 -#define MORECORE_CLEARS 1 - -#else /* INTERNAL_LINUX_C_LIB */ - -#if __STD_C -/* extern Void_t* sbrk(ptrdiff_t);*/ -#else -extern Void_t* sbrk(); -#endif - -#ifndef MORECORE -#define MORECORE sbrk -#endif - -#ifndef MORECORE_FAILURE -#define MORECORE_FAILURE -1 -#endif - -#ifndef MORECORE_CLEARS -#define MORECORE_CLEARS 0 -#endif - -#endif /* INTERNAL_LINUX_C_LIB */ - -#if defined(INTERNAL_LINUX_C_LIB) && defined(__ELF__) - -#define cALLOc __libc_calloc -#define fREe __libc_free -#define mALLOc __libc_malloc -#define mEMALIGn __libc_memalign -#define rEALLOc __libc_realloc -#define vALLOc __libc_valloc -#define pvALLOc __libc_pvalloc -#define mALLINFo __libc_mallinfo -#define mALLOPt __libc_mallopt - -#pragma weak calloc = __libc_calloc -#pragma weak free = __libc_free -#pragma weak cfree = __libc_free -#pragma weak malloc = __libc_malloc -#pragma weak memalign = __libc_memalign -#pragma weak realloc = __libc_realloc -#pragma weak valloc = __libc_valloc -#pragma weak pvalloc = __libc_pvalloc -#pragma weak mallinfo = __libc_mallinfo -#pragma weak mallopt = __libc_mallopt - -#else - -#ifndef cALLOc -#define cALLOc dlcalloc -#endif -#ifndef fREe -#define fREe dlfree -#endif -#ifndef mALLOc -#define mALLOc dlmalloc -#endif -#ifndef mEMALIGn -#define mEMALIGn dlmemalign -#endif -#ifndef rEALLOc -#define rEALLOc dlrealloc -#endif -#ifndef vALLOc -#define vALLOc dlvalloc -#endif -#ifndef pvALLOc -#define pvALLOc dlpvalloc -#endif -#ifndef mALLINFo -#define mALLINFo dlmallinfo -#endif -#ifndef mALLOPt -#define mALLOPt dlmallopt -#endif - -#endif - -/* Public routines */ - -#ifdef DEBUG2 -#define malloc(size) malloc_dbg(size, __FILE__, __LINE__) -#define free(p) free_dbg(p, __FILE__, __LINE__) -#define realloc(p, size) realloc_dbg(p, size, __FILE__, __LINE__) -#define calloc(n, size) calloc_dbg(n, size, __FILE__, __LINE__) -#define memalign(align, size) memalign_dbg(align, size, __FILE__, __LINE__) -#define valloc(size) valloc_dbg(size, __FILE__, __LINE__) -#define pvalloc(size) pvalloc_dbg(size, __FILE__, __LINE__) -#define malloc_trim(pad) malloc_trim_dbg(pad, __FILE__, __LINE__) -#define malloc_usable_size(p) malloc_usable_size_dbg(p, __FILE__, __LINE__) -#define malloc_stats(void) malloc_stats_dbg(__FILE__, __LINE__) -#define mallopt(flag, val) mallopt_dbg(flag, val, __FILE__, __LINE__) -#define mallinfo(void) mallinfo_dbg(__FILE__, __LINE__) - -#if __STD_C -Void_t* malloc_dbg(size_t, const char *, int); -void free_dbg(Void_t*, const char *, int); -Void_t* realloc_dbg(Void_t*, size_t, const char *, int); -Void_t* calloc_dbg(size_t, size_t, const char *, int); -Void_t* memalign_dbg(size_t, size_t, const char *, int); -Void_t* valloc_dbg(size_t, const char *, int); -Void_t* pvalloc_dbg(size_t, const char *, int); -int malloc_trim_dbg(size_t, const char *, int); -size_t malloc_usable_size_dbg(Void_t*, const char *, int); -void malloc_stats_dbg(const char *, int); -int mallopt_dbg(int, int, const char *, int); -struct mallinfo mallinfo_dbg(const char *, int); -#else -Void_t* malloc_dbg(); -void free_dbg(); -Void_t* realloc_dbg(); -Void_t* calloc_dbg(); -Void_t* memalign_dbg(); -Void_t* valloc_dbg(); -Void_t* pvalloc_dbg(); -int malloc_trim_dbg(); -size_t malloc_usable_size_dbg(); -void malloc_stats_dbg(); -int mallopt_dbg(); -struct mallinfo mallinfo_dbg(); -#endif /* !__STD_C */ - -#else /* !DEBUG2 */ - -#if __STD_C - -Void_t* mALLOc(size_t); -void fREe(Void_t*); -Void_t* rEALLOc(Void_t*, size_t); -Void_t* cALLOc(size_t, size_t); -Void_t* mEMALIGn(size_t, size_t); -Void_t* vALLOc(size_t); -Void_t* pvALLOc(size_t); -int malloc_trim(size_t); -size_t malloc_usable_size(Void_t*); -void malloc_stats(void); -int mALLOPt(int, int); -struct mallinfo mALLINFo(void); -#else -Void_t* mALLOc(); -void fREe(); -Void_t* rEALLOc(); -Void_t* cALLOc(); -Void_t* mEMALIGn(); -Void_t* vALLOc(); -Void_t* pvALLOc(); -int malloc_trim(); -size_t malloc_usable_size(); -void malloc_stats(); -int mALLOPt(); -struct mallinfo mALLINFo(); -#endif -#endif /* !DEBUG2 */ - -#ifdef __cplusplus -}; /* end of extern "C" */ -#endif - -/* ---------- To make a malloc.h, end cutting here ------------ */ - -#ifdef DEBUG2 - -#ifdef __cplusplus -extern "C" { -#endif - -#undef malloc -#undef free -#undef realloc -#undef calloc -#undef memalign -#undef valloc -#undef pvalloc -#undef malloc_trim -#undef malloc_usable_size -#undef malloc_stats -#undef mallopt -#undef mallinfo - -#if __STD_C -Void_t* mALLOc(size_t); -void fREe(Void_t*); -Void_t* rEALLOc(Void_t*, size_t); -Void_t* cALLOc(size_t, size_t); -Void_t* mEMALIGn(size_t, size_t); -Void_t* vALLOc(size_t); -Void_t* pvALLOc(size_t); -int malloc_trim(size_t); -size_t malloc_usable_size(Void_t*); -void malloc_stats(void); -int mALLOPt(int, int); -struct mallinfo mALLINFo(void); -#else -Void_t* mALLOc(); -void fREe(); -Void_t* rEALLOc(); -Void_t* cALLOc(); -Void_t* mEMALIGn(); -Void_t* vALLOc(); -Void_t* pvALLOc(); -int malloc_trim(); -size_t malloc_usable_size(); -void malloc_stats(); -int mALLOPt(); -struct mallinfo mALLINFo(); -#endif - -#include /* isprint() */ -#ifdef DEBUG3 -#include /* atexit() */ -#endif - -#ifdef __cplusplus -}; /* end of extern "C" */ -#endif - -#endif /* DEBUG2 */ - -/* - Emulation of sbrk for WIN32 - All code within the ifdef WIN32 is untested by me. -*/ - - -#ifdef WIN32 - -#define AlignPage(add) (((add) + (malloc_getpagesize-1)) & \ - ~(malloc_getpagesize-1)) - -/* resrve 64MB to insure large contiguous space */ -#define RESERVED_SIZE (1024*1024*64) -#define NEXT_SIZE (2048*1024) -#define TOP_MEMORY ((unsigned long)2*1024*1024*1024) - -struct GmListElement; -typedef struct GmListElement GmListElement; - -struct GmListElement -{ - GmListElement* next; - void* base; -}; - -static GmListElement* head = 0; -static unsigned int gNextAddress = 0; -static unsigned int gAddressBase = 0; -static unsigned int gAllocatedSize = 0; - -static -GmListElement* makeGmListElement (void* bas) -{ - GmListElement* this; - this = (GmListElement*)(void*)LocalAlloc (0, sizeof (GmListElement)); - ASSERT (this); - if (this) - { - this->base = bas; - this->next = head; - head = this; - } - return this; -} - -void gcleanup () -{ - BOOL rval; - ASSERT ( (head == NULL) || (head->base == (void*)gAddressBase)); - if (gAddressBase && (gNextAddress - gAddressBase)) - { - rval = VirtualFree ((void*)gAddressBase, - gNextAddress - gAddressBase, - MEM_DECOMMIT); - ASSERT (rval); - } - while (head) - { - GmListElement* next = head->next; - rval = VirtualFree (head->base, 0, MEM_RELEASE); - ASSERT (rval); - LocalFree (head); - head = next; - } -} - -static -void* findRegion (void* start_address, unsigned long size) -{ - MEMORY_BASIC_INFORMATION info; - while ((unsigned long)start_address < TOP_MEMORY) - { - VirtualQuery (start_address, &info, sizeof (info)); - if (info.State != MEM_FREE) - start_address = (char*)info.BaseAddress + info.RegionSize; - else if (info.RegionSize >= size) - return start_address; - else - start_address = (char*)info.BaseAddress + info.RegionSize; - } - return NULL; - -} - - -void* wsbrk (long size) -{ - void* tmp; - if (size > 0) - { - if (gAddressBase == 0) - { - gAllocatedSize = max (RESERVED_SIZE, AlignPage (size)); - gNextAddress = gAddressBase = - (unsigned int)VirtualAlloc (NULL, gAllocatedSize, - MEM_RESERVE, PAGE_NOACCESS); - } else if (AlignPage (gNextAddress + size) > (gAddressBase + -gAllocatedSize)) - { - long new_size = max (NEXT_SIZE, AlignPage (size)); - void* new_address = (void*)(gAddressBase+gAllocatedSize); - do - { - new_address = findRegion (new_address, new_size); - - if (new_address == 0) - return (void*)-1; - - gAddressBase = gNextAddress = - (unsigned int)VirtualAlloc (new_address, new_size, - MEM_RESERVE, PAGE_NOACCESS); - // repeat in case of race condition - // The region that we found has been snagged - // by another thread - } - while (gAddressBase == 0); - - ASSERT (new_address == (void*)gAddressBase); - - gAllocatedSize = new_size; - - if (!makeGmListElement ((void*)gAddressBase)) - return (void*)-1; - } - if ((size + gNextAddress) > AlignPage (gNextAddress)) - { - void* res; - res = VirtualAlloc ((void*)AlignPage (gNextAddress), - (size + gNextAddress - - AlignPage (gNextAddress)), - MEM_COMMIT, PAGE_READWRITE); - if (res == 0) - return (void*)-1; - } - tmp = (void*)gNextAddress; - gNextAddress = (unsigned int)tmp + size; - return tmp; - } - else if (size < 0) - { - unsigned int alignedGoal = AlignPage (gNextAddress + size); - /* Trim by releasing the virtual memory */ - if (alignedGoal >= gAddressBase) - { - VirtualFree ((void*)alignedGoal, gNextAddress - alignedGoal, - MEM_DECOMMIT); - gNextAddress = gNextAddress + size; - return (void*)gNextAddress; - } - else - { - VirtualFree ((void*)gAddressBase, gNextAddress - gAddressBase, - MEM_DECOMMIT); - gNextAddress = gAddressBase; - return (void*)-1; - } - } - else - { - return (void*)gNextAddress; - } -} - -#endif - - - -/* - Type declarations -*/ - -#ifdef DEBUG3 -# define MOATWIDTH 4 /* number of guard bytes at each end of - allocated region */ -# define MOATFILL 5 /* moat fill character */ -# define ALLOCFILL 1 /* fill char for allocated */ -# define FREEFILL 2 /* and freed regions */ -#endif - -typedef struct malloc_chunk -{ - INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */ - INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */ - struct malloc_chunk* fd; /* double links -- used only if free. */ - struct malloc_chunk* bk; -#ifdef DEBUG3 - const char *file; /* file and */ - int line; /* line number of [re]allocation */ - size_t pad; /* nr pad bytes at mem end, excluding moat */ - int alloced; /* whether the chunk is allocated -- less prone - to segv than inuse(chunk) */ - char moat[MOATWIDTH]; /* actual leading moat is last MOATWIDTH bytes - of chunk header; those bytes may follow this - field due to header alignment padding */ -#endif -} Chunk; - -typedef Chunk* mchunkptr; - -/* - - malloc_chunk details: - - (The following includes lightly edited explanations by Colin Plumb.) - - Chunks of memory are maintained using a `boundary tag' method as - described in e.g., Knuth or Standish. (See the paper by Paul - Wilson ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a - survey of such techniques.) Sizes of free chunks are stored both - in the front of each chunk and at the end. This makes - consolidating fragmented chunks into bigger chunks very fast. The - size fields also hold bits representing whether chunks are free or - in use. - - An allocated chunk looks like this: - - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk, if allocated | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of chunk, in bytes |P| - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | User data starts here... . - . . - . (malloc_usable_space() bytes) . - . | -nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - - Where "chunk" is the front of the chunk for the purpose of most of - the malloc code, but "mem" is the pointer that is returned to the - user. "Nextchunk" is the beginning of the next contiguous chunk. - - Chunks always begin on even word boundries, so the mem portion - (which is returned to the user) is also on an even word boundary, and - thus double-word aligned. - - Free chunks are stored in circular doubly-linked lists, and look like this: - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `head:' | Size of chunk, in bytes |P| - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Forward pointer to next chunk in list | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Back pointer to previous chunk in list | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Unused space (may be 0 bytes long) . - . . - . | -nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `foot:' | Size of chunk, in bytes | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - The P (PREV_INUSE) bit, stored in the unused low-order bit of the - chunk size (which is always a multiple of two words), is an in-use - bit for the *previous* chunk. If that bit is *clear*, then the - word before the current chunk size contains the previous chunk - size, and can be used to find the front of the previous chunk. - (The very first chunk allocated always has this bit set, - preventing access to non-existent (or non-owned) memory.) - - Note that the `foot' of the current chunk is actually represented - as the prev_size of the NEXT chunk. (This makes it easier to - deal with alignments etc). - - The two exceptions to all this are - - 1. The special chunk `top', which doesn't bother using the - trailing size field since there is no - next contiguous chunk that would have to index off it. (After - initialization, `top' is forced to always exist. If it would - become less than MINSIZE bytes long, it is replenished via - malloc_extend_top.) - - 2. Chunks allocated via mmap, which have the second-lowest-order - bit (IS_MMAPPED) set in their size fields. Because they are - never merged or traversed from any other chunk, they have no - foot size or inuse information. - - Available chunks are kept in any of several places (all declared below): - - * `av': An array of chunks serving as bin headers for consolidated - chunks. Each bin is doubly linked. The bins are approximately - proportionally (log) spaced. There are a lot of these bins - (128). This may look excessive, but works very well in - practice. All procedures maintain the invariant that no - consolidated chunk physically borders another one. Chunks in - bins are kept in size order, with ties going to the - approximately least recently used chunk. - - The chunks in each bin are maintained in decreasing sorted order by - size. This is irrelevant for the small bins, which all contain - the same-sized chunks, but facilitates best-fit allocation for - larger chunks. (These lists are just sequential. Keeping them in - order almost never requires enough traversal to warrant using - fancier ordered data structures.) Chunks of the same size are - linked with the most recently freed at the front, and allocations - are taken from the back. This results in LRU or FIFO allocation - order, which tends to give each chunk an equal opportunity to be - consolidated with adjacent freed chunks, resulting in larger free - chunks and less fragmentation. - - * `top': The top-most available chunk (i.e., the one bordering the - end of available memory) is treated specially. It is never - included in any bin, is used only if no other chunk is - available, and is released back to the system if it is very - large (see M_TRIM_THRESHOLD). - - * `last_remainder': A bin holding only the remainder of the - most recently split (non-top) chunk. This bin is checked - before other non-fitting chunks, so as to provide better - locality for runs of sequentially allocated chunks. - - * Implicitly, through the host system's memory mapping tables. - If supported, requests greater than a threshold are usually - serviced via calls to mmap, and then later released via munmap. - -*/ - - - - - - -/* sizes, alignments */ - -#define SIZE_SZ sizeof(INTERNAL_SIZE_T) -#define ALIGNMENT (SIZE_SZ + SIZE_SZ) -#define ALIGN_MASK (ALIGNMENT - 1) -#ifndef DEBUG3 -# define MEMOFFSET (2*SIZE_SZ) -# define OVERHEAD SIZE_SZ -# define MMAP_EXTRA SIZE_SZ /* for correct alignment */ -# define MINSIZE sizeof(Chunk) -#else -typedef union { - char strut[(sizeof(Chunk) - 1) / ALIGNMENT + 1][ALIGNMENT]; - Chunk chunk; -} PaddedChunk; -# define MEMOFFSET sizeof(PaddedChunk) -# define OVERHEAD (MEMOFFSET + MOATWIDTH) -# define MMAP_EXTRA 0 -# define MINSIZE ((OVERHEAD + ALIGN_MASK) & ~ALIGN_MASK) -#endif - -/* conversion from malloc headers to user pointers, and back */ - -#define chunk2mem(p) ((Void_t*)((char*)(p) + MEMOFFSET)) -#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - MEMOFFSET)) - -/* pad request bytes into a usable size, including overhead */ - -#define request2size(req) \ - ((long)((req) + OVERHEAD) < (long)MINSIZE ? MINSIZE : \ - ((req) + OVERHEAD + ALIGN_MASK) & ~ALIGN_MASK) - -/* Check if m has acceptable alignment */ - -#define aligned_OK(m) (((unsigned long)((m)) & ALIGN_MASK) == 0) - - - - -/* - Physical chunk operations -*/ - - -/* size field is or'ed with PREV_INUSE when previous adjacent chunk in use */ - -#define PREV_INUSE 0x1 - -/* size field is or'ed with IS_MMAPPED if the chunk was obtained with mmap() */ - -#define IS_MMAPPED 0x2 - -/* Bits to mask off when extracting size */ - -#define SIZE_BITS (PREV_INUSE|IS_MMAPPED) - - -/* Ptr to next physical malloc_chunk. */ - -#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->size & ~PREV_INUSE) )) - -/* Ptr to previous physical malloc_chunk */ - -#define prev_chunk(p)\ - ((mchunkptr)( ((char*)(p)) - ((p)->prev_size) )) - - -/* Treat space at ptr + offset as a chunk */ - -#define chunk_at_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) - - - - -/* - Dealing with use bits -*/ - -/* extract p's inuse bit */ - -#define inuse(p)\ -((((mchunkptr)(((char*)(p))+((p)->size & ~PREV_INUSE)))->size) & PREV_INUSE) - -/* extract inuse bit of previous chunk */ - -#define prev_inuse(p) ((p)->size & PREV_INUSE) - -/* check for mmap()'ed chunk */ - -#if HAVE_MMAP -# define chunk_is_mmapped(p) ((p)->size & IS_MMAPPED) -#else -# define chunk_is_mmapped(p) 0 -#endif - -/* set/clear chunk as in use without otherwise disturbing */ - -#define set_inuse(p)\ -((mchunkptr)(((char*)(p)) + ((p)->size & ~PREV_INUSE)))->size |= PREV_INUSE - -#define clear_inuse(p)\ -((mchunkptr)(((char*)(p)) + ((p)->size & ~PREV_INUSE)))->size &= ~(PREV_INUSE) - -/* check/set/clear inuse bits in known places */ - -#define inuse_bit_at_offset(p, s)\ - (((mchunkptr)(((char*)(p)) + (s)))->size & PREV_INUSE) - -#define set_inuse_bit_at_offset(p, s)\ - (((mchunkptr)(((char*)(p)) + (s)))->size |= PREV_INUSE) - -#define clear_inuse_bit_at_offset(p, s)\ - (((mchunkptr)(((char*)(p)) + (s)))->size &= ~(PREV_INUSE)) - - - - -/* - Dealing with size fields -*/ - -/* Get size, ignoring use bits */ - -#define chunksize(p) ((p)->size & ~(SIZE_BITS)) - -/* Set size at head, without disturbing its use bit */ - -#define set_head_size(p, s) ((p)->size = (((p)->size & PREV_INUSE) | (s))) - -/* Set size/use ignoring previous bits in header */ - -#define set_head(p, s) ((p)->size = (s)) - -/* Set size at footer (only when chunk is not in use) */ - -#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_size = (s)) - - - - - -/* - Bins - - The bins, `av_' are an array of pairs of pointers serving as the - heads of (initially empty) doubly-linked lists of chunks, laid out - in a way so that each pair can be treated as if it were in a - malloc_chunk. (This way, the fd/bk offsets for linking bin heads - and chunks are the same). - - Bins for sizes < 512 bytes contain chunks of all the same size, spaced - 8 bytes apart. Larger bins are approximately logarithmically - spaced. (See the table below.) The `av_' array is never mentioned - directly in the code, but instead via bin access macros. - - Bin layout: - - 64 bins of size 8 - 32 bins of size 64 - 16 bins of size 512 - 8 bins of size 4096 - 4 bins of size 32768 - 2 bins of size 262144 - 1 bin of size what's left - - There is actually a little bit of slop in the numbers in bin_index - for the sake of speed. This makes no difference elsewhere. - - The special chunks `top' and `last_remainder' get their own bins, - (this is implemented via yet more trickery with the av_ array), - although `top' is never properly linked to its bin since it is - always handled specially. - -*/ - -#define NAV 128 /* number of bins */ - -typedef Chunk* mbinptr; - -/* access macros */ - -#define bin_at(i) ((mbinptr)((char*)&(av_[2*(i) + 2]) - 2*SIZE_SZ)) -#define next_bin(b) ((mbinptr)((char*)(b) + 2 * sizeof(mbinptr))) -#define prev_bin(b) ((mbinptr)((char*)(b) - 2 * sizeof(mbinptr))) - -/* - The first 2 bins are never indexed. The corresponding av_ cells are instead - used for bookkeeping. This is not to save space, but to simplify - indexing, maintain locality, and avoid some initialization tests. -*/ - -#define top (bin_at(0)->fd) /* The topmost chunk */ -#define last_remainder (bin_at(1)) /* remainder from last split */ - - -/* - Because top initially points to its own bin with initial - zero size, thus forcing extension on the first malloc request, - we avoid having any special code in malloc to check whether - it even exists yet. But we still need to in malloc_extend_top. -*/ - -#define initial_top ((mchunkptr)(bin_at(0))) - -/* Helper macro to initialize bins */ - -#define IAV(i) bin_at(i), bin_at(i) - -static mbinptr av_[NAV * 2 + 2] = { - 0, 0, - IAV(0), IAV(1), IAV(2), IAV(3), IAV(4), IAV(5), IAV(6), IAV(7), - IAV(8), IAV(9), IAV(10), IAV(11), IAV(12), IAV(13), IAV(14), IAV(15), - IAV(16), IAV(17), IAV(18), IAV(19), IAV(20), IAV(21), IAV(22), IAV(23), - IAV(24), IAV(25), IAV(26), IAV(27), IAV(28), IAV(29), IAV(30), IAV(31), - IAV(32), IAV(33), IAV(34), IAV(35), IAV(36), IAV(37), IAV(38), IAV(39), - IAV(40), IAV(41), IAV(42), IAV(43), IAV(44), IAV(45), IAV(46), IAV(47), - IAV(48), IAV(49), IAV(50), IAV(51), IAV(52), IAV(53), IAV(54), IAV(55), - IAV(56), IAV(57), IAV(58), IAV(59), IAV(60), IAV(61), IAV(62), IAV(63), - IAV(64), IAV(65), IAV(66), IAV(67), IAV(68), IAV(69), IAV(70), IAV(71), - IAV(72), IAV(73), IAV(74), IAV(75), IAV(76), IAV(77), IAV(78), IAV(79), - IAV(80), IAV(81), IAV(82), IAV(83), IAV(84), IAV(85), IAV(86), IAV(87), - IAV(88), IAV(89), IAV(90), IAV(91), IAV(92), IAV(93), IAV(94), IAV(95), - IAV(96), IAV(97), IAV(98), IAV(99), IAV(100), IAV(101), IAV(102), IAV(103), - IAV(104), IAV(105), IAV(106), IAV(107), IAV(108), IAV(109), IAV(110), IAV(111), - IAV(112), IAV(113), IAV(114), IAV(115), IAV(116), IAV(117), IAV(118), IAV(119), - IAV(120), IAV(121), IAV(122), IAV(123), IAV(124), IAV(125), IAV(126), IAV(127) -}; - - - -/* field-extraction macros */ - -#define first(b) ((b)->fd) -#define last(b) ((b)->bk) - -/* - Indexing into bins -*/ - -#define bin_index(sz) \ -(((((unsigned long)(sz)) >> 9) == 0) ? (((unsigned long)(sz)) >> 3): \ - ((((unsigned long)(sz)) >> 9) <= 4) ? 56 + (((unsigned long)(sz)) >> 6): \ - ((((unsigned long)(sz)) >> 9) <= 20) ? 91 + (((unsigned long)(sz)) >> 9): \ - ((((unsigned long)(sz)) >> 9) <= 84) ? 110 + (((unsigned long)(sz)) >> 12): \ - ((((unsigned long)(sz)) >> 9) <= 340) ? 119 + (((unsigned long)(sz)) >> 15): \ - ((((unsigned long)(sz)) >> 9) <= 1364) ? 124 + (((unsigned long)(sz)) >> 18): \ - 126) -/* - bins for chunks < 512 are all spaced 8 bytes apart, and hold - identically sized chunks. This is exploited in malloc. -*/ - -#define MAX_SMALLBIN 63 -#define MAX_SMALLBIN_SIZE 512 -#define SMALLBIN_WIDTH 8 - -#define smallbin_index(sz) (((unsigned long)(sz)) >> 3) - -/* - Requests are `small' if both the corresponding and the next bin are small -*/ - -#define is_small_request(nb) (nb < MAX_SMALLBIN_SIZE - SMALLBIN_WIDTH) - - - -/* - To help compensate for the large number of bins, a one-level index - structure is used for bin-by-bin searching. `binblocks' is a - one-word bitvector recording whether groups of BINBLOCKWIDTH bins - have any (possibly) non-empty bins, so they can be skipped over - all at once during during traversals. The bits are NOT always - cleared as soon as all bins in a block are empty, but instead only - when all are noticed to be empty during traversal in malloc. -*/ - -#define BINBLOCKWIDTH 4 /* bins per block */ - -#define binblocks (bin_at(0)->size) /* bitvector of nonempty blocks */ - -/* bin<->block macros */ - -#define idx2binblock(ix) ((unsigned)1 << (ix / BINBLOCKWIDTH)) -#define mark_binblock(ii) (binblocks |= idx2binblock(ii)) -#define clear_binblock(ii) (binblocks &= ~(idx2binblock(ii))) - - - - - -/* Other static bookkeeping data */ - -/* variables holding tunable values */ - -static unsigned long trim_threshold = DEFAULT_TRIM_THRESHOLD; -static unsigned long top_pad = DEFAULT_TOP_PAD; -static unsigned int n_mmaps_max = DEFAULT_MMAP_MAX; -static unsigned long mmap_threshold = DEFAULT_MMAP_THRESHOLD; -#ifdef DEBUG2 -static int scanheap = 1; -#endif - -/* The first value returned from sbrk */ -static char* sbrk_base = (char*)(-1); - -/* The maximum memory obtained from system via sbrk */ -static unsigned long max_sbrked_mem = 0; - -/* The maximum via either sbrk or mmap */ -static unsigned long max_total_mem = 0; - -/* internal working copy of mallinfo */ -static struct mallinfo current_mallinfo = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - -/* The total memory obtained from system via sbrk */ -#define sbrked_mem (current_mallinfo.arena) - -/* Tracking mmaps */ - -static unsigned int n_mmaps = 0; -static unsigned long mmapped_mem = 0; -#if HAVE_MMAP -static unsigned int max_n_mmaps = 0; -static unsigned long max_mmapped_mem = 0; -#endif - - - -/* - Debugging support -*/ - -#if DEBUG - -#ifndef DEBUG2 -# define unless(cond, err, p) assert(cond) -#else -# define unless(cond, err, p) do { if (!(cond)) malloc_err(err, p); } while (0) - -/* - * When debug_file is non-null, it and debug_line respectively contain the - * file and line number of the current invocation of malloc(), calloc(), - * realloc(), or free(). - */ -static const char *debug_file = NULL; -static int debug_line; - -/* - * Avoid dereferencing invalid chunk.file pointers by tracking the range of - * valid ones. Could add an "unallocated" flag to init_freed_chunk() for - * more protection, but that's probably not necessary. - */ -static const char *debug_file_min = (char *)~0; -static const char *debug_file_max = NULL; - -static char *itos(int n) -{ -#define NDIGITS (sizeof(int) * 3) - static char s[NDIGITS + 1]; - int i = NDIGITS; - do { - s[--i] = '0' + n % 10; - n /= 10; - } while (n); - return s + i; -#undef NDIGITS -} - -static int recurs = 0; - -static void errprint(const char *file, int line, const char *err) -{ - if (recurs++) { - recurs--; - return; - } - - if (file) { - write(2, file, strlen(file)); - if (line) { - write(2, ":", 1); - write(2, itos(line), strlen(itos(line))); - } - write(2, ": ", 2); - } - write(2, err, strlen(err)); - write(2, "\n", 1); - recurs--; -} - -static void malloc_err(const char *err, mchunkptr p) -{ - /* - * Display ERR on stderr, accompanying it with the caller's file and line - * number if available. If P is non-null, also attempt to display the file - * and line number at which P was most recently [re]allocated. - * - * This function's name begins with "malloc_" to make setting debugger - * breakpoints here more convenient. - */ - errprint(debug_file, debug_line, err); - -# ifndef DEBUG3 - p = 0; /* avoid "unused param" warning */ -# else - if (p && p->file && - /* avoid invalid pointers */ - debug_file_min && - p->file >= debug_file_min && - p->file <= debug_file_max) - errprint(p->file, p->line, "in block allocated here"); -# endif -} - -#undef malloc -#undef free -#undef realloc -#undef memalign -#undef valloc -#undef pvalloc -#undef calloc -#undef malloc_trim -#undef malloc_usable_size -#undef malloc_stats -#undef mallopt -#undef mallinfo - -static void malloc_update_mallinfo(void); - -/* - * Define front-end functions for all user-visible entry points that may - * trigger error(). - */ -#define skel(retdecl, retassign, call, retstmt) \ - retdecl \ - debug_file = file; \ - debug_line = line; \ - if (debug_file < debug_file_min) \ - debug_file_min = debug_file; \ - if (debug_file > debug_file_max) \ - debug_file_max = debug_file; \ - if (scanheap) \ - malloc_update_mallinfo(); \ - retassign call; \ - if (scanheap) \ - malloc_update_mallinfo(); \ - debug_file = NULL; \ - retstmt - -/* - * The final letter of the names of the following macros is either r or v, - * indicating that the macro handles functions with or without a return value, - * respectively. - */ -# define skelr(rettype, call) \ - skel(rettype ret;, ret = , call, return ret) -/* - * AIX's xlc compiler doesn't like empty macro args, so specify useless but - * compilable retdecl, retassign, and retstmt args: - */ -#define skelv(call) \ - skel(line += 0;, if (1), call, return) - -#define dbgargs const char *file, int line - -/* - * Front-end function definitions: - */ -Void_t* malloc_dbg(size_t bytes, dbgargs) { - skelr(Void_t*, malloc(bytes)); -} -void free_dbg(Void_t *mem, dbgargs) { - skelv(free(mem)); -} -Void_t* realloc_dbg(Void_t *oldmem, size_t bytes, dbgargs) { - skelr(Void_t*, realloc(oldmem, bytes)); -} -Void_t* memalign_dbg(size_t alignment, size_t bytes, dbgargs) { - skelr(Void_t*, dlmemalign(alignment, bytes)); -} -Void_t* valloc_dbg(size_t bytes, dbgargs) { - skelr(Void_t*, dlvalloc(bytes)); -} -Void_t* pvalloc_dbg(size_t bytes, dbgargs) { - skelr(Void_t*, dlpvalloc(bytes)); -} -Void_t* calloc_dbg(size_t n, size_t elem_size, dbgargs) { - skelr(Void_t*, calloc(n, elem_size)); -} -int malloc_trim_dbg(size_t pad, dbgargs) { - skelr(int, malloc_trim(pad)); -} -size_t malloc_usable_size_dbg(Void_t *mem, dbgargs) { - skelr(size_t, malloc_usable_size(mem)); -} -void malloc_stats_dbg(dbgargs) { - skelv(malloc_stats()); -} -int mallopt_dbg(int flag, int value, dbgargs) { - skelr(int, dlmallopt(flag, value)); -} -struct mallinfo mallinfo_dbg(dbgargs) { - skelr(struct mallinfo, dlmallinfo()); -} - -#undef skel -#undef skelr -#undef skelv -#undef dbgargs - -#endif /* DEBUG2 */ - -/* - These routines make a number of assertions about the states - of data structures that should be true at all times. If any - are not true, it's very likely that a user program has somehow - trashed memory. (It's also possible that there is a coding error - in malloc. In which case, please report it!) -*/ - -#ifdef DEBUG3 -static int memtest(void *s, int c, size_t n) -{ - /* - * Return whether the N-byte memory region starting at S consists - * entirely of bytes with value C. - */ - unsigned char *p = (unsigned char *)s; - size_t i; - for (i = 0; i < n; i++) - if (p[i] != (unsigned char)c) - return 0; - return 1; -} -#endif /* DEBUG3 */ - -#ifndef DEBUG3 -#define check_moats(P) -#else -#define check_moats do_check_moats -static void do_check_moats(mchunkptr p) -{ - INTERNAL_SIZE_T sz = chunksize(p); - unless(memtest((char *)chunk2mem(p) - MOATWIDTH, MOATFILL, - MOATWIDTH), "region underflow", p); - unless(memtest((char *)p + sz - MOATWIDTH - p->pad, MOATFILL, - MOATWIDTH + p->pad), "region overflow", p); -} -#endif /* DEBUG3 */ - -#if __STD_C -static void do_check_chunk(mchunkptr p) -#else -static void do_check_chunk(p) mchunkptr p; -#endif -{ - /* Try to ensure legal addresses before accessing any chunk fields, in the - * hope of issuing an informative message rather than causing a segv. - * - * The following chunk_is_mmapped() call accesses p->size #if HAVE_MMAP. - * This is unavoidable without maintaining a record of mmapped regions. - */ - if (!chunk_is_mmapped(p)) - { - INTERNAL_SIZE_T sz; - - unless((char*)p >= sbrk_base, "chunk precedes sbrk_base", p); - unless((char*)p + MINSIZE <= (char*)top + chunksize(top), - "chunk past sbrk area", p); - - sz = chunksize(p); - if (p != top) - unless((char*)p + sz <= (char*)top, "chunk extends beyond top", p); - else - unless((char*)p + sz <= sbrk_base + sbrked_mem, - "chunk extends past sbrk area", p); - } - check_moats(p); -} - -#if __STD_C -static void do_check_free_chunk(mchunkptr p) -#else -static void do_check_free_chunk(p) mchunkptr p; -#endif -{ - INTERNAL_SIZE_T sz = chunksize(p); - mchunkptr next = chunk_at_offset(p, sz); - - do_check_chunk(p); - - /* Check whether it claims to be free ... */ - unless(!inuse(p), "free chunk marked inuse", p); - - /* Unless a special marker, must have OK fields */ - if ((long)sz >= (long)MINSIZE) - { - unless((sz & ALIGN_MASK) == 0, "freed size defies alignment", p); - unless(aligned_OK(chunk2mem(p)), "misaligned freed region", p); - /* ... matching footer field */ - unless(next->prev_size == sz, "chunk size mismatch", p); - /* ... and is fully consolidated */ - unless(prev_inuse(p), "free chunk not joined with prev", p); - unless(next == top || inuse(next), "free chunk not joined with next", p); - - /* ... and has minimally sane links */ - unless(p->fd->bk == p, "broken forward link", p); - unless(p->bk->fd == p, "broken backward link", p); - } - else /* markers are always of size SIZE_SZ */ - unless(sz == SIZE_SZ, "invalid small chunk size", p); -} - -#if __STD_C -static void do_check_inuse_chunk(mchunkptr p) -#else -static void do_check_inuse_chunk(p) mchunkptr p; -#endif -{ - mchunkptr next; - do_check_chunk(p); - - if (chunk_is_mmapped(p)) - return; - - /* Check whether it claims to be in use ... */ -#ifdef DEBUG3 - unless(p->alloced, "memory not allocated", p); -#endif - unless(inuse(p), "memory not allocated", p); - - /* ... and is surrounded by OK chunks. - Since more things can be checked with free chunks than inuse ones, - if an inuse chunk borders them and debug is on, it's worth doing them. - */ - if (!prev_inuse(p)) - { - mchunkptr prv = prev_chunk(p); - unless(next_chunk(prv) == p, "prev link scrambled", p); - do_check_free_chunk(prv); - } - next = next_chunk(p); - if (next == top) - { - unless(prev_inuse(next), "top chunk wrongly thinks prev is unused", p); - unless(chunksize(next) >= MINSIZE, "top chunk too small", p); - } - else if (!inuse(next)) - do_check_free_chunk(next); -} - -#if __STD_C -static void do_check_malloced_chunk(mchunkptr p, INTERNAL_SIZE_T s) -#else -static void do_check_malloced_chunk(p, s) mchunkptr p; INTERNAL_SIZE_T s; -#endif -{ - INTERNAL_SIZE_T sz = chunksize(p); - long room = sz - s; - - do_check_inuse_chunk(p); - - /* Legal size ... */ - unless((long)sz >= (long)MINSIZE, "chunk size too small", p); - unless((sz & ALIGN_MASK) == 0, "malloced size defies alignment", p); - unless(room >= 0, "chunk size too small for contents", p); - unless(room < (long)MINSIZE, "chunk size leaves too much spare room", p); - - /* ... and alignment */ - unless(aligned_OK(chunk2mem(p)), "misaligned malloced region", p); - - - /* ... and was allocated at front of an available chunk */ - unless(prev_inuse(p), "malloced from the middle of a free chunk", p); -} - -#ifdef DEBUG3 -static void init_alloced_chunk(mchunkptr p, size_t bytes) -{ - Void_t* mem = chunk2mem(p); - p->file = debug_file; - p->line = debug_line; - p->pad = chunksize(p) - OVERHEAD - bytes; - p->alloced = 1; - memset((char *)mem + bytes, MOATFILL, p->pad + MOATWIDTH); -} - -static void do_init_malloced_chunk(mchunkptr p, size_t bytes) -{ - Void_t* mem = chunk2mem(p); - init_alloced_chunk(p, bytes); - memset((char *)mem - MOATWIDTH, MOATFILL, MOATWIDTH); - memset(mem, ALLOCFILL, bytes); -} - -static void do_init_realloced_chunk(mchunkptr p, size_t bytes, - INTERNAL_SIZE_T oldsize) -{ - Void_t* mem = chunk2mem(p); - INTERNAL_SIZE_T newsize = chunksize(p); - init_alloced_chunk(p, bytes); - if (oldsize < newsize) - /* This incorrectly leaves the leading pad area of the old trailing moat - * set to MOATFILL rather than ALLOCFILL. An alternative is to save the - * old p->pad in rEALLOc() below and pass it to this function. - */ - memset((char *)mem + oldsize - OVERHEAD, ALLOCFILL, - bytes - (oldsize - OVERHEAD)); -} - -static void do_check_freefill(mchunkptr p, long newsize, - INTERNAL_SIZE_T oldsize) -{ - /* The first newsize bytes of oldsize-byte chunk p are about to be - * allocated. Issue a warning if any freefill locations in p that are about - * to be overwritten do not contain the character FREEFILL. - */ - size_t bytes, maxbytes; - if (newsize <= 0) - return; - bytes = newsize - MEMOFFSET /* don't check p's header */ - + MEMOFFSET; /* header of split-off remainder */ - maxbytes = oldsize - OVERHEAD; - if (bytes > maxbytes) - bytes = maxbytes; - unless(memtest(chunk2mem(p), FREEFILL, bytes), - "detected write to freed region", p); -} - -static void do_init_freed_chunk(mchunkptr p, INTERNAL_SIZE_T freehead, - INTERNAL_SIZE_T freetail) -{ - /* freehead and freetail are the number of bytes at the beginning of p and - * end of p respectively that should already be initialized as free regions. - */ - Void_t* mem = chunk2mem(p); - size_t size = chunksize(p); - size_t bytes = size - OVERHEAD; - p->pad = 0; - p->alloced = 0; - memset((char *)mem - MOATWIDTH, MOATFILL, MOATWIDTH); - memset((char *)mem + bytes, MOATFILL, MOATWIDTH); - - /* To avoid terrible O(n^2) performance when free() repeatedly grows a free - * chunk, it's important not to free-fill regions that are already - * free-filled. - */ - if (freehead + freetail < size) { - Void_t* start = !freehead ? mem : (char *)p + freehead - MOATWIDTH; - size_t len = (char *)p + size - (char *)start - - (!freetail ? MOATWIDTH : freetail - OVERHEAD); - memset(start, FREEFILL, len); - } -} - -static void do_init_freeable_chunk(mchunkptr p) -{ - /* Arrange for the subsequent fREe(p) not to generate any warnings. */ - init_alloced_chunk(p, chunksize(p) - OVERHEAD); - memset((char *)chunk2mem(p) - MOATWIDTH, MOATFILL, MOATWIDTH); -} - -static void do_maximize_chunk(mchunkptr p) -{ - if (p->pad) { - Void_t* mem = chunk2mem(p); - size_t bytes = chunksize(p) - OVERHEAD - p->pad; - memset((char *)mem + bytes, ALLOCFILL, p->pad); - p->pad = 0; - } -} - -static int do_check_init(void) -{ - /* Called from the first invocation of malloc_extend_top(), as detected by - * sbrk_base == -1. Return whether this function allocated any memory. - */ - static int state = 0; /* 1 => initializing, 2 => initialized */ - if (state == 1) - return 0; - unless(state == 0, "multiple calls to check_init", NULL); - state++; - atexit(malloc_update_mallinfo); /* calls malloc on WinNT */ - return sbrk_base != (char *)-1; -} -#endif /* DEBUG3 */ - -static mchunkptr lowest_chunk; - -#define check_free_chunk(P) do_check_free_chunk(P) -#define check_inuse_chunk(P) do_check_inuse_chunk(P) -#define check_chunk(P) do_check_chunk(P) -#define check_malloced_chunk(P,N) do_check_malloced_chunk(P,N) -#else /* !DEBUG */ -#define check_free_chunk(P) -#define check_inuse_chunk(P) -#define check_chunk(P) -#define check_malloced_chunk(P,N) -#endif /* !DEBUG */ - -#ifdef DEBUG3 -#define check_init do_check_init -#define init_malloced_chunk do_init_malloced_chunk -#define init_realloced_chunk do_init_realloced_chunk -#define check_freefill do_check_freefill -#define init_freed_chunk do_init_freed_chunk -#define init_freeable_chunk do_init_freeable_chunk -#define maximize_chunk do_maximize_chunk -#else -#define check_init() 0 -#define init_malloced_chunk(P,B) -#define init_realloced_chunk(P,B,O) -#define check_freefill(P,N,O) -#define init_freed_chunk(P,H,T) -#define init_freeable_chunk(P) -#define maximize_chunk(P) -#endif /* !DEBUG3 */ - - - -/* - Macro-based internal utilities -*/ - - -/* - Linking chunks in bin lists. - Call these only with variables, not arbitrary expressions, as arguments. -*/ - -/* - Place chunk p of size s in its bin, in size order, - putting it ahead of others of same size. -*/ - - -#define frontlink(P, S, IDX, BK, FD) \ -{ \ - if (S < MAX_SMALLBIN_SIZE) \ - { \ - IDX = smallbin_index(S); \ - mark_binblock(IDX); \ - BK = bin_at(IDX); \ - FD = BK->fd; \ - P->bk = BK; \ - P->fd = FD; \ - FD->bk = BK->fd = P; \ - } \ - else \ - { \ - IDX = bin_index(S); \ - BK = bin_at(IDX); \ - FD = BK->fd; \ - if (FD == BK) mark_binblock(IDX); \ - else \ - { \ - while (FD != BK && S < chunksize(FD)) FD = FD->fd; \ - BK = FD->bk; \ - } \ - P->bk = BK; \ - P->fd = FD; \ - FD->bk = BK->fd = P; \ - } \ -} - - -/* take a chunk off a list */ - -#define unlink(P, BK, FD) \ -{ \ - BK = P->bk; \ - FD = P->fd; \ - FD->bk = BK; \ - BK->fd = FD; \ -} \ - -/* Place p as the last remainder */ - -#define link_last_remainder(P) \ -{ \ - last_remainder->fd = last_remainder->bk = P; \ - P->fd = P->bk = last_remainder; \ -} - -/* Clear the last_remainder bin */ - -#define clear_last_remainder \ - (last_remainder->fd = last_remainder->bk = last_remainder) - - - - - - -/* Routines dealing with mmap(). */ - -#if HAVE_MMAP - -#if __STD_C -static mchunkptr mmap_chunk(size_t size) -#else -static mchunkptr mmap_chunk(size) size_t size; -#endif -{ - size_t page_mask = malloc_getpagesize - 1; - mchunkptr p; - -#ifndef MAP_ANONYMOUS - static int fd = -1; -#endif - - if(n_mmaps >= n_mmaps_max) return 0; /* too many regions */ - - size = (size + MMAP_EXTRA + page_mask) & ~page_mask; - -#ifdef MAP_ANONYMOUS - p = (mchunkptr)mmap(0, size, PROT_READ|PROT_WRITE, - MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); -#else /* !MAP_ANONYMOUS */ - if (fd < 0) - { - fd = open("/dev/zero", O_RDWR); - if(fd < 0) return 0; - } - p = (mchunkptr)mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); -#endif - - if(p == (mchunkptr)-1) return 0; - - n_mmaps++; - if (n_mmaps > max_n_mmaps) max_n_mmaps = n_mmaps; - - /* We demand that eight bytes into a page must be 8-byte aligned. */ - assert(aligned_OK(chunk2mem(p))); - - /* The offset to the start of the mmapped region is stored - * in the prev_size field of the chunk; normally it is zero, - * but that can be changed in memalign(). - */ - p->prev_size = 0; - set_head(p, size|IS_MMAPPED); - - mmapped_mem += size; - if ((unsigned long)mmapped_mem > (unsigned long)max_mmapped_mem) - max_mmapped_mem = mmapped_mem; - if ((unsigned long)(mmapped_mem + sbrked_mem) > (unsigned long)max_total_mem) - max_total_mem = mmapped_mem + sbrked_mem; - return p; -} - -#if __STD_C -static void munmap_chunk(mchunkptr p) -#else -static void munmap_chunk(p) mchunkptr p; -#endif -{ - INTERNAL_SIZE_T size = chunksize(p); - int ret; - - assert (chunk_is_mmapped(p)); - assert(! ((char*)p >= sbrk_base && (char*)p < sbrk_base + sbrked_mem)); - assert((n_mmaps > 0)); - assert(((p->prev_size + size) & (malloc_getpagesize-1)) == 0); - - n_mmaps--; - mmapped_mem -= (size + p->prev_size); - - ret = munmap((char *)p - p->prev_size, size + p->prev_size); - - /* munmap returns non-zero on failure */ - assert(ret == 0); -} - -#if HAVE_MREMAP - -#if __STD_C -static mchunkptr mremap_chunk(mchunkptr p, size_t new_size) -#else -static mchunkptr mremap_chunk(p, new_size) mchunkptr p; size_t new_size; -#endif -{ - size_t page_mask = malloc_getpagesize - 1; - INTERNAL_SIZE_T offset = p->prev_size; - INTERNAL_SIZE_T size = chunksize(p); - char *cp; - - assert (chunk_is_mmapped(p)); - assert(! ((char*)p >= sbrk_base && (char*)p < sbrk_base + sbrked_mem)); - assert((n_mmaps > 0)); - assert(((size + offset) & (malloc_getpagesize-1)) == 0); - - new_size = (new_size + offset + MMAP_EXTRA + page_mask) & ~page_mask; - - cp = (char *)mremap((char *)p - offset, size + offset, new_size, 1); - - if (cp == (char *)-1) return 0; - - p = (mchunkptr)(cp + offset); - - assert(aligned_OK(chunk2mem(p))); - - assert(p->prev_size == offset); - set_head(p, (new_size - offset)|IS_MMAPPED); - - mmapped_mem -= size + offset; - mmapped_mem += new_size; - if ((unsigned long)mmapped_mem > (unsigned long)max_mmapped_mem) - max_mmapped_mem = mmapped_mem; - if ((unsigned long)(mmapped_mem + sbrked_mem) > (unsigned long)max_total_mem) - max_total_mem = mmapped_mem + sbrked_mem; - return p; -} - -#endif /* HAVE_MREMAP */ - -#endif /* HAVE_MMAP */ - - - - -/* - Extend the top-most chunk by obtaining memory from system. - Main interface to sbrk (but see also malloc_trim). -*/ - -#if __STD_C -static void malloc_extend_top(INTERNAL_SIZE_T nb) -#else -static void malloc_extend_top(nb) INTERNAL_SIZE_T nb; -#endif -{ - char* lim; /* return value from sbrk */ - INTERNAL_SIZE_T front_misalign; /* unusable bytes at front of sbrked space */ - INTERNAL_SIZE_T correction; /* bytes for 2nd sbrk call */ - char* new_lim; /* return of 2nd sbrk call */ - INTERNAL_SIZE_T top_size; /* new size of top chunk */ - - mchunkptr old_top = top; /* Record state of old top */ - INTERNAL_SIZE_T old_top_size = chunksize(old_top); - char* old_end = (char*)(chunk_at_offset(old_top, old_top_size)); - - /* Pad request with top_pad plus minimal overhead */ - - INTERNAL_SIZE_T sbrk_size = nb + top_pad + MINSIZE; - unsigned long pagesz = malloc_getpagesize; - - /* If not the first time through, round to preserve page boundary */ - /* Otherwise, we need to correct to a page size below anyway. */ - /* (We also correct below if an intervening foreign sbrk call.) */ - - if (sbrk_base != (char*)(-1)) - sbrk_size = (sbrk_size + (pagesz - 1)) & ~(pagesz - 1); - - else if (check_init()) { - if (chunksize(top) - nb < (long)MINSIZE) - malloc_extend_top(nb); - return; - } - - lim = (char*)(MORECORE (sbrk_size)); - - /* Fail if sbrk failed or if a foreign sbrk call killed our space */ - if (lim == (char*)(MORECORE_FAILURE) || - (lim < old_end && old_top != initial_top)) - return; - - sbrked_mem += sbrk_size; - - if (lim == old_end) /* can just add bytes to current top */ - { - top_size = sbrk_size + old_top_size; - set_head(top, top_size | PREV_INUSE); - } - else - { -#ifdef SBRKDBG - INTERNAL_SIZE_T padding = (char *)sbrk (0) - (lim + sbrk_size); - sbrk_size += padding; - sbrked_mem += padding; -#endif - - if (sbrk_base == (char*)(-1)) /* First time through. Record base */ - sbrk_base = lim; - else /* Someone else called sbrk(). Count those bytes as sbrked_mem. */ - sbrked_mem += lim - (char*)old_end; - - /* Guarantee alignment of first new chunk made from this space */ - front_misalign = (unsigned long)chunk2mem(lim) & ALIGN_MASK; - if (front_misalign > 0) - { - correction = (ALIGNMENT) - front_misalign; - lim += correction; - } - else - correction = 0; - - /* Guarantee the next brk will be at a page boundary */ - correction += pagesz - ((unsigned long)(lim + sbrk_size) & (pagesz - 1)); - - /* Allocate correction */ - new_lim = (char*)(MORECORE (correction)); - if (new_lim == (char*)(MORECORE_FAILURE)) return; - - sbrked_mem += correction; - - top = (mchunkptr)lim; - top_size = new_lim - lim + correction; - set_head(top, top_size | PREV_INUSE); -#if DEBUG - lowest_chunk = top; -#endif - -#ifdef OTHER_SBRKS - if (old_top != initial_top) - { - - /* There must have been an intervening foreign sbrk call. */ - /* A double fencepost is necessary to prevent consolidation */ - - /* If not enough space to do this, then user did something very wrong */ - if (old_top_size < MINSIZE) - { - set_head(top, PREV_INUSE); /* will force null return from malloc */ - return; - } - - old_top_size -= 2*SIZE_SZ; - chunk_at_offset(old_top, old_top_size )->size = - SIZE_SZ|PREV_INUSE; - chunk_at_offset(old_top, old_top_size + SIZE_SZ)->size = - SIZE_SZ|PREV_INUSE; - set_head_size(old_top, old_top_size); - /* If possible, release the rest. */ - if (old_top_size >= MINSIZE) { - init_freeable_chunk(old_top); - fREe(chunk2mem(old_top)); - } - } -#endif /* OTHER_SBRKS */ - } - - init_freed_chunk(top, old_top == initial_top ? old_top_size : 0, 0); - - if ((unsigned long)sbrked_mem > (unsigned long)max_sbrked_mem) - max_sbrked_mem = sbrked_mem; - if ((unsigned long)(mmapped_mem + sbrked_mem) > (unsigned long)max_total_mem) - max_total_mem = mmapped_mem + sbrked_mem; - - /* We always land on a page boundary */ - assert(((unsigned long)((char*)top + top_size) & (pagesz - 1)) == 0); -} - - - - -/* Main public routines */ - - -/* - Malloc Algorthim: - - The requested size is first converted into a usable form, `nb'. - This currently means to add 4 bytes overhead plus possibly more to - obtain 8-byte alignment and/or to obtain a size of at least - MINSIZE (currently 16 bytes), the smallest allocatable size. - (All fits are considered `exact' if they are within MINSIZE bytes.) - - From there, the first successful of the following steps is taken: - - 1. The bin corresponding to the request size is scanned, and if - a chunk of exactly the right size is found, it is taken. - - 2. The most recently remaindered chunk is used if it is big - enough. This is a form of (roving) first fit, used only in - the absence of exact fits. Runs of consecutive requests use - the remainder of the chunk used for the previous such request - whenever possible. This limited use of a first-fit style - allocation strategy tends to give contiguous chunks - coextensive lifetimes, which improves locality and can reduce - fragmentation in the long run. - - 3. Other bins are scanned in increasing size order, using a - chunk big enough to fulfill the request, and splitting off - any remainder. This search is strictly by best-fit; i.e., - the smallest (with ties going to approximately the least - recently used) chunk that fits is selected. - - 4. If large enough, the chunk bordering the end of memory - (`top') is split off. (This use of `top' is in accord with - the best-fit search rule. In effect, `top' is treated as - larger (and thus less well fitting) than any other available - chunk since it can be extended to be as large as necessary - (up to system limitations). - - 5. If the request size meets the mmap threshold and the - system supports mmap, and there are few enough currently - allocated mmapped regions, and a call to mmap succeeds, - the request is allocated via direct memory mapping. - - 6. Otherwise, the top of memory is extended by - obtaining more space from the system (normally using sbrk, - but definable to anything else via the MORECORE macro). - Memory is gathered from the system (in system page-sized - units) in a way that allows chunks obtained across different - sbrk calls to be consolidated, but does not require - contiguous memory. Thus, it should be safe to intersperse - mallocs with other sbrk calls. - - - All allocations are made from the the `lowest' part of any found - chunk. (The implementation invariant is that prev_inuse is - always true of any allocated chunk; i.e., that each allocated - chunk borders either a previously allocated and still in-use chunk, - or the base of its memory arena.) - -*/ - -#if __STD_C -Void_t* mALLOc(size_t bytes) -#else -Void_t* mALLOc(bytes) size_t bytes; -#endif -{ - mchunkptr victim; /* inspected/selected chunk */ - INTERNAL_SIZE_T victim_size; /* its size */ - int idx; /* index for bin traversal */ - mbinptr bin; /* associated bin */ - mchunkptr remainder; /* remainder from a split */ - long remainder_size; /* its size */ - int remainder_index; /* its bin index */ - unsigned long block; /* block traverser bit */ - int startidx; /* first bin of a traversed block */ - mchunkptr fwd; /* misc temp for linking */ - mchunkptr bck; /* misc temp for linking */ - mbinptr q; /* misc temp */ - - INTERNAL_SIZE_T nb = request2size(bytes); /* padded request size; */ - - /* Check for exact match in a bin */ - - if (is_small_request(nb)) /* Faster version for small requests */ - { - idx = smallbin_index(nb); - - /* No traversal or size check necessary for small bins. */ - - q = bin_at(idx); - victim = last(q); - - /* Also scan the next one, since it would have a remainder < MINSIZE */ - if (victim == q) - { - q = next_bin(q); - victim = last(q); - } - if (victim != q) - { - victim_size = chunksize(victim); - unlink(victim, bck, fwd); - set_inuse_bit_at_offset(victim, victim_size); - check_freefill(victim, victim_size, victim_size); - init_malloced_chunk(victim, bytes); - check_malloced_chunk(victim, nb); - - return chunk2mem(victim); - } - - idx += 2; /* Set for bin scan below. We've already scanned 2 bins. */ - - } - else - { - idx = bin_index(nb); - bin = bin_at(idx); - - for (victim = last(bin); victim != bin; victim = victim->bk) - { - victim_size = chunksize(victim); - remainder_size = victim_size - nb; - - if (remainder_size >= (long)MINSIZE) /* too big */ - { - --idx; /* adjust to rescan below after checking last remainder */ - break; - } - - else if (remainder_size >= 0) /* exact fit */ - { - unlink(victim, bck, fwd); - set_inuse_bit_at_offset(victim, victim_size); - check_freefill(victim, victim_size, victim_size); - init_malloced_chunk(victim, bytes); - check_malloced_chunk(victim, nb); - return chunk2mem(victim); - } - } - - ++idx; - - } - - /* Try to use the last split-off remainder */ - - if ( (victim = last_remainder->fd) != last_remainder) - { - victim_size = chunksize(victim); - remainder_size = victim_size - nb; - - if (remainder_size >= (long)MINSIZE) /* re-split */ - { - remainder = chunk_at_offset(victim, nb); - set_head(victim, nb | PREV_INUSE); - check_freefill(victim, nb, victim_size); - init_malloced_chunk(victim, bytes); - link_last_remainder(remainder); - set_head(remainder, remainder_size | PREV_INUSE); - set_foot(remainder, remainder_size); - init_freed_chunk(remainder, remainder_size, 0); - check_malloced_chunk(victim, nb); - return chunk2mem(victim); - } - - clear_last_remainder; - - if (remainder_size >= 0) /* exhaust */ - { - set_inuse_bit_at_offset(victim, victim_size); - check_freefill(victim, victim_size, victim_size); - init_malloced_chunk(victim, bytes); - check_malloced_chunk(victim, nb); - return chunk2mem(victim); - } - - /* Else place in bin */ - - frontlink(victim, victim_size, remainder_index, bck, fwd); - } - - /* - If there are any possibly nonempty big-enough blocks, - search for best fitting chunk by scanning bins in blockwidth units. - */ - - if ( (block = idx2binblock(idx)) <= binblocks) - { - - /* Get to the first marked block */ - - if ( (block & binblocks) == 0) - { - /* force to an even block boundary */ - idx = (idx & ~(BINBLOCKWIDTH - 1)) + BINBLOCKWIDTH; - block <<= 1; - while ((block & binblocks) == 0) - { - idx += BINBLOCKWIDTH; - block <<= 1; - } - } - - /* For each possibly nonempty block ... */ - for (;;) - { - startidx = idx; /* (track incomplete blocks) */ - q = bin = bin_at(idx); - - /* For each bin in this block ... */ - do - { - /* Find and use first big enough chunk ... */ - - for (victim = last(bin); victim != bin; victim = victim->bk) - { - victim_size = chunksize(victim); - remainder_size = victim_size - nb; - - if (remainder_size >= (long)MINSIZE) /* split */ - { - remainder = chunk_at_offset(victim, nb); - set_head(victim, nb | PREV_INUSE); - check_freefill(victim, nb, victim_size); - unlink(victim, bck, fwd); - init_malloced_chunk(victim, bytes); - link_last_remainder(remainder); - set_head(remainder, remainder_size | PREV_INUSE); - set_foot(remainder, remainder_size); - init_freed_chunk(remainder, remainder_size, 0); - check_malloced_chunk(victim, nb); - return chunk2mem(victim); - } - - else if (remainder_size >= 0) /* take */ - { - check_freefill(victim, victim_size, victim_size); - set_inuse_bit_at_offset(victim, victim_size); - unlink(victim, bck, fwd); - init_malloced_chunk(victim, bytes); - check_malloced_chunk(victim, nb); - return chunk2mem(victim); - } - - } - - bin = next_bin(bin); - - } while ((++idx & (BINBLOCKWIDTH - 1)) != 0); - - /* Clear out the block bit. */ - - do /* Possibly backtrack to try to clear a partial block */ - { - if ((startidx & (BINBLOCKWIDTH - 1)) == 0) - { - binblocks &= ~block; - break; - } - --startidx; - q = prev_bin(q); - } while (first(q) == q); - - /* Get to the next possibly nonempty block */ - - if ( (block <<= 1) <= binblocks && (block != 0) ) - { - while ((block & binblocks) == 0) - { - idx += BINBLOCKWIDTH; - block <<= 1; - } - } - else - break; - } - } - - - /* Try to use top chunk */ - - /* Require that there be a remainder, ensuring top always exists */ - if ( (remainder_size = chunksize(top) - nb) < (long)MINSIZE) - { - -#if HAVE_MMAP - /* If big and would otherwise need to extend, try to use mmap instead */ - if ((unsigned long)nb >= (unsigned long)mmap_threshold && - (victim = mmap_chunk(nb)) != 0) { - init_malloced_chunk(victim, bytes); - return chunk2mem(victim); - } -#endif - - /* Try to extend */ - malloc_extend_top(nb); - if ( (remainder_size = chunksize(top) - nb) < (long)MINSIZE) - return 0; /* propagate failure */ - } - - victim = top; - set_head(victim, nb | PREV_INUSE); - check_freefill(victim, nb, nb + remainder_size); - init_malloced_chunk(victim, bytes); - top = chunk_at_offset(victim, nb); - set_head(top, remainder_size | PREV_INUSE); - init_freed_chunk(top, remainder_size, 0); - check_malloced_chunk(victim, nb); - return chunk2mem(victim); - -} - - - - -/* - - free() algorithm : - - cases: - - 1. free(0) has no effect. - - 2. If the chunk was allocated via mmap, it is release via munmap(). - - 3. If a returned chunk borders the current high end of memory, - it is consolidated into the top, and if the total unused - topmost memory exceeds the trim threshold, malloc_trim is - called. - - 4. Other chunks are consolidated as they arrive, and - placed in corresponding bins. (This includes the case of - consolidating with the current `last_remainder'). - -*/ - - -#if __STD_C -void fREe(Void_t* mem) -#else -void fREe(mem) Void_t* mem; -#endif -{ - mchunkptr p; /* chunk corresponding to mem */ - INTERNAL_SIZE_T hd; /* its head field */ - INTERNAL_SIZE_T sz; /* its size */ - int idx; /* its bin index */ - mchunkptr next; /* next contiguous chunk */ - INTERNAL_SIZE_T nextsz; /* its size */ - INTERNAL_SIZE_T prevsz; /* size of previous contiguous chunk */ - mchunkptr bck; /* misc temp for linking */ - mchunkptr fwd; /* misc temp for linking */ - int islr; /* track whether merging with last_remainder */ - - if (mem == 0) /* free(0) has no effect */ - return; - - p = mem2chunk(mem); - check_inuse_chunk(p); - - hd = p->size; - -#if HAVE_MMAP - if (hd & IS_MMAPPED) /* release mmapped memory. */ - { - munmap_chunk(p); - return; - } -#endif - - sz = hd & ~PREV_INUSE; - next = chunk_at_offset(p, sz); - nextsz = chunksize(next); - prevsz = 0; /* avoid compiler warnings */ - - if (next == top) /* merge with top */ - { - sz += nextsz; - - if (!(hd & PREV_INUSE)) /* consolidate backward */ - { - prevsz = p->prev_size; - p = chunk_at_offset(p, -(long)prevsz); - sz += prevsz; - unlink(p, bck, fwd); - } - - set_head(p, sz | PREV_INUSE); - top = p; - init_freed_chunk(top, !(hd & PREV_INUSE) ? prevsz : 0, nextsz); - if ((unsigned long)(sz) >= trim_threshold) - malloc_trim(top_pad); - return; - } - - set_head(next, nextsz); /* clear inuse bit */ - - islr = 0; - - if (!(hd & PREV_INUSE)) /* consolidate backward */ - { - prevsz = p->prev_size; - p = chunk_at_offset(p, -(long)prevsz); - sz += prevsz; - - if (p->fd == last_remainder) /* keep as last_remainder */ - islr = 1; - else - unlink(p, bck, fwd); - } - - if (!(inuse_bit_at_offset(next, nextsz))) /* consolidate forward */ - { - sz += nextsz; - - if (!islr && next->fd == last_remainder) /* re-insert last_remainder */ - { - islr = 1; - link_last_remainder(p); - } - else - unlink(next, bck, fwd); - } - - - set_head(p, sz | PREV_INUSE); - set_foot(p, sz); - if (!islr) - frontlink(p, sz, idx, bck, fwd); - init_freed_chunk(p, !(hd & PREV_INUSE) ? prevsz : 0, - !inuse_bit_at_offset(next, nextsz) ? nextsz : 0); -} - - - - - -/* - - Realloc algorithm: - - Chunks that were obtained via mmap cannot be extended or shrunk - unless HAVE_MREMAP is defined, in which case mremap is used. - Otherwise, if their reallocation is for additional space, they are - copied. If for less, they are just left alone. - - Otherwise, if the reallocation is for additional space, and the - chunk can be extended, it is, else a malloc-copy-free sequence is - taken. There are several different ways that a chunk could be - extended. All are tried: - - * Extending forward into following adjacent free chunk. - * Shifting backwards, joining preceding adjacent space - * Both shifting backwards and extending forward. - * Extending into newly sbrked space - - Unless the #define realloc_ZERO_BYTES_FREES is set, realloc with a - size argument of zero (re)allocates a minimum-sized chunk. - - If the reallocation is for less space, and the new request is for - a `small' (<512 bytes) size, then the newly unused space is lopped - off and freed. - - The old unix realloc convention of allowing the last-free'd chunk - to be used as an argument to realloc is no longer supported. - I don't know of any programs still relying on this feature, - and allowing it would also allow too many other incorrect - usages of realloc to be sensible. - - -*/ - - -#if __STD_C -Void_t* rEALLOc(Void_t* oldmem, size_t bytes) -#else -Void_t* rEALLOc(oldmem, bytes) Void_t* oldmem; size_t bytes; -#endif -{ - INTERNAL_SIZE_T nb; /* padded request size */ - - mchunkptr oldp; /* chunk corresponding to oldmem */ - INTERNAL_SIZE_T oldsize; /* its size */ - - mchunkptr newp; /* chunk to return */ - INTERNAL_SIZE_T newsize; /* its size */ - Void_t* newmem; /* corresponding user mem */ - - mchunkptr next; /* next contiguous chunk after oldp */ - INTERNAL_SIZE_T nextsize; /* its size */ - - mchunkptr prev; /* previous contiguous chunk before oldp */ - INTERNAL_SIZE_T prevsize; /* its size */ - - mchunkptr remainder; /* holds split off extra space from newp */ - INTERNAL_SIZE_T remainder_size; /* its size */ - - mchunkptr bck; /* misc temp for linking */ - mchunkptr fwd; /* misc temp for linking */ - -#ifdef realloc_ZERO_BYTES_FREES - if (bytes == 0) { fREe(oldmem); return 0; } -#endif - - - /* realloc of null is supposed to be same as malloc */ - if (oldmem == 0) return mALLOc(bytes); - - newp = oldp = mem2chunk(oldmem); - newsize = oldsize = chunksize(oldp); - - - nb = request2size(bytes); - - check_inuse_chunk(oldp); - -#if HAVE_MMAP - if (chunk_is_mmapped(oldp)) - { - if (oldsize - MMAP_EXTRA >= nb) { - init_realloced_chunk(oldp, bytes, oldsize); - return oldmem; /* do nothing */ - } -#if HAVE_MREMAP - newp = mremap_chunk(oldp, nb); - if (newp) { - init_realloced_chunk(newp, bytes, oldsize); - return chunk2mem(newp); - } -#endif - /* Must alloc, copy, free. */ - newmem = mALLOc(bytes); - if (newmem == 0) return 0; /* propagate failure */ - malloc_COPY(newmem, oldmem, oldsize - OVERHEAD - MMAP_EXTRA); - munmap_chunk(oldp); - return newmem; - } -#endif - - if (oldsize < nb) - { - - /* Try expanding forward */ - - next = chunk_at_offset(oldp, oldsize); - if (next == top || !inuse(next)) - { - nextsize = chunksize(next); - - /* Forward into top only if a remainder */ - if (next == top) - { - if ((long)(nextsize + newsize) >= (long)(nb + MINSIZE)) - { - check_freefill(next, nb - oldsize, nextsize); - newsize += nextsize; - top = chunk_at_offset(oldp, nb); - set_head(top, (newsize - nb) | PREV_INUSE); - init_freed_chunk(top, newsize - nb, 0); - set_head_size(oldp, nb); - init_realloced_chunk(oldp, bytes, oldsize); - return chunk2mem(oldp); - } - } - - /* Forward into next chunk */ - else if (((long)(nextsize + newsize) >= (long)nb)) - { - check_freefill(next, nb - oldsize, nextsize); - unlink(next, bck, fwd); - newsize += nextsize; - goto split; - } - } - else - { - next = 0; - nextsize = 0; - } - - /* Try shifting backwards. */ - - if (!prev_inuse(oldp)) - { - prev = prev_chunk(oldp); - prevsize = chunksize(prev); - - /* try forward + backward first to save a later consolidation */ - - if (next != 0) - { - /* into top */ - if (next == top) - { - if ((long)(nextsize + prevsize + newsize) >= (long)(nb + MINSIZE)) - { - check_freefill(prev, nb, prevsize); - check_freefill(next, nb - (prevsize + newsize), nextsize); - unlink(prev, bck, fwd); - newp = prev; - newsize += prevsize + nextsize; - newmem = chunk2mem(newp); - malloc_COPY(newmem, oldmem, oldsize - OVERHEAD); - top = chunk_at_offset(newp, nb); - set_head(top, (newsize - nb) | PREV_INUSE); - init_freed_chunk(top, newsize - nb, 0); - set_head_size(newp, nb); - init_realloced_chunk(newp, bytes, oldsize); - return newmem; - } - } - - /* into next chunk */ - else if (((long)(nextsize + prevsize + newsize) >= (long)(nb))) - { - check_freefill(prev, nb, prevsize); - check_freefill(next, nb - (prevsize + newsize), nextsize); - unlink(next, bck, fwd); - unlink(prev, bck, fwd); - newp = prev; - newsize += nextsize + prevsize; - newmem = chunk2mem(newp); - malloc_COPY(newmem, oldmem, oldsize - OVERHEAD); - goto split; - } - } - - /* backward only */ - if (prev != 0 && (long)(prevsize + newsize) >= (long)nb) - { - check_freefill(prev, nb, prevsize); - unlink(prev, bck, fwd); - newp = prev; - newsize += prevsize; - newmem = chunk2mem(newp); - malloc_COPY(newmem, oldmem, oldsize - OVERHEAD); - goto split; - } - } - - /* Must allocate */ - - newmem = mALLOc (bytes); - - if (newmem == 0) /* propagate failure */ - return 0; - - /* Avoid copy if newp is next chunk after oldp. */ - /* (This can only happen when new chunk is sbrk'ed.) */ - - if ( (newp = mem2chunk(newmem)) == next_chunk(oldp)) - { - newsize += chunksize(newp); - newp = oldp; - goto split; - } - - /* Otherwise copy, free, and exit */ - malloc_COPY(newmem, oldmem, oldsize - OVERHEAD); - fREe(oldmem); - return newmem; - } - - - split: /* split off extra room in old or expanded chunk */ - - if (newsize - nb >= MINSIZE) /* split off remainder */ - { - remainder = chunk_at_offset(newp, nb); - remainder_size = newsize - nb; - set_head_size(newp, nb); - set_head(remainder, remainder_size | PREV_INUSE); - set_inuse_bit_at_offset(remainder, remainder_size); - init_malloced_chunk(remainder, remainder_size - OVERHEAD); - fREe(chunk2mem(remainder)); /* let free() deal with it */ - } - else - { - set_head_size(newp, newsize); - set_inuse_bit_at_offset(newp, newsize); - } - - init_realloced_chunk(newp, bytes, oldsize); - check_inuse_chunk(newp); - return chunk2mem(newp); -} - - - - -/* - - memalign algorithm: - - memalign requests more than enough space from malloc, finds a spot - within that chunk that meets the alignment request, and then - possibly frees the leading and trailing space. - - The alignment argument must be a power of two. This property is not - checked by memalign, so misuse may result in random runtime errors. - - 8-byte alignment is guaranteed by normal malloc calls, so don't - bother calling memalign with an argument of 8 or less. - - Overreliance on memalign is a sure way to fragment space. - -*/ - - -#if __STD_C -Void_t* mEMALIGn(size_t alignment, size_t bytes) -#else -Void_t* mEMALIGn(alignment, bytes) size_t alignment; size_t bytes; -#endif -{ - INTERNAL_SIZE_T nb; /* padded request size */ - char* m; /* memory returned by malloc call */ - mchunkptr p; /* corresponding chunk */ - char* lim; /* alignment point within p */ - mchunkptr newp; /* chunk to return */ - INTERNAL_SIZE_T newsize; /* its size */ - INTERNAL_SIZE_T leadsize; /* leading space befor alignment point */ - mchunkptr remainder; /* spare room at end to split off */ - long remainder_size; /* its size */ - - /* If need less alignment than we give anyway, just relay to malloc */ - - if (alignment <= ALIGNMENT) return mALLOc(bytes); - - /* Otherwise, ensure that it is at least a minimum chunk size */ - - if (alignment < MINSIZE) alignment = MINSIZE; - - /* Call malloc with worst case padding to hit alignment. */ - - nb = request2size(bytes); - m = (char*)mALLOc(nb + alignment + MINSIZE); - - if (m == 0) return 0; /* propagate failure */ - - p = mem2chunk(m); - - if ((((unsigned long)(m)) % alignment) == 0) /* aligned */ - { - init_realloced_chunk(p, bytes, chunksize(p)); - return chunk2mem(p); /* nothing more to do */ - } - else /* misaligned */ - { - /* - Find an aligned spot inside chunk. - Since we need to give back leading space in a chunk of at - least MINSIZE, if the first calculation places us at - a spot with less than MINSIZE leader, we can move to the - next aligned spot -- we've allocated enough total room so that - this is always possible. - */ - - lim = (char*)mem2chunk(((unsigned long)(m + alignment - 1)) & - ~(alignment - 1)); - if ((lim - (char*)p) < (long)MINSIZE) lim = lim + alignment; - - newp = (mchunkptr)lim; - leadsize = lim - (char*)p; - newsize = chunksize(p) - leadsize; - -#if HAVE_MMAP - if(chunk_is_mmapped(p)) - { - newp->prev_size = p->prev_size + leadsize; - set_head(newp, newsize|IS_MMAPPED); - init_malloced_chunk(newp, bytes); - return chunk2mem(newp); - } -#endif - - /* give back leader, use the rest */ - - set_head(newp, newsize | PREV_INUSE); - set_inuse_bit_at_offset(newp, newsize); - set_head_size(p, leadsize); - init_freeable_chunk(p); - fREe(chunk2mem(p)); - p = newp; - - assert (newsize >= nb && (((unsigned long)(chunk2mem(p))) % alignment) == 0); - } - - /* Also give back spare room at the end */ - - remainder_size = chunksize(p) - nb; - - if (remainder_size >= (long)MINSIZE) - { - remainder = chunk_at_offset(p, nb); - set_head(remainder, remainder_size | PREV_INUSE); - set_head_size(p, nb); - init_freeable_chunk(remainder); - fREe(chunk2mem(remainder)); - } - - init_malloced_chunk(p, bytes); - check_inuse_chunk(p); - return chunk2mem(p); - -} - - - - -/* - valloc just invokes memalign with alignment argument equal - to the page size of the system (or as near to this as can - be figured out from all the includes/defines above.) -*/ - -#if __STD_C -Void_t* vALLOc(size_t bytes) -#else -Void_t* vALLOc(bytes) size_t bytes; -#endif -{ - return mEMALIGn (malloc_getpagesize, bytes); -} - -/* - pvalloc just invokes valloc for the nearest pagesize - that will accommodate request -*/ - - -#if __STD_C -Void_t* pvALLOc(size_t bytes) -#else -Void_t* pvALLOc(bytes) size_t bytes; -#endif -{ - size_t pagesize = malloc_getpagesize; - return mEMALIGn (pagesize, (bytes + pagesize - 1) & ~(pagesize - 1)); -} - -/* - - calloc calls malloc, then zeroes out the allocated chunk. - -*/ - -#if __STD_C -Void_t* cALLOc(size_t n, size_t elem_size) -#else -Void_t* cALLOc(n, elem_size) size_t n; size_t elem_size; -#endif -{ - mchunkptr p; - INTERNAL_SIZE_T csz; - - INTERNAL_SIZE_T sz = n * elem_size; - - /* check if expand_top called, in which case don't need to clear */ -#if MORECORE_CLEARS - mchunkptr oldtop = top; - INTERNAL_SIZE_T oldtopsize = chunksize(top); -#endif - Void_t* mem = mALLOc (sz); - - if (mem == 0) - return 0; - else - { - p = mem2chunk(mem); - - /* Two optional cases in which clearing not necessary */ - - -#if HAVE_MMAP - if (chunk_is_mmapped(p)) return mem; -#endif - - csz = chunksize(p); - -#if MORECORE_CLEARS - if (p == oldtop && csz > oldtopsize) - { - /* clear only the bytes from non-freshly-sbrked memory */ - csz = oldtopsize; - } -#endif - - malloc_ZERO(mem, csz - OVERHEAD); - /* reinstate moat fill in pad region */ - init_realloced_chunk(p, sz, chunksize(p)); - return mem; - } -} - - - -/* - - Malloc_trim gives memory back to the system (via negative - arguments to sbrk) if there is unused memory at the `high' end of - the malloc pool. You can call this after freeing large blocks of - memory to potentially reduce the system-level memory requirements - of a program. However, it cannot guarantee to reduce memory. Under - some allocation patterns, some large free blocks of memory will be - locked between two used chunks, so they cannot be given back to - the system. - - The `pad' argument to malloc_trim represents the amount of free - trailing space to leave untrimmed. If this argument is zero, - only the minimum amount of memory to maintain internal data - structures will be left (one page or less). Non-zero arguments - can be supplied to maintain enough trailing space to service - future expected allocations without having to re-obtain memory - from the system. - - Malloc_trim returns 1 if it actually released any memory, else 0. - -*/ - -#if __STD_C -int dlmalloc_trim(size_t pad) -#else -int malloc_trim(pad) size_t pad; -#endif -{ - long top_size; /* Amount of top-most memory */ - long extra; /* Amount to release */ - char* current_lim; /* address returned by pre-check sbrk call */ - char* new_lim; /* address returned by negative sbrk call */ - - unsigned long pagesz = malloc_getpagesize; - - top_size = chunksize(top); - extra = ((top_size - pad - MINSIZE + (pagesz-1)) / pagesz - 1) * pagesz; - - if (extra < (long)pagesz) /* Not enough memory to release */ - return 0; - - else - { -#ifdef OTHER_SBRKS - /* Test to make sure no one else called sbrk */ - current_lim = (char*)(MORECORE (0)); - if (current_lim != (char*)(top) + top_size) - return 0; /* Apparently we don't own memory; must fail */ - - else -#endif - { - new_lim = (char*)(MORECORE (-extra)); - - if (new_lim == (char*)(MORECORE_FAILURE)) /* sbrk failed? */ - { - /* Try to figure out what we have */ - current_lim = (char*)(MORECORE (0)); - top_size = current_lim - (char*)top; - if (top_size >= (long)MINSIZE) /* if not, we are very very dead! */ - { - sbrked_mem = current_lim - sbrk_base; - set_head(top, top_size | PREV_INUSE); - init_freed_chunk(top, top_size, 0); - } - check_chunk(top); - return 0; - } - - else - { - /* Success. Adjust top accordingly. */ - set_head(top, (top_size - extra) | PREV_INUSE); - sbrked_mem -= extra; - init_freed_chunk(top, top_size - extra, 0); - check_chunk(top); - return 1; - } - } - } -} - - - -/* - malloc_usable_size: - - This routine tells you how many bytes you can actually use in an - allocated chunk, which may be more than you requested (although - often not). You can use this many bytes without worrying about - overwriting other allocated objects. Not a particularly great - programming practice, but still sometimes useful. - -*/ - -#if __STD_C -size_t dlmalloc_usable_size(Void_t* mem) -#else -size_t malloc_usable_size(mem) Void_t* mem; -#endif -{ - mchunkptr p; - if (mem == 0) - return 0; - else - { - p = mem2chunk(mem); - check_inuse_chunk(p); - maximize_chunk(p); - if(!chunk_is_mmapped(p)) - { - if (!inuse(p)) return 0; - return chunksize(p) - OVERHEAD; - } - return chunksize(p) - OVERHEAD - MMAP_EXTRA; - } -} - - - - -/* Utility to update current_mallinfo for malloc_stats and mallinfo() */ - -static void malloc_update_mallinfo(void) -{ - int i; - mbinptr b; - mchunkptr p; -#if DEBUG - mchunkptr q; -#endif - - INTERNAL_SIZE_T avail = chunksize(top); - int navail = avail >= MINSIZE ? 1 : 0; - check_freefill(top, avail, avail); - -#if DEBUG - if (lowest_chunk) - for (p = lowest_chunk; - p < top && inuse(p) && chunksize(p) >= MINSIZE; - p = next_chunk(p)) - check_inuse_chunk(p); -#endif - - for (i = 1; i < NAV; ++i) - { - b = bin_at(i); - for (p = last(b); p != b; p = p->bk) - { -#if DEBUG - check_free_chunk(p); - check_freefill(p, chunksize(p), chunksize(p)); - for (q = next_chunk(p); - q < top && inuse(q) && chunksize(q) >= MINSIZE; - q = next_chunk(q)) - check_inuse_chunk(q); -#endif - avail += chunksize(p); - navail++; - } - } - - current_mallinfo.ordblks = navail; - current_mallinfo.uordblks = sbrked_mem - avail; - current_mallinfo.fordblks = avail; - current_mallinfo.hblks = n_mmaps; - current_mallinfo.hblkhd = mmapped_mem; - current_mallinfo.keepcost = chunksize(top); - -} - - - -/* - - malloc_stats: - - Prints on stderr the amount of space obtain from the system (both - via sbrk and mmap), the maximum amount (which may be more than - current if malloc_trim and/or munmap got called), the maximum - number of simultaneous mmap regions used, and the current number - of bytes allocated via malloc (or realloc, etc) but not yet - freed. (Note that this is the number of bytes allocated, not the - number requested. It will be larger than the number requested - because of alignment and bookkeeping overhead.) - -*/ - -void dlmalloc_stats(void) -{ - malloc_update_mallinfo(); - fprintf(stderr, "max system bytes = %10u\n", - (unsigned int)(max_total_mem)); - fprintf(stderr, "system bytes = %10u\n", - (unsigned int)(sbrked_mem + mmapped_mem)); - fprintf(stderr, "in use bytes = %10u\n", - (unsigned int)(current_mallinfo.uordblks + mmapped_mem)); -#if HAVE_MMAP - fprintf(stderr, "max mmap regions = %10u\n", - (unsigned int)max_n_mmaps); -#endif -} - -/* - mallinfo returns a copy of updated current mallinfo. -*/ - -struct mallinfo mALLINFo(void) -{ - malloc_update_mallinfo(); - return current_mallinfo; -} - - - - -/* - mallopt: - - mallopt is the general SVID/XPG interface to tunable parameters. - The format is to provide a (parameter-number, parameter-value) pair. - mallopt then sets the corresponding parameter to the argument - value if it can (i.e., so long as the value is meaningful), - and returns 1 if successful else 0. - - See descriptions of tunable parameters above. - -*/ - -#if __STD_C -int mALLOPt(int param_number, int value) -#else -int mALLOPt(param_number, value) int param_number; int value; -#endif -{ - switch(param_number) - { - case M_TRIM_THRESHOLD: - trim_threshold = value; return 1; - case M_TOP_PAD: - top_pad = value; return 1; - case M_MMAP_THRESHOLD: - mmap_threshold = value; return 1; - case M_MMAP_MAX: -#if HAVE_MMAP - n_mmaps_max = value; return 1; -#else - if (value != 0) return 0; else n_mmaps_max = value; return 1; -#endif - case M_SCANHEAP: -#ifdef DEBUG2 - scanheap = value; -#endif - return 1; - - default: - return 0; - } -} - -/* - -History: - - V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) - * Added pvalloc, as recommended by H.J. Liu - * Added 64bit pointer support mainly from Wolfram Gloger - * Added anonymously donated WIN32 sbrk emulation - * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen - * malloc_extend_top: fix mask error that caused wastage after - foreign sbrks - * Add linux mremap support code from HJ Liu - - V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) - * Integrated most documentation with the code. - * Add support for mmap, with help from - Wolfram Gloger (Gloger@lrz.uni-muenchen.de). - * Use last_remainder in more cases. - * Pack bins using idea from colin@nyx10.cs.du.edu - * Use ordered bins instead of best-fit threshhold - * Eliminate block-local decls to simplify tracing and debugging. - * Support another case of realloc via move into top - * Fix error occuring when initial sbrk_base not word-aligned. - * Rely on page size for units instead of SBRK_UNIT to - avoid surprises about sbrk alignment conventions. - * Add mallinfo, mallopt. Thanks to Raymond Nijssen - (raymond@es.ele.tue.nl) for the suggestion. - * Add `pad' argument to malloc_trim and top_pad mallopt parameter. - * More precautions for cases where other routines call sbrk, - courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). - * Added macros etc., allowing use in linux libc from - H.J. Lu (hjl@gnu.ai.mit.edu) - * Inverted this history list - - V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) - * Re-tuned and fixed to behave more nicely with V2.6.0 changes. - * Removed all preallocation code since under current scheme - the work required to undo bad preallocations exceeds - the work saved in good cases for most test programs. - * No longer use return list or unconsolidated bins since - no scheme using them consistently outperforms those that don't - given above changes. - * Use best fit for very large chunks to prevent some worst-cases. - * Added some support for debugging - - V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) - * Removed footers when chunks are in use. Thanks to - Paul Wilson (wilson@cs.texas.edu) for the suggestion. - - V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) - * Added malloc_trim, with help from Wolfram Gloger - (wmglo@Dent.MED.Uni-Muenchen.DE). - - V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) - - V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) - * realloc: try to expand in both directions - * malloc: swap order of clean-bin strategy; - * realloc: only conditionally expand backwards - * Try not to scavenge used bins - * Use bin counts as a guide to preallocation - * Occasionally bin return list chunks in first scan - * Add a few optimizations from colin@nyx10.cs.du.edu - - V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) - * faster bin computation & slightly different binning - * merged all consolidations to one part of malloc proper - (eliminating old malloc_find_space & malloc_clean_bin) - * Scan 2 returns chunks (not just 1) - * Propagate failure in realloc if malloc returns 0 - * Add stuff to allow compilation on non-ANSI compilers - from kpv@research.att.com - - V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) - * removed potential for odd address access in prev_chunk - * removed dependency on getpagesize.h - * misc cosmetics and a bit more internal documentation - * anticosmetics: mangled names in macros to evade debugger strangeness - * tested on sparc, hp-700, dec-mips, rs6000 - with gcc & native cc (hp, dec only) allowing - Detlefs & Zorn comparison study (in SIGPLAN Notices.) - - Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) - * Based loosely on libg++-1.2X malloc. (It retains some of the overall - structure of old version, but most details differ.) - -*/ diff --git a/winsup/cygwin/dlmalloc.h b/winsup/cygwin/dlmalloc.h deleted file mode 100644 index d7bd86927..000000000 --- a/winsup/cygwin/dlmalloc.h +++ /dev/null @@ -1,93 +0,0 @@ - -/* - * Header file for BBCized version of Doug Lea's malloc.c, automatically - * generated by - * /source/prod/libbbc/compat/dlmalloc/cvt - * from - * /source/prod/libbbc/compat/dlmalloc/malloc.c - * - * bbclabel: autogenerated - */ -#define _INCLUDE_MALLOC_H_ 1 -void malloc_outofmem(void (*)(void)); - - -struct mallinfo { - int arena; /* total space allocated from system */ - int ordblks; /* number of non-inuse chunks */ - int smblks; /* unused -- always zero */ - int hblks; /* number of mmapped regions */ - int hblkhd; /* total space in mmapped regions */ - int usmblks; /* unused -- always zero */ - int fsmblks; /* unused -- always zero */ - int uordblks; /* total allocated space */ - int fordblks; /* total non-inuse space */ - int keepcost; /* top-most, releasable (via malloc_trim) space */ -}; - - -#define M_MXFAST 1 /* UNUSED in this malloc */ -#define M_NLBLKS 2 /* UNUSED in this malloc */ -#define M_GRAIN 3 /* UNUSED in this malloc */ -#define M_KEEP 4 /* UNUSED in this malloc */ - - -#define M_TRIM_THRESHOLD -1 -#define M_TOP_PAD -2 -#define M_MMAP_THRESHOLD -3 -#define M_MMAP_MAX -4 -#define M_SCANHEAP -5 -#define M_FILL - -#ifdef MALLOC_DEBUG - -#define dlmalloc(size) malloc_dbg(size, __FILE__, __LINE__) -#define dlfree(p) free_dbg(p, __FILE__, __LINE__) -#define dlrealloc(p, size) realloc_dbg(p, size, __FILE__, __LINE__) -#define dlcalloc(n, size) calloc_dbg(n, size, __FILE__, __LINE__) -#define dlmemalign(align, size) memalign_dbg(align, size, __FILE__, __LINE__) -#define dlvalloc(size) valloc_dbg(size, __FILE__, __LINE__) -#define dlpvalloc(size) pvalloc_dbg(size, __FILE__, __LINE__) -#define dlmalloc_trim(pad) malloc_trim_dbg(pad, __FILE__, __LINE__) -#define dlmalloc_usable_size(p) malloc_usable_size_dbg(p, __FILE__, __LINE__) -#define dlmalloc_stats() malloc_stats_dbg(__FILE__, __LINE__) -#define dlmallopt(flag, val) mallopt_dbg(flag, val, __FILE__, __LINE__) -#define dlmallinfo() mallinfo_dbg(__FILE__, __LINE__) - - -#ifdef __cplusplus -extern "C" { -#endif -void* malloc_dbg(size_t, const char *, int); -void free_dbg(void*, const char *, int); -void* realloc_dbg(void*, size_t, const char *, int); -void* calloc_dbg(size_t, size_t, const char *, int); -void* memalign_dbg(size_t, size_t, const char *, int); -void* valloc_dbg(size_t, const char *, int); -void* pvalloc_dbg(size_t, const char *, int); -int malloc_trim_dbg(size_t, const char *, int); -size_t malloc_usable_size_dbg(void*, const char *, int); -void malloc_stats_dbg(const char *, int); -int mallopt_dbg(int, int, const char *, int); -struct mallinfo mallinfo_dbg(const char *, int); -#ifdef __cplusplus -} -#endif - -#endif /* MALLOC_DEBUG */ - -#ifndef MALLOC_DEBUG - -void* malloc(size_t); -void free(void*); -void* realloc(void*, size_t); -void* calloc(size_t, size_t); -void* memalign(size_t, size_t); -void* valloc(size_t); -void* pvalloc(size_t); -int malloc_trim(size_t); -size_t malloc_usable_size(void*); -void malloc_stats(void); -int mallopt(int, int); -struct mallinfo mallinfo(void); -#endif /* !MALLOC_DEBUG */ diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc deleted file mode 100644 index 8996e8587..000000000 --- a/winsup/cygwin/dtable.cc +++ /dev/null @@ -1,912 +0,0 @@ -/* dtable.cc: file descriptor support. - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#define __INSIDE_CYGWIN_NET__ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include - -#define USE_SYS_TYPES_FD_SET -#include -#include "pinfo.h" -#include "cygerrno.h" -#include "perprocess.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "ntdll.h" -#include "tty.h" - -static const char NO_COPY unknown_file[] = "some disk file"; - -static const NO_COPY DWORD std_consts[] = {STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, - STD_ERROR_HANDLE}; - -static const char *handle_to_fn (HANDLE, char *); - -/* Set aside space for the table of fds */ -void -dtable_init () -{ - if (!cygheap->fdtab.size) - cygheap->fdtab.extend (NOFILE_INCR); -} - -void __stdcall -set_std_handle (int fd) -{ - if (fd == 0) - SetStdHandle (std_consts[fd], cygheap->fdtab[fd]->get_handle ()); - else if (fd <= 2) - SetStdHandle (std_consts[fd], cygheap->fdtab[fd]->get_output_handle ()); -} - -int -dtable::extend (int howmuch) -{ - int new_size = size + howmuch; - fhandler_base **newfds; - - if (howmuch <= 0) - return 0; - - if (new_size > (100 * NOFILE_INCR)) - { - set_errno (EMFILE); - return 0; - } - - /* Try to allocate more space for fd table. We can't call realloc () - here to preserve old table if memory allocation fails */ - - if (!(newfds = (fhandler_base **) ccalloc (HEAP_ARGV, new_size, sizeof newfds[0]))) - { - debug_printf ("calloc failed"); - set_errno (ENOMEM); - return 0; - } - if (fds) - { - memcpy (newfds, fds, size * sizeof (fds[0])); - cfree (fds); - } - - size = new_size; - fds = newfds; - debug_printf ("size %d, fds %p", size, fds); - return 1; -} - -void -dtable::get_debugger_info () -{ - if (being_debugged ()) - { - char std[3][sizeof ("/dev/ttyNNNN")]; - std[0][0] = std[1][0] = std [2][0] = '\0'; - char buf[sizeof ("cYgstd %x") + 32]; - sprintf (buf, "cYgstd %x %x %x", (unsigned) &std, sizeof (std[0]), 3); - OutputDebugString (buf); - for (int i = 0; i < 3; i++) - if (std[i][0]) - { - HANDLE h = GetStdHandle (std_consts[i]); - fhandler_base *fh = build_fh_name (std[i]); - if (!fh) - continue; - fds[i] = fh; - if (!fh->open ((i ? (i == 2 ? O_RDWR : O_WRONLY) : O_RDONLY) - | O_BINARY, 0777)) - release (i); - else - CloseHandle (h); - } - } -} - -/* Initialize the file descriptor/handle mapping table. - This function should only be called when a cygwin function is invoked - by a non-cygwin function, i.e., it should only happen very rarely. */ - -void -dtable::stdio_init () -{ - extern void set_console_ctty (); - /* Set these before trying to output anything from strace. - Also, always set them even if we're to pick up our parent's fds - in case they're missed. */ - - if (myself->cygstarted || ISSTATE (myself, PID_CYGPARENT)) - return; - - HANDLE in = GetStdHandle (STD_INPUT_HANDLE); - HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE); - HANDLE err = GetStdHandle (STD_ERROR_HANDLE); - - init_std_file_from_handle (0, in); - - /* STD_ERROR_HANDLE has been observed to be the same as - STD_OUTPUT_HANDLE. We need separate handles (e.g. using pipes - to pass data from child to parent). */ - if (out == err) - { - /* Since this code is not invoked for forked tasks, we don't have - to worry about the close-on-exec flag here. */ - if (!DuplicateHandle (hMainProc, out, hMainProc, &err, 0, - 1, DUPLICATE_SAME_ACCESS)) - { - /* If that fails, do this as a fall back. */ - err = out; - system_printf ("couldn't make stderr distinct from stdout"); - } - } - - init_std_file_from_handle (1, out); - init_std_file_from_handle (2, err); - - /* Assign the console as the controlling tty for this process if we actually - have a console and no other controlling tty has been assigned. */ - if (!fhandler_console::need_invisible () && myself->ctty < 0) - set_console_ctty (); -} - -const int dtable::initial_archetype_size; - -fhandler_base * -dtable::find_archetype (device& dev) -{ - for (unsigned i = 0; i < farchetype; i++) - if (archetypes[i]->get_device () == (unsigned) dev) - return archetypes[i]; - return NULL; -} - -fhandler_base ** -dtable::add_archetype () -{ - if (farchetype++ >= narchetypes) - archetypes = (fhandler_base **) crealloc (archetypes, (narchetypes += initial_archetype_size) * sizeof archetypes[0]); - return archetypes + farchetype - 1; -} - -void -dtable::delete_archetype (fhandler_base *fh) -{ - for (unsigned i = 0; i < farchetype; i++) - if (fh == archetypes[i]) - { - debug_printf ("deleting element %d for %s", i, fh->get_name ()); - if (i < --farchetype) - archetypes[i] = archetypes[farchetype]; - break; - } - - delete fh; -} - -int -dtable::find_unused_handle (int start) -{ - do - { - for (size_t i = start; i < size; i++) - /* See if open -- no need for overhead of not_open */ - if (fds[i] == NULL) - return i; - } - while (extend (NOFILE_INCR)); - return -1; -} - -void -dtable::release (int fd) -{ - if (!not_open (fd)) - { - if (fds[fd]->need_fixup_before ()) - dec_need_fixup_before (); - fhandler_base *arch = fds[fd]->archetype; - delete fds[fd]; - if (arch && !arch->usecount) - cygheap->fdtab.delete_archetype (arch); - fds[fd] = NULL; - } -} - -extern "C" int -cygwin_attach_handle_to_fd (char *name, int fd, HANDLE handle, mode_t bin, - DWORD myaccess) -{ - if (fd == -1) - fd = cygheap->fdtab.find_unused_handle (); - fhandler_base *fh = build_fh_name (name); - cygheap->fdtab[fd] = fh; - fh->init (handle, myaccess, bin ?: fh->pc_binmode ()); - return fd; -} - -void -dtable::init_std_file_from_handle (int fd, HANDLE handle) -{ - const char *name = NULL; - CONSOLE_SCREEN_BUFFER_INFO buf; - struct sockaddr sa; - int sal = sizeof (sa); - DCB dcb; - unsigned bin = O_BINARY; - device dev; - - dev.devn = 0; /* FIXME: device */ - first_fd_for_open = 0; - - if (!not_open (fd)) - return; - - SetLastError (0); - DWORD ft = GetFileType (handle); - if (ft != FILE_TYPE_UNKNOWN || GetLastError () != ERROR_INVALID_HANDLE) - { - /* See if we can consoleify it */ - if (GetConsoleScreenBufferInfo (handle, &buf)) - { - if (ISSTATE (myself, PID_USETTY)) - dev.parse (FH_TTY); - else - dev = *console_dev; - } - else if (GetNumberOfConsoleInputEvents (handle, (DWORD *) &buf)) - { - if (ISSTATE (myself, PID_USETTY)) - dev.parse (FH_TTY); - else - dev = *console_dev; - } - else if (ft == FILE_TYPE_PIPE) - { - if (fd == 0) - dev = *piper_dev; - else - dev = *pipew_dev; - } - else if (wsock_started && getpeername ((SOCKET) handle, &sa, &sal) == 0) - dev = *tcp_dev; - else if (GetCommState (handle, &dcb)) - dev.parse (DEV_TTYS_MAJOR, 0); - else - { - name = handle_to_fn (handle, (char *) alloca (CYG_MAX_PATH + 100)); - bin = 0; - } - } - - if (!name && !dev) - fds[fd] = NULL; - else - { - fhandler_base *fh; - - if (dev) - fh = build_fh_dev (dev); - else - fh = build_fh_name (name); - - if (fh) - cygheap->fdtab[fd] = fh; - - if (!bin) - { - bin = fh->get_default_fmode (O_RDWR); - if (bin) - /* nothing */; - else if (dev) - bin = O_BINARY; - else if (name != unknown_file) - bin = fh->pc_binmode (); - } - - fh->init (handle, GENERIC_READ | GENERIC_WRITE, bin); - set_std_handle (fd); - paranoid_printf ("fd %d, handle %p", fd, handle); - } -} - -#define cnew(name) new ((void *) ccalloc (HEAP_FHANDLER, 1, sizeof (name))) name -fhandler_base * -build_fh_name (const char *name, HANDLE h, unsigned opt, suffix_info *si) -{ - path_conv pc (name, opt | PC_NULLEMPTY | PC_POSIX, si); - if (pc.error) - { - fhandler_base *fh = cnew (fhandler_nodevice) (); - if (fh) - fh->set_error (pc.error); - set_errno (fh ? pc.error : EMFILE); - return fh; - } - - if (!pc.exists () && h) - pc.fillin (h); - - return build_fh_pc (pc); -} - -fhandler_base * -build_fh_dev (const device& dev, const char *unix_name) -{ - path_conv pc (dev); - if (unix_name) - pc.set_normalized_path (unix_name, false); - else - pc.set_normalized_path (dev.name, false); - return build_fh_pc (pc); -} - -#define fh_unset ((fhandler_base *) 1) -fhandler_base * -build_fh_pc (path_conv& pc) -{ - fhandler_base *fh = fh_unset; - - switch (pc.dev.major) - { - case DEV_TTYS_MAJOR: - fh = cnew (fhandler_tty_slave) (); - break; - case DEV_TTYM_MAJOR: - fh = cnew (fhandler_tty_master) (); - break; - case DEV_CYGDRIVE_MAJOR: - fh = cnew (fhandler_cygdrive) (); - break; - case DEV_FLOPPY_MAJOR: - case DEV_CDROM_MAJOR: - case DEV_SD_MAJOR: - fh = cnew (fhandler_dev_floppy) (); - break; - case DEV_TAPE_MAJOR: - fh = cnew (fhandler_dev_tape) (); - break; - case DEV_SERIAL_MAJOR: - fh = cnew (fhandler_serial) (); - break; - default: - switch (pc.dev) - { - case FH_CONSOLE: - case FH_CONIN: - case FH_CONOUT: - fh = cnew (fhandler_console) (); - break; - case FH_PTYM: - fh = cnew (fhandler_pty_master) (); - break; - case FH_WINDOWS: - fh = cnew (fhandler_windows) (); - break; - case FH_FIFO: - fh = cnew (fhandler_fifo) (); - break; - case FH_PIPE: - case FH_PIPER: - case FH_PIPEW: - fh = cnew (fhandler_pipe) (); - break; - case FH_TCP: - case FH_UDP: - case FH_ICMP: - case FH_UNIX: - case FH_STREAM: - case FH_DGRAM: - fh = cnew (fhandler_socket) (); - break; - case FH_FS: - fh = cnew (fhandler_disk_file) (); - break; - case FH_NULL: - fh = cnew (fhandler_dev_null) (); - break; - case FH_ZERO: - case FH_FULL: - fh = cnew (fhandler_dev_zero) (); - break; - case FH_RANDOM: - case FH_URANDOM: - fh = cnew (fhandler_dev_random) (); - break; - case FH_MEM: - case FH_PORT: - fh = cnew (fhandler_dev_mem) (); - break; - case FH_CLIPBOARD: - fh = cnew (fhandler_dev_clipboard) (); - break; - case FH_OSS_DSP: - fh = cnew (fhandler_dev_dsp) (); - break; - case FH_PROC: - fh = cnew (fhandler_proc) (); - break; - case FH_REGISTRY: - fh = cnew (fhandler_registry) (); - break; - case FH_PROCESS: - fh = cnew (fhandler_process) (); - break; - case FH_NETDRIVE: - fh = cnew (fhandler_netdrive) (); - break; - case FH_TTY: - { - if (myself->ctty == TTY_CONSOLE) - fh = cnew (fhandler_console) (); - else if (myself->ctty >= 0) - fh = cnew (fhandler_tty_slave) (); - break; - } - case FH_KMSG: - fh = cnew (fhandler_mailslot) (); - break; - } - } - - if (fh == fh_unset) - fh = cnew (fhandler_nodevice) (); - - if (fh) - fh->set_name (pc); - else - set_errno (EMFILE); - - debug_printf ("fh %p", fh); - return fh; -} - -fhandler_base * -dtable::dup_worker (fhandler_base *oldfh) -{ - fhandler_base *newfh = build_fh_pc (oldfh->pc); - if (!newfh) - debug_printf ("build_fh_pc failed"); - else - { - *newfh = *oldfh; - newfh->set_io_handle (NULL); - if (oldfh->dup (newfh)) - { - cfree (newfh); - debug_printf ("oldfh->dup failed"); - } - else - { - newfh->close_on_exec (false); - debug_printf ("duped '%s' old %p, new %p", oldfh->get_name (), oldfh->get_io_handle (), newfh->get_io_handle ()); - } - } - return newfh; -} - -int -dtable::dup2 (int oldfd, int newfd) -{ - int res = -1; - fhandler_base *newfh = NULL; // = NULL to avoid an incorrect warning - - MALLOC_CHECK; - debug_printf ("dup2 (%d, %d)", oldfd, newfd); - lock (); - - if (not_open (oldfd)) - { - syscall_printf ("fd %d not open", oldfd); - set_errno (EBADF); - goto done; - } - - if (newfd < 0) - { - syscall_printf ("new fd out of bounds: %d", newfd); - set_errno (EBADF); - goto done; - } - - if (newfd == oldfd) - { - res = 0; - goto done; - } - - if ((newfh = dup_worker (fds[oldfd])) == NULL) - { - res = -1; - goto done; - } - - debug_printf ("newfh->io_handle %p, oldfh->io_handle %p", - newfh->get_io_handle (), fds[oldfd]->get_io_handle ()); - - if (!not_open (newfd)) - close (newfd); - else if ((size_t) newfd < size) - /* nothing to do */; - else if (find_unused_handle (newfd) < 0) - { - newfh->close (); - res = -1; - goto done; - } - - fds[newfd] = newfh; - - if ((res = newfd) <= 2) - set_std_handle (res); - -done: - MALLOC_CHECK; - unlock (); - syscall_printf ("%d = dup2 (%d, %d)", res, oldfd, newfd); - - return res; -} - -fhandler_fifo * -dtable::find_fifo (const char *path) -{ - lock (); - fhandler_fifo *fh_res = NULL; - for (unsigned i = 0; i < size; i++) - { - fhandler_base *fh = fds[i]; - if (fh && fh->isfifo () && strcmp (path, fh->get_win32_name ()) == 0) - { - fh_res = (fhandler_fifo *) fh; - break; - } - } - unlock (); - return fh_res; -} - -select_record * -dtable::select_read (int fd, select_record *s) -{ - if (not_open (fd)) - { - set_errno (EBADF); - return NULL; - } - fhandler_base *fh = fds[fd]; - s = fh->select_read (s); - s->fd = fd; - s->fh = fh; - s->thread_errno = 0; - debug_printf ("%s fd %d", fh->get_name (), fd); - return s; -} - -select_record * -dtable::select_write (int fd, select_record *s) -{ - if (not_open (fd)) - { - set_errno (EBADF); - return NULL; - } - fhandler_base *fh = fds[fd]; - s = fh->select_write (s); - s->fd = fd; - s->fh = fh; - s->thread_errno = 0; - debug_printf ("%s fd %d", fh->get_name (), fd); - return s; -} - -select_record * -dtable::select_except (int fd, select_record *s) -{ - if (not_open (fd)) - { - set_errno (EBADF); - return NULL; - } - fhandler_base *fh = fds[fd]; - s = fh->select_except (s); - s->fd = fd; - s->fh = fh; - s->thread_errno = 0; - debug_printf ("%s fd %d", fh->get_name (), fd); - return s; -} - -/* Function to walk the fd table after an exec and perform - per-fhandler type fixups. */ -void -dtable::fixup_before_fork (DWORD target_proc_id) -{ - lock (); - fhandler_base *fh; - for (size_t i = 0; i < size; i++) - if ((fh = fds[i]) != NULL) - { - debug_printf ("fd %d (%s)", i, fh->get_name ()); - fh->fixup_before_fork_exec (target_proc_id); - } - unlock (); -} - -void -dtable::fixup_before_exec (DWORD target_proc_id) -{ - lock (); - fhandler_base *fh; - for (size_t i = 0; i < size; i++) - if ((fh = fds[i]) != NULL && !fh->close_on_exec ()) - { - debug_printf ("fd %d (%s)", i, fh->get_name ()); - fh->fixup_before_fork_exec (target_proc_id); - } - unlock (); -} - -void -dtable::set_file_pointers_for_exec () -{ - lock (); - fhandler_base *fh; - for (size_t i = 0; i < size; i++) - if ((fh = fds[i]) != NULL && fh->get_flags () & O_APPEND) - SetFilePointer (fh->get_handle (), 0, 0, FILE_END); - unlock (); -} - -void -dtable::fixup_after_exec () -{ - first_fd_for_open = 0; - fhandler_base *fh; - for (size_t i = 0; i < size; i++) - if ((fh = fds[i]) != NULL) - { - fh->clear_readahead (); - fh->fixup_after_exec (); - if (fh->close_on_exec ()) - { - if (fh->archetype) - fh->close (); - release (i); - } - else if (i == 0) - SetStdHandle (std_consts[i], fh->get_io_handle ()); - else if (i <= 2) - SetStdHandle (std_consts[i], fh->get_output_handle ()); - } -} - -void -dtable::fixup_after_fork (HANDLE parent) -{ - fhandler_base *fh; - for (size_t i = 0; i < size; i++) - if ((fh = fds[i]) != NULL) - { - if (fh->close_on_exec () || fh->need_fork_fixup ()) - { - debug_printf ("fd %d (%s)", i, fh->get_name ()); - fh->fixup_after_fork (parent); - } - if (i == 0) - SetStdHandle (std_consts[i], fh->get_io_handle ()); - else if (i <= 2) - SetStdHandle (std_consts[i], fh->get_output_handle ()); - } -} - -#ifdef NEWVFORK -int -dtable::vfork_child_dup () -{ - fhandler_base **newtable; - lock (); - newtable = (fhandler_base **) ccalloc (HEAP_ARGV, size, sizeof (fds[0])); - int res = 1; - - /* Remove impersonation */ - cygheap->user.deimpersonate (); - if (cygheap->ctty) - { - cygheap->ctty->usecount++; - cygheap->console_count++; - report_tty_counts (cygheap->ctty, "vfork dup", "incremented ", ""); - } - - for (size_t i = 0; i < size; i++) - if (not_open (i)) - continue; - else if ((newtable[i] = dup_worker (fds[i])) != NULL) - newtable[i]->set_close_on_exec (fds[i]->close_on_exec ()); - else - { - res = 0; - goto out; - } - - fds_on_hold = fds; - fds = newtable; - -out: - /* Restore impersonation */ - cygheap->user.reimpersonate (); - - unlock (); - return 1; -} - -void -dtable::vfork_parent_restore () -{ - lock (); - - fhandler_tty_slave *ctty_on_hold = cygheap->ctty_on_hold; - close_all_files (); - fhandler_base **deleteme = fds; - fds = fds_on_hold; - fds_on_hold = NULL; - cfree (deleteme); - unlock (); - - if (cygheap->ctty != ctty_on_hold) - { - cygheap->ctty = ctty_on_hold; // revert - cygheap->ctty->close (); // Undo previous bump of this archetype - } - cygheap->ctty_on_hold = NULL; -} - -void -dtable::vfork_child_fixup () -{ - if (!fds_on_hold) - return; - debug_printf ("here"); - fhandler_base **saveme = fds; - fds = fds_on_hold; - - fhandler_base *fh; - for (int i = 0; i < (int) size; i++) - if ((fh = fds[i]) != NULL) - { - fh->clear_readahead (); - if (!fh->archetype && fh->close_on_exec ()) - release (i); - else - { - fh->close (); - release (i); - } - } - - fds = saveme; - cfree (fds_on_hold); - fds_on_hold = NULL; - - if (cygheap->ctty_on_hold) - { - cygheap->ctty_on_hold->close (); - cygheap->ctty_on_hold = NULL; - } -} -#endif /*NEWVFORK*/ - -#define DEVICE_PREFIX "\\device\\" -#define DEVICE_PREFIX_LEN sizeof (DEVICE_PREFIX) - 1 -#define REMOTE "\\Device\\LanmanRedirector\\" -#define REMOTE_LEN sizeof (REMOTE) - 1 - -static const char * -handle_to_fn (HANDLE h, char *posix_fn) -{ - OBJECT_NAME_INFORMATION *ntfn; - char fnbuf[32768]; - - memset (fnbuf, 0, sizeof (fnbuf)); - ntfn = (OBJECT_NAME_INFORMATION *) fnbuf; - ntfn->Name.MaximumLength = sizeof (fnbuf) - sizeof (*ntfn); - ntfn->Name.Buffer = (WCHAR *) (ntfn + 1); - - NTSTATUS res = NtQueryObject (h, ObjectNameInformation, ntfn, sizeof (fnbuf), - NULL); - - if (NT_SUCCESS (res)) - { - strcpy (posix_fn, unknown_file); - debug_printf ("NtQueryObject failed"); - return unknown_file; - } - - // NT seems to do this on an unopened file - if (!ntfn->Name.Buffer) - { - debug_printf ("nt->Name.Buffer == NULL"); - return NULL; - } - - ntfn->Name.Buffer[ntfn->Name.Length / sizeof (WCHAR)] = 0; - - char win32_fn[CYG_MAX_PATH + 100]; - sys_wcstombs (win32_fn, CYG_MAX_PATH + 100, ntfn->Name.Buffer); - debug_printf ("nt name '%s'", win32_fn); - if (!strncasematch (win32_fn, DEVICE_PREFIX, DEVICE_PREFIX_LEN) - || !QueryDosDevice (NULL, fnbuf, sizeof (fnbuf))) - return strcpy (posix_fn, win32_fn); - - char *p = strechr (win32_fn + DEVICE_PREFIX_LEN, '\\'); - - int n = p - win32_fn; - int maxmatchlen = 0; - char *maxmatchdos = NULL; - for (char *s = fnbuf; *s; s = strchr (s, '\0') + 1) - { - char device[CYG_MAX_PATH + 10]; - device[CYG_MAX_PATH + 9] = '\0'; - if (strchr (s, ':') == NULL) - continue; - if (!QueryDosDevice (s, device, sizeof (device) - 1)) - continue; - char *q = strrchr (device, ';'); - if (q) - { - char *r = strchr (q, '\\'); - if (r) - strcpy (q, r + 1); - } - int devlen = strlen (device); - if (device[devlen - 1] == '\\') - device[--devlen] = '\0'; - if (devlen < maxmatchlen) - continue; - if (!strncasematch (device, win32_fn, devlen) || - (win32_fn[devlen] != '\0' && win32_fn[devlen] != '\\')) - continue; - maxmatchlen = devlen; - maxmatchdos = s; - debug_printf ("current match '%s'", device); - } - - char *w32 = win32_fn; - if (maxmatchlen) - { - n = strlen (maxmatchdos); - if (maxmatchdos[n - 1] == '\\') - n--; - w32 += maxmatchlen - n; - memcpy (w32, maxmatchdos, n); - w32[n] = '\\'; - } - else if (strncasematch (w32, REMOTE, REMOTE_LEN)) - { - w32 += REMOTE_LEN - 2; - *w32 = '\\'; - debug_printf ("remote drive"); - } - - - debug_printf ("derived path '%s'", w32); - cygwin_conv_to_full_posix_path (w32, posix_fn); - return posix_fn; -} diff --git a/winsup/cygwin/dtable.h b/winsup/cygwin/dtable.h deleted file mode 100644 index 5e136ab9b..000000000 --- a/winsup/cygwin/dtable.h +++ /dev/null @@ -1,102 +0,0 @@ -/* dtable.h: fd table definition. - - Copyright 2000, 2001, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* Initial and increment values for cygwin's fd table */ -#define NOFILE_INCR 32 - -#include "thread.h" -#include "sync.h" - -class suffix_info; -class fhandler_fifo; - -#define BFH_OPTS (PC_NULLEMPTY | PC_FULL | PC_POSIX) -class dtable -{ - fhandler_base **fds; -#ifdef NEWVFORK - fhandler_base **fds_on_hold; -#endif - fhandler_base **archetypes; - unsigned narchetypes; - unsigned farchetype; - static const int initial_archetype_size = 8; - int first_fd_for_open; - int cnt_need_fixup_before; - void lock () {lock_process::locker.acquire ();} - void unlock () {lock_process::locker.release ();} -public: - size_t size; - - dtable () : archetypes (NULL), narchetypes (0), farchetype (0), first_fd_for_open(3), cnt_need_fixup_before(0) {} - void init () {first_fd_for_open = 3;} - - void dec_need_fixup_before () - { if (cnt_need_fixup_before > 0) --cnt_need_fixup_before; } - void inc_need_fixup_before () - { cnt_need_fixup_before++; } - bool need_fixup_before () - { return cnt_need_fixup_before > 0; } - - int vfork_child_dup (); - void vfork_parent_restore (); - void vfork_child_fixup (); - fhandler_base *dup_worker (fhandler_base *oldfh); - int extend (int howmuch); - void fixup_before_exec (DWORD win_proc_id); - void fixup_before_fork (DWORD win_proc_id); - void fixup_after_fork (HANDLE); - inline int not_open (int fd) - { - lock (); - int res = fd < 0 || fd >= (int) size || fds[fd] == NULL; - unlock (); - return res; - } - int find_unused_handle (int start); - int find_unused_handle () { return find_unused_handle (first_fd_for_open);} - void release (int fd); - void init_std_file_from_handle (int fd, HANDLE handle); - int dup2 (int oldfd, int newfd); - void fixup_after_exec (); - inline fhandler_base *&operator [](int fd) const { return fds[fd]; } - select_record *select_read (int fd, select_record *s); - select_record *select_write (int fd, select_record *s); - select_record *select_except (int fd, select_record *s); - operator fhandler_base **() {return fds;} - void stdio_init (); - void get_debugger_info (); - void set_file_pointers_for_exec (); -#ifdef NEWVFORK - bool in_vfork_cleanup () {return fds_on_hold == fds;} -#endif - fhandler_fifo *find_fifo (const char *); - fhandler_base *find_archetype (device& dev); - fhandler_base **add_archetype (); - void delete_archetype (fhandler_base *); - friend void dtable_init (); - friend void __stdcall close_all_files (bool); - friend class cygheap_fdmanip; - friend class cygheap_fdget; - friend class cygheap_fdnew; - friend class cygheap_fdenum; - friend class lock_process; -}; - -fhandler_base *build_fh_dev (const device&, const char * = NULL); -fhandler_base *build_fh_name (const char *unix_name, HANDLE = NULL, unsigned = 0, suffix_info * = NULL); -fhandler_base *build_fh_pc (path_conv& pc); - -void dtable_init (); -void stdio_init (); -extern dtable fdtab; - -extern "C" int getfdtabsize (); -extern "C" void setfdtabsize (int); diff --git a/winsup/cygwin/dtable.sgml b/winsup/cygwin/dtable.sgml deleted file mode 100644 index 73d8b78cc..000000000 --- a/winsup/cygwin/dtable.sgml +++ /dev/null @@ -1,20 +0,0 @@ - - -cygwin_attach_handle_to_fd - - -extern "C" int -cygwin_attach_handle_to_fd -char *name -int fd -HANDLE handle -int bin -int access - - -This function can be used to turn a Win32 "handle" into a -posix-style file handle. fd may be -1 to -make cygwin allocate a handle; the actual handle is returned -in all cases. - - diff --git a/winsup/cygwin/environ.cc b/winsup/cygwin/environ.cc deleted file mode 100644 index 1c934349f..000000000 --- a/winsup/cygwin/environ.cc +++ /dev/null @@ -1,1107 +0,0 @@ -/* environ.cc: Cygwin-adopted functions from newlib to manipulate - process's environment. - - Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006 Red Hat, Inc. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include "pinfo.h" -#include "perprocess.h" -#include "security.h" -#include "path.h" -#include "cygerrno.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "cygtls.h" -#include "registry.h" -#include "environ.h" -#include "child_info.h" - -extern bool allow_glob; -extern bool ignore_case_with_glob; -extern bool allow_winsymlinks; -extern bool strip_title_path; -extern int pcheck_case; -extern int subauth_id; -bool reset_com = false; -static bool envcache = true; -#ifdef USE_SERVER -extern bool allow_server; -#endif - -static char **lastenviron; - -#define ENVMALLOC \ - (CYGWIN_VERSION_DLL_MAKE_COMBINED (user_data->api_major, user_data->api_minor) \ - <= CYGWIN_VERSION_DLL_MALLOC_ENV) - -#define NL(x) x, (sizeof (x) - 1) -/* List of names which are converted from dos to unix - on the way in and back again on the way out. - - PATH needs to be here because CreateProcess uses it and gdb uses - CreateProcess. HOME is here because most shells use it and would be - confused by Windows style path names. */ -static int return_MAX_PATH (const char *) {return CYG_MAX_PATH;} -static win_env conv_envvars[] = - { - {NL ("PATH="), NULL, NULL, cygwin_win32_to_posix_path_list, - cygwin_posix_to_win32_path_list, - cygwin_win32_to_posix_path_list_buf_size, - cygwin_posix_to_win32_path_list_buf_size, true}, - {NL ("HOME="), NULL, NULL, cygwin_conv_to_full_posix_path, - cygwin_conv_to_full_win32_path, return_MAX_PATH, return_MAX_PATH, false}, - {NL ("LD_LIBRARY_PATH="), NULL, NULL, cygwin_win32_to_posix_path_list, - cygwin_posix_to_win32_path_list, - cygwin_win32_to_posix_path_list_buf_size, - cygwin_posix_to_win32_path_list_buf_size, true}, - {NL ("TMPDIR="), NULL, NULL, cygwin_conv_to_full_posix_path, - cygwin_conv_to_full_win32_path, return_MAX_PATH, return_MAX_PATH, false}, - {NL ("TMP="), NULL, NULL, cygwin_conv_to_full_posix_path, - cygwin_conv_to_full_win32_path, return_MAX_PATH, return_MAX_PATH, false}, - {NL ("TEMP="), NULL, NULL, cygwin_conv_to_full_posix_path, - cygwin_conv_to_full_win32_path, return_MAX_PATH, return_MAX_PATH, false}, - {NULL, 0, NULL, NULL, NULL, NULL, 0, 0} - }; - -static unsigned char conv_start_chars[256] = {0}; - -struct win_env& -win_env::operator = (struct win_env& x) -{ - name = x.name; - namelen = x.namelen; - toposix = x.toposix; - towin32 = x.towin32; - posix_len = x.posix_len; - win32_len = x.win32_len; - immediate = false; - return *this; -} - -win_env::~win_env () -{ - if (posix) - free (posix); - if (native) - free (native); -} - -void -win_env::add_cache (const char *in_posix, const char *in_native) -{ - MALLOC_CHECK; - posix = (char *) realloc (posix, strlen (in_posix) + 1); - strcpy (posix, in_posix); - if (in_native) - { - native = (char *) realloc (native, namelen + 1 + strlen (in_native)); - strcpy (native, name); - strcpy (native + namelen, in_native); - } - else - { - native = (char *) realloc (native, namelen + 1 + win32_len (in_posix)); - strcpy (native, name); - towin32 (in_posix, native + namelen); - } - MALLOC_CHECK; - if (immediate && cygwin_finished_initializing) - { - char s[namelen]; - size_t n = namelen - 1; - memcpy (s, name, n); - s[n] = '\0'; - SetEnvironmentVariable (s, native + namelen); - } - debug_printf ("posix %s", posix); - debug_printf ("native %s", native); -} - - -/* Check for a "special" environment variable name. *env is the pointer - to the beginning of the environment variable name. *in_posix is any - known posix value for the environment variable. Returns a pointer to - the appropriate conversion structure. */ -win_env * __stdcall -getwinenv (const char *env, const char *in_posix, win_env *temp) -{ - if (!conv_start_chars[(unsigned char)*env]) - return NULL; - - for (int i = 0; conv_envvars[i].name != NULL; i++) - if (strncmp (env, conv_envvars[i].name, conv_envvars[i].namelen) == 0) - { - win_env *we = conv_envvars + i; - const char *val; - if (!cur_environ () || !(val = in_posix ?: getenv (we->name))) - debug_printf ("can't set native for %s since no environ yet", - we->name); - else if (!envcache || !we->posix || strcmp (val, we->posix) != 0) - { - if (temp) - { - *temp = *we; - we = temp; - } - we->add_cache (val); - } - return we; - } - return NULL; -} - -/* Convert windows path specs to POSIX, if appropriate. - */ -static void __stdcall -posify (char **here, const char *value) -{ - char *src = *here; - win_env *conv; - - if (!(conv = getwinenv (src))) - return; - - int len = strcspn (src, "=") + 1; - - /* Turn all the items from c:; into their - mounted equivalents - if there is one. */ - - char *outenv = (char *) malloc (1 + len + conv->posix_len (value)); - memcpy (outenv, src, len); - conv->toposix (value, outenv + len); - conv->add_cache (outenv + len, *value != '/' ? value : NULL); - - debug_printf ("env var converted to %s", outenv); - *here = outenv; - free (src); - MALLOC_CHECK; -} - -/* - * my_findenv -- - * Returns pointer to value associated with name, if any, else NULL. - * Sets offset to be the offset of the name/value combination in the - * environment array, for use by setenv(3) and unsetenv(3). - * Explicitly removes '=' in argument name. - */ - -static char * __stdcall -my_findenv (const char *name, int *offset) -{ - register int len; - register char **p; - const char *c; - - c = name; - len = 0; - while (*c && *c != '=') - { - c++; - len++; - } - - for (p = cur_environ (); *p; ++p) - if (!strncmp (*p, name, len)) - if (*(c = *p + len) == '=') - { - *offset = p - cur_environ (); - return (char *) (++c); - } - MALLOC_CHECK; - return NULL; -} - -/* - * getenv -- - * Returns ptr to value associated with name, if any, else NULL. - */ - -extern "C" char * -getenv (const char *name) -{ - int offset; - - return my_findenv (name, &offset); -} - -static int __stdcall -envsize (const char * const *in_envp) -{ - const char * const *envp; - for (envp = in_envp; *envp; envp++) - continue; - return (1 + envp - in_envp) * sizeof (const char *); -} - -/* Takes similar arguments to setenv except that overwrite is - either -1, 0, or 1. 0 or 1 signify that the function should - perform similarly to setenv. Otherwise putenv is assumed. */ -static int __stdcall -_addenv (const char *name, const char *value, int overwrite) -{ - int issetenv = overwrite >= 0; - int offset; - char *p; - - unsigned int valuelen = strlen (value); - if ((p = my_findenv (name, &offset))) - { /* Already exists. */ - if (!overwrite) /* Ok to overwrite? */ - return 0; /* No. Wanted to add new value. FIXME: Right return value? */ - - /* We've found the offset into environ. If this is a setenv call and - there is room in the current environment entry then just overwrite it. - Otherwise handle this case below. */ - if (issetenv && strlen (p) >= valuelen) - { - strcpy (p, value); - return 0; - } - } - else - { /* Create new slot. */ - int sz = envsize (cur_environ ()); - int allocsz = sz + (2 * sizeof (char *)); - - offset = (sz - 1) / sizeof (char *); - - /* Allocate space for additional element plus terminating NULL. */ - if (cur_environ () == lastenviron) - lastenviron = __cygwin_environ = (char **) realloc (cur_environ (), - allocsz); - else if ((lastenviron = (char **) malloc (allocsz)) != NULL) - __cygwin_environ = (char **) memcpy ((char **) lastenviron, - __cygwin_environ, sz); - - if (!__cygwin_environ) - { -#ifdef DEBUGGING - try_to_debug (); -#endif - return -1; /* Oops. No more memory. */ - } - - __cygwin_environ[offset + 1] = NULL; /* NULL terminate. */ - update_envptrs (); /* Update any local copies of 'environ'. */ - } - - char *envhere; - if (!issetenv) - /* Not setenv. Just overwrite existing. */ - envhere = cur_environ ()[offset] = (char *) (ENVMALLOC ? strdup (name) : name); - else - { /* setenv */ - /* Look for an '=' in the name and ignore anything after that if found. */ - for (p = (char *) name; *p && *p != '='; p++) - continue; - - int namelen = p - name; /* Length of name. */ - /* Allocate enough space for name + '=' + value + '\0' */ - envhere = cur_environ ()[offset] = (char *) malloc (namelen + valuelen + 2); - if (!envhere) - return -1; /* Oops. No more memory. */ - - /* Put name '=' value into current slot. */ - strncpy (envhere, name, namelen); - envhere[namelen] = '='; - strcpy (envhere + namelen + 1, value); - } - - /* Update cygwin's cache, if appropriate */ - win_env *spenv; - if ((spenv = getwinenv (envhere))) - spenv->add_cache (value); - - MALLOC_CHECK; - return 0; -} - -/* putenv Sets an environment variable */ -extern "C" int -putenv (char *str) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (*str) - { - char *eq = strchr (str, '='); - if (eq) - return _addenv (str, eq + 1, -1); - - /* Remove str from the environment. */ - unsetenv (str); - } - return 0; -} - -/* setenv -- Set the value of the environment variable "name" to be - "value". If overwrite is set, replace any current value. */ -extern "C" int -setenv (const char *name, const char *value, int overwrite) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (!*name) - return 0; - if (*value == '=') - value++; - return _addenv (name, value, !!overwrite); -} - -/* unsetenv(name) -- Delete environment variable "name". */ -extern "C" int -unsetenv (const char *name) -{ - register char **e; - int offset; - myfault efault; - if (efault.faulted () || *name == '\0' || strchr (name, '=')) - { - set_errno (EINVAL); - return -1; - } - - while (my_findenv (name, &offset)) /* if set multiple times */ - /* Move up the rest of the array */ - for (e = cur_environ () + offset; ; e++) - if (!(*e = *(e + 1))) - break; - - return 0; -} - -/* Turn environment variable part of a=b string into uppercase. */ -static __inline__ void -ucenv (char *p, char *eq) -{ - /* Amazingly, NT has a case sensitive environment name list, - but only sometimes. - It's normal to have NT set your "Path" to something. - Later, you set "PATH" to something else. This alters "Path". - But if you try and do a naive getenv on "PATH" you'll get nothing. - - So we upper case the labels here to prevent confusion later but - we only do it for the first process in a session group. */ - for (; p < eq; p++) - if (islower (*p)) - *p = cyg_toupper (*p); -} - -/* Parse CYGWIN options */ - -static NO_COPY bool export_settings = false; - -enum settings - { - justset, - isfunc, - setbit, - set_process_state, - }; - -/* When BUF is: - null or empty: disables globbing - "ignorecase": enables case-insensitive globbing - anything else: enables case-sensitive globbing */ -static void -glob_init (const char *buf) -{ - if (!buf || !*buf) - { - allow_glob = false; - ignore_case_with_glob = false; - } - else if (strncasematch (buf, "ignorecase", 10)) - { - allow_glob = true; - ignore_case_with_glob = true; - } - else - { - allow_glob = true; - ignore_case_with_glob = false; - } -} - -static void -check_case_init (const char *buf) -{ - if (!buf || !*buf) - return; - - if (strncasematch (buf, "relax", 5)) - { - pcheck_case = PCHECK_RELAXED; - debug_printf ("File case checking set to RELAXED"); - } - else if (strcasematch (buf, "adjust")) - { - pcheck_case = PCHECK_ADJUST; - debug_printf ("File case checking set to ADJUST"); - } - else if (strcasematch (buf, "strict")) - { - pcheck_case = PCHECK_STRICT; - debug_printf ("File case checking set to STRICT"); - } - else - { - debug_printf ("Wrong case checking name: %s", buf); - } -} - -void -set_file_api_mode (codepage_type cp) -{ - if (cp == oem_cp) - { - SetFileApisToOEM (); - debug_printf ("File APIs set to OEM"); - } - else if (cp == ansi_cp) - { - SetFileApisToANSI (); - debug_printf ("File APIs set to ANSI"); - } -} - -static void -codepage_init (const char *buf) -{ - if (!buf || !*buf) - return; - - if (strcasematch (buf, "oem")) - { - current_codepage = oem_cp; - set_file_api_mode (current_codepage); - } - else if (strcasematch (buf, "ansi")) - { - current_codepage = ansi_cp; - set_file_api_mode (current_codepage); - } - else - debug_printf ("Wrong codepage name: %s", buf); -} - -static void -subauth_id_init (const char *buf) -{ - if (!buf || !*buf) - return; - - int i = strtol (buf, NULL, 0); - - /* 0..127 are reserved by Microsoft, 132 is IIS subauthentication. */ - if (i > 127 && i != 132 && i <= 255) - subauth_id = i; -} - -static void -set_chunksize (const char *buf) -{ - wincap.set_chunksize (strtoul (buf, NULL, 0)); -} - -static void -set_proc_retry (const char *buf) -{ - child_info::retry_count = strtoul (buf, NULL, 0); -} - -static void -set_ntea (const char *buf) -{ - allow_ntea = (buf && strcasematch (buf, "yes") && wincap.has_security ()); -} - -static void -set_ntsec (const char *buf) -{ - allow_ntsec = (buf && strcasematch (buf, "yes") && wincap.has_security ()); -} - -static void -set_traverse (const char *buf) -{ - allow_traverse = (buf && strcasematch (buf, "yes") && wincap.has_security ()); -} - -static void -set_smbntsec (const char *buf) -{ - allow_smbntsec = (buf && strcasematch (buf, "yes") && wincap.has_security ()); -} - -/* The structure below is used to set up an array which is used to - parse the CYGWIN environment variable or, if enabled, options from - the registry. */ -static struct parse_thing - { - const char *name; - union parse_setting - { - bool *b; - DWORD *x; - int *i; - void (*func)(const char *); - } setting; - - enum settings disposition; - char *remember; - union parse_values - { - DWORD i; - const char *s; - } values[2]; - } known[] NO_COPY = -{ - {"binmode", {x: &binmode}, justset, NULL, {{O_TEXT}, {O_BINARY}}}, - {"check_case", {func: &check_case_init}, isfunc, NULL, {{0}, {0}}}, - {"codepage", {func: &codepage_init}, isfunc, NULL, {{0}, {0}}}, - {"envcache", {&envcache}, justset, NULL, {{true}, {false}}}, - {"error_start", {func: &error_start_init}, isfunc, NULL, {{0}, {0}}}, - {"export", {&export_settings}, justset, NULL, {{false}, {true}}}, - {"forkchunk", {func: set_chunksize}, isfunc, NULL, {{0}, {0}}}, - {"glob", {func: &glob_init}, isfunc, NULL, {{0}, {s: "normal"}}}, - {"ntea", {func: set_ntea}, isfunc, NULL, {{0}, {s: "yes"}}}, - {"ntsec", {func: set_ntsec}, isfunc, NULL, {{0}, {s: "yes"}}}, - {"traverse", {func: set_traverse}, isfunc, NULL, {{0}, {s: "yes"}}}, - {"reset_com", {&reset_com}, justset, NULL, {{false}, {true}}}, -#ifdef USE_SERVER - {"server", {&allow_server}, justset, NULL, {{false}, {true}}}, -#endif - {"smbntsec", {func: set_smbntsec}, isfunc, NULL, {{0}, {s: "yes"}}}, - {"strip_title", {&strip_title_path}, justset, NULL, {{false}, {true}}}, - {"subauth_id", {func: &subauth_id_init}, isfunc, NULL, {{0}, {0}}}, - {"title", {&display_title}, justset, NULL, {{false}, {true}}}, - {"tty", {NULL}, set_process_state, NULL, {{0}, {PID_USETTY}}}, - {"winsymlinks", {&allow_winsymlinks}, justset, NULL, {{false}, {true}}}, - {"transparent_exe", {&transparent_exe}, justset, NULL, {{false}, {true}}}, - {"proc_retry", {func: set_proc_retry}, isfunc, NULL, {{0}, {5}}}, - {NULL, {0}, justset, 0, {{0}, {0}}} -}; - -/* Parse a string of the form "something=stuff somethingelse=more-stuff", - silently ignoring unknown "somethings". */ -static void __stdcall -parse_options (char *buf) -{ - int istrue; - char *p, *lasts; - parse_thing *k; - - if (buf == NULL) - { - char newbuf[CYG_MAX_PATH + 7]; - newbuf[0] = '\0'; - for (k = known; k->name != NULL; k++) - if (k->remember) - { - strcat (strcat (newbuf, " "), k->remember); - free (k->remember); - k->remember = NULL; - } - - if (export_settings) - { - debug_printf ("%s", newbuf + 1); - setenv ("CYGWIN", newbuf + 1, 1); - } - return; - } - - buf = strcpy ((char *) alloca (strlen (buf) + 1), buf); - for (p = strtok_r (buf, " \t", &lasts); - p != NULL; - p = strtok_r (NULL, " \t", &lasts)) - { - char *keyword_here = p; - if (!(istrue = !strncasematch (p, "no", 2))) - p += 2; - else if (!(istrue = *p != '-')) - p++; - - char ch, *eq; - if ((eq = strchr (p, '=')) != NULL || (eq = strchr (p, ':')) != NULL) - ch = *eq, *eq++ = '\0'; - else - ch = 0; - - for (parse_thing *k = known; k->name != NULL; k++) - if (strcasematch (p, k->name)) - { - switch (k->disposition) - { - case isfunc: - k->setting.func ((!eq || !istrue) ? - k->values[istrue].s : eq); - debug_printf ("%s (called func)", k->name); - break; - case justset: - if (!istrue || !eq) - *k->setting.x = k->values[istrue].i; - else - *k->setting.x = strtol (eq, NULL, 0); - debug_printf ("%s %d", k->name, *k->setting.x); - break; - case set_process_state: - k->setting.x = &myself->process_state; - /* fall through */ - case setbit: - *k->setting.x &= ~k->values[istrue].i; - if (istrue || (eq && strtol (eq, NULL, 0))) - *k->setting.x |= k->values[istrue].i; - debug_printf ("%s %x", k->name, *k->setting.x); - break; - } - - if (eq) - *--eq = ch; - - int n = eq - p; - p = strdup (keyword_here); - if (n > 0) - p[n] = ':'; - k->remember = p; - break; - } - } - debug_printf ("returning"); -} - -/* Set options from the registry. */ -static bool __stdcall -regopt (const char *name) -{ - bool parsed_something = false; - char buf[CYG_MAX_PATH]; - char lname[strlen (name) + 1]; - strlwr (strcpy (lname, name)); - - for (int i = 0; i < 2; i++) - { - reg_key r (i, KEY_READ, CYGWIN_INFO_PROGRAM_OPTIONS_NAME, NULL); - - if (r.get_string (lname, buf, sizeof (buf) - 1, "") == ERROR_SUCCESS) - { - parse_options (buf); - parsed_something = true; - break; - } - } - - MALLOC_CHECK; - return parsed_something; -} - -/* Initialize the environ array. Look for the CYGWIN environment - environment variable and set appropriate options from it. */ -void -environ_init (char **envp, int envc) -{ - char *rawenv; - int i; - char *p; - char *newp; - int sawTERM = 0; - bool envp_passed_in; - bool got_something_from_registry; - static char NO_COPY cygterm[] = "TERM=cygwin"; - myfault efault; - - if (efault.faulted ()) - api_fatal ("internal error reading the windows environment - too many environment variables?"); - - if (!conv_start_chars[0]) - for (int i = 0; conv_envvars[i].name != NULL; i++) - { - conv_start_chars[(int) cyg_tolower (conv_envvars[i].name[0])] = 1; - conv_start_chars[(int) cyg_toupper (conv_envvars[i].name[0])] = 1; - } - - got_something_from_registry = regopt ("default"); - if (myself->progname[0]) - got_something_from_registry = regopt (myself->progname) || got_something_from_registry; - - /* Set ntsec explicit as default, if NT is running */ - if (wincap.has_security ()) - allow_ntsec = true; - - if (!envp) - envp_passed_in = 0; - else - { - envc++; - envc *= sizeof (char *); - char **newenv = (char **) malloc (envc); - memcpy (newenv, envp, envc); - cfree (envp); - - /* Older applications relied on the fact that cygwin malloced elements of the - environment list. */ - envp = newenv; - if (ENVMALLOC) - for (char **e = newenv; *e; e++) - { - char *p = *e; - *e = strdup (p); - cfree (p); - } - envp_passed_in = 1; - goto out; - } - - /* Allocate space for environment + trailing NULL + CYGWIN env. */ - lastenviron = envp = (char **) malloc ((4 + (envc = 100)) * sizeof (char *)); - - rawenv = GetEnvironmentStrings (); - if (!rawenv) - { - system_printf ("GetEnvironmentStrings returned NULL, %E"); - return; - } - debug_printf ("GetEnvironmentStrings returned %p - \"%s\"", rawenv, rawenv); - - /* Current directory information is recorded as variables of the - form "=X:=X:\foo\bar; these must be changed into something legal - (we could just ignore them but maybe an application will - eventually want to use them). */ - for (i = 0, p = rawenv; *p != '\0'; p = strchr (p, '\0') + 1, i++) - { - newp = strdup (p); - if (i >= envc) - envp = (char **) realloc (envp, (4 + (envc += 100)) * sizeof (char *)); - envp[i] = newp; - if (*newp == '=') - *newp = '!'; - char *eq = strechr (newp, '='); - if (!child_proc_info) - ucenv (newp, eq); - if (*newp == 'T' && strncmp (newp, "TERM=", 5) == 0) - sawTERM = 1; - if (*newp == 'C' && strncmp (newp, "CYGWIN=", sizeof ("CYGWIN=") - 1) == 0) - parse_options (newp + sizeof ("CYGWIN=") - 1); - if (*eq && conv_start_chars[(unsigned char)envp[i][0]]) - posify (envp + i, *++eq ? eq : --eq); - debug_printf ("%p: %s", envp[i], envp[i]); - } - - if (!sawTERM) - envp[i++] = strdup (cygterm); - envp[i] = NULL; - FreeEnvironmentStrings (rawenv); - -out: - __cygwin_environ = envp; - if (envp_passed_in) - { - p = getenv ("CYGWIN"); - if (p) - parse_options (p); - } - - if (got_something_from_registry) - parse_options (NULL); /* possibly export registry settings to - environment */ - MALLOC_CHECK; -} - -/* Function called by qsort to sort environment strings. */ -static int -env_sort (const void *a, const void *b) -{ - const char **p = (const char **) a; - const char **q = (const char **) b; - - return strcmp (*p, *q); -} - -char * __stdcall -getwinenveq (const char *name, size_t namelen, int x) -{ - char dum[1]; - char name0[namelen - 1]; - memcpy (name0, name, namelen - 1); - name0[namelen - 1] = '\0'; - int totlen = GetEnvironmentVariable (name0, dum, 0); - if (totlen > 0) - { - totlen++; - if (x == HEAP_1_STR) - totlen += namelen; - else - namelen = 0; - char *p = (char *) cmalloc ((cygheap_types) x, totlen); - if (namelen) - strcpy (p, name); - if (GetEnvironmentVariable (name0, p + namelen, totlen)) - { - debug_printf ("using value from GetEnvironmentVariable for '%s'", - name0); - return p; - } - else - cfree (p); - } - - debug_printf ("warning: %s not present in environment", name); - return NULL; -} - -struct spenv -{ - const char *name; - size_t namelen; - bool force_into_environment; /* If true, always add to env if missing */ - bool add_if_exists; /* if true, retrieve value from cache */ - const char * (cygheap_user::*from_cygheap) (const char *, size_t); - - char *retrieve (bool, const char * const = NULL) - __attribute__ ((regparm (3))); -}; - -#define env_dontadd almost_null - -/* Keep this list in upper case and sorted */ -static NO_COPY spenv spenvs[] = -{ -#ifdef DEBUGGING - {NL ("CYGWIN_DEBUG="), false, true, NULL}, -#endif - {NL ("HOMEDRIVE="), false, false, &cygheap_user::env_homedrive}, - {NL ("HOMEPATH="), false, false, &cygheap_user::env_homepath}, - {NL ("LOGONSERVER="), false, false, &cygheap_user::env_logsrv}, - {NL ("PATH="), false, true, NULL}, - {NL ("SYSTEMDRIVE="), false, true, NULL}, - {NL ("SYSTEMROOT="), true, true, &cygheap_user::env_systemroot}, - {NL ("USERDOMAIN="), false, false, &cygheap_user::env_domain}, - {NL ("USERNAME="), false, false, &cygheap_user::env_name}, - {NL ("USERPROFILE="), false, false, &cygheap_user::env_userprofile}, - {NL ("WINDIR="), true, true, &cygheap_user::env_systemroot} -}; - -char * -spenv::retrieve (bool no_envblock, const char *const env) -{ - if (env && !strncasematch (env, name, namelen)) - return NULL; - - debug_printf ("no_envblock %d", no_envblock); - - if (from_cygheap) - { - const char *p; - if (env && !cygheap->user.issetuid ()) - { - debug_printf ("duping existing value for '%s'", name); - /* Don't really care what it's set to if we're calling a cygwin program */ - return cstrdup1 (env); - } - - /* Calculate (potentially) value for given environment variable. */ - p = (cygheap->user.*from_cygheap) (name, namelen); - if (!p || (no_envblock && !env) || (p == env_dontadd)) - return env_dontadd; - char *s = (char *) cmalloc (HEAP_1_STR, namelen + strlen (p) + 1); - strcpy (s, name); - strcpy (s + namelen, p); - debug_printf ("using computed value for '%s'", name); - return s; - } - - if (env) - return cstrdup1 (env); - - return getwinenveq (name, namelen, HEAP_1_STR); -} - -#define SPENVS_SIZE (sizeof (spenvs) / sizeof (spenvs[0])) - -/* Create a Windows-style environment block, i.e. a typical character buffer - filled with null terminated strings, terminated by double null characters. - Converts environment variables noted in conv_envvars into win32 form - prior to placing them in the string. */ -char ** __stdcall -build_env (const char * const *envp, char *&envblock, int &envc, - bool no_envblock) -{ - int len, n; - const char * const *srcp; - char **dstp; - bool saw_spenv[SPENVS_SIZE] = {0}; - - debug_printf ("envp %p", envp); - - /* How many elements? */ - for (n = 0; envp[n]; n++) - continue; - - /* Allocate a new "argv-style" environ list with room for extra stuff. */ - char **newenv = (char **) cmalloc (HEAP_1_ARGV, sizeof (char *) * - (n + SPENVS_SIZE + 1)); - - int tl = 0; - char **pass_dstp; - char **pass_env = (char **) alloca (sizeof (char *) * (n + SPENVS_SIZE + 1)); - /* Iterate over input list, generating a new environment list and refreshing - "special" entries, if necessary. */ - for (srcp = envp, dstp = newenv, pass_dstp = pass_env; *srcp; srcp++) - { - bool calc_tl = !no_envblock; - /* Look for entries that require special attention */ - for (unsigned i = 0; i < SPENVS_SIZE; i++) - if (!saw_spenv[i] && (*dstp = spenvs[i].retrieve (no_envblock, *srcp))) - { - saw_spenv[i] = 1; - if (*dstp == env_dontadd) - goto next1; - if (spenvs[i].add_if_exists) - calc_tl = true; - goto next0; - } - - /* Add entry to new environment */ - *dstp = cstrdup1 (*srcp); - - next0: - if (calc_tl) - { - *pass_dstp++ = *dstp; - tl += strlen (*dstp) + 1; - } - dstp++; - next1: - continue; - } - - assert ((srcp - envp) == n); - /* Fill in any required-but-missing environment variables. */ - for (unsigned i = 0; i < SPENVS_SIZE; i++) - if (!saw_spenv[i] && (spenvs[i].force_into_environment || cygheap->user.issetuid ())) - { - *dstp = spenvs[i].retrieve (false); - if (*dstp && *dstp != env_dontadd) - { - *pass_dstp++ = *dstp; - tl += strlen (*dstp) + 1; - dstp++; - } - } - - envc = dstp - newenv; /* Number of entries in newenv */ - assert ((size_t) envc <= (n + SPENVS_SIZE)); - *dstp = NULL; /* Terminate */ - - size_t pass_envc = pass_dstp - pass_env; - if (!pass_envc) - envblock = NULL; - else - { - *pass_dstp = NULL; - debug_printf ("env count %d, bytes %d", pass_envc, tl); - win_env temp; - temp.reset (); - - /* Windows programs expect the environment block to be sorted. */ - qsort (pass_env, pass_envc, sizeof (char *), env_sort); - - /* Create an environment block suitable for passing to CreateProcess. */ - char *s; - envblock = (char *) malloc (2 + tl); - int new_tl = 0; - for (srcp = pass_env, s = envblock; *srcp; srcp++) - { - const char *p; - win_env *conv; - len = strcspn (*srcp, "=") + 1; - - /* Check for a bad entry. This is necessary to get rid of empty - strings, induced by putenv and changing the string afterwards. - Note that this doesn't stop invalid strings without '=' in it - etc., but we're opting for speed here for now. Adding complete - checking would be pretty expensive. */ - if (len == 1) - continue; - - /* See if this entry requires posix->win32 conversion. */ - conv = getwinenv (*srcp, *srcp + len, &temp); - if (conv) - p = conv->native; /* Use win32 path */ - else - p = *srcp; /* Don't worry about it */ - - len = strlen (p); - if (len >= 32 * 1024) - { - free (envblock); - envblock = NULL; - goto out; - } - new_tl += len + 1; /* Keep running total of block length so far */ - - /* See if we need to increase the size of the block. */ - if (new_tl > tl) - { - tl = new_tl + 100; - char *new_envblock = - (char *) realloc (envblock, 2 + tl); - /* If realloc moves the block, move `s' with it. */ - if (new_envblock != envblock) - { - s += new_envblock - envblock; - envblock = new_envblock; - } - } - - memcpy (s, p, len + 1); - - /* See if environment variable is "special" in a Windows sense. - Under NT, the current directories for visited drives are stored - as =C:=\bar. Cygwin converts the '=' to '!' for hopefully obvious - reasons. We need to convert it back when building the envblock */ - if (s[0] == '!' && (isdrive (s + 1) || (s[1] == ':' && s[2] == ':')) - && s[3] == '=') - *s = '='; - s += len + 1; - } - *s = '\0'; /* Two null bytes at the end */ - assert ((s - envblock) <= tl); /* Detect if we somehow ran over end - of buffer */ - } - -out: - debug_printf ("envp %p, envc %d", newenv, envc); - return newenv; -} - -/* This idiocy is necessary because the early implementers of cygwin - did not seem to know about importing data variables from the DLL. - So, we have to synchronize cygwin's idea of the environment with the - main program's with each reference to the environment. */ -extern "C" char ** __stdcall -cur_environ () -{ - if (*main_environ != __cygwin_environ) - { - __cygwin_environ = *main_environ; - update_envptrs (); - } - - return __cygwin_environ; -} diff --git a/winsup/cygwin/environ.h b/winsup/cygwin/environ.h deleted file mode 100644 index b953148b4..000000000 --- a/winsup/cygwin/environ.h +++ /dev/null @@ -1,50 +0,0 @@ -/* environ.h: Declarations for environ manipulation - - Copyright 2000, 2001, 2002 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* Initialize the environment */ -void environ_init (char **, int) - __attribute__ ((regparm (2))); - -/* The structure below is used to control conversion to/from posix-style - file specs. Currently, only PATH and HOME are converted, but PATH - needs to use a "convert path list" function while HOME needs a simple - "convert to posix/win32". For the simple case, where a calculated length - is required, just return CYG_MAX_PATH. *FIXME* */ -struct win_env - { - const char *name; - size_t namelen; - char *posix; - char *native; - int (*toposix) (const char *, char *); - int (*towin32) (const char *, char *); - int (*posix_len) (const char *); - int (*win32_len) (const char *); - bool immediate; - void add_cache (const char *in_posix, const char *in_native = NULL) - __attribute__ ((regparm (3))); - const char * get_native () const {return native ? native + namelen : NULL;} - const char * get_posix () const {return posix ? posix : NULL;} - struct win_env& operator = (struct win_env& x); - void reset () {native = posix = NULL;} - ~win_env (); - }; - -win_env * __stdcall getwinenv (const char *name, const char *posix = NULL, win_env * = NULL) - __attribute__ ((regparm (3))); -char * __stdcall getwinenveq (const char *name, size_t len, int) - __attribute__ ((regparm (3))); - -void __stdcall update_envptrs (); -extern char **__cygwin_environ, ***main_environ; -extern "C" char __stdcall **cur_environ (); -char ** __stdcall build_env (const char * const *envp, char *&envblock, - int &envc, bool need_envblock) - __attribute__ ((regparm (3))); diff --git a/winsup/cygwin/errno.cc b/winsup/cygwin/errno.cc deleted file mode 100644 index e8beaa273..000000000 --- a/winsup/cygwin/errno.cc +++ /dev/null @@ -1,356 +0,0 @@ -/* errno.cc: errno-related functions - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 - Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#define _sys_nerr FOO_sys_nerr -#define sys_nerr FOOsys_nerr -#define _sys_errlist FOO_sys_errlist -#include "winsup.h" -#include -#include "cygerrno.h" -#include "thread.h" -#include "cygtls.h" -#undef _sys_nerr -#undef sys_nerr -#undef _sys_errlist - -/* Table to map Windows error codes to Errno values. */ -/* FIXME: Doing things this way is a little slow. It's trivial to change - this into a big case statement if necessary. Left as is for now. */ - -#define X(w, e) {ERROR_##w, #w, e} - -static NO_COPY struct -{ - DWORD w; /* windows version of error */ - const char *s; /* text of windows version */ - int e; /* errno version of error */ -} errmap[] = -{ - /* FIXME: Some of these choices are arbitrary! */ - X (ACCESS_DENIED, EACCES), - X (ACTIVE_CONNECTIONS, EAGAIN), - X (ALREADY_EXISTS, EEXIST), - X (BAD_DEVICE, ENODEV), - X (BAD_NETPATH, ENOSHARE), - X (BAD_NET_NAME, ENOSHARE), - X (BAD_PATHNAME, ENOENT), - X (BAD_PIPE, EINVAL), - X (BAD_UNIT, ENODEV), - X (BAD_USERNAME, EINVAL), - X (BEGINNING_OF_MEDIA, EIO), - X (BROKEN_PIPE, EPIPE), - X (BUSY, EBUSY), - X (BUS_RESET, EIO), - X (CALL_NOT_IMPLEMENTED, ENOSYS), - X (CANNOT_MAKE, EPERM), - X (CHILD_NOT_COMPLETE, EBUSY), - X (COMMITMENT_LIMIT, EAGAIN), - X (CRC, EIO), - X (DEVICE_DOOR_OPEN, EIO), - X (DEVICE_IN_USE, EAGAIN), - X (DEVICE_REQUIRES_CLEANING, EIO), - X (DIRECTORY, ENOTDIR), - X (DIR_NOT_EMPTY, ENOTEMPTY), - X (DISK_CORRUPT, EIO), - X (DISK_FULL, ENOSPC), - X (DUP_NAME, ENOTUNIQ), - X (END_OF_MEDIA, ENOSPC), - X (EOM_OVERFLOW, EIO), - X (FILEMARK_DETECTED, EIO), - X (FILENAME_EXCED_RANGE, ENAMETOOLONG), - X (FILE_EXISTS, EEXIST), - X (FILE_INVALID, ENXIO), - X (FILE_NOT_FOUND, ENOENT), - X (HANDLE_DISK_FULL, ENOSPC), - X (HANDLE_EOF, ENODATA), - X (INVALID_ADDRESS, EINVAL), - X (INVALID_AT_INTERRUPT_TIME, EINTR), - X (INVALID_BLOCK_LENGTH, EIO), - X (INVALID_DATA, EINVAL), - X (INVALID_DRIVE, ENODEV), - X (INVALID_FUNCTION, EBADRQC), - X (INVALID_HANDLE, EBADF), - X (INVALID_NAME, ENOENT), - X (INVALID_PARAMETER, EINVAL), - X (INVALID_SIGNAL_NUMBER, EINVAL), - X (IO_DEVICE, EIO), - X (IO_PENDING, EAGAIN), - X (LOCK_VIOLATION, EACCES), - X (MAX_THRDS_REACHED, EAGAIN), - X (META_EXPANSION_TOO_LONG, EINVAL), - X (MOD_NOT_FOUND, ENOENT), - X (MORE_DATA, EAGAIN), - X (NEGATIVE_SEEK, EINVAL), - X (NETNAME_DELETED, ENOSHARE), - X (NOACCESS, EFAULT), - X (NONPAGED_SYSTEM_RESOURCES, EAGAIN), - X (NOT_CONNECTED, ENOLINK), - X (NOT_ENOUGH_MEMORY, ENOMEM), - X (NOT_OWNER, EPERM), - X (NOT_READY, ENOMEDIUM), - X (NOT_SAME_DEVICE, EXDEV), - X (NOT_SUPPORTED, ENOSYS), - X (NO_DATA, EPIPE), - X (NO_DATA_DETECTED, EIO), - X (NO_MEDIA_IN_DRIVE, ENOMEDIUM), - X (NO_MORE_FILES, ENMFILE), - X (NO_MORE_ITEMS, ENMFILE), - X (NO_MORE_SEARCH_HANDLES, ENFILE), - X (NO_PROC_SLOTS, EAGAIN), - X (NO_SIGNAL_SENT, EIO), - X (NO_SYSTEM_RESOURCES, EAGAIN), - X (NO_TOKEN, EINVAL), - X (OPEN_FAILED, EIO), - X (OPEN_FILES, EAGAIN), - X (OUTOFMEMORY, ENOMEM), - X (PAGED_SYSTEM_RESOURCES, EAGAIN), - X (PAGEFILE_QUOTA, EAGAIN), - X (PATH_NOT_FOUND, ENOENT), - X (PIPE_BUSY, EBUSY), - X (PIPE_CONNECTED, EBUSY), - X (PIPE_LISTENING, ECOMM), - X (PIPE_NOT_CONNECTED, ECOMM), - X (POSSIBLE_DEADLOCK, EDEADLOCK), - X (PROCESS_ABORTED, EFAULT), - X (PROC_NOT_FOUND, ESRCH), - X (REM_NOT_LIST, ENONET), - X (SETMARK_DETECTED, EIO), - X (SHARING_BUFFER_EXCEEDED, ENOLCK), - X (SHARING_VIOLATION, EBUSY), - X (SIGNAL_PENDING, EBUSY), - X (SIGNAL_REFUSED, EIO), - X (THREAD_1_INACTIVE, EINVAL), - X (TOO_MANY_LINKS, EMLINK), - X (TOO_MANY_OPEN_FILES, EMFILE), - X (WAIT_NO_CHILDREN, ECHILD), - X (WORKING_SET_QUOTA, EAGAIN), - X (WRITE_PROTECT, EROFS), - X (SEEK, EINVAL), - X (SECTOR_NOT_FOUND, EINVAL), - { 0, NULL, 0} -}; - -extern "C" { -const char __declspec(dllexport) * _sys_errlist[] NO_COPY_INIT = -{ -/* NOERROR 0 */ "No error", -/* EPERM 1 */ "Operation not permitted", -/* ENOENT 2 */ "No such file or directory", -/* ESRCH 3 */ "No such process", -/* EINTR 4 */ "Interrupted system call", -/* EIO 5 */ "Input/Output error", -/* ENXIO 6 */ "No such device or address", -/* E2BIG 7 */ "Argument list too long", -/* ENOEXEC 8 */ "Exec format error", -/* EBADF 9 */ "Bad file descriptor", -/* ECHILD 10 */ "No child processes", -/* EAGAIN 11 */ "Resource temporarily unavailable", -/* ENOMEM 12 */ "Cannot allocate memory", -/* EACCES 13 */ "Permission denied", -/* EFAULT 14 */ "Bad address", -/* ENOTBLK 15 */ "Block device required", -/* EBUSY 16 */ "Device or resource busy", -/* EEXIST 17 */ "File exists", -/* EXDEV 18 */ "Invalid cross-device link", -/* ENODEV 19 */ "No such device", -/* ENOTDIR 20 */ "Not a directory", -/* EISDIR 21 */ "Is a directory", -/* EINVAL 22 */ "Invalid argument", -/* ENFILE 23 */ "Too many open files in system", -/* EMFILE 24 */ "Too many open files", -/* ENOTTY 25 */ "Inappropriate ioctl for device", -/* ETXTBSY 26 */ "Text file busy", -/* EFBIG 27 */ "File too large", -/* ENOSPC 28 */ "No space left on device", -/* ESPIPE 29 */ "Illegal seek", -/* EROFS 30 */ "Read-only file system", -/* EMLINK 31 */ "Too many links", -/* EPIPE 32 */ "Broken pipe", -/* EDOM 33 */ "Numerical argument out of domain", -/* ERANGE 34 */ "Numerical result out of range", -/* ENOMSG 35 */ "No message of desired type", -/* EIDRM 36 */ "Identifier removed", -/* ECHRNG 37 */ "Channel number out of range", -/* EL2NSYNC 38 */ "Level 2 not synchronized", -/* EL3HLT 39 */ "Level 3 halted", -/* EL3RST 40 */ "Level 3 reset", -/* ELNRNG 41 */ "Link number out of range", -/* EUNATCH 42 */ "Protocol driver not attached", -/* ENOCSI 43 */ "No CSI structure available", -/* EL2HLT 44 */ "Level 2 halted", -/* EDEADLK 45 */ "Resource deadlock avoided", -/* ENOLCK 46 */ "No locks available", - "error 47", - "error 48", - "error 49", -/* EBADE 50 */ "Invalid exchange", -/* EBADR 51 */ "Invalid request descriptor", -/* EXFULL 52 */ "Exchange full", -/* ENOANO 53 */ "No anode", -/* EBADRQC 54 */ "Invalid request code", -/* EBADSLT 55 */ "Invalid slot", -/* EDEADLOCK 56 */ "File locking deadlock error", -/* EBFONT 57 */ "Bad font file format", - "error 58", - "error 59", -/* ENOSTR 60 */ "Device not a stream", -/* ENODATA 61 */ "No data available", -/* ETIME 62 */ "Timer expired", -/* ENOSR 63 */ "Out of streams resources", -/* ENONET 64 */ "Machine is not on the network", -/* ENOPKG 65 */ "Package not installed", -/* EREMOTE 66 */ "Object is remote", -/* ENOLINK 67 */ "Link has been severed", -/* EADV 68 */ "Advertise error", -/* ESRMNT 69 */ "Srmount error", -/* ECOMM 70 */ "Communication error on send", -/* EPROTO 71 */ "Protocol error", - "error 72", - "error 73", -/* EMULTIHOP 74 */ "Multihop attempted", -/* ELBIN 75 */ "Inode is remote (not really error)", -/* EDOTDOT 76 */ "RFS specific error", -/* EBADMSG 77 */ "Bad message", - "error 78", -/* EFTYPE 79 */ "Inappropriate file type or format", -/* ENOTUNIQ 80 */ "Name not unique on network", -/* EBADFD 81 */ "File descriptor in bad state", -/* EREMCHG 82 */ "Remote address changed", -/* ELIBACC 83 */ "Can not access a needed shared library", -/* ELIBBAD 84 */ "Accessing a corrupted shared library", -/* ELIBSCN 85 */ ".lib section in a.out corrupted", -/* ELIBMAX 86 */ "Attempting to link in too many shared libraries", -/* ELIBEXEC 87 */ "Cannot exec a shared library directly", -/* ENOSYS 88 */ "Function not implemented", -/* ENMFILE 89 */ "No more files", -/* ENOTEMPTY 90 */ "Directory not empty", -/* ENAMETOOLONG 91 */ "File name too long", -/* ELOOP 92 */ "Too many levels of symbolic links", - "error 93", - "error 94", -/* EOPNOTSUPP 95 */ "Operation not supported", -/* EPFNOSUPPORT 96 */ "Protocol family not supported", - "error 97", - "error 98", - "error 99", - "error 100", - "error 101", - "error 102", - "error 103", -/* ECONNRESET 104 */ "Connection reset by peer", -/* ENOBUFS 105 */ "No buffer space available", -/* EAFNOSUPPORT 106 */ "Address family not supported by protocol", -/* EPROTOTYPE 107 */ "Protocol wrong type for socket", -/* ENOTSOCK 108 */ "Socket operation on non-socket", -/* ENOPROTOOPT 109 */ "Protocol not available", -/* ESHUTDOWN 110 */ "Cannot send after transport endpoint shutdown", -/* ECONNREFUSED 111 */ "Connection refused", -/* EADDRINUSE 112 */ "Address already in use", -/* ECONNABORTED 113 */ "Software caused connection abort", -/* ENETUNREACH 114 */ "Network is unreachable", -/* ENETDOWN 115 */ "Network is down", -/* ETIMEDOUT 116 */ "Connection timed out", -/* EHOSTDOWN 117 */ "Host is down", -/* EHOSTUNREACH 118 */ "No route to host", -/* EINPROGRESS 119 */ "Operation now in progress", -/* EALREADY 120 */ "Operation already in progress", -/* EDESTADDRREQ 121 */ "Destination address required", -/* EMSGSIZE 122 */ "Message too long", -/* EPROTONOSUPPORT 123 */ "Protocol not supported", -/* ESOCKTNOSUPPORT 124 */ "Socket type not supported", -/* EADDRNOTAVAIL 125 */ "Cannot assign requested address", -/* ENETRESET 126 */ "Network dropped connection on reset", -/* EISCONN 127 */ "Transport endpoint is already connected", -/* ENOTCONN 128 */ "Transport endpoint is not connected", -/* ETOOMANYREFS 129 */ "Too many references: cannot splice", -/* EPROCLIM 130 */ "Too many processes", -/* EUSERS 131 */ "Too many users", -/* EDQUOT 132 */ "Disk quota exceeded", -/* ESTALE 133 */ "Stale NFS file handle", -/* ENOTSUP 134 */ "Not supported", -/* ENOMEDIUM 135 */ "No medium found", -/* ENOSHARE 136 */ "No such host or network path", -/* ECASECLASH 137 */ "Filename exists with different case", -/* EILSEQ 138 */ "Invalid or incomplete multibyte or wide character", -/* EOVERFLOW 139 */ "Value too large for defined data type" -}; - -int NO_COPY_INIT _sys_nerr = sizeof (_sys_errlist) / sizeof (_sys_errlist[0]); -}; - -int __stdcall -geterrno_from_win_error (DWORD code, int deferrno) -{ - for (int i = 0; errmap[i].w != 0; ++i) - if (code == errmap[i].w) - { - syscall_printf ("windows error %u == errno %d", code, errmap[i].e); - return errmap[i].e; - } - - syscall_printf ("unknown windows error %u, setting errno to %d", code, - deferrno); - return deferrno; /* FIXME: what's so special about EACCESS? */ -} - -/* seterrno_from_win_error: Given a Windows error code, set errno - as appropriate. */ -void __stdcall -seterrno_from_win_error (const char *file, int line, DWORD code) -{ - syscall_printf ("%s:%d windows error %d", file, line, code); - set_errno (geterrno_from_win_error (code, EACCES)); -} - -/* seterrno: Set `errno' based on GetLastError (). */ -void __stdcall -seterrno (const char *file, int line) -{ - seterrno_from_win_error (file, line, GetLastError ()); -} - -extern char *_user_strerror _PARAMS ((int)); - -static char * -strerror_worker (int errnum) -{ - char *res; - if (errnum >= 0 && errnum < _sys_nerr) - res = (char *) _sys_errlist [errnum]; - else - res = NULL; - return res; -} - -/* strerror: convert from errno values to error strings */ -extern "C" char * -strerror (int errnum) -{ - char *errstr = strerror_worker (errnum); - if (!errstr) - __small_sprintf (errstr = _my_tls.locals.strerror_buf, "Unknown error %u", - (unsigned) errnum); - return errstr; -} - -#if 0 -extern "C" int -strerror_r (int errnum, char *buf, size_t n) -{ - char *errstr = strerror_worker (errnum); - if (!errstr) - return EINVAL; - if (strlen (errstr) >= n) - return ERANGE; - strcpy (buf, errstr); - return 0; -} -#endif diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc deleted file mode 100644 index 279223e58..000000000 --- a/winsup/cygwin/exceptions.cc +++ /dev/null @@ -1,1407 +0,0 @@ -/* exceptions.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include - -#include "exceptions.h" -#include "sync.h" -#include "pinfo.h" -#include "cygtls.h" -#include "sigproc.h" -#include "cygerrno.h" -#include "shared_info.h" -#include "perprocess.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" - -#define CALL_HANDLER_RETRY 20 - -char debugger_command[2 * CYG_MAX_PATH + 20]; - -extern "C" { -extern void sigdelayed (); -}; - -extern NO_COPY DWORD dwExeced; -int NO_COPY sigExeced; - -static BOOL WINAPI ctrl_c_handler (DWORD); -char windows_system_directory[1024]; -static size_t windows_system_directory_length; - -/* This is set to indicate that we have already exited. */ - -static NO_COPY int exit_already = 0; -static muto NO_COPY mask_sync; - -NO_COPY static struct -{ - unsigned int code; - const char *name; -} status_info[] = -{ -#define X(s) s, #s - { X (STATUS_ABANDONED_WAIT_0) }, - { X (STATUS_ACCESS_VIOLATION) }, - { X (STATUS_ARRAY_BOUNDS_EXCEEDED) }, - { X (STATUS_BREAKPOINT) }, - { X (STATUS_CONTROL_C_EXIT) }, - { X (STATUS_DATATYPE_MISALIGNMENT) }, - { X (STATUS_FLOAT_DENORMAL_OPERAND) }, - { X (STATUS_FLOAT_DIVIDE_BY_ZERO) }, - { X (STATUS_FLOAT_INEXACT_RESULT) }, - { X (STATUS_FLOAT_INVALID_OPERATION) }, - { X (STATUS_FLOAT_OVERFLOW) }, - { X (STATUS_FLOAT_STACK_CHECK) }, - { X (STATUS_FLOAT_UNDERFLOW) }, - { X (STATUS_GUARD_PAGE_VIOLATION) }, - { X (STATUS_ILLEGAL_INSTRUCTION) }, - { X (STATUS_INTEGER_DIVIDE_BY_ZERO) }, - { X (STATUS_INTEGER_OVERFLOW) }, - { X (STATUS_INVALID_DISPOSITION) }, - { X (STATUS_IN_PAGE_ERROR) }, - { X (STATUS_NONCONTINUABLE_EXCEPTION) }, - { X (STATUS_NO_MEMORY) }, - { X (STATUS_PENDING) }, - { X (STATUS_PRIVILEGED_INSTRUCTION) }, - { X (STATUS_SINGLE_STEP) }, - { X (STATUS_STACK_OVERFLOW) }, - { X (STATUS_TIMEOUT) }, - { X (STATUS_USER_APC) }, - { X (STATUS_WAIT_0) }, - { 0, 0 } -#undef X -}; - -/* Initialization code. */ - -BOOL WINAPI -dummy_ctrl_c_handler (DWORD) -{ - return TRUE; -} - -void -init_console_handler (bool install_handler) -{ - BOOL res; - - SetConsoleCtrlHandler (ctrl_c_handler, FALSE); - if (wincap.has_null_console_handler_routine ()) - SetConsoleCtrlHandler (NULL, FALSE); - if (install_handler) - res = SetConsoleCtrlHandler (ctrl_c_handler, TRUE); - else if (wincap.has_null_console_handler_routine ()) - res = SetConsoleCtrlHandler (NULL, TRUE); - else - res = SetConsoleCtrlHandler (dummy_ctrl_c_handler, TRUE); - if (!res) - system_printf ("SetConsoleCtrlHandler failed, %E"); -} - -extern "C" void -error_start_init (const char *buf) -{ - if (!buf || !*buf) - { - debugger_command[0] = '\0'; - return; - } - - char pgm[CYG_MAX_PATH]; - if (!GetModuleFileName (NULL, pgm, CYG_MAX_PATH)) - strcpy (pgm, "cygwin1.dll"); - for (char *p = strchr (pgm, '\\'); p; p = strchr (p, '\\')) - *p = '/'; - - __small_sprintf (debugger_command, "%s \"%s\"", buf, pgm); -} - -static void -open_stackdumpfile () -{ - if (myself->progname[0]) - { - const char *p; - /* write to progname.stackdump if possible */ - if (!myself->progname[0]) - p = "unknown"; - else if ((p = strrchr (myself->progname, '\\'))) - p++; - else - p = myself->progname; - char corefile[strlen (p) + sizeof (".stackdump")]; - __small_sprintf (corefile, "%s.stackdump", p); - HANDLE h = CreateFile (corefile, GENERIC_WRITE, 0, &sec_none_nih, - CREATE_ALWAYS, 0, 0); - if (h != INVALID_HANDLE_VALUE) - { - if (!myself->cygstarted) - system_printf ("Dumping stack trace to %s", corefile); - else - debug_printf ("Dumping stack trace to %s", corefile); - SetStdHandle (STD_ERROR_HANDLE, h); - } - } -} - -/* Utilities for dumping the stack, etc. */ - -static void -exception (EXCEPTION_RECORD *e, CONTEXT *in) -{ - const char *exception_name = NULL; - - if (e) - { - for (int i = 0; status_info[i].name; i++) - { - if (status_info[i].code == e->ExceptionCode) - { - exception_name = status_info[i].name; - break; - } - } - } - - if (exception_name) - small_printf ("Exception: %s at eip=%08x\r\n", exception_name, in->Eip); - else - small_printf ("Signal %d at eip=%08x\r\n", e->ExceptionCode, in->Eip); - small_printf ("eax=%08x ebx=%08x ecx=%08x edx=%08x esi=%08x edi=%08x\r\n", - in->Eax, in->Ebx, in->Ecx, in->Edx, in->Esi, in->Edi); - small_printf ("ebp=%08x esp=%08x program=%s, pid %u, thread %s\r\n", - in->Ebp, in->Esp, myself->progname, myself->pid, cygthread::name ()); - small_printf ("cs=%04x ds=%04x es=%04x fs=%04x gs=%04x ss=%04x\r\n", - in->SegCs, in->SegDs, in->SegEs, in->SegFs, in->SegGs, in->SegSs); -} - -/* A class for manipulating the stack. */ -class stack_info -{ - int walk (); /* Uses the "old" method */ - char *next_offset () {return *((char **) sf.AddrFrame.Offset);} - bool needargs; - DWORD dummy_frame; -public: - STACKFRAME sf; /* For storing the stack information */ - void init (DWORD, bool, bool); /* Called the first time that stack info is needed */ - - /* Postfix ++ iterates over the stack, returning zero when nothing is left. */ - int operator ++(int) { return walk (); } -}; - -/* The number of parameters used in STACKFRAME */ -#define NPARAMS (sizeof (thestack.sf.Params) / sizeof (thestack.sf.Params[0])) - -/* This is the main stack frame info for this process. */ -static NO_COPY stack_info thestack; - -/* Initialize everything needed to start iterating. */ -void -stack_info::init (DWORD ebp, bool wantargs, bool goodframe) -{ -# define debp ((DWORD *) ebp) - memset (&sf, 0, sizeof (sf)); - if (!goodframe) - sf.AddrFrame.Offset = ebp; - else - { - dummy_frame = ebp; - sf.AddrFrame.Offset = (DWORD) &dummy_frame; - } - sf.AddrReturn.Offset = debp[1]; - sf.AddrFrame.Mode = AddrModeFlat; - needargs = wantargs; -# undef debp -} - -/* Walk the stack by looking at successive stored 'bp' frames. - This is not foolproof. */ -int -stack_info::walk () -{ - char **ebp; - if ((ebp = (char **) next_offset ()) == NULL) - return 0; - - sf.AddrFrame.Offset = (DWORD) ebp; - sf.AddrPC.Offset = sf.AddrReturn.Offset; - - if (!sf.AddrPC.Offset) - return 0; /* stack frames are exhausted */ - - /* The return address always follows the stack pointer */ - sf.AddrReturn.Offset = (DWORD) *++ebp; - - if (needargs) - /* The arguments follow the return address */ - for (unsigned i = 0; i < NPARAMS; i++) - sf.Params[i] = (DWORD) *++ebp; - - return 1; -} - -static void -stackdump (DWORD ebp, int open_file, bool isexception) -{ - extern unsigned long rlim_core; - static bool already_dumped; - - if (rlim_core == 0UL || (open_file && already_dumped)) - return; - - if (open_file) - open_stackdumpfile (); - - already_dumped = true; - - int i; - - thestack.init (ebp, 1, !isexception); /* Initialize from the input CONTEXT */ - small_printf ("Stack trace:\r\nFrame Function Args\r\n"); - for (i = 0; i < 16 && thestack++; i++) - { - small_printf ("%08x %08x ", thestack.sf.AddrFrame.Offset, - thestack.sf.AddrPC.Offset); - for (unsigned j = 0; j < NPARAMS; j++) - small_printf ("%s%08x", j == 0 ? " (" : ", ", thestack.sf.Params[j]); - small_printf (")\r\n"); - } - small_printf ("End of stack trace%s\n", - i == 16 ? " (more stack frames may be present)" : ""); -} - -static bool -inside_kernel (CONTEXT *cx) -{ - int res; - MEMORY_BASIC_INFORMATION m; - - if (in_dllentry) - return true; - - memset (&m, 0, sizeof m); - if (!VirtualQuery ((LPCVOID) cx->Eip, &m, sizeof m)) - sigproc_printf ("couldn't get memory info, pc %p, %E", cx->Eip); - - char *checkdir = (char *) alloca (windows_system_directory_length + 4); - memset (checkdir, 0, sizeof (checkdir)); - -# define h ((HMODULE) m.AllocationBase) - /* Apparently Windows 95 can sometimes return bogus addresses from - GetThreadContext. These resolve to a strange allocation base. - These should *never* be treated as interruptible. */ - if (!h || m.State != MEM_COMMIT) - res = true; - else if (h == user_data->hmodule) - res = false; - else if (!GetModuleFileName (h, checkdir, windows_system_directory_length + 2)) - res = false; - else - res = strncasematch (windows_system_directory, checkdir, - windows_system_directory_length); - sigproc_printf ("pc %p, h %p, inside_kernel %d", cx->Eip, h, res); -# undef h - return res; -} - -/* Temporary (?) function for external callers to get a stack dump */ -extern "C" void -cygwin_stackdump () -{ - CONTEXT c; - c.ContextFlags = CONTEXT_FULL; - GetThreadContext (GetCurrentThread (), &c); - stackdump (c.Ebp, 0, 0); -} - -#define TIME_TO_WAIT_FOR_DEBUGGER 10000 - -extern "C" int -try_to_debug (bool waitloop) -{ - debug_printf ("debugger_command '%s'", debugger_command); - if (*debugger_command == '\0') - return 0; - if (being_debugged ()) - { - DebugBreak (); - return 0; - } - - __small_sprintf (strchr (debugger_command, '\0'), " %u", GetCurrentProcessId ()); - - LONG prio = GetThreadPriority (GetCurrentThread ()); - SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_HIGHEST); - PROCESS_INFORMATION pi = {NULL, 0, 0, 0}; - - STARTUPINFO si = {0, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL}; - si.lpReserved = NULL; - si.lpDesktop = NULL; - si.dwFlags = 0; - si.cb = sizeof (si); - - /* FIXME: need to know handles of all running threads to - suspend_all_threads_except (current_thread_id); - */ - - /* if any of these mutexes is owned, we will fail to start any cygwin app - until trapped app exits */ - - ReleaseMutex (tty_mutex); - - /* prevent recursive exception handling */ - char* rawenv = GetEnvironmentStrings () ; - for (char* p = rawenv; *p != '\0'; p = strchr (p, '\0') + 1) - { - if (strncmp (p, "CYGWIN=", strlen ("CYGWIN=")) == 0) - { - char* q = strstr (p, "error_start") ; - /* replace 'error_start=...' with '_rror_start=...' */ - if (q) - { - *q = '_' ; - SetEnvironmentVariable ("CYGWIN", p + strlen ("CYGWIN=")) ; - } - break ; - } - } - - console_printf ("*** starting debugger for pid %u, tid %u\n", - cygwin_pid (GetCurrentProcessId ()), GetCurrentThreadId ()); - BOOL dbg; - dbg = CreateProcess (NULL, - debugger_command, - NULL, - NULL, - FALSE, - CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP, - NULL, - NULL, - &si, - &pi); - - if (!dbg) - system_printf ("Failed to start debugger, %E"); - else - { - if (!waitloop) - return dbg; - SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_IDLE); - while (!being_debugged ()) - low_priority_sleep (0); - Sleep (2000); - } - - console_printf ("*** continuing pid %u from debugger call (%d)\n", - cygwin_pid (GetCurrentProcessId ()), dbg); - - SetThreadPriority (GetCurrentThread (), prio); - return dbg; -} - -extern "C" DWORD __stdcall RtlUnwind (void *, void *, void *, DWORD); -static void __stdcall rtl_unwind (exception_list *, PEXCEPTION_RECORD) __attribute__ ((noinline, regparm (3))); -void __stdcall -rtl_unwind (exception_list *frame, PEXCEPTION_RECORD e) -{ - __asm__ ("\n\ - pushl %%ebx \n\ - pushl %%edi \n\ - pushl %%esi \n\ - pushl $0 \n\ - pushl %1 \n\ - pushl $1f \n\ - pushl %0 \n\ - call _RtlUnwind@16 \n\ -1: \n\ - popl %%esi \n\ - popl %%edi \n\ - popl %%ebx \n\ -": : "r" (frame), "r" (e)); -} - -/* Main exception handler. */ - -extern "C" char *__progname; -int -_cygtls::handle_exceptions (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void *) -{ - static bool NO_COPY debugging; - static int NO_COPY recursed; - _cygtls& me = _my_tls; - - if (debugging && ++debugging < 500000) - { - SetThreadPriority (hMainThread, THREAD_PRIORITY_NORMAL); - return 0; - } - - /* If we've already exited, don't do anything here. Returning 1 - tells Windows to keep looking for an exception handler. */ - if (exit_already || e->ExceptionFlags) - return 1; - - siginfo_t si = {0}; - si.si_code = SI_KERNEL; - /* Coerce win32 value to posix value. */ - switch (e->ExceptionCode) - { - case STATUS_FLOAT_DENORMAL_OPERAND: - case STATUS_FLOAT_DIVIDE_BY_ZERO: - case STATUS_FLOAT_INVALID_OPERATION: - case STATUS_FLOAT_STACK_CHECK: - si.si_signo = SIGFPE; - si.si_code = FPE_FLTSUB; - break; - case STATUS_FLOAT_INEXACT_RESULT: - si.si_signo = SIGFPE; - si.si_code = FPE_FLTRES; - break; - case STATUS_FLOAT_OVERFLOW: - si.si_signo = SIGFPE; - si.si_code = FPE_FLTOVF; - break; - case STATUS_FLOAT_UNDERFLOW: - si.si_signo = SIGFPE; - si.si_code = FPE_FLTUND; - break; - case STATUS_INTEGER_DIVIDE_BY_ZERO: - si.si_signo = SIGFPE; - si.si_code = FPE_INTDIV; - break; - case STATUS_INTEGER_OVERFLOW: - si.si_signo = SIGFPE; - si.si_code = FPE_INTOVF; - break; - - case STATUS_ILLEGAL_INSTRUCTION: - si.si_signo = SIGILL; - si.si_code = ILL_ILLOPC; - break; - - case STATUS_PRIVILEGED_INSTRUCTION: - si.si_signo = SIGILL; - si.si_code = ILL_PRVOPC; - break; - - case STATUS_NONCONTINUABLE_EXCEPTION: - si.si_signo = SIGILL; - si.si_code = ILL_ILLADR; - break; - - case STATUS_TIMEOUT: - si.si_signo = SIGALRM; - break; - - case STATUS_GUARD_PAGE_VIOLATION: - si.si_signo = SIGBUS; - si.si_code = BUS_OBJERR; - break; - - case STATUS_DATATYPE_MISALIGNMENT: - si.si_signo = SIGBUS; - si.si_code = BUS_ADRALN; - break; - - case STATUS_ACCESS_VIOLATION: - if (mmap_is_attached_page (e->ExceptionInformation[1])) - { - si.si_signo = SIGBUS; - si.si_code = BUS_OBJERR; - } - else - { - MEMORY_BASIC_INFORMATION m; - VirtualQuery ((PVOID) e->ExceptionInformation[1], &m, sizeof m); - si.si_signo = SIGSEGV; - si.si_code = m.State == MEM_FREE ? SEGV_MAPERR : SEGV_ACCERR; - } - break; - - case STATUS_ARRAY_BOUNDS_EXCEEDED: - case STATUS_IN_PAGE_ERROR: - case STATUS_NO_MEMORY: - case STATUS_INVALID_DISPOSITION: - case STATUS_STACK_OVERFLOW: - si.si_signo = SIGSEGV; - si.si_code = SEGV_MAPERR; - break; - - case STATUS_CONTROL_C_EXIT: - si.si_signo = SIGINT; - break; - - case STATUS_INVALID_HANDLE: - /* CloseHandle will throw this exception if it is given an - invalid handle. We don't care about the exception; we just - want CloseHandle to return an error. This can be revisited - if gcc ever supports Windows style structured exception - handling. */ - return 0; - - default: - /* If we don't recognize the exception, we have to assume that - we are doing structured exception handling, and we let - something else handle it. */ - return 1; - } - - rtl_unwind (frame, e); - - debug_printf ("In cygwin_except_handler exc %p at %p sp %p", e->ExceptionCode, in->Eip, in->Esp); - debug_printf ("In cygwin_except_handler sig %d at %p", si.si_signo, in->Eip); - - if (global_sigs[si.si_signo].sa_mask & SIGTOMASK (si.si_signo)) - syscall_printf ("signal %d, masked %p", si.si_signo, - global_sigs[si.si_signo].sa_mask); - - debug_printf ("In cygwin_except_handler calling %p", - global_sigs[si.si_signo].sa_handler); - - DWORD *ebp = (DWORD *) in->Esp; - for (DWORD *bpend = (DWORD *) __builtin_frame_address (0); ebp > bpend; ebp--) - if (*ebp == in->SegCs && ebp[-1] == in->Eip) - { - ebp -= 2; - break; - } - - if (me.fault_guarded ()) - me.return_from_fault (); - - me.copy_context (in); - if (!cygwin_finished_initializing - || &me == _sig_tls - || (void *) global_sigs[si.si_signo].sa_handler == (void *) SIG_DFL - || (void *) global_sigs[si.si_signo].sa_handler == (void *) SIG_IGN - || (void *) global_sigs[si.si_signo].sa_handler == (void *) SIG_ERR) - { - /* Print the exception to the console */ - if (!myself->cygstarted) - for (int i = 0; status_info[i].name; i++) - if (status_info[i].code == e->ExceptionCode) - { - system_printf ("Exception: %s", status_info[i].name); - break; - } - - /* Another exception could happen while tracing or while exiting. - Only do this once. */ - if (recursed++) - system_printf ("Error while dumping state (probably corrupted stack)"); - else - { - if (try_to_debug (0)) - { - debugging = true; - return 0; - } - - open_stackdumpfile (); - exception (e, in); - stackdump ((DWORD) ebp, 0, 1); - } - - if (e->ExceptionCode == STATUS_ACCESS_VIOLATION) - { - int error_code = 0; - if (si.si_code == SEGV_ACCERR) /* Address present */ - error_code |= 1; - if (e->ExceptionInformation[0]) /* Write access */ - error_code |= 2; - if (!inside_kernel (in)) /* User space */ - error_code |= 4; - klog (LOG_INFO, "%s[%d]: segfault at %08x rip %08x rsp %08x error %d", - __progname, myself->pid, - e->ExceptionInformation[1], in->Eip, in->Esp, - ((in->Eip >= 0x61000000 && in->Eip < 0x61200000) - ? 0 : 4) | (e->ExceptionInformation[0] << 1)); - } - - me.signal_exit (0x80 | si.si_signo); // Flag signal + core dump - } - - si.si_addr = (void *) in->Eip; - si.si_errno = si.si_pid = si.si_uid = 0; - me.incyg++; - sig_send (NULL, si, &me); // Signal myself - me.incyg--; - e->ExceptionFlags = 0; - return 0; -} - -/* Utilities to call a user supplied exception handler. */ - -#define SIG_NONMASKABLE (SIGTOMASK (SIGKILL) | SIGTOMASK (SIGSTOP)) - -/* Non-raceable sigsuspend - * Note: This implementation is based on the Single UNIX Specification - * man page. This indicates that sigsuspend always returns -1 and that - * attempts to block unblockable signals will be silently ignored. - * This is counter to what appears to be documented in some UNIX - * man pages, e.g. Linux. - */ -int __stdcall -handle_sigsuspend (sigset_t tempmask) -{ - if (&_my_tls != _main_tls) - { - cancelable_wait (signal_arrived, INFINITE, cw_cancel_self); - return -1; - } - - sigset_t oldmask = myself->getsigmask (); // Remember for restoration - - set_signal_mask (tempmask, myself->getsigmask ()); - sigproc_printf ("oldmask %p, newmask %p", oldmask, tempmask); - - pthread_testcancel (); - cancelable_wait (signal_arrived, INFINITE); - - set_sig_errno (EINTR); // Per POSIX - - /* A signal dispatch function will have been added to our stack and will - be hit eventually. Set the old mask to be restored when the signal - handler returns and indicate its presence by modifying deltamask. */ - - _my_tls.deltamask |= SIG_NONMASKABLE; - _my_tls.oldmask = oldmask; // Will be restored by signal handler - return -1; -} - -extern DWORD exec_exit; // Possible exit value for exec - -extern "C" { -static void -sig_handle_tty_stop (int sig) -{ - _my_tls.incyg = 1; - /* Silently ignore attempts to suspend if there is no accommodating - cygwin parent to deal with this behavior. */ - if (!myself->cygstarted) - { - myself->process_state &= ~PID_STOPPED; - return; - } - - myself->stopsig = sig; - myself->alert_parent (sig); - sigproc_printf ("process %d stopped by signal %d", myself->pid, sig); - HANDLE w4[2]; - w4[0] = sigCONT; - w4[1] = signal_arrived; - switch (WaitForMultipleObjects (2, w4, TRUE, INFINITE)) - { - case WAIT_OBJECT_0: - case WAIT_OBJECT_0 + 1: - reset_signal_arrived (); - myself->alert_parent (SIGCONT); - break; - default: - api_fatal ("WaitSingleObject failed, %E"); - break; - } - _my_tls.incyg = 0; -} -} - -bool -_cygtls::interrupt_now (CONTEXT *cx, int sig, void *handler, - struct sigaction& siga) -{ - bool interrupted; - - if (incyg || spinning || locked () || inside_kernel (cx)) - interrupted = false; - else - { - push ((__stack_t) cx->Eip); - interrupt_setup (sig, handler, siga); - cx->Eip = pop (); - SetThreadContext (*this, cx); /* Restart the thread in a new location */ - interrupted = true; - } - return interrupted; -} - -void __stdcall -_cygtls::interrupt_setup (int sig, void *handler, struct sigaction& siga) -{ - push ((__stack_t) sigdelayed); - deltamask = siga.sa_mask & ~SIG_NONMASKABLE; - sa_flags = siga.sa_flags; - func = (void (*) (int)) handler; - if (siga.sa_flags & SA_RESETHAND) - siga.sa_handler = SIG_DFL; - saved_errno = -1; // Flag: no errno to save - if (handler == sig_handle_tty_stop) - { - myself->stopsig = 0; - myself->process_state |= PID_STOPPED; - } - - this->sig = sig; // Should always be last thing set to avoid a race - - if (!event) - threadkill = false; - else - { - HANDLE h = event; - event = NULL; - SetEvent (h); - } - - /* Clear any waiting threads prior to dispatching to handler function */ - int res = SetEvent (signal_arrived); // For an EINTR case - proc_subproc (PROC_CLEARWAIT, 1); - sigproc_printf ("armed signal_arrived %p, sig %d, res %d", signal_arrived, - sig, res); -} - -extern "C" void __stdcall -set_sig_errno (int e) -{ - *_my_tls.errno_addr = e; - _my_tls.saved_errno = e; - // sigproc_printf ("errno %d", e); -} - -static int setup_handler (int, void *, struct sigaction&, _cygtls *tls) - __attribute__((regparm(3))); -static int -setup_handler (int sig, void *handler, struct sigaction& siga, _cygtls *tls) -{ - CONTEXT cx; - bool interrupted = false; - - if (tls->sig) - { - sigproc_printf ("trying to send sig %d but signal %d already armed", - sig, tls->sig); - goto out; - } - - for (int i = 0; i < CALL_HANDLER_RETRY; i++) - { - tls->lock (); - if (tls->incyg) - { - sigproc_printf ("controlled interrupt. stackptr %p, stack %p, stackptr[-1] %p", - tls->stackptr, tls->stack, tls->stackptr[-1]); - tls->interrupt_setup (sig, handler, siga); - interrupted = true; - tls->unlock (); - break; - } - - tls->unlock (); - DWORD res; - HANDLE hth = (HANDLE) *tls; - - /* Suspend the thread which will receive the signal. - For Windows 95, we also have to ensure that the addresses returned by - GetThreadContext are valid. - If one of these conditions is not true we loop for a fixed number of times - since we don't want to stall the signal handler. FIXME: Will this result in - noticeable delays? - If the thread is already suspended (which can occur when a program has called - SuspendThread on itself) then just queue the signal. */ - -#ifndef DEBUGGING - sigproc_printf ("suspending mainthread"); -#else - cx.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER; - if (!GetThreadContext (hth, &cx)) - memset (&cx, 0, sizeof cx); - sigproc_printf ("suspending mainthread PC %p", cx.Eip); -#endif - res = SuspendThread (hth); - /* Just set pending if thread is already suspended */ - if (res) - { - ResumeThread (hth); - break; - } - cx.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER; - if (!GetThreadContext (hth, &cx)) - system_printf ("couldn't get context of main thread, %E"); - else - interrupted = tls->interrupt_now (&cx, sig, handler, siga); - - res = ResumeThread (hth); - if (interrupted) - break; - - sigproc_printf ("couldn't interrupt. trying again."); - low_priority_sleep (0); - } - -out: - sigproc_printf ("signal %d %sdelivered", sig, interrupted ? "" : "not "); - return interrupted; -} - -static inline bool -has_visible_window_station () -{ - HWINSTA station_hdl; - USEROBJECTFLAGS uof; - DWORD len; - - /* Check if the process is associated with a visible window station. - These are processes running on the local desktop as well as processes - running in terminal server sessions. - Processes running in a service session not explicitely associated - with the desktop (using the "Allow service to interact with desktop" - property) are running in an invisible window station. */ - if ((station_hdl = GetProcessWindowStation ()) - && GetUserObjectInformationA (station_hdl, UOI_FLAGS, &uof, - sizeof uof, &len) - && (uof.dwFlags & WSF_VISIBLE)) - return true; - return false; -} - -/* Keyboard interrupt handler. */ -static BOOL WINAPI -ctrl_c_handler (DWORD type) -{ - static bool saw_close; - - if (!cygwin_finished_initializing) - { - if (myself->cygstarted) /* Was this process created by a cygwin process? */ - return TRUE; /* Yes. Let the parent eventually handle CTRL-C issues. */ - debug_printf ("exiting with status %p", STATUS_CONTROL_C_EXIT); - ExitProcess (STATUS_CONTROL_C_EXIT); - } - - _my_tls.remove (INFINITE); - -#if 0 - if (type == CTRL_C_EVENT || type == CTRL_BREAK_EVENT) - proc_subproc (PROC_KILLFORKED, 0); -#endif - - /* Return FALSE to prevent an "End task" dialog box from appearing - for each Cygwin process window that's open when the computer - is shut down or console window is closed. */ - - if (type == CTRL_SHUTDOWN_EVENT) - { -#if 0 - /* Don't send a signal. Only NT service applications and their child - processes will receive this event and the services typically already - handle the shutdown action when getting the SERVICE_CONTROL_SHUTDOWN - control message. */ - sig_send (NULL, SIGTERM); -#endif - return FALSE; - } - - if (myself->ctty != -1) - { - if (type == CTRL_CLOSE_EVENT) - { - sig_send (NULL, SIGHUP); - saw_close = true; - return FALSE; - } - if (!saw_close && type == CTRL_LOGOFF_EVENT) - { -#if 0 - /* CV, 2005-09-08: The CTRL_LOGOFF_EVENT is only send to services. - It's send when *any* user logs off. Services generally have - a modified console handler which allows services to survive - also after a user logged out, even if the service has a console - window attached to the visible window station of the user - ("Interact with desktop"). The below code contradicts this - standard behaviour, so for now, we disable it and just return - FALSE to get the default behaviour or the one the application's - own console handler (if any) requires. - In other words: We never send SIGHUP to services and their - child processes on a LOGOFF event. */ - - /* Check if the process is actually associated with a visible - window station, one which actually represents a visible desktop. - If not, the CTRL_LOGOFF_EVENT doesn't concern this process. */ - if (has_visible_window_station ()) - sig_send (myself_nowait, SIGHUP); -#endif - return TRUE; - } - } - - /* If we are a stub and the new process has a pinfo structure, let it - handle this signal. */ - if (dwExeced && pinfo (dwExeced)) - return TRUE; - - /* We're only the process group leader when we have a valid pinfo structure. - If we don't have one, then the parent "stub" will handle the signal. */ - if (!pinfo (cygwin_pid (GetCurrentProcessId ()))) - return TRUE; - - tty_min *t = cygwin_shared->tty.get_tty (myself->ctty); - /* Ignore this if we're not the process group leader since it should be handled - *by* the process group leader. */ - if (myself->ctty != -1 && t->getpgid () == myself->pid && - (GetTickCount () - t->last_ctrl_c) >= MIN_CTRL_C_SLOP) - /* Otherwise we just send a SIGINT to the process group and return TRUE (to indicate - that we have handled the signal). At this point, type should be - a CTRL_C_EVENT or CTRL_BREAK_EVENT. */ - { - int sig = SIGINT; - /* If intr and quit are both mapped to ^C, send SIGQUIT on ^BREAK */ - if (type == CTRL_BREAK_EVENT - && t->ti.c_cc[VINTR] == 3 && t->ti.c_cc[VQUIT] == 3) - sig = SIGQUIT; - t->last_ctrl_c = GetTickCount (); - killsys (-myself->pid, sig); - t->last_ctrl_c = GetTickCount (); - return TRUE; - } - - return TRUE; -} - -/* Function used by low level sig wrappers. */ -extern "C" void __stdcall -set_process_mask (sigset_t newmask) -{ - set_signal_mask (newmask, myself->getsigmask ()); -sigproc_printf ("mask now %p\n", myself->getsigmask ()); -} - -extern "C" int -sighold (int sig) -{ - /* check that sig is in right range */ - if (sig < 0 || sig >= NSIG) - { - set_errno (EINVAL); - syscall_printf ("signal %d out of range", sig); - return -1; - } - mask_sync.acquire (INFINITE); - sigset_t mask = myself->getsigmask (); - sigaddset (&mask, sig); - set_signal_mask (mask, myself->getsigmask ()); - mask_sync.release (); - return 0; -} - -extern "C" int -sigrelse (int sig) -{ - /* check that sig is in right range */ - if (sig < 0 || sig >= NSIG) - { - set_errno (EINVAL); - syscall_printf ("signal %d out of range", sig); - return -1; - } - mask_sync.acquire (INFINITE); - sigset_t mask = myself->getsigmask (); - sigdelset (&mask, sig); - set_signal_mask (mask, myself->getsigmask ()); - mask_sync.release (); - return 0; -} - -extern "C" _sig_func_ptr -sigset (int sig, _sig_func_ptr func) -{ - sig_dispatch_pending (); - _sig_func_ptr prev; - - /* check that sig is in right range */ - if (sig < 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) - { - set_errno (EINVAL); - syscall_printf ("SIG_ERR = sigset (%d, %p)", sig, func); - return (_sig_func_ptr) SIG_ERR; - } - - mask_sync.acquire (INFINITE); - sigset_t mask = myself->getsigmask (); - /* If sig was in the signal mask return SIG_HOLD, otherwise return the - previous disposition. */ - if (sigismember (&mask, sig)) - prev = SIG_HOLD; - else - prev = global_sigs[sig].sa_handler; - /* If func is SIG_HOLD, add sig to the signal mask, otherwise set the - disposition to func and remove sig from the signal mask. */ - if (func == SIG_HOLD) - sigaddset (&mask, sig); - else - { - /* No error checking. The test which could return SIG_ERR has already - been made above. */ - signal (sig, func); - sigdelset (&mask, sig); - } - set_signal_mask (mask, myself->getsigmask ()); - mask_sync.release (); - return prev; -} - -extern "C" int -sigignore (int sig) -{ - return sigset (sig, SIG_IGN) == SIG_ERR ? -1 : 0; -} - -/* Update the signal mask for this process and return the old mask. - Called from sigdelayed */ -extern "C" sigset_t -set_process_mask_delta () -{ - mask_sync.acquire (INFINITE); - sigset_t newmask, oldmask; - - if (_my_tls.deltamask & SIG_NONMASKABLE) - oldmask = _my_tls.oldmask; /* from handle_sigsuspend */ - else - oldmask = myself->getsigmask (); - newmask = (oldmask | _my_tls.deltamask) & ~SIG_NONMASKABLE; - sigproc_printf ("oldmask %p, newmask %p, deltamask %p", oldmask, newmask, - _my_tls.deltamask); - myself->setsigmask (newmask); - mask_sync.release (); - return oldmask; -} - -/* Set the signal mask for this process. - Note that some signals are unmaskable, as in UNIX. */ -extern "C" void __stdcall -set_signal_mask (sigset_t newmask, sigset_t& oldmask) -{ -#ifdef CGF - if (&_my_tls == _sig_tls) - small_printf ("********* waiting in signal thread\n"); -#endif - mask_sync.acquire (INFINITE); - newmask &= ~SIG_NONMASKABLE; - sigset_t mask_bits = oldmask & ~newmask; - sigproc_printf ("oldmask %p, newmask %p, mask_bits %p", oldmask, newmask, - mask_bits); - oldmask = newmask; - if (mask_bits) - sig_dispatch_pending (true); - else - sigproc_printf ("not calling sig_dispatch_pending"); - mask_sync.release (); -} - -int __stdcall -sigpacket::process () -{ - DWORD continue_now; - if (si.si_signo != SIGCONT) - continue_now = false; - else - { - continue_now = myself->process_state & PID_STOPPED; - myself->stopsig = 0; - myself->process_state &= ~PID_STOPPED; - /* Clear pending stop signals */ - sig_clear (SIGSTOP); - sig_clear (SIGTSTP); - sig_clear (SIGTTIN); - sig_clear (SIGTTOU); - } - - int rc = 1; - - sigproc_printf ("signal %d processing", si.si_signo); - struct sigaction& thissig = global_sigs[si.si_signo]; - - myself->rusage_self.ru_nsignals++; - - bool masked; - void *handler; - if (!hExeced || (void *) thissig.sa_handler == (void *) SIG_IGN) - handler = (void *) thissig.sa_handler; - else if (tls) - return 1; - else - handler = NULL; - - if (si.si_signo == SIGKILL) - goto exit_sig; - if (si.si_signo == SIGSTOP) - { - sig_clear (SIGCONT); - if (!tls) - tls = _main_tls; - goto stop; - } - - bool insigwait_mask; - if ((masked = ISSTATE (myself, PID_STOPPED))) - insigwait_mask = false; - else if (!tls) - insigwait_mask = !handler && (tls = _cygtls::find_tls (si.si_signo)); - else - insigwait_mask = sigismember (&tls->sigwait_mask, si.si_signo); - - if (insigwait_mask) - goto thread_specific; - - if (masked) - /* nothing to do */; - else if (sigismember (mask, si.si_signo)) - masked = true; - else if (tls) - masked = sigismember (&tls->sigmask, si.si_signo); - - if (!tls) - tls = _main_tls; - - if (masked) - { - sigproc_printf ("signal %d blocked", si.si_signo); - rc = -1; - goto done; - } - - /* Clear pending SIGCONT on stop signals */ - if (si.si_signo == SIGTSTP || si.si_signo == SIGTTIN || si.si_signo == SIGTTOU) - sig_clear (SIGCONT); - -#ifdef CGF - if (being_debugged ()) - { - char sigmsg[sizeof (_CYGWIN_SIGNAL_STRING " 0xffffffff")]; - __small_sprintf (sigmsg, _CYGWIN_SIGNAL_STRING " %p", si.si_signo); - OutputDebugString (sigmsg); - } -#endif - - if (handler == (void *) SIG_DFL) - { - if (insigwait_mask) - goto thread_specific; - if (si.si_signo == SIGCHLD || si.si_signo == SIGIO || si.si_signo == SIGCONT || si.si_signo == SIGWINCH - || si.si_signo == SIGURG) - { - sigproc_printf ("default signal %d ignored", si.si_signo); - if (continue_now) - SetEvent (signal_arrived); - goto done; - } - - if (si.si_signo == SIGTSTP || si.si_signo == SIGTTIN || si.si_signo == SIGTTOU) - goto stop; - - goto exit_sig; - } - - if (handler == (void *) SIG_IGN) - { - sigproc_printf ("signal %d ignored", si.si_signo); - goto done; - } - - if (handler == (void *) SIG_ERR) - goto exit_sig; - - tls->set_siginfo (this); - goto dosig; - -stop: - /* Eat multiple attempts to STOP */ - if (ISSTATE (myself, PID_STOPPED)) - goto done; - handler = (void *) sig_handle_tty_stop; - struct sigaction dummy = global_sigs[SIGSTOP]; - thissig = dummy; - -dosig: - /* Dispatch to the appropriate function. */ - sigproc_printf ("signal %d, about to call %p", si.si_signo, handler); - rc = setup_handler (si.si_signo, handler, thissig, tls); - -done: - if (continue_now) - SetEvent (sigCONT); - sigproc_printf ("returning %d", rc); - return rc; - -thread_specific: - tls->sig = si.si_signo; - tls->set_siginfo (this); - sigproc_printf ("releasing sigwait for thread"); - SetEvent (tls->event); - goto done; - -exit_sig: - if (si.si_signo == SIGQUIT || si.si_signo == SIGABRT) - { - CONTEXT c; - c.ContextFlags = CONTEXT_FULL; - GetThreadContext (hMainThread, &c); - tls->copy_context (&c); - si.si_signo |= 0x80; - } - sigproc_printf ("signal %d, about to call do_exit", si.si_signo); - tls->signal_exit (si.si_signo); /* never returns */ -} - -/* Cover function to `do_exit' to handle exiting even in presence of more - exceptions. We used to call exit, but a SIGSEGV shouldn't cause atexit - routines to run. */ -void -_cygtls::signal_exit (int rc) -{ - if (hExeced) - { - sigproc_printf ("terminating captive process"); - TerminateProcess (hExeced, sigExeced = rc); - } - - signal_debugger (rc & 0x7f); - if ((rc & 0x80) && !try_to_debug ()) - stackdump (thread_context.ebp, 1, 1); - - lock_process until_exit (true); - if (hExeced || exit_state) - myself.exit (rc); - - /* Starve other threads in a vain attempt to stop them from doing something - stupid. */ - SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL); - - user_data->resourcelocks->Delete (); - user_data->resourcelocks->Init (); - - sigproc_printf ("about to call do_exit (%x)", rc); - SetEvent (signal_arrived); - do_exit (rc); -} - -HANDLE NO_COPY tty_mutex = NULL; - -void -events_init () -{ - char *name; - char mutex_name[CYG_MAX_PATH]; - /* tty_mutex is on while searching for a tty slot. It's necessary - while finding console window handle */ - - if (!(tty_mutex = CreateMutex (&sec_all_nih, FALSE, - name = shared_name (mutex_name, - "tty_mutex", 0)))) - api_fatal ("can't create title mutex '%s', %E", name); - - ProtectHandle (tty_mutex); - mask_sync.init ("mask_sync"); - windows_system_directory[0] = '\0'; - GetSystemDirectory (windows_system_directory, sizeof (windows_system_directory) - 2); - char *end = strchr (windows_system_directory, '\0'); - if (end == windows_system_directory) - api_fatal ("can't find windows system directory"); - if (end[-1] != '\\') - { - *end++ = '\\'; - *end = '\0'; - } - windows_system_directory_length = end - windows_system_directory; - debug_printf ("windows_system_directory '%s', windows_system_directory_length %d", - windows_system_directory, windows_system_directory_length); -} - -void -events_terminate () -{ - exit_already = 1; -} - -int -_cygtls::call_signal_handler () -{ - int this_sa_flags = 0; - /* Call signal handler. */ - while (sig) - { - lock (); - this_sa_flags = sa_flags; - int thissig = sig; - - pop (); - reset_signal_arrived (); - sigset_t this_oldmask = set_process_mask_delta (); - int this_errno = saved_errno; - sig = 0; - unlock (); // make sure synchronized - incyg = 0; - if (!(this_sa_flags & SA_SIGINFO)) - { - void (*sigfunc) (int) = func; - sigfunc (thissig); - } - else - { - siginfo_t thissi = infodata; - void (*sigact) (int, siginfo_t *, void *) = (void (*) (int, siginfo_t *, void *)) func; - /* no ucontext_t information provided yet */ - sigact (thissig, &thissi, NULL); - } - incyg = 1; - set_signal_mask (this_oldmask, myself->getsigmask ()); - if (this_errno >= 0) - set_errno (this_errno); - } - - return this_sa_flags & SA_RESTART; -} - -extern "C" void __stdcall -reset_signal_arrived () -{ - // NEEDED? WaitForSingleObject (signal_arrived, 10); - ResetEvent (signal_arrived); - sigproc_printf ("reset signal_arrived"); - if (_my_tls.stackptr > _my_tls.stack) - debug_printf ("stackptr[-1] %p", _my_tls.stackptr[-1]); -} - -void -_cygtls::copy_context (CONTEXT *c) -{ - memcpy (&thread_context, c, (&thread_context._internal - (unsigned char *) &thread_context)); -} - -void -_cygtls::signal_debugger (int sig) -{ - if (being_debugged ()) - { - char sigmsg[2 * sizeof (_CYGWIN_SIGNAL_STRING " ffffffff ffffffff")]; - __small_sprintf (sigmsg, _CYGWIN_SIGNAL_STRING " %d %p %p", sig, thread_id, &thread_context); - OutputDebugString (sigmsg); - } -} diff --git a/winsup/cygwin/exec.cc b/winsup/cygwin/exec.cc deleted file mode 100644 index 1176307f6..000000000 --- a/winsup/cygwin/exec.cc +++ /dev/null @@ -1,99 +0,0 @@ -/* exec.cc: exec system call support. - - Copyright 1996, 1997, 1998, 2000, 2001, 2002 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#define _execve __FOO_execve_ -#include "winsup.h" -#include -#include -#include -#include "cygerrno.h" -#include "perprocess.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "pinfo.h" -#include "environ.h" -#undef _execve - -/* This is called _execve and not execve because the real execve is defined - in libc/posix/execve.c. It calls us. */ - -extern "C" int -execve (const char *path, char *const argv[], char *const envp[]) -{ - static char *const empty_env[] = { 0 }; - MALLOC_CHECK; - if (!envp) - envp = empty_env; - return spawnve (_P_OVERLAY, path, argv, envp); -} - -EXPORT_ALIAS (execve, _execve) - -extern "C" int -execl (const char *path, const char *arg0, ...) -{ - int i; - va_list args; - const char *argv[1024]; - - va_start (args, arg0); - argv[0] = arg0; - i = 1; - do - argv[i] = va_arg (args, const char *); - while (argv[i++] != NULL); - va_end (args); - MALLOC_CHECK; - return execve (path, (char * const *) argv, cur_environ ()); -} - -extern "C" int -execv (const char *path, char * const *argv) -{ - MALLOC_CHECK; - return execve (path, (char * const *) argv, cur_environ ()); -} - -extern "C" pid_t -sexecve_is_bad () -{ - set_errno (ENOSYS); - return 0; -} - -/* Copy string, until c or is encountered. - NUL-terminate the destination string (s1). - Return pointer to terminating byte in dst string. */ - -char * __stdcall -strccpy (char *s1, const char **s2, char c) -{ - while (**s2 && **s2 != c) - *s1++ = *((*s2)++); - *s1 = 0; - - MALLOC_CHECK; - return s1; -} - -extern "C" int -execvp (const char *path, char * const *argv) -{ - path_conv buf; - return execv (find_exec (path, buf), argv); -} - -extern "C" int -execvpe (const char *path, char * const *argv, char *const *envp) -{ - path_conv buf; - return execve (find_exec (path, buf), argv, envp); -} diff --git a/winsup/cygwin/external.cc b/winsup/cygwin/external.cc deleted file mode 100644 index 71b790c50..000000000 --- a/winsup/cygwin/external.cc +++ /dev/null @@ -1,355 +0,0 @@ -/* external.cc: Interface to Cygwin internals from external programs. - - Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - - Written by Christopher Faylor - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include "security.h" -#include "sigproc.h" -#include "pinfo.h" -#include -#include "shared_info.h" -#include "cygwin_version.h" -#include "perprocess.h" -#include "cygerrno.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "wincap.h" -#include "heap.h" -#include "pwdgrp.h" -#include "cygtls.h" -#include "child_info.h" -#include "environ.h" -#include -#include - -child_info *get_cygwin_startup_info (); - -static winpids pids; - -static external_pinfo * -fillout_pinfo (pid_t pid, int winpid) -{ - BOOL nextpid; - static external_pinfo ep; - - if ((nextpid = !!(pid & CW_NEXTPID))) - pid ^= CW_NEXTPID; - - - static unsigned int i; - if (!pids.npids || !nextpid) - { - pids.set (winpid); - i = 0; - } - - if (!pid) - i = 0; - - memset (&ep, 0, sizeof ep); - while (i < pids.npids) - { - DWORD thispid = pids.winpid (i); - _pinfo *p = pids[i]; - i++; - - if (!p) - { - if (!nextpid && thispid != (DWORD) pid) - continue; - ep.pid = cygwin_pid (thispid); - ep.dwProcessId = thispid; - ep.process_state = PID_IN_USE; - ep.ctty = -1; - break; - } - else if (nextpid || p->pid == pid || (winpid && thispid == (DWORD) pid)) - { - ep.ctty = p->ctty; - ep.pid = p->pid; - ep.ppid = p->ppid; - ep.dwProcessId = p->dwProcessId; - ep.uid = p->uid; - ep.gid = p->gid; - ep.pgid = p->pgid; - ep.sid = p->sid; - ep.umask = 0; - ep.start_time = p->start_time; - ep.rusage_self = p->rusage_self; - ep.rusage_children = p->rusage_children; - strcpy (ep.progname, p->progname); - ep.strace_mask = 0; - ep.version = EXTERNAL_PINFO_VERSION; - - ep.process_state = p->process_state; - - ep.uid32 = p->uid; - ep.gid32 = p->gid; - break; - } - } - - if (!ep.pid) - { - i = 0; - pids.reset (); - return 0; - } - return &ep; -} - -static DWORD -get_cygdrive_info (char *user, char *system, char *user_flags, - char *system_flags) -{ - int res = mount_table->get_cygdrive_info (user, system, user_flags, - system_flags); - return (res == ERROR_SUCCESS) ? 1 : 0; -} - -static DWORD -get_cygdrive_prefixes (char *user, char *system) -{ - char user_flags[CYG_MAX_PATH]; - char system_flags[CYG_MAX_PATH]; - DWORD res = get_cygdrive_info (user, system, user_flags, system_flags); - return res; -} - -static DWORD -check_ntsec (const char *filename) -{ - if (!filename) - return allow_ntsec; - path_conv pc (filename); - return allow_ntsec && pc.has_acls (); -} - -/* Copy cygwin environment variables to the Windows environment. */ -static void -sync_winenv () -{ - int unused_envc; - char *envblock = NULL; - char **envp = build_env (__cygwin_environ, envblock, unused_envc, false); - char *p = envblock; - - if (envp) - { - for (char **e = envp; *e; e++) - cfree (*e); - cfree (envp); - } - if (!p) - return; - while (*p) - { - char *eq = strchr (p, '='); - if (eq) - { - *eq = '\0'; - SetEnvironmentVariable (p, ++eq); - p = eq; - } - p = strchr (p, '\0') + 1; - } - free (envblock); -} - -extern "C" unsigned long -cygwin_internal (cygwin_getinfo_types t, ...) -{ - va_list arg; - va_start (arg, t); - - switch (t) - { - case CW_LOCK_PINFO: - return 1; - - case CW_UNLOCK_PINFO: - return 1; - - case CW_GETTHREADNAME: - return (DWORD) cygthread::name (va_arg (arg, DWORD)); - - case CW_SETTHREADNAME: - { - set_errno (ENOSYS); - return 0; - } - - case CW_GETPINFO: - return (DWORD) fillout_pinfo (va_arg (arg, DWORD), 0); - - case CW_GETVERSIONINFO: - return (DWORD) cygwin_version_strings; - - case CW_READ_V1_MOUNT_TABLES: - set_errno (ENOSYS); - return 1; - - case CW_USER_DATA: - return (DWORD) &__cygwin_user_data; - - case CW_PERFILE: - perfile_table = va_arg (arg, struct __cygwin_perfile *); - return 0; - - case CW_GET_CYGDRIVE_PREFIXES: - { - char *user = va_arg (arg, char *); - char *system = va_arg (arg, char *); - return get_cygdrive_prefixes (user, system); - } - - case CW_GETPINFO_FULL: - return (DWORD) fillout_pinfo (va_arg (arg, pid_t), 1); - - case CW_INIT_EXCEPTIONS: - /* noop */ /* init_exceptions (va_arg (arg, exception_list *)); */ - return 0; - - case CW_GET_CYGDRIVE_INFO: - { - char *user = va_arg (arg, char *); - char *system = va_arg (arg, char *); - char *user_flags = va_arg (arg, char *); - char *system_flags = va_arg (arg, char *); - return get_cygdrive_info (user, system, user_flags, system_flags); - } - - case CW_SET_CYGWIN_REGISTRY_NAME: - case CW_GET_CYGWIN_REGISTRY_NAME: - return 0; - - case CW_STRACE_TOGGLE: - { - pid_t pid = va_arg (arg, pid_t); - pinfo p (pid); - if (p) - { - sig_send (p, __SIGSTRACE); - return 0; - } - else - { - set_errno (ESRCH); - return (DWORD) -1; - } - } - - case CW_STRACE_ACTIVE: - { - return strace.active (); - } - - case CW_CYGWIN_PID_TO_WINPID: - { - pinfo p (va_arg (arg, pid_t)); - return p ? p->dwProcessId : 0; - } - case CW_EXTRACT_DOMAIN_AND_USER: - { - struct passwd *pw = va_arg (arg, struct passwd *); - char *domain = va_arg (arg, char *); - char *user = va_arg (arg, char *); - extract_nt_dom_user (pw, domain, user); - return 0; - } - case CW_CMDLINE: - { - size_t n; - pid_t pid = va_arg (arg, pid_t); - pinfo p (pid); - return (DWORD) p->cmdline (n); - } - case CW_CHECK_NTSEC: - { - char *filename = va_arg (arg, char *); - return check_ntsec (filename); - } - case CW_GET_ERRNO_FROM_WINERROR: - { - int error = va_arg (arg, int); - int deferrno = va_arg (arg, int); - return geterrno_from_win_error (error, deferrno); - } - case CW_GET_POSIX_SECURITY_ATTRIBUTE: - { - security_descriptor sd; - int attribute = va_arg (arg, int); - PSECURITY_ATTRIBUTES psa = va_arg (arg, PSECURITY_ATTRIBUTES); - void *sd_buf = va_arg (arg, void *); - DWORD sd_buf_size = va_arg (arg, DWORD); - set_security_attribute (attribute, psa, sd); - if (!psa->lpSecurityDescriptor || sd.size () > sd_buf_size) - return sd.size (); - memcpy (sd_buf, sd, sd.size ()); - psa->lpSecurityDescriptor = sd_buf; - return 0; - } - case CW_GET_SHMLBA: - { - return getpagesize (); - } - case CW_GET_UID_FROM_SID: - { - cygpsid psid = va_arg (arg, PSID); - return psid.get_id (false, NULL); - } - case CW_GET_GID_FROM_SID: - { - cygpsid psid = va_arg (arg, PSID); - return psid.get_id (true, NULL); - } - case CW_GET_BINMODE: - { - const char *path = va_arg (arg, const char *); - path_conv p (path, PC_SYM_FOLLOW | PC_NULLEMPTY); - if (p.error) - { - set_errno (p.error); - return (unsigned long) -1; - } - return p.binmode (); - } - case CW_HOOK: - { - const char *name = va_arg (arg, const char *); - const void *hookfn = va_arg (arg, const void *); - WORD subsys; - return (unsigned long) hook_or_detect_cygwin (name, hookfn, subsys); - } - case CW_ARGV: - { - child_info_spawn *ci = (child_info_spawn *) get_cygwin_startup_info (); - return (unsigned long) (ci ? ci->moreinfo->argv : NULL); - } - case CW_ENVP: - { - child_info_spawn *ci = (child_info_spawn *) get_cygwin_startup_info (); - return (unsigned long) (ci ? ci->moreinfo->envp : NULL); - } - case CW_DEBUG_SELF: - error_start_init (va_arg (arg, const char *)); - try_to_debug (); - break; - case CW_SYNC_WINENV: - sync_winenv (); - return 0; - default: - break; - } - return (unsigned long) -1; -} diff --git a/winsup/cygwin/external.sgml b/winsup/cygwin/external.sgml deleted file mode 100644 index bbfdd0fb8..000000000 --- a/winsup/cygwin/external.sgml +++ /dev/null @@ -1,18 +0,0 @@ - - -cygwin_internal - - -extern "C" DWORD -cygwin_internal -cygwin_getinfo_types t -... - - -This function gives you access to various internal data and functions. -It takes two arguments. The first argument is a type from the 'cygwin_getinfo_types' -enum. The second is an optional pointer. -Stay away unless you know what you're doing. - - - diff --git a/winsup/cygwin/fcntl.cc b/winsup/cygwin/fcntl.cc deleted file mode 100644 index b1f0d9972..000000000 --- a/winsup/cygwin/fcntl.cc +++ /dev/null @@ -1,85 +0,0 @@ -/* fcntl.cc: fcntl syscall - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "thread.h" - -int -fcntl_worker (int fd, int cmd, void *arg) -{ - int res; - - cygheap_fdget cfd (fd, true); - if (cfd < 0) - { - res = -1; - goto done; - } - if (cmd != F_DUPFD) - res = cfd->fcntl (cmd, arg); - else - res = dup2 (fd, cygheap_fdnew (((int) arg) - 1)); -done: - syscall_printf ("%d = fcntl (%d, %d, %p)", res, fd, cmd, arg); - return res; -} - -extern "C" int -fcntl64 (int fd, int cmd, ...) -{ - void *arg = NULL; - va_list args; - - va_start (args, cmd); - arg = va_arg (args, void *); - va_end (args); - return fcntl_worker (fd, cmd, arg); -} - -extern "C" int -_fcntl (int fd, int cmd, ...) -{ - void *arg = NULL; - va_list args; - struct __flock32 *src = NULL; - struct __flock64 dst; - - va_start (args, cmd); - arg = va_arg (args, void *); - va_end (args); - if (cmd == F_GETLK || cmd == F_SETLK || cmd == F_SETLKW) - { - src = (struct __flock32 *) arg; - dst.l_type = src->l_type; - dst.l_whence = src->l_whence; - dst.l_start = src->l_start; - dst.l_len = src->l_len; - dst.l_pid = src->l_pid; - arg = &dst; - } - int res = fcntl_worker (fd, cmd, arg); - if (cmd == F_GETLK) - { - src->l_type = dst.l_type; - src->l_whence = dst.l_whence; - src->l_start = dst.l_start; - src->l_len = dst.l_len; - src->l_pid = (short) dst.l_pid; - } - return res; -} diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc deleted file mode 100644 index 237aaadd7..000000000 --- a/winsup/cygwin/fhandler.cc +++ /dev/null @@ -1,1673 +0,0 @@ -/* fhandler.cc. See console.cc for fhandler_console functions. - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "perprocess.h" -#include "security.h" -#include "cygwin/version.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "shared_info.h" -#include "pinfo.h" -#include -#include -#include -#include -#include "ntdll.h" - -static NO_COPY const int CHUNK_SIZE = 1024; /* Used for crlf conversions */ - -struct __cygwin_perfile *perfile_table; - -DWORD binmode; - -inline fhandler_base& -fhandler_base::operator =(fhandler_base& x) -{ - memcpy (this, &x, sizeof *this); - pc.set_normalized_path (x.pc.normalized_path, false); - rabuf = NULL; - ralen = 0; - raixget = 0; - raixput = 0; - rabuflen = 0; - return *this; -} - -int -fhandler_base::puts_readahead (const char *s, size_t len) -{ - int success = 1; - while ((len == (size_t) -1 ? *s : len--) - && (success = put_readahead (*s++) > 0)) - continue; - return success; -} - -int -fhandler_base::put_readahead (char value) -{ - char *newrabuf; - if (raixput < rabuflen) - /* Nothing to do */; - else if ((newrabuf = (char *) realloc (rabuf, rabuflen += 32))) - rabuf = newrabuf; - else - return 0; - - rabuf[raixput++] = value; - ralen++; - return 1; -} - -int -fhandler_base::get_readahead () -{ - int chret = -1; - if (raixget < ralen) - chret = ((unsigned char) rabuf[raixget++]) & 0xff; - /* FIXME - not thread safe */ - if (raixget >= ralen) - raixget = raixput = ralen = 0; - return chret; -} - -int -fhandler_base::peek_readahead (int queryput) -{ - int chret = -1; - if (!queryput && raixget < ralen) - chret = ((unsigned char) rabuf[raixget]) & 0xff; - else if (queryput && raixput > 0) - chret = ((unsigned char) rabuf[raixput - 1]) & 0xff; - return chret; -} - -void -fhandler_base::set_readahead_valid (int val, int ch) -{ - if (!val) - ralen = raixget = raixput = 0; - if (ch != -1) - put_readahead (ch); -} - -int -fhandler_base::eat_readahead (int n) -{ - int oralen = ralen; - if (n < 0) - n = ralen; - if (n > 0 && ralen) - { - if ((int) (ralen -= n) < 0) - ralen = 0; - - if (raixget >= ralen) - raixget = raixput = ralen = 0; - else if (raixput > ralen) - raixput = ralen; - } - - return oralen; -} - -int -fhandler_base::get_readahead_into_buffer (char *buf, size_t buflen) -{ - int ch; - int copied_chars = 0; - - while (buflen) - if ((ch = get_readahead ()) < 0) - break; - else - { - buf[copied_chars++] = (unsigned char)(ch & 0xff); - buflen--; - } - - return copied_chars; -} - -/* Record the file name. and name hash */ -void -fhandler_base::set_name (path_conv &in_pc) -{ - memcpy (&pc, &in_pc, in_pc.size ()); - pc.set_normalized_path (in_pc.normalized_path, false); -} - -char *fhandler_base::get_proc_fd_name (char *buf) -{ - if (get_name ()) - return strcpy (buf, get_name ()); - if (dev ().name) - return strcpy (buf, dev ().name); - return strcpy (buf, ""); -} - -/* Detect if we are sitting at EOF for conditions where Windows - returns an error but UNIX doesn't. */ -static int __stdcall -is_at_eof (HANDLE h, DWORD err) -{ - DWORD size, upper1, curr; - - size = GetFileSize (h, &upper1); - if (size != INVALID_FILE_SIZE || GetLastError () == NO_ERROR) - { - LONG upper2 = 0; - curr = SetFilePointer (h, 0, &upper2, FILE_CURRENT); - if (curr == size && upper1 == (DWORD) upper2) - return 1; - } - - SetLastError (err); - return 0; -} - -void -fhandler_base::set_flags (int flags, int supplied_bin) -{ - int bin; - int fmode; - debug_printf ("flags %p, supplied_bin %p", flags, supplied_bin); - if ((bin = flags & (O_BINARY | O_TEXT))) - debug_printf ("O_TEXT/O_BINARY set in flags %p", bin); - else if (rbinset () && wbinset ()) - bin = rbinary () ? O_BINARY : O_TEXT; // FIXME: Not quite right - else if ((fmode = get_default_fmode (flags)) & O_BINARY) - bin = O_BINARY; - else if (fmode & O_TEXT) - bin = O_TEXT; - else if (supplied_bin) - bin = supplied_bin; - else - bin = wbinary () || rbinary () || (binmode != O_TEXT) - ? O_BINARY : O_TEXT; - - openflags = flags | bin; - - bin &= O_BINARY; - rbinary (bin ? true : false); - wbinary (bin ? true : false); - syscall_printf ("filemode set to %s", bin ? "binary" : "text"); -} - -/* Normal file i/o handlers. */ - -/* Cover function to ReadFile to achieve (as much as possible) Posix style - semantics and use of errno. */ -void -fhandler_base::raw_read (void *ptr, size_t& ulen) -{ -#define bytes_read ulen - - HANDLE h = NULL; /* grumble */ - int prio = 0; /* ditto */ - DWORD len = ulen; - - ulen = (size_t) -1; - if (read_state) - { - h = GetCurrentThread (); - prio = GetThreadPriority (h); - SetThreadPriority (h, THREAD_PRIORITY_TIME_CRITICAL); - signal_read_state (1); - } - BOOL res = ReadFile (get_handle (), ptr, len, (DWORD *) &ulen, 0); - if (read_state) - { - signal_read_state (1); - SetThreadPriority (h, prio); - } - if (!res) - { - /* Some errors are not really errors. Detect such cases here. */ - - DWORD errcode = GetLastError (); - switch (errcode) - { - case ERROR_BROKEN_PIPE: - /* This is really EOF. */ - bytes_read = 0; - break; - case ERROR_MORE_DATA: - /* `bytes_read' is supposedly valid. */ - break; - case ERROR_NOACCESS: - if (is_at_eof (get_handle (), errcode)) - { - bytes_read = 0; - break; - } - case ERROR_INVALID_FUNCTION: - case ERROR_INVALID_PARAMETER: - case ERROR_INVALID_HANDLE: - if (openflags & O_DIROPEN) - { - set_errno (EISDIR); - bytes_read = (size_t) -1; - break; - } - default: - syscall_printf ("ReadFile %s(%p) failed, %E", get_name (), get_handle ()); - __seterrno_from_win_error (errcode); - bytes_read = (size_t) -1; - break; - } - } -#undef bytes_read -} - -/* Cover function to WriteFile to provide Posix interface and semantics - (as much as possible). */ -int -fhandler_base::raw_write (const void *ptr, size_t len) -{ - DWORD bytes_written; - - if (!WriteFile (get_output_handle (), ptr, len, &bytes_written, 0)) - { - if (GetLastError () == ERROR_DISK_FULL && bytes_written > 0) - goto written; - __seterrno (); - if (get_errno () == EPIPE) - raise (SIGPIPE); - return -1; - } -written: - return bytes_written; -} - -int -fhandler_base::get_default_fmode (int flags) -{ - int fmode = __fmode; - if (perfile_table) - { - size_t nlen = strlen (get_name ()); - unsigned accflags = (flags & O_ACCMODE); - for (__cygwin_perfile *pf = perfile_table; pf->name; pf++) - if (!*pf->name && (pf->flags & O_ACCMODE) == accflags) - { - fmode = pf->flags & ~O_ACCMODE; - break; - } - else - { - size_t pflen = strlen (pf->name); - const char *stem = get_name () + nlen - pflen; - if (pflen > nlen || (stem != get_name () && !isdirsep (stem[-1]))) - continue; - else if ((pf->flags & O_ACCMODE) == accflags - && strcasematch (stem, pf->name)) - { - fmode = pf->flags & ~O_ACCMODE; - break; - } - } - } - return fmode; -} - -bool -fhandler_base::device_access_denied (int flags) -{ - int mode = 0; - - if (flags & O_RDWR) - mode |= R_OK | W_OK; - if (flags & (O_WRONLY | O_APPEND)) - mode |= W_OK; - if (!mode) - mode |= R_OK; - - return fhaccess (mode); -} - -int -fhandler_base::fhaccess (int flags) -{ - int res = -1; - if (error ()) - { - set_errno (error ()); - goto done; - } - - if (!exists ()) - { - set_errno (ENOENT); - goto done; - } - - if (!(flags & (R_OK | W_OK | X_OK))) - return 0; - - if (is_fs_special ()) - /* short circuit */; - else if (has_attribute (FILE_ATTRIBUTE_READONLY) && (flags & W_OK)) - goto eaccess_done; - else if (has_acls () && allow_ntsec) - { - res = check_file_access (get_win32_name (), flags); - goto done; - } - - struct __stat64 st; - if (fstat (&st)) - goto done; - - if (flags & R_OK) - { - if (st.st_uid == myself->uid) - { - if (!(st.st_mode & S_IRUSR)) - goto eaccess_done; - } - else if (st.st_gid == myself->gid) - { - if (!(st.st_mode & S_IRGRP)) - goto eaccess_done; - } - else if (!(st.st_mode & S_IROTH)) - goto eaccess_done; - } - - if (flags & W_OK) - { - if (st.st_uid == myself->uid) - { - if (!(st.st_mode & S_IWUSR)) - goto eaccess_done; - } - else if (st.st_gid == myself->gid) - { - if (!(st.st_mode & S_IWGRP)) - goto eaccess_done; - } - else if (!(st.st_mode & S_IWOTH)) - goto eaccess_done; - } - - if (flags & X_OK) - { - if (st.st_uid == myself->uid) - { - if (!(st.st_mode & S_IXUSR)) - goto eaccess_done; - } - else if (st.st_gid == myself->gid) - { - if (!(st.st_mode & S_IXGRP)) - goto eaccess_done; - } - else if (!(st.st_mode & S_IXOTH)) - goto eaccess_done; - } - - res = 0; - goto done; - -eaccess_done: - set_errno (EACCES); -done: - debug_printf ("returning %d", res); - return res; -} - -/* Open system call handler function. */ -int -fhandler_base::open_9x (int flags, mode_t mode) -{ - int res = 0; - HANDLE x; - int file_attributes; - int shared; - int creation_distribution; - SECURITY_ATTRIBUTES sa = sec_none; - - syscall_printf ("(%s, %p)", get_win32_name (), flags); - - switch (query_open ()) - { - case query_read_control: - case query_stat_control: - access = GENERIC_READ; - break; - case query_write_control: - case query_write_attributes: - access = GENERIC_READ | FILE_WRITE_ATTRIBUTES; - break; - default: - if ((flags & O_ACCMODE) == O_RDONLY) - access = GENERIC_READ; - else if ((flags & O_ACCMODE) == O_WRONLY) - access = GENERIC_WRITE; - else - access = GENERIC_READ | GENERIC_WRITE; - break; - } - - if ((flags & O_TRUNC) && ((flags & O_ACCMODE) != O_RDONLY)) - { - if (flags & O_CREAT) - creation_distribution = CREATE_ALWAYS; - else - creation_distribution = TRUNCATE_EXISTING; - } - else if (flags & O_CREAT) - creation_distribution = OPEN_ALWAYS; - else - creation_distribution = OPEN_EXISTING; - - if ((flags & O_EXCL) && (flags & O_CREAT)) - creation_distribution = CREATE_NEW; - - if (flags & O_APPEND) - append_mode (true); - - /* These flags are host dependent. */ - shared = wincap.shared (); - - file_attributes = FILE_ATTRIBUTE_NORMAL; - if (flags & O_DIROPEN) - file_attributes |= FILE_FLAG_BACKUP_SEMANTICS; - if (flags & O_SYNC) - file_attributes |= FILE_FLAG_WRITE_THROUGH; - if (flags & O_DIRECT) - file_attributes |= FILE_FLAG_NO_BUFFERING; - if (get_major () == DEV_SERIAL_MAJOR) - file_attributes |= FILE_FLAG_OVERLAPPED; - -#ifdef HIDDEN_DOT_FILES - if (flags & O_CREAT && get_device () == FH_FS) - { - char *c = strrchr (get_win32_name (), '\\'); - if ((c && c[1] == '.') || *get_win32_name () == '.') - file_attributes |= FILE_ATTRIBUTE_HIDDEN; - } -#endif - - if (flags & O_CREAT && get_device () == FH_FS) - { - /* If mode has no write bits set, we set the R/O attribute. */ - if (!(mode & (S_IWUSR | S_IWGRP | S_IWOTH))) - file_attributes |= FILE_ATTRIBUTE_READONLY; - /* The file attributes are needed for later use in, e.g. fchmod. */ - pc.file_attributes (file_attributes & FILE_ATTRIBUTE_VALID_SET_FLAGS); - } - - x = CreateFile (get_win32_name (), access, shared, &sa, creation_distribution, - file_attributes, 0); - - if (x == INVALID_HANDLE_VALUE) - { - if (pc.isdir ()) - { - if ((flags & O_ACCMODE) != O_RDONLY) - set_errno (EISDIR); - else - nohandle (true); - } - else if (GetLastError () == ERROR_INVALID_HANDLE) - set_errno (ENOENT); - else - __seterrno (); - if (!nohandle ()) - goto done; - } - - set_io_handle (x); - set_flags (flags, pc.binmode ()); - - res = 1; - set_open_status (); -done: - debug_printf ("%p = CreateFile (%s, %p, %p, %p, %p, %p, 0)", - x, get_win32_name (), access, shared, &sa, - creation_distribution, file_attributes); - - syscall_printf ("%d = fhandler_base::open (%s, %p)", res, get_win32_name (), - flags); - return res; -} - -/* Open system call handler function. */ -int -fhandler_base::open (int flags, mode_t mode) -{ - if (!wincap.is_winnt ()) - return fhandler_base::open_9x (flags, mode); - - WCHAR wpath[CYG_MAX_PATH + 10]; - UNICODE_STRING upath = {0, sizeof (wpath), wpath}; - pc.get_nt_native_path (upath); - - if (RtlIsDosDeviceName_U (upath.Buffer)) - return fhandler_base::open_9x (flags, mode); - - int res = 0; - HANDLE x; - ULONG file_attributes = 0; - ULONG shared = (get_major () == DEV_TAPE_MAJOR ? 0 : wincap.shared ()); - ULONG create_disposition; - ULONG create_options; - SECURITY_ATTRIBUTES sa = sec_none; - security_descriptor sd; - OBJECT_ATTRIBUTES attr; - IO_STATUS_BLOCK io; - NTSTATUS status; - - syscall_printf ("(%s, %p)", get_win32_name (), flags); - - InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE | OBJ_INHERIT, - NULL, sa.lpSecurityDescriptor); - - switch (query_open ()) - { - case query_read_control: - access = READ_CONTROL | FILE_READ_ATTRIBUTES; - create_options = FILE_OPEN_FOR_BACKUP_INTENT; - break; - case query_stat_control: - access = READ_CONTROL | FILE_READ_ATTRIBUTES | FILE_READ_DATA; - create_options = FILE_OPEN_FOR_BACKUP_INTENT; - break; - case query_write_control: - access = READ_CONTROL | WRITE_OWNER | WRITE_DAC | FILE_WRITE_ATTRIBUTES; - create_options = FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_FOR_RECOVERY; - break; - case query_write_attributes: - access = READ_CONTROL | FILE_WRITE_ATTRIBUTES; - create_options = FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_FOR_RECOVERY; - break; - default: - create_options = 0; - if ((flags & O_ACCMODE) == O_RDONLY) - access = GENERIC_READ; - else if ((flags & O_ACCMODE) == O_WRONLY) - access = GENERIC_WRITE | FILE_READ_ATTRIBUTES; - else - access = GENERIC_READ | GENERIC_WRITE; - if (flags & O_SYNC) - create_options |= FILE_WRITE_THROUGH; - if (flags & O_DIRECT) - create_options |= FILE_NO_INTERMEDIATE_BUFFERING; - if (get_major () != DEV_SERIAL_MAJOR && get_major () != DEV_TAPE_MAJOR) - { - create_options |= FILE_SYNCHRONOUS_IO_NONALERT; - access |= SYNCHRONIZE; - } - break; - } - - if ((flags & O_TRUNC) && ((flags & O_ACCMODE) != O_RDONLY)) - { - if (flags & O_CREAT) - create_disposition = FILE_OVERWRITE_IF; - else - create_disposition = FILE_OVERWRITE; - } - else if (flags & O_CREAT) - create_disposition = FILE_OPEN_IF; - else - create_disposition = FILE_OPEN; - - if ((flags & O_EXCL) && (flags & O_CREAT)) - create_disposition = FILE_CREATE; - - if (flags & O_APPEND) - append_mode (true); - - if (flags & O_CREAT && get_device () == FH_FS) - { - file_attributes = FILE_ATTRIBUTE_NORMAL; - /* If mode has no write bits set, we set the R/O attribute. */ - if (!(mode & (S_IWUSR | S_IWGRP | S_IWOTH))) - file_attributes |= FILE_ATTRIBUTE_READONLY; -#ifdef HIDDEN_DOT_FILES - char *c = strrchr (get_win32_name (), '\\'); - if ((c && c[1] == '.') || *get_win32_name () == '.') - file_attributes |= FILE_ATTRIBUTE_HIDDEN; -#endif - /* If the file should actually be created and ntsec is on, - set files attributes. */ - if (allow_ntsec && has_acls ()) - { - set_security_attribute (mode, &sa, sd); - attr.SecurityDescriptor = sa.lpSecurityDescriptor; - } - /* The file attributes are needed for later use in, e.g. fchmod. */ - pc.file_attributes (file_attributes); - } - - status = NtCreateFile (&x, access, &attr, &io, NULL, file_attributes, shared, - create_disposition, create_options, NULL, 0); - if (!NT_SUCCESS (status)) - { - __seterrno_from_nt_status (status); - if (!nohandle ()) - goto done; - } - - set_io_handle (x); - set_flags (flags, pc.binmode ()); - - res = 1; - set_open_status (); -done: - debug_printf ("%x = NtCreateFile " - "(%p, %x, %s, io, NULL, %x, %x, %x, %x, NULL, 0)", - status, x, access, get_win32_name (), file_attributes, shared, - create_disposition, create_options); - - syscall_printf ("%d = fhandler_base::open (%s, %p)", res, get_win32_name (), - flags); - return res; -} - -/* states: - open buffer in binary mode? Just do the read. - - open buffer in text mode? Scan buffer for control zs and handle - the first one found. Then scan buffer, converting every \r\n into - an \n. If last char is an \r, look ahead one more char, if \n then - modify \r, if not, remember char. -*/ -void -fhandler_base::read (void *in_ptr, size_t& len) -{ - char *ptr = (char *) in_ptr; - ssize_t copied_chars = 0; - int c; - - while (len) - if ((c = get_readahead ()) < 0) - break; - else - { - ptr[copied_chars++] = (unsigned char) (c & 0xff); - len--; - } - - if (copied_chars && is_slow ()) - { - len = (size_t) copied_chars; - goto out; - } - - if (!len) - { - len = (size_t) copied_chars; - goto out; - } - - raw_read (ptr + copied_chars, len); - if (!copied_chars) - /* nothing */; - else if ((ssize_t) len > 0) - len += copied_chars; - else - len = copied_chars; - - if (rbinary () || len <= 0) - goto out; - - /* Scan buffer and turn \r\n into \n */ - char *src, *dst, *end; - src = (char *) ptr; - dst = (char *) ptr; - end = src + len - 1; - - /* Read up to the last but one char - the last char needs special handling */ - while (src < end) - { - if (*src == '\r' && src[1] == '\n') - src++; - *dst++ = *src++; - } - - /* If not beyond end and last char is a '\r' then read one more - to see if we should translate this one too */ - if (src > end) - /* nothing */; - else if (*src != '\r') - *dst++ = *src; - else - { - char c1; - size_t c1len = 1; - raw_read (&c1, c1len); - if (c1len <= 0) - /* nothing */; - else if (c1 == '\n') - *dst++ = '\n'; - else - { - set_readahead_valid (1, c1); - *dst++ = *src; - } - } - - len = dst - (char *) ptr; - -#ifndef NOSTRACE - if (strace.active ()) - { - char buf[16 * 6 + 1]; - char *p = buf; - - for (int i = 0; i < copied_chars && i < 16; ++i) - { - unsigned char c = ((unsigned char *) ptr)[i]; - __small_sprintf (p, " %c", c); - p += strlen (p); - } - *p = '\0'; - debug_printf ("read %d bytes (%s%s)", copied_chars, buf, - copied_chars > 16 ? " ..." : ""); - } -#endif - -out: - debug_printf ("returning %d, %s mode", len, rbinary () ? "binary" : "text"); -} - -int -fhandler_base::write (const void *ptr, size_t len) -{ - int res; - - if (append_mode ()) - SetFilePointer (get_output_handle (), 0, 0, FILE_END); - else if (did_lseek ()) - { - _off64_t actual_length, current_position; - DWORD size_high = 0; - LONG pos_high = 0; - - did_lseek (false); /* don't do it again */ - - actual_length = GetFileSize (get_output_handle (), &size_high); - actual_length += ((_off64_t) size_high) << 32; - - current_position = SetFilePointer (get_output_handle (), 0, &pos_high, - FILE_CURRENT); - current_position += ((_off64_t) pos_high) << 32; - - if (current_position > actual_length) - { - if ((get_fs_flags (FILE_SUPPORTS_SPARSE_FILES)) - && current_position >= actual_length + (128 * 1024)) - { - /* If the file systemn supports sparse files and the application - is writing after a long seek beyond EOF, convert the file to - a sparse file. */ - DWORD dw; - HANDLE h = get_output_handle (); - BOOL r = DeviceIoControl (h, FSCTL_SET_SPARSE, NULL, 0, NULL, - 0, &dw, NULL); - syscall_printf ("%d = DeviceIoControl(%p, FSCTL_SET_SPARSE)", - r, h); - } - else if (wincap.has_lseek_bug ()) - { - /* Oops, this is the bug case - Win95 uses whatever is on the - disk instead of some known (safe) value, so we must seek - back and fill in the gap with zeros. - DJ - Note: this bug doesn't happen on NT4, even though the - documentation for WriteFile() says that it *may* happen - on any OS. */ - /* Check there is enough space */ - if (!SetEndOfFile (get_output_handle ())) - { - __seterrno (); - return -1; - } - char zeros[512]; - int number_of_zeros_to_write = current_position - actual_length; - memset (zeros, 0, 512); - SetFilePointer (get_output_handle (), actual_length, NULL, - FILE_BEGIN); - while (number_of_zeros_to_write > 0) - { - DWORD zeros_this_time = (number_of_zeros_to_write > 512 - ? 512 : number_of_zeros_to_write); - DWORD written; - DWORD ret = WriteFile (get_output_handle (), zeros, - zeros_this_time, &written, NULL); - if (!ret || written < zeros_this_time) - { - if (!ret) - { - __seterrno (); - if (get_errno () == EPIPE) - raise (SIGPIPE); - } - else - set_errno (ENOSPC); - /* This might fail, but it's the best we can hope for */ - SetFilePointer (get_output_handle (), current_position, - NULL, FILE_BEGIN); - return -1; - - } - number_of_zeros_to_write -= written; - } - } - } - } - - if (wbinary ()) - { - debug_printf ("binary write"); - res = raw_write (ptr, len); - } - else - { - debug_printf ("text write"); - /* This is the Microsoft/DJGPP way. Still not ideal, but it's - compatible. - Modified slightly by CGF 2000-10-07 */ - - int left_in_data = len; - char *data = (char *)ptr; - res = 0; - - while (left_in_data > 0) - { - char buf[CHUNK_SIZE + 1], *buf_ptr = buf; - int left_in_buf = CHUNK_SIZE; - - while (left_in_buf > 0 && left_in_data > 0) - { - char ch = *data++; - if (ch == '\n') - { - *buf_ptr++ = '\r'; - left_in_buf--; - } - *buf_ptr++ = ch; - left_in_buf--; - left_in_data--; - if (left_in_data > 0 && ch == '\r' && *data == '\n') - { - *buf_ptr++ = *data++; - left_in_buf--; - left_in_data--; - } - } - - /* We've got a buffer-full, or we're out of data. Write it out */ - int nbytes; - int want = buf_ptr - buf; - if ((nbytes = raw_write (buf, want)) == want) - { - /* Keep track of how much written not counting additional \r's */ - res = data - (char *)ptr; - continue; - } - - if (nbytes == -1) - res = -1; /* Error */ - else - res += nbytes; /* Partial write. Return total bytes written. */ - break; /* All done */ - } - } - - return res; -} - -ssize_t -fhandler_base::readv (const struct iovec *const iov, const int iovcnt, - ssize_t tot) -{ - assert (iov); - assert (iovcnt >= 1); - - size_t len = tot; - if (iovcnt == 1) - { - len = iov->iov_len; - read (iov->iov_base, len); - return len; - } - - if (tot == -1) // i.e. if not pre-calculated by the caller. - { - len = 0; - const struct iovec *iovptr = iov + iovcnt; - do - { - iovptr -= 1; - len += iovptr->iov_len; - } - while (iovptr != iov); - } - - assert (tot >= 0); - - if (!len) - return 0; - - char *buf = (char *) malloc (len); - - if (!buf) - { - set_errno (ENOMEM); - return -1; - } - - read (buf, len); - ssize_t nbytes = (ssize_t) len; - - const struct iovec *iovptr = iov; - - char *p = buf; - while (nbytes > 0) - { - const int frag = min (nbytes, (ssize_t) iovptr->iov_len); - memcpy (iovptr->iov_base, p, frag); - p += frag; - iovptr += 1; - nbytes -= frag; - } - - free (buf); - return len; -} - -ssize_t -fhandler_base::writev (const struct iovec *const iov, const int iovcnt, - ssize_t tot) -{ - assert (iov); - assert (iovcnt >= 1); - - if (iovcnt == 1) - return write (iov->iov_base, iov->iov_len); - - if (tot == -1) // i.e. if not pre-calculated by the caller. - { - tot = 0; - const struct iovec *iovptr = iov + iovcnt; - do - { - iovptr -= 1; - tot += iovptr->iov_len; - } - while (iovptr != iov); - } - - assert (tot >= 0); - - if (tot == 0) - return 0; - - char *const buf = (char *) malloc (tot); - - if (!buf) - { - set_errno (ENOMEM); - return -1; - } - - char *bufptr = buf; - const struct iovec *iovptr = iov; - int nbytes = tot; - - while (nbytes != 0) - { - const int frag = min (nbytes, (ssize_t) iovptr->iov_len); - memcpy (bufptr, iovptr->iov_base, frag); - bufptr += frag; - iovptr += 1; - nbytes -= frag; - } - ssize_t ret = write (buf, tot); - free (buf); - return ret; -} - -_off64_t -fhandler_base::lseek (_off64_t offset, int whence) -{ - _off64_t res; - - /* 9x/Me doesn't support 64bit offsets. We trap that here and return - EINVAL. It doesn't make sense to simulate bigger offsets by a - SetFilePointer sequence since FAT and FAT32 don't support file - size >= 4GB anyway. */ - if (!wincap.has_64bit_file_access () - && (offset < LONG_MIN || offset > LONG_MAX)) - { - debug_printf ("Win9x, offset not 32 bit."); - set_errno (EINVAL); - return (_off64_t)-1; - } - - /* Seeks on text files is tough, we rewind and read till we get to the - right place. */ - - if (whence != SEEK_CUR || offset != 0) - { - if (whence == SEEK_CUR) - offset -= ralen - raixget; - set_readahead_valid (0); - } - - debug_printf ("lseek (%s, %D, %d)", get_name (), offset, whence); - - DWORD win32_whence = whence == SEEK_SET ? FILE_BEGIN - : (whence == SEEK_CUR ? FILE_CURRENT : FILE_END); - - LONG off_low = ((__uint64_t) offset) & UINT32_MAX; - LONG *poff_high, off_high; - if (!wincap.has_64bit_file_access ()) - poff_high = NULL; - else - { - off_high = ((__uint64_t) offset) >> 32LL; - poff_high = &off_high; - } - - debug_printf ("setting file pointer to %u (high), %u (low)", off_high, off_low); - res = SetFilePointer (get_handle (), off_low, poff_high, win32_whence); - if (res == INVALID_SET_FILE_POINTER && GetLastError ()) - { - __seterrno (); - res = -1; - } - else - { - if (poff_high) - res += (_off64_t) *poff_high << 32; - - /* When next we write(), we will check to see if *this* seek went beyond - the end of the file, and back-seek and fill with zeros if so - DJ */ - did_lseek (true); - - /* If this was a SEEK_CUR with offset 0, we still might have - readahead that we have to take into account when calculating - the actual position for the application. */ - if (whence == SEEK_CUR) - res -= ralen - raixget; - } - - return res; -} - -ssize_t __stdcall -fhandler_base::pread (void *, size_t, _off64_t) -{ - set_errno (ESPIPE); - return -1; -} - -ssize_t __stdcall -fhandler_base::pwrite (void *, size_t, _off64_t) -{ - set_errno (ESPIPE); - return -1; -} - -int -fhandler_base::close () -{ - int res = -1; - - syscall_printf ("closing '%s' handle %p", get_name (), get_handle ()); - if (nohandle () || CloseHandle (get_handle ())) - res = 0; - else - { - paranoid_printf ("CloseHandle (%d <%s>) failed", get_handle (), - get_name ()); - - __seterrno (); - } - return res; -} - -int -fhandler_base::ioctl (unsigned int cmd, void *buf) -{ - int res; - - switch (cmd) - { - case FIONBIO: - set_nonblocking (*(int *) buf); - res = 0; - break; - default: - set_errno (EINVAL); - res = -1; - break; - } - - syscall_printf ("%d = ioctl (%x, %p)", res, cmd, buf); - return res; -} - -int -fhandler_base::lock (int, struct __flock64 *) -{ - set_errno (EINVAL); - return -1; -} - -extern "C" char * __stdcall -rootdir (const char *full_path, char *root_path) -{ - /* Possible choices: - * d:... -> d:/ - * \\server\share... -> \\server\share\ - */ - int len; - char *rootp = root_path; - - if (full_path[1] == ':') - { - *rootp++ = *full_path++; - *rootp++ = ':'; - } - else if (full_path[0] == '\\' && full_path[1] == '\\') - { - const char *cp = strchr (full_path + 2, '\\'); - if (!cp) - return NULL; - while (*++cp && *cp != '\\') - ; - memcpy (root_path, full_path, (len = cp - full_path)); - rootp = root_path + len; - } - else - return NULL; - - *rootp++ = '\\'; - *rootp = '\0'; - return root_path; -} - -int __stdcall -fhandler_base::fstat (struct __stat64 *buf) -{ - debug_printf ("here"); - - if (is_fs_special ()) - return fstat_fs (buf); - - switch (get_device ()) - { - case FH_PIPE: - buf->st_mode = S_IFIFO | STD_RBITS | STD_WBITS | S_IWGRP | S_IWOTH; - break; - case FH_PIPEW: - buf->st_mode = S_IFIFO | STD_WBITS | S_IWGRP | S_IWOTH; - break; - case FH_PIPER: - buf->st_mode = S_IFIFO | STD_RBITS; - break; - case FH_FULL: - buf->st_mode = S_IFCHR | S_IRUSR | S_IWUSR | S_IWGRP | S_IWOTH; - break; - default: - buf->st_mode = S_IFCHR | STD_RBITS | STD_WBITS | S_IWGRP | S_IWOTH; - break; - } - - buf->st_uid = geteuid32 (); - buf->st_gid = getegid32 (); - buf->st_nlink = 1; - buf->st_blksize = S_BLKSIZE; - time_as_timestruc_t (&buf->st_ctim); - buf->st_atim = buf->st_mtim = buf->st_ctim; - return 0; -} - -void -fhandler_base::init (HANDLE f, DWORD a, mode_t bin) -{ - set_io_handle (f); - access = a; - a &= GENERIC_READ | GENERIC_WRITE; - int flags = 0; - if (a == GENERIC_READ) - flags = O_RDONLY; - else if (a == GENERIC_WRITE) - flags = O_WRONLY; - else if (a == (GENERIC_READ | GENERIC_WRITE)) - flags = O_RDWR; - set_flags (flags | bin); - set_open_status (); - debug_printf ("created new fhandler_base for handle %p, bin %d", f, rbinary ()); -} - -int -fhandler_base::dup (fhandler_base *child) -{ - debug_printf ("in fhandler_base dup"); - - HANDLE nh; - if (!nohandle ()) - { - if (!DuplicateHandle (hMainProc, get_handle (), hMainProc, &nh, 0, TRUE, - DUPLICATE_SAME_ACCESS)) - { - debug_printf ("dup(%s) failed, handle %x, %E", - get_name (), get_handle ()); - __seterrno (); - return -1; - } - - VerifyHandle (nh); - child->set_io_handle (nh); - } - set_flags (child->get_flags ()); - return 0; -} - -int fhandler_base::fcntl (int cmd, void *arg) -{ - int res; - - switch (cmd) - { - case F_GETFD: - res = close_on_exec () ? FD_CLOEXEC : 0; - break; - case F_SETFD: - set_close_on_exec (((int) arg & FD_CLOEXEC) ? 1 : 0); - res = 0; - break; - case F_GETFL: - res = get_flags (); - debug_printf ("GETFL: %d", res); - break; - case F_SETFL: - { - /* - * Only O_APPEND, O_ASYNC and O_NONBLOCK/O_NDELAY are allowed. - * Each other flag will be ignored. - * Since O_ASYNC isn't defined in fcntl.h it's currently - * ignored as well. - */ - const int allowed_flags = O_APPEND | O_NONBLOCK_MASK; - int new_flags = (int) arg & allowed_flags; - /* Carefully test for the O_NONBLOCK or deprecated OLD_O_NDELAY flag. - Set only the flag that has been passed in. If both are set, just - record O_NONBLOCK. */ - if ((new_flags & OLD_O_NDELAY) && (new_flags & O_NONBLOCK)) - new_flags &= ~OLD_O_NDELAY; - set_flags ((get_flags () & ~allowed_flags) | new_flags); - } - res = 0; - break; - case F_GETLK: - case F_SETLK: - case F_SETLKW: - res = lock (cmd, (struct __flock64 *) arg); - break; - default: - set_errno (EINVAL); - res = -1; - break; - } - return res; -} - -/* Base terminal handlers. These just return errors. */ - -int -fhandler_base::tcflush (int) -{ - set_errno (ENOTTY); - return -1; -} - -int -fhandler_base::tcsendbreak (int) -{ - set_errno (ENOTTY); - return -1; -} - -int -fhandler_base::tcdrain () -{ - set_errno (ENOTTY); - return -1; -} - -int -fhandler_base::tcflow (int) -{ - set_errno (ENOTTY); - return -1; -} - -int -fhandler_base::tcsetattr (int, const struct termios *) -{ - set_errno (ENOTTY); - return -1; -} - -int -fhandler_base::tcgetattr (struct termios *) -{ - set_errno (ENOTTY); - return -1; -} - -int -fhandler_base::tcsetpgrp (const pid_t) -{ - set_errno (ENOTTY); - return -1; -} - -int -fhandler_base::tcgetpgrp () -{ - set_errno (ENOTTY); - return -1; -} - -void -fhandler_base::operator delete (void *p) -{ - cfree (p); -} - -/* Normal I/O constructor */ -fhandler_base::fhandler_base () : - status (), - open_status (), - access (0), - io_handle (NULL), - namehash (0), - openflags (0), - rabuf (NULL), - ralen (0), - raixget (0), - raixput (0), - rabuflen (0), - fs_flags (0), - read_state (NULL), - archetype (NULL), - usecount (0) -{ -} - -/* Normal I/O destructor */ -fhandler_base::~fhandler_base () -{ - if (rabuf) - free (rabuf); -} - -/**********************************************************************/ -/* /dev/null */ - -fhandler_dev_null::fhandler_dev_null () : - fhandler_base () -{ -} - -int -fhandler_dev_null::open (int flags, mode_t mode) -{ - char posix[strlen (get_name ()) + 1]; - strcpy (posix, get_name ()); - pc.set_name ("NUL", posix); - return fhandler_base::open_9x (flags, mode); -} - -void -fhandler_base::set_no_inheritance (HANDLE &h, int not_inheriting) -{ - HANDLE oh = h; - /* Note that we could use SetHandleInformation here but it is not available - on all platforms. Test cases seem to indicate that using DuplicateHandle - in this fashion does not actually close the original handle, which is - what we want. If this changes in the future, we may be forced to use - SetHandleInformation on newer OS's */ - if (!DuplicateHandle (hMainProc, oh, hMainProc, &h, 0, !not_inheriting, - DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE)) - debug_printf ("DuplicateHandle failed, %E"); - if (oh != h) - VerifyHandle (h); -#ifdef DEBUGGING_AND_FDS_PROTECTED - if (h) - setclexec (oh, h, not_inheriting); -#endif -} - -void -fhandler_base::fork_fixup (HANDLE parent, HANDLE &h, const char *name) -{ - HANDLE oh = h; - if (/* !is_socket () && */ !close_on_exec ()) - debug_printf ("handle %p already opened", h); - else if (!DuplicateHandle (parent, h, hMainProc, &h, 0, !close_on_exec (), - DUPLICATE_SAME_ACCESS)) - system_printf ("%s - %E, handle %s<%p>", get_name (), name, h); - else if (oh != h) - VerifyHandle (h); -} - -void -fhandler_base::set_close_on_exec (bool val) -{ - if (!nohandle ()) - set_no_inheritance (io_handle, val); - close_on_exec (val); - debug_printf ("set close_on_exec for %s to %d", get_name (), val); -} - -void -fhandler_base::fixup_after_fork (HANDLE parent) -{ - debug_printf ("inheriting '%s' from parent", get_name ()); - if (!nohandle ()) - fork_fixup (parent, io_handle, "io_handle"); -} - -bool -fhandler_base::is_nonblocking () -{ - return (openflags & O_NONBLOCK_MASK) != 0; -} - -void -fhandler_base::set_nonblocking (int yes) -{ - int current = openflags & O_NONBLOCK_MASK; - int new_flags = yes ? (!current ? O_NONBLOCK : current) : 0; - openflags = (openflags & ~O_NONBLOCK_MASK) | new_flags; -} - -int -fhandler_base::mkdir (mode_t) -{ - if (exists ()) - set_errno (EEXIST); - else - set_errno (EROFS); - return -1; -} - -int -fhandler_base::rmdir () -{ - if (!exists ()) - set_errno (ENOENT); - else if (!pc.isdir ()) - set_errno (ENOTDIR); - else - set_errno (EROFS); - return -1; -} - -DIR * -fhandler_base::opendir () -{ - set_errno (ENOTDIR); - return NULL; -} - -int -fhandler_base::readdir (DIR *, dirent *) -{ - return ENOTDIR; -} - -_off64_t -fhandler_base::telldir (DIR *) -{ - set_errno (ENOTDIR); - return -1; -} - -void -fhandler_base::seekdir (DIR *, _off64_t) -{ - set_errno (ENOTDIR); -} - -void -fhandler_base::rewinddir (DIR *) -{ - set_errno (ENOTDIR); -} - -int -fhandler_base::closedir (DIR *) -{ - set_errno (ENOTDIR); - return -1; -} - -int -fhandler_base::fchmod (mode_t mode) -{ - extern int chmod_device (path_conv& pc, mode_t mode); - if (pc.is_fs_special ()) - return chmod_device (pc, mode); - /* By default, just succeeds. */ - return 0; -} - -int -fhandler_base::fchown (__uid32_t uid, __gid32_t gid) -{ - if (pc.is_fs_special ()) - return ((fhandler_disk_file *) this)->fhandler_disk_file::fchown (uid, gid); - /* By default, just succeeds. */ - return 0; -} - -int -fhandler_base::facl (int cmd, int nentries, __aclent32_t *aclbufp) -{ - int res = -1; - switch (cmd) - { - case SETACL: - /* By default, just succeeds. */ - res = 0; - break; - case GETACL: - if (!aclbufp) - set_errno(EFAULT); - else if (nentries < MIN_ACL_ENTRIES) - set_errno (ENOSPC); - else - { - aclbufp[0].a_type = USER_OBJ; - aclbufp[0].a_id = myself->uid; - aclbufp[0].a_perm = (S_IRUSR | S_IWUSR) >> 6; - aclbufp[1].a_type = GROUP_OBJ; - aclbufp[1].a_id = myself->gid; - aclbufp[1].a_perm = (S_IRGRP | S_IWGRP) >> 3; - aclbufp[2].a_type = OTHER_OBJ; - aclbufp[2].a_id = ILLEGAL_GID; - aclbufp[2].a_perm = S_IROTH | S_IWOTH; - aclbufp[3].a_type = CLASS_OBJ; - aclbufp[3].a_id = ILLEGAL_GID; - aclbufp[3].a_perm = S_IRWXU | S_IRWXG | S_IRWXO; - res = MIN_ACL_ENTRIES; - } - break; - case GETACLCNT: - res = MIN_ACL_ENTRIES; - break; - default: - set_errno (EINVAL); - break; - } - return res; -} - -int -fhandler_base::ftruncate (_off64_t length) -{ - set_errno (EINVAL); - return -1; -} - -int -fhandler_base::link (const char *newpath) -{ - set_errno (EINVAL); - return -1; -} - -int -fhandler_base::utimes (const struct timeval *tvp) -{ - if (is_fs_special ()) - return utimes_fs (tvp); - - set_errno (EINVAL); - return -1; -} - -int -fhandler_base::fsync () -{ - if (!get_handle () || nohandle ()) - { - set_errno (EINVAL); - return -1; - } - if (pc.isdir ()) /* Just succeed. */ - return 0; - if (FlushFileBuffers (get_handle ())) - return 0; - __seterrno (); - return -1; -} diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h deleted file mode 100644 index bd068a88d..000000000 --- a/winsup/cygwin/fhandler.h +++ /dev/null @@ -1,1374 +0,0 @@ -/* fhandler.h - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _FHANDLER_H_ -#define _FHANDLER_H_ - -/* fcntl flags used only internaly. */ -#define O_NOSYMLINK 0x080000 -#define O_DIROPEN 0x100000 - -/* newlib used to define O_NDELAY differently from O_NONBLOCK. Now it - properly defines both to be the same. Unfortunately, we have to - behave properly the old version, too, to accommodate older executables. */ -#define OLD_O_NDELAY (CYGWIN_VERSION_CHECK_FOR_OLD_O_NONBLOCK ? 4 : 0) - -/* Care for the old O_NDELAY flag. If one of the flags is set, - both flags are set. */ -#define O_NONBLOCK_MASK (O_NONBLOCK | OLD_O_NDELAY) - -extern const char *windows_device_names[]; -extern struct __cygwin_perfile *perfile_table; -#define __fmode (*(user_data->fmode_ptr)) -extern const char proc[]; -extern const int proc_len; - -class select_record; -class fhandler_disk_file; -typedef struct __DIR DIR; -struct dirent; -struct iovec; -struct __acl32; - -enum dirent_states -{ - dirent_ok = 0x0000, - dirent_saw_dot = 0x0001, - dirent_saw_dot_dot = 0x0002, - dirent_saw_eof = 0x0004, - dirent_isroot = 0x0008, - dirent_set_d_ino = 0x0010, - dirent_get_d_ino = 0x0020 -}; - -enum conn_state -{ - unconnected = 0, - connect_pending = 1, - connected = 2, - connect_failed = 3 -}; - -enum line_edit_status -{ - line_edit_ok = 0, - line_edit_input_done = 1, - line_edit_signalled = 2, - line_edit_error = 3, - line_edit_pipe_full = 4 -}; - -enum bg_check_types -{ - bg_error = -1, - bg_eof = 0, - bg_ok = 1, - bg_signalled = 2 -}; - -enum query_state { - no_query = 0, - query_read_control = 1, - query_stat_control = 2, - query_write_control = 3, - query_write_attributes = 4 -}; - -class fhandler_base -{ - friend class dtable; - friend void close_all_files (bool); - - struct status_flags - { - unsigned rbinary : 1; /* binary read mode */ - unsigned rbinset : 1; /* binary read mode explicitly set */ - unsigned wbinary : 1; /* binary write mode */ - unsigned wbinset : 1; /* binary write mode explicitly set */ - unsigned nohandle : 1; /* No handle associated with fhandler. */ - unsigned uninterruptible_io : 1; /* Set if I/O should be uninterruptible. */ - unsigned append_mode : 1; /* always append */ - unsigned did_lseek : 1; /* set when lseek is called as a flag that - _write should check if we've moved - beyond EOF, zero filling or making - file sparse if so. */ - unsigned query_open : 3; /* open file without requesting either - read or write access */ - unsigned close_on_exec : 1; /* close-on-exec */ - unsigned need_fork_fixup : 1; /* Set if need to fixup after fork. */ - unsigned has_changed : 1; /* Flag used to set ctime on close. */ - - public: - status_flags () : - rbinary (0), rbinset (0), wbinary (0), wbinset (0), nohandle (0), - uninterruptible_io (0), append_mode (0), did_lseek (0), - query_open (no_query), close_on_exec (0), need_fork_fixup (0), - has_changed (0) - {} - } status, open_status; - - private: - int access; - HANDLE io_handle; - - __ino64_t namehash; /* hashed filename, used as inode num */ - - protected: - /* File open flags from open () and fcntl () calls */ - int openflags; - - char *rabuf; /* used for crlf conversion in text files */ - size_t ralen; - size_t raixget; - size_t raixput; - size_t rabuflen; - - DWORD fs_flags; - HANDLE read_state; - path_conv pc; - - public: - class fhandler_base *archetype; - int usecount; - - void set_name (path_conv &pc); - int error () const {return pc.error;} - void set_error (int error) {pc.error = error;} - bool exists () const {return pc.exists ();} - int pc_binmode () const {return pc.binmode ();} - device& dev () {return pc.dev;} - operator DWORD& () {return (DWORD&) pc;} - virtual size_t size () const {return sizeof (*this);} - - virtual fhandler_base& operator =(fhandler_base &x); - fhandler_base (); - virtual ~fhandler_base (); - - /* Non-virtual simple accessor functions. */ - void set_io_handle (HANDLE x) { io_handle = x; } - - DWORD& get_device () { return dev ().devn; } - DWORD get_major () { return dev ().major; } - DWORD get_minor () { return dev ().minor; } - virtual int get_unit () { return dev ().minor; } - - int get_access () const { return access; } - void set_access (int x) { access = x; } - - int get_flags () { return openflags; } - void set_flags (int x, int supplied_bin = 0); - - bool is_nonblocking (); - void set_nonblocking (int yes); - - bool wbinary () const { return status.wbinset ? status.wbinary : 1; } - bool rbinary () const { return status.rbinset ? status.rbinary : 1; } - - void wbinary (bool b) {status.wbinary = b; status.wbinset = 1;} - void rbinary (bool b) {status.rbinary = b; status.rbinset = 1;} - - void set_open_status () {open_status = status;} - void reset_to_open_binmode () - { - set_flags ((get_flags () & ~(O_TEXT | O_BINARY)) - | ((open_status.wbinary || open_status.rbinary) - ? O_BINARY : O_TEXT)); - } - - IMPLEMENT_STATUS_FLAG (bool, wbinset) - IMPLEMENT_STATUS_FLAG (bool, rbinset) - IMPLEMENT_STATUS_FLAG (bool, nohandle) - IMPLEMENT_STATUS_FLAG (bool, uninterruptible_io) - IMPLEMENT_STATUS_FLAG (bool, append_mode) - IMPLEMENT_STATUS_FLAG (bool, did_lseek) - IMPLEMENT_STATUS_FLAG (query_state, query_open) - IMPLEMENT_STATUS_FLAG (bool, close_on_exec) - IMPLEMENT_STATUS_FLAG (bool, need_fork_fixup) - IMPLEMENT_STATUS_FLAG (bool, has_changed) - - int get_default_fmode (int flags); - - virtual void set_close_on_exec (bool val); - - LPSECURITY_ATTRIBUTES get_inheritance (bool all = 0) - { - if (all) - return close_on_exec () ? &sec_all_nih : &sec_all; - else - return close_on_exec () ? &sec_none_nih : &sec_none; - } - - virtual void fixup_before_fork_exec (DWORD) {} - virtual void fixup_after_fork (HANDLE); - virtual void fixup_after_exec () {} - void create_read_state (LONG n) - { - read_state = CreateSemaphore (&sec_none_nih, 0, n, NULL); - } - - void signal_read_state (LONG n) - { - ReleaseSemaphore (read_state, n, NULL); - } - - void set_fs_flags (DWORD flags) { fs_flags = flags; } - bool get_fs_flags (DWORD flagval = UINT32_MAX) - { return (fs_flags & (flagval)); } - - bool get_readahead_valid () { return raixget < ralen; } - int puts_readahead (const char *s, size_t len = (size_t) -1); - int put_readahead (char value); - - int get_readahead (); - int peek_readahead (int queryput = 0); - - int eat_readahead (int n); - - void set_readahead_valid (int val, int ch = -1); - - int get_readahead_into_buffer (char *buf, size_t buflen); - - bool has_acls () const { return pc.has_acls (); } - - bool isremote () { return pc.isremote (); } - - bool has_attribute (DWORD x) const {return pc.has_attribute (x);} - const char *get_name () const { return pc.normalized_path; } - const char *get_win32_name () { return pc.get_win32 (); } - __ino64_t get_namehash () { return namehash ?: namehash = hash_path_name (0, get_win32_name ()); } - /* Returns name used for /proc//fd in buf. */ - virtual char *get_proc_fd_name (char *buf); - - virtual void hclose (HANDLE h) {CloseHandle (h);} - virtual void set_no_inheritance (HANDLE &h, int not_inheriting); - - /* fixup fd possibly non-inherited handles after fork */ - void fork_fixup (HANDLE parent, HANDLE &h, const char *name); - virtual bool need_fixup_before () const {return false;} - - int open_9x (int flags, mode_t mode = 0); - virtual int open (int flags, mode_t mode = 0); - int open_fs (int flags, mode_t mode = 0); - virtual int close (); - int close_fs (); - virtual int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2))); - int __stdcall fstat_fs (struct __stat64 *buf) __attribute__ ((regparm (2))); - int __stdcall fstat_helper (struct __stat64 *buf, - FILETIME ftChangeTime, - FILETIME ftLastAccessTime, - FILETIME ftLastWriteTime, - DWORD dwVolumeSerialNumber, - DWORD nFileSizeHigh, - DWORD nFileSizeLow, - LONGLONG nAllocSize, - DWORD nFileIndexHigh, - DWORD nFileIndexLow, - DWORD nNumberOfLinks, - DWORD dwFileAttributes) - __attribute__ ((regparm (3))); - int __stdcall fstat_by_handle (struct __stat64 *buf) __attribute__ ((regparm (2))); - int __stdcall fstat_by_name (struct __stat64 *buf) __attribute__ ((regparm (2))); - int fhandler_base::utimes_fs (const struct timeval *) __attribute__ ((regparm (2))); - virtual int __stdcall fchmod (mode_t mode) __attribute__ ((regparm (1))); - virtual int __stdcall fchown (__uid32_t uid, __gid32_t gid) __attribute__ ((regparm (2))); - virtual int __stdcall facl (int, int, __acl32 *) __attribute__ ((regparm (3))); - virtual int __stdcall ftruncate (_off64_t) __attribute__ ((regparm (2))); - virtual int __stdcall link (const char *) __attribute__ ((regparm (2))); - virtual int __stdcall utimes (const struct timeval *) __attribute__ ((regparm (2))); - virtual int __stdcall fsync () __attribute__ ((regparm (1))); - virtual int ioctl (unsigned int cmd, void *); - virtual int fcntl (int cmd, void *); - virtual char const *ttyname () { return get_name (); } - virtual void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3))); - virtual int write (const void *ptr, size_t len); - virtual ssize_t readv (const struct iovec *, int iovcnt, ssize_t tot = -1); - virtual ssize_t writev (const struct iovec *, int iovcnt, ssize_t tot = -1); - virtual ssize_t __stdcall pread (void *, size_t, _off64_t) __attribute__ ((regparm (3))); - virtual ssize_t __stdcall pwrite (void *, size_t, _off64_t) __attribute__ ((regparm (3))); - virtual _off64_t lseek (_off64_t offset, int whence); - virtual int lock (int, struct __flock64 *); - virtual int dup (fhandler_base *child); - - virtual HANDLE mmap (caddr_t *addr, size_t len, int prot, - int flags, _off64_t off); - virtual int munmap (HANDLE h, caddr_t addr, size_t len); - virtual int msync (HANDLE h, caddr_t addr, size_t len, int flags); - virtual bool fixup_mmap_after_fork (HANDLE h, int prot, int flags, - _off64_t offset, DWORD size, - void *address); - - void *operator new (size_t, void *p) __attribute__ ((nothrow)) {return p;} - - virtual void init (HANDLE, DWORD, mode_t); - - virtual int tcflush (int); - virtual int tcsendbreak (int); - virtual int tcdrain (); - virtual int tcflow (int); - virtual int tcsetattr (int a, const struct termios *t); - virtual int tcgetattr (struct termios *t); - virtual int tcsetpgrp (const pid_t pid); - virtual int tcgetpgrp (); - virtual int is_tty () { return 0; } - virtual bool isdevice () { return true; } - virtual bool isfifo () { return false; } - virtual char *ptsname () { return NULL;} - virtual class fhandler_socket *is_socket () { return NULL; } - virtual class fhandler_console *is_console () { return 0; } - virtual int is_windows () {return 0; } - - virtual void raw_read (void *ptr, size_t& ulen); - virtual int raw_write (const void *ptr, size_t ulen); - - /* Virtual accessor functions to hide the fact - that some fd's have two handles. */ - virtual HANDLE& get_handle () { return io_handle; } - virtual HANDLE& get_io_handle () { return io_handle; } - virtual HANDLE& get_output_handle () { return io_handle; } - virtual bool hit_eof () {return false;} - virtual select_record *select_read (select_record *s); - virtual select_record *select_write (select_record *s); - virtual select_record *select_except (select_record *s); - virtual int ready_for_read (int fd, DWORD howlong); - virtual const char *get_native_name () - { - return dev ().native; - } - virtual bg_check_types bg_check (int) {return bg_ok;} - void clear_readahead () - { - raixput = raixget = ralen = rabuflen = 0; - rabuf = NULL; - } - void operator delete (void *); - virtual HANDLE get_guard () const {return NULL;} - virtual void set_eof () {} - virtual int mkdir (mode_t mode); - virtual int rmdir (); - virtual DIR *opendir (); - virtual int readdir (DIR *, dirent *) __attribute__ ((regparm (3))); - virtual _off64_t telldir (DIR *); - virtual void seekdir (DIR *, _off64_t); - virtual void rewinddir (DIR *); - virtual int closedir (DIR *); - virtual bool is_slow () {return 0;} - bool is_auto_device () {return isdevice () && !dev ().isfs ();} - bool is_fs_special () {return pc.is_fs_special ();} - bool issymlink () {return pc.issymlink ();} - bool device_access_denied (int) __attribute__ ((regparm (2))); - int fhaccess (int flags) __attribute__ ((regparm (2))); - friend class fhandler_fifo; -}; - -class fhandler_mailslot : public fhandler_base -{ - public: - fhandler_mailslot (); - int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2))); - int open (int flags, mode_t mode = 0); - int write (const void *ptr, size_t len); - int ioctl (unsigned int cmd, void *); - select_record *select_read (select_record *s); -}; - -class fhandler_socket: public fhandler_base -{ - private: - int addr_family; - int type; - int connect_secret[4]; - - pid_t sec_pid; - __uid32_t sec_uid; - __gid32_t sec_gid; - pid_t sec_peer_pid; - __uid32_t sec_peer_uid; - __gid32_t sec_peer_gid; - void af_local_set_secret (char *); - void af_local_setblocking (bool &, bool &); - void af_local_unsetblocking (bool, bool); - void af_local_set_cred (); - void af_local_copy (fhandler_socket *); - bool af_local_recv_secret (); - bool af_local_send_secret (); - bool af_local_recv_cred (); - bool af_local_send_cred (); - int af_local_accept (); - public: - int af_local_connect (); - void af_local_set_sockpair_cred (); - - private: - struct _WSAPROTOCOL_INFOA *prot_info_ptr; - char *sun_path; - struct status_flags - { - unsigned async_io : 1; /* async I/O */ - unsigned saw_shutdown_read : 1; /* Socket saw a SHUT_RD */ - unsigned saw_shutdown_write : 1; /* Socket saw a SHUT_WR */ - unsigned saw_reuseaddr : 1; /* Socket saw SO_REUSEADDR call */ - unsigned closed : 1; - unsigned owner : 1; - unsigned connect_state : 2; - public: - status_flags () : - async_io (0), saw_shutdown_read (0), saw_shutdown_write (0), - closed (0), owner (0), connect_state (unconnected) - {} - } status; - - bool prepare (HANDLE &event, long event_mask); - int wait (HANDLE event, int flags, DWORD timeout = 10); - void release (HANDLE event); - - public: - fhandler_socket (); - ~fhandler_socket (); - int get_socket () { return (int) get_handle(); } - fhandler_socket *is_socket () { return this; } - - IMPLEMENT_STATUS_FLAG (bool, async_io) - IMPLEMENT_STATUS_FLAG (bool, saw_shutdown_read) - IMPLEMENT_STATUS_FLAG (bool, saw_shutdown_write) - IMPLEMENT_STATUS_FLAG (bool, saw_reuseaddr) - IMPLEMENT_STATUS_FLAG (bool, closed) - IMPLEMENT_STATUS_FLAG (bool, owner) - IMPLEMENT_STATUS_FLAG (conn_state, connect_state) - - int bind (const struct sockaddr *name, int namelen); - int connect (const struct sockaddr *name, int namelen); - int listen (int backlog); - int accept (struct sockaddr *peer, int *len); - int getsockname (struct sockaddr *name, int *namelen); - int getpeername (struct sockaddr *name, int *namelen); - int getpeereid (pid_t *pid, __uid32_t *euid, __gid32_t *egid); - - int open (int flags, mode_t mode = 0); - ssize_t readv (const struct iovec *, int iovcnt, ssize_t tot = -1); - int recvfrom (void *ptr, size_t len, int flags, - struct sockaddr *from, int *fromlen); - int recvmsg (struct msghdr *msg, int flags, ssize_t tot = -1); - - ssize_t writev (const struct iovec *, int iovcnt, ssize_t tot = -1); - int sendto (const void *ptr, size_t len, int flags, - const struct sockaddr *to, int tolen); - int sendmsg (const struct msghdr *msg, int flags, ssize_t tot = -1); - - int ioctl (unsigned int cmd, void *); - int fcntl (int cmd, void *); - _off64_t lseek (_off64_t, int) { return 0; } - int shutdown (int how); - int close (); - void hclose (HANDLE) {close ();} - int dup (fhandler_base *child); - - void set_close_on_exec (bool val); - virtual void fixup_before_fork_exec (DWORD); - void fixup_after_fork (HANDLE); - void fixup_after_exec (); - bool need_fixup_before () const {return true;} - char *get_proc_fd_name (char *buf); - - select_record *select_read (select_record *s); - select_record *select_write (select_record *s); - select_record *select_except (select_record *s); - void set_addr_family (int af) {addr_family = af;} - int get_addr_family () {return addr_family;} - void set_socket_type (int st) { type = st;} - int get_socket_type () {return type;} - void set_sun_path (const char *path); - char *get_sun_path () {return sun_path;} - - int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2))); - int __stdcall fchmod (mode_t mode) __attribute__ ((regparm (1))); - int __stdcall fchown (__uid32_t uid, __gid32_t gid) __attribute__ ((regparm (2))); - int __stdcall facl (int, int, __acl32 *) __attribute__ ((regparm (3))); - int __stdcall link (const char *) __attribute__ ((regparm (2))); - bool is_slow () {return 1;} -}; - -class fhandler_pipe: public fhandler_base -{ -protected: - HANDLE guard; - bool broken_pipe; - HANDLE writepipe_exists; - DWORD orig_pid; - unsigned id; -public: - fhandler_pipe (); - _off64_t lseek (_off64_t offset, int whence); - select_record *select_read (select_record *s); - select_record *select_write (select_record *s); - select_record *select_except (select_record *s); - char *get_proc_fd_name (char *buf); - void set_close_on_exec (bool val); - void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3))); - int open (int flags, mode_t mode = 0); - int close (); - void create_guard (SECURITY_ATTRIBUTES *sa) {guard = CreateMutex (sa, FALSE, NULL);} - int dup (fhandler_base *child); - int ioctl (unsigned int cmd, void *); - void fixup_in_child (); - virtual void fixup_after_fork (HANDLE); - void fixup_after_exec (); - bool hit_eof (); - void set_eof () {broken_pipe = true;} - HANDLE get_guard () const {return guard;} - int ready_for_read (int fd, DWORD howlong); - static int create (fhandler_pipe *[2], unsigned, int, bool = false); - bool is_slow () {return true;} - static int create_selectable (LPSECURITY_ATTRIBUTES, HANDLE&, HANDLE&, DWORD, bool); - friend class fhandler_fifo; -}; - -class fhandler_fifo: public fhandler_pipe -{ - HANDLE output_handle; - long read_use; - long write_use; - virtual HANDLE& get_io_handle () { return io_handle ?: output_handle; } -public: - fhandler_fifo (); - int open (int flags, mode_t mode = 0); - int open_not_mine (int flags) __attribute__ ((regparm (2))); - int close (); - void set_use (int flags) __attribute__ ((regparm (2))); - bool isfifo () { return true; } - HANDLE& get_output_handle () { return output_handle; } - void set_output_handle (HANDLE h) { output_handle = h; } - void set_use (); - int dup (fhandler_base *child); - bool is_slow () {return 1;} - void close_one_end (); -}; - -class fhandler_dev_raw: public fhandler_base -{ - protected: - char *devbuf; - size_t devbufsiz; - size_t devbufstart; - size_t devbufend; - struct status_flags - { - unsigned lastblk_to_read : 1; - public: - status_flags () : lastblk_to_read (0) {} - } status; - - IMPLEMENT_STATUS_FLAG (bool, lastblk_to_read) - - fhandler_dev_raw (); - - public: - ~fhandler_dev_raw (); - - int open (int flags, mode_t mode = 0); - - int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2))); - - int dup (fhandler_base *child); - int ioctl (unsigned int cmd, void *buf); - - void fixup_after_fork (HANDLE); - void fixup_after_exec (); -}; - -class fhandler_dev_floppy: public fhandler_dev_raw -{ - private: - _off64_t drive_size; - unsigned long bytes_per_sector; - struct status_flags - { - unsigned eom_detected : 1; - public: - status_flags () : eom_detected (0) {} - } status; - - IMPLEMENT_STATUS_FLAG (bool, eom_detected) - - inline _off64_t get_current_position (); - int fhandler_dev_floppy::get_drive_info (struct hd_geometry *geo); - - BOOL write_file (const void *buf, DWORD to_write, DWORD *written, int *err); - BOOL read_file (void *buf, DWORD to_read, DWORD *read, int *err); - - public: - fhandler_dev_floppy (); - - int open (int flags, mode_t mode = 0); - int dup (fhandler_base *child); - void raw_read (void *ptr, size_t& ulen); - int raw_write (const void *ptr, size_t ulen); - _off64_t lseek (_off64_t offset, int whence); - int ioctl (unsigned int cmd, void *buf); -}; - -class fhandler_dev_tape: public fhandler_dev_raw -{ - HANDLE mt_mtx; - HANDLE mt_evt; - - bool is_rewind_device () { return get_minor () < 128; } - unsigned int driveno () { return (unsigned int) get_minor () & 0x7f; } - void drive_init (); - - inline bool _lock (); - inline int unlock (int ret = 0); - - public: - fhandler_dev_tape (); - - virtual int open (int flags, mode_t mode = 0); - virtual int close (); - - void raw_read (void *ptr, size_t& ulen); - int raw_write (const void *ptr, size_t ulen); - - virtual _off64_t lseek (_off64_t offset, int whence); - - virtual int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2))); - - virtual int dup (fhandler_base *child); - virtual void fixup_after_fork (HANDLE parent); - virtual void set_close_on_exec (bool val); - virtual int ioctl (unsigned int cmd, void *buf); -}; - -/* Standard disk file */ - -class fhandler_disk_file: public fhandler_base -{ - void touch_ctime (); - int readdir_helper (DIR *, dirent *, DWORD, DWORD, char *) __attribute__ ((regparm (3))); - int readdir_9x (DIR *, dirent *) __attribute__ ((regparm (3))); - - public: - fhandler_disk_file (); - fhandler_disk_file (path_conv &pc); - - int open (int flags, mode_t mode); - int close (); - int lock (int, struct __flock64 *); - bool isdevice () { return false; } - int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2))); - int __stdcall fchmod (mode_t mode) __attribute__ ((regparm (1))); - int __stdcall fchown (__uid32_t uid, __gid32_t gid) __attribute__ ((regparm (2))); - int __stdcall facl (int, int, __acl32 *) __attribute__ ((regparm (3))); - int __stdcall ftruncate (_off64_t) __attribute__ ((regparm (2))); - int __stdcall link (const char *) __attribute__ ((regparm (2))); - int __stdcall utimes (const struct timeval *) __attribute__ ((regparm (2))); - - HANDLE mmap (caddr_t *addr, size_t len, int prot, int flags, _off64_t off); - int munmap (HANDLE h, caddr_t addr, size_t len); - int msync (HANDLE h, caddr_t addr, size_t len, int flags); - bool fixup_mmap_after_fork (HANDLE h, int prot, int flags, - _off64_t offset, DWORD size, void *address); - int mkdir (mode_t mode); - int rmdir (); - DIR *opendir (); - int readdir (DIR *, dirent *) __attribute__ ((regparm (3))); - _off64_t telldir (DIR *); - void seekdir (DIR *, _off64_t); - void rewinddir (DIR *); - int closedir (DIR *); - - ssize_t __stdcall pread (void *, size_t, _off64_t) __attribute__ ((regparm (3))); - ssize_t __stdcall pwrite (void *, size_t, _off64_t) __attribute__ ((regparm (3))); -}; - -class fhandler_cygdrive: public fhandler_disk_file -{ - int ndrives; - const char *pdrive; - void set_drives (); - public: - fhandler_cygdrive (); - int open (int flags, mode_t mode); - int close (); - DIR *opendir (); - int readdir (DIR *, dirent *) __attribute__ ((regparm (3))); - void rewinddir (DIR *); - int closedir (DIR *); - int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2))); -}; - -class fhandler_serial: public fhandler_base -{ - private: - size_t vmin_; /* from termios */ - unsigned int vtime_; /* from termios */ - pid_t pgrp_; - int rts; /* for Windows 9x purposes only */ - int dtr; /* for Windows 9x purposes only */ - - public: - int overlapped_armed; - OVERLAPPED io_status; - DWORD ev; - - /* Constructor */ - fhandler_serial (); - - int open (int flags, mode_t mode); - int close (); - void init (HANDLE h, DWORD a, mode_t flags); - void overlapped_setup (); - int dup (fhandler_base *child); - void raw_read (void *ptr, size_t& ulen); - int raw_write (const void *ptr, size_t ulen); - int tcsendbreak (int); - int tcdrain (); - int tcflow (int); - int ioctl (unsigned int cmd, void *); - int switch_modem_lines (int set, int clr); - int tcsetattr (int a, const struct termios *t); - int tcgetattr (struct termios *t); - _off64_t lseek (_off64_t, int) { return 0; } - int tcflush (int); - int is_tty () { return 1; } - void fixup_after_fork (HANDLE parent); - void fixup_after_exec (); - - /* We maintain a pgrp so that tcsetpgrp and tcgetpgrp work, but we - don't use it for permissions checking. fhandler_tty_slave does - permission checking on pgrps. */ - virtual int tcgetpgrp () { return pgrp_; } - virtual int tcsetpgrp (const pid_t pid) { pgrp_ = pid; return 0; } - select_record *select_read (select_record *s); - select_record *select_write (select_record *s); - select_record *select_except (select_record *s); - bool is_slow () {return 1;} -}; - -#define acquire_output_mutex(ms) \ - __acquire_output_mutex (__PRETTY_FUNCTION__, __LINE__, ms); - -#define release_output_mutex() \ - __release_output_mutex (__PRETTY_FUNCTION__, __LINE__); - -class tty; -class tty_min; -class fhandler_termios: public fhandler_base -{ - protected: - HANDLE output_handle; - virtual void doecho (const void *, DWORD) {}; - virtual int accept_input () {return 1;}; - public: - tty_min *tc; - fhandler_termios () : - fhandler_base () - { - need_fork_fixup (true); - } - HANDLE& get_output_handle () { return output_handle; } - line_edit_status line_edit (const char *rptr, int nread, termios&); - void set_output_handle (HANDLE h) { output_handle = h; } - void tcinit (tty_min *this_tc, bool force = false); - virtual int is_tty () { return 1; } - int tcgetpgrp (); - int tcsetpgrp (int pid); - bg_check_types bg_check (int sig); - virtual DWORD __acquire_output_mutex (const char *fn, int ln, DWORD ms) {return 1;} - virtual void __release_output_mutex (const char *fn, int ln) {} - void fixup_after_fork (HANDLE); - void fixup_after_exec (); - void echo_erase (int force = 0); - virtual _off64_t lseek (_off64_t, int); -}; - -enum ansi_intensity -{ - INTENSITY_INVISIBLE, - INTENSITY_DIM, - INTENSITY_NORMAL, - INTENSITY_BOLD -}; - -#define normal 0 -#define gotesc 1 -#define gotsquare 2 -#define gotarg1 3 -#define gotrsquare 4 -#define gotcommand 5 -#define gettitle 6 -#define eattitle 7 -#define MAXARGS 10 - -class dev_console -{ - WORD default_color, underline_color, dim_color; - - /* Used to determine if an input keystroke should be modified with META. */ - int meta_mask; - -/* Output state */ - int state_; - int args_[MAXARGS]; - int nargs_; - unsigned rarg; - bool saw_question_mark; - bool alternate_charset_active; - - char my_title_buf [TITLESIZE + 1]; - - WORD current_win32_attr; - ansi_intensity intensity; - bool underline, blink, reverse; - WORD fg, bg; - - /* saved cursor coordinates */ - int savex, savey; - - /* saved screen */ - COORD savebufsiz; - PCHAR_INFO savebuf; - - struct - { - short Top, Bottom; - } scroll_region; - struct - { - SHORT winTop; - SHORT winBottom; - COORD dwWinSize; - COORD dwBufferSize; - COORD dwCursorPosition; - WORD wAttributes; - } info; - - COORD dwLastCursorPosition; - DWORD dwLastButtonState; - int nModifiers; - - bool insert_mode; - bool use_mouse; - bool raw_win32_keyboard_mode; - - bool con_to_str (char *d, const char *s, DWORD sz); - bool str_to_con (char *d, const char *s, DWORD sz); - void set_color (HANDLE); - bool fillin_info (HANDLE); - void set_default_attr (); - - friend class fhandler_console; -}; - -/* This is a input and output console handle */ -class fhandler_console: public fhandler_termios -{ - private: - static dev_console *dev_state; - static bool invisible_console; - -/* Output calls */ - void set_default_attr (); - - void clear_screen (int, int, int, int); - void scroll_screen (int, int, int, int, int, int); - void cursor_set (bool, int, int); - void cursor_get (int *, int *); - void cursor_rel (int, int); - const unsigned char *write_normal (unsigned const char*, unsigned const char *); - void char_command (char); - bool set_raw_win32_keyboard_mode (bool); - int output_tcsetattr (int a, const struct termios *t); - -/* Input calls */ - int igncr_enabled (); - int input_tcsetattr (int a, const struct termios *t); - void set_cursor_maybe (); - - public: - fhandler_console (); - - fhandler_console* is_console () { return this; } - - int open (int flags, mode_t mode = 0); - - int write (const void *ptr, size_t len); - void doecho (const void *str, DWORD len) { (void) write (str, len); } - void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3))); - int close (); - - int tcflush (int); - int tcsetattr (int a, const struct termios *t); - int tcgetattr (struct termios *t); - - /* Special dup as we must dup two handles */ - int dup (fhandler_base *child); - - int ioctl (unsigned int cmd, void *); - void init (HANDLE, DWORD, mode_t); - bool mouse_aware () {return dev_state->use_mouse;} - - select_record *select_read (select_record *s); - select_record *select_write (select_record *s); - select_record *select_except (select_record *s); - void fixup_after_fork_exec (bool); - void fixup_after_exec () {fixup_after_fork_exec (true);} - void fixup_after_fork (HANDLE) {fixup_after_fork_exec (false);} - void set_close_on_exec (bool val); - void set_input_state (); - void send_winch_maybe (); - static tty_min *get_tty_stuff (int); - bool is_slow () {return 1;} - static bool need_invisible (); - static bool fhandler_console::has_a () {return !invisible_console;} -}; - -class fhandler_tty_common: public fhandler_termios -{ - public: - fhandler_tty_common () - : fhandler_termios (), output_done_event (NULL), - ioctl_request_event (NULL), ioctl_done_event (NULL), output_mutex (NULL), - input_mutex (NULL), input_available_event (NULL), inuse (NULL) - { - // nothing to do - } - HANDLE output_done_event; // Raised by master when tty's output buffer - // written. Write status in tty::write_retval. - HANDLE ioctl_request_event; // Raised by slave to perform ioctl() request. - // Ioctl() request in tty::cmd/arg. - HANDLE ioctl_done_event; // Raised by master on ioctl() completion. - // Ioctl() status in tty::ioctl_retval. - HANDLE output_mutex, input_mutex; - HANDLE input_available_event; - HANDLE inuse; // used to indicate that a tty is in use - - DWORD __acquire_output_mutex (const char *fn, int ln, DWORD ms); - void __release_output_mutex (const char *fn, int ln); - - virtual int dup (fhandler_base *child); - - tty *get_ttyp () { return (tty *) tc; } - - int close (); - _off64_t lseek (_off64_t, int); - void set_close_on_exec (bool val); - void fixup_after_fork (HANDLE parent); - select_record *select_read (select_record *s); - select_record *select_write (select_record *s); - select_record *select_except (select_record *s); - bool is_slow () {return 1;} -}; - -class fhandler_tty_slave: public fhandler_tty_common -{ - public: - /* Constructor */ - fhandler_tty_slave (); - - int open (int flags, mode_t mode = 0); - int write (const void *ptr, size_t len); - void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3))); - void init (HANDLE, DWORD, mode_t); - - int tcsetattr (int a, const struct termios *t); - int tcgetattr (struct termios *t); - int tcflush (int); - int ioctl (unsigned int cmd, void *); - int close (); - int dup (fhandler_base *child); - void fixup_after_fork (HANDLE parent); - - select_record *select_read (select_record *s); - int cygserver_attach_tty (HANDLE*, HANDLE*); - int get_unit (); - virtual char const *ttyname () { return pc.dev.name; } -}; - -class fhandler_pty_master: public fhandler_tty_common -{ - int pktmode; // non-zero if pty in a packet mode. -protected: - device slave; // device type of slave -public: - int need_nl; // Next read should start with \n - - /* Constructor */ - fhandler_pty_master (); - - int process_slave_output (char *buf, size_t len, int pktmode_on); - void doecho (const void *str, DWORD len); - int accept_input (); - int open (int flags, mode_t mode = 0); - int write (const void *ptr, size_t len); - void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3))); - int close (); - - int tcsetattr (int a, const struct termios *t); - int tcgetattr (struct termios *t); - int tcflush (int); - int ioctl (unsigned int cmd, void *); - - char *ptsname (); - - void set_close_on_exec (bool val); - bool hit_eof (); - int get_unit () const { return slave.minor; } -}; - -class fhandler_tty_master: public fhandler_pty_master -{ - public: - /* Constructor */ - fhandler_console *console; // device handler to perform real i/o. - - fhandler_tty_master (); - int init (); - int init_console (); - void set_winsize (bool); - bool is_slow () {return 1;} -}; - -class fhandler_dev_null: public fhandler_base -{ - public: - fhandler_dev_null (); - int open (int, mode_t); - - select_record *select_read (select_record *s); - select_record *select_write (select_record *s); - select_record *select_except (select_record *s); -}; - -class fhandler_dev_zero: public fhandler_base -{ - public: - fhandler_dev_zero (); - int open (int flags, mode_t mode = 0); - int write (const void *ptr, size_t len); - void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3))); - _off64_t lseek (_off64_t offset, int whence); - - virtual HANDLE mmap (caddr_t *addr, size_t len, int prot, - int flags, _off64_t off); - virtual int munmap (HANDLE h, caddr_t addr, size_t len); - virtual int msync (HANDLE h, caddr_t addr, size_t len, int flags); - virtual bool fixup_mmap_after_fork (HANDLE h, int prot, int flags, - _off64_t offset, DWORD size, - void *address); -}; - -class fhandler_dev_random: public fhandler_base -{ - protected: - HCRYPTPROV crypt_prov; - long pseudo; - - bool crypt_gen_random (void *ptr, size_t len); - int pseudo_write (const void *ptr, size_t len); - int pseudo_read (void *ptr, size_t len); - - public: - fhandler_dev_random (); - int open (int flags, mode_t mode = 0); - int write (const void *ptr, size_t len); - void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3))); - _off64_t lseek (_off64_t offset, int whence); - int close (); - int dup (fhandler_base *child); -}; - -class fhandler_dev_mem: public fhandler_base -{ - protected: - DWORD mem_size; - _off64_t pos; - - public: - fhandler_dev_mem (); - ~fhandler_dev_mem (); - - int open (int flags, mode_t mode = 0); - int write (const void *ptr, size_t ulen); - void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3))); - _off64_t lseek (_off64_t offset, int whence); - int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2))); - int dup (fhandler_base *child); - - HANDLE mmap (caddr_t *addr, size_t len, int prot, int flags, _off64_t off); - int munmap (HANDLE h, caddr_t addr, size_t len); - int msync (HANDLE h, caddr_t addr, size_t len, int flags); - bool fixup_mmap_after_fork (HANDLE h, int prot, int flags, - _off64_t offset, DWORD size, void *address); -} ; - -class fhandler_dev_clipboard: public fhandler_base -{ - _off64_t pos; - void *membuffer; - size_t msize; - bool eof; - public: - fhandler_dev_clipboard (); - int is_windows () { return 1; } - int open (int flags, mode_t mode = 0); - int write (const void *ptr, size_t len); - void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3))); - _off64_t lseek (_off64_t offset, int whence); - int close (); - - int dup (fhandler_base *child); - void fixup_after_exec (); -}; - -class fhandler_windows: public fhandler_base -{ - private: - HWND hWnd_; // the window whose messages are to be retrieved by read() call - int method_; // write method (Post or Send) - public: - fhandler_windows (); - int is_windows () { return 1; } - int open (int flags, mode_t mode = 0); - int write (const void *ptr, size_t len); - void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3))); - int ioctl (unsigned int cmd, void *); - _off64_t lseek (_off64_t, int) { return 0; } - int close () { return 0; } - - void set_close_on_exec (bool val); - void fixup_after_fork (HANDLE parent); - select_record *select_read (select_record *s); - select_record *select_write (select_record *s); - select_record *select_except (select_record *s); - bool is_slow () {return 1;} -}; - -class fhandler_dev_dsp: public fhandler_base -{ - public: - class Audio; - class Audio_out; - class Audio_in; - private: - int audioformat_; - int audiofreq_; - int audiobits_; - int audiochannels_; - Audio_out *audio_out_; - Audio_in *audio_in_; - public: - fhandler_dev_dsp (); - - int open (int flags, mode_t mode = 0); - int write (const void *ptr, size_t len); - void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3))); - int ioctl (unsigned int cmd, void *); - _off64_t lseek (_off64_t, int); - int close (); - int dup (fhandler_base *child); - void fixup_after_fork (HANDLE parent); - void fixup_after_exec (); - private: - void close_audio_in (); - void close_audio_out (bool immediately = false); -}; - -class fhandler_virtual : public fhandler_base -{ - protected: - char *filebuf; - size_t bufalloc; - _off64_t filesize; - _off64_t position; - int fileid; // unique within each class - public: - - fhandler_virtual (); - virtual ~fhandler_virtual(); - - virtual int exists(); - virtual DIR *opendir (); - _off64_t telldir (DIR *); - void seekdir (DIR *, _off64_t); - void rewinddir (DIR *); - int closedir (DIR *); - int write (const void *ptr, size_t len); - void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3))); - _off64_t lseek (_off64_t, int); - int dup (fhandler_base *child); - int open (int flags, mode_t mode = 0); - int close (); - int __stdcall fstat (struct stat *buf) __attribute__ ((regparm (2))); - int __stdcall fchmod (mode_t mode) __attribute__ ((regparm (1))); - int __stdcall fchown (__uid32_t uid, __gid32_t gid) __attribute__ ((regparm (2))); - int __stdcall facl (int, int, __acl32 *) __attribute__ ((regparm (3))); - virtual bool fill_filebuf (); - char *get_filebuf () { return filebuf; } - void fixup_after_exec (); -}; - -class fhandler_proc: public fhandler_virtual -{ - public: - fhandler_proc (); - int exists(); - int readdir (DIR *, dirent *) __attribute__ ((regparm (3))); - static DWORD get_proc_fhandler(const char *path); - - int open (int flags, mode_t mode = 0); - int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2))); - bool fill_filebuf (); -}; - -class fhandler_netdrive: public fhandler_virtual -{ - public: - fhandler_netdrive (); - int exists(); - int readdir (DIR *, dirent *) __attribute__ ((regparm (3))); - void seekdir (DIR *, _off64_t); - void rewinddir (DIR *); - int closedir (DIR *); - int open (int flags, mode_t mode = 0); - int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2))); -}; - -class fhandler_registry: public fhandler_proc -{ - private: - char *value_name; - public: - fhandler_registry (); - int exists(); - int readdir (DIR *, dirent *) __attribute__ ((regparm (3))); - _off64_t telldir (DIR *); - void seekdir (DIR *, _off64_t); - void rewinddir (DIR *); - int closedir (DIR *); - - int open (int flags, mode_t mode = 0); - int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2))); - bool fill_filebuf (); - int close (); -}; - -class pinfo; -class fhandler_process: public fhandler_proc -{ - pid_t pid; - public: - fhandler_process (); - int exists(); - DIR *opendir (); - int readdir (DIR *, dirent *) __attribute__ ((regparm (3))); - int open (int flags, mode_t mode = 0); - int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2))); - bool fill_filebuf (); -}; - -struct fhandler_nodevice: public fhandler_base -{ - fhandler_nodevice (); - int open (int flags, mode_t mode = 0); - // int __stdcall fstat (struct __stat64 *buf, path_conv *); -}; - -#define report_tty_counts(fh, call, use_op) \ - termios_printf ("%s %s, %susecount %d",\ - fh->ttyname (), call,\ - use_op, ((fhandler_tty_slave *) fh)->archetype->usecount); - -typedef union -{ - char __base[sizeof (fhandler_base)]; - char __console[sizeof (fhandler_console)]; - char __cygdrive[sizeof (fhandler_cygdrive)]; - char __dev_clipboard[sizeof (fhandler_dev_clipboard)]; - char __dev_dsp[sizeof (fhandler_dev_dsp)]; - char __dev_floppy[sizeof (fhandler_dev_floppy)]; - char __dev_mem[sizeof (fhandler_dev_mem)]; - char __dev_null[sizeof (fhandler_dev_null)]; - char __dev_random[sizeof (fhandler_dev_random)]; - char __dev_raw[sizeof (fhandler_dev_raw)]; - char __dev_tape[sizeof (fhandler_dev_tape)]; - char __dev_zero[sizeof (fhandler_dev_zero)]; - char __disk_file[sizeof (fhandler_disk_file)]; - char __fifo[sizeof (fhandler_fifo)]; - char __mailslot[sizeof (fhandler_mailslot)]; - char __netdrive[sizeof (fhandler_netdrive)]; - char __nodevice[sizeof (fhandler_nodevice)]; - char __pipe[sizeof (fhandler_pipe)]; - char __proc[sizeof (fhandler_proc)]; - char __process[sizeof (fhandler_process)]; - char __pty_master[sizeof (fhandler_pty_master)]; - char __registry[sizeof (fhandler_registry)]; - char __serial[sizeof (fhandler_serial)]; - char __socket[sizeof (fhandler_socket)]; - char __termios[sizeof (fhandler_termios)]; - char __tty_common[sizeof (fhandler_tty_common)]; - char __tty_master[sizeof (fhandler_tty_master)]; - char __tty_slave[sizeof (fhandler_tty_slave)]; - char __virtual[sizeof (fhandler_virtual)]; - char __windows[sizeof (fhandler_windows)]; -} fhandler_union; - -struct select_record -{ - int fd; - HANDLE h; - fhandler_base *fh; - int thread_errno; - bool windows_handle; - bool read_ready, write_ready, except_ready; - bool read_selected, write_selected, except_selected; - bool except_on_write; - int (*startup) (select_record *me, class select_stuff *stuff); - int (*peek) (select_record *, bool); - int (*verify) (select_record *me, fd_set *readfds, fd_set *writefds, - fd_set *exceptfds); - void (*cleanup) (select_record *me, class select_stuff *stuff); - struct select_record *next; - void set_select_errno () {__seterrno (); thread_errno = errno;} - int saw_error () {return thread_errno;} - - select_record (fhandler_base *in_fh = NULL) : fd (0), h (NULL), - fh (in_fh), thread_errno (0), windows_handle (false), - read_ready (false), write_ready (false), except_ready (false), - read_selected (false), write_selected (false), - except_selected (false), except_on_write (false), - startup (NULL), peek (NULL), verify (NULL), cleanup (NULL), - next (NULL) {} -}; - -class select_stuff -{ - public: - ~select_stuff (); - bool always_ready, windows_used; - select_record start; - void *device_specific_pipe; - void *device_specific_socket; - void *device_specific_serial; - void *device_specific_mailslot; - - int test_and_set (int i, fd_set *readfds, fd_set *writefds, - fd_set *exceptfds); - int poll (fd_set *readfds, fd_set *writefds, fd_set *exceptfds); - int wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds, DWORD ms); - void cleanup (); - select_stuff (): always_ready (0), windows_used (0), start (0), - device_specific_pipe (0), - device_specific_socket (0), - device_specific_serial (0), - device_specific_mailslot (0) {} -}; - -void __stdcall set_console_state_for_spawn (bool); -#endif /* _FHANDLER_H_ */ diff --git a/winsup/cygwin/fhandler_clipboard.cc b/winsup/cygwin/fhandler_clipboard.cc deleted file mode 100644 index 15ae5f936..000000000 --- a/winsup/cygwin/fhandler_clipboard.cc +++ /dev/null @@ -1,285 +0,0 @@ -/* fhandler_dev_clipboard: code to access /dev/clipboard - - Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc - - Written by Charles Wilson (cwilson@ece.gatech.edu) - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" - -/* - * Robert Collins: - * FIXME: should we use GetClipboardSequenceNumber to tell if the clipboard has - * changed? How does /dev/clipboard operate under (say) linux? - */ - -static const NO_COPY char *CYGWIN_NATIVE = "CYGWIN_NATIVE_CLIPBOARD"; -/* this is MT safe because windows format id's are atomic */ -static int cygnativeformat; - -fhandler_dev_clipboard::fhandler_dev_clipboard () - : fhandler_base (), pos (0), membuffer (NULL), msize (0), - eof (true) -{ - /* FIXME: check for errors and loop until we can open the clipboard */ - OpenClipboard (NULL); - cygnativeformat = RegisterClipboardFormat (CYGWIN_NATIVE); - CloseClipboard (); -} - -/* - * Special clipboard dup to duplicate input and output - * handles. - */ - -int -fhandler_dev_clipboard::dup (fhandler_base * child) -{ - fhandler_dev_clipboard *fhc = (fhandler_dev_clipboard *) child; - - if (!fhc->open (get_flags (), 0)) - system_printf ("error opening clipboard, %E"); - - fhc->membuffer = membuffer; - fhc->pos = pos; - fhc->msize = msize; - - return 0; -} - -int -fhandler_dev_clipboard::open (int flags, mode_t) -{ - set_flags (flags | O_TEXT); - eof = false; - pos = 0; - if (membuffer) - free (membuffer); - membuffer = NULL; - if (!cygnativeformat) - cygnativeformat = RegisterClipboardFormat (CYGWIN_NATIVE); - nohandle (true); - set_open_status (); - return 1; -} - -static int -set_clipboard (const void *buf, size_t len) -{ - HGLOBAL hmem; - unsigned char *clipbuf; - /* Native CYGWIN format */ - OpenClipboard (0); - hmem = GlobalAlloc (GMEM_MOVEABLE, len + sizeof (size_t)); - if (!hmem) - { - system_printf ("Couldn't allocate global buffer for write"); - return -1; - } - clipbuf = (unsigned char *) GlobalLock (hmem); - memcpy (clipbuf + sizeof (size_t), buf, len); - *(size_t *) (clipbuf) = len; - GlobalUnlock (hmem); - EmptyClipboard (); - if (!cygnativeformat) - cygnativeformat = RegisterClipboardFormat (CYGWIN_NATIVE); - if (!SetClipboardData (cygnativeformat, hmem)) - { - system_printf - ("Couldn't write native format to the clipboard %04x %x", - cygnativeformat, hmem); -/* FIXME: return an appriate error code &| set_errno(); */ - return -1; - } - CloseClipboard (); - if (GlobalFree (hmem)) - { - system_printf - ("Couldn't free global buffer after write to the clipboard"); -/* FIXME: return an appriate error code &| set_errno(); */ - return 0; - } - - /* CF_TEXT/CF_OEMTEXT for copying to wordpad and the like */ - - OpenClipboard (0); - hmem = GlobalAlloc (GMEM_MOVEABLE, len + 2); - if (!hmem) - { - system_printf ("Couldn't allocate global buffer for write"); - return -1; - } - clipbuf = (unsigned char *) GlobalLock (hmem); - memcpy (clipbuf, buf, len); - *(clipbuf + len) = '\0'; - *(clipbuf + len + 1) = '\0'; - GlobalUnlock (hmem); - if (!SetClipboardData - ((current_codepage == ansi_cp ? CF_TEXT : CF_OEMTEXT), hmem)) - { - system_printf ("Couldn't write to the clipboard"); -/* FIXME: return an appriate error code &| set_errno(); */ - return -1; - } - CloseClipboard (); - if (GlobalFree (hmem)) - { - system_printf - ("Couldn't free global buffer after write to the clipboard"); -/* FIXME: return an appriate error code &| set_errno(); */ - } - return 0; -} - -/* FIXME: arbitrary seeking is not handled */ -int -fhandler_dev_clipboard::write (const void *buf, size_t len) -{ - if (!eof) - { - /* write to our membuffer */ - size_t cursize = msize; - void *tempbuffer = realloc (membuffer, cursize + len); - if (!tempbuffer) - { - system_printf ("Couldn't realloc() clipboard buffer for write"); - return -1; - } - membuffer = tempbuffer; - msize = cursize + len; - memcpy ((unsigned char *) membuffer + cursize, buf, len); - - /* now pass to windows */ - if (set_clipboard (membuffer, msize)) - { - /* FIXME: membuffer is now out of sync with pos, but msize is used above */ - set_errno (ENOSPC); - return -1; - } - - pos = msize; - - eof = false; - return len; - } - else - { - /* FIXME: return 0 bytes written, file not open */ - return 0; - } -} - -void __stdcall -fhandler_dev_clipboard::read (void *ptr, size_t& len) -{ - HGLOBAL hglb; - size_t ret; - UINT formatlist[2]; - int format; - if (eof) - len = 0; - else - { - formatlist[0] = cygnativeformat; - formatlist[1] = current_codepage == ansi_cp ? CF_TEXT : CF_OEMTEXT; - OpenClipboard (0); - if ((format = GetPriorityClipboardFormat (formatlist, 2)) <= 0) - { - CloseClipboard (); -#if 0 - system_printf ("a non-accepted format! %d", format); -#endif - len = 0; - } - else - { - hglb = GetClipboardData (format); - if (format == cygnativeformat) - { - unsigned char *buf = (unsigned char *) GlobalLock (hglb); - size_t buflen = (*(size_t *) buf); - ret = ((len > (buflen - pos)) ? (buflen - pos) : len); - memcpy (ptr, buf + sizeof (size_t)+ pos , ret); - pos += ret; - if (pos + len - ret >= buflen) - eof = true; - GlobalUnlock (hglb); - } - else - { - LPSTR lpstr; - lpstr = (LPSTR) GlobalLock (hglb); - - ret = ((len > (strlen (lpstr) - pos)) ? (strlen (lpstr) - pos) - : len); - - memcpy (ptr, lpstr + pos, ret); - //ret = snprintf((char *) ptr, len, "%s", lpstr);//+pos); - pos += ret; - if (pos + len - ret >= strlen (lpstr)) - eof = true; - GlobalUnlock (hglb); - } - CloseClipboard (); - len = ret; - } - } -} - -_off64_t -fhandler_dev_clipboard::lseek (_off64_t offset, int whence) -{ - /* On reads we check this at read time, not seek time. - * On writes we use this to decide how to write - empty and write, or open, copy, empty - * and write - */ - pos = offset; - /* treat seek like rewind */ - if (membuffer) - free (membuffer); - msize = 0; - return 0; -} - -int -fhandler_dev_clipboard::close () -{ - if (!hExeced) - { - eof = true; - pos = 0; - if (membuffer) - { - free (membuffer); - membuffer = NULL; - } - msize = 0; - } - return 0; -} - -void -fhandler_dev_clipboard::fixup_after_exec () -{ - if (!close_on_exec ()) - { - eof = false; - pos = msize = 0; - membuffer = NULL; - } -} diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc deleted file mode 100644 index 23f2cf8e7..000000000 --- a/winsup/cygwin/fhandler_console.cc +++ /dev/null @@ -1,1896 +0,0 @@ -/* fhandler_console.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "sigproc.h" -#include "pinfo.h" -#include "shared_info.h" -#include "cygtls.h" -#include "registry.h" - -#define CONVERT_LIMIT 16384 - -static bool -cp_convert (UINT destcp, char *dest, UINT srccp, const char *src, DWORD size) -{ - if (!size) - /* no action */; - else if (destcp == srccp) - { - if (dest != src) - memcpy (dest, src, size); - } - else - { - WCHAR wbuffer[CONVERT_LIMIT]; /* same size as the maximum input, s.b. */ - if (!MultiByteToWideChar (srccp, 0, src, size, wbuffer, sizeof (wbuffer))) - return false; - if (!WideCharToMultiByte (destcp, 0, wbuffer, size, dest, size, - NULL, NULL)) - return false; - } - return true; -} - -/* - * Scroll the screen context. - * x1, y1 - ul corner - * x2, y2 - dr corner - * xn, yn - new ul corner - * Negative values represents current screen dimensions - */ - -#define srTop (dev_state->info.winTop + dev_state->scroll_region.Top) -#define srBottom ((dev_state->scroll_region.Bottom < 0) ? dev_state->info.winBottom : dev_state->info.winTop + dev_state->scroll_region.Bottom) - -#define use_tty ISSTATE (myself, PID_USETTY) - -const char * get_nonascii_key (INPUT_RECORD&, char *); - -static console_state NO_COPY *shared_console_info; - -dev_console NO_COPY *fhandler_console::dev_state; - -/* Allocate and initialize the shared record for the current console. - Returns a pointer to shared_console_info. */ -tty_min * -fhandler_console::get_tty_stuff (int flags = 0) -{ - if (dev_state) - return &shared_console_info->tty_min_state; - - shared_locations sh_shared_console = SH_SHARED_CONSOLE; - shared_console_info = - (console_state *) open_shared (NULL, 0, cygheap->console_h, - sizeof (*shared_console_info), - sh_shared_console); - dev_state = &shared_console_info->dev_state; - - ProtectHandleINH (cygheap->console_h); - if (!shared_console_info->tty_min_state.ntty) - { - shared_console_info->tty_min_state.setntty (TTY_CONSOLE); - shared_console_info->tty_min_state.setsid (myself->sid); - myself->set_ctty (&shared_console_info->tty_min_state, flags, NULL); - - dev_state->scroll_region.Bottom = -1; - dev_state->dwLastCursorPosition.X = -1; - dev_state->dwLastCursorPosition.Y = -1; - dev_state->underline_color = FOREGROUND_GREEN | FOREGROUND_BLUE; - dev_state->dim_color = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; - dev_state->meta_mask = LEFT_ALT_PRESSED; - /* Set the mask that determines if an input keystroke is modified by - META. We set this based on the keyboard layout language loaded - for the current thread. The left key always generates - META, but the right key only generates META if we are using - an English keyboard because many "international" keyboards - replace common shell symbols ('[', '{', etc.) with accented - language-specific characters (umlaut, accent grave, etc.). On - these keyboards right (called AltGr) is used to produce the - shell symbols and should not be interpreted as META. */ - if (PRIMARYLANGID (LOWORD (GetKeyboardLayout (0))) == LANG_ENGLISH) - dev_state->meta_mask |= RIGHT_ALT_PRESSED; - dev_state->set_default_attr (); - } - - return &shared_console_info->tty_min_state; -} - -void -set_console_ctty () -{ - fhandler_console::get_tty_stuff (); -} - -/* Return the tty structure associated with a given tty number. If the - tty number is < 0, just return a dummy record. */ -tty_min * -tty_list::get_tty (int n) -{ - static tty_min nada; - if (n == TTY_CONSOLE) - return fhandler_console::get_tty_stuff (); - else if (n >= 0) - return &cygwin_shared->tty.ttys[n]; - else - return &nada; -} - -/* Determine if a console is associated with this process prior to a spawn. - If it is, then just return. If the console has been initialized, then - set it into a more friendly state for non-cygwin apps. */ -void __stdcall -set_console_state_for_spawn (bool iscyg) -{ - if (fhandler_console::need_invisible () || iscyg - || (myself->ctty >= 0 && myself->ctty != TTY_CONSOLE)) - return; - - HANDLE h = CreateFile ("CONIN$", GENERIC_READ, FILE_SHARE_WRITE, - &sec_none_nih, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, - NULL); - - if (h == INVALID_HANDLE_VALUE) - return; - - if (shared_console_info != NULL) - { - /* ACK. Temporarily define for use in TTYSETF macro */ - SetConsoleMode (h, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT); - shared_console_info->tty_min_state.rstcons (true); - } - - CloseHandle (h); - - return; -} - -/* The results of GetConsoleCP() and GetConsoleOutputCP() cannot be - cached, because a program or the user can change these values at - any time. */ -inline bool -dev_console::con_to_str (char *d, const char *s, DWORD sz) -{ - return cp_convert (get_cp (), d, GetConsoleCP (), s, sz); -} - -inline bool -dev_console::str_to_con (char *d, const char *s, DWORD sz) -{ - if (alternate_charset_active) - { - /* no translation when alternate charset is active */ - memcpy(d, s, sz); - return true; - } - return cp_convert (GetConsoleOutputCP (), d, get_cp (), s, sz); -} - -bool -fhandler_console::set_raw_win32_keyboard_mode (bool new_mode) -{ - bool old_mode = dev_state->raw_win32_keyboard_mode; - dev_state->raw_win32_keyboard_mode = new_mode; - syscall_printf ("raw keyboard mode %sabled", dev_state->raw_win32_keyboard_mode ? "en" : "dis"); - return old_mode; -}; - -void -fhandler_console::set_cursor_maybe () -{ - CONSOLE_SCREEN_BUFFER_INFO now; - - if (!GetConsoleScreenBufferInfo (get_output_handle (), &now)) - return; - - if (dev_state->dwLastCursorPosition.X != now.dwCursorPosition.X || - dev_state->dwLastCursorPosition.Y != now.dwCursorPosition.Y) - { - SetConsoleCursorPosition (get_output_handle (), now.dwCursorPosition); - dev_state->dwLastCursorPosition = now.dwCursorPosition; - } -} - -void -fhandler_console::send_winch_maybe () -{ - SHORT y = dev_state->info.dwWinSize.Y; - SHORT x = dev_state->info.dwWinSize.X; - dev_state->fillin_info (get_output_handle ()); - - if (y != dev_state->info.dwWinSize.Y || x != dev_state->info.dwWinSize.X) - { - extern fhandler_tty_master *tty_master; - dev_state->scroll_region.Top = 0; - dev_state->scroll_region.Bottom = -1; - if (tty_master) - tty_master->set_winsize (true); - else - tc->kill_pgrp (SIGWINCH); - } -} - -void __stdcall -fhandler_console::read (void *pv, size_t& buflen) -{ - HANDLE h = get_io_handle (); - -#define buf ((char *) pv) - - int ch; - set_input_state (); - - int copied_chars = get_readahead_into_buffer (buf, buflen); - - if (copied_chars) - { - buflen = copied_chars; - return; - } - - HANDLE w4[2]; - DWORD nwait; - char tmp[60]; - - w4[0] = h; - if (&_my_tls != _main_tls) - nwait = 1; - else - { - w4[1] = signal_arrived; - nwait = 2; - } - - termios ti = tc->ti; - for (;;) - { - int bgres; - if ((bgres = bg_check (SIGTTIN)) <= bg_eof) - { - buflen = bgres; - return; - } - - set_cursor_maybe (); /* to make cursor appear on the screen immediately */ - switch (WaitForMultipleObjects (nwait, w4, FALSE, INFINITE)) - { - case WAIT_OBJECT_0: - break; - case WAIT_OBJECT_0 + 1: - goto sig_exit; - default: - goto err; - } - - DWORD nread; - INPUT_RECORD input_rec; - const char *toadd = NULL; - - if (!ReadConsoleInput (h, &input_rec, 1, &nread)) - { - syscall_printf ("ReadConsoleInput failed, %E"); - goto err; /* seems to be failure */ - } - - /* check the event that occurred */ - switch (input_rec.EventType) - { - case KEY_EVENT: -#define virtual_key_code (input_rec.Event.KeyEvent.wVirtualKeyCode) -#define control_key_state (input_rec.Event.KeyEvent.dwControlKeyState) - - dev_state->nModifiers = 0; - -#ifdef DEBUGGING - /* allow manual switching to/from raw mode via ctrl-alt-scrolllock */ - if (input_rec.Event.KeyEvent.bKeyDown && - virtual_key_code == VK_SCROLL && - control_key_state & (LEFT_ALT_PRESSED | LEFT_CTRL_PRESSED) == LEFT_ALT_PRESSED | LEFT_CTRL_PRESSED - ) - { - set_raw_win32_keyboard_mode (!dev_state->raw_win32_keyboard_mode); - continue; - } -#endif - - if (dev_state->raw_win32_keyboard_mode) - { - __small_sprintf (tmp, "\033{%u;%u;%u;%u;%u;%luK", - input_rec.Event.KeyEvent.bKeyDown, - input_rec.Event.KeyEvent.wRepeatCount, - input_rec.Event.KeyEvent.wVirtualKeyCode, - input_rec.Event.KeyEvent.wVirtualScanCode, - input_rec.Event.KeyEvent.uChar.UnicodeChar, - input_rec.Event.KeyEvent.dwControlKeyState); - toadd = tmp; - nread = strlen (toadd); - break; - } - -#define ich (input_rec.Event.KeyEvent.uChar.AsciiChar) -#define wch (input_rec.Event.KeyEvent.uChar.UnicodeChar) -#define ALT_PRESSED (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED) -#define CTRL_PRESSED (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED) - - /* Ignore key up events, except for left alt events with non-zero character - */ - if (!input_rec.Event.KeyEvent.bKeyDown && - /* - Event for left alt, with a non-zero character, comes from - "alt + numerics" key sequence. - e.g. 0233 => é - */ - !(wch != 0 - // ?? experimentally determined on an XP system - && virtual_key_code == VK_MENU - // left alt -- see http://www.microsoft.com/hwdev/tech/input/Scancode.asp - && input_rec.Event.KeyEvent.wVirtualScanCode == 0x38)) - continue; - - if (control_key_state & SHIFT_PRESSED) - dev_state->nModifiers |= 1; - if (control_key_state & RIGHT_ALT_PRESSED) - dev_state->nModifiers |= 2; - if (control_key_state & CTRL_PRESSED) - dev_state->nModifiers |= 4; - if (control_key_state & LEFT_ALT_PRESSED) - dev_state->nModifiers |= 8; - - if (wch == 0 || - /* arrow/function keys */ - (input_rec.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY)) - { - toadd = get_nonascii_key (input_rec, tmp); - if (!toadd) - { - dev_state->nModifiers = 0; - continue; - } - nread = strlen (toadd); - } - else - { - tmp[1] = ich; - /* Need this check since US code page seems to have a bug when - converting a CTRL-U. */ - if ((unsigned char) ich > 0x7f) - dev_state->con_to_str (tmp + 1, tmp + 1, 1); - /* Determine if the keystroke is modified by META. The tricky - part is to distinguish whether the right Alt key should be - recognized as Alt, or as AltGr. */ - bool meta; - if (wincap.altgr_is_ctrl_alt ()) - /* WinNT: AltGr is reported as Ctrl+Alt, and Ctrl+Alt is - treated just like AltGr. However, if Ctrl+Alt+key generates - an ASCII control character, interpret is as META. */ - meta = (control_key_state & ALT_PRESSED) != 0 - && ((control_key_state & CTRL_PRESSED) == 0 - || ((signed char) ich >= 0 && ich <= 0x1f || ich == 0x7f)); - else - /* Win9x: there's no way to distinguish Alt from AltGr, so rely - on dev_state->meta_mask heuristic (see fhandler_console constructor). */ - meta = (control_key_state & dev_state->meta_mask) != 0; - if (!meta) - toadd = tmp + 1; - else - { - tmp[0] = '\033'; - tmp[1] = cyg_tolower (tmp[1]); - toadd = tmp; - nread++; - dev_state->nModifiers &= ~4; - } - } -#undef ich -#undef wch -#undef ALT_PRESSED -#undef CTRL_PRESSED - break; - - case MOUSE_EVENT: - send_winch_maybe (); - if (dev_state->use_mouse) - { - MOUSE_EVENT_RECORD& mouse_event = input_rec.Event.MouseEvent; - - /* Treat the double-click event like a regular button press */ - if (mouse_event.dwEventFlags == DOUBLE_CLICK) - { - syscall_printf ("mouse: double-click -> click"); - mouse_event.dwEventFlags = 0; - } - - /* Did something other than a click occur? */ - if (mouse_event.dwEventFlags) - continue; - - /* Retrieve reported mouse position */ - int x = mouse_event.dwMousePosition.X; - int y = mouse_event.dwMousePosition.Y; - - /* Adjust mouse position by scroll buffer offset */ - CONSOLE_SCREEN_BUFFER_INFO now; - if (GetConsoleScreenBufferInfo (get_output_handle (), &now)) - { - y -= now.srWindow.Top; - x -= now.srWindow.Left; - } - else - { - syscall_printf ("mouse: cannot adjust position by scroll buffer offset"); - continue; - } - - /* If the mouse event occurred out of the area we can handle, - ignore it. */ - if ((x + ' ' + 1 > 0xFF) || (y + ' ' + 1 > 0xFF)) - { - syscall_printf ("mouse: position out of range"); - continue; - } - - /* Ignore unimportant mouse buttons */ - mouse_event.dwButtonState &= 0x7; - - /* This code assumes Windows never reports multiple button - events at the same time. */ - int b = 0; - char sz[32]; - if (mouse_event.dwButtonState == dev_state->dwLastButtonState) - { - syscall_printf ("mouse: button state unchanged"); - continue; - } - else if (mouse_event.dwButtonState < dev_state->dwLastButtonState) - { - b = 3; - strcpy (sz, "btn up"); - } - else if ((mouse_event.dwButtonState & 1) != (dev_state->dwLastButtonState & 1)) - { - b = 0; - strcpy (sz, "btn1 down"); - } - else if ((mouse_event.dwButtonState & 2) != (dev_state->dwLastButtonState & 2)) - { - b = 2; - strcpy (sz, "btn2 down"); - } - else if ((mouse_event.dwButtonState & 4) != (dev_state->dwLastButtonState & 4)) - { - b = 1; - strcpy (sz, "btn3 down"); - } - - /* Remember the current button state */ - dev_state->dwLastButtonState = mouse_event.dwButtonState; - - /* If a button was pressed, remember the modifiers */ - if (b != 3) - { - dev_state->nModifiers = 0; - if (mouse_event.dwControlKeyState & SHIFT_PRESSED) - dev_state->nModifiers |= 0x4; - if (mouse_event.dwControlKeyState & (RIGHT_ALT_PRESSED|LEFT_ALT_PRESSED)) - dev_state->nModifiers |= 0x8; - if (mouse_event.dwControlKeyState & (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED)) - dev_state->nModifiers |= 0x10; - } - - b |= dev_state->nModifiers; - - /* We can now create the code. */ - sprintf (tmp, "\033[M%c%c%c", b + ' ', x + ' ' + 1, y + ' ' + 1); - syscall_printf ("mouse: %s at (%d,%d)", sz, x, y); - - toadd = tmp; - nread = 6; - } - break; - - case FOCUS_EVENT: - case WINDOW_BUFFER_SIZE_EVENT: - send_winch_maybe (); - /* fall through */ - default: - continue; - } - - if (toadd) - { - line_edit_status res = line_edit (toadd, nread, ti); - if (res == line_edit_signalled) - goto sig_exit; - else if (res == line_edit_input_done) - break; - } -#undef ich - } - - while (buflen) - if ((ch = get_readahead ()) < 0) - break; - else - { - buf[copied_chars++] = (unsigned char)(ch & 0xff); - buflen--; - } -#undef buf - - buflen = copied_chars; - return; - -err: - __seterrno (); - buflen = (size_t) -1; - return; - -sig_exit: - set_sig_errno (EINTR); - buflen = (size_t) -1; -} - -void -fhandler_console::set_input_state () -{ - if (tc->rstcons ()) - input_tcsetattr (0, &tc->ti); -} - -bool -dev_console::fillin_info (HANDLE h) -{ - bool ret; - CONSOLE_SCREEN_BUFFER_INFO linfo; - - if ((ret = GetConsoleScreenBufferInfo (h, &linfo))) - { - info.winTop = linfo.srWindow.Top; - info.winBottom = linfo.srWindow.Bottom; - info.dwWinSize.Y = 1 + linfo.srWindow.Bottom - linfo.srWindow.Top; - info.dwWinSize.X = 1 + linfo.srWindow.Right - linfo.srWindow.Left; - info.dwBufferSize = linfo.dwSize; - info.dwCursorPosition = linfo.dwCursorPosition; - info.wAttributes = linfo.wAttributes; - } - else - { - memset (&info, 0, sizeof info); - info.dwWinSize.Y = 25; - info.dwWinSize.X = 80; - info.winBottom = 24; - } - - return ret; -} - -void -fhandler_console::scroll_screen (int x1, int y1, int x2, int y2, int xn, int yn) -{ - SMALL_RECT sr1, sr2; - CHAR_INFO fill; - COORD dest; - - dev_state->fillin_info (get_output_handle ()); - sr1.Left = x1 >= 0 ? x1 : dev_state->info.dwWinSize.X - 1; - if (y1 == 0) - sr1.Top = dev_state->info.winTop; - else - sr1.Top = y1 > 0 ? y1 : dev_state->info.winBottom; - sr1.Right = x2 >= 0 ? x2 : dev_state->info.dwWinSize.X - 1; - if (y2 == 0) - sr1.Bottom = dev_state->info.winTop; - else - sr1.Bottom = y2 > 0 ? y2 : dev_state->info.winBottom; - sr2.Top = srTop; - sr2.Left = 0; - sr2.Bottom = srBottom; - sr2.Right = dev_state->info.dwWinSize.X - 1; - if (sr1.Bottom > sr2.Bottom && sr1.Top <= sr2.Bottom) - sr1.Bottom = sr2.Bottom; - dest.X = xn >= 0 ? xn : dev_state->info.dwWinSize.X - 1; - if (yn == 0) - dest.Y = dev_state->info.winTop; - else - dest.Y = yn > 0 ? yn : dev_state->info.winBottom; - fill.Char.AsciiChar = ' '; - fill.Attributes = dev_state->current_win32_attr; - ScrollConsoleScreenBuffer (get_output_handle (), &sr1, &sr2, dest, &fill); - - /* ScrollConsoleScreenBuffer on Windows 95 is buggy - when scroll distance - * is more than half of screen, filling doesn't work as expected */ - - if (sr1.Top != sr1.Bottom) - if (dest.Y <= sr1.Top) /* forward scroll */ - clear_screen (0, 1 + dest.Y + sr1.Bottom - sr1.Top, sr2.Right, sr2.Bottom); - else /* reverse scroll */ - clear_screen (0, sr1.Top, sr2.Right, dest.Y - 1); -} - -int -fhandler_console::open (int flags, mode_t) -{ - HANDLE h; - - tcinit (get_tty_stuff (flags)); - - set_io_handle (NULL); - set_output_handle (NULL); - - set_flags ((flags & ~O_TEXT) | O_BINARY); - - /* Open the input handle as handle_ */ - h = CreateFile ("CONIN$", GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, &sec_none, - OPEN_EXISTING, 0, 0); - - if (h == INVALID_HANDLE_VALUE) - { - __seterrno (); - return 0; - } - set_io_handle (h); - uninterruptible_io (true); // Handled explicitly in read code - - h = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, &sec_none, - OPEN_EXISTING, 0, 0); - - if (h == INVALID_HANDLE_VALUE) - { - __seterrno (); - return 0; - } - set_output_handle (h); - - if (dev_state->fillin_info (get_output_handle ())) - { - dev_state->current_win32_attr = dev_state->info.wAttributes; - if (!dev_state->default_color) - dev_state->default_color = dev_state->info.wAttributes; - dev_state->set_default_attr (); - } - - DWORD cflags; - if (GetConsoleMode (get_io_handle (), &cflags)) - { - cflags |= ENABLE_PROCESSED_INPUT; - SetConsoleMode (get_io_handle (), ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | cflags); - } - - tc->rstcons (false); - set_open_status (); - cygheap->manage_console_count ("fhandler_console::open", 1); - debug_printf ("opened conin$ %p, conout$ %p", get_io_handle (), - get_output_handle ()); - - return 1; -} - -int -fhandler_console::close () -{ - CloseHandle (get_io_handle ()); - CloseHandle (get_output_handle ()); - if (!hExeced) - cygheap->manage_console_count ("fhandler_console::close", -1); - return 0; -} - -/* Special console dup to duplicate input and output handles. */ - -int -fhandler_console::dup (fhandler_base *child) -{ - fhandler_console *fhc = (fhandler_console *) child; - - if (!fhc->open (get_flags () & ~O_NOCTTY, 0)) - system_printf ("error opening console, %E"); - - return 0; -} - -int -fhandler_console::ioctl (unsigned int cmd, void *buf) -{ - switch (cmd) - { - case TIOCGWINSZ: - int st; - - st = dev_state->fillin_info (get_output_handle ()); - if (st) - { - /* *not* the buffer size, the actual screen size... */ - /* based on Left Top Right Bottom of srWindow */ - ((struct winsize *) buf)->ws_row = dev_state->info.dwWinSize.Y; - ((struct winsize *) buf)->ws_col = dev_state->info.dwWinSize.X; - syscall_printf ("WINSZ: (row=%d,col=%d)", - ((struct winsize *) buf)->ws_row, - ((struct winsize *) buf)->ws_col); - return 0; - } - else - { - syscall_printf ("WINSZ failed"); - __seterrno (); - return -1; - } - return 0; - case TIOCSWINSZ: - bg_check (SIGTTOU); - return 0; - case TIOCLINUX: - if (* (int *) buf == 6) - { - * (int *) buf = dev_state->nModifiers; - return 0; - } - else - { - set_errno (EINVAL); - return -1; - } - } - - return fhandler_base::ioctl (cmd, buf); -} - -int -fhandler_console::tcflush (int queue) -{ - int res = 0; - if (queue == TCIFLUSH - || queue == TCIOFLUSH) - { - if (!FlushConsoleInputBuffer (get_io_handle ())) - { - __seterrno (); - res = -1; - } - } - return res; -} - -int -fhandler_console::output_tcsetattr (int, struct termios const *t) -{ - /* All the output bits we can ignore */ - - DWORD flags = ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT; - - int res = SetConsoleMode (get_output_handle (), flags) ? 0 : -1; - syscall_printf ("%d = tcsetattr (,%x) (ENABLE FLAGS %x) (lflag %x oflag %x)", - res, t, flags, t->c_lflag, t->c_oflag); - return res; -} - -int -fhandler_console::input_tcsetattr (int, struct termios const *t) -{ - /* Ignore the optional_actions stuff, since all output is emitted - instantly */ - - DWORD oflags; - - if (!GetConsoleMode (get_io_handle (), &oflags)) - oflags = 0; - DWORD flags = 0; - -#if 0 - /* Enable/disable LF -> CRLF conversions */ - rbinary ((t->c_iflag & INLCR) ? false : true); -#endif - - /* There's some disparity between what we need and what's - available. We've got ECHO and ICANON, they've - got ENABLE_ECHO_INPUT and ENABLE_LINE_INPUT. */ - - tc->ti = *t; - - if (t->c_lflag & ECHO) - { - flags |= ENABLE_ECHO_INPUT; - } - if (t->c_lflag & ICANON) - { - flags |= ENABLE_LINE_INPUT; - } - - if (flags & ENABLE_ECHO_INPUT - && !(flags & ENABLE_LINE_INPUT)) - { - /* This is illegal, so turn off the echo here, and fake it - when we read the characters */ - - flags &= ~ENABLE_ECHO_INPUT; - } - - if (t->c_lflag & ISIG) - { - flags |= ENABLE_PROCESSED_INPUT; - } - - if (use_tty) - { - flags = 0; // ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT; - tc->ti.c_iflag = 0; - tc->ti.c_lflag = 0; - } - - flags |= ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; - - int res; - if (flags == oflags) - res = 0; - else - { - res = SetConsoleMode (get_io_handle (), flags) ? 0 : -1; - if (res < 0) - __seterrno (); - syscall_printf ("%d = tcsetattr (,%x) enable flags %p, c_lflag %p iflag %p", - res, t, flags, t->c_lflag, t->c_iflag); - } - - tc->rstcons (false); - return res; -} - -int -fhandler_console::tcsetattr (int a, struct termios const *t) -{ - int res = output_tcsetattr (a, t); - if (res != 0) - return res; - return input_tcsetattr (a, t); -} - -int -fhandler_console::tcgetattr (struct termios *t) -{ - int res; - *t = tc->ti; - - t->c_cflag |= CS8; - - DWORD flags; - - if (!GetConsoleMode (get_io_handle (), &flags)) - { - __seterrno (); - res = -1; - } - else - { - if (flags & ENABLE_ECHO_INPUT) - t->c_lflag |= ECHO; - - if (flags & ENABLE_LINE_INPUT) - t->c_lflag |= ICANON; - - if (flags & ENABLE_PROCESSED_INPUT) - t->c_lflag |= ISIG; - - /* What about ENABLE_WINDOW_INPUT - and ENABLE_MOUSE_INPUT ? */ - - /* All the output bits we can ignore */ - res = 0; - } - syscall_printf ("%d = tcgetattr (%p) enable flags %p, t->lflag %p, t->iflag %p", - res, t, flags, t->c_lflag, t->c_iflag); - return res; -} - -fhandler_console::fhandler_console () : - fhandler_termios () -{ -} -void -dev_console::set_color (HANDLE h) -{ - WORD win_fg = fg; - WORD win_bg = bg; - if (reverse) - { - WORD save_fg = win_fg; - win_fg = (win_bg & BACKGROUND_RED ? FOREGROUND_RED : 0) | - (win_bg & BACKGROUND_GREEN ? FOREGROUND_GREEN : 0) | - (win_bg & BACKGROUND_BLUE ? FOREGROUND_BLUE : 0) | - (win_bg & BACKGROUND_INTENSITY ? FOREGROUND_INTENSITY : 0); - win_bg = (save_fg & FOREGROUND_RED ? BACKGROUND_RED : 0) | - (save_fg & FOREGROUND_GREEN ? BACKGROUND_GREEN : 0) | - (save_fg & FOREGROUND_BLUE ? BACKGROUND_BLUE : 0) | - (save_fg & FOREGROUND_INTENSITY ? BACKGROUND_INTENSITY : 0); - } - if (underline) - win_fg = underline_color; - /* emulate blink with bright background */ - if (blink) - win_bg |= BACKGROUND_INTENSITY; - if (intensity == INTENSITY_INVISIBLE) - win_fg = win_bg; - else if (intensity == INTENSITY_BOLD) - win_fg |= FOREGROUND_INTENSITY; - current_win32_attr = win_fg | win_bg; - if (h) - SetConsoleTextAttribute (h, current_win32_attr); -} - -#define FOREGROUND_ATTR_MASK (FOREGROUND_RED | FOREGROUND_GREEN | \ - FOREGROUND_BLUE | FOREGROUND_INTENSITY) -#define BACKGROUND_ATTR_MASK (BACKGROUND_RED | BACKGROUND_GREEN | \ - BACKGROUND_BLUE | BACKGROUND_INTENSITY) -void -dev_console::set_default_attr () -{ - blink = underline = reverse = false; - intensity = INTENSITY_NORMAL; - fg = default_color & FOREGROUND_ATTR_MASK; - bg = default_color & BACKGROUND_ATTR_MASK; - set_color (NULL); -} - -/* - * Clear the screen context from x1/y1 to x2/y2 cell. - * Negative values represents current screen dimensions - */ -void -fhandler_console::clear_screen (int x1, int y1, int x2, int y2) -{ - COORD tlc; - DWORD done; - int num; - - dev_state->fillin_info (get_output_handle ()); - - if (x1 < 0) - x1 = dev_state->info.dwWinSize.X - 1; - if (y1 < 0) - y1 = dev_state->info.winBottom; - if (x2 < 0) - x2 = dev_state->info.dwWinSize.X - 1; - if (y2 < 0) - y2 = dev_state->info.winBottom; - - num = abs (y1 - y2) * dev_state->info.dwBufferSize.X + abs (x1 - x2) + 1; - - if ((y2 * dev_state->info.dwBufferSize.X + x2) > (y1 * dev_state->info.dwBufferSize.X + x1)) - { - tlc.X = x1; - tlc.Y = y1; - } - else - { - tlc.X = x2; - tlc.Y = y2; - } - FillConsoleOutputCharacterA (get_output_handle (), ' ', - num, - tlc, - &done); - FillConsoleOutputAttribute (get_output_handle (), - dev_state->current_win32_attr, - num, - tlc, - &done); -} - -void -fhandler_console::cursor_set (bool rel_to_top, int x, int y) -{ - COORD pos; - - dev_state->fillin_info (get_output_handle ()); - if (y > dev_state->info.winBottom) - y = dev_state->info.winBottom; - else if (y < 0) - y = 0; - else if (rel_to_top) - y += dev_state->info.winTop; - - if (x > dev_state->info.dwWinSize.X) - x = dev_state->info.dwWinSize.X - 1; - else if (x < 0) - x = 0; - - pos.X = x; - pos.Y = y; - SetConsoleCursorPosition (get_output_handle (), pos); -} - -void -fhandler_console::cursor_rel (int x, int y) -{ - dev_state->fillin_info (get_output_handle ()); - x += dev_state->info.dwCursorPosition.X; - y += dev_state->info.dwCursorPosition.Y; - cursor_set (false, x, y); -} - -void -fhandler_console::cursor_get (int *x, int *y) -{ - dev_state->fillin_info (get_output_handle ()); - *y = dev_state->info.dwCursorPosition.Y; - *x = dev_state->info.dwCursorPosition.X; -} - -#define BAK 1 -#define ESC 2 -#define NOR 0 -#define IGN 4 -#if 0 -#define ERR 5 -#else -#define ERR NOR -#endif -#define DWN 6 -#define BEL 7 -#define TAB 8 /* We should't let the console deal with these */ -#define CR 13 -#define LF 10 - -static const char base_chars[256] = -{ -/*00 01 02 03 04 05 06 07 */ IGN, ERR, ERR, NOR, NOR, NOR, NOR, BEL, -/*08 09 0A 0B 0C 0D 0E 0F */ BAK, TAB, DWN, ERR, ERR, CR, ERR, IGN, -/*10 11 12 13 14 15 16 17 */ NOR, NOR, ERR, ERR, ERR, ERR, ERR, ERR, -/*18 19 1A 1B 1C 1D 1E 1F */ NOR, NOR, ERR, ESC, ERR, ERR, ERR, ERR, -/* ! " # $ % & ' */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*() * + , - . / */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*0 1 2 3 4 5 6 7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*8 9 : ; < = > ? */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*@ A B C D E F G */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*H I J K L M N O */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*P Q R S T U V W */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*X Y Z [ \ ] ^ _ */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*` a b c d e f g */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*h i j k l m n o */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*p q r s t u v w */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*x y z { | } ~ 7F */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*80 81 82 83 84 85 86 87 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*88 89 8A 8B 8C 8D 8E 8F */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*90 91 92 93 94 95 96 97 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*98 99 9A 9B 9C 9D 9E 9F */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*A0 A1 A2 A3 A4 A5 A6 A7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*A8 A9 AA AB AC AD AE AF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*B0 B1 B2 B3 B4 B5 B6 B7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*B8 B9 BA BB BC BD BE BF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*C0 C1 C2 C3 C4 C5 C6 C7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*C8 C9 CA CB CC CD CE CF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*D0 D1 D2 D3 D4 D5 D6 D7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*D8 D9 DA DB DC DD DE DF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*E0 E1 E2 E3 E4 E5 E6 E7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*E8 E9 EA EB EC ED EE EF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*F0 F1 F2 F3 F4 F5 F6 F7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR, -/*F8 F9 FA FB FC FD FE FF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR }; - -void -fhandler_console::char_command (char c) -{ - int x, y; - char buf[40]; - - switch (c) - { - case 'm': /* Set Graphics Rendition */ - for (int i = 0; i <= dev_state->nargs_; i++) - switch (dev_state->args_[i]) - { - case 0: /* normal color */ - dev_state->set_default_attr (); - break; - case 1: /* bold */ - dev_state->intensity = INTENSITY_BOLD; - break; - case 4: - dev_state->underline = 1; - break; - case 5: /* blink mode */ - dev_state->blink = true; - break; - case 7: /* reverse */ - dev_state->reverse = true; - break; - case 8: /* invisible */ - dev_state->intensity = INTENSITY_INVISIBLE; - break; - case 9: /* dim */ - dev_state->intensity = INTENSITY_DIM; - break; - case 10: /* end alternate charset */ - dev_state->alternate_charset_active = false; - break; - case 11: /* start alternate charset */ - dev_state->alternate_charset_active = true; - break; - case 24: - dev_state->underline = false; - break; - case 27: - dev_state->reverse = false; - break; - case 30: /* BLACK foreground */ - dev_state->fg = 0; - break; - case 31: /* RED foreground */ - dev_state->fg = FOREGROUND_RED; - break; - case 32: /* GREEN foreground */ - dev_state->fg = FOREGROUND_GREEN; - break; - case 33: /* YELLOW foreground */ - dev_state->fg = FOREGROUND_RED | FOREGROUND_GREEN; - break; - case 34: /* BLUE foreground */ - dev_state->fg = FOREGROUND_BLUE; - break; - case 35: /* MAGENTA foreground */ - dev_state->fg = FOREGROUND_RED | FOREGROUND_BLUE; - break; - case 36: /* CYAN foreground */ - dev_state->fg = FOREGROUND_BLUE | FOREGROUND_GREEN; - break; - case 37: /* WHITE foreg */ - dev_state->fg = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; - break; - case 39: - dev_state->fg = dev_state->default_color & FOREGROUND_ATTR_MASK; - break; - case 40: /* BLACK background */ - dev_state->bg = 0; - break; - case 41: /* RED background */ - dev_state->bg = BACKGROUND_RED; - break; - case 42: /* GREEN background */ - dev_state->bg = BACKGROUND_GREEN; - break; - case 43: /* YELLOW background */ - dev_state->bg = BACKGROUND_RED | BACKGROUND_GREEN; - break; - case 44: /* BLUE background */ - dev_state->bg = BACKGROUND_BLUE; - break; - case 45: /* MAGENTA background */ - dev_state->bg = BACKGROUND_RED | BACKGROUND_BLUE; - break; - case 46: /* CYAN background */ - dev_state->bg = BACKGROUND_BLUE | BACKGROUND_GREEN; - break; - case 47: /* WHITE background */ - dev_state->bg = BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED; - break; - case 49: - dev_state->bg = dev_state->default_color & BACKGROUND_ATTR_MASK; - break; - } - dev_state->set_color (get_output_handle ()); - break; - case 'h': - case 'l': - if (!dev_state->saw_question_mark) - { - switch (dev_state->args_[0]) - { - case 4: /* Insert mode */ - dev_state->insert_mode = (c == 'h') ? true : false; - syscall_printf ("insert mode %sabled", dev_state->insert_mode ? "en" : "dis"); - break; - } - break; - } - switch (dev_state->args_[0]) - { - case 47: /* Save/Restore screen */ - if (c == 'h') /* save */ - { - CONSOLE_SCREEN_BUFFER_INFO now; - COORD cob = { 0, 0 }; - - if (!GetConsoleScreenBufferInfo (get_output_handle (), &now)) - break; - - dev_state->savebufsiz.X = now.srWindow.Right - now.srWindow.Left + 1; - dev_state->savebufsiz.Y = now.srWindow.Bottom - now.srWindow.Top + 1; - - if (dev_state->savebuf) - cfree (dev_state->savebuf); - dev_state->savebuf = (PCHAR_INFO) cmalloc (HEAP_1_BUF, sizeof (CHAR_INFO) * - dev_state->savebufsiz.X * dev_state->savebufsiz.Y); - - ReadConsoleOutputA (get_output_handle (), dev_state->savebuf, - dev_state->savebufsiz, cob, &now.srWindow); - } - else /* restore */ - { - CONSOLE_SCREEN_BUFFER_INFO now; - COORD cob = { 0, 0 }; - - if (!GetConsoleScreenBufferInfo (get_output_handle (), &now)) - break; - - if (!dev_state->savebuf) - break; - - WriteConsoleOutputA (get_output_handle (), dev_state->savebuf, - dev_state->savebufsiz, cob, &now.srWindow); - - cfree (dev_state->savebuf); - dev_state->savebuf = NULL; - dev_state->savebufsiz.X = dev_state->savebufsiz.Y = 0; - } - break; - - case 1000: /* Mouse support */ - dev_state->use_mouse = (c == 'h') ? true : false; - syscall_printf ("mouse support %sabled", dev_state->use_mouse ? "en" : "dis"); - break; - - case 2000: /* Raw keyboard mode */ - set_raw_win32_keyboard_mode ((c == 'h') ? true : false); - break; - - default: /* Ignore */ - syscall_printf ("unknown h/l command: %d", dev_state->args_[0]); - break; - } - break; - case 'J': - switch (dev_state->args_[0]) - { - case 0: /* Clear to end of screen */ - cursor_get (&x, &y); - clear_screen (x, y, -1, -1); - break; - case 1: /* Clear from beginning of screen to cursor */ - cursor_get (&x, &y); - clear_screen (0, 0, x, y); - break; - case 2: /* Clear screen */ - clear_screen (0, 0, -1, -1); - cursor_set (true, 0,0); - break; - default: - goto bad_escape; - } - break; - - case 'A': - cursor_rel (0, -(dev_state->args_[0] ? dev_state->args_[0] : 1)); - break; - case 'B': - cursor_rel (0, dev_state->args_[0] ? dev_state->args_[0] : 1); - break; - case 'C': - cursor_rel (dev_state->args_[0] ? dev_state->args_[0] : 1, 0); - break; - case 'D': - cursor_rel (-(dev_state->args_[0] ? dev_state->args_[0] : 1),0); - break; - case 'K': - switch (dev_state->args_[0]) - { - case 0: /* Clear to end of line */ - cursor_get (&x, &y); - clear_screen (x, y, -1, y); - break; - case 2: /* Clear line */ - cursor_get (&x, &y); - clear_screen (0, y, -1, y); - break; - case 1: /* Clear from bol to cursor */ - cursor_get (&x, &y); - clear_screen (0, y, x, y); - break; - default: - goto bad_escape; - } - break; - case 'H': - case 'f': - cursor_set (true, (dev_state->args_[1] ? dev_state->args_[1] : 1) - 1, - (dev_state->args_[0] ? dev_state->args_[0] : 1) - 1); - break; - case 'G': /* hpa - position cursor at column n - 1 */ - cursor_get (&x, &y); - cursor_set (false, (dev_state->args_[0] ? dev_state->args_[0] - 1 : 0), y); - break; - case 'd': /* vpa - position cursor at line n */ - cursor_get (&x, &y); - cursor_set (true, x, (dev_state->args_[0] ? dev_state->args_[0] - 1 : 0)); - break; - case 's': /* Save cursor position */ - cursor_get (&dev_state->savex, &dev_state->savey); - dev_state->savey -= dev_state->info.winTop; - break; - case 'u': /* Restore cursor position */ - cursor_set (true, dev_state->savex, dev_state->savey); - break; - case 'I': /* TAB */ - cursor_get (&x, &y); - cursor_set (false, 8 * (x / 8 + 1), y); - break; - case 'L': /* AL - insert blank lines */ - dev_state->args_[0] = dev_state->args_[0] ? dev_state->args_[0] : 1; - cursor_get (&x, &y); - scroll_screen (0, y, -1, -1, 0, y + dev_state->args_[0]); - break; - case 'M': /* DL - delete lines */ - dev_state->args_[0] = dev_state->args_[0] ? dev_state->args_[0] : 1; - cursor_get (&x, &y); - scroll_screen (0, y + dev_state->args_[0], -1, -1, 0, y); - break; - case '@': /* IC - insert chars */ - dev_state->args_[0] = dev_state->args_[0] ? dev_state->args_[0] : 1; - cursor_get (&x, &y); - scroll_screen (x, y, -1, y, x + dev_state->args_[0], y); - break; - case 'P': /* DC - delete chars */ - dev_state->args_[0] = dev_state->args_[0] ? dev_state->args_[0] : 1; - cursor_get (&x, &y); - scroll_screen (x + dev_state->args_[0], y, -1, y, x, y); - break; - case 'S': /* SF - Scroll forward */ - dev_state->args_[0] = dev_state->args_[0] ? dev_state->args_[0] : 1; - scroll_screen (0, dev_state->args_[0], -1, -1, 0, 0); - break; - case 'T': /* SR - Scroll down */ - dev_state->fillin_info (get_output_handle ()); - dev_state->args_[0] = dev_state->args_[0] ? dev_state->args_[0] : 1; - scroll_screen (0, 0, -1, -1, 0, dev_state->info.winTop + dev_state->args_[0]); - break; - case 'X': /* ec - erase chars */ - dev_state->args_[0] = dev_state->args_[0] ? dev_state->args_[0] : 1; - cursor_get (&x, &y); - scroll_screen (x + dev_state->args_[0], y, -1, y, x, y); - scroll_screen (x, y, -1, y, x + dev_state->args_[0], y); - break; - case 'Z': /* Back tab */ - cursor_get (&x, &y); - cursor_set (false, ((8 * (x / 8 + 1)) - 8), y); - break; - case 'b': /* Repeat char #1 #2 times */ - if (dev_state->insert_mode) - { - cursor_get (&x, &y); - scroll_screen (x, y, -1, y, x + dev_state->args_[1], y); - } - while (dev_state->args_[1]--) - WriteFile (get_output_handle (), &dev_state->args_[0], 1, (DWORD *) &x, 0); - break; - case 'c': /* u9 - Terminal enquire string */ - strcpy (buf, "\033[?6c"); - puts_readahead (buf); - break; - case 'n': - switch (dev_state->args_[0]) - { - case 6: /* u7 - Cursor position request */ - cursor_get (&x, &y); - y -= dev_state->info.winTop; - /* x -= dev_state->info.winLeft; // not available yet */ - __small_sprintf (buf, "\033[%d;%dR", y + 1, x + 1); - puts_readahead (buf); - break; - default: - goto bad_escape; - } - break; - case 'r': /* Set Scroll region */ - dev_state->scroll_region.Top = dev_state->args_[0] ? dev_state->args_[0] - 1 : 0; - dev_state->scroll_region.Bottom = dev_state->args_[1] ? dev_state->args_[1] - 1 : -1; - cursor_set (true, 0, 0); - break; - case 'g': /* TAB set/clear */ - break; - default: -bad_escape: - break; - } -} - -static void -beep () -{ - reg_key r (HKEY_CURRENT_USER, KEY_ALL_ACCESS, "AppEvents", "Schemes", "Apps", - ".Default", ".Default", ".Current", NULL); - if (r.created ()) - { - char *buf = NULL; - UINT len = GetWindowsDirectory (buf, 0); - buf = (char *) alloca (len += sizeof ("\\media\\ding.wav")); - UINT res = GetWindowsDirectory (buf, len); - if (res && res <= len) - r.set_string ("", strcat (buf, "\\media\\ding.wav")); - } - MessageBeep (MB_OK); -} - -const unsigned char * -fhandler_console::write_normal (const unsigned char *src, - const unsigned char *end) -{ - /* Scan forward to see what a char which needs special treatment */ - DWORD done; - const unsigned char *found = src; - - while (found < end) - { - char ch = base_chars[*found]; - if (ch != NOR) - break; - found++; - } - - /* Print all the base ones out */ - if (found != src) - { - DWORD len = found - src; - do - { - DWORD buf_len; - char buf[CONVERT_LIMIT]; - done = buf_len = min (sizeof (buf), len); - if (!dev_state->str_to_con (buf, (const char *) src, buf_len)) - { - debug_printf ("conversion error, handle %p", - get_output_handle ()); - __seterrno (); - return 0; - } - - if (dev_state->insert_mode) - { - int x, y; - cursor_get (&x, &y); - scroll_screen (x, y, -1, y, x + buf_len, y); - } - - if (!WriteFile (get_output_handle (), buf, buf_len, &done, 0)) - { - debug_printf ("write failed, handle %p", get_output_handle ()); - __seterrno (); - return 0; - } - len -= done; - src += done; - } - while (len > 0); - } - - if (src < end) - { - int x, y; - switch (base_chars[*src]) - { - case BEL: - beep (); - break; - case ESC: - dev_state->state_ = gotesc; - break; - case DWN: - cursor_get (&x, &y); - if (y >= srBottom) - { - if (y >= dev_state->info.winBottom && !dev_state->scroll_region.Top) - WriteFile (get_output_handle (), "\n", 1, &done, 0); - else - { - scroll_screen (0, srTop + 1, -1, srBottom, 0, srTop); - y--; - } - } - cursor_set (false, ((tc->ti.c_oflag & ONLCR) ? 0 : x), y + 1); - break; - case BAK: - cursor_rel (-1, 0); - break; - case IGN: - cursor_rel (1, 0); - break; - case CR: - cursor_get (&x, &y); - cursor_set (false, 0, y); - break; - case ERR: - WriteFile (get_output_handle (), src, 1, &done, 0); - break; - case TAB: - cursor_get (&x, &y); - cursor_set (false, 8 * (x / 8 + 1), y); - break; - } - src ++; - } - return src; -} - -int -fhandler_console::write (const void *vsrc, size_t len) -{ - /* Run and check for ansi sequences */ - unsigned const char *src = (unsigned char *) vsrc; - unsigned const char *end = src + len; - - debug_printf ("%x, %d", vsrc, len); - - while (src < end) - { - debug_printf ("at %d(%c) state is %d", *src, isprint (*src) ? *src : ' ', - dev_state->state_); - switch (dev_state->state_) - { - case normal: - src = write_normal (src, end); - if (!src) /* write_normal failed */ - return -1; - break; - case gotesc: - if (*src == '[') - { - dev_state->state_ = gotsquare; - dev_state->saw_question_mark = false; - for (dev_state->nargs_ = 0; dev_state->nargs_ < MAXARGS; dev_state->nargs_++) - dev_state->args_[dev_state->nargs_] = 0; - dev_state->nargs_ = 0; - } - else if (*src == ']') - { - dev_state->rarg = 0; - dev_state->my_title_buf[0] = '\0'; - dev_state->state_ = gotrsquare; - } - else if (*src == 'M') /* Reverse Index */ - { - dev_state->fillin_info (get_output_handle ()); - scroll_screen (0, 0, -1, -1, 0, dev_state->info.winTop + 1); - dev_state->state_ = normal; - } - else if (*src == 'c') /* Reset Linux terminal */ - { - dev_state->set_default_attr (); - clear_screen (0, 0, -1, -1); - cursor_set (true, 0, 0); - dev_state->state_ = normal; - } - else if (*src == '8') /* Restore cursor position */ - { - cursor_set (true, dev_state->savex, dev_state->savey); - dev_state->state_ = normal; - } - else if (*src == '7') /* Save cursor position */ - { - cursor_get (&dev_state->savex, &dev_state->savey); - dev_state->savey -= dev_state->info.winTop; - dev_state->state_ = normal; - } - else if (*src == 'R') - dev_state->state_ = normal; - else - { - dev_state->state_ = normal; - } - src++; - break; - case gotarg1: - if (isdigit (*src)) - { - dev_state->args_[dev_state->nargs_] = dev_state->args_[dev_state->nargs_] * 10 + *src - '0'; - src++; - } - else if (*src == ';') - { - src++; - dev_state->nargs_++; - if (dev_state->nargs_ >= MAXARGS) - dev_state->nargs_--; - } - else - { - dev_state->state_ = gotcommand; - } - break; - case gotcommand: - char_command (*src++); - dev_state->state_ = normal; - break; - case gotrsquare: - if (isdigit (*src)) - dev_state->rarg = dev_state->rarg * 10 + (*src - '0'); - else if (*src == ';' && (dev_state->rarg == 2 || dev_state->rarg == 0)) - dev_state->state_ = gettitle; - else - dev_state->state_ = eattitle; - src++; - break; - case eattitle: - case gettitle: - { - int n = strlen (dev_state->my_title_buf); - if (*src < ' ') - { - if (*src == '\007' && dev_state->state_ == gettitle) - { - if (old_title) - strcpy (old_title, dev_state->my_title_buf); - set_console_title (dev_state->my_title_buf); - } - dev_state->state_ = normal; - } - else if (n < TITLESIZE) - { - dev_state->my_title_buf[n++] = *src; - dev_state->my_title_buf[n] = '\0'; - } - src++; - break; - } - case gotsquare: - if (*src == ';') - { - dev_state->state_ = gotarg1; - dev_state->nargs_++; - src++; - } - else if (isalpha (*src)) - dev_state->state_ = gotcommand; - else if (*src != '@' && !isalpha (*src) && !isdigit (*src)) - { - if (*src == '?') - dev_state->saw_question_mark = true; - /* ignore any extra chars between [ and first arg or command */ - src++; - } - else - dev_state->state_ = gotarg1; - break; - } - } - - syscall_printf ("%d = write_console (,..%d)", len, len); - - return len; -} - -static struct { - int vk; - const char *val[4]; -} keytable[] NO_COPY = { - /* NORMAL */ /* SHIFT */ /* CTRL */ /* ALT */ - {VK_LEFT, {"\033[D", "\033[D", "\033[D", "\033\033[D"}}, - {VK_RIGHT, {"\033[C", "\033[C", "\033[C", "\033\033[C"}}, - {VK_UP, {"\033[A", "\033[A", "\033[A", "\033\033[A"}}, - {VK_DOWN, {"\033[B", "\033[B", "\033[B", "\033\033[B"}}, - {VK_PRIOR, {"\033[5~", "\033[5~", "\033[5~", "\033\033[5~"}}, - {VK_NEXT, {"\033[6~", "\033[6~", "\033[6~", "\033\033[6~"}}, - {VK_HOME, {"\033[1~", "\033[1~", "\033[1~", "\033\033[1~"}}, - {VK_END, {"\033[4~", "\033[4~", "\033[4~", "\033\033[4~"}}, - {VK_INSERT, {"\033[2~", "\033[2~", "\033[2~", "\033\033[2~"}}, - {VK_DELETE, {"\033[3~", "\033[3~", "\033[3~", "\033\033[3~"}}, - {VK_F1, {"\033[[A", "\033[23~", NULL, NULL}}, - {VK_F2, {"\033[[B", "\033[24~", NULL, NULL}}, - {VK_F3, {"\033[[C", "\033[25~", NULL, NULL}}, - {VK_F4, {"\033[[D", "\033[26~", NULL, NULL}}, - {VK_F5, {"\033[[E", "\033[28~", NULL, NULL}}, - {VK_F6, {"\033[17~", "\033[29~", "\036", NULL}}, - {VK_F7, {"\033[18~", "\033[31~", NULL, NULL}}, - {VK_F8, {"\033[19~", "\033[32~", NULL, NULL}}, - {VK_F9, {"\033[20~", "\033[33~", NULL, NULL}}, - {VK_F10, {"\033[21~", "\033[34~", NULL, NULL}}, - {VK_F11, {"\033[23~", NULL, NULL, NULL}}, - {VK_F12, {"\033[24~", NULL, NULL, NULL}}, - {VK_NUMPAD5, {"\033[G", NULL, NULL, NULL}}, - {VK_CLEAR, {"\033[G", NULL, NULL, NULL}}, - {'6', {NULL, NULL, "\036", NULL}}, - {0, {"", NULL, NULL, NULL}} -}; - -const char * -get_nonascii_key (INPUT_RECORD& input_rec, char *tmp) -{ -#define NORMAL 0 -#define SHIFT 1 -#define CONTROL 2 -#define ALT 3 - int modifier_index = NORMAL; - - if (input_rec.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED) - modifier_index = SHIFT; - else if (input_rec.Event.KeyEvent.dwControlKeyState & - (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) - modifier_index = CONTROL; - else if (input_rec.Event.KeyEvent.dwControlKeyState & - (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) - modifier_index = ALT; - - for (int i = 0; keytable[i].vk; i++) - if (input_rec.Event.KeyEvent.wVirtualKeyCode == keytable[i].vk) - return keytable[i].val[modifier_index]; - - if (input_rec.Event.KeyEvent.uChar.AsciiChar) - { - tmp[0] = input_rec.Event.KeyEvent.uChar.AsciiChar; - tmp[1] = '\0'; - return tmp; - } - return NULL; -} - -void -fhandler_console::init (HANDLE f, DWORD a, mode_t bin) -{ - // this->fhandler_termios::init (f, mode, bin); - /* Ensure both input and output console handles are open */ - int flags = 0; - - a &= GENERIC_READ | GENERIC_WRITE; - if (a == GENERIC_READ) - flags = O_RDONLY; - if (a == GENERIC_WRITE) - flags = O_WRONLY; - if (a == (GENERIC_READ | GENERIC_WRITE)) - flags = O_RDWR; - open (flags | O_BINARY); - if (f != INVALID_HANDLE_VALUE) - CloseHandle (f); /* Reopened by open */ - - tcsetattr (0, &tc->ti); -} - -int -fhandler_console::igncr_enabled () -{ - return tc->ti.c_iflag & IGNCR; -} - -void -fhandler_console::set_close_on_exec (bool val) -{ - fhandler_base::set_close_on_exec (val); - set_no_inheritance (output_handle, val); -} - -void __stdcall -set_console_title (char *title) -{ - int rc; - char buf[257]; - strncpy (buf, title, sizeof (buf) - 1); - buf[sizeof (buf) - 1] = '\0'; - if ((rc = WaitForSingleObject (tty_mutex, 15000)) != WAIT_OBJECT_0) - sigproc_printf ("wait for title mutex failed rc %d, %E", rc); - SetConsoleTitle (buf); - ReleaseMutex (tty_mutex); - debug_printf ("title '%s'", buf); -} - -void -fhandler_console::fixup_after_fork_exec (bool execing) -{ - HANDLE h = get_handle (); - HANDLE oh = get_output_handle (); - - if ((execing && close_on_exec ()) || open (O_NOCTTY | get_flags (), 0)) - cygheap->manage_console_count ("fhandler_console::fixup_after_fork_exec", -1); - else - { - bool sawerr = false; - if (!get_io_handle ()) - { - system_printf ("error opening input console handle after fork/exec, errno %d, %E", get_errno ()); - sawerr = true; - } - if (!get_output_handle ()) - { - system_printf ("error opening output console handle after fork/exec, errno %d, %E", get_errno ()); - sawerr = true; - } - - if (!sawerr) - system_printf ("error opening console after fork/exec, errno %d, %E", get_errno ()); - } - - if (!close_on_exec ()) - { - CloseHandle (h); - CloseHandle (oh); - } -} - -bool NO_COPY fhandler_console::invisible_console; - -// #define WINSTA_ACCESS (WINSTA_READATTRIBUTES | STANDARD_RIGHTS_READ | STANDARD_RIGHTS_WRITE | WINSTA_CREATEDESKTOP | WINSTA_EXITWINDOWS) -#define WINSTA_ACCESS STANDARD_RIGHTS_READ - -bool -fhandler_console::need_invisible () -{ - BOOL b = false; - if (GetConsoleCP () || !wincap.pty_needs_alloc_console ()) - invisible_console = false; - else - { - HWINSTA h, horig; - /* The intent here is to allocate an "invisible" console if we have no - controlling tty or to reuse the existing console if we already have - a tty. So, first get the old windows station. If there is no controlling - terminal, create a new windows station and then set it as the current - windows station. The subsequent AllocConsole will then be allocated - invisibly. But, after doing that we have to restore any existing windows - station or, strangely, characters will not be displayed in any windows - drawn on the current screen. We only do this if we have changed to - a new windows station and if we had an existing windows station previously. - We also close the previously opened work station even though AllocConsole - is now "using" it. This doesn't seem to cause any problems. - - Things to watch out for if you make changes in this code: - - - Flashing, black consoles showing up when you start, e.g., ssh in - an xterm. - - Non-displaying of characters in rxvt or xemacs if you start a - process using setsid: bash -lc "setsid rxvt". */ - - h = horig = GetProcessWindowStation (); - - USEROBJECTFLAGS oi; - DWORD len; - if (!horig - || !GetUserObjectInformation (horig, UOI_FLAGS, &oi, sizeof (oi), &len) - || !(oi.dwFlags & WSF_VISIBLE)) - { - b = true; - debug_printf ("window station is not visible"); - invisible_console = true; - } - else - { - if (myself->ctty == -1) - { - h = CreateWindowStation (NULL, 0, WINSTA_ACCESS, NULL); - termios_printf ("CreateWindowStation(NULL, %p), %E", h); - if (h) - { - b = SetProcessWindowStation (h); - termios_printf ("SetProcessWindowStation %d, %E", b); - } - } - b = AllocConsole (); /* will cause flashing if CreateWorkstation - failed */ - debug_printf ("h %p, horig %p, flags %p", h, horig, oi.dwFlags); - if (horig && h && h != horig && SetProcessWindowStation (horig)) - CloseWindowStation (h); - termios_printf ("%d = AllocConsole (), %E", b); - invisible_console = true; - } - } - - debug_printf ("invisible_console %d", invisible_console); - return b; -} diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc deleted file mode 100644 index 0c1ed37ab..000000000 --- a/winsup/cygwin/fhandler_disk_file.cc +++ /dev/null @@ -1,2034 +0,0 @@ -/* fhandler_disk_file.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "perprocess.h" -#include "security.h" -#include "cygwin/version.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "shared_info.h" -#include "pinfo.h" -#include -#include "ntdll.h" -#include -#include -#include - -#define _COMPILING_NEWLIB -#include - -class __DIR_mounts -{ - int count; - const char *parent_dir; - int parent_dir_len; - char *mounts[MAX_MOUNTS]; - bool found[MAX_MOUNTS + 2]; - -#define __DIR_PROC (MAX_MOUNTS) -#define __DIR_CYGDRIVE (MAX_MOUNTS+1) - - __ino64_t eval_ino (int idx) - { - __ino64_t ino = 0; - char fname[CYG_MAX_PATH]; - struct __stat64 st; - int len = parent_dir_len; - - strcpy (fname, parent_dir); - if (fname[len - 1] != '/') - fname[len++] = '/'; - strcpy (fname + len, mounts[idx]); - if (!lstat64 (fname, &st)) - ino = st.st_ino; - return ino; - } - -public: - __DIR_mounts (const char *posix_path) - : parent_dir (posix_path) - { - parent_dir_len = strlen (parent_dir); - count = mount_table->get_mounts_here (parent_dir, parent_dir_len, mounts); - rewind (); - } - __ino64_t check_mount (const char *name, __ino64_t ino, bool eval = true) - { - if (parent_dir_len == 1) /* root dir */ - { - if (strcasematch (name, "proc")) - { - found[__DIR_PROC] = true; - return hash_path_name (0, "/proc"); - } - if (strlen (name) == mount_table->cygdrive_len - 2 - && strncasematch (name, mount_table->cygdrive + 1, - mount_table->cygdrive_len - 2)) - { - found[__DIR_CYGDRIVE] = true; - return 2; - } - } - for (int i = 0; i < count; ++i) - if (strcasematch (name, mounts[i])) - { - found[i] = true; - return eval ? eval_ino (i) : 1; - } - return ino; - } - __ino64_t check_missing_mount (char *ret_name, bool eval = true) - { - for (int i = 0; i < count; ++i) - if (!found[i]) - { - found[i] = true; - strcpy (ret_name, mounts[i]); - return eval ? eval_ino (i) : 1; - } - if (parent_dir_len == 1) /* root dir */ - { - if (!found[__DIR_PROC]) - { - found[__DIR_PROC] = true; - strcpy (ret_name, "proc"); - return hash_path_name (0, "/proc"); - } - if (!found[__DIR_CYGDRIVE]) - { - found[__DIR_CYGDRIVE] = true; - if (mount_table->cygdrive_len > 1) - { - strncpy (ret_name, mount_table->cygdrive + 1, - mount_table->cygdrive_len - 2); - ret_name[mount_table->cygdrive_len - 2] = '\0'; - return 2; - } - } - } - return 0; - } - void rewind () { memset (found, 0, sizeof found); } -}; - -unsigned __stdcall -path_conv::ndisk_links (DWORD nNumberOfLinks) -{ - if (!isdir () || isremote ()) - return nNumberOfLinks; - - int len = strlen (*this); - char fn[len + 3]; - strcpy (fn, *this); - - const char *s; - unsigned count; - __DIR_mounts *dir = new __DIR_mounts (normalized_path); - if (nNumberOfLinks <= 1) - { - s = "/*"; - count = 0; - } - else - { - s = "/.."; - count = nNumberOfLinks; - } - - if (len == 0 || isdirsep (fn[len - 1])) - strcpy (fn + len, s + 1); - else - strcpy (fn + len, s); - - WIN32_FIND_DATA buf; - HANDLE h = FindFirstFile (fn, &buf); - - int saw_dot = 2; - if (h != INVALID_HANDLE_VALUE) - { - if (nNumberOfLinks > 1) - saw_dot--; - else - do - { - if (buf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - count++; - if (buf.cFileName[0] == '.' - && (buf.cFileName[1] == '\0' - || (buf.cFileName[1] == '.' && buf.cFileName[2] == '\0'))) - saw_dot--; - dir->check_mount (buf.cFileName, 0, false); - } - while (FindNextFileA (h, &buf)); - FindClose (h); - } - - if (nNumberOfLinks > 1) - { - fn[len + 2] = '\0'; - h = FindFirstFile (fn, &buf); - if (h) - saw_dot--; - FindClose (h); - } - while (dir->check_missing_mount (buf.cFileName, false)) - ++count; - - delete dir; - - return count + saw_dot; -} - -#define FS_IS_SAMBA (FILE_CASE_SENSITIVE_SEARCH \ - | FILE_CASE_PRESERVED_NAMES \ - | FILE_PERSISTENT_ACLS) - -bool -path_conv::hasgood_inode () -{ - /* Assume that if a drive has ACL support it MAY have valid "inodes". - It definitely does not have valid inodes if it does not have ACL - support. Decouple from has_acls() which follows smbntsec setting. */ - if (!(fs_flags () & FILE_PERSISTENT_ACLS) || drive_type () == DRIVE_UNKNOWN) - return false; - if (drive_type () == DRIVE_REMOTE) - { - /* From own experiments and replies from the Cygwin mailing list, - we're now trying to figure out how to determine remote file - systems which are capable of returning persistent inode - numbers. It seems that NT4 NTFS, when accessed remotly, and - some other remote file systems return unreliable values in - nFileIndex. The common factor of these unreliable remote FS - seem to be that FILE_SUPPORTS_OBJECT_IDS isn't set, even though - this should have nothing to do with inode numbers. - An exception is Samba, which seems to return valid inode numbers - without having the FILE_SUPPORTS_OBJECT_IDS flag set. So we're - testing for the flag values returned by a 3.x Samba explicitely - for now. But note the comment in the below "is_samba" function. */ - if (!(fs_flags () & FILE_SUPPORTS_OBJECT_IDS) - && fs_flags () != FS_IS_SAMBA) - return false; - } - return true; -} - -bool -path_conv::is_samba () -{ - /* Something weird happens on Samba. FileIdBothDirectoryInformation - seems to work nicely, but only up to the 128th entry in the - directory. After reaching this entry, the next call to - NtQueryDirectoryFile(FileIdBothDirectoryInformation) returns - STATUS_INVAILD_LEVEL. Why should we care, we can just switch to - FileBothDirectoryInformation, isn't it? Nope! The next call to - NtQueryDirectoryFile(FileBothDirectoryInformation) actually returns - STATUS_NO_MORE_FILES, regardless how many files are left unread in - the directory. This does not happen when using - FileBothDirectoryInformation right from the start. In that case we - can read the whole directory unmolested. So we have to excempt - Samba from the usage of FileIdBothDirectoryInformation entirely, - even though Samba returns valid File IDs. */ - return drive_type () == DRIVE_REMOTE && fs_flags () == FS_IS_SAMBA; -} - -int __stdcall -fhandler_base::fstat_by_handle (struct __stat64 *buf) -{ - BY_HANDLE_FILE_INFORMATION local; - - if (wincap.is_winnt ()) - { - NTSTATUS status; - IO_STATUS_BLOCK io; - /* The entries potentially contain a name of MAX_PATH wide characters. */ - DWORD fvi_size = 2 * CYG_MAX_PATH + sizeof (FILE_FS_VOLUME_INFORMATION); - DWORD fai_size = 2 * CYG_MAX_PATH + sizeof (FILE_ALL_INFORMATION); - - PFILE_FS_VOLUME_INFORMATION pfvi = (PFILE_FS_VOLUME_INFORMATION) - alloca (fvi_size); - PFILE_ALL_INFORMATION pfai = (PFILE_ALL_INFORMATION) alloca (fai_size); - - status = NtQueryVolumeInformationFile (get_handle (), &io, pfvi, fvi_size, - FileFsVolumeInformation); - if (!NT_SUCCESS (status)) - { - debug_printf ("%u = NtQueryVolumeInformationFile)", - RtlNtStatusToDosError (status)); - pfvi->VolumeSerialNumber = 0; /* Set to pc.volser () in helper. */ - } - status = NtQueryInformationFile (get_handle (), &io, pfai, fai_size, - FileAllInformation); - if (NT_SUCCESS (status)) - { - /* If the change time is 0, it's a file system which doesn't - support a change timestamp. In that case use the LastWriteTime - entry, as in other calls to fstat_helper. */ - pc.file_attributes (pfai->BasicInformation.FileAttributes); - return fstat_helper (buf, - pfai->BasicInformation.ChangeTime.QuadPart ? - *(FILETIME *) &pfai->BasicInformation.ChangeTime : - *(FILETIME *) &pfai->BasicInformation.LastWriteTime, - *(FILETIME *) &pfai->BasicInformation.LastAccessTime, - *(FILETIME *) &pfai->BasicInformation.LastWriteTime, - pfvi->VolumeSerialNumber, - pfai->StandardInformation.EndOfFile.HighPart, - pfai->StandardInformation.EndOfFile.LowPart, - pfai->StandardInformation.AllocationSize.QuadPart, - pfai->InternalInformation.FileId.HighPart, - pfai->InternalInformation.FileId.LowPart, - pfai->StandardInformation.NumberOfLinks, - pfai->BasicInformation.FileAttributes); - } - - debug_printf ("%u = NtQueryInformationFile)", - RtlNtStatusToDosError (status)); - } - - BOOL res = GetFileInformationByHandle (get_handle (), &local); - debug_printf ("%d = GetFileInformationByHandle (%s, %d)", - res, get_win32_name (), get_handle ()); - /* GetFileInformationByHandle will fail if it's given stdio handle or pipe. - It also fails on 9x when trying to access directories on shares. */ - if (!res) - { - memset (&local, 0, sizeof (local)); - local.nFileSizeLow = GetFileSize (get_handle (), &local.nFileSizeHigh); - /* Even GetFileSize fails on 9x when trying to access directories - on shares. In this case reset filesize to 0. */ - if (local.nFileSizeLow == 0xffffffff && GetLastError ()) - local.nFileSizeLow = 0; - local.dwFileAttributes = DWORD (pc); - } - else - pc.file_attributes (local.dwFileAttributes); - return fstat_helper (buf, - local.ftLastWriteTime, /* see fstat_helper comment */ - local.ftLastAccessTime, - local.ftLastWriteTime, - local.dwVolumeSerialNumber, - local.nFileSizeHigh, - local.nFileSizeLow, - -1LL, - local.nFileIndexHigh, - local.nFileIndexLow, - local.nNumberOfLinks, - local.dwFileAttributes); -} - -int __stdcall -fhandler_base::fstat_by_name (struct __stat64 *buf) -{ - int res; - HANDLE handle; - WIN32_FIND_DATA local; - - if (!pc.exists ()) - { - debug_printf ("already determined that pc does not exist"); - set_errno (ENOENT); - res = -1; - } - else if ((handle = FindFirstFile (pc, &local)) != INVALID_HANDLE_VALUE) - { - FindClose (handle); - pc.file_attributes (local.dwFileAttributes); - res = fstat_helper (buf, - local.ftLastWriteTime, /* see fstat_helper comment */ - local.ftLastAccessTime, - local.ftLastWriteTime, - pc.volser (), - local.nFileSizeHigh, - local.nFileSizeLow, - -1LL, - 0, - 0, - 1, - local.dwFileAttributes); - } - else if (pc.isdir ()) - { - FILETIME ft = {}; - res = fstat_helper (buf, ft, ft, ft, pc.volser (), 0, 0, -1LL, 0, 0, 1, - FILE_ATTRIBUTE_DIRECTORY); - } - else - { - debug_printf ("FindFirstFile failed for '%s', %E", (char *) pc); - __seterrno (); - res = -1; - } - return res; -} - -int __stdcall -fhandler_base::fstat_fs (struct __stat64 *buf) -{ - int res = -1; - int oret; - int open_flags = O_RDONLY | O_BINARY; - - if (get_io_handle ()) - { - if (nohandle () || is_fs_special ()) - return fstat_by_name (buf); - else - return fstat_by_handle (buf); - } - /* If we don't care if the file is executable or we already know if it is, - then just do a "query open" as it is apparently much faster. */ - if (pc.exec_state () != dont_know_if_executable) - { - if (pc.fs_is_fat () && !strpbrk (get_win32_name (), "?*|<>")) - return fstat_by_name (buf); - query_open (query_stat_control); - } - if (!(oret = open_fs (open_flags, 0)) && get_errno () == EACCES) - { - /* If we couldn't open the file, try a query open with no permissions. - This allows us to determine *some* things about the file, at least. */ - pc.set_exec (0); - query_open (query_read_control); - oret = open_fs (open_flags, 0); - } - - if (oret) - { - /* We now have a valid handle, regardless of the "nohandle" state. - Since fhandler_base::open only calls CloseHandle if !nohandle, - we have to set it to false before calling close_fs and restore - the state afterwards. */ - res = fstat_by_handle (buf); - bool no_handle = nohandle (); - nohandle (false); - close_fs (); - nohandle (no_handle); - set_io_handle (NULL); - } - else - res = fstat_by_name (buf); - - return res; -} - -/* The ftChangeTime is taken from the NTFS ChangeTime entry, if reading - the file information using NtQueryInformationFile succeeded. If not, - it's faked using the LastWriteTime entry from GetFileInformationByHandle - or FindFirstFile. We're deliberatly not using the creation time anymore - to simplify interaction with native Windows applications which choke on - creation times >= access or write times. - - Note that the dwFileAttributes member of the file information evaluated - in the calling function is used here, not the pc.fileattr member, since - the latter might be old and not reflect the actual state of the file. */ -int __stdcall -fhandler_base::fstat_helper (struct __stat64 *buf, - FILETIME ftChangeTime, - FILETIME ftLastAccessTime, - FILETIME ftLastWriteTime, - DWORD dwVolumeSerialNumber, - DWORD nFileSizeHigh, - DWORD nFileSizeLow, - LONGLONG nAllocSize, - DWORD nFileIndexHigh, - DWORD nFileIndexLow, - DWORD nNumberOfLinks, - DWORD dwFileAttributes) -{ - IO_STATUS_BLOCK st; - FILE_COMPRESSION_INFORMATION fci; - - to_timestruc_t (&ftLastAccessTime, &buf->st_atim); - to_timestruc_t (&ftLastWriteTime, &buf->st_mtim); - to_timestruc_t (&ftChangeTime, &buf->st_ctim); - buf->st_dev = dwVolumeSerialNumber ?: pc.volser (); - buf->st_size = ((_off64_t) nFileSizeHigh << 32) + nFileSizeLow; - /* The number of links to a directory includes the - number of subdirectories in the directory, since all - those subdirectories point to it. - This is too slow on remote drives, so we do without it. - Setting the count to 2 confuses `find (1)' command. So - let's try it with `1' as link count. */ - buf->st_nlink = pc.ndisk_links (nNumberOfLinks); - - if (pc.hasgood_inode ()) - buf->st_ino = (((__ino64_t) nFileIndexHigh) << 32) - | (__ino64_t) nFileIndexLow; - else - buf->st_ino = get_namehash (); - - buf->st_blksize = S_BLKSIZE; - - if (nAllocSize >= 0LL) - /* A successful NtQueryInformationFile returns the allocation size - correctly for compressed and sparse files as well. */ - buf->st_blocks = (nAllocSize + S_BLKSIZE - 1) / S_BLKSIZE; - else if (::has_attribute (dwFileAttributes, FILE_ATTRIBUTE_COMPRESSED - | FILE_ATTRIBUTE_SPARSE_FILE) - && get_io_handle () && !is_fs_special () - && !NtQueryInformationFile (get_io_handle (), &st, (PVOID) &fci, - sizeof fci, FileCompressionInformation)) - /* Otherwise we request the actual amount of bytes allocated for - compressed and sparsed files. */ - buf->st_blocks = (fci.CompressedSize.QuadPart + S_BLKSIZE - 1) / S_BLKSIZE; - else - /* Otherwise compute no. of blocks from file size. */ - buf->st_blocks = (buf->st_size + S_BLKSIZE - 1) / S_BLKSIZE; - - buf->st_mode = 0; - /* Using a side effect: get_file_attibutes checks for - directory. This is used, to set S_ISVTX, if needed. */ - if (pc.isdir ()) - buf->st_mode = S_IFDIR; - else if (pc.issymlink ()) - { - buf->st_size = pc.get_symlink_length (); - /* symlinks are everything for everyone! */ - buf->st_mode = S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO; - get_file_attribute (pc.has_acls (), get_io_handle (), get_win32_name (), - NULL, &buf->st_uid, &buf->st_gid); - goto done; - } - else if (pc.issocket ()) - buf->st_mode = S_IFSOCK; - - if (!get_file_attribute (pc.has_acls (), - is_fs_special () ? NULL: get_io_handle (), - get_win32_name (), &buf->st_mode, - &buf->st_uid, &buf->st_gid)) - { - /* If read-only attribute is set, modify ntsec return value */ - if (::has_attribute (dwFileAttributes, FILE_ATTRIBUTE_READONLY) - && !pc.issymlink ()) - buf->st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); - - if (buf->st_mode & S_IFMT) - /* nothing */; - else if (!is_fs_special ()) - buf->st_mode |= S_IFREG; - else - { - buf->st_dev = dev (); - buf->st_mode = dev ().mode; - buf->st_size = 0; - } - } - else - { - buf->st_mode |= STD_RBITS; - - if (!::has_attribute (dwFileAttributes, FILE_ATTRIBUTE_READONLY) - && !pc.issymlink ()) - buf->st_mode |= STD_WBITS; - /* | S_IWGRP | S_IWOTH; we don't give write to group etc */ - - if (S_ISDIR (buf->st_mode)) - buf->st_mode |= S_IFDIR | STD_XBITS; - else if (buf->st_mode & S_IFMT) - /* nothing */; - else if (is_fs_special ()) - { - buf->st_dev = dev (); - buf->st_mode = dev ().mode; - buf->st_size = 0; - } - else - { - buf->st_mode |= S_IFREG; - if (pc.exec_state () == dont_know_if_executable) - { - DWORD cur, done; - char magic[3]; - - /* First retrieve current position, set to beginning - of file if not already there. */ - cur = SetFilePointer (get_handle (), 0, NULL, FILE_CURRENT); - if (cur != INVALID_SET_FILE_POINTER - && (!cur || SetFilePointer (get_handle (), 0, NULL, FILE_BEGIN) - != INVALID_SET_FILE_POINTER)) - { - /* FIXME should we use /etc/magic ? */ - magic[0] = magic[1] = magic[2] = '\0'; - if (ReadFile (get_handle (), magic, 3, &done, NULL) - && has_exec_chars (magic, done)) - { - pc.set_exec (); - buf->st_mode |= STD_XBITS; - } - SetFilePointer (get_handle (), cur, NULL, FILE_BEGIN); - } - } - } - - if (pc.exec_state () == is_executable) - buf->st_mode |= STD_XBITS; - - /* This fakes the permissions of all files to match the current umask. */ - buf->st_mode &= ~(cygheap->umask); - } - - done: - syscall_printf ("0 = fstat (, %p) st_atime=%x st_size=%D, st_mode=%p, st_ino=%D, sizeof=%d", - buf, buf->st_atime, buf->st_size, buf->st_mode, - buf->st_ino, sizeof (*buf)); - return 0; -} - -int __stdcall -fhandler_disk_file::fstat (struct __stat64 *buf) -{ - /* Changing inode data requires setting ctime (only 9x). */ - if (has_changed ()) - touch_ctime (); - return fstat_fs (buf); -} - -void -fhandler_disk_file::touch_ctime () -{ - FILETIME ft; - - GetSystemTimeAsFileTime (&ft); - /* Modification time is touched if the file data has changed as well. - This happens for instance on write() or ftruncate(). */ - if (!SetFileTime (get_io_handle (), NULL, NULL, &ft)) - debug_printf ("SetFileTime (%s) failed, %E", get_win32_name ()); - else - has_changed (false); -} - -int __stdcall -fhandler_disk_file::fchmod (mode_t mode) -{ - extern int chmod_device (path_conv& pc, mode_t mode); - int res = -1; - int oret = 0; - - if (pc.is_fs_special ()) - return chmod_device (pc, mode); - - /* Also open on 9x, otherwise we can't touch ctime. */ - if (!get_io_handle ()) - { - query_open (query_write_control); - if (!(oret = open (O_BINARY, 0))) - { - /* If the file couldn't be opened, that's really only a problem if - ACLs or EAs should get written. */ - if ((allow_ntsec && pc.has_acls ()) || allow_ntea) - return -1; - } - } - - if ((allow_ntsec && pc.has_acls ()) || allow_ntea) - { - if (!allow_ntsec && allow_ntea) /* Not necessary when manipulating SD. */ - SetFileAttributes (pc, (DWORD) pc & ~FILE_ATTRIBUTE_READONLY); - if (pc.isdir ()) - mode |= S_IFDIR; - if (!set_file_attribute (pc.has_acls (), get_io_handle (), pc, - ILLEGAL_UID, ILLEGAL_GID, mode) - && allow_ntsec) - res = 0; - } - - /* if the mode we want has any write bits set, we can't be read only. */ - if (mode & (S_IWUSR | S_IWGRP | S_IWOTH)) - pc &= (DWORD) ~FILE_ATTRIBUTE_READONLY; - else - pc |= (DWORD) FILE_ATTRIBUTE_READONLY; - - if (!SetFileAttributes (pc, pc)) - __seterrno (); - else if (!allow_ntsec || !pc.has_acls ()) - /* Correct NTFS security attributes have higher priority */ - res = 0; - - /* Set ctime on success. */ - if (!res && !wincap.is_winnt ()) - has_changed (true); - - if (oret) - close (); - - return res; -} - -int __stdcall -fhandler_disk_file::fchown (__uid32_t uid, __gid32_t gid) -{ - int oret = 0; - - if (!pc.has_acls () || !allow_ntsec) - { - /* fake - if not supported, pretend we're like win95 - where it just works */ - return 0; - } - - if (!get_io_handle ()) - { - query_open (query_write_control); - if (!(oret = fhandler_disk_file::open (O_BINARY, 0))) - return -1; - } - - mode_t attrib = 0; - if (pc.isdir ()) - attrib |= S_IFDIR; - int res = get_file_attribute (pc.has_acls (), get_io_handle (), pc, &attrib); - if (!res) - { - /* Typical Windows default ACLs can contain permissions for one - group, while being owned by another user/group. The permission - bits returned above are pretty much useless then. Creating a - new ACL with these useless permissions results in a potentially - broken symlink. So what we do here is to set the underlying - permissions of symlinks to a sensible value which allows the - world to read the symlink and only the new owner to change it. */ - if (pc.issymlink ()) - attrib = S_IFLNK | STD_RBITS | STD_WBITS; - res = set_file_attribute (pc.has_acls (), get_io_handle (), pc, - uid, gid, attrib); - } - if (oret) - close (); - - return res; -} - -int _stdcall -fhandler_disk_file::facl (int cmd, int nentries, __aclent32_t *aclbufp) -{ - int res = -1; - int oret = 0; - - if (!pc.has_acls () || !allow_ntsec) - { - switch (cmd) - { - struct __stat64 st; - - case SETACL: - /* Open for writing required to be able to set ctime - (even though setting the ACL is just pretended). */ - if (!get_io_handle ()) - oret = open (O_WRONLY | O_BINARY, 0); - res = 0; - break; - case GETACL: - if (!aclbufp) - set_errno(EFAULT); - else if (nentries < MIN_ACL_ENTRIES) - set_errno (ENOSPC); - else - { - if (!get_io_handle ()) - { - query_open (query_read_control); - if (!(oret = open (O_BINARY, 0))) - return -1; - } - if (!fstat_by_handle (&st)) - { - aclbufp[0].a_type = USER_OBJ; - aclbufp[0].a_id = st.st_uid; - aclbufp[0].a_perm = (st.st_mode & S_IRWXU) >> 6; - aclbufp[1].a_type = GROUP_OBJ; - aclbufp[1].a_id = st.st_gid; - aclbufp[1].a_perm = (st.st_mode & S_IRWXG) >> 3; - aclbufp[2].a_type = OTHER_OBJ; - aclbufp[2].a_id = ILLEGAL_GID; - aclbufp[2].a_perm = st.st_mode & S_IRWXO; - aclbufp[3].a_type = CLASS_OBJ; - aclbufp[3].a_id = ILLEGAL_GID; - aclbufp[3].a_perm = S_IRWXU | S_IRWXG | S_IRWXO; - res = MIN_ACL_ENTRIES; - } - } - break; - case GETACLCNT: - res = MIN_ACL_ENTRIES; - break; - default: - set_errno (EINVAL); - break; - } - } - else - { - if (!get_io_handle ()) - { - query_open (cmd == SETACL ? query_write_control : query_read_control); - if (!(oret = open (O_BINARY, 0))) - return -1; - } - switch (cmd) - { - case SETACL: - if (!aclsort32 (nentries, 0, aclbufp)) - res = setacl (get_io_handle (), pc, nentries, aclbufp); - break; - case GETACL: - if (!aclbufp) - set_errno(EFAULT); - else - res = getacl (get_io_handle (), pc, pc, nentries, aclbufp); - break; - case GETACLCNT: - res = getacl (get_io_handle (), pc, pc, 0, NULL); - break; - default: - set_errno (EINVAL); - break; - } - } - - if (oret) - close (); - - return res; -} - -int -fhandler_disk_file::ftruncate (_off64_t length) -{ - int res = -1, res_bug = 0; - - if (length < 0 || !get_output_handle ()) - set_errno (EINVAL); - else if (pc.isdir ()) - set_errno (EISDIR); - else if (!(get_access () & GENERIC_WRITE)) - set_errno (EBADF); - else - { - _off64_t prev_loc = lseek (0, SEEK_CUR); - if (lseek (length, SEEK_SET) >= 0) - { - if (get_fs_flags (FILE_SUPPORTS_SPARSE_FILES)) - { - _off64_t actual_length; - DWORD size_high = 0; - actual_length = GetFileSize (get_output_handle (), &size_high); - actual_length += ((_off64_t) size_high) << 32; - if (length >= actual_length + (128 * 1024)) - { - DWORD dw; - BOOL r = DeviceIoControl (get_output_handle (), - FSCTL_SET_SPARSE, NULL, 0, NULL, - 0, &dw, NULL); - syscall_printf ("%d = DeviceIoControl(%p, FSCTL_SET_SPARSE)", - r, get_output_handle ()); - } - } - else if (wincap.has_lseek_bug ()) - res_bug = write (&res, 0); - if (!SetEndOfFile (get_output_handle ())) - __seterrno (); - else - res = res_bug; - /* restore original file pointer location */ - lseek (prev_loc, SEEK_SET); - } - } - return res; -} - -int -fhandler_disk_file::link (const char *newpath) -{ - extern bool allow_winsymlinks; - extern suffix_info stat_suffixes[]; - - path_conv newpc (newpath, PC_SYM_NOFOLLOW | PC_POSIX, - transparent_exe ? stat_suffixes : NULL); - if (newpc.error) - { - set_errno (newpc.case_clash ? ECASECLASH : newpc.error); - return -1; - } - - if (newpc.exists ()) - { - syscall_printf ("file '%s' exists?", (char *) newpc); - set_errno (EEXIST); - return -1; - } - - if (newpc[strlen (newpc) - 1] == '.') - { - syscall_printf ("trailing dot, bailing out"); - set_errno (EINVAL); - return -1; - } - - char new_buf[CYG_MAX_PATH + 5]; - if (!newpc.error && !newpc.case_clash) - { - DWORD bintype; - int len; - - if (allow_winsymlinks && pc.is_lnk_special ()) - { - /* Shortcut hack. */ - strcpy (new_buf, newpath); - strcat (new_buf, ".lnk"); - newpath = new_buf; - newpc.check (newpath, PC_SYM_NOFOLLOW); - } - else if (transparent_exe - && !pc.isdir () - && GetBinaryType (pc, &bintype) - && (len = strlen (newpc)) > 4 - && !strcasematch ((const char *) newpc + len - 4, ".exe")) - { - /* Executable hack. */ - strcpy (new_buf, newpath); - strcat (new_buf, ".exe"); - newpath = new_buf; - newpc.check (newpath, PC_SYM_NOFOLLOW); - } - } - - query_open (query_write_attributes); - if (!open (O_BINARY, 0)) - { - syscall_printf ("Opening file failed"); - __seterrno (); - return -1; - } - - /* Try to make hard link first on Windows NT */ - if (wincap.has_hard_links ()) - { - if (CreateHardLinkA (newpc, pc, NULL)) - goto success; - - /* There are two cases to consider: - - The FS doesn't support hard links ==> ERROR_INVALID_FUNCTION - We copy the file. - - CreateHardLinkA is not supported ==> ERROR_PROC_NOT_FOUND - In that case (<= NT4) we try the old-style method. - Any other error should be taken seriously. */ - if (GetLastError () == ERROR_INVALID_FUNCTION) - { - syscall_printf ("FS doesn't support hard links: Copy file"); - goto docopy; - } - if (GetLastError () != ERROR_PROC_NOT_FOUND) - { - syscall_printf ("CreateHardLinkA failed"); - __seterrno (); - close (); - return -1; - } - - WIN32_STREAM_ID stream_id; - LPVOID context; - WCHAR wbuf[CYG_MAX_PATH]; - BOOL ret; - DWORD written, write_err, path_len, size; - - path_len = sys_mbstowcs (wbuf, newpc, CYG_MAX_PATH) * sizeof (WCHAR); - - stream_id.dwStreamId = BACKUP_LINK; - stream_id.dwStreamAttributes = 0; - stream_id.dwStreamNameSize = 0; - stream_id.Size.HighPart = 0; - stream_id.Size.LowPart = path_len; - size = sizeof (WIN32_STREAM_ID) - sizeof (WCHAR**) - + stream_id.dwStreamNameSize; - context = NULL; - write_err = 0; - /* Write WIN32_STREAM_ID */ - ret = BackupWrite (get_handle (), (LPBYTE) &stream_id, size, - &written, FALSE, FALSE, &context); - if (ret) - { - /* write the buffer containing the path */ - /* FIXME: BackupWrite sometimes traps if linkname is invalid. - Need to handle. */ - ret = BackupWrite (get_handle (), (LPBYTE) wbuf, path_len, - &written, FALSE, FALSE, &context); - if (!ret) - { - write_err = GetLastError (); - syscall_printf ("cannot write linkname, %E"); - } - /* Free context */ - BackupWrite (get_handle (), NULL, 0, &written, - TRUE, FALSE, &context); - } - else - { - write_err = GetLastError (); - syscall_printf ("cannot write stream_id, %E"); - } - - if (!ret) - { - /* Only copy file if FS doesn't support hard links */ - if (write_err == ERROR_INVALID_FUNCTION) - { - syscall_printf ("FS doesn't support hard links: Copy file"); - goto docopy; - } - - close (); - __seterrno_from_win_error (write_err); - return -1; - } - - success: - close (); - if (!allow_winsymlinks && pc.is_lnk_special ()) - SetFileAttributes (newpc, (DWORD) pc - | FILE_ATTRIBUTE_SYSTEM - | FILE_ATTRIBUTE_READONLY); - return 0; - } -docopy: - /* do this with a copy */ - if (!CopyFileA (pc, newpc, 1)) - { - __seterrno (); - return -1; - } - /* Set ctime on success (copy gets it automatically). */ - if (!wincap.is_winnt ()) - has_changed (true); - close (); - fhandler_disk_file fh (newpc); - fh.query_open (query_write_attributes); - if (fh.open (O_BINARY, 0)) - fh.close (); - return 0; -} - -int -fhandler_disk_file::utimes (const struct timeval *tvp) -{ - return utimes_fs (tvp); -} - -int -fhandler_base::utimes_fs (const struct timeval *tvp) -{ - FILETIME lastaccess, lastwrite; - struct timeval tmp[2]; - bool closeit; - - if (get_handle ()) - closeit = false; - else - { - query_open (query_write_attributes); - if (!open_fs (O_BINARY, 0)) - { - /* It's documented in MSDN that FILE_WRITE_ATTRIBUTES is sufficient - to change the timestamps. Unfortunately it's not sufficient for a - remote HPFS which requires GENERIC_WRITE, so we just retry to open - for writing, though this fails for R/O files of course. */ - query_open (no_query); - if (!open_fs (O_WRONLY | O_BINARY, 0)) - { - syscall_printf ("Opening file failed"); - return -1; - } - } - closeit = true; - } - - if (nohandle ()) /* Directory query_open on 9x. */ - return 0; - - gettimeofday (&tmp[0], 0); - if (!tvp) - { - tmp[1] = tmp[0]; - tvp = tmp; - } - timeval_to_filetime (&tvp[0], &lastaccess); - timeval_to_filetime (&tvp[1], &lastwrite); - debug_printf ("incoming lastaccess %08x %08x", tvp[0].tv_sec, tvp[0].tv_usec); - - if (is_fs_special ()) - SetFileAttributes (pc, (DWORD) pc & ~FILE_ATTRIBUTE_READONLY); - BOOL res = SetFileTime (get_handle (), NULL, &lastaccess, &lastwrite); - DWORD errcode = GetLastError (); - if (is_fs_special ()) - SetFileAttributes (pc, pc); - /* Opening a directory on a 9x share from a NT machine works(!), but - then the SetFileTimes fails with ERROR_NOT_SUPPORTED. Oh well... */ - if (!res && errcode != ERROR_NOT_SUPPORTED) - { - close (); - __seterrno_from_win_error (errcode); - return -1; - } - - if (closeit) - close (); - return 0; -} - -fhandler_disk_file::fhandler_disk_file () : - fhandler_base () -{ -} - -fhandler_disk_file::fhandler_disk_file (path_conv &pc) : - fhandler_base () -{ - set_name (pc); -} - -int -fhandler_disk_file::open (int flags, mode_t mode) -{ - return open_fs (flags, mode); -} - -int -fhandler_base::open_fs (int flags, mode_t mode) -{ - if (pc.case_clash && flags & O_CREAT) - { - debug_printf ("case clash detected"); - set_errno (ECASECLASH); - return 0; - } - - /* Unfortunately NT allows to open directories for writing, but that's - disallowed according to SUSv3. */ - if (pc.isdir () && (flags & O_ACCMODE) != O_RDONLY) - { - set_errno (EISDIR); - return 0; - } - - int res = fhandler_base::open (flags | O_DIROPEN, mode); - if (!res) - goto out; - - /* This is for file systems known for having a buggy CreateFile call - which might return a valid HANDLE without having actually opened - the file. - The only known file system to date is the SUN NFS Solstice Client 3.1 - which returns a valid handle when trying to open a file in a nonexistent - directory. */ - if (pc.has_buggy_open () && !pc.exists ()) - { - debug_printf ("Buggy open detected."); - close_fs (); - set_errno (ENOENT); - return 0; - } - - /* Attributes may be set only if a file is _really_ created. - This code is now only used for ntea here since the files - security attributes are set in CreateFile () now. */ - if (flags & O_CREAT - && GetLastError () != ERROR_ALREADY_EXISTS - && !allow_ntsec && allow_ntea) - set_file_attribute (false, NULL, get_win32_name (), mode); - - set_fs_flags (pc.fs_flags ()); - -out: - syscall_printf ("%d = fhandler_disk_file::open (%s, %p)", res, - get_win32_name (), flags); - return res; -} - -int -fhandler_disk_file::close () -{ - if (!hExeced) - { - /* Changing inode data requires setting ctime (only 9x). */ - if (has_changed ()) - touch_ctime (); - } - return close_fs (); -} - -int -fhandler_base::close_fs () -{ - int res = fhandler_base::close (); - if (!res) - user_shared->delqueue.process_queue (); - return res; -} - -ssize_t __stdcall -fhandler_disk_file::pread (void *buf, size_t count, _off64_t offset) -{ - ssize_t res; - _off64_t curpos = lseek (0, SEEK_CUR); - if (curpos < 0 || lseek (offset, SEEK_SET) < 0) - res = -1; - else - { - size_t tmp_count = count; - read (buf, tmp_count); - if (lseek (curpos, SEEK_SET) == 0) - res = (ssize_t) tmp_count; - else - res = -1; - } - debug_printf ("%d = pread (%p, %d, %d)\n", res, buf, count, offset); - return res; -} - -ssize_t __stdcall -fhandler_disk_file::pwrite (void *buf, size_t count, _off64_t offset) -{ - int res; - _off64_t curpos = lseek (0, SEEK_CUR); - if (curpos < 0 || lseek (offset, SEEK_SET) < 0) - res = curpos; - else - { - res = (ssize_t) write (buf, count); - if (lseek (curpos, SEEK_SET) < 0) - res = -1; - } - debug_printf ("%d = pwrite (%p, %d, %d)\n", res, buf, count, offset); - return res; -} - -/* FIXME: The correct way to do this to get POSIX locking semantics is to - keep a linked list of posix lock requests and map them into Win32 locks. - he problem is that Win32 does not deal correctly with overlapping lock - requests. Also another pain is that Win95 doesn't do non-blocking or - non-exclusive locks at all. For '95 just convert all lock requests into - blocking,exclusive locks. This shouldn't break many apps but denying all - locking would. For now just convert to Win32 locks and hope for - the best. */ - -int -fhandler_disk_file::lock (int cmd, struct __flock64 *fl) -{ - _off64_t win32_start; - _off64_t win32_len; - _off64_t startpos; - - /* - * We don't do getlck calls yet. - */ - - if (cmd == F_GETLK) - { - set_errno (ENOSYS); - return -1; - } - - /* - * Calculate where in the file to start from, - * then adjust this by fl->l_start. - */ - - switch (fl->l_whence) - { - case SEEK_SET: - startpos = 0; - break; - case SEEK_CUR: - if ((startpos = lseek (0, SEEK_CUR)) == ILLEGAL_SEEK) - return -1; - break; - case SEEK_END: - { - BY_HANDLE_FILE_INFORMATION finfo; - if (GetFileInformationByHandle (get_handle (), &finfo) == 0) - { - __seterrno (); - return -1; - } - startpos = ((_off64_t)finfo.nFileSizeHigh << 32) - + finfo.nFileSizeLow; - break; - } - default: - set_errno (EINVAL); - return -1; - } - - /* - * Now the fun starts. Adjust the start and length - * fields until they make sense. - */ - - win32_start = startpos + fl->l_start; - if (fl->l_len < 0) - { - win32_start -= fl->l_len; - win32_len = -fl->l_len; - } - else - win32_len = fl->l_len; - - if (win32_start < 0) - { - /* watch the signs! */ - win32_len -= -win32_start; - if (win32_len <= 0) - { - /* Failure ! */ - set_errno (EINVAL); - return -1; - } - win32_start = 0; - } - - DWORD off_high, off_low, len_high, len_low; - - off_low = (DWORD)(win32_start & UINT32_MAX); - off_high = (DWORD)(win32_start >> 32); - if (win32_len == 0) - { - /* Special case if len == 0 for POSIX means lock to the end of - the entire file (and all future extensions). */ - /* CV, 2003-12-03: And yet another Win 9x bugginess. For some reason - offset + length must be <= 0x100000000. I'm using 0xffffffff as - upper border here, this should be sufficient. */ - len_low = UINT32_MAX - (wincap.lock_file_highword () ? 0 : off_low); - len_high = wincap.lock_file_highword (); - } - else - { - len_low = (DWORD)(win32_len & UINT32_MAX); - len_high = (DWORD)(win32_len >> 32); - } - - BOOL res; - - if (wincap.has_lock_file_ex ()) - { - DWORD lock_flags = (cmd == F_SETLK) ? LOCKFILE_FAIL_IMMEDIATELY : 0; - lock_flags |= (fl->l_type == F_WRLCK) ? LOCKFILE_EXCLUSIVE_LOCK : 0; - - OVERLAPPED ov; - - ov.Internal = 0; - ov.InternalHigh = 0; - ov.Offset = off_low; - ov.OffsetHigh = off_high; - ov.hEvent = (HANDLE) 0; - - if (fl->l_type == F_UNLCK) - { - res = UnlockFileEx (get_handle (), 0, len_low, len_high, &ov); - } - else - { - res = LockFileEx (get_handle (), lock_flags, 0, - len_low, len_high, &ov); - /* Deal with the fail immediately case. */ - /* - * FIXME !! I think this is the right error to check for - * but I must admit I haven't checked.... - */ - if ((res == 0) && (lock_flags & LOCKFILE_FAIL_IMMEDIATELY) && - (GetLastError () == ERROR_LOCK_FAILED)) - { - set_errno (EAGAIN); - return -1; - } - } - } - else - { - /* Windows 95 -- use primitive lock call */ - if (fl->l_type == F_UNLCK) - res = UnlockFile (get_handle (), off_low, off_high, len_low, len_high); - else - res = LockFile (get_handle (), off_low, off_high, len_low, len_high); - } - - if (res == 0) - { - __seterrno (); - return -1; - } - - return 0; -} - -int -fhandler_disk_file::mkdir (mode_t mode) -{ - int res = -1; - SECURITY_ATTRIBUTES sa = sec_none_nih; - security_descriptor sd; - - if (allow_ntsec && has_acls ()) - set_security_attribute (S_IFDIR | ((mode & 07777) & ~cygheap->umask), - &sa, sd); - - if (CreateDirectoryA (get_win32_name (), &sa)) - { - if (!allow_ntsec && allow_ntea) - set_file_attribute (false, NULL, get_win32_name (), - S_IFDIR | ((mode & 07777) & ~cygheap->umask)); -#ifdef HIDDEN_DOT_FILES - char *c = strrchr (real_dir.get_win32 (), '\\'); - if ((c && c[1] == '.') || *get_win32_name () == '.') - SetFileAttributes (get_win32_name (), FILE_ATTRIBUTE_HIDDEN); -#endif - res = 0; - } - else - __seterrno (); - - return res; -} - -int -fhandler_disk_file::rmdir () -{ - int res = -1; - - /* Even own directories can't be removed if R/O attribute is set. */ - if (pc.has_attribute (FILE_ATTRIBUTE_READONLY)) - SetFileAttributes (get_win32_name (), - (DWORD) pc & ~FILE_ATTRIBUTE_READONLY); - - for (bool is_cwd = false; ; is_cwd = true) - { - DWORD err, att = 0; - int rc = RemoveDirectory (get_win32_name ()); - - if (isremote () && exists ()) - att = GetFileAttributes (get_win32_name ()); - - /* Sometimes smb indicates failure when it really succeeds, so check for - this case specifically. */ - if (rc || att == INVALID_FILE_ATTRIBUTES) - { - /* RemoveDirectory on a samba drive doesn't return an error if the - directory can't be removed because it's not empty. Checking for - existence afterwards keeps us informed about success. */ - if (!isremote () || att == INVALID_FILE_ATTRIBUTES) - { - res = 0; - break; - } - err = ERROR_DIR_NOT_EMPTY; - } - else - err = GetLastError (); - - /* This kludge detects if we are attempting to remove the current working - directory. If so, we will move elsewhere to potentially allow the - rmdir to succeed. This means that cygwin's concept of the current working - directory != Windows concept but, hey, whaddaregonnado? - Note that this will not cause something like the following to work: - $ cd foo - $ rmdir . - since the shell will have foo "open" in the above case and so Windows will - not allow the deletion. (Actually it does on 9X.) - FIXME: A potential workaround for this is for cygwin apps to *never* call - SetCurrentDirectory. */ - - extern char windows_system_directory[]; - if (strcasematch (get_win32_name (), cygheap->cwd.win32) - && !strcasematch (windows_system_directory, cygheap->cwd.win32) - && !is_cwd - && SetCurrentDirectory (windows_system_directory)) - continue; - - /* On 9X ERROR_ACCESS_DENIED is returned if you try to remove a - non-empty directory. */ - if (err == ERROR_ACCESS_DENIED - && wincap.access_denied_on_delete ()) - err = ERROR_DIR_NOT_EMPTY; - /* ...and, that's *not* funny, when trying to remove a non-existing - directory on a share, which is hosted by a 9x machine, the error - code ERROR_INVALID_FUNCTION is returned. */ - else if (err == ERROR_INVALID_FUNCTION) - err = ERROR_FILE_NOT_FOUND; - - __seterrno_from_win_error (err); - - /* Directory still exists, restore its characteristics. */ - if (pc.has_attribute (FILE_ATTRIBUTE_READONLY)) - SetFileAttributes (get_win32_name (), (DWORD) pc); - if (is_cwd) - SetCurrentDirectory (get_win32_name ()); - break; - } - - return res; -} - -/* This is the minimal number of entries which fit into the readdir cache. - The number of bytes allocated by the cache is determined by this number, - To tune caching, just tweak this number. To get a feeling for the size, - the size of the readdir cache is DIR_NUM_ENTRIES * 632 + 264 bytes. */ - -#define DIR_NUM_ENTRIES 25 /* Cache size 16064 bytes */ - -#define DIR_BUF_SIZE (DIR_NUM_ENTRIES \ - * (sizeof (FILE_ID_BOTH_DIR_INFORMATION) \ - + 2 * CYG_MAX_PATH)) - -struct __DIR_cache -{ - char __name[CYG_MAX_PATH]; - ULONG __pos; - char __cache[DIR_BUF_SIZE]; -}; - -#define d_dirname(d) (((__DIR_cache *) (d)->__d_dirname)->__name) -#define d_cachepos(d) (((__DIR_cache *) (d)->__d_dirname)->__pos) -#define d_cache(d) (((__DIR_cache *) (d)->__d_dirname)->__cache) - -#define d_mounts(d) ((__DIR_mounts *) (d)->__d_internal) - -DIR * -fhandler_disk_file::opendir () -{ - DIR *dir; - DIR *res = NULL; - size_t len; - - if (!pc.isdir ()) - set_errno (ENOTDIR); - else if ((len = strlen (pc)) > CYG_MAX_PATH - 3) - set_errno (ENAMETOOLONG); - else if ((dir = (DIR *) malloc (sizeof (DIR))) == NULL) - set_errno (ENOMEM); - else if ((dir->__d_dirname = (char *) malloc (wincap.is_winnt () - ? sizeof (struct __DIR_cache) - : len + 3)) == NULL) - { - set_errno (ENOMEM); - goto free_dir; - } - else if ((dir->__d_dirent = - (struct dirent *) malloc (sizeof (struct dirent))) == NULL) - { - set_errno (ENOMEM); - goto free_dirname; - } - else if (!pc.iscygdrive () && fhaccess (R_OK) != 0) - goto free_dirent; - else - { - strcpy (d_dirname (dir), get_win32_name ()); - dir->__d_dirent->__d_version = __DIRENT_VERSION; - cygheap_fdnew fd; - - if (fd < 0) - goto free_dirent; - - /* FindFirstFile doesn't seem to like duplicate /'s. - The dirname is generated with trailing backslash here which - simplifies later usage of dirname for checking symlinks. - Appending a "*" is moved right before calling FindFirstFile. - Since FindFirstFile is only called once, this should even be a - teeny little bit faster. */ - len = strlen (d_dirname (dir)); - if (len && !isdirsep (d_dirname (dir)[len - 1])) - strcpy (d_dirname (dir) + len, "\\"); - dir->__d_cookie = __DIRENT_COOKIE; - dir->__handle = INVALID_HANDLE_VALUE; - dir->__d_position = 0; - - dir->__flags = (pc.normalized_path[0] == '/' && pc.normalized_path[1] == '\0') ? dirent_isroot : 0; - dir->__d_internal = (unsigned) new __DIR_mounts (pc.normalized_path); - if (wincap.is_winnt ()) - { - d_cachepos (dir) = 0; - if (!pc.iscygdrive ()) - { - OBJECT_ATTRIBUTES attr; - WCHAR wpath[CYG_MAX_PATH + 10]; - UNICODE_STRING upath = {0, sizeof (wpath), wpath}; - IO_STATUS_BLOCK io; - NTSTATUS status; - SECURITY_ATTRIBUTES sa = sec_none; - pc.get_nt_native_path (upath); - InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE | OBJ_INHERIT, - NULL, sa.lpSecurityDescriptor); - - status = NtOpenFile (&dir->__handle, - SYNCHRONIZE | FILE_LIST_DIRECTORY, - &attr, &io, wincap.shared (), - FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE); - if (!NT_SUCCESS (status)) - { - __seterrno_from_nt_status (status); - goto free_mounts; - } - - /* FileIdBothDirectoryInformation is apparently unsupported on XP - when accessing directories on UDF. When trying to use it so, - NtQueryDirectoryFile returns with STATUS_ACCESS_VIOLATION. It's - not clear if the call isn't also unsupported on other OS/FS - combinations (say, Win2K/CDFS or so). Instead of testing in - readdir for yet another error code, let's use - FileIdBothDirectoryInformation only on filesystems supporting - persistent ACLs, FileBothDirectoryInformation otherwise. */ - if (pc.hasgood_inode ()) - { - dir->__flags |= dirent_set_d_ino; - if (wincap.has_fileid_dirinfo () && !pc.is_samba ()) - dir->__flags |= dirent_get_d_ino; - } - } - } - /* Filling fd with `this' (aka storing this in the file descriptor table - should only happen after it's clear that opendir doesn't fail, - otherwise we end up cfree'ing the fhandler twice, once in opendir() - in dir.cc, the second time on exit. Nasty, nasty... */ - fd = this; - fd->nohandle (true); - dir->__d_fd = fd; - dir->__fh = this; - res = dir; - } - - syscall_printf ("%p = opendir (%s)", res, get_name ()); - return res; - -free_mounts: - delete d_mounts (dir); -free_dirent: - free (dir->__d_dirent); -free_dirname: - free (dir->__d_dirname); -free_dir: - free (dir); - return res; -} - -int -fhandler_disk_file::readdir_helper (DIR *dir, dirent *de, DWORD w32_err, - DWORD attr, char *fname) -{ - if (w32_err) - { - bool added = false; - if ((de->d_ino = d_mounts (dir)->check_missing_mount (fname))) - added = true; - if (!added) - return geterrno_from_win_error (w32_err); - - attr = 0; - dir->__flags &= ~dirent_set_d_ino; - } - - /* Check for Windows shortcut. If it's a Cygwin or U/WIN - symlink, drop the .lnk suffix. */ - if (attr & FILE_ATTRIBUTE_READONLY) - { - char *c = fname; - char *e = strchr (fname, '\0') - 4; - if (e > c && strcasematch (e, ".lnk")) - { - char fbuf[CYG_MAX_PATH]; - strcpy (fbuf, d_dirname (dir)); - strcat (fbuf, c); - path_conv fpath (fbuf, PC_SYM_NOFOLLOW); - if (fpath.issymlink () || fpath.is_fs_special ()) - *e = '\0'; - } - } - - if (pc.isencoded ()) - fnunmunge (de->d_name, fname); - else - strcpy (de->d_name, fname); - if (dir->__d_position == 0 && !strcmp (fname, ".")) - dir->__flags |= dirent_saw_dot; - else if (dir->__d_position == 1 && !strcmp (fname, "..")) - dir->__flags |= dirent_saw_dot_dot; - return 0; -} - -static inline __ino64_t -readdir_get_ino_by_handle (HANDLE hdl) -{ - IO_STATUS_BLOCK io; - FILE_INTERNAL_INFORMATION pfai; - - if (!NtQueryInformationFile (hdl, &io, &pfai, sizeof pfai, - FileInternalInformation)) - return pfai.FileId.QuadPart; - return 0; -} - -__ino64_t __stdcall -readdir_get_ino (DIR *dir, const char *path, bool dot_dot) -{ - char fname[CYG_MAX_PATH]; - struct __stat64 st; - HANDLE hdl; - __ino64_t ino = 0; - - if (!(dir->__flags & dirent_isroot)) - { - strcpy (fname, path); - if (dot_dot) - strcat (fname, (*fname && fname[strlen (fname) - 1] == '/') - ? ".." : "/.."); - path_conv pc (fname, PC_SYM_NOFOLLOW); - if (pc.isspecial ()) - { - if (!lstat64 (fname, &st)) - ino = st.st_ino; - } - else if (!pc.hasgood_inode ()) - ino = hash_path_name (0, pc); - else if ((hdl = CreateFile (pc, GENERIC_READ, wincap.shared (), NULL, - OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, - NULL)) != INVALID_HANDLE_VALUE) - { - ino = readdir_get_ino_by_handle (hdl); - CloseHandle (hdl); - } - } - else - ino = readdir_get_ino_by_handle (dir->__handle); - return ino; -} - -int -fhandler_disk_file::readdir (DIR *dir, dirent *de) -{ - int res = 0; - NTSTATUS status = STATUS_SUCCESS; - PFILE_ID_BOTH_DIR_INFORMATION buf = NULL; - wchar_t *FileName; - char fname[CYG_MAX_PATH]; - IO_STATUS_BLOCK io; - - if (!wincap.is_winnt ()) - return readdir_9x (dir, de); - - /* d_cachepos always refers to the next cache entry to use. If it's 0 - we must reload the cache. */ - if (d_cachepos (dir) == 0) - { - if ((dir->__flags & dirent_get_d_ino)) - { - status = NtQueryDirectoryFile (dir->__handle, NULL, NULL, 0, &io, - d_cache (dir), DIR_BUF_SIZE, - FileIdBothDirectoryInformation, - FALSE, NULL, dir->__d_position == 0); - /* FileIdBothDirectoryInformation isn't supported for remote drives - on NT4 and 2K systems, and it's also not supported on 2K at all, - when accessing network drives on any remote OS. We just fall - back to using a standard directory query in this case and note - this case using the dirent_get_d_ino flag. */ - if (status == STATUS_INVALID_LEVEL - || status == STATUS_INVALID_PARAMETER) - dir->__flags &= ~dirent_get_d_ino; - } - if (!(dir->__flags & dirent_get_d_ino)) - status = NtQueryDirectoryFile (dir->__handle, NULL, NULL, 0, &io, - d_cache (dir), DIR_BUF_SIZE, - FileBothDirectoryInformation, - FALSE, NULL, dir->__d_position == 0); - } - - if (NT_SUCCESS (status)) - { - buf = (PFILE_ID_BOTH_DIR_INFORMATION) (d_cache (dir) + d_cachepos (dir)); - if (buf->NextEntryOffset == 0) - d_cachepos (dir) = 0; - else - d_cachepos (dir) += buf->NextEntryOffset; - if ((dir->__flags & dirent_get_d_ino)) - { - FileName = buf->FileName; - if ((dir->__flags & dirent_set_d_ino)) - de->d_ino = buf->FileId.QuadPart; - } - else - FileName = ((PFILE_BOTH_DIR_INFORMATION) buf)->FileName; - sys_wcstombs (fname, CYG_MAX_PATH - 1, FileName, buf->FileNameLength / 2); - - de->d_ino = d_mounts (dir)->check_mount (fname, de->d_ino); - if (de->d_ino == 0 && (dir->__flags & dirent_set_d_ino)) - { - OBJECT_ATTRIBUTES attr; - - if (dir->__d_position == 0 && buf->FileNameLength == 2 - && FileName[0] == '.') - de->d_ino = readdir_get_ino_by_handle (dir->__handle); - else if (dir->__d_position == 1 && buf->FileNameLength == 4 - && FileName[0] == '.' && FileName[1] == '.') - de->d_ino = readdir_get_ino (dir, pc.normalized_path, true); - else - { - HANDLE hdl; - UNICODE_STRING upath = {buf->FileNameLength, CYG_MAX_PATH * 2, - FileName}; - InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE, - dir->__handle , NULL); - if (!NtOpenFile (&hdl, READ_CONTROL, &attr, &io, - wincap.shared (), 0)) - { - de->d_ino = readdir_get_ino_by_handle (hdl); - CloseHandle (hdl); - } - } - } - } - - if (!(res = readdir_helper (dir, de, RtlNtStatusToDosError (status), - buf ? buf->FileAttributes : 0, fname))) - dir->__d_position++; - else if (!(dir->__flags & dirent_saw_dot)) - { - strcpy (de->d_name , "."); - de->d_ino = readdir_get_ino_by_handle (dir->__handle); - dir->__d_position++; - dir->__flags |= dirent_saw_dot; - res = 0; - } - else if (!(dir->__flags & dirent_saw_dot)) - { - strcpy (de->d_name , ".."); - de->d_ino = readdir_get_ino (dir, pc.normalized_path, true); - dir->__d_position++; - dir->__flags |= dirent_saw_dot_dot; - res = 0; - } - - syscall_printf ("%d = readdir (%p, %p) (%s)", res, dir, &de, res ? "***" : de->d_name); - return res; -} - -int -fhandler_disk_file::readdir_9x (DIR *dir, dirent *de) -{ - WIN32_FIND_DATA buf; - int res = 0; - - if (!dir->__handle) - { - res = ENMFILE; - goto out; - } - DWORD lasterr; - if (dir->__d_position != 0) - lasterr = FindNextFileA (dir->__handle, &buf) ? 0 : GetLastError (); - else if (dir->__handle != INVALID_HANDLE_VALUE) - { - res = EBADF; - goto out; - } - else - { - int len = strlen (dir->__d_dirname); - strcpy (dir->__d_dirname + len, "*"); - dir->__handle = FindFirstFile (dir->__d_dirname, &buf); - dir->__d_dirname[len] = '\0'; - if (dir->__handle != INVALID_HANDLE_VALUE) - lasterr = 0; - else if ((lasterr = GetLastError ()) != ERROR_NO_MORE_FILES) - { - res = geterrno_from_win_error (lasterr); - goto out; - } - } - if (!lasterr) - de->d_ino = d_mounts (dir)->check_mount (buf.cFileName, de->d_ino); - if (!(res = readdir_helper (dir, de, lasterr, buf.dwFileAttributes, - buf.cFileName))) - dir->__d_position++; - else - { - FindClose (dir->__handle); - dir->__handle = NULL; - } - -out: - syscall_printf ("%d = readdir (%p, %p) (%s)", res, dir, &de, res ? "***" : de->d_name); - return res; -} - -_off64_t -fhandler_disk_file::telldir (DIR *dir) -{ - return dir->__d_position; -} - -void -fhandler_disk_file::seekdir (DIR *dir, _off64_t loc) -{ - rewinddir (dir); - while (loc > dir->__d_position) - if (!::readdir (dir)) - break; -} - -void -fhandler_disk_file::rewinddir (DIR *dir) -{ - if (wincap.is_winnt ()) - d_cachepos (dir) = 0; - else if (dir->__handle != INVALID_HANDLE_VALUE) - { - if (dir->__handle) - FindClose (dir->__handle); - dir->__handle = INVALID_HANDLE_VALUE; - } - dir->__d_position = 0; - d_mounts (dir)->rewind (); -} - -int -fhandler_disk_file::closedir (DIR *dir) -{ - int res = 0; - delete d_mounts (dir); - if (!dir->__handle) - /* ignore */; - else if (dir->__handle == INVALID_HANDLE_VALUE) - { - set_errno (EBADF); - res = -1; - } - else - { - BOOL winres; - if (wincap.is_winnt ()) - winres = CloseHandle (dir->__handle); - else - winres = FindClose (dir->__handle); - if (!winres) - { - __seterrno (); - res = -1; - } - } - syscall_printf ("%d = closedir (%p)", res, dir); - return res; -} - -fhandler_cygdrive::fhandler_cygdrive () : - fhandler_disk_file (), ndrives (0), pdrive (NULL) -{ -} - -int -fhandler_cygdrive::open (int flags, mode_t mode) -{ - if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) - { - set_errno (EEXIST); - return 0; - } - if (flags & O_WRONLY) - { - set_errno (EISDIR); - return 0; - } - flags |= O_DIROPEN; - set_flags (flags); - nohandle (true); - return 1; -} - -int -fhandler_cygdrive::close () -{ - return 0; -} - -#define DRVSZ sizeof ("x:\\") -void -fhandler_cygdrive::set_drives () -{ - const int len = 2 + 26 * DRVSZ; - char *p = const_cast (get_win32_name ()); - pdrive = p; - ndrives = GetLogicalDriveStrings (len, p) / DRVSZ; -} - -int -fhandler_cygdrive::fstat (struct __stat64 *buf) -{ - buf->st_mode = S_IFDIR | 0555; - buf->st_ino = 2; - buf->st_nlink = 1; - return 0; -} - -DIR * -fhandler_cygdrive::opendir () -{ - DIR *dir; - - dir = fhandler_disk_file::opendir (); - if (dir && !ndrives) - set_drives (); - - return dir; -} - -int -fhandler_cygdrive::readdir (DIR *dir, dirent *de) -{ - while (true) - { - if (!pdrive || !*pdrive) - { - if (!(dir->__flags & dirent_saw_dot)) - { - de->d_name[0] = '.'; - de->d_name[1] = '\0'; - de->d_ino = 2; - } - return ENMFILE; - } - if (GetFileAttributes (pdrive) != INVALID_FILE_ATTRIBUTES) - break; - pdrive = strchr (pdrive, '\0') + 1; - } - *de->d_name = cyg_tolower (*pdrive); - de->d_name[1] = '\0'; - de->d_ino = readdir_get_ino (dir, pdrive, false); - dir->__d_position++; - pdrive = strchr (pdrive, '\0') + 1; - syscall_printf ("%p = readdir (%p) (%s)", &de, dir, de->d_name); - return 0; -} - -void -fhandler_cygdrive::rewinddir (DIR *dir) -{ - pdrive = get_win32_name (); - dir->__d_position = 0; -} - -int -fhandler_cygdrive::closedir (DIR *dir) -{ - pdrive = get_win32_name (); - return 0; -} diff --git a/winsup/cygwin/fhandler_dsp.cc b/winsup/cygwin/fhandler_dsp.cc deleted file mode 100644 index 33a829409..000000000 --- a/winsup/cygwin/fhandler_dsp.cc +++ /dev/null @@ -1,1374 +0,0 @@ -/* Fhandler_dev_dsp: code to emulate OSS sound model /dev/dsp - - Copyright 2001, 2002, 2003, 2004 Red Hat, Inc - - Written by Andy Younger (andy@snoogie.demon.co.uk) - Extended by Gerd Spalink (Gerd.Spalink@t-online.de) - to support recording from the audio input - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" - -/*------------------------------------------------------------------------ - Simple encapsulation of the win32 audio device. - - Implementation Notes - 1. Audio structures are malloced just before the first read or - write to /dev/dsp. The actual buffer size is determined at that time, - such that one buffer holds about 125ms of audio data. - At the time of this writing, 12 buffers are allocated, - so that up to 1.5 seconds can be buffered within Win32. - The buffer size can be queried with the ioctl SNDCTL_DSP_GETBLKSIZE, - but for this implementation only returns meaningful results if - sampling rate, number of channels and number of bits per sample - are not changed afterwards. - The audio structures are freed when the device is reset or closed, - and they are not passed to exec'ed processes. - The dev_ member is cleared after a fork. This forces the child - to reopen the audio device._ - - 2. Every open call creates a new instance of the handler. After a - successful open, every subsequent open from the same process - to the device fails with EBUSY. - The structures are shared between duped handles, but not with - children. They only inherit the settings from the parent. - */ - -class fhandler_dev_dsp::Audio -{ // This class contains functionality common to Audio_in and Audio_out - public: - Audio (); - ~Audio (); - - class queue; - - bool isvalid (); - void setconvert (int format); - void convert_none (unsigned char *buffer, int size_bytes) { } - void convert_U8_S8 (unsigned char *buffer, int size_bytes); - void convert_S16LE_U16LE (unsigned char *buffer, int size_bytes); - void convert_S16LE_U16BE (unsigned char *buffer, int size_bytes); - void convert_S16LE_S16BE (unsigned char *buffer, int size_bytes); - void fillFormat (WAVEFORMATEX * format, - int rate, int bits, int channels); - unsigned blockSize (int rate, int bits, int channels); - void (fhandler_dev_dsp::Audio::*convert_) - (unsigned char *buffer, int size_bytes); - - enum { MAX_BLOCKS = 12 }; - int bufferIndex_; // offset into pHdr_->lpData - WAVEHDR *pHdr_; // data to be filled by write - WAVEHDR wavehdr_[MAX_BLOCKS]; - char *bigwavebuffer_; // audio samples only - // Member variables below must be locked - queue *Qisr2app_; // blocks passed from wave callback -}; - -class fhandler_dev_dsp::Audio::queue -{ // non-blocking fixed size queues for buffer management - public: - queue (int depth = 4); - ~queue (); - - bool send (WAVEHDR *); // queue an item, returns true if successful - bool recv (WAVEHDR **); // retrieve an item, returns true if successful - void reset (); - int query (); // return number of items queued - inline void lock () { EnterCriticalSection (&lock_); } - inline void unlock () { LeaveCriticalSection (&lock_); } - inline void dellock () { debug_printf ("Deleting Critical Section"); DeleteCriticalSection (&lock_); } - bool isvalid () { return storage_; } - private: - CRITICAL_SECTION lock_; - int head_; - int tail_; - int depth_; - WAVEHDR **storage_; -}; - -static void CALLBACK waveOut_callback (HWAVEOUT hWave, UINT msg, DWORD instance, - DWORD param1, DWORD param2); - -class fhandler_dev_dsp::Audio_out: public Audio -{ - public: - void fork_fixup (HANDLE parent); - bool query (int rate, int bits, int channels); - bool start (); - void stop (bool immediately = false); - bool write (const char *pSampleData, int nBytes); - void buf_info (audio_buf_info *p, int rate, int bits, int channels); - void callback_sampledone (WAVEHDR *pHdr); - bool parsewav (const char *&pData, int &nBytes, - int rate, int bits, int channels); - - private: - void init (unsigned blockSize); - void waitforallsent (); - void waitforspace (); - bool sendcurrent (); - - enum { MAX_BLOCKS = 12 }; - HWAVEOUT dev_; // The wave device - /* Private copies of audiofreq_, audiobits_, audiochannels_, - possibly set from wave file */ - int freq_; - int bits_; - int channels_; -}; - -static void CALLBACK waveIn_callback (HWAVEIN hWave, UINT msg, DWORD instance, - DWORD param1, DWORD param2); - -class fhandler_dev_dsp::Audio_in: public Audio -{ -public: - void fork_fixup (HANDLE parent); - bool query (int rate, int bits, int channels); - bool start (int rate, int bits, int channels); - void stop (); - bool read (char *pSampleData, int &nBytes); - void buf_info (audio_buf_info *p, int rate, int bits, int channels); - void callback_blockfull (WAVEHDR *pHdr); - -private: - bool init (unsigned blockSize); - bool queueblock (WAVEHDR *pHdr); - void waitfordata (); // blocks until we have a good pHdr_ - - HWAVEIN dev_; -}; - -/* -------------------------------------------------------------------- - Implementation */ - -// Simple fixed length FIFO queue implementation for audio buffer management -fhandler_dev_dsp::Audio::queue::queue (int depth) -{ - // allow space for one extra object in the queue - // so we can distinguish full and empty status - depth_ = depth; - storage_ = new WAVEHDR *[depth_ + 1]; -} - -fhandler_dev_dsp::Audio::queue::~queue () -{ - delete[] storage_; -} - -void -fhandler_dev_dsp::Audio::queue::reset () - { - /* When starting, after reset and after fork */ - head_ = tail_ = 0; - debug_printf ("InitializeCriticalSection"); - memset (&lock_, 0, sizeof (lock_)); - InitializeCriticalSection (&lock_); - } - -bool -fhandler_dev_dsp::Audio::queue::send (WAVEHDR *x) -{ - bool res = false; - lock (); - if (query () == depth_) - system_printf ("Queue overflow"); - else - { - storage_[tail_] = x; - if (++tail_ > depth_) - tail_ = 0; - res = true; - } - unlock (); - return res; -} - -bool -fhandler_dev_dsp::Audio::queue::recv (WAVEHDR **x) -{ - bool res = false; - lock (); - if (query () != 0) - { - *x = storage_[head_]; - if (++head_ > depth_) - head_ = 0; - res = true; - } - unlock (); - return res; -} - -int -fhandler_dev_dsp::Audio::queue::query () -{ - int n = tail_ - head_; - if (n < 0) - n += depth_ + 1; - return n; -} - -// Audio class implements functionality need for both read and write -fhandler_dev_dsp::Audio::Audio () -{ - bigwavebuffer_ = NULL; - Qisr2app_ = new queue (MAX_BLOCKS); - convert_ = &fhandler_dev_dsp::Audio::convert_none; -} - -fhandler_dev_dsp::Audio::~Audio () -{ - debug_printf(""); - delete Qisr2app_; - delete[] bigwavebuffer_; -} - -inline bool -fhandler_dev_dsp::Audio::isvalid () -{ - return bigwavebuffer_ && Qisr2app_ && Qisr2app_->isvalid (); -} - -void -fhandler_dev_dsp::Audio::setconvert (int format) -{ - switch (format) - { - case AFMT_S8: - convert_ = &fhandler_dev_dsp::Audio::convert_U8_S8; - debug_printf ("U8_S8"); - break; - case AFMT_U16_LE: - convert_ = &fhandler_dev_dsp::Audio::convert_S16LE_U16LE; - debug_printf ("S16LE_U16LE"); - break; - case AFMT_U16_BE: - convert_ = &fhandler_dev_dsp::Audio::convert_S16LE_U16BE; - debug_printf ("S16LE_U16BE"); - break; - case AFMT_S16_BE: - convert_ = &fhandler_dev_dsp::Audio::convert_S16LE_S16BE; - debug_printf ("S16LE_S16BE"); - break; - default: - convert_ = &fhandler_dev_dsp::Audio::convert_none; - debug_printf ("none"); - } -} - -void -fhandler_dev_dsp::Audio::convert_U8_S8 (unsigned char *buffer, - int size_bytes) -{ - while (size_bytes-- > 0) - { - *buffer ^= (unsigned char)0x80; - buffer++; - } -} - -void -fhandler_dev_dsp::Audio::convert_S16LE_U16BE (unsigned char *buffer, - int size_bytes) -{ - int size_samples = size_bytes / 2; - unsigned char hi, lo; - while (size_samples-- > 0) - { - hi = buffer[0]; - lo = buffer[1]; - *buffer++ = lo; - *buffer++ = hi ^ (unsigned char)0x80; - } -} - -void -fhandler_dev_dsp::Audio::convert_S16LE_U16LE (unsigned char *buffer, - int size_bytes) -{ - int size_samples = size_bytes / 2; - while (size_samples-- > 0) - { - buffer++; - *buffer ^= (unsigned char)0x80; - buffer++; - } -} - -void -fhandler_dev_dsp::Audio::convert_S16LE_S16BE (unsigned char *buffer, - int size_bytes) -{ - int size_samples = size_bytes / 2; - unsigned char hi, lo; - while (size_samples-- > 0) - { - hi = buffer[0]; - lo = buffer[1]; - *buffer++ = lo; - *buffer++ = hi; - } -} - -void -fhandler_dev_dsp::Audio::fillFormat (WAVEFORMATEX * format, - int rate, int bits, int channels) -{ - memset (format, 0, sizeof (*format)); - format->wFormatTag = WAVE_FORMAT_PCM; - format->wBitsPerSample = bits; - format->nChannels = channels; - format->nSamplesPerSec = rate; - format->nAvgBytesPerSec = format->nSamplesPerSec * format->nChannels - * (bits / 8); - format->nBlockAlign = format->nChannels * (bits / 8); -} - -// calculate a good block size -unsigned -fhandler_dev_dsp::Audio::blockSize (int rate, int bits, int channels) -{ - unsigned blockSize; - blockSize = ((bits / 8) * channels * rate) / 8; // approx 125ms per block - // round up to multiple of 64 - blockSize += 0x3f; - blockSize &= ~0x3f; - return blockSize; -} - -//======================================================================= -void -fhandler_dev_dsp::Audio_out::fork_fixup (HANDLE parent) -{ - /* Null dev_. - It will be necessary to reset the queue, open the device - and create a lock when writing */ - debug_printf ("parent=0x%08x", parent); - dev_ = NULL; -} - - -bool -fhandler_dev_dsp::Audio_out::query (int rate, int bits, int channels) -{ - WAVEFORMATEX format; - MMRESULT rc; - - fillFormat (&format, rate, bits, channels); - rc = waveOutOpen (NULL, WAVE_MAPPER, &format, 0L, 0L, WAVE_FORMAT_QUERY); - debug_printf ("%d = waveOutOpen (freq=%d bits=%d channels=%d)", rc, rate, bits, channels); - return (rc == MMSYSERR_NOERROR); -} - -bool -fhandler_dev_dsp::Audio_out::start () -{ - WAVEFORMATEX format; - MMRESULT rc; - unsigned bSize = blockSize (freq_, bits_, channels_); - - if (dev_) - return true; - - /* In case of fork bigwavebuffer may already exist */ - if (!bigwavebuffer_) - bigwavebuffer_ = new char[MAX_BLOCKS * bSize]; - - if (!isvalid ()) - return false; - - fillFormat (&format, freq_, bits_, channels_); - rc = waveOutOpen (&dev_, WAVE_MAPPER, &format, (DWORD) waveOut_callback, - (DWORD) this, CALLBACK_FUNCTION); - if (rc == MMSYSERR_NOERROR) - init (bSize); - - debug_printf ("%d = waveOutOpen (freq=%d bits=%d channels=%d)", rc, freq_, bits_, channels_); - - return (rc == MMSYSERR_NOERROR); -} - -void -fhandler_dev_dsp::Audio_out::stop (bool immediately) -{ - MMRESULT rc; - WAVEHDR *pHdr; - - debug_printf ("dev_=%08x", (int)dev_); - if (dev_) - { - if (!immediately) - { - sendcurrent (); // force out last block whatever size.. - waitforallsent (); // block till finished.. - } - - rc = waveOutReset (dev_); - debug_printf ("%d = waveOutReset ()", rc); - while (Qisr2app_->recv (&pHdr)) - { - rc = waveOutUnprepareHeader (dev_, pHdr, sizeof (WAVEHDR)); - debug_printf ("%d = waveOutUnprepareHeader (0x%08x)", rc, pHdr); - } - - rc = waveOutClose (dev_); - debug_printf ("%d = waveOutClose ()", rc); - - Qisr2app_->dellock (); - } -} - -void -fhandler_dev_dsp::Audio_out::init (unsigned blockSize) -{ - int i; - - // internally queue all of our buffer for later use by write - Qisr2app_->reset (); - for (i = 0; i < MAX_BLOCKS; i++) - { - wavehdr_[i].lpData = &bigwavebuffer_[i * blockSize]; - wavehdr_[i].dwUser = (int) blockSize; - wavehdr_[i].dwFlags = 0; - if (!Qisr2app_->send (&wavehdr_[i])) - { - system_printf ("Internal Error i=%d", i); - break; // should not happen - } - } - pHdr_ = NULL; -} - -bool -fhandler_dev_dsp::Audio_out::write (const char *pSampleData, int nBytes) -{ - while (nBytes != 0) - { // Block if all blocks used until at least one is free - waitforspace (); - - int sizeleft = (int)pHdr_->dwUser - bufferIndex_; - if (nBytes < sizeleft) - { // all data fits into the current block, with some space left - memcpy (&pHdr_->lpData[bufferIndex_], pSampleData, nBytes); - bufferIndex_ += nBytes; - break; - } - else - { // data will fill up the current block - memcpy (&pHdr_->lpData[bufferIndex_], pSampleData, sizeleft); - bufferIndex_ += sizeleft; - sendcurrent (); - pSampleData += sizeleft; - nBytes -= sizeleft; - } - } - return true; -} - -void -fhandler_dev_dsp::Audio_out::buf_info (audio_buf_info *p, - int rate, int bits, int channels) -{ - p->fragstotal = MAX_BLOCKS; - if (this && dev_) - { - /* If the device is running we use the internal values, - possibly set from the wave file. */ - p->fragsize = blockSize (freq_, bits_, channels_); - p->fragments = Qisr2app_->query (); - if (pHdr_ != NULL) - p->bytes = (int)pHdr_->dwUser - bufferIndex_ - + p->fragsize * p->fragments; - else - p->bytes = p->fragsize * p->fragments; - } - else - { - p->fragsize = blockSize (rate, bits, channels); - p->fragments = MAX_BLOCKS; - p->bytes = p->fragsize * p->fragments; - } -} - -/* This is called on an interupt so use locking.. Note Qisr2app_ - is used so we should wrap all references to it in locks. */ -inline void -fhandler_dev_dsp::Audio_out::callback_sampledone (WAVEHDR *pHdr) -{ - Qisr2app_->send (pHdr); -} - -void -fhandler_dev_dsp::Audio_out::waitforspace () -{ - WAVEHDR *pHdr; - MMRESULT rc = WAVERR_STILLPLAYING; - - if (pHdr_ != NULL) - return; - while (!Qisr2app_->recv (&pHdr)) - { - debug_printf ("100ms"); - Sleep (100); - } - if (pHdr->dwFlags) - { - /* Errors are ignored here. They will probbaly cause a failure - in the subsequent PrepareHeader */ - rc = waveOutUnprepareHeader (dev_, pHdr, sizeof (WAVEHDR)); - debug_printf ("%d = waveOutUnprepareHeader (0x%08x)", rc, pHdr); - } - pHdr_ = pHdr; - bufferIndex_ = 0; -} - -void -fhandler_dev_dsp::Audio_out::waitforallsent () -{ - while (Qisr2app_->query () != MAX_BLOCKS) - { - debug_printf ("%d blocks in Qisr2app", Qisr2app_->query ()); - Sleep (100); - } -} - -// send the block described by pHdr_ and bufferIndex_ to wave device -bool -fhandler_dev_dsp::Audio_out::sendcurrent () -{ - WAVEHDR *pHdr = pHdr_; - MMRESULT rc; - debug_printf ("pHdr=0x%08x bytes=%d", pHdr, bufferIndex_); - - if (pHdr_ == NULL) - return false; - pHdr_ = NULL; - - // Sample buffer conversion - (this->*convert_) ((unsigned char *)pHdr->lpData, bufferIndex_); - - // Send internal buffer out to the soundcard - pHdr->dwBufferLength = bufferIndex_; - rc = waveOutPrepareHeader (dev_, pHdr, sizeof (WAVEHDR)); - debug_printf ("%d = waveOutPrepareHeader (0x%08x)", rc, pHdr); - if (rc == MMSYSERR_NOERROR) - { - rc = waveOutWrite (dev_, pHdr, sizeof (WAVEHDR)); - debug_printf ("%d = waveOutWrite (0x%08x)", rc, pHdr); - } - if (rc == MMSYSERR_NOERROR) - return true; - - /* FIXME: Should we return an error instead ?*/ - pHdr->dwFlags = 0; /* avoid calling UnprepareHeader again */ - Qisr2app_->send (pHdr); - return false; -} - -//------------------------------------------------------------------------ -// Call back routine -static void CALLBACK -waveOut_callback (HWAVEOUT hWave, UINT msg, DWORD instance, DWORD param1, - DWORD param2) -{ - if (msg == WOM_DONE) - { - fhandler_dev_dsp::Audio_out *ptr = - (fhandler_dev_dsp::Audio_out *) instance; - ptr->callback_sampledone ((WAVEHDR *) param1); - } -} - -//------------------------------------------------------------------------ -// wav file detection.. -#pragma pack(1) -struct wavchunk -{ - char id[4]; - unsigned int len; -}; -struct wavformat -{ - unsigned short wFormatTag; - unsigned short wChannels; - unsigned int dwSamplesPerSec; - unsigned int dwAvgBytesPerSec; - unsigned short wBlockAlign; - unsigned short wBitsPerSample; -}; -#pragma pack() - -bool -fhandler_dev_dsp::Audio_out::parsewav (const char * &pData, int &nBytes, - int dev_freq, int dev_bits, int dev_channels) -{ - int len; - const char *end = pData + nBytes; - const char *pDat; - int skip = 0; - - /* Start with default values from the device handler */ - freq_ = dev_freq; - bits_ = dev_bits; - channels_ = dev_channels; - setconvert (bits_ == 8 ? AFMT_U8 : AFMT_S16_LE); - - // Check alignment first: A lot of the code below depends on it - if (((int)pData & 0x3) != 0) - return false; - if (!(pData[0] == 'R' && pData[1] == 'I' - && pData[2] == 'F' && pData[3] == 'F')) - return false; - if (!(pData[8] == 'W' && pData[9] == 'A' - && pData[10] == 'V' && pData[11] == 'E')) - return false; - - len = *(int *) &pData[4]; - len -= 12; - pDat = pData + 12; - skip = 12; - while ((len > 0) && (pDat + sizeof (wavchunk) < end)) - { /* We recognize two kinds of wavchunk: - "fmt " for the PCM parameters (only PCM supported here) - "data" for the start of PCM data */ - wavchunk * pChunk = (wavchunk *) pDat; - int blklen = pChunk-> len; - if (pChunk->id[0] == 'f' && pChunk->id[1] == 'm' - && pChunk->id[2] == 't' && pChunk->id[3] == ' ') - { - wavformat *format = (wavformat *) (pChunk + 1); - if ((char *) (format + 1) >= end) - return false; - // We have found the parameter chunk - if (format->wFormatTag == 0x0001) - { // Micr*s*ft PCM; check if parameters work with our device - if (query (format->dwSamplesPerSec, format->wBitsPerSample, - format->wChannels)) - { // return the parameters we found - freq_ = format->dwSamplesPerSec; - bits_ = format->wBitsPerSample; - channels_ = format->wChannels; - } - } - } - else - { - if (pChunk->id[0] == 'd' && pChunk->id[1] == 'a' - && pChunk->id[2] == 't' && pChunk->id[3] == 'a') - { // throw away all the header & not output it to the soundcard. - skip += sizeof (wavchunk); - debug_printf ("Discard %d bytes wave header", skip); - pData += skip; - nBytes -= skip; - setconvert (bits_ == 8 ? AFMT_U8 : AFMT_S16_LE); - return true; - } - } - pDat += blklen + sizeof (wavchunk); - skip += blklen + sizeof (wavchunk); - len -= blklen + sizeof (wavchunk); - } - return false; -} - -/* ======================================================================== - Buffering concept for Audio_in: - On the first read, we queue all blocks of our bigwavebuffer - for reception and start the wave-in device. - We manage queues of pointers to WAVEHDR - When a block has been filled, the callback puts the corresponding - WAVEHDR pointer into a queue. - The function read() blocks (polled, sigh) until at least one good buffer - has arrived, then the data is copied into the buffer provided to read(). - After a buffer has been fully used by read(), it is queued again - to the wave-in device immediately. - The function read() iterates until all data requested has been - received, there is no way to interrupt it */ - -void -fhandler_dev_dsp::Audio_in::fork_fixup (HANDLE parent) -{ - /* Null dev_. - It will be necessary to reset the queue, open the device - and create a lock when reading */ - debug_printf ("parent=0x%08x", parent); - dev_ = NULL; -} - -bool -fhandler_dev_dsp::Audio_in::query (int rate, int bits, int channels) -{ - WAVEFORMATEX format; - MMRESULT rc; - - fillFormat (&format, rate, bits, channels); - rc = waveInOpen (NULL, WAVE_MAPPER, &format, 0L, 0L, WAVE_FORMAT_QUERY); - debug_printf ("%d = waveInOpen (freq=%d bits=%d channels=%d)", rc, rate, bits, channels); - return (rc == MMSYSERR_NOERROR); -} - -bool -fhandler_dev_dsp::Audio_in::start (int rate, int bits, int channels) -{ - WAVEFORMATEX format; - MMRESULT rc; - unsigned bSize = blockSize (rate, bits, channels); - - if (dev_) - return true; - - /* In case of fork bigwavebuffer may already exist */ - if (!bigwavebuffer_) - bigwavebuffer_ = new char[MAX_BLOCKS * bSize]; - - if (!isvalid ()) - return false; - - fillFormat (&format, rate, bits, channels); - rc = waveInOpen (&dev_, WAVE_MAPPER, &format, (DWORD) waveIn_callback, - (DWORD) this, CALLBACK_FUNCTION); - debug_printf ("%d = waveInOpen (rate=%d bits=%d channels=%d)", rc, rate, bits, channels); - - if (rc == MMSYSERR_NOERROR) - { - if (!init (bSize)) - return false; - } - return (rc == MMSYSERR_NOERROR); -} - -void -fhandler_dev_dsp::Audio_in::stop () -{ - MMRESULT rc; - WAVEHDR *pHdr; - - debug_printf ("dev_=%08x", (int)dev_); - if (dev_) - { - /* Note that waveInReset calls our callback for all incomplete buffers. - Since all the win32 wave functions appear to use a common lock, - we must not call into the wave API from the callback. - Otherwise we end up in a deadlock. */ - rc = waveInReset (dev_); - debug_printf ("%d = waveInReset ()", rc); - - while (Qisr2app_->recv (&pHdr)) - { - rc = waveInUnprepareHeader (dev_, pHdr, sizeof (WAVEHDR)); - debug_printf ("%d = waveInUnprepareHeader (0x%08x)", rc, pHdr); - } - - rc = waveInClose (dev_); - debug_printf ("%d = waveInClose ()", rc); - - Qisr2app_->dellock (); - } -} - -bool -fhandler_dev_dsp::Audio_in::queueblock (WAVEHDR *pHdr) -{ - MMRESULT rc; - rc = waveInPrepareHeader (dev_, pHdr, sizeof (WAVEHDR)); - debug_printf ("%d = waveInPrepareHeader (0x%08x)", rc, pHdr); - if (rc == MMSYSERR_NOERROR) - { - rc = waveInAddBuffer (dev_, pHdr, sizeof (WAVEHDR)); - debug_printf ("%d = waveInAddBuffer (0x%08x)", rc, pHdr); - } - if (rc == MMSYSERR_NOERROR) - return true; - - /* FIXME: Should the calling function return an error instead ?*/ - pHdr->dwFlags = 0; /* avoid calling UnprepareHeader again */ - pHdr->dwBytesRecorded = 0; /* no data will have been read */ - Qisr2app_->send (pHdr); - return false; -} - -bool -fhandler_dev_dsp::Audio_in::init (unsigned blockSize) -{ - MMRESULT rc; - int i; - - // try to queue all of our buffer for reception - Qisr2app_->reset (); - for (i = 0; i < MAX_BLOCKS; i++) - { - wavehdr_[i].lpData = &bigwavebuffer_[i * blockSize]; - wavehdr_[i].dwBufferLength = blockSize; - wavehdr_[i].dwFlags = 0; - if (!queueblock (&wavehdr_[i])) - break; - } - pHdr_ = NULL; - rc = waveInStart (dev_); - debug_printf ("%d = waveInStart (), queued=%d", rc, i); - return (rc == MMSYSERR_NOERROR); -} - -bool -fhandler_dev_dsp::Audio_in::read (char *pSampleData, int &nBytes) -{ - int bytes_to_read = nBytes; - nBytes = 0; - debug_printf ("pSampleData=%08x nBytes=%d", pSampleData, bytes_to_read); - while (bytes_to_read != 0) - { // Block till next sound has been read - waitfordata (); - - // Handle gathering our blocks into smaller or larger buffer - int sizeleft = pHdr_->dwBytesRecorded - bufferIndex_; - if (bytes_to_read < sizeleft) - { // The current buffer holds more data than requested - memcpy (pSampleData, &pHdr_->lpData[bufferIndex_], bytes_to_read); - (this->*convert_) ((unsigned char *)pSampleData, bytes_to_read); - nBytes += bytes_to_read; - bufferIndex_ += bytes_to_read; - debug_printf ("got %d", bytes_to_read); - break; // done; use remaining data in next call to read - } - else - { // not enough or exact amount in the current buffer - if (sizeleft) - { // use up what we have - memcpy (pSampleData, &pHdr_->lpData[bufferIndex_], sizeleft); - (this->*convert_) ((unsigned char *)pSampleData, sizeleft); - nBytes += sizeleft; - bytes_to_read -= sizeleft; - pSampleData += sizeleft; - debug_printf ("got %d", sizeleft); - } - queueblock (pHdr_); // re-queue this block to ISR - pHdr_ = NULL; // need to wait for a new block - // if more samples are needed, we need a new block now - } - } - debug_printf ("end nBytes=%d", nBytes); - return true; -} - -void -fhandler_dev_dsp::Audio_in::waitfordata () -{ - WAVEHDR *pHdr; - MMRESULT rc; - - if (pHdr_ != NULL) - return; - while (!Qisr2app_->recv (&pHdr)) - { - debug_printf ("100ms"); - Sleep (100); - } - if (pHdr->dwFlags) /* Zero if queued following error in queueblock */ - { - /* Errors are ignored here. They will probbaly cause a failure - in the subsequent PrepareHeader */ - rc = waveInUnprepareHeader (dev_, pHdr, sizeof (WAVEHDR)); - debug_printf ("%d = waveInUnprepareHeader (0x%08x)", rc, pHdr); - } - pHdr_ = pHdr; - bufferIndex_ = 0; -} - -void -fhandler_dev_dsp::Audio_in::buf_info (audio_buf_info *p, - int rate, int bits, int channels) -{ - p->fragstotal = MAX_BLOCKS; - p->fragsize = blockSize (rate, bits, channels); - if (this && dev_) - { - p->fragments = Qisr2app_->query (); - if (pHdr_ != NULL) - p->bytes = pHdr_->dwBytesRecorded - bufferIndex_ - + p->fragsize * p->fragments; - else - p->bytes = p->fragsize * p->fragments; - } - else - { - p->fragments = 0; - p->bytes = 0; - } -} - -inline void -fhandler_dev_dsp::Audio_in::callback_blockfull (WAVEHDR *pHdr) -{ - Qisr2app_->send (pHdr); -} - -static void CALLBACK -waveIn_callback (HWAVEIN hWave, UINT msg, DWORD instance, DWORD param1, - DWORD param2) -{ - if (msg == WIM_DATA) - { - fhandler_dev_dsp::Audio_in *ptr = - (fhandler_dev_dsp::Audio_in *) instance; - ptr->callback_blockfull ((WAVEHDR *) param1); - } -} - - -/* ------------------------------------------------------------------------ - /dev/dsp handler - ------------------------------------------------------------------------ */ -fhandler_dev_dsp::fhandler_dev_dsp (): - fhandler_base () -{ - debug_printf ("0x%08x", (int)this); - audio_in_ = NULL; - audio_out_ = NULL; -} - -int -fhandler_dev_dsp::open (int flags, mode_t mode) -{ - if (cygheap->fdtab.find_archetype (pc.dev)) - { - set_errno (EBUSY); - return 0; - } - int err = 0; - UINT num_in = 0, num_out = 0; - set_flags ((flags & ~O_TEXT) | O_BINARY); - // Work out initial sample format & frequency, /dev/dsp defaults - audioformat_ = AFMT_U8; - audiofreq_ = 8000; - audiobits_ = 8; - audiochannels_ = 1; - switch (flags & O_ACCMODE) - { - case O_RDWR: - if ((num_in = waveInGetNumDevs ()) == 0) - err = ENXIO; - /* Fall through */ - case O_WRONLY: - if ((num_out = waveOutGetNumDevs ()) == 0) - err = ENXIO; - break; - case O_RDONLY: - if ((num_in = waveInGetNumDevs ()) == 0) - err = ENXIO; - break; - default: - err = EINVAL; - } - - if (!err) - { - set_open_status (); - need_fork_fixup (true); - nohandle (true); - - // FIXME: Do this better someday - fhandler_dev_dsp *arch = (fhandler_dev_dsp *) cmalloc (HEAP_ARCHETYPES, sizeof (*this)); - archetype = arch; - *((fhandler_dev_dsp **) cygheap->fdtab.add_archetype ()) = arch; - *arch = *this; - archetype->usecount = 1; - } - else - set_errno (err); - - debug_printf ("ACCMODE=0x%08x audio_in=%d audio_out=%d, err=%d", - flags & O_ACCMODE, num_in, num_out, err); - return !err; -} - -#define IS_WRITE() ((get_flags() & O_ACCMODE) != O_RDONLY) -#define IS_READ() ((get_flags() & O_ACCMODE) != O_WRONLY) - -int -fhandler_dev_dsp::write (const void *ptr, size_t len) -{ - debug_printf ("ptr=%08x len=%d", ptr, len); - if ((fhandler_dev_dsp *) archetype != this) - return ((fhandler_dev_dsp *)archetype)->write(ptr, len); - - int len_s = len; - const char *ptr_s = static_cast (ptr); - - if (!audio_out_) - if (IS_WRITE ()) - { - debug_printf ("Allocating"); - if (!(audio_out_ = new Audio_out)) - return -1; - - /* check for wave file & get parameters & skip header if possible. */ - - if (audio_out_->parsewav (ptr_s, len_s, - audiofreq_, audiobits_, audiochannels_)) - debug_printf ("=> ptr_s=%08x len_s=%d", ptr_s, len_s); - } - else - { - set_errno (EBADF); // device was opened for read? - return -1; - } - - /* Open audio device properly with callbacks. - Private parameters were set in call to parsewav. - This is a no-op when there are successive writes in the same process */ - if (!audio_out_->start ()) - { - set_errno (EIO); - return -1; - } - - audio_out_->write (ptr_s, len_s); - return len; -} - -void __stdcall -fhandler_dev_dsp::read (void *ptr, size_t& len) -{ - debug_printf ("ptr=%08x len=%d", ptr, len); - if ((fhandler_dev_dsp *) archetype != this) - return ((fhandler_dev_dsp *)archetype)->read(ptr, len); - - if (!audio_in_) - if (IS_READ ()) - { - debug_printf ("Allocating"); - if (!(audio_in_ = new Audio_in)) - { - len = (size_t)-1; - return; - } - audio_in_->setconvert (audioformat_); - } - else - { - len = (size_t)-1; - set_errno (EBADF); // device was opened for write? - return; - } - - /* Open audio device properly with callbacks. - This is a noop when there are successive reads in the same process */ - if (!audio_in_->start (audiofreq_, audiobits_, audiochannels_)) - { - len = (size_t)-1; - set_errno (EIO); - return; - } - - audio_in_->read ((char *)ptr, (int&)len); -} - -_off64_t -fhandler_dev_dsp::lseek (_off64_t offset, int whence) -{ - return 0; -} - -void -fhandler_dev_dsp::close_audio_in () -{ - if (audio_in_) - { - audio_in_->stop (); - delete audio_in_; - audio_in_ = NULL; - } -} - -void -fhandler_dev_dsp::close_audio_out (bool immediately) -{ - if (audio_out_) - { - audio_out_->stop (immediately); - delete audio_out_; - audio_out_ = NULL; - } -} - -int -fhandler_dev_dsp::close () -{ - debug_printf ("audio_in=%08x audio_out=%08x", - (int)audio_in_, (int)audio_out_); - if (!hExeced) - { - if ((fhandler_dev_dsp *) archetype != this) - return ((fhandler_dev_dsp *) archetype)->close (); - - if (--usecount == 0) - { - close_audio_in (); - close_audio_out (exit_state != ES_NOT_EXITING); - } - } - return 0; -} - -int -fhandler_dev_dsp::dup (fhandler_base * child) -{ - debug_printf (""); - child->archetype = archetype; - archetype->usecount++; - return 0; -} - -int -fhandler_dev_dsp::ioctl (unsigned int cmd, void *ptr) -{ - debug_printf ("audio_in=%08x audio_out=%08x", - (int)audio_in_, (int)audio_out_); - if ((fhandler_dev_dsp *) archetype != this) - return ((fhandler_dev_dsp *)archetype)->ioctl(cmd, ptr); - - int *intptr = (int *) ptr; - switch (cmd) - { -#define CASE(a) case a : debug_printf ("/dev/dsp: ioctl %s", #a); - - CASE (SNDCTL_DSP_RESET) - close_audio_in (); - close_audio_out (true); - return 0; - break; - - CASE (SNDCTL_DSP_GETBLKSIZE) - /* This is valid even if audio_X is NULL */ - if (IS_WRITE ()) - { - *intptr = audio_out_->blockSize (audiofreq_, - audiobits_, - audiochannels_); - } - else - { // I am very sure that IS_READ is valid - *intptr = audio_in_->blockSize (audiofreq_, - audiobits_, - audiochannels_); - } - return 0; - - CASE (SNDCTL_DSP_SETFMT) - { - int nBits; - switch (*intptr) - { - case AFMT_QUERY: - *intptr = audioformat_; - return 0; - break; - case AFMT_U16_BE: - case AFMT_U16_LE: - case AFMT_S16_BE: - case AFMT_S16_LE: - nBits = 16; - break; - case AFMT_U8: - case AFMT_S8: - nBits = 8; - break; - default: - nBits = 0; - } - if (nBits && IS_WRITE ()) - { - close_audio_out (); - if (audio_out_->query (audiofreq_, nBits, audiochannels_)) - { - audiobits_ = nBits; - audioformat_ = *intptr; - } - else - { - *intptr = audiobits_; - return -1; - } - } - if (nBits && IS_READ ()) - { - close_audio_in (); - if (audio_in_->query (audiofreq_, nBits, audiochannels_)) - { - audiobits_ = nBits; - audioformat_ = *intptr; - } - else - { - *intptr = audiobits_; - return -1; - } - } - return 0; - } - - CASE (SNDCTL_DSP_SPEED) - if (IS_WRITE ()) - { - close_audio_out (); - if (audio_out_->query (*intptr, audiobits_, audiochannels_)) - audiofreq_ = *intptr; - else - { - *intptr = audiofreq_; - return -1; - } - } - if (IS_READ ()) - { - close_audio_in (); - if (audio_in_->query (*intptr, audiobits_, audiochannels_)) - audiofreq_ = *intptr; - else - { - *intptr = audiofreq_; - return -1; - } - } - return 0; - - CASE (SNDCTL_DSP_STEREO) - { - int nChannels = *intptr + 1; - int res = ioctl (SNDCTL_DSP_CHANNELS, &nChannels); - *intptr = nChannels - 1; - return res; - } - - CASE (SNDCTL_DSP_CHANNELS) - { - int nChannels = *intptr; - - if (IS_WRITE ()) - { - close_audio_out (); - if (audio_out_->query (audiofreq_, audiobits_, nChannels)) - audiochannels_ = nChannels; - else - { - *intptr = audiochannels_; - return -1; - } - } - if (IS_READ ()) - { - close_audio_in (); - if (audio_in_->query (audiofreq_, audiobits_, nChannels)) - audiochannels_ = nChannels; - else - { - *intptr = audiochannels_; - return -1; - } - } - return 0; - } - - CASE (SNDCTL_DSP_GETOSPACE) - { - if (!IS_WRITE ()) - { - set_errno(EBADF); - return -1; - } - audio_buf_info *p = (audio_buf_info *) ptr; - audio_out_->buf_info (p, audiofreq_, audiobits_, audiochannels_); - debug_printf ("ptr=%p frags=%d fragsize=%d bytes=%d", - ptr, p->fragments, p->fragsize, p->bytes); - return 0; - } - - CASE (SNDCTL_DSP_GETISPACE) - { - if (!IS_READ ()) - { - set_errno(EBADF); - return -1; - } - audio_buf_info *p = (audio_buf_info *) ptr; - audio_in_->buf_info (p, audiofreq_, audiobits_, audiochannels_); - debug_printf ("ptr=%p frags=%d fragsize=%d bytes=%d", - ptr, p->fragments, p->fragsize, p->bytes); - return 0; - } - - CASE (SNDCTL_DSP_SETFRAGMENT) - // Fake!! esound & mikmod require this on non PowerPC platforms. - // - return 0; - - CASE (SNDCTL_DSP_GETFMTS) - *intptr = AFMT_S16_LE | AFMT_U8; // only native formats returned here - return 0; - - CASE (SNDCTL_DSP_GETCAPS) - *intptr = DSP_CAP_BATCH | DSP_CAP_DUPLEX; - return 0; - - CASE (SNDCTL_DSP_POST) - CASE (SNDCTL_DSP_SYNC) - // Stop audio out device - close_audio_out (); - // Stop audio in device - close_audio_in (); - return 0; - - default: - debug_printf ("/dev/dsp: ioctl 0x%08x not handled yet! FIXME:", cmd); - break; - -#undef CASE - }; - set_errno (EINVAL); - return -1; -} - -void -fhandler_dev_dsp::fixup_after_fork (HANDLE parent) -{ // called from new child process - debug_printf ("audio_in=%08x audio_out=%08x", - (int)audio_in_, (int)audio_out_); - if (archetype != this) - return ((fhandler_dev_dsp *)archetype)->fixup_after_fork (parent); - - if (audio_in_) - audio_in_ ->fork_fixup (parent); - if (audio_out_) - audio_out_->fork_fixup (parent); -} - -void -fhandler_dev_dsp::fixup_after_exec () -{ - debug_printf ("audio_in=%08x audio_out=%08x, close_on_exec %d", - (int) audio_in_, (int) audio_out_, close_on_exec ()); - if (!close_on_exec ()) - { - if (archetype != this) - return ((fhandler_dev_dsp *) archetype)->fixup_after_exec (); - - audio_in_ = NULL; - audio_out_ = NULL; - } -} diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc deleted file mode 100644 index 14292671a..000000000 --- a/winsup/cygwin/fhandler_fifo.cc +++ /dev/null @@ -1,199 +0,0 @@ -/* fhandler_fifo.cc - See fhandler.h for a description of the fhandler classes. - - Copyright 2002, 2003, 2004, 2005 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include "winsup.h" -#include -#include -#include - -#include "cygerrno.h" -#include "perprocess.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "pinfo.h" - -fhandler_fifo::fhandler_fifo () - : fhandler_pipe (), output_handle (NULL), - read_use (0), write_use (0) -{ -} - -void -fhandler_fifo::set_use (int incr) -{ - long oread_use = read_use; - - if (get_flags () & (O_WRONLY | O_APPEND)) - write_use += incr; - else if (get_flags () & O_RDWR) - { - write_use += incr; - read_use += incr; - } - else - read_use += incr; - - if (incr >= 0) - return; - if (read_use <= 0 && oread_use != read_use) - { - HANDLE h = get_handle (); - if (h) - { - set_io_handle (NULL); - CloseHandle (h); - } - } -} - -int -fhandler_fifo::close () -{ - fhandler_pipe::close (); - if (get_output_handle ()) - CloseHandle (get_output_handle ()); - if (!hExeced) - set_use (-1); - return 0; -} - -#define DUMMY_O_RDONLY 4 - -void -fhandler_fifo::close_one_end () -{ - int testflags = (get_flags () & (O_RDWR | O_WRONLY | O_APPEND)) ?: DUMMY_O_RDONLY; - static int flagtypes[] = {DUMMY_O_RDONLY | O_RDWR, O_WRONLY | O_APPEND | O_RDWR}; - HANDLE *handles[2] = {&(get_handle ()), &(get_output_handle ())}; - for (int i = 0; i < 2; i++) - if (!(testflags & flagtypes[i])) - { - CloseHandle (*handles[i]); - *handles[i] = NULL; - } - else if (i == 0 && !read_state) - { - create_read_state (2); - need_fork_fixup (true); - } -} -int -fhandler_fifo::open_not_mine (int flags) -{ - winpids pids ((DWORD) 0); - int res = 0; - - for (unsigned i = 0; i < pids.npids; i++) - { - _pinfo *p = pids[i]; - commune_result r; - if (p->pid != myself->pid) - { - r = p->commune_request (PICOM_FIFO, get_win32_name ()); - if (r.handles[0] == NULL) - continue; // process doesn't own fifo - debug_printf ("pid %d, handles[0] %p, handles[1] %p", p->pid, - r.handles[0], r.handles[1]); - } - else - { - /* FIXME: racy? */ - fhandler_fifo *fh = cygheap->fdtab.find_fifo (get_win32_name ()); - if (!fh) - continue; - if (!DuplicateHandle (hMainProc, fh->get_handle (), hMainProc, - &r.handles[0], 0, false, DUPLICATE_SAME_ACCESS)) - { - __seterrno (); - goto out; - } - if (!DuplicateHandle (hMainProc, fh->get_output_handle (), hMainProc, - &r.handles[1], 0, false, DUPLICATE_SAME_ACCESS)) - { - CloseHandle (r.handles[0]); - __seterrno (); - goto out; - } - } - - set_io_handle (r.handles[0]); - set_output_handle (r.handles[1]); - set_flags (flags); - close_one_end (); - res = 1; - goto out; - } - - set_errno (EAGAIN); - -out: - debug_printf ("res %d", res); - return res; -} - -int -fhandler_fifo::open (int flags, mode_t) -{ - int res = 1; - - set_io_handle (NULL); - set_output_handle (NULL); - if (open_not_mine (flags)) - goto out; - - fhandler_pipe *fhs[2]; - if (create (fhs, 1, flags, true)) - { - __seterrno (); - res = 0; - } - else - { - set_flags (flags); - set_io_handle (fhs[0]->get_handle ()); - set_output_handle (fhs[1]->get_handle ()); - guard = fhs[0]->guard; - read_state = fhs[0]->read_state; - writepipe_exists = fhs[1]->writepipe_exists; - orig_pid = fhs[0]->orig_pid; - id = fhs[0]->id; - delete (fhs[0]); - delete (fhs[1]); - set_use (1); - need_fork_fixup (true); - } - -out: - debug_printf ("returning %d, errno %d", res, get_errno ()); - return res; -} - -int -fhandler_fifo::dup (fhandler_base *child) -{ - int res = fhandler_pipe::dup (child); - if (!res) - { - fhandler_fifo *ff = (fhandler_fifo *) child; - if (get_output_handle () - && !DuplicateHandle (hMainProc, get_output_handle (), hMainProc, - &ff->get_output_handle (), false, true, - DUPLICATE_SAME_ACCESS)) - { - __seterrno (); - child->close (); - res = -1; - } - } - return res; -} diff --git a/winsup/cygwin/fhandler_floppy.cc b/winsup/cygwin/fhandler_floppy.cc deleted file mode 100644 index ae3156b29..000000000 --- a/winsup/cygwin/fhandler_floppy.cc +++ /dev/null @@ -1,478 +0,0 @@ -/* fhandler_floppy.cc. See fhandler.h for a description of the - fhandler classes. - - Copyright 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" - -#define IS_EOM(err) ((err) == ERROR_INVALID_PARAMETER \ - || (err) == ERROR_SEEK \ - || (err) == ERROR_SECTOR_NOT_FOUND) - -/**********************************************************************/ -/* fhandler_dev_floppy */ - -fhandler_dev_floppy::fhandler_dev_floppy () - : fhandler_dev_raw (), status () -{ -} - -int -fhandler_dev_floppy::get_drive_info (struct hd_geometry *geo) -{ - char dbuf[256]; - char pbuf[256]; - - DISK_GEOMETRY *di; - PARTITION_INFORMATION_EX *pix = NULL; - PARTITION_INFORMATION *pi = NULL; - DWORD bytes_read = 0; - - /* Always try using the new EX ioctls first (>= XP). If not available, - fall back to trying the old non-EX ioctls. - Unfortunately the EX ioctls are not implemented in the floppy driver. */ - if (wincap.has_disk_ex_ioctls () && get_major () != DEV_FLOPPY_MAJOR) - { - if (!DeviceIoControl (get_handle (), - IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, - dbuf, 256, &bytes_read, NULL)) - { - __seterrno (); - return -1; - } - di = &((DISK_GEOMETRY_EX *) dbuf)->Geometry; - if (DeviceIoControl (get_handle (), - IOCTL_DISK_GET_PARTITION_INFO_EX, NULL, 0, - pbuf, 256, &bytes_read, NULL)) - pix = (PARTITION_INFORMATION_EX *) pbuf; - } - else - { - if (!DeviceIoControl (get_handle (), - IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, - dbuf, 256, &bytes_read, NULL)) - { - __seterrno (); - return -1; - } - di = (DISK_GEOMETRY *) dbuf; - if (DeviceIoControl (get_handle (), - IOCTL_DISK_GET_PARTITION_INFO, NULL, 0, - pbuf, 256, &bytes_read, NULL)) - pi = (PARTITION_INFORMATION *) pbuf; - } - - debug_printf ("disk geometry: (%ld cyl)*(%ld trk)*(%ld sec)*(%ld bps)", - di->Cylinders.LowPart, - di->TracksPerCylinder, - di->SectorsPerTrack, - di->BytesPerSector); - bytes_per_sector = di->BytesPerSector; - if (pix) - { - debug_printf ("partition info: offset %D length %D", - pix->StartingOffset.QuadPart, - pix->PartitionLength.QuadPart); - drive_size = pix->PartitionLength.QuadPart; - } - else if (pi) - { - debug_printf ("partition info: offset %D length %D", - pi->StartingOffset.QuadPart, - pi->PartitionLength.QuadPart); - drive_size = pi->PartitionLength.QuadPart; - } - else - { - /* Getting the partition size by using the drive geometry information - looks wrong, but this is a historical necessity. NT4 didn't maintain - partition information for the whole drive (aka "partition 0"), but - returned ERROR_INVALID_HANDLE instead. That got fixed in W2K. */ - drive_size = di->Cylinders.QuadPart * di->TracksPerCylinder * - di->SectorsPerTrack * di->BytesPerSector; - } - debug_printf ("drive size: %D", drive_size); - if (geo) - { - geo->heads = di->TracksPerCylinder; - geo->sectors = di->SectorsPerTrack; - geo->cylinders = di->Cylinders.LowPart; - if (pix) - geo->start = pix->StartingOffset.QuadPart >> 9ULL; - else if (pi) - geo->start = pi->StartingOffset.QuadPart >> 9ULL; - else - geo->start = 0; - } - return 0; -} - -/* Wrapper functions for ReadFile and WriteFile to simplify error handling. */ -BOOL -fhandler_dev_floppy::read_file (void *buf, DWORD to_read, DWORD *read, int *err) -{ - BOOL ret; - - *err = 0; - if (!(ret = ReadFile (get_handle (), buf, to_read, read, 0))) - *err = GetLastError (); - syscall_printf ("%d (err %d) = ReadFile (%d, %d, to_read %d, read %d, 0)", - ret, *err, get_handle (), buf, to_read, *read); - return ret; -} - -BOOL -fhandler_dev_floppy::write_file (const void *buf, DWORD to_write, - DWORD *written, int *err) -{ - BOOL ret; - - *err = 0; - if (!(ret = WriteFile (get_handle (), buf, to_write, written, 0))) - *err = GetLastError (); - syscall_printf ("%d (err %d) = WriteFile (%d, %d, write %d, written %d, 0)", - ret, *err, get_handle (), buf, to_write, *written); - return ret; -} - -int -fhandler_dev_floppy::open (int flags, mode_t) -{ - /* The correct size of the buffer would be 512 bytes, which is the atomic - size, supported by WinNT. Unfortunately, the performance is worse than - access to file system on same device! Setting buffer size to a - relatively big value increases performance by means. The new ioctl call - with 'rdevio.h' header file supports changing this value. - - As default buffer size, we're using some value which is a multiple of - the typical tar and cpio buffer sizes, Except O_DIRECT is set, in which - case we're not buffering at all. */ - devbufsiz = (flags & O_DIRECT) ? 0L : 61440L; - int ret = fhandler_dev_raw::open (flags); - - if (ret && get_drive_info (NULL)) - { - close (); - return 0; - } - - return ret; -} - -int -fhandler_dev_floppy::dup (fhandler_base *child) -{ - int ret = fhandler_dev_raw::dup (child); - - if (!ret) - { - fhandler_dev_floppy *fhc = (fhandler_dev_floppy *) child; - - fhc->drive_size = drive_size; - fhc->bytes_per_sector = bytes_per_sector; - fhc->eom_detected (eom_detected ()); - } - return ret; -} - -inline _off64_t -fhandler_dev_floppy::get_current_position () -{ - LARGE_INTEGER off = { QuadPart: 0LL }; - off.LowPart = SetFilePointer (get_handle (), 0, &off.HighPart, FILE_CURRENT); - return off.QuadPart; -} - -void -fhandler_dev_floppy::raw_read (void *ptr, size_t& ulen) -{ - DWORD bytes_read = 0; - DWORD read2; - DWORD bytes_to_read; - int ret; - size_t len = ulen; - char *tgt; - char *p = (char *) ptr; - - /* Checking a previous end of media */ - if (eom_detected () && !lastblk_to_read ()) - { - set_errno (ENOSPC); - goto err; - } - - if (devbuf) - { - while (len > 0) - { - if (devbufstart < devbufend) - { - bytes_to_read = min (len, devbufend - devbufstart); - debug_printf ("read %d bytes from buffer (rest %d)", - bytes_to_read, - devbufend - devbufstart - bytes_to_read); - memcpy (p, devbuf + devbufstart, bytes_to_read); - len -= bytes_to_read; - p += bytes_to_read; - bytes_read += bytes_to_read; - devbufstart += bytes_to_read; - - if (lastblk_to_read ()) - { - lastblk_to_read (false); - break; - } - } - if (len > 0) - { - if (len >= devbufsiz) - { - bytes_to_read = (len / bytes_per_sector) * bytes_per_sector; - tgt = p; - } - else - { - tgt = devbuf; - bytes_to_read = devbufsiz; - } - _off64_t current_position = get_current_position (); - if (current_position + bytes_to_read >= drive_size) - bytes_to_read = drive_size - current_position; - if (!bytes_to_read) - { - eom_detected (true); - break; - } - - debug_printf ("read %d bytes %s", bytes_to_read, - len < devbufsiz ? "into buffer" : "directly"); - if (!read_file (tgt, bytes_to_read, &read2, &ret)) - { - if (!IS_EOM (ret)) - { - __seterrno (); - goto err; - } - - eom_detected (true); - - if (!read2) - { - if (!bytes_read) - { - debug_printf ("return -1, set errno to ENOSPC"); - set_errno (ENOSPC); - goto err; - } - break; - } - lastblk_to_read (true); - } - if (!read2) - break; - if (tgt == devbuf) - { - devbufstart = 0; - devbufend = read2; - } - else - { - len -= read2; - p += read2; - bytes_read += read2; - } - } - } - } - else if (!read_file (p, len, &bytes_read, &ret)) - { - if (!IS_EOM (ret)) - { - __seterrno (); - goto err; - } - if (bytes_read) - eom_detected (true); - else - { - debug_printf ("return -1, set errno to ENOSPC"); - set_errno (ENOSPC); - goto err; - } - } - - ulen = (size_t) bytes_read; - return; - -err: - ulen = (size_t) -1; -} - -int -fhandler_dev_floppy::raw_write (const void *ptr, size_t len) -{ - DWORD bytes_written = 0; - char *p = (char *) ptr; - int ret; - - /* Checking a previous end of media on tape */ - if (eom_detected ()) - { - set_errno (ENOSPC); - return -1; - } - - /* Invalidate buffer. */ - devbufstart = devbufend = 0; - - if (len > 0) - { - if (!write_file (p, len, &bytes_written, &ret)) - { - if (!IS_EOM (ret)) - { - __seterrno (); - return -1; - } - eom_detected (true); - if (!bytes_written) - { - set_errno (ENOSPC); - return -1; - } - } - } - return bytes_written; -} - -_off64_t -fhandler_dev_floppy::lseek (_off64_t offset, int whence) -{ - char buf[512]; - _off64_t lloffset = offset; - LARGE_INTEGER sector_aligned_offset; - _off64_t bytes_left; - - if (whence == SEEK_END) - { - lloffset += drive_size; - whence = SEEK_SET; - } - else if (whence == SEEK_CUR) - { - lloffset += get_current_position () - (devbufend - devbufstart); - whence = SEEK_SET; - } - - if (whence != SEEK_SET || lloffset < 0 || lloffset > drive_size) - { - set_errno (EINVAL); - return -1; - } - - sector_aligned_offset.QuadPart = (lloffset / bytes_per_sector) - * bytes_per_sector; - bytes_left = lloffset - sector_aligned_offset.QuadPart; - - /* Invalidate buffer. */ - devbufstart = devbufend = 0; - - sector_aligned_offset.LowPart = - SetFilePointer (get_handle (), - sector_aligned_offset.LowPart, - §or_aligned_offset.HighPart, - FILE_BEGIN); - if (sector_aligned_offset.LowPart == INVALID_SET_FILE_POINTER - && GetLastError ()) - { - __seterrno (); - return -1; - } - - eom_detected (false); - - if (bytes_left) - { - size_t len = bytes_left; - raw_read (buf, len); - } - return sector_aligned_offset.QuadPart + bytes_left; -} - -int -fhandler_dev_floppy::ioctl (unsigned int cmd, void *buf) -{ - DISK_GEOMETRY di; - DWORD bytes_read; - switch (cmd) - { - case HDIO_GETGEO: - { - debug_printf ("HDIO_GETGEO"); - return get_drive_info ((struct hd_geometry *) buf); - } - case BLKGETSIZE: - case BLKGETSIZE64: - { - debug_printf ("BLKGETSIZE"); - if (cmd == BLKGETSIZE) - *(long *)buf = drive_size >> 9UL; - else - *(_off64_t *)buf = drive_size; - return 0; - } - case BLKRRPART: - { - debug_printf ("BLKRRPART"); - if (!DeviceIoControl (get_handle (), - IOCTL_DISK_UPDATE_DRIVE_SIZE, - NULL, 0, - &di, sizeof (di), - &bytes_read, NULL)) - { - __seterrno (); - return -1; - } - get_drive_info (NULL); - return 0; - } - case BLKSSZGET: - { - debug_printf ("BLKSSZGET"); - *(int *)buf = bytes_per_sector; - return 0; - } - case RDSETBLK: - /* Just check the restriction that blocksize must be a multiple - of the sector size of the underlying volume sector size, - then fall through to fhandler_dev_raw::ioctl. */ - struct rdop *op = (struct rdop *) buf; - if (op->rd_parm % bytes_per_sector) - { - SetLastError (ERROR_INVALID_PARAMETER); - __seterrno (); - return -1; - } - /*FALLTHRUGH*/ - default: - return fhandler_dev_raw::ioctl (cmd, buf); - } -} - diff --git a/winsup/cygwin/fhandler_mailslot.cc b/winsup/cygwin/fhandler_mailslot.cc deleted file mode 100644 index 07babd2fd..000000000 --- a/winsup/cygwin/fhandler_mailslot.cc +++ /dev/null @@ -1,160 +0,0 @@ -/* fhandler_mailslot.cc. See fhandler.h for a description of the fhandler classes. - - Copyright 2005 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include "winsup.h" -#include -#include - -#include -#include "cygerrno.h" -#include "perprocess.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "ntdll.h" - -/**********************************************************************/ -/* fhandler_mailslot */ - -fhandler_mailslot::fhandler_mailslot () - : fhandler_base () -{ -} - -int __stdcall -fhandler_mailslot::fstat (struct __stat64 *buf) -{ - debug_printf ("here"); - - fhandler_base::fstat (buf); - if (is_auto_device ()) - { - buf->st_mode = S_IFCHR | S_IRUSR | S_IWUSR; - buf->st_uid = geteuid32 (); - buf->st_gid = getegid32 (); - buf->st_nlink = 1; - buf->st_blksize = S_BLKSIZE; - time_as_timestruc_t (&buf->st_ctim); - buf->st_atim = buf->st_mtim = buf->st_ctim; - } - return 0; -} - -int -fhandler_mailslot::open (int flags, mode_t mode) -{ - int res = 0; - HANDLE x; - - switch (flags & O_ACCMODE) - { - case O_RDONLY: /* Server */ - x = CreateMailslot (get_win32_name (), - 0, /* Any message size */ - (flags & O_NONBLOCK) ? 0 : MAILSLOT_WAIT_FOREVER, - &sec_none); - if (x == INVALID_HANDLE_VALUE) - { - /* FIXME: It's not possible to open the read side of an existing - mailslot using CreateFile. You'll get a handle, but using it - in ReadFile returns ERROR_INVALID_PARAMETER. On the other - hand, CreateMailslot returns with ERROR_ALREADY_EXISTS if the - mailslot has been created already. - So this is an exclusive open for now. *Duplicating* read side - handles works, though, so it might be an option to duplicate - the handle from the first process to the current process for - opening the mailslot. */ -#if 0 - if (GetLastError () != ERROR_ALREADY_EXISTS) - { - __seterrno (); - break; - } - x = CreateFile (get_win32_name (), GENERIC_READ, wincap.shared (), - &sec_none, OPEN_EXISTING, 0, 0); -#endif - if (x == INVALID_HANDLE_VALUE) - { - __seterrno (); - break; - } - } - set_io_handle (x); - set_flags (flags, O_BINARY); - res = 1; - set_open_status (); - break; - case O_WRONLY: /* Client */ - /* The client is the DLL exclusively. Don't allow opening from - application code. */ - extern fhandler_mailslot *dev_kmsg; - if (this != dev_kmsg) - { - set_errno (EPERM); /* As on Linux. */ - break; - } - x = CreateFile (get_win32_name (), GENERIC_WRITE, wincap.shared (), - &sec_none, OPEN_EXISTING, 0, 0); - if (x == INVALID_HANDLE_VALUE) - { - __seterrno (); - break; - } - set_io_handle (x); - set_flags (flags, O_BINARY); - res = 1; - set_open_status (); - break; - default: - set_errno (EINVAL); - break; - } - return res; -} - -int -fhandler_mailslot::write (const void *ptr, size_t len) -{ - /* Check for 425/426 byte weirdness */ - if (len == 425 || len == 426) - { - char buf[427]; - buf[425] = buf[426] = '\0'; - memcpy (buf, ptr, len); - return raw_write (buf, 427); - } - return raw_write (ptr, len); -} - -int -fhandler_mailslot::ioctl (unsigned int cmd, void *buf) -{ - int res = -1; - - switch (cmd) - { - case FIONBIO: - { - DWORD timeout = buf ? 0 : MAILSLOT_WAIT_FOREVER; - if (!SetMailslotInfo (get_handle (), timeout)) - { - debug_printf ("SetMailslotInfo (%u): %E", timeout); - break; - } - } - /*FALLTHRU*/ - default: - res = fhandler_base::ioctl (cmd, buf); - break; - } - return res; -} diff --git a/winsup/cygwin/fhandler_mem.cc b/winsup/cygwin/fhandler_mem.cc deleted file mode 100644 index 24d681d4e..000000000 --- a/winsup/cygwin/fhandler_mem.cc +++ /dev/null @@ -1,284 +0,0 @@ -/* fhandler_mem.cc. See fhandler.h for a description of the fhandler classes. - - Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include "winsup.h" -#include -#include -#include - -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "ntdll.h" - -/**********************************************************************/ -/* fhandler_dev_mem */ - -fhandler_dev_mem::fhandler_dev_mem () - : fhandler_base () -{ -} - -fhandler_dev_mem::~fhandler_dev_mem () -{ -} - -int -fhandler_dev_mem::open (int flags, mode_t) -{ - if (!wincap.has_physical_mem_access ()) - { - set_errno (ENOENT); - debug_printf ("%s is accessible under NT/W2K only", dev ().name); - return 0; - } - - if (dev () == FH_MEM) /* /dev/mem */ - { - NTSTATUS ret; - SYSTEM_BASIC_INFORMATION sbi; - if ((ret = NtQuerySystemInformation (SystemBasicInformation, (PVOID) &sbi, - sizeof sbi, NULL)) != STATUS_SUCCESS) - { - __seterrno_from_nt_status (ret); - debug_printf("NtQuerySystemInformation: ret %d, Dos(ret) %E", ret); - mem_size = 0; - } - else - mem_size = sbi.PhysicalPageSize * sbi.NumberOfPhysicalPages; - debug_printf ("MemSize: %d MB", mem_size >> 20); - } - else if (dev () == FH_KMEM) /* /dev/kmem - Not yet supported */ - { - mem_size = 0; - debug_printf ("KMemSize: %d MB", mem_size >> 20); - } - else if (dev () == FH_PORT) /* /dev/port == First 64K of /dev/mem */ - { - mem_size = 65536; - debug_printf ("PortSize: 64 KB"); - } - else - { - mem_size = 0; - debug_printf ("Illegal minor number!!!"); - } - - /* Check for illegal flags. */ - if (flags & (O_APPEND | O_TRUNC | O_EXCL)) - { - set_errno (EINVAL); - return 0; - } - - UNICODE_STRING memstr; - RtlInitUnicodeString (&memstr, L"\\device\\physicalmemory"); - - OBJECT_ATTRIBUTES attr; - InitializeObjectAttributes (&attr, &memstr, - OBJ_CASE_INSENSITIVE | OBJ_INHERIT, - NULL, NULL); - - ACCESS_MASK section_access; - if ((flags & O_ACCMODE) == O_RDONLY) - { - set_access (GENERIC_READ); - section_access = SECTION_MAP_READ; - } - else if ((flags & O_ACCMODE) == O_WRONLY) - { - set_access (GENERIC_WRITE); - section_access = SECTION_MAP_READ | SECTION_MAP_WRITE; - } - else - { - set_access (GENERIC_READ | GENERIC_WRITE); - section_access = SECTION_MAP_READ | SECTION_MAP_WRITE; - } - - HANDLE mem; - NTSTATUS ret = NtOpenSection (&mem, section_access, &attr); - if (!NT_SUCCESS (ret)) - { - __seterrno_from_nt_status (ret); - set_io_handle (NULL); - return 0; - } - - set_io_handle (mem); - set_open_status (); - return 1; -} - -int -fhandler_dev_mem::write (const void *ptr, size_t ulen) -{ - if (!ulen || pos >= mem_size) - return 0; - - if (!(get_access () & GENERIC_WRITE)) - { - set_errno (EINVAL); - return -1; - } - - if (pos + ulen > mem_size) - ulen = mem_size - pos; - - PHYSICAL_ADDRESS phys; - NTSTATUS ret; - void *viewmem = NULL; - DWORD len = ulen + getsystempagesize () - 1; - - phys.QuadPart = (ULONGLONG) pos; - if ((ret = NtMapViewOfSection (get_handle (), - INVALID_HANDLE_VALUE, - &viewmem, - 0L, - len, - &phys, - &len, - ViewShare, - 0, - PAGE_READONLY)) != STATUS_SUCCESS) - { - __seterrno_from_nt_status (ret); - return -1; - } - - memcpy ((char *) viewmem + (pos - phys.QuadPart), ptr, ulen); - - if (!NT_SUCCESS (ret = NtUnmapViewOfSection (INVALID_HANDLE_VALUE, viewmem))) - { - __seterrno_from_nt_status (ret); - return -1; - } - - pos += ulen; - return ulen; -} - -void __stdcall -fhandler_dev_mem::read (void *ptr, size_t& ulen) -{ - if (!ulen || pos >= mem_size) - { - ulen = 0; - return; - } - - if (!(get_access () & GENERIC_READ)) - { - set_errno (EINVAL); - ulen = (size_t) -1; - return; - } - - if (pos + ulen > mem_size) - ulen = mem_size - pos; - - PHYSICAL_ADDRESS phys; - NTSTATUS ret; - void *viewmem = NULL; - DWORD len = ulen + getsystempagesize () - 1; - - phys.QuadPart = (ULONGLONG) pos; - if ((ret = NtMapViewOfSection (get_handle (), - INVALID_HANDLE_VALUE, - &viewmem, - 0L, - len, - &phys, - &len, - ViewShare, - 0, - PAGE_READONLY)) != STATUS_SUCCESS) - { - __seterrno_from_nt_status (ret); - ulen = (size_t) -1; - return; - } - - memcpy (ptr, (char *) viewmem + (pos - phys.QuadPart), ulen); - - if (!NT_SUCCESS (ret = NtUnmapViewOfSection (INVALID_HANDLE_VALUE, viewmem))) - { - __seterrno_from_nt_status (ret); - ulen = (size_t) -1; - return; - } - - pos += ulen; -} - -_off64_t -fhandler_dev_mem::lseek (_off64_t offset, int whence) -{ - switch (whence) - { - case SEEK_SET: - pos = offset; - break; - - case SEEK_CUR: - pos += offset; - break; - - case SEEK_END: - pos = mem_size; - pos += offset; - break; - - default: - set_errno (EINVAL); - return ILLEGAL_SEEK; - } - - if (pos > mem_size) - { - set_errno (EINVAL); - return ILLEGAL_SEEK; - } - - return pos; -} - -int -fhandler_dev_mem::fstat (struct __stat64 *buf) -{ - fhandler_base::fstat (buf); - buf->st_blksize = getsystempagesize (); - if (is_auto_device ()) - { - buf->st_mode = S_IFCHR; - if (wincap.has_physical_mem_access ()) - buf->st_mode |= S_IRUSR | S_IWUSR | - S_IRGRP | S_IWGRP | - S_IROTH | S_IWOTH; - } - - return 0; -} - -int -fhandler_dev_mem::dup (fhandler_base *child) -{ - int ret = fhandler_base::dup (child); - - if (! ret) - { - fhandler_dev_mem *fhc = (fhandler_dev_mem *) child; - - fhc->mem_size = mem_size; - fhc->pos = pos; - } - return ret; -} diff --git a/winsup/cygwin/fhandler_netdrive.cc b/winsup/cygwin/fhandler_netdrive.cc deleted file mode 100644 index 1cabce8b1..000000000 --- a/winsup/cygwin/fhandler_netdrive.cc +++ /dev/null @@ -1,277 +0,0 @@ -/* fhandler_netdrive.cc: fhandler for // and //MACHINE handling - - Copyright 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "sigproc.h" -#include "cygthread.h" -#include -#include - -#include - -enum - { - GET_RESOURCE_INFO = 0, - GET_RESOURCE_OPENENUM = 1, - GET_RESOURCE_OPENENUMTOP = 2, - GET_RESOURCE_ENUM = 3 - }; - -struct netdriveinf - { - int what; - int ret; - PVOID in; - PVOID out; - DWORD outsize; - HANDLE sem; - }; - -static DWORD WINAPI -thread_netdrive (void *arg) -{ - netdriveinf *ndi = (netdriveinf *) arg; - LPTSTR dummy = NULL; - LPNETRESOURCE nro, nro2; - DWORD size; - HANDLE enumhdl; - - ReleaseSemaphore (ndi->sem, 1, NULL); - switch (ndi->what) - { - case GET_RESOURCE_INFO: - nro = (LPNETRESOURCE) alloca (size = 4096); - ndi->ret = WNetGetResourceInformation ((LPNETRESOURCE) ndi->in, - nro, &size, &dummy); - break; - case GET_RESOURCE_OPENENUM: - case GET_RESOURCE_OPENENUMTOP: - nro = (LPNETRESOURCE) alloca (size = 4096); - ndi->ret = WNetGetResourceInformation ((LPNETRESOURCE) ndi->in, - nro, &size, &dummy); - if (ndi->ret != NO_ERROR) - break; - if (ndi->what == GET_RESOURCE_OPENENUMTOP) - { - nro2 = nro; - nro = (LPNETRESOURCE) alloca (size = 4096); - ndi->ret = WNetGetResourceParent (nro2, nro, &size); - if (ndi->ret != NO_ERROR) - break; - } - ndi->ret = WNetOpenEnum (RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, nro, - &enumhdl); - if (ndi->ret == NO_ERROR) - *(HANDLE *) ndi->out = enumhdl; - break; - case GET_RESOURCE_ENUM: - ndi->ret = WNetEnumResource ((HANDLE) ndi->in, (size = 1, &size), - (LPNETRESOURCE) ndi->out, &ndi->outsize); - break; - } - ReleaseSemaphore (ndi->sem, 1, NULL); - return 0; -} - -static DWORD -create_thread_and_wait (int what, PVOID in, PVOID out, DWORD outsize, - const char *name) -{ - netdriveinf ndi = { what, 0, in, out, outsize, - CreateSemaphore (&sec_none_nih, 0, 2, NULL) }; - cygthread *thr = new cygthread (thread_netdrive, 0, &ndi, name); - if (thr->detach (ndi.sem)) - ndi.ret = ERROR_OPERATION_ABORTED; - CloseHandle (ndi.sem); - return ndi.ret; -} - -/* Returns 0 if path doesn't exist, >0 if path is a directory, - -1 if path is a file, -2 if it's a symlink. */ -int -fhandler_netdrive::exists () -{ - char *to; - const char *from; - size_t len = strlen (get_name ()); - if (len == 2) - return 1; - char namebuf[len + 1]; - for (to = namebuf, from = get_name (); *from; to++, from++) - *to = (*from == '/') ? '\\' : *from; - *to = '\0'; - - NETRESOURCE nr = {0}; - nr.dwScope = RESOURCE_GLOBALNET; - nr.dwType = RESOURCETYPE_DISK; - nr.lpLocalName = NULL; - nr.lpRemoteName = namebuf; - DWORD ret = create_thread_and_wait (GET_RESOURCE_INFO, &nr, NULL, 0, - "WNetGetResourceInformation"); - if (ret != ERROR_MORE_DATA && ret != NO_ERROR) - return 0; - return 1; -} - -fhandler_netdrive::fhandler_netdrive (): - fhandler_virtual () -{ -} - -int -fhandler_netdrive::fstat (struct __stat64 *buf) -{ - const char *path = get_name (); - debug_printf ("fstat (%s)", path); - - fhandler_base::fstat (buf); - - buf->st_mode = S_IFDIR | STD_RBITS | STD_XBITS; - buf->st_ino = get_namehash (); - - return 0; -} - -int -fhandler_netdrive::readdir (DIR *dir, dirent *de) -{ - DWORD size; - NETRESOURCE *nro; - DWORD ret; - int res; - - if (!dir->__d_position) - { - size_t len = strlen (get_name ()); - char *namebuf; - NETRESOURCE nr = { 0 }; - - if (len == 2) /* // */ - { - namebuf = (char *) alloca (MAX_COMPUTERNAME_LENGTH + 3); - strcpy (namebuf, "\\\\"); - size = MAX_COMPUTERNAME_LENGTH + 1; - if (!GetComputerName (namebuf + 2, &size)) - { - res = geterrno_from_win_error (); - goto out; - } - } - else - { - const char *from; - char *to; - namebuf = (char *) alloca (len + 1); - for (to = namebuf, from = get_name (); *from; to++, from++) - *to = (*from == '/') ? '\\' : *from; - *to = '\0'; - } - - nr.lpRemoteName = namebuf; - nr.dwType = RESOURCETYPE_DISK; - nro = (NETRESOURCE *) alloca (4096); - ret = create_thread_and_wait (len == 2 ? GET_RESOURCE_OPENENUMTOP - : GET_RESOURCE_OPENENUM, - &nr, &dir->__handle, 0, "WNetOpenEnum"); - if (ret != NO_ERROR) - { - dir->__handle = INVALID_HANDLE_VALUE; - res = geterrno_from_win_error (ret); - goto out; - } - } - ret = create_thread_and_wait (GET_RESOURCE_ENUM, dir->__handle, - nro = (LPNETRESOURCE) alloca (16384), - 16384, "WnetEnumResource"); - if (ret != NO_ERROR) - res = geterrno_from_win_error (ret); - else - { - dir->__d_position++; - char *bs = strrchr (nro->lpRemoteName, '\\'); - strcpy (de->d_name, bs ? bs + 1 : nro->lpRemoteName); - if (strlen (get_name ()) == 2) - de->d_ino = hash_path_name (get_namehash (), de->d_name); - else - de->d_ino = readdir_get_ino (dir, nro->lpRemoteName, false); - - res = 0; - } -out: - syscall_printf ("%d = readdir (%p, %p)", res, dir, de); - return res; -} - -void -fhandler_netdrive::seekdir (DIR *dir, _off64_t pos) -{ - rewinddir (dir); - if (pos < 0) - return; - while (dir->__d_position < pos) - if (!readdir (dir, dir->__d_dirent)) - break; -} - -void -fhandler_netdrive::rewinddir (DIR *dir) -{ - if (dir->__handle != INVALID_HANDLE_VALUE) - WNetCloseEnum (dir->__handle); - dir->__handle = INVALID_HANDLE_VALUE; - return fhandler_virtual::rewinddir (dir); -} - -int -fhandler_netdrive::closedir (DIR *dir) -{ - rewinddir (dir); - return fhandler_virtual::closedir (dir); -} - -int -fhandler_netdrive::open (int flags, mode_t mode) -{ - int res = fhandler_virtual::open (flags, mode); - if (!res) - goto out; - - nohandle (true); - - if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) - { - set_errno (EEXIST); - res = 0; - goto out; - } - else if (flags & O_WRONLY) - { - set_errno (EISDIR); - res = 0; - goto out; - } - - res = 1; - set_flags ((flags & ~O_TEXT) | O_BINARY | O_DIROPEN); - set_open_status (); -out: - syscall_printf ("%d = fhandler_netdrive::open (%p, %d)", res, flags, mode); - return res; -} - diff --git a/winsup/cygwin/fhandler_nodevice.cc b/winsup/cygwin/fhandler_nodevice.cc deleted file mode 100644 index c23e4434b..000000000 --- a/winsup/cygwin/fhandler_nodevice.cc +++ /dev/null @@ -1,41 +0,0 @@ -/* fhandler.cc. See console.cc for fhandler_console functions. - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "perprocess.h" -#include "security.h" -#include "cygwin/version.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "shared_info.h" -#include "pinfo.h" -#include -#include - -int -fhandler_nodevice::open (int, mode_t) -{ - if (!pc.error) - set_errno (ENXIO); - return 0; -} - -fhandler_nodevice::fhandler_nodevice () -{ -} diff --git a/winsup/cygwin/fhandler_proc.cc b/winsup/cygwin/fhandler_proc.cc deleted file mode 100644 index 7a67cf0b1..000000000 --- a/winsup/cygwin/fhandler_proc.cc +++ /dev/null @@ -1,1103 +0,0 @@ -/* fhandler_proc.cc: fhandler for /proc virtual filesystem - - Copyright 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#define _WIN32_WINNT 0x0501 - -#include "winsup.h" -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "pinfo.h" -#include "dtable.h" -#include "cygheap.h" -#include -#include -#include -#include "ntdll.h" -#include -#include -#include -#include "cpuid.h" - -#define _COMPILING_NEWLIB -#include - -/* offsets in proc_listing */ -static const int PROC_LOADAVG = 2; // /proc/loadavg -static const int PROC_MEMINFO = 3; // /proc/meminfo -static const int PROC_REGISTRY = 4; // /proc/registry -static const int PROC_STAT = 5; // /proc/stat -static const int PROC_VERSION = 6; // /proc/version -static const int PROC_UPTIME = 7; // /proc/uptime -static const int PROC_CPUINFO = 8; // /proc/cpuinfo -static const int PROC_PARTITIONS = 9; // /proc/partitions -static const int PROC_SELF = 10; // /proc/self - -/* names of objects in /proc */ -static const char *proc_listing[] = { - ".", - "..", - "loadavg", - "meminfo", - "registry", - "stat", - "version", - "uptime", - "cpuinfo", - "partitions", - "self", - NULL -}; - -static const int PROC_LINK_COUNT = (sizeof (proc_listing) / sizeof (const char *)) - 1; - -/* FH_PROC in the table below means the file/directory is handles by - * fhandler_proc. - */ -static const DWORD proc_fhandlers[PROC_LINK_COUNT] = { - FH_PROC, - FH_PROC, - FH_PROC, - FH_PROC, - FH_REGISTRY, - FH_PROC, - FH_PROC, - FH_PROC, - FH_PROC, - FH_PROC, - FH_PROC, -}; - -/* name of the /proc filesystem */ -const char proc[] = "/proc"; -const int proc_len = sizeof (proc) - 1; - -static _off64_t format_proc_meminfo (char *destbuf, size_t maxsize); -static _off64_t format_proc_stat (char *destbuf, size_t maxsize); -static _off64_t format_proc_uptime (char *destbuf, size_t maxsize); -static _off64_t format_proc_cpuinfo (char *destbuf, size_t maxsize); -static _off64_t format_proc_partitions (char *destbuf, size_t maxsize); - -/* Auxillary function that returns the fhandler associated with the given path - this is where it would be nice to have pattern matching in C - polymorphism - just doesn't cut it. */ -DWORD -fhandler_proc::get_proc_fhandler (const char *path) -{ - debug_printf ("get_proc_fhandler(%s)", path); - path += proc_len; - /* Since this method is called from path_conv::check we can't rely on - it being normalised and therefore the path may have runs of slashes - in it. */ - while (isdirsep (*path)) - path++; - - /* Check if this is the root of the virtual filesystem (i.e. /proc). */ - if (*path == 0) - return FH_PROC; - - for (int i = 0; proc_listing[i]; i++) - { - if (path_prefix_p (proc_listing[i], path, strlen (proc_listing[i]))) - return proc_fhandlers[i]; - } - - if (pinfo (atoi (path))) - return FH_PROCESS; - - bool has_subdir = false; - while (*path) - if (isdirsep (*path++)) - { - has_subdir = true; - break; - } - - if (has_subdir) - /* The user is trying to access a non-existent subdirectory of /proc. */ - return FH_BAD; - else - /* Return FH_PROC so that we can return EROFS if the user is trying to create - a file. */ - return FH_PROC; -} - -/* Returns 0 if path doesn't exist, >0 if path is a directory, - -1 if path is a file, -2 if it's a symlink. */ -int -fhandler_proc::exists () -{ - const char *path = get_name (); - debug_printf ("exists (%s)", path); - path += proc_len; - if (*path == 0) - return 2; - for (int i = 0; proc_listing[i]; i++) - if (pathmatch (path + 1, proc_listing[i])) - { - fileid = i; - return (proc_fhandlers[i] == FH_PROC) ? (i == PROC_SELF ? -2 : -1) : 1; - } - return 0; -} - -fhandler_proc::fhandler_proc (): - fhandler_virtual () -{ -} - -int -fhandler_proc::fstat (struct __stat64 *buf) -{ - const char *path = get_name (); - debug_printf ("fstat (%s)", path); - - path += proc_len; - fhandler_base::fstat (buf); - - buf->st_mode &= ~_IFMT & NO_W; - - if (!*path) - { - buf->st_nlink = 1; - buf->st_mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH; - return 0; - } - else - { - path++; - for (int i = 0; proc_listing[i]; i++) - if (pathmatch (path, proc_listing[i])) - { - if (proc_fhandlers[i] != FH_PROC) - buf->st_mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH; - else if (i == PROC_SELF) - buf->st_mode = S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO; - else - { - buf->st_mode &= NO_X; - buf->st_mode |= S_IFREG; - } - return 0; - } - } - set_errno (ENOENT); - return -1; -} - -int -fhandler_proc::readdir (DIR *dir, dirent *de) -{ - int res; - if (dir->__d_position < PROC_LINK_COUNT) - { - strcpy (de->d_name, proc_listing[dir->__d_position++]); - dir->__flags |= dirent_saw_dot | dirent_saw_dot_dot; - res = 0; - } - else - { - winpids pids ((DWORD) 0); - int found = 0; - res = ENMFILE; - for (unsigned i = 0; i < pids.npids; i++) - if (found++ == dir->__d_position - PROC_LINK_COUNT) - { - __small_sprintf (de->d_name, "%d", pids[i]->pid); - dir->__d_position++; - res = 0; - break; - } - } - - syscall_printf ("%d = readdir (%p, %p) (%s)", res, dir, de, de->d_name); - return res; -} - -int -fhandler_proc::open (int flags, mode_t mode) -{ - int proc_file_no = -1; - - int res = fhandler_virtual::open (flags, mode); - if (!res) - goto out; - - nohandle (true); - - const char *path; - - path = get_name () + proc_len; - - if (!*path) - { - if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) - { - set_errno (EEXIST); - res = 0; - goto out; - } - else if (flags & O_WRONLY) - { - set_errno (EISDIR); - res = 0; - goto out; - } - else - { - flags |= O_DIROPEN; - goto success; - } - } - - proc_file_no = -1; - for (int i = 0; proc_listing[i]; i++) - if (path_prefix_p (proc_listing[i], path + 1, strlen (proc_listing[i]))) - { - proc_file_no = i; - if (proc_fhandlers[i] != FH_PROC) - { - if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) - { - set_errno (EEXIST); - res = 0; - goto out; - } - else if (flags & O_WRONLY) - { - set_errno (EISDIR); - res = 0; - goto out; - } - else - { - flags |= O_DIROPEN; - goto success; - } - } - } - - if (proc_file_no == -1) - { - if (flags & O_CREAT) - { - set_errno (EROFS); - res = 0; - goto out; - } - else - { - set_errno (ENOENT); - res = 0; - goto out; - } - } - if (flags & O_WRONLY) - { - set_errno (EROFS); - res = 0; - goto out; - } - - fileid = proc_file_no; - if (!fill_filebuf ()) - { - res = 0; - goto out; - } - - if (flags & O_APPEND) - position = filesize; - else - position = 0; - -success: - res = 1; - set_flags ((flags & ~O_TEXT) | O_BINARY); - set_open_status (); -out: - syscall_printf ("%d = fhandler_proc::open (%p, %d)", res, flags, mode); - return res; -} - -bool -fhandler_proc::fill_filebuf () -{ - switch (fileid) - { - case PROC_VERSION: - { - if (!filebuf) - { - struct utsname uts_name; - uname (&uts_name); - bufalloc = strlen (uts_name.sysname) + 1 + strlen (uts_name.release) + - 1 + strlen (uts_name.version) + 2; - filebuf = (char *) crealloc (filebuf, bufalloc); - filesize = __small_sprintf (filebuf, "%s %s %s\n", uts_name.sysname, - uts_name.release, uts_name.version); - } - break; - } - case PROC_UPTIME: - { - filebuf = (char *) crealloc (filebuf, bufalloc = 80); - filesize = format_proc_uptime (filebuf, bufalloc); - break; - } - case PROC_STAT: - { - filebuf = (char *) crealloc (filebuf, bufalloc = 16384); - filesize = format_proc_stat (filebuf, bufalloc); - break; - } - case PROC_LOADAVG: - { - /* - * not really supported - Windows doesn't keep track of these values - * Windows 95/98/me does have the KERNEL/CPUUsage performance counter - * which is similar. - */ - filebuf = (char *) crealloc (filebuf, bufalloc = 16); - filesize = __small_sprintf (filebuf, "%u.%02u %u.%02u %u.%02u\n", - 0, 0, 0, 0, 0, 0); - break; - } - case PROC_MEMINFO: - { - filebuf = (char *) crealloc (filebuf, bufalloc = 2048); - filesize = format_proc_meminfo (filebuf, bufalloc); - break; - } - case PROC_CPUINFO: - { - filebuf = (char *) crealloc (filebuf, bufalloc = 16384); - filesize = format_proc_cpuinfo (filebuf, bufalloc); - break; - } - case PROC_PARTITIONS: - { - filebuf = (char *) crealloc (filebuf, bufalloc = 4096); - filesize = format_proc_partitions (filebuf, bufalloc); - break; - } - case PROC_SELF: - { - filebuf = (char *) crealloc (filebuf, bufalloc = 32); - filesize = __small_sprintf (filebuf, "%d", getpid ()); - } - } - return true; -} - -static _off64_t -format_proc_meminfo (char *destbuf, size_t maxsize) -{ - unsigned long mem_total = 0UL, mem_free = 0UL, swap_total = 0UL, - swap_free = 0UL; - MEMORYSTATUS memory_status; - GlobalMemoryStatus (&memory_status); - mem_total = memory_status.dwTotalPhys; - mem_free = memory_status.dwAvailPhys; - PSYSTEM_PAGEFILE_INFORMATION spi = NULL; - ULONG size = 512; - NTSTATUS ret = STATUS_SUCCESS; - spi = (PSYSTEM_PAGEFILE_INFORMATION) malloc (size); - if (spi) - { - ret = NtQuerySystemInformation (SystemPagefileInformation, (PVOID) spi, - size, &size); - if (ret == STATUS_INFO_LENGTH_MISMATCH) - { - free (spi); - spi = (PSYSTEM_PAGEFILE_INFORMATION) malloc (size); - if (spi) - ret = NtQuerySystemInformation (SystemPagefileInformation, - (PVOID) spi, size, &size); - } - } - if (!spi || ret || (!ret && GetLastError () == ERROR_PROC_NOT_FOUND)) - { - swap_total = memory_status.dwTotalPageFile - mem_total; - swap_free = memory_status.dwAvailPageFile - mem_total; - } - else - { - PSYSTEM_PAGEFILE_INFORMATION spp = spi; - do - { - swap_total += spp->CurrentSize * getsystempagesize (); - swap_free += (spp->CurrentSize - spp->TotalUsed) - * getsystempagesize (); - } - while (spp->NextEntryOffset - && (spp = (PSYSTEM_PAGEFILE_INFORMATION) - ((char *) spp + spp->NextEntryOffset))); - } - if (spi) - free (spi); - return __small_sprintf (destbuf, " total: used: free:\n" - "Mem: %10lu %10lu %10lu\n" - "Swap: %10lu %10lu %10lu\n" - "MemTotal: %10lu kB\n" - "MemFree: %10lu kB\n" - "MemShared: 0 kB\n" - "HighTotal: 0 kB\n" - "HighFree: 0 kB\n" - "LowTotal: %10lu kB\n" - "LowFree: %10lu kB\n" - "SwapTotal: %10lu kB\n" - "SwapFree: %10lu kB\n", - mem_total, mem_total - mem_free, mem_free, - swap_total, swap_total - swap_free, swap_free, - mem_total >> 10, mem_free >> 10, - mem_total >> 10, mem_free >> 10, - swap_total >> 10, swap_free >> 10); -} - -static _off64_t -format_proc_uptime (char *destbuf, size_t maxsize) -{ - unsigned long long uptime = 0ULL, idle_time = 0ULL; - - if (wincap.is_winnt ()) - { - NTSTATUS ret; - SYSTEM_BASIC_INFORMATION sbi; - - ret = NtQuerySystemInformation (SystemBasicInformation, (PVOID) &sbi, - sizeof sbi, NULL); - if (!NT_SUCCESS (ret)) - { - __seterrno_from_nt_status (ret); - debug_printf ("NtQuerySystemInformation: ret %d, Dos(ret) %E", ret); - sbi.NumberProcessors = 1; - } - - SYSTEM_PROCESSOR_TIMES spt[sbi.NumberProcessors]; - ret = NtQuerySystemInformation (SystemProcessorTimes, (PVOID) spt, - sizeof spt[0] * sbi.NumberProcessors, - NULL); - if (NT_SUCCESS (ret)) - for (int i = 0; i < sbi.NumberProcessors; i++) - { - uptime += (spt[i].KernelTime.QuadPart + spt[i].UserTime.QuadPart) - / 100000ULL; - idle_time += spt[i].IdleTime.QuadPart / 100000ULL; - } - uptime /= sbi.NumberProcessors; - idle_time /= sbi.NumberProcessors; - } - if (!uptime) - uptime = GetTickCount () / 10; - - return __small_sprintf (destbuf, "%U.%02u %U.%02u\n", - uptime / 100, long (uptime % 100), - idle_time / 100, long (idle_time % 100)); -} - -static _off64_t -format_proc_stat (char *destbuf, size_t maxsize) -{ - unsigned long pages_in = 0UL, pages_out = 0UL, interrupt_count = 0UL, - context_switches = 0UL, swap_in = 0UL, swap_out = 0UL; - time_t boot_time = 0; - - char *eobuf = destbuf; - if (!wincap.is_winnt ()) - eobuf += __small_sprintf (destbuf, "cpu %U %U %U %U\n", 0ULL, 0ULL, 0ULL, 0ULL); - else - { - NTSTATUS ret; - SYSTEM_PERFORMANCE_INFORMATION spi; - SYSTEM_TIME_OF_DAY_INFORMATION stodi; - - SYSTEM_BASIC_INFORMATION sbi; - if ((ret = NtQuerySystemInformation (SystemBasicInformation, - (PVOID) &sbi, sizeof sbi, NULL)) - != STATUS_SUCCESS) - { - __seterrno_from_nt_status (ret); - debug_printf ("NtQuerySystemInformation: ret %d, Dos(ret) %E", ret); - sbi.NumberProcessors = 1; - } - - SYSTEM_PROCESSOR_TIMES spt[sbi.NumberProcessors]; - ret = NtQuerySystemInformation (SystemProcessorTimes, (PVOID) spt, - sizeof spt[0] * sbi.NumberProcessors, NULL); - interrupt_count = 0; - if (ret == STATUS_SUCCESS) - { - unsigned long long user_time = 0ULL, kernel_time = 0ULL, idle_time = 0ULL; - for (int i = 0; i < sbi.NumberProcessors; i++) - { - kernel_time += (spt[i].KernelTime.QuadPart - spt[i].IdleTime.QuadPart) * HZ / 10000000ULL; - user_time += spt[i].UserTime.QuadPart * HZ / 10000000ULL; - idle_time += spt[i].IdleTime.QuadPart * HZ / 10000000ULL; - } - - eobuf += __small_sprintf (eobuf, "cpu %U %U %U %U\n", - user_time, 0ULL, kernel_time, idle_time); - user_time = 0ULL, kernel_time = 0ULL, idle_time = 0ULL; - for (int i = 0; i < sbi.NumberProcessors; i++) - { - interrupt_count += spt[i].InterruptCount; - kernel_time = (spt[i].KernelTime.QuadPart - spt[i].IdleTime.QuadPart) * HZ / 10000000ULL; - user_time = spt[i].UserTime.QuadPart * HZ / 10000000ULL; - idle_time = spt[i].IdleTime.QuadPart * HZ / 10000000ULL; - eobuf += __small_sprintf (eobuf, "cpu%d %U %U %U %U\n", i, - user_time, 0ULL, kernel_time, idle_time); - } - - ret = NtQuerySystemInformation (SystemPerformanceInformation, - (PVOID) &spi, sizeof spi, NULL); - } - if (ret == STATUS_SUCCESS) - ret = NtQuerySystemInformation (SystemTimeOfDayInformation, - (PVOID) &stodi, - sizeof stodi, NULL); - if (ret != STATUS_SUCCESS) - { - __seterrno_from_nt_status (ret); - debug_printf("NtQuerySystemInformation: ret %d, Dos(ret) %E", ret); - return 0; - } - pages_in = spi.PagesRead; - pages_out = spi.PagefilePagesWritten + spi.MappedFilePagesWritten; - /* - * Note: there is no distinction made in this structure between pages - * read from the page file and pages read from mapped files, but there - * is such a distinction made when it comes to writing. Goodness knows - * why. The value of swap_in, then, will obviously be wrong but its our - * best guess. - */ - swap_in = spi.PagesRead; - swap_out = spi.PagefilePagesWritten; - context_switches = spi.ContextSwitches; - boot_time = to_time_t ((FILETIME *) &stodi.BootTime.QuadPart); - } - /* - * else - * { - * There are only two relevant performance counters on Windows 95/98/me, - * VMM/cPageIns and VMM/cPageOuts. The extra effort needed to read these - * counters is by no means worth it. - * } - */ - eobuf += __small_sprintf (eobuf, "page %u %u\n" - "swap %u %u\n" - "intr %u\n" - "ctxt %u\n" - "btime %u\n", - pages_in, pages_out, - swap_in, swap_out, - interrupt_count, - context_switches, - boot_time); - return eobuf - destbuf; -} - -#define read_value(x,y) \ - do {\ - dwCount = BUFSIZE; \ - if ((dwError = RegQueryValueEx (hKey, x, NULL, &dwType, (BYTE *) szBuffer, &dwCount)), \ - (dwError != ERROR_SUCCESS && dwError != ERROR_MORE_DATA)) \ - { \ - __seterrno_from_win_error (dwError); \ - debug_printf ("RegQueryValueEx failed retcode %d", dwError); \ - return 0; \ - } \ - if (dwType != y) \ - { \ - debug_printf ("Value %s had an unexpected type (expected %d, found %d)", y, dwType); \ - return 0; \ - }\ - } while (0) - -#define print(x) \ - do { \ - strcpy (bufptr, x), \ - bufptr += sizeof (x) - 1; \ - } while (0) - -static _off64_t -format_proc_cpuinfo (char *destbuf, size_t maxsize) -{ - SYSTEM_INFO siSystemInfo; - HKEY hKey; - DWORD dwError, dwCount, dwType; - DWORD dwOldThreadAffinityMask; - int cpu_number; - const int BUFSIZE = 256; - CHAR szBuffer[BUFSIZE]; - char *bufptr = destbuf; - - GetSystemInfo (&siSystemInfo); - - for (cpu_number = 0; ; cpu_number++) - { - __small_sprintf (szBuffer, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%d", cpu_number); - - if ((dwError = RegOpenKeyEx (HKEY_LOCAL_MACHINE, szBuffer, 0, KEY_QUERY_VALUE, &hKey)) != ERROR_SUCCESS) - { - if (dwError == ERROR_FILE_NOT_FOUND) - break; - __seterrno_from_win_error (dwError); - debug_printf ("RegOpenKeyEx failed retcode %d", dwError); - return 0; - } - - dwOldThreadAffinityMask = SetThreadAffinityMask (GetCurrentThread (), 1 << cpu_number); - if (dwOldThreadAffinityMask == 0) - debug_printf ("SetThreadAffinityMask failed %E"); - // I'm not sure whether the thread changes processor immediately - // and I'm not sure whether this function will cause the thread to be rescheduled - low_priority_sleep (0); - - bool has_cpuid = false; - - if (!can_set_flag (0x00040000)) - debug_printf ("386 processor - no cpuid"); - else - { - debug_printf ("486 processor"); - if (can_set_flag (0x00200000)) - { - debug_printf ("processor supports CPUID instruction"); - has_cpuid = true; - } - else - debug_printf ("processor does not support CPUID instruction"); - } - - - if (!has_cpuid) - { - bufptr += __small_sprintf (bufptr, "processor : %d\n", cpu_number); - read_value ("VendorIdentifier", REG_SZ); - bufptr += __small_sprintf (bufptr, "vendor_id : %s\n", szBuffer); - read_value ("Identifier", REG_SZ); - bufptr += __small_sprintf (bufptr, "identifier : %s\n", szBuffer); - if (wincap.is_winnt ()) - { - read_value ("~Mhz", REG_DWORD); - bufptr += __small_sprintf (bufptr, "cpu MHz : %u\n", *(DWORD *) szBuffer); - - print ("flags :"); - if (IsProcessorFeaturePresent (PF_3DNOW_INSTRUCTIONS_AVAILABLE)) - print (" 3dnow"); - if (IsProcessorFeaturePresent (PF_COMPARE_EXCHANGE_DOUBLE)) - print (" cx8"); - if (!IsProcessorFeaturePresent (PF_FLOATING_POINT_EMULATED)) - print (" fpu"); - if (IsProcessorFeaturePresent (PF_MMX_INSTRUCTIONS_AVAILABLE)) - print (" mmx"); - if (IsProcessorFeaturePresent (PF_PAE_ENABLED)) - print (" pae"); - if (IsProcessorFeaturePresent (PF_RDTSC_INSTRUCTION_AVAILABLE)) - print (" tsc"); - if (IsProcessorFeaturePresent (PF_XMMI_INSTRUCTIONS_AVAILABLE)) - print (" sse"); - if (IsProcessorFeaturePresent (PF_XMMI64_INSTRUCTIONS_AVAILABLE)) - print (" sse2"); - } - } - else - { - bufptr += __small_sprintf (bufptr, "processor : %d\n", cpu_number); - unsigned maxf, vendor_id[4], unused; - cpuid (&maxf, &vendor_id[0], &vendor_id[2], &vendor_id[1], 0); - maxf &= 0xffff; - vendor_id[3] = 0; - - // vendor identification - bool is_amd = false, is_intel = false; - if (!strcmp ((char*)vendor_id, "AuthenticAMD")) - is_amd = true; - else if (!strcmp ((char*)vendor_id, "GenuineIntel")) - is_intel = true; - - bufptr += __small_sprintf (bufptr, "vendor_id : %s\n", (char *)vendor_id); - unsigned cpu_mhz = 0; - if (wincap.is_winnt ()) - { - read_value ("~Mhz", REG_DWORD); - cpu_mhz = *(DWORD *)szBuffer; - } - if (maxf >= 1) - { - unsigned features2, features1, extra_info, cpuid_sig; - cpuid (&cpuid_sig, &extra_info, &features2, &features1, 1); - /* unsigned extended_family = (cpuid_sig & 0x0ff00000) >> 20, - extended_model = (cpuid_sig & 0x000f0000) >> 16; */ - unsigned type = (cpuid_sig & 0x00003000) >> 12, - family = (cpuid_sig & 0x00000f00) >> 8, - model = (cpuid_sig & 0x000000f0) >> 4, - stepping = cpuid_sig & 0x0000000f; - unsigned brand_id = extra_info & 0x0000000f, - cpu_count = (extra_info & 0x00ff0000) >> 16, - apic_id = (extra_info & 0xff000000) >> 24; - const char *type_str; - switch (type) - { - case 0: - type_str = "primary processor"; - break; - case 1: - type_str = "overdrive processor"; - break; - case 2: - type_str = "secondary processor"; - break; - case 3: - default: - type_str = "reserved"; - break; - } - unsigned maxe = 0; - cpuid (&maxe, &unused, &unused, &unused, 0x80000000); - if (maxe >= 0x80000004) - { - unsigned *model_name = (unsigned *) szBuffer; - cpuid (&model_name[0], &model_name[1], &model_name[2], &model_name[3], 0x80000002); - cpuid (&model_name[4], &model_name[5], &model_name[6], &model_name[7], 0x80000003); - cpuid (&model_name[8], &model_name[9], &model_name[10], &model_name[11], 0x80000004); - model_name[12] = 0; - } - else - { - // could implement a lookup table here if someone needs it - strcpy (szBuffer, "unknown"); - } - if (wincap.is_winnt ()) - { - bufptr += __small_sprintf (bufptr, "type : %s\n" - "cpu family : %d\n" - "model : %d\n" - "model name : %s\n" - "stepping : %d\n" - "brand id : %d\n" - "cpu count : %d\n" - "apic id : %d\n" - "cpu MHz : %d\n" - "fpu : %s\n", - type_str, - family, - model, - szBuffer + strspn (szBuffer, " "), - stepping, - brand_id, - cpu_count, - apic_id, - cpu_mhz, - (features1 & (1 << 0)) ? "yes" : "no"); - } - else - { - bufptr += __small_sprintf (bufptr, "type : %s\n" - "cpu family : %d\n" - "model : %d\n" - "model name : %s\n" - "stepping : %d\n" - "brand id : %d\n" - "cpu count : %d\n" - "apic id : %d\n" - "fpu : %s\n", - type_str, - family, - model, - szBuffer, - stepping, - brand_id, - cpu_count, - apic_id, - (features1 & (1 << 0)) ? "yes" : "no"); - } - print ("flags :"); - if (features1 & (1 << 0)) - print (" fpu"); - if (features1 & (1 << 1)) - print (" vme"); - if (features1 & (1 << 2)) - print (" de"); - if (features1 & (1 << 3)) - print (" pse"); - if (features1 & (1 << 4)) - print (" tsc"); - if (features1 & (1 << 5)) - print (" msr"); - if (features1 & (1 << 6)) - print (" pae"); - if (features1 & (1 << 7)) - print (" mce"); - if (features1 & (1 << 8)) - print (" cx8"); - if (features1 & (1 << 9)) - print (" apic"); - if (features1 & (1 << 11)) - print (" sep"); - if (features1 & (1 << 12)) - print (" mtrr"); - if (features1 & (1 << 13)) - print (" pge"); - if (features1 & (1 << 14)) - print (" mca"); - if (features1 & (1 << 15)) - print (" cmov"); - if (features1 & (1 << 16)) - print (" pat"); - if (features1 & (1 << 17)) - print (" pse36"); - if (features1 & (1 << 18)) - print (" psn"); - if (features1 & (1 << 19)) - print (" clfl"); - if (is_intel && features1 & (1 << 21)) - print (" dtes"); - if (is_intel && features1 & (1 << 22)) - print (" acpi"); - if (features1 & (1 << 23)) - print (" mmx"); - if (features1 & (1 << 24)) - print (" fxsr"); - if (features1 & (1 << 25)) - print (" sse"); - if (is_intel) - { - if (features1 & (1 << 26)) - print (" sse2"); - if (features1 & (1 << 27)) - print (" ss"); - if (features1 & (1 << 28)) - print (" htt"); - if (features1 & (1 << 29)) - print (" tmi"); - if (features1 & (1 << 30)) - print (" ia-64"); - if (features1 & (1 << 31)) - print (" pbe"); - - if (features2 & (1 << 0)) - print (" pni"); - if (features2 & (1 << 3)) - print (" monitor"); - if (features2 & (1 << 4)) - print (" ds_cpl"); - if (features2 & (1 << 7)) - print (" tm2"); - if (features2 & (1 << 8)) - print (" est"); - if (features2 & (1 << 10)) - print (" cid"); - } - - if (is_amd && maxe >= 0x80000001) - { - // uses AMD extended calls to check - // for 3dnow and 3dnow extended support - // (source: AMD Athlon Processor Recognition Application Note) - - if (maxe >= 0x80000001) // has basic capabilities - { - cpuid (&unused, &unused, &unused, &features2, 0x80000001); - - if (features2 & (1 << 11)) - print (" syscall"); - if (features2 & (1 << 19)) - print (" mp"); - if (features2 & (1 << 22)) - print (" mmxext"); - if (features2 & (1 << 29)) - print (" lm"); - if (features2 & (1 << 30)) // 31th bit is on - print (" 3dnowext"); - if (features2 & (1 << 31)) // 32th bit (highest) is on - print (" 3dnow"); - } - } - } - else if (wincap.is_winnt ()) - { - bufptr += __small_sprintf (bufptr, "cpu MHz : %d\n" - "fpu : %s\n", - cpu_mhz, - IsProcessorFeaturePresent (PF_FLOATING_POINT_EMULATED) ? "no" : "yes"); - } - } - if (dwOldThreadAffinityMask != 0) - SetThreadAffinityMask (GetCurrentThread (), dwOldThreadAffinityMask); - - RegCloseKey (hKey); - bufptr += __small_sprintf (bufptr, "\n"); - } - - return bufptr - destbuf; -} - -#undef read_value - -static _off64_t -format_proc_partitions (char *destbuf, size_t maxsize) -{ - char *bufptr = destbuf; - print ("major minor #blocks name\n\n"); - - if (!wincap.is_winnt ()) - return bufptr - destbuf; - - char devname[CYG_MAX_PATH]; - OBJECT_ATTRIBUTES attr; - HANDLE dirhdl, devhdl; - IO_STATUS_BLOCK io; - NTSTATUS status; - - /* Open \Device object directory. */ - wchar_t wpath[CYG_MAX_PATH] = L"\\Device"; - UNICODE_STRING upath = {14, 16, wpath}; - InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE, NULL, NULL); - status = NtOpenDirectoryObject (&dirhdl, DIRECTORY_QUERY, &attr); - if (!NT_SUCCESS (status)) - { - debug_printf ("NtOpenDirectoryObject %x", status); - return bufptr - destbuf; - } - - /* Traverse \Device directory ... */ - PDIRECTORY_BASIC_INFORMATION dbi = (PDIRECTORY_BASIC_INFORMATION) - alloca (640); - BOOLEAN restart = TRUE; - ULONG context = 0; - while (NT_SUCCESS (NtQueryDirectoryObject (dirhdl, dbi, 640, TRUE, restart, - &context, NULL))) - { - restart = FALSE; - sys_wcstombs (devname, CYG_MAX_PATH - 1, dbi->ObjectName.Buffer, - dbi->ObjectName.Length / 2); - /* ... and check for a "Harddisk[0-9]*" entry. */ - if (!strncasematch (devname, "Harddisk", 8) - || dbi->ObjectName.Length < 18 - || !isdigit (devname[8])) - continue; - /* Construct path name for partition 0, which is the whole disk, - and try to open. */ - wcscpy (wpath, dbi->ObjectName.Buffer); - wcscpy (wpath + dbi->ObjectName.Length / 2, L"\\Partition0"); - upath.Length = 22 + dbi->ObjectName.Length; - upath.MaximumLength = upath.Length + 2; - InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE, - dirhdl, NULL); - status = NtOpenFile (&devhdl, READ_CONTROL | FILE_READ_DATA, &attr, &io, - wincap.shared (), 0); - if (!NT_SUCCESS (status)) - { - /* Retry with READ_CONTROL only for non-privileged users. This - at least prints the Partition0 info, but it doesn't allow access - to the drive's layout information. It beats me, though, why - a non-privileged user shouldn't get read access to the drive - layout information. */ - status = NtOpenFile (&devhdl, READ_CONTROL, &attr, &io, - wincap.shared (), 0); - if (!NT_SUCCESS (status)) - { - debug_printf ("NtOpenFile(%s) %x", devname, status); - continue; - } - } - - /* Use a buffer since some ioctl buffers aren't fixed size. */ - char buf[256]; - PARTITION_INFORMATION *pi = NULL; - PARTITION_INFORMATION_EX *pix = NULL; - DISK_GEOMETRY *dg = NULL; - DWORD bytes; - unsigned long drive_number = strtoul (devname + 8, NULL, 10); - unsigned long long size; - - if (wincap.has_disk_ex_ioctls () - && DeviceIoControl (devhdl, IOCTL_DISK_GET_PARTITION_INFO_EX, - NULL, 0, buf, 256, &bytes, NULL)) - { - pix = (PARTITION_INFORMATION_EX *) buf; - size = pix->PartitionLength.QuadPart; - } - else if (DeviceIoControl (devhdl, IOCTL_DISK_GET_PARTITION_INFO, - NULL, 0, buf, 256, &bytes, NULL)) - { - pi = (PARTITION_INFORMATION *) buf; - size = pi->PartitionLength.QuadPart; - } - else if (DeviceIoControl (devhdl, IOCTL_DISK_GET_DRIVE_GEOMETRY, - NULL, 0, buf, 256, &bytes, NULL)) - { - dg = (DISK_GEOMETRY *) buf; - size = (unsigned long long) dg->Cylinders.QuadPart - * dg->TracksPerCylinder - * dg->SectorsPerTrack - * dg->BytesPerSector; - } - else - size = 0; - if (!pi && !pix && !dg) - debug_printf ("DeviceIoControl %E"); - else - { - device dev; - dev.parsedisk (drive_number, 0); - bufptr += __small_sprintf (bufptr, "%5d %5d %9U %s\n", - dev.major, dev.minor, - size >> 10, dev.name + 5); - } - size_t buf_size = 8192; - while (true) - { - char buf[buf_size]; - if (DeviceIoControl (devhdl, IOCTL_DISK_GET_DRIVE_LAYOUT, - NULL, 0, (DRIVE_LAYOUT_INFORMATION *) buf, - buf_size, &bytes, NULL)) - /* fall through */; - else if (GetLastError () == ERROR_INSUFFICIENT_BUFFER) - { - buf_size *= 2; - continue; - } - else - { - debug_printf ("DeviceIoControl %E"); - break; - } - DRIVE_LAYOUT_INFORMATION *dli = (DRIVE_LAYOUT_INFORMATION *) buf; - for (unsigned part = 0; part < dli->PartitionCount; part++) - { - if (!dli->PartitionEntry[part].PartitionLength.QuadPart - || !dli->PartitionEntry[part].RecognizedPartition) - continue; - device dev; - dev.parsedisk (drive_number, - dli->PartitionEntry[part].PartitionNumber); - size = dli->PartitionEntry[part].PartitionLength.QuadPart >> 10; - bufptr += __small_sprintf (bufptr, "%5d %5d %9U %s\n", - dev.major, dev.minor, - size, dev.name + 5); - } - break; - } - NtClose (devhdl); - } - NtClose (dirhdl); - - return bufptr - destbuf; -} - -#undef print diff --git a/winsup/cygwin/fhandler_process.cc b/winsup/cygwin/fhandler_process.cc deleted file mode 100644 index 852e891e1..000000000 --- a/winsup/cygwin/fhandler_process.cc +++ /dev/null @@ -1,978 +0,0 @@ -/* fhandler_process.cc: fhandler for /proc/ virtual filesystem - - Copyright 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "pinfo.h" -#include "shared_info.h" -#include "dtable.h" -#include "cygheap.h" -#include "ntdll.h" -#include -#include -#include -#include -#include - -#define _COMPILING_NEWLIB -#include - -static const int PROCESS_PPID = 2; -static const int PROCESS_WINPID = 3; -static const int PROCESS_WINEXENAME = 4; -static const int PROCESS_STATUS = 5; -static const int PROCESS_UID = 6; -static const int PROCESS_GID = 7; -static const int PROCESS_PGID = 8; -static const int PROCESS_SID = 9; -static const int PROCESS_CTTY = 10; -static const int PROCESS_STAT = 11; -static const int PROCESS_STATM = 12; -static const int PROCESS_CMDLINE = 13; -static const int PROCESS_MAPS = 14; -static const int PROCESS_FD = 15; -static const int PROCESS_EXENAME = 16; -/* Keep symlinks always the last entries. */ -static const int PROCESS_ROOT = 17; -static const int PROCESS_EXE = 18; -static const int PROCESS_CWD = 19; - -/* The position of "root" defines the beginning of symlik entries. */ -#define is_symlink(nr) ((nr) >= PROCESS_ROOT) - -static const char * const process_listing[] = -{ - ".", - "..", - "ppid", - "winpid", - "winexename", - "status", - "uid", - "gid", - "pgid", - "sid", - "ctty", - "stat", - "statm", - "cmdline", - "maps", - "fd", - "exename", - /* Keep symlinks always the last entries. */ - "root", - "exe", - "cwd", - NULL -}; - -static const int PROCESS_LINK_COUNT = - (sizeof (process_listing) / sizeof (const char *)) - 1; - -static _off64_t format_process_maps (_pinfo *p, char *&destbuf, size_t maxsize); -static _off64_t format_process_stat (_pinfo *p, char *destbuf, size_t maxsize); -static _off64_t format_process_status (_pinfo *p, char *destbuf, size_t maxsize); -static _off64_t format_process_statm (_pinfo *p, char *destbuf, size_t maxsize); -static int get_process_state (DWORD dwProcessId); -static bool get_mem_values (DWORD dwProcessId, unsigned long *vmsize, - unsigned long *vmrss, unsigned long *vmtext, - unsigned long *vmdata, unsigned long *vmlib, - unsigned long *vmshare); - -/* Returns 0 if path doesn't exist, >0 if path is a directory, - * -1 if path is a file, -2 if path is a symlink, -3 if path is a pipe, - * -4 if path is a socket. - */ -int -fhandler_process::exists () -{ - const char *path = get_name (); - debug_printf ("exists (%s)", path); - path += proc_len + 1; - while (*path != 0 && !isdirsep (*path)) - path++; - if (*path == 0) - return 2; - - for (int i = 0; process_listing[i]; i++) - if (pathmatch (path + 1, process_listing[i])) - { - fileid = i; - return is_symlink (i) ? -2 : (i == PROCESS_FD) ? 1 : -1; - } - if (pathnmatch (strchr (path, '/') + 1, "fd/", 3)) - { - fileid = PROCESS_FD; - if (fill_filebuf ()) - return -2; - /* Check for nameless device entries. */ - path = strrchr (path, '/'); - if (path && *++path) - { - if (!strncmp (path, "pipe:[", 6)) - return -3; - else if (!strncmp (path, "socket:[", 8)) - return -4; - } - } - return 0; -} - -fhandler_process::fhandler_process (): - fhandler_proc () -{ -} - -int -fhandler_process::fstat (struct __stat64 *buf) -{ - const char *path = get_name (); - int file_type = exists (); - fhandler_base::fstat (buf); - path += proc_len + 1; - pid = atoi (path); - pinfo p (pid); - if (!p) - { - set_errno (ENOENT); - return -1; - } - - buf->st_mode &= ~_IFMT & NO_W; - - switch (file_type) - { - case 0: - set_errno (ENOENT); - return -1; - case 1: - case 2: - buf->st_ctime = buf->st_mtime = p->start_time; - buf->st_ctim.tv_nsec = buf->st_mtim.tv_nsec = 0; - time_as_timestruc_t (&buf->st_atim); - buf->st_uid = p->uid; - buf->st_gid = p->gid; - buf->st_mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH; - if (file_type == 1) - buf->st_nlink = 2; - else - buf->st_nlink = 3; - return 0; - case -2: - buf->st_uid = p->uid; - buf->st_gid = p->gid; - buf->st_mode = S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO; - return 0; - case -3: - buf->st_uid = p->uid; - buf->st_gid = p->gid; - buf->st_mode = S_IFIFO | S_IRUSR | S_IWUSR; - return 0; - case -4: - buf->st_uid = p->uid; - buf->st_gid = p->gid; - buf->st_mode = S_IFSOCK | S_IRUSR | S_IWUSR; - return 0; - case -1: - default: - buf->st_uid = p->uid; - buf->st_gid = p->gid; - buf->st_mode |= S_IFREG | S_IRUSR | S_IRGRP | S_IROTH; - return 0; - } -} - -DIR * -fhandler_process::opendir () -{ - DIR *dir = fhandler_virtual::opendir (); - if (dir) - { - if (fileid == PROCESS_FD) - fill_filebuf (); - dir->__flags = 0; - } - return dir; -} - -int -fhandler_process::readdir (DIR *dir, dirent *de) -{ - int res = ENMFILE; - if (fileid == PROCESS_FD) - { - if (dir->__d_position >= 2 + filesize / sizeof (int)) - goto out; - } - else if (dir->__d_position >= PROCESS_LINK_COUNT) - goto out; - if (fileid == PROCESS_FD && dir->__d_position > 1) - { - int *p = (int *) filebuf; - __small_sprintf (de->d_name, "%d", p[dir->__d_position++ - 2]); - } - else - strcpy (de->d_name, process_listing[dir->__d_position++]); - dir->__flags |= dirent_saw_dot | dirent_saw_dot_dot; - res = 0; -out: - syscall_printf ("%d = readdir (%p, %p) (%s)", res, dir, de, de->d_name); - return res; -} - -int -fhandler_process::open (int flags, mode_t mode) -{ - int process_file_no = -1; - - int res = fhandler_virtual::open (flags, mode); - if (!res) - goto out; - - nohandle (true); - - const char *path; - path = get_name () + proc_len + 1; - pid = atoi (path); - while (*path != 0 && !isdirsep (*path)) - path++; - - if (*path == 0) - { - if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) - { - set_errno (EEXIST); - res = 0; - goto out; - } - else if (flags & O_WRONLY) - { - set_errno (EISDIR); - res = 0; - goto out; - } - else - { - flags |= O_DIROPEN; - goto success; - } - } - - process_file_no = -1; - for (int i = 0; process_listing[i]; i++) - { - if (path_prefix_p - (process_listing[i], path + 1, strlen (process_listing[i]))) - process_file_no = i; - } - if (process_file_no == -1) - { - if (flags & O_CREAT) - { - set_errno (EROFS); - res = 0; - goto out; - } - else - { - set_errno (ENOENT); - res = 0; - goto out; - } - } - if (process_file_no == PROCESS_FD) - { - flags |= O_DIROPEN; - goto success; - } - if (flags & O_WRONLY) - { - set_errno (EROFS); - res = 0; - goto out; - } - - fileid = process_file_no; - if (!fill_filebuf ()) - { - res = 0; - goto out; - } - - if (flags & O_APPEND) - position = filesize; - else - position = 0; - -success: - res = 1; - set_flags ((flags & ~O_TEXT) | O_BINARY); - set_open_status (); -out: - syscall_printf ("%d = fhandler_proc::open (%p, %d)", res, flags, mode); - return res; -} - -bool -fhandler_process::fill_filebuf () -{ - const char *path; - path = get_name () + proc_len + 1; - if (!pid) - pid = atoi (path); - - pinfo p (pid); - - if (!p) - { - set_errno (ENOENT); - return false; - } - - switch (fileid) - { - case PROCESS_FD: - { - size_t fs; - char *fdp = strrchr (path, '/'); - if (!fdp || *++fdp == 'f') /* The "fd" directory itself. */ - { - if (filebuf) - cfree (filebuf); - filebuf = p->fds (fs); - } - else - { - if (filebuf) - cfree (filebuf); - int fd = atoi (fdp); - if (fd < 0 || (fd == 0 && !isdigit (*fdp))) - { - set_errno (ENOENT); - return false; - } - filebuf = p->fd (fd, fs); - if (!filebuf || !*filebuf) - { - set_errno (ENOENT); - return false; - } - } - filesize = fs; - break; - } - case PROCESS_UID: - case PROCESS_GID: - case PROCESS_PGID: - case PROCESS_SID: - case PROCESS_CTTY: - case PROCESS_PPID: - { - filebuf = (char *) crealloc (filebuf, bufalloc = 40); - int num; - switch (fileid) - { - case PROCESS_PPID: - num = p->ppid; - break; - case PROCESS_UID: - num = p->uid; - break; - case PROCESS_PGID: - num = p->pgid; - break; - case PROCESS_SID: - num = p->sid; - break; - case PROCESS_GID: - num = p->gid; - break; - case PROCESS_CTTY: - num = p->ctty; - break; - default: // what's this here for? - num = 0; - break; - } - __small_sprintf (filebuf, "%d\n", num); - filesize = strlen (filebuf); - break; - } - case PROCESS_ROOT: - case PROCESS_CWD: - case PROCESS_CMDLINE: - { - if (filebuf) - { - cfree (filebuf); - filebuf = NULL; - } - size_t fs; - switch (fileid) - { - case PROCESS_ROOT: - filebuf = p->root (fs); - break; - case PROCESS_CWD: - filebuf = p->cwd (fs); - break; - case PROCESS_CMDLINE: - filebuf = p->cmdline (fs); - break; - } - filesize = fs; - if (!filebuf || !*filebuf) - { - filebuf = cstrdup (""); - filesize = strlen (filebuf) + 1; - } - break; - } - case PROCESS_EXENAME: - case PROCESS_EXE: - { - filebuf = (char *) crealloc (filebuf, bufalloc = CYG_MAX_PATH); - if (p->process_state & PID_EXITED) - strcpy (filebuf, ""); - else - { - mount_table->conv_to_posix_path (p->progname, filebuf, 1); - /* If transparent_exe isn't set, the link keeps its suffix so that - an open(2) call will succeed on /proc/$PID/exe. */ - if (transparent_exe) - { - int len = strlen (filebuf); - if (len > 4) - { - char *s = filebuf + len - 4; - if (strcasematch (s, ".exe")) - *s = 0; - } - } - } - filesize = strlen (filebuf); - break; - } - case PROCESS_WINPID: - { - filebuf = (char *) crealloc (filebuf, bufalloc = 40); - __small_sprintf (filebuf, "%d\n", p->dwProcessId); - filesize = strlen (filebuf); - break; - } - case PROCESS_WINEXENAME: - { - int len = strlen (p->progname); - filebuf = (char *) crealloc (filebuf, bufalloc = (len + 2)); - strcpy (filebuf, p->progname); - filebuf[len] = '\n'; - filesize = len + 1; - break; - } - case PROCESS_STATUS: - { - filebuf = (char *) crealloc (filebuf, bufalloc = 2048); - filesize = format_process_status (*p, filebuf, bufalloc); - break; - } - case PROCESS_STAT: - { - filebuf = (char *) crealloc (filebuf, bufalloc = 2048); - filesize = format_process_stat (*p, filebuf, bufalloc); - break; - } - case PROCESS_STATM: - { - filebuf = (char *) crealloc (filebuf, bufalloc = 2048); - filesize = format_process_statm (*p, filebuf, bufalloc); - break; - } - case PROCESS_MAPS: - { - filebuf = (char *) crealloc (filebuf, bufalloc = 2048); - filesize = format_process_maps (*p, filebuf, bufalloc); - break; - } - } - - return true; -} - -static _off64_t -format_process_maps (_pinfo *p, char *&destbuf, size_t maxsize) -{ - if (!wincap.is_winnt ()) - return 0; - - HANDLE proc = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, - FALSE, - p->dwProcessId); - if (!proc) - return 0; - - _off64_t len = 0; - HMODULE *modules; - DWORD needed, i; - DWORD_PTR wset_size; - DWORD_PTR *workingset = NULL; - MODULEINFO info; - char modname[CYG_MAX_PATH]; - char posix_modname[CYG_MAX_PATH]; - - if (!EnumProcessModules (proc, NULL, 0, &needed)) - { - __seterrno (); - len = -1; - goto out; - } - modules = (HMODULE*) alloca (needed); - if (!EnumProcessModules (proc, modules, needed, &needed)) - { - __seterrno (); - len = -1; - goto out; - } - - QueryWorkingSet (proc, (void *) &wset_size, sizeof wset_size); - if (GetLastError () == ERROR_BAD_LENGTH) - { - workingset = (DWORD_PTR *) alloca (sizeof (DWORD_PTR) * ++wset_size); - if (!QueryWorkingSet (proc, (void *) workingset, - sizeof (DWORD_PTR) * wset_size)) - workingset = NULL; - } - for (i = 0; i < needed / sizeof (HMODULE); i++) - if (GetModuleInformation (proc, modules[i], &info, sizeof info) - && GetModuleFileNameEx (proc, modules[i], modname, sizeof modname)) - { - char access[5]; - strcpy (access, "r--p"); - struct __stat64 st; - cygwin_conv_to_full_posix_path (modname, posix_modname); - if (stat64 (posix_modname, &st)) - { - st.st_dev = 0; - st.st_ino = 0; - } - if (len + strlen (posix_modname) + 62 > maxsize - 1) - destbuf = (char *) crealloc (destbuf, maxsize += 2048); - if (workingset) - for (unsigned i = 1; i <= wset_size; ++i) - { - DWORD_PTR addr = workingset[i] & 0xfffff000UL; - if ((char *)addr >= info.lpBaseOfDll - && (char *)addr < (char *)info.lpBaseOfDll + info.SizeOfImage) - { - access[0] = (workingset[i] & 0x5) ? 'r' : '-'; - access[1] = (workingset[i] & 0x4) ? 'w' : '-'; - access[2] = (workingset[i] & 0x2) ? 'x' : '-'; - access[3] = (workingset[i] & 0x100) ? 's' : 'p'; - } - } - int written = __small_sprintf (destbuf + len, - "%08lx-%08lx %s %08lx %04x:%04x %U ", - info.lpBaseOfDll, - (unsigned long)info.lpBaseOfDll - + info.SizeOfImage, - access, - info.EntryPoint, - st.st_dev >> 16, - st.st_dev & 0xffff, - st.st_ino); - while (written < 62) - destbuf[len + written++] = ' '; - len += written; - len += __small_sprintf (destbuf + len, "%s\n", posix_modname); - } -out: - CloseHandle (proc); - return len; -} - -static _off64_t -format_process_stat (_pinfo *p, char *destbuf, size_t maxsize) -{ - char cmd[CYG_MAX_PATH]; - int state = 'R'; - unsigned long fault_count = 0UL, - utime = 0UL, stime = 0UL, - start_time = 0UL, - vmsize = 0UL, vmrss = 0UL, vmmaxrss = 0UL; - int priority = 0; - if (p->process_state & PID_EXITED) - strcpy (cmd, ""); - else - { - strcpy (cmd, p->progname); - char *last_slash = strrchr (cmd, '\\'); - if (last_slash != NULL) - strcpy (cmd, last_slash + 1); - int len = strlen (cmd); - if (len > 4) - { - char *s = cmd + len - 4; - if (strcasematch (s, ".exe")) - *s = 0; - } - } - /* - * Note: under Windows, a _process_ is always running - it's only _threads_ - * that get suspended. Therefore the default state is R (runnable). - */ - if (p->process_state & PID_EXITED) - state = 'Z'; - else if (p->process_state & PID_STOPPED) - state = 'T'; - else if (wincap.is_winnt ()) - state = get_process_state (p->dwProcessId); - start_time = (GetTickCount () / 1000 - time (NULL) + p->start_time) * HZ; - if (wincap.is_winnt ()) - { - NTSTATUS ret; - HANDLE hProcess; - VM_COUNTERS vmc; - KERNEL_USER_TIMES put; - PROCESS_BASIC_INFORMATION pbi; - QUOTA_LIMITS ql; - SYSTEM_TIME_OF_DAY_INFORMATION stodi; - SYSTEM_PROCESSOR_TIMES spt; - hProcess = OpenProcess (PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, - FALSE, p->dwProcessId); - if (hProcess != NULL) - { - ret = NtQueryInformationProcess (hProcess, - ProcessVmCounters, - (PVOID) &vmc, - sizeof vmc, NULL); - if (ret == STATUS_SUCCESS) - ret = NtQueryInformationProcess (hProcess, - ProcessTimes, - (PVOID) &put, - sizeof put, NULL); - if (ret == STATUS_SUCCESS) - ret = NtQueryInformationProcess (hProcess, - ProcessBasicInformation, - (PVOID) &pbi, - sizeof pbi, NULL); - if (ret == STATUS_SUCCESS) - ret = NtQueryInformationProcess (hProcess, - ProcessQuotaLimits, - (PVOID) &ql, - sizeof ql, NULL); - CloseHandle (hProcess); - } - else - { - DWORD error = GetLastError (); - __seterrno_from_win_error (error); - debug_printf ("OpenProcess: ret %d", error); - return 0; - } - if (ret == STATUS_SUCCESS) - ret = NtQuerySystemInformation (SystemTimeOfDayInformation, - (PVOID) &stodi, - sizeof stodi, NULL); - if (ret == STATUS_SUCCESS) - ret = NtQuerySystemInformation (SystemProcessorTimes, - (PVOID) &spt, - sizeof spt, NULL); - if (ret != STATUS_SUCCESS) - { - __seterrno_from_nt_status (ret); - debug_printf ("NtQueryInformationProcess: ret %d, Dos(ret) %E", ret); - return 0; - } - fault_count = vmc.PageFaultCount; - utime = put.UserTime.QuadPart * HZ / 10000000ULL; - stime = put.KernelTime.QuadPart * HZ / 10000000ULL; -#if 0 - if (stodi.CurrentTime.QuadPart > put.CreateTime.QuadPart) - start_time = (spt.KernelTime.QuadPart + spt.UserTime.QuadPart - - stodi.CurrentTime.QuadPart + put.CreateTime.QuadPart) * HZ / 10000000ULL; - else - /* - * sometimes stodi.CurrentTime is a bit behind - * Note: some older versions of procps are broken and can't cope - * with process start times > time(NULL). - */ - start_time = (spt.KernelTme.QuadPart + spt.UserTime.QuadPart) * HZ / 10000000ULL; -#endif - priority = pbi.BasePriority; - unsigned page_size = getsystempagesize (); - vmsize = vmc.PagefileUsage; - vmrss = vmc.WorkingSetSize / page_size; - vmmaxrss = ql.MaximumWorkingSetSize / page_size; - } - - return __small_sprintf (destbuf, "%d (%s) %c " - "%d %d %d %d %d " - "%lu %lu %lu %lu %lu %lu %lu " - "%ld %ld %ld %ld %ld %ld " - "%lu %lu " - "%ld " - "%lu", - p->pid, cmd, - state, - p->ppid, p->pgid, p->sid, makedev (FH_TTYS, p->ctty), - -1, 0, fault_count, fault_count, 0, 0, utime, stime, - utime, stime, priority, 0, 0, 0, - start_time, vmsize, - vmrss, vmmaxrss - ); -} - -static _off64_t -format_process_status (_pinfo *p, char *destbuf, size_t maxsize) -{ - char cmd[CYG_MAX_PATH]; - int state = 'R'; - const char *state_str = "unknown"; - unsigned long vmsize = 0UL, vmrss = 0UL, vmdata = 0UL, vmlib = 0UL, vmtext = 0UL, - vmshare = 0UL; - if (p->process_state & PID_EXITED) - strcpy (cmd, ""); - else - { - strcpy (cmd, p->progname); - char *last_slash = strrchr (cmd, '\\'); - if (last_slash != NULL) - strcpy (cmd, last_slash + 1); - int len = strlen (cmd); - if (len > 4) - { - char *s = cmd + len - 4; - if (strcasematch (s, ".exe")) - *s = 0; - } - } - /* - * Note: under Windows, a _process_ is always running - it's only _threads_ - * that get suspended. Therefore the default state is R (runnable). - */ - if (p->process_state & PID_EXITED) - state = 'Z'; - else if (p->process_state & PID_STOPPED) - state = 'T'; - else if (wincap.is_winnt ()) - state = get_process_state (p->dwProcessId); - switch (state) - { - case 'O': - state_str = "running"; - break; - case 'D': - case 'S': - state_str = "sleeping"; - break; - case 'R': - state_str = "runnable"; - break; - case 'Z': - state_str = "zombie"; - break; - case 'T': - state_str = "stopped"; - break; - } - if (wincap.is_winnt ()) - { - if (!get_mem_values (p->dwProcessId, &vmsize, &vmrss, &vmtext, &vmdata, &vmlib, &vmshare)) - return 0; - unsigned page_size = getsystempagesize (); - vmsize *= page_size; vmrss *= page_size; vmdata *= page_size; - vmtext *= page_size; vmlib *= page_size; - } - // The real uid value for *this* process is stored at cygheap->user.real_uid - // but we can't get at the real uid value for any other process, so - // just fake it as p->uid. Similar for p->gid. - return __small_sprintf (destbuf, "Name:\t%s\n" - "State:\t%c (%s)\n" - "Tgid:\t%d\n" - "Pid:\t%d\n" - "PPid:\t%d\n" - "Uid:\t%d %d %d %d\n" - "Gid:\t%d %d %d %d\n" - "VmSize:\t%8d kB\n" - "VmLck:\t%8d kB\n" - "VmRSS:\t%8d kB\n" - "VmData:\t%8d kB\n" - "VmStk:\t%8d kB\n" - "VmExe:\t%8d kB\n" - "VmLib:\t%8d kB\n" - "SigPnd:\t%016x\n" - "SigBlk:\t%016x\n" - "SigIgn:\t%016x\n", - cmd, - state, state_str, - p->pgid, - p->pid, - p->ppid, - p->uid, p->uid, p->uid, p->uid, - p->gid, p->gid, p->gid, p->gid, - vmsize >> 10, 0, vmrss >> 10, vmdata >> 10, 0, vmtext >> 10, vmlib >> 10, - 0, 0, p->getsigmask () - ); -} - -static _off64_t -format_process_statm (_pinfo *p, char *destbuf, size_t maxsize) -{ - unsigned long vmsize = 0UL, vmrss = 0UL, vmtext = 0UL, vmdata = 0UL, - vmlib = 0UL, vmshare = 0UL; - if (wincap.is_winnt ()) - { - if (!get_mem_values (p->dwProcessId, &vmsize, &vmrss, &vmtext, &vmdata, - &vmlib, &vmshare)) - return 0; - } - return __small_sprintf (destbuf, "%ld %ld %ld %ld %ld %ld %ld", - vmsize, vmrss, vmshare, vmtext, vmlib, vmdata, 0 - ); -} - -static int -get_process_state (DWORD dwProcessId) -{ - /* - * This isn't really heavy magic - just go through the processes' - * threads one by one and return a value accordingly - * Errors are silently ignored. - */ - NTSTATUS ret; - SYSTEM_PROCESSES *sp; - ULONG n = 0x1000; - PULONG p = new ULONG[n]; - int state =' '; - while (STATUS_INFO_LENGTH_MISMATCH == - (ret = NtQuerySystemInformation (SystemProcessesAndThreadsInformation, - (PVOID) p, - n * sizeof *p, NULL))) - delete [] p, p = new ULONG[n *= 2]; - if (ret != STATUS_SUCCESS) - { - debug_printf ("NtQuerySystemInformation: ret %d, Dos(ret) %d", - ret, RtlNtStatusToDosError (ret)); - goto out; - } - state = 'Z'; - sp = (SYSTEM_PROCESSES *) p; - for (;;) - { - if (sp->ProcessId == dwProcessId) - { - SYSTEM_THREADS *st; - if (wincap.has_process_io_counters ()) - /* - * Windows 2000 and XP have an extra member in SYSTEM_PROCESSES - * which means the offset of the first SYSTEM_THREADS entry is - * different on these operating systems compared to NT 4. - */ - st = &sp->Threads[0]; - else - /* - * 136 is the offset of the first SYSTEM_THREADS entry on - * Windows NT 4. - */ - st = (SYSTEM_THREADS *) ((char *) sp + 136); - state = 'S'; - for (unsigned i = 0; i < sp->ThreadCount; i++) - { - if (st->State == StateRunning || - st->State == StateReady) - { - state = 'R'; - goto out; - } - st++; - } - break; - } - if (!sp->NextEntryDelta) - break; - sp = (SYSTEM_PROCESSES *) ((char *) sp + sp->NextEntryDelta); - } -out: - delete [] p; - return state; -} - -static bool -get_mem_values (DWORD dwProcessId, unsigned long *vmsize, unsigned long *vmrss, - unsigned long *vmtext, unsigned long *vmdata, - unsigned long *vmlib, unsigned long *vmshare) -{ - bool res = true; - NTSTATUS ret; - HANDLE hProcess; - VM_COUNTERS vmc; - MEMORY_WORKING_SET_LIST *mwsl; - ULONG n = 0x1000, length; - PULONG p = (PULONG) malloc (sizeof (ULONG) * n); - unsigned page_size = getsystempagesize (); - hProcess = OpenProcess (PROCESS_QUERY_INFORMATION, - FALSE, dwProcessId); - if (hProcess == NULL) - { - DWORD error = GetLastError (); - __seterrno_from_win_error (error); - debug_printf ("OpenProcess: ret %d", error); - return false; - } - while ((ret = NtQueryVirtualMemory (hProcess, 0, - MemoryWorkingSetList, - (PVOID) p, - n * sizeof *p, &length)), - (ret == STATUS_SUCCESS || ret == STATUS_INFO_LENGTH_MISMATCH) && - length >= (n * sizeof (*p))) - p = (PULONG) realloc (p, n *= (2 * sizeof (ULONG))); - - if (ret != STATUS_SUCCESS) - { - debug_printf ("NtQueryVirtualMemory: ret %d, Dos(ret) %d", - ret, RtlNtStatusToDosError (ret)); - res = false; - goto out; - } - mwsl = (MEMORY_WORKING_SET_LIST *) p; - for (unsigned long i = 0; i < mwsl->NumberOfPages; i++) - { - ++*vmrss; - unsigned flags = mwsl->WorkingSetList[i] & 0x0FFF; - if (flags & (WSLE_PAGE_EXECUTE | WSLE_PAGE_SHAREABLE) == (WSLE_PAGE_EXECUTE | WSLE_PAGE_SHAREABLE)) - ++*vmlib; - else if (flags & WSLE_PAGE_SHAREABLE) - ++*vmshare; - else if (flags & WSLE_PAGE_EXECUTE) - ++*vmtext; - else - ++*vmdata; - } - ret = NtQueryInformationProcess (hProcess, ProcessVmCounters, (PVOID) &vmc, - sizeof vmc, NULL); - if (ret != STATUS_SUCCESS) - { - debug_printf ("NtQueryInformationProcess: ret %d, Dos(ret) %d", - ret, RtlNtStatusToDosError (ret)); - res = false; - goto out; - } - *vmsize = vmc.PagefileUsage / page_size; -out: - free (p); - CloseHandle (hProcess); - return res; -} diff --git a/winsup/cygwin/fhandler_random.cc b/winsup/cygwin/fhandler_random.cc deleted file mode 100644 index eecbe65bf..000000000 --- a/winsup/cygwin/fhandler_random.cc +++ /dev/null @@ -1,164 +0,0 @@ -/* fhandler_random.cc: code to access /dev/random and /dev/urandom - - Copyright 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - - Written by Corinna Vinschen (vinschen@cygnus.com) - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" - -#define RANDOM 8 -#define URANDOM 9 - -#define PSEUDO_MULTIPLIER (6364136223846793005LL) -#define PSEUDO_SHIFTVAL (21) - -fhandler_dev_random::fhandler_dev_random () - : fhandler_base (), crypt_prov ((HCRYPTPROV) NULL) -{ -} - -int -fhandler_dev_random::open (int flags, mode_t) -{ - set_flags ((flags & ~O_TEXT) | O_BINARY); - nohandle (true); - set_open_status (); - return 1; -} - -bool -fhandler_dev_random::crypt_gen_random (void *ptr, size_t len) -{ - if (!crypt_prov - && !CryptAcquireContext (&crypt_prov, NULL, MS_DEF_PROV, PROV_RSA_FULL, - CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET) - && !CryptAcquireContext (&crypt_prov, NULL, MS_DEF_PROV, PROV_RSA_FULL, - CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET - | CRYPT_NEWKEYSET)) - { - debug_printf ("%E = CryptAquireContext()"); - return false; - } - if (!CryptGenRandom (crypt_prov, len, (BYTE *)ptr)) - { - debug_printf ("%E = CryptGenRandom()"); - return false; - } - return true; -} - -int -fhandler_dev_random::pseudo_write (const void *ptr, size_t len) -{ - /* Use buffer to mess up the pseudo random number generator. */ - for (size_t i = 0; i < len; ++i) - pseudo = (pseudo + ((unsigned char *)ptr)[i]) * PSEUDO_MULTIPLIER + 1; - return len; -} - -int -fhandler_dev_random::write (const void *ptr, size_t len) -{ - if (!len) - return 0; - if (!ptr) - { - set_errno (EINVAL); - return -1; - } - - /* Limit len to a value <= 512 since we don't want to overact. - Copy to local buffer because CryptGenRandom violates const. */ - unsigned char buf[512]; - size_t limited_len = len <= 512 ? len : 512; - memcpy (buf, ptr, limited_len); - - /* Mess up system entropy source. Return error if device is /dev/random. */ - if (!crypt_gen_random (buf, limited_len) && dev () == FH_RANDOM) - { - __seterrno (); - return -1; - } - /* Mess up the pseudo random number generator. */ - pseudo_write (buf, limited_len); - return len; -} - -int -fhandler_dev_random::pseudo_read (void *ptr, size_t len) -{ - /* Use pseudo random number generator as fallback entropy source. - This multiplier was obtained from Knuth, D.E., "The Art of - Computer Programming," Vol 2, Seminumerical Algorithms, Third - Edition, Addison-Wesley, 1998, p. 106 (line 26) & p. 108 */ - for (size_t i = 0; i < len; ++i) - { - pseudo = pseudo * PSEUDO_MULTIPLIER + 1; - ((unsigned char *)ptr)[i] = (pseudo >> PSEUDO_SHIFTVAL) & UCHAR_MAX; - } - return len; -} - -void __stdcall -fhandler_dev_random::read (void *ptr, size_t& len) -{ - if (!len) - return; - - if (!ptr) - { - set_errno (EINVAL); - len = (size_t) -1; - return; - } - - if (crypt_gen_random (ptr, len)) - return; - - /* If device is /dev/urandom, use pseudo number generator as fallback. - Don't do this for /dev/random since it's intended for uses that need - very high quality randomness. */ - if (dev () == FH_URANDOM) - { - len = pseudo_read (ptr, len); - return; - } - - __seterrno (); - len = (size_t) -1; -} - -_off64_t -fhandler_dev_random::lseek (_off64_t, int) -{ - return 0; -} - -int -fhandler_dev_random::close () -{ - if (!hExeced && crypt_prov) - while (!CryptReleaseContext (crypt_prov, 0) - && GetLastError () == ERROR_BUSY) - Sleep (10); - return 0; -} - -int -fhandler_dev_random::dup (fhandler_base *child) -{ - fhandler_dev_random *fhr = (fhandler_dev_random *) child; - fhr->crypt_prov = (HCRYPTPROV)NULL; - return 0; -} diff --git a/winsup/cygwin/fhandler_raw.cc b/winsup/cygwin/fhandler_raw.cc deleted file mode 100644 index 77ee252bc..000000000 --- a/winsup/cygwin/fhandler_raw.cc +++ /dev/null @@ -1,215 +0,0 @@ -/* fhandler_raw.cc. See fhandler.h for a description of the fhandler classes. - - Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include "winsup.h" -#include -#include - -#include -#include -#include -#include "cygerrno.h" -#include "perprocess.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "ntdll.h" - -/**********************************************************************/ -/* fhandler_dev_raw */ - -fhandler_dev_raw::fhandler_dev_raw () - : fhandler_base (), status () -{ - need_fork_fixup (true); -} - -fhandler_dev_raw::~fhandler_dev_raw () -{ - if (devbufsiz > 1L) - delete [] devbuf; -} - -int __stdcall -fhandler_dev_raw::fstat (struct __stat64 *buf) -{ - debug_printf ("here"); - - fhandler_base::fstat (buf); - if (is_auto_device ()) - { - if (get_major () == DEV_TAPE_MAJOR) - buf->st_mode = S_IFCHR | STD_RBITS | STD_WBITS | S_IWGRP | S_IWOTH; - else - buf->st_mode = S_IFBLK | STD_RBITS | STD_WBITS | S_IWGRP | S_IWOTH; - - buf->st_uid = geteuid32 (); - buf->st_gid = getegid32 (); - buf->st_nlink = 1; - buf->st_blksize = S_BLKSIZE; - time_as_timestruc_t (&buf->st_ctim); - buf->st_atim = buf->st_mtim = buf->st_ctim; - } - return 0; -} - -int -fhandler_dev_raw::open (int flags, mode_t) -{ - if (!wincap.has_raw_devices ()) - { - set_errno (ENOENT); - debug_printf ("%s is accessible under NT/W2K only", get_win32_name ()); - return 0; - } - - /* Check for illegal flags. */ - if (get_major () != DEV_TAPE_MAJOR && (flags & (O_APPEND | O_EXCL))) - { - set_errno (EINVAL); - return 0; - } - - /* Always open a raw device existing and binary. */ - flags &= ~(O_CREAT | O_TRUNC); - flags |= O_BINARY; - - /* Write-only doesn't work well with raw devices */ - if ((flags & O_ACCMODE) == O_WRONLY) - flags = ((flags & ~O_WRONLY) | O_RDWR); - - int res = fhandler_base::open (flags, 0); - if (res && devbufsiz > 1L) - devbuf = new char [devbufsiz]; - - return res; -} - -int -fhandler_dev_raw::dup (fhandler_base *child) -{ - int ret = fhandler_base::dup (child); - - if (!ret) - { - fhandler_dev_raw *fhc = (fhandler_dev_raw *) child; - - fhc->devbufsiz = devbufsiz; - if (devbufsiz > 1L) - fhc->devbuf = new char [devbufsiz]; - fhc->devbufstart = 0; - fhc->devbufend = 0; - fhc->lastblk_to_read (false); - } - return ret; -} - -void -fhandler_dev_raw::fixup_after_fork (HANDLE) -{ - devbufstart = 0; - devbufend = 0; - lastblk_to_read (false); -} - -void -fhandler_dev_raw::fixup_after_exec () -{ - if (!close_on_exec ()) - { - if (devbufsiz > 1L) - devbuf = new char [devbufsiz]; - devbufstart = 0; - devbufend = 0; - lastblk_to_read (false); - } -} - -int -fhandler_dev_raw::ioctl (unsigned int cmd, void *buf) -{ - int ret = NO_ERROR; - - if (cmd == RDIOCDOP) - { - struct rdop *op = (struct rdop *) buf; - - if (!op) - ret = ERROR_INVALID_PARAMETER; - else - switch (op->rd_op) - { - case RDSETBLK: - if (get_major () == DEV_TAPE_MAJOR) - { - struct mtop mop; - - mop.mt_op = MTSETBLK; - mop.mt_count = op->rd_parm; - ret = ioctl (MTIOCTOP, &mop); - } - else if ((devbuf && ((op->rd_parm <= 1 && (devbufend - devbufstart)) - || op->rd_parm < devbufend - devbufstart)) - || (op->rd_parm > 1 && (op->rd_parm % 512)) - || (get_flags () & O_DIRECT)) - /* The conditions for a *valid* parameter are these: - - If there's still data in the current buffer, it must - fit in the new buffer. - - The new size is either 0 or 1, both indicating unbufferd - I/O, or the new buffersize must be a multiple of 512. - - In the O_DIRECT case, the whole request is invalid. */ - ret = ERROR_INVALID_PARAMETER; - else if (!devbuf || op->rd_parm != devbufsiz) - { - char *buf = NULL; - if (op->rd_parm > 1L) - buf = new char [op->rd_parm]; - if (buf && devbufsiz > 1L) - { - memcpy (buf, devbuf + devbufstart, devbufend - devbufstart); - devbufend -= devbufstart; - } - else - devbufend = 0; - - if (devbufsiz > 1L) - delete [] devbuf; - - devbufstart = 0; - devbuf = buf; - devbufsiz = op->rd_parm ?: 1L; - } - break; - default: - break; - } - } - else if (cmd == RDIOCGET) - { - struct rdget *get = (struct rdget *) buf; - - if (!get) - ret = ERROR_INVALID_PARAMETER; - else - get->bufsiz = devbufsiz; - } - else - return fhandler_base::ioctl (cmd, buf); - - if (ret != NO_ERROR) - { - SetLastError (ret); - __seterrno (); - return -1; - } - return 0; -} diff --git a/winsup/cygwin/fhandler_registry.cc b/winsup/cygwin/fhandler_registry.cc deleted file mode 100644 index 0982755d9..000000000 --- a/winsup/cygwin/fhandler_registry.cc +++ /dev/null @@ -1,679 +0,0 @@ -/* fhandler_registry.cc: fhandler for /proc/registry virtual filesystem - - Copyright 2002, 2003, 2003, 2004, 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* FIXME: Access permissions are ignored at the moment. */ - -#include "winsup.h" -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include - -#define _COMPILING_NEWLIB -#include - -static const int registry_len = sizeof ("registry") - 1; -/* If this bit is set in __d_position then we are enumerating values, - * else sub-keys. keeping track of where we are is horribly messy - * the bottom 16 bits are the absolute position and the top 15 bits - * make up the value index if we are enuerating values. - */ -static const _off_t REG_ENUM_VALUES_MASK = 0x8000000; -static const _off_t REG_POSITION_MASK = 0xffff; - -/* List of root keys in /proc/registry. - * Possibly we should filter out those not relevant to the flavour of Windows - * Cygwin is running on. - */ -static const char *registry_listing[] = -{ - ".", - "..", - "HKEY_CLASSES_ROOT", - "HKEY_CURRENT_CONFIG", - "HKEY_CURRENT_USER", - "HKEY_LOCAL_MACHINE", - "HKEY_USERS", - "HKEY_DYN_DATA", // 95/98/Me - "HKEY_PERFORMANCE_DATA", // NT/2000/XP - NULL -}; - -static const HKEY registry_keys[] = -{ - (HKEY) INVALID_HANDLE_VALUE, - (HKEY) INVALID_HANDLE_VALUE, - HKEY_CLASSES_ROOT, - HKEY_CURRENT_CONFIG, - HKEY_CURRENT_USER, - HKEY_LOCAL_MACHINE, - HKEY_USERS, - HKEY_DYN_DATA, - HKEY_PERFORMANCE_DATA -}; - -static const int ROOT_KEY_COUNT = sizeof (registry_keys) / sizeof (HKEY); - -/* These get added to each subdirectory in /proc/registry. - * If we wanted to implement writing, we could maybe add a '.writable' entry or - * suchlike. - */ -static const char *special_dot_files[] = -{ - ".", - "..", - NULL -}; - -static const int SPECIAL_DOT_FILE_COUNT = - (sizeof (special_dot_files) / sizeof (const char *)) - 1; - -/* Name given to default values */ -static const char *DEFAULT_VALUE_NAME = "@"; - -static HKEY open_key (const char *name, REGSAM access, bool isValue); - -/* Returns 0 if path doesn't exist, >0 if path is a directory, - * <0 if path is a file. - * - * We open the last key but one and then enum it's sub-keys and values to see if the - * final component is there. This gets round the problem of not having security access - * to the final key in the path. - */ -int -fhandler_registry::exists () -{ - int file_type = 0, index = 0, pathlen; - DWORD buf_size = CYG_MAX_PATH; - LONG error; - char buf[buf_size]; - const char *file; - HKEY hKey = (HKEY) INVALID_HANDLE_VALUE; - - const char *path = get_name (); - debug_printf ("exists (%s)", path); - path += proc_len + registry_len + 1; - if (*path) - path++; - else - { - file_type = 2; - goto out; - } - pathlen = strlen (path); - file = path + pathlen - 1; - if (isdirsep (*file) && pathlen > 1) - file--; - while (!isdirsep (*file)) - file--; - file++; - - if (file == path) - { - for (int i = 0; registry_listing[i]; i++) - if (path_prefix_p - (registry_listing[i], path, strlen (registry_listing[i]))) - { - file_type = 1; - goto out; - } - goto out; - } - - hKey = open_key (path, KEY_READ, false); - if (hKey != (HKEY) INVALID_HANDLE_VALUE) - file_type = 1; - else - { - hKey = open_key (path, KEY_READ, true); - if (hKey == (HKEY) INVALID_HANDLE_VALUE) - return 0; - - while (ERROR_SUCCESS == - (error = RegEnumKeyEx (hKey, index++, buf, &buf_size, NULL, NULL, - NULL, NULL)) - || (error == ERROR_MORE_DATA)) - { - if (pathmatch (buf, file)) - { - file_type = 1; - goto out; - } - buf_size = CYG_MAX_PATH; - } - if (error != ERROR_NO_MORE_ITEMS) - { - seterrno_from_win_error (__FILE__, __LINE__, error); - goto out; - } - index = 0; - buf_size = CYG_MAX_PATH; - while (ERROR_SUCCESS == - (error = RegEnumValue (hKey, index++, buf, &buf_size, NULL, NULL, - NULL, NULL)) - || (error == ERROR_MORE_DATA)) - { - if (pathmatch (buf, file) || (buf[0] == '\0' && - pathmatch (file, DEFAULT_VALUE_NAME))) - { - file_type = -1; - goto out; - } - buf_size = CYG_MAX_PATH; - } - if (error != ERROR_NO_MORE_ITEMS) - { - seterrno_from_win_error (__FILE__, __LINE__, error); - goto out; - } - } -out: - if (hKey != (HKEY) INVALID_HANDLE_VALUE) - RegCloseKey (hKey); - return file_type; -} - -fhandler_registry::fhandler_registry (): -fhandler_proc () -{ -} - -int -fhandler_registry::fstat (struct __stat64 *buf) -{ - fhandler_base::fstat (buf); - buf->st_mode &= ~_IFMT & NO_W; - int file_type = exists (); - switch (file_type) - { - case 0: - set_errno (ENOENT); - return -1; - case 1: - buf->st_mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH; - break; - case 2: - buf->st_mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH; - buf->st_nlink = ROOT_KEY_COUNT; - break; - default: - case -1: - buf->st_mode |= S_IFREG; - buf->st_mode &= NO_X; - break; - } - if (file_type != 0 && file_type != 2) - { - HKEY hKey; - const char *path = get_name () + proc_len + registry_len + 2; - hKey = - open_key (path, STANDARD_RIGHTS_READ | KEY_QUERY_VALUE, - (file_type < 0) ? true : false); - - if (hKey != (HKEY) INVALID_HANDLE_VALUE) - { - FILETIME ftLastWriteTime; - DWORD subkey_count; - if (ERROR_SUCCESS == - RegQueryInfoKey (hKey, NULL, NULL, NULL, &subkey_count, NULL, - NULL, NULL, NULL, NULL, NULL, - &ftLastWriteTime)) - { - to_timestruc_t (&ftLastWriteTime, &buf->st_mtim); - buf->st_ctim = buf->st_mtim; - time_as_timestruc_t (&buf->st_atim); - if (file_type > 0) - buf->st_nlink = subkey_count + 2; - else - { - int pathlen = strlen (path); - const char *value_name = path + pathlen - 1; - if (isdirsep (*value_name) && pathlen > 1) - value_name--; - while (!isdirsep (*value_name)) - value_name--; - value_name++; - DWORD dwSize; - if (ERROR_SUCCESS == - RegQueryValueEx (hKey, value_name, NULL, NULL, NULL, - &dwSize)) - buf->st_size = dwSize; - } - __uid32_t uid; - __gid32_t gid; - if (get_object_attribute - ((HANDLE) hKey, SE_REGISTRY_KEY, &buf->st_mode, &uid, - &gid) == 0) - { - buf->st_uid = uid; - buf->st_gid = gid; - buf->st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); - if (file_type > 0) - buf->st_mode |= S_IFDIR; - else - buf->st_mode &= NO_X; - } - } - RegCloseKey (hKey); - } - } - return 0; -} - -int -fhandler_registry::readdir (DIR *dir, dirent *de) -{ - DWORD buf_size = CYG_MAX_PATH; - char buf[buf_size]; - HANDLE handle; - const char *path = dir->__d_dirname + proc_len + 1 + registry_len; - LONG error; - int res = ENMFILE; - - dir->__flags |= dirent_saw_dot | dirent_saw_dot_dot; - if (*path == 0) - { - if (dir->__d_position >= ROOT_KEY_COUNT) - goto out; - strcpy (de->d_name, registry_listing[dir->__d_position++]); - res = 0; - goto out; - } - if (dir->__handle == INVALID_HANDLE_VALUE && dir->__d_position == 0) - { - handle = open_key (path + 1, KEY_READ, false); - dir->__handle = handle; - } - if (dir->__handle == INVALID_HANDLE_VALUE) - goto out; - if (dir->__d_position < SPECIAL_DOT_FILE_COUNT) - { - strcpy (de->d_name, special_dot_files[dir->__d_position++]); - res = 0; - goto out; - } -retry: - if (dir->__d_position & REG_ENUM_VALUES_MASK) - /* For the moment, the type of key is ignored here. when write access is added, - * maybe add an extension for the type of each value? - */ - error = RegEnumValue ((HKEY) dir->__handle, - (dir->__d_position & ~REG_ENUM_VALUES_MASK) >> 16, - buf, &buf_size, NULL, NULL, NULL, NULL); - else - error = - RegEnumKeyEx ((HKEY) dir->__handle, dir->__d_position - - SPECIAL_DOT_FILE_COUNT, buf, &buf_size, NULL, NULL, NULL, - NULL); - if (error == ERROR_NO_MORE_ITEMS - && (dir->__d_position & REG_ENUM_VALUES_MASK) == 0) - { - /* If we're finished with sub-keys, start on values under this key. */ - dir->__d_position |= REG_ENUM_VALUES_MASK; - buf_size = CYG_MAX_PATH; - goto retry; - } - if (error != ERROR_SUCCESS && error != ERROR_MORE_DATA) - { - RegCloseKey ((HKEY) dir->__handle); - dir->__handle = INVALID_HANDLE_VALUE; - if (error != ERROR_NO_MORE_ITEMS) - seterrno_from_win_error (__FILE__, __LINE__, error); - goto out; - } - - /* We get here if `buf' contains valid data. */ - if (*buf == 0) - strcpy (de->d_name, DEFAULT_VALUE_NAME); - else - strcpy (de->d_name, buf); - - dir->__d_position++; - if (dir->__d_position & REG_ENUM_VALUES_MASK) - dir->__d_position += 0x10000; - res = 0; -out: - syscall_printf ("%d = readdir (%p, %p)", res, dir, de); - return res; -} - -_off64_t -fhandler_registry::telldir (DIR * dir) -{ - return dir->__d_position & REG_POSITION_MASK; -} - -void -fhandler_registry::seekdir (DIR * dir, _off64_t loc) -{ - /* Unfortunately cannot simply set __d_position due to transition from sub-keys to - * values. - */ - rewinddir (dir); - while (loc > (dir->__d_position & REG_POSITION_MASK)) - if (!readdir (dir, dir->__d_dirent)) - break; -} - -void -fhandler_registry::rewinddir (DIR * dir) -{ - if (dir->__handle != INVALID_HANDLE_VALUE) - { - RegCloseKey ((HKEY) dir->__handle); - dir->__handle = INVALID_HANDLE_VALUE; - } - dir->__d_position = 0; - dir->__flags = dirent_saw_dot | dirent_saw_dot_dot; -} - -int -fhandler_registry::closedir (DIR * dir) -{ - int res = 0; - if (dir->__handle != INVALID_HANDLE_VALUE && - RegCloseKey ((HKEY) dir->__handle) != ERROR_SUCCESS) - { - __seterrno (); - res = -1; - } - syscall_printf ("%d = closedir (%p)", res, dir); - return 0; -} - -int -fhandler_registry::open (int flags, mode_t mode) -{ - int pathlen; - const char *file; - HKEY handle; - - int res = fhandler_virtual::open (flags, mode); - if (!res) - goto out; - - const char *path; - path = get_name () + proc_len + 1 + registry_len; - if (!*path) - { - if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) - { - set_errno (EEXIST); - res = 0; - goto out; - } - else if (flags & O_WRONLY) - { - set_errno (EISDIR); - res = 0; - goto out; - } - else - { - flags |= O_DIROPEN; - goto success; - } - } - path++; - pathlen = strlen (path); - file = path + pathlen - 1; - if (isdirsep (*file) && pathlen > 1) - file--; - while (!isdirsep (*file)) - file--; - file++; - - if (file == path) - { - for (int i = 0; registry_listing[i]; i++) - if (path_prefix_p - (registry_listing[i], path, strlen (registry_listing[i]))) - { - if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) - { - set_errno (EEXIST); - res = 0; - goto out; - } - else if (flags & O_WRONLY) - { - set_errno (EISDIR); - res = 0; - goto out; - } - else - { - flags |= O_DIROPEN; - goto success; - } - } - - if (flags & O_CREAT) - { - set_errno (EROFS); - res = 0; - goto out; - } - else - { - set_errno (ENOENT); - res = 0; - goto out; - } - } - - if (flags & O_WRONLY) - { - set_errno (EROFS); - res = 0; - goto out; - } - - handle = open_key (path, KEY_READ, false); - if (handle == (HKEY) INVALID_HANDLE_VALUE) - { - handle = open_key (path, KEY_READ, true); - if (handle == (HKEY) INVALID_HANDLE_VALUE) - { - res = 0; - goto out; - } - } - else - flags |= O_DIROPEN; - - set_io_handle (handle); - - if (pathmatch (file, DEFAULT_VALUE_NAME)) - value_name = cstrdup (""); - else - value_name = cstrdup (file); - - if (!(flags & O_DIROPEN) && !fill_filebuf ()) - { - RegCloseKey (handle); - res = 0; - goto out; - } - - if (flags & O_APPEND) - position = filesize; - else - position = 0; - -success: - res = 1; - set_flags ((flags & ~O_TEXT) | O_BINARY); - set_open_status (); -out: - syscall_printf ("%d = fhandler_registry::open (%p, %d)", res, flags, mode); - return res; -} - -int -fhandler_registry::close () -{ - int res = fhandler_virtual::close (); - if (res != 0) - return res; - HKEY handle = (HKEY) get_handle (); - if (handle != (HKEY) INVALID_HANDLE_VALUE) - { - if (RegCloseKey (handle) != ERROR_SUCCESS) - { - __seterrno (); - res = -1; - } - } - if (!hExeced && value_name) - { - cfree (value_name); - value_name = NULL; - } - return res; -} - -bool -fhandler_registry::fill_filebuf () -{ - DWORD type, size; - LONG error; - HKEY handle = (HKEY) get_handle (); - if (handle != HKEY_PERFORMANCE_DATA) - { - error = RegQueryValueEx (handle, value_name, NULL, &type, NULL, &size); - if (error != ERROR_SUCCESS) - { - if (error != ERROR_FILE_NOT_FOUND) - { - seterrno_from_win_error (__FILE__, __LINE__, error); - return false; - } - goto value_not_found; - } - bufalloc = size; - filebuf = (char *) cmalloc (HEAP_BUF, bufalloc); - error = - RegQueryValueEx (handle, value_name, NULL, NULL, (BYTE *) filebuf, - &size); - if (error != ERROR_SUCCESS) - { - seterrno_from_win_error (__FILE__, __LINE__, error); - return true; - } - filesize = size; - } - else - { - bufalloc = 0; - do - { - bufalloc += 1000; - filebuf = (char *) crealloc (filebuf, bufalloc); - size = bufalloc; - error = RegQueryValueEx (handle, value_name, NULL, &type, - (BYTE *) filebuf, &size); - if (error != ERROR_SUCCESS && error != ERROR_MORE_DATA) - { - if (error != ERROR_FILE_NOT_FOUND) - { - seterrno_from_win_error (__FILE__, __LINE__, error); - return true; - } - goto value_not_found; - } - } - while (error == ERROR_MORE_DATA); - filesize = size; - } - return true; -value_not_found: - DWORD buf_size = CYG_MAX_PATH; - char buf[buf_size]; - int index = 0; - while (ERROR_SUCCESS == - (error = RegEnumKeyEx (handle, index++, buf, &buf_size, NULL, NULL, - NULL, NULL)) || (error == ERROR_MORE_DATA)) - { - if (pathmatch (buf, value_name)) - { - set_errno (EISDIR); - return false; - } - buf_size = CYG_MAX_PATH; - } - if (error != ERROR_NO_MORE_ITEMS) - { - seterrno_from_win_error (__FILE__, __LINE__, error); - return false; - } - set_errno (ENOENT); - return false; -} - -/* Auxillary member function to open registry keys. */ -static HKEY -open_key (const char *name, REGSAM access, bool isValue) -{ - HKEY hKey = (HKEY) INVALID_HANDLE_VALUE; - HKEY hParentKey = (HKEY) INVALID_HANDLE_VALUE; - bool parentOpened = false; - char component[CYG_MAX_PATH]; - - while (*name) - { - const char *anchor = name; - while (*name && !isdirsep (*name)) - name++; - strncpy (component, anchor, name - anchor); - component[name - anchor] = '\0'; - if (*name) - name++; - if (*name == 0 && isValue == true) - goto out; - - if (hParentKey != (HKEY) INVALID_HANDLE_VALUE) - { - REGSAM effective_access = KEY_READ; - if ((strchr (name, '/') == NULL && isValue == true) || *name == 0) - effective_access = access; - LONG - error = - RegOpenKeyEx (hParentKey, component, 0, effective_access, &hKey); - if (error != ERROR_SUCCESS) - { - hKey = (HKEY) INVALID_HANDLE_VALUE; - seterrno_from_win_error (__FILE__, __LINE__, error); - return hKey; - } - if (parentOpened) - RegCloseKey (hParentKey); - hParentKey = hKey; - parentOpened = true; - } - else - { - for (int i = 0; registry_listing[i]; i++) - if (pathmatch (component, registry_listing[i])) - hKey = registry_keys[i]; - if (hKey == (HKEY) INVALID_HANDLE_VALUE) - return hKey; - hParentKey = hKey; - } - } -out: - return hKey; -} diff --git a/winsup/cygwin/fhandler_serial.cc b/winsup/cygwin/fhandler_serial.cc deleted file mode 100644 index 1488da21d..000000000 --- a/winsup/cygwin/fhandler_serial.cc +++ /dev/null @@ -1,1080 +0,0 @@ -/* fhandler_serial.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "sigproc.h" -#include "pinfo.h" -#include -#include - -/**********************************************************************/ -/* fhandler_serial */ - -fhandler_serial::fhandler_serial () - : fhandler_base (), vmin_ (0), vtime_ (0), pgrp_ (myself->pgid) -{ - need_fork_fixup (true); -} - -void -fhandler_serial::overlapped_setup () -{ - memset (&io_status, 0, sizeof (io_status)); - io_status.hEvent = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); - ProtectHandle (io_status.hEvent); - overlapped_armed = 0; -} - -void -fhandler_serial::raw_read (void *ptr, size_t& ulen) -{ - int tot; - DWORD n; - HANDLE w4[2]; - size_t minchars = vmin_ ?: ulen; - - w4[0] = io_status.hEvent; - w4[1] = signal_arrived; - - debug_printf ("ulen %d, vmin_ %d, vtime_ %d, hEvent %p", ulen, vmin_, vtime_, - io_status.hEvent); - if (!overlapped_armed) - { - SetCommMask (get_handle (), EV_RXCHAR); - ResetEvent (io_status.hEvent); - } - - for (n = 0, tot = 0; ulen; ulen -= n, ptr = (char *) ptr + n) - { - COMSTAT st; - DWORD inq = 1; - - n = 0; - - if (!vtime_ && !vmin_) - inq = ulen; - else if (vtime_) - { - inq = ulen; // non-interruptible -- have to use kernel timeouts - // also note that this is not strictly correct. - // if vmin > ulen then things won't work right. - overlapped_armed = -1; - } - - if (!ClearCommError (get_handle (), &ev, &st)) - goto err; - else if (ev) - termios_printf ("error detected %x", ev); - else if (st.cbInQue) - inq = st.cbInQue; - else if (!overlapped_armed) - { - if ((size_t) tot >= minchars) - break; - else if (WaitCommEvent (get_handle (), &ev, &io_status)) - { - debug_printf ("WaitCommEvent succeeded: ev %x", ev); - if (!ev) - continue; - } - else if (GetLastError () != ERROR_IO_PENDING) - goto err; - else - { - overlapped_armed = 1; - switch (WaitForMultipleObjects (2, w4, FALSE, INFINITE)) - { - case WAIT_OBJECT_0: - if (!GetOverlappedResult (get_handle (), &io_status, &n, FALSE)) - goto err; - debug_printf ("n %d, ev %x", n, ev); - break; - case WAIT_OBJECT_0 + 1: - tot = -1; - PurgeComm (get_handle (), PURGE_RXABORT); - overlapped_armed = 0; - set_sig_errno (EINTR); - goto out; - default: - goto err; - } - } - } - - overlapped_armed = 0; - ResetEvent (io_status.hEvent); - if (inq > ulen) - inq = ulen; - debug_printf ("inq %d", inq); - if (ReadFile (get_handle (), ptr, min (inq, ulen), &n, &io_status)) - /* Got something */; - else if (GetLastError () != ERROR_IO_PENDING) - goto err; - else if (!GetOverlappedResult (get_handle (), &io_status, &n, TRUE)) - goto err; - - tot += n; - debug_printf ("vtime_ %d, vmin_ %d, n %d, tot %d", vtime_, vmin_, n, tot); - if (vtime_ || !vmin_ || !n) - break; - continue; - - err: - debug_printf ("err %E"); - if (GetLastError () != ERROR_OPERATION_ABORTED) - { - PurgeComm (get_handle (), PURGE_RXABORT); - tot = -1; - __seterrno (); - break; - } - - n = 0; - } - -out: - ulen = tot; -} - -/* Cover function to WriteFile to provide Posix interface and semantics - (as much as possible). */ -int -fhandler_serial::raw_write (const void *ptr, size_t len) -{ - DWORD bytes_written; - OVERLAPPED write_status; - - memset (&write_status, 0, sizeof (write_status)); - write_status.hEvent = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); - ProtectHandle (write_status.hEvent); - - for (;;) - { - if (WriteFile (get_handle (), ptr, len, &bytes_written, &write_status)) - break; - - switch (GetLastError ()) - { - case ERROR_OPERATION_ABORTED: - DWORD ev; - if (!ClearCommError (get_handle (), &ev, NULL)) - goto err; - if (ev) - termios_printf ("error detected %x", ev); - continue; - case ERROR_IO_PENDING: - break; - default: - goto err; - } - - if (!GetOverlappedResult (get_handle (), &write_status, &bytes_written, TRUE)) - goto err; - - break; - } - - ForceCloseHandle (write_status.hEvent); - - return bytes_written; - -err: - __seterrno (); - ForceCloseHandle (write_status.hEvent); - return -1; -} - -void -fhandler_serial::init (HANDLE f, DWORD flags, mode_t bin) -{ - open (flags, bin & (O_BINARY | O_TEXT)); -} - -int -fhandler_serial::open (int flags, mode_t mode) -{ - int res; - COMMTIMEOUTS to; - extern BOOL reset_com; - - syscall_printf ("fhandler_serial::open (%s, %p, %p)", - get_name (), flags, mode); - - if (!fhandler_base::open (flags, mode)) - return 0; - - res = 1; - - SetCommMask (get_handle (), EV_RXCHAR); - - uninterruptible_io (true); // Handled explicitly in read code - - overlapped_setup (); - - memset (&to, 0, sizeof (to)); - SetCommTimeouts (get_handle (), &to); - - /* Reset serial port to known state of 9600-8-1-no flow control - on open for better behavior under Win 95. - - FIXME: This should only be done when explicitly opening the com - port. It should not be reset if an fd is inherited. - Using __progname in this way, to determine how far along in the - initialization we are, is really a terrible kludge and should - be fixed ASAP. - */ - extern char *__progname; - if (reset_com && __progname) - { - DCB state; - GetCommState (get_handle (), &state); - syscall_printf ("setting initial state on %s (reset_com %d)", - get_name (), reset_com); - state.BaudRate = CBR_9600; - state.ByteSize = 8; - state.StopBits = ONESTOPBIT; - state.Parity = NOPARITY; /* FIXME: correct default? */ - state.fBinary = TRUE; /* binary xfer */ - state.EofChar = 0; /* no end-of-data in binary mode */ - state.fNull = FALSE; /* don't discard nulls in binary mode */ - state.fParity = FALSE; /* ignore parity errors */ - state.fErrorChar = FALSE; - state.fTXContinueOnXoff = TRUE; /* separate TX and RX flow control */ - state.fOutX = FALSE; /* disable transmission flow control */ - state.fInX = FALSE; /* disable reception flow control */ - state.XonChar = 0x11; - state.XoffChar = 0x13; - state.fOutxDsrFlow = FALSE; /* disable DSR flow control */ - state.fRtsControl = RTS_CONTROL_ENABLE; /* ignore lead control except - DTR */ - state.fOutxCtsFlow = FALSE; /* disable output flow control */ - state.fDtrControl = DTR_CONTROL_ENABLE; /* assert DTR */ - state.fDsrSensitivity = FALSE; /* don't assert DSR */ - state.fAbortOnError = TRUE; - if (!SetCommState (get_handle (), &state)) - system_printf ("couldn't set initial state for %s, %E", get_name ()); - } - - /* setting rts and dtr to known state so that ioctl() function with - request TIOCMGET could return correct value of RTS and DTR lines. - Important only for Win 9x systems */ - - if (!wincap.supports_reading_modem_output_lines ()) - { - if (EscapeCommFunction (get_handle (), SETDTR) == 0) - system_printf ("couldn't set initial state of DTR for %s, %E", get_name ()); - if (EscapeCommFunction (get_handle (), SETRTS) == 0) - system_printf ("couldn't set initial state of RTS for %s, %E", get_name ()); - - /* even though one of above functions fail I have to set rts and dtr - variables to initial value. */ - rts = TIOCM_RTS; - dtr = TIOCM_DTR; - } - - SetCommMask (get_handle (), EV_RXCHAR); - set_open_status (); - syscall_printf ("%p = fhandler_serial::open (%s, %p, %p)", - res, get_name (), flags, mode); - return res; -} - -int -fhandler_serial::close () -{ - ForceCloseHandle (io_status.hEvent); - return fhandler_base::close (); -} - -/* tcsendbreak: POSIX 7.2.2.1 */ -/* Break for 250-500 milliseconds if duration == 0 */ -/* Otherwise, units for duration are undefined */ -int -fhandler_serial::tcsendbreak (int duration) -{ - unsigned int sleeptime = 300000; - - if (duration > 0) - sleeptime *= duration; - - if (SetCommBreak (get_handle ()) == 0) - return -1; - - /* FIXME: need to send zero bits during duration */ - usleep (sleeptime); - - if (ClearCommBreak (get_handle ()) == 0) - return -1; - - syscall_printf ("0 = fhandler_serial:tcsendbreak (%d)", duration); - - return 0; -} - -/* tcdrain: POSIX 7.2.2.1 */ -int -fhandler_serial::tcdrain () -{ - if (FlushFileBuffers (get_handle ()) == 0) - return -1; - - return 0; -} - -/* tcflow: POSIX 7.2.2.1 */ -int -fhandler_serial::tcflow (int action) -{ - DWORD win32action = 0; - DCB dcb; - char xchar; - - termios_printf ("action %d", action); - - switch (action) - { - case TCOOFF: - win32action = SETXOFF; - break; - case TCOON: - win32action = SETXON; - break; - case TCION: - case TCIOFF: - if (GetCommState (get_handle (), &dcb) == 0) - return -1; - if (action == TCION) - xchar = (dcb.XonChar ? dcb.XonChar : 0x11); - else - xchar = (dcb.XoffChar ? dcb.XoffChar : 0x13); - if (TransmitCommChar (get_handle (), xchar) == 0) - return -1; - return 0; - break; - default: - return -1; - break; - } - - if (EscapeCommFunction (get_handle (), win32action) == 0) - return -1; - - return 0; -} - - -/* switch_modem_lines: set or clear RTS and/or DTR */ -int -fhandler_serial::switch_modem_lines (int set, int clr) -{ - int res = 0; - - if (set & TIOCM_RTS) - { - if (EscapeCommFunction (get_handle (), SETRTS)) - rts = TIOCM_RTS; - else - { - __seterrno (); - res = -1; - } - } - else if (clr & TIOCM_RTS) - { - if (EscapeCommFunction (get_handle (), CLRRTS)) - rts = 0; - else - { - __seterrno (); - res = -1; - } - } - if (set & TIOCM_DTR) - { - if (EscapeCommFunction (get_handle (), SETDTR)) - rts = TIOCM_DTR; - else - { - __seterrno (); - res = -1; - } - } - else if (clr & TIOCM_DTR) - { - if (EscapeCommFunction (get_handle (), CLRDTR)) - rts = 0; - else - { - __seterrno (); - res = -1; - } - } - - return res; -} - -/* ioctl: */ -int -fhandler_serial::ioctl (unsigned int cmd, void *buffer) -{ - int res = 0; - -# define ibuffer ((int) buffer) -# define ipbuffer (*(int *) buffer) - - DWORD ev; - COMSTAT st; - if (!ClearCommError (get_handle (), &ev, &st)) - { - __seterrno (); - res = -1; - } - else - switch (cmd) - { - case TCFLSH: - res = tcflush (ibuffer); - break; - case TIOCMGET: - DWORD modem_lines; - if (!GetCommModemStatus (get_handle (), &modem_lines)) - { - __seterrno (); - res = -1; - } - else - { - ipbuffer = 0; - if (modem_lines & MS_CTS_ON) - ipbuffer |= TIOCM_CTS; - if (modem_lines & MS_DSR_ON) - ipbuffer |= TIOCM_DSR; - if (modem_lines & MS_RING_ON) - ipbuffer |= TIOCM_RI; - if (modem_lines & MS_RLSD_ON) - ipbuffer |= TIOCM_CD; - - DWORD cb; - DWORD mcr; - if (!DeviceIoControl (get_handle (), IOCTL_SERIAL_GET_DTRRTS, - NULL, 0, &mcr, 4, &cb, 0) || cb != 4) - ipbuffer |= rts | dtr; - else - { - if (mcr & 2) - ipbuffer |= TIOCM_RTS; - if (mcr & 1) - ipbuffer |= TIOCM_DTR; - } - } - break; - case TIOCMSET: - if (switch_modem_lines (ipbuffer, ~ipbuffer)) - res = -1; - break; - case TIOCMBIS: - if (switch_modem_lines (ipbuffer, 0)) - res = -1; - break; - case TIOCMBIC: - if (switch_modem_lines (0, ipbuffer)) - res = -1; - break; - case TIOCCBRK: - if (ClearCommBreak (get_handle ()) == 0) - { - __seterrno (); - res = -1; - } - break; - case TIOCSBRK: - if (SetCommBreak (get_handle ()) == 0) - { - __seterrno (); - res = -1; - } - break; - case TIOCINQ: - if (ev & CE_FRAME || ev & CE_IOE || ev & CE_OVERRUN || ev & CE_RXOVER - || ev & CE_RXPARITY) - { - set_errno (EINVAL); /* FIXME: Use correct errno */ - res = -1; - } - else - ipbuffer = st.cbInQue; - break; - case TIOCGWINSZ: - ((struct winsize *) buffer)->ws_row = 0; - ((struct winsize *) buffer)->ws_col = 0; - break; - default: - set_errno (ENOSYS); - res = -1; - break; - } - - termios_printf ("%d = ioctl (%p, %p)", res, cmd, buffer); -# undef ibuffer -# undef ipbuffer - return res; -} - -/* tcflush: POSIX 7.2.2.1 */ -int -fhandler_serial::tcflush (int queue) -{ - DWORD flags; - - switch (queue) - { - case TCOFLUSH: - flags = PURGE_TXABORT | PURGE_TXCLEAR; - break; - case TCIFLUSH: - flags = PURGE_RXABORT | PURGE_RXCLEAR; - break; - case TCIOFLUSH: - flags = PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR; - break; - default: - termios_printf ("Invalid tcflush queue %d", queue); - set_errno (EINVAL); - return -1; - } - - if (!PurgeComm (get_handle (), flags)) - { - __seterrno (); - return -1; - } - - return 0; -} - -/* tcsetattr: POSIX 7.2.1.1 */ -int -fhandler_serial::tcsetattr (int action, const struct termios *t) -{ - /* Possible actions: - TCSANOW: immediately change attributes. - TCSADRAIN: flush output, then change attributes. - TCSAFLUSH: flush output and discard input, then change attributes. - */ - - bool dropDTR = false; - COMMTIMEOUTS to; - DCB ostate, state; - unsigned int ovtime = vtime_, ovmin = vmin_; - int tmpDtr, tmpRts, res; - res = tmpDtr = tmpRts = 0; - - termios_printf ("action %d", action); - if ((action == TCSADRAIN) || (action == TCSAFLUSH)) - { - FlushFileBuffers (get_handle ()); - termios_printf ("flushed file buffers"); - } - if (action == TCSAFLUSH) - PurgeComm (get_handle (), (PURGE_RXABORT | PURGE_RXCLEAR)); - - /* get default/last comm state */ - if (!GetCommState (get_handle (), &ostate)) - return -1; - - state = ostate; - - /* -------------- Set baud rate ------------------ */ - /* FIXME: WIN32 also has 14400, 56000, 128000, and 256000. - Unix also has 230400. */ - - switch (t->c_ospeed) - { - case B0: - /* Drop DTR - but leave DCB-resident bitrate as-is since - 0 is an invalid bitrate in Win32 */ - dropDTR = true; - break; - case B110: - state.BaudRate = CBR_110; - break; - case B300: - state.BaudRate = CBR_300; - break; - case B600: - state.BaudRate = CBR_600; - break; - case B1200: - state.BaudRate = CBR_1200; - break; - case B2400: - state.BaudRate = CBR_2400; - break; - case B4800: - state.BaudRate = CBR_4800; - break; - case B9600: - state.BaudRate = CBR_9600; - break; - case B19200: - state.BaudRate = CBR_19200; - break; - case B38400: - state.BaudRate = CBR_38400; - break; - case B57600: - state.BaudRate = CBR_57600; - break; - case B115200: - state.BaudRate = CBR_115200; - break; - case B230400: - state.BaudRate = 230400 /* CBR_230400 - not defined */; - break; - default: - /* Unsupported baud rate! */ - termios_printf ("Invalid t->c_ospeed %d", t->c_ospeed); - set_errno (EINVAL); - return -1; - } - - /* -------------- Set byte size ------------------ */ - - switch (t->c_cflag & CSIZE) - { - case CS5: - state.ByteSize = 5; - break; - case CS6: - state.ByteSize = 6; - break; - case CS7: - state.ByteSize = 7; - break; - case CS8: - state.ByteSize = 8; - break; - default: - /* Unsupported byte size! */ - termios_printf ("Invalid t->c_cflag byte size %d", - t->c_cflag & CSIZE); - set_errno (EINVAL); - return -1; - } - - /* -------------- Set stop bits ------------------ */ - - if (t->c_cflag & CSTOPB) - state.StopBits = TWOSTOPBITS; - else - state.StopBits = ONESTOPBIT; - - /* -------------- Set parity ------------------ */ - - if (t->c_cflag & PARENB) - state.Parity = (t->c_cflag & PARODD) ? ODDPARITY : EVENPARITY; - else - state.Parity = NOPARITY; - - state.fBinary = TRUE; /* Binary transfer */ - state.EofChar = 0; /* No end-of-data in binary mode */ - state.fNull = FALSE; /* Don't discard nulls in binary mode */ - - /* -------------- Parity errors ------------------ */ - /* fParity combines the function of INPCK and NOT IGNPAR */ - - if ((t->c_iflag & INPCK) && !(t->c_iflag & IGNPAR)) - state.fParity = TRUE; /* detect parity errors */ - else - state.fParity = FALSE; /* ignore parity errors */ - - /* Only present in Win32, Unix has no equivalent */ - state.fErrorChar = FALSE; - state.ErrorChar = 0; - - /* -------------- Set software flow control ------------------ */ - /* Set fTXContinueOnXoff to FALSE. This prevents the triggering of a - premature XON when the remote device interprets a received character - as XON (same as IXANY on the remote side). Otherwise, a TRUE - value separates the TX and RX functions. */ - - state.fTXContinueOnXoff = TRUE; /* separate TX and RX flow control */ - - /* Transmission flow control */ - if (t->c_iflag & IXON) - state.fOutX = TRUE; /* enable */ - else - state.fOutX = FALSE; /* disable */ - - /* Reception flow control */ - if (t->c_iflag & IXOFF) - state.fInX = TRUE; /* enable */ - else - state.fInX = FALSE; /* disable */ - - /* XoffLim and XonLim are left at default values */ - - state.XonChar = (t->c_cc[VSTART] ? t->c_cc[VSTART] : 0x11); - state.XoffChar = (t->c_cc[VSTOP] ? t->c_cc[VSTOP] : 0x13); - - /* -------------- Set hardware flow control ------------------ */ - - /* Disable DSR flow control */ - state.fOutxDsrFlow = FALSE; - - /* Some old flavors of Unix automatically enabled hardware flow - control when software flow control was not enabled. Since newer - Unices tend to require explicit setting of hardware flow-control, - this is what we do. */ - - /* RTS/CTS flow control */ - if (t->c_cflag & CRTSCTS) - { /* enable */ - state.fOutxCtsFlow = TRUE; - state.fRtsControl = RTS_CONTROL_HANDSHAKE; - } - else - { /* disable */ - state.fRtsControl = RTS_CONTROL_ENABLE; - state.fOutxCtsFlow = FALSE; - tmpRts = TIOCM_RTS; - } - - if (t->c_cflag & CRTSXOFF) - state.fRtsControl = RTS_CONTROL_HANDSHAKE; - - /* -------------- DTR ------------------ */ - /* Assert DTR on device open */ - - state.fDtrControl = DTR_CONTROL_ENABLE; - - /* -------------- DSR ------------------ */ - /* Assert DSR at the device? */ - - if (t->c_cflag & CLOCAL) - state.fDsrSensitivity = FALSE; /* no */ - else - state.fDsrSensitivity = TRUE; /* yes */ - - /* -------------- Error handling ------------------ */ - /* Since read/write operations terminate upon error, we - will use ClearCommError() to resume. */ - - state.fAbortOnError = TRUE; - - if ((memcmp (&ostate, &state, sizeof (state)) != 0) - && !SetCommState (get_handle (), &state)) - { - /* SetCommState() failed, usually due to invalid DCB param. - Keep track of this so we can set errno to EINVAL later - and return failure */ - termios_printf ("SetCommState() failed, %E"); - __seterrno (); - res = -1; - } - - rbinary ((t->c_iflag & IGNCR) ? false : true); - wbinary ((t->c_oflag & ONLCR) ? false : true); - - if (dropDTR) - { - EscapeCommFunction (get_handle (), CLRDTR); - tmpDtr = 0; - } - else - { - /* FIXME: Sometimes when CLRDTR is set, setting - state.fDtrControl = DTR_CONTROL_ENABLE will fail. This - is a problem since a program might want to change some - parameters while DTR is still down. */ - - EscapeCommFunction (get_handle (), SETDTR); - tmpDtr = TIOCM_DTR; - } - - rts = tmpRts; - dtr = tmpDtr; - - /* The following documentation on was taken from "Linux Serial Programming - HOWTO". It explains how MIN (t->c_cc[VMIN] || vmin_) and TIME - (t->c_cc[VTIME] || vtime_) is to be used. - - In non-canonical input processing mode, input is not assembled into - lines and input processing (erase, kill, delete, etc.) does not - occur. Two parameters control the behavior of this mode: c_cc[VTIME] - sets the character timer, and c_cc[VMIN] sets the minimum number of - characters to receive before satisfying the read. - - If MIN > 0 and TIME = 0, MIN sets the number of characters to receive - before the read is satisfied. As TIME is zero, the timer is not used. - - If MIN = 0 and TIME > 0, TIME serves as a timeout value. The read will - be satisfied if a single character is read, or TIME is exceeded (t = - TIME *0.1 s). If TIME is exceeded, no character will be returned. - - If MIN > 0 and TIME > 0, TIME serves as an inter-character timer. The - read will be satisfied if MIN characters are received, or the time - between two characters exceeds TIME. The timer is restarted every time - a character is received and only becomes active after the first - character has been received. - - If MIN = 0 and TIME = 0, read will be satisfied immediately. The - number of characters currently available, or the number of characters - requested will be returned. According to Antonino (see contributions), - you could issue a fcntl(fd, F_SETFL, FNDELAY); before reading to get - the same result. - */ - - if (t->c_lflag & ICANON) - { - vmin_ = 0; - vtime_ = 0; - } - else - { - vtime_ = t->c_cc[VTIME] * 100; - vmin_ = t->c_cc[VMIN]; - } - - debug_printf ("vtime %d, vmin %d", vtime_, vmin_); - - if (ovmin != vmin_ || ovtime != vtime_) - { - memset (&to, 0, sizeof (to)); - - if ((vmin_ > 0) && (vtime_ == 0)) - { - /* Returns immediately with whatever is in buffer on a ReadFile(); - or blocks if nothing found. We will keep calling ReadFile(); until - vmin_ characters are read */ - to.ReadIntervalTimeout = to.ReadTotalTimeoutMultiplier = MAXDWORD; - to.ReadTotalTimeoutConstant = MAXDWORD - 1; - } - else if ((vmin_ == 0) && (vtime_ > 0)) - { - /* set timeoout constant appropriately and we will only try to - read one character in ReadFile() */ - to.ReadTotalTimeoutConstant = vtime_; - to.ReadIntervalTimeout = to.ReadTotalTimeoutMultiplier = MAXDWORD; - } - else if ((vmin_ > 0) && (vtime_ > 0)) - { - /* time applies to the interval time for this case */ - to.ReadIntervalTimeout = vtime_; - } - else if ((vmin_ == 0) && (vtime_ == 0)) - { - /* returns immediately with whatever is in buffer as per - Time-Outs docs in Win32 SDK API docs */ - to.ReadIntervalTimeout = MAXDWORD; - } - - debug_printf ("ReadTotalTimeoutConstant %d, ReadIntervalTimeout %d, ReadTotalTimeoutMultiplier %d", - to.ReadTotalTimeoutConstant, to.ReadIntervalTimeout, to.ReadTotalTimeoutMultiplier); - - if (!SetCommTimeouts(get_handle (), &to)) - { - /* SetCommTimeouts() failed. Keep track of this so we - can set errno to EINVAL later and return failure */ - termios_printf ("SetCommTimeouts() failed, %E"); - __seterrno (); - res = -1; - } - } - - return res; -} - -/* tcgetattr: POSIX 7.2.1.1 */ -int -fhandler_serial::tcgetattr (struct termios *t) -{ - DCB state; - - /* Get current Win32 comm state */ - if (GetCommState (get_handle (), &state) == 0) - return -1; - - /* for safety */ - memset (t, 0, sizeof (*t)); - - t->c_cflag = 0; - /* -------------- Baud rate ------------------ */ - switch (state.BaudRate) - { - case CBR_110: - t->c_ospeed = t->c_ispeed = B110; - break; - case CBR_300: - t->c_ospeed = t->c_ispeed = B300; - break; - case CBR_600: - t->c_ospeed = t->c_ispeed = B600; - break; - case CBR_1200: - t->c_ospeed = t->c_ispeed = B1200; - break; - case CBR_2400: - t->c_ospeed = t->c_ispeed = B2400; - break; - case CBR_4800: - t->c_ospeed = t->c_ispeed = B4800; - break; - case CBR_9600: - t->c_ospeed = t->c_ispeed = B9600; - break; - case CBR_19200: - t->c_ospeed = t->c_ispeed = B19200; - break; - case CBR_38400: - t->c_ospeed = t->c_ispeed = B38400; - break; - case CBR_57600: - t->c_ospeed = t->c_ispeed = B57600; - break; - case CBR_115200: - t->c_ospeed = t->c_ispeed = B115200; - break; - case 230400: /* CBR_230400 - not defined */ - t->c_ospeed = t->c_ispeed = B230400; - break; - default: - /* Unsupported baud rate! */ - termios_printf ("Invalid baud rate %d", state.BaudRate); - set_errno (EINVAL); - return -1; - } - - /* -------------- Byte size ------------------ */ - - switch (state.ByteSize) - { - case 5: - t->c_cflag |= CS5; - break; - case 6: - t->c_cflag |= CS6; - break; - case 7: - t->c_cflag |= CS7; - break; - case 8: - t->c_cflag |= CS8; - break; - default: - /* Unsupported byte size! */ - termios_printf ("Invalid byte size %d", state.ByteSize); - set_errno (EINVAL); - return -1; - } - - /* -------------- Stop bits ------------------ */ - - if (state.StopBits == TWOSTOPBITS) - t->c_cflag |= CSTOPB; - - /* -------------- Parity ------------------ */ - - if (state.Parity == ODDPARITY) - t->c_cflag |= (PARENB | PARODD); - if (state.Parity == EVENPARITY) - t->c_cflag |= PARENB; - - /* -------------- Parity errors ------------------ */ - - /* fParity combines the function of INPCK and NOT IGNPAR */ - if (state.fParity) - t->c_iflag |= INPCK; - else - t->c_iflag |= IGNPAR; /* not necessarily! */ - - /* -------------- Software flow control ------------------ */ - - /* transmission flow control */ - if (state.fOutX) - t->c_iflag |= IXON; - - /* reception flow control */ - if (state.fInX) - t->c_iflag |= IXOFF; - - t->c_cc[VSTART] = (state.XonChar ? state.XonChar : 0x11); - t->c_cc[VSTOP] = (state.XoffChar ? state.XoffChar : 0x13); - - /* -------------- Hardware flow control ------------------ */ - /* Some old flavors of Unix automatically enabled hardware flow - control when software flow control was not enabled. Since newer - Unices tend to require explicit setting of hardware flow-control, - this is what we do. */ - - /* Input flow-control */ - if ((state.fRtsControl == RTS_CONTROL_HANDSHAKE) && state.fOutxCtsFlow) - t->c_cflag |= CRTSCTS; - if (state.fRtsControl == RTS_CONTROL_HANDSHAKE) - t->c_cflag |= CRTSXOFF; - - /* -------------- CLOCAL --------------- */ - /* DSR is only lead toggled only by CLOCAL. Check it to see if - CLOCAL was called. */ - /* FIXME: If tcsetattr() hasn't been called previously, this may - give a false CLOCAL. */ - - if (!state.fDsrSensitivity) - t->c_cflag |= CLOCAL; - - /* FIXME: need to handle IGNCR */ -#if 0 - if (!rbinary ()) - t->c_iflag |= IGNCR; -#endif - - if (!wbinary ()) - t->c_oflag |= ONLCR; - - t->c_cc[VTIME] = vtime_ / 100; - t->c_cc[VMIN] = vmin_; - - debug_printf ("vmin_ %d, vtime_ %d", vmin_, vtime_); - - return 0; -} - -void -fhandler_serial::fixup_after_fork (HANDLE parent) -{ - if (close_on_exec ()) - fhandler_base::fixup_after_fork (parent); - overlapped_setup (); - debug_printf ("io_status.hEvent %p", io_status.hEvent); -} - -void -fhandler_serial::fixup_after_exec () -{ - if (!close_on_exec ()) - overlapped_setup (); - debug_printf ("io_status.hEvent %p, close_on_exec %d", io_status.hEvent, close_on_exec ()); -} - -int -fhandler_serial::dup (fhandler_base *child) -{ - fhandler_serial *fhc = (fhandler_serial *) child; - fhc->overlapped_setup (); - fhc->vmin_ = vmin_; - fhc->vtime_ = vtime_; - return fhandler_base::dup (child); -} diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc deleted file mode 100644 index 7d666620f..000000000 --- a/winsup/cygwin/fhandler_socket.cc +++ /dev/null @@ -1,1690 +0,0 @@ -/* fhandler_socket.cc. See fhandler.h for a description of the fhandler classes. - - Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -/* #define DEBUG_NEST_ON 1 */ - -#define __INSIDE_CYGWIN_NET__ - -#include "winsup.h" -#include -#include -#include -#include -#include - -#include -#define USE_SYS_TYPES_FD_SET -#include -#include "cygerrno.h" -#include "security.h" -#include "cygwin/version.h" -#include "perprocess.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "sigproc.h" -#include "cygthread.h" -#include "select.h" -#include "wininfo.h" -#include -#include -#include "cygtls.h" - -#define ASYNC_MASK (FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT) - -extern bool fdsock (cygheap_fdmanip& fd, const device *, SOCKET soc); -extern "C" { -int sscanf (const char *, const char *, ...); -} /* End of "C" section */ - -fhandler_dev_random* entropy_source; - -/* cygwin internal: map sockaddr into internet domain address */ -static int -get_inet_addr (const struct sockaddr *in, int inlen, - struct sockaddr_in *out, int *outlen, - int *type = NULL, int *secret = NULL) -{ - int secret_buf [4]; - int* secret_ptr = (secret ? : secret_buf); - - if (in->sa_family == AF_INET) - { - *out = * (struct sockaddr_in *)in; - *outlen = inlen; - return 1; - } - else if (in->sa_family == AF_LOCAL) - { - path_conv pc (in->sa_data, PC_SYM_FOLLOW); - if (pc.error) - { - set_errno (pc.error); - return 0; - } - if (!pc.exists ()) - { - set_errno (ENOENT); - return 0; - } - if (!pc.issocket ()) - { - set_errno (EBADF); - return 0; - } - HANDLE fh = CreateFile (pc, GENERIC_READ, wincap.shared (), &sec_none, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - if (fh == INVALID_HANDLE_VALUE) - { - __seterrno (); - return 0; - } - int ret = 0; - DWORD len = 0; - char buf[128]; - memset (buf, 0, sizeof buf); - if (ReadFile (fh, buf, 128, &len, 0)) - { - struct sockaddr_in sin; - char ctype; - sin.sin_family = AF_INET; - sscanf (buf + strlen (SOCKET_COOKIE), "%hu %c %08x-%08x-%08x-%08x", - &sin.sin_port, - &ctype, - secret_ptr, secret_ptr + 1, secret_ptr + 2, secret_ptr + 3); - sin.sin_port = htons (sin.sin_port); - sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK); - *out = sin; - *outlen = sizeof sin; - if (type) - *type = (ctype == 's' ? SOCK_STREAM : - ctype == 'd' ? SOCK_DGRAM - : 0); - ret = 1; - } - else - __seterrno (); - CloseHandle (fh); - return ret; - } - else - { - set_errno (EAFNOSUPPORT); - return 0; - } -} - -/**********************************************************************/ -/* fhandler_socket */ - -fhandler_socket::fhandler_socket () : - fhandler_base (), - sun_path (NULL), - status () -{ - need_fork_fixup (true); - prot_info_ptr = (LPWSAPROTOCOL_INFOA) cmalloc (HEAP_BUF, - sizeof (WSAPROTOCOL_INFOA)); -#if 0 - if (pc.is_fs_special ()) - { - fhandler_socket * fhs = (fhandler_socket *) fh; - fhs->set_addr_family (AF_LOCAL); - fhs->set_sun_path (posix_path); - } -#endif -} - -fhandler_socket::~fhandler_socket () -{ - if (prot_info_ptr) - cfree (prot_info_ptr); - if (sun_path) - cfree (sun_path); -} - -char * -fhandler_socket::get_proc_fd_name (char *buf) -{ - __small_sprintf (buf, "socket:[%d]", get_socket ()); - return buf; -} - -int -fhandler_socket::open (int flags, mode_t mode) -{ - set_errno (ENXIO); - return 0; -} - -void -fhandler_socket::af_local_set_sockpair_cred () -{ - sec_pid = sec_peer_pid = getpid (); - sec_uid = sec_peer_uid = geteuid32 (); - sec_gid = sec_peer_gid = getegid32 (); -} - -void -fhandler_socket::af_local_setblocking (bool &async, bool &nonblocking) -{ - async = async_io (); - nonblocking = is_nonblocking (); - if (async || nonblocking) - WSAAsyncSelect (get_socket (), winmsg, 0, 0); - unsigned long p = 0; - ioctlsocket (get_socket (), FIONBIO, &p); - set_nonblocking (false); - async_io (false); -} - -void -fhandler_socket::af_local_unsetblocking (bool async, bool nonblocking) -{ - if (nonblocking) - { - unsigned long p = 1; - ioctlsocket (get_socket (), FIONBIO, &p); - set_nonblocking (true); - } - if (async) - { - WSAAsyncSelect (get_socket (), winmsg, WM_ASYNCIO, ASYNC_MASK); - async_io (true); - } -} - -bool -fhandler_socket::af_local_recv_secret () -{ - int out[4] = { 0, 0, 0, 0 }; - int rest = sizeof out; - char *ptr = (char *) out; - while (rest > 0) - { - int ret = recvfrom (ptr, rest, 0, NULL, NULL); - if (ret <= 0) - break; - rest -= ret; - ptr += ret; - } - if (rest == 0) - { - debug_printf ("Received af_local secret: %08x-%08x-%08x-%08x", - out[0], out[1], out[2], out[3]); - if (out[0] != connect_secret[0] || out[1] != connect_secret[1] - || out[2] != connect_secret[2] || out[3] != connect_secret[3]) - { - debug_printf ("Receiving af_local secret mismatch"); - return false; - } - } - else - debug_printf ("Receiving af_local secret failed"); - return rest == 0; -} - -bool -fhandler_socket::af_local_send_secret () -{ - int rest = sizeof connect_secret; - char *ptr = (char *) connect_secret; - while (rest > 0) - { - int ret = sendto (ptr, rest, 0, NULL, 0); - if (ret <= 0) - break; - rest -= ret; - ptr += ret; - } - debug_printf ("Sending af_local secret %s", rest == 0 ? "succeeded" - : "failed"); - return rest == 0; -} - -bool -fhandler_socket::af_local_recv_cred () -{ - struct ucred out = { (pid_t) 0, (__uid32_t) -1, (__gid32_t) -1 }; - int rest = sizeof out; - char *ptr = (char *) &out; - while (rest > 0) - { - int ret = recvfrom (ptr, rest, 0, NULL, NULL); - if (ret <= 0) - break; - rest -= ret; - ptr += ret; - } - if (rest == 0) - { - debug_printf ("Received eid credentials: pid: %d, uid: %d, gid: %d", - out.pid, out.uid, out.gid); - sec_peer_pid = out.pid; - sec_peer_uid = out.uid; - sec_peer_gid = out.gid; - } - else - debug_printf ("Receiving eid credentials failed"); - return rest == 0; -} - -bool -fhandler_socket::af_local_send_cred () -{ - struct ucred in = { sec_pid, sec_uid, sec_gid }; - int rest = sizeof in; - char *ptr = (char *) ∈ - while (rest > 0) - { - int ret = sendto (ptr, rest, 0, NULL, 0); - if (ret <= 0) - break; - rest -= ret; - ptr += ret; - } - if (rest == 0) - debug_printf ("Sending eid credentials succeeded"); - else - debug_printf ("Sending eid credentials failed"); - return rest == 0; -} - -int -fhandler_socket::af_local_connect () -{ - /* This keeps the test out of select. */ - if (get_addr_family () != AF_LOCAL || get_socket_type () != SOCK_STREAM) - return 0; - - debug_printf ("af_local_connect called"); - bool orig_async_io, orig_is_nonblocking; - af_local_setblocking (orig_async_io, orig_is_nonblocking); - if (!af_local_send_secret () || !af_local_recv_secret () - || !af_local_send_cred () || !af_local_recv_cred ()) - { - debug_printf ("accept from unauthorized server"); - ::shutdown (get_socket (), SD_BOTH); - WSASetLastError (WSAECONNREFUSED); - return -1; - } - af_local_unsetblocking (orig_async_io, orig_is_nonblocking); - return 0; -} - -int -fhandler_socket::af_local_accept () -{ - debug_printf ("af_local_accept called"); - bool orig_async_io, orig_is_nonblocking; - af_local_setblocking (orig_async_io, orig_is_nonblocking); - if (!af_local_recv_secret () || !af_local_send_secret () - || !af_local_recv_cred () || !af_local_send_cred ()) - { - debug_printf ("connect from unauthorized client"); - ::shutdown (get_socket (), SD_BOTH); - ::closesocket (get_socket ()); - WSASetLastError (WSAECONNABORTED); - return -1; - } - af_local_unsetblocking (orig_async_io, orig_is_nonblocking); - return 0; -} - -void -fhandler_socket::af_local_set_cred () -{ - sec_pid = getpid (); - sec_uid = geteuid32 (); - sec_gid = getegid32 (); - sec_peer_pid = (pid_t) 0; - sec_peer_uid = (__uid32_t) -1; - sec_peer_gid = (__gid32_t) -1; -} - -void -fhandler_socket::af_local_copy (fhandler_socket *sock) -{ - sock->connect_secret[0] = connect_secret[0]; - sock->connect_secret[1] = connect_secret[1]; - sock->connect_secret[2] = connect_secret[2]; - sock->connect_secret[3] = connect_secret[3]; - sock->sec_pid = sec_pid; - sock->sec_uid = sec_uid; - sock->sec_gid = sec_gid; - sock->sec_peer_pid = sec_peer_pid; - sock->sec_peer_uid = sec_peer_uid; - sock->sec_peer_gid = sec_peer_gid; -} - -void -fhandler_socket::af_local_set_secret (char *buf) -{ - if (!entropy_source) - { - void *buf = malloc (sizeof (fhandler_dev_random)); - entropy_source = new (buf) fhandler_dev_random (); - entropy_source->dev () = *urandom_dev; - } - if (entropy_source && - !entropy_source->open (O_RDONLY)) - { - delete entropy_source; - entropy_source = NULL; - } - if (entropy_source) - { - size_t len = sizeof (connect_secret); - entropy_source->read (connect_secret, len); - if (len != sizeof (connect_secret)) - bzero ((char*) connect_secret, sizeof (connect_secret)); - } - __small_sprintf (buf, "%08x-%08x-%08x-%08x", - connect_secret [0], connect_secret [1], - connect_secret [2], connect_secret [3]); -} - -void -fhandler_socket::fixup_before_fork_exec (DWORD win_proc_id) -{ - if (!WSADuplicateSocketA (get_socket (), win_proc_id, prot_info_ptr)) - debug_printf ("WSADuplicateSocket went fine, sock %p, win_proc_id %d, prot_info_ptr %p", - get_socket (), win_proc_id, prot_info_ptr); - else - { - debug_printf ("WSADuplicateSocket error, sock %p, win_proc_id %d, prot_info_ptr %p", - get_socket (), win_proc_id, prot_info_ptr); - set_winsock_errno (); - } -} - -void -fhandler_socket::fixup_after_fork (HANDLE parent) -{ - SOCKET new_sock; - - debug_printf ("WSASocket begin, dwServiceFlags1=%d", - prot_info_ptr->dwServiceFlags1); - - if ((new_sock = WSASocketA (FROM_PROTOCOL_INFO, - FROM_PROTOCOL_INFO, - FROM_PROTOCOL_INFO, - prot_info_ptr, 0, 0)) == INVALID_SOCKET) - { - debug_printf ("WSASocket error"); - set_io_handle ((HANDLE)INVALID_SOCKET); - set_winsock_errno (); - } - else - { - debug_printf ("WSASocket went fine new_sock %p, old_sock %p", new_sock, get_socket ()); - - /* Go figure! Even though the original socket was not inheritable, - the duplicated socket is inheritable again. This can lead to all - sorts of trouble, apparently. Note that there's no way to prevent - this on 9x, not even by trying to reset socket inheritance using - DuplicateHandle and closing the original socket. */ - if (wincap.has_set_handle_information ()) - SetHandleInformation ((HANDLE) new_sock, HANDLE_FLAG_INHERIT, 0); - - set_io_handle ((HANDLE) new_sock); - } -} - -void -fhandler_socket::fixup_after_exec () -{ - if (!close_on_exec ()) - fixup_after_fork (NULL); -} - -int -fhandler_socket::dup (fhandler_base *child) -{ - HANDLE nh; - - debug_printf ("here"); - fhandler_socket *fhs = (fhandler_socket *) child; - fhs->addr_family = addr_family; - fhs->set_socket_type (get_socket_type ()); - if (get_addr_family () == AF_LOCAL) - { - fhs->set_sun_path (get_sun_path ()); - if (get_socket_type () == SOCK_STREAM) - { - fhs->sec_pid = sec_pid; - fhs->sec_uid = sec_uid; - fhs->sec_gid = sec_gid; - fhs->sec_peer_pid = sec_peer_pid; - fhs->sec_peer_uid = sec_peer_uid; - fhs->sec_peer_gid = sec_peer_gid; - } - } - fhs->connect_state (connect_state ()); - - /* Since WSADuplicateSocket() fails on NT systems when the process - is currently impersonating a non-privileged account, we revert - to the original account before calling WSADuplicateSocket() and - switch back afterwards as it's also in fork(). - If WSADuplicateSocket() still fails for some reason, we fall back - to DuplicateHandle(). */ - WSASetLastError (0); - cygheap->user.deimpersonate (); - fhs->set_io_handle (get_io_handle ()); - fhs->fixup_before_fork_exec (GetCurrentProcessId ()); - cygheap->user.reimpersonate (); - if (!WSAGetLastError ()) - { - fhs->fixup_after_fork (hMainProc); - if (fhs->get_io_handle() != (HANDLE) INVALID_SOCKET) - { - cygheap->fdtab.inc_need_fixup_before (); - return 0; - } - } - debug_printf ("WSADuplicateSocket failed, trying DuplicateHandle"); - - /* We don't call fhandler_base::dup here since that requires - having winsock called from fhandler_base and it creates only - inheritable sockets which is wrong for winsock2. */ - - if (!DuplicateHandle (hMainProc, get_io_handle (), hMainProc, &nh, 0, - FALSE, DUPLICATE_SAME_ACCESS)) - { - system_printf ("!DuplicateHandle(%x) failed, %E", get_io_handle ()); - __seterrno (); - return -1; - } - VerifyHandle (nh); - fhs->set_io_handle (nh); - cygheap->fdtab.inc_need_fixup_before (); - return 0; -} - -int __stdcall -fhandler_socket::fstat (struct __stat64 *buf) -{ - int res; - if (get_device () == FH_UNIX) - { - res = fhandler_base::fstat_fs (buf); - if (!res) - { - buf->st_mode = (buf->st_mode & ~S_IFMT) | S_IFSOCK; - } - } - else - { - res = fhandler_base::fstat (buf); - if (!res) - { - buf->st_dev = 0; - buf->st_ino = (__ino64_t) ((DWORD) get_handle ()); - buf->st_mode = S_IFSOCK | S_IRWXU | S_IRWXG | S_IRWXO; - } - } - return res; -} - -int -fhandler_socket::fchmod (mode_t mode) -{ - if (get_device () == FH_UNIX) - { - fhandler_disk_file fh (pc); - fh.get_device () = FH_FS; - int ret = fh.fchmod (mode); - SetFileAttributes (pc, GetFileAttributes (pc) | FILE_ATTRIBUTE_SYSTEM); - return ret; - } - return 0; -} - -int -fhandler_socket::fchown (__uid32_t uid, __gid32_t gid) -{ - if (get_device () == FH_UNIX) - { - fhandler_disk_file fh (pc); - return fh.fchown (uid, gid); - } - return 0; -} - -int -fhandler_socket::facl (int cmd, int nentries, __aclent32_t *aclbufp) -{ - if (get_device () == FH_UNIX) - { - fhandler_disk_file fh (pc); - return fh.facl (cmd, nentries, aclbufp); - } - return fhandler_base::facl (cmd, nentries, aclbufp); -} - -int -fhandler_socket::link (const char *newpath) -{ - if (get_device () == FH_UNIX) - { - fhandler_disk_file fh (pc); - return fh.link (newpath); - } - return fhandler_base::link (newpath); -} - -static inline bool -address_in_use (struct sockaddr_in *addr) -{ - PMIB_TCPTABLE tab; - PMIB_TCPROW entry; - DWORD size = 0, i; - - if (GetTcpTable (NULL, &size, FALSE) == ERROR_INSUFFICIENT_BUFFER) - { - tab = (PMIB_TCPTABLE) alloca (size); - if (!GetTcpTable (tab, &size, FALSE)) - { - for (i = tab->dwNumEntries, entry = tab->table; i > 0; --i, ++entry) - if (entry->dwLocalAddr == addr->sin_addr.s_addr - && entry->dwLocalPort == addr->sin_port - && entry->dwState >= MIB_TCP_STATE_LISTEN - && entry->dwState <= MIB_TCP_STATE_LAST_ACK) - return true; - } - } - return false; -} - -int -fhandler_socket::bind (const struct sockaddr *name, int namelen) -{ - int res = -1; - - if (name->sa_family == AF_LOCAL) - { -#define un_addr ((struct sockaddr_un *) name) - struct sockaddr_in sin; - int len = sizeof sin; - - if (strlen (un_addr->sun_path) >= UNIX_PATH_LEN) - { - set_errno (ENAMETOOLONG); - goto out; - } - sin.sin_family = AF_INET; - sin.sin_port = 0; - sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK); - if (::bind (get_socket (), (sockaddr *) &sin, len)) - { - syscall_printf ("AF_LOCAL: bind failed %d", get_errno ()); - set_winsock_errno (); - goto out; - } - if (::getsockname (get_socket (), (sockaddr *) &sin, &len)) - { - syscall_printf ("AF_LOCAL: getsockname failed %d", get_errno ()); - set_winsock_errno (); - goto out; - } - - sin.sin_port = ntohs (sin.sin_port); - debug_printf ("AF_LOCAL: socket bound to port %u", sin.sin_port); - - path_conv pc (un_addr->sun_path, PC_SYM_FOLLOW); - if (pc.error) - { - set_errno (pc.error); - goto out; - } - if (pc.exists ()) - { - set_errno (EADDRINUSE); - goto out; - } - mode_t mode = (S_IRWXU | S_IRWXG | S_IRWXO) & ~cygheap->umask; - DWORD attr = FILE_ATTRIBUTE_SYSTEM; - if (!(mode & (S_IWUSR | S_IWGRP | S_IWOTH))) - attr |= FILE_ATTRIBUTE_READONLY; - SECURITY_ATTRIBUTES sa = sec_none; - security_descriptor sd; - if (allow_ntsec && pc.has_acls ()) - set_security_attribute (mode, &sa, sd); - HANDLE fh = CreateFile (pc, GENERIC_WRITE, 0, &sa, CREATE_NEW, attr, 0); - if (fh == INVALID_HANDLE_VALUE) - { - if (GetLastError () == ERROR_ALREADY_EXISTS) - set_errno (EADDRINUSE); - else - __seterrno (); - } - - char buf[sizeof (SOCKET_COOKIE) + 80]; - __small_sprintf (buf, "%s%u %c ", SOCKET_COOKIE, sin.sin_port, get_socket_type () == SOCK_STREAM ? 's' : get_socket_type () == SOCK_DGRAM ? 'd' : '-'); - af_local_set_secret (strchr (buf, '\0')); - DWORD blen = strlen (buf) + 1; - if (!WriteFile (fh, buf, blen, &blen, 0)) - { - __seterrno (); - CloseHandle (fh); - DeleteFile (pc); - } - else - { - CloseHandle (fh); - set_sun_path (un_addr->sun_path); - res = 0; - } -#undef un_addr - } - else - { - /* If the application didn't explicitely call setsockopt (SO_REUSEADDR), - enforce exclusive local address use using the SO_EXCLUSIVEADDRUSE - socket option, to emulate POSIX socket behaviour more closely. - - KB 870562: Note that this option is only available since NT4 SP4. - Also note that a bug in Win2K SP1-3 and XP up to SP1 only enables - this option for users in the local administrators group. */ - if (wincap.has_exclusiveaddruse ()) - { - if (!saw_reuseaddr ()) - { - int on = 1; - int ret = ::setsockopt (get_socket (), SOL_SOCKET, - ~(SO_REUSEADDR), - (const char *) &on, sizeof on); - debug_printf ("%d = setsockopt (SO_EXCLUSIVEADDRUSE), %E", ret); - } - else - { - debug_printf ("SO_REUSEADDR set"); - /* There's a bug in SO_REUSEADDR handling in WinSock. - Per standards, we must not be able to reuse a complete - duplicate of a local TCP address (same IP, same port), - even if SO_REUSEADDR has been set. That's unfortunately - possible in WinSock. So we're testing here if the local - address is already in use and don't bind, if so. This - only works for OSes with IP Helper support. */ - if (get_socket_type () == SOCK_STREAM - && wincap.has_ip_helper_lib () - && address_in_use ((struct sockaddr_in *) name)) - { - debug_printf ("Local address in use, don't bind"); - set_errno (EADDRINUSE); - goto out; - } - } - } - if (::bind (get_socket (), name, namelen)) - set_winsock_errno (); - else - res = 0; - } - -out: - return res; -} - -int -fhandler_socket::connect (const struct sockaddr *name, int namelen) -{ - int res = -1; - bool in_progress = false; - struct sockaddr_in sin; - DWORD err; - int type; - - if (!get_inet_addr (name, namelen, &sin, &namelen, &type, connect_secret)) - return -1; - - if (get_addr_family () == AF_LOCAL && get_socket_type () != type) - { - WSASetLastError (WSAEPROTOTYPE); - set_winsock_errno (); - return -1; - } - - if (is_nonblocking ()) - res = ::connect (get_socket (), (struct sockaddr *) &sin, namelen); - else - { - HANDLE evt; - if (prepare (evt, FD_CONNECT)) - { - res = ::connect (get_socket (), (struct sockaddr *) &sin, namelen); - if (res == SOCKET_ERROR - && WSAGetLastError () == WSAEWOULDBLOCK) - res = wait (evt, 0, INFINITE); - release (evt); - } - } - - if (!res) - err = 0; - else - { - err = WSAGetLastError (); - /* Special handling for connect to return the correct error code - when called on a non-blocking socket. */ - if (is_nonblocking ()) - { - if (err == WSAEWOULDBLOCK || err == WSAEALREADY) - in_progress = true; - - if (err == WSAEWOULDBLOCK) - WSASetLastError (err = WSAEINPROGRESS); - } - if (err == WSAEINVAL) - WSASetLastError (err = WSAEISCONN); - set_winsock_errno (); - } - - if (get_addr_family () == AF_LOCAL && (!res || in_progress)) - set_sun_path (name->sa_data); - - if (get_addr_family () == AF_LOCAL && get_socket_type () == SOCK_STREAM) - { - af_local_set_cred (); /* Don't move into af_local_connect since - af_local_connect is called from select, - possibly running under another identity. */ - if (!res && af_local_connect ()) - { - set_winsock_errno (); - return -1; - } - } - - if (err == WSAEINPROGRESS || err == WSAEALREADY) - connect_state (connect_pending); - else if (err) - connect_state (connect_failed); - else - connect_state (connected); - - return res; -} - -int -fhandler_socket::listen (int backlog) -{ - int res = ::listen (get_socket (), backlog); - if (res) - set_winsock_errno (); - else - { - if (get_addr_family () == AF_LOCAL && get_socket_type () == SOCK_STREAM) - af_local_set_cred (); - connect_state (connected); - } - return res; -} - -int -fhandler_socket::accept (struct sockaddr *peer, int *len) -{ - int res = -1; - - /* Allows NULL peer and len parameters. */ - struct sockaddr_in peer_dummy; - int len_dummy; - if (!peer) - peer = (struct sockaddr *) &peer_dummy; - if (!len) - { - len_dummy = sizeof (struct sockaddr_in); - len = &len_dummy; - } - - /* accept on NT fails if len < sizeof (sockaddr_in) - * some programs set len to - * sizeof (name.sun_family) + strlen (name.sun_path) for UNIX domain - */ - if (len && ((unsigned) *len < sizeof (struct sockaddr_in))) - *len = sizeof (struct sockaddr_in); - - if (is_nonblocking ()) - res = ::accept (get_socket (), peer, len); - else - { - HANDLE evt; - if (prepare (evt, FD_ACCEPT)) - { - res = wait (evt, 0, INFINITE); - if (res != -1 - || (WSAGetLastError () != WSAEINTR - && WSAGetLastError () != WSAEFAULT)) - res = ::accept (get_socket (), peer, len); - release (evt); - } - } - - if (res == (int) INVALID_SOCKET) - set_winsock_errno (); - else - { - cygheap_fdnew res_fd; - if (res_fd >= 0 && fdsock (res_fd, &dev (), res)) - { - fhandler_socket *sock = (fhandler_socket *) res_fd; - sock->set_addr_family (get_addr_family ()); - sock->set_socket_type (get_socket_type ()); - sock->async_io (async_io ()); - sock->set_nonblocking (is_nonblocking ()); - if (get_addr_family () == AF_LOCAL) - { - sock->set_sun_path (get_sun_path ()); - if (get_socket_type () == SOCK_STREAM) - { - /* Don't forget to copy credentials from accepting - socket to accepted socket and start transaction - on accepted socket! */ - af_local_copy (sock); - res = sock->af_local_accept (); - if (res == -1) - { - res_fd.release (); - set_winsock_errno (); - goto out; - } - } - } - sock->connect_state (connected); - res = res_fd; - } - else - { - closesocket (res); - res = -1; - } - } - -out: - debug_printf ("res %d", res); - return res; -} - -int -fhandler_socket::getsockname (struct sockaddr *name, int *namelen) -{ - int res = -1; - - if (get_addr_family () == AF_LOCAL) - { - struct sockaddr_un *sun = (struct sockaddr_un *) name; - memset (sun, 0, *namelen); - sun->sun_family = AF_LOCAL; - - if (!get_sun_path ()) - sun->sun_path[0] = '\0'; - else - /* According to SUSv2 "If the actual length of the address is - greater than the length of the supplied sockaddr structure, the - stored address will be truncated." We play it save here so - that the path always has a trailing 0 even if it's truncated. */ - strncpy (sun->sun_path, get_sun_path (), - *namelen - sizeof *sun + sizeof sun->sun_path - 1); - - *namelen = sizeof *sun - sizeof sun->sun_path - + strlen (sun->sun_path) + 1; - res = 0; - } - else - { - res = ::getsockname (get_socket (), name, namelen); - if (res) - set_winsock_errno (); - } - - return res; -} - -int -fhandler_socket::getpeername (struct sockaddr *name, int *namelen) -{ - int res = ::getpeername (get_socket (), name, namelen); - if (res) - set_winsock_errno (); - - return res; -} - -bool -fhandler_socket::prepare (HANDLE &event, long event_mask) -{ - WSASetLastError (0); - closed (false); - if ((event = WSACreateEvent ()) == WSA_INVALID_EVENT) - { - debug_printf ("WSACreateEvent, %E"); - return false; - } - if (WSAEventSelect (get_socket (), event, event_mask) == SOCKET_ERROR) - { - debug_printf ("WSAEventSelect(evt), %d", WSAGetLastError ()); - return false; - } - return true; -} - -int -fhandler_socket::wait (HANDLE event, int flags, DWORD timeout) -{ - int ret = SOCKET_ERROR; - int wsa_err = 0; - WSAEVENT ev[2] = { event, signal_arrived }; - WSANETWORKEVENTS evts; - -/* If WSAWaitForMultipleEvents is interrupted by a signal, and the signal - has the SA_RESTART flag set, return to this label and... restart. */ -sa_restart: - - switch (WSAWaitForMultipleEvents (2, ev, FALSE, timeout, FALSE)) - { - case WSA_WAIT_TIMEOUT: - ret = 0; - break; - case WSA_WAIT_EVENT_0: - if (!WSAEnumNetworkEvents (get_socket (), event, &evts)) - { - if (!evts.lNetworkEvents) - { - ret = 0; - break; - } - if (evts.lNetworkEvents & FD_OOB) - { - if (evts.iErrorCode[FD_OOB_BIT]) - wsa_err = evts.iErrorCode[FD_OOB_BIT]; - else if (flags & MSG_OOB) - ret = 0; - else - { - raise (SIGURG); - WSASetLastError (WSAEINTR); - break; - } - } - if (evts.lNetworkEvents & FD_ACCEPT) - { - if (evts.iErrorCode[FD_ACCEPT_BIT]) - wsa_err = evts.iErrorCode[FD_ACCEPT_BIT]; - else - ret = 0; - } - if (evts.lNetworkEvents & FD_CONNECT) - { - if (evts.iErrorCode[FD_CONNECT_BIT]) - wsa_err = evts.iErrorCode[FD_CONNECT_BIT]; - else - ret = 0; - } - else if (evts.lNetworkEvents & FD_READ) - { - if (evts.iErrorCode[FD_READ_BIT]) - wsa_err = evts.iErrorCode[FD_READ_BIT]; - else - ret = 0; - } - else if (evts.lNetworkEvents & FD_WRITE) - { - if (evts.iErrorCode[FD_WRITE_BIT]) - wsa_err = evts.iErrorCode[FD_WRITE_BIT]; - else - ret = 0; - } - if (evts.lNetworkEvents & FD_CLOSE) - { - closed (true); - if (!wsa_err) - { - if (evts.iErrorCode[FD_CLOSE_BIT]) - wsa_err = evts.iErrorCode[FD_CLOSE_BIT]; - else - ret = 0; - } - } - if (wsa_err) - WSASetLastError (wsa_err); - } - break; - case WSA_WAIT_EVENT_0 + 1: - WSASetLastError (WSAEINTR); - if (_my_tls.call_signal_handler ()) - { - sig_dispatch_pending (); - goto sa_restart; - } - break; - default: - WSASetLastError (WSAEFAULT); - break; - } - return ret; -} - -void -fhandler_socket::release (HANDLE event) -{ - int last_err = WSAGetLastError (); - /* KB 168349: NT4 fails if the event parameter is not NULL. */ - if (WSAEventSelect (get_socket (), NULL, 0) == SOCKET_ERROR) - debug_printf ("WSAEventSelect(NULL), %d", WSAGetLastError ()); - WSACloseEvent (event); - unsigned long non_block = 0; - if (ioctlsocket (get_socket (), FIONBIO, &non_block)) - debug_printf ("return to blocking failed: %d", WSAGetLastError ()); - else - WSASetLastError (last_err); -} - -int -fhandler_socket::readv (const struct iovec *const iov, const int iovcnt, - ssize_t tot) -{ - struct msghdr msg = - { - msg_name: NULL, - msg_namelen: 0, - msg_iov: (struct iovec *) iov, // const_cast - msg_iovlen: iovcnt, - msg_control: NULL, - msg_controllen: 0, - msg_flags: 0 - }; - - return recvmsg (&msg, 0, tot); -} - -int -fhandler_socket::recvfrom (void *ptr, size_t len, int flags, - struct sockaddr *from, int *fromlen) -{ - int res = SOCKET_ERROR; - DWORD ret = 0; - - WSABUF wsabuf = { len, (char *) ptr }; - - if (is_nonblocking () || closed () || async_io ()) - { - DWORD lflags = (DWORD) (flags & MSG_WINMASK); - res = WSARecvFrom (get_socket (), &wsabuf, 1, &ret, - &lflags, from, fromlen, NULL, NULL); - } - else - { - HANDLE evt; - if (prepare (evt, FD_CLOSE | FD_READ | (owner () ? FD_OOB : 0))) - { - do - { - DWORD lflags = (DWORD) (flags & MSG_WINMASK); - res = WSARecvFrom (get_socket (), &wsabuf, 1, &ret, &lflags, - from, fromlen, NULL, NULL); - } - while (res == SOCKET_ERROR - && WSAGetLastError () == WSAEWOULDBLOCK - && !closed () - && !(res = wait (evt, flags))); - release (evt); - } - } - - if (res == SOCKET_ERROR) - { - /* According to SUSv3, errno isn't set in that case and no error - condition is returned. */ - if (WSAGetLastError () == WSAEMSGSIZE) - return len; - - /* ESHUTDOWN isn't defined for recv in SUSv3. Simply EOF is returned - in this case. */ - if (WSAGetLastError () == WSAESHUTDOWN) - return 0; - - set_winsock_errno (); - } - else - res = ret; - - return res; -} - -int -fhandler_socket::recvmsg (struct msghdr *msg, int flags, ssize_t tot) -{ - if (CYGWIN_VERSION_CHECK_FOR_USING_ANCIENT_MSGHDR) - ((struct OLD_msghdr *) msg)->msg_accrightslen = 0; - else - { - msg->msg_controllen = 0; - msg->msg_flags = 0; - } - if (get_addr_family () == AF_LOCAL) - { - /* On AF_LOCAL sockets the (fixed-size) name of the shared memory - area used for descriptor passing is transmitted first. - If this string is empty, no descriptors are passed and we can - go ahead recv'ing the normal data blocks. Otherwise start - special handling for descriptor passing. */ - /*TODO*/ - } - - struct iovec *const iov = msg->msg_iov; - const int iovcnt = msg->msg_iovlen; - - struct sockaddr *from = (struct sockaddr *) msg->msg_name; - int *fromlen = from ? &msg->msg_namelen : NULL; - - int res = SOCKET_ERROR; - - WSABUF wsabuf[iovcnt]; - unsigned long len = 0L; - - const struct iovec *iovptr = iov + iovcnt; - WSABUF *wsaptr = wsabuf + iovcnt; - do - { - iovptr -= 1; - wsaptr -= 1; - len += wsaptr->len = iovptr->iov_len; - wsaptr->buf = (char *) iovptr->iov_base; - } - while (wsaptr != wsabuf); - - DWORD ret = 0; - - if (is_nonblocking () || closed () || async_io ()) - { - DWORD lflags = (DWORD) (flags & MSG_WINMASK); - res = WSARecvFrom (get_socket (), wsabuf, iovcnt, &ret, - &lflags, from, fromlen, NULL, NULL); - } - else - { - HANDLE evt; - if (prepare (evt, FD_CLOSE | FD_READ | (owner () ? FD_OOB : 0))) - { - do - { - DWORD lflags = (DWORD) (flags & MSG_WINMASK); - res = WSARecvFrom (get_socket (), wsabuf, iovcnt, &ret, - &lflags, from, fromlen, NULL, NULL); - } - while (res == SOCKET_ERROR - && WSAGetLastError () == WSAEWOULDBLOCK - && !closed () - && !(res = wait (evt, flags))); - release (evt); - } - } - - if (res == SOCKET_ERROR) - { - /* According to SUSv3, errno isn't set in that case and no error - condition is returned. */ - if (WSAGetLastError () == WSAEMSGSIZE) - return len; - - /* ESHUTDOWN isn't defined for recv in SUSv3. Simply EOF is returned - in this case. */ - if (WSAGetLastError () == WSAESHUTDOWN) - return 0; - - set_winsock_errno (); - } - else - res = ret; - - return res; -} - -int -fhandler_socket::writev (const struct iovec *const iov, const int iovcnt, - ssize_t tot) -{ - struct msghdr msg = - { - msg_name: NULL, - msg_namelen: 0, - msg_iov: (struct iovec *) iov, // const_cast - msg_iovlen: iovcnt, - msg_control: NULL, - msg_controllen: 0, - msg_flags: 0 - }; - - return sendmsg (&msg, 0, tot); -} - -int -fhandler_socket::sendto (const void *ptr, size_t len, int flags, - const struct sockaddr *to, int tolen) -{ - struct sockaddr_in sin; - - if (to && !get_inet_addr (to, tolen, &sin, &tolen)) - return SOCKET_ERROR; - - int res = SOCKET_ERROR; - DWORD ret = 0; - - WSABUF wsabuf = { len, (char *) ptr }; - - if (is_nonblocking () || closed () || async_io ()) - res = WSASendTo (get_socket (), &wsabuf, 1, &ret, - flags & MSG_WINMASK, - (to ? (const struct sockaddr *) &sin : NULL), tolen, - NULL, NULL); - else - { - HANDLE evt; - if (prepare (evt, FD_CLOSE | FD_WRITE | (owner () ? FD_OOB : 0))) - { - do - { - res = WSASendTo (get_socket (), &wsabuf, 1, &ret, - flags & MSG_WINMASK, - (to ? (const struct sockaddr *) &sin : NULL), - tolen, NULL, NULL); - } - while (res == SOCKET_ERROR - && WSAGetLastError () == WSAEWOULDBLOCK - && !(res = wait (evt, 0)) - && !closed ()); - release (evt); - } - } - - if (res == SOCKET_ERROR) - set_winsock_errno (); - else - res = ret; - - /* Special handling for EPIPE and SIGPIPE. - - EPIPE is generated if the local end has been shut down on a connection - oriented socket. In this case the process will also receive a SIGPIPE - unless MSG_NOSIGNAL is set. */ - if (res == SOCKET_ERROR && get_errno () == ESHUTDOWN - && get_socket_type () == SOCK_STREAM) - { - set_errno (EPIPE); - if (! (flags & MSG_NOSIGNAL)) - raise (SIGPIPE); - } - - return res; -} - -int -fhandler_socket::sendmsg (const struct msghdr *msg, int flags, ssize_t tot) -{ - if (get_addr_family () == AF_LOCAL) - { - /* For AF_LOCAL/AF_UNIX sockets, if descriptors are given, start - the special handling for descriptor passing. Otherwise just - transmit an empty string to tell the receiver that no - descriptor passing is done. */ - /*TODO*/ - } - - struct iovec *const iov = msg->msg_iov; - const int iovcnt = msg->msg_iovlen; - - int res = SOCKET_ERROR; - - WSABUF wsabuf[iovcnt]; - - const struct iovec *iovptr = iov + iovcnt; - WSABUF *wsaptr = wsabuf + iovcnt; - do - { - iovptr -= 1; - wsaptr -= 1; - wsaptr->len = iovptr->iov_len; - wsaptr->buf = (char *) iovptr->iov_base; - } - while (wsaptr != wsabuf); - - DWORD ret = 0; - - if (is_nonblocking () || closed () || async_io ()) - res = WSASendTo (get_socket (), wsabuf, iovcnt, &ret, - flags & MSG_WINMASK, (struct sockaddr *) msg->msg_name, - msg->msg_namelen, NULL, NULL); - else - { - HANDLE evt; - if (prepare (evt, FD_CLOSE | FD_WRITE | (owner () ? FD_OOB : 0))) - { - do - { - res = WSASendTo (get_socket (), wsabuf, iovcnt, - &ret, flags & MSG_WINMASK, - (struct sockaddr *) msg->msg_name, - msg->msg_namelen, NULL, NULL); - } - while (res == SOCKET_ERROR - && WSAGetLastError () == WSAEWOULDBLOCK - && !(res = wait (evt, 0)) - && !closed ()); - release (evt); - } - } - - if (res == SOCKET_ERROR) - set_winsock_errno (); - else - res = ret; - - /* Special handling for EPIPE and SIGPIPE. - - EPIPE is generated if the local end has been shut down on a connection - oriented socket. In this case the process will also receive a SIGPIPE - unless MSG_NOSIGNAL is set. */ - if (res == SOCKET_ERROR && get_errno () == ESHUTDOWN - && get_socket_type () == SOCK_STREAM) - { - set_errno (EPIPE); - if (! (flags & MSG_NOSIGNAL)) - raise (SIGPIPE); - } - - return res; -} - -int -fhandler_socket::shutdown (int how) -{ - int res = ::shutdown (get_socket (), how); - - if (res) - set_winsock_errno (); - else - switch (how) - { - case SHUT_RD: - saw_shutdown_read (true); - break; - case SHUT_WR: - saw_shutdown_write (true); - break; - case SHUT_RDWR: - saw_shutdown_read (true); - saw_shutdown_write (true); - break; - } - return res; -} - -int -fhandler_socket::close () -{ - int res = 0; - - /* HACK to allow a graceful shutdown even if shutdown() hasn't been - called by the application. Note that this isn't the ultimate - solution but it helps in many cases. */ - struct linger linger; - linger.l_onoff = 1; - linger.l_linger = 240; /* secs. default 2MSL value according to MSDN. */ - setsockopt (get_socket (), SOL_SOCKET, SO_LINGER, - (const char *)&linger, sizeof linger); - - while ((res = closesocket (get_socket ())) != 0) - { - if (WSAGetLastError () != WSAEWOULDBLOCK) - { - set_winsock_errno (); - res = -1; - break; - } - if (WaitForSingleObject (signal_arrived, 10) == WAIT_OBJECT_0) - { - set_errno (EINTR); - res = -1; - break; - } - WSASetLastError (0); - } - - debug_printf ("%d = fhandler_socket::close()", res); - return res; -} - -int -fhandler_socket::ioctl (unsigned int cmd, void *p) -{ - extern int get_ifconf (struct ifconf *ifc, int what); /* net.cc */ - int res; - struct ifconf ifc, *ifcp; - struct ifreq *ifr, *ifrp; - - switch (cmd) - { - case SIOCGIFCONF: - ifcp = (struct ifconf *) p; - if (!ifcp) - { - set_errno (EINVAL); - return -1; - } - res = get_ifconf (ifcp, cmd); - if (res) - debug_printf ("error in get_ifconf"); - break; - case SIOCGIFFLAGS: - ifr = (struct ifreq *) p; - if (ifr == 0) - { - set_errno (EINVAL); - return -1; - } - ifr->ifr_flags = IFF_NOTRAILERS | IFF_UP | IFF_RUNNING; - if (!strncmp(ifr->ifr_name, "lo", 2) - || ntohl (((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr) - == INADDR_LOOPBACK) - ifr->ifr_flags |= IFF_LOOPBACK; - else - ifr->ifr_flags |= IFF_BROADCAST; - res = 0; - break; - case SIOCGIFBRDADDR: - case SIOCGIFNETMASK: - case SIOCGIFADDR: - case SIOCGIFHWADDR: - case SIOCGIFMETRIC: - case SIOCGIFMTU: - { - ifc.ifc_len = 2048; - ifc.ifc_buf = (char *) alloca (2048); - - ifr = (struct ifreq *) p; - if (ifr == 0) - { - debug_printf ("ifr == NULL"); - set_errno (EINVAL); - return -1; - } - - res = get_ifconf (&ifc, cmd); - if (res) - { - debug_printf ("error in get_ifconf"); - break; - } - - debug_printf (" name: %s", ifr->ifr_name); - for (ifrp = ifc.ifc_req; - (caddr_t) ifrp < ifc.ifc_buf + ifc.ifc_len; - ++ifrp) - { - debug_printf ("testname: %s", ifrp->ifr_name); - if (! strcmp (ifrp->ifr_name, ifr->ifr_name)) - { - switch (cmd) - { - case SIOCGIFADDR: - ifr->ifr_addr = ifrp->ifr_addr; - break; - case SIOCGIFBRDADDR: - ifr->ifr_broadaddr = ifrp->ifr_broadaddr; - break; - case SIOCGIFNETMASK: - ifr->ifr_netmask = ifrp->ifr_netmask; - break; - case SIOCGIFHWADDR: - ifr->ifr_hwaddr = ifrp->ifr_hwaddr; - break; - case SIOCGIFMETRIC: - ifr->ifr_metric = ifrp->ifr_metric; - break; - case SIOCGIFMTU: - ifr->ifr_mtu = ifrp->ifr_mtu; - break; - } - break; - } - } - if ((caddr_t) ifrp >= ifc.ifc_buf + ifc.ifc_len) - { - set_errno (EINVAL); - return -1; - } - break; - } - case FIOASYNC: - res = WSAAsyncSelect (get_socket (), winmsg, WM_ASYNCIO, - *(int *) p ? ASYNC_MASK : 0); - syscall_printf ("Async I/O on socket %s", - *(int *) p ? "started" : "cancelled"); - async_io (*(int *) p != 0); - break; - case FIONREAD: - res = ioctlsocket (get_socket (), FIONREAD, (unsigned long *) p); - if (res == SOCKET_ERROR) - set_winsock_errno (); - break; - default: - /* We must cancel WSAAsyncSelect (if any) before setting socket to - * blocking mode - */ - if (cmd == FIONBIO && *(int *) p == 0) - { - if (async_io ()) - WSAAsyncSelect (get_socket (), winmsg, 0, 0); - if (WSAEventSelect (get_socket (), NULL, 0) == SOCKET_ERROR) - debug_printf ("WSAEventSelect(NULL), %d", WSAGetLastError ()); - } - res = ioctlsocket (get_socket (), cmd, (unsigned long *) p); - if (res == SOCKET_ERROR) - set_winsock_errno (); - if (cmd == FIONBIO) - { - if (!res) - { - syscall_printf ("socket is now %sblocking", - *(int *) p ? "non" : ""); - set_nonblocking (*(int *) p); - } - /* Start AsyncSelect if async socket unblocked */ - if (*(int *) p && async_io ()) - WSAAsyncSelect (get_socket (), winmsg, WM_ASYNCIO, ASYNC_MASK); - } - break; - } - syscall_printf ("%d = ioctl_socket (%x, %x)", res, cmd, p); - return res; -} - -int -fhandler_socket::fcntl (int cmd, void *arg) -{ - int res = 0; - int request, current; - - switch (cmd) - { - case F_SETOWN: - { - /* Urgh! Bad hack! */ - pid_t pid = (pid_t) arg; - owner (pid == getpid ()); - debug_printf ("owner set to %d", owner ()); - } - break; - case F_SETFL: - { - /* Carefully test for the O_NONBLOCK or deprecated OLD_O_NDELAY flag. - Set only the flag that has been passed in. If both are set, just - record O_NONBLOCK. */ - int new_flags = (int) arg & O_NONBLOCK_MASK; - if ((new_flags & OLD_O_NDELAY) && (new_flags & O_NONBLOCK)) - new_flags = O_NONBLOCK; - current = get_flags () & O_NONBLOCK_MASK; - request = new_flags ? 1 : 0; - if (!!current != !!new_flags && (res = ioctl (FIONBIO, &request))) - break; - set_flags ((get_flags () & ~O_NONBLOCK_MASK) | new_flags); - break; - } - default: - res = fhandler_base::fcntl (cmd, arg); - break; - } - return res; -} - -void -fhandler_socket::set_close_on_exec (bool val) -{ - close_on_exec (val); - debug_printf ("set close_on_exec for %s to %d", get_name (), val); -} - -void -fhandler_socket::set_sun_path (const char *path) -{ - sun_path = path ? cstrdup (path) : NULL; -} - -int -fhandler_socket::getpeereid (pid_t *pid, __uid32_t *euid, __gid32_t *egid) -{ - if (get_addr_family () != AF_LOCAL || get_socket_type () != SOCK_STREAM) - { - set_errno (EINVAL); - return -1; - } - if (connect_state () != connected) - { - set_errno (ENOTCONN); - return -1; - } - if (sec_peer_pid == (pid_t) 0) - { - set_errno (ENOTCONN); /* Usually when calling getpeereid on - accepting (instead of accepted) socket. */ - return -1; - } - - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (pid) - *pid = sec_peer_pid; - if (euid) - *euid = sec_peer_uid; - if (egid) - *egid = sec_peer_gid; - return 0; -} diff --git a/winsup/cygwin/fhandler_tape.cc b/winsup/cygwin/fhandler_tape.cc deleted file mode 100644 index 055519be0..000000000 --- a/winsup/cygwin/fhandler_tape.cc +++ /dev/null @@ -1,1520 +0,0 @@ -/* fhandler_tape.cc. See fhandler.h for a description of the fhandler - classes. - - Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include "cygtls.h" -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "perprocess.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "shared_info.h" -#include "sigproc.h" -#include "mtinfo.h" - -/* Media changes and bus resets are sometimes reported and the function - hasn't been executed. We repeat all functions which return with one - of these error codes. */ -#define TAPE_FUNC(func) while ((lasterr = (func)) == ERROR_MEDIA_CHANGED) \ - { \ - initialize (drive, false); \ - part (partition)->initialize (0); \ - } - -#define IS_BOT(err) ((err) == ERROR_BEGINNING_OF_MEDIA) - -#define IS_EOF(err) ((err) == ERROR_FILEMARK_DETECTED \ - || (err) == ERROR_SETMARK_DETECTED) - -#define IS_SM(err) ((err) == ERROR_SETMARK_DETECTED) - -#define IS_EOD(err) ((err) == ERROR_END_OF_MEDIA \ - || (err) == ERROR_EOM_OVERFLOW \ - || (err) == ERROR_NO_DATA_DETECTED) - -#define IS_EOM(err) ((err) == ERROR_END_OF_MEDIA \ - || (err) == ERROR_EOM_OVERFLOW) - -/**********************************************************************/ -/* mtinfo_part */ - -void -mtinfo_part::initialize (long nblock) -{ - block = nblock; - if (block == 0) - file = fblock = 0; - else - file = fblock = -1; - smark = false; - emark = no_eof; -} - -/**********************************************************************/ -/* mtinfo_drive */ - -void -mtinfo_drive::initialize (int num, bool first_time) -{ - drive = num; - partition = 0; - block = -1; - lock = unlocked; - if (first_time) - { - buffer_writes (true); - async_writes (false); - two_fm (false); - fast_eom (false); - auto_lock (false); - sysv (false); - nowait (false); - } - for (int i = 0; i < MAX_PARTITION_NUM; ++i) - part (i)->initialize (); -} - -int -mtinfo_drive::get_dp (HANDLE mt) -{ - DWORD len = sizeof _dp; - TAPE_FUNC (GetTapeParameters (mt, GET_TAPE_DRIVE_INFORMATION, &len, &_dp)); - return error ("get_dp"); -} - -int -mtinfo_drive::get_mp (HANDLE mt) -{ - DWORD len = sizeof _mp; - TAPE_FUNC (GetTapeParameters (mt, GET_TAPE_MEDIA_INFORMATION, &len, &_mp)); - return error ("get_mp"); -} - -int -mtinfo_drive::open (HANDLE mt) -{ - get_dp (mt); - get_mp (mt); - get_pos (mt); - if (partition < MAX_PARTITION_NUM && part (partition)->block != block) - part (partition)->initialize (block); - /* The following rewind in position 0 solves a problem which appears - * in case of multi volume archives (at least on NT4): The last ReadFile - * on the previous medium returns ERROR_NO_DATA_DETECTED. After media - * change, all subsequent ReadFile calls return ERROR_NO_DATA_DETECTED, - * too. The call to set_pos apparently reset some internal flags. - * FIXME: Is that really true or based on a misinterpretation? */ - if (!block) - { - debug_printf ("rewind in position 0"); - set_pos (mt, TAPE_REWIND, 0, false); - } - return error ("open"); -} - -int -mtinfo_drive::close (HANDLE mt, bool rewind) -{ - lasterr = 0; - if (GetTapeStatus (mt) == ERROR_NO_MEDIA_IN_DRIVE) - dirty = clean; - if (dirty >= has_written) - { - /* If an async write is still pending, wait for completion. */ - if (dirty == async_write_pending) - lasterr = async_wait (mt, NULL); - if (!lasterr) - { - /* if last operation was writing, write a filemark */ - debug_printf ("writing filemark"); - write_marks (mt, TAPE_FILEMARKS, two_fm () ? 2 : 1); - if (two_fm () && !lasterr && !rewind) /* Backspace over 2nd fmark. */ - { - set_pos (mt, TAPE_SPACE_FILEMARKS, -1, false); - if (!lasterr) - part (partition)->fblock = 0; /* That's obvious, isn't it? */ - } - } - } - else if (dirty == has_read && !rewind) - { - if (sysv ()) - { - /* Under SYSV semantics, the tape is moved past the next file mark - after read. */ - if (part (partition)->emark == no_eof) - set_pos (mt, TAPE_SPACE_FILEMARKS, 1, false); - else if (part (partition)->emark == eof_hit) - part (partition)->emark = eof; - } - else - { - /* Under BSD semantics, we must check if the filemark has been - inadvertendly crossed. If so cross the filemark backwards - and position the tape right before EOF. */ - if (part (partition)->emark == eof_hit) - set_pos (mt, TAPE_SPACE_FILEMARKS, -1, false); - } - } - if (rewind) - { - debug_printf ("rewinding"); - set_pos (mt, TAPE_REWIND, 0, false); - } - if (auto_lock () && lock == auto_locked) - prepare (mt, TAPE_UNLOCK); - dirty = clean; - return error ("close"); -} - -int -mtinfo_drive::read (HANDLE mt, HANDLE mt_evt, void *ptr, size_t &ulen) -{ - BOOL ret; - DWORD bytes_read = 0; - - if (GetTapeStatus (mt) == ERROR_NO_MEDIA_IN_DRIVE) - return lasterr = ERROR_NO_MEDIA_IN_DRIVE; - if (lasterr == ERROR_BUS_RESET) - { - ulen = 0; - goto out; - } - /* If an async write is still pending, wait for completion. */ - if (dirty == async_write_pending) - lasterr = async_wait (mt, NULL); - dirty = clean; - if (part (partition)->emark == eof_hit) - { - part (partition)->emark = eof; - lasterr = ulen = 0; - goto out; - } - else if (part (partition)->emark == eod_hit) - { - part (partition)->emark = eod; - lasterr = ulen = 0; - goto out; - } - else if (part (partition)->emark == eod) - { - lasterr = ERROR_NO_DATA_DETECTED; - ulen = (size_t) -1; - goto out; - } - else if (part (partition)->emark == eom_hit) - { - part (partition)->emark = eom; - lasterr = ulen = 0; - goto out; - } - else if (part (partition)->emark == eom) - { - lasterr = ERROR_END_OF_MEDIA; - ulen = (size_t) -1; - goto out; - } - part (partition)->smark = false; - if (auto_lock () && lock < auto_locked) - prepare (mt, TAPE_LOCK, true); - ov.Offset = ov.OffsetHigh = 0; - ov.hEvent = mt_evt; - ret = ReadFile (mt, ptr, ulen, &bytes_read, &ov); - lasterr = ret ? 0 : GetLastError (); - if (lasterr == ERROR_IO_PENDING) - lasterr = async_wait (mt, &bytes_read); - ulen = (size_t) bytes_read; - if (bytes_read > 0) - { - long blocks_read = mp ()->BlockSize == 0 - ? 1 : howmany (bytes_read, mp ()->BlockSize); - block += blocks_read; - part (partition)->block += blocks_read; - if (part (partition)->fblock >= 0) - part (partition)->fblock += blocks_read; - } - if (IS_EOF (lasterr)) - { - block++; - part (partition)->block++; - if (part (partition)->file >= 0) - part (partition)->file++; - part (partition)->fblock = 0; - part (partition)->smark = IS_SM (lasterr); - part (partition)->emark = bytes_read > 0 ? eof_hit : eof; - lasterr = 0; - } - else if (IS_EOD (lasterr)) - { - if (part (partition)->emark == eof) - part (partition)->emark = IS_EOM (lasterr) ? eom : eod; - else - { - part (partition)->emark = IS_EOM (lasterr) ? eom_hit : eod_hit; - lasterr = 0; - } - } - else - { - part (partition)->emark = no_eof; - /* This happens if the buffer is too small when in variable block - size mode. Linux returns ENOMEM here. We're doing the same. */ - if (lasterr == ERROR_MORE_DATA) - lasterr = ERROR_NOT_ENOUGH_MEMORY; - } - if (!lasterr) - dirty = has_read; -out: - return error ("read"); -} - -int -mtinfo_drive::async_wait (HANDLE mt, DWORD *bytes_written) -{ - DWORD written; - - bool ret = GetOverlappedResult (mt, &ov, &written, TRUE); - if (bytes_written) - *bytes_written = written; - return ret ? 0 : GetLastError (); -} - -int -mtinfo_drive::write (HANDLE mt, HANDLE mt_evt, const void *ptr, size_t &len) -{ - BOOL ret; - DWORD bytes_written = 0; - int async_err = 0; - - if (GetTapeStatus (mt) == ERROR_NO_MEDIA_IN_DRIVE) - return lasterr = ERROR_NO_MEDIA_IN_DRIVE; - if (lasterr == ERROR_BUS_RESET) - { - len = 0; - return error ("write"); - } - if (dirty == async_write_pending) - async_err = async_wait (mt, &bytes_written); - dirty = clean; - part (partition)->smark = false; - if (auto_lock () && lock < auto_locked) - prepare (mt, TAPE_LOCK, true); - ov.Offset = ov.OffsetHigh = 0; - ov.hEvent = mt_evt; - ret = WriteFile (mt, ptr, len, &bytes_written, &ov); - lasterr = ret ? 0: GetLastError (); - if (lasterr == ERROR_IO_PENDING) - { - if (async_writes () && mp ()->BlockSize == 0) - dirty = async_write_pending; - else - /* Wait for completion if a non-async write. */ - lasterr = async_wait (mt, &bytes_written); - } - len = (size_t) bytes_written; - if (bytes_written > 0) - { - long blocks_written = mp ()->BlockSize == 0 - ? 1 : howmany (bytes_written, mp ()->BlockSize); - block += blocks_written; - part (partition)->block += blocks_written; - if (part (partition)->fblock >= 0) - part (partition)->fblock += blocks_written; - } - if (!lasterr && async_err) - lasterr = async_err; - if (lasterr == ERROR_EOM_OVERFLOW) - part (partition)->emark = eom; - else if (lasterr == ERROR_END_OF_MEDIA) - ; // FIXME?: part (partition)->emark = eom_hit; - else - { - part (partition)->emark = no_eof; - if (!lasterr) - dirty = has_written; - else if (lasterr == ERROR_IO_PENDING) - dirty = async_write_pending; - } - return error ("write"); -} - -int -mtinfo_drive::get_pos (HANDLE mt, long *ppartition, long *pblock) -{ - DWORD p, low, high; - - TAPE_FUNC (GetTapePosition (mt, TAPE_LOGICAL_POSITION, &p, &low, &high)); - if (lasterr == ERROR_INVALID_FUNCTION) - TAPE_FUNC (GetTapePosition (mt, TAPE_ABSOLUTE_POSITION, &p, &low, &high)); - if (!lasterr) - { - if (p > 0) - partition = (long) p - 1; - block = (long) low; - if (ppartition) - *ppartition= partition; - if (pblock) - *pblock = block; - } - else - { - partition = 0; - block = -1; - } - return error ("get_pos"); -} - -int -mtinfo_drive::_set_pos (HANDLE mt, int mode, long count, int partition, - BOOL dont_wait) -{ - /* If an async write is still pending, wait for completion. */ - if (dirty == async_write_pending) - lasterr = async_wait (mt, NULL); - dirty = clean; - TAPE_FUNC (SetTapePosition (mt, mode, partition, count, count < 0 ? -1 : 0, - dont_wait)); - return lasterr; -} - -int -mtinfo_drive::set_pos (HANDLE mt, int mode, long count, - bool sfm_func) -{ - int err = 0; - long undone = count; - BOOL dont_wait = FALSE; - - switch (mode) - { - case TAPE_SPACE_RELATIVE_BLOCKS: - case TAPE_SPACE_FILEMARKS: - case TAPE_SPACE_SETMARKS: - if (!count) - { - lasterr = 0; - goto out; - } - break; - case TAPE_ABSOLUTE_BLOCK: - case TAPE_LOGICAL_BLOCK: - case TAPE_REWIND: - dont_wait = nowait () ? TRUE : FALSE; - break; - } - if (mode == TAPE_SPACE_FILEMARKS) - { - while (!err && undone > 0) - if (!(err = _set_pos (mt, mode, 1, 0, FALSE)) || IS_SM (err)) - --undone; - while (!err && undone < 0) - if (!(err = _set_pos (mt, mode, -1, 0, FALSE)) || IS_SM (err)) - ++undone; - } - else - err = _set_pos (mt, mode, count, 0, dont_wait); - switch (mode) - { - case TAPE_ABSOLUTE_BLOCK: - case TAPE_LOGICAL_BLOCK: - get_pos (mt); - part (partition)->initialize (block); - break; - case TAPE_REWIND: - if (!err) - { - block = 0; - part (partition)->initialize (0); - } - else - { - get_pos (mt); - part (partition)->initialize (block); - } - break; - case TAPE_SPACE_END_OF_DATA: - get_pos (mt); - part (partition)->initialize (block); - part (partition)->emark = IS_EOM (err) ? eom : eod; - break; - case TAPE_SPACE_FILEMARKS: - if (!err || IS_SM (err)) - { - get_pos (mt); - part (partition)->block = block; - if (count > 0) - { - if (part (partition)->file >= 0) - part (partition)->file += count - undone; - part (partition)->fblock = 0; - part (partition)->smark = IS_SM (err); - } - else - { - if (part (partition)->file >= 0) - part (partition)->file += count - undone; - part (partition)->fblock = -1; - part (partition)->smark = false; - } - if (sfm_func) - err = set_pos (mt, mode, count > 0 ? -1 : 1, false); - else - part (partition)->emark = count > 0 ? eof : no_eof; - } - else if (IS_EOD (err)) - { - get_pos (mt); - part (partition)->block = block; - if (part (partition)->file >= 0) - part (partition)->file += count - undone; - part (partition)->fblock = -1; - part (partition)->smark = false; - part (partition)->emark = IS_EOM (err) ? eom : eod; - } - else if (IS_BOT (err)) - { - block = 0; - part (partition)->initialize (0); - } - else - { - get_pos (mt); - part (partition)->initialize (block); - } - break; - case TAPE_SPACE_RELATIVE_BLOCKS: - if (!err) - { - block += count; - part (partition)->block += count; - if (part (partition)->fblock >= 0) - part (partition)->fblock += count; - part (partition)->smark = false; - part (partition)->emark = no_eof; - } - else if (IS_EOF (err)) - { - get_pos (mt); - part (partition)->block = block; - if (part (partition)->file >= 0) - part (partition)->file += count > 0 ? 1 : -1; - part (partition)->fblock = count > 0 ? 0 : -1; - part (partition)->smark = (count > 0 && IS_SM (err)); - part (partition)->emark = count > 0 ? eof : no_eof; - } - else if (IS_EOD (err)) - { - get_pos (mt); - part (partition)->fblock = block - part (partition)->block; - part (partition)->block = block; - part (partition)->smark = false; - part (partition)->emark = IS_EOM (err) ? eom : eod; - } - else if (IS_BOT (err)) - { - block = 0; - part (partition)->initialize (0); - } - break; - case TAPE_SPACE_SETMARKS: - get_pos (mt); - part (partition)->block = block; - if (!err) - { - part (partition)->file = -1; - part (partition)->fblock = -1; - part (partition)->smark = true; - } - break; - } - lasterr = err; -out: - return error ("set_pos"); -} - -int -mtinfo_drive::create_partitions (HANDLE mt, long count) -{ - if (dp ()->MaximumPartitionCount <= 1) - return ERROR_INVALID_PARAMETER; - if (set_pos (mt, TAPE_REWIND, 0, false)) - goto out; - partition = 0; - part (partition)->initialize (0); - debug_printf ("Format tape with %s partition(s)", count <= 0 ? "one" : "two"); - if (get_feature (TAPE_DRIVE_INITIATOR)) - { - if (count <= 0) - TAPE_FUNC (CreateTapePartition (mt, TAPE_INITIATOR_PARTITIONS, - count <= 0 ? 0 : 2, (DWORD) count)); - } - else if (get_feature (TAPE_DRIVE_FIXED)) - { - /* This is supposed to work for Tandberg SLR drivers up to version - 1.6 which missed to set the TAPE_DRIVE_INITIATOR flag. According - to Tandberg, CreateTapePartition(TAPE_FIXED_PARTITIONS) apparently - does not ignore the dwCount parameter. Go figure! */ - TAPE_FUNC (CreateTapePartition (mt, TAPE_FIXED_PARTITIONS, - count <= 0 ? 0 : 2, (DWORD) count)); - } - else - lasterr = ERROR_INVALID_PARAMETER; -out: - return error ("partition"); -} - -int -mtinfo_drive::set_partition (HANDLE mt, long count) -{ - if (count < 0 || (unsigned long) count >= MAX_PARTITION_NUM) - lasterr = ERROR_INVALID_PARAMETER; - else if ((DWORD) count >= dp ()->MaximumPartitionCount) - lasterr = ERROR_IO_DEVICE; - else - { - int part_block = part (count)->block >= 0 ? part (count)->block : 0; - int err = _set_pos (mt, TAPE_LOGICAL_BLOCK, part_block, count + 1, FALSE); - if (err) - { - int sav_block = block; - int sav_partition = partition; - get_pos (mt); - if (sav_partition != partition) - { - if (partition < MAX_PARTITION_NUM - && part (partition)->block != block) - part (partition)->initialize (block); - } - else if (sav_block != block && partition < MAX_PARTITION_NUM) - part (partition)->initialize (block); - lasterr = err; - } - else - { - partition = count; - if (part (partition)->block == -1) - part (partition)->initialize (0); - } - } - return error ("set_partition"); -} - -int -mtinfo_drive::write_marks (HANDLE mt, int marktype, DWORD count) -{ - /* If an async write is still pending, wait for completion. */ - if (dirty == async_write_pending) - { - lasterr = async_wait (mt, NULL); - dirty = has_written; - } - if (marktype != TAPE_SETMARKS) - dirty = clean; - if (marktype == TAPE_FILEMARKS - && !get_feature (TAPE_DRIVE_WRITE_FILEMARKS)) - { - if (get_feature (TAPE_DRIVE_WRITE_LONG_FMKS)) - marktype = TAPE_LONG_FILEMARKS; - else - marktype = TAPE_SHORT_FILEMARKS; - } - TAPE_FUNC (WriteTapemark (mt, marktype, count, FALSE)); - int err = lasterr; - if (!err) - { - block += count; - part (partition)->block += count; - if (part (partition)->file >= 0) - part (partition)->file += count; - part (partition)->fblock = 0; - part (partition)->emark = eof; - part (partition)->smark = (marktype == TAPE_SETMARKS); - } - else - { - int sav_block = block; - int sav_partition = partition; - get_pos (mt); - if (sav_partition != partition) - { - if (partition < MAX_PARTITION_NUM - && part (partition)->block != block) - part (partition)->initialize (block); - } - else if (sav_block != block && partition < MAX_PARTITION_NUM) - part (partition)->initialize (block); - lasterr = err; - } - return error ("write_marks"); -} - -int -mtinfo_drive::erase (HANDLE mt, int mode) -{ - switch (mode) - { - case TAPE_ERASE_SHORT: - if (!get_feature (TAPE_DRIVE_ERASE_SHORT)) - mode = TAPE_ERASE_LONG; - break; - case TAPE_ERASE_LONG: - if (!get_feature (TAPE_DRIVE_ERASE_LONG)) - mode = TAPE_ERASE_SHORT; - break; - } - TAPE_FUNC (EraseTape (mt, mode, nowait () ? TRUE : FALSE)); - part (partition)->initialize (0); - return error ("erase"); -} - -int -mtinfo_drive::prepare (HANDLE mt, int action, bool is_auto) -{ - BOOL dont_wait = FALSE; - - /* If an async write is still pending, wait for completion. */ - if (dirty == async_write_pending) - lasterr = async_wait (mt, NULL); - dirty = clean; - if (action == TAPE_UNLOAD || action == TAPE_LOAD || action == TAPE_TENSION) - dont_wait = nowait () ? TRUE : FALSE; - TAPE_FUNC (PrepareTape (mt, action, dont_wait)); - /* Reset buffer after all successful preparations but lock and unlock. */ - switch (action) - { - case TAPE_FORMAT: - case TAPE_UNLOAD: - case TAPE_LOAD: - initialize (drive, false); - break; - case TAPE_TENSION: - part (partition)->initialize (0); - break; - case TAPE_LOCK: - lock = lasterr ? lock_error : is_auto ? auto_locked : locked; - break; - case TAPE_UNLOCK: - lock = lasterr ? lock_error : unlocked; - break; - } - return error ("prepare"); -} - -int -mtinfo_drive::set_compression (HANDLE mt, long count) -{ - if (!get_feature (TAPE_DRIVE_SET_COMPRESSION)) - return ERROR_INVALID_PARAMETER; - TAPE_SET_DRIVE_PARAMETERS sdp = - { - dp ()->ECC, - count ? TRUE : FALSE, - dp ()->DataPadding, - dp ()->ReportSetmarks, - dp ()->EOTWarningZoneSize - }; - TAPE_FUNC (SetTapeParameters (mt, SET_TAPE_DRIVE_INFORMATION, &sdp)); - int err = lasterr; - if (!err) - dp ()->Compression = sdp.Compression; - else - get_dp (mt); - lasterr = err; - return error ("set_compression"); -} - -int -mtinfo_drive::set_blocksize (HANDLE mt, long count) -{ - TAPE_SET_MEDIA_PARAMETERS smp = {count}; - TAPE_FUNC (SetTapeParameters (mt, SET_TAPE_MEDIA_INFORMATION, &smp)); - return error ("set_blocksize"); -} - -int -mtinfo_drive::get_status (HANDLE mt, struct mtget *get) -{ - int notape = 0; - DWORD tstat; - - if (!get) - return ERROR_INVALID_PARAMETER; - - if ((tstat = GetTapeStatus (mt)) == ERROR_NO_MEDIA_IN_DRIVE) - notape = 1; - - memset (get, 0, sizeof *get); - - get->mt_type = MT_ISUNKNOWN; - - if (!notape && get_feature (TAPE_DRIVE_SET_BLOCK_SIZE)) - get->mt_dsreg = (mp ()->BlockSize << MT_ST_BLKSIZE_SHIFT) - & MT_ST_BLKSIZE_MASK; - else - get->mt_dsreg = (dp ()->DefaultBlockSize << MT_ST_BLKSIZE_SHIFT) - & MT_ST_BLKSIZE_MASK; - - if (wincap.has_ioctl_storage_get_media_types_ex ()) - { - DWORD size = sizeof (GET_MEDIA_TYPES) + 10 * sizeof (DEVICE_MEDIA_INFO); - void *buf = alloca (size); - if (DeviceIoControl (mt, IOCTL_STORAGE_GET_MEDIA_TYPES_EX, - NULL, 0, buf, size, &size, NULL) - || GetLastError () == ERROR_MORE_DATA) - { - PGET_MEDIA_TYPES gmt = (PGET_MEDIA_TYPES) buf; - for (DWORD i = 0; i < gmt->MediaInfoCount; ++i) - { - PDEVICE_MEDIA_INFO dmi = &gmt->MediaInfo[i]; - get->mt_type = dmi->DeviceSpecific.TapeInfo.MediaType; -#define TINFO DeviceSpecific.TapeInfo - if (dmi->TINFO.MediaCharacteristics & MEDIA_CURRENTLY_MOUNTED) - { - get->mt_type = dmi->DeviceSpecific.TapeInfo.MediaType; - if (dmi->TINFO.BusType == BusTypeScsi) - get->mt_dsreg |= - (dmi->TINFO.BusSpecificData.ScsiInformation.DensityCode - << MT_ST_DENSITY_SHIFT) - & MT_ST_DENSITY_MASK; - break; - } -#undef TINFO - } - } - } - - if (!notape) - { - get->mt_resid = partition; - get->mt_fileno = part (partition)->file; - get->mt_blkno = part (partition)->fblock; - - if (get->mt_blkno == 0) - if (get->mt_fileno == 0) - get->mt_gstat |= GMT_BOT (-1); - else - get->mt_gstat |= GMT_EOF (-1); - if (part (partition)->emark >= eod_hit) - get->mt_gstat |= GMT_EOD (-1); - if (part (partition)->emark >= eom_hit) - get->mt_gstat |= GMT_EOT (-1); - - if (part (partition)->smark) - get->mt_gstat |= GMT_SM (-1); - - get->mt_gstat |= GMT_ONLINE (-1); - - if (mp ()->WriteProtected) - get->mt_gstat |= GMT_WR_PROT (-1); - - get->mt_capacity = get_ll (mp ()->Capacity); - get->mt_remaining = get_ll (mp ()->Remaining); - } - - if (notape) - get->mt_gstat |= GMT_DR_OPEN (-1); - - if (buffer_writes ()) - get->mt_gstat |= GMT_IM_REP_EN (-1); /* TODO: Async writes */ - - if (tstat == ERROR_DEVICE_REQUIRES_CLEANING) - get->mt_gstat |= GMT_CLN (-1); - - /* Cygwin specials: */ - if (dp ()->ReportSetmarks) - get->mt_gstat |= GMT_REP_SM (-1); - if (dp ()->DataPadding) - get->mt_gstat |= GMT_PADDING (-1); - if (dp ()->ECC) - get->mt_gstat |= GMT_HW_ECC (-1); - if (dp ()->Compression) - get->mt_gstat |= GMT_HW_COMP (-1); - if (two_fm ()) - get->mt_gstat |= GMT_TWO_FM (-1); - if (fast_eom ()) - get->mt_gstat |= GMT_FAST_MTEOM (-1); - if (auto_lock ()) - get->mt_gstat |= GMT_AUTO_LOCK (-1); - if (sysv ()) - get->mt_gstat |= GMT_SYSV (-1); - if (nowait ()) - get->mt_gstat |= GMT_NOWAIT (-1); - if (async_writes ()) - get->mt_gstat |= GMT_ASYNC (-1); - - get->mt_erreg = 0; /* FIXME: No softerr counting */ - - get->mt_minblksize = dp ()->MinimumBlockSize; - get->mt_maxblksize = dp ()->MaximumBlockSize; - get->mt_defblksize = dp ()->DefaultBlockSize; - get->mt_featureslow = dp ()->FeaturesLow; - get->mt_featureshigh = dp ()->FeaturesHigh; - get->mt_eotwarningzonesize = dp ()->EOTWarningZoneSize; - - return 0; -} - -int -mtinfo_drive::set_options (HANDLE mt, long options) -{ - long what = (options & MT_ST_OPTIONS); - bool call_setparams = false; - bool set; - TAPE_SET_DRIVE_PARAMETERS sdp = - { - dp ()->ECC, - dp ()->Compression, - dp ()->DataPadding, - dp ()->ReportSetmarks, - dp ()->EOTWarningZoneSize - }; - - lasterr = 0; - switch (what) - { - case 0: - if (options == 0 || options == 1) - { - buffer_writes ((options == 1)); - } - break; - case MT_ST_BOOLEANS: - buffer_writes (!!(options & MT_ST_BUFFER_WRITES)); - async_writes (!!(options & MT_ST_ASYNC_WRITES)); - two_fm (!!(options & MT_ST_TWO_FM)); - fast_eom (!!(options & MT_ST_FAST_MTEOM)); - auto_lock (!!(options & MT_ST_AUTO_LOCK)); - sysv (!!(options & MT_ST_SYSV)); - nowait (!!(options & MT_ST_NOWAIT)); - if (get_feature (TAPE_DRIVE_SET_ECC)) - sdp.ECC = !!(options & MT_ST_ECC); - if (get_feature (TAPE_DRIVE_SET_PADDING)) - sdp.DataPadding = !!(options & MT_ST_PADDING); - if (get_feature (TAPE_DRIVE_SET_REPORT_SMKS)) - sdp.ReportSetmarks = !!(options & MT_ST_REPORT_SM); - if (sdp.ECC != dp ()->ECC || sdp.DataPadding != dp ()->DataPadding - || sdp.ReportSetmarks != dp ()->ReportSetmarks) - call_setparams = true; - break; - case MT_ST_SETBOOLEANS: - case MT_ST_CLEARBOOLEANS: - set = (what == MT_ST_SETBOOLEANS); - if (options & MT_ST_BUFFER_WRITES) - buffer_writes (set); - if (options & MT_ST_ASYNC_WRITES) - async_writes (set); - if (options & MT_ST_TWO_FM) - two_fm (set); - if (options & MT_ST_FAST_MTEOM) - fast_eom (set); - if (options & MT_ST_AUTO_LOCK) - auto_lock (set); - if (options & MT_ST_SYSV) - sysv (set); - if (options & MT_ST_NOWAIT) - nowait (set); - if (options & MT_ST_ECC) - sdp.ECC = set; - if (options & MT_ST_PADDING) - sdp.DataPadding = set; - if (options & MT_ST_REPORT_SM) - sdp.ReportSetmarks = set; - if (sdp.ECC != dp ()->ECC || sdp.DataPadding != dp ()->DataPadding - || sdp.ReportSetmarks != dp ()->ReportSetmarks) - call_setparams = true; - break; - case MT_ST_EOT_WZ_SIZE: - if (get_feature (TAPE_DRIVE_SET_EOT_WZ_SIZE)) - { - sdp.EOTWarningZoneSize = (options & ~MT_ST_OPTIONS); - if (sdp.EOTWarningZoneSize != dp ()->EOTWarningZoneSize) - call_setparams = true; - } - break; - } - if (call_setparams) - { - TAPE_FUNC (SetTapeParameters (mt, SET_TAPE_DRIVE_INFORMATION, &sdp)); - int err = lasterr; - if (!err) - { - dp ()->ECC = sdp.ECC; - dp ()->DataPadding = sdp.DataPadding; - dp ()->ReportSetmarks = sdp.ReportSetmarks; - } - else - get_dp (mt); - lasterr = err; - } - return error ("set_options"); -} - -int -mtinfo_drive::ioctl (HANDLE mt, unsigned int cmd, void *buf) -{ - myfault efault; - if (efault.faulted ()) - return ERROR_NOACCESS; - if (cmd == MTIOCTOP) - { - struct mtop *op = (struct mtop *) buf; - if (lasterr == ERROR_BUS_RESET) - { - /* If a bus reset occurs, block further access to this device - until the user rewinds, unloads or in any other way tries - to maintain a well-known tape position. */ - if (op->mt_op != MTREW && op->mt_op != MTOFFL - && op->mt_op != MTRETEN && op->mt_op != MTERASE - && op->mt_op != MTSEEK && op->mt_op != MTEOM) - return ERROR_BUS_RESET; - /* Try to maintain last lock state after bus reset. */ - if (lock >= auto_locked && PrepareTape (mt, TAPE_LOCK, FALSE)) - { - debug_printf ("Couldn't relock drive after bus reset."); - lock = unlocked; - } - } - switch (op->mt_op) - { - case MTRESET: - break; - case MTFSF: - set_pos (mt, TAPE_SPACE_FILEMARKS, op->mt_count, false); - break; - case MTBSF: - set_pos (mt, TAPE_SPACE_FILEMARKS, -op->mt_count, false); - break; - case MTFSR: - set_pos (mt, TAPE_SPACE_RELATIVE_BLOCKS, op->mt_count, false); - break; - case MTBSR: - set_pos (mt, TAPE_SPACE_RELATIVE_BLOCKS, -op->mt_count, false); - break; - case MTWEOF: - write_marks (mt, TAPE_FILEMARKS, op->mt_count); - break; - case MTREW: - set_pos (mt, TAPE_REWIND, 0, false); - break; - case MTOFFL: - case MTUNLOAD: - prepare (mt, TAPE_UNLOAD); - break; - case MTNOP: - lasterr = 0; - break; - case MTRETEN: - if (!get_feature (TAPE_DRIVE_TENSION)) - lasterr = ERROR_INVALID_PARAMETER; - else if (!set_pos (mt, TAPE_REWIND, 0, false)) - prepare (mt, TAPE_TENSION); - break; - case MTBSFM: - set_pos (mt, TAPE_SPACE_FILEMARKS, -op->mt_count, true); - break; - case MTFSFM: - set_pos (mt, TAPE_SPACE_FILEMARKS, op->mt_count, true); - break; - case MTEOM: - if (fast_eom () && get_feature (TAPE_DRIVE_END_OF_DATA)) - set_pos (mt, TAPE_SPACE_END_OF_DATA, 0, false); - else - set_pos (mt, TAPE_SPACE_FILEMARKS, 32767, false); - break; - case MTERASE: - erase (mt, TAPE_ERASE_LONG); - break; - case MTRAS1: - case MTRAS2: - case MTRAS3: - lasterr = ERROR_INVALID_PARAMETER; - break; - case MTSETBLK: - if (!get_feature (TAPE_DRIVE_SET_BLOCK_SIZE)) - { - lasterr = ERROR_INVALID_PARAMETER; - break; - } - if ((DWORD) op->mt_count == mp ()->BlockSize) - { - /* Nothing has changed. */ - lasterr = 0; - break; - } - if ((op->mt_count == 0 && !get_feature (TAPE_DRIVE_VARIABLE_BLOCK)) - || (op->mt_count > 0 - && ((DWORD) op->mt_count < dp ()->MinimumBlockSize - || (DWORD) op->mt_count > dp ()->MaximumBlockSize))) - { - lasterr = ERROR_INVALID_PARAMETER; - break; - } - if (set_blocksize (mt, op->mt_count) - && lasterr == ERROR_INVALID_FUNCTION) - lasterr = ERROR_INVALID_BLOCK_LENGTH; - break; - case MTSEEK: - if (get_feature (TAPE_DRIVE_LOGICAL_BLK)) - set_pos (mt, TAPE_LOGICAL_BLOCK, op->mt_count, false); - else if (!get_pos (mt)) - set_pos (mt, TAPE_SPACE_RELATIVE_BLOCKS, - op->mt_count - block, false); - break; - case MTTELL: - if (!get_pos (mt)) - op->mt_count = block; - break; - case MTFSS: - set_pos (mt, TAPE_SPACE_SETMARKS, op->mt_count, false); - break; - case MTBSS: - set_pos (mt, TAPE_SPACE_SETMARKS, -op->mt_count, false); - break; - case MTWSM: - write_marks (mt, TAPE_SETMARKS, op->mt_count); - break; - case MTLOCK: - prepare (mt, TAPE_LOCK); - break; - case MTUNLOCK: - prepare (mt, TAPE_UNLOCK); - break; - case MTLOAD: - prepare (mt, TAPE_LOAD); - break; - case MTCOMPRESSION: - set_compression (mt, op->mt_count); - break; - case MTSETPART: - set_partition (mt, op->mt_count); - break; - case MTMKPART: - create_partitions (mt, op->mt_count); - break; - case MTSETDRVBUFFER: - set_options (mt, op->mt_count); - break; - case MTSETDENSITY: - default: - lasterr = ERROR_INVALID_PARAMETER; - break; - } - } - else if (cmd == MTIOCGET) - get_status (mt, (struct mtget *) buf); - else if (cmd == MTIOCPOS && !get_pos (mt)) - ((struct mtpos *) buf)->mt_blkno = block; - - return lasterr; -} - -/**********************************************************************/ -/* mtinfo */ - -void -mtinfo::initialize () -{ - char name[CYG_MAX_PATH]; - HANDLE mtx; - - shared_name (name, "mtinfo_mutex", 0); - if (!(mtx = CreateMutex (&sec_all_nih, FALSE, name))) - api_fatal ("CreateMutex '%s', %E. Terminating.", name); - WaitForSingleObject (mtx, INFINITE); - if (!magic) - { - magic = MTINFO_MAGIC; - version = MTINFO_VERSION; - for (unsigned i = 0; i < MAX_DRIVE_NUM; ++i) - drive (i)->initialize (i, true); - ReleaseMutex (mtx); - CloseHandle (mtx); - } - else - { - ReleaseMutex (mtx); - CloseHandle (mtx); - if (magic != MTINFO_MAGIC) - api_fatal ("MT magic number screwed up: %lu, should be %lu", - magic, MTINFO_MAGIC); - if (version != MTINFO_VERSION) - system_printf ("MT version number mismatch: %lu, should be %lu", - version, MTINFO_VERSION); - } -} - -mtinfo *mt; - -void __stdcall -mtinfo_init () -{ - shared_locations sh_mtinfo = SH_MTINFO; - mt = (mtinfo *) open_shared ("mtinfo", MTINFO_VERSION, cygheap->mt_h, sizeof (mtinfo), sh_mtinfo); - ProtectHandleINH (cygheap->mt_h); - mt->initialize (); -} - -/**********************************************************************/ -/* fhandler_dev_tape */ - -#define lock(err_ret_val) if (!_lock ()) return err_ret_val; - -inline bool -fhandler_dev_tape::_lock () -{ - HANDLE obj[2] = { mt_mtx, signal_arrived }; - BOOL ret = WaitForMultipleObjects (2, obj, FALSE, INFINITE) == WAIT_OBJECT_0; - if (!ret) - { - debug_printf ("signal_arrived"); \ - set_errno (EINTR); - } - return ret; -} - -inline int -fhandler_dev_tape::unlock (int ret) -{ - ReleaseMutex (mt_mtx); - return ret; -} - -fhandler_dev_tape::fhandler_dev_tape () - : fhandler_dev_raw () -{ - debug_printf ("unit: %d", dev ().minor); -} - -int -fhandler_dev_tape::open (int flags, mode_t) -{ - int ret; - - if (driveno () >= MAX_DRIVE_NUM) - { - set_errno (ENOENT); - return 0; - } - if (!(mt_mtx = CreateMutex (&sec_all, TRUE, NULL))) - { - __seterrno (); - return 0; - } - - /* The O_SYNC flag is not supported by the tape driver. Use the - MT_ST_BUFFER_WRITES and MT_ST_ASYNC_WRITES flags in the drive - settings instead. In turn, the MT_ST_BUFFER_WRITES is translated - into O_SYNC, which controls the FILE_WRITE_THROUGH flag in the - NtCreateFile call in fhandler_base::open. */ - flags &= ~O_SYNC; - if (!mt->drive (driveno ())->buffer_writes ()) - flags |= O_SYNC; - - ret = fhandler_dev_raw::open (flags); - if (ret) - { - mt->drive (driveno ())->open (get_handle ()); - - /* In append mode, seek to beginning of next filemark */ - if (flags & O_APPEND) - mt->drive (driveno ())->set_pos (get_handle (), - TAPE_SPACE_FILEMARKS, 1, true); - - if (!(flags & O_DIRECT)) - { - devbufsiz = mt->drive (driveno ())->dp ()->MaximumBlockSize; - devbuf = new char [devbufsiz]; - } - devbufstart = devbufend = 0; - } - else - ReleaseMutex (mt_mtx); - return ret; -} - -int -fhandler_dev_tape::close () -{ - int ret = 0; - int cret = 0; - - if (!hExeced) - { - lock (-1); - ret = mt->drive (driveno ())->close (get_handle (), is_rewind_device ()); - if (ret) - __seterrno_from_win_error (ret); - cret = fhandler_dev_raw::close (); - unlock (0); - } - if (mt_evt) - CloseHandle (mt_evt); - CloseHandle (mt_mtx); - return ret ? -1 : cret; -} - -void -fhandler_dev_tape::raw_read (void *ptr, size_t &ulen) -{ - char *buf = (char *) ptr; - size_t len = ulen; - size_t block_size; - size_t bytes_to_read; - size_t bytes_read = 0; - int ret = 0; - - if (lastblk_to_read ()) - { - lastblk_to_read (false); - ulen = 0; - return; - } - if (!_lock ()) - { - ulen = (size_t) -1; - return; - } - block_size = mt->drive (driveno ())->mp ()->BlockSize; - if (devbuf) - { - if (devbufend > devbufstart) - { - bytes_to_read = min (len, devbufend - devbufstart); - debug_printf ("read %d bytes from buffer (rest %d)", - bytes_to_read, devbufend - devbufstart - bytes_to_read); - memcpy (buf, devbuf + devbufstart, bytes_to_read); - len -= bytes_to_read; - bytes_read += bytes_to_read; - buf += bytes_to_read; - devbufstart += bytes_to_read; - if (devbufstart == devbufend) - devbufstart = devbufend = 0; - /* If a switch to variable block_size occured, just return the buffer - remains until the buffer is empty, then proceed with usual variable - block size handling (one block per read call). */ - if (!block_size) - len = 0; - } - if (len > 0) - { - if (!mt_evt && !(mt_evt = CreateEvent (&sec_none, TRUE, FALSE, NULL))) - debug_printf ("Creating event failed, %E"); - size_t block_fit = !block_size ? len : rounddown(len, block_size); - if (block_fit) - { - debug_printf ("read %d bytes from tape (rest %d)", - block_fit, len - block_fit); - ret = mt->drive (driveno ())->read (get_handle (), mt_evt, buf, - block_fit); - if (ret) - __seterrno_from_win_error (ret); - else if (block_fit) - { - len -= block_fit; - bytes_read += block_fit; - buf += block_fit; - /* Only one block in each read call, please. */ - if (!block_size) - len = 0; - } - else { - len = 0; - if (bytes_read) - lastblk_to_read (true); - } - } - if (!ret && len > 0) - { - debug_printf ("read %d bytes from tape (one block)", block_size); - ret = mt->drive (driveno ())->read (get_handle (), mt_evt, devbuf, - block_size); - if (ret) - __seterrno_from_win_error (ret); - else if (block_size) - { - devbufstart = len; - devbufend = block_size; - bytes_read += len; - memcpy (buf, devbuf, len); - } - else if (bytes_read) - lastblk_to_read (true); - } - } - } - else - { - if (!mt_evt && !(mt_evt = CreateEvent (&sec_none, TRUE, FALSE, NULL))) - debug_printf ("Creating event failed, %E"); - bytes_read = ulen; - ret = mt->drive (driveno ())->read (get_handle (), mt_evt, ptr, - bytes_read); - } - ulen = (ret ? (size_t) -1 : bytes_read); - unlock (); -} - -int -fhandler_dev_tape::raw_write (const void *ptr, size_t len) -{ - lock (-1); - if (!mt_evt && !(mt_evt = CreateEvent (&sec_none, TRUE, FALSE, NULL))) - debug_printf ("Creating event failed, %E"); - int ret = mt->drive (driveno ())->write (get_handle (), mt_evt, ptr, len); - if (ret) - __seterrno_from_win_error (ret); - return unlock (ret ? -1 : (int) len); -} - -_off64_t -fhandler_dev_tape::lseek (_off64_t offset, int whence) -{ - struct mtop op; - struct mtpos pos; - DWORD block_size; - _off64_t ret = ILLEGAL_SEEK; - - lock (ILLEGAL_SEEK); - - debug_printf ("lseek (%s, %d, %d)", get_name (), offset, whence); - - block_size = mt->drive (driveno ())->mp ()->BlockSize; - if (block_size == 0) - { - set_errno (EIO); - goto out; - } - - if (ioctl (MTIOCPOS, &pos)) - goto out; - - switch (whence) - { - case SEEK_END: - op.mt_op = MTFSF; - op.mt_count = 1; - if (ioctl (MTIOCTOP, &op)) - goto out; - break; - case SEEK_SET: - if (whence == SEEK_SET && offset < 0) - { - set_errno (EINVAL); - goto out; - } - break; - case SEEK_CUR: - break; - default: - set_errno (EINVAL); - goto out; - } - - op.mt_op = MTFSR; - op.mt_count = offset / block_size - - (whence == SEEK_SET ? pos.mt_blkno : 0); - - if (op.mt_count < 0) - { - op.mt_op = MTBSR; - op.mt_count = -op.mt_count; - } - - if (ioctl (MTIOCTOP, &op) || ioctl (MTIOCPOS, &pos)) - goto out; - - ret = pos.mt_blkno * block_size; - -out: - return unlock (ret); -} - -int -fhandler_dev_tape::fstat (struct __stat64 *buf) -{ - int ret; - - if (driveno () >= MAX_DRIVE_NUM) - { - set_errno (ENOENT); - return -1; - } - if (!(ret = fhandler_base::fstat (buf))) - buf->st_blocks = 0; - return ret; -} - -int -fhandler_dev_tape::dup (fhandler_base *child) -{ - lock (-1); - fhandler_dev_tape *fh = (fhandler_dev_tape *) child; - if (!DuplicateHandle (hMainProc, mt_mtx, hMainProc, &fh->mt_mtx, 0, TRUE, - DUPLICATE_SAME_ACCESS)) - { - debug_printf ("dup(%s) failed, mutex handle %x, %E", - get_name (), mt_mtx); - __seterrno (); - return unlock (-1); - } - fh->mt_evt = NULL; - if (mt_evt && - !DuplicateHandle (hMainProc, mt_evt, hMainProc, &fh->mt_evt, 0, TRUE, - DUPLICATE_SAME_ACCESS)) - { - debug_printf ("dup(%s) failed, event handle %x, %E", - get_name (), mt_evt); - __seterrno (); - return unlock (-1); - } - return unlock (fhandler_dev_raw::dup (child)); -} - -void -fhandler_dev_tape::fixup_after_fork (HANDLE parent) -{ - fhandler_dev_raw::fixup_after_fork (parent); - fork_fixup (parent, mt_mtx, "mt_mtx"); - if (mt_evt) - fork_fixup (parent, mt_evt, "mt_evt"); -} - -void -fhandler_dev_tape::set_close_on_exec (bool val) -{ - fhandler_dev_raw::set_close_on_exec (val); - set_no_inheritance (mt_mtx, val); - if (mt_evt) - set_no_inheritance (mt_evt, val); -} - -int -fhandler_dev_tape::ioctl (unsigned int cmd, void *buf) -{ - int ret = 0; - lock (-1); - if (cmd == MTIOCTOP || cmd == MTIOCGET || cmd == MTIOCPOS) - { - ret = mt->drive (driveno ())->ioctl (get_handle (), cmd, buf); - if (ret) - __seterrno_from_win_error (ret); - return unlock (ret ? -1 : 0); - } - return unlock (fhandler_dev_raw::ioctl (cmd, buf)); -} diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc deleted file mode 100644 index 3475f5ed5..000000000 --- a/winsup/cygwin/fhandler_termios.cc +++ /dev/null @@ -1,376 +0,0 @@ -/* fhandler_termios.cc - - Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "sigproc.h" -#include "pinfo.h" -#include "tty.h" -#include "sys/cygwin.h" -#include "cygtls.h" - -/* Common functions shared by tty/console */ - -void -fhandler_termios::tcinit (tty_min *this_tc, bool force) -{ - /* Initial termios values */ - - tc = this_tc; - - if (force || !tc->initialized ()) - { - tc->ti.c_iflag = BRKINT | ICRNL | IXON; - tc->ti.c_oflag = OPOST | ONLCR; - tc->ti.c_cflag = B38400 | CS8 | CREAD; - tc->ti.c_lflag = ISIG | ICANON | ECHO | IEXTEN; - - tc->ti.c_cc[VDISCARD] = CFLUSH; - tc->ti.c_cc[VEOL] = CEOL; - tc->ti.c_cc[VEOL2] = CEOL2; - tc->ti.c_cc[VEOF] = CEOF; - tc->ti.c_cc[VERASE] = CERASE; - tc->ti.c_cc[VINTR] = CINTR; - tc->ti.c_cc[VKILL] = CKILL; - tc->ti.c_cc[VLNEXT] = CLNEXT; - tc->ti.c_cc[VMIN] = 1; - tc->ti.c_cc[VQUIT] = CQUIT; - tc->ti.c_cc[VREPRINT] = CRPRNT; - tc->ti.c_cc[VSTART] = CSTART; - tc->ti.c_cc[VSTOP] = CSTOP; - tc->ti.c_cc[VSUSP] = CSUSP; - tc->ti.c_cc[VSWTC] = CSWTCH; - tc->ti.c_cc[VTIME] = 0; - tc->ti.c_cc[VWERASE] = CWERASE; - - tc->ti.c_ispeed = tc->ti.c_ospeed = B38400; - tc->pgid = myself->pgid; - tc->initialized (true); - } -} - -int -fhandler_termios::tcsetpgrp (const pid_t pgid) -{ - termios_printf ("tty %d pgid %d, sid %d, tsid %d", tc->ntty, pgid, - myself->sid, tc->getsid ()); - if (myself->sid != tc->getsid ()) - { - set_errno (EPERM); - return -1; - } - int res; - while (1) - { - res = bg_check (-SIGTTOU); - - switch (res) - { - case bg_ok: - tc->setpgid (pgid); - res = 0; - break; - case bg_signalled: - if (_my_tls.call_signal_handler ()) - continue; - set_errno (EINTR); - /* fall through intentionally */ - default: - res = -1; - break; - } - break; - } - return res; -} - -int -fhandler_termios::tcgetpgrp () -{ - return tc->pgid; -} - -void -tty_min::kill_pgrp (int sig) -{ - int killself = 0; - winpids pids ((DWORD) PID_MAP_RW); - siginfo_t si = {0}; - si.si_signo = sig; - si.si_code = SI_KERNEL; - for (unsigned i = 0; i < pids.npids; i++) - { - _pinfo *p = pids[i]; - if (!p->exists () || p->ctty != ntty || p->pgid != pgid) - continue; - if (p == myself) - killself++; - else - sig_send (p, si); - } - if (killself) - sig_send (myself, si); -} - -bg_check_types -fhandler_termios::bg_check (int sig) -{ - if (!myself->pgid || tc->getpgid () == myself->pgid || - myself->ctty != tc->ntty || - ((sig == SIGTTOU) && !(tc->ti.c_lflag & TOSTOP))) - return bg_ok; - - if (sig < 0) - sig = -sig; - - termios_printf ("bg I/O pgid %d, tpgid %d, %s", myself->pgid, tc->getpgid (), - myctty ()); - - if (tc->getsid () == 0) - { - /* The pty has been closed by the master. Return an EOF - indication. FIXME: There is nothing to stop somebody - from reallocating this pty. I think this is the case - which is handled by unlockpt on a Unix system. */ - termios_printf ("closed by master"); - return bg_eof; - } - - /* If the process group is no more or if process is ignoring or blocks 'sig', - return with error */ - int pgid_gone = !pid_exists (myself->pgid); - int sigs_ignored = - ((void *) global_sigs[sig].sa_handler == (void *) SIG_IGN) || - (myself->getsigmask () & SIGTOMASK (sig)); - - if (pgid_gone) - goto setEIO; - else if (!sigs_ignored) - /* nothing */; - else if (sig == SIGTTOU) - return bg_ok; /* Just allow the output */ - else - goto setEIO; /* This is an output error */ - - /* Don't raise a SIGTT* signal if we have already been interrupted - by another signal. */ - if (WaitForSingleObject (signal_arrived, 0) != WAIT_OBJECT_0) - { - siginfo_t si = {0}; - si.si_signo = sig; - si.si_code = SI_KERNEL; - kill_pgrp (myself->pgid, si); - } - return bg_signalled; - -setEIO: - set_errno (EIO); - return bg_error; -} - -#define set_input_done(x) input_done = input_done || (x) - -inline void -fhandler_termios::echo_erase (int force) -{ - if (force || tc->ti.c_lflag & ECHO) - doecho ("\b \b", 3); -} - -line_edit_status -fhandler_termios::line_edit (const char *rptr, int nread, termios& ti) -{ - line_edit_status ret = line_edit_ok; - char c; - int input_done = 0; - bool sawsig = false; - int iscanon = ti.c_lflag & ICANON; - - while (nread-- > 0) - { - c = *rptr++; - - termios_printf ("char %c", c); - - /* Check for special chars */ - - if (c == '\r') - { - if (ti.c_iflag & IGNCR) - continue; - if (ti.c_iflag & ICRNL) - { - c = '\n'; - set_input_done (iscanon); - } - } - else if (c == '\n') - { - if (ti.c_iflag & INLCR) - c = '\r'; - else - set_input_done (iscanon); - } - - if (ti.c_iflag & ISTRIP) - c &= 0x7f; - if (ti.c_lflag & ISIG) - { - int sig; - if (CCEQ (ti.c_cc[VINTR], c)) - sig = SIGINT; - else if (CCEQ (ti.c_cc[VQUIT], c)) - sig = SIGQUIT; - else if (CCEQ (ti.c_cc[VSUSP], c)) - sig = SIGTSTP; - else - goto not_a_sig; - - termios_printf ("got interrupt %d, sending signal %d", c, sig); - eat_readahead (-1); - tc->kill_pgrp (sig); - ti.c_lflag &= ~FLUSHO; - sawsig = true; - goto restart_output; - } - not_a_sig: - if (ti.c_iflag & IXON) - { - if (CCEQ (ti.c_cc[VSTOP], c)) - { - if (!tc->output_stopped) - { - tc->output_stopped = 1; - acquire_output_mutex (INFINITE); - } - continue; - } - else if (CCEQ (ti.c_cc[VSTART], c)) - { - restart_output: - tc->output_stopped = 0; - release_output_mutex (); - continue; - } - else if ((ti.c_iflag & IXANY) && tc->output_stopped) - goto restart_output; - } - if (iscanon && ti.c_lflag & IEXTEN && CCEQ (ti.c_cc[VDISCARD], c)) - { - ti.c_lflag ^= FLUSHO; - continue; - } - if (!iscanon) - /* nothing */; - else if (CCEQ (ti.c_cc[VERASE], c)) - { - if (eat_readahead (1)) - echo_erase (); - continue; - } - else if (CCEQ (ti.c_cc[VWERASE], c)) - { - int ch; - do - if (!eat_readahead (1)) - break; - else - echo_erase (); - while ((ch = peek_readahead (1)) >= 0 && !isspace (ch)); - continue; - } - else if (CCEQ (ti.c_cc[VKILL], c)) - { - int nchars = eat_readahead (-1); - if (ti.c_lflag & ECHO) - while (nchars--) - echo_erase (1); - continue; - } - else if (CCEQ (ti.c_cc[VREPRINT], c)) - { - if (ti.c_lflag & ECHO) - { - doecho ("\n\r", 2); - doecho (rabuf, ralen); - } - continue; - } - else if (CCEQ (ti.c_cc[VEOF], c)) - { - termios_printf ("EOF"); - accept_input (); - ret = line_edit_input_done; - continue; - } - else if (CCEQ (ti.c_cc[VEOL], c) || - CCEQ (ti.c_cc[VEOL2], c) || - c == '\n') - { - set_input_done (1); - termios_printf ("EOL"); - } - - if (ti.c_iflag & IUCLC && isupper (c)) - c = cyg_tolower (c); - - put_readahead (c); - if (ti.c_lflag & ECHO) - doecho (&c, 1); - if (!iscanon || input_done) - { - int status = accept_input (); - if (status != 1) - { - ret = status ? line_edit_error : line_edit_pipe_full; - eat_readahead (1); - break; - } - ret = line_edit_input_done; - input_done = 0; - } - } - - if (!iscanon && ralen > 0) - ret = line_edit_input_done; - - if (sawsig) - ret = line_edit_signalled; - - return ret; -} - -void -fhandler_termios::fixup_after_exec () -{ - if (!close_on_exec ()) - fixup_after_fork (NULL); -} - -void -fhandler_termios::fixup_after_fork (HANDLE parent) -{ - fhandler_base::fixup_after_fork (parent); - fork_fixup (parent, get_output_handle (), "output_handle"); -} - -_off64_t -fhandler_termios::lseek (_off64_t, int) -{ - set_errno (ESPIPE); - return -1; -} diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc deleted file mode 100644 index 2cf551a9f..000000000 --- a/winsup/cygwin/fhandler_tty.cc +++ /dev/null @@ -1,1425 +0,0 @@ -/* fhandler_tty.cc - - Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "sigproc.h" -#include "pinfo.h" -#include "cygheap.h" -#include "shared_info.h" -#include "cygserver.h" -#include "cygthread.h" - -/* Tty master stuff */ - -fhandler_tty_master NO_COPY *tty_master; - -static DWORD WINAPI process_input (void *); // Input queue thread -static DWORD WINAPI process_output (void *); // Output queue thread -static DWORD WINAPI process_ioctl (void *); // Ioctl requests thread - -fhandler_tty_master::fhandler_tty_master () - : fhandler_pty_master (), console (NULL) -{ -} - -int -fhandler_tty_slave::get_unit () -{ - return dev () == FH_TTY ? myself->ctty : dev ().minor; -} - -void -fhandler_tty_master::set_winsize (bool sendSIGWINCH) -{ - winsize w; - console->ioctl (TIOCGWINSZ, &w); - get_ttyp ()->winsize = w; - if (sendSIGWINCH) - tc->kill_pgrp (SIGWINCH); -} - -int -fhandler_tty_master::init () -{ - slave = dev (); - termios_printf ("Creating master for tty%d", get_unit ()); - - if (init_console ()) - { - termios_printf ("can't create fhandler"); - return -1; - } - - termios ti; - memset (&ti, 0, sizeof (ti)); - console->tcsetattr (0, &ti); - - cygwin_shared->tty[get_unit ()]->common_init (this); - - set_winsize (false); - - inuse = get_ttyp ()->create_inuse (TTY_MASTER_ALIVE); - set_close_on_exec (true); - - cygthread *h; - h = new cygthread (process_input, 0, cygself, "ttyin"); - h->SetThreadPriority (THREAD_PRIORITY_HIGHEST); - h->zap_h (); - - h = new cygthread (process_ioctl, 0, cygself, "ttyioctl"); - h->SetThreadPriority (THREAD_PRIORITY_HIGHEST); - h->zap_h (); - - h = new cygthread (process_output, 0, cygself, "ttyout"); - h->SetThreadPriority (THREAD_PRIORITY_HIGHEST); - h->zap_h (); - - return 0; -} - -#ifdef DEBUGGING -static class mutex_stack -{ -public: - const char *fn; - int ln; - const char *tname; -} ostack[100]; - -static int osi; -#endif /*DEBUGGING*/ - -DWORD -fhandler_tty_common::__acquire_output_mutex (const char *fn, int ln, - DWORD ms) -{ - if (strace.active ()) - strace.prntf (_STRACE_TERMIOS, fn, "(%d): tty output_mutex: waiting %d ms", ln, ms); - DWORD res = WaitForSingleObject (output_mutex, ms); - if (res == WAIT_OBJECT_0) - { -#ifndef DEBUGGING - if (strace.active ()) - strace.prntf (_STRACE_TERMIOS, fn, "(%d): tty output_mutex: acquired", ln, res); -#else - ostack[osi].fn = fn; - ostack[osi].ln = ln; - ostack[osi].tname = cygthread::name (); - termios_printf ("acquired for %s:%d, osi %d", fn, ln, osi); - osi++; -#endif - } - return res; -} - -void -fhandler_tty_common::__release_output_mutex (const char *fn, int ln) -{ - if (ReleaseMutex (output_mutex)) - { -#ifndef DEBUGGING - if (strace.active ()) - strace.prntf (_STRACE_TERMIOS, fn, "(%d): tty output_mutex released", ln); -#else - if (osi > 0) - osi--; - termios_printf ("released at %s:%d, osi %d", fn, ln, osi); - termios_printf (" for %s:%d (%s)", ostack[osi].fn, ostack[osi].ln, ostack[osi].tname); - ostack[osi].ln = -ln; -#endif - } -} - -/* Process tty input. */ - -void -fhandler_pty_master::doecho (const void *str, DWORD len) -{ - acquire_output_mutex (INFINITE); - if (!WriteFile (get_ttyp ()->to_master, str, len, &len, NULL)) - termios_printf ("Write to %p failed, %E", get_ttyp ()->to_master); -// WaitForSingleObject (output_done_event, INFINITE); - release_output_mutex (); -} - -int -fhandler_pty_master::accept_input () -{ - DWORD bytes_left; - int ret = 1; - - WaitForSingleObject (input_mutex, INFINITE); - - bytes_left = eat_readahead (-1); - - if (!bytes_left) - { - termios_printf ("sending EOF to slave"); - get_ttyp ()->read_retval = 0; - } - else - { - char *p = rabuf; - DWORD rc; - DWORD written = 0; - - termios_printf ("about to write %d chars to slave", bytes_left); - rc = WriteFile (get_output_handle (), p, bytes_left, &written, NULL); - if (!rc) - { - debug_printf ("error writing to pipe %E"); - get_ttyp ()->read_retval = -1; - ret = -1; - } - else - { - get_ttyp ()->read_retval = 1; - p += written; - bytes_left -= written; - if (bytes_left > 0) - { - debug_printf ("to_slave pipe is full"); - puts_readahead (p, bytes_left); - ret = 0; - } - } - } - - SetEvent (input_available_event); - ReleaseMutex (input_mutex); - return ret; -} - -static DWORD WINAPI -process_input (void *) -{ - char rawbuf[INP_BUFFER_SIZE]; - - while (1) - { - size_t nraw = INP_BUFFER_SIZE; - tty_master->console->read ((void *) rawbuf, nraw); - if (tty_master->line_edit (rawbuf, nraw, tty_master->get_ttyp ()->ti) - == line_edit_signalled) - tty_master->console->eat_readahead (-1); - } -} - -bool -fhandler_pty_master::hit_eof () -{ - if (get_ttyp ()->was_opened && !get_ttyp ()->slave_alive ()) - { - /* We have the only remaining open handle to this pty, and - the slave pty has been opened at least once. We treat - this as EOF. */ - termios_printf ("all other handles closed"); - return 1; - } - return 0; -} - -/* Process tty output requests */ - -int -fhandler_pty_master::process_slave_output (char *buf, size_t len, int pktmode_on) -{ - size_t rlen; - char outbuf[OUT_BUFFER_SIZE + 1]; - DWORD n; - int column = 0; - int rc = 0; - - if (len == 0) - goto out; - - if (need_nl) - { - /* We need to return a left over \n character, resulting from - \r\n conversion. Note that we already checked for FLUSHO and - output_stopped at the time that we read the character, so we - don't check again here. */ - if (buf) - buf[0] = '\n'; - need_nl = 0; - rc = 1; - goto out; - } - - - for (;;) - { - /* Set RLEN to the number of bytes to read from the pipe. */ - rlen = len; - if (get_ttyp ()->ti.c_oflag & OPOST && get_ttyp ()->ti.c_oflag & ONLCR) - { - /* We are going to expand \n to \r\n, so don't read more than - half of the number of bytes requested. */ - rlen /= 2; - if (rlen == 0) - rlen = 1; - } - if (rlen > sizeof outbuf) - rlen = sizeof outbuf; - - HANDLE handle = get_io_handle (); - - n = 0; // get_readahead_into_buffer (outbuf, len); - if (!n) - { - /* Doing a busy wait like this is quite inefficient, but nothing - else seems to work completely. Windows should provide some sort - of overlapped I/O for pipes, or something, but it doesn't. */ - while (1) - { - if (!PeekNamedPipe (handle, NULL, 0, NULL, &n, NULL)) - goto err; - if (n > 0) - break; - if (hit_eof ()) - goto out; - /* DISCARD (FLUSHO) and tcflush can finish here. */ - if (n == 0 && (get_ttyp ()->ti.c_lflag & FLUSHO || !buf)) - goto out; - if (n == 0 && is_nonblocking ()) - { - set_errno (EAGAIN); - rc = -1; - break; - } - - Sleep (10); - } - - if (ReadFile (handle, outbuf, rlen, &n, NULL) == FALSE) - goto err; - } - - termios_printf ("bytes read %u", n); - get_ttyp ()->write_error = 0; - if (output_done_event != NULL) - SetEvent (output_done_event); - - if (get_ttyp ()->ti.c_lflag & FLUSHO || !buf) - continue; - - char *optr; - optr = buf; - if (pktmode_on) - *optr++ = TIOCPKT_DATA; - - if (!(get_ttyp ()->ti.c_oflag & OPOST)) // post-process output - { - memcpy (optr, outbuf, n); - optr += n; - } - else // raw output mode - { - char *iptr = outbuf; - - while (n--) - { - switch (*iptr) - { - case '\r': - if ((get_ttyp ()->ti.c_oflag & ONOCR) && column == 0) - { - iptr++; - continue; - } - if (get_ttyp ()->ti.c_oflag & OCRNL) - *iptr = '\n'; - else - column = 0; - break; - case '\n': - if (get_ttyp ()->ti.c_oflag & ONLCR) - { - *optr++ = '\r'; - column = 0; - } - if (get_ttyp ()->ti.c_oflag & ONLRET) - column = 0; - break; - default: - column++; - break; - } - - /* Don't store data past the end of the user's buffer. This - can happen if the user requests a read of 1 byte when - doing \r\n expansion. */ - if (optr - buf >= (int) len) - { - if (*iptr != '\n' || n != 0) - system_printf ("internal error: %d unexpected characters", n); - need_nl = 1; - break; - } - - *optr++ = *iptr++; - } - } - rc = optr - buf; - break; - - err: - if (GetLastError () == ERROR_BROKEN_PIPE) - rc = 0; - else - { - __seterrno (); - rc = -1; - } - break; - } - -out: - termios_printf ("returning %d", rc); - return rc; -} - -static DWORD WINAPI -process_output (void *) -{ - char buf[OUT_BUFFER_SIZE * 2]; - - for (;;) - { - int n = tty_master->process_slave_output (buf, OUT_BUFFER_SIZE, 0); - if (n <= 0) - { - if (n < 0) - termios_printf ("ReadFile %E"); - ExitThread (0); - } - n = tty_master->console->write ((void *) buf, (size_t) n); - tty_master->get_ttyp ()->write_error = n == -1 ? get_errno () : 0; - } -} - - -/* Process tty ioctl requests */ - -static DWORD WINAPI -process_ioctl (void *) -{ - while (1) - { - WaitForSingleObject (tty_master->ioctl_request_event, INFINITE); - termios_printf ("ioctl() request"); - tty_master->get_ttyp ()->ioctl_retval = - tty_master->console->ioctl (tty_master->get_ttyp ()->cmd, - (void *) &tty_master->get_ttyp ()->arg); - SetEvent (tty_master->ioctl_done_event); - } -} - -/**********************************************************************/ -/* Tty slave stuff */ - -fhandler_tty_slave::fhandler_tty_slave () - : fhandler_tty_common () -{ - uninterruptible_io (true); -} - -/* FIXME: This function needs to close handles when it has - a failing condition. */ -int -fhandler_tty_slave::open (int flags, mode_t) -{ - if (get_device () == FH_TTY) - pc.dev.tty_to_real_device (); - fhandler_tty_slave *arch = (fhandler_tty_slave *) cygheap->fdtab.find_archetype (pc.dev); - if (arch) - { - *this = *(fhandler_tty_slave *) arch; - termios_printf ("copied tty fhandler archetype"); - set_flags ((flags & ~O_TEXT) | O_BINARY); - cygheap->manage_console_count ("fhandler_tty_slave::open", 1); - goto out; - } - - tcinit (cygwin_shared->tty[get_unit ()]); - - attach_tty (get_unit ()); - - set_flags ((flags & ~O_TEXT) | O_BINARY); - /* Create synchronisation events */ - char buf[CYG_MAX_PATH]; - - /* output_done_event may or may not exist. It will exist if the tty - was opened by fhandler_tty_master::init, normally called at - startup if use_tty is non-zero. It will not exist if this is a - pty opened by fhandler_pty_master::open. In the former case, tty - output is handled by a separate thread which controls output. */ - shared_name (buf, OUTPUT_DONE_EVENT, get_unit ()); - output_done_event = OpenEvent (EVENT_ALL_ACCESS, TRUE, buf); - - if (!(output_mutex = get_ttyp ()->open_output_mutex ())) - { - termios_printf ("open output mutex failed, %E"); - __seterrno (); - return 0; - } - if (!(input_mutex = get_ttyp ()->open_input_mutex ())) - { - termios_printf ("open input mutex failed, %E"); - __seterrno (); - return 0; - } - shared_name (buf, INPUT_AVAILABLE_EVENT, get_unit ()); - if (!(input_available_event = OpenEvent (EVENT_ALL_ACCESS, TRUE, buf))) - { - termios_printf ("open input event failed, %E"); - __seterrno (); - return 0; - } - - /* The ioctl events may or may not exist. See output_done_event, - above. */ - shared_name (buf, IOCTL_REQUEST_EVENT, get_unit ()); - ioctl_request_event = OpenEvent (EVENT_ALL_ACCESS, TRUE, buf); - shared_name (buf, IOCTL_DONE_EVENT, get_unit ()); - ioctl_done_event = OpenEvent (EVENT_ALL_ACCESS, TRUE, buf); - - /* FIXME: Needs a method to eliminate tty races */ - { - acquire_output_mutex (500); - inuse = get_ttyp ()->create_inuse (TTY_SLAVE_ALIVE); - get_ttyp ()->was_opened = true; - release_output_mutex (); - } - - /* Duplicate tty handles. */ - - if (!get_ttyp ()->from_slave || !get_ttyp ()->to_slave) - { - termios_printf ("tty handles have been closed"); - set_errno (EACCES); - return 0; - } - - HANDLE from_master_local; - HANDLE to_master_local; - from_master_local = to_master_local = NULL; - -#ifdef USE_SERVER - if (!wincap.has_security () - || cygserver_running == CYGSERVER_UNAVAIL - || !cygserver_attach_tty (&from_master_local, &to_master_local)) -#endif - { -#ifdef USE_SERVER - termios_printf ("cannot dup handles via server. using old method."); -#endif - HANDLE tty_owner = OpenProcess (PROCESS_DUP_HANDLE, FALSE, - get_ttyp ()->master_pid); - termios_printf ("tty own handle %p",tty_owner); - if (tty_owner == NULL) - { - termios_printf ("can't open tty (%d) handle process %d", - get_unit (), get_ttyp ()->master_pid); - __seterrno (); - return 0; - } - - if (!DuplicateHandle (tty_owner, get_ttyp ()->from_master, - hMainProc, &from_master_local, 0, TRUE, - DUPLICATE_SAME_ACCESS)) - { - termios_printf ("can't duplicate input, %E"); - __seterrno (); - return 0; - } - - VerifyHandle (from_master_local); - if (!DuplicateHandle (tty_owner, get_ttyp ()->to_master, - hMainProc, &to_master_local, 0, TRUE, - DUPLICATE_SAME_ACCESS)) - { - termios_printf ("can't duplicate output, %E"); - __seterrno (); - return 0; - } - VerifyHandle (to_master_local); - CloseHandle (tty_owner); - } - - termios_printf ("duplicated from_master %p->%p from tty_owner", - get_ttyp ()->from_master, from_master_local); - termios_printf ("duplicated to_master %p->%p from tty_owner", - get_ttyp ()->to_master, to_master_local); - - set_io_handle (from_master_local); - set_output_handle (to_master_local); - - set_open_status (); - cygheap->manage_console_count ("fhandler_tty_slave::open", 1); - - // FIXME: Do this better someday - arch = (fhandler_tty_slave *) cmalloc (HEAP_ARCHETYPES, sizeof (*this)); - *((fhandler_tty_slave **) cygheap->fdtab.add_archetype ()) = arch; - archetype = arch; - *arch = *this; - -out: - usecount = 0; - archetype->usecount++; - report_tty_counts (this, "opened", ""); - myself->set_ctty (get_ttyp (), flags, arch); - - return 1; -} - -int -fhandler_tty_slave::close () -{ - if (!hExeced) - { - cygheap->manage_console_count ("fhandler_tty_slave::close", -1); - - archetype->usecount--; - report_tty_counts (this, "closed", ""); - - if (archetype->usecount) - { -#ifdef DEBUGGING - if (archetype->usecount < 0) - system_printf ("error: usecount %d", archetype->usecount); -#endif - termios_printf ("just returning because archetype usecount is != 0"); - return 0; - } - } - - termios_printf ("closing last open %s handle", ttyname ()); - return fhandler_tty_common::close (); -} - -int -fhandler_tty_slave::cygserver_attach_tty (LPHANDLE from_master_ptr, - LPHANDLE to_master_ptr) -{ -#ifndef USE_SERVER - return 0; -#else - if (!from_master_ptr || !to_master_ptr) - return 0; - - client_request_attach_tty req ((DWORD) get_ttyp ()->master_pid, - (HANDLE) get_ttyp ()->from_master, - (HANDLE) get_ttyp ()->to_master); - - if (req.make_request () == -1 || req.error_code ()) - return 0; - - *from_master_ptr = req.from_master (); - *to_master_ptr = req.to_master (); - - return 1; -#endif -} - -void -fhandler_tty_slave::init (HANDLE, DWORD a, mode_t) -{ - int flags = 0; - - a &= GENERIC_READ | GENERIC_WRITE; - if (a == GENERIC_READ) - flags = O_RDONLY; - if (a == GENERIC_WRITE) - flags = O_WRONLY; - if (a == (GENERIC_READ | GENERIC_WRITE)) - flags = O_RDWR; - - open (flags); -} - -int -fhandler_tty_slave::write (const void *ptr, size_t len) -{ - DWORD n, towrite = len; - - termios_printf ("tty%d, write(%x, %d)", get_unit (), ptr, len); - - acquire_output_mutex (INFINITE); - - while (len) - { - n = min (OUT_BUFFER_SIZE, len); - char *buf = (char *)ptr; - ptr = (char *) ptr + n; - len -= n; - - /* Previous write may have set write_error to != 0. Check it here. - This is less than optimal, but the alternative slows down tty - writes enormously. */ - if (get_ttyp ()->write_error) - { - set_errno (get_ttyp ()->write_error); - towrite = (DWORD) -1; - break; - } - - if (WriteFile (get_output_handle (), buf, n, &n, NULL) == FALSE) - { - DWORD err = GetLastError (); - termios_printf ("WriteFile failed, %E"); - switch (err) - { - case ERROR_NO_DATA: - err = ERROR_IO_DEVICE; - default: - __seterrno_from_win_error (err); - } - raise (SIGHUP); /* FIXME: Should this be SIGTTOU? */ - towrite = (DWORD) -1; - break; - } - - if (output_done_event != NULL) - { - DWORD rc; - DWORD x = n * 1000; - rc = WaitForSingleObject (output_done_event, x); - termios_printf ("waited %d ms for output_done_event, WFSO %d", x, rc); - } - } - release_output_mutex (); - return towrite; -} - -void __stdcall -fhandler_tty_slave::read (void *ptr, size_t& len) -{ - int totalread = 0; - int vmin = 0; - int vtime = 0; /* Initialized to prevent -Wuninitialized warning */ - size_t readlen; - DWORD bytes_in_pipe; - char buf[INP_BUFFER_SIZE]; - char peek_buf[INP_BUFFER_SIZE]; - DWORD time_to_wait; - DWORD rc; - HANDLE w4[2]; - - termios_printf ("read(%x, %d) handle %p", ptr, len, get_handle ()); - - if (!ptr) /* Indicating tcflush(). */ - time_to_wait = 0; - else if ((get_ttyp ()->ti.c_lflag & ICANON)) - time_to_wait = INFINITE; - else - { - vmin = get_ttyp ()->ti.c_cc[VMIN]; - if (vmin > INP_BUFFER_SIZE) - vmin = INP_BUFFER_SIZE; - vtime = get_ttyp ()->ti.c_cc[VTIME]; - if (vmin < 0) - vmin = 0; - if (vtime < 0) - vtime = 0; - if (!vmin && !vtime) - time_to_wait = 0; - else - time_to_wait = !vtime ? INFINITE : 100 * vtime; - } - - w4[0] = signal_arrived; - w4[1] = input_available_event; - - DWORD waiter = time_to_wait; - while (len) - { - rc = WaitForMultipleObjects (2, w4, FALSE, waiter); - - if (rc == WAIT_TIMEOUT) - { - termios_printf ("wait timed out, waiter %u", waiter); - break; - } - - if (rc == WAIT_FAILED) - { - termios_printf ("wait for input event failed, %E"); - break; - } - - if (rc == WAIT_OBJECT_0) - { - /* if we've received signal after successfully reading some data, - just return all data successfully read */ - if (totalread > 0) - break; - set_sig_errno (EINTR); - len = (size_t) -1; - return; - } - - rc = WaitForSingleObject (input_mutex, 1000); - if (rc == WAIT_FAILED) - { - termios_printf ("wait for input mutex failed, %E"); - break; - } - else if (rc == WAIT_TIMEOUT) - { - termios_printf ("failed to acquire input mutex after input event arrived"); - break; - } - if (!PeekNamedPipe (get_handle (), peek_buf, sizeof (peek_buf), &bytes_in_pipe, NULL, NULL)) - { - termios_printf ("PeekNamedPipe failed, %E"); - raise (SIGHUP); - bytes_in_pipe = 0; - } - - /* On first peek determine no. of bytes to flush. */ - if (!ptr && len == UINT_MAX) - len = (size_t) bytes_in_pipe; - - if (ptr && !bytes_in_pipe && !vmin && !time_to_wait) - { - ReleaseMutex (input_mutex); - len = (size_t) bytes_in_pipe; - return; - } - - readlen = min (bytes_in_pipe, min (len, sizeof (buf))); - - if (ptr && vmin && readlen > (unsigned) vmin) - readlen = vmin; - - DWORD n = 0; - if (readlen) - { - termios_printf ("reading %d bytes (vtime %d)", readlen, vtime); - if (ReadFile (get_handle (), buf, readlen, &n, NULL) == FALSE) - { - termios_printf ("read failed, %E"); - raise (SIGHUP); - } - /* MSDN states that 5th prameter can be used to determine total - number of bytes in pipe, but for some reason this number doesn't - change after successful read. So we have to peek into the pipe - again to see if input is still available */ - if (!PeekNamedPipe (get_handle (), peek_buf, 1, &bytes_in_pipe, NULL, NULL)) - { - termios_printf ("PeekNamedPipe failed, %E"); - raise (SIGHUP); - bytes_in_pipe = 0; - } - if (n) - { - len -= n; - totalread += n; - if (ptr) - { - memcpy (ptr, buf, n); - ptr = (char *) ptr + n; - } - } - } - - if (!bytes_in_pipe) - ResetEvent (input_available_event); - - ReleaseMutex (input_mutex); - - if (!ptr) - { - if (!bytes_in_pipe) - break; - continue; - } - - if (get_ttyp ()->read_retval < 0) // read error - { - set_errno (-get_ttyp ()->read_retval); - totalread = -1; - break; - } - if (get_ttyp ()->read_retval == 0) //EOF - { - termios_printf ("saw EOF"); - break; - } - if (get_ttyp ()->ti.c_lflag & ICANON || is_nonblocking ()) - break; - if (vmin && totalread >= vmin) - break; - - /* vmin == 0 && vtime == 0: - * we've already read all input, if any, so return immediately - * vmin == 0 && vtime > 0: - * we've waited for input 10*vtime ms in WFSO(input_available_event), - * no matter whether any input arrived, we shouldn't wait any longer, - * so return immediately - * vmin > 0 && vtime == 0: - * here, totalread < vmin, so continue waiting until more data - * arrive - * vmin > 0 && vtime > 0: - * similar to the previous here, totalread < vmin, and timer - * hadn't expired -- WFSO(input_available_event) != WAIT_TIMEOUT, - * so "restart timer" and wait until more data arrive - */ - - if (vmin == 0) - break; - - if (n) - waiter = time_to_wait; - } - termios_printf ("%d=read(%x, %d)", totalread, ptr, len); - len = (size_t) totalread; -} - -int -fhandler_tty_slave::dup (fhandler_base *child) -{ - fhandler_tty_slave *arch = (fhandler_tty_slave *) archetype; - *(fhandler_tty_slave *) child = *arch; - child->usecount = 0; - arch->usecount++; - cygheap->manage_console_count ("fhandler_tty_slave::dup", 1); - report_tty_counts (child, "duped", ""); -#if 0 // CGF: Remove this again as it screws up expect - myself->set_ctty (get_ttyp (), openflags, arch); -#endif - return 0; -} - -int -fhandler_tty_common::dup (fhandler_base *child) -{ - fhandler_tty_slave *fts = (fhandler_tty_slave *) child; - int errind; - - fts->tcinit (get_ttyp ()); - - attach_tty (get_unit ()); - - HANDLE nh; - - if (output_done_event == NULL) - fts->output_done_event = NULL; - else if (!DuplicateHandle (hMainProc, output_done_event, hMainProc, - &fts->output_done_event, 0, 1, - DUPLICATE_SAME_ACCESS)) - { - errind = 1; - goto err; - } - if (ioctl_request_event == NULL) - fts->ioctl_request_event = NULL; - else if (!DuplicateHandle (hMainProc, ioctl_request_event, hMainProc, - &fts->ioctl_request_event, 0, 1, - DUPLICATE_SAME_ACCESS)) - { - errind = 2; - goto err; - } - if (ioctl_done_event == NULL) - fts->ioctl_done_event = NULL; - else if (!DuplicateHandle (hMainProc, ioctl_done_event, hMainProc, - &fts->ioctl_done_event, 0, 1, - DUPLICATE_SAME_ACCESS)) - { - errind = 3; - goto err; - } - if (!DuplicateHandle (hMainProc, input_available_event, hMainProc, - &fts->input_available_event, 0, 1, - DUPLICATE_SAME_ACCESS)) - { - errind = 4; - goto err; - } - if (!DuplicateHandle (hMainProc, output_mutex, hMainProc, - &fts->output_mutex, 0, 1, - DUPLICATE_SAME_ACCESS)) - { - errind = 5; - goto err; - } - if (!DuplicateHandle (hMainProc, input_mutex, hMainProc, - &fts->input_mutex, 0, 1, - DUPLICATE_SAME_ACCESS)) - { - errind = 6; - goto err; - } - if (!DuplicateHandle (hMainProc, get_handle (), hMainProc, - &nh, 0, 1, - DUPLICATE_SAME_ACCESS)) - { - errind = 7; - goto err; - } - fts->set_io_handle (nh); - - if (!DuplicateHandle (hMainProc, get_output_handle (), hMainProc, - &nh, 0, 1, - DUPLICATE_SAME_ACCESS)) - { - errind = 8; - goto err; - } - fts->set_output_handle (nh); - - if (inuse == NULL) - fts->inuse = NULL; - else if (!DuplicateHandle (hMainProc, inuse, hMainProc, - &fts->inuse, 0, 1, - DUPLICATE_SAME_ACCESS)) - { - errind = 9; - goto err; - } - - return 0; - -err: - __seterrno (); - termios_printf ("dup %d failed in DuplicateHandle, %E", errind); - return -1; -} - -int -fhandler_tty_slave::tcgetattr (struct termios *t) -{ - *t = get_ttyp ()->ti; - return 0; -} - -int -fhandler_tty_slave::tcsetattr (int, const struct termios *t) -{ - acquire_output_mutex (INFINITE); - get_ttyp ()->ti = *t; - release_output_mutex (); - return 0; -} - -int -fhandler_tty_slave::tcflush (int queue) -{ - int ret = 0; - - termios_printf ("tcflush(%d) handle %p", queue, get_handle ()); - - if (queue == TCIFLUSH || queue == TCIOFLUSH) - { - size_t len = UINT_MAX; - read (NULL, len); - ret = ((int) len) >= 0 ? 0 : -1; - } - if (queue == TCOFLUSH || queue == TCIOFLUSH) - { - /* do nothing for now. */ - } - - termios_printf ("%d=tcflush(%d)", ret, queue); - return ret; -} - -int -fhandler_tty_slave::ioctl (unsigned int cmd, void *arg) -{ - termios_printf ("ioctl (%x)", cmd); - - if (myself->pgid && get_ttyp ()->getpgid () != myself->pgid - && myself->ctty == get_unit () && (get_ttyp ()->ti.c_lflag & TOSTOP)) - { - /* background process */ - termios_printf ("bg ioctl pgid %d, tpgid %d, %s", myself->pgid, - get_ttyp ()->getpgid (), myctty ()); - raise (SIGTTOU); - } - - int retval; - switch (cmd) - { - case TIOCGWINSZ: - case TIOCSWINSZ: - case TIOCLINUX: - break; - case FIONBIO: - set_nonblocking (*(int *) arg); - retval = 0; - goto out; - default: - set_errno (EINVAL); - return -1; - } - - acquire_output_mutex (INFINITE); - - get_ttyp ()->cmd = cmd; - get_ttyp ()->ioctl_retval = 0; - switch (cmd) - { - case TIOCGWINSZ: - get_ttyp ()->arg.winsize = get_ttyp ()->winsize; - if (ioctl_request_event) - SetEvent (ioctl_request_event); - *(struct winsize *) arg = get_ttyp ()->arg.winsize; - if (ioctl_done_event) - WaitForSingleObject (ioctl_done_event, INFINITE); - get_ttyp ()->winsize = get_ttyp ()->arg.winsize; - break; - case TIOCSWINSZ: - if (get_ttyp ()->winsize.ws_row != ((struct winsize *) arg)->ws_row - || get_ttyp ()->winsize.ws_col != ((struct winsize *) arg)->ws_col) - { - get_ttyp ()->arg.winsize = *(struct winsize *) arg; - if (ioctl_request_event) - { - get_ttyp ()->ioctl_retval = -EINVAL; - SetEvent (ioctl_request_event); - } - else - { - get_ttyp ()->winsize = *(struct winsize *) arg; - killsys (-get_ttyp ()->getpgid (), SIGWINCH); - } - if (ioctl_done_event) - WaitForSingleObject (ioctl_done_event, INFINITE); - } - break; - case TIOCLINUX: - int val = *(unsigned char *) arg; - if (val != 6 || !ioctl_request_event || !ioctl_done_event) - get_ttyp ()->ioctl_retval = -EINVAL; - else - { - get_ttyp ()->arg.value = val; - SetEvent (ioctl_request_event); - WaitForSingleObject (ioctl_done_event, INFINITE); - *(unsigned char *) arg = get_ttyp ()->arg.value & 0xFF; - } - break; - } - - release_output_mutex (); - retval = get_ttyp ()->ioctl_retval; - if (retval < 0) - { - set_errno (-retval); - retval = -1; - } - -out: - termios_printf ("%d = ioctl (%x)", retval, cmd); - return retval; -} - -/******************************************************* - fhandler_pty_master -*/ -fhandler_pty_master::fhandler_pty_master () - : fhandler_tty_common () -{ -} - -int -fhandler_pty_master::open (int flags, mode_t) -{ - int ntty = cygwin_shared->tty.allocate_tty (false); - if (ntty < 0) - return 0; - - slave = *ttys_dev; - slave.setunit (ntty); - cygwin_shared->tty[ntty]->common_init (this); - ReleaseMutex (tty_mutex); // lock was set in allocate_tty - inuse = get_ttyp ()->create_inuse (TTY_MASTER_ALIVE); - set_flags ((flags & ~O_TEXT) | O_BINARY); - set_open_status (); - - termios_printf ("opened pty master tty%d", get_unit ()); - return 1; -} - -_off64_t -fhandler_tty_common::lseek (_off64_t, int) -{ - set_errno (ESPIPE); - return -1; -} - -int -fhandler_tty_common::close () -{ - termios_printf ("tty%d <%p,%p> closing", get_unit (), get_handle (), get_output_handle ()); - if (output_done_event && !CloseHandle (output_done_event)) - termios_printf ("CloseHandle (output_done_event), %E"); - if (ioctl_done_event && !CloseHandle (ioctl_done_event)) - termios_printf ("CloseHandle (ioctl_done_event), %E"); - if (ioctl_request_event && !CloseHandle (ioctl_request_event)) - termios_printf ("CloseHandle (ioctl_request_event), %E"); - if (inuse && !CloseHandle (inuse)) - termios_printf ("CloseHandle (inuse), %E"); - if (!ForceCloseHandle (input_mutex)) - termios_printf ("CloseHandle (input_mutex<%p>), %E", input_mutex); - if (!ForceCloseHandle (output_mutex)) - termios_printf ("CloseHandle (output_mutex<%p>), %E", output_mutex); - if (!ForceCloseHandle1 (get_handle (), from_pty)) - termios_printf ("CloseHandle (get_handle ()<%p>), %E", get_handle ()); - if (!ForceCloseHandle1 (get_output_handle (), to_pty)) - termios_printf ("CloseHandle (get_output_handle ()<%p>), %E", get_output_handle ()); - - /* Send EOF to slaves if master side is closed */ - if (!get_ttyp ()->master_alive ()) - { - termios_printf ("no more masters left. sending EOF"); - SetEvent (input_available_event); - } - - if (!ForceCloseHandle (input_available_event)) - termios_printf ("CloseHandle (input_available_event<%p>), %E", input_available_event); - - if (!hExeced) - { - inuse = NULL; - set_io_handle (NULL); - } - return 0; -} - -int -fhandler_pty_master::close () -{ -#if 0 - while (accept_input () > 0) - continue; -#endif - - if (get_ttyp ()->master_alive ()) - fhandler_tty_common::close (); - else - { - termios_printf ("freeing tty%d (%d)", get_unit (), get_ttyp ()->ntty); -#if 0 - if (get_ttyp ()->to_slave) - ForceCloseHandle1 (get_ttyp ()->to_slave, to_slave); - if (get_ttyp ()->from_slave) - ForceCloseHandle1 (get_ttyp ()->from_slave, from_slave); -#endif - if (get_ttyp ()->from_master) - CloseHandle (get_ttyp ()->from_master); - if (get_ttyp ()->to_master) - CloseHandle (get_ttyp ()->to_master); - - fhandler_tty_common::close (); - - if (!hExeced) - get_ttyp ()->init (); - } - - return 0; -} - -int -fhandler_pty_master::write (const void *ptr, size_t len) -{ - int i; - char *p = (char *) ptr; - termios ti = tc->ti; - - for (i = 0; i < (int) len; i++) - { - line_edit_status status = line_edit (p++, 1, ti); - if (status > line_edit_signalled) - { - if (status != line_edit_pipe_full) - i = -1; - break; - } - } - return i; -} - -void __stdcall -fhandler_pty_master::read (void *ptr, size_t& len) -{ - len = (size_t) process_slave_output ((char *) ptr, len, pktmode); -} - -int -fhandler_pty_master::tcgetattr (struct termios *t) -{ - *t = cygwin_shared->tty[get_unit ()]->ti; - return 0; -} - -int -fhandler_pty_master::tcsetattr (int, const struct termios *t) -{ - cygwin_shared->tty[get_unit ()]->ti = *t; - return 0; -} - -int -fhandler_pty_master::tcflush (int queue) -{ - int ret = 0; - - termios_printf ("tcflush(%d) handle %p", queue, get_handle ()); - - if (queue == TCIFLUSH || queue == TCIOFLUSH) - ret = process_slave_output (NULL, OUT_BUFFER_SIZE, 0); - else if (queue == TCIFLUSH || queue == TCIOFLUSH) - { - /* do nothing for now. */ - } - - termios_printf ("%d=tcflush(%d)", ret, queue); - return ret; -} - -int -fhandler_pty_master::ioctl (unsigned int cmd, void *arg) -{ - switch (cmd) - { - case TIOCPKT: - pktmode = *(int *) arg; - break; - case TIOCGWINSZ: - *(struct winsize *) arg = get_ttyp ()->winsize; - break; - case TIOCSWINSZ: - if (get_ttyp ()->winsize.ws_row != ((struct winsize *) arg)->ws_row - || get_ttyp ()->winsize.ws_col != ((struct winsize *) arg)->ws_col) - { - get_ttyp ()->winsize = *(struct winsize *) arg; - killsys (-get_ttyp ()->getpgid (), SIGWINCH); - } - break; - case FIONBIO: - set_nonblocking (*(int *) arg); - break; - default: - set_errno (EINVAL); - return -1; - } - return 0; -} - -char * -fhandler_pty_master::ptsname () -{ - static char buf[32]; - - __small_sprintf (buf, "/dev/tty%d", get_unit ()); - return buf; -} - -void -fhandler_tty_common::set_close_on_exec (bool val) -{ - if (archetype) - close_on_exec (val); - else - { - if (output_done_event) - set_no_inheritance (output_done_event, val); - if (ioctl_request_event) - set_no_inheritance (ioctl_request_event, val); - if (ioctl_done_event) - set_no_inheritance (ioctl_done_event, val); - if (inuse) - set_no_inheritance (inuse, val); - set_no_inheritance (output_mutex, val); - set_no_inheritance (input_mutex, val); - set_no_inheritance (input_available_event, val); - set_no_inheritance (output_handle, val); -#ifndef DEBUGGING - fhandler_base::set_close_on_exec (val); -#else - /* FIXME: This is a duplication from fhandler_base::set_close_on_exec. - It is here because we need to specify the "from_pty" stuff here or - we'll get warnings from ForceCloseHandle when debugging. */ - set_no_inheritance (get_io_handle (), val); - close_on_exec (val); -#endif - } -} - -void -fhandler_tty_slave::fixup_after_fork (HANDLE parent) -{ - // fhandler_tty_common::fixup_after_fork (parent); - report_tty_counts (this, "inherited", ""); -} - -void -fhandler_tty_common::fixup_after_fork (HANDLE parent) -{ - fhandler_termios::fixup_after_fork (parent); - if (output_done_event) - fork_fixup (parent, output_done_event, "output_done_event"); - if (ioctl_request_event) - fork_fixup (parent, ioctl_request_event, "ioctl_request_event"); - if (ioctl_done_event) - fork_fixup (parent, ioctl_done_event, "ioctl_done_event"); - if (output_mutex) - fork_fixup (parent, output_mutex, "output_mutex"); - if (input_mutex) - fork_fixup (parent, input_mutex, "input_mutex"); - if (input_available_event) - fork_fixup (parent, input_available_event, "input_available_event"); - fork_fixup (parent, inuse, "inuse"); -} - -void -fhandler_pty_master::set_close_on_exec (bool val) -{ - fhandler_tty_common::set_close_on_exec (val); - - /* FIXME: There is a console handle leak here. */ - if (get_ttyp ()->master_pid == GetCurrentProcessId ()) - { - get_ttyp ()->from_slave = get_handle (); - get_ttyp ()->to_slave = get_output_handle (); - termios_printf ("from_slave %p, to_slave %p", get_handle (), - get_output_handle ()); - } -} - -int -fhandler_tty_master::init_console () -{ - console = (fhandler_console *) build_fh_dev (*console_dev, "/dev/ttym"); - if (console == NULL) - return -1; - - console->init (INVALID_HANDLE_VALUE, GENERIC_READ | GENERIC_WRITE, O_BINARY); - cygheap->manage_console_count ("fhandler_tty_master::init_console", -1, true); - console->uninterruptible_io (true); - return 0; -} diff --git a/winsup/cygwin/fhandler_virtual.cc b/winsup/cygwin/fhandler_virtual.cc deleted file mode 100644 index 98620f4cc..000000000 --- a/winsup/cygwin/fhandler_virtual.cc +++ /dev/null @@ -1,263 +0,0 @@ -/* fhandler_virtual.cc: base fhandler class for virtual filesystems - - Copyright 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "shared_info.h" -#include "cygheap.h" -#include - -#include - -fhandler_virtual::fhandler_virtual (): - fhandler_base (), filebuf (NULL), bufalloc ((size_t) -1), - fileid (-1) -{ -} - -fhandler_virtual::~fhandler_virtual () -{ - if (filebuf) - { - cfree (filebuf); - filebuf = NULL; - } -} - -void -fhandler_virtual::fixup_after_exec () -{ -} - -DIR * -fhandler_virtual::opendir () -{ - DIR *dir; - DIR *res = NULL; - size_t len; - - if (exists () <= 0) - set_errno (ENOTDIR); - else if ((len = strlen (get_name ())) > CYG_MAX_PATH - 3) - set_errno (ENAMETOOLONG); - else if ((dir = (DIR *) malloc (sizeof (DIR))) == NULL) - set_errno (ENOMEM); - else if ((dir->__d_dirname = (char *) malloc (len + 3)) == NULL) - { - free (dir); - set_errno (ENOMEM); - } - else if ((dir->__d_dirent = - (struct dirent *) malloc (sizeof (struct dirent))) == NULL) - { - free (dir); - set_errno (ENOMEM); - } - else - { - strcpy (dir->__d_dirname, get_name ()); - dir->__d_dirent->__d_version = __DIRENT_VERSION; - cygheap_fdnew fd; - if (fd >= 0) - { - fd = this; - fd->nohandle (true); - dir->__d_fd = fd; - dir->__fh = this; - dir->__d_cookie = __DIRENT_COOKIE; - dir->__handle = INVALID_HANDLE_VALUE; - dir->__d_position = 0; - // dir->__d_dirhash = get_namehash (); - dir->__flags = dirent_saw_dot | dirent_saw_dot_dot; - res = dir; - res->__flags = 0; - } - } - - syscall_printf ("%p = opendir (%s)", res, get_name ()); - return res; -} - -_off64_t fhandler_virtual::telldir (DIR * dir) -{ - return dir->__d_position; -} - -void -fhandler_virtual::seekdir (DIR * dir, _off64_t loc) -{ - dir->__flags |= dirent_saw_dot | dirent_saw_dot_dot; - dir->__d_position = loc; -} - -void -fhandler_virtual::rewinddir (DIR * dir) -{ - dir->__d_position = 0; - dir->__flags |= dirent_saw_dot | dirent_saw_dot_dot; -} - -int -fhandler_virtual::closedir (DIR * dir) -{ - return 0; -} - -_off64_t -fhandler_virtual::lseek (_off64_t offset, int whence) -{ - /* - * On Linux, when you lseek within a /proc file, - * the contents of the file are updated. - */ - if (!fill_filebuf ()) - return (_off64_t) -1; - switch (whence) - { - case SEEK_SET: - position = offset; - break; - case SEEK_CUR: - position += offset; - break; - case SEEK_END: - position = filesize + offset; - break; - default: - set_errno (EINVAL); - return (_off64_t) -1; - } - return position; -} - -int -fhandler_virtual::dup (fhandler_base * child) -{ - int ret = fhandler_base::dup (child); - - if (!ret) - { - fhandler_virtual *fhproc_child = (fhandler_virtual *) child; - fhproc_child->filebuf = (char *) cmalloc (HEAP_BUF, filesize); - fhproc_child->bufalloc = fhproc_child->filesize = filesize; - fhproc_child->position = position; - memcpy (fhproc_child->filebuf, filebuf, filesize); - fhproc_child->set_flags (get_flags ()); - } - return ret; -} - -int -fhandler_virtual::close () -{ - if (!hExeced) - { - if (filebuf) - { - cfree (filebuf); - filebuf = NULL; - } - bufalloc = (size_t) -1; - } - return 0; -} - -void -fhandler_virtual::read (void *ptr, size_t& len) -{ - if (len == 0) - return; - if (openflags & O_DIROPEN) - { - set_errno (EISDIR); - len = (size_t) -1; - return; - } - if (!filebuf) - { - len = (size_t) 0; - return; - } - if ((ssize_t) len > filesize - position) - len = (size_t) (filesize - position); - if ((ssize_t) len < 0) - len = 0; - else - memcpy (ptr, filebuf + position, len); - position += len; -} - -int -fhandler_virtual::write (const void *ptr, size_t len) -{ - set_errno (EACCES); - return -1; -} - -/* low-level open for all proc files */ -int -fhandler_virtual::open (int flags, mode_t mode) -{ - rbinary (true); - wbinary (true); - - set_flags ((flags & ~O_TEXT) | O_BINARY); - - return 1; -} - -int -fhandler_virtual::exists () -{ - return 0; -} - -bool -fhandler_virtual::fill_filebuf () -{ - return true; -} - -int -fhandler_virtual::fchmod (mode_t mode) -{ - /* Same as on Linux. */ - set_errno (EPERM); - return -1; -} - -int -fhandler_virtual::fchown (__uid32_t uid, __gid32_t gid) -{ - /* Same as on Linux. */ - set_errno (EPERM); - return -1; -} - -int -fhandler_virtual::facl (int cmd, int nentries, __aclent32_t *aclbufp) -{ - int res = fhandler_base::facl (cmd, nentries, aclbufp); - if (res >= 0 && cmd == GETACL) - { - aclbufp[0].a_perm = (S_IRUSR | (pc.isdir () ? S_IXUSR : 0)) >> 6; - aclbufp[1].a_perm = (S_IRGRP | (pc.isdir () ? S_IXGRP : 0)) >> 3; - aclbufp[2].a_perm = S_IROTH | (pc.isdir () ? S_IXOTH : 0); - } - return res; -} diff --git a/winsup/cygwin/fhandler_windows.cc b/winsup/cygwin/fhandler_windows.cc deleted file mode 100644 index 8232450bb..000000000 --- a/winsup/cygwin/fhandler_windows.cc +++ /dev/null @@ -1,144 +0,0 @@ -/* fhandler_windows.cc: code to access windows message queues. - - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - - Written by Sergey S. Okhapkin (sos@prospect.com.ru). - Feedback and testing by Andy Piper (andyp@parallax.co.uk). - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" - -/* -The following unix-style calls are supported: - - open ("/dev/windows", flags, mode=0) - - create a unix fd for message queue. - O_NONBLOCK flag controls the read() call behavior. - - read (fd, buf, len) - - return next message from queue. buf must point to MSG - structure, len must be >= sizeof (MSG). If read is set to - non-blocking and the queue is empty, read call returns -1 - immediately with errno set to EAGAIN, otherwise it blocks - untill the message will be received. - - write (fd, buf, len) - - send a message pointed by buf. len argument ignored. - - ioctl (fd, command, *param) - - control read()/write() behavior. - ioctl (fd, WINDOWS_POST, NULL): write() will PostMessage(); - ioctl (fd, WINDOWS_SEND, NULL): write() will SendMessage(); - ioctl (fd, WINDOWS_HWND, &hWnd): read() messages for - hWnd window. - - select () call marks read fd when any message posted to queue. -*/ - -fhandler_windows::fhandler_windows () - : fhandler_base (), hWnd_ (NULL), method_ (WINDOWS_POST) -{ -} - -int -fhandler_windows::open (int flags, mode_t) -{ - set_flags ((flags & ~O_TEXT) | O_BINARY); - close_on_exec (true); - set_open_status (); - return 1; -} - -int -fhandler_windows::write (const void *buf, size_t) -{ - MSG *ptr = (MSG *) buf; - - if (method_ == WINDOWS_POST) - { - if (!PostMessage (ptr->hwnd, ptr->message, ptr->wParam, ptr->lParam)) - { - __seterrno (); - return -1; - } - else - return sizeof (MSG); - } - else - return SendMessage (ptr->hwnd, ptr->message, ptr->wParam, ptr->lParam); -} - -void __stdcall -fhandler_windows::read (void *buf, size_t& len) -{ - MSG *ptr = (MSG *) buf; - - if (len < sizeof (MSG)) - { - set_errno (EINVAL); - len = (size_t) -1; - return; - } - - len = (size_t) GetMessage (ptr, hWnd_, 0, 0); - - if ((ssize_t) len == -1) - __seterrno (); -} - -int -fhandler_windows::ioctl (unsigned int cmd, void *val) -{ - switch (cmd) - { - case WINDOWS_POST: - case WINDOWS_SEND: - method_ = cmd; - break; - case WINDOWS_HWND: - if (val == NULL) - { - set_errno (EINVAL); - return -1; - } - hWnd_ = * ((HWND *) val); - break; - default: - set_errno (EINVAL); - return -1; - } - return 0; -} - -void -fhandler_windows::set_close_on_exec (bool val) -{ - if (get_handle ()) - fhandler_base::set_close_on_exec (val); - else - fhandler_base::close_on_exec (val); - void *h = hWnd_; - if (h) - set_no_inheritance (h, val); -} - -void -fhandler_windows::fixup_after_fork (HANDLE parent) -{ - if (get_handle ()) - fhandler_base::fixup_after_fork (parent); - void *h = hWnd_; - if (h) - fork_fixup (parent, h, "hWnd_"); -} diff --git a/winsup/cygwin/fhandler_zero.cc b/winsup/cygwin/fhandler_zero.cc deleted file mode 100644 index a3e74a62c..000000000 --- a/winsup/cygwin/fhandler_zero.cc +++ /dev/null @@ -1,55 +0,0 @@ -/* fhandler_dev_zero.cc: code to access /dev/zero - - Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - - Written by DJ Delorie (dj@cygnus.com) - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include "security.h" -#include "cygerrno.h" -#include "path.h" -#include "fhandler.h" - -fhandler_dev_zero::fhandler_dev_zero () - : fhandler_base () -{ -} - -int -fhandler_dev_zero::open (int flags, mode_t) -{ - set_flags ((flags & ~O_TEXT) | O_BINARY); - nohandle (true); - set_open_status (); - return 1; -} - -int -fhandler_dev_zero::write (const void *, size_t len) -{ - if (get_device () == FH_FULL) - { - set_errno (ENOSPC); - return -1; - } - return len; -} - -void __stdcall -fhandler_dev_zero::read (void *ptr, size_t& len) -{ - memset (ptr, 0, len); -} - -_off64_t -fhandler_dev_zero::lseek (_off64_t, int) -{ - return 0; -} diff --git a/winsup/cygwin/flock.cc b/winsup/cygwin/flock.cc deleted file mode 100644 index b15962d94..000000000 --- a/winsup/cygwin/flock.cc +++ /dev/null @@ -1,89 +0,0 @@ -/* One of many ways to emulate flock() on top of real (good) POSIX locks. - * - * This flock() emulation is based upon source taken from the Red Hat - * implementation used in their imap-2002d SRPM. - * - * $RH: flock.c,v 1.2 2000/08/23 17:07:00 nalin Exp $ - */ -/* flock.c - - Copyright 2003 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include "winsup.h" -#include "cygerrno.h" -#include -#include -#include - -int -flock (int fd, int operation) -{ - int i, cmd; - struct __flock64 l = { 0, 0, 0, 0, 0 }; - if (operation & LOCK_NB) - { - cmd = F_SETLK; - } - else - { - cmd = F_SETLKW; - } - l.l_whence = SEEK_SET; - switch (operation & (~LOCK_NB)) - { - case LOCK_EX: - l.l_type = F_WRLCK; - i = fcntl_worker (fd, cmd, &l); - if (i == -1) - { - if ((get_errno () == EAGAIN) || (get_errno () == EACCES)) - { - set_errno (EWOULDBLOCK); - } - } - break; - case LOCK_SH: - l.l_type = F_RDLCK; - i = fcntl_worker (fd, cmd, &l); - if (i == -1) - { - if ((get_errno () == EAGAIN) || (get_errno () == EACCES)) - { - set_errno (EWOULDBLOCK); - } - } - break; - case LOCK_UN: - l.l_type = F_UNLCK; - i = fcntl_worker (fd, cmd, &l); - if (i == -1) - { - if ((get_errno () == EAGAIN) || (get_errno () == EACCES)) - { - set_errno (EWOULDBLOCK); - } - } - break; - default: - i = -1; - set_errno (EINVAL); - break; - } - return i; -} - -#ifdef FLOCK_EMULATE_IS_MAIN -int -main (int argc, char **argv) -{ - int fd = open (argv[1], O_WRONLY); - flock (fd, LOCK_EX); - return 0; -} -#endif diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc deleted file mode 100644 index 0360d1a52..000000000 --- a/winsup/cygwin/fork.cc +++ /dev/null @@ -1,711 +0,0 @@ -/* fork.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005 - Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "sigproc.h" -#include "pinfo.h" -#include "cygheap.h" -#include "child_info.h" -#include "cygtls.h" -#include "perprocess.h" -#include "dll_init.h" -#include "sync.h" -#include "shared_info.h" -#include "cygmalloc.h" -#include "cygthread.h" - -#define NPIDS_HELD 4 - -/* Timeout to wait for child to start, parent to init child, etc. */ -/* FIXME: Once things stabilize, bump up to a few minutes. */ -#define FORK_WAIT_TIMEOUT (300 * 1000) /* 300 seconds */ - -class frok -{ - dll *first_dll; - bool load_dlls; - child_info_fork ch; - const char *error; - int child_pid; - int this_errno; - int __stdcall parent (void *esp); - int __stdcall child (void *esp); - friend int fork (); -}; - -static void -resume_child (HANDLE forker_finished) -{ - SetEvent (forker_finished); - debug_printf ("signalled child"); - return; -} - -/* Notify parent that it is time for the next step. */ -static void __stdcall -sync_with_parent (const char *s, bool hang_self) -{ - debug_printf ("signalling parent: %s", s); - fork_info->ready (false); - if (hang_self) - { - HANDLE h = fork_info->forker_finished; - /* Wait for the parent to fill in our stack and heap. - Don't wait forever here. If our parent dies we don't want to clog - the system. If the wait fails, we really can't continue so exit. */ - DWORD psync_rc = WaitForSingleObject (h, FORK_WAIT_TIMEOUT); - debug_printf ("awake"); - switch (psync_rc) - { - case WAIT_TIMEOUT: - api_fatal ("WFSO timed out %s", s); - break; - case WAIT_FAILED: - if (GetLastError () == ERROR_INVALID_HANDLE && - WaitForSingleObject (fork_info->forker_finished, 1) != WAIT_FAILED) - break; - api_fatal ("WFSO failed %s, fork_finished %p, %E", s, - fork_info->forker_finished); - break; - default: - debug_printf ("no problems"); - break; - } - } -} - -int __stdcall -frok::child (void *) -{ - HANDLE& hParent = ch.parent; - extern void fixup_hooks_after_fork (); - extern void fixup_timers_after_fork (); - debug_printf ("child is running. pid %d, ppid %d, stack here %p", - myself->pid, myself->ppid, __builtin_frame_address (0)); - - sync_with_parent ("after longjmp", true); - sigproc_printf ("hParent %p, child 1 first_dll %p, load_dlls %d", hParent, - first_dll, load_dlls); - - /* If we've played with the stack, stacksize != 0. That means that - fork() was invoked from other than the main thread. Make sure that - the threadinfo information is properly set up. */ - if (fork_info->stacksize) - { - _main_tls = &_my_tls; - _main_tls->init_thread (NULL, NULL); - _main_tls->local_clib = *_impure_ptr; - _impure_ptr = &_main_tls->local_clib; - } - - if (wincap.has_security ()) - { - set_cygwin_privileges (hProcImpToken); - cygheap->user.reimpersonate (); - } - -#ifdef DEBUGGING - char c; - if (GetEnvironmentVariable ("FORKDEBUG", &c, 1)) - try_to_debug (); - char buf[80]; - /* This is useful for debugging fork problems. Use gdb to attach to - the pid reported here. */ - if (GetEnvironmentVariable ("CYGWIN_FORK_SLEEP", buf, sizeof (buf))) - { - small_printf ("Sleeping %d after fork, pid %u\n", atoi (buf), GetCurrentProcessId ()); - Sleep (atoi (buf)); - } -#endif - - set_file_api_mode (current_codepage); - - MALLOC_CHECK; - -#ifdef USE_SERVER - /* Incredible but true: If we use sockets and SYSV IPC shared memory, - there's a good chance that a duplicated socket in the child occupies - memory which is needed to duplicate shared memory from the parent - process, if the shared memory hasn't been duplicated already. - The same goes very likely for "normal" mmap shared memory, too, but - with SYSV IPC it was the first time observed. So, *never* fixup - fdtab before fixing up shared memory. */ - if (fixup_shms_after_fork ()) - api_fatal ("recreate_shm areas after fork failed"); -#endif - - MALLOC_CHECK; - - /* If we haven't dynamically loaded any dlls, just signal - the parent. Otherwise, load all the dlls, tell the parent - that we're done, and wait for the parent to fill in the. - loaded dlls' data/bss. */ - if (!load_dlls) - { - cygheap->fdtab.fixup_after_fork (hParent); - sync_with_parent ("performed fork fixup", false); - } - else - { - dlls.load_after_fork (hParent, first_dll); - cygheap->fdtab.fixup_after_fork (hParent); - sync_with_parent ("loaded dlls", true); - } - - init_console_handler (myself->ctty >= 0); - ForceCloseHandle1 (fork_info->forker_finished, forker_finished); - - pthread::atforkchild (); - fixup_timers_after_fork (); - cygbench ("fork-child"); - ld_preload (); - fixup_hooks_after_fork (); - _my_tls.fixup_after_fork (); - cygwin_finished_initializing = true; - return 0; -} - -#define NO_SLOW_PID_REUSE -#ifndef NO_SLOW_PID_REUSE -static void -slow_pid_reuse (HANDLE h) -{ - static NO_COPY HANDLE last_fork_procs[NPIDS_HELD]; - static NO_COPY unsigned nfork_procs; - - if (nfork_procs >= (sizeof (last_fork_procs) / sizeof (last_fork_procs [0]))) - nfork_procs = 0; - /* Keep a list of handles to child processes sitting around to prevent - Windows from reusing the same pid n times in a row. Having the same pids - close in succesion confuses bash. Keeping a handle open will stop - windows from reusing the same pid. */ - if (last_fork_procs[nfork_procs]) - ForceCloseHandle1 (last_fork_procs[nfork_procs], fork_stupidity); - if (DuplicateHandle (hMainProc, h, hMainProc, &last_fork_procs[nfork_procs], - 0, FALSE, DUPLICATE_SAME_ACCESS)) - ProtectHandle1 (last_fork_procs[nfork_procs], fork_stupidity); - else - { - last_fork_procs[nfork_procs] = NULL; - system_printf ("couldn't create last_fork_proc, %E"); - } - nfork_procs++; -} -#endif - -int __stdcall -frok::parent (void *stack_here) -{ - HANDLE forker_finished; - DWORD rc; - child_pid = -1; - error = NULL; - this_errno = 0; - bool fix_impersonation = false; - pinfo child; - static char errbuf[256]; - - pthread::atforkprepare (); - - int c_flags = GetPriorityClass (hMainProc); - debug_printf ("priority class %d", c_flags); - - /* If we don't have a console, then don't create a console for the - child either. */ - HANDLE console_handle = CreateFile ("CONOUT$", GENERIC_WRITE, - FILE_SHARE_WRITE, &sec_none_nih, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, - NULL); - - if (console_handle != INVALID_HANDLE_VALUE) - CloseHandle (console_handle); - else - c_flags |= DETACHED_PROCESS; - - /* Some file types (currently only sockets) need extra effort in the - parent after CreateProcess and before copying the datastructures - to the child. So we have to start the child in suspend state, - unfortunately, to avoid a race condition. */ - if (cygheap->fdtab.need_fixup_before ()) - c_flags |= CREATE_SUSPENDED; - - /* Remember the address of the first loaded dll and decide - if we need to load dlls. We do this here so that this - information will be available in the parent and, when - the stack is copied, in the child. */ - first_dll = dlls.start.next; - load_dlls = dlls.reload_on_fork && dlls.loaded_dlls; - - /* This will help some of the confusion. */ - fflush (stdout); - - forker_finished = CreateEvent (&sec_all, FALSE, FALSE, NULL); - if (forker_finished == NULL) - { - this_errno = geterrno_from_win_error (); - error = "unable to allocate forker_finished event"; - return -1; - } - - ProtectHandleINH (forker_finished); - - ch.forker_finished = forker_finished; - - ch.stackbottom = _tlsbase; - ch.stacktop = stack_here; - ch.stacksize = (char *) ch.stackbottom - (char *) stack_here; - debug_printf ("stack - bottom %p, top %p, size %d", - ch.stackbottom, ch.stacktop, ch.stacksize); - - PROCESS_INFORMATION pi; - STARTUPINFO si; - - memset (&si, 0, sizeof (si)); - si.cb = sizeof (STARTUPINFO); - si.lpReserved2 = (LPBYTE) &ch; - si.cbReserved2 = sizeof (ch); - - /* Remove impersonation */ - cygheap->user.deimpersonate (); - fix_impersonation = true; - - syscall_printf ("CreateProcess (%s, %s, 0, 0, 1, %p, 0, 0, %p, %p)", - myself->progname, myself->progname, c_flags, &si, &pi); - bool locked = __malloc_lock (); - time_t start_time; - while (1) - { - start_time = time (NULL); - rc = CreateProcess (myself->progname, /* image to run */ - myself->progname, /* what we send in arg0 */ - &sec_none_nih, - &sec_none_nih, - TRUE, /* inherit handles from parent */ - c_flags, - NULL, /* environment filled in later */ - 0, /* use current drive/directory */ - &si, - &pi); - - if (!rc) - { - this_errno = geterrno_from_win_error (); - error = "CreateProcessA failed"; - memset (&pi, 0, sizeof (pi)); - goto cleanup; - } - - /* Fixup the parent datastructure if needed and resume the child's - main thread. */ - if (c_flags & CREATE_SUSPENDED) - { - cygheap->fdtab.fixup_before_fork (pi.dwProcessId); - ResumeThread (pi.hThread); - } - - CloseHandle (pi.hThread); - - /* Protect the handle but name it similarly to the way it will - be called in subproc handling. */ - ProtectHandle1 (pi.hProcess, childhProc); - - strace.write_childpid (ch, pi.dwProcessId); - - /* Wait for subproc to initialize itself. */ - if (!ch.sync (pi.dwProcessId, pi.hProcess, FORK_WAIT_TIMEOUT)) - { - DWORD exit_code = ch.proc_retry (pi.hProcess); - if (!exit_code) - continue; - this_errno = EAGAIN; - /* Not thread safe, but do we care? */ - __small_sprintf (errbuf, "died waiting for longjmp before initialization, " - "retry %d, exit code %p", ch.retry, exit_code); - error = errbuf; - goto cleanup; - } - break; - } - - child_pid = cygwin_pid (pi.dwProcessId); - child.init (child_pid, 1, NULL); - - if (!child) - { - this_errno = get_errno () == ENOMEM ? ENOMEM : EAGAIN; -#ifdef DEBUGGING - error = "pinfo failed"; -#else - syscall_printf ("pinfo failed"); -#endif - goto cleanup; - } - - child->start_time = start_time; /* Register child's starting time. */ - child->nice = myself->nice; - - /* Initialize things that are done later in dll_crt0_1 that aren't done - for the forkee. */ - strcpy (child->progname, myself->progname); - - /* Restore impersonation */ - cygheap->user.reimpersonate (); - fix_impersonation = false; - - /* Fill in fields in the child's process table entry. */ - child->dwProcessId = pi.dwProcessId; - child.hProcess = pi.hProcess; - - /* Hopefully, this will succeed. The alternative to doing things this - way is to reserve space prior to calling CreateProcess and then fill - it in afterwards. This requires more bookkeeping than I like, though, - so we'll just do it the easy way. So, terminate any child process if - we can't actually record the pid in the internal table. */ - if (!child.remember (false)) - { - TerminateProcess (pi.hProcess, 1); - this_errno = EAGAIN; -#ifdef DEBUGGING0 - error = "child.remember failed"; -#endif - goto cleanup; - } - -#ifndef NO_SLOW_PID_REUSE - slow_pid_reuse (pi.hProcess); -#endif - - /* CHILD IS STOPPED */ - debug_printf ("child is alive (but stopped)"); - - /* Initialize, in order: data, bss, heap, stack, dll data, dll bss - Note: variables marked as NO_COPY will not be copied - since they are placed in a protected segment. */ - - - MALLOC_CHECK; - const void *impure_beg; - const void *impure_end; - const char *impure; - if (&_my_tls == _main_tls) - impure_beg = impure_end = impure = NULL; - else - { - impure = "impure"; - impure_beg = _impure_ptr; - impure_end = _impure_ptr + 1; - } - rc = child_copy (pi.hProcess, true, - "stack", stack_here, ch.stackbottom, - impure, impure_beg, impure_end, - NULL); - - __malloc_unlock (); - locked = false; - MALLOC_CHECK; - if (!rc) - { - this_errno = get_errno (); - DWORD exit_code; - if (!GetExitCodeProcess (pi.hProcess, &exit_code)) - exit_code = 0xdeadbeef; - __small_sprintf (errbuf, "pid %u, exitval %p", pi.dwProcessId, exit_code); - error = errbuf; - goto cleanup; - } - - /* Now fill data/bss of any DLLs that were linked into the program. */ - for (dll *d = dlls.istart (DLL_LINK); d; d = dlls.inext ()) - { - debug_printf ("copying data/bss of a linked dll"); - if (!child_copy (pi.hProcess, true, - "linked dll data", d->p.data_start, d->p.data_end, - "linked dll bss", d->p.bss_start, d->p.bss_end, - NULL)) - { - this_errno = get_errno (); -#ifdef DEBUGGING - DWORD exit_code; - if (!GetExitCodeProcess (pi.hProcess, &exit_code)) - exit_code = 0xdeadbeef; - __small_sprintf (errbuf, "pid %u, exitval %p", pi.dwProcessId, exit_code); - error = errbuf; -#endif - goto cleanup; - } - } - - /* Start thread, and then wait for it to reload dlls. */ - resume_child (forker_finished); - if (!ch.sync (child->pid, pi.hProcess, FORK_WAIT_TIMEOUT)) - { - this_errno = EAGAIN; - error = "died waiting for dll loading"; - goto cleanup; - } - - /* If DLLs were loaded in the parent, then the child has reloaded all - of them and is now waiting to have all of the individual data and - bss sections filled in. */ - if (load_dlls) - { - /* CHILD IS STOPPED */ - /* write memory of reloaded dlls */ - for (dll *d = dlls.istart (DLL_LOAD); d; d = dlls.inext ()) - { - debug_printf ("copying data/bss for a loaded dll"); - if (!child_copy (pi.hProcess, true, - "loaded dll data", d->p.data_start, d->p.data_end, - "loaded dll bss", d->p.bss_start, d->p.bss_end, - NULL)) - { - this_errno = get_errno (); -#ifdef DEBUGGING - error = "copying data/bss for a loaded dll"; -#endif - goto cleanup; - } - } - /* Start the child up again. */ - resume_child (forker_finished); - } - - ForceCloseHandle (forker_finished); - forker_finished = NULL; - pthread::atforkparent (); - - return child_pid; - -/* Common cleanup code for failure cases */ -cleanup: - if (fix_impersonation) - cygheap->user.reimpersonate (); - if (locked) - __malloc_unlock (); - - /* Remember to de-allocate the fd table. */ - if (pi.hProcess && !child.hProcess) - ForceCloseHandle1 (pi.hProcess, childhProc); - if (forker_finished) - ForceCloseHandle (forker_finished); - debug_printf ("returning -1"); - return -1; -} - -extern "C" int -fork () -{ - frok grouped; - MALLOC_CHECK; - - debug_printf ("entering"); - grouped.first_dll = NULL; - grouped.load_dlls = 0; - - int res; - int ischild; - - myself->set_has_pgid_children (); - - if (grouped.ch.parent == NULL) - return -1; - if (grouped.ch.subproc_ready == NULL) - { - system_printf ("unable to allocate subproc_ready event, %E"); - return -1; - } - - if (sig_send (NULL, __SIGHOLD)) - { - if (exit_state) - Sleep (INFINITE); - set_errno (EAGAIN); - return -1; - } - - ischild = setjmp (grouped.ch.jmp); - - void *esp; - __asm__ volatile ("movl %%esp,%0": "=r" (esp)); - - if (!ischild) - res = grouped.parent (esp); - else - res = grouped.child (esp); - - MALLOC_CHECK; - if (ischild || res > 0) - /* everything is ok */; - else - { - if (!grouped.error) - syscall_printf ("fork failed - child pid %d, errno %d", grouped.child_pid, grouped.this_errno); - else - { - char buf[strlen (grouped.error) + sizeof ("child %d - , errno 4294967295 ")]; - strcpy (buf, "child %d - "); - strcat (buf, grouped.error); - strcat (buf, ", errno %d"); - system_printf (buf, grouped.child_pid, grouped.this_errno); - } - - set_errno (grouped.this_errno); - } - sig_send (NULL, __SIGNOHOLD); - syscall_printf ("%d = fork()", res); - return res; -} -#ifdef DEBUGGING -void -fork_init () -{ -} -#endif /*DEBUGGING*/ - -#ifdef NEWVFORK -/* Dummy function to force second assignment below to actually be - carried out */ -static vfork_save * -get_vfork_val () -{ - return vfork_storage.val (); -} -#endif - -extern "C" int -vfork () -{ -#ifndef NEWVFORK - debug_printf ("stub called"); - return fork (); -#else - vfork_save *vf = get_vfork_val (); - char **esp, **pp; - - if (vf == NULL) - vf = vfork_storage.create (); - else if (vf->pid) - return fork (); - - // FIXME the tls stuff could introduce a signal race if a child process - // exits quickly. - if (!setjmp (vf->j)) - { - vf->pid = -1; - __asm__ volatile ("movl %%esp,%0": "=r" (vf->vfork_esp):); - __asm__ volatile ("movl %%ebp,%0": "=r" (vf->vfork_ebp):); - for (pp = (char **) vf->frame, esp = vf->vfork_esp; - esp <= vf->vfork_ebp + 2; pp++, esp++) - *pp = *esp; - vf->ctty = myself->ctty; - vf->sid = myself->sid; - vf->pgid = myself->pgid; - cygheap->ctty_on_hold = cygheap->ctty; - vf->console_count = cygheap->console_count; - debug_printf ("cygheap->ctty_on_hold %p, cygheap->console_count %d", cygheap->ctty_on_hold, cygheap->console_count); - int res = cygheap->fdtab.vfork_child_dup () ? 0 : -1; - debug_printf ("%d = vfork()", res); - _my_tls.call_signal_handler (); // FIXME: racy - vf->tls = _my_tls; - return res; - } - - vf = get_vfork_val (); - - for (pp = (char **) vf->frame, esp = vf->vfork_esp; - esp <= vf->vfork_ebp + 2; pp++, esp++) - *esp = *pp; - - cygheap->fdtab.vfork_parent_restore (); - - myself->ctty = vf->ctty; - myself->sid = vf->sid; - myself->pgid = vf->pgid; - termios_printf ("cygheap->ctty %p, cygheap->ctty_on_hold %p", cygheap->ctty, cygheap->ctty_on_hold); - cygheap->console_count = vf->console_count; - - if (vf->pid < 0) - { - int exitval = vf->exitval; - vf->pid = 0; - if ((vf->pid = fork ()) == 0) - exit (exitval); - } - - int pid = vf->pid; - vf->pid = 0; - debug_printf ("exiting vfork, pid %d", pid); - sig_dispatch_pending (); - - _my_tls.call_signal_handler (); // FIXME: racy - _my_tls = vf->tls; - return pid; -#endif -} - -/* Copy memory from one process to another. */ - -bool -child_copy (HANDLE hp, bool write, ...) -{ - va_list args; - va_start (args, write); - static const char *huh[] = {"read", "write"}; - - char *what; - while ((what = va_arg (args, char *))) - { - char *low = va_arg (args, char *); - char *high = va_arg (args, char *); - DWORD todo = wincap.chunksize () ?: high - low; - char *here; - - for (here = low; here < high; here += todo) - { - DWORD done = 0; - if (here + todo > high) - todo = high - here; - int res; - if (write) - res = WriteProcessMemory (hp, here, here, todo, &done); - else - res = ReadProcessMemory (hp, here, here, todo, &done); - debug_printf ("%s - hp %p low %p, high %p, res %d", what, hp, low, high, res); - if (!res || todo != done) - { - if (!res) - __seterrno (); - /* If this happens then there is a bug in our fork - implementation somewhere. */ - system_printf ("%s %s copy failed, %p..%p, done %d, windows pid %u, %E", - what, huh[write], low, high, done); - goto err; - } - } - } - - debug_printf ("done"); - return true; - - err: - TerminateProcess (hp, 1); - set_errno (EAGAIN); - return false; -} diff --git a/winsup/cygwin/gcrt0.c b/winsup/cygwin/gcrt0.c deleted file mode 100644 index 19a941676..000000000 --- a/winsup/cygwin/gcrt0.c +++ /dev/null @@ -1,41 +0,0 @@ -/* gcrt0.c - - Copyright 1998, 1999, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include -#include - -extern u_char etext asm ("etext"); -extern u_char eprol asm ("__eprol"); -extern void _mcleanup (void); -extern void monstartup (u_long, u_long); - -void _monstartup (void) __attribute__((__constructor__)); - -/* startup initialization for -pg support */ - -void -_monstartup (void) -{ - static int called; - - /* Guard against multiple calls that may happen if DLLs are linked - with profile option set as well. Addede side benefit is that it - makes profiling backward compatible (GCC used to emit a call to - _monstartup when compiling main with profiling enabled). */ - if (called++) - return; - - monstartup ((u_long) &eprol, (u_long) &etext); - atexit (&_mcleanup); -} - -asm (".text"); -asm ("__eprol:"); - diff --git a/winsup/cygwin/gendef b/winsup/cygwin/gendef deleted file mode 100755 index b31d71b3a..000000000 --- a/winsup/cygwin/gendef +++ /dev/null @@ -1,451 +0,0 @@ -#!/usr/bin/perl -# Copyright 2003, 2004, 2005, 2006 Red Hat, Inc. -# -# This file is part of Cygwin. -# -# This software is a copyrighted work licensed under the terms of the -# Cygwin license. Please consult the file "CYGWIN_LICENSE" for -# details. -# -use strict; -sub nocr(@); -my $in = shift; -my $tls_offsets = shift; -my $out = shift; -my $sigfe = shift; - -$main::first = 0; -if (!defined($in) || !defined($out) || !defined($sigfe)) { - die "usage: $0 deffile.in cygtls.h deffile.def sigfe.s\n"; -} - -require $tls_offsets; - -open(IN, $in) or die "$0: couldn't open \"$in\" - $!\n"; -my @top = (); -while () { - push(@top, nocr $_); - last if /^\s*exports\s*$/i; -} -my $libline = nocr scalar(); -my @in = nocr ; -close(IN); - -my %sigfe = (); -my @data = (); -my @nosigfuncs = (); -my @out = (); -for (@in) { - /\sDATA$/o and do { - push(@data, $_); - next; - }; - chomp; - if (/=/o) { - if (s/\s+NOSIGFE\s*$//) { - # nothing - } elsif (s/ SIGFE(_MAYBE)?$//) { - my $func = (split(' '))[2]; - my $maybe = lc $1 . '_'; - $sigfe{$func} = '_sigfe' . $maybe . $func; - } - } else { - my ($func, $sigfe) = m%^\s*(\S+)(?:\s+((?:NO)?SIGFE(?:_MAYBE)?))?$%o; - if (defined($sigfe) && $sigfe =~ /^NO/o) { - $_ = $func; - } else { - $sigfe ||= 'sigfe'; - $_ = '_' . lc($sigfe) . '_' . $func; - $sigfe{$func} = $_; - $_ = $func . ' = ' . $_; - } - } - s/(\S)\s+(\S)/$1 $2/go; - s/(\S)\s+$/$1/o; - s/^\s+(\S)/$1/o; - push(@out, $_ . "\n"); -} - -for (@out) { - my ($alias, $func) = /^(\S+) = (\S+)\s*$/o; - $_ = $alias . ' = ' . $sigfe{$func} . "\n" - if defined($func) && $sigfe{$func}; -} -open(OUT, '>', $out) or die "$0: couldn't open \"$out\" - $!\n"; -print OUT @top, @data, @out; -close OUT; - -open(SIGFE, '>', $sigfe) or die "$0: couldn't open sigfe file \"$sigfe\" - $!\n"; - -for my $k (sort keys %sigfe) { - print SIGFE fefunc($k, $sigfe{$k}); -} -close SIGFE; - -sub fefunc { - my $func = '_' . shift; - my $fe = '_' . shift; - my $sigfe_func = ($fe =~ /^(.*)$func/)[0]; - my $extra; - my $res = <) { - if (/%storage_here/) { - $storage_ix = @lines; - } elsif (/^"([^"]+)",\s*(.*)$/o) { - push(@patterns, [$1, $2]); - next; - } - if (@patterns) { - for my $f (sort devsort @patterns) { - my $x = $f->[0]; - my $rest = $f->[1]; - my ($dev, $devrest) = ($x =~ /([^%]+)(%.*)?$/o); - push(@lines, generate($dev, $devrest, $rest, [])); - } - @patterns = (); - } - push(@lines, $_); -} - -close INPUT; -# @storage = sort devsort @storage; -chop $storage[$#storage]; -chop $storage[$#storage]; -$storage[$#storage] .= "\n"; -splice(@lines, $storage_ix, 1, - "static const device dev_storage[] =\n", "{\n", - @storage, "};\n\n", - sort {$a cmp $b} values %pointers); -open(SHILKA, '>', $shilka); -print SHILKA @lines; -close SHILKA; - -chdir '/tmp'; -system qw'shilka -length -strip -no-definitions', $shilka; -if ($? == -1) { - die "$0: shilka command missing? - $!\n"; -} else { - exit $? if $?; -} -chdir $cwd; -unlink $shilka; -open(C, $c) or die "$0: couldn't open $c - $!\n"; -@lines = ; -close C; -unlink $c; -splice(@lines, 0, 3); -my $ign_until_brace = 0; -for (my $i = 0; $i < @lines; $i++) { - $_ = $lines[$i]; - $ign_until_brace = 1 if /(?:KR_reset|KR_output_statistics).*\)\s*$/o; - if ($ign_until_brace || /(?:#\s*line|(?:KR_reset|KR_output_statistics).*;)/) { - $ign_until_brace = 0 if $ign_until_brace && /}/o; - splice(@lines, $i, 1); - redo; - }; -} -open(OUTPUT, '>', $output) or do {{ - if (chmod(0664, $output)) { - open(OUTPUT, '>', $output); - last; - } - die "$0: couldn't open $output - $!\n"; -}}; -print OUTPUT @lines; -close OUTPUT; - -sub generate { - my $dev = shift; - my $devrest = shift; - my $rest = shift; - my $vars = shift; - my $res; - my @lines = (); - if ($devrest) { - my ($a, $low, $high, $fmt, $b) = ($devrest =~ /%([\({])([^-]+)-([^\)}]+)[\)}](.)(.*)/o); - my ($middle, $devrest0) = ($b =~ /^([^%]*)(%.*)?$/); - $fmt = "%$fmt"; - my $vars_ix = @{$vars}; - for my $f ($low .. $high) { - $vars->[$vars_ix] = $f; - $#{$vars} = $vars_ix; - my $dev0 = $dev . sprintf($fmt, $f) . $middle; - push(@lines, generate($dev0, $devrest0, $rest, $vars)); - } - } else { - my $fh = $dev; - $fh =~ s%/%_%og; - my $shilka_id = $fh; - my $storage_str = $fh . '_storage'; - $fh =~ s/^_dev_/FH_/o; - $fh = uc $fh; - $shilka_id =~ s/^_dev_//o; - $storage_str =~ s/^_dev/dev/o; - my $storage_loc = "dev_storage + " . @storage; - @lines = ('"' . $dev . '"' . " = $shilka_id {return $storage_loc;}\n"); - $rest = "$fh, $rest" if $rest =~ /^"/o; - $rest = fixup($rest, $vars); - if ($rest =~ /^(.*), ([a-z_]*_dev)/) { - $pointers{$2} ||= "const device *$2 = $storage_loc;\n"; - $rest = $1; - } - push(@storage, " {\"$dev\", " . $rest . "},\n"); - } - return @lines; -} - -sub fixup { - my $rest = shift; - my $vars = shift; - 0 while $rest =~ s/{([^}]*)}/evalit($1, $vars)/eg; - return $rest; -} - -sub evalit { - my $what = shift; - my $vars = shift; - $what =~ s/\$(\d+)/'$vars->[$1-1]'/g; - my $res = eval $what; - return $res; -} - -sub devsort { - my $a0 = $a->[0]; - my $b0 = $b->[0]; - $a0 =~ s/(\D)(\d+)/"$1" . sprintf "%05d", $2/e; - $b0 =~ s/(\D)(\d+)/"$1" . sprintf "%05d", $2/e; - return $a0 cmp $b0; -} diff --git a/winsup/cygwin/gentls_offsets b/winsup/cygwin/gentls_offsets deleted file mode 100755 index 21c9d1e7a..000000000 --- a/winsup/cygwin/gentls_offsets +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/perl -s -# Copyright 2003, 2004, 2005 Red Hat, Inc. -# -# This file is part of Cygwin. -# -# This software is a copyrighted work licensed under the terms of the -# Cygwin license. Please consult the file "CYGWIN_LICENSE" for -# details. -# -my $tls = shift; -my $tls_out = shift; -open(TLS, $tls) or die "$0: couldn't open tls file \"$tls\" - $!\n"; -my $struct = ''; -my @fields = (); -my $def = ''; -$tls = join('', ); -$tls =~ s/\n[^\n]*gentls_offsets[^\n]*\n(.+)\Z/$1/os; -my $pre = $`; -substr($tls, 0, length($pre)) = ''; -$pre =~ s/\n#ifndef _[^\n]+\n/\n/os; -$pre .= "\n//*/"; -$tls =~ s%/\*\s*gentls_offsets.*?/\*\s*gentls_offsets\s*\*/%%ogs; -foreach ($tls =~ /^.*\n/mg) { - $def .= $_ if $struct; - last if /^};/o; - /^\s*typedef/o and do { - $def .= $_ ; - next; - }; - if (!s/;.*$//o) { - if (!$struct && /^\s*(?:struct|class)\s*([a-z_0-9]+)/o) { - $def .= $_; - $struct = $1 - } - next; - } - s/(?:\[[^\]]*\]|struct|class)//o; - s/^\s+\S+\s+//o; - s/[\*\s()]+//go; - for my $f (split(/,/)) { - push(@fields, $f); - } -} -close TLS; -open(TMP, '>', "/tmp/$$.cc") or die "$0: couldn't open temporary index file \"/tmp/$$.c\" - $!\n"; -print TMP < -#include -#include -#include -$pre -$def -int -main(int argc, char **argv) -{ - $struct foo[1]; -# define foo_end ((char *) (foo + 1)) -# define offset(f) (((char *) &(foo->f)) - foo_end) -# define poffset(f) (((char *) &(foo->f)) - ((char *) foo)) -EOF - print TMP 'puts ("//;# autogenerated: Do not edit.\n");', "\n\n"; - print TMP "printf (\"//; \$tls::sizeof_$struct = %d;\\n\", sizeof($struct\));\n"; - for my $f (@fields) { - print TMP ' printf ("//; $tls::', $f, ' = %d;\n", ', "offset($f));\n"; - print TMP ' printf ("//; $tls::p', $f, ' = %d;\n", ', "poffset($f));\n"; - } - print TMP ' puts ("//; __DATA__\n");', "\n"; - for my $f (@fields) { - print TMP ' printf ("#define tls_', $f, ' (%d)\n", ', "offset($f));\n"; - print TMP ' printf ("#define tls_p', $f, ' (%d)\n", ', "poffset($f));\n"; - } - - print TMP <', $tls_out) or die "$0: couldn't open tls index file \"$tls_out\" - $!\n"; -open(OFFS, "/tmp/$$.a.out|") or die "$0: couldn't run \"/tmp/$$.a.out\" - $!\n"; -print TLS_OUT ; -close OFFS; -close TLS_OUT; -unlink "/tmp/$$.cc", "/tmp/$$.a.out"; -exit(0); diff --git a/winsup/cygwin/glob.c b/winsup/cygwin/glob.c deleted file mode 100644 index 08eecbe93..000000000 --- a/winsup/cygwin/glob.c +++ /dev/null @@ -1,949 +0,0 @@ -/* $NetBSD: __glob13.c,v 1.1.2.1 1997/10/22 06:41:27 thorpej Exp $ */ - -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Guido van Rossum. - * - * 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. - */ - -#include - -/* - * glob(3) -- a superset of the one defined in POSIX 1003.2. - * - * The [!...] convention to negate a range is supported (SysV, Posix, ksh). - * - * Optional extra services, controlled by flags not defined by POSIX: - * - * GLOB_QUOTE: - * Escaping convention: \ inhibits any special meaning the following - * character might have (except \ at end of string is retained). - * GLOB_MAGCHAR: - * Set in gl_flags if pattern contained a globbing character. - * GLOB_NOMAGIC: - * Same as GLOB_NOCHECK, but it will only append pattern if it did - * not contain any magic characters. [Used in csh style globbing] - * GLOB_ALTDIRFUNC: - * Use alternately specified directory access functions. - * GLOB_TILDE: - * expand ~user/foo to the /home/dir/of/user/foo - * GLOB_BRACE: - * expand {1,2}{a,b} to 1a 1b 2a 2b - * gl_matchc: - * Number of matches in the current invocation of glob. - */ - -#include "winsup.h" - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "perprocess.h" -#include "cygwin/version.h" - -#ifndef ARG_MAX -#define ARG_MAX 32000 /* See CreateProcess */ -#endif - -#ifdef __weak_alias -#ifdef __LIBC12_SOURCE__ -__weak_alias(glob,_glob); -__weak_alias(globfree,_globfree); -#else -#error "XXX THESE ARE NOT RIGHT!" -__weak_alias(__glob13,___glob13); -__weak_alias(__globfree13,___globfree13); -#endif /* __LIBC12_SOURCE__ */ -#endif /* __weak_alias */ - -#ifdef __LIBC12_SOURCE__ -#define STAT stat12 -#else -#define STAT __stat64 -#endif - -#define DOLLAR '$' -#define DOT '.' -#define EOS '\0' -#define LBRACKET '[' -#define NOT '!' -#define QUESTION '?' -#define QUOTE '\\' -#define RANGE '-' -#define RBRACKET ']' -#define SEP '/' -#define STAR '*' -#define TILDE '~' -#define UNDERSCORE '_' -#define LBRACE '{' -#define RBRACE '}' -#define SLASH '/' -#define COMMA ',' - -#ifndef DEBUG - -#define M_QUOTE 0x8000 -#define M_PROTECT 0x4000 -#define M_MASK 0xffff -#define M_ASCII 0x00ff - -typedef u_short Char; - -#else - -#define M_QUOTE 0x80 -#define M_PROTECT 0x40 -#define M_MASK 0xff -#define M_ASCII 0x7f - -typedef char Char; - -#endif - - -#define CHAR(c) ((Char)((c)&M_ASCII)) -#define META(c) ((Char)((c)|M_QUOTE)) -#define M_ALL META('*') -#define M_END META(']') -#define M_NOT META('!') -#define M_ONE META('?') -#define M_RNG META('-') -#define M_SET META('[') -#define ismeta(c) (((c)&M_QUOTE) != 0) - - -static int compare __P((const void *, const void *)); -static void g_Ctoc __P((const Char *, char *)); -static int g_lstat __P((Char *, struct STAT *, glob_t *)); -static DIR *g_opendir __P((Char *, glob_t *)); -static Char *g_strchr __P((Char *, int)); -#ifdef notdef -static Char *g_strcat __P((Char *, const Char *)); -#endif -static int g_stat __P((Char *, struct STAT *, glob_t *)); -static int glob0 __P((const Char *, glob_t *)); -static int glob1 __P((Char *, glob_t *, size_t *)); -static int glob2 __P((Char *, Char *, Char *, glob_t *, size_t *)); -static int glob3 __P((Char *, Char *, Char *, Char *, glob_t *, size_t *)); -static int globextend __P((const Char *, glob_t *, size_t *)); -static const Char * globtilde __P((const Char *, Char *, glob_t *)); -static int globexp1 __P((const Char *, glob_t *)); -static int globexp2 __P((const Char *, const Char *, glob_t *, int *)); -static int match __P((Char *, Char *, Char *)); -#ifdef DEBUG -static void qprintf __P((const char *, Char *)); -#endif - -#undef MAXPATHLEN -#define MAXPATHLEN 16384 - -extern BOOL ignore_case_with_glob; - -int -glob(pattern, flags, errfunc, pglob) - const char *pattern; - int flags, (*errfunc) __P((const char *, int)); - glob_t *pglob; -{ - const u_char *patnext; - int c; - Char *bufnext, *bufend, patbuf[MAXPATHLEN+1]; - - patnext = (u_char *) pattern; - if (!(flags & GLOB_APPEND)) { - pglob->gl_pathc = 0; - pglob->gl_pathv = NULL; - if (!(flags & GLOB_DOOFFS)) - pglob->gl_offs = 0; - } - pglob->gl_flags = flags & ~GLOB_MAGCHAR; - pglob->gl_errfunc = errfunc; - pglob->gl_matchc = 0; - - bufnext = patbuf; - bufend = bufnext + MAXPATHLEN; - if (flags & GLOB_QUOTE) { - /* Protect the quoted characters. */ - while (bufnext < bufend && (c = *patnext++) != EOS) - if (c == QUOTE) { - if ((c = *patnext++) == EOS) { - c = QUOTE; - --patnext; - } - *bufnext++ = c | M_PROTECT; - } - else - *bufnext++ = c; - } - else - while (bufnext < bufend && (c = *patnext++) != EOS) - *bufnext++ = c; - *bufnext = EOS; - - if (flags & GLOB_BRACE) - return globexp1(patbuf, pglob); - else - return glob0(patbuf, pglob); -} - -/* - * Expand recursively a glob {} pattern. When there is no more expansion - * invoke the standard globbing routine to glob the rest of the magic - * characters - */ -static int globexp1(pattern, pglob) - const Char *pattern; - glob_t *pglob; -{ - const Char* ptr = pattern; - int rv; - - /* Protect a single {}, for find(1), like csh */ - if (pattern[0] == LBRACE && pattern[1] == RBRACE && pattern[2] == EOS) - return glob0(pattern, pglob); - - while ((ptr = (const Char *) g_strchr((Char *) ptr, LBRACE)) != NULL) - if (!globexp2(ptr, pattern, pglob, &rv)) - return rv; - - return glob0(pattern, pglob); -} - - -/* - * Recursive brace globbing helper. Tries to expand a single brace. - * If it succeeds then it invokes globexp1 with the new pattern. - * If it fails then it tries to glob the rest of the pattern and returns. - */ -static int globexp2(ptr, pattern, pglob, rv) - const Char *ptr, *pattern; - glob_t *pglob; - int *rv; -{ - int i; - Char *lm, *ls; - const Char *pe, *pm, *pl; - Char patbuf[MAXPATHLEN + 1]; - - /* copy part up to the brace */ - for (lm = patbuf, pm = pattern; pm != ptr; *lm++ = *pm++) - continue; - ls = lm; - - /* Find the balanced brace */ - for (i = 0, pe = ++ptr; *pe; pe++) - if (*pe == LBRACKET) { - /* Ignore everything between [] */ - for (pm = pe++; *pe != RBRACKET && *pe != EOS; pe++) - continue; - if (*pe == EOS) { - /* - * We could not find a matching RBRACKET. - * Ignore and just look for RBRACE - */ - pe = pm; - } - } - else if (*pe == LBRACE) - i++; - else if (*pe == RBRACE) { - if (i == 0) - break; - i--; - } - - /* Non matching braces; just glob the pattern */ - if (i != 0 || *pe == EOS) { - *rv = glob0(patbuf, pglob); - return 0; - } - - for (i = 0, pl = pm = ptr; pm <= pe; pm++) - switch (*pm) { - case LBRACKET: - /* Ignore everything between [] */ - for (pl = pm++; *pm != RBRACKET && *pm != EOS; pm++) - continue; - if (*pm == EOS) { - /* - * We could not find a matching RBRACKET. - * Ignore and just look for RBRACE - */ - pm = pl; - } - break; - - case LBRACE: - i++; - break; - - case RBRACE: - if (i) { - i--; - break; - } - /* FALLTHROUGH */ - case COMMA: - if (i && *pm == COMMA) - break; - else { - /* Append the current string */ - for (lm = ls; (pl < pm); *lm++ = *pl++) - continue; - /* - * Append the rest of the pattern after the - * closing brace - */ - for (pl = pe + 1; (*lm++ = *pl++) != EOS;) - continue; - - /* Expand the current pattern */ -#ifdef DEBUG - qprintf("globexp2:", patbuf); -#endif - *rv = globexp1(patbuf, pglob); - - /* move after the comma, to the next string */ - pl = pm + 1; - } - break; - - default: - break; - } - *rv = 0; - return 0; -} - - - -/* - * expand tilde from the passwd file. - */ -static const Char * -globtilde(pattern, patbuf, pglob) - const Char *pattern; - Char *patbuf; - glob_t *pglob; -{ - struct passwd *pwd; - char *h; - const Char *p; - Char *b; - - if (*pattern != TILDE || !(pglob->gl_flags & GLOB_TILDE)) - return pattern; - - /* Copy up to the end of the string or / */ - for (p = pattern + 1, h = (char *) patbuf; *p && *p != SLASH; - *h++ = *p++) - continue; - - *h = EOS; - - if (((char *) patbuf)[0] == EOS) { - /* - * handle a plain ~ or ~/ by expanding $HOME - * first and then trying the password file - */ - if ((h = getenv("HOME")) == NULL) { - if ((pwd = getpwuid32(getuid32())) == NULL) - return pattern; - else - h = pwd->pw_dir; - } - } - else { - /* - * Expand a ~user - */ - if ((pwd = getpwnam((char*) patbuf)) == NULL) - return pattern; - else - h = pwd->pw_dir; - } - - /* Copy the home directory */ - for (b = patbuf; *h; *b++ = *h++) - continue; - - /* Append the rest of the pattern */ - while ((*b++ = *p++) != EOS) - continue; - - return patbuf; -} - - -/* - * The main glob() routine: compiles the pattern (optionally processing - * quotes), calls glob1() to do the real pattern matching, and finally - * sorts the list (unless unsorted operation is requested). Returns 0 - * if things went well, nonzero if errors occurred. It is not an error - * to find no matches. - */ -static int -glob0(pattern, pglob) - const Char *pattern; - glob_t *pglob; -{ - const Char *qpatnext; - int c, err, oldpathc; - Char *bufnext, patbuf[MAXPATHLEN+1]; - size_t limit = 0; - - qpatnext = globtilde(pattern, patbuf, pglob); - oldpathc = pglob->gl_pathc; - bufnext = patbuf; - - /* We don't need to check for buffer overflow any more. */ - while ((c = *qpatnext++) != EOS) { - switch (c) { - case LBRACKET: - c = *qpatnext; - if (c == NOT) - ++qpatnext; - if (*qpatnext == EOS || - g_strchr((Char *) qpatnext+1, RBRACKET) == NULL) { - *bufnext++ = LBRACKET; - if (c == NOT) - --qpatnext; - break; - } - *bufnext++ = M_SET; - if (c == NOT) - *bufnext++ = M_NOT; - c = *qpatnext++; - do { - *bufnext++ = CHAR(c); - if (*qpatnext == RANGE && - (c = qpatnext[1]) != RBRACKET) { - *bufnext++ = M_RNG; - *bufnext++ = CHAR(c); - qpatnext += 2; - } - } while ((c = *qpatnext++) != RBRACKET); - pglob->gl_flags |= GLOB_MAGCHAR; - *bufnext++ = M_END; - break; - case QUESTION: - pglob->gl_flags |= GLOB_MAGCHAR; - *bufnext++ = M_ONE; - break; - case STAR: - pglob->gl_flags |= GLOB_MAGCHAR; - /* collapse adjacent stars to one, - * to avoid exponential behavior - */ - if (bufnext == patbuf || bufnext[-1] != M_ALL) - *bufnext++ = M_ALL; - break; - default: - *bufnext++ = CHAR(c); - break; - } - } - *bufnext = EOS; -#ifdef DEBUG - qprintf("glob0:", patbuf); -#endif - - if ((err = glob1(patbuf, pglob, &limit)) != 0) - return(err); - - /* - * If there was no match we are going to append the pattern - * if GLOB_NOCHECK was specified or if GLOB_NOMAGIC was specified - * and the pattern did not contain any magic characters - * GLOB_NOMAGIC is there just for compatibility with csh. - */ - if (pglob->gl_pathc == oldpathc && - ((pglob->gl_flags & GLOB_NOCHECK) || - ((pglob->gl_flags & GLOB_NOMAGIC) && - !(pglob->gl_flags & GLOB_MAGCHAR)))) - return(globextend(pattern, pglob, &limit)); - else if (!(pglob->gl_flags & GLOB_NOSORT)) - qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc, - pglob->gl_pathc - oldpathc, sizeof(char *), compare); - return(0); -} - -static int -compare(p, q) - const void *p, *q; -{ - return(strcmp(*(char **)p, *(char **)q)); -} - -static int -glob1(pattern, pglob, limit) - Char *pattern; - glob_t *pglob; - size_t *limit; -{ - Char pathbuf[MAXPATHLEN+1]; - - /* A null pathname is invalid -- POSIX 1003.1 sect. 2.4. */ - if (*pattern == EOS) - return(0); - return(glob2(pathbuf, pathbuf, pattern, pglob, limit)); -} - -/* - * The functions glob2 and glob3 are mutually recursive; there is one level - * of recursion for each segment in the pattern that contains one or more - * meta characters. - */ -static int -glob2(pathbuf, pathend, pattern, pglob, limit) - Char *pathbuf, *pathend, *pattern; - glob_t *pglob; - size_t *limit; -{ - struct STAT sb; - Char *p, *q; - int anymeta; - - /* - * Loop over pattern segments until end of pattern or until - * segment with meta character found. - */ - for (anymeta = 0;;) { - if (*pattern == EOS) { /* End of pattern? */ - *pathend = EOS; - if (g_lstat(pathbuf, &sb, pglob)) - return(0); - - if (((pglob->gl_flags & GLOB_MARK) && - pathend[-1] != SEP) && (S_ISDIR(sb.st_mode) - || (S_ISLNK(sb.st_mode) && - (g_stat(pathbuf, &sb, pglob) == 0) && - S_ISDIR(sb.st_mode)))) { - *pathend++ = SEP; - *pathend = EOS; - } - ++pglob->gl_matchc; - return(globextend(pathbuf, pglob, limit)); - } - - /* Find end of next segment, copy tentatively to pathend. */ - q = pathend; - p = pattern; - while (*p != EOS && *p != SEP) { - if (ismeta(*p)) - anymeta = 1; - *q++ = *p++; - } - - if (!anymeta) { /* No expansion, do next segment. */ - pathend = q; - pattern = p; - while (*pattern == SEP) - *pathend++ = *pattern++; - } else /* Need expansion, recurse. */ - return(glob3(pathbuf, pathend, pattern, p, pglob, - limit)); - } - /* NOTREACHED */ -} - -static int -glob3(pathbuf, pathend, pattern, restpattern, pglob, limit) - Char *pathbuf, *pathend, *pattern, *restpattern; - glob_t *pglob; - size_t *limit; -{ - register struct dirent *dp; - DIR *dirp; - int err; - char buf[MAXPATHLEN]; - - /* - * The readdirfunc declaration can't be prototyped, because it is - * assigned, below, to two functions which are prototyped in glob.h - * and dirent.h as taking pointers to differently typed opaque - * structures. - */ - struct dirent *(*readdirfunc) __P((void *)); - - *pathend = EOS; - errno = 0; - - if ((dirp = g_opendir(pathbuf, pglob)) == NULL) { - /* TODO: don't call for ENOENT or ENOTDIR? */ - if (pglob->gl_errfunc) { - g_Ctoc(pathbuf, buf); - if (pglob->gl_errfunc(buf, errno) || - pglob->gl_flags & GLOB_ERR) - return (GLOB_ABEND); - } - return(0); - } - - err = 0; - - /* Search directory for matching names. */ - if (pglob->gl_flags & GLOB_ALTDIRFUNC) - readdirfunc = pglob->gl_readdir; - else - readdirfunc = (struct dirent *(*)__P((void *))) readdir; - while ((dp = (*readdirfunc)(dirp))) { - register u_char *sc; - register Char *dc; - - /* Initial DOT must be matched literally. */ - if (dp->d_name[0] == DOT && *pattern != DOT) - continue; - for (sc = (u_char *) dp->d_name, dc = pathend; - (*dc++ = *sc++) != EOS;) - continue; - if (!match(pathend, pattern, restpattern)) { - *pathend = EOS; - continue; - } - err = glob2(pathbuf, --dc, restpattern, pglob, limit); - if (err) - break; - } - - if (pglob->gl_flags & GLOB_ALTDIRFUNC) - (*pglob->gl_closedir)(dirp); - else - closedir(dirp); - return(err); -} - - -/* - * Extend the gl_pathv member of a glob_t structure to accommodate a new item, - * add the new item, and update gl_pathc. - * - * This assumes the BSD realloc, which only copies the block when its size - * crosses a power-of-two boundary; for v7 realloc, this would cause quadratic - * behavior. - * - * Return 0 if new item added, error code if memory couldn't be allocated. - * - * Invariant of the glob_t structure: - * Either gl_pathc is zero and gl_pathv is NULL; or gl_pathc > 0 and - * gl_pathv points to (gl_offs + gl_pathc + 1) items. - */ -static int -globextend(path, pglob, limit) - const Char *path; - glob_t *pglob; - size_t *limit; -{ - register char **pathv; - register int i; - size_t newsize, len; - char *copy; - const Char *p; - - newsize = sizeof(*pathv) * (2 + pglob->gl_pathc + pglob->gl_offs); - pathv = pglob->gl_pathv ? - realloc((char *)pglob->gl_pathv, newsize) : - malloc(newsize); - if (pathv == NULL) - return(GLOB_NOSPACE); - - if (pglob->gl_pathv == NULL && pglob->gl_offs > 0) { - /* first time around -- clear initial gl_offs items */ - pathv += pglob->gl_offs; - for (i = pglob->gl_offs; --i >= 0;) - *--pathv = NULL; - } - pglob->gl_pathv = pathv; - - for (p = path; *p++;) - continue; - len = (size_t)(p - path); - *limit += len; - if ((copy = malloc(len)) != NULL) { - g_Ctoc(path, copy); - pathv[pglob->gl_offs + pglob->gl_pathc++] = copy; - } - pathv[pglob->gl_offs + pglob->gl_pathc] = NULL; - - if ((pglob->gl_flags & GLOB_LIMIT) && (newsize + *limit) >= ARG_MAX) { - errno = 0; - return(GLOB_NOSPACE); - } - - return(copy == NULL ? GLOB_NOSPACE : 0); -} - - -/* - * pattern matching function for filenames. Each occurrence of the * - * pattern causes a recursion level. - */ -static int -match(name, pat, patend) - register Char *name, *pat, *patend; -{ - int ok, negate_range; - Char c, k; - - while (pat < patend) { - c = *pat++; - switch (c & M_MASK) { - case M_ALL: - if (pat == patend) - return(1); - do - if (match(name, pat, patend)) - return(1); - while (*name++ != EOS); - return(0); - case M_ONE: - if (*name++ == EOS) - return(0); - break; - case M_SET: - ok = 0; - if ((k = *name++) == EOS) - return(0); - if ((negate_range = ((*pat & M_MASK) == M_NOT)) != EOS) - ++pat; - if (ignore_case_with_glob) - { - while (((c = *pat++) & M_MASK) != M_END) - if ((*pat & M_MASK) == M_RNG) { - if (tolower(c) <= tolower(k) && tolower(k) <= tolower(pat[1])) - ok = 1; - pat += 2; - } else if (tolower(c) == tolower(k)) - ok = 1; - } - else - { - while (((c = *pat++) & M_MASK) != M_END) - if ((*pat & M_MASK) == M_RNG) { - if (c <= k && k <= pat[1]) - ok = 1; - pat += 2; - } else if (c == k) - ok = 1; - } - if (ok == negate_range) - return(0); - break; - default: - if (ignore_case_with_glob) - { - if (tolower(*name) != tolower(c)) - return(0); - ++name; - } - else - { - if (*name++ != c) - return(0); - } - break; - } - } - return(*name == EOS); -} - -/* Free allocated data belonging to a glob_t structure. */ -void -globfree(pglob) - glob_t *pglob; -{ - register int i; - register char **pp; - - if (pglob->gl_pathv != NULL) { - pp = pglob->gl_pathv + pglob->gl_offs; - for (i = pglob->gl_pathc; i--; ++pp) - if (*pp) - free(*pp); - free(pglob->gl_pathv); - } -} - -static DIR * -g_opendir(str, pglob) - register Char *str; - glob_t *pglob; -{ - char buf[MAXPATHLEN]; - - if (!*str) - strcpy(buf, "."); - else - g_Ctoc(str, buf); - - if (pglob->gl_flags & GLOB_ALTDIRFUNC) - return((*pglob->gl_opendir)(buf)); - - return(opendir(buf)); -} - -static void -stat32_to_STAT (struct __stat32 *src, struct STAT *dst) -{ - dst->st_dev = src->st_dev; - dst->st_ino = src->st_ino; - dst->st_mode = src->st_mode; - dst->st_nlink = src->st_nlink; - dst->st_uid = src->st_uid; - dst->st_gid = src->st_gid; - dst->st_rdev = src->st_rdev; - dst->st_size = src->st_size; - dst->st_atim = src->st_atim; - dst->st_mtim = src->st_mtim; - dst->st_ctim = src->st_ctim; - dst->st_blksize = src->st_blksize; - dst->st_blocks = src->st_blocks; -} - -static int -g_lstat(fn, sb, pglob) - register Char *fn; - struct STAT *sb; - glob_t *pglob; -{ - char buf[MAXPATHLEN]; - - g_Ctoc(fn, buf); - if (pglob->gl_flags & GLOB_ALTDIRFUNC) { - struct __stat32 lsb; - int ret; - - if (CYGWIN_VERSION_CHECK_FOR_USING_BIG_TYPES) - ret = (*pglob->gl_lstat)(buf, &sb); - else if (!(ret = (*pglob->gl_lstat)(buf, &lsb))) - stat32_to_STAT (&lsb, sb); - return ret; - } - return(lstat64(buf, sb)); -} - -static int -g_stat(fn, sb, pglob) - register Char *fn; - struct STAT *sb; - glob_t *pglob; -{ - char buf[MAXPATHLEN]; - - g_Ctoc(fn, buf); - if (pglob->gl_flags & GLOB_ALTDIRFUNC) { - struct __stat32 lsb; - int ret; - - if (CYGWIN_VERSION_CHECK_FOR_USING_BIG_TYPES) - ret = (*pglob->gl_stat)(buf, &sb); - if (!(ret = (*pglob->gl_stat)(buf, &lsb))) - stat32_to_STAT (&lsb, sb); - return ret; - } - return(stat64(buf, sb)); -} - -static Char * -g_strchr(str, ch) - Char *str; - int ch; -{ - do { - if (*str == ch) - return (str); - } while (*str++); - return (NULL); -} - -#ifdef notdef -static Char * -g_strcat(dst, src) - Char *dst; - const Char* src; -{ - Char *sdst = dst; - - while (*dst++) - continue; - --dst; - while((*dst++ = *src++) != EOS) - continue; - - return (sdst); -} -#endif - -static void -g_Ctoc(str, buf) - register const Char *str; - char *buf; -{ - register char *dc; - - for (dc = buf; (*dc++ = *str++) != EOS;) - continue; -} - -#ifdef DEBUG -static void -qprintf(str, s) - const char *str; - register Char *s; -{ - register Char *p; - - (void)printf("%s:\n", str); - for (p = s; *p; p++) - (void)printf("%c", CHAR(*p)); - (void)printf("\n"); - for (p = s; *p; p++) - (void)printf("%c", *p & M_PROTECT ? '"' : ' '); - (void)printf("\n"); - for (p = s; *p; p++) - (void)printf("%c", ismeta(*p) ? '_' : ' '); - (void)printf("\n"); -} -#endif diff --git a/winsup/cygwin/gmon.c b/winsup/cygwin/gmon.c deleted file mode 100644 index 048ef0df1..000000000 --- a/winsup/cygwin/gmon.c +++ /dev/null @@ -1,285 +0,0 @@ -/*- - * Copyright (c) 1983, 1992, 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. - */ - -#if !defined(lint) && defined(LIBC_SCCS) -static char rcsid[] = "$OpenBSD: gmon.c,v 1.8 1997/07/23 21:11:27 kstailey Exp $"; -#endif - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -/* XXX needed? */ -//extern char *minbrk __asm ("minbrk"); - -struct gmonparam _gmonparam = { GMON_PROF_OFF }; - -static int s_scale; -/* see profil(2) where this is describe (incorrectly) */ -#define SCALE_1_TO_1 0x10000L - -#define ERR(s) write(2, s, sizeof(s)) - -void moncontrol __P((int)); - -static void * -fake_sbrk(int size) -{ - void *rv = malloc(size); - if (rv) - return rv; - else - return (void *) -1; -} - -void -monstartup(lowpc, highpc) - u_long lowpc; - u_long highpc; -{ - register int o; - char *cp; - struct gmonparam *p = &_gmonparam; - - /* - * round lowpc and highpc to multiples of the density we're using - * so the rest of the scaling (here and in gprof) stays in ints. - */ - p->lowpc = ROUNDDOWN(lowpc, HISTFRACTION * sizeof(HISTCOUNTER)); - p->highpc = ROUNDUP(highpc, HISTFRACTION * sizeof(HISTCOUNTER)); - p->textsize = p->highpc - p->lowpc; - p->kcountsize = p->textsize / HISTFRACTION; - p->hashfraction = HASHFRACTION; - p->fromssize = p->textsize / p->hashfraction; - p->tolimit = p->textsize * ARCDENSITY / 100; - if (p->tolimit < MINARCS) - p->tolimit = MINARCS; - else if (p->tolimit > MAXARCS) - p->tolimit = MAXARCS; - p->tossize = p->tolimit * sizeof(struct tostruct); - - cp = fake_sbrk(p->kcountsize + p->fromssize + p->tossize); - if (cp == (char *)-1) { - ERR("monstartup: out of memory\n"); - return; - } -#ifdef notdef - bzero(cp, p->kcountsize + p->fromssize + p->tossize); -#endif - p->tos = (struct tostruct *)cp; - cp += p->tossize; - p->kcount = (u_short *)cp; - cp += p->kcountsize; - p->froms = (u_short *)cp; - - /* XXX minbrk needed? */ - //minbrk = fake_sbrk(0); - p->tos[0].link = 0; - - o = p->highpc - p->lowpc; - if (p->kcountsize < o) { -#ifndef notdef - s_scale = ((float)p->kcountsize / o ) * SCALE_1_TO_1; -#else /* avoid floating point */ - int quot = o / p->kcountsize; - - if (quot >= 0x10000) - s_scale = 1; - else if (quot >= 0x100) - s_scale = 0x10000 / quot; - else if (o >= 0x800000) - s_scale = 0x1000000 / (o / (p->kcountsize >> 8)); - else - s_scale = 0x1000000 / ((o << 8) / p->kcountsize); -#endif - } else - s_scale = SCALE_1_TO_1; - - moncontrol(1); -} - -void -_mcleanup() -{ - int fd; - int hz; - int fromindex; - int endfrom; - u_long frompc; - int toindex; - struct rawarc rawarc; - struct gmonparam *p = &_gmonparam; - struct gmonhdr gmonhdr, *hdr; - char *proffile; -#ifdef DEBUG - int log, len; - char dbuf[200]; -#endif - - if (p->state == GMON_PROF_ERROR) - ERR("_mcleanup: tos overflow\n"); - - hz = PROF_HZ; - moncontrol(0); - -#ifdef nope - if ((profdir = getenv("PROFDIR")) != NULL) { - extern char *__progname; - char *s, *t, *limit; - pid_t pid; - long divisor; - - /* If PROFDIR contains a null value, no profiling - output is produced */ - if (*profdir == '\0') { - return; - } - - limit = buf + sizeof buf - 1 - 10 - 1 - - strlen(__progname) - 1; - t = buf; - s = profdir; - while((*t = *s) != '\0' && t < limit) { - t++; - s++; - } - *t++ = '/'; - - /* - * Copy and convert pid from a pid_t to a string. For - * best performance, divisor should be initialized to - * the largest power of 10 less than PID_MAX. - */ - pid = getpid(); - divisor=10000; - while (divisor > pid) divisor /= 10; /* skip leading zeros */ - do { - *t++ = (pid/divisor) + '0'; - pid %= divisor; - } while (divisor /= 10); - *t++ = '.'; - - s = __progname; - while ((*t++ = *s++) != '\0') - ; - - proffile = buf; - } else { - proffile = "gmon.out"; - } -#else - { - char gmon_out[] = "gmon.out"; - proffile = gmon_out; - } -#endif - - fd = open(proffile , O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0666); - if (fd < 0) { - perror( proffile ); - return; - } -#ifdef DEBUG - log = open("gmon.log", O_CREAT|O_TRUNC|O_WRONLY, 0664); - if (log < 0) { - perror("mcount: gmon.log"); - return; - } - len = sprintf(dbuf, "[mcleanup1] kcount 0x%x ssiz %d\n", - p->kcount, p->kcountsize); - write(log, dbuf, len); -#endif - hdr = (struct gmonhdr *)&gmonhdr; - hdr->lpc = p->lowpc; - hdr->hpc = p->highpc; - hdr->ncnt = p->kcountsize + sizeof(gmonhdr); - hdr->version = GMONVERSION; - hdr->profrate = hz; - write(fd, (char *)hdr, sizeof *hdr); - write(fd, p->kcount, p->kcountsize); - endfrom = p->fromssize / sizeof(*p->froms); - for (fromindex = 0; fromindex < endfrom; fromindex++) { - if (p->froms[fromindex] == 0) - continue; - - frompc = p->lowpc; - frompc += fromindex * p->hashfraction * sizeof(*p->froms); - for (toindex = p->froms[fromindex]; toindex != 0; - toindex = p->tos[toindex].link) { -#ifdef DEBUG - len = sprintf(dbuf, - "[mcleanup2] frompc 0x%x selfpc 0x%x count %d\n" , - frompc, p->tos[toindex].selfpc, - p->tos[toindex].count); - write(log, dbuf, len); -#endif - rawarc.raw_frompc = frompc; - rawarc.raw_selfpc = p->tos[toindex].selfpc; - rawarc.raw_count = p->tos[toindex].count; - write(fd, &rawarc, sizeof rawarc); - } - } - close(fd); -} - -/* - * Control profiling - * profiling is what mcount checks to see if - * all the data structures are ready. - */ -void -moncontrol(mode) - int mode; -{ - struct gmonparam *p = &_gmonparam; - - if (mode) { - /* start */ - profil((char *)p->kcount, p->kcountsize, p->lowpc, - s_scale); - p->state = GMON_PROF_ON; - } else { - /* stop */ - profil((char *)0, 0, 0, 0); - p->state = GMON_PROF_OFF; - } -} - - diff --git a/winsup/cygwin/gmon.h b/winsup/cygwin/gmon.h deleted file mode 100644 index be016791e..000000000 --- a/winsup/cygwin/gmon.h +++ /dev/null @@ -1,166 +0,0 @@ -/* $OpenBSD: gmon.h,v 1.3 1996/04/21 22:31:46 deraadt Exp $ */ -/* $NetBSD: gmon.h,v 1.5 1996/04/09 20:55:30 cgd Exp $ */ - -/*- - * Copyright (c) 1982, 1986, 1992, 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. - * - * @(#)gmon.h 8.2 (Berkeley) 1/4/94 - */ - -#ifndef _SYS_GMON_H_ -#define _SYS_GMON_H_ - -#ifndef __P -#define __P(x) x -#endif - -#include - -/* - * Structure prepended to gmon.out profiling data file. - */ -struct gmonhdr { - u_long lpc; /* base pc address of sample buffer */ - u_long hpc; /* max pc address of sampled buffer */ - int ncnt; /* size of sample buffer (plus this header) */ - int version; /* version number */ - int profrate; /* profiling clock rate */ - int spare[3]; /* reserved */ -}; -#define GMONVERSION 0x00051879 - -/* - * histogram counters are unsigned shorts (according to the kernel). - */ -#define HISTCOUNTER unsigned short - -/* - * fraction of text space to allocate for histogram counters here, 1/2 - */ -#define HISTFRACTION 2 - -/* - * Fraction of text space to allocate for from hash buckets. - * The value of HASHFRACTION is based on the minimum number of bytes - * of separation between two subroutine call points in the object code. - * Given MIN_SUBR_SEPARATION bytes of separation the value of - * HASHFRACTION is calculated as: - * - * HASHFRACTION = MIN_SUBR_SEPARATION / (2 * sizeof(short) - 1); - * - * For example, on the VAX, the shortest two call sequence is: - * - * calls $0,(r0) - * calls $0,(r0) - * - * which is separated by only three bytes, thus HASHFRACTION is - * calculated as: - * - * HASHFRACTION = 3 / (2 * 2 - 1) = 1 - * - * Note that the division above rounds down, thus if MIN_SUBR_FRACTION - * is less than three, this algorithm will not work! - * - * In practice, however, call instructions are rarely at a minimal - * distance. Hence, we will define HASHFRACTION to be 2 across all - * architectures. This saves a reasonable amount of space for - * profiling data structures without (in practice) sacrificing - * any granularity. - */ -#define HASHFRACTION 2 - -/* - * percent of text space to allocate for tostructs with a minimum. - */ -#define ARCDENSITY 2 -#define MINARCS 50 -#define MAXARCS ((1 << (8 * sizeof(HISTCOUNTER))) - 2) - -struct tostruct { - u_long selfpc; - long count; - u_short link; - u_short pad; -}; - -/* - * a raw arc, with pointers to the calling site and - * the called site and a count. - */ -struct rawarc { - u_long raw_frompc; - u_long raw_selfpc; - long raw_count; -}; - -/* - * general rounding functions. - */ -#define ROUNDDOWN(x,y) (((x)/(y))*(y)) -#define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*(y)) - -/* - * The profiling data structures are housed in this structure. - */ -struct gmonparam { - int state; - u_short *kcount; - u_long kcountsize; - u_short *froms; - u_long fromssize; - struct tostruct *tos; - u_long tossize; - long tolimit; - u_long lowpc; - u_long highpc; - u_long textsize; - u_long hashfraction; -}; -extern struct gmonparam _gmonparam; - -/* - * Possible states of profiling. - */ -#define GMON_PROF_ON 0 -#define GMON_PROF_BUSY 1 -#define GMON_PROF_ERROR 2 -#define GMON_PROF_OFF 3 - -/* - * Sysctl definitions for extracting profiling information from the kernel. - */ -#define GPROF_STATE 0 /* int: profiling enabling variable */ -#define GPROF_COUNT 1 /* struct: profile tick count buffer */ -#define GPROF_FROMS 2 /* struct: from location hash bucket */ -#define GPROF_TOS 3 /* struct: destination/count structure */ -#define GPROF_GMONPARAM 4 /* struct: profiling parameters (see above) */ -#endif /* !_SYS_GMONH_ */ diff --git a/winsup/cygwin/grp.cc b/winsup/cygwin/grp.cc deleted file mode 100644 index c59f25fc0..000000000 --- a/winsup/cygwin/grp.cc +++ /dev/null @@ -1,553 +0,0 @@ -/* grp.cc - - Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005 - Red Hat, Inc. - - Original stubs by Jason Molenda of Cygnus Support, crash@cygnus.com - First implementation by Gunther Ebert, gunther.ebert@ixos-leipzig.de - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include "cygerrno.h" -#include "pinfo.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "pwdgrp.h" -#include "cygtls.h" - -static __group32 *group_buf; -static pwdgrp gr (group_buf); -static char * NO_COPY null_ptr; - -bool -pwdgrp::parse_group () -{ -# define grp (*group_buf)[curr_lines] - grp.gr_name = next_str (':'); - if (!*grp.gr_name) - return false; - - grp.gr_passwd = next_str (':'); - - if (!next_num (grp.gr_gid)) - return false; - - int n; - char *dp = raw_ptr (); - for (n = 0; *next_str (','); n++) - continue; - - grp.gr_mem = &null_ptr; - if (n) - { - char **namearray = (char **) calloc (n + 1, sizeof (char *)); - if (namearray) - { - for (int i = 0; i < n; i++, dp = strchr (dp, '\0') + 1) - namearray[i] = dp; - grp.gr_mem = namearray; - } - } - - return true; -# undef grp -} - -/* Cygwin internal */ -/* Read in /etc/group and save contents in the group cache */ -/* This sets group_in_memory_p to 1 so functions in this file can - tell that /etc/group has been read in */ -void -pwdgrp::read_group () -{ - for (int i = 0; i < gr.curr_lines; i++) - if ((*group_buf)[i].gr_mem != &null_ptr) - free ((*group_buf)[i].gr_mem); - - load ("/etc/group"); - - /* Complete /etc/group in memory if needed */ - if (!internal_getgrgid (myself->gid)) - { - static char linebuf [200]; - char group_name [UNLEN + 1] = "mkgroup"; - char strbuf[128] = ""; - - if (wincap.has_security ()) - { - struct __group32 *gr; - - cygheap->user.groups.pgsid.string (strbuf); - if ((gr = internal_getgrsid (cygheap->user.groups.pgsid))) - strlcpy (group_name, gr->gr_name, sizeof (group_name)); - } - if (myself->uid == UNKNOWN_UID) - strcpy (group_name, "mkpasswd"); /* Feedback... */ - snprintf (linebuf, sizeof (linebuf), "%s:%s:%lu:%s", - group_name, strbuf, myself->gid, cygheap->user.name ()); - debug_printf ("Completing /etc/group: %s", linebuf); - add_line (linebuf); - } - static char NO_COPY pretty_ls[] = "????????::-1:"; - if (wincap.has_security ()) - add_line (pretty_ls); -} - -muto NO_COPY pwdgrp::pglock; - -pwdgrp::pwdgrp (passwd *&pbuf) : - pwdgrp_buf_elem_size (sizeof (*pbuf)), passwd_buf (&pbuf) -{ - read = &pwdgrp::read_passwd; - parse = &pwdgrp::parse_passwd; - pglock.init ("pglock"); -} - -pwdgrp::pwdgrp (__group32 *&gbuf) : - pwdgrp_buf_elem_size (sizeof (*gbuf)), group_buf (&gbuf) -{ - read = &pwdgrp::read_group; - parse = &pwdgrp::parse_group; - pglock.init ("pglock"); -} - -struct __group32 * -internal_getgrsid (cygpsid &sid) -{ - char sid_string[128]; - - gr.refresh (false); - - if (sid.string (sid_string)) - for (int i = 0; i < gr.curr_lines; i++) - if (!strcmp (sid_string, group_buf[i].gr_passwd)) - return group_buf + i; - return NULL; -} - -struct __group32 * -internal_getgrgid (__gid32_t gid, bool check) -{ - gr.refresh (check); - - for (int i = 0; i < gr.curr_lines; i++) - if (group_buf[i].gr_gid == gid) - return group_buf + i; - return NULL; -} - -struct __group32 * -internal_getgrnam (const char *name, bool check) -{ - gr.refresh (check); - - for (int i = 0; i < gr.curr_lines; i++) - if (strcasematch (group_buf[i].gr_name, name)) - return group_buf + i; - - /* Didn't find requested group */ - return NULL; -} - -static struct __group16 * -grp32togrp16 (struct __group16 *gp16, struct __group32 *gp32) -{ - if (!gp16 || !gp32) - return NULL; - - /* Copying the pointers is actually unnecessary. Just having the correct - return type is important. */ - gp16->gr_name = gp32->gr_name; - gp16->gr_passwd = gp32->gr_passwd; - gp16->gr_gid = (__gid16_t) gp32->gr_gid; /* Not loss-free */ - gp16->gr_mem = gp32->gr_mem; - - return gp16; -} - -extern "C" int -getgrgid_r (__gid32_t gid, struct __group32 *grp, char *buffer, size_t bufsize, - struct __group32 **result) -{ - *result = NULL; - - if (!grp || !buffer) - return ERANGE; - - struct __group32 *tempgr = internal_getgrgid (gid, true); - pthread_testcancel (); - if (!tempgr) - return 0; - - /* check needed buffer size. */ - int i; - size_t needsize = strlen (tempgr->gr_name) + strlen (tempgr->gr_passwd) - + 2 + sizeof (char *); - for (i = 0; tempgr->gr_mem[i]; ++i) - needsize += strlen (tempgr->gr_mem[i]) + 1 + sizeof (char *); - if (needsize > bufsize) - return ERANGE; - - /* make a copy of tempgr */ - *result = grp; - grp->gr_gid = tempgr->gr_gid; - grp->gr_name = buffer; - grp->gr_passwd = grp->gr_name + strlen (tempgr->gr_name) + 1; - grp->gr_mem = (char **) (grp->gr_passwd + strlen (tempgr->gr_passwd) + 1); - char *mem = (char *) grp->gr_mem + (i + 1) * sizeof (char *); - for (i = 0; tempgr->gr_mem[i]; ++i) - { - grp->gr_mem[i] = mem; - mem += strlen (tempgr->gr_mem[i]) + 1; - } - grp->gr_mem[i] = NULL; - strcpy (grp->gr_name, tempgr->gr_name); - strcpy (grp->gr_passwd, tempgr->gr_passwd); - for (i = 0; tempgr->gr_mem[i]; ++i) - strcpy (grp->gr_mem[i], tempgr->gr_mem[i]); - return 0; -} - -extern "C" struct __group32 * -getgrgid32 (__gid32_t gid) -{ - return internal_getgrgid (gid, true); -} - -extern "C" struct __group16 * -getgrgid (__gid16_t gid) -{ - static struct __group16 g16; /* FIXME: thread-safe? */ - - return grp32togrp16 (&g16, getgrgid32 (gid16togid32 (gid))); -} - -extern "C" int -getgrnam_r (const char *nam, struct __group32 *grp, char *buffer, - size_t bufsize, struct __group32 **result) -{ - *result = NULL; - - if (!grp || !buffer) - return ERANGE; - - struct __group32 *tempgr = internal_getgrnam (nam, true); - pthread_testcancel (); - if (!tempgr) - return 0; - - /* check needed buffer size. */ - int i; - size_t needsize = strlen (tempgr->gr_name) + strlen (tempgr->gr_passwd) - + 2 + sizeof (char *); - for (i = 0; tempgr->gr_mem[i]; ++i) - needsize += strlen (tempgr->gr_mem[i]) + 1 + sizeof (char *); - if (needsize > bufsize) - return ERANGE; - - /* make a copy of tempgr */ - *result = grp; - grp->gr_gid = tempgr->gr_gid; - grp->gr_name = buffer; - grp->gr_passwd = grp->gr_name + strlen (tempgr->gr_name) + 1; - grp->gr_mem = (char **) (grp->gr_passwd + strlen (tempgr->gr_passwd) + 1); - char *mem = (char *) grp->gr_mem + (i + 1) * sizeof (char *); - for (i = 0; tempgr->gr_mem[i]; ++i) - { - grp->gr_mem[i] = mem; - mem += strlen (tempgr->gr_mem[i]) + 1; - } - grp->gr_mem[i] = NULL; - strcpy (grp->gr_name, tempgr->gr_name); - strcpy (grp->gr_passwd, tempgr->gr_passwd); - for (i = 0; tempgr->gr_mem[i]; ++i) - strcpy (grp->gr_mem[i], tempgr->gr_mem[i]); - return 0; -} - -extern "C" struct __group32 * -getgrnam32 (const char *name) -{ - return internal_getgrnam (name, true); -} - -extern "C" struct __group16 * -getgrnam (const char *name) -{ - static struct __group16 g16; /* FIXME: thread-safe? */ - - return grp32togrp16 (&g16, getgrnam32 (name)); -} - -extern "C" void -endgrent () -{ - _my_tls.locals.grp_pos = 0; -} - -extern "C" struct __group32 * -getgrent32 () -{ - if (_my_tls.locals.grp_pos == 0) - gr.refresh (true); - if (_my_tls.locals.grp_pos < gr.curr_lines) - return group_buf + _my_tls.locals.grp_pos++; - - return NULL; -} - -extern "C" struct __group16 * -getgrent () -{ - static struct __group16 g16; /* FIXME: thread-safe? */ - - return grp32togrp16 (&g16, getgrent32 ()); -} - -extern "C" void -setgrent () -{ - _my_tls.locals.grp_pos = 0; -} - -/* Internal function. ONLY USE THIS INTERNALLY, NEVER `getgrent'!!! */ -struct __group32 * -internal_getgrent (int pos) -{ - gr.refresh (false); - - if (pos < gr.curr_lines) - return group_buf + pos; - return NULL; -} - -int -internal_getgroups (int gidsetsize, __gid32_t *grouplist, cygpsid * srchsid) -{ - HANDLE hToken = NULL; - DWORD size; - int cnt = 0; - struct __group32 *gr; - __gid32_t gid; - const char *username; - - if (!srchsid && cygheap->user.groups.issetgroups ()) - { - cygsid sid; - for (int gidx = 0; (gr = internal_getgrent (gidx)); ++gidx) - if (sid.getfromgr (gr)) - for (int pg = 0; pg < cygheap->user.groups.sgsids.count; ++pg) - if (sid == cygheap->user.groups.sgsids.sids[pg] && - sid != well_known_world_sid) - { - if (cnt < gidsetsize) - grouplist[cnt] = gr->gr_gid; - ++cnt; - if (gidsetsize && cnt > gidsetsize) - goto error; - break; - } - return cnt; - } - - - /* If impersonated, use impersonation token. */ - if (cygheap->user.issetuid ()) - hToken = cygheap->user.token (); - else - hToken = hProcImpToken; - - if (hToken) - { - if (GetTokenInformation (hToken, TokenGroups, NULL, 0, &size) - || GetLastError () == ERROR_INSUFFICIENT_BUFFER) - { - char buf[size]; - TOKEN_GROUPS *groups = (TOKEN_GROUPS *) buf; - - if (GetTokenInformation (hToken, TokenGroups, buf, size, &size)) - { - cygsid sid; - - if (srchsid) - { - for (DWORD pg = 0; pg < groups->GroupCount; ++pg) - if ((cnt = (*srchsid == groups->Groups[pg].Sid))) - break; - } - else - for (int gidx = 0; (gr = internal_getgrent (gidx)); ++gidx) - if (sid.getfromgr (gr)) - for (DWORD pg = 0; pg < groups->GroupCount; ++pg) - if (sid == groups->Groups[pg].Sid && - sid != well_known_world_sid) - { - if (cnt < gidsetsize) - grouplist[cnt] = gr->gr_gid; - ++cnt; - if (gidsetsize && cnt > gidsetsize) - goto error; - break; - } - } - } - else - debug_printf ("%d = GetTokenInformation(NULL) %E", size); - return cnt; - } - - gid = myself->gid; - username = cygheap->user.name (); - for (int gidx = 0; (gr = internal_getgrent (gidx)); ++gidx) - if (gid == gr->gr_gid) - { - if (cnt < gidsetsize) - grouplist[cnt] = gr->gr_gid; - ++cnt; - if (gidsetsize && cnt > gidsetsize) - goto error; - } - else if (gr->gr_mem) - for (int gi = 0; gr->gr_mem[gi]; ++gi) - if (strcasematch (username, gr->gr_mem[gi])) - { - if (cnt < gidsetsize) - grouplist[cnt] = gr->gr_gid; - ++cnt; - if (gidsetsize && cnt > gidsetsize) - goto error; - } - return cnt; - -error: - set_errno (EINVAL); - return -1; -} - -extern "C" int -getgroups32 (int gidsetsize, __gid32_t *grouplist) -{ - return internal_getgroups (gidsetsize, grouplist); -} - -extern "C" int -getgroups (int gidsetsize, __gid16_t *grouplist) -{ - __gid32_t *grouplist32 = NULL; - - if (gidsetsize < 0) - { - set_errno (EINVAL); - return -1; - } - if (gidsetsize > 0 && grouplist) - grouplist32 = (__gid32_t *) alloca (gidsetsize * sizeof (__gid32_t)); - - int ret = internal_getgroups (gidsetsize, grouplist32); - - if (gidsetsize > 0 && grouplist) - for (int i = 0; i < ret; ++ i) - grouplist[i] = grouplist32[i]; - - return ret; -} - -extern "C" int -initgroups32 (const char *name, __gid32_t gid) -{ - int ret; - if (wincap.has_security ()) - { - ret = -1; - struct passwd *pw = internal_getpwnam (name); - struct __group32 *gr = internal_getgrgid (gid); - cygsid usersid, grpsid; - if (!usersid.getfrompw (pw) || !grpsid.getfromgr (gr)) - { - set_errno (EINVAL); - goto out; - } - cygsidlist tmp_gsids (cygsidlist_auto, 12); - if (!get_server_groups (tmp_gsids, usersid, pw)) - goto out; - tmp_gsids += grpsid; - cygsidlist new_gsids (cygsidlist_alloc, tmp_gsids.count); - for (int i = 0; i < tmp_gsids.count; i++) - new_gsids.sids[i] = tmp_gsids.sids[i]; - new_gsids.count = tmp_gsids.count; - cygheap->user.groups.update_supp (new_gsids); - } - ret = 0; - - out: - syscall_printf ( "%d = initgroups (%s, %u)", ret, name, gid); - return ret; -} - -extern "C" int -initgroups (const char *name, __gid16_t gid) -{ - return initgroups32 (name, gid16togid32(gid)); -} - -/* setgroups32: standards? */ -extern "C" int -setgroups32 (int ngroups, const __gid32_t *grouplist) -{ - syscall_printf ("setgroups32 (%d)", ngroups); - if (ngroups < 0 || (ngroups > 0 && !grouplist)) - { - set_errno (EINVAL); - return -1; - } - - if (!wincap.has_security ()) - return 0; - - cygsidlist gsids (cygsidlist_alloc, ngroups); - struct __group32 *gr; - - if (ngroups && !gsids.sids) - return -1; - - for (int gidx = 0; gidx < ngroups; ++gidx) - { - if ((gr = internal_getgrgid (grouplist[gidx])) - && gsids.addfromgr (gr)) - continue; - debug_printf ("No sid found for gid %d", grouplist[gidx]); - gsids.free_sids (); - set_errno (EINVAL); - return -1; - } - cygheap->user.groups.update_supp (gsids); - return 0; -} - -extern "C" int -setgroups (int ngroups, const __gid16_t *grouplist) -{ - __gid32_t *grouplist32 = NULL; - - if (ngroups > 0 && grouplist) - { - grouplist32 = (__gid32_t *) alloca (ngroups * sizeof (__gid32_t)); - if (grouplist32 == NULL) - return -1; - for (int i = 0; i < ngroups; i++) - grouplist32[i] = grouplist[i]; - } - return setgroups32 (ngroups, grouplist32); -} diff --git a/winsup/cygwin/heap.cc b/winsup/cygwin/heap.cc deleted file mode 100644 index bdf7a757f..000000000 --- a/winsup/cygwin/heap.cc +++ /dev/null @@ -1,164 +0,0 @@ -/* heap.cc: Cygwin heap manager. - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include "cygerrno.h" -#include "sigproc.h" -#include "pinfo.h" -#include "heap.h" -#include "shared_info.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "registry.h" -#include "cygwin_version.h" -#include "child_info.h" - -#define assert(x) - -static unsigned page_const; - -#define MINHEAP_SIZE (4 * 1024 * 1024) - -/* Initialize the heap at process start up. */ -void -heap_init () -{ - const DWORD alloctype = MEM_RESERVE; - /* If we're the forkee, we must allocate the heap at exactly the same place - as our parent. If not, we don't care where it ends up. */ - - page_const = system_info.dwPageSize; - if (!cygheap->user_heap.base) - { - cygheap->user_heap.chunk = cygwin_shared->heap_chunk_size (); - while (cygheap->user_heap.chunk >= MINHEAP_SIZE) - { - /* Initialize page mask and default heap size. Preallocate a heap - * to assure contiguous memory. */ - cygheap->user_heap.ptr = cygheap->user_heap.top = - cygheap->user_heap.base = - VirtualAlloc (NULL, cygheap->user_heap.chunk, alloctype, PAGE_NOACCESS); - if (cygheap->user_heap.base) - break; - cygheap->user_heap.chunk -= 1 * 1024 * 1024; - } - if (cygheap->user_heap.base == NULL) - api_fatal ("unable to allocate heap, heap_chunk_size %d, %E", - cygheap->user_heap.chunk); - cygheap->user_heap.max = (char *) cygheap->user_heap.base + cygheap->user_heap.chunk; - } - else - { - DWORD chunk = cygheap->user_heap.chunk; /* allocation chunk */ - /* total size commited in parent */ - DWORD allocsize = (char *) cygheap->user_heap.top - - (char *) cygheap->user_heap.base; - - /* Loop until we've managed to reserve an adequate amount of memory. */ - char *p; - DWORD reserve_size = chunk * ((allocsize + (chunk - 1)) / chunk); - while (1) - { - p = (char *) VirtualAlloc (cygheap->user_heap.base, reserve_size, - alloctype, PAGE_READWRITE); - if (p) - break; - if ((reserve_size -= page_const) < allocsize) - break; - } - if (!p && in_forkee && !fork_info->handle_failure (GetLastError ())) - api_fatal ("couldn't allocate heap, %E, base %p, top %p, " - "reserve_size %d, allocsize %d, page_const %d", - cygheap->user_heap.base, cygheap->user_heap.top, - reserve_size, allocsize, page_const); - if (p != cygheap->user_heap.base) - api_fatal ("heap allocated at wrong address %p (mapped) != %p (expected)", p, cygheap->user_heap.base); - if (!VirtualAlloc (cygheap->user_heap.base, allocsize, MEM_COMMIT, PAGE_READWRITE)) - api_fatal ("MEM_COMMIT failed, %E"); - } - - debug_printf ("heap base %p, heap top %p", cygheap->user_heap.base, - cygheap->user_heap.top); - page_const--; - // malloc_init (); -} - -#define pround(n) (((size_t)(n) + page_const) & ~page_const) - -/* FIXME: This function no longer handles "split heaps". */ - -extern "C" void * -sbrk (int n) -{ - char *newtop, *newbrk; - unsigned commitbytes, newbrksize; - - if (n == 0) - return cygheap->user_heap.ptr; /* Just wanted to find current cygheap->user_heap.ptr address */ - - newbrk = (char *) cygheap->user_heap.ptr + n; /* Where new cygheap->user_heap.ptr will be */ - newtop = (char *) pround (newbrk); /* Actual top of allocated memory - - on page boundary */ - - if (newtop == cygheap->user_heap.top) - goto good; - - if (n < 0) - { /* Freeing memory */ - assert (newtop < cygheap->user_heap.top); - n = (char *) cygheap->user_heap.top - newtop; - if (VirtualFree (newtop, n, MEM_DECOMMIT)) /* Give it back to OS */ - goto good; /* Didn't take */ - else - goto err; - } - - assert (newtop > cygheap->user_heap.top); - - /* Find the number of bytes to commit, rounded up to the nearest page. */ - commitbytes = pround (newtop - (char *) cygheap->user_heap.top); - - /* Need to grab more pages from the OS. If this fails it may be because - we have used up previously reserved memory. Or, we're just plumb out - of memory. Only attempt to commit memory that we know we've previously - reserved. */ - if (newtop <= cygheap->user_heap.max) - { - if (VirtualAlloc (cygheap->user_heap.top, commitbytes, MEM_COMMIT, PAGE_READWRITE) != NULL) - goto good; - } - - /* Couldn't allocate memory. Maybe we can reserve some more. - Reserve either the maximum of the standard cygwin_shared->heap_chunk_size () - or the requested amount. Then attempt to actually allocate it. */ - if ((newbrksize = cygheap->user_heap.chunk) < commitbytes) - newbrksize = commitbytes; - - if ((VirtualAlloc (cygheap->user_heap.top, newbrksize, MEM_RESERVE, PAGE_NOACCESS) - || VirtualAlloc (cygheap->user_heap.top, newbrksize = commitbytes, MEM_RESERVE, PAGE_NOACCESS)) - && VirtualAlloc (cygheap->user_heap.top, commitbytes, MEM_COMMIT, PAGE_READWRITE) != NULL) - { - cygheap->user_heap.max = (char *) cygheap->user_heap.max + pround (newbrksize); - goto good; - } - -err: - set_errno (ENOMEM); - return (void *) -1; - -good: - void *oldbrk = cygheap->user_heap.ptr; - cygheap->user_heap.ptr = newbrk; - cygheap->user_heap.top = newtop; - return oldbrk; -} diff --git a/winsup/cygwin/heap.h b/winsup/cygwin/heap.h deleted file mode 100644 index b497dd3a4..000000000 --- a/winsup/cygwin/heap.h +++ /dev/null @@ -1,20 +0,0 @@ -/* heap.h: Cygwin heap manager definitions. - - Copyright 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "perprocess.h" - -/* Heap management. */ -void heap_init (); -void malloc_init (); - -#define inheap(s) \ - (cygheap->user_heap.ptr && s \ - && ((char *) (s) >= (char *) cygheap->user_heap.base) \ - && ((char *) (s) <= (char *) cygheap->user_heap.top)) diff --git a/winsup/cygwin/hires.h b/winsup/cygwin/hires.h deleted file mode 100644 index 3c7bd2722..000000000 --- a/winsup/cygwin/hires.h +++ /dev/null @@ -1,53 +0,0 @@ -/* hires.h: Definitions for hires clock calculations - - Copyright 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef __HIRES_H__ -#define __HIRES_H__ - -#include - -/* Largest delay in ms for sleep and alarm calls. - Allow actual delay to exceed requested delay by 10 s. - Express as multiple of 1000 (i.e. seconds) + max resolution - The tv_sec argument in timeval structures cannot exceed - HIRES_DELAY_MAX / 1000 - 1, so that adding fractional part - and rounding won't exceed HIRES_DELAY_MAX */ -#define HIRES_DELAY_MAX ((((UINT_MAX - 10000) / 1000) * 1000) + 10) - -class hires_base -{ - protected: - int inited; -}; - -class hires_us : hires_base -{ - LARGE_INTEGER primed_ft; - LARGE_INTEGER primed_pc; - double freq; - void prime (); - public: - LONGLONG usecs (bool justdelta); -}; - -class hires_ms : hires_base -{ - LONGLONG initime_us; - void prime (); - public: - LONGLONG usecs (); - LONGLONG msecs () {return usecs () / 1000LL;} - UINT dmsecs () { return timeGetTime (); } - UINT resolution (); - LONGLONG uptime () {return (usecs () - initime_us) / 1000LL;} -}; - -extern hires_ms gtod; -#endif /*__HIRES_H__*/ diff --git a/winsup/cygwin/hookapi.cc b/winsup/cygwin/hookapi.cc deleted file mode 100644 index a58814e6b..000000000 --- a/winsup/cygwin/hookapi.cc +++ /dev/null @@ -1,227 +0,0 @@ -#include "winsup.h" -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include -#include -#include - -#define rva(coerce, base, addr) (coerce) ((char *) (base) + (addr)) -#define rvacyg(coerce, addr) rva (coerce, cygwin_hmodule, addr) - -struct function_hook -{ - const char *name; // Function name, e.g. "DirectDrawCreateEx". - const void *hookfn; // Address of your function. - void *origfn; // Stored by HookAPICalls, the address of the original function. -}; - -/* Given an HMODULE, returns a pointer to the PE header */ -static PIMAGE_NT_HEADERS -PEHeaderFromHModule (HMODULE hModule) -{ - PIMAGE_NT_HEADERS pNTHeader; - - if (PIMAGE_DOS_HEADER(hModule) ->e_magic != IMAGE_DOS_SIGNATURE) - pNTHeader = NULL; - else - { - pNTHeader = PIMAGE_NT_HEADERS (PBYTE (hModule) - + PIMAGE_DOS_HEADER (hModule) ->e_lfanew); - if (pNTHeader->Signature != IMAGE_NT_SIGNATURE) - pNTHeader = NULL; - } - - return pNTHeader; -} - -long -rvadelta (PIMAGE_NT_HEADERS pnt, DWORD import_rva) -{ - PIMAGE_SECTION_HEADER section = (PIMAGE_SECTION_HEADER) (pnt + 1); - for (int i = 0; i < pnt->FileHeader.NumberOfSections; i++) - if (section[i].VirtualAddress <= import_rva - && (section[i].VirtualAddress + section[i].Misc.VirtualSize) >= import_rva) - // if (strncasematch ((char *) section[i].Name, ".idata", IMAGE_SIZEOF_SHORT_NAME)) - return section[i].VirtualAddress - section[i].PointerToRawData; - return -1; -} - -void * -putmem (PIMAGE_THUNK_DATA pi, const void *hookfn) -{ - DWORD ofl; - if (!VirtualProtect (pi, sizeof (PVOID), PAGE_READWRITE, &ofl) ) - return NULL; - - void *origfn = (void *) pi->u1.Function; - pi->u1.Function = (DWORD) hookfn; - - VirtualProtect (pi, sizeof (PVOID), ofl, &ofl); - return origfn; -} - -/* Builds stubs for and redirects the IAT for one DLL (pImportDesc) */ - -static bool -RedirectIAT (function_hook& fh, PIMAGE_IMPORT_DESCRIPTOR pImportDesc, - HMODULE hm) -{ - // If no import names table, we can't redirect this, so bail - if (pImportDesc->OriginalFirstThunk == 0) - return false; - - /* import address table */ - PIMAGE_THUNK_DATA pt = rva (PIMAGE_THUNK_DATA, hm, pImportDesc->FirstThunk); - /* import names table */ - PIMAGE_THUNK_DATA pn = rva (PIMAGE_THUNK_DATA, hm, pImportDesc->OriginalFirstThunk); - - /* Scan through the IAT, completing the stubs and redirecting the IAT - entries to point to the stubs. */ - for (PIMAGE_THUNK_DATA pi = pt; pn->u1.Ordinal; pi++, pn++) - { - if (IMAGE_SNAP_BY_ORDINAL (pn->u1.Ordinal) ) - continue; - - /* import by name */ - PIMAGE_IMPORT_BY_NAME pimp = rva (PIMAGE_IMPORT_BY_NAME, hm, pn->u1.AddressOfData); - - if (strcmp (fh.name, (char *) pimp->Name) == 0) - { - fh.origfn = putmem (pi, fh.hookfn); - if (!fh.origfn) - return false; - hook_chain *hc; - for (hc = &cygheap->hooks; hc->next; hc = hc->next) - continue; - hc->next = (hook_chain *) cmalloc (HEAP_1_HOOK, sizeof (hook_chain)); - hc->next->loc = (void **) pi; - hc->next->func = fh.hookfn; - hc->next->next = NULL; - break; - } - } - - return true; -} - -void -get_export (function_hook& fh) -{ - PIMAGE_DOS_HEADER pdh = (PIMAGE_DOS_HEADER) cygwin_hmodule; - if (pdh->e_magic != IMAGE_DOS_SIGNATURE) - return; - PIMAGE_NT_HEADERS pnt = (PIMAGE_NT_HEADERS) ((char *) pdh + pdh->e_lfanew); - if (pnt->Signature != IMAGE_NT_SIGNATURE || pnt->FileHeader.SizeOfOptionalHeader == 0) - return; - PIMAGE_EXPORT_DIRECTORY pexp = - rvacyg (PIMAGE_EXPORT_DIRECTORY, - pnt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); - if (!pexp) - return; - - PDWORD pfuncs = rvacyg (PDWORD, pexp->AddressOfFunctions); - PDWORD pnames = rvacyg (PDWORD, pexp->AddressOfNames); - for (DWORD i = 0; i < pexp->NumberOfNames; i++) - if (strcmp (fh.name, rvacyg (char *, pnames[i])) == 0) - { - fh.origfn = rvacyg (void *, pfuncs[i]); - break; - } -} - -static const char * -makename (const char *name, char *&buf, int& i, int inc) -{ - i += inc; - static const char *testers[] = {"NOTUSED", "64", "32"}; - if (i < 0 || i >= (int) (sizeof (testers) / sizeof (testers[0]))) - return NULL; - if (i) - { - __small_sprintf (buf, "_%s%s", name, testers[i]); - name = buf; - } - return name; -} - -// Top level routine to find the EXE's imports, and redirect them -void * -hook_or_detect_cygwin (const char *name, const void *fn, WORD& subsys) -{ - HMODULE hm = fn ? GetModuleHandle (NULL) : (HMODULE) name; - PIMAGE_NT_HEADERS pExeNTHdr = PEHeaderFromHModule (hm); - - if (!pExeNTHdr) - return false; - - subsys = pExeNTHdr->OptionalHeader.Subsystem; - - DWORD importRVA = pExeNTHdr->OptionalHeader.DataDirectory - [IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - if (!importRVA) - return false; - - long delta = fn ? 0 : rvadelta (pExeNTHdr, importRVA); - if (delta < 0) - return false; - - // Convert imports RVA to a usable pointer - PIMAGE_IMPORT_DESCRIPTOR pdfirst = rva (PIMAGE_IMPORT_DESCRIPTOR, hm, importRVA - delta); - - function_hook fh; - fh.origfn = NULL; - fh.hookfn = fn; - char *buf = (char *) alloca (strlen (name) + sizeof ("_64")); - int i; - // Iterate through each import descriptor, and redirect if appropriate - for (PIMAGE_IMPORT_DESCRIPTOR pd = pdfirst; pd->FirstThunk; pd++) - { - if (!strcasematch (rva (PSTR, hm, pd->Name - delta), "cygwin1.dll")) - continue; - if (!fn) - return (void *) "found it"; // just checking if executable used cygwin1.dll - i = -1; - while (!fh.origfn && (fh.name = makename (name, buf, i, 1))) - RedirectIAT (fh, pd, hm); - if (fh.origfn) - break; - } - - while (!fh.origfn && (fh.name = makename (name, buf, i, -1))) - get_export (fh); - - return fh.origfn; -} - -void -ld_preload () -{ - char *p = getenv ("LD_PRELOAD"); - if (!p) - return; - char *s = (char *) alloca (strlen (p) + 1); - strcpy (s, p); - char *here = NULL; - for (p = strtok_r (s, ":\t\n", &here); p; p = strtok_r (NULL, ":\t\n", &here)) - { - path_conv lib (p); - if (!LoadLibrary (lib)) - { - __seterrno (); - api_fatal ("error while loading shared libraries: %s: " - "cannot open shared object file: %s", p, - strerror (get_errno ())); - } - } -} - -void -fixup_hooks_after_fork () -{ - for (hook_chain *hc = &cygheap->hooks; (hc = hc->next); ) - putmem ((PIMAGE_THUNK_DATA) hc->loc, hc->func); -} diff --git a/winsup/cygwin/how-autoload-works.txt b/winsup/cygwin/how-autoload-works.txt deleted file mode 100644 index 8cff52900..000000000 --- a/winsup/cygwin/how-autoload-works.txt +++ /dev/null @@ -1,66 +0,0 @@ -Copyright 2002 Red Hat Inc., Egor Duda - -How does function autoloading work? - -Cygwin has the ability to handle win32 functions which are present on -some platforms and not present on others via autoload mechanism. It's -essentially a lazy binding of symbols. It works as following. For -(almost) every function from OS API which cygwin uses, a stub is created -in file autoload.cc. Each reference to the such function from win32 API -in cygwin dll source code is actually pointing to this stub. - -When the function, say GetConsoleWindow(), is called for the first time, -the control is passed to its stub. The stub tries to load the -appropriate system dll via LoadModule() and get the actual function -address via GetProcAddress(). If this operation succeeds, the stub is -"patched" to pass control to actual address of GetConsoleWindow() in -appropriate system dll, so that next time we won't have to load dll and -perform address lookup in it again. From this point on, the call to the -function is performed as if the dll/function were linked statically. - -If LoadModule() or GetProcAddress() fail, (and on nt4 the latter indeed -fails because GetConsoleWindow() is not available in kernel32.dll), then -the application, depending on what kind of stub is created in -autoload.cc, will either: - -1) Exit with fatal error. - -2) Or return a predefined value indicating an error; and set the windows -error code to 127 (ERROR_PROC_NOT_FOUND). - -Almost all w32api functions are linked into the cygwin dll in this -manner, dynamically, at runtime. - -The costs: -1) A tiny overhead in the initial call to a function call as each call -is performed, indirectly, via a stub. For the first lookup of a symbol -of an unloaded dll, there is also some overhead in loading the dll for -the first time. The dll is only loaded by the first call to a symbol -in the dll. After the first call to a function, subsequent calls are -as fast as a normal, statically loaded function. - -The benefits: -1) Speedup at startup time. Applications only load those dlls which are -actually needed. For example, if application never uses socket -functions, winsock dlls are never loaded. - -2) Greatly simplify wincap system -- we don't need to have a separate -capability for every win32 function which may or may not be present on -particular win32 platform. - -3) Allows a single cygwin1.dll for all win32 platforms. - -If you're changing in cygwin1.dll source code and if you use some -function that was not used there before, you should add a stub so it -will be autoloaded. To do so, add one of the LoadDllfunc* macros to -autoload.cc. All macros eventually resolve to the following form: - -LoadDLLfuncEx2 (function name, parameter block length, dll name, - non-fatality flag , value to return if function not available) - -Parameter block length is a sum of sizes (in bytes) of parameters which are -being passed to the function. If non-fatality flag is set to 0, then failure -to load dll and find a function will cause fatal error. If non fatality flag -is set to 1, then call to the function will return default value. -You can also use shorter versions -- LoadDLLfuncEx and LoadDLLfunc, if the -defaults they provide suit your needs. diff --git a/winsup/cygwin/how-cygheap-works.txt b/winsup/cygwin/how-cygheap-works.txt deleted file mode 100644 index b60f88808..000000000 --- a/winsup/cygwin/how-cygheap-works.txt +++ /dev/null @@ -1,120 +0,0 @@ -Copyright 2001 Red Hat Inc., Christopher Faylor - -Cygwin has recently adopted something called the "cygwin heap". This is -an internal heap that is inherited by forked/execed children. It -consists of process specific information that should be inherited. So -things like the file descriptor table, the current working directory, -and the chroot value live there. - -The cygheap is also used to pass argv information to a child process. -There is a problem here, though. If you allocate space for argv on the -heap and then exec a process the child process (1) will happily use the -space in the heap. But what happens when that process execs another -process (2)? The space used by child process (1) still is being used in -child process (2) but it is basically just a memory leak. - -To rectify this problem, memory used by child process 1 is tagged in -such a way that child process 2 will know to delete it. This is in -cygheap_fixup_in_child. - -The cygheap memory allocation functions are adapted from memory -allocators developed by DJ Delorie. They are similar to early BSD -malloc and are intended to be relatively lightweight and relatively -fast. - -How is the cygheap propagated to the child? - -Well, it depends if you are running on Windows 9x or Windows NT. - -On NT and 9x, just before CreateProcess is about to be called in -fork or exec, a shared memory region is prepared for copying of the -cygwin heap. This is in cygheap_setup_for_child. The handle to this -shared memory region is passed to the new process in the 'child_info' -structure. - -If there are no handles that need "fixing up" prior to starting another -process, cygheap_setup_for_child will also copy the contents of the -cygwin heap to the shared memory region. - -If there are any handles that need "fixing up" prior to invoking -another process (i.e., sockets) then the creation of the shared -memory region and copying of the current cygwin heap is a two -step process. - -First the shared memory region is created and the process is started -in a "CREATE_SUSPENDED" state, inheriting the handle. After the -process is created, the fixup_before_*() functions are called. These -set information in the heap and duplicate handles in the child, essentially -ensuring that the child's fd table is correct. - -(Note that it is vital that the cygwin heap should not grow during this -process. Currently, there is no guard against this happening so this -operation is not thread safe.) - -Meanwhile, back in fork_parent, the function -cygheap_setup_for_child_cleanup is called. In the simple "one step" -case above, all that happens is that the shared memory is ummapped and -the handle referring to it is closed. - -In the two step process, the cygheap is now copied to the shared memory -region, complete with new fdtab info (the child process will see the -updated information as soon as it starts). Then the memory is unmapped, -the handle is closed, and upon return the child process is started. - -It is in the child process that the difference between Windows 9x and -Windows NT becomes evident. - -Under Windows NT, the operation is simple. The shared memory handle is -used to map the information that the parent has set up into the cygheap -location in the child. This means that the child has a copy of the -cygwin heap existing in "shared memory" but the only process with a view -to this "shared memory" is the child. - -Under Windows 9x, due to address limitations, we can't just map the -shared memory region into the cygheap position. So, instead, the memory -is mapped whereever Windows wants to put it, a new heap region is -allocated at the same place as in the parent, the contents of the shared -memory is *copied* to the new heap, and the shared memory is unmapped. -Simple, huh? - -Why do we go to these contortions? Previous versions (<1.3.3) of cygwin -used to block when creating a child so that the child could copy the -parent's cygheap. The problem with this was that when a cygwin process -invoked a non-cygwin child, it would block forever waiting for the child -to let it know that it was done copying the heap. That caused -understandable complaints from people who wanted to run non-cygwin -applications "in the background". - -In Cygwin 1.3.3 (and presumably beyond) the location of the cygwin heap -has been fixed to be at the end of the cygwin1.dll address space. -Previously, we let the "OS" choose where to allocate the cygwin heap in -the initial cygwin process and attempted to use this same location in -subsequent cygwin processes started from this parent. - -The reason for putting cygheap at a fixed, known location is that we -need to put this information at a fixed location since it incorporates -pointers to entities within itself. So, when a process forks or execs, -the memory referred to by the pointers has to exist at the same place in -both the parent or the child. - -(It "might be nice" to used something like Microsoft's "based pointers" -for the cygheap. Unfortunately gcc does not support that feature, as of -this writing.) - -The reason for choosing a fixed, arbitrary location is to accommodate -Windows XP, although there were sporadic complaints of cygwin heap -failures in other pathological situations with both NT and 9x. In -Windows XP, Microsoft made the allocation of memory less deterministic. -This is certainly their right. Cygwin was previously relying on -undocumented and "iffy" behavior before. So, now we always allocate -space immediately after the dll in the theory that there is not going -to be anything else living there. - -Recent (2001-09-20) cygwin email threads have indicated that we're not -exactly on completely firm ground now, though. We are assuming that -there is sufficient space after the cygwin DLL for the allocation of the -cygwin heap. Unfortunately the ld option '--enable-auto-image-base' -has a tendency to allocate DLLs immediately after cygwin1.dll. This -causes the dreaded "Couldn't reserve space for cygwin's heap" message. - -Solutions for this behavior are currently in the musing state. diff --git a/winsup/cygwin/how-cygtls-works.txt b/winsup/cygwin/how-cygtls-works.txt deleted file mode 100644 index 69363f1fb..000000000 --- a/winsup/cygwin/how-cygtls-works.txt +++ /dev/null @@ -1,75 +0,0 @@ -Copyright 2005 Red Hat Inc., Max Kaehn - -All cygwin threads have separate context in an object of class _cygtls. The -storage for this object is kept on the stack in the bottom CYGTLS_PADSIZE -bytes. Each thread references the storage via the Thread Environment Block -(aka Thread Information Block), which Windows maintains for each user thread -in the system, with the address in the FS segment register. The memory -is laid out as in the NT_TIB structure from : - -typedef struct _NT_TIB { - struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; - PVOID StackBase; - PVOID StackLimit; - PVOID SubSystemTib; - _ANONYMOUS_UNION union { - PVOID FiberData; - DWORD Version; - } DUMMYUNIONNAME; - PVOID ArbitraryUserPointer; - struct _NT_TIB *Self; -} NT_TIB,*PNT_TIB; - -Cygwin sees it like this: - -extern exception_list *_except_list asm ("%fs:0"); // exceptions.cc -extern char *_tlsbase __asm__ ("%fs:4"); // cygtls.h -extern char *_tlstop __asm__ ("%fs:8"); // cygtls.h - -And accesses cygtls like this: - -#define _my_tls (((_cygtls *) _tlsbase)[-1]) // cygtls.h - - -Initialization always goes through _cygtls::init_thread(). It works -in the following ways: - -* In the main thread, _dll_crt0() provides CYGTLS_PADSIZE bytes on the stack - and passes them to initialize_main_tls(), which calls _cygtls::init_thread(). - It then calls dll_crt0_1(), which terminates with cygwin_exit() rather than - by returning, so the storage never goes out of scope. - - If you load cygwin1.dll dynamically from a non-cygwin application, it is - vital that the bottom CYGTLS_PADSIZE bytes of the stack are not in use - before you call cygwin_dll_init(). See winsup/testsuite/cygload for - more information. - -* Threads other than the main thread receive DLL_THREAD_ATTACH messages - to dll_entry() (in init.cc). - - dll_entry() calls munge_threadfunc(), which grabs the function pointer - for the thread from the stack frame and substitutes threadfunc_fe(), - - which then passes the original function pointer to _cygtls::call(), - - which then allocates CYGTLS_PADSIZE bytes on the stack and hands them - to call2(), - - which allocates an exception_list object on the stack and hands it to - init_exceptions() (in exceptions.cc), which attaches it to the end of - the list of exception handlers, changing _except_list (aka - tib->ExceptionList), then passes the cygtls storage to init_thread(). - call2() calls ExitThread() instead of returning, so the storage never - goes out of scope. - -Note that the padding isn't necessarily going to be just where the _cygtls -structure lives; it just makes sure there's enough room on the stack when the -CYGTLS_PADSIZE bytes down from there are overwritten. - - -Debugging - -You can examine the segment registers in gdb via "info w32 selector $fs" -(which is using GetThreadSelectorEntry()) to get results like this: - - Selector $fs - 0x03b: base=0x7ffdd000 limit=0x00000fff 32-bit Data (Read/Write, Exp-up) - Priviledge level = 3. Byte granular. - -"x/3x 0x7ffdd000" will give you _except_list, _tlsbase, and _tlstop. diff --git a/winsup/cygwin/how-fhandlers-work.txt b/winsup/cygwin/how-fhandlers-work.txt deleted file mode 100644 index cef46fedc..000000000 --- a/winsup/cygwin/how-fhandlers-work.txt +++ /dev/null @@ -1,75 +0,0 @@ -Copyright 2001 Red Hat Inc., Robert Collins - -fhandlers are the core mechanism by which cygwin provides a file descripter (fd) -interface to things such as a random number generated, winsock sockets, raw disk -devices, the clipboard, the console and so on. Under unix access to all such -devices is via a combination of IOCTL's and open/close/read/write calls. Some -special functions do exist - such as bind () and listen () for sockets, but -these consistently operate on fd's. Under Win32 there are disparate interfaces -that have little in common with each other. See for example Direct Sound and -the Clipboard. - -The fhandler class provides all open,read,write,close, ioctl and fork()/exec() -functionality for the fd interface. The base class operates on win32 backed -files. The various derived classes utilise win32 primitives to provide their -specific functionality. - -When a file is opened - not necesarily via open() a fd is assigned to it. The fd -includes a pointer to the actual fhandler that operates this specific file. All -file-oriented system calls then operate off this basic structure. - -For example, lets examine lseek (). - -extern "C" off_t -_lseek (int fd, off_t pos, int dir) -{ - off_t res; - sigframe thisframe (mainthread); - - if (dir != SEEK_SET && dir != SEEK_CUR && dir != SEEK_END) - { - set_errno (EINVAL); - res = -1; - } - else if (cygheap->fdtab.not_open (fd)) - { - set_errno (EBADF); - res = -1; - } - else - { - res = cygheap->fdtab[fd]->lseek (pos, dir); - } - syscall_printf ("%d = lseek (%d, %d, %d)", res, fd, pos, dir); - - return res; -} - -The sigframe thisframe (mainthread); is signal related - see -"how_signals_work.txt". - -The if, else if, else tests (in order) -* the validity of the dir parameter, -* is the fd being passed actually open? (cannot seek on a closed fd) -* call the lseek virtual function in the associated fhandler. - -So as you can see, there is no code that attempts to understand the nature of -the fhandler. - -fhandlers that make cross-function-call use of win32 objects that are not -inheritable cross-process need to implement fixup-after-fork and recreate those -objects. HANDLES can be inherited, but memory mapped regions (for example) -cannot. - -For an example step-by-step to create a new fhandler, see -../doc/fhandler-tut.txt - -Note: In most case, it is safe to assume that using new/delete (or -malloc/free) in an fhandler is dangerous and to be avoided. The reason -for this is that memory allocated to fhandlers is copied between execed -processes in the cygwin heap. Memory allocated in new/delete is only -copied to forked processes. So use cmalloc/cfree. - -Obviously it is possible to use new/delete in some situations but if you're -seeing strange core dumps with usages like cat < /my/newfhandler then the -above may well be the culprit. diff --git a/winsup/cygwin/how-signals-work.txt b/winsup/cygwin/how-signals-work.txt deleted file mode 100644 index 4d94c79dc..000000000 --- a/winsup/cygwin/how-signals-work.txt +++ /dev/null @@ -1,158 +0,0 @@ -Copyright 2001, 2002, 2003, 2004 Red Hat Inc., Christopher Faylor - -[note that the following discussion is still incomplete] - -How do signals work? - -On process startup, cygwin starts a secondary thread which deals with -signals. This thread contains a loop which blocks waiting for -information to arrive on a pipe whose handle (sendsig) is currently -stored in _pinfo (this may change). - -Communication on the sendsig pipe is via the 'sigpacket' structure. -This structure is filled out by the sig_send function with information -about the signal being sent, such as (as of this writing) the signal -number, the originating pid, the originating thread, and the address of -the mask to use (this may change). - -Any cygwin function which calls a win32 api function is wrapped by the -assembly functions "_sigfe" and "_sigbe". These functions maintain a -cygwin "signal stack" which is used by the signal thread to control -handling of signal interrupts. Cygwin functions which need to be -wrapped by these functions (the majority) are labelled by the SIGFE -option in the file cygwin.din. - -The cygwin.din function is translated into a standard cygwin.def file by -the perl script "gendef". This function notices exported cygwin -functions which are labelled as SIGFE and generates a front end assembly -file "sigfe.s" which contains the wrapper glue necessary for every -function to call sigfe prior to actually dispatching to the real cygwin -function. This generated file contains low-level signal related -functions: _sigfe, _sigbe, sigdelayed, sigreturn, longjmp, and setjmp. - -The signal stack maintained by sigfe/sigbe and friends is a secondary -shadow stack. Addresses from this stack are swapped into the "real" -stack as needed to control program flow. The intent is that executing -cygwin functions will still see the same stack layout as if they had -been called directly and will be able to retrieve arguments from the -stack but will always return to the _sigbe routine so that any signal -handlers will be properly called. - -Upon receipt of a "non-special" (see below) signal, the function -sigpacket::process is called. This function determines what action, if -any, to take on the signal. Possible actions are: Ignore the signal -(e.g., SIGUSR1), terminate the program (SIGKILL, SIGTERM), stop the -program (SIGSTOP, SIGTSTP, etc.), wake up a sigwait or sigwaitinfo in a -targetted thread, or call a signal handler (possibly in a thread). If -no thread information has been sent to sigpacket::process, it determines -the correct thread to use based on various heuristics, as per UNIX. As -per linux, the only time a handler is called in a thread is when there -is some kind of fault like SIGSEGV, SIGILL, etc. Signals sent via the -UNIX kill() function are normally sent to the main thread. Ditto -signals sent as the result of pressing tty keys, like CTRL-C. - -Signals which stop a process are handled by a special internal handler: -sig_handle_tty_stop. Some signals (e.g., SIGKILL, SIGSTOP) are -uncatchable, as on UNIX. - -If the signal has an associated signal handler, then the setup_handler -function is eventually called. It is passed the signal, the address of -the handler, a standard UNIX sigaction structure, and a pointer to the -thread's "_cygtls" information. The meat of signal processing is in -setup_handler. - -setup_handler has a "simple" task. It tries to stop the appropriate -thread and either redirect its execution to the signal handler function, -flag that a signal has been received (sigwait) or both (sigpause). - -To accomplish its task, setup_handler first inspects the target thread's -local storage (_cygtls) structure. This structure contains information -on any not-yet-handled signals that may have been set up by a previous -call to setup_handler but not yet dispatched in the target thread. If this -structure seems to be "active", then setup_handler returns, notifying it's -parent via a false value. Otherwise processing continues. - -(For pending signals, the theory is that the signal handler thread will -be forced to be rerun by having some strategic cygwin function call -sig_send with a __SIGFLUSH argument. This causes the signal handler to -rescan the signal array looking for pending signals.) - -After determining that it's ok to send a signal, setup_handler will lock -the cygtls stack to ensure that it has complete access. It will then -inspect the thread's 'incyg' boolean. If this is true, the thread is -currently executing a cygwin function. If it is false, the thread is -unlocked and it is assumed that the thread is executing "user" code. -The actions taken by setup_handler differ based on whether the program -is executing a cygwin routine or not. - -If the program is executing a cygwin routine, then the -interrupt_on_return function is called which causes the address of the -'sigdelayed' function to be pushed onto the thread's signal stack, and -the signal's mask and handler to be saved in the tls structure. After -performing these operations, the 'signal_arrived' event is signalled, as -well as any thread-specific wait event. - -Since the sigdelayed function was saved on the thread's signal stack, -when the cygwin function returns, it will eventually return to the -sigdelayed "front end". The sigdelayed function will save a lot of -state on the stack and set the signal mask as appropriate for POSIX. -It uses information from the _cygtls structure which has been filled in -by interrupt_setup, as called by setup_handler. sigdelayed pushes a -"call" to the function "sigreturn" on the thread's signal stack. This -will be the return address eventually seen by the signal handler. After -setting up the return value, modifying the signal mask, and saving other -information on the stack, sigreturn clears the signal number in the -_cygtls structure so that setup_handler can use it and jumps to the -signal handler function. And, so a UNIX signal handler function is -emulated. - -The signal handler function operates as normal for UNIX but, upon -return, it does not go directly back to the return address of the -original cygwin function. Instead it returns to the previously -mentioned 'sigreturn' assembly language function. - -sigreturn resets the process mask to its state prior to calling the -signal handler. It checks to see if a cygwin routine has set a special -"restore this errno on returning from a signal" value and sets errno to -this, if so. It pops the signal stack, places the new return address on -the real stack, restores all of the register values that were in effect -when sigdelayed was called, and then returns. - -Ok. That is more or less how cygwin interrupts a process which is -executing a cygwin function. We are almost ready to talk about how -cygwin interrupts user code but there is one more thing to talk about: -SA_RESTART. - -UNIX allows some blocking functions to be interrupted by a signal -handler and then return to blocking. In cygwin, so far, only -read/readv() and the wait* functions operate in this fashion. To -accommodate this behavior, a function notices when a signal comes in and -then calls the _cygtls function 'call_signal_handler_now'. -'call_signal_handler_now' emulates the behavior of both sigdelayed and -sigreturn. It sets the appropriate masks and calls the handler, -returning true to the caller if SA_RESTART is active. If SA_RESTART is -active, the function will loop. Otherwise it will typically return -1 -and set the errno to EINTR. - -Phew. So, now we turn to the case where cygwin needs to interrupt the -program when it is not executing a cygwin function. In this scenario, -we rely on the win32 "SuspendThread" function. Cygwin will suspend the -thread using this function and then inspect the location at which the -thread is executing using the win32 "GetThreadContext" call. In theory, -the program should not be executing in a win32 api since attempts to -suspend a process executing a win32 call can cause disastrous results, -especially on Win9x. - -If the process is executing in an unsafe location then setup_handler -will (quickly!) return false as in the case above. Otherwise, the -current location of the thread is pushed on the thread's signal stack -and the thread is redirected to the sigdelayed function via the win32 -"SetThreadContext" call. Then the thread is restarted using the win32 -"ResumeThread" call and things proceed as per the sigdelayed discussion -above. - -This leads us to the sig_send function. This is the "client side" part -of the signal manipulation process. sig_send is the low-level function -called by a high level process like kill() or pthread_kill(). - -** More to come ** diff --git a/winsup/cygwin/how-spawn-works.txt b/winsup/cygwin/how-spawn-works.txt deleted file mode 100644 index e4e25eae9..000000000 --- a/winsup/cygwin/how-spawn-works.txt +++ /dev/null @@ -1,32 +0,0 @@ -Spawn.cc in cygwin handles spawn, vfork and exec calls. It does this via -a mode parameter that determines its behaviour with respect to the -child. - -Of particular interest is the exec behaviour. - -In general spawn_guts (where the action happens) does the following: -* Finds the actual program being run (which may include path searching). -* Determines the type (.exe, shell script, perl etc) and for non binary -programs finds the correct interpreter. -* Creates a commandline (based on the type and the user parameters). -* Guesses at whether the binary that will be invoked is a cygwin program -or not (if (real_path.iscygexec ())) and uses that information to copy -the argv table, or to translate it for win32 program usage. -* passes a handle to the parent to the child (note: this handle should -have it's rights restricted the daemon is merged). -* Start the process. -* if the mode is _P_OVERLAY (we are doing an exec) -wait for the child to -a) if it's a cygwin process, signal us via an event. -b) if it's a win32 process, exit. -c) exit. - -If a) occurs, we 'reparent' the child which makes it look to the current -process's parent in the pid and process group chains. -b) is where the cygwin process hangs around as a 'stub' presenting it's -pid as the win32 process's pid, to allow cygwin tools to kill the win32 -process. -once a-c has occured, execution resumes. -* If the mode is _P_OVERLAY, this process exits, otherwise it's -behaviour depends on the mode parameter. See the last block of -spawn_guts. diff --git a/winsup/cygwin/how-to-debug-cygwin.txt b/winsup/cygwin/how-to-debug-cygwin.txt deleted file mode 100644 index a4de0209f..000000000 --- a/winsup/cygwin/how-to-debug-cygwin.txt +++ /dev/null @@ -1,128 +0,0 @@ -Copyright 2001, 2002, 2005 Red Hat Inc., Egor Duda - -So, your favorite program has crashed? And did you say something about -'stackdump'? Or it just prints its output from left to right and -upside-down? Well, you can file an angry bug report and wait until some -of the core developers try to reproduce your problem, try to find what's -the matter with your program and cygwin and fix the bug, if any. But -you can do something better than that. You can debug the problem -yourself, and even if you can't fix it, your analysis may be very -helpful. Here's the (incomplete) howto on cygwin debugging. - -1. First things first - - The first thing you'll need to do is to build cygwin1.dll and your - crashed application from sources. To debug them you'll need debug - information, which is normally stripped from executables. You probably - also want to build a version of the dll with more debugging capabilities - by reconfiguring your build directory, specifying the --enable-debugging - option to configure. - -2. Creating a known-working cygwin debugging environment - - - create a separate directory, say, c:\cygdeb, and put known-working - cygwin1.dll and gdb.exe in it. - - create a wrapper c:\cygdeb\debug_wrapper.cmd: - -========= debug_wrapper.cmd ========= -rem setting CYGWIN_TESTING environment variable makes cygwin application -rem not to interfere with other already running cygwin applications. -set CYGWIN_TESTING=1 -c:\cygdeb\gdb.exe -nw %1 %2 -=================================== - -3. Using cygwin's JIT debugging facility - - add 'error_start=c:\cygdeb\debug_wrapper.cmd' to CYGWIN environment - variable. When some application encounters critical error, cygwin will stop - it and execute debug_wrapper.cmd, which will run gdb and make it to attach to - the crashed application. - -4. Strace - - You can run your program under 'strace' utility, described if user's manual. - If you know where the problem approximately is, you can add a bunch of - additional debug_printf()s in the source code and see what they print in - strace log. There's one common problem with this method, that some bugs - may mysteriously disappear once the program is run under strace. Then the - bug is likely a race condition. strace has two useful options to deal with - such situation: -b enables buffering of output and reduces additional - timeouts introduced by strace, and -m option allows you to mask certain - classes of *_printf() functions, reducing timeouts even more. - - Note that strace does not use the cygwin DLL and so any process that it - starts does not inherit a cygwin environment. It is equivalent to starting - a program from the command prompt. - -5. Problems at early startup - - Sometimes, something crashes at the very early stages of application - initialization, when JIT debugging facility is not yet active. Ok, there's - another environment variable that may help. Create program_wrapper.cmd: - -========= program_wrapper.cmd ========= -rem setting CYGWIN_SLEEP environment variable makes cygwin application -rem to sleep for x milliseconds at startup -set CYGWIN_SLEEP=20000 -c:\some\path\bad_program.exe some parameters -=================================== - - Now, run program_wrapper.cmd. It should print running program pid. - After starting program_wrapper.cmd you've got 20 seconds to open another - window, cd to c:\cygdeb in it, run gdb there and in gdb prompt type - - (gdb) attach - - where is the pid that program_wrapper.cmd have printed. - After that you can normally step through the code in cygwin1.dll and - bad_program.exe - -6. More problems at early startup - - You can also set a CYGWIN_DEBUG variable to force the debugger to pop up - only when a certain program is run: - -set CYGWIN_DEBUG=cat.exe:gdb.exe - - This will force gdb.exe to start when the program name contains the string - "cat.exe". The ':gdb.exe' isn't really needed, since it is the default. - It is just there to show how you can specify a program to run when the - program starts. You can optionally set a breakpoint on "break_here" - once the debugger pops up and then you can single step through the - initialization process. - - Note that it bears repeating that both of the above options are *only* - available when configuring cygwin with --enable-debugging. - -7. Heap corruption - - If your program crashes at malloc() or free() or when it references some - malloc()'ed memory, it looks like heap corruption. You can configure and - build special version of cygwin1.dll which includes heap sanity checking. - To do it, just add --enable-malloc-debugging option to configure. Be warned, - however, that this version of dll is _very_ slow (10-100 times slower than - normal), so use it only when absolutely necessary. - -8. Program dies when running under strace - - If your program crashes when you run it using strace but runs ok (or has a - different problem) otherwise, then there may be a problem in one of the - strace *_printf statements. Usually this is caused by a change in arguments - resulting in a %s being used with something other than a pointer to a - string. - - To debug this scenario, do something like this: - - bash$ gdb -nw yourapp.exe - (gdb) dll cygwin1 - (gdb) l dll_crt0_1 - (gdb) b <> - (gdb) run - (gdb) set strace.active=1 - (gdb) continue - - The program will then run in "strace mode", calling each strace *_printf, - just like it does when run under the strace program. Eventually, the - program will crash, probably in small_printf. At that point, a 'bt' - command should show you the offending call to strace_printf with the - improper format string. diff --git a/winsup/cygwin/how-vfork-works.txt b/winsup/cygwin/how-vfork-works.txt deleted file mode 100644 index f249dab61..000000000 --- a/winsup/cygwin/how-vfork-works.txt +++ /dev/null @@ -1,36 +0,0 @@ -Copyright 2001 Red Hat Inc., Christopher Faylor - -How does vfork work? - -When a program calls vfork, cygwin attempts to short circuit its -normal, expensive fork mechanism. - -Vfork is mainly smoke and mirrors. A call to vfork contines to execute -in the current process but first it returns a pid of 0 so that process -will execute code intended for the child in a UNIX system. Before -returning the zero, vfork makes a copy of the current fd table so that -closing an fd in the "child" will not affect the "parent". - -Some of this info is stored in a per-thread structure but vfork is not -really thread-safe since it also stores the fd "backup" table in the -global fd table. - -The process continues to execute until it hits some type of exec call. -The exec call is essentially translated into a spawn NO_WAIT call and -the new process is started via this mechanism. After execing, the -"child" process no longer should exist, so the spawn code longjmps back -to the original vfork call. The previously opened fds are closed and -the parent's fd table is restored. vfork() then returns the pid of the -just-spawned process. - -Meanwhile, the just-spawned child notices that it has been spawned as -the result of a vfork and closes the extra file handles. - -This all relies on the fact that the child in a vfork call can affect -just about everything in the parent except for the parent's fds. -The assumption is that a vfork is always just used as a method for -starting a program. - -The assumption is also that all of this is much faster than the -slow method that cygwin uses to implement fork(). - diff --git a/winsup/cygwin/include/a.out.h b/winsup/cygwin/include/a.out.h deleted file mode 100644 index 500e14f3f..000000000 --- a/winsup/cygwin/include/a.out.h +++ /dev/null @@ -1,431 +0,0 @@ -/* a.out.h - - Copyright 1997, 1998, 1999, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _A_OUT_H_ -#define _A_OUT_H_ - -#ifdef __cplusplus -extern "C" { -#endif -#define COFF_IMAGE_WITH_PE -#define COFF_LONG_SECTION_NAMES - -/*** coff information for Intel 386/486. */ - - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - short f_magic; /* magic number */ - short f_nscns; /* number of sections */ - unsigned long f_timdat; /* time & date stamp */ - unsigned long f_symptr; /* file pointer to symtab */ - unsigned long f_nsyms; /* number of symtab entries */ - short f_opthdr; /* sizeof(optional hdr) */ - short f_flags; /* flags */ -}; - -/* Bits for f_flags: - * F_RELFLG relocation info stripped from file - * F_EXEC file is executable (no unresolved external references) - * F_LNNO line numbers stripped from file - * F_LSYMS local symbols stripped from file - * F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax) - */ - -#define F_RELFLG (0x0001) -#define F_EXEC (0x0002) -#define F_LNNO (0x0004) -#define F_LSYMS (0x0008) - - - -#define I386MAGIC 0x14c -#define I386PTXMAGIC 0x154 -#define I386AIXMAGIC 0x175 - -/* This is Lynx's all-platform magic number for executables. */ - -#define LYNXCOFFMAGIC 0415 - -#define I386BADMAG(x) (((x).f_magic != I386MAGIC) \ - && (x).f_magic != I386AIXMAGIC \ - && (x).f_magic != I386PTXMAGIC \ - && (x).f_magic != LYNXCOFFMAGIC) - -#define FILHDR struct external_filehdr -#define FILHSZ 20 - - -/********************** AOUT "OPTIONAL HEADER"= - **********************/ - - -typedef struct -{ - unsigned short magic; /* type of file */ - unsigned short vstamp; /* version stamp */ - unsigned long tsize; /* text size in bytes, padded to FW bdry*/ - unsigned long dsize; /* initialized data " " */ - unsigned long bsize; /* uninitialized data " " */ - unsigned long entry; /* entry pt. */ - unsigned long text_start; /* base of text used for this file */ - unsigned long data_start; /* base of data used for this file= - */ -} -AOUTHDR; - -#define AOUTSZ 28 -#define AOUTHDRSZ 28 - -#define OMAGIC 0404 /* object files, eg as output */ -#define ZMAGIC 0413 /* demand load format, eg normal ld output */ -#define STMAGIC 0401 /* target shlib */ -#define SHMAGIC 0443 /* host shlib */ - - -/* define some NT default values */ -/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ -#define NT_SECTION_ALIGNMENT 0x1000 -#define NT_FILE_ALIGNMENT 0x200 -#define NT_DEF_RESERVE 0x100000 -#define NT_DEF_COMMIT 0x1000 - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - unsigned long s_paddr; /* physical address, offset - of last addr in scn */ - unsigned long s_vaddr; /* virtual address */ - unsigned long s_size; /* section size */ - unsigned long s_scnptr; /* file ptr to raw data for section */ - unsigned long s_relptr; /* file ptr to relocation */ - unsigned long s_lnnoptr; /* file ptr to line numbers */ - unsigned short s_nreloc; /* number of relocation entries */ - unsigned short s_nlnno; /* number of line number entries*/ - unsigned long s_flags; /* flags */ -}; - -#define SCNHDR struct external_scnhdr -#define SCNHSZ 40 - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _COMMENT ".comment" -#define _LIB ".lib" - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - unsigned long l_symndx; /* function name symbol index, iff l_lnno 0 */ - unsigned long l_paddr; /* (physical) address of line number */ - } l_addr; - unsigned short l_lnno; /* line number */ -}; - -#define LINENO struct external_lineno -#define LINESZ 6 - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - unsigned long e_zeroes; - unsigned long e_offset; - } e; - } e; - unsigned long e_value; - unsigned short e_scnum; - unsigned short e_type; - char e_sclass[1]; - char e_numaux[1]; -}; - -#define N_BTMASK (0xf) -#define N_TMASK (0x30) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - -union external_auxent { - struct { - unsigned long x_tagndx; /* str, un, or enum tag indx */ - union { - struct { - unsigned short x_lnno; /* declaration line number */ - unsigned short x_size; /* str/union/array size */ - } x_lnsz; - unsigned long x_fsize; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - unsigned long x_lnnoptr;/* ptr to fcn line # */ - unsigned long x_endndx; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - unsigned short x_tvndx; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - unsigned long x_zeroes; - unsigned long x_offset; - } x_n; - } x_file; - - struct { - unsigned long x_scnlen; /* section length */ - unsigned short x_nreloc; /* # relocation entries */ - unsigned short x_nlinno; /* # line numbers */ - unsigned long x_checksum; /* section COMDAT checksum */ - unsigned short x_associated;/* COMDAT associated section index */ - char x_comdat[1]; /* COMDAT selection number */ - } x_scn; - - struct { - unsigned long x_tvfill; /* tv fill value */ - unsigned short x_tvlen; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 - -#define _ETEXT "etext" - -/********************** RELOCATION DIRECTIVES **********************/ - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_type[2]; -}; - -#define RELOC struct external_reloc -#define RELSZ 10 - -/* end of coff/i386.h */ - -/* PE COFF header information */ - -#ifndef _PE_H -#define _PE_H - -/* NT specific file attributes */ -#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 -#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 -#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 -#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 -#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 -#define IMAGE_FILE_32BIT_MACHINE 0x0100 -#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 -#define IMAGE_FILE_SYSTEM 0x1000 -#define IMAGE_FILE_DLL 0x2000 -#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 - -/* additional flags to be set for section headers to allow the NT loader to - read and write to the section data (to replace the addresses of data in - dlls for one thing); also to execute the section in .text's case= - */ -#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 -#define IMAGE_SCN_MEM_EXECUTE 0x20000000 -#define IMAGE_SCN_MEM_READ 0x40000000 -#define IMAGE_SCN_MEM_WRITE 0x80000000 - -/* - * Section characteristics added for ppc-nt - */ - -#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 /* Reserved. */ - -#define IMAGE_SCN_CNT_CODE 0x00000020 /* Section contains code. */ -#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 /* Section contains initialized data. */ -#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 /* Section contains uninitialized data. */ - -#define IMAGE_SCN_LNK_OTHER 0x00000100 /* Reserved. */ -#define IMAGE_SCN_LNK_INFO 0x00000200 /* Section contains comments or some other type of information. */ -#define IMAGE_SCN_LNK_REMOVE 0x00000800 /* Section contents will not become part of image. */ -#define IMAGE_SCN_LNK_COMDAT 0x00001000 /* Section contents comdat. */ - -#define IMAGE_SCN_MEM_FARDATA 0x00008000 - -#define IMAGE_SCN_MEM_PURGEABLE 0x00020000 -#define IMAGE_SCN_MEM_16BIT 0x00020000 -#define IMAGE_SCN_MEM_LOCKED 0x00040000 -#define IMAGE_SCN_MEM_PRELOAD 0x00080000 - -#define IMAGE_SCN_ALIGN_1BYTES 0x00100000 -#define IMAGE_SCN_ALIGN_2BYTES 0x00200000 -#define IMAGE_SCN_ALIGN_4BYTES 0x00300000 -#define IMAGE_SCN_ALIGN_8BYTES 0x00400000 -#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 /* Default alignment if no others are specified. */ -#define IMAGE_SCN_ALIGN_32BYTES 0x00600000 -#define IMAGE_SCN_ALIGN_64BYTES 0x00700000 - - -#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 /* Section contains extended relocations. */ -#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 /* Section is not cachable. */ -#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 /* Section is not pageable. */ -#define IMAGE_SCN_MEM_SHARED 0x10000000 /* Section is shareable. */ - -/* COMDAT selection codes. */ - -#define IMAGE_COMDAT_SELECT_NODUPLICATES (1) /* Warn if duplicates. */ -#define IMAGE_COMDAT_SELECT_ANY (2) /* No warning. */ -#define IMAGE_COMDAT_SELECT_SAME_SIZE (3) /* Warn if different size. */ -#define IMAGE_COMDAT_SELECT_EXACT_MATCH (4) /* Warn if different. */ -#define IMAGE_COMDAT_SELECT_ASSOCIATIVE (5) /* Base on other section. */ - -/* Magic values that are true for all dos/nt implementations */ -#define DOSMAGIC 0x5a4d -#define NT_SIGNATURE 0x00004550 - -/* NT allows long filenames, we want to accommodate this. This may break - some of the bfd functions */ -#undef FILNMLEN -#define FILNMLEN 18 /* # characters in a file name */ - - -#ifdef COFF_IMAGE_WITH_PE -/* The filehdr is only weired in images */ - -#undef FILHDR -struct external_PE_filehdr -{ - /* DOS header fields */ - unsigned short e_magic; /* Magic number, 0x5a4d */ - unsigned short e_cblp; /* Bytes on last page of file, 0x90 */ - unsigned short e_cp; /* Pages in file, 0x3 */ - unsigned short e_crlc; /* Relocations, 0x0 */ - unsigned short e_cparhdr; /* Size of header in paragraphs, 0x4 */ - unsigned short e_minalloc; /* Minimum extra paragraphs needed, 0x0 */ - unsigned short e_maxalloc; /* Maximum extra paragraphs needed, 0xFFFF */ - unsigned short e_ss; /* Initial (relative) SS value, 0x0 */ - unsigned short e_sp; /* Initial SP value, 0xb8 */ - unsigned short e_csum; /* Checksum, 0x0 */ - unsigned short e_ip; /* Initial IP value, 0x0 */ - unsigned short e_cs; /* Initial (relative) CS value, 0x0 */ - unsigned short e_lfarlc; /* File address of relocation table, 0x40 */ - unsigned short e_ovno; /* Overlay number, 0x0 */ - char e_res[4][2]; /* Reserved words, all 0x0 */ - unsigned short e_oemid; /* OEM identifier (for e_oeminfo), 0x0 */ - unsigned short e_oeminfo; /* OEM information; e_oemid specific, 0x0 */ - char e_res2[10][2]; /* Reserved words, all 0x0 */ - unsigned long e_lfanew; /* File address of new exe header, 0x80 */ - char dos_message[16][4]; /* other stuff, always follow DOS header */ - unsigned int nt_signature; /* required NT signature, 0x4550 */ - - /* From standard header */ - - unsigned short f_magic; /* magic number */ - unsigned short f_nscns; /* number of sections */ - unsigned long f_timdat; /* time & date stamp */ - unsigned long f_symptr; /* file pointer to symtab */ - unsigned long f_nsyms; /* number of symtab entries */ - unsigned short f_opthdr; /* sizeof(optional hdr) */ - unsigned short f_flags; /* flags */ -}; - - -#define FILHDR struct external_PE_filehdr -#undef FILHSZ -#define FILHSZ 152 - -#endif - -typedef struct -{ - unsigned short magic; /* type of file */ - unsigned short vstamp; /* version stamp */ - unsigned long tsize; /* text size in bytes, padded to FW bdry*/ - unsigned long dsize; /* initialized data " " */ - unsigned long bsize; /* uninitialized data " " */ - unsigned long entry; /* entry pt. */ - unsigned long text_start; /* base of text used for this file */ - unsigned long data_start; /* base of all data used for this file */ - - /* NT extra fields; see internal.h for descriptions */ - unsigned long ImageBase; - unsigned long SectionAlignment; - unsigned long FileAlignment; - unsigned short MajorOperatingSystemVersion; - unsigned short MinorOperatingSystemVersion; - unsigned short MajorImageVersion; - unsigned short MinorImageVersion; - unsigned short MajorSubsystemVersion; - unsigned short MinorSubsystemVersion; - char Reserved1[4]; - unsigned long SizeOfImage; - unsigned long SizeOfHeaders; - unsigned long CheckSum; - unsigned short Subsystem; - unsigned short DllCharacteristics; - unsigned long SizeOfStackReserve; - unsigned long SizeOfStackCommit; - unsigned long SizeOfHeapReserve; - unsigned long SizeOfHeapCommit; - unsigned long LoaderFlags; - unsigned long NumberOfRvaAndSizes; - /* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; */ - char DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars */ - -} PEAOUTHDR; - - -#undef AOUTSZ -#define AOUTSZ (AOUTHDRSZ + 196) - -#undef E_FILNMLEN -#define E_FILNMLEN 18 /* # characters in a file name */ -#endif - -/* end of coff/pe.h */ - -#define DT_NON (0) /* no derived type */ -#define DT_PTR (1) /* pointer */ -#define DT_FCN (2) /* function */ -#define DT_ARY (3) /* array */ - -#define ISPTR(x) (((x) & N_TMASK) == (DT_PTR << N_BTSHFT)) -#define ISFCN(x) (((x) & N_TMASK) == (DT_FCN << N_BTSHFT)) -#define ISARY(x) (((x) & N_TMASK) == (DT_ARY << N_BTSHFT)) - -#ifdef __cplusplus -} -#endif - -#endif /* _A_OUT_H_ */ - diff --git a/winsup/cygwin/include/arpa/ftp.h b/winsup/cygwin/include/arpa/ftp.h deleted file mode 100644 index 7d39a3e7a..000000000 --- a/winsup/cygwin/include/arpa/ftp.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 1983, 1989, 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. - * - * @(#)ftp.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _ARPA_FTP_H -#define _ARPA_FTP_H - -/* Definitions for FTP; see RFC-765. */ - -/* - * Reply codes. - */ -#define PRELIM 1 /* positive preliminary */ -#define COMPLETE 2 /* positive completion */ -#define CONTINUE 3 /* positive intermediate */ -#define TRANSIENT 4 /* transient negative completion */ -#define ERROR 5 /* permanent negative completion */ - -/* - * Type codes - */ -#define TYPE_A 1 /* ASCII */ -#define TYPE_E 2 /* EBCDIC */ -#define TYPE_I 3 /* image */ -#define TYPE_L 4 /* local byte size */ - -#ifdef FTP_NAMES -char *typenames[] = {"0", "ASCII", "EBCDIC", "Image", "Local" }; -#endif - -/* - * Form codes - */ -#define FORM_N 1 /* non-print */ -#define FORM_T 2 /* telnet format effectors */ -#define FORM_C 3 /* carriage control (ASA) */ -#ifdef FTP_NAMES -char *formnames[] = {"0", "Nonprint", "Telnet", "Carriage-control" }; -#endif - -/* - * Structure codes - */ -#define STRU_F 1 /* file (no record structure) */ -#define STRU_R 2 /* record structure */ -#define STRU_P 3 /* page structure */ -#ifdef FTP_NAMES -char *strunames[] = {"0", "File", "Record", "Page" }; -#endif - -/* - * Mode types - */ -#define MODE_S 1 /* stream */ -#define MODE_B 2 /* block */ -#define MODE_C 3 /* compressed */ -#ifdef FTP_NAMES -char *modenames[] = {"0", "Stream", "Block", "Compressed" }; -#endif - -/* - * Record Tokens - */ -#define REC_ESC '\377' /* Record-mode Escape */ -#define REC_EOR '\001' /* Record-mode End-of-Record */ -#define REC_EOF '\002' /* Record-mode End-of-File */ - -/* - * Block Header - */ -#define BLK_EOR 0x80 /* Block is End-of-Record */ -#define BLK_EOF 0x40 /* Block is End-of-File */ -#define BLK_ERRORS 0x20 /* Block is suspected of containing errors */ -#define BLK_RESTART 0x10 /* Block is Restart Marker */ - -#define BLK_BYTECOUNT 2 /* Bytes in this block */ - -#endif /* !_ARPA_FTP_H */ diff --git a/winsup/cygwin/include/arpa/inet.h b/winsup/cygwin/include/arpa/inet.h deleted file mode 100644 index d6b19fce7..000000000 --- a/winsup/cygwin/include/arpa/inet.h +++ /dev/null @@ -1,37 +0,0 @@ -/* arpa/inet.h - - Copyright 1997, 1998, 2001, 2002, 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _ARPA_INET_H -#define _ARPA_INET_H - -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -#ifndef __INSIDE_CYGWIN_NET__ -in_addr_t inet_addr (const char *); -int inet_aton (const char *, struct in_addr *); -in_addr_t inet_lnaof (struct in_addr); -struct in_addr inet_makeaddr (unsigned long , unsigned long); -in_addr_t inet_netof (struct in_addr); -in_addr_t inet_network (const char *); -char *inet_ntoa (struct in_addr); -int inet_pton (int, const char *, void *); -const char *inet_ntop (int, const void *, char *, socklen_t); -#endif - -#ifdef __cplusplus -}; -#endif - -#endif /* _ARPA_INET_H */ diff --git a/winsup/cygwin/include/arpa/telnet.h b/winsup/cygwin/include/arpa/telnet.h deleted file mode 100644 index 50874765c..000000000 --- a/winsup/cygwin/include/arpa/telnet.h +++ /dev/null @@ -1,322 +0,0 @@ -/* - * 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 - */ - -#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 -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 TELOPT_ENVIRON TELOPT_OLD_ENVIRON - -#define NTELOPTS (1+TELOPT_NEW_ENVIRON) -#ifdef TELOPTS -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 NSLC 18 - -/* - * For backwards compatability, 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", 0, -#ifdef SLC_NAMES -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 - -#define ENV_VALUE 0 -#define ENV_VAR 1 - -/* - * 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_CNT 5 - -#define AUTHTYPE_TEST 99 - -#ifdef AUTH_NAMES -char *authtype_names[] = { - "NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK", 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 send 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 -char *encrypt_names[] = { - "IS", "SUPPORT", "REPLY", "START", "END", - "REQUEST-START", "REQUEST-END", "ENC-KEYID", "DEC-KEYID", - 0, -}; -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 /* _ARPA_TELNET_H */ diff --git a/winsup/cygwin/include/asm/byteorder.h b/winsup/cygwin/include/asm/byteorder.h deleted file mode 100644 index fe6548b75..000000000 --- a/winsup/cygwin/include/asm/byteorder.h +++ /dev/null @@ -1,103 +0,0 @@ -/* asm/byteorder.h - - Copyright 1996, 1998, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _I386_BYTEORDER_H -#define _I386_BYTEORDER_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if 0 -#undef ntohl -#undef ntohs -#undef htonl -#undef htons -#endif - -#ifndef __LITTLE_ENDIAN -#define __LITTLE_ENDIAN 1234 -#endif - -#ifndef __LITTLE_ENDIAN_BITFIELD -#define __LITTLE_ENDIAN_BITFIELD -#endif - -#if 1 -extern unsigned long int ntohl(unsigned long int); -extern unsigned short int ntohs(unsigned short int); -extern unsigned long int htonl(unsigned long int); -extern unsigned short int htons(unsigned short int); - -extern __inline__ unsigned long int __ntohl(unsigned long int); -extern __inline__ unsigned short int __ntohs(unsigned short int); -extern __inline__ unsigned long int __constant_ntohl(unsigned long int); -extern __inline__ unsigned short int __constant_ntohs(unsigned short int); - -extern __inline__ unsigned long int -__ntohl(unsigned long int x) -{ - __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */ - "rorl $16,%0\n\t" /* swap words */ - "xchgb %b0,%h0" /* swap higher bytes */ - :"=q" (x) - : "0" (x)); - return x; -} - -#define __constant_ntohl(x) \ - ((unsigned long int)((((unsigned long int)(x) & 0x000000ffU) << 24) | \ - (((unsigned long int)(x) & 0x0000ff00U) << 8) | \ - (((unsigned long int)(x) & 0x00ff0000U) >> 8) | \ - (((unsigned long int)(x) & 0xff000000U) >> 24))) - -extern __inline__ unsigned short int -__ntohs(unsigned short int x) -{ - __asm__("xchgb %b0,%h0" /* swap bytes */ - : "=q" (x) - : "0" (x)); - return x; -} - -#define __constant_ntohs(x) \ - ((unsigned short int)((((unsigned short int)(x) & 0x00ff) << 8) | \ - (((unsigned short int)(x) & 0xff00) >> 8))) \ - -#define __htonl(x) __ntohl(x) -#define __htons(x) __ntohs(x) -#define __constant_htonl(x) __constant_ntohl(x) -#define __constant_htons(x) __constant_ntohs(x) - -#ifdef __OPTIMIZE__ -# define ntohl(x) \ -(__builtin_constant_p((long)(x)) ? \ - __constant_ntohl((x)) : \ - __ntohl((x))) -# define ntohs(x) \ -(__builtin_constant_p((short)(x)) ? \ - __constant_ntohs((x)) : \ - __ntohs((x))) -# define htonl(x) \ -(__builtin_constant_p((long)(x)) ? \ - __constant_htonl((x)) : \ - __htonl((x))) -# define htons(x) \ -(__builtin_constant_p((short)(x)) ? \ - __constant_htons((x)) : \ - __htons((x))) -#endif -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/winsup/cygwin/include/asm/socket.h b/winsup/cygwin/include/asm/socket.h deleted file mode 100644 index ed062190c..000000000 --- a/winsup/cygwin/include/asm/socket.h +++ /dev/null @@ -1,72 +0,0 @@ -/* asm/socket.h - - Copyright 1996, 1997, 1998, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _ASM_SOCKET_H -#define _ASM_SOCKET_H - -#include - -#define IOCPARM_MASK 0x7f /* parameters must be < 128 bytes */ -#define IOC_VOID 0x20000000 /* no parameters */ -#define IOC_OUT 0x40000000 /* copy out parameters */ -#define IOC_IN 0x80000000 /* copy in parameters */ - -#define _IO(x,y) (IOC_VOID|(x<<8)|y) -#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y) -#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y) - -#define SIOCATMARK _IOR('s', 7, u_long) /* at oob mark? */ -#define FIONREAD _IOR('f', 127, u_long) /* get # bytes to read */ -#define FIONBIO 0x8004667e /* To be compatible with termiost version */ -#define REAL_FIONBIO _IOW('f', 126, u_long) /* set/clear non-blocking i/o */ -#define FIOASYNC _IOW('f', 125, u_long) /* set/clear async i/o */ -#define SIOCSHIWAT _IOW('s', 0, u_long) /* set high watermark */ -#define SIOCGHIWAT _IOR('s', 1, u_long) /* get high watermark */ -#define SIOCSLOWAT _IOW('s', 2, u_long) /* set low watermark */ -#define SIOCGLOWAT _IOR('s', 3, u_long) /* get low watermark */ - -/* Needed for if queries */ -#define SIOCGIFCONF _IOW('s', 100, struct ifconf) /* get if list */ -#define SIOCGIFFLAGS _IOW('s', 101, struct ifreq) /* Get if flags */ -#define SIOCGIFADDR _IOW('s', 102, struct ifreq) /* Get if addr */ -#define SIOCGIFBRDADDR _IOW('s', 103, struct ifreq) /* Get if broadcastaddr */ -#define SIOCGIFNETMASK _IOW('s', 104, struct ifreq) /* Get if netmask */ -#define SIOCGIFHWADDR _IOW('s', 105, struct ifreq) /* Get hw addr */ -#define SIOCGIFMETRIC _IOW('s', 106, struct ifreq) /* get metric */ -#define SIOCGIFMTU _IOW('s', 107, struct ifreq) /* get MTU size */ - -#define SOL_SOCKET 0xffff /* options for socket level */ - -#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_DONTLINGER (u_int)(~SO_LINGER) -#define SO_PEERCRED 0x0200 /* same as getpeereid */ - -/* - * Additional 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 */ - -#endif /* _ASM_SOCKET_H */ - diff --git a/winsup/cygwin/include/asm/types.h b/winsup/cygwin/include/asm/types.h deleted file mode 100644 index 2653fd674..000000000 --- a/winsup/cygwin/include/asm/types.h +++ /dev/null @@ -1,23 +0,0 @@ -/* asm/types.h - - Copyright 1998, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _ASM_TYPES_H -#define _ASM_TYPES_H - -typedef __signed__ char __s8; -typedef unsigned char __u8; - -typedef __signed__ short __s16; -typedef unsigned short __u16; - -typedef __signed__ int __s32; -typedef unsigned int __u32; - -#endif /* _ASM_TYPES_H */ diff --git a/winsup/cygwin/include/byteswap.h b/winsup/cygwin/include/byteswap.h deleted file mode 100644 index cd5a726d4..000000000 --- a/winsup/cygwin/include/byteswap.h +++ /dev/null @@ -1,39 +0,0 @@ -/* byteswap.h - -Copyright 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _BYTESWAP_H -#define _BYTESWAP_H - -#ifdef __cplusplus -extern "C" { -#endif - -static __inline unsigned short -bswap_16 (unsigned short __x) -{ - return (__x >> 8) | (__x << 8); -} - -static __inline unsigned int -bswap_32 (unsigned int __x) -{ - return (bswap_16 (__x & 0xffff) << 16) | (bswap_16 (__x >> 16)); -} - -static __inline unsigned long long -bswap_64 (unsigned long long __x) -{ - return (((unsigned long long) bswap_32 (__x & 0xffffffffull)) << 32) | (bswap_32 (__x >> 32)); -} - -#ifdef __cplusplus -} -#endif -#endif /* _BYTESWAP_H */ diff --git a/winsup/cygwin/include/ctype.h b/winsup/cygwin/include/ctype.h deleted file mode 100644 index 05c950322..000000000 --- a/winsup/cygwin/include/ctype.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef _CTYPE_H_ -#define _CTYPE_H_ - -#include <_ansi.h> - -#ifdef __cplusplus -extern "C" { -#endif - -int __cdecl isalnum(int); -int __cdecl isalpha(int); -int __cdecl iscntrl(int); -int __cdecl isdigit(int); -int __cdecl isgraph(int); -int __cdecl islower(int); -int __cdecl isprint(int); -int __cdecl ispunct(int); -int __cdecl isspace(int); -int __cdecl isupper(int); -int __cdecl isxdigit(int); -int __cdecl tolower(int); -int __cdecl toupper(int); - -#ifndef __STRICT_ANSI__ -int __cdecl isblank(int); -int __cdecl isascii(int); -int __cdecl toascii(int); -int __cdecl _tolower(int); -int __cdecl _toupper(int); -#endif - -#define _U 01 -#define _L 02 -#define _N 04 -#define _S 010 -#define _P 020 -#define _C 040 -#define _X 0100 -#define _B 0200 - -#if defined (__INSIDE_CYGWIN__) || defined (_COMPILING_NEWLIB) -extern const char _ctype_[]; -#else -extern const __declspec(dllimport) char _ctype_[]; -#endif - -#if !defined(__cplusplus) || defined(__INSIDE_CYGWIN__) -#define isalpha(c) ((_ctype_+1)[(unsigned)(c)]&(_U|_L)) -#define isblank(c) ((c) == ' ' || (c) == '\t') -#define isupper(c) ((_ctype_+1)[(unsigned)(c)]&_U) -#define islower(c) ((_ctype_+1)[(unsigned)(c)]&_L) -#define isdigit(c) ((_ctype_+1)[(unsigned)(c)]&_N) -#define isxdigit(c) ((_ctype_+1)[(unsigned)(c)]&(_X|_N)) -#define isspace(c) ((_ctype_+1)[(unsigned)(c)]&_S) -#define ispunct(c) ((_ctype_+1)[(unsigned)(c)]&_P) -#define isalnum(c) ((_ctype_+1)[(unsigned)(c)]&(_U|_L|_N)) -#define isprint(c) ((_ctype_+1)[(unsigned)(c)]&(_P|_U|_L|_N|_B)) -#define isgraph(c) ((_ctype_+1)[(unsigned)(c)]&(_P|_U|_L|_N)) -#define iscntrl(c) ((_ctype_+1)[(unsigned)(c)]&_C) -/* Non-gcc versions will get the library versions, and will be - slightly slower */ -# define toupper(c) \ - __extension__ ({ int __x = (c); islower(__x) ? (__x - 'a' + 'A') : __x;}) -# define tolower(c) \ - __extension__ ({ int __x = (c); isupper(__x) ? (__x - 'A' + 'a') : __x;}) -#endif /* !__cplusplus */ - -#if !defined(__STRICT_ANSI__) || defined(__INSIDE_CYGWIN__) -#define isascii(c) ((unsigned)(c)<=0177) -#define toascii(c) ((c)&0177) -#endif - -#ifdef __cplusplus -} -#endif -#endif /* _CTYPE_H_ */ diff --git a/winsup/cygwin/include/cygwin/_types.h b/winsup/cygwin/include/cygwin/_types.h deleted file mode 100644 index b96267622..000000000 --- a/winsup/cygwin/include/cygwin/_types.h +++ /dev/null @@ -1,16 +0,0 @@ -/* cygwin/_types.h - - Copyright 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN__TYPES_H -#define _CYGWIN__TYPES_H - -typedef void *_flock_t; - -#endif /* _CYGWIN__TYPES_H */ diff --git a/winsup/cygwin/include/cygwin/acl.h b/winsup/cygwin/include/cygwin/acl.h deleted file mode 100644 index 3ea5f91e5..000000000 --- a/winsup/cygwin/include/cygwin/acl.h +++ /dev/null @@ -1,98 +0,0 @@ -/* cygwin/acl.h header file for Cygwin. - - Copyright 1999, 2000, 2001, 2002 Red Hat, Inc. - Written by C. Vinschen. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_ACL_H -#ifdef __cplusplus -extern "C" { -#endif -#define _CYGWIN_ACL_H - -#include <_ansi.h> - -#include -#include - -/* Values for `cmd' in calls to acl(2) and facl(2) */ -#define SETACL (0x0) -#define GETACL (0x1) -#define GETACLCNT (0x2) - -#define MIN_ACL_ENTRIES (4) // minimal acl entries from GETACLCNT -#define MAX_ACL_ENTRIES (256) // max entries of each type - -// Return values of aclcheck(3) in case of error */ -#define GRP_ERROR (0x1) -#define USER_ERROR (0x2) -#define CLASS_ERROR (0x3) -#define OTHER_ERROR (0x4) -#define DUPLICATE_ERROR (0x5) -#define ENTRY_ERROR (0x6) -#define MISS_ERROR (0x7) // which = -1 -#define MEM_ERROR (0x8) // which = -1 - -// Values for entry type of struct acl -#define USER_OBJ (0x0001) // owner -#define USER (0x0002) // additional user -#define GROUP_OBJ (0x0004) // owning group -#define GROUP (0x0008) // additional group -#define CLASS_OBJ (0x0010) // mask entry -#define OTHER_OBJ (0x0020) // others -#define ACL_DEFAULT (0x1000) // default flag -#define DEF_USER_OBJ (ACL_DEFAULT|USER_OBJ) // default owner -#define DEF_USER (ACL_DEFAULT|USER) // default additional user -#define DEF_GROUP_OBJ (ACL_DEFAULT|GROUP_OBJ) // default owning group -#define DEF_GROUP (ACL_DEFAULT|GROUP) // default additional group -#define DEF_CLASS_OBJ (ACL_DEFAULT|CLASS_OBJ) // default mask entry -#define DEF_OTHER_OBJ (ACL_DEFAULT|OTHER_OBJ) // default others -// Values with equivalent meanings -#define USER_OWNER USER_OBJ -#define GROUP_OWNER GROUP_OBJ -#define MASK CLASS_OBJ -#define OTHER OTHER_OBJ - -#ifdef __INSIDE_CYGWIN__ -typedef struct __acl16 { - int a_type; - __uid16_t a_id; - mode_t a_perm; -} __aclent16_t; - -typedef struct __acl32 { - int a_type; - __uid32_t a_id; - mode_t a_perm; -} __aclent32_t; -#else -typedef struct acl { - int a_type; /* entry type */ - uid_t a_id; /* UID | GID */ - mode_t a_perm; /* permissions */ -} aclent_t; -#endif - -#ifndef __INSIDE_CYGWIN__ -int _EXFUN(acl,(const char *path, int cmd, int nentries, aclent_t *aclbufp)); -int _EXFUN(lacl,(const char *path, int cmd, int nentries, aclent_t *aclbufp)); -int _EXFUN(facl,(int fd, int cmd, int nentries, aclent_t *aclbufp)); -int _EXFUN(aclcheck,(aclent_t *aclbufp, int nentries, int *which)); -int _EXFUN(aclsort,(int nentries, int calclass, aclent_t *aclbufp)); -int _EXFUN(acltomode,(aclent_t *aclbufp, int nentries, mode_t *modep)); -int _EXFUN(aclfrommode,(aclent_t *aclbufp, int nentries, mode_t *modep)); -int _EXFUN(acltopbits,(aclent_t *aclbufp, int nentries, mode_t *pbitsp)); -int _EXFUN(aclfrompbits,(aclent_t *aclbufp, int nentries, mode_t *pbitsp)); -char *_EXFUN(acltotext,(aclent_t *aclbufp, int aclcnt)); -aclent_t *_EXFUN(aclfromtext,(char *acltextp, int *aclcnt)); -#endif - -#ifdef __cplusplus -} -#endif -#endif /* _CYGWIN_ACL_H */ diff --git a/winsup/cygwin/include/cygwin/config.h b/winsup/cygwin/include/cygwin/config.h deleted file mode 100644 index e3e09f051..000000000 --- a/winsup/cygwin/include/cygwin/config.h +++ /dev/null @@ -1,48 +0,0 @@ -/* cygwin/config.h header file for Cygwin. - - This wraps Cygwin configuration setting which were in newlib's - sys/config.h before. THis way we can manaage our configuration - setting without bothering newlib. - - Copyright 2003 Red Hat, Inc. - Written by C. Vinschen. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_CONFIG_H -#ifdef __cplusplus -extern "C" { -#endif -#define _CYGWIN_CONFIG_H - -#define __DYNAMIC_REENT__ -#define __FILENAME_MAX__ (260 - 1 /* NUL */) -#define _READ_WRITE_RETURN_TYPE _ssize_t -#define __LARGE64_FILES 1 -#define __CYGWIN_USE_BIG_TYPES__ 1 -#ifdef __CYGWIN_USE_BIG_TYPES__ -/* __USE_INTERNAL_STAT64 is needed when building newlib for Cygwin. - It must be set when __CYGWIN_USE_BIG_TYPES__ is set. In this case - newlib will call the 64 bit stat calls internally. Otherwise the - struct stat used in newlib is not matching the struct stat used in - Cygwin. */ -#define __USE_INTERNAL_STAT64 1 -#endif -#if defined(__INSIDE_CYGWIN__) || defined(_COMPILING_NEWLIB) -#define __IMPORT -#else -#define __IMPORT __declspec(dllimport) -#endif - -#ifndef __WCHAR_MAX__ -#define __WCHAR_MAX__ 0xffffu -#endif - -#ifdef __cplusplus -} -#endif -#endif /* _CYGWIN_CONFIG_H */ diff --git a/winsup/cygwin/include/cygwin/core_dump.h b/winsup/cygwin/include/cygwin/core_dump.h deleted file mode 100644 index b1943937b..000000000 --- a/winsup/cygwin/include/cygwin/core_dump.h +++ /dev/null @@ -1,73 +0,0 @@ -/* core_dump.h - - Copyright 1999, 2000, 2001 Red Hat, Inc. - - Written by Egor Duda - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_CORE_DUMP_H -#define _CYGWIN_CORE_DUMP_H - -#include - -#define NOTE_INFO_PROCESS 1 -#define NOTE_INFO_THREAD 2 -#define NOTE_INFO_MODULE 3 - -struct win32_core_process_info -{ - DWORD pid; - int signal; - int command_line_size; - char command_line[1]; -} -#ifdef __GNUC__ - __attribute__ ((packed)) -#endif -; - -struct win32_core_thread_info -{ - DWORD tid; - BOOL is_active_thread; - CONTEXT thread_context; -} -#ifdef __GNUC__ - __attribute__ ((packed)) -#endif -; - -struct win32_core_module_info -{ - void* base_address; - int module_name_size; - char module_name[1]; -} -#ifdef __GNUC__ - __attribute__ ((packed)) -#endif -; - -struct win32_pstatus -{ - unsigned long data_type; - union - { - struct win32_core_process_info process_info; - struct win32_core_thread_info thread_info; - struct win32_core_module_info module_info; - } data ; -} -#ifdef __GNUC__ - __attribute__ ((packed)) -#endif -; - -typedef struct win32_pstatus win32_pstatus_t ; - -#endif /* _CYGWIN_CORE_DUMP_H */ diff --git a/winsup/cygwin/include/cygwin/cygwin_dll.h b/winsup/cygwin/include/cygwin/cygwin_dll.h deleted file mode 100644 index 80c9d13c6..000000000 --- a/winsup/cygwin/include/cygwin/cygwin_dll.h +++ /dev/null @@ -1,94 +0,0 @@ -/* cygwin_dll.h - - Copyright 1998, 1999, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef __CYGWIN_CYGWIN_DLL_H__ -#define __CYGWIN_CYGWIN_DLL_H__ - -#include - -#ifdef __cplusplus -#define CDECL_BEGIN extern "C" { -#define CDECL_END } -#else -#define CDECL_BEGIN -#define CDECL_END -#endif - -#define DECLARE_CYGWIN_DLL(Entry) \ - \ -CDECL_BEGIN \ - int WINAPI Entry (HINSTANCE h, DWORD reason, void *ptr); \ - typedef int (*mainfunc) (int, char **, char **); \ - extern int cygwin_attach_dll (HMODULE, mainfunc); \ - extern void cygwin_detach_dll (DWORD); \ -CDECL_END \ - \ -static HINSTANCE storedHandle; \ -static DWORD storedReason; \ -static void* storedPtr; \ - \ -static int __dllMain (int a, char **b, char **c) \ -{ \ - return Entry (storedHandle, storedReason, storedPtr); \ -} \ - \ -static DWORD dll_index; \ - \ -int WINAPI _cygwin_dll_entry (HINSTANCE h, DWORD reason, void *ptr) \ -{ \ - int ret; \ - ret = 1; \ - \ - switch (reason) \ - { \ - case DLL_PROCESS_ATTACH: \ - { \ - storedHandle = h; \ - storedReason = reason; \ - storedPtr = ptr; \ - dll_index = cygwin_attach_dll (h, &__dllMain); \ - if (dll_index == (DWORD) -1) \ - ret = 0; \ - } \ - break; \ - \ - case DLL_PROCESS_DETACH: \ - { \ - ret = Entry (h, reason, ptr); \ - if (ret) \ - { \ - cygwin_detach_dll (dll_index); \ - dll_index = (DWORD) -1; \ - } \ - } \ - break; \ - \ - case DLL_THREAD_ATTACH: \ - { \ - ret = Entry (h, reason, ptr); \ - } \ - break; \ - \ - case DLL_THREAD_DETACH: \ - { \ - ret = Entry (h, reason, ptr); \ - } \ - break; \ - } \ - return ret; \ -} \ - \ -/* OBSOLETE: This is only provided for source level compatibility. */ \ -int WINAPI _cygwin_noncygwin_dll_entry (HINSTANCE h, DWORD reason, void *ptr) \ -{ \ - return _cygwin_dll_entry (h, reason, ptr); \ -} \ - -#endif /* __CYGWIN_CYGWIN_DLL_H__ */ diff --git a/winsup/cygwin/include/cygwin/fs.h b/winsup/cygwin/include/cygwin/fs.h deleted file mode 100644 index eb8c7e3d1..000000000 --- a/winsup/cygwin/include/cygwin/fs.h +++ /dev/null @@ -1,20 +0,0 @@ -/* cygwin/fs.h - - Copyright 2002, 2003 Red Hat Inc. - Written by Chris January - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_FS_H_ -#define _CYGWIN_FS_H_ - -#define BLKRRPART 0x0000125f -#define BLKGETSIZE 0x00001260 -#define BLKSSZGET 0x00001268 -#define BLKGETSIZE64 0x00041268 - -#endif diff --git a/winsup/cygwin/include/cygwin/grp.h b/winsup/cygwin/include/cygwin/grp.h deleted file mode 100644 index 7dcae637d..000000000 --- a/winsup/cygwin/include/cygwin/grp.h +++ /dev/null @@ -1,48 +0,0 @@ -/* cygwin/grp.h - - Copyright 2002 Red Hat Inc. - Written by Corinna Vinschen - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_GRP_H_ -#define _CYGWIN_GRP_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __INSIDE_CYGWIN__ -struct __group16 -{ - char *gr_name; - char *gr_passwd; - __gid16_t gr_gid; - char **gr_mem; -}; - -struct __group32 -{ - char *gr_name; - char *gr_passwd; - __gid32_t gr_gid; - char **gr_mem; -}; - -struct __group32 * getgrgid32 (__gid32_t gid); -struct __group32 * getgrnam32 (const char *name); -__gid32_t getgid32 (); -__gid32_t getegid32 (); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* _CYGWIN_GRP_H_ */ diff --git a/winsup/cygwin/include/cygwin/hdreg.h b/winsup/cygwin/include/cygwin/hdreg.h deleted file mode 100644 index dc8157838..000000000 --- a/winsup/cygwin/include/cygwin/hdreg.h +++ /dev/null @@ -1,24 +0,0 @@ -/* cygwin/hdreg.h - - Copyright 2002 Red Hat Inc. - Written by Chris January - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_HDREG_H_ -#define _CYGWIN_HDREG_H_ - -struct hd_geometry { - unsigned char heads; - unsigned char sectors; - unsigned short cylinders; - unsigned long start; -}; - -#define HDIO_GETGEO 0x301 - -#endif diff --git a/winsup/cygwin/include/cygwin/icmp.h b/winsup/cygwin/include/cygwin/icmp.h deleted file mode 100644 index 7e7aedccd..000000000 --- a/winsup/cygwin/include/cygwin/icmp.h +++ /dev/null @@ -1 +0,0 @@ -/* icmp.h */ diff --git a/winsup/cygwin/include/cygwin/if.h b/winsup/cygwin/include/cygwin/if.h deleted file mode 100644 index b0953de36..000000000 --- a/winsup/cygwin/include/cygwin/if.h +++ /dev/null @@ -1,90 +0,0 @@ -/* cygwin/if.h - - Copyright 1996, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_IF_H_ -#define _CYGWIN_IF_H_ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include -#include - -/* Standard interface flags. */ -#define IFF_UP 0x1 /* interface is up */ -#define IFF_BROADCAST 0x2 /* broadcast address valid */ -#define IFF_LOOPBACK 0x8 /* is a loopback net */ -#define IFF_NOTRAILERS 0x20 /* avoid use of trailers */ -#define IFF_RUNNING 0x40 /* resources allocated */ -#define IFF_PROMISC 0x100 /* receive all packets */ -#define IFF_MULTICAST 0x1000 /* Supports multicast */ - -/* - * Interface request structure used for socket - * ioctl's. All interface ioctl's must have parameter - * definitions which begin with ifr_name. The - * remainder may be interface specific. - */ - -struct ifreq -{ -#define IFNAMSIZ 16 -#define IFHWADDRLEN 6 - union - { - char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */ - } ifr_ifrn; - - union { - struct sockaddr ifru_addr; - struct sockaddr ifru_broadaddr; - struct sockaddr ifru_netmask; - struct sockaddr ifru_hwaddr; - short ifru_flags; - int ifru_metric; - int ifru_mtu; - } ifr_ifru; -}; - -#define ifr_name ifr_ifrn.ifrn_name /* interface name */ -#define ifr_addr ifr_ifru.ifru_addr /* address */ -#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ -#define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */ -#define ifr_flags ifr_ifru.ifru_flags /* flags */ -#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ -#define ifr_metric ifr_ifru.ifru_metric /* metric */ -#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ - - -/* - * Structure used in SIOCGIFCONF request. - * Used to retrieve interface configuration - * for machine (useful for programs which - * must know all networks accessible). - */ - -struct ifconf -{ - int ifc_len; /* size of buffer */ - union - { - caddr_t ifcu_buf; - struct ifreq *ifcu_req; - } ifc_ifcu; -}; -#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ -#define ifc_req ifc_ifcu.ifcu_req /* array of structures */ - -#ifdef __cplusplus -}; -#endif /* __cplusplus */ - -#endif /* _CYGWIN_IF_H_ */ diff --git a/winsup/cygwin/include/cygwin/in.h b/winsup/cygwin/include/cygwin/in.h deleted file mode 100644 index a932ec6bf..000000000 --- a/winsup/cygwin/include/cygwin/in.h +++ /dev/null @@ -1,205 +0,0 @@ -/* - * INET An implementation of the TCP/IP protocol suite for the LINUX - * operating system. INET is implemented using the BSD Socket - * interface as the means of communication with the user level. - * - * Definitions of the Internet Protocol. - * - * Version: @(#)in.h 1.0.1 04/21/93 - * - * Authors: Original taken from the GNU Project file. - * Fred N. van Kempen, - * - * This program 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 of the License, or (at your option) any later version. - */ -#ifndef _CYGWIN_IN_H -#define _CYGWIN_IN_H - -#include - -typedef uint16_t in_port_t; -typedef uint32_t in_addr_t; - -/* Standard well-defined IP protocols. If you ever add one here, don't - forget to define it below. */ -enum -{ - IPPROTO_IP = 0, /* Dummy protocol for TCP */ - IPPROTO_ICMP = 1, /* Internet Control Message Protocol */ - IPPROTO_IGMP = 2, /* Internet Gateway Management Protocol */ - IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94) */ - IPPROTO_TCP = 6, /* Transmission Control Protocol */ - IPPROTO_EGP = 8, /* Exterior Gateway Protocol */ - IPPROTO_PUP = 12, /* PUP protocol */ - IPPROTO_UDP = 17, /* User Datagram Protocol */ - IPPROTO_IDP = 22, /* XNS IDP protocol */ - IPPROTO_RAW = 255, /* Raw IP packets */ - IPPROTO_MAX -}; - -/* Define IPPROTO_xxx values to accomodate SUSv3 */ -#define IPPROTO_IP IPPROTO_IP -#define IPPROTO_ICMP IPPROTO_ICMP -#define IPPROTO_IGMP IPPROTO_IGMP -#define IPPROTO_IPIP IPPROTO_IPIP -#define IPPROTO_TCP IPPROTO_TCP -#define IPPROTO_EGP IPPROTO_EGP -#define IPPROTO_PUP IPPROTO_PUP -#define IPPROTO_UDP IPPROTO_UDP -#define IPPROTO_IDP IPPROTO_IDP -#define IPPROTO_RAW IPPROTO_RAW - -/* Standard well-known ports. *//* from winsup/include/netinet/in.h */ -enum -{ - IPPORT_ECHO = 7, /* Echo service. */ - IPPORT_DISCARD = 9, /* Discard transmissions service. */ - IPPORT_SYSTAT = 11, /* System status service. */ - IPPORT_DAYTIME = 13, /* Time of day service. */ - IPPORT_NETSTAT = 15, /* Network status service. */ - IPPORT_FTP = 21, /* File Transfer Protocol. */ - IPPORT_TELNET = 23, /* Telnet protocol. */ - IPPORT_SMTP = 25, /* Simple Mail Transfer Protocol. */ - IPPORT_TIMESERVER = 37, /* Timeserver service. */ - IPPORT_NAMESERVER = 42, /* Domain Name Service. */ - IPPORT_WHOIS = 43, /* Internet Whois service. */ - IPPORT_MTP = 57, - - IPPORT_TFTP = 69, /* Trivial File Transfer Protocol. */ - IPPORT_RJE = 77, - IPPORT_FINGER = 79, /* Finger service. */ - IPPORT_TTYLINK = 87, - IPPORT_SUPDUP = 95, /* SUPDUP protocol. */ - - - IPPORT_EXECSERVER = 512, /* execd service. */ - IPPORT_LOGINSERVER = 513, /* rlogind service. */ - IPPORT_CMDSERVER = 514, - IPPORT_EFSSERVER = 520, - - /* UDP ports. */ - IPPORT_BIFFUDP = 512, - IPPORT_WHOSERVER = 513, - IPPORT_ROUTESERVER = 520, - - /* Ports less than this value are reserved for privileged processes. */ - IPPORT_RESERVED = 1024, - - /* Ports greater this value are reserved for (non-privileged) servers. */ - IPPORT_USERRESERVED = 5000 -}; - -/* Internet address. */ -struct in_addr -{ - in_addr_t s_addr; -}; - -/* Request struct for multicast socket ops */ - -struct ip_mreq -{ - struct in_addr imr_multiaddr; /* IP multicast address of group */ - struct in_addr imr_interface; /* local IP address of interface */ -}; - - -/* Structure describing an Internet (IP) socket address. */ -#define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ -struct sockaddr_in -{ - sa_family_t sin_family; /* Address family */ - in_port_t sin_port; /* Port number */ - struct in_addr sin_addr; /* Internet address */ - - /* Pad to size of `struct sockaddr'. */ - unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - - sizeof(unsigned short int) - sizeof(struct in_addr)]; -}; -#define sin_zero __pad /* for BSD UNIX comp. -FvK */ - -/* - * Definitions of the bits in an Internet address integer. - * On subnets, host and network parts are found according - * to the subnet mask, not these masks. - */ -#define IN_CLASSA(a) ((((long int) (a)) & 0x80000000) == 0) -#define IN_CLASSA_NET 0xff000000 -#define IN_CLASSA_NSHIFT 24 -#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET) -#define IN_CLASSA_MAX 128 - -#define IN_CLASSB(a) ((((long int) (a)) & 0xc0000000) == 0x80000000) -#define IN_CLASSB_NET 0xffff0000 -#define IN_CLASSB_NSHIFT 16 -#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET) -#define IN_CLASSB_MAX 65536 - -#define IN_CLASSC(a) ((((long int) (a)) & 0xe0000000) == 0xc0000000) -#define IN_CLASSC_NET 0xffffff00 -#define IN_CLASSC_NSHIFT 8 -#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET) - -#define IN_CLASSD(a) ((((long int) (a)) & 0xf0000000) == 0xe0000000) -#define IN_MULTICAST(a) IN_CLASSD(a) -#define IN_MULTICAST_NET 0xF0000000 - -#define IN_EXPERIMENTAL(a) ((((long int) (a)) & 0xe0000000) == 0xe0000000) -#define IN_BADCLASS(a) ((((long int) (a)) & 0xf0000000) == 0xf0000000) - -/* Address to accept any incoming messages. */ -#define INADDR_ANY ((unsigned long int) 0x00000000) - -/* Address to send to all hosts. */ -#define INADDR_BROADCAST ((unsigned long int) 0xffffffff) - -/* Address indicating an error return. */ -#define INADDR_NONE 0xffffffff - -/* Network number for local host loopback. */ -#define IN_LOOPBACKNET 127 - -/* Address to loopback in software to local host. */ -#define INADDR_LOOPBACK 0x7f000001 /* 127.0.0.1 */ -#define IN_LOOPBACK(a) ((((long int) (a)) & 0xff000000) == 0x7f000000) - -/* Defines for Multicast INADDR */ -#define INADDR_UNSPEC_GROUP 0xe0000000 /* 224.0.0.0 */ -#define INADDR_ALLHOSTS_GROUP 0xe0000001 /* 224.0.0.1 */ -#define INADDR_MAX_LOCAL_GROUP 0xe00000ff /* 224.0.0.255 */ - -#define INET_ADDRSTRLEN 16 - -/* contains the htonl type stuff.. */ - -#include - -/* Some random defines to make it easier in the kernel.. */ -#ifdef __KERNEL__ - -#define LOOPBACK(x) (((x) & htonl(0xff000000)) == htonl(0x7f000000)) -#define MULTICAST(x) (((x) & htonl(0xf0000000)) == htonl(0xe0000000)) - -#endif - -#ifdef USE_IPV6 -/* IPv6 definitions as we start to include them. This is just - a beginning dont get excited 8) */ -struct in6_addr -{ - uint8_t s6_addr[16]; -}; - -struct sockaddr_in6 -{ - sa_family_t sin6_family; /* AF_INET6 */ - in_port_t sin6_port; /* Port number. */ - uint32_t sin6_flowinfo; /* Traffic class and flow inf. */ - struct in6_addr sin6_addr; /* IPv6 address. */ - uint32_t sin6_scope_id; /* Set of interfaces for a scope. */ -}; -#endif -#endif /* _CYGWIN_IN_H */ diff --git a/winsup/cygwin/include/cygwin/in_systm.h b/winsup/cygwin/include/cygwin/in_systm.h deleted file mode 100644 index 1a2c1b2e7..000000000 --- a/winsup/cygwin/include/cygwin/in_systm.h +++ /dev/null @@ -1,34 +0,0 @@ -/* System specific type definitions for networking code. - * - * Version: @(#)in_systm.h 1.0.0 06/07/00 - * - * Authors: Original taken from the GNU Project file. - * Fred N. van Kempen, - * - * This program 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 of the License, or (at your option) any later version. - */ -#ifndef _CYGWIN_IN_SYSTM_H -#define _CYGWIN_IN_SYSTM_H - -#include -#include - -__BEGIN_DECLS - -/* - * Network order versions of various data types. Unfortunately, BSD - * assumes specific sizes for shorts (16 bit) and longs (32 bit) which - * don't hold in general. As a consequence, the network order versions - * may not reflect the actual size of the native data types. - */ - -typedef u_int16_t n_short; /* short as received from the net */ -typedef u_int32_t n_long; /* long as received from the net */ -typedef u_int32_t n_time; /* ms since 00:00 GMT, byte rev */ - -__END_DECLS - -#endif /* _CYGWIN_IN_SYSTM_H */ diff --git a/winsup/cygwin/include/cygwin/ipc.h b/winsup/cygwin/include/cygwin/ipc.h deleted file mode 100644 index 783778822..000000000 --- a/winsup/cygwin/include/cygwin/ipc.h +++ /dev/null @@ -1,71 +0,0 @@ -/* sys/ipc.h - - Copyright 2001, 2002 Red Hat Inc. - Written by Robert Collins - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_IPC_H -#define _CYGWIN_IPC_H - -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct ipc_perm -{ - uid_t uid; /* Owner's user ID. */ - gid_t gid; /* Owner's group ID. */ - uid_t cuid; /* Creator's user ID. */ - gid_t cgid; /* Creator's group ID. */ - mode_t mode; /* Read/write permission. */ - key_t key; - unsigned short seq; -}; - -/* Mode bits: - */ -#define IPC_CREAT 0x0200 /* Create entry if key does not exist. */ -#define IPC_EXCL 0x0400 /* Fail if key exists. */ -#define IPC_NOWAIT 0x0800 /* Error if request must wait. */ -#ifdef _KERNEL -#define IPC_KEY_IS_SHMID 0x1000 /* Used in shmget when called from shmat. */ -#endif - -/* Keys: - */ -#define IPC_PRIVATE ((key_t) 0) /* Private key. */ - -/* Control commands: - */ -#define IPC_RMID 0x1000 /* Remove identifier. */ -#define IPC_SET 0x1001 /* Set options. */ -#define IPC_STAT 0x1002 /* Get options. */ -#ifdef _KERNEL -#define IPC_INFO 0x1003 /* For ipcs(8). */ -#endif - -#ifdef _KERNEL -#define IPCID_TO_IX(id) ((id) & 0xffff) -#define IPCID_TO_SEQ(id) (((id) >> 16) & 0xffff) -#define IXSEQ_TO_IPCID(ix,perm) (((perm.seq) << 16) | (ix & 0xffff)) - -#define IPC_R 000400 /* read permission */ -#define IPC_W 000200 /* write/alter permission */ -#define IPC_M 010000 /* permission to change control info */ -#endif - -key_t ftok (const char *path, int id); - -#ifdef __cplusplus -} -#endif - -#endif /* _CYGWIN_IPC_H */ diff --git a/winsup/cygwin/include/cygwin/msg.h b/winsup/cygwin/include/cygwin/msg.h deleted file mode 100644 index 8679786dd..000000000 --- a/winsup/cygwin/include/cygwin/msg.h +++ /dev/null @@ -1,102 +0,0 @@ -/* sys/msg.h - - Copyright 2002 Red Hat Inc. - Written by Conrad Scott - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_MSG_H -#define _CYGWIN_MSG_H - -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Message operation flags: - */ -#define MSG_NOERROR 0x01 /* No error if big message. */ - -#ifdef _KERNEL -/* Command definitions for the semctl () function: - */ -#define MSG_STAT 0x2000 /* For ipcs(8) */ -#define MSG_INFO 0x2001 /* For ipcs(8) */ -#endif /* _KERNEL */ - -/* Used for the number of messages in the message queue. - */ -typedef unsigned long msgqnum_t; - -/* Used for the number of bytes allowed in a message queue. - */ -typedef unsigned long msglen_t; - -struct msqid_ds -{ - struct ipc_perm msg_perm; /* Operation permission structure. */ - msglen_t msg_cbytes; /* Number of bytes currently on queue. */ - msgqnum_t msg_qnum; /* Number of messages currently on queue. */ - msglen_t msg_qbytes; /* Maximum number of bytes allowed on queue. */ - pid_t msg_lspid; /* Process ID of last msgsnd (). */ - pid_t msg_lrpid; /* Process ID of last msgrcv (). */ - timestruc_t msg_stim; /* Time of last msgsnd (). */ - timestruc_t msg_rtim; /* Time of last msgrcv (). */ - timestruc_t msg_ctim; /* Time of last change. */ -#ifdef _KERNEL - struct msg *msg_first; - struct msg *msg_last; -#else - long msg_spare4[2]; -#endif /* _KERNEL */ -}; - -#define msg_stime msg_stim.tv_sec -#define msg_rtime msg_rtim.tv_sec -#define msg_ctime msg_ctim.tv_sec - -#ifdef _KERNEL -/* Buffer type for msgctl (IPC_INFO, ...) as used by ipcs(8). - */ -struct msginfo -{ - long msgmax; /* Maximum number of bytes per - message. */ - long msgmnb; /* Maximum number of bytes on any one - message queue. */ - long msgmni; /* Maximum number of message queues, - system wide. */ - long msgtql; /* Maximum number of messages, system - wide. */ - long msgssz; /* Size of a message segment, must be - small power of 2 greater than 4. */ - long msgseg; /* Number of message segments */ - long msg_spare[2]; -}; - -/* Buffer type for msgctl (MSG_INFO, ...) as used by ipcs(8). - */ -struct msg_info -{ - long msg_ids; /* Number of allocated queues. */ - long msg_num; /* Number of messages, system wide. */ - long msg_tot; /* Size in bytes of messages, system wide. */ -}; -#endif /* _KERNEL */ - -int msgctl (int msqid, int cmd, struct msqid_ds *buf); -int msgget (key_t key, int msgflg); -ssize_t msgrcv (int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); -int msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg); - -#ifdef __cplusplus -} -#endif - -#endif /* _CYGWIN_MSG_H */ diff --git a/winsup/cygwin/include/cygwin/mtio.h b/winsup/cygwin/include/cygwin/mtio.h deleted file mode 100644 index 04d5df451..000000000 --- a/winsup/cygwin/include/cygwin/mtio.h +++ /dev/null @@ -1,313 +0,0 @@ -/* cygwin/mtio.h - - Copyright 1999, 2001, 2004 Red Hat, Inc. - - Written by Corinna Vinschen - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* cygwin/mtio.h header file for Cygwin. - - by C. Vinschen. */ - -#ifndef _CYGWIN_MTIO_H -#define _CYGWIN_MTIO_H - -#include -#include - -#ifndef DEFTAPE -#define DEFTAPE "/dev/tape" -#endif - -/* - * Structures and definitions for mag tape io control commands - */ - -/* structure for MTIOCTOP - mag tape op command */ -struct mtop { - short mt_op; /* operations defined below */ - int mt_count; /* how many of them */ -}; - -/* Magnetic Tape operations [Not all operations supported by all drivers]: */ -#define MTRESET 0 /* reset drive in case of problems */ -#define MTFSF 1 /* forward space over FileMark, - * position at first record of next file - */ -#define MTBSF 2 /* backward space FileMark (position before FM) */ -#define MTFSR 3 /* forward space record */ -#define MTBSR 4 /* backward space record */ -#define MTWEOF 5 /* write an end-of-file record (mark) */ -#define MTREW 6 /* rewind */ -#define MTOFFL 7 /* rewind and put the drive offline (eject?) */ -#define MTNOP 8 /* no op, set status only (read with MTIOCGET) */ -#define MTRETEN 9 /* retension tape */ -#define MTBSFM 10 /* +backward space FileMark, position at FM */ -#define MTFSFM 11 /* +forward space FileMark, position at FM */ -#define MTEOM 12 /* goto end of recorded media (for appending files). - * MTEOM positions after the last FM, ready for - * appending another file. - */ -#define MTERASE 13 /* erase tape -- be careful! */ - -#define MTRAS1 14 /* run self test 1 (nondestructive) */ -#define MTRAS2 15 /* run self test 2 (destructive) */ -#define MTRAS3 16 /* reserved for self test 3 */ - -#define MTSETBLK 20 /* set block length (SCSI) */ -#define MTSETDENSITY 21 /* set tape density (SCSI) */ -#define MTSEEK 22 /* seek to block (Tandberg, etc.) */ -#define MTTELL 23 /* tell block (Tandberg, etc.) */ -#define MTSETDRVBUFFER 24 /* set the drive buffering according to SCSI-2 */ - /* ordinary buffered operation with code 1 */ -#define MTFSS 25 /* space forward over setmarks */ -#define MTBSS 26 /* space backward over setmarks */ -#define MTWSM 27 /* write setmarks */ - -#define MTLOCK 28 /* lock the drive door */ -#define MTUNLOCK 29 /* unlock the drive door */ -#define MTLOAD 30 /* execute the SCSI load command */ -#define MTUNLOAD 31 /* execute the SCSI unload command */ -#define MTCOMPRESSION 32/* control compression with SCSI mode page 15 */ -#define MTSETPART 33 /* Change the active tape partition */ -#define MTMKPART 34 /* Format the tape with one or two partitions */ - -/* structure for MTIOCGET - mag tape get status command */ - -struct mtget { - long mt_type; /* type of magtape device */ - long mt_resid; /* residual count: (not sure) - * number of bytes ignored, or - * number of files not skipped, or - * number of records not skipped. - * Cygwin: remaining KB until 1.5.7. - * active partition since 1.5.8 - * (same as on GNU-Linux). - */ - /* the following registers are device dependent */ - long mt_dsreg; /* status register, Contains blocksize and - density code. See MT_ST_xxx macros below */ - long mt_gstat; /* generic (device independent) status */ - long mt_erreg; /* error register */ - /* The next two fields are not always used */ - long mt_fileno; /* number of current file on tape */ - long mt_blkno; /* current block number */ - /* The next are Windows NT specific */ - long long mt_capacity; /* Tape capacity in bytes */ - long long mt_remaining; /* Remaining bytes */ - int mt_minblksize; - int mt_maxblksize; - int mt_defblksize; - unsigned long mt_featureslow; - unsigned long mt_featureshigh; - unsigned long mt_eotwarningzonesize; -}; - -/* structure for MTIOCPOS - mag tape get position command */ - -struct mtpos { - long mt_blkno; /* current block number */ -}; - - -/* mag tape io control commands */ -#define MTIOCTOP _IOW('m', 1, struct mtop) /* do a mag tape op */ -#define MTIOCGET _IOR('m', 2, struct mtget) /* get tape status */ -#define MTIOCPOS _IOR('m', 3, struct mtpos) /* get tape position */ - -/* Generic Mag Tape (device independent) status macros for examining - * mt_gstat -- HP-UX compatible. - * There is room for more generic status bits here, but I don't - * know which of them are reserved. At least three or so should - * be added to make this really useful. - */ -#define GMT_EOF(x) ((x) & 0x80000000) -#define GMT_BOT(x) ((x) & 0x40000000) -#define GMT_EOT(x) ((x) & 0x20000000) -#define GMT_SM(x) ((x) & 0x10000000) /* DDS setmark */ -#define GMT_EOD(x) ((x) & 0x08000000) /* DDS EOD */ -#define GMT_WR_PROT(x) ((x) & 0x04000000) -#define GMT_REP_SM(x) ((x) & 0x02000000) /* Cygwin: rep. setmarks */ -#define GMT_ONLINE(x) ((x) & 0x01000000) -#define GMT_D_6250(x) ((x) & 0x00800000) -#define GMT_D_1600(x) ((x) & 0x00400000) -#define GMT_D_800(x) ((x) & 0x00200000) -#define GMT_PADDING(x) ((x) & 0x00100000) /* Cygwin: data padding */ -#define GMT_HW_ECC(x) ((x) & 0x00080000) /* Cygwin: HW error corr. */ -#define GMT_DR_OPEN(x) ((x) & 0x00040000) /* door open (no tape) */ -#define GMT_HW_COMP(x) ((x) & 0x00020000) /* Cygwin: HW compression */ -#define GMT_IM_REP_EN(x) ((x) & 0x00010000) /* immediate report mode */ -#define GMT_CLN(x) ((x) & 0x00008000) /* cleaning requested */ -/* 15 generic status bits unused */ -/* Cygwin only: The below settings are also used by the GNU-Linux SCSI tape - driver but they aren't usually reported here. Unfortunately, there's no - other official method to retrieve the values of these settings and - reporting them here apparently doesn't hurt. */ -#define GMT_TWO_FM(x) ((x) & 0x00000080) /* two fm after write */ -#define GMT_FAST_MTEOM(x) ((x) & 0x00000040) /* fast seek to eom */ -#define GMT_AUTO_LOCK(x) ((x) & 0x00000020) /* auto door lock on r/w */ -#define GMT_SYSV(x) ((x) & 0x00000010) /* SYSV read semantics */ -#define GMT_NOWAIT(x) ((x) & 0x00000008) /* don't wait for positioning commands */ -#define GMT_ASYNC(x) ((x) & 0x00000004) /* asynchronous writes */ - - -/* SCSI-tape specific definitions */ -/* Bitfield shifts in the status mt_dsreg */ -#define MT_ST_BLKSIZE_SHIFT 0 -#define MT_ST_BLKSIZE_MASK 0xffffff -#define MT_ST_DENSITY_SHIFT 24 -#define MT_ST_DENSITY_MASK 0xff000000 - -#define MT_ST_SOFTERR_SHIFT 0 -#define MT_ST_SOFTERR_MASK 0xffff - -/* Bitfields for the MTSETDRVBUFFER ioctl. */ -#define MT_ST_OPTIONS 0xf0000000 -#define MT_ST_BOOLEANS 0x10000000 -#define MT_ST_SETBOOLEANS 0x30000000 -#define MT_ST_CLEARBOOLEANS 0x40000000 -#define MT_ST_WRITE_THRESHOLD 0x20000000 /* Not supported */ -#define MT_ST_DEF_OPTIONS 0x60000000 /* Not supported */ -#define MT_ST_EOT_WZ_SIZE 0xf0000000 /* Cygwin only */ - -#define MT_ST_BUFFER_WRITES 0x00000001 -#define MT_ST_ASYNC_WRITES 0x00000002 -#define MT_ST_READ_AHEAD 0x00000004 /* Not supported */ -#define MT_ST_DEBUGGING 0x00000008 /* Not supported */ -#define MT_ST_TWO_FM 0x00000010 -#define MT_ST_FAST_MTEOM 0x00000020 -#define MT_ST_AUTO_LOCK 0x00000040 -#define MT_ST_DEF_WRITES 0x00000080 /* Not supported */ -#define MT_ST_CAN_BSR 0x00000100 /* Not supported */ -#define MT_ST_NO_BLKLIMS 0x00000200 /* Not supported */ -#define MT_ST_CAN_PARTITIONS 0x00000400 /* Not supported */ -#define MT_ST_SCSI2LOGICAL 0x00000800 /* Not supported */ -#define MT_ST_SYSV 0x00001000 -#define MT_ST_NOWAIT 0x00002000 -#define MT_ST_ECC 0x00010000 /* Cygwin only */ -#define MT_ST_PADDING 0x00020000 /* Cygwin only */ -#define MT_ST_REPORT_SM 0x00040000 /* Cygwin only */ - -/* - * Constants for mt_type. Not all of these are supported, - * and these are not all of the ones that are supported. - * - * Only used when not colliding with Windows codes (see below) - */ -#define MT_ISUNKNOWN 0x01 -#define MT_ISQIC02 0x02 /* Generic QIC-02 tape streamer */ -#define MT_ISWT5150 0x03 /* Wangtek 5150EQ, QIC-150, QIC-02 */ -#define MT_ISARCHIVE_5945L2 0x04 /* Archive 5945L-2, QIC-24, QIC-02? */ -#define MT_ISCMSJ500 0x05 /* CMS Jumbo 500 (QIC-02?) */ -#define MT_ISTDC3610 0x06 /* Tandberg 6310, QIC-24 */ -#define MT_ISARCHIVE_VP60I 0x07 /* Archive VP60i, QIC-02 */ -#define MT_ISARCHIVE_2150L 0x08 /* Archive Viper 2150L */ -#define MT_ISARCHIVE_2060L 0x09 /* Archive Viper 2060L */ -#define MT_ISARCHIVESC499 0x0A /* Archive SC-499 QIC-36 controller */ -#define MT_ISQIC02_ALL_FEATURES 0x0F /* Generic QIC-02 with all features */ -#define MT_ISWT5099EEN24 0x11 /* Wangtek 5099-een24, 60MB, QIC-24 */ -#define MT_ISTEAC_MT2ST 0x12 /* Teac MT-2ST 155mb drive, Teac DC-1 card (Wangtek type) */ -#define MT_ISEVEREX_FT40A 0x32 /* Everex FT40A (QIC-40) */ -#define MT_ISDDS1 0x51 /* DDS device without partitions */ -#define MT_ISDDS2 0x52 /* DDS device with partitions */ -#define MT_ISSCSI1 0x71 /* Generic ANSI SCSI-1 tape unit */ -#define MT_ISSCSI2 0x72 /* Generic ANSI SCSI-2 tape unit */ - -/* More constants for mt_type. These are the codes used by Windows >= 5.1 */ -#define MT_ISDDS_4mm 0x20 -#define MT_ISMiniQic 0x21 -#define MT_ISTravan 0x22 -#define MT_ISQIC 0x23 -#define MT_ISMP_8mm 0x24 -#define MT_ISAME_8mm 0x25 -#define MT_ISAIT1_8mm 0x26 -#define MT_ISDLT 0x27 -#define MT_ISNCTP 0x28 -#define MT_ISIBM_3480 0x29 -#define MT_ISIBM_3490E 0x2a -#define MT_ISIBM_Magstar_3590 0x2b -#define MT_ISIBM_Magstar_MP 0x2c -#define MT_ISSTK_DATA_D3 0x2d -#define MT_ISSONY_DTF 0x2e -#define MT_ISDV_6mm 0x2f -#define MT_ISDMI 0x30 -#define MT_ISSONY_D2 0x31 -#define MT_ISCLEANER_CARTRIDGE 0x32 -#define MT_ISAVATAR_F2 0x4f -#define MT_ISMP2_8mm 0x50 -#define MT_ISDST_S 0x51 -#define MT_ISDST_M 0x52 -#define MT_ISDST_L 0x53 -#define MT_ISVXATape_1 0x54 -#define MT_ISVXATape_2 0x55 -#define MT_ISSTK_9840 0x56 -#define MT_ISLTO_Ultrium 0x57 -#define MT_ISLTO_Accelis 0x58 -#define MT_ISAIT_8mm 0x5a -#define MT_ISADR_1 0x5b -#define MT_ISADR_2 0x5c -#define MT_ISSTK_9940 0x5d - -struct mt_tape_info { - long t_type; /* device type id (mt_type) */ - char *t_name; /* descriptive name */ -}; - -#define MT_TAPE_INFO { \ - {MT_ISUNKNOWN, "Unknown type of tape device"}, \ - {MT_ISQIC02, "Generic QIC-02 tape streamer"}, \ - {MT_ISWT5150, "Wangtek 5150, QIC-150"}, \ - {MT_ISARCHIVE_5945L2, "Archive 5945L-2"}, \ - {MT_ISCMSJ500, "CMS Jumbo 500"}, \ - {MT_ISTDC3610, "Tandberg TDC 3610, QIC-24"}, \ - {MT_ISARCHIVE_VP60I, "Archive VP60i, QIC-02"}, \ - {MT_ISARCHIVE_2150L, "Archive Viper 2150L"}, \ - {MT_ISARCHIVE_2060L, "Archive Viper 2060L"}, \ - {MT_ISARCHIVESC499, "Archive SC-499 QIC-36 controller"}, \ - {MT_ISQIC02_ALL_FEATURES, "Generic QIC-02 tape, all features"}, \ - {MT_ISWT5099EEN24, "Wangtek 5099-een24, 60MB"}, \ - {MT_ISTEAC_MT2ST, "Teac MT-2ST 155mb data cassette drive"}, \ - {MT_ISDDS_4mm, "DDS"}, \ - {MT_ISMiniQic, "MiniQic"}, \ - {MT_ISTravan, "Travan tape"}, \ - {MT_ISQIC, "QIC tape"}, \ - {MT_ISMP_8mm, "8mm Exabyte metal particle tape"}, \ - {MT_ISAME_8mm, "8mm Exabyte advanced metal evap tape"}, \ - {MT_ISAIT1_8mm, "8mm Sony AIT1 tape"}, \ - {MT_ISDLT, "DLT compact tape)"}, \ - {MT_ISNCTP, "Philips NCTP tape"}, \ - {MT_ISIBM_3480, "IBM 3480 tape"}, \ - {MT_ISIBM_3490E, "IBM 3490E tape"}, \ - {MT_ISIBM_Magstar_3590, "IBM Magstar 3590 tape"}, \ - {MT_ISIBM_Magstar_MP, "IBM Magstar MP tape"}, \ - {MT_ISSTK_DATA_D3, "STK data D3 tape"}, \ - {MT_ISSONY_DTF, "Sony DTF tape"}, \ - {MT_ISDV_6mm, "6mm digital video tape"}, \ - {MT_ISDMI, "Exabyte DMI tape"}, \ - {MT_ISSONY_D2, "Sony D2S or D2L tape"}, \ - {MT_ISCLEANER_CARTRIDGE, "Cleaner (all drive types that support cleaners)"}, \ - {MT_ISAVATAR_F2, "Avatar 2"}, \ - {MT_ISMP2_8mm, "8mm Hitachi tape"}, \ - {MT_ISDST_S, "Ampex DST small tape"}, \ - {MT_ISDST_M, "Ampex DST medium tape"}, \ - {MT_ISDST_L, "Ampex DST large tape"}, \ - {MT_ISVXATape_1, "Ecrix 8mm tape"}, \ - {MT_ISVXATape_2, "Ecrix 8mm tape"}, \ - {MT_ISSTK_9840, "STK 9840"}, \ - {MT_ISLTO_Ultrium, "LTO Ultrium (IBM, HP, Seagate)"}, \ - {MT_ISLTO_Accelis, "LTO Accelis (IBM, HP, Seagate)"}, \ - {MT_ISAIT_8mm, "AIT tape (AIT2 or higher)"}, \ - {MT_ISADR_1, "OnStream ADR1"}, \ - {MT_ISADR_2, "OnStream ADR2"}, \ - {MT_ISSTK_9940, "STK 9940"}, \ - {MT_ISSCSI1, "Generic SCSI-1 tape"}, \ - {MT_ISSCSI2, "Generic SCSI-2 tape"}, \ - {0, NULL} \ -} - -#endif /* _CYGWIN_MTIO_H */ diff --git a/winsup/cygwin/include/cygwin/rdevio.h b/winsup/cygwin/include/cygwin/rdevio.h deleted file mode 100644 index 73059ac09..000000000 --- a/winsup/cygwin/include/cygwin/rdevio.h +++ /dev/null @@ -1,42 +0,0 @@ -/* cygwin/rdevio.h - - Copyright 1999, 2001 Red Hat, Inc. - - Written by Corinna Vinschen - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* - * cygwin/rdevio.h header file for Cygwin. - * - * Written by C. Vinschen. - */ - -#ifndef _CYGWIN_RDEVIO_H -#define _CYGWIN_RDEVIO_H - -/* structure for RDIOCDOP - raw device operation */ -struct rdop { - short rd_op; - unsigned long rd_parm; -}; - -/* Raw device operations */ -#define RDSETBLK 1 /* set buffer for driver */ - -/* structure for RDIOCGET - get raw device */ -struct rdget { - unsigned long bufsiz; -}; - -/* - * ioctl commands -*/ -#define RDIOCDOP _IOW('r', 128, struct rdop) -#define RDIOCGET _IOR('r', 129, struct rdget) - -#endif /* _CYGWIN_RDEVIO_H */ diff --git a/winsup/cygwin/include/cygwin/sem.h b/winsup/cygwin/include/cygwin/sem.h deleted file mode 100644 index af7a42f36..000000000 --- a/winsup/cygwin/include/cygwin/sem.h +++ /dev/null @@ -1,128 +0,0 @@ -/* sys/sem.h - - Copyright 2002 Red Hat Inc. - Written by Conrad Scott - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_SEM_H -#define _CYGWIN_SEM_H - -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Semaphore operation flags: - */ -#define SEM_UNDO 010000 /* Set up adjust on exit entry. */ - -/* Command definitions for the semctl () function: - */ -#define GETNCNT 0x3000 /* Get semncnt. */ -#define GETPID 0x3001 /* Get sempid. */ -#define GETVAL 0x3002 /* Get semval. */ -#define GETALL 0x3003 /* Get all cases of semval. */ -#define GETZCNT 0x3004 /* Get semzcnt. */ -#define SETVAL 0x3005 /* Set semval. */ -#define SETALL 0x3006 /* Set all cases of semval. */ - -#ifdef _KERNEL -#define SEM_STAT 0x3010 /* For ipcs(8). */ -#define SEM_INFO 0x3011 /* For ipcs(8). */ -#endif /* _KERNEL */ - -struct semid_ds -{ - struct ipc_perm sem_perm; /* Operation permission structure. */ - unsigned short sem_nsems; /* Number of semaphores in set. */ - timestruc_t sem_otim; /* Last semop () time. */ - timestruc_t sem_ctim; /* Last time changed by semctl (). */ -#ifdef _KERNEL - struct sem *sem_base; /* pointer to first semaphore in set */ - long sem_spare4[1]; -#else - long sem_spare4[2]; -#endif /* _KERNEL */ -}; - -#define sem_otime sem_otim.tv_sec -#define sem_ctime sem_ctim.tv_sec - -struct sembuf -{ - unsigned short sem_num; /* Semaphore number. */ - short sem_op; /* Semaphore operation. */ - short sem_flg; /* Operation flags. */ -}; - -#ifdef _KERNEL -/* Buffer type for semctl (IPC_INFO, ...) as used by ipcs(8). - */ -struct seminfo -{ - long semmni; /* Maximum number of unique semaphore - sets, system wide. */ - long semmns; /* Maximum number of semaphores, - system wide. */ - long semmsl; /* Maximum number of semaphores per - semaphore set. */ - long semopm; /* Maximum number of operations per - semop call. */ - long semmnu; /* Maximum number of undo structures, - system wide. */ - long semume; /* Maximum number of undo entries per - undo structure. */ - long semvmx; /* Maximum semaphore value. */ - long semaem; /* Maximum adjust-on-exit value. */ - long semmap; /* # of entries in semaphore map */ - long semusz; /* size in bytes of undo structure */ - long sem_spare[2]; -}; - -/* Buffer type for semctl (SEM_INFO, ...) as used by ipcs(8). - */ -struct sem_info -{ - long sem_ids; /* Number of allocated semaphore sets. */ - long sem_num; /* Number of allocated semaphores. */ -}; - -/* Permission flags */ -#define SEM_A IPC_W /* alter permission */ -#define SEM_R IPC_R /* read permission */ - -/* Internally used mode bits. */ -#define SEM_ALLOC 01000 /* semaphore is allocated */ - -#endif /* _KERNEL */ - -#ifdef _KERNEL -/* According to SUSv3, "the fourth argument [to semctl()] is optional and - depends upon the operation requested. If required, it is of type - union semun, which the application shall explicitly declare:" */ -union semun { - int val; /* value for SETVAL */ - struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */ - unsigned short *array; /* array for GETALL, SETALL */ -}; -/* Therefore this union is only declared here if building internal code. - _KERNEL must not be defined in exernal applications! Declare union - semun explicitely as required by SUSv3, please. */ -#endif /* _KERNEL */ - -int semctl (int semid, int semnum, int cmd, ...); -int semget (key_t key, int nsems, int semflg); -int semop (int semid, struct sembuf *sops, size_t nsops); - -#ifdef __cplusplus -} -#endif - -#endif /* _CYGWIN_SEM_H */ diff --git a/winsup/cygwin/include/cygwin/shm.h b/winsup/cygwin/include/cygwin/shm.h deleted file mode 100644 index 2c882012c..000000000 --- a/winsup/cygwin/include/cygwin/shm.h +++ /dev/null @@ -1,106 +0,0 @@ -/* sys/shm.h - - Copyright 2001, 2002 Red Hat Inc. - Written by Robert Collins - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_SHM_H -#define _CYGWIN_SHM_H - -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Segment low boundary address multiple. - * - * 64 Kb was hardcoded for x86. MS states this may change so the constant - * expression is replaced by a function call returning the correct value. */ -#define SHMLBA (cygwin_internal (CW_GET_SHMLBA)) - -/* Shared memory operation flags: - */ -#define SHM_RDONLY 0x01 /* Attach read-only (else read-write). */ -#define SHM_RND 0x02 /* Round attach address to SHMLBA. */ - -#ifdef _KERNEL -/* Command definitions for the semctl () function: - */ -#define SHM_STAT 0x4000 /* For ipcs(8) */ -#define SHM_INFO 0x4001 /* For ipcs(8) */ -#endif /* _KERNEL */ - -/* Unsigned integer used for the number of current attaches. - */ -typedef unsigned int shmatt_t; - -struct shmid_ds -{ - struct ipc_perm shm_perm; /* Operation permission structure. */ - size_t shm_segsz; /* Size of segment in bytes. */ - pid_t shm_lpid; /* Process ID of last operation. */ - pid_t shm_cpid; /* Process ID of creator. */ - shmatt_t shm_nattch;/* Number of current attaches. */ - timestruc_t shm_atim; /* Time of last shmat (). */ - timestruc_t shm_dtim; /* Time of last shmdt (). */ - timestruc_t shm_ctim; /* Time of last change by shmctl (). */ -#ifdef _KERNEL - struct shm_handle *shm_internal; - long shm_spare4[1]; -#else - long shm_spare4[2]; -#endif /* _KERNEL */ -}; - -#define shm_atime shm_atim.tv_sec -#define shm_dtime shm_dtim.tv_sec -#define shm_ctime shm_ctim.tv_sec - -#ifdef _KERNEL -/* Buffer type for shmctl (IPC_INFO, ...) as used by ipcs(8). - */ -struct shminfo -{ - long shmmax; /* Maximum size in bytes of a shared - memory segment. */ - long shmmin; /* Minimum size in bytes of a shared - memory segment. */ - long shmmni; /* Maximum number of shared memory - segments, system wide. */ - long shmseg; /* Maximum number of shared memory - segments attached per process. */ - long shmall; /* Maximum number of bytes of shared - memory, system wide. */ - long shm_spare[4]; -}; - -/* Buffer type for shmctl (SHM_INFO, ...) as used by ipcs(8). - */ -struct shm_info -{ -#define shm_ids used_ids - long used_ids; /* Number of allocated segments. */ - long shm_tot; /* Size in bytes of allocated segments. */ - long shm_atts; /* Number of attached segments, system - wide. */ -}; -#endif /* _KERNEL */ - -void *shmat (int shmid, const void *shmaddr, int shmflg); -int shmctl (int shmid, int cmd, struct shmid_ds *buf); -int shmdt (const void *shmaddr); -int shmget (key_t key, size_t size, int shmflg); - -#ifdef __cplusplus -} -#endif - -#endif /* _CYGWIN_SHM_H */ diff --git a/winsup/cygwin/include/cygwin/signal.h b/winsup/cygwin/include/cygwin/signal.h deleted file mode 100644 index 0e0aab7d3..000000000 --- a/winsup/cygwin/include/cygwin/signal.h +++ /dev/null @@ -1,271 +0,0 @@ -/* signal.h - - Copyright 2004, 2005, 2006 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#ifndef _CYGWIN_SIGNAL_H -#define _CYGWIN_SIGNAL_H - -#ifdef __cplusplus -extern "C" { -#endif -struct _fpstate -{ - unsigned long cw; - unsigned long sw; - unsigned long tag; - unsigned long ipoff; - unsigned long cssel; - unsigned long dataoff; - unsigned long datasel; - unsigned char _st[80]; - unsigned long nxst; -}; - -struct ucontext -{ - unsigned long cr2; - unsigned long dr0; - unsigned long dr1; - unsigned long dr2; - unsigned long dr3; - unsigned long dr6; - unsigned long dr7; - struct _fpstate fpstate; - unsigned long gs; - unsigned long fs; - unsigned long es; - unsigned long ds; - unsigned long edi; - unsigned long esi; - unsigned long ebx; - unsigned long edx; - unsigned long ecx; - unsigned long eax; - unsigned long ebp; - unsigned long eip; - unsigned long cs; - unsigned long eflags; - unsigned long esp; - unsigned long ss; - unsigned char _internal; - unsigned long oldmask; -}; - -#define __COPY_CONTEXT_SIZE ((unsigned) &((struct ucontext *) 0)->_internal) - -typedef union sigval -{ - int sival_int; /* integer signal value */ - void *sival_ptr; /* pointer signal value */ -} sigval_t; - -typedef struct sigevent -{ - sigval_t sigev_value; /* signal value */ - int sigev_signo; /* signal number */ - int sigev_notify; /* notification type */ - void (*sigev_notify_function) (sigval_t); /* notification function */ - pthread_attr_t *sigev_notify_attributes; /* notification attributes */ -} sigevent_t; - -#pragma pack(push,4) -struct _sigcommune -{ - __uint32_t _si_code; - void *_si_read_handle; - void *_si_write_handle; - void *_si_process_handle; - union - { - int _si_fd; - void *_si_pipe_fhandler; - char *_si_str; - }; -}; - -typedef struct -{ - int si_signo; /* signal number */ - int si_code; /* signal code */ - pid_t si_pid; /* sender's pid */ - uid_t si_uid; /* sender's uid */ - int si_errno; /* errno associated with signal */ - - union - { - __uint32_t __pad[32]; /* plan for future growth */ - struct _sigcommune _si_commune; /* cygwin ipc */ - union - { - /* timers */ - struct - { - union - { - struct - { - timer_t si_tid; /* timer id */ - unsigned int si_overrun; /* overrun count */ - }; - sigval_t si_sigval; /* signal value */ - sigval_t si_value; /* signal value */ - }; - }; - }; - - /* SIGCHLD */ - struct - { - int si_status; /* exit code */ - clock_t si_utime; /* user time */ - clock_t si_stime; /* system time */ - }; - - /* core dumping signals */ - void *si_addr; /* faulting address */ - }; -} siginfo_t; -#pragma pack(pop) - -enum -{ - SI_USER = 0, /* sent by kill, raise, pthread_kill */ - SI_ASYNCIO = 2, /* sent by AIO completion (currently - unimplemented) */ - SI_MESGQ, /* sent by real time mesq state change - (currently unimplemented) */ - SI_TIMER, /* sent by timer expiration */ - SI_QUEUE, /* sent by sigqueue (currently - unimplemented) */ - SI_KERNEL, /* sent by system */ - - ILL_ILLOPC, /* illegal opcode */ - ILL_ILLOPN, /* illegal operand */ - ILL_ILLADR, /* illegal addressing mode */ - ILL_ILLTRP, /* illegal trap*/ - ILL_PRVOPC, /* privileged opcode */ - ILL_PRVREG, /* privileged register */ - ILL_COPROC, /* coprocessor error */ - ILL_BADSTK, /* internal stack error */ - - FPE_INTDIV, /* integer divide by zero */ - FPE_INTOVF, /* integer overflow */ - FPE_FLTDIV, /* floating point divide by zero */ - FPE_FLTOVF, /* floating point overflow */ - FPE_FLTUND, /* floating point underflow */ - FPE_FLTRES, /* floating point inexact result */ - FPE_FLTINV, /* floating point invalid operation */ - FPE_FLTSUB, /* subscript out of range */ - - SEGV_MAPERR, /* address not mapped to object */ - SEGV_ACCERR, /* invalid permissions for mapped object */ - - BUS_ADRALN, /* invalid address alignment. */ - BUS_ADRERR, /* non-existant physical address. */ - BUS_OBJERR, /* object specific hardware error. */ - - CLD_EXITED, /* child has exited */ - CLD_KILLED, /* child was killed */ - CLD_DUMPED, /* child terminated abnormally */ - CLD_TRAPPED, /* traced child has trapped */ - CLD_STOPPED, /* child has stopped */ - CLD_CONTINUED /* stopped child has continued */ -}; - -enum -{ - SIGEV_SIGNAL = 0, /* a queued signal, with an application - defined value, is generated when the - event of interest occurs */ - SIGEV_NONE, /* no asynchronous notification is - delivered when the event of interest - occurs */ - SIGEV_THREAD /* a notification function is called to - perform notification */ -}; - -typedef void (*_sig_func_ptr)(int); - -struct sigaction -{ - union - { - _sig_func_ptr sa_handler; /* SIG_DFL, SIG_IGN, or pointer to a function */ - void (*sa_sigaction) ( int, siginfo_t *, void * ); - }; - sigset_t sa_mask; - int sa_flags; -}; - -#define SA_NOCLDSTOP 1 /* Do not generate SIGCHLD when children - stop */ -#define SA_SIGINFO 2 /* Invoke the signal catching function - with three arguments instead of one - */ -#define SA_RESTART 0x10000000 /* Restart syscall on signal return */ -#define SA_NODEFER 0x40000000 /* Don't automatically block the signal - when its handler is being executed */ -#define SA_RESETHAND 0x80000000 /* Reset to SIG_DFL on entry to handler */ -#define SA_ONESHOT SA_RESETHAND /* Historical linux name */ -#define SA_NOMASK SA_NODEFER /* Historical linux name */ - -#define SIGHUP 1 /* hangup */ -#define SIGINT 2 /* interrupt */ -#define SIGQUIT 3 /* quit */ -#define SIGILL 4 /* illegal instruction (not reset when caught) */ -#define SIGTRAP 5 /* trace trap (not reset when caught) */ -#define SIGABRT 6 /* used by abort */ -#define SIGEMT 7 /* EMT instruction */ -#define SIGFPE 8 /* floating point exception */ -#define SIGKILL 9 /* kill (cannot be caught or ignored) */ -#define SIGBUS 10 /* bus error */ -#define SIGSEGV 11 /* segmentation violation */ -#define SIGSYS 12 /* bad argument to system call */ -#define SIGPIPE 13 /* write on a pipe with no one to read it */ -#define SIGALRM 14 /* alarm clock */ -#define SIGTERM 15 /* software termination signal from kill */ -#define SIGURG 16 /* urgent condition on IO channel */ -#define SIGSTOP 17 /* sendable stop signal not from tty */ -#define SIGTSTP 18 /* stop signal from tty */ -#define SIGCONT 19 /* continue a stopped process */ -#define SIGCHLD 20 /* to parent on child stop or exit */ -#define SIGCLD 20 /* System V name for SIGCHLD */ -#define SIGTTIN 21 /* to readers pgrp upon background tty read */ -#define SIGTTOU 22 /* like TTIN for output if (tp->t_local<OSTOP) */ -#define SIGIO 23 /* input/output possible signal */ -#define SIGPOLL SIGIO /* System V name for SIGIO */ -#define SIGXCPU 24 /* exceeded CPU time limit */ -#define SIGXFSZ 25 /* exceeded file size limit */ -#define SIGVTALRM 26 /* virtual time alarm */ -#define SIGPROF 27 /* profiling time alarm */ -#define SIGWINCH 28 /* window changed */ -#define SIGLOST 29 /* resource lost (eg, record-lock lost) */ -#define SIGUSR1 30 /* user defined signal 1 */ -#define SIGUSR2 31 /* user defined signal 2 */ - -/* Real-Time signals per SUSv3. RT_SIGMAX is defined as 8 in limits.h */ -#define SIGRTMIN 32 -#define SIGRTMAX ((SIGRTMIN) + 0) -#define NSIG 33 /* signal 0 implied */ - -#define SIG_HOLD ((_sig_func_ptr)2) /* Signal in signal mask */ - -int sigwait (const sigset_t *, int *); -int sigwaitinfo (const sigset_t *, siginfo_t *); -int sighold (int); -int sigignore (int); -int sigrelse (int); -_sig_func_ptr sigset (int, _sig_func_ptr); - -int sigqueue(pid_t, int, const union sigval); -int siginterrupt (int, int); -#ifdef __cplusplus -} -#endif -#endif /*_CYGWIN_SIGNAL_H*/ diff --git a/winsup/cygwin/include/cygwin/socket.h b/winsup/cygwin/include/cygwin/socket.h deleted file mode 100644 index a3c55ae2e..000000000 --- a/winsup/cygwin/include/cygwin/socket.h +++ /dev/null @@ -1,267 +0,0 @@ -/* cygwin/socket.h - - Copyright 1999, 2000, 2001, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_SOCKET_H -#define _CYGWIN_SOCKET_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include - -#ifndef socklen_t -#define socklen_t int /* Not unsigned for backward compat. */ -#endif - -typedef uint16_t sa_family_t; - -struct sockaddr { - sa_family_t sa_family; /* address family, AF_xxx */ - char sa_data[14]; /* 14 bytes of protocol address */ -}; - -/* Definition of sockaddr_storage according to SUSv3. */ -#define _SS_MAXSIZE 128 /* Maximum size. */ -#define _SS_ALIGNSIZE (sizeof (int64_t))/* Desired alignment. */ -#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (sa_family_t)) -#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (sa_family_t) \ - + _SS_PAD1SIZE + _SS_ALIGNSIZE)) - -struct sockaddr_storage { - sa_family_t ss_family; - char _ss_pad1[_SS_PAD1SIZE]; - int64_t __ss_align; - char _ss_pad2[_SS_PAD2SIZE]; -}; - -#include /* arch-dependent defines */ -#include /* the SIOCxxx I/O controls */ -#include /* iovec support */ -#include - -struct ucred { - pid_t pid; - __uid32_t uid; - __gid32_t gid; -}; - -struct linger { - unsigned short l_onoff; /* Linger active */ - unsigned short l_linger; /* How long to linger for */ -}; - -struct msghdr -{ - void * msg_name; /* Socket name */ - socklen_t msg_namelen; /* Length of name */ - struct iovec * msg_iov; /* Data blocks */ - int msg_iovlen; /* Number of blocks */ - void * msg_control; /* Ancillary data */ - socklen_t msg_controllen; /* Ancillary data buffer length */ - int msg_flags; /* Received flags on recvmsg */ -}; - -struct cmsghdr -{ - socklen_t cmsg_len; /* Length of cmsghdr + data */ - int cmsg_level; /* Protocol */ - int cmsg_type; /* Protocol type */ -}; - -#define CMSG_ALIGN(len) \ - (((len) + sizeof (size_t) - 1) & ~(sizeof (size_t) - 1)) -#define CMSG_LEN(len) \ - (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len)) -#define CMSG_SPACE(len) \ - (CMSG_ALIGN (sizeof (struct cmsghdr)) + CMSG_ALIGN(len)) -#define CMSG_FIRSTHDR(mhdr) \ - ({ \ - struct msghdr *_m = (struct msghdr *) mhdr; \ - (unsigned) (_m)->msg_controllen >= sizeof (struct cmsghdr) \ - ? (struct cmsghdr *) (_m)->msg_control \ - : (struct cmsghdr *) NULL; \ - }) -#define CMSG_NXTHDR(mhdr,cmsg) \ - ({ \ - struct msghdr *_m = (struct msghdr *) mhdr; \ - struct cmsghdr *_c = (struct cmsghdr *) cmsg; \ - ((char *) _c + CMSG_SPACE (_c->cmsg_len) \ - > (char *) _m->msg_control + _m->msg_controllen) \ - ? (struct cmsghdr *) NULL \ - : (struct cmsghdr *) ((char *) _c + CMSG_ALIGN (_c->cmsg_len)); \ - }) -#define CMSG_DATA(cmsg) \ - ((unsigned char *) ((struct cmsghdr *)(cmsg) + 1)) - -/* "Socket"-level control message types: */ -#define SCM_RIGHTS 0x01 /* access rights (array of int) */ - -#ifdef __INSIDE_CYGWIN__ -/* Definition of struct msghdr up to release 1.5.18 */ -struct OLD_msghdr -{ - void * msg_name; /* Socket name */ - int msg_namelen; /* Length of name */ - struct iovec * msg_iov; /* Data blocks */ - int msg_iovlen; /* Number of blocks */ - void * msg_accrights; /* Per protocol magic */ - /* (eg BSD descriptor passing) */ - int msg_accrightslen; /* Length of rights list */ -}; -#endif - -/* Socket types. */ -#define SOCK_STREAM 1 /* stream (connection) socket */ -#define SOCK_DGRAM 2 /* datagram (conn.less) socket */ -#define SOCK_RAW 3 /* raw socket */ -#define SOCK_RDM 4 /* reliably-delivered message */ -#define SOCK_SEQPACKET 5 /* sequential packet socket */ - -/* Supported address families. */ -/* - * Address families. - */ -#define AF_UNSPEC 0 /* unspecified */ -#define AF_UNIX 1 /* local to host (pipes, portals) */ -#define AF_LOCAL 1 /* POSIX name for AF_UNIX */ -#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 /* OSI is 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 /* Direct data link interface */ -#define AF_LAT 14 /* LAT */ -#define AF_HYLINK 15 /* NSC Hyperchannel */ -#define AF_APPLETALK 16 /* AppleTalk */ -#define AF_NETBIOS 17 /* NetBios-style addresses */ -#if 0 /* Not yet */ -#define AF_INET6 23 /* IP version 6 */ -#endif - -#define AF_MAX 32 -/* - * Protocol families, same as address families for now. - */ -#define PF_UNSPEC AF_UNSPEC -#define PF_UNIX AF_UNIX -#define PF_LOCAL AF_LOCAL -#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_OSI -#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_NETBIOS AF_NETBIOS -#if 0 -#define PF_INET6 AF_INET6 -#endif - -#define PF_MAX AF_MAX - -/* Maximum queue length specificable by listen. */ -#define SOMAXCONN 0x7fffffff - -/* Flags we can use with send/ and recv. */ -#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_WINMASK 0x7 /* flags understood by WinSock calls */ -#define MSG_NOSIGNAL 0x20 /* Don't raise SIGPIPE */ -#define MSG_TRUNC 0x0100 /* Normal data truncated */ -#define MSG_CTRUNC 0x0200 /* Control data truncated */ - -/* Setsockoptions(2) level. Thanks to BSD these must match IPPROTO_xxx */ -#define SOL_IP 0 -#define SOL_IPX 256 -#define SOL_AX25 257 -#define SOL_ATALK 258 -#define SOL_NETROM 259 -#define SOL_TCP 6 -#define SOL_UDP 17 - -/* IP options */ -#ifndef IPTOS_LOWDELAY -#define IPTOS_LOWDELAY 0x10 -#define IPTOS_THROUGHPUT 0x08 -#define IPTOS_RELIABILITY 0x04 -#endif - -/* These need to appear somewhere around here */ -#define IP_DEFAULT_MULTICAST_TTL 1 -#define IP_DEFAULT_MULTICAST_LOOP 1 -#define IP_MAX_MEMBERSHIPS 20 - -/* IP options for use with getsockopt/setsockopt */ -#define IP_OPTIONS 1 -#define IP_HDRINCL 2 -#define IP_TOS 3 -#define IP_TTL 4 -#define IP_MULTICAST_IF 9 -#define IP_MULTICAST_TTL 10 -#define IP_MULTICAST_LOOP 11 -#define IP_ADD_MEMBERSHIP 12 -#define IP_DROP_MEMBERSHIP 13 -#define IP_DONTFRAGMENT 14 -#define IP_ADD_SOURCE_MEMBERSHIP 15 -#define IP_DROP_SOURCE_MEMBERSHIP 16 -#define IP_BLOCK_SOURCE 17 -#define IP_UNBLOCK_SOURCE 18 -#define IP_PKTINFO 19 - -/* Old WinSock1 values, needed internally */ -#ifdef __INSIDE_CYGWIN__ -#define _WS1_IP_OPTIONS 1 -#define _WS1_IP_MULTICAST_IF 2 -#define _WS1_IP_MULTICAST_TTL 3 -#define _WS1_IP_MULTICAST_LOOP 4 -#define _WS1_IP_ADD_MEMBERSHIP 5 -#define _WS1_IP_DROP_MEMBERSHIP 6 -#define _WS1_IP_TTL 7 -#define _WS1_IP_TOS 8 -#define _WS1_IP_DONTFRAGMENT 9 -#endif - -/* IPX options */ -#define IPX_TYPE 1 - -/* TCP options - this way around because someone left a set in the c library includes */ -#ifndef TCP_NODELAY -#define TCP_NODELAY 0x0001 -#define TCP_MAXSEG 2 -#endif - -/* The various priorities. */ -#define SOPRI_INTERACTIVE 0 -#define SOPRI_NORMAL 1 -#define SOPRI_BACKGROUND 2 - -#ifdef __cplusplus -}; -#endif /* __cplusplus */ - -#endif /* _CYGWIN_SOCKET_H */ diff --git a/winsup/cygwin/include/cygwin/sockios.h b/winsup/cygwin/include/cygwin/sockios.h deleted file mode 100644 index 2e756954e..000000000 --- a/winsup/cygwin/include/cygwin/sockios.h +++ /dev/null @@ -1 +0,0 @@ -/* sockios.h */ diff --git a/winsup/cygwin/include/cygwin/stat.h b/winsup/cygwin/include/cygwin/stat.h deleted file mode 100644 index 2ae7709c2..000000000 --- a/winsup/cygwin/include/cygwin/stat.h +++ /dev/null @@ -1,88 +0,0 @@ -/* cygwin/stat.h - - Copyright 2002 Red Hat Inc. - Written by Corinna Vinschen - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_STAT_H -#define _CYGWIN_STAT_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (__INSIDE_CYGWIN__) || defined (_COMPILING_NEWLIB) -struct __stat32 -{ - __dev16_t st_dev; - __ino32_t st_ino; - mode_t st_mode; - nlink_t st_nlink; - __uid16_t st_uid; - __gid16_t st_gid; - __dev16_t st_rdev; - _off_t st_size; - timestruc_t st_atim; - timestruc_t st_mtim; - timestruc_t st_ctim; - blksize_t st_blksize; - __blkcnt32_t st_blocks; - long st_spare4[2]; -}; - -struct __stat64 -{ - __dev32_t st_dev; - __ino64_t st_ino; - mode_t st_mode; - nlink_t st_nlink; - __uid32_t st_uid; - __gid32_t st_gid; - __dev32_t st_rdev; - _off64_t st_size; - timestruc_t st_atim; - timestruc_t st_mtim; - timestruc_t st_ctim; - blksize_t st_blksize; - __blkcnt64_t st_blocks; - long st_spare4[2]; -}; - -extern int fstat64 (int fd, struct __stat64 *buf); -extern int stat64 (const char *file_name, struct __stat64 *buf); -extern int lstat64 (const char *file_name, struct __stat64 *buf); - -#endif - -struct stat -{ - dev_t st_dev; - ino_t st_ino; - mode_t st_mode; - nlink_t st_nlink; - uid_t st_uid; - gid_t st_gid; - dev_t st_rdev; - off_t st_size; - timestruc_t st_atim; - timestruc_t st_mtim; - timestruc_t st_ctim; - blksize_t st_blksize; - blkcnt_t st_blocks; - long st_spare4[2]; -}; - -#define st_atime st_atim.tv_sec -#define st_mtime st_mtim.tv_sec -#define st_ctime st_ctim.tv_sec - -#ifdef __cplusplus -} -#endif - -#endif /* _CYGWIN_STAT_H */ diff --git a/winsup/cygwin/include/cygwin/stdlib.h b/winsup/cygwin/include/cygwin/stdlib.h deleted file mode 100644 index 6ccc1ea8b..000000000 --- a/winsup/cygwin/include/cygwin/stdlib.h +++ /dev/null @@ -1,66 +0,0 @@ -/* stdlib.h - - Copyright 2005 Red Hat Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_STDLIB_H -#define _CYGWIN_STDLIB_H -#ifdef __cplusplus -extern "C" -{ -#endif - -const char *getprogname (void); -void setprogname (const char *); - -#ifndef __STRICT_ANSI__ -char *realpath (const char *, char *); -int unsetenv (const char *); -int random (void); -long srandom (unsigned); -char *ptsname (int); -int grantpt (int); -int unlockpt (int); -#endif /*__STRICT_ANSI__*/ - -#ifdef _COMPILING_NEWLIB -#define unsetenv UNUSED_unsetenv -#define _unsetenv_r UNUSED__unsetenv_r -#endif - -#undef _malloc_r -#define _malloc_r(r, s) malloc (s) -#undef _free_r -#define _free_r(r, p) free (p) -#undef _realloc_r -#define _realloc_r(r, p, s) realloc (p, s) -#undef _calloc_r -#define _calloc_r(r, s1, s2) calloc (s1, s2); -#undef _memalign_r -#define _memalign_r(r, s1, s2) memalign (s1, s2); -#undef _mallinfo_r -#define _mallinfo_r(r) mallinfo () -#undef _malloc_stats_r -#define _malloc_stats_r(r) malloc_stats () -#undef _mallopt_r -#define _mallopt_r(i1, i2) mallopt (i1, i2) -#undef _malloc_usable_size_r -#define _malloc_usable_size_r(r, p) malloc_usable_size (p) -#undef _valloc_r -#define _valloc_r(r, s) valloc (s) -#undef _pvalloc_r -#define _pvalloc_r(r, s) pvalloc (s) -#undef _malloc_trim_r -#define _malloc_trim_r(r, s) malloc_trim (s) -#undef _mstats_r -#define _mstats_r(r, p) mstats (p) - -#ifdef __cplusplus -} -#endif -#endif /*_CYGWIN_STDLIB_H*/ diff --git a/winsup/cygwin/include/cygwin/sys_time.h b/winsup/cygwin/include/cygwin/sys_time.h deleted file mode 100644 index 1cbd8ae59..000000000 --- a/winsup/cygwin/include/cygwin/sys_time.h +++ /dev/null @@ -1,27 +0,0 @@ -/* sys_time.h - - Copyright 2005 Red Hat Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_SYS_TIME_H -#define _CYGWIN_SYS_TIME_H -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -int futimes (int, const struct timeval *); -int lutimes (const char *, const struct timeval *); - - -#ifdef __cplusplus -} -#endif -#endif /*_CYGWIN_SYS_TIME_H*/ diff --git a/winsup/cygwin/include/cygwin/sysproto.h b/winsup/cygwin/include/cygwin/sysproto.h deleted file mode 100644 index cea8a023b..000000000 --- a/winsup/cygwin/include/cygwin/sysproto.h +++ /dev/null @@ -1,94 +0,0 @@ -/* cygwin/sysproto.h - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* cygwin/sysproto.h header file for Cygwin. */ - -#ifndef _CYGWIN_SYSPROTO_H -#define _CYGWIN_SYSPROTO_H -#define _SYS_SYSPROTO_H_ /* Keep it, used by BSD files */ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -struct msgctl_args { - int msqid; - int cmd; - struct msqid_ds *buf; -}; - -struct msgget_args { - key_t key; - int msgflg; -}; - -struct msgrcv_args { - int msqid; - void *msgp; - size_t msgsz; - long msgtyp; - int msgflg; -}; - -struct msgsnd_args { - int msqid; - const void *msgp; - size_t msgsz; - int msgflg; -}; - -struct semctl_args { - int semid; - int semnum; - int cmd; - union semun *arg; -}; - -struct semget_args { - key_t key; - int nsems; - int semflg; -}; - -struct semop_args { - int semid; - struct sembuf *sops; - size_t nsops; -}; - -struct shmat_args { - int shmid; - const void *shmaddr; - int shmflg; -}; - -struct shmctl_args { - int shmid; - int cmd; - struct shmid_ds *buf; -}; - -struct shmdt_args { - const void *shmaddr; -}; - -struct shmget_args { - key_t key; - size_t size; - int shmflg; -}; - -#ifdef __cplusplus -} -#endif - -#endif /* _CYGWIN_SYSPROTO_H */ diff --git a/winsup/cygwin/include/cygwin/time.h b/winsup/cygwin/include/cygwin/time.h deleted file mode 100644 index 83a8e62f8..000000000 --- a/winsup/cygwin/include/cygwin/time.h +++ /dev/null @@ -1,43 +0,0 @@ -/* time.h - - Copyright 2005 Red Hat Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_TIME_H -#define _CYGWIN_TIME_H -#ifdef __cplusplus -extern "C" -{ -#endif - -int nanosleep (const struct timespec *, struct timespec *); -int clock_setres (clockid_t, struct timespec *); -int clock_getres (clockid_t, struct timespec *); - -/* GNU extensions. */ -time_t timelocal (struct tm *); -time_t timegm (struct tm *); - -#define TIMER_RELTIME 0 /* For compatibility with HP/UX, Solaris, others? */ - -#ifndef __STRICT_ANSI__ -# ifndef daylight -# define daylight _daylight -# endif - -# ifndef timezonevar -char *timezone (void); -# elif !defined(timezone) -# define timezone _timezone -# endif -#endif /*__STRICT_ANSI__*/ - -#ifdef __cplusplus -} -#endif -#endif /*_CYGWIN_TIME_H*/ diff --git a/winsup/cygwin/include/cygwin/types.h b/winsup/cygwin/include/cygwin/types.h deleted file mode 100644 index c37ab26ff..000000000 --- a/winsup/cygwin/include/cygwin/types.h +++ /dev/null @@ -1,252 +0,0 @@ -/* types.h - - Copyright 2001, 2002, 2003 Red Hat Inc. - Written by Robert Collins - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#ifndef _CYGWIN_TYPES_H -#define _CYGWIN_TYPES_H - -#include -#include -#include - -#ifndef __timespec_t_defined -#define __timespec_t_defined -typedef struct timespec timespec_t; -#endif /*__timespec_t_defined*/ - -#ifndef __timestruc_t_defined -#define __timestruc_t_defined -typedef struct timespec timestruc_t; -#endif /*__timestruc_t_defined*/ - -#ifndef __off_t_defined -#define __off_t_defined -#ifdef __CYGWIN_USE_BIG_TYPES__ -typedef _off64_t off_t; -#else -typedef _off_t off_t; -#endif -#endif /*__off_t_defined*/ - -typedef __loff_t loff_t; - -#ifndef __dev_t_defined -#define __dev_t_defined -typedef short __dev16_t; -typedef unsigned long __dev32_t; -#ifdef __CYGWIN_USE_BIG_TYPES__ -typedef __dev32_t dev_t; -#else -typedef __dev16_t dev_t; -#endif -#endif /*__dev_t_defined*/ - -#ifndef __blksize_t_defined -#define __blksize_t_defined -typedef long blksize_t; -#endif /*__blksize_t_defined*/ - -#ifndef __blkcnt_t_defined -#define __blkcnt_t_defined -typedef long __blkcnt32_t; -typedef long long __blkcnt64_t; -#ifdef __CYGWIN_USE_BIG_TYPES__ -typedef __blkcnt64_t blkcnt_t; -#else -typedef __blkcnt32_t blkcnt_t; -#endif -#endif /*__blkcnt_t_defined*/ - -#ifndef __fsblkcnt_t_defined -#define __fsblkcnt_t_defined -typedef unsigned long fsblkcnt_t; -#endif /* __fsblkcnt_t_defined */ - -#ifndef __fsfilcnt_t_defined -#define __fsfilcnt_t_defined -typedef unsigned long fsfilcnt_t; -#endif /* __fsfilcnt_t_defined */ - -#ifndef __uid_t_defined -#define __uid_t_defined -typedef unsigned short __uid16_t; -typedef unsigned long __uid32_t; -#ifdef __CYGWIN_USE_BIG_TYPES__ -typedef __uid32_t uid_t; -#else -typedef __uid16_t uid_t; -#endif -#endif /*__uid_t_defined*/ - -#ifndef __gid_t_defined -#define __gid_t_defined -typedef unsigned short __gid16_t; -typedef unsigned long __gid32_t; -#ifdef __CYGWIN_USE_BIG_TYPES__ -typedef __gid32_t gid_t; -#else -typedef __gid16_t gid_t; -#endif -#endif /*__gid_t_defined*/ - -#ifndef __ino_t_defined -#define __ino_t_defined -typedef unsigned long __ino32_t; -typedef unsigned long long __ino64_t; -#ifdef __CYGWIN_USE_BIG_TYPES__ -typedef __ino64_t ino_t; -#else -typedef __ino32_t ino_t; -#endif -#endif /*__ino_t_defined*/ - -/* Generic ID type, must match at least pid_t, uid_t and gid_t in size. */ -#ifndef __id_t_defined -#define __id_t_defined -typedef unsigned long id_t; -#endif /* __id_t_defined */ - -#if defined (__INSIDE_CYGWIN__) -struct __flock32 { - short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */ - short l_whence; /* flag to choose starting offset */ - _off_t l_start; /* relative offset, in bytes */ - _off_t l_len; /* length, in bytes; 0 means lock to EOF */ - short l_pid; /* returned with F_GETLK */ - short l_xxx; /* reserved for future use */ -}; - -struct __flock64 { - short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */ - short l_whence; /* flag to choose starting offset */ - _off64_t l_start; /* relative offset, in bytes */ - _off64_t l_len; /* length, in bytes; 0 means lock to EOF */ - pid_t l_pid; /* returned with F_GETLK */ -}; -#endif - -struct flock { - short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */ - short l_whence; /* flag to choose starting offset */ - off_t l_start; /* relative offset, in bytes */ - off_t l_len; /* length, in bytes; 0 means lock to EOF */ -#ifdef __CYGWIN_USE_BIG_TYPES__ - pid_t l_pid; /* returned with F_GETLK */ -#else - short l_pid; /* returned with F_GETLK */ - short l_xxx; /* reserved for future use */ -#endif -}; - -#ifndef __key_t_defined -#define __key_t_defined -typedef long long key_t; -#endif /* __key_t_defined */ - -#ifndef __BIT_TYPES_DEFINED -#define __BIT_TYPES_DEFINED__ 1 - -#ifndef __vm_offset_t_defined -#define __vm_offset_t_defined -typedef unsigned long vm_offset_t; -#endif /*__vm_offset_t_defined*/ - -#ifndef __vm_size_t_defined -#define __vm_size_t_defined -typedef unsigned long vm_size_t; -#endif /*__vm_size_t_defined*/ - -#ifndef __vm_object_t_defined -#define __vm_object_t_defined -typedef void *vm_object_t; -#endif /* __vm_object_t_defined */ - -#ifndef __u_int8_t_defined -#define __u_int8_t_defined -typedef unsigned char u_int8_t; -#endif -#ifndef __u_int16_t_defined -#define __u_int16_t_defined -typedef __uint16_t u_int16_t; -#endif -#ifndef __u_int32_t_defined -#define __u_int32_t_defined -typedef __uint32_t u_int32_t; -#endif -#ifndef __u_int64_t_defined -#define __u_int64_t_defined -typedef __uint64_t u_int64_t; -#endif - -#ifndef __register_t_defined -#define __register_t_defined -typedef __int32_t register_t; -#endif - -#ifndef __addr_t_defined -#define __addr_t_defined -typedef char *addr_t; -#endif - -#ifndef __mode_t_defined -#define __mode_t_defined -typedef unsigned mode_t; -#endif -#endif /*__BIT_TYPES_DEFINED*/ - -#if !defined(__INSIDE_CYGWIN__) || !defined(__cplusplus) - -typedef struct __pthread_t {char __dummy;} *pthread_t; -typedef struct __pthread_mutex_t {char __dummy;} *pthread_mutex_t; - -typedef struct __pthread_key_t {char __dummy;} *pthread_key_t; -typedef struct __pthread_attr_t {char __dummy;} *pthread_attr_t; -typedef struct __pthread_mutexattr_t {char __dummy;} *pthread_mutexattr_t; -typedef struct __pthread_condattr_t {char __dummy;} *pthread_condattr_t; -typedef struct __pthread_cond_t {char __dummy;} *pthread_cond_t; - - /* These variables are not user alterable. This means you!. */ -typedef struct -{ - pthread_mutex_t mutex; - int state; -} -pthread_once_t; -typedef struct __pthread_rwlock_t {char __dummy;} *pthread_rwlock_t; -typedef struct __pthread_rwlockattr_t {char __dummy;} *pthread_rwlockattr_t; - -#else - -/* pthreads types */ - -typedef class pthread *pthread_t; -typedef class pthread_mutex *pthread_mutex_t; -typedef class pthread_key *pthread_key_t; -typedef class pthread_attr *pthread_attr_t; -typedef class pthread_mutexattr *pthread_mutexattr_t; -typedef class pthread_condattr *pthread_condattr_t; -typedef class pthread_cond *pthread_cond_t; -typedef class pthread_once pthread_once_t; -typedef class pthread_rwlock *pthread_rwlock_t; -typedef class pthread_rwlockattr *pthread_rwlockattr_t; - -/* semaphores types */ -typedef class semaphore *sem_t; -#endif /* __INSIDE_CYGWIN__ */ -#endif /* _CYGWIN_TYPES_H */ - -#ifdef __cplusplus -} -#endif diff --git a/winsup/cygwin/include/cygwin/uio.h b/winsup/cygwin/include/cygwin/uio.h deleted file mode 100644 index 18c77ae65..000000000 --- a/winsup/cygwin/include/cygwin/uio.h +++ /dev/null @@ -1 +0,0 @@ -/* uio.h */ diff --git a/winsup/cygwin/include/cygwin/utmp.h b/winsup/cygwin/include/cygwin/utmp.h deleted file mode 100644 index 56a137ffe..000000000 --- a/winsup/cygwin/include/cygwin/utmp.h +++ /dev/null @@ -1,40 +0,0 @@ -/* cygwin/utmp.h - - Copyright 2004 Red Hat, Inc. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#ifndef CYGWIN_UTMP_H -#define CYGWIN_UTMP_H - -#include -#include -#include - -#define WTMP_FILE _PATH_WTMP - -#ifdef __cplusplus -extern "C" { -#endif - -#define UT_LINESIZE 16 -#define UT_NAMESIZE 16 -#define UT_HOSTSIZE 256 -#define UT_IDLEN 2 - -#define RUN_LVL 1 -#define BOOT_TIME 2 -#define NEW_TIME 3 -#define OLD_TIME 4 - -#define INIT_PROCESS 5 -#define LOGIN_PROCESS 6 -#define USER_PROCESS 7 -#define DEAD_PROCESS 8 - -#ifdef __cplusplus -} -#endif -#endif /* CYGWIN_UTMP_H */ diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h deleted file mode 100644 index 054ebb031..000000000 --- a/winsup/cygwin/include/cygwin/version.h +++ /dev/null @@ -1,364 +0,0 @@ -/* version.h -- Cygwin version numbers and accompanying documentation. - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* Cygwin versioning is relatively complicated because of its status - as a shared library. Let's start with how versioning used to be done. - - Historical versioning in Cygwin 16.0 to 19.5: - - In the olden days of Cygwin, we had a dll major and minor version - and a registry version. The major number started at 16 because the - "b15" GNU-Win32 release of the compiler tools was out when this - scheme was started. We incremented the DLL name frequently (for - every official release) and towards the end of this period every - release used a different shared memory area to prevent DLLs from - interfering with each other (embedding a build timestamp into the - name of the shared memory area). This turned out to be a Bad Idea - (tm) because people needed to mingle separate releases and have - them work together more than we thought they would. This was - especially problematic when tty info needed to be retained when an - old Cygwin executable executed a newer one. - - In the old scheme, we incremented the major number whenever a - change to the dll invalidated existing executables. This can - happen for a number of reasons, including when functions are - removed from the export list of the dll. The minor number was - incremented when a change was made that we wanted to record, but - that didn't invalidate existing executables. Both numbers were - recorded in the executable and in the dll. - - In October 1998 (starting with Cygwin 19.6), we started a new method - of Cygwin versioning: */ - - /* The DLL major and minor numbers correspond to the "version of - the Cygwin shared library". This version is used to track important - changes to the DLL and is mainly informative in nature. */ - -#define CYGWIN_VERSION_DLL_MAJOR 1005 -#define CYGWIN_VERSION_DLL_MINOR 20 - - /* Major numbers before CYGWIN_VERSION_DLL_EPOCH are - incompatible. */ - -#define CYGWIN_VERSION_DLL_EPOCH 19 - - /* CYGWIN_VERSION_DLL_COMBINED gives us a single number - representing the combined DLL major and minor numbers. */ - - /* WATCH OUT FOR OCTAL! Don't use, say, "00020" for 0.20 */ - -#define CYGWIN_VERSION_DLL_MAKE_COMBINED(maj, min) (((maj) * 1000) + min) -#define CYGWIN_VERSION_DLL_COMBINED \ - CYGWIN_VERSION_DLL_MAKE_COMBINED (CYGWIN_VERSION_DLL_MAJOR, CYGWIN_VERSION_DLL_MINOR) - - /* Every version of cygwin <= this uses an old, incorrect method - to determine signal masks. */ - -#define CYGWIN_VERSION_DLL_BAD_SIGNAL_MASK 19005 - -#define CYGWIN_VERSION_USER_API_VERSION_COMBINED \ - CYGWIN_VERSION_DLL_MAKE_COMBINED (user_data->api_major, user_data->api_minor) - - /* API versions <= this had a termios structure whose members were - too small to accomodate modern settings. */ -#define CYGWIN_VERSION_DLL_OLD_TERMIOS 5 -#define CYGWIN_VERSION_DLL_IS_OLD_TERMIOS \ - (CYGWIN_VERSION_USER_API_VERSION_COMBINED <= CYGWIN_VERSION_DLL_OLD_TERMIOS) - -#define CYGWIN_VERSION_DLL_MALLOC_ENV 28 - /* Old APIs had getc/putc macros that conflict with new CR/LF - handling in the stdio buffers */ -#define CYGWIN_VERSION_OLD_STDIO_CRLF_HANDLING \ - (CYGWIN_VERSION_USER_API_VERSION_COMBINED <= 20) - -#define CYGWIN_VERSION_CHECK_FOR_S_IEXEC \ - (CYGWIN_VERSION_USER_API_VERSION_COMBINED >= 36) - -#define CYGWIN_VERSION_CHECK_FOR_OLD_O_NONBLOCK \ - (CYGWIN_VERSION_USER_API_VERSION_COMBINED <= 28) - -#define CYGWIN_VERSION_CHECK_FOR_USING_BIG_TYPES \ - (CYGWIN_VERSION_USER_API_VERSION_COMBINED >= 79) - -#define CYGWIN_VERSION_CHECK_FOR_USING_ANCIENT_MSGHDR \ - (CYGWIN_VERSION_USER_API_VERSION_COMBINED <= 138) - -#define CYGWIN_VERSION_CHECK_FOR_USING_WINSOCK1_VALUES \ - (CYGWIN_VERSION_USER_API_VERSION_COMBINED <= 138) - - /* API_MAJOR 0.0: Initial version. API_MINOR changes: - 1: Export cygwin32_ calls as cygwin_ as well. - 2: Export j1, jn, y1, yn. - 3: Export dll_noncygwin_dllcrt0. - 4: New socket ioctls, revamped ifconf support. - 5: Thread support/exports. - 6: Change in termios handling. - 7: Export scandir and alphasort. - 8: Export _ctype_, _sys_errlist, _sys_nerr. - 9: Mount-related changes, new cygwin_umount export. - Raw device support (tape, floppies). - 10: Fast math routine support added. - 11: Export seekdir, telldir. - 12: Export pthread_join, pthread_detach. - 13: Export math funcs gamma and friends, also _j0, _j1, etc. - 14: Export snprintf and vnsprintf. - 15: Export glob - 16: Export cygwin_stackdump - 17: Export fast math stuff - 18: Stop exporting _strace_wm - 19: Export fchown, lchown, lacl - 20: regsub, inet_network - 21: incompatible change to stdio cr/lf and buffering - 22: Export cygwin_logon_user, cygwin_set_impersonation_token. - geteuid, getegid return effective uid/gid. - getuid, getgid return real uid/gid. - seteuid, setegid set only effective uid/gid. - setuid, setgid set effective and real uid/gid. - 23: Export new dll_crt0 interface and cygwin_user_data for use - with crt0 startup code. - 24: Export poll and _poll. - 25: Export getmode and _getmode. - 26: CW_GET_CYGDRIVE_PREFIXES addition to external.cc - 27: CW_GETPINFO_FULL addition to external.cc - 28: Accidentally bumped by cgf - 29: Export hstrerror - 30: CW_GET_CYGDRIVE_INFO addition to external.cc - 31: Export inet_aton - 32: Export getrlimit/setrlimit - 33: Export setlogmask - 34: Separated out mount table - 35: Export drand48, erand48, jrand48, lcong48, lrand48, - mrand48, nrand48, seed48, and srand48. - 36: Added _cygwin_S_IEXEC, et al - 37: [f]pathconv support _PC_POSIX_PERMISSIONS and _PC_POSIX_SECURITY - 38: vscanf, vscanf_r, and random pthread functions - 39: asctime_r, ctime_r, gmtime_r, localtime_r - 40: fchdir - 41: __signgam - 42: sys_errlist, sys_nerr - 43: sigsetjmp, siglongjmp fixed - 44: Export dirfd - 45: perprocess change, gamma_r, gammaf_r, lgamma_r, lgammaf_r - 46: Remove cygwin_getshared - 47: Report EOTWarningZoneSize in struct mtget. - 48: Export "posix" regex functions - 49: Export setutent, endutent, utmpname, getutent, getutid, getutline. - 50: Export fnmatch. - 51: Export recvmsg, sendmsg. - 52: Export strptime - 53: Export strlcat, strlcpy. - 54: Export __fpclassifyd, __fpclassifyf, __signbitd, __signbitf. - 55: Export fcloseall, fcloseall_r. - 56: Make ntsec on by default. - 57: Export setgroups. - 58: Export memalign, valloc, malloc_trim, malloc_usable_size, mallopt, - malloc_stats - 59: getsid - 60: MSG_NOSIGNAL - 61: Export getc_unlocked, getchar_unlocked, putc_unlocked, - putchar_unlocked - 62: Erroneously bumped - 63: Export pututline - 64: Export fseeko, ftello - 65: Export siginterrupt - 66: Export nl_langinfo - 67: Export pthread_getsequence_np - 68: Export netdb stuff - 69: Export strtof - 70: Export asprintf, _asprintf_r, vasprintf, _vasprintf_r - 71: Export strerror_r - 72: Export nanosleep - 73: Export setreuid32, setreuid, setregid32, setregid - 74: Export _strtold a64l hcreate hcreate_r hdestroy hdestroy_r hsearch - hsearch_r isblank iswalnum iswalpha iswblank iswcntrl iswctype - iswdigit iswgraph iswlower iswprint iswpunct iswspace iswupper - iswxdigit l64a mbrlen mbrtowc mbsinit mbsrtowcs mempcpy - on_exit setbuffer setlinebuf strndup strnlen tdelete tdestroy - tfind towctrans towlower towupper tsearch twalk wcrtomb wcscat - wcschr wcscpy wcscspn wcslcat wcslcpy wcsncat wcsncmp wcsncpy - wcspbrk wcsrchr wcsrtombs wcsspn wcsstr wctob wctob wctrans - wctype wmemchr wmemcmp wmemcpy wmemmove wmemset - 75: Export exp2 exp2f fdim fdimf fma fmaf fmax fmaxf fmin fminf lrint - lrintf lround lroundf nearbyint nearbyintf remquo remquof - round roundf scalbln scalblnf sincos sincosf tgamma tgammaf - truncf - 76: mallinfo - 77: thread-safe exit/at_exit - 78: Use stat and fstat rather than _stat, and _fstat. - Export btowc and trunc. - 79: Export acl32 aclcheck32 aclfrommode32 aclfrompbits32 aclfromtext32 - aclsort32 acltomode32 acltopbits32 acltotext32 facl32 - fgetpos64 fopen64 freopen64 fseeko64 fsetpos64 ftello64 - _open64 _lseek64 _fstat64 _stat64 mknod32 - 80: Export pthread_rwlock stuff - 81: CW_CHECK_NTSEC addition to external.cc - 82: Export wcscoll wcswidth wcwidth - 83: Export gethostid - 84: Pty open allocates invisible console. 64 bit interface - 85: Export new 32/64 functions from API 0.79 only with leading - underscore. No problems with backward compatibility since no - official release has been made so far. This change removes - exported symbols like fopen64, which might confuse configure. - 86: Export ftok - 87: Export vsyslog - 88: Export _getreent - 89: Export __mempcpy - 90: Export _fopen64 - 91: Export argz_add argz_add_sep argz_append argz_count argz_create - argz_create_sep argz_delete argz_extract argz_insert - argz_next argz_replace argz_stringify envz_add envz_entry - envz_get envz_merge envz_remove envz_strip - 92: Export getusershell, setusershell, endusershell - 93: Export daemon, forkpty, openpty, iruserok, ruserok, login_tty, - openpty, forkpty, revoke, logwtmp, updwtmp - 94: Export getopt, getopt_long, optarg, opterr, optind, optopt, - optreset, __check_rhosts_file, __rcmd_errstr. - 95: Export shmat, shmctl, shmdt, shmget. - 96: CW_GET_ERRNO_FROM_WINERROR addition to external.cc - 97: Export sem_open, sem_close, sem_timedwait, sem_getvalue. - 98: Export _tmpfile64. - 99: CW_GET_POSIX_SECURITY_ATTRIBUTE addition to external.cc. - 100: CW_GET_SHMLBA addition to external.cc. - 101: Export err, errx, verr, verrx, warn, warnx, vwarn, vwarnx. - 102: CW_GET_UID_FROM_SID and CW_GET_GID_FROM_SID addition to external.cc. - 103: Export getprogname, setprogname. - 104: Export msgctl, msgget, msgrcv, msgsnd, semctl, semget, semop. - 105: Export sigwait. - 106: Export flock. - 107: Export fcntl64. - 108: Remove unused (hopefully) reent_data export. - 109: Oh well. Someone uses reent_data. - 110: Export clock_gettime, sigwaitinfo, timer_create, timer_delete, - timer_settime - 111: Export sigqueue, sighold. - 112: Redefine some mtget fields. - 113: Again redefine some mtget fields. Use mt_fileno and mt_blkno as - on Linux. - 114: Export rand_r, ttyname_r. - 115: Export flockfile, ftrylockfile, funlockfile, getgrgid_r, getgrnam_r, - getlogin_r. - 116: Export atoll. - 117: Export utmpx functions, Return utmp * from pututent. - 118: Export getpriority, setpriority. - 119: Export fdatasync. - 120: Export basename, dirname. - 122: Export statvfs, fstatvfs. - 123: Export utmpxname. - 124: Add MAP_AUTOGROW flag to mmap. - 125: LD_PRELOAD/CW_HOOK available. - 126: Export lsearch, lfind, timer_gettime. - 127: Export sigrelese. - 128: Export pselect. - 129: Export mkdtemp. - 130: Export strtoimax, strtoumax, llabs, imaxabs, lldiv, imaxdiv. - 131: Export inet_ntop, inet_pton. - 132: Add GLOB_LIMIT flag to glob. - 133: Export __getline, __getdelim. - 134: Export getline, getdelim. - 135: Export pread, pwrite - 136: Add TIOCMBIS/TIOCMBIC ioctl codes. - 137: fts_children, fts_close, fts_get_clientptr, fts_get_stream, - fts_open, fts_read, fts_set, fts_set_clientptr, ftw, nftw. - 138: Export readdir_r. - 139: Start using POSIX definition of struct msghdr and WinSock2 - IPPROTO_IP values. - 140: Export mlock, munlock. - 141: Export futimes, lutimes. - 142: Export memmem - 143: Export clock_getres, clock_setres - 144: Export timelocal, timegm. - 145: Add MAP_NORESERVE flag to mmap. - 146: Change SI_USER definition. FIXME: Need to develop compatibility - macro for this? - 147: Eliminate problematic d_ino from dirent structure. unsetenv now - returns int, as per linux. - 148: Add open(2) flags O_SYNC, O_RSYNC, O_DSYNC and O_DIRECT. - 149: Add open(2) flag O_NOFOLLOW. - 150: Export getsubopt. - 151: Export __opendir_with_d_ino - 152: Revert to having d_ino in dirent unconditionally. - 153: Export updwtmpx, Implement CW_SETUP_WINENV. - 154: Export sigset, sigignore. - 155: Export __isinff, __isinfd, __isnanf, __isnand. - */ - - /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ - -#define CYGWIN_VERSION_API_MAJOR 0 -#define CYGWIN_VERSION_API_MINOR 155 - - /* There is also a compatibity version number associated with the - shared memory regions. It is incremented when incompatible - changes are made to the shared memory region *or* to any named - shared mutexes, semaphores, etc. The arbitrary starting - version was 0 (cygwin release 98r2). - Bump to 4 since this hasn't been rigorously updated in a - while. */ - -#define CYGWIN_VERSION_SHARED_DATA 4 - - /* An identifier used in the names used to create shared objects. - The full names include the CYGWIN_VERSION_SHARED_DATA version - as well as this identifier. */ - -#define CYGWIN_VERSION_DLL_IDENTIFIER "cygwin1" - - /* The Cygwin mount table interface in the Win32 registry also - has a version number associated with it in case that is - changed in a non-backwards compatible fashion. Increment this - version number whenever incompatible changes in mount table - registry usage are made. - - 1: Original number version. - 2: New mount registry layout, system-wide mount accessibility. - */ - -#define CYGWIN_VERSION_MOUNT_REGISTRY 2 - - /* Identifiers used in the Win32 registry. */ - -#define CYGWIN_INFO_CYGNUS_REGISTRY_NAME "Cygnus Solutions" -#define CYGWIN_INFO_CYGWIN_REGISTRY_NAME "Cygwin" -#define CYGWIN_INFO_PROGRAM_OPTIONS_NAME "Program Options" -#define CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME "mounts v2" -#define CYGWIN_INFO_CYGDRIVE_FLAGS "cygdrive flags" -#define CYGWIN_INFO_CYGDRIVE_PREFIX "cygdrive prefix" -#define CYGWIN_INFO_CYGDRIVE_DEFAULT_PREFIX "/cygdrive" - - /* In addition to the above version number strings, the build - process adds some strings that may be useful in - debugging/identifying a particular Cygwin DLL: - - The mkvers.sh script at the top level produces a .cc file - which initializes a cygwin_version structure based on the - above version information and creates a string table for - grepping via "fgrep '%%%' cygwinwhatever.dll" if you are - using GNU grep. Otherwise you may want to do a - "strings cygwinwhatever.dll | fgrep '%%%'" instead. - - This will produce output such as: - - %%% Cygwin dll_identifier: cygwin - %%% Cygwin api_major: 0 - %%% Cygwin api_minor: 0 - %%% Cygwin dll_major: 19 - %%% Cygwin dll_minor: 6 - %%% Cygwin shared_data: 1 - %%% Cygwin registry: b15 - %%% Cygwin build date: Wed Oct 14 16:26:51 EDT 1998 - %%% Cygwin shared id: cygwinS1 - - This information can also be obtained through a call to - cygwin_internal (CW_GETVERSIONINFO). - */ - -#define CYGWIN_VERSION_MAGIC(a, b) ((unsigned) ((((unsigned short) a) << 16) | (unsigned short) b)) -#define CYGWIN_VERSION_MAGIC_VERSION(a) ((unsigned) ((unsigned)a & 0xffff)) diff --git a/winsup/cygwin/include/dlfcn.h b/winsup/cygwin/include/dlfcn.h deleted file mode 100644 index 2cf88e2d3..000000000 --- a/winsup/cygwin/include/dlfcn.h +++ /dev/null @@ -1,42 +0,0 @@ -/* dlfcn.h - - Copyright 1998, 1999, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _DLFCN_H -#define _DLFCN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* declarations used for dynamic linking support routines */ -extern void *dlopen (const char *, int); -extern void *dlsym (void *, const char *); -extern int dlclose (void *); -extern char *dlerror (void); - -/* specific to CYGWIN */ -#define FORK_RELOAD 1 -#define FORK_NO_RELOAD 0 - -extern void dlfork (int); - -/* following doesn't exist in Win32 API .... */ -#define RTLD_DEFAULT NULL - -/* valid values for mode argument to dlopen */ -#define RTLD_LAZY 1 /* lazy function call binding */ -#define RTLD_NOW 2 /* immediate function call binding */ -#define RTLD_GLOBAL 4 /* symbols in this dlopen'ed obj are visible to other dlopen'ed objs */ - -#ifdef __cplusplus -} -#endif - -#endif /* _DLFCN_H */ diff --git a/winsup/cygwin/include/elf.h b/winsup/cygwin/include/elf.h deleted file mode 100644 index 0981dedce..000000000 --- a/winsup/cygwin/include/elf.h +++ /dev/null @@ -1,25 +0,0 @@ -/* elf.h - - Copyright 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _ELF_H_ -#define _ELF_H_ - -#ifdef __cplusplus -extern "C" { -#endif -#include -#include -#include -#include -#ifdef __cplusplus -} -#endif - -#endif /*_ELF_H_*/ diff --git a/winsup/cygwin/include/endian.h b/winsup/cygwin/include/endian.h deleted file mode 100644 index c8b89d432..000000000 --- a/winsup/cygwin/include/endian.h +++ /dev/null @@ -1,40 +0,0 @@ -/* endian.h - - Copyright 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _ENDIAN_H_ -#define _ENDIAN_H_ - -#include - -#ifndef __BIG_ENDIAN -#define __BIG_ENDIAN 4321 -#endif -#ifndef __LITTLE_ENDIAN -#define __LITTLE_ENDIAN 1234 -#endif - -#ifndef __BYTE_ORDER -# define __BYTE_ORDER __LITTLE_ENDIAN -#endif - -/*#ifdef __USE_BSD*/ -# define LITTLE_ENDIAN __LITTLE_ENDIAN -# define BIG_ENDIAN __BIG_ENDIAN -# define PDP_ENDIAN __PDP_ENDIAN -# define BYTE_ORDER __BYTE_ORDER -/*#endif*/ - -#if __BYTE_ORDER == __LITTLE_ENDIAN -# define __LONG_LONG_PAIR(HI, LO) LO, HI -#elif __BYTE_ORDER == __BIG_ENDIAN -# define __LONG_LONG_PAIR(HI, LO) HI, LO -#endif -#endif /*_ENDIAN_H_*/ - diff --git a/winsup/cygwin/include/err.h b/winsup/cygwin/include/err.h deleted file mode 100644 index d1002c527..000000000 --- a/winsup/cygwin/include/err.h +++ /dev/null @@ -1,33 +0,0 @@ -/* err.h - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _ERR_H -#define _ERR_H - -#include -#include - -__BEGIN_DECLS - -extern void warn (const char *fmt, ...); -extern void warnx (const char *fmt, ...); - -extern void err (int eval, const char *fmt, ...); -extern void errx (int eval, const char *fmt, ...); - -extern void vwarn (const char *fmt, va_list ap); -extern void vwarnx (const char *fmt, va_list ap); - -extern void verr (int eval, const char *fmt, va_list ap); -extern void verrx (int eval, const char *fmt, va_list ap); - -__END_DECLS - -#endif /* _ERR_H */ diff --git a/winsup/cygwin/include/exceptions.h b/winsup/cygwin/include/exceptions.h deleted file mode 100644 index 39d3d8f17..000000000 --- a/winsup/cygwin/include/exceptions.h +++ /dev/null @@ -1,115 +0,0 @@ -/* exceptions.h - - Copyright 1996, 1997, 1998, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _EXCEPTIONS_H -#define _EXCEPTIONS_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* Documentation on the innards of exception handling (i.e. from the - perspective of a compiler implementor) apparently doesn't exist. Sigh. - However, the following came from Onno Hovers - -The first pointer to the chain of handlers is in the thread environment block -at FS:[0]. This chain has the following format: - -typedef struct __EXCEPTION_FRAME -{ - struct __EXCEPTION_FRAME *Prev; /-* pointer to the previous frame *-/ - PEXCEPTION_HANDLER Handler; /-* handler function *-/ -} - -You register an exception handler in your compiler with this simple ASM -sequence: - PUSH _MyExceptionHandler - PUSH FS:[0] - MOV FS:[0],ESP -An exception frame MUST be on the stack! The frame may have more fields and -both Visual C++ and Borland C++ use more fields for themselves. - -When an exception occurs the system calls all handlers starting with the -handler at FS:0, and then the previous etc. until one handler returns -ExceptionContinueExecution, which is 0. If a handler does not want to handle -the exception it should just return ExceptionContinueSearch, which is 1. - -The handler has the following parameters: -ehandler ( - PEXCEPTION_RECORD erecord, - PEXCEPTION_FRAME myframe, - PCONTEXT context, /-* context before and after *-/ - PVOID dispatch) /-* something *-/ - -When a handler wants to handle the exception, it has some alternatives: - --one is to do do something about the exception condition, like emulating -an invalid instruction, mapping memory where there was a page fault, etc. -If the handler wants to have the context of the thread that causes the -exception changed, it should make that change in the context passed to the -handler. - --the second alternative is to call all exception handlers again, indicating -that you want them to clean up. This way all the __finally blocks get -executed. After doing that you change the context passed to the handler so -the code starts executing in the except block. For this purpose you could -call RtlUnwind. This (undocumented) function calls all exception handlers -up to but not including the exception frame passed to it. If NULL is passed -as exception frame RtlUnwind calls all exception handlers and then exits the -process. The parameters to RtlUnwind are: - -RtlUnwind ( - PEXCEPTION_FRAME endframe, - PVOID unusedEip, - PEXCEPTION_RECORD erecord, - DWORD returnEax) - -You should set unusedEip to the address where RtlUnwind should return like -this: - PUSH 0 - PUSH OFFSET ReturnUnwind - PUSH 0 - PUSH 0 - CALL RtlUnwind -ReturnUnwind: - ..... - -If no EXCEPTION_RECORD is passed, RtlUnwind makes a default exception -record. In any case, the ExceptionFlags part of this record has the -EH_UNWINDING (=2), flag set. (and EH_EXIT_UNWIND (=4), when NULL is passed as the end -frame.). - -The handler for a exception as well as a for unwinds may be executed in the -thread causing the exception, but may also be executed in another (special -exception) thread. So it is not wise to make any assumptions about that! - -As an alternative you may consider the SetUnhandledExceptionFilter API -to install your own exception filter. This one is documented. -*/ - -/* The January 1994 MSJ has an article entitled "Clearer, More Comprehensive - Error Processing with Win32 Structured Exception Handling". It goes into - a teensy bit of detail of the innards of exception handling (i.e. what we - have to do). */ - -typedef int (exception_handler) (EXCEPTION_RECORD *, struct _exception_list *, - CONTEXT *, void *); - -typedef struct _exception_list -{ - struct _exception_list *prev; - exception_handler *handler; -} exception_list; - -#ifdef __cplusplus -}; -#endif /* __cplusplus */ - -#endif /* _EXCEPTIONS_H */ diff --git a/winsup/cygwin/include/fcntl.h b/winsup/cygwin/include/fcntl.h deleted file mode 100644 index 6e50b3304..000000000 --- a/winsup/cygwin/include/fcntl.h +++ /dev/null @@ -1,26 +0,0 @@ -/* fcntl.h - - Copyright 1996, 1998, 2001, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _FCNTL_H -#define _FCNTL_H - -#include -#define O_NDELAY _FNDELAY - -/* sys/fcntl defines values up to 0x40000 (O_NOINHERIT). */ -#define _FDIRECT 0x80000 -#define _FNOFOLLOW 0x100000 - -#define O_DIRECT _FDIRECT -#define O_NOFOLLOW _FNOFOLLOW -#define O_DSYNC _FSYNC -#define O_RSYNC _FSYNC - -#endif /* _FCNTL_H */ diff --git a/winsup/cygwin/include/features.h b/winsup/cygwin/include/features.h deleted file mode 100644 index 69c12d22c..000000000 --- a/winsup/cygwin/include/features.h +++ /dev/null @@ -1,35 +0,0 @@ -/* features.h - - Copyright 2001, 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _FEATURES_H -#define _FEATURES_H - -#include -#include - -/* Various options should be defined here, but the framework to do this - is not laid down so far. Especially notable are the following defines, - which can be used by the application to switch on or off various - datatypes and function prototypes: - - _BSD_SOURCE to include pure BSD functions which are not defined - under POSIX. - - _POSIX_SOURCE if the application requests a POSIX compatible system. - - _XOPEN_SOURCE if X/Open functions and datatypes are requested. This - option includes _POSIX_SOURCE. - - _GNU_SOURCE to turn on GNU extensions which might collide with defines - used in application or library headers. This option - includes _BSD_SOURCE, _XOPEN_SOURCE and _POSIX_SOURCE. -*/ - -#endif /* _FEATURES_H */ diff --git a/winsup/cygwin/include/fnmatch.h b/winsup/cygwin/include/fnmatch.h deleted file mode 100644 index e4500abe2..000000000 --- a/winsup/cygwin/include/fnmatch.h +++ /dev/null @@ -1,63 +0,0 @@ -/* $OpenBSD: fnmatch.h,v 1.5 2000/03/24 17:13:23 millert Exp $ */ -/* $NetBSD: fnmatch.h,v 1.5 1994/10/26 00:55:53 cgd Exp $ */ - -/*- - * Copyright (c) 1992, 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. - * - * @(#)fnmatch.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _FNMATCH_H_ -#define _FNMATCH_H_ - -#define FNM_NOMATCH 1 /* Match failed. */ -#define FNM_NOSYS 2 /* Function not supported (unused). */ - -#define FNM_NOESCAPE 0x01 /* Disable backslash escaping. */ -#define FNM_PATHNAME 0x02 /* Slash must be matched by slash. */ -#define FNM_PERIOD 0x04 /* Period must be matched by period. */ -#ifndef _POSIX_SOURCE -#define FNM_LEADING_DIR 0x08 /* Ignore / after Imatch. */ -#define FNM_CASEFOLD 0x10 /* Case insensitive search. */ -#define FNM_IGNORECASE FNM_CASEFOLD -#define FNM_FILE_NAME FNM_PATHNAME -#endif - -#include - -__BEGIN_DECLS -int fnmatch __P((const char *, const char *, int)); -__END_DECLS - -#endif /* !_FNMATCH_H_ */ - - diff --git a/winsup/cygwin/include/fts.h b/winsup/cygwin/include/fts.h deleted file mode 100644 index ac3209920..000000000 --- a/winsup/cygwin/include/fts.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (c) 1989, 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. - * - * @(#)fts.h 8.3 (Berkeley) 8/14/94 - * $FreeBSD: /repoman/r/ncvs/src/include/fts.h,v 1.11 2005/01/07 00:06:20 pjd Exp $ - */ - -#ifndef _FTS_H_ -#define _FTS_H_ - -typedef struct { - struct _ftsent *fts_cur; /* current node */ - struct _ftsent *fts_child; /* linked list of children */ - struct _ftsent **fts_array; /* sort array */ - __dev32_t fts_dev; /* starting device # */ - char *fts_path; /* path for this descent */ - int fts_rfd; /* fd for root */ - int fts_pathlen; /* sizeof(path) */ - int fts_nitems; /* elements in the sort array */ - int (*fts_compar) /* compare function */ - (const struct _ftsent * const *, const struct _ftsent * const *); - -#define FTS_COMFOLLOW 0x001 /* follow command line symlinks */ -#define FTS_LOGICAL 0x002 /* logical walk */ -#define FTS_NOCHDIR 0x004 /* don't change directories */ -#define FTS_NOSTAT 0x008 /* don't get stat info */ -#define FTS_PHYSICAL 0x010 /* physical walk */ -#define FTS_SEEDOT 0x020 /* return dot and dot-dot */ -#define FTS_XDEV 0x040 /* don't cross devices */ -#ifndef __CYGWIN__ -#define FTS_WHITEOUT 0x080 /* return whiteout information */ -#endif -#define FTS_OPTIONMASK 0x0ff /* valid user option mask */ - -#define FTS_NAMEONLY 0x100 /* (private) child names only */ -#define FTS_STOP 0x200 /* (private) unrecoverable error */ - int fts_options; /* fts_open options, global flags */ - void *fts_clientptr; /* thunk for sort function */ -} FTS; - -typedef struct _ftsent { - struct _ftsent *fts_cycle; /* cycle node */ - struct _ftsent *fts_parent; /* parent directory */ - struct _ftsent *fts_link; /* next file in directory */ - union { - struct { - long __fts_number; /* local numeric value */ - void *__fts_pointer; /* local address value */ - } __struct_ftsent; - int64_t __fts_bignum; - } __union_ftsent; -#define fts_number __union_ftsent.__struct_ftsent.__fts_number -#define fts_pointer __union_ftsent.__struct_ftsent.__fts_pointer -#define fts_bignum __union_ftsent.__fts_bignum - char *fts_accpath; /* access path */ - char *fts_path; /* root path */ - int fts_errno; /* errno for this node */ - int fts_symfd; /* fd for symlink */ - u_short fts_pathlen; /* strlen(fts_path) */ - u_short fts_namelen; /* strlen(fts_name) */ - - __ino64_t fts_ino; /* inode */ - __dev32_t fts_dev; /* device */ - nlink_t fts_nlink; /* link count */ - -#define FTS_ROOTPARENTLEVEL -1 -#define FTS_ROOTLEVEL 0 - short fts_level; /* depth (-1 to N) */ - -#define FTS_D 1 /* preorder directory */ -#define FTS_DC 2 /* directory that causes cycles */ -#define FTS_DEFAULT 3 /* none of the above */ -#define FTS_DNR 4 /* unreadable directory */ -#define FTS_DOT 5 /* dot or dot-dot */ -#define FTS_DP 6 /* postorder directory */ -#define FTS_ERR 7 /* error; errno is set */ -#define FTS_F 8 /* regular file */ -#define FTS_INIT 9 /* initialized only */ -#define FTS_NS 10 /* stat(2) failed */ -#define FTS_NSOK 11 /* no stat(2) requested */ -#define FTS_SL 12 /* symbolic link */ -#define FTS_SLNONE 13 /* symbolic link without target */ -#define FTS_W 14 /* whiteout object */ - u_short fts_info; /* user flags for FTSENT structure */ - -#define FTS_DONTCHDIR 0x01 /* don't chdir .. to the parent */ -#define FTS_SYMFOLLOW 0x02 /* followed a symlink to get here */ -#define FTS_ISW 0x04 /* this is a whiteout object */ - u_short fts_flags; /* private flags for FTSENT structure */ - -#define FTS_AGAIN 1 /* read node again */ -#define FTS_FOLLOW 2 /* follow symbolic link */ -#define FTS_NOINSTR 3 /* no instructions */ -#define FTS_SKIP 4 /* discard node */ - u_short fts_instr; /* fts_set() instructions */ - -#ifdef __INSIDE_CYGWIN__ - struct __stat64 *fts_statp; /* stat(2) information */ -#elif defined (__CYGWIN__) && !defined (__CYGWIN_USE_BIG_TYPES__) - #error "fts requires __CYGWIN_USE_BIG_TYPES__" -#else - struct stat *fts_statp; /* stat(2) information */ -#endif - char *fts_name; /* file name */ - FTS *fts_fts; /* back pointer to main FTS */ -} FTSENT; - -#include - -__BEGIN_DECLS -FTSENT *fts_children(FTS *, int); -int fts_close(FTS *); -void *fts_get_clientptr(FTS *); -#define fts_get_clientptr(fts) ((fts)->fts_clientptr) -FTS *fts_get_stream(FTSENT *); -#define fts_get_stream(ftsent) ((ftsent)->fts_fts) -FTS *fts_open(char * const *, int, - int (*)(const FTSENT * const *, const FTSENT * const *)); -FTSENT *fts_read(FTS *); -int fts_set(FTS *, FTSENT *, int); -void fts_set_clientptr(FTS *, void *); -__END_DECLS - -#endif /* !_FTS_H_ */ diff --git a/winsup/cygwin/include/ftw.h b/winsup/cygwin/include/ftw.h deleted file mode 100644 index f57cc091b..000000000 --- a/winsup/cygwin/include/ftw.h +++ /dev/null @@ -1,70 +0,0 @@ -/* $OpenBSD: ftw.h,v 1.1 2003/07/21 21:13:18 millert Exp $ */ - -/* - * Copyright (c) 2003 Todd C. Miller - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - * - * Sponsored in part by the Defense Advanced Research Projects - * Agency (DARPA) and Air Force Research Laboratory, Air Force - * Materiel Command, USAF, under agreement number F39502-99-1-0512. - * - * $FreeBSD: /repoman/r/ncvs/src/include/ftw.h,v 1.2 2004/08/24 13:00:54 tjr Exp $ - */ - -#ifndef _FTW_H -#define _FTW_H - -#include -#include - -/* - * Valid flags for the 3rd argument to the function that is passed as the - * second argument to ftw(3) and nftw(3). Say it three times fast! - */ -#define FTW_F 0 /* File. */ -#define FTW_D 1 /* Directory. */ -#define FTW_DNR 2 /* Directory without read permission. */ -#define FTW_DP 3 /* Directory with subdirectories visited. */ -#define FTW_NS 4 /* Unknown type; stat() failed. */ -#define FTW_SL 5 /* Symbolic link. */ -#define FTW_SLN 6 /* Sym link that names a nonexistent file. */ - -/* - * Flags for use as the 4th argument to nftw(3). These may be ORed together. - */ -#define FTW_PHYS 0x01 /* Physical walk, don't follow sym links. */ -#define FTW_MOUNT 0x02 /* The walk does not cross a mount point. */ -#define FTW_DEPTH 0x04 /* Subdirs visited before the dir itself. */ -#define FTW_CHDIR 0x08 /* Change to a directory before reading it. */ - -struct FTW { - int base; - int level; -}; - -__BEGIN_DECLS -#ifdef __INSIDE_CYGWIN__ -int ftw(const char *, int (*)(const char *, const struct __stat64 *, int), int); -int nftw(const char *, int (*)(const char *, const struct __stat64 *, int, - struct FTW *), int, int); -#elif defined (__CYGWIN__) && !defined (__CYGWIN_USE_BIG_TYPES__) - #error "ftw requires __CYGWIN_USE_BIG_TYPES__" -#else -int ftw(const char *, int (*)(const char *, const struct stat *, int), int); -int nftw(const char *, int (*)(const char *, const struct stat *, int, - struct FTW *), int, int); -#endif -__END_DECLS - -#endif /* !_FTW_H */ diff --git a/winsup/cygwin/include/getopt.h b/winsup/cygwin/include/getopt.h deleted file mode 100644 index 0c1c8c92a..000000000 --- a/winsup/cygwin/include/getopt.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 1987, 1993, 1994, 1996 - * 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. - */ - -#ifdef _COMPILING_NEWLIB -#include_next "getopt.h" -#else -#ifndef __GETOPT_H__ -#define __GETOPT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef __INSIDE_CYGWIN__ -extern int __declspec(dllimport) opterr; /* if error message should be printed */ -extern int __declspec(dllimport) optind; /* index into parent argv vector */ -extern int __declspec(dllimport) optopt; /* character checked for validity */ -extern int __declspec(dllimport) optreset; /* reset getopt */ -extern char __declspec(dllimport) *optarg; /* argument associated with option */ -#endif - -int getopt (int, char * const *, const char *); - -#ifdef __cplusplus -} -#endif - -#endif /* __GETOPT_H__ */ - -#ifndef __UNISTD_GETOPT__ -#ifndef __GETOPT_LONG_H__ -#define __GETOPT_LONG_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -struct option { - const char *name; - int has_arg; - int *flag; - int val; -}; - -int getopt_long (int, char *const *, const char *, const struct option *, int *); -int getopt_long_only (int, char *const *, const char *, const struct option *, int *); - -#ifndef HAVE_DECL_GETOPT -#define HAVE_DECL_GETOPT 1 -#endif - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -#ifdef __cplusplus -} -#endif - -#endif /* __GETOPT_LONG_H__ */ -#endif /* __UNISTD_GETOPT__ */ -#endif /*_INSIDE_NEWLIB*/ diff --git a/winsup/cygwin/include/glob.h b/winsup/cygwin/include/glob.h deleted file mode 100644 index bfcf306f4..000000000 --- a/winsup/cygwin/include/glob.h +++ /dev/null @@ -1,113 +0,0 @@ -/* $NetBSD: glob.h,v 1.6.2.2 1997/11/04 23:38:33 thorpej Exp $ */ - -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Guido van Rossum. - * - * 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. - * - * @(#)glob.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _GLOB_H_ -#define _GLOB_H_ - -#include -#include -#include - -typedef struct { - int gl_pathc; /* Count of total paths so far. */ - int gl_matchc; /* Count of paths matching pattern. */ - int gl_offs; /* Reserved at beginning of gl_pathv. */ - int gl_flags; /* Copy of flags parameter to glob. */ - char **gl_pathv; /* List of paths matching pattern. */ - /* Copy of errfunc parameter to glob. */ - int (*gl_errfunc) __P((const char *, int)); - - /* - * Alternate filesystem access methods for glob; replacement - * versions of closedir(3), readdir(3), opendir(3), stat(2) - * and lstat(2). - */ - void (*gl_closedir) __P((void *)); - struct dirent *(*gl_readdir) __P((void *)); - void *(*gl_opendir) __P((const char *)); -#ifdef __LIBC12_SOURCE__ - int (*gl_lstat) __P((const char *, struct stat12 *)); - int (*gl_stat) __P((const char *, struct stat12 *)); -#else -#if defined (__INSIDE_CYGWIN__) - int (*gl_lstat) (); - int (*gl_stat) (); -#else - int (*gl_lstat) __P((const char *, struct stat *)); - int (*gl_stat) __P((const char *, struct stat *)); -#endif -#endif -} glob_t; - -#define GLOB_APPEND 0x0001 /* Append to output from previous call. */ -#define GLOB_DOOFFS 0x0002 /* Use gl_offs. */ -#define GLOB_ERR 0x0004 /* Return on error. */ -#define GLOB_MARK 0x0008 /* Append / to matching directories. */ -#define GLOB_NOCHECK 0x0010 /* Return pattern itself if nothing matches. */ -#define GLOB_NOSORT 0x0020 /* Don't sort. */ - -#ifndef _POSIX_SOURCE -#define GLOB_ALTDIRFUNC 0x0040 /* Use alternately specified directory funcs. */ -#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */ -#define GLOB_MAGCHAR 0x0100 /* Pattern had globbing characters. */ -#define GLOB_NOMAGIC 0x0200 /* GLOB_NOCHECK without magic chars (csh). */ -#define GLOB_QUOTE 0x0400 /* Quote special chars with \. */ -#define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */ -#define GLOB_LIMIT 0x1000 /* Limit memory used by matches to ARG_MAX */ -#endif - -#define GLOB_NOSPACE (-1) /* Malloc call failed. */ -#define GLOB_ABEND (-2) /* Unignored error. */ - -__BEGIN_DECLS - -#undef DLLEXPORT -#ifdef __INSIDE_CYGWIN__ -# define DLLEXPORT -#else -# define DLLEXPORT __declspec(dllimport) -#endif -int DLLEXPORT glob(const char *, int, int (*)(const char *, int), glob_t *); -void DLLEXPORT globfree(glob_t *); - -#undef DLLEXPORT -__END_DECLS - -#endif /* !_GLOB_H_ */ diff --git a/winsup/cygwin/include/icmp.h b/winsup/cygwin/include/icmp.h deleted file mode 100644 index 7e7aedccd..000000000 --- a/winsup/cygwin/include/icmp.h +++ /dev/null @@ -1 +0,0 @@ -/* icmp.h */ diff --git a/winsup/cygwin/include/inttypes.h b/winsup/cygwin/include/inttypes.h deleted file mode 100644 index beacba620..000000000 --- a/winsup/cygwin/include/inttypes.h +++ /dev/null @@ -1,247 +0,0 @@ -/* inttypes.h - fixed size integer types - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _INTTYPES_H -#define _INTTYPES_H - -#include - -/* fprintf() macros for signed integers */ - -#define PRId8 "d" -#define PRId16 "d" -#define PRId32 "ld" -#define PRId64 "lld" - -#define PRIdLEAST8 "d" -#define PRIdLEAST16 "d" -#define PRIdLEAST32 "ld" -#define PRIdLEAST64 "lld" - -#define PRIdFAST8 "d" -#define PRIdFAST16 "ld" -#define PRIdFAST32 "ld" -#define PRIdFAST64 "lld" - -#define PRIdMAX "lld" -#define PRIdPTR "ld" - -#define PRIi8 "i" -#define PRIi16 "i" -#define PRIi32 "li" -#define PRIi64 "lli" - -#define PRIiLEAST8 "i" -#define PRIiLEAST16 "i" -#define PRIiLEAST32 "li" -#define PRIiLEAST64 "lli" - -#define PRIiFAST8 "i" -#define PRIiFAST16 "li" -#define PRIiFAST32 "li" -#define PRIiFAST64 "lli" - -#define PRIiMAX "lli" -#define PRIiPTR "li" - -/* fprintf() macros for unsigned integers */ - -#define PRIo8 "o" -#define PRIo16 "o" -#define PRIo32 "lo" -#define PRIo64 "llo" - -#define PRIoLEAST8 "o" -#define PRIoLEAST16 "o" -#define PRIoLEAST32 "lo" -#define PRIoLEAST64 "llo" - -#define PRIoFAST8 "o" -#define PRIoFAST16 "lo" -#define PRIoFAST32 "lo" -#define PRIoFAST64 "llo" - -#define PRIoMAX "llo" -#define PRIoPTR "lo" - -#define PRIu8 "u" -#define PRIu16 "u" -#define PRIu32 "lu" -#define PRIu64 "llu" - -#define PRIuLEAST8 "u" -#define PRIuLEAST16 "u" -#define PRIuLEAST32 "lu" -#define PRIuLEAST64 "llu" - -#define PRIuFAST8 "u" -#define PRIuFAST16 "lu" -#define PRIuFAST32 "lu" -#define PRIuFAST64 "llu" - -#define PRIuMAX "llu" -#define PRIuPTR "lu" - -#define PRIx8 "x" -#define PRIx16 "x" -#define PRIx32 "lx" -#define PRIx64 "llx" - -#define PRIxLEAST8 "x" -#define PRIxLEAST16 "x" -#define PRIxLEAST32 "lx" -#define PRIxLEAST64 "llx" - -#define PRIxFAST8 "x" -#define PRIxFAST16 "lx" -#define PRIxFAST32 "lx" -#define PRIxFAST64 "llx" - -#define PRIxMAX "llx" -#define PRIxPTR "lx" - -#define PRIX8 "X" -#define PRIX16 "X" -#define PRIX32 "lX" -#define PRIX64 "llX" - -#define PRIXLEAST8 "X" -#define PRIXLEAST16 "X" -#define PRIXLEAST32 "lX" -#define PRIXLEAST64 "llX" - -#define PRIXFAST8 "X" -#define PRIXFAST16 "lX" -#define PRIXFAST32 "lX" -#define PRIXFAST64 "llX" - -#define PRIXMAX "llX" -#define PRIXPTR "lX" - -/* fscanf() macros for signed integers */ - -#define SCNd8 "hhd" -#define SCNd16 "hd" -#define SCNd32 "ld" -#define SCNd64 "lld" - -#define SCNdLEAST8 "hhd" -#define SCNdLEAST16 "hd" -#define SCNdLEAST32 "ld" -#define SCNdLEAST64 "lld" - -#define SCNdFAST8 "hhd" -#define SCNdFAST16 "ld" -#define SCNdFAST32 "ld" -#define SCNdFAST64 "lld" - -#define SCNdMAX "lld" -#define SCNdPTR "ld" - -#define SCNi8 "hhi" -#define SCNi16 "hi" -#define SCNi32 "li" -#define SCNi64 "lli" - -#define SCNiLEAST8 "hhi" -#define SCNiLEAST16 "hi" -#define SCNiLEAST32 "li" -#define SCNiLEAST64 "lli" - -#define SCNiFAST8 "hhi" -#define SCNiFAST16 "li" -#define SCNiFAST32 "li" -#define SCNiFAST64 "lli" - -#define SCNiMAX "lli" -#define SCNiPTR "li" - -/* fscanf() macros for unsigned integers */ - -#define SCNo8 "hho" -#define SCNo16 "ho" -#define SCNo32 "lo" -#define SCNo64 "llo" - -#define SCNoLEAST8 "hho" -#define SCNoLEAST16 "ho" -#define SCNoLEAST32 "lo" -#define SCNoLEAST64 "llo" - -#define SCNoFAST8 "hho" -#define SCNoFAST16 "lo" -#define SCNoFAST32 "lo" -#define SCNoFAST64 "llo" - -#define SCNoMAX "llo" -#define SCNoPTR "lo" - -#define SCNu8 "hhu" -#define SCNu16 "hu" -#define SCNu32 "lu" -#define SCNu64 "llu" - -#define SCNuLEAST8 "hhu" -#define SCNuLEAST16 "hu" -#define SCNuLEAST32 "lu" -#define SCNuLEAST64 "llu" - -#define SCNuFAST8 "hhu" -#define SCNuFAST16 "lu" -#define SCNuFAST32 "lu" -#define SCNuFAST64 "llu" - -#define SCNuMAX "llu" -#define SCNuPTR "lu" - -#define SCNx8 "hhx" -#define SCNx16 "hx" -#define SCNx32 "lx" -#define SCNx64 "llx" - -#define SCNxLEAST8 "hhx" -#define SCNxLEAST16 "hx" -#define SCNxLEAST32 "lx" -#define SCNxLEAST64 "llx" - -#define SCNxFAST8 "hhx" -#define SCNxFAST16 "lx" -#define SCNxFAST32 "lx" -#define SCNxFAST64 "llx" - -#define SCNxMAX "llx" -#define SCNxPTR "lx" - -#ifdef __cplusplus -extern "C" { -#endif - -#include <_ansi.h> - -typedef struct { - intmax_t quot; - intmax_t rem; -} imaxdiv_t; - -intmax_t _EXFUN(imaxabs, (intmax_t)); -imaxdiv_t _EXFUN(imaxdiv, (intmax_t, intmax_t)); -intmax_t _EXFUN(strtoimax, (const char *, char **, int)); -uintmax_t _EXFUN(strtoumax, (const char *, char **, int)); - -#if 0 /* Not yet defined */ -intmax_t _EXFUN(wcstoimax, (const wchar_t *, wchar_t **, int)); -uintmax_t _EXFUN(wcstoumax, (const wchar_t *, wchar_t **, int)); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* _INTTYPES_H */ diff --git a/winsup/cygwin/include/io.h b/winsup/cygwin/include/io.h deleted file mode 100644 index de9f39e0a..000000000 --- a/winsup/cygwin/include/io.h +++ /dev/null @@ -1,29 +0,0 @@ -/* io.h - - Copyright 1999, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _IO_H_ -#define _IO_H_ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* - * Function to return a Win32 HANDLE from a fd. - */ -extern long get_osfhandle(int); -extern int setmode (int __fd, int __mode); -int access(const char *__path, int __amode); - -#ifdef __cplusplus -}; -#endif /* __cplusplus */ - -#endif /* _IO_H_ */ diff --git a/winsup/cygwin/include/lastlog.h b/winsup/cygwin/include/lastlog.h deleted file mode 100644 index 9db86206d..000000000 --- a/winsup/cygwin/include/lastlog.h +++ /dev/null @@ -1,22 +0,0 @@ -/* lastlog.h - - Copyright 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _LASTLOG_H -#define _LASTLOG_H - -#include - -struct lastlog { - long ll_time; - char ll_line[UT_LINESIZE]; - char ll_host[UT_HOSTSIZE]; -}; - -#endif diff --git a/winsup/cygwin/include/libgen.h b/winsup/cygwin/include/libgen.h deleted file mode 100644 index f5c24a8cc..000000000 --- a/winsup/cygwin/include/libgen.h +++ /dev/null @@ -1,23 +0,0 @@ -/* libgen.h - - Copyright 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _LIBGEN_H -#define _LIBGEN_H - -#include - -__BEGIN_DECLS - -extern char *basename (char *path); -extern char *dirname (char *path); - -__END_DECLS - -#endif /* _LIBGEN_H */ diff --git a/winsup/cygwin/include/limits.h b/winsup/cygwin/include/limits.h deleted file mode 100644 index 01e6db7b7..000000000 --- a/winsup/cygwin/include/limits.h +++ /dev/null @@ -1,193 +0,0 @@ -/* limits.h - - Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _LIMITS_H___ - -#include - -#ifndef _MACH_MACHLIMITS_H_ - -/* _MACH_MACHLIMITS_H_ is used on OSF/1. */ -#define _LIMITS_H___ -#define _MACH_MACHLIMITS_H_ - -/* Number of bits in a `char'. */ -#undef CHAR_BIT -#define CHAR_BIT 8 - -/* Maximum length of a multibyte character. */ -#ifndef MB_LEN_MAX -#define MB_LEN_MAX 1 -#endif - -/* Minimum and maximum values a `signed char' can hold. */ -#undef SCHAR_MIN -#define SCHAR_MIN (-128) -#undef SCHAR_MAX -#define SCHAR_MAX 127 - -/* Maximum value an `unsigned char' can hold. (Minimum is 0). */ -#undef UCHAR_MAX -#define UCHAR_MAX 255 - -/* Minimum and maximum values a `char' can hold. */ -#ifdef __CHAR_UNSIGNED__ -#undef CHAR_MIN -#define CHAR_MIN 0 -#undef CHAR_MAX -#define CHAR_MAX 255 -#else -#undef CHAR_MIN -#define CHAR_MIN (-128) -#undef CHAR_MAX -#define CHAR_MAX 127 -#endif - -/* Minimum and maximum values a `signed short int' can hold. */ -#undef SHRT_MIN -#define SHRT_MIN (-32768) -#undef SHRT_MAX -#define SHRT_MAX 32767 - -/* Maximum value an `unsigned short int' can hold. (Minimum is 0). */ -#undef USHRT_MAX -#define USHRT_MAX 65535 - -/* Minimum and maximum values a `signed int' can hold. */ -#ifndef __INT_MAX__ -#define __INT_MAX__ 2147483647 -#endif -#undef INT_MIN -#define INT_MIN (-INT_MAX-1) -#undef INT_MAX -#define INT_MAX __INT_MAX__ - -/* Maximum value an `unsigned int' can hold. (Minimum is 0). */ -#undef UINT_MAX -#define UINT_MAX (INT_MAX * 2U + 1) - -/* Minimum and maximum values a `signed long int' can hold. - (Same as `int'). */ -#ifndef __LONG_MAX__ -#ifndef __alpha__ -#define __LONG_MAX__ 2147483647L -#else -#define __LONG_MAX__ 9223372036854775807L -# endif /* __alpha__ */ -#endif -#undef LONG_MIN -#define LONG_MIN (-LONG_MAX-1) -#undef LONG_MAX -#define LONG_MAX __LONG_MAX__ - -/* Maximum value an `unsigned long int' can hold. (Minimum is 0). */ -#undef ULONG_MAX -#define ULONG_MAX (LONG_MAX * 2UL + 1) - -/* Minimum and maximum values a `signed long long int' can hold. */ -#ifndef __LONG_LONG_MAX__ -#define __LONG_LONG_MAX__ 9223372036854775807LL -#endif - -#if defined (__GNU_LIBRARY__) ? defined (__USE_GNU) : !defined (__STRICT_ANSI__) -#undef LONG_LONG_MIN -#define LONG_LONG_MIN (-LONG_LONG_MAX-1) -#undef LONG_LONG_MAX -#define LONG_LONG_MAX __LONG_LONG_MAX__ - -/* Maximum value an `unsigned long long int' can hold. (Minimum is 0). */ -#undef ULONG_LONG_MAX -#define ULONG_LONG_MAX (LONG_LONG_MAX * 2ULL + 1) -#endif - -/* Minimum and maximum values a `signed long long int' can hold. */ -#undef LLONG_MIN -#define LLONG_MIN (-LLONG_MAX-1) -#undef LLONG_MAX -#define LLONG_MAX __LONG_LONG_MAX__ - -/* Maximum value an `unsigned long long int' can hold. (Minimum is 0). */ -#undef ULLONG_MAX -#define ULLONG_MAX (LLONG_MAX * 2ULL + 1) - -/* Maximum number of iovcnt in a writev (an arbitrary number) */ -#undef IOV_MAX -#define IOV_MAX 1024 - -/* Maximum size of ssize_t */ -#undef SSIZE_MAX -#define SSIZE_MAX (__LONG_MAX__) - -/* Maximum length of a path */ -#define PATH_MAX 260 - -/* Maximum length of a path component. */ -#define NAME_MAX 255 - -/* Max num groups for a user, value taken from NT documentation */ -/* Must match NGROUPS */ -#define NGROUPS_MAX 16 - -/* WaitForMultipleObjects can't handle waiting for more than 64 objects. - This limits how many children we can fork/spawn off. */ -#define CHILD_MAX 63 - -/* # of open files per process. Actually it can be more since Cygwin - grows the dtable as necessary. We define a reasonable limit here - which is returned by getdtablesize(), sysconf(_SC_OPEN_MAX) and - getrlimit(RLIMIT_NOFILE). */ -#undef OPEN_MAX -#define OPEN_MAX 256 - -/* # of bytes in a pipe buf. This is the max # of bytes which can be - written to a pipe in one atomic operation. */ -#undef PIPE_BUF -#define PIPE_BUF 4096 - -/* Maximum number of timer expiration overruns. */ -#undef TIMER_MAX -#define TIMER_MAX 32 - -/* Maximum number of characters in a login name. */ -#undef LOGIN_NAME_MAX -#define LOGIN_NAME_MAX 256 /* equal to UNLEN defined in w32api/lmcons.h */ - -/* Maximum number of characters in a tty name. */ -#undef TTY_NAME_MAX -#define TTY_NAME_MAX 12 - -/* POSIX values */ -/* These should never vary from one system type to another */ -/* They represent the minimum values that POSIX systems must support. - POSIX-conforming apps must not require larger values. */ -#define _POSIX_ARG_MAX 4096 -#define _POSIX_CHILD_MAX 6 -#define _POSIX_LINK_MAX 8 -#define _POSIX_MAX_CANON 255 -#define _POSIX_MAX_INPUT 255 -#define _POSIX_NAME_MAX 14 -#define _POSIX_NGROUPS_MAX 0 -#define _POSIX_OPEN_MAX 16 -#define _POSIX_PATH_MAX 255 -#define _POSIX_PIPE_BUF 512 -#define _POSIX_SSIZE_MAX 32767 -#define _POSIX_STREAM_MAX 8 -#define _POSIX_TZNAME_MAX 3 -#define _POSIX_RTSIG_MAX 8 -#define _POSIX_TIMER_MAX 32 -#define _POSIX_TTY_NAME_MAX 9 - -#define RTSIG_MAX _POSIX_RTSIG_MAX - -/* Used for nice and get/setpriority. */ -#define NZERO 20 - -#endif /* _MACH_MACHLIMITS_H_ */ -#endif /* _LIMITS_H___ */ diff --git a/winsup/cygwin/include/machine/stdlib.h b/winsup/cygwin/include/machine/stdlib.h deleted file mode 100644 index 2d1539e2c..000000000 --- a/winsup/cygwin/include/machine/stdlib.h +++ /dev/null @@ -1,22 +0,0 @@ -/* machine/stdlib.h - - Copyright 2005 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#ifndef _MACHSTDLIB_H_ -#define _MACHSTDLIB_H_ -#ifdef __cplusplus -extern "C" { -#endif - -char *mkdtemp (char *); - -#ifdef __cplusplus -} -#endif -#endif /* _MACHSTDLIB_H_ */ diff --git a/winsup/cygwin/include/mapi.h b/winsup/cygwin/include/mapi.h deleted file mode 100644 index e2d47e264..000000000 --- a/winsup/cygwin/include/mapi.h +++ /dev/null @@ -1,102 +0,0 @@ -/* mapi.h - - Copyright 1997, 1998, 1999, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _MAPI_H -#define _MAPI_H - -/* Currently this doesn't include all the definitions. It does cover - the parts of Simple MAPI required to send mail. */ - -#ifdef __cplusplus -extern "C" -{ -#endif - - /* FIXME: should this be elsewhere? */ -typedef unsigned long FLAGS; - - /* FIXME: should this be elsewhere? */ -#define SUCCESS_SUCCESS 0 - - /* FIXME: should this be elsewhere? */ -typedef unsigned long LHANDLE, FAR *LPLHANDLE; - - -#define MAPI_E_AMBIGUOUS_RECIPIENT 0x15 -#define MAPI_E_ATTACHMENT_NOT_FOUND 0xb -#define MAPI_E_ATTACHMENT_OPEN_FAILURE 0xc -#define MAPI_E_BAD_RECIPTYPE 0xf -#define MAPI_E_FAILURE 0x2 -#define MAPI_E_INSUFFICIENT_MEMORY 0x5 -#define MAPI_E_INVALID_RECIPS 0x19 -#define MAPI_E_LOGIN_FAILURE 0x3 -#define MAPI_E_TEXT_TOO_LARGE 0x12 -#define MAPI_E_TOO_MANY_FILES 0x9 -#define MAPI_E_TOO_MANY_RECIPIENTS 0xa -#define MAPI_E_UNKNOWN_RECIPIENT 0xe -#define MAPI_E_USER_ABORT 0x1 -#define MAPI_E_TEXT_TOO_LARGE 0x12 -#define MAPI_DIALOG 0x8 -#define MAPI_NEW_SESSION 0x2 -#define MAPI_LOGON_UI 0x1 -#define MAPI_RECEIPT_REQUESTED 0x2 -#define MAPI_SENT 0x4 -#define MAPI_UNREAD 0x1 -#define MAPI_OLE 0x1 -#define MAPI_OLE_STATIC 0x2 - -#define MAPI_ORIG 0 -#define MAPI_TO 1 -#define MAPI_CC 2 -#define MAPI_BCC 3 - -typedef struct -{ - ULONG ulReserved; - ULONG flFlags; - ULONG nPosition; - LPTSTR lpszPathName; - LPTSTR lpszFileName; - LPVOID lpFileType; -} MapiFileDesc, FAR *lpMapiFileDesc; - -typedef struct -{ - ULONG ulReserved; - ULONG ulRecipClass; - LPTSTR lpszName; - LPTSTR lpszAddress; - ULONG ulEIDSize; - LPVOID lpEntryID; -} MapiRecipDesc, FAR *lpMapiRecipDesc; - -typedef struct -{ - ULONG ulReserved; - LPTSTR lpszSubject; - LPTSTR lpszNoteText; - LPTSTR lpszMessageType; - LPTSTR lpszDateReceived; - LPTSTR lpszConversationID; - FLAGS flFlags; - lpMapiRecipDesc lpOriginator; - ULONG nRecipCount; - lpMapiRecipDesc lpRecips; - ULONG nFileCount; - lpMapiFileDesc lpFiles; -} MapiMessage, FAR *lpMapiMessage; - -ULONG FAR PASCAL MAPISendMail (LHANDLE, ULONG, lpMapiMessage, FLAGS, ULONG); - -#ifdef __cplusplus -} -#endif - -#endif /* _MAPI_H */ diff --git a/winsup/cygwin/include/memory.h b/winsup/cygwin/include/memory.h deleted file mode 100644 index 2e16766b9..000000000 --- a/winsup/cygwin/include/memory.h +++ /dev/null @@ -1,17 +0,0 @@ -/* memory.h - - Copyright 1998, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _MEMORY_H -#define _MEMORY_H - -/* This allows more things to compile. */ -#include - -#endif /* _MEMORY_H */ diff --git a/winsup/cygwin/include/mntent.h b/winsup/cygwin/include/mntent.h deleted file mode 100644 index 5fa4ff945..000000000 --- a/winsup/cygwin/include/mntent.h +++ /dev/null @@ -1,48 +0,0 @@ -/* mntent.h - - Copyright 1996, 1998, 1999, 2000, 2001, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _MNTENT_H -#define _MNTENT_H - -#ifdef __cplusplus -extern "C" { -#endif - -struct mntent -{ - char *mnt_fsname; - char *mnt_dir; - char *mnt_type; - char *mnt_opts; - int mnt_freq; - int mnt_passno; -}; - -#ifndef _NOMNTENT_FUNCS -#include -FILE *setmntent (const char *__filep, const char *__type); -struct mntent *getmntent (FILE *__filep); -int addmntent (FILE *__filep, const struct mntent *__mnt); -int endmntent (FILE *__filep); -char *hasmntopt (const struct mntent *__mnt, const char *__opt); -#endif - -/* This next file doesn't exist, it is in the registry, - however applications need the define to pass to - the above calls. -*/ -#ifndef MOUNTED -#define MOUNTED "/etc/mtab" -#endif -#ifdef __cplusplus -}; -#endif - -#endif /* _MNTENT_H */ diff --git a/winsup/cygwin/include/net/if.h b/winsup/cygwin/include/net/if.h deleted file mode 100644 index aff3b88e9..000000000 --- a/winsup/cygwin/include/net/if.h +++ /dev/null @@ -1,16 +0,0 @@ -/* net/if.h - - Copyright 1998, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _NET_IF_H -#define _NET_IF_H - -#include - -#endif /* _NET_IF_H */ diff --git a/winsup/cygwin/include/netdb.h b/winsup/cygwin/include/netdb.h deleted file mode 100644 index f49a94379..000000000 --- a/winsup/cygwin/include/netdb.h +++ /dev/null @@ -1,168 +0,0 @@ -/* Original linux netdb.h merged with winsock.h types */ - -/*- - * Copyright (c) 1980, 1983, 1988, 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. - * - * @(#)netdb.h 8.1 (Berkeley) 6/2/93 - * netdb.h,v 1.1.1.1 1995/02/18 05:34:07 hjl Exp - * - - * 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-- - */ - -#ifndef _NETDB_H_ -#define _NETDB_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Structures returned by network data base library. All addresses are - * supplied in host order, and returned in network order (suitable for - * use in system calls). - */ - - /* Different from the linux versions - note the shorts.. */ -struct hostent { - const char *h_name; /* official name of host */ - char **h_aliases; /* alias list */ - short h_addrtype; /* host address type */ - short h_length; /* length of address */ - char **h_addr_list; /* list of addresses from name server */ -#define h_addr h_addr_list[0] /* address, for backward compatiblity */ -}; - -/* - * Assumption here is that a network number - * fits in an unsigned long -- probably a poor one. - */ - -struct netent { - char *n_name; /* official name of net */ - char **n_aliases; /* alias list */ - short n_addrtype; /* net address type */ - unsigned long n_net; /* network # */ -}; - -struct servent { - char *s_name; /* official service name */ - char **s_aliases; /* alias list */ - short s_port; /* port # */ - char *s_proto; /* protocol to use */ -}; - -struct protoent -{ - char *p_name; /* official protocol name */ - char **p_aliases; /* alias list */ - short p_proto; /* protocol # */ -}; - -struct rpcent { - char *r_name; /* name of server for this rpc program */ - char **r_aliases; /* alias list */ - int r_number; /* rpc program number */ -}; - -/* - * Error return codes from gethostbyname() and gethostbyaddr() - * (left in extern int h_errno). - */ - -#ifdef __INSIDE_CYGWIN_NET__ -extern int h_errno; -#else -extern __declspec(dllimport) int h_errno; -#endif - -#define NETDB_INTERNAL -1 /* see errno */ -#define NETDB_SUCCESS 0 /* no problem */ -#define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found */ -#define TRY_AGAIN 2 /* Non-Authoritive Host not found, or SERVERFAIL */ -#define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */ -#define NO_DATA 4 /* Valid name, no data record of requested type */ -#define NO_ADDRESS NO_DATA /* no address, look for MX record */ - -#ifndef __INSIDE_CYGWIN_NET__ -void endhostent (void); -void endnetent (void); -void endprotoent (void); -void endservent (void); -void endrpcent (void); -struct hostent *gethostbyaddr (const char *, int, int); -struct hostent *gethostbyname (const char *); -struct hostent *gethostent (void); -struct netent *getnetbyaddr (long, int); /* u_long? */ -struct netent *getnetbyname (const char *); -struct netent *getnetent (void); -struct protoent *getprotobyname (const char *); -struct protoent *getprotobynumber (int); -struct protoent *getprotoent (void); -struct servent *getservbyname (const char *, const char *); -struct servent *getservbyport (int, const char *); -struct servent *getservent (void); -struct rpcent *getrpcent (void); -struct rpcent *getrpcbyname (const char *); -struct rpcent *getrpcbynumber (int); -const char *hstrerror (int); -void herror (const char *); -void sethostent (int); -void setnetent (int); -void setprotoent (int); -void setservent (int); -void setrpcent (int); -#endif - -#ifdef __cplusplus -}; -#endif - -#endif /* !_NETDB_H_ */ - diff --git a/winsup/cygwin/include/netinet/in.h b/winsup/cygwin/include/netinet/in.h deleted file mode 100644 index 7081282a7..000000000 --- a/winsup/cygwin/include/netinet/in.h +++ /dev/null @@ -1,16 +0,0 @@ -/* netinet/in.h - - Copyright 1998, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _NETINET_IN_H -#define _NETINET_IN_H - -#include - -#endif /* _NETINET_IN_H */ diff --git a/winsup/cygwin/include/netinet/in_systm.h b/winsup/cygwin/include/netinet/in_systm.h deleted file mode 100644 index 17b5feb8d..000000000 --- a/winsup/cygwin/include/netinet/in_systm.h +++ /dev/null @@ -1,16 +0,0 @@ -/* netinet/in_systm.h - - Copyright 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _NETINET_IN_SYSTM_H -#define _NETINET_IN_SYSTM_H - -#include - -#endif /* _NETINET_IN_SYSTM_H */ diff --git a/winsup/cygwin/include/netinet/ip.h b/winsup/cygwin/include/netinet/ip.h deleted file mode 100644 index 653f6db9d..000000000 --- a/winsup/cygwin/include/netinet/ip.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 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. - * - * @(#)ip.h 8.2 (Berkeley) 6/1/94 - * $FreeBSD: src/sys/netinet/ip.h,v 1.17 1999/12/22 19:13:20 shin Exp $ - */ - -#ifndef _NETINET_IP_H -#define _NETINET_IP_H - -#include -#include - -/* Added by Wu Yongwei */ -#ifndef LITTLE_ENDIAN -#define LITTLE_ENDIAN 1234 -#define BIG_ENDIAN 4321 -#endif -#ifndef BYTE_ORDER -#define BYTE_ORDER LITTLE_ENDIAN -#endif - -/* - * Definitions for internet protocol version 4. - * Per RFC 791, September 1981. - */ -#define IPVERSION 4 - -/* - * Structure of an internet header, naked of options. - */ -struct ip { -#ifdef _IP_VHL - u_char ip_vhl; /* version << 4 | header length >> 2 */ -#else -#if BYTE_ORDER == LITTLE_ENDIAN - u_int ip_hl:4, /* header length */ - ip_v:4; /* version */ -#endif -#if BYTE_ORDER == BIG_ENDIAN - u_int ip_v:4, /* version */ - ip_hl:4; /* header length */ -#endif -#endif /* not _IP_VHL */ - u_char ip_tos; /* type of service */ - u_short ip_len; /* total length */ - u_short ip_id; /* identification */ - u_short ip_off; /* fragment offset field */ -#define IP_RF 0x8000 /* reserved fragment flag */ -#define IP_DF 0x4000 /* dont fragment flag */ -#define IP_MF 0x2000 /* more fragments flag */ -#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ - u_char ip_ttl; /* time to live */ - u_char ip_p; /* protocol */ - u_short ip_sum; /* checksum */ - struct in_addr ip_src,ip_dst; /* source and dest address */ -}; - -#ifdef _IP_VHL -#define IP_MAKE_VHL(v, hl) ((v) << 4 | (hl)) -#define IP_VHL_HL(vhl) ((vhl) & 0x0f) -#define IP_VHL_V(vhl) ((vhl) >> 4) -#define IP_VHL_BORING 0x45 -#endif - -#define IP_MAXPACKET 65535 /* maximum packet size */ - -/* - * Definitions for IP type of service (ip_tos) - */ -#ifndef IPTOS_LOWDELAY -#define IPTOS_LOWDELAY 0x10 -#define IPTOS_THROUGHPUT 0x08 -#define IPTOS_RELIABILITY 0x04 -#endif -#define IPTOS_MINCOST 0x02 -/* ECN bits proposed by Sally Floyd */ -#define IPTOS_CE 0x01 /* congestion experienced */ -#define IPTOS_ECT 0x02 /* ECN-capable transport */ - - -/* - * Definitions for IP precedence (also in ip_tos) (hopefully unused) - */ -#define IPTOS_PREC_NETCONTROL 0xe0 -#define IPTOS_PREC_INTERNETCONTROL 0xc0 -#define IPTOS_PREC_CRITIC_ECP 0xa0 -#define IPTOS_PREC_FLASHOVERRIDE 0x80 -#define IPTOS_PREC_FLASH 0x60 -#define IPTOS_PREC_IMMEDIATE 0x40 -#define IPTOS_PREC_PRIORITY 0x20 -#define IPTOS_PREC_ROUTINE 0x00 - -/* - * Definitions for options. - */ -#define IPOPT_COPIED(o) ((o)&0x80) -#define IPOPT_CLASS(o) ((o)&0x60) -#define IPOPT_NUMBER(o) ((o)&0x1f) - -#define IPOPT_CONTROL 0x00 -#define IPOPT_RESERVED1 0x20 -#define IPOPT_DEBMEAS 0x40 -#define IPOPT_RESERVED2 0x60 - -#define IPOPT_EOL 0 /* end of option list */ -#define IPOPT_NOP 1 /* no operation */ - -#define IPOPT_RR 7 /* record packet route */ -#define IPOPT_TS 68 /* timestamp */ -#define IPOPT_SECURITY 130 /* provide s,c,h,tcc */ -#define IPOPT_LSRR 131 /* loose source route */ -#define IPOPT_SATID 136 /* satnet id */ -#define IPOPT_SSRR 137 /* strict source route */ -#define IPOPT_RA 148 /* router alert */ - -/* - * Offsets to fields in options other than EOL and NOP. - */ -#define IPOPT_OPTVAL 0 /* option ID */ -#define IPOPT_OLEN 1 /* option length */ -#define IPOPT_OFFSET 2 /* offset within option */ -#define IPOPT_MINOFF 4 /* min value of above */ - -/* - * Time stamp option structure. - */ -struct ip_timestamp { - u_char ipt_code; /* IPOPT_TS */ - u_char ipt_len; /* size of structure (variable) */ - u_char ipt_ptr; /* index of current entry */ -#if BYTE_ORDER == LITTLE_ENDIAN - u_int ipt_flg:4, /* flags, see below */ - ipt_oflw:4; /* overflow counter */ -#endif -#if BYTE_ORDER == BIG_ENDIAN - u_int ipt_oflw:4, /* overflow counter */ - ipt_flg:4; /* flags, see below */ -#endif - union ipt_timestamp { - n_long ipt_time[1]; - struct ipt_ta { - struct in_addr ipt_addr; - n_long ipt_time; - } ipt_ta[1]; - } ipt_timestamp; -}; - -/* flag bits for ipt_flg */ -#define IPOPT_TS_TSONLY 0 /* timestamps only */ -#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ -#define IPOPT_TS_PRESPEC 3 /* specified modules only */ - -/* bits for security (not byte swapped) */ -#define IPOPT_SECUR_UNCLASS 0x0000 -#define IPOPT_SECUR_CONFID 0xf135 -#define IPOPT_SECUR_EFTO 0x789a -#define IPOPT_SECUR_MMMM 0xbc4d -#define IPOPT_SECUR_RESTR 0xaf13 -#define IPOPT_SECUR_SECRET 0xd788 -#define IPOPT_SECUR_TOPSECRET 0x6bc5 - -/* - * Internet implementation parameters. - */ -#define MAXTTL 255 /* maximum time to live (seconds) */ -#define IPDEFTTL 64 /* default ttl, from RFC 1340 */ -#define IPFRAGTTL 60 /* time to live for frags, slowhz */ -#define IPTTLDEC 1 /* subtracted when forwarding */ - -#define IP_MSS 576 /* default maximum segment size */ - -#endif diff --git a/winsup/cygwin/include/netinet/ip_icmp.h b/winsup/cygwin/include/netinet/ip_icmp.h deleted file mode 100644 index 6a1be053c..000000000 --- a/winsup/cygwin/include/netinet/ip_icmp.h +++ /dev/null @@ -1,16 +0,0 @@ -/* netinet/ip_icmp.h - - Copyright 1998, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _NETINET_IP_ICMP_H -#define _NETINET_IP_ICMP_H - -#include - -#endif /* _NETINET_IP_ICMP_H */ diff --git a/winsup/cygwin/include/netinet/tcp.h b/winsup/cygwin/include/netinet/tcp.h deleted file mode 100644 index 305527d0e..000000000 --- a/winsup/cygwin/include/netinet/tcp.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 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. - * - * @(#)tcp.h 8.1 (Berkeley) 6/10/93 - * $FreeBSD: src/sys/netinet/tcp.h,v 1.13 2000/01/09 19:17:25 shin Exp $ - */ - -#ifndef _NETINET_TCP_H -#define _NETINET_TCP_H - -/* Added by Wu Yongwei */ -#ifndef LITTLE_ENDIAN -#define LITTLE_ENDIAN 1234 -#define BIG_ENDIAN 4321 -#endif -#ifndef BYTE_ORDER -#define BYTE_ORDER LITTLE_ENDIAN -#endif - -typedef u_int32_t tcp_seq; -typedef u_int32_t tcp_cc; /* connection count per rfc1644 */ - -#define tcp6_seq tcp_seq /* for KAME src sync over BSD*'s */ -#define tcp6hdr tcphdr /* for KAME src sync over BSD*'s */ - -/* - * TCP header. - * Per RFC 793, September, 1981. - */ -struct tcphdr { - u_short th_sport; /* source port */ - u_short th_dport; /* destination port */ - tcp_seq th_seq; /* sequence number */ - tcp_seq th_ack; /* acknowledgement number */ -#if BYTE_ORDER == LITTLE_ENDIAN - u_int th_x2:4, /* (unused) */ - th_off:4; /* data offset */ -#endif -#if BYTE_ORDER == BIG_ENDIAN - u_int th_off:4, /* data offset */ - th_x2:4; /* (unused) */ -#endif - u_char th_flags; -#define TH_FIN 0x01 -#define TH_SYN 0x02 -#define TH_RST 0x04 -#define TH_PUSH 0x08 -#define TH_ACK 0x10 -#define TH_URG 0x20 -#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG) - - u_short th_win; /* window */ - u_short th_sum; /* checksum */ - u_short th_urp; /* urgent pointer */ -}; - -#define TCPOPT_EOL 0 -#define TCPOPT_NOP 1 -#define TCPOPT_MAXSEG 2 -#define TCPOLEN_MAXSEG 4 -#define TCPOPT_WINDOW 3 -#define TCPOLEN_WINDOW 3 -#define TCPOPT_SACK_PERMITTED 4 /* Experimental */ -#define TCPOLEN_SACK_PERMITTED 2 -#define TCPOPT_SACK 5 /* Experimental */ -#define TCPOPT_TIMESTAMP 8 -#define TCPOLEN_TIMESTAMP 10 -#define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */ -#define TCPOPT_TSTAMP_HDR \ - (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP) - -#define TCPOPT_CC 11 /* CC options: RFC-1644 */ -#define TCPOPT_CCNEW 12 -#define TCPOPT_CCECHO 13 -#define TCPOLEN_CC 6 -#define TCPOLEN_CC_APPA (TCPOLEN_CC+2) -#define TCPOPT_CC_HDR(ccopt) \ - (TCPOPT_NOP<<24|TCPOPT_NOP<<16|(ccopt)<<8|TCPOLEN_CC) - -/* - * Default maximum segment size for TCP. - * With an IP MSS of 576, this is 536, - * but 512 is probably more convenient. - * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)). - */ -#define TCP_MSS 512 - -/* - * Default maximum segment size for TCP6. - * With an IP6 MSS of 1280, this is 1220, - * but 1024 is probably more convenient. (xxx kazu in doubt) - * This should be defined as MIN(1024, IP6_MSS - sizeof (struct tcpip6hdr)) - */ -#define TCP6_MSS 1024 - -#define TCP_MAXWIN 65535 /* largest value for (unscaled) window */ -#define TTCP_CLIENT_SND_WND 4096 /* dflt send window for T/TCP client */ - -#define TCP_MAX_WINSHIFT 14 /* maximum window shift */ - -#define TCP_MAXHLEN (0xf<<2) /* max length of header in bytes */ -#define TCP_MAXOLEN (TCP_MAXHLEN - sizeof(struct tcphdr)) - /* max space left for options */ - -/* - * User-settable options (used with setsockopt). - */ -#ifndef TCP_NODELAY -#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ -#define TCP_MAXSEG 0x02 /* set maximum segment size */ -#endif -#define TCP_NOPUSH 0x04 /* don't push last block of write */ -#define TCP_NOOPT 0x08 /* don't use TCP options */ - -#endif diff --git a/winsup/cygwin/include/netinet/udp.h b/winsup/cygwin/include/netinet/udp.h deleted file mode 100644 index 61932720b..000000000 --- a/winsup/cygwin/include/netinet/udp.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 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. - * - * @(#)udp.h 8.1 (Berkeley) 6/10/93 - * $FreeBSD: src/sys/netinet/udp.h,v 1.7 1999/08/28 00:49:34 peter Exp $ - */ - -#ifndef _NETINET_UDP_H -#define _NETINET_UDP_H - -/* - * Udp protocol header. - * Per RFC 768, September, 1981. - */ -struct udphdr { - u_short uh_sport; /* source port */ - u_short uh_dport; /* destination port */ - u_short uh_ulen; /* udp length */ - u_short uh_sum; /* udp checksum */ -}; - -#endif diff --git a/winsup/cygwin/include/paths.h b/winsup/cygwin/include/paths.h deleted file mode 100644 index 11876cb29..000000000 --- a/winsup/cygwin/include/paths.h +++ /dev/null @@ -1,30 +0,0 @@ -/* paths.h - - Copyright 2001, 2002, 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _PATHS_H_ -#define _PATHS_H_ - -#define _PATH_BSHELL "/bin/sh" -#define _PATH_CSHELL "/bin/csh" -#define _PATH_DEFPATH "/bin" -#define _PATH_DEV "/dev/" -#define _PATH_DEVNULL "/dev/null" -#define _PATH_LASTLOG "/var/log/lastlog" -#define _PATH_MAN "/usr/share/man" -#define _PATH_MEM "/dev/mem" -#define _PATH_STDPATH "/bin:/usr/sbin:/sbin" -#define _PATH_TMP "/tmp/" -#define _PATH_TTY "/dev/tty" -#define _PATH_UTMP "/var/run/utmp" -#define _PATH_VARRUN "/var/run/" -#define _PATH_VI "/bin/vi" -#define _PATH_WTMP "/var/log/wtmp" - -#endif /* _PATHS_H_ */ diff --git a/winsup/cygwin/include/poll.h b/winsup/cygwin/include/poll.h deleted file mode 100644 index a836b2af4..000000000 --- a/winsup/cygwin/include/poll.h +++ /dev/null @@ -1,11 +0,0 @@ -/* poll.h - - Copyright 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include diff --git a/winsup/cygwin/include/pthread.h b/winsup/cygwin/include/pthread.h deleted file mode 100644 index 1a034a0ae..000000000 --- a/winsup/cygwin/include/pthread.h +++ /dev/null @@ -1,204 +0,0 @@ -/* pthread.h: POSIX pthread interface - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. - - Written by Marco Fuykschot - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include -#include -#include - -#ifndef _PTHREAD_H -#define _PTHREAD_H - -#ifdef __cplusplus -extern "C" -{ -#endif - - -/* Defines. (These are correctly defined here as per - http://www.opengroup.org/onlinepubs/7908799/xsh/pthread.h.html */ - -/* FIXME: this should allocate a new cond variable, and return the value that - would normally be written to the passed parameter of pthread_cond_init(lvalue, NULL); */ -/* #define PTHREAD_COND_INITIALIZER 0 */ - -#define PTHREAD_DESTRUCTOR_ITERATIONS 1 -/* Tls has 64 items for pre win2000 - and we don't want to use them all :] - * Before committing discuss this with the list - */ -#define PTHREAD_KEYS_MAX 32 -/* the default : joinable */ - -#define PTHREAD_CANCEL_ASYNCHRONOUS 1 -/* defaults are enable, deferred */ -#define PTHREAD_CANCEL_ENABLE 0 -#define PTHREAD_CANCEL_DEFERRED 0 -#define PTHREAD_CANCEL_DISABLE 1 -#define PTHREAD_CANCELED ((void *)-1) -/* this should be a value that can never be a valid address */ -#define PTHREAD_COND_INITIALIZER (pthread_cond_t)21 -#define PTHREAD_CREATE_DETACHED 1 -/* the default : joinable */ -#define PTHREAD_CREATE_JOINABLE 0 -#define PTHREAD_EXPLICIT_SCHED 1 -#define PTHREAD_INHERIT_SCHED 0 -#define PTHREAD_MUTEX_RECURSIVE 0 -#define PTHREAD_MUTEX_ERRORCHECK 1 -#define PTHREAD_MUTEX_NORMAL 2 -#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL -/* this should be too low to ever be a valid address */ -#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP (pthread_mutex_t)18 -#define PTHREAD_NORMAL_MUTEX_INITIALIZER_NP (pthread_mutex_t)19 -#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP (pthread_mutex_t)20 -#define PTHREAD_MUTEX_INITIALIZER PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP -#define PTHREAD_ONCE_INIT { PTHREAD_MUTEX_INITIALIZER, 0 } -#define PTHREAD_PRIO_INHERIT -#define PTHREAD_PRIO_NONE -#define PTHREAD_PRIO_PROTECT -#define PTHREAD_PROCESS_SHARED 1 -#define PTHREAD_PROCESS_PRIVATE 0 -#define PTHREAD_RWLOCK_INITIALIZER (pthread_rwlock_t)22 -/* process is the default */ -#define PTHREAD_SCOPE_PROCESS 0 -#define PTHREAD_SCOPE_SYSTEM 1 - - -/* Attributes */ -int pthread_attr_destroy (pthread_attr_t *); -int pthread_attr_getdetachstate (const pthread_attr_t *, int *); -int pthread_attr_getinheritsched (const pthread_attr_t *, int *); -int pthread_attr_getschedparam (const pthread_attr_t *, struct sched_param *); -int pthread_attr_getschedpolicy (const pthread_attr_t *, int *); -int pthread_attr_getscope (const pthread_attr_t *, int *); -int pthread_attr_init (pthread_attr_t *); -int pthread_attr_setdetachstate (pthread_attr_t *, int); -int pthread_attr_setinheritsched (pthread_attr_t *, int); -int pthread_attr_setschedparam (pthread_attr_t *, const struct sched_param *); -int pthread_attr_setschedpolicy (pthread_attr_t *, int); -int pthread_attr_setscope (pthread_attr_t *, int); - -#ifdef _POSIX_THREAD_ATTR_STACKADDR -/* These functions may be implementable via some low level trickery. For now they are - * Not supported or implemented. The prototypes are here so if someone greps the - * source they will see these comments - */ -int pthread_attr_getstackaddr (const pthread_attr_t *, void **); -int pthread_attr_setstackaddr (pthread_attr_t *, void *); -#endif - -#ifdef _POSIX_THREAD_ATTR_STACKSIZE -int pthread_attr_getstacksize (const pthread_attr_t *, size_t *); -int pthread_attr_setstacksize (pthread_attr_t *, size_t); -#endif - -int pthread_cancel (pthread_t); -/* Macros for cleanup_push and pop; - * The function definitions are -void pthread_cleanup_push (void (*routine)(void*), void *arg); -void pthread_cleanup_pop (int execute); -*/ -typedef void (*__cleanup_routine_type) (void *); -typedef struct _pthread_cleanup_handler -{ - __cleanup_routine_type function; - void *arg; - struct _pthread_cleanup_handler *next; -} __pthread_cleanup_handler; - -void _pthread_cleanup_push (__pthread_cleanup_handler *handler); -void _pthread_cleanup_pop (int execute); - -#define pthread_cleanup_push(_fn, _arg) { __pthread_cleanup_handler __cleanup_handler = \ - { _fn, _arg, NULL }; \ - _pthread_cleanup_push( &__cleanup_handler ); -#define pthread_cleanup_pop(_execute) _pthread_cleanup_pop( _execute ); } - -/* Condition variables */ -int pthread_cond_broadcast (pthread_cond_t *); -int pthread_cond_destroy (pthread_cond_t *); -int pthread_cond_init (pthread_cond_t *, const pthread_condattr_t *); -int pthread_cond_signal (pthread_cond_t *); -int pthread_cond_timedwait (pthread_cond_t *, - pthread_mutex_t *, const struct timespec *); -int pthread_cond_wait (pthread_cond_t *, pthread_mutex_t *); -int pthread_condattr_destroy (pthread_condattr_t *); -int pthread_condattr_getpshared (const pthread_condattr_t *, int *); -int pthread_condattr_init (pthread_condattr_t *); -int pthread_condattr_setpshared (pthread_condattr_t *, int); - -int pthread_create (pthread_t *, const pthread_attr_t *, - void *(*)(void *), void *); -int pthread_detach (pthread_t); -int pthread_equal (pthread_t, pthread_t); -void pthread_exit (void *); -int pthread_getschedparam (pthread_t, int *, struct sched_param *); -void *pthread_getspecific (pthread_key_t); -int pthread_join (pthread_t, void **); -int pthread_key_create (pthread_key_t *, void (*)(void *)); -int pthread_key_delete (pthread_key_t); - -/* Mutex's */ -int pthread_mutex_destroy (pthread_mutex_t *); -int pthread_mutex_getprioceiling (const pthread_mutex_t *, int *); -int pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *); -int pthread_mutex_lock (pthread_mutex_t *); -int pthread_mutex_setprioceiling (pthread_mutex_t *, int, int *); -int pthread_mutex_trylock (pthread_mutex_t *); -int pthread_mutex_unlock (pthread_mutex_t *); -int pthread_mutexattr_destroy (pthread_mutexattr_t *); -int pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *, int *); -int pthread_mutexattr_getprotocol (const pthread_mutexattr_t *, int *); -int pthread_mutexattr_getpshared (const pthread_mutexattr_t *, int *); -int pthread_mutexattr_gettype (const pthread_mutexattr_t *, int *); -int pthread_mutexattr_init (pthread_mutexattr_t *); -int pthread_mutexattr_setprioceiling (pthread_mutexattr_t *, int); -int pthread_mutexattr_setprotocol (pthread_mutexattr_t *, int); -int pthread_mutexattr_setpshared (pthread_mutexattr_t *, int); -int pthread_mutexattr_settype (pthread_mutexattr_t *, int); - -/* RW Locks */ -int pthread_rwlock_destroy (pthread_rwlock_t *rwlock); -int pthread_rwlock_init (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr); -int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock); -int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock); -int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock); -int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock); -int pthread_rwlock_unlock (pthread_rwlock_t *rwlock); -int pthread_rwlockattr_init (pthread_rwlockattr_t *rwlockattr); -int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr, - int *pshared); -int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared); -int pthread_rwlockattr_destroy (pthread_rwlockattr_t *rwlockattr); - -int pthread_once (pthread_once_t *, void (*)(void)); - -/* Concurrency levels - X/Open interface */ -int pthread_getconcurrency (void); -int pthread_setconcurrency (int); - - -pthread_t pthread_self (void); -int pthread_setcancelstate (int, int *); -int pthread_setcanceltype (int, int *); -int pthread_setschedparam (pthread_t, int, const struct sched_param *); -int pthread_setspecific (pthread_key_t, const void *); -void pthread_testcancel (void); - -/* Non posix calls */ - -int pthread_suspend (pthread_t); -int pthread_continue (pthread_t); - -#ifdef __cplusplus -} -#endif - -#endif /* _PTHREAD_H */ diff --git a/winsup/cygwin/include/pty.h b/winsup/cygwin/include/pty.h deleted file mode 100644 index e4b4da03f..000000000 --- a/winsup/cygwin/include/pty.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __PTY_H__ -#define __PTY_H__ - -#include <_ansi.h> -#include - -#ifdef __cplusplus -extern "C" { -#endif - -int _EXFUN(openpty ,(int *, int *, char *, struct termios *, struct winsize *)); -int _EXFUN(forkpty ,(int *, char *, struct termios *, struct winsize *)); - -#ifdef __cplusplus -} -#endif - -#endif /* __PTY_H__ */ diff --git a/winsup/cygwin/include/sched.h b/winsup/cygwin/include/sched.h deleted file mode 100644 index f97b8ebf4..000000000 --- a/winsup/cygwin/include/sched.h +++ /dev/null @@ -1,64 +0,0 @@ -/* sched.h: scheduler interface for Cygwin - - Copyright 2001 Red Hat, Inc. - - Written by Robert Collins - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -/* Written from the opengroup specifications */ - -#ifndef _SCHED_H -#define _SCHED_H -#include - -/* we return -1 and set errno on failure */ -#define SCHED_FIFO 1 -#define SCHED_RR 2 -#define SCHED_OTHER 3 - -struct sched_param -{ - int sched_priority; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -/* max priority for policy */ -int sched_get_priority_max (int); -/* min priority for policy */ -int sched_get_priority_min (int); -/* get sched params for process */ -int sched_getparam (pid_t, struct sched_param *); -/* get the scheduler for pid */ -int sched_getscheduler (pid_t); -/* get the time quantum for pid */ -int sched_rr_get_interval (pid_t, struct timespec *); -/* set the scheduling parameters */ -int sched_setparam (pid_t, const struct sched_param *); -/* set the scheduler */ -int sched_setscheduler (pid_t, int, const struct sched_param *); -/* yield the cpu */ -int sched_yield (void); - -#if defined(__INSIDE_CYGWIN__) -/* These are private helper functions used to calculate scheduler settings and - * validate parameters */ - -/* check parameters for validity */ -int valid_sched_parameters(const struct sched_param *); -/* set a single thread's priority */ -int sched_set_thread_priority(HANDLE thread, int priority); - -#endif /* INSIDE_CYGWIN */ - -#ifdef __cplusplus -} -#endif -#endif /* _SCHED_H */ diff --git a/winsup/cygwin/include/search.h b/winsup/cygwin/include/search.h deleted file mode 100644 index a1ccfe2aa..000000000 --- a/winsup/cygwin/include/search.h +++ /dev/null @@ -1,73 +0,0 @@ -/*- - * Written by J.T. Conklin - * Public domain. - * - * $NetBSD: search.h,v 1.12 1999/02/22 10:34:28 christos Exp $ - * $FreeBSD: src/include/search.h,v 1.10 2002/10/16 14:29:23 robert Exp $ - */ - -#ifndef _SEARCH_H_ -#define _SEARCH_H_ - -#include -#include - -typedef struct entry -{ - char *key; - void *data; -} ENTRY; - -typedef enum -{ - FIND, ENTER -} ACTION; - -typedef enum -{ - preorder, - postorder, - endorder, - leaf -} VISIT; - -#ifdef _SEARCH_PRIVATE -typedef struct node -{ - char *key; - struct node *llink, *rlink; -} node_t; - -struct que_elem -{ - struct que_elem *next; - struct que_elem *prev; -}; -#endif - -struct hsearch_data -{ - struct internal_head *htable; - size_t htablesize; -}; - -__BEGIN_DECLS -int hcreate (size_t); -void hdestroy (void); -ENTRY *hsearch (ENTRY, ACTION); -int hcreate_r (size_t, struct hsearch_data *); -void hdestroy_r (struct hsearch_data *); -void *tdelete (const void * __restrict, void ** __restrict, - int (*) (const void *, const void *)); -void tdestroy (void *, void (*)(void *)); -void *tfind (const void *, void **, - int (*) (const void *, const void *)); -void *tsearch (const void *, void **, int (*) (const void *, const void *)); -void twalk (const void *, void (*) (const void *, VISIT, int)); -void *lfind (const void *, const void *, size_t *, size_t, - int (*) (const void *, const void *)); -void *lsearch (const void *, void *, size_t *, size_t, - int (*) (const void *, const void *)); -__END_DECLS - -#endif /* !_SEARCH_H_ */ diff --git a/winsup/cygwin/include/semaphore.h b/winsup/cygwin/include/semaphore.h deleted file mode 100644 index 96f7c6f88..000000000 --- a/winsup/cygwin/include/semaphore.h +++ /dev/null @@ -1,45 +0,0 @@ -/* semaphore.h: POSIX semaphore interface - - Copyright 2001, 2003 Red Hat, Inc. - - Written by Robert Collins - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include - -#ifndef _SEMAPHORE_H -#define _SEMAPHORE_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#ifndef __INSIDE_CYGWIN__ - typedef struct __sem_t {char __dummy;} *sem_t; -#endif - -#define SEM_FAILED 0 -#define SEM_VALUE_MAX 1147483648 - -/* Semaphores */ - int sem_init (sem_t * sem, int pshared, unsigned int value); - int sem_destroy (sem_t * sem); - sem_t *sem_open (const char *name, int oflag, ...); - int sem_close (sem_t *sem); - int sem_wait (sem_t * sem); - int sem_trywait (sem_t * sem); - int sem_timedwait (sem_t * sem, const struct timespec *abstime); - int sem_post (sem_t * sem); - int sem_getvalue (sem_t * sem, int *sval); - -#ifdef __cplusplus -} -#endif - -#endif /* _SEMAPHORE_H */ diff --git a/winsup/cygwin/include/stdint.h b/winsup/cygwin/include/stdint.h deleted file mode 100644 index 5456239fb..000000000 --- a/winsup/cygwin/include/stdint.h +++ /dev/null @@ -1,182 +0,0 @@ -/* stdint.h - integer types - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _STDINT_H -#define _STDINT_H - -/* Exact-width integer types */ - -#ifndef __int8_t_defined -#define __int8_t_defined -typedef signed char int8_t; -typedef short int16_t; -typedef long int32_t; -typedef long long int64_t; -#endif - -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -#ifndef __uint32_t_defined -#define __uint32_t_defined -typedef unsigned long uint32_t; -#endif -typedef unsigned long long uint64_t; - -/* Minimum-width integer types */ - -typedef signed char int_least8_t; -typedef short int_least16_t; -typedef long int_least32_t; -typedef long long int_least64_t; - -typedef unsigned char uint_least8_t; -typedef unsigned short uint_least16_t; -typedef unsigned long uint_least32_t; -typedef unsigned long long uint_least64_t; - -/* Fastest minimum-width integer types */ - -typedef signed char int_fast8_t; -typedef long int_fast16_t; -typedef long int_fast32_t; -typedef long long int_fast64_t; - -typedef unsigned char uint_fast8_t; -typedef unsigned long uint_fast16_t; -typedef unsigned long uint_fast32_t; -typedef unsigned long long uint_fast64_t; - -/* Integer types capable of holding object pointers */ - -#ifndef __intptr_t_defined -#define __intptr_t_defined -typedef long intptr_t; -#endif -typedef unsigned long uintptr_t; - -/* Greatest-width integer types */ - -typedef long long intmax_t; -typedef unsigned long long uintmax_t; - -/* Limits of exact-width integer types */ - -#define INT8_MIN (-128) -#define INT16_MIN (-32768) -#define INT32_MIN (-2147483647 - 1) -#define INT64_MIN (-9223372036854775807LL - 1LL) - -#define INT8_MAX (127) -#define INT16_MAX (32767) -#define INT32_MAX (2147483647) -#define INT64_MAX (9223372036854775807LL) - -#define UINT8_MAX (255) -#define UINT16_MAX (65535) -#define UINT32_MAX (4294967295UL) -#define UINT64_MAX (18446744073709551615ULL) - -/* Limits of minimum-width integer types */ - -#define INT_LEAST8_MIN (-128) -#define INT_LEAST16_MIN (-32768) -#define INT_LEAST32_MIN (-2147483647 - 1) -#define INT_LEAST64_MIN (-9223372036854775807LL - 1LL) - -#define INT_LEAST8_MAX (127) -#define INT_LEAST16_MAX (32767) -#define INT_LEAST32_MAX (2147483647) -#define INT_LEAST64_MAX (9223372036854775807LL) - -#define UINT_LEAST8_MAX (255) -#define UINT_LEAST16_MAX (65535) -#define UINT_LEAST32_MAX (4294967295UL) -#define UINT_LEAST64_MAX (18446744073709551615ULL) - -/* Limits of fastest minimum-width integer types */ - -#define INT_FAST8_MIN (-128) -#define INT_FAST16_MIN (-2147483647 - 1) -#define INT_FAST32_MIN (-2147483647 - 1) -#define INT_FAST64_MIN (-9223372036854775807LL - 1LL) - -#define INT_FAST8_MAX (127) -#define INT_FAST16_MAX (2147483647) -#define INT_FAST32_MAX (2147483647) -#define INT_FAST64_MAX (9223372036854775807LL) - -#define UINT_FAST8_MAX (255) -#define UINT_FAST16_MAX (4294967295UL) -#define UINT_FAST32_MAX (4294967295UL) -#define UINT_FAST64_MAX (18446744073709551615ULL) - -/* Limits of integer types capable of holding object pointers */ - -#define INTPTR_MIN (-2147483647 - 1) -#define INTPTR_MAX (2147483647) -#define UINTPTR_MAX (4294967295UL) - -/* Limits of greatest-width integer types */ - -#define INTMAX_MIN (-9223372036854775807LL - 1LL) -#define INTMAX_MAX (9223372036854775807LL) -#define UINTMAX_MAX (18446744073709551615ULL) - -/* Limits of other integer types */ - -#ifndef PTRDIFF_MIN -#define PTRDIFF_MIN (-2147483647 - 1) -#define PTRDIFF_MAX (2147483647) -#endif - -#ifndef SIG_ATOMIC_MIN -#define SIG_ATOMIC_MIN (-2147483647 - 1) -#endif -#ifndef SIG_ATOMIC_MAX -#define SIG_ATOMIC_MAX (2147483647) -#endif - -#ifndef SIZE_MAX -#define SIZE_MAX (4294967295UL) -#endif - -#ifndef WCHAR_MIN -#ifdef __WCHAR_MIN__ -#define WCHAR_MIN __WCHAR_MIN__ -#define WCHAR_MAX __WCHAR_MAX__ -#else -#define WCHAR_MIN (0) -#define WCHAR_MAX (65535) -#endif -#endif - -#ifndef WINT_MIN -#define WINT_MIN (-2147483647 - 1) -#define WINT_MAX (2147483647) -#endif - -/* Macros for minimum-width integer constant expressions */ - -#define INT8_C(x) x -#define INT16_C(x) x -#define INT32_C(x) x ## L -#define INT64_C(x) x ## LL - -#define UINT8_C(x) x ## U -#define UINT16_C(x) x ## U -#define UINT32_C(x) x ## UL -#define UINT64_C(x) x ## ULL - -/* Macros for greatest-width integer constant expressions */ - -#define INTMAX_C(x) x ## LL -#define UINTMAX_C(x) x ## ULL - -#endif /* _STDINT_H */ diff --git a/winsup/cygwin/include/strings.h b/winsup/cygwin/include/strings.h deleted file mode 100644 index e9d2839f2..000000000 --- a/winsup/cygwin/include/strings.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _STRINGS_H -#define _STRINGS_H - -#include - -#endif /* _STRINGS_H */ diff --git a/winsup/cygwin/include/sys/acl.h b/winsup/cygwin/include/sys/acl.h deleted file mode 100644 index 89c38bc0f..000000000 --- a/winsup/cygwin/include/sys/acl.h +++ /dev/null @@ -1,17 +0,0 @@ -/* sys/acl.h header file for Cygwin. - - Copyright 1999, 2000, 2001 Red Hat, Inc. - Written by C. Vinschen. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_ACL_H -#define _SYS_ACL_H - -#include - -#endif /* _SYS_ACL_H */ diff --git a/winsup/cygwin/include/sys/cdefs.h b/winsup/cygwin/include/sys/cdefs.h deleted file mode 100644 index c401ce794..000000000 --- a/winsup/cygwin/include/sys/cdefs.h +++ /dev/null @@ -1,23 +0,0 @@ -/* sys/cdefs.h - - Copyright 1998, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_CDEFS_H -#define _SYS_CDEFS_H -#ifdef __cplusplus -#define __BEGIN_DECLS extern "C" { -#define __END_DECLS } -#else -#define __BEGIN_DECLS -#define __END_DECLS -#endif -#define __P(protos) protos /* full-blown ANSI C */ -#define __CONCAT(__x,__y) __x##__y -#endif - diff --git a/winsup/cygwin/include/sys/copying.dj b/winsup/cygwin/include/sys/copying.dj deleted file mode 100644 index a05f4bc81..000000000 --- a/winsup/cygwin/include/sys/copying.dj +++ /dev/null @@ -1,41 +0,0 @@ -This is the file "copying.dj". It does not apply to any sources -copyrighted by UCB Berkeley or the Free Software Foundation. - - Copyright Information for sources and executables that are marked - Copyright (C) DJ Delorie - 24 Kirsten Ave - Rochester NH 03867-2954 - -This document is Copyright (C) DJ Delorie and may be distributed -verbatim, but changing it is not allowed. - -Source code copyright DJ Delorie is distributed under the terms of the -GNU General Public Licence, with the following exceptions: - -* Any existing copyright or authorship information in any given source -file must remain intact. If you modify a source file, a notice to that -effect must be added to the authorship information in the source file. - -* binaries provided in djgpp may be distributed without sources ONLY if -the recipient is given sufficient information to obtain a copy of djgpp -themselves. This primarily applies to go32.exe, emu387, stub.exe, and -the graphics drivers. - -* modified versions of the binaries provided in djgpp must be -distributed under the terms of the GPL. - -* objects and libraries linked into an application may be distributed -without sources. - ------ - -Changes to source code copyright BSD or FSF are copyright DJ Delorie, but -fall under the terms of the original copyright. - -A copy of the file "COPYING" is included with this document. If you did not -receive a copy of "COPYING", you may obtain one from whence this document -was obtained, or by writing: - Free Software Foundation - 675 Mass Ave - Cambridge, MA 02139 - USA diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h deleted file mode 100644 index 1380194fb..000000000 --- a/winsup/cygwin/include/sys/cygwin.h +++ /dev/null @@ -1,273 +0,0 @@ -/* sys/cygwin.h - - Copyright 1997, 1998, 2000, 2001, 2002 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_CYGWIN_H -#define _SYS_CYGWIN_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define _CYGWIN_SIGNAL_STRING "cYgSiGw00f" - -extern pid_t cygwin32_winpid_to_pid (int); -extern void cygwin32_win32_to_posix_path_list (const char *, char *); -extern int cygwin32_win32_to_posix_path_list_buf_size (const char *); -extern void cygwin32_posix_to_win32_path_list (const char *, char *); -extern int cygwin32_posix_to_win32_path_list_buf_size (const char *); -extern int cygwin32_conv_to_win32_path (const char *, char *); -extern int cygwin32_conv_to_full_win32_path (const char *, char *); -extern void cygwin32_conv_to_posix_path (const char *, char *); -extern void cygwin32_conv_to_full_posix_path (const char *, char *); -extern int cygwin32_posix_path_list_p (const char *); -extern void cygwin32_split_path (const char *, char *, char *); - -extern pid_t cygwin_winpid_to_pid (int); -extern int cygwin_win32_to_posix_path_list (const char *, char *); -extern int cygwin_win32_to_posix_path_list_buf_size (const char *); -extern int cygwin_posix_to_win32_path_list (const char *, char *); -extern int cygwin_posix_to_win32_path_list_buf_size (const char *); -extern int cygwin_conv_to_win32_path (const char *, char *); -extern int cygwin_conv_to_full_win32_path (const char *, char *); -extern int cygwin_conv_to_posix_path (const char *, char *); -extern int cygwin_conv_to_full_posix_path (const char *, char *); -extern int cygwin_posix_path_list_p (const char *); -extern void cygwin_split_path (const char *, char *, char *); - -struct __cygwin_perfile -{ - const char *name; - unsigned flags; -}; - -/* External interface stuff */ - -/* Always add at the bottom. Do not add new values in the middle. */ -typedef enum - { - CW_LOCK_PINFO, - CW_UNLOCK_PINFO, - CW_GETTHREADNAME, - CW_GETPINFO, - CW_SETPINFO, - CW_SETTHREADNAME, - CW_GETVERSIONINFO, - CW_READ_V1_MOUNT_TABLES, - CW_USER_DATA, - CW_PERFILE, - CW_GET_CYGDRIVE_PREFIXES, - CW_GETPINFO_FULL, - CW_INIT_EXCEPTIONS, - CW_GET_CYGDRIVE_INFO, - CW_SET_CYGWIN_REGISTRY_NAME, - CW_GET_CYGWIN_REGISTRY_NAME, - CW_STRACE_TOGGLE, - CW_STRACE_ACTIVE, - CW_CYGWIN_PID_TO_WINPID, - CW_EXTRACT_DOMAIN_AND_USER, - CW_CMDLINE, - CW_CHECK_NTSEC, - CW_GET_ERRNO_FROM_WINERROR, - CW_GET_POSIX_SECURITY_ATTRIBUTE, - CW_GET_SHMLBA, - CW_GET_UID_FROM_SID, - CW_GET_GID_FROM_SID, - CW_GET_BINMODE, - CW_HOOK, - CW_ARGV, - CW_ENVP, - CW_DEBUG_SELF, - CW_SYNC_WINENV - } cygwin_getinfo_types; - -#define CW_NEXTPID 0x80000000 /* or with pid to get next one */ -unsigned long cygwin_internal (cygwin_getinfo_types, ...); - -/* Flags associated with process_state */ -enum -{ - PID_IN_USE = 0x00001, /* Entry in use. */ - PID_UNUSED = 0x00002, /* Available. */ - PID_STOPPED = 0x00004, /* Waiting for SIGCONT. */ - PID_TTYIN = 0x00008, /* Waiting for terminal input. */ - PID_TTYOU = 0x00010, /* Waiting for terminal output. */ - PID_ORPHANED = 0x00020, /* Member of an orphaned process group. */ - PID_ACTIVE = 0x00040, /* Pid accepts signals. */ - PID_CYGPARENT = 0x00080, /* Set if parent was a cygwin app. */ - PID_MAP_RW = 0x00100, /* Flag to open map rw. */ - PID_MYSELF = 0x00200, /* Flag that pid is me. */ - PID_NOCLDSTOP = 0x00400, /* Set if no SIGCHLD signal on stop. */ - PID_INITIALIZING = 0x00800, /* Set until ready to receive signals. */ - PID_USETTY = 0x01000, /* Setting this enables or disables cygwin's - tty support. This is inherited by - all execed or forked processes. */ - PID_ALLPIDS = 0x02000, /* used by pinfo scanner */ - PID_EXECED = 0x04000, /* redirect to original pid info block */ - PID_NOREDIR = 0x08000, /* don't redirect if execed */ - PID_EXITED = 0x80000000 /* Free entry. */ -}; - -#ifdef WINVER -#ifdef _PATH_PASSWD -extern HANDLE cygwin_logon_user (const struct passwd *, const char *); -#endif - -/* This lives in the app and is initialized before jumping into the DLL. - It should only contain stuff which the user's process needs to see, or - which is needed before the user pointer is initialized, or is needed to - carry inheritance information from parent to child. Note that it cannot - be used to carry inheritance information across exec! - - Remember, this structure is linked into the application's executable. - Changes to this can invalidate existing executables, so we go to extra - lengths to avoid having to do it. - - When adding/deleting members, remember to adjust {public,internal}_reserved. - The size of the class shouldn't change [unless you really are prepared to - invalidate all existing executables]. The program does a check (using - SIZEOF_PER_PROCESS) to make sure you remember to make the adjustment. -*/ - -#ifdef __cplusplus -class ResourceLocks; -class MTinterface; -#endif - -struct per_process -{ - char *initial_sp; - - /* The offset of these 3 values can never change. */ - /* magic_biscuit is the size of this class and should never change. */ - unsigned long magic_biscuit; - unsigned long dll_major; - unsigned long dll_minor; - - struct _reent **impure_ptr_ptr; - char ***envptr; - - /* Used to point to the memory machine we should use. Usually these - point back into the dll, but they can be overridden by the user. */ - void *(*malloc)(size_t); - void (*free)(void *); - void *(*realloc)(void *, size_t); - - int *fmode_ptr; - - int (*main)(int, char **, char **); - void (**ctors)(void); - void (**dtors)(void); - - /* For fork */ - void *data_start; - void *data_end; - void *bss_start; - void *bss_end; - - void *(*calloc)(size_t, size_t); - /* For future expansion of values set by the app. */ - void (*premain[4]) (int, char **, struct per_process *); - - /* The rest are *internal* to cygwin.dll. - Those that are here because we want the child to inherit the value from - the parent (which happens when bss is copied) are marked as such. */ - - /* non-zero of ctors have been run. Inherited from parent. */ - int run_ctors_p; - - DWORD unused[7]; - - /* Non-zero means the task was forked. The value is the pid. - Inherited from parent. */ - int forkee; - - HMODULE hmodule; - - DWORD api_major; /* API version that this program was */ - DWORD api_minor; /* linked with */ - /* For future expansion, so apps won't have to be relinked if we - add an item. */ - DWORD unused2[5]; - -#if defined (__INSIDE_CYGWIN__) && defined (__cplusplus) - ResourceLocks *resourcelocks; - MTinterface *threadinterface; -#else - void *resourcelocks; - void *threadinterface; -#endif - struct _reent *impure_ptr; -}; -#define per_process_overwrite ((unsigned) &(((struct per_process *) NULL)->resourcelocks)) - -extern void cygwin_premain0 (int argc, char **argv, struct per_process *); -extern void cygwin_premain1 (int argc, char **argv, struct per_process *); -extern void cygwin_premain2 (int argc, char **argv, struct per_process *); -extern void cygwin_premain3 (int argc, char **argv, struct per_process *); - -extern void cygwin_set_impersonation_token (const HANDLE); - -/* included if is included */ -extern int cygwin32_attach_handle_to_fd (char *, int, HANDLE, mode_t, DWORD); -extern int cygwin_attach_handle_to_fd (char *, int, HANDLE, mode_t, DWORD); - -#ifdef __CYGWIN__ -#include - -#define TTY_CONSOLE 0x40000000 - -#define EXTERNAL_PINFO_VERSION_16_BIT 0 -#define EXTERNAL_PINFO_VERSION_32_BIT 1 -#define EXTERNAL_PINFO_VERSION EXTERNAL_PINFO_VERSION_32_BIT - -#ifndef _SYS_TYPES_H -typedef unsigned short __uid16_t; -typedef unsigned short __gid16_t; -typedef unsigned long __uid32_t; -typedef unsigned long __gid32_t; -#endif - -struct external_pinfo - { - pid_t pid; - pid_t ppid; - DWORD exitcode; - DWORD dwProcessId, dwSpawnedProcessId; - __uid16_t uid; - __gid16_t gid; - pid_t pgid; - pid_t sid; - int ctty; - mode_t umask; - - long start_time; - struct rusage rusage_self; - struct rusage rusage_children; - - char progname[MAX_PATH]; - - DWORD strace_mask; - DWORD version; - - DWORD process_state; - - /* Only available if version >= EXTERNAL_PINFO_VERSION_32_BIT */ - __uid32_t uid32; - __gid32_t gid32; -}; -#endif /*__CYGWIN__*/ -#endif /*WINVER*/ - -#ifdef __cplusplus -}; -#endif -#endif /* _SYS_CYGWIN_H */ diff --git a/winsup/cygwin/include/sys/dirent.h b/winsup/cygwin/include/sys/dirent.h deleted file mode 100644 index d4e5e1333..000000000 --- a/winsup/cygwin/include/sys/dirent.h +++ /dev/null @@ -1,107 +0,0 @@ -/* Posix dirent.h for WIN32. - - Copyright 2001, 2002, 2003, 2005, 2006 Red Hat, Inc. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -/* Including this file should not require any Windows headers. */ - -#ifndef _SYS_DIRENT_H -#define _SYS_DIRENT_H - -#include - -#define __DIRENT_VERSION 2 - -#pragma pack(push,4) -#if defined(__INSIDE_CYGWIN__) || defined (__CYGWIN_USE_BIG_TYPES__) -struct dirent -{ - long __d_version; /* Used internally */ - __ino64_t d_ino; - __uint32_t __d_unused1; - __uint32_t __d_internal1; - char d_name[256]; /* FIXME: use NAME_MAX? */ -}; -#else -struct dirent -{ - long d_version; - long d_reserved[2]; - long d_fd; - ino_t d_ino; - char d_name[256]; -}; -#endif -#pragma pack(pop) - -#define __DIRENT_COOKIE 0xdede4242 - -#pragma pack(push,4) -typedef struct __DIR -{ - /* This is first to set alignment in non _COMPILING_NEWLIB case. */ - unsigned long __d_cookie; - struct dirent *__d_dirent; - char *__d_dirname; /* directory name with trailing '*' */ - _off_t __d_position; /* used by telldir/seekdir */ - int __d_fd; - unsigned __d_internal; - void *__handle; - void *__fh; - unsigned __flags; -} DIR; -#pragma pack(pop) - -DIR *opendir (const char *); -struct dirent *readdir (DIR *); -int readdir_r (DIR *, struct dirent *, struct dirent **); -void rewinddir (DIR *); -int closedir (DIR *); - -int dirfd (DIR *); - -#ifndef _POSIX_SOURCE -#ifndef __INSIDE_CYGWIN__ -off_t telldir (DIR *); -void seekdir (DIR *, off_t loc); -#endif - -int scandir (const char *__dir, - struct dirent ***__namelist, - int (*select) (const struct dirent *), - int (*compar) (const struct dirent **, const struct dirent **)); - -int alphasort (const struct dirent **__a, const struct dirent **__b); -#if 0 /* these make no sense in the absence of d_type */ -/* File types for `d_type'. */ -enum -{ - DT_UNKNOWN = 0, -# define DT_UNKNOWN DT_UNKNOWN - DT_FIFO = 1, -# define DT_FIFO DT_FIFO - DT_CHR = 2, -# define DT_CHR DT_CHR - DT_DIR = 4, -# define DT_DIR DT_DIR - DT_BLK = 6, -# define DT_BLK DT_BLK - DT_REG = 8, -# define DT_REG DT_REG - DT_LNK = 10, -# define DT_LNK DT_LNK - DT_SOCK = 12, -# define DT_SOCK DT_SOCK - DT_WHT = 14 -# define DT_WHT DT_WHT -}; - -/* Convert between stat structure types and directory types. */ -# define IFTODT(mode) (((mode) & 0170000) >> 12) -# define DTTOIF(dirtype) ((dirtype) << 12) -#endif /* #if 0 */ -#endif /* _POSIX_SOURCE */ -#endif /*_SYS_DIRENT_H*/ diff --git a/winsup/cygwin/include/sys/elf32.h b/winsup/cygwin/include/sys/elf32.h deleted file mode 100644 index 5dfe9c8b0..000000000 --- a/winsup/cygwin/include/sys/elf32.h +++ /dev/null @@ -1,156 +0,0 @@ -/*- - * Copyright (c) 1996-1998 John D. Polstra. - * 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. - * - * $FreeBSD: src/sys/sys/elf32.h,v 1.8 2002/05/30 08:32:18 dfr Exp $ - */ - -#ifndef _SYS_ELF32_H_ -#define _SYS_ELF32_H_ 1 - -#include - -/* - * ELF definitions common to all 32-bit architectures. - */ - -typedef u_int32_t Elf32_Addr; -typedef u_int16_t Elf32_Half; -typedef u_int32_t Elf32_Off; -typedef int32_t Elf32_Sword; -typedef u_int32_t Elf32_Word; -typedef u_int32_t Elf32_Size; -typedef Elf32_Off Elf32_Hashelt; - -/* - * ELF header. - */ - -typedef struct { - unsigned char e_ident[EI_NIDENT]; /* File identification. */ - Elf32_Half e_type; /* File type. */ - Elf32_Half e_machine; /* Machine architecture. */ - Elf32_Word e_version; /* ELF format version. */ - Elf32_Addr e_entry; /* Entry point. */ - Elf32_Off e_phoff; /* Program header file offset. */ - Elf32_Off e_shoff; /* Section header file offset. */ - Elf32_Word e_flags; /* Architecture-specific flags. */ - Elf32_Half e_ehsize; /* Size of ELF header in bytes. */ - Elf32_Half e_phentsize; /* Size of program header entry. */ - Elf32_Half e_phnum; /* Number of program header entries. */ - Elf32_Half e_shentsize; /* Size of section header entry. */ - Elf32_Half e_shnum; /* Number of section header entries. */ - Elf32_Half e_shstrndx; /* Section name strings section. */ -} Elf32_Ehdr; - -/* - * Section header. - */ - -typedef struct { - Elf32_Word sh_name; /* Section name (index into the - section header string table). */ - Elf32_Word sh_type; /* Section type. */ - Elf32_Word sh_flags; /* Section flags. */ - Elf32_Addr sh_addr; /* Address in memory image. */ - Elf32_Off sh_offset; /* Offset in file. */ - Elf32_Size sh_size; /* Size in bytes. */ - Elf32_Word sh_link; /* Index of a related section. */ - Elf32_Word sh_info; /* Depends on section type. */ - Elf32_Size sh_addralign; /* Alignment in bytes. */ - Elf32_Size sh_entsize; /* Size of each entry in section. */ -} Elf32_Shdr; - -/* - * Program header. - */ - -typedef struct { - Elf32_Word p_type; /* Entry type. */ - Elf32_Off p_offset; /* File offset of contents. */ - Elf32_Addr p_vaddr; /* Virtual address in memory image. */ - Elf32_Addr p_paddr; /* Physical address (not used). */ - Elf32_Size p_filesz; /* Size of contents in file. */ - Elf32_Size p_memsz; /* Size of contents in memory. */ - Elf32_Word p_flags; /* Access permission flags. */ - Elf32_Size p_align; /* Alignment in memory and file. */ -} Elf32_Phdr; - -/* - * Dynamic structure. The ".dynamic" section contains an array of them. - */ - -typedef struct { - Elf32_Sword d_tag; /* Entry type. */ - union { - Elf32_Size d_val; /* Integer value. */ - Elf32_Addr d_ptr; /* Address value. */ - } d_un; -} Elf32_Dyn; - -/* - * Relocation entries. - */ - -/* Relocations that don't need an addend field. */ -typedef struct { - Elf32_Addr r_offset; /* Location to be relocated. */ - Elf32_Word r_info; /* Relocation type and symbol index. */ -} Elf32_Rel; - -/* Relocations that need an addend field. */ -typedef struct { - Elf32_Addr r_offset; /* Location to be relocated. */ - Elf32_Word r_info; /* Relocation type and symbol index. */ - Elf32_Sword r_addend; /* Addend. */ -} Elf32_Rela; - -/* Macros for accessing the fields of r_info. */ -#define ELF32_R_SYM(info) ((info) >> 8) -#define ELF32_R_TYPE(info) ((unsigned char)(info)) - -/* Macro for constructing r_info from field values. */ -#define ELF32_R_INFO(sym, type) (((sym) << 8) + (unsigned char)(type)) - -/* - * Symbol table entries. - */ - -typedef struct { - Elf32_Word st_name; /* String table index of name. */ - Elf32_Addr st_value; /* Symbol value. */ - Elf32_Size st_size; /* Size of associated object. */ - unsigned char st_info; /* Type and binding information. */ - unsigned char st_other; /* Reserved (not used). */ - Elf32_Half st_shndx; /* Section index of symbol. */ -} Elf32_Sym; - -/* Macros for accessing the fields of st_info. */ -#define ELF32_ST_BIND(info) ((info) >> 4) -#define ELF32_ST_TYPE(info) ((info) & 0xf) - -/* Macro for constructing st_info from field values. */ -#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) - -#endif /* !_SYS_ELF32_H_ */ diff --git a/winsup/cygwin/include/sys/elf64.h b/winsup/cygwin/include/sys/elf64.h deleted file mode 100644 index 48556be5f..000000000 --- a/winsup/cygwin/include/sys/elf64.h +++ /dev/null @@ -1,172 +0,0 @@ -/*- - * Copyright (c) 1996-1998 John D. Polstra. - * 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. - * - * $FreeBSD: src/sys/sys/elf64.h,v 1.10 2002/05/30 08:32:18 dfr Exp $ - */ - -#ifndef _SYS_ELF64_H_ -#define _SYS_ELF64_H_ 1 - -#include - -/* - * ELF definitions common to all 64-bit architectures. - */ - -typedef uint64_t Elf64_Addr; -typedef uint16_t Elf64_Half; -typedef uint32_t Elf64_Word; -typedef int32_t Elf64_Sword; -typedef uint64_t Elf64_Xword; -typedef int64_t Elf64_Sxword; -typedef uint64_t Elf64_Off; -typedef uint16_t Elf64_Section; -typedef Elf64_Half Elf64_Versym; -typedef uint16_t Elf64_Quarter; - -/* - * Types of dynamic symbol hash table bucket and chain elements. - * - * This is inconsistent among 64 bit architectures, so a machine dependent - * typedef is required. - */ - -#ifdef __alpha__ -typedef Elf64_Off Elf64_Hashelt; -#else -typedef Elf64_Half Elf64_Hashelt; -#endif - -/* - * ELF header. - */ - -typedef struct { - unsigned char e_ident[EI_NIDENT]; /* File identification. */ - Elf64_Half e_type; /* File type. */ - Elf64_Half e_machine; /* Machine architecture. */ - Elf64_Word e_version; /* ELF format version. */ - Elf64_Addr e_entry; /* Entry point. */ - Elf64_Off e_phoff; /* Program header file offset. */ - Elf64_Off e_shoff; /* Section header file offset. */ - Elf64_Word e_flags; /* Architecture-specific flags. */ - Elf64_Half e_ehsize; /* Size of ELF header in bytes. */ - Elf64_Half e_phentsize; /* Size of program header entry. */ - Elf64_Half e_phnum; /* Number of program header entries. */ - Elf64_Half e_shentsize; /* Size of section header entry. */ - Elf64_Half e_shnum; /* Number of section header entries. */ - Elf64_Half e_shstrndx; /* Section name strings section. */ -} Elf64_Ehdr; - -/* - * Section header. - */ - -typedef struct { - Elf64_Word sh_name; /* Section name (index into the - section header string table). */ - Elf64_Word sh_type; /* Section type. */ - Elf64_Xword sh_flags; /* Section flags. */ - Elf64_Addr sh_addr; /* Address in memory image. */ - Elf64_Off sh_offset; /* Offset in file. */ - Elf64_Xword sh_size; /* Size in bytes. */ - Elf64_Word sh_link; /* Index of a related section. */ - Elf64_Word sh_info; /* Depends on section type. */ - Elf64_Xword sh_addralign; /* Alignment in bytes. */ - Elf64_Xword sh_entsize; /* Size of each entry in section. */ -} Elf64_Shdr; - -/* - * Program header. - */ - -typedef struct { - Elf64_Word p_type; /* Entry type. */ - Elf64_Word p_flags; /* Access permission flags. */ - Elf64_Off p_offset; /* File offset of contents. */ - Elf64_Addr p_vaddr; /* Virtual address in memory image. */ - Elf64_Addr p_paddr; /* Physical address (not used). */ - Elf64_Xword p_filesz; /* Size of contents in file. */ - Elf64_Xword p_memsz; /* Size of contents in memory. */ - Elf64_Xword p_align; /* Alignment in memory and file. */ -} Elf64_Phdr; - -/* - * Dynamic structure. The ".dynamic" section contains an array of them. - */ - -typedef struct { - Elf64_Sxword d_tag; /* Entry type. */ - union { - Elf64_Xword d_val; /* Integer value. */ - Elf64_Addr d_ptr; /* Address value. */ - } d_un; -} Elf64_Dyn; - -/* - * Relocation entries. - */ - -/* Relocations that don't need an addend field. */ -typedef struct { - Elf64_Addr r_offset; /* Location to be relocated. */ - Elf64_Xword r_info; /* Relocation type and symbol index. */ -} Elf64_Rel; - -/* Relocations that need an addend field. */ -typedef struct { - Elf64_Addr r_offset; /* Location to be relocated. */ - Elf64_Xword r_info; /* Relocation type and symbol index. */ - Elf64_Sxword r_addend; /* Addend. */ -} Elf64_Rela; - -/* Macros for accessing the fields of r_info. */ -#define ELF64_R_SYM(info) ((info) >> 32) -#define ELF64_R_TYPE(info) ((unsigned char)(info)) - -/* Macro for constructing r_info from field values. */ -#define ELF64_R_INFO(sym, type) (((sym) << 32) + (unsigned char)(type)) - -/* - * Symbol table entries. - */ - -typedef struct { - Elf64_Word st_name; /* String table index of name. */ - unsigned char st_info; /* Type and binding information. */ - unsigned char st_other; /* Reserved (not used). */ - Elf64_Section st_shndx; /* Section index of symbol. */ - Elf64_Addr st_value; /* Symbol value. */ - Elf64_Xword st_size; /* Size of associated object. */ -} Elf64_Sym; - -/* Macros for accessing the fields of st_info. */ -#define ELF64_ST_BIND(info) ((info) >> 4) -#define ELF64_ST_TYPE(info) ((info) & 0xf) - -/* Macro for constructing st_info from field values. */ -#define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) - -#endif /* !_SYS_ELF64_H_ */ diff --git a/winsup/cygwin/include/sys/elf_common.h b/winsup/cygwin/include/sys/elf_common.h deleted file mode 100644 index b864f0464..000000000 --- a/winsup/cygwin/include/sys/elf_common.h +++ /dev/null @@ -1,299 +0,0 @@ -/*- - * Copyright (c) 1998 John D. Polstra. - * 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. - * - * $FreeBSD: src/sys/sys/elf_common.h,v 1.15 2004/05/05 02:38:54 marcel Exp $ - */ - -#ifndef _SYS_ELF_COMMON_H_ -#define _SYS_ELF_COMMON_H_ 1 - -/* - * ELF definitions that are independent of architecture or word size. - */ - -/* - * Note header. The ".note" section contains an array of notes. Each - * begins with this header, aligned to a word boundary. Immediately - * following the note header is n_namesz bytes of name, padded to the - * next word boundary. Then comes n_descsz bytes of descriptor, again - * padded to a word boundary. The values of n_namesz and n_descsz do - * not include the padding. - */ - -typedef struct { - u_int32_t n_namesz; /* Length of name. */ - u_int32_t n_descsz; /* Length of descriptor. */ - u_int32_t n_type; /* Type of this note. */ -} Elf_Note; - -/* Indexes into the e_ident array. Keep synced with - http://www.sco.com/developer/gabi/ch4.eheader.html */ -#define EI_MAG0 0 /* Magic number, byte 0. */ -#define EI_MAG1 1 /* Magic number, byte 1. */ -#define EI_MAG2 2 /* Magic number, byte 2. */ -#define EI_MAG3 3 /* Magic number, byte 3. */ -#define EI_CLASS 4 /* Class of machine. */ -#define EI_DATA 5 /* Data format. */ -#define EI_VERSION 6 /* ELF format version. */ -#define EI_OSABI 7 /* Operating system / ABI identification */ -#define EI_ABIVERSION 8 /* ABI version */ -#define OLD_EI_BRAND 8 /* Start of architecture identification. */ -#define EI_PAD 9 /* Start of padding (per SVR4 ABI). */ -#define EI_NIDENT 16 /* Size of e_ident array. */ - -/* Values for the magic number bytes. */ -#define ELFMAG0 0x7f -#define ELFMAG1 'E' -#define ELFMAG2 'L' -#define ELFMAG3 'F' -#define ELFMAG "\177ELF" /* magic string */ -#define SELFMAG 4 /* magic string size */ - -/* Values for e_ident[EI_VERSION] and e_version. */ -#define EV_NONE 0 -#define EV_CURRENT 1 - -/* Values for e_ident[EI_CLASS]. */ -#define ELFCLASSNONE 0 /* Unknown class. */ -#define ELFCLASS32 1 /* 32-bit architecture. */ -#define ELFCLASS64 2 /* 64-bit architecture. */ - -/* Values for e_ident[EI_DATA]. */ -#define ELFDATANONE 0 /* Unknown data format. */ -#define ELFDATA2LSB 1 /* 2's complement little-endian. */ -#define ELFDATA2MSB 2 /* 2's complement big-endian. */ - -/* Values for e_ident[EI_OSABI]. */ -#define ELFOSABI_SYSV 0 /* UNIX System V ABI */ -#define ELFOSABI_NONE ELFOSABI_SYSV /* symbol used in old spec */ -#define ELFOSABI_HPUX 1 /* HP-UX operating system */ -#define ELFOSABI_NETBSD 2 /* NetBSD */ -#define ELFOSABI_LINUX 3 /* GNU/Linux */ -#define ELFOSABI_HURD 4 /* GNU/Hurd */ -#define ELFOSABI_86OPEN 5 /* 86Open common IA32 ABI */ -#define ELFOSABI_SOLARIS 6 /* Solaris */ -#define ELFOSABI_MONTEREY 7 /* Monterey */ -#define ELFOSABI_IRIX 8 /* IRIX */ -#define ELFOSABI_FREEBSD 9 /* FreeBSD */ -#define ELFOSABI_TRU64 10 /* TRU64 UNIX */ -#define ELFOSABI_MODESTO 11 /* Novell Modesto */ -#define ELFOSABI_OPENBSD 12 /* OpenBSD */ -#define ELFOSABI_ARM 97 /* ARM */ -#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ - -/* e_ident */ -#define IS_ELF(ehdr) ((ehdr).e_ident[EI_MAG0] == ELFMAG0 && \ - (ehdr).e_ident[EI_MAG1] == ELFMAG1 && \ - (ehdr).e_ident[EI_MAG2] == ELFMAG2 && \ - (ehdr).e_ident[EI_MAG3] == ELFMAG3) - -/* Values for e_type. */ -#define ET_NONE 0 /* Unknown type. */ -#define ET_REL 1 /* Relocatable. */ -#define ET_EXEC 2 /* Executable. */ -#define ET_DYN 3 /* Shared object. */ -#define ET_CORE 4 /* Core file. */ - -/* Values for e_machine. */ -#define EM_NONE 0 /* Unknown machine. */ -#define EM_M32 1 /* AT&T WE32100. */ -#define EM_SPARC 2 /* Sun SPARC. */ -#define EM_386 3 /* Intel i386. */ -#define EM_68K 4 /* Motorola 68000. */ -#define EM_88K 5 /* Motorola 88000. */ -#define EM_486 6 /* Intel i486. */ -#define EM_860 7 /* Intel i860. */ -#define EM_MIPS 8 /* MIPS R3000 Big-Endian only */ - -/* Extensions. This list is not complete. */ -#define EM_S370 9 /* IBM System/370 */ -#define EM_MIPS_RS4_BE 10 /* MIPS R4000 Big-Endian */ /* Depreciated */ -#define EM_PARISC 15 /* HPPA */ -#define EM_SPARC32PLUS 18 /* SPARC v8plus */ -#define EM_PPC 20 /* PowerPC 32-bit */ -#define EM_PPC64 21 /* PowerPC 64-bit */ -#define EM_ARM 40 /* ARM */ -#define EM_SPARCV9 43 /* SPARC v9 64-bit */ -#define EM_IA_64 50 /* Intel IA-64 Processor */ -#define EM_X86_64 62 /* Advanced Micro Devices x86-64 */ -#define EM_ALPHA 0x9026 /* Alpha (written in the absence of an ABI */ - -/* Special section indexes. */ -#define SHN_UNDEF 0 /* Undefined, missing, irrelevant. */ -#define SHN_LORESERVE 0xff00 /* First of reserved range. */ -#define SHN_LOPROC 0xff00 /* First processor-specific. */ -#define SHN_HIPROC 0xff1f /* Last processor-specific. */ -#define SHN_ABS 0xfff1 /* Absolute values. */ -#define SHN_COMMON 0xfff2 /* Common data. */ -#define SHN_HIRESERVE 0xffff /* Last of reserved range. */ - -/* sh_type */ -#define SHT_NULL 0 /* inactive */ -#define SHT_PROGBITS 1 /* program defined information */ -#define SHT_SYMTAB 2 /* symbol table section */ -#define SHT_STRTAB 3 /* string table section */ -#define SHT_RELA 4 /* relocation section with addends */ -#define SHT_HASH 5 /* symbol hash table section */ -#define SHT_DYNAMIC 6 /* dynamic section */ -#define SHT_NOTE 7 /* note section */ -#define SHT_NOBITS 8 /* no space section */ -#define SHT_REL 9 /* relocation section - no addends */ -#define SHT_SHLIB 10 /* reserved - purpose unknown */ -#define SHT_DYNSYM 11 /* dynamic symbol table section */ -#define SHT_NUM 12 /* number of section types */ -#define SHT_LOOS 0x60000000 /* First of OS specific semantics */ -#define SHT_HIOS 0x6fffffff /* Last of OS specific semantics */ -#define SHT_LOPROC 0x70000000 /* reserved range for processor */ -#define SHT_HIPROC 0x7fffffff /* specific section header types */ -#define SHT_LOUSER 0x80000000 /* reserved range for application */ -#define SHT_HIUSER 0xffffffff /* specific indexes */ - -/* Flags for sh_flags. */ -#define SHF_WRITE 0x1 /* Section contains writable data. */ -#define SHF_ALLOC 0x2 /* Section occupies memory. */ -#define SHF_EXECINSTR 0x4 /* Section contains instructions. */ -#define SHF_TLS 0x400 /* Section contains TLS data. */ -#define SHF_MASKPROC 0xf0000000 /* Reserved for processor-specific. */ - -/* Values for p_type. */ -#define PT_NULL 0 /* Unused entry. */ -#define PT_LOAD 1 /* Loadable segment. */ -#define PT_DYNAMIC 2 /* Dynamic linking information segment. */ -#define PT_INTERP 3 /* Pathname of interpreter. */ -#define PT_NOTE 4 /* Auxiliary information. */ -#define PT_SHLIB 5 /* Reserved (not used). */ -#define PT_PHDR 6 /* Location of program header itself. */ -#define PT_TLS 7 /* Thread local storage segment */ - -#define PT_COUNT 8 /* Number of defined p_type values. */ - -#define PT_LOOS 0x60000000 /* OS-specific */ -#define PT_HIOS 0x6fffffff /* OS-specific */ -#define PT_LOPROC 0x70000000 /* First processor-specific type. */ -#define PT_HIPROC 0x7fffffff /* Last processor-specific type. */ - -/* Values for p_flags. */ -#define PF_X 0x1 /* Executable. */ -#define PF_W 0x2 /* Writable. */ -#define PF_R 0x4 /* Readable. */ - -/* Values for d_tag. */ -#define DT_NULL 0 /* Terminating entry. */ -#define DT_NEEDED 1 /* String table offset of a needed shared - library. */ -#define DT_PLTRELSZ 2 /* Total size in bytes of PLT relocations. */ -#define DT_PLTGOT 3 /* Processor-dependent address. */ -#define DT_HASH 4 /* Address of symbol hash table. */ -#define DT_STRTAB 5 /* Address of string table. */ -#define DT_SYMTAB 6 /* Address of symbol table. */ -#define DT_RELA 7 /* Address of ElfNN_Rela relocations. */ -#define DT_RELASZ 8 /* Total size of ElfNN_Rela relocations. */ -#define DT_RELAENT 9 /* Size of each ElfNN_Rela relocation entry. */ -#define DT_STRSZ 10 /* Size of string table. */ -#define DT_SYMENT 11 /* Size of each symbol table entry. */ -#define DT_INIT 12 /* Address of initialization function. */ -#define DT_FINI 13 /* Address of finalization function. */ -#define DT_SONAME 14 /* String table offset of shared object - name. */ -#define DT_RPATH 15 /* String table offset of library path. [sup] */ -#define DT_SYMBOLIC 16 /* Indicates "symbolic" linking. [sup] */ -#define DT_REL 17 /* Address of ElfNN_Rel relocations. */ -#define DT_RELSZ 18 /* Total size of ElfNN_Rel relocations. */ -#define DT_RELENT 19 /* Size of each ElfNN_Rel relocation. */ -#define DT_PLTREL 20 /* Type of relocation used for PLT. */ -#define DT_DEBUG 21 /* Reserved (not used). */ -#define DT_TEXTREL 22 /* Indicates there may be relocations in - non-writable segments. [sup] */ -#define DT_JMPREL 23 /* Address of PLT relocations. */ -#define DT_BIND_NOW 24 /* [sup] */ -#define DT_INIT_ARRAY 25 /* Address of the array of pointers to - initialization functions */ -#define DT_FINI_ARRAY 26 /* Address of the array of pointers to - termination functions */ -#define DT_INIT_ARRAYSZ 27 /* Size in bytes of the array of - initialization functions. */ -#define DT_FINI_ARRAYSZ 28 /* Size in bytes of the array of - terminationfunctions. */ -#define DT_RUNPATH 29 /* String table offset of a null-terminated - library search path string. */ -#define DT_FLAGS 30 /* Object specific flag values. */ -#define DT_ENCODING 32 /* Values greater than or equal to DT_ENCODING - and less than DT_LOOS follow the rules for - the interpretation of the d_un union - as follows: even == 'd_ptr', even == 'd_val' - or none */ -#define DT_PREINIT_ARRAY 32 /* Address of the array of pointers to - pre-initialization functions. */ -#define DT_PREINIT_ARRAYSZ 33 /* Size in bytes of the array of - pre-initialization functions. */ - -#define DT_COUNT 33 /* Number of defined d_tag values. */ - -#define DT_LOOS 0x6000000d /* First OS-specific */ -#define DT_HIOS 0x6fff0000 /* Last OS-specific */ -#define DT_LOPROC 0x70000000 /* First processor-specific type. */ -#define DT_HIPROC 0x7fffffff /* Last processor-specific type. */ - -/* Values for DT_FLAGS */ -#define DF_ORIGIN 0x0001 /* Indicates that the object being loaded may - make reference to the $ORIGIN substitution - string */ -#define DF_SYMBOLIC 0x0002 /* Indicates "symbolic" linking. */ -#define DF_TEXTREL 0x0004 /* Indicates there may be relocations in - non-writable segments. */ -#define DF_BIND_NOW 0x0008 /* Indicates that the dynamic linker should - process all relocations for the object - containing this entry before transferring - control to the program. */ -#define DF_STATIC_TLS 0x0010 /* Indicates that the shared object or - executable contains code using a static - thread-local storage scheme. */ - -/* Values for n_type. Used in core files. */ -#define NT_PRSTATUS 1 /* Process status. */ -#define NT_FPREGSET 2 /* Floating point registers. */ -#define NT_PRPSINFO 3 /* Process state info. */ - -/* Symbol Binding - ELFNN_ST_BIND - st_info */ -#define STB_LOCAL 0 /* Local symbol */ -#define STB_GLOBAL 1 /* Global symbol */ -#define STB_WEAK 2 /* like global - lower precedence */ -#define STB_LOPROC 13 /* reserved range for processor */ -#define STB_HIPROC 15 /* specific symbol bindings */ - -/* Symbol type - ELFNN_ST_TYPE - st_info */ -#define STT_NOTYPE 0 /* Unspecified type. */ -#define STT_OBJECT 1 /* Data object. */ -#define STT_FUNC 2 /* Function. */ -#define STT_SECTION 3 /* Section. */ -#define STT_FILE 4 /* Source file. */ -#define STT_TLS 6 /* TLS object. */ -#define STT_LOPROC 13 /* reserved range for processor */ -#define STT_HIPROC 15 /* specific symbol types */ - -/* Special symbol table indexes. */ -#define STN_UNDEF 0 /* Undefined symbol index. */ - -#endif /* !_SYS_ELF_COMMON_H_ */ diff --git a/winsup/cygwin/include/sys/elf_generic.h b/winsup/cygwin/include/sys/elf_generic.h deleted file mode 100644 index dbe9f1e83..000000000 --- a/winsup/cygwin/include/sys/elf_generic.h +++ /dev/null @@ -1,91 +0,0 @@ -/*- - * Copyright (c) 1998 John D. Polstra. - * 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. - * - * $FreeBSD: src/sys/sys/elf_generic.h,v 1.6 2002/07/20 02:56:11 peter Exp $ - */ - -#ifndef _SYS_ELF_GENERIC_H_ -#define _SYS_ELF_GENERIC_H_ 1 - -#include - -/* - * Definitions of generic ELF names which relieve applications from - * needing to know the word size. - */ - -#ifndef __ELF_WORD_SIZE -# define __ELF_WORD_SIZE 32 -#endif - -#if __ELF_WORD_SIZE != 32 && __ELF_WORD_SIZE != 64 -#error "__ELF_WORD_SIZE must be defined as 32 or 64" -#endif - -#define ELF_CLASS __CONCAT(ELFCLASS,__ELF_WORD_SIZE) - -#if BYTE_ORDER == LITTLE_ENDIAN -#define ELF_DATA ELFDATA2LSB -#elif BYTE_ORDER == BIG_ENDIAN -#define ELF_DATA ELFDATA2MSB -#else -#error "Unknown byte order" -#endif - -#if __ELF_WORD_SIZE == 32 -#define __elfN(x) elf32_##x -#define __ElfN(x) Elf32_##x -#define __ELFN(x) ELF32_##x -#else -#define __elfN(x) elf364_##x -#define __ElfN(x) Elf364_##x -#define __ELFN(x) ELF364_##x -#endif -#define __ElfType(x) typedef __ElfN(x) Elf_##x - -#define FOO -__ElfType(Addr); -__ElfType(Half); -__ElfType(Off); -__ElfType(Sword); -__ElfType(Word); -__ElfType(Size); -__ElfType(Hashelt); -__ElfType(Ehdr); -__ElfType(Shdr); -__ElfType(Phdr); -__ElfType(Dyn); -__ElfType(Rel); -__ElfType(Rela); -__ElfType(Sym); - -#define ELF_R_SYM __ELFN(R_SYM) -#define ELF_R_TYPE __ELFN(R_TYPE) -#define ELF_R_INFO __ELFN(R_INFO) -#define ELF_ST_BIND __ELFN(ST_BIND) -#define ELF_ST_TYPE __ELFN(ST_TYPE) -#define ELF_ST_INFO __ELFN(ST_INFO) - -#endif /* !_SYS_ELF_GENERIC_H_ */ diff --git a/winsup/cygwin/include/sys/file.h b/winsup/cygwin/include/sys/file.h deleted file mode 100644 index af07df4cf..000000000 --- a/winsup/cygwin/include/sys/file.h +++ /dev/null @@ -1,54 +0,0 @@ -/* This is file FILE.H */ -/* -** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 -** -** This file is distributed under the terms listed in the document -** "copying.dj", available from DJ Delorie at the address above. -** A copy of "copying.dj" should accompany this file; if not, a copy -** should be available from where this file was obtained. This file -** may not be distributed without a verbatim copy of "copying.dj". -** -** This file is distributed WITHOUT ANY WARRANTY; without even the implied -** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -*/ -/* - * 2003-11-27 Nicholas Wourms : - * - * Include sys/cdefs.h. Add function prototype for flock(). - * Add some comments from BSD's header for further clarity. - * (L_SET, L_CURR, L_INCR, L_XTND): Redefine as the macros - * SEEK_SET, SEEK_CUR, SEEK_CUR, & SEEK_END respectively. - * (LOCK_SH,LOCK_EX,LOCK_NB,LOCK_UN): New macros for flock(). -*/ -#ifndef _FILE_H_ -#define _FILE_H_ - -#include -#include - -/* Whence values for lseek(); renamed by POSIX 1003.1 */ -#define L_SET SEEK_SET -#define L_CURR SEEK_CUR -#define L_INCR SEEK_CUR -#define L_XTND SEEK_END - -/* Operations for flock() function */ -#define LOCK_SH 1 /* Shared lock. */ -#define LOCK_EX 2 /* Exclusive lock. */ -#define LOCK_NB 4 /* Don't block when locking. */ -#define LOCK_UN 8 /* Unlock. */ - -/* Operations for access function */ -#define F_OK 0 /* does file exist */ -#define X_OK 1 /* is it executable or searchable by caller */ -#define W_OK 2 /* is it writable by caller */ -#define R_OK 4 /* is it readable by caller */ - -/* Apply or remove an advisory lock on the file fd refers to. */ -__BEGIN_DECLS - -int _EXFUN(flock, (int, int)); - -__END_DECLS - -#endif diff --git a/winsup/cygwin/include/sys/ioctl.h b/winsup/cygwin/include/sys/ioctl.h deleted file mode 100644 index 29f16994b..000000000 --- a/winsup/cygwin/include/sys/ioctl.h +++ /dev/null @@ -1,68 +0,0 @@ -/* sys/ioctl.h - - Copyright 1998, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* sys/ioctl.h */ - -#ifndef _SYS_IOCTL_H -#define _SYS_IOCTL_H - -#include - -__BEGIN_DECLS - -/* /dev/windows ioctls */ - -#define WINDOWS_POST 0 /* Set write() behavior to PostMessage() */ -#define WINDOWS_SEND 1 /* Set write() behavior to SendMessage() */ -#define WINDOWS_HWND 2 /* Set hWnd for read() calls */ - -/* Some standard linux defines */ - -#define _IOC_NRBITS 8 -#define _IOC_TYPEBITS 8 -#define _IOC_SIZEBITS 14 -#define _IOC_DIRBITS 2 - -#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) -#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) -#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) -#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) - -#define _IOC_NRSHIFT 0 -#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) -#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) -#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) - -#define _IOC_NONE 0U -#define _IOC_WRITE 1U -#define _IOC_READ 2U - -#define _IOC(dir,type,nr,size) \ - (((dir) << _IOC_DIRSHIFT) | \ - + ((type) << _IOC_TYPESHIFT) | \ - + ((nr) << _IOC_NRSHIFT) | \ - + ((size) << _IOC_SIZESHIFT)) - -#define _LINUX_IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) -#define _LINUX_IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) -#define _LINUX_IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) -#define _LINUX_IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) - -#ifdef __USE_LINUX_IOCTL_DEFS -# define _IO _LINUX_IO -# define _IOR _LINUX_IOR -# define _IOW _LINUX_IOW -# define _IOWR _LINUX_IOWR -#endif /*__USE_LINUX_IOCTL_DEFS */ - -int __cdecl ioctl (int __fd, int __cmd, ...); - -__END_DECLS -#endif diff --git a/winsup/cygwin/include/sys/ipc.h b/winsup/cygwin/include/sys/ipc.h deleted file mode 100644 index e615bd7c2..000000000 --- a/winsup/cygwin/include/sys/ipc.h +++ /dev/null @@ -1,18 +0,0 @@ -/* sys/ipc.h - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* sys/ipc.h header file for Cygwin. */ - -#ifndef _SYS_IPC_H -#define _SYS_IPC_H - -#include - -#endif /* _SYS_IPC_H */ diff --git a/winsup/cygwin/include/sys/lock.h b/winsup/cygwin/include/sys/lock.h deleted file mode 100644 index abed82716..000000000 --- a/winsup/cygwin/include/sys/lock.h +++ /dev/null @@ -1,54 +0,0 @@ -/* sys/lock.h - - Copyright 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_LOCK_H_ -#define _SYS_LOCK_H_ - -typedef void *_LOCK_T; -#define _LOCK_RECURSIVE_T _LOCK_T - -/* - * This must match cygwins PTHREAD_XXX_MUTEX_INITIALIZER_NP which are - * defined in - */ -#define _LOCK_T_RECURSIVE_INITIALIZER ((_LOCK_T)18) -#define _LOCK_T_INITIALIZER ((_LOCK_T)19) - -#define __LOCK_INIT(CLASS,NAME) \ - CLASS _LOCK_T NAME = _LOCK_T_INITIALIZER; -#define __LOCK_INIT_RECURSIVE(CLASS,NAME) \ - CLASS _LOCK_T NAME = _LOCK_T_RECURSIVE_INITIALIZER; - -#define __lock_init(__lock) __cygwin_lock_init(&__lock) -#define __lock_init_recursive(__lock) __cygwin_lock_init_recursive(&__lock) -#define __lock_close(__lock) __cygwin_lock_fini(&__lock) -#define __lock_close_recursive(__lock) __cygwin_lock_fini(&__lock) -#define __lock_acquire(__lock) __cygwin_lock_lock(&__lock) -#define __lock_acquire_recursive(__lock) __cygwin_lock_lock(&__lock) -#define __lock_try_acquire(lock) __cygwin_lock_trylock(&__lock) -#define __lock_try_acquire_recursive(lock) __cygwin_lock_trylock(&__lock) -#define __lock_release(__lock) __cygwin_lock_unlock(&__lock) -#define __lock_release_recursive(__lock) __cygwin_lock_unlock(&__lock) - -#ifdef __cplusplus -extern "C" -{ -#endif -void __cygwin_lock_init(_LOCK_T *); -void __cygwin_lock_init_recursive(_LOCK_T *); -void __cygwin_lock_fini(_LOCK_T *); -void __cygwin_lock_lock(_LOCK_T *); -int __cygwin_lock_trylock(_LOCK_T *); -void __cygwin_lock_unlock(_LOCK_T *); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/winsup/cygwin/include/sys/mman.h b/winsup/cygwin/include/sys/mman.h deleted file mode 100644 index f501b7b75..000000000 --- a/winsup/cygwin/include/sys/mman.h +++ /dev/null @@ -1,63 +0,0 @@ -/* sys/mman.h - - Copyright 1996, 1997, 1998, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_MMAN_H_ -#define _SYS_MMAN_H_ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include -#include - -#define PROT_NONE 0 -#define PROT_READ 1 -#define PROT_WRITE 2 -#define PROT_EXEC 4 - -#define MAP_FILE 0 -#define MAP_SHARED 1 -#define MAP_PRIVATE 2 -#define MAP_TYPE 0xF -#define MAP_FIXED 0x10 -#define MAP_ANONYMOUS 0x20 -#define MAP_ANON MAP_ANONYMOUS -/* Non-standard flag */ -#define MAP_NORESERVE 0x4000 /* Don't reserve swap space for this mapping. - Page protection must be set explicitely - to access page. Only supported for anonymous - private mappings. */ -#define MAP_AUTOGROW 0x8000 /* Grow underlying object to mapping size. - File must be opened for writing. */ - -#define MAP_FAILED ((void *)-1) - -/* - * Flags for msync. - */ -#define MS_ASYNC 1 -#define MS_SYNC 2 -#define MS_INVALIDATE 4 - -#ifndef __INSIDE_CYGWIN__ -extern void *mmap (void *__addr, size_t __len, int __prot, int __flags, int __fd, off_t __off); -#endif -extern int munmap (void *__addr, size_t __len); -extern int mprotect (void *__addr, size_t __len, int __prot); -extern int msync (void *__addr, size_t __len, int __flags); -extern int mlock (const void *__addr, size_t __len); -extern int munlock (const void *__addr, size_t __len); - -#ifdef __cplusplus -}; -#endif /* __cplusplus */ - -#endif /* _SYS_MMAN_H_ */ diff --git a/winsup/cygwin/include/sys/mount.h b/winsup/cygwin/include/sys/mount.h deleted file mode 100644 index d9d138a2a..000000000 --- a/winsup/cygwin/include/sys/mount.h +++ /dev/null @@ -1,44 +0,0 @@ -/* sys/mount.h - - Copyright 1998, 1999, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_MOUNT_H -#define _SYS_MOUNT_H - -#ifdef __cplusplus -extern "C" { -#endif - -enum -{ - MOUNT_SYMLINK = 0x0001, /* "mount point" is a symlink */ - MOUNT_BINARY = 0x0002, /* "binary" format read/writes */ - MOUNT_SYSTEM = 0x0008, /* mount point came from system table */ - MOUNT_EXEC = 0x0010, /* Any file in the mounted directory gets 'x' bit */ - MOUNT_CYGDRIVE = 0x0020, /* mount point refers to cygdrive device mount */ - MOUNT_CYGWIN_EXEC = 0x0040, /* file or directory is or contains a cygwin - executable */ - MOUNT_MIXED = 0x0080, /* reads are text, writes are binary - not yet implemented */ - MOUNT_NOTEXEC = 0x0100, /* don't check files for executable magic */ - MOUNT_DEVFS = 0x0200, /* /device "filesystem" */ - MOUNT_PROC = 0x0400, /* /proc "filesystem" */ - MOUNT_ENC = 0x0800, /* encode special characters */ - MOUNT_RO = 0x1000 /* read-only "filesystem" */ -}; - -int mount (const char *, const char *, unsigned __flags); -int umount (const char *); -int cygwin_umount (const char *__path, unsigned __flags); - -#ifdef __cplusplus -}; -#endif - -#endif /* _SYS_MOUNT_H */ diff --git a/winsup/cygwin/include/sys/msg.h b/winsup/cygwin/include/sys/msg.h deleted file mode 100644 index a554ab4f8..000000000 --- a/winsup/cygwin/include/sys/msg.h +++ /dev/null @@ -1,18 +0,0 @@ -/* sys/msg.h - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* sys/msg.h header file for Cygwin. */ - -#ifndef _SYS_MSG_H -#define _SYS_MSG_H - -#include - -#endif /* _SYS_MSG_H */ diff --git a/winsup/cygwin/include/sys/mtio.h b/winsup/cygwin/include/sys/mtio.h deleted file mode 100644 index 84812bdc9..000000000 --- a/winsup/cygwin/include/sys/mtio.h +++ /dev/null @@ -1,18 +0,0 @@ -/* sys/mtio.h - - Copyright 1999, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* sys/mtio.h header file for Cygwin. */ - -#ifndef _SYS_MTIO_H -#define _SYS_MTIO_H - -#include - -#endif /* _SYS_MTIO_H */ diff --git a/winsup/cygwin/include/sys/param.h b/winsup/cygwin/include/sys/param.h deleted file mode 100644 index 349313f20..000000000 --- a/winsup/cygwin/include/sys/param.h +++ /dev/null @@ -1,81 +0,0 @@ -/* sys/param.h - - Copyright 2001, 2003 Red Hat, Inc. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#ifndef _SYS_PARAM_H -#define _SYS_PARAM_H - -#include -/* Linux includes limits.h, but this is not universally done. */ -#include - -/* Max number of open files. The Posix version is OPEN_MAX. */ -/* Number of fds is virtually unlimited in cygwin, but we must provide - some reasonable value for Posix conformance */ -#define NOFILE 8192 - -/* Max number of groups; must keep in sync with NGROUPS_MAX in limits.h */ -#define NGROUPS 16 - -/* Ticks/second for system calls such as times() */ -/* FIXME: is this the appropriate value? */ -#define HZ 1000 - -/* Max hostname size that can be dealt with */ -/* FIXME: is this the appropriate value? */ -#define MAXHOSTNAMELEN 64 - -/* This is defined to be the same as MAX_PATH which is used internally. - The Posix version is PATH_MAX. */ -#define MAXPATHLEN (260 - 1 /*NUL*/) - -/* This is the number of bytes per block given in the st_blocks stat member. - It should be in sync with S_BLKSIZE in sys/stat.h. S_BLKSIZE is the - BSD variant of this constant. */ -#define DEV_BSIZE 1024 - -#if 0 /* defined in endian.h */ -/* Some autoconf'd packages check for endianness. When cross-building we - can't run programs on the target. Fortunately, autoconf supports the - definition of byte order in sys/param.h (that's us!). - The values here are the same as used in gdb/defs.h (are the more - appropriate values?). */ -#define BIG_ENDIAN 4321 -#define LITTLE_ENDIAN 1234 - -/* All known win32 systems are little endian. */ -#define BYTE_ORDER LITTLE_ENDIAN -#endif - -#ifndef NULL -#define NULL 0L -#endif - -#ifndef NBBY -#define NBBY 8 -#endif - -/* Bit map related macros. */ -#define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) -#define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) -#define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) -#define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) - -/* Macros for counting and rounding. */ -#ifndef howmany -#define howmany(x, y) (((x)+((y)-1))/(y)) -#endif -#define rounddown(x, y) (((x)/(y))*(y)) -#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) /* to any y */ -#define roundup2(x, y) (((x)+((y)-1))&(~((y)-1))) /* if y is powers of two */ -#define powerof2(x) ((((x)-1)&(x))==0) - -/* Macros for min/max. */ -#define MIN(a,b) (((a)<(b))?(a):(b)) -#define MAX(a,b) (((a)>(b))?(a):(b)) - -#endif diff --git a/winsup/cygwin/include/sys/poll.h b/winsup/cygwin/include/sys/poll.h deleted file mode 100644 index a5bd4bded..000000000 --- a/winsup/cygwin/include/sys/poll.h +++ /dev/null @@ -1,43 +0,0 @@ -/* sys/poll.h - - Copyright 2000, 2001 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#ifndef _SYS_POLL_H -#define _SYS_POLL_H - -#include - -__BEGIN_DECLS - -#define POLLIN 1 /* Set if data to read. */ -#define POLLPRI 2 /* Set if urgent data to read. */ -#define POLLOUT 4 /* Set if writing data wouldn't block. */ -#define POLLERR 8 /* An error occured. */ -#define POLLHUP 16 /* Shutdown or close happened. */ -#define POLLNVAL 32 /* Invalid file descriptor. */ - -#define NPOLLFILE 64 /* Number of canonical fd's in one call to poll(). */ - -/* The following values are defined by XPG4. */ -#define POLLRDNORM POLLIN -#define POLLRDBAND POLLPRI -#define POLLWRNORM POLLOUT -#define POLLWRBAND POLLOUT - -struct pollfd { - int fd; - short events; - short revents; -}; - -extern int poll __P ((struct pollfd *fds, unsigned int nfds, int timeout)); - -__END_DECLS - -#endif /* _SYS_POLL_H */ diff --git a/winsup/cygwin/include/sys/procfs.h b/winsup/cygwin/include/sys/procfs.h deleted file mode 100644 index 78485f678..000000000 --- a/winsup/cygwin/include/sys/procfs.h +++ /dev/null @@ -1,18 +0,0 @@ -/* sys/procfs.h - - Copyright 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* sys/procfs.h header file for Cygwin. */ - -#ifndef _SYS_PROCFS_H -#define _SYS_PROCFS_H - -#include - -#endif /* _SYS_PROCFS_H */ diff --git a/winsup/cygwin/include/sys/queue.h b/winsup/cygwin/include/sys/queue.h deleted file mode 100644 index 92fa56b2f..000000000 --- a/winsup/cygwin/include/sys/queue.h +++ /dev/null @@ -1,558 +0,0 @@ -/* - * Copyright (c) 1991, 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. - * - * @(#)queue.h 8.5 (Berkeley) 8/20/94 - * $FreeBSD: /repoman/r/ncvs/src/sys/sys/queue.h,v 1.56 2003/08/14 14:49:26 kan Exp $ - */ - -#ifndef _SYS_QUEUE_H_ -#define _SYS_QUEUE_H_ - -#include - -/* - * This file defines four types of data structures: singly-linked lists, - * singly-linked tail queues, lists and tail queues. - * - * A singly-linked list is headed by a single forward pointer. The elements - * are singly linked for minimum space and pointer manipulation overhead at - * the expense of O(n) removal for arbitrary elements. New elements can be - * added to the list after an existing element or at the head of the list. - * Elements being removed from the head of the list should use the explicit - * macro for this purpose for optimum efficiency. A singly-linked list may - * only be traversed in the forward direction. Singly-linked lists are ideal - * for applications with large datasets and few or no removals or for - * implementing a LIFO queue. - * - * A singly-linked tail queue is headed by a pair of pointers, one to the - * head of the list and the other to the tail of the list. The elements are - * singly linked for minimum space and pointer manipulation overhead at the - * expense of O(n) removal for arbitrary elements. New elements can be added - * to the list after an existing element, at the head of the list, or at the - * end of the list. Elements being removed from the head of the tail queue - * should use the explicit macro for this purpose for optimum efficiency. - * A singly-linked tail queue may only be traversed in the forward direction. - * Singly-linked tail queues are ideal for applications with large datasets - * and few or no removals or for implementing a FIFO queue. - * - * A list is headed by a single forward pointer (or an array of forward - * pointers for a hash table header). The elements are doubly linked - * so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before - * or after an existing element or at the head of the list. A list - * may only be traversed in the forward direction. - * - * A tail queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or - * after an existing element, at the head of the list, or at the end of - * the list. A tail queue may be traversed in either direction. - * - * For details on the use of these macros, see the queue(3) manual page. - * - * - * SLIST LIST STAILQ TAILQ - * _HEAD + + + + - * _HEAD_INITIALIZER + + + + - * _ENTRY + + + + - * _INIT + + + + - * _EMPTY + + + + - * _FIRST + + + + - * _NEXT + + + + - * _PREV - - - + - * _LAST - - + + - * _FOREACH + + + + - * _FOREACH_SAFE + + + + - * _FOREACH_REVERSE - - - + - * _FOREACH_REVERSE_SAFE - - - + - * _INSERT_HEAD + + + + - * _INSERT_BEFORE - + - + - * _INSERT_AFTER + + + + - * _INSERT_TAIL - - + + - * _CONCAT - - + + - * _REMOVE_HEAD + - + - - * _REMOVE + + + + - * - */ -#define QUEUE_MACRO_DEBUG 0 -#if QUEUE_MACRO_DEBUG -/* Store the last 2 places the queue element or head was altered */ -struct qm_trace { - char * lastfile; - int lastline; - char * prevfile; - int prevline; -}; - -#define TRACEBUF struct qm_trace trace; -#define TRASHIT(x) do {(x) = (void *)-1;} while (0) - -#define QMD_TRACE_HEAD(head) do { \ - (head)->trace.prevline = (head)->trace.lastline; \ - (head)->trace.prevfile = (head)->trace.lastfile; \ - (head)->trace.lastline = __LINE__; \ - (head)->trace.lastfile = __FILE__; \ -} while (0) - -#define QMD_TRACE_ELEM(elem) do { \ - (elem)->trace.prevline = (elem)->trace.lastline; \ - (elem)->trace.prevfile = (elem)->trace.lastfile; \ - (elem)->trace.lastline = __LINE__; \ - (elem)->trace.lastfile = __FILE__; \ -} while (0) - -#else -#define QMD_TRACE_ELEM(elem) -#define QMD_TRACE_HEAD(head) -#define TRACEBUF -#define TRASHIT(x) -#endif /* QUEUE_MACRO_DEBUG */ - -/* - * Singly-linked List declarations. - */ -#define SLIST_HEAD(name, type) \ -struct name { \ - struct type *slh_first; /* first element */ \ -} - -#define SLIST_HEAD_INITIALIZER(head) \ - { NULL } - -#undef SLIST_ENTRY -#define SLIST_ENTRY(type) \ -struct { \ - struct type *sle_next; /* next element */ \ -} - -/* - * Singly-linked List functions. - */ -#define SLIST_EMPTY(head) ((head)->slh_first == NULL) - -#define SLIST_FIRST(head) ((head)->slh_first) - -#define SLIST_FOREACH(var, head, field) \ - for ((var) = SLIST_FIRST((head)); \ - (var); \ - (var) = SLIST_NEXT((var), field)) - -#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = SLIST_FIRST((head)); \ - (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ - for ((varp) = &SLIST_FIRST((head)); \ - ((var) = *(varp)) != NULL; \ - (varp) = &SLIST_NEXT((var), field)) - -#define SLIST_INIT(head) do { \ - SLIST_FIRST((head)) = NULL; \ -} while (0) - -#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ - SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ - SLIST_NEXT((slistelm), field) = (elm); \ -} while (0) - -#define SLIST_INSERT_HEAD(head, elm, field) do { \ - SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ - SLIST_FIRST((head)) = (elm); \ -} while (0) - -#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) - -#define SLIST_REMOVE(head, elm, type, field) do { \ - if (SLIST_FIRST((head)) == (elm)) { \ - SLIST_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = SLIST_FIRST((head)); \ - while (SLIST_NEXT(curelm, field) != (elm)) \ - curelm = SLIST_NEXT(curelm, field); \ - SLIST_NEXT(curelm, field) = \ - SLIST_NEXT(SLIST_NEXT(curelm, field), field); \ - } \ -} while (0) - -#define SLIST_REMOVE_HEAD(head, field) do { \ - SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ -} while (0) - -/* - * Singly-linked Tail queue declarations. - */ -#define STAILQ_HEAD(name, type) \ -struct name { \ - struct type *stqh_first;/* first element */ \ - struct type **stqh_last;/* addr of last next element */ \ -} - -#define STAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).stqh_first } - -#define STAILQ_ENTRY(type) \ -struct { \ - struct type *stqe_next; /* next element */ \ -} - -/* - * Singly-linked Tail queue functions. - */ -#define STAILQ_CONCAT(head1, head2) do { \ - if (!STAILQ_EMPTY((head2))) { \ - *(head1)->stqh_last = (head2)->stqh_first; \ - (head1)->stqh_last = (head2)->stqh_last; \ - STAILQ_INIT((head2)); \ - } \ -} while (0) - -#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) - -#define STAILQ_FIRST(head) ((head)->stqh_first) - -#define STAILQ_FOREACH(var, head, field) \ - for((var) = STAILQ_FIRST((head)); \ - (var); \ - (var) = STAILQ_NEXT((var), field)) - - -#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = STAILQ_FIRST((head)); \ - (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define STAILQ_INIT(head) do { \ - STAILQ_FIRST((head)) = NULL; \ - (head)->stqh_last = &STAILQ_FIRST((head)); \ -} while (0) - -#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ - if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - STAILQ_NEXT((tqelm), field) = (elm); \ -} while (0) - -#define STAILQ_INSERT_HEAD(head, elm, field) do { \ - if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ - STAILQ_FIRST((head)) = (elm); \ -} while (0) - -#define STAILQ_INSERT_TAIL(head, elm, field) do { \ - STAILQ_NEXT((elm), field) = NULL; \ - *(head)->stqh_last = (elm); \ - (head)->stqh_last = &STAILQ_NEXT((elm), field); \ -} while (0) - -#define STAILQ_LAST(head, type, field) \ - (STAILQ_EMPTY((head)) ? \ - NULL : \ - ((struct type *) \ - ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) - -#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) - -#define STAILQ_REMOVE(head, elm, type, field) do { \ - if (STAILQ_FIRST((head)) == (elm)) { \ - STAILQ_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = STAILQ_FIRST((head)); \ - while (STAILQ_NEXT(curelm, field) != (elm)) \ - curelm = STAILQ_NEXT(curelm, field); \ - if ((STAILQ_NEXT(curelm, field) = \ - STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\ - (head)->stqh_last = &STAILQ_NEXT((curelm), field);\ - } \ -} while (0) - -#define STAILQ_REMOVE_HEAD(head, field) do { \ - if ((STAILQ_FIRST((head)) = \ - STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ - (head)->stqh_last = &STAILQ_FIRST((head)); \ -} while (0) - -#define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \ - if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \ - (head)->stqh_last = &STAILQ_FIRST((head)); \ -} while (0) - -/* - * List declarations. - */ -#define LIST_HEAD(name, type) \ -struct name { \ - struct type *lh_first; /* first element */ \ -} - -#define LIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define LIST_ENTRY(type) \ -struct { \ - struct type *le_next; /* next element */ \ - struct type **le_prev; /* address of previous next element */ \ -} - -/* - * List functions. - */ - -#define LIST_EMPTY(head) ((head)->lh_first == NULL) - -#define LIST_FIRST(head) ((head)->lh_first) - -#define LIST_FOREACH(var, head, field) \ - for ((var) = LIST_FIRST((head)); \ - (var); \ - (var) = LIST_NEXT((var), field)) - -#define LIST_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = LIST_FIRST((head)); \ - (var) && ((tvar) = LIST_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define LIST_INIT(head) do { \ - LIST_FIRST((head)) = NULL; \ -} while (0) - -#define LIST_INSERT_AFTER(listelm, elm, field) do { \ - if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ - LIST_NEXT((listelm), field)->field.le_prev = \ - &LIST_NEXT((elm), field); \ - LIST_NEXT((listelm), field) = (elm); \ - (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ -} while (0) - -#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.le_prev = (listelm)->field.le_prev; \ - LIST_NEXT((elm), field) = (listelm); \ - *(listelm)->field.le_prev = (elm); \ - (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ -} while (0) - -#define LIST_INSERT_HEAD(head, elm, field) do { \ - if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ - LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ - LIST_FIRST((head)) = (elm); \ - (elm)->field.le_prev = &LIST_FIRST((head)); \ -} while (0) - -#define LIST_NEXT(elm, field) ((elm)->field.le_next) - -#define LIST_REMOVE(elm, field) do { \ - if (LIST_NEXT((elm), field) != NULL) \ - LIST_NEXT((elm), field)->field.le_prev = \ - (elm)->field.le_prev; \ - *(elm)->field.le_prev = LIST_NEXT((elm), field); \ -} while (0) - -/* - * Tail queue declarations. - */ -#define TAILQ_HEAD(name, type) \ -struct name { \ - struct type *tqh_first; /* first element */ \ - struct type **tqh_last; /* addr of last next element */ \ - TRACEBUF \ -} - -#define TAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).tqh_first } - -#define TAILQ_ENTRY(type) \ -struct { \ - struct type *tqe_next; /* next element */ \ - struct type **tqe_prev; /* address of previous next element */ \ - TRACEBUF \ -} - -/* - * Tail queue functions. - */ -#define TAILQ_CONCAT(head1, head2, field) do { \ - if (!TAILQ_EMPTY(head2)) { \ - *(head1)->tqh_last = (head2)->tqh_first; \ - (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ - (head1)->tqh_last = (head2)->tqh_last; \ - TAILQ_INIT((head2)); \ - QMD_TRACE_HEAD(head); \ - QMD_TRACE_HEAD(head2); \ - } \ -} while (0) - -#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) - -#define TAILQ_FIRST(head) ((head)->tqh_first) - -#define TAILQ_FOREACH(var, head, field) \ - for ((var) = TAILQ_FIRST((head)); \ - (var); \ - (var) = TAILQ_NEXT((var), field)) - -#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = TAILQ_FIRST((head)); \ - (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ - (var) = (tvar)) - -#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ - for ((var) = TAILQ_LAST((head), headname); \ - (var); \ - (var) = TAILQ_PREV((var), headname, field)) - -#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ - for ((var) = TAILQ_LAST((head), headname); \ - (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ - (var) = (tvar)) - -#define TAILQ_INIT(head) do { \ - TAILQ_FIRST((head)) = NULL; \ - (head)->tqh_last = &TAILQ_FIRST((head)); \ - QMD_TRACE_HEAD(head); \ -} while (0) - -#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ - TAILQ_NEXT((elm), field)->field.tqe_prev = \ - &TAILQ_NEXT((elm), field); \ - else { \ - (head)->tqh_last = &TAILQ_NEXT((elm), field); \ - QMD_TRACE_HEAD(head); \ - } \ - TAILQ_NEXT((listelm), field) = (elm); \ - (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ - QMD_TRACE_ELEM(&(elm)->field); \ - QMD_TRACE_ELEM(&listelm->field); \ -} while (0) - -#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ - TAILQ_NEXT((elm), field) = (listelm); \ - *(listelm)->field.tqe_prev = (elm); \ - (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ - QMD_TRACE_ELEM(&(elm)->field); \ - QMD_TRACE_ELEM(&listelm->field); \ -} while (0) - -#define TAILQ_INSERT_HEAD(head, elm, field) do { \ - if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ - TAILQ_FIRST((head))->field.tqe_prev = \ - &TAILQ_NEXT((elm), field); \ - else \ - (head)->tqh_last = &TAILQ_NEXT((elm), field); \ - TAILQ_FIRST((head)) = (elm); \ - (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ - QMD_TRACE_HEAD(head); \ - QMD_TRACE_ELEM(&(elm)->field); \ -} while (0) - -#define TAILQ_INSERT_TAIL(head, elm, field) do { \ - TAILQ_NEXT((elm), field) = NULL; \ - (elm)->field.tqe_prev = (head)->tqh_last; \ - *(head)->tqh_last = (elm); \ - (head)->tqh_last = &TAILQ_NEXT((elm), field); \ - QMD_TRACE_HEAD(head); \ - QMD_TRACE_ELEM(&(elm)->field); \ -} while (0) - -#define TAILQ_LAST(head, headname) \ - (*(((struct headname *)((head)->tqh_last))->tqh_last)) - -#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) - -#define TAILQ_PREV(elm, headname, field) \ - (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) - -#define TAILQ_REMOVE(head, elm, field) do { \ - if ((TAILQ_NEXT((elm), field)) != NULL) \ - TAILQ_NEXT((elm), field)->field.tqe_prev = \ - (elm)->field.tqe_prev; \ - else { \ - (head)->tqh_last = (elm)->field.tqe_prev; \ - QMD_TRACE_HEAD(head); \ - } \ - *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ - TRASHIT((elm)->field.tqe_next); \ - TRASHIT((elm)->field.tqe_prev); \ - QMD_TRACE_ELEM(&(elm)->field); \ -} while (0) - - -#ifdef _KERNEL - -/* - * XXX insque() and remque() are an old way of handling certain queues. - * They bogusly assumes that all queue heads look alike. - */ - -struct quehead { - struct quehead *qh_link; - struct quehead *qh_rlink; -}; - -#ifdef __GNUC__ - -static __inline void -insque(void *a, void *b) -{ - struct quehead *element = (struct quehead *)a, - *head = (struct quehead *)b; - - element->qh_link = head->qh_link; - element->qh_rlink = head; - head->qh_link = element; - element->qh_link->qh_rlink = element; -} - -static __inline void -remque(void *a) -{ - struct quehead *element = (struct quehead *)a; - - element->qh_link->qh_rlink = element->qh_rlink; - element->qh_rlink->qh_link = element->qh_link; - element->qh_rlink = 0; -} - -#else /* !__GNUC__ */ - -void insque(void *a, void *b); -void remque(void *a); - -#endif /* __GNUC__ */ - -#endif /* _KERNEL */ - -#endif /* !_SYS_QUEUE_H_ */ diff --git a/winsup/cygwin/include/sys/resource.h b/winsup/cygwin/include/sys/resource.h deleted file mode 100644 index d2de569cd..000000000 --- a/winsup/cygwin/include/sys/resource.h +++ /dev/null @@ -1,84 +0,0 @@ -/* sys/resource.h - - Copyright 1997, 1998, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_RESOURCE_H_ -#define _SYS_RESOURCE_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Used for get/setpriority */ -#define PRIO_PROCESS 0 -#define PRIO_PGRP 1 -#define PRIO_USER 2 - -#define RLIMIT_CPU 0 /* CPU time in seconds */ -#define RLIMIT_FSIZE 1 /* Maximum filesize */ -#define RLIMIT_DATA 2 /* max data size */ -#define RLIMIT_STACK 3 /* max stack size */ -#define RLIMIT_CORE 4 /* max core file size */ -#define RLIMIT_NOFILE 5 /* max number of open files */ -#define RLIMIT_OFILE RLIMIT_NOFILE /* BSD name */ -#define RLIMIT_AS 6 /* address space (virt. memory) limit */ - -#define RLIMIT_NLIMITS 7 /* upper bound of RLIMIT_* defines */ -#define RLIM_NLIMITS RLIMIT_NLIMITS - -#define RLIM_INFINITY (0xffffffffUL) -#define RLIM_SAVED_MAX RLIM_INFINITY -#define RLIM_SAVED_CUR RLIM_INFINITY - -typedef unsigned long rlim_t; - -struct rlimit { - rlim_t rlim_cur; - rlim_t rlim_max; -}; - -#define RUSAGE_SELF 0 /* calling process */ -#define RUSAGE_CHILDREN -1 /* terminated child processes */ - -struct rusage { - struct timeval ru_utime; /* user time used */ - struct timeval ru_stime; /* system time used */ - long ru_maxrss; - long ru_ixrss; /* XXX: 0 */ - long ru_idrss; /* XXX: sum of rm_asrss */ - long ru_isrss; /* XXX: 0 */ - long ru_minflt; /* any page faults not requiring I/O */ - long ru_majflt; /* any page faults requiring I/O */ - long ru_nswap; /* swaps */ - long ru_inblock; /* block input operations */ - long ru_oublock; /* block output operations */ - long ru_msgsnd; /* messages sent */ - long ru_msgrcv; /* messages received */ - long ru_nsignals; /* signals received */ - long ru_nvcsw; /* voluntary context switches */ - long ru_nivcsw; /* involuntary " */ -#define ru_last ru_nivcsw -}; - -int getrlimit (int __resource, struct rlimit *__rlp); -int setrlimit (int __resource, const struct rlimit *__rlp); - -int getrusage (int __who, struct rusage *__rusage); - -int getpriority (int which, id_t who); -int setpriority (int which, id_t who, int value); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/winsup/cygwin/include/sys/select.h b/winsup/cygwin/include/sys/select.h deleted file mode 100644 index b0f328327..000000000 --- a/winsup/cygwin/include/sys/select.h +++ /dev/null @@ -1,41 +0,0 @@ -/* select.h - Copyright 1998, 1999, 2000, 2001 Red Hat, Inc. - - Written by Geoffrey Noer - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_SELECT_H -#define _SYS_SELECT_H - -#if !defined (_POSIX_SOURCE) && !defined (__INSIDE_CYGWIN_NET__) - -#include - -/* Get fd_set, and macros like FD_SET */ -#include - -/* Get definition of timeval. */ -#include -#include - -/* Get definition of sigset_t. */ -#include - -__BEGIN_DECLS - -int select __P ((int __n, fd_set *__readfds, fd_set *__writefds, - fd_set *__exceptfds, struct timeval *__timeout)); -int pselect __P ((int __n, fd_set *__readfds, fd_set *__writefds, - fd_set *__exceptfds, const struct timespec *__timeout, - const sigset_t *__set)); - -__END_DECLS - -#endif /* !_POSIX_SOURCE, !__INSIDE_CYGWIN_NET__ */ - -#endif /* sys/select.h */ diff --git a/winsup/cygwin/include/sys/sem.h b/winsup/cygwin/include/sys/sem.h deleted file mode 100644 index f7bdb595c..000000000 --- a/winsup/cygwin/include/sys/sem.h +++ /dev/null @@ -1,18 +0,0 @@ -/* sys/sem.h - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* sys/sem.h header file for Cygwin. */ - -#ifndef _SYS_SEM_H -#define _SYS_SEM_H - -#include - -#endif /* _SYS_SEM_H */ diff --git a/winsup/cygwin/include/sys/shm.h b/winsup/cygwin/include/sys/shm.h deleted file mode 100644 index 2f0c38084..000000000 --- a/winsup/cygwin/include/sys/shm.h +++ /dev/null @@ -1,18 +0,0 @@ -/* sys/shm.h - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* sys/shm.h header file for Cygwin. */ - -#ifndef _SYS_SHM_H -#define _SYS_SHM_H - -#include - -#endif /* _SYS_SHM_H */ diff --git a/winsup/cygwin/include/sys/smallprint.h b/winsup/cygwin/include/sys/smallprint.h deleted file mode 100644 index 9593d4d10..000000000 --- a/winsup/cygwin/include/sys/smallprint.h +++ /dev/null @@ -1,27 +0,0 @@ -/* sys/smallprint.h - - Copyright 1998, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_SMALLPRINT_H -#define _SYS_SMALLPRINT_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -int __small_sprintf (char *__dst, const char *__fmt, ...); -int __small_vsprintf (char *__dst, const char *__fmt, va_list __ap); - -#ifdef __cplusplus -}; -#endif - -#endif /* _SYS_SMALLPRINT_H */ diff --git a/winsup/cygwin/include/sys/socket.h b/winsup/cygwin/include/sys/socket.h deleted file mode 100644 index 3bda9f9bf..000000000 --- a/winsup/cygwin/include/sys/socket.h +++ /dev/null @@ -1,56 +0,0 @@ -/* sys/socket.h - - Copyright 1996-2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_SOCKET_H -#define _SYS_SOCKET_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* SUS symbolic values for the second parm to shutdown(2) */ -#define SHUT_RD 0 /* == Win32 SD_RECEIVE */ -#define SHUT_WR 1 /* == Win32 SD_SEND */ -#define SHUT_RDWR 2 /* == Win32 SD_BOTH */ - -#ifndef __INSIDE_CYGWIN_NET__ - int accept (int, struct sockaddr *__peer, int *); - int bind (int, const struct sockaddr *__my_addr, int __addrlen); - int connect (int, const struct sockaddr *, int); - int getpeername (int, struct sockaddr *__peer, int *); - int getsockname (int, struct sockaddr *__addr, int *); - int listen (int, int __n); - int recv (int, void *__buff, int __len, int __flags); - int recvfrom (int, void *__buff, int __len, int __flags, - struct sockaddr *__from, int *__fromlen); - int recvmsg(int s, struct msghdr *msg, int flags); - int send (int, const void *__buff, int __len, int __flags); - int sendmsg(int s, const struct msghdr *msg, int flags); - int sendto (int, const void *, int __len, int __flags, - const struct sockaddr *__to, int __tolen); - int setsockopt (int __s, int __level, int __optname, const void *optval, int __optlen); - int getsockopt (int __s, int __level, int __optname, void *__optval, int *__optlen); - int shutdown (int, int); - int socket (int __family, int __type, int __protocol); - int socketpair (int __domain, int __type, int __protocol, int *__socket_vec); - - struct servent *getservbyname (const char *__name, const char *__proto); -#endif - -#ifdef __cplusplus -}; -#endif - -#endif /* _SYS_SOCKET_H */ diff --git a/winsup/cygwin/include/sys/soundcard.h b/winsup/cygwin/include/sys/soundcard.h deleted file mode 100644 index 79341c547..000000000 --- a/winsup/cygwin/include/sys/soundcard.h +++ /dev/null @@ -1,1287 +0,0 @@ -#ifndef SOUNDCARD_H -#define SOUNDCARD_H -/* - * Copyright by Hannu Savolainen 1993-1997 - * - * 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. - */ - - -/* - * OSS interface version. With versions earlier than 3.6 this value is - * an integer with value less than 361. In versions 3.6 and later - * it's a six digit hexadecimal value. For example value - * of 0x030600 represents OSS version 3.6.0. - * Use ioctl(fd, OSS_GETVERSION, &int) to get the version number of - * the currently active driver. - */ -#define SOUND_VERSION 0x030802 -#define OPEN_SOUND_SYSTEM - -/* In Linux we need to be prepared for cross compiling */ -//#include - -/* - * Supported card ID numbers (Should be somewhere else?) - */ - -#define SNDCARD_ADLIB 1 -#define SNDCARD_SB 2 -#define SNDCARD_PAS 3 -#define SNDCARD_GUS 4 -#define SNDCARD_MPU401 5 -#define SNDCARD_SB16 6 -#define SNDCARD_SB16MIDI 7 -#define SNDCARD_UART6850 8 -#define SNDCARD_GUS16 9 -#define SNDCARD_MSS 10 -#define SNDCARD_PSS 11 -#define SNDCARD_SSCAPE 12 -#define SNDCARD_PSS_MPU 13 -#define SNDCARD_PSS_MSS 14 -#define SNDCARD_SSCAPE_MSS 15 -#define SNDCARD_TRXPRO 16 -#define SNDCARD_TRXPRO_SB 17 -#define SNDCARD_TRXPRO_MPU 18 -#define SNDCARD_MAD16 19 -#define SNDCARD_MAD16_MPU 20 -#define SNDCARD_CS4232 21 -#define SNDCARD_CS4232_MPU 22 -#define SNDCARD_MAUI 23 -#define SNDCARD_PSEUDO_MSS 24 -#define SNDCARD_GUSPNP 25 -#define SNDCARD_UART401 26 -/* Sound card numbers 27 to N are reserved. Don't add more numbers here. */ - -/*********************************** - * IOCTL Commands for /dev/sequencer - */ - -#ifndef _SIOWR -#if defined(_IOWR) && (defined(_AIX) || (!defined(sun) && !defined(sparc) && !defined(__sparc__) && !defined(__INCioctlh) && !defined(__Lynx__))) -/* Use already defined ioctl defines if they exist (except with Sun or Sparc) */ -#define SIOCPARM_MASK IOCPARM_MASK -#define SIOC_VOID IOC_VOID -#define SIOC_OUT IOC_OUT -#define SIOC_IN IOC_IN -#define SIOC_INOUT IOC_INOUT -#define _SIOC_SIZE _IOC_SIZE -#define _SIOC_DIR _IOC_DIR -#define _SIOC_NONE _IOC_NONE -#define _SIOC_READ _IOC_READ -#define _SIOC_WRITE _IOC_WRITE -#define _SIO _IO -#define _SIOR _IOR -#define _SIOW _IOW -#define _SIOWR _IOWR -#else - -/* Ioctl's have the command encoded in the lower word, - * and the size of any in or out parameters in the upper - * word. The high 2 bits of the upper word are used - * to encode the in/out status of the parameter; for now - * we restrict parameters to at most 8191 bytes. - */ -/* #define SIOCTYPE (0xff<<8) */ -#define SIOCPARM_MASK 0x1fff /* parameters must be < 8192 bytes */ -#define SIOC_VOID 0x00000000 /* no parameters */ -#define SIOC_OUT 0x20000000 /* copy out parameters */ -#define SIOC_IN 0x40000000 /* copy in parameters */ -#define SIOC_INOUT (SIOC_IN|SIOC_OUT) -/* the 0x20000000 is so we can distinguish new ioctl's from old */ -#define _SIO(x,y) ((int)(SIOC_VOID|(x<<8)|y)) -#define _SIOR(x,y,t) ((int)(SIOC_OUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) -#define _SIOW(x,y,t) ((int)(SIOC_IN|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) -/* this should be _SIORW, but stdio got there first */ -#define _SIOWR(x,y,t) ((int)(SIOC_INOUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) -#define _SIOC_SIZE(x) ((x>>16)&SIOCPARM_MASK) -#define _SIOC_DIR(x) (x & 0xf0000000) -#define _SIOC_NONE SIOC_VOID -#define _SIOC_READ SIOC_OUT -#define _SIOC_WRITE SIOC_IN -# endif /* _IOWR */ -#endif /* !_SIOWR */ - -#define SNDCTL_SEQ_RESET _SIO ('Q', 0) -#define SNDCTL_SEQ_SYNC _SIO ('Q', 1) -#define SNDCTL_SYNTH_INFO _SIOWR('Q', 2, struct synth_info) -#define SNDCTL_SEQ_CTRLRATE _SIOWR('Q', 3, int) /* Set/get timer resolution (HZ) */ -#define SNDCTL_SEQ_GETOUTCOUNT _SIOR ('Q', 4, int) -#define SNDCTL_SEQ_GETINCOUNT _SIOR ('Q', 5, int) -#define SNDCTL_SEQ_PERCMODE _SIOW ('Q', 6, int) -#define SNDCTL_FM_LOAD_INSTR _SIOW ('Q', 7, struct sbi_instrument) /* Obsolete. Don't use!!!!!! */ -#define SNDCTL_SEQ_TESTMIDI _SIOW ('Q', 8, int) -#define SNDCTL_SEQ_RESETSAMPLES _SIOW ('Q', 9, int) -#define SNDCTL_SEQ_NRSYNTHS _SIOR ('Q',10, int) -#define SNDCTL_SEQ_NRMIDIS _SIOR ('Q',11, int) -#define SNDCTL_MIDI_INFO _SIOWR('Q',12, struct midi_info) -#define SNDCTL_SEQ_THRESHOLD _SIOW ('Q',13, int) -#define SNDCTL_SYNTH_MEMAVL _SIOWR('Q',14, int) /* in=dev#, out=memsize */ -#define SNDCTL_FM_4OP_ENABLE _SIOW ('Q',15, int) /* in=dev# */ -#define SNDCTL_SEQ_PANIC _SIO ('Q',17) -#define SNDCTL_SEQ_OUTOFBAND _SIOW ('Q',18, struct seq_event_rec) -#define SNDCTL_SEQ_GETTIME _SIOR ('Q',19, int) -#define SNDCTL_SYNTH_ID _SIOWR('Q',20, struct synth_info) -#define SNDCTL_SYNTH_CONTROL _SIOWR('Q',21, struct synth_control) -#define SNDCTL_SYNTH_REMOVESAMPLE _SIOWR('Q',22, struct remove_sample) - -typedef struct synth_control -{ - int devno; /* Synthesizer # */ - char data[4000]; /* Device spesific command/data record */ -}synth_control; - -typedef struct remove_sample -{ - int devno; /* Synthesizer # */ - int bankno; /* MIDI bank # (0=General MIDI) */ - int instrno; /* MIDI instrument number */ -} remove_sample; - -typedef struct seq_event_rec { - unsigned char arr[8]; -} seq_event_rec; - -#define SNDCTL_TMR_TIMEBASE _SIOWR('T', 1, int) -#define SNDCTL_TMR_START _SIO ('T', 2) -#define SNDCTL_TMR_STOP _SIO ('T', 3) -#define SNDCTL_TMR_CONTINUE _SIO ('T', 4) -#define SNDCTL_TMR_TEMPO _SIOWR('T', 5, int) -#define SNDCTL_TMR_SOURCE _SIOWR('T', 6, int) -# define TMR_INTERNAL 0x00000001 -# define TMR_EXTERNAL 0x00000002 -# define TMR_MODE_MIDI 0x00000010 -# define TMR_MODE_FSK 0x00000020 -# define TMR_MODE_CLS 0x00000040 -# define TMR_MODE_SMPTE 0x00000080 -#define SNDCTL_TMR_METRONOME _SIOW ('T', 7, int) -#define SNDCTL_TMR_SELECT _SIOW ('T', 8, int) - -/* - * Some big endian/little endian handling macros - */ - -#if defined(_AIX) || defined(AIX) || defined(sparc) || defined(__sparc__) || defined(HPPA) || defined(PPC) -/* Big endian machines */ -# define _PATCHKEY(id) (0xfd00|id) -# define AFMT_S16_NE AFMT_S16_BE -#else -# define _PATCHKEY(id) ((id<<8)|0xfd) -# define AFMT_S16_NE AFMT_S16_LE -#endif - -/* - * Sample loading mechanism for internal synthesizers (/dev/sequencer) - * The following patch_info structure has been designed to support - * Gravis UltraSound. It tries to be universal format for uploading - * sample based patches but is probably too limited. - * - * (PBD) As Hannu guessed, the GUS structure is too limited for - * the WaveFront, but this is the right place for a constant definition. - */ - -struct patch_info { - unsigned short key; /* Use WAVE_PATCH here */ -#define WAVE_PATCH _PATCHKEY(0x04) -#define GUS_PATCH WAVE_PATCH -#define WAVEFRONT_PATCH _PATCHKEY(0x06) - - short device_no; /* Synthesizer number */ - short instr_no; /* Midi pgm# */ - - unsigned int mode; -/* - * The least significant byte has the same format than the GUS .PAT - * files - */ -#define WAVE_16_BITS 0x01 /* bit 0 = 8 or 16 bit wave data. */ -#define WAVE_UNSIGNED 0x02 /* bit 1 = Signed - Unsigned data. */ -#define WAVE_LOOPING 0x04 /* bit 2 = looping enabled-1. */ -#define WAVE_BIDIR_LOOP 0x08 /* bit 3 = Set is bidirectional looping. */ -#define WAVE_LOOP_BACK 0x10 /* bit 4 = Set is looping backward. */ -#define WAVE_SUSTAIN_ON 0x20 /* bit 5 = Turn sustaining on. (Env. pts. 3)*/ -#define WAVE_ENVELOPES 0x40 /* bit 6 = Enable envelopes - 1 */ -#define WAVE_FAST_RELEASE 0x80 /* bit 7 = Shut off immediately after note off */ - /* (use the env_rate/env_offs fields). */ -/* Linux specific bits */ -#define WAVE_VIBRATO 0x00010000 /* The vibrato info is valid */ -#define WAVE_TREMOLO 0x00020000 /* The tremolo info is valid */ -#define WAVE_SCALE 0x00040000 /* The scaling info is valid */ -#define WAVE_FRACTIONS 0x00080000 /* Fraction information is valid */ -/* Reserved bits */ -#define WAVE_ROM 0x40000000 /* For future use */ -#define WAVE_MULAW 0x20000000 /* For future use */ -/* Other bits must be zeroed */ - - int len; /* Size of the wave data in bytes */ - int loop_start, loop_end; /* Byte offsets from the beginning */ - -/* - * The base_freq and base_note fields are used when computing the - * playback speed for a note. The base_note defines the tone frequency - * which is heard if the sample is played using the base_freq as the - * playback speed. - * - * The low_note and high_note fields define the minimum and maximum note - * frequencies for which this sample is valid. It is possible to define - * more than one samples for an instrument number at the same time. The - * low_note and high_note fields are used to select the most suitable one. - * - * The fields base_note, high_note and low_note should contain - * the note frequency multiplied by 1000. For example value for the - * middle A is 440*1000. - */ - - unsigned int base_freq; - unsigned int base_note; - unsigned int high_note; - unsigned int low_note; - int panning; /* -128=left, 127=right */ - int detuning; - -/* New fields introduced in version 1.99.5 */ - - /* Envelope. Enabled by mode bit WAVE_ENVELOPES */ - unsigned char env_rate[ 6 ]; /* GUS HW ramping rate */ - unsigned char env_offset[ 6 ]; /* 255 == 100% */ - - /* - * The tremolo, vibrato and scale info are not supported yet. - * Enable by setting the mode bits WAVE_TREMOLO, WAVE_VIBRATO or - * WAVE_SCALE - */ - - unsigned char tremolo_sweep; - unsigned char tremolo_rate; - unsigned char tremolo_depth; - - unsigned char vibrato_sweep; - unsigned char vibrato_rate; - unsigned char vibrato_depth; - - int scale_frequency; - unsigned int scale_factor; /* from 0 to 2048 or 0 to 2 */ - - int volume; - int fractions; - int reserved1; - int spare[2]; - char data[1]; /* The waveform data starts here */ - }; - -struct sysex_info { - short key; /* Use SYSEX_PATCH or MAUI_PATCH here */ -#define SYSEX_PATCH _PATCHKEY(0x05) -#define MAUI_PATCH _PATCHKEY(0x06) - short device_no; /* Synthesizer number */ - int len; /* Size of the sysex data in bytes */ - unsigned char data[1]; /* Sysex data starts here */ - }; - -/* - * /dev/sequencer input events. - * - * The data written to the /dev/sequencer is a stream of events. Events - * are records of 4 or 8 bytes. The first byte defines the size. - * Any number of events can be written with a write call. There - * is a set of macros for sending these events. Use these macros if you - * want to maximize portability of your program. - * - * Events SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO. Are also input events. - * (All input events are currently 4 bytes long. Be prepared to support - * 8 byte events also. If you receive any event having first byte >= 128, - * it's a 8 byte event. - * - * The events are documented at the end of this file. - * - * Normal events (4 bytes) - * There is also a 8 byte version of most of the 4 byte events. The - * 8 byte one is recommended. - */ -#define SEQ_NOTEOFF 0 -#define SEQ_FMNOTEOFF SEQ_NOTEOFF /* Just old name */ -#define SEQ_NOTEON 1 -#define SEQ_FMNOTEON SEQ_NOTEON -#define SEQ_WAIT TMR_WAIT_ABS -#define SEQ_PGMCHANGE 3 -#define SEQ_FMPGMCHANGE SEQ_PGMCHANGE -#define SEQ_SYNCTIMER TMR_START -#define SEQ_MIDIPUTC 5 -#define SEQ_DRUMON 6 /*** OBSOLETE ***/ -#define SEQ_DRUMOFF 7 /*** OBSOLETE ***/ -#define SEQ_ECHO TMR_ECHO /* For synching programs with output */ -#define SEQ_AFTERTOUCH 9 -#define SEQ_CONTROLLER 10 - -/******************************************* - * Midi controller numbers - ******************************************* - * Controllers 0 to 31 (0x00 to 0x1f) and - * 32 to 63 (0x20 to 0x3f) are continuous - * controllers. - * In the MIDI 1.0 these controllers are sent using - * two messages. Controller numbers 0 to 31 are used - * to send the MSB and the controller numbers 32 to 63 - * are for the LSB. Note that just 7 bits are used in MIDI bytes. - */ - -#define CTL_BANK_SELECT 0x00 -#define CTL_MODWHEEL 0x01 -#define CTL_BREATH 0x02 -/* undefined 0x03 */ -#define CTL_FOOT 0x04 -#define CTL_PORTAMENTO_TIME 0x05 -#define CTL_DATA_ENTRY 0x06 -#define CTL_MAIN_VOLUME 0x07 -#define CTL_BALANCE 0x08 -/* undefined 0x09 */ -#define CTL_PAN 0x0a -#define CTL_EXPRESSION 0x0b -/* undefined 0x0c */ -/* undefined 0x0d */ -/* undefined 0x0e */ -/* undefined 0x0f */ -#define CTL_GENERAL_PURPOSE1 0x10 -#define CTL_GENERAL_PURPOSE2 0x11 -#define CTL_GENERAL_PURPOSE3 0x12 -#define CTL_GENERAL_PURPOSE4 0x13 -/* undefined 0x14 - 0x1f */ - -/* undefined 0x20 */ -/* The controller numbers 0x21 to 0x3f are reserved for the */ -/* least significant bytes of the controllers 0x00 to 0x1f. */ -/* These controllers are not recognised by the driver. */ - -/* Controllers 64 to 69 (0x40 to 0x45) are on/off switches. */ -/* 0=OFF and 127=ON (intermediate values are possible) */ -#define CTL_DAMPER_PEDAL 0x40 -#define CTL_SUSTAIN 0x40 /* Alias */ -#define CTL_HOLD 0x40 /* Alias */ -#define CTL_PORTAMENTO 0x41 -#define CTL_SOSTENUTO 0x42 -#define CTL_SOFT_PEDAL 0x43 -/* undefined 0x44 */ -#define CTL_HOLD2 0x45 -/* undefined 0x46 - 0x4f */ - -#define CTL_GENERAL_PURPOSE5 0x50 -#define CTL_GENERAL_PURPOSE6 0x51 -#define CTL_GENERAL_PURPOSE7 0x52 -#define CTL_GENERAL_PURPOSE8 0x53 -/* undefined 0x54 - 0x5a */ -#define CTL_EXT_EFF_DEPTH 0x5b -#define CTL_TREMOLO_DEPTH 0x5c -#define CTL_CHORUS_DEPTH 0x5d -#define CTL_DETUNE_DEPTH 0x5e -#define CTL_CELESTE_DEPTH 0x5e /* Alias for the above one */ -#define CTL_PHASER_DEPTH 0x5f -#define CTL_DATA_INCREMENT 0x60 -#define CTL_DATA_DECREMENT 0x61 -#define CTL_NONREG_PARM_NUM_LSB 0x62 -#define CTL_NONREG_PARM_NUM_MSB 0x63 -#define CTL_REGIST_PARM_NUM_LSB 0x64 -#define CTL_REGIST_PARM_NUM_MSB 0x65 -/* undefined 0x66 - 0x78 */ -/* reserved 0x79 - 0x7f */ - -/* Pseudo controllers (not midi compatible) */ -#define CTRL_PITCH_BENDER 255 -#define CTRL_PITCH_BENDER_RANGE 254 -#define CTRL_EXPRESSION 253 /* Obsolete */ -#define CTRL_MAIN_VOLUME 252 /* Obsolete */ -#define SEQ_BALANCE 11 -#define SEQ_VOLMODE 12 - -/* - * Volume mode decides how volumes are used - */ - -#define VOL_METHOD_ADAGIO 1 -#define VOL_METHOD_LINEAR 2 - -/* - * Note! SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO are used also as - * input events. - */ - -/* - * Event codes 0xf0 to 0xfc are reserved for future extensions. - */ - -#define SEQ_FULLSIZE 0xfd /* Long events */ -/* - * SEQ_FULLSIZE events are used for loading patches/samples to the - * synthesizer devices. These events are passed directly to the driver - * of the associated synthesizer device. There is no limit to the size - * of the extended events. These events are not queued but executed - * immediately when the write() is called (execution can take several - * seconds of time). - * - * When a SEQ_FULLSIZE message is written to the device, it must - * be written using exactly one write() call. Other events cannot - * be mixed to the same write. - * - * For FM synths (YM3812/OPL3) use struct sbi_instrument and write it to the - * /dev/sequencer. Don't write other data together with the instrument structure - * Set the key field of the structure to FM_PATCH. The device field is used to - * route the patch to the corresponding device. - * - * For wave table use struct patch_info. Initialize the key field - * to WAVE_PATCH. - */ -#define SEQ_PRIVATE 0xfe /* Low level HW dependent events (8 bytes) */ -#define SEQ_EXTENDED 0xff /* Extended events (8 bytes) OBSOLETE */ - -/* - * Record for FM patches - */ - -typedef unsigned char sbi_instr_data[32]; - -struct sbi_instrument { - unsigned short key; /* FM_PATCH or OPL3_PATCH */ -#define FM_PATCH _PATCHKEY(0x01) -#define OPL3_PATCH _PATCHKEY(0x03) - short device; /* Synth# (0-4) */ - int channel; /* Program# to be initialized */ - sbi_instr_data operators; /* Register settings for operator cells (.SBI format) */ - }; - -struct synth_info { /* Read only */ - char name[30]; - int device; /* 0-N. INITIALIZE BEFORE CALLING */ - int synth_type; -#define SYNTH_TYPE_FM 0 -#define SYNTH_TYPE_SAMPLE 1 -#define SYNTH_TYPE_MIDI 2 /* Midi interface */ - - int synth_subtype; -#define FM_TYPE_ADLIB 0x00 -#define FM_TYPE_OPL3 0x01 -#define MIDI_TYPE_MPU401 0x401 - -#define SAMPLE_TYPE_BASIC 0x10 -#define SAMPLE_TYPE_GUS SAMPLE_TYPE_BASIC -#define SAMPLE_TYPE_WAVEFRONT 0x11 - - int perc_mode; /* No longer supported */ - int nr_voices; - int nr_drums; /* Obsolete field */ - int instr_bank_size; - unsigned int capabilities; -#define SYNTH_CAP_PERCMODE 0x00000001 /* No longer used */ -#define SYNTH_CAP_OPL3 0x00000002 /* Set if OPL3 supported */ -#define SYNTH_CAP_INPUT 0x00000004 /* Input (MIDI) device */ - int dummies[19]; /* Reserve space */ - }; - -struct sound_timer_info { - char name[32]; - int caps; - }; - -#define MIDI_CAP_MPU401 1 /* MPU-401 intelligent mode */ - -struct midi_info { - char name[30]; - int device; /* 0-N. INITIALIZE BEFORE CALLING */ - unsigned int capabilities; /* To be defined later */ - int dev_type; - int dummies[18]; /* Reserve space */ - }; - -/******************************************** - * ioctl commands for the /dev/midi## - */ -typedef struct { - unsigned char cmd; - char nr_args, nr_returns; - unsigned char data[30]; - } mpu_command_rec; - -#define SNDCTL_MIDI_PRETIME _SIOWR('m', 0, int) -#define SNDCTL_MIDI_MPUMODE _SIOWR('m', 1, int) -#define SNDCTL_MIDI_MPUCMD _SIOWR('m', 2, mpu_command_rec) - -/******************************************** - * IOCTL commands for /dev/dsp and /dev/audio - */ - -#define SNDCTL_DSP_RESET _SIO ('P', 0) -#define SNDCTL_DSP_SYNC _SIO ('P', 1) -#define SNDCTL_DSP_SPEED _SIOWR('P', 2, int) -#define SNDCTL_DSP_STEREO _SIOWR('P', 3, int) -#define SNDCTL_DSP_GETBLKSIZE _SIOWR('P', 4, int) -#define SNDCTL_DSP_SAMPLESIZE SNDCTL_DSP_SETFMT -#define SNDCTL_DSP_CHANNELS _SIOWR('P', 6, int) -#define SOUND_PCM_WRITE_CHANNELS SNDCTL_DSP_CHANNELS -#define SOUND_PCM_WRITE_FILTER _SIOWR('P', 7, int) -#define SNDCTL_DSP_POST _SIO ('P', 8) -#define SNDCTL_DSP_SUBDIVIDE _SIOWR('P', 9, int) -#define SNDCTL_DSP_SETFRAGMENT _SIOWR('P',10, int) - -/* Audio data formats (Note! U8=8 and S16_LE=16 for compatibility) */ -#define SNDCTL_DSP_GETFMTS _SIOR ('P',11, int) /* Returns a mask */ -#define SNDCTL_DSP_SETFMT _SIOWR('P',5, int) /* Selects ONE fmt*/ -# define AFMT_QUERY 0x00000000 /* Return current fmt */ -# define AFMT_MU_LAW 0x00000001 -# define AFMT_A_LAW 0x00000002 -# define AFMT_IMA_ADPCM 0x00000004 -# define AFMT_U8 0x00000008 -# define AFMT_S16_LE 0x00000010 /* Little endian signed 16*/ -# define AFMT_S16_BE 0x00000020 /* Big endian signed 16 */ -# define AFMT_S8 0x00000040 -# define AFMT_U16_LE 0x00000080 /* Little endian U16 */ -# define AFMT_U16_BE 0x00000100 /* Big endian U16 */ -# define AFMT_MPEG 0x00000200 /* MPEG (2) audio */ -# define AFMT_AC3 0x00000400 /* Dolby Digital AC3 */ - -/* - * Buffer status queries. - */ -typedef struct audio_buf_info { - int fragments; /* # of available fragments (partially usend ones not counted) */ - int fragstotal; /* Total # of fragments allocated */ - int fragsize; /* Size of a fragment in bytes */ - - int bytes; /* Available space in bytes (includes partially used fragments) */ - /* Note! 'bytes' could be more than fragments*fragsize */ - } audio_buf_info; - -#define SNDCTL_DSP_GETOSPACE _SIOR ('P',12, audio_buf_info) -#define SNDCTL_DSP_GETISPACE _SIOR ('P',13, audio_buf_info) -#define SNDCTL_DSP_NONBLOCK _SIO ('P',14) -#define SNDCTL_DSP_GETCAPS _SIOR ('P',15, int) -# define DSP_CAP_REVISION 0x000000ff /* Bits for revision level (0 to 255) */ -# define DSP_CAP_DUPLEX 0x00000100 /* Full duplex record/playback */ -# define DSP_CAP_REALTIME 0x00000200 /* Real time capability */ -# define DSP_CAP_BATCH 0x00000400 /* Device has some kind of */ - /* internal buffers which may */ - /* cause some delays and */ - /* decrease precision of timing */ -# define DSP_CAP_COPROC 0x00000800 /* Has a coprocessor */ - /* Sometimes it's a DSP */ - /* but usually not */ -# define DSP_CAP_TRIGGER 0x00001000 /* Supports SETTRIGGER */ -# define DSP_CAP_MMAP 0x00002000 /* Supports mmap() */ -# define DSP_CAP_MULTI 0x00004000 /* support multiple open */ -# define DSP_CAP_BIND 0x00008000 /* channel binding to front/rear/cneter/lfe */ - - -#define SNDCTL_DSP_GETTRIGGER _SIOR ('P',16, int) -#define SNDCTL_DSP_SETTRIGGER _SIOW ('P',16, int) -# define PCM_ENABLE_INPUT 0x00000001 -# define PCM_ENABLE_OUTPUT 0x00000002 - -typedef struct count_info { - int bytes; /* Total # of bytes processed */ - int blocks; /* # of fragment transitions since last time */ - int ptr; /* Current DMA pointer value */ - } count_info; - -#define SNDCTL_DSP_GETIPTR _SIOR ('P',17, count_info) -#define SNDCTL_DSP_GETOPTR _SIOR ('P',18, count_info) - -typedef struct buffmem_desc { - unsigned *buffer; - int size; - } buffmem_desc; -#define SNDCTL_DSP_MAPINBUF _SIOR ('P', 19, buffmem_desc) -#define SNDCTL_DSP_MAPOUTBUF _SIOR ('P', 20, buffmem_desc) -#define SNDCTL_DSP_SETSYNCRO _SIO ('P', 21) -#define SNDCTL_DSP_SETDUPLEX _SIO ('P', 22) -#define SNDCTL_DSP_GETODELAY _SIOR ('P', 23, int) - -#define SNDCTL_DSP_GETCHANNELMASK _SIOWR('P', 64, int) -#define SNDCTL_DSP_BIND_CHANNEL _SIOWR('P', 65, int) -# define DSP_BIND_QUERY 0x00000000 -# define DSP_BIND_FRONT 0x00000001 -# define DSP_BIND_SURR 0x00000002 -# define DSP_BIND_CENTER_LFE 0x00000004 -# define DSP_BIND_HANDSET 0x00000008 -# define DSP_BIND_MIC 0x00000010 -# define DSP_BIND_MODEM1 0x00000020 -# define DSP_BIND_MODEM2 0x00000040 -# define DSP_BIND_I2S 0x00000080 -# define DSP_BIND_SPDIF 0x00000100 - -/* - * Application's profile defines the way how playback underrun situations should be handled. - * - * APF_NORMAL (the default) and APF_NETWORK make the driver to cleanup the - * playback buffer whenever an underrun occurs. This consumes some time - * prevents looping the existing buffer. - * APF_CPUINTENS is intended to be set by CPU intensive applications which - * are likely to run out of time occasionally. In this mode the buffer cleanup is - * disabled which saves CPU time but also let's the previous buffer content to - * be played during the "pause" after the underrun. - */ -#define SNDCTL_DSP_PROFILE _SIOW ('P', 23, int) -#define APF_NORMAL 0 /* Normal applications */ -#define APF_NETWORK 1 /* Underruns probably caused by an "external" delay */ -#define APF_CPUINTENS 2 /* Underruns probably caused by "overheating" the CPU */ - -#define SOUND_PCM_READ_RATE _SIOR ('P', 2, int) -#define SOUND_PCM_READ_CHANNELS _SIOR ('P', 6, int) -#define SOUND_PCM_READ_BITS _SIOR ('P', 5, int) -#define SOUND_PCM_READ_FILTER _SIOR ('P', 7, int) - -/* Some alias names */ -#define SOUND_PCM_WRITE_BITS SNDCTL_DSP_SETFMT -#define SOUND_PCM_WRITE_RATE SNDCTL_DSP_SPEED -#define SOUND_PCM_POST SNDCTL_DSP_POST -#define SOUND_PCM_RESET SNDCTL_DSP_RESET -#define SOUND_PCM_SYNC SNDCTL_DSP_SYNC -#define SOUND_PCM_SUBDIVIDE SNDCTL_DSP_SUBDIVIDE -#define SOUND_PCM_SETFRAGMENT SNDCTL_DSP_SETFRAGMENT -#define SOUND_PCM_GETFMTS SNDCTL_DSP_GETFMTS -#define SOUND_PCM_SETFMT SNDCTL_DSP_SETFMT -#define SOUND_PCM_GETOSPACE SNDCTL_DSP_GETOSPACE -#define SOUND_PCM_GETISPACE SNDCTL_DSP_GETISPACE -#define SOUND_PCM_NONBLOCK SNDCTL_DSP_NONBLOCK -#define SOUND_PCM_GETCAPS SNDCTL_DSP_GETCAPS -#define SOUND_PCM_GETTRIGGER SNDCTL_DSP_GETTRIGGER -#define SOUND_PCM_SETTRIGGER SNDCTL_DSP_SETTRIGGER -#define SOUND_PCM_SETSYNCRO SNDCTL_DSP_SETSYNCRO -#define SOUND_PCM_GETIPTR SNDCTL_DSP_GETIPTR -#define SOUND_PCM_GETOPTR SNDCTL_DSP_GETOPTR -#define SOUND_PCM_MAPINBUF SNDCTL_DSP_MAPINBUF -#define SOUND_PCM_MAPOUTBUF SNDCTL_DSP_MAPOUTBUF - -/* - * ioctl calls to be used in communication with coprocessors and - * DSP chips. - */ - -typedef struct copr_buffer { - int command; /* Set to 0 if not used */ - int flags; -#define CPF_NONE 0x0000 -#define CPF_FIRST 0x0001 /* First block */ -#define CPF_LAST 0x0002 /* Last block */ - int len; - int offs; /* If required by the device (0 if not used) */ - - unsigned char data[4000]; /* NOTE! 4000 is not 4k */ - } copr_buffer; - -typedef struct copr_debug_buf { - int command; /* Used internally. Set to 0 */ - int parm1; - int parm2; - int flags; - int len; /* Length of data in bytes */ - } copr_debug_buf; - -typedef struct copr_msg { - int len; - unsigned char data[4000]; - } copr_msg; - -#define SNDCTL_COPR_RESET _SIO ('C', 0) -#define SNDCTL_COPR_LOAD _SIOWR('C', 1, copr_buffer) -#define SNDCTL_COPR_RDATA _SIOWR('C', 2, copr_debug_buf) -#define SNDCTL_COPR_RCODE _SIOWR('C', 3, copr_debug_buf) -#define SNDCTL_COPR_WDATA _SIOW ('C', 4, copr_debug_buf) -#define SNDCTL_COPR_WCODE _SIOW ('C', 5, copr_debug_buf) -#define SNDCTL_COPR_RUN _SIOWR('C', 6, copr_debug_buf) -#define SNDCTL_COPR_HALT _SIOWR('C', 7, copr_debug_buf) -#define SNDCTL_COPR_SENDMSG _SIOWR('C', 8, copr_msg) -#define SNDCTL_COPR_RCVMSG _SIOR ('C', 9, copr_msg) - -/********************************************* - * IOCTL commands for /dev/mixer - */ - -/* - * Mixer devices - * - * There can be up to 20 different analog mixer channels. The - * SOUND_MIXER_NRDEVICES gives the currently supported maximum. - * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells - * the devices supported by the particular mixer. - */ - -#define SOUND_MIXER_NRDEVICES 25 -#define SOUND_MIXER_VOLUME 0 -#define SOUND_MIXER_BASS 1 -#define SOUND_MIXER_TREBLE 2 -#define SOUND_MIXER_SYNTH 3 -#define SOUND_MIXER_PCM 4 -#define SOUND_MIXER_SPEAKER 5 -#define SOUND_MIXER_LINE 6 -#define SOUND_MIXER_MIC 7 -#define SOUND_MIXER_CD 8 -#define SOUND_MIXER_IMIX 9 /* Recording monitor */ -#define SOUND_MIXER_ALTPCM 10 -#define SOUND_MIXER_RECLEV 11 /* Recording level */ -#define SOUND_MIXER_IGAIN 12 /* Input gain */ -#define SOUND_MIXER_OGAIN 13 /* Output gain */ -/* - * The AD1848 codec and compatibles have three line level inputs - * (line, aux1 and aux2). Since each card manufacturer have assigned - * different meanings to these inputs, it's inpractical to assign - * specific meanings (line, cd, synth etc.) to them. - */ -#define SOUND_MIXER_LINE1 14 /* Input source 1 (aux1) */ -#define SOUND_MIXER_LINE2 15 /* Input source 2 (aux2) */ -#define SOUND_MIXER_LINE3 16 /* Input source 3 (line) */ -#define SOUND_MIXER_DIGITAL1 17 /* Digital (input) 1 */ -#define SOUND_MIXER_DIGITAL2 18 /* Digital (input) 2 */ -#define SOUND_MIXER_DIGITAL3 19 /* Digital (input) 3 */ -#define SOUND_MIXER_PHONEIN 20 /* Phone input */ -#define SOUND_MIXER_PHONEOUT 21 /* Phone output */ -#define SOUND_MIXER_VIDEO 22 /* Video/TV (audio) in */ -#define SOUND_MIXER_RADIO 23 /* Radio in */ -#define SOUND_MIXER_MONITOR 24 /* Monitor (usually mic) volume */ - -/* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) */ -/* Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */ -#define SOUND_ONOFF_MIN 28 -#define SOUND_ONOFF_MAX 30 - -/* Note! Number 31 cannot be used since the sign bit is reserved */ -#define SOUND_MIXER_NONE 31 - -/* - * The following unsupported macros are no longer functional. - * Use SOUND_MIXER_PRIVATE# macros in future. - */ -#define SOUND_MIXER_ENHANCE SOUND_MIXER_NONE -#define SOUND_MIXER_MUTE SOUND_MIXER_NONE -#define SOUND_MIXER_LOUD SOUND_MIXER_NONE - - -#define SOUND_DEVICE_LABELS {"Vol ", "Bass ", "Trebl", "Synth", "Pcm ", "Spkr ", "Line ", \ - "Mic ", "CD ", "Mix ", "Pcm2 ", "Rec ", "IGain", "OGain", \ - "Line1", "Line2", "Line3", "Digital1", "Digital2", "Digital3", \ - "PhoneIn", "PhoneOut", "Video", "Radio", "Monitor"} - -#define SOUND_DEVICE_NAMES {"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \ - "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \ - "line1", "line2", "line3", "dig1", "dig2", "dig3", \ - "phin", "phout", "video", "radio", "monitor"} - -/* Device bitmask identifiers */ - -#define SOUND_MIXER_RECSRC 0xff /* Arg contains a bit for each recording source */ -#define SOUND_MIXER_DEVMASK 0xfe /* Arg contains a bit for each supported device */ -#define SOUND_MIXER_RECMASK 0xfd /* Arg contains a bit for each supported recording source */ -#define SOUND_MIXER_CAPS 0xfc -# define SOUND_CAP_EXCL_INPUT 0x00000001 /* Only one recording source at a time */ -#define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo */ -#define SOUND_MIXER_OUTSRC 0xfa /* Arg contains a bit for each input source to output */ -#define SOUND_MIXER_OUTMASK 0xf9 /* Arg contains a bit for each supported input source to output */ - -/* Device mask bits */ - -#define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME) -#define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS) -#define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE) -#define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH) -#define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM) -#define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER) -#define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE) -#define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC) -#define SOUND_MASK_CD (1 << SOUND_MIXER_CD) -#define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX) -#define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM) -#define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV) -#define SOUND_MASK_IGAIN (1 << SOUND_MIXER_IGAIN) -#define SOUND_MASK_OGAIN (1 << SOUND_MIXER_OGAIN) -#define SOUND_MASK_LINE1 (1 << SOUND_MIXER_LINE1) -#define SOUND_MASK_LINE2 (1 << SOUND_MIXER_LINE2) -#define SOUND_MASK_LINE3 (1 << SOUND_MIXER_LINE3) -#define SOUND_MASK_DIGITAL1 (1 << SOUND_MIXER_DIGITAL1) -#define SOUND_MASK_DIGITAL2 (1 << SOUND_MIXER_DIGITAL2) -#define SOUND_MASK_DIGITAL3 (1 << SOUND_MIXER_DIGITAL3) -#define SOUND_MASK_PHONEIN (1 << SOUND_MIXER_PHONEIN) -#define SOUND_MASK_PHONEOUT (1 << SOUND_MIXER_PHONEOUT) -#define SOUND_MASK_RADIO (1 << SOUND_MIXER_RADIO) -#define SOUND_MASK_VIDEO (1 << SOUND_MIXER_VIDEO) -#define SOUND_MASK_MONITOR (1 << SOUND_MIXER_MONITOR) - -/* Obsolete macros */ -#define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE) -#define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE) -#define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD) - -#define MIXER_READ(dev) _SIOR('M', dev, int) -#define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME) -#define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS) -#define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE) -#define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH) -#define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM) -#define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER) -#define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE) -#define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC) -#define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD) -#define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX) -#define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM) -#define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV) -#define SOUND_MIXER_READ_IGAIN MIXER_READ(SOUND_MIXER_IGAIN) -#define SOUND_MIXER_READ_OGAIN MIXER_READ(SOUND_MIXER_OGAIN) -#define SOUND_MIXER_READ_LINE1 MIXER_READ(SOUND_MIXER_LINE1) -#define SOUND_MIXER_READ_LINE2 MIXER_READ(SOUND_MIXER_LINE2) -#define SOUND_MIXER_READ_LINE3 MIXER_READ(SOUND_MIXER_LINE3) - -/* Obsolete macros */ -#define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE) -#define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE) -#define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD) - -#define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC) -#define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK) -#define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK) -#define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS) -#define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS) - -#define MIXER_WRITE(dev) _SIOWR('M', dev, int) -#define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME) -#define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS) -#define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE) -#define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH) -#define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM) -#define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER) -#define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE) -#define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC) -#define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD) -#define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX) -#define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM) -#define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV) -#define SOUND_MIXER_WRITE_IGAIN MIXER_WRITE(SOUND_MIXER_IGAIN) -#define SOUND_MIXER_WRITE_OGAIN MIXER_WRITE(SOUND_MIXER_OGAIN) -#define SOUND_MIXER_WRITE_LINE1 MIXER_WRITE(SOUND_MIXER_LINE1) -#define SOUND_MIXER_WRITE_LINE2 MIXER_WRITE(SOUND_MIXER_LINE2) -#define SOUND_MIXER_WRITE_LINE3 MIXER_WRITE(SOUND_MIXER_LINE3) - -/* Obsolete macros */ -#define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE) -#define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE) -#define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD) - -#define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC) - -typedef struct mixer_info -{ - char id[16]; - char name[32]; - int modify_counter; - int fillers[10]; -} mixer_info; - -typedef struct _old_mixer_info /* Obsolete */ -{ - char id[16]; - char name[32]; -} _old_mixer_info; - -#define SOUND_MIXER_INFO _SIOR ('M', 101, mixer_info) -#define SOUND_OLD_MIXER_INFO _SIOR ('M', 101, _old_mixer_info) - -/* - * A mechanism for accessing "proprietary" mixer features. This method - * permits passing 128 bytes of arbitrary data between a mixer application - * and the mixer driver. Interpretation of the record is defined by - * the particular mixer driver. - */ -typedef unsigned char mixer_record[128]; - -#define SOUND_MIXER_ACCESS _SIOWR('M', 102, mixer_record) - -/* - * Two ioctls for special souncard function - */ -#define SOUND_MIXER_AGC _SIOWR('M', 103, int) -#define SOUND_MIXER_3DSE _SIOWR('M', 104, int) - -/* - * The SOUND_MIXER_PRIVATE# commands can be redefined by low level drivers. - * These features can be used when accessing device specific features. - */ -#define SOUND_MIXER_PRIVATE1 _SIOWR('M', 111, int) -#define SOUND_MIXER_PRIVATE2 _SIOWR('M', 112, int) -#define SOUND_MIXER_PRIVATE3 _SIOWR('M', 113, int) -#define SOUND_MIXER_PRIVATE4 _SIOWR('M', 114, int) -#define SOUND_MIXER_PRIVATE5 _SIOWR('M', 115, int) - -/* - * SOUND_MIXER_GETLEVELS and SOUND_MIXER_SETLEVELS calls can be used - * for querying current mixer settings from the driver and for loading - * default volume settings _prior_ activating the mixer (loading - * doesn't affect current state of the mixer hardware). These calls - * are for internal use only. - */ - -typedef struct mixer_vol_table { - int num; /* Index to volume table */ - char name[32]; - int levels[32]; -} mixer_vol_table; - -#define SOUND_MIXER_GETLEVELS _SIOWR('M', 116, mixer_vol_table) -#define SOUND_MIXER_SETLEVELS _SIOWR('M', 117, mixer_vol_table) - -/* - * An ioctl for identifying the driver version. It will return value - * of the SOUND_VERSION macro used when compiling the driver. - * This call was introduced in OSS version 3.6 and it will not work - * with earlier versions (returns EINVAL). - */ -#define OSS_GETVERSION _SIOR ('M', 118, int) - -/* - * Level 2 event types for /dev/sequencer - */ - -/* - * The 4 most significant bits of byte 0 specify the class of - * the event: - * - * 0x8X = system level events, - * 0x9X = device/port specific events, event[1] = device/port, - * The last 4 bits give the subtype: - * 0x02 = Channel event (event[3] = chn). - * 0x01 = note event (event[4] = note). - * (0x01 is not used alone but always with bit 0x02). - * event[2] = MIDI message code (0x80=note off etc.) - * - */ - -#define EV_SEQ_LOCAL 0x80 -#define EV_TIMING 0x81 -#define EV_CHN_COMMON 0x92 -#define EV_CHN_VOICE 0x93 -#define EV_SYSEX 0x94 -/* - * Event types 200 to 220 are reserved for application use. - * These numbers will not be used by the driver. - */ - -/* - * Events for event type EV_CHN_VOICE - */ - -#define MIDI_NOTEOFF 0x80 -#define MIDI_NOTEON 0x90 -#define MIDI_KEY_PRESSURE 0xA0 - -/* - * Events for event type EV_CHN_COMMON - */ - -#define MIDI_CTL_CHANGE 0xB0 -#define MIDI_PGM_CHANGE 0xC0 -#define MIDI_CHN_PRESSURE 0xD0 -#define MIDI_PITCH_BEND 0xE0 - -#define MIDI_SYSTEM_PREFIX 0xF0 - -/* - * Timer event types - */ -#define TMR_WAIT_REL 1 /* Time relative to the prev time */ -#define TMR_WAIT_ABS 2 /* Absolute time since TMR_START */ -#define TMR_STOP 3 -#define TMR_START 4 -#define TMR_CONTINUE 5 -#define TMR_TEMPO 6 -#define TMR_ECHO 8 -#define TMR_CLOCK 9 /* MIDI clock */ -#define TMR_SPP 10 /* Song position pointer */ -#define TMR_TIMESIG 11 /* Time signature */ - -/* - * Local event types - */ -#define LOCL_STARTAUDIO 1 - -#if (!defined(__KERNEL__) && !defined(KERNEL) && !defined(INKERNEL) && !defined(_KERNEL)) || defined(USE_SEQ_MACROS) -/* - * Some convenience macros to simplify programming of the - * /dev/sequencer interface - * - * These macros define the API which should be used when possible. - */ -#define SEQ_DECLAREBUF() SEQ_USE_EXTBUF() - -void seqbuf_dump(void); /* This function must be provided by programs */ - -extern int OSS_init(int seqfd, int buflen); -extern void OSS_seqbuf_dump(int fd, unsigned char *buf, int buflen); -extern void OSS_seq_advbuf(int len, int fd, unsigned char *buf, int buflen); -extern void OSS_seq_needbuf(int len, int fd, unsigned char *buf, int buflen); -extern void OSS_patch_caching(int dev, int chn, int patch, - int fd, unsigned char *buf, int buflen); -extern void OSS_drum_caching(int dev, int chn, int patch, - int fd, unsigned char *buf, int buflen); -extern void OSS_write_patch(int fd, unsigned char *buf, int len); -extern int OSS_write_patch2(int fd, unsigned char *buf, int len); - -#define SEQ_PM_DEFINES int __foo_bar___ -#ifdef OSSLIB -# define SEQ_USE_EXTBUF() \ - extern unsigned char *_seqbuf; \ - extern int _seqbuflen;extern int _seqbufptr -# define SEQ_DEFINEBUF(len) SEQ_USE_EXTBUF();static int _requested_seqbuflen=len -# define _SEQ_ADVBUF(len) OSS_seq_advbuf(len, seqfd, _seqbuf, _seqbuflen) -# define _SEQ_NEEDBUF(len) OSS_seq_needbuf(len, seqfd, _seqbuf, _seqbuflen) -# define SEQ_DUMPBUF() OSS_seqbuf_dump(seqfd, _seqbuf, _seqbuflen) - -# define SEQ_LOAD_GMINSTR(dev, instr) \ - OSS_patch_caching(dev, -1, instr, seqfd, _seqbuf, _seqbuflen) -# define SEQ_LOAD_GMDRUM(dev, drum) \ - OSS_drum_caching(dev, -1, drum, seqfd, _seqbuf, _seqbuflen) -#else /* !OSSLIB */ - -# define SEQ_LOAD_GMINSTR(dev, instr) -# define SEQ_LOAD_GMDRUM(dev, drum) - -# define SEQ_USE_EXTBUF() \ - extern unsigned char _seqbuf[]; \ - extern int _seqbuflen;extern int _seqbufptr - -#ifndef USE_SIMPLE_MACROS -/* Sample seqbuf_dump() implementation: - * - * SEQ_DEFINEBUF (2048); -- Defines a buffer for 2048 bytes - * - * int seqfd; -- The file descriptor for /dev/sequencer. - * - * void - * seqbuf_dump () - * { - * if (_seqbufptr) - * if (write (seqfd, _seqbuf, _seqbufptr) == -1) - * { - * perror ("write /dev/sequencer"); - * exit (-1); - * } - * _seqbufptr = 0; - * } - */ - -#define SEQ_DEFINEBUF(len) unsigned char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 0 -#define _SEQ_NEEDBUF(len) if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump() -#define _SEQ_ADVBUF(len) _seqbufptr += len -#define SEQ_DUMPBUF seqbuf_dump -#else -/* - * This variation of the sequencer macros is used just to format one event - * using fixed buffer. - * - * The program using the macro library must define the following macros before - * using this library. - * - * #define _seqbuf name of the buffer (unsigned char[]) - * #define _SEQ_ADVBUF(len) If the applic needs to know the exact - * size of the event, this macro can be used. - * Otherwise this must be defined as empty. - * #define _seqbufptr Define the name of index variable or 0 if - * not required. - */ -#define _SEQ_NEEDBUF(len) /* empty */ -#endif -#endif /* !OSSLIB */ - -#define SEQ_VOLUME_MODE(dev, mode) {_SEQ_NEEDBUF(8);\ - _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ - _seqbuf[_seqbufptr+1] = SEQ_VOLMODE;\ - _seqbuf[_seqbufptr+2] = (dev);\ - _seqbuf[_seqbufptr+3] = (mode);\ - _seqbuf[_seqbufptr+4] = 0;\ - _seqbuf[_seqbufptr+5] = 0;\ - _seqbuf[_seqbufptr+6] = 0;\ - _seqbuf[_seqbufptr+7] = 0;\ - _SEQ_ADVBUF(8);} - -/* - * Midi voice messages - */ - -#define _CHN_VOICE(dev, event, chn, note, parm) \ - {_SEQ_NEEDBUF(8);\ - _seqbuf[_seqbufptr] = EV_CHN_VOICE;\ - _seqbuf[_seqbufptr+1] = (dev);\ - _seqbuf[_seqbufptr+2] = (event);\ - _seqbuf[_seqbufptr+3] = (chn);\ - _seqbuf[_seqbufptr+4] = (note);\ - _seqbuf[_seqbufptr+5] = (parm);\ - _seqbuf[_seqbufptr+6] = (0);\ - _seqbuf[_seqbufptr+7] = 0;\ - _SEQ_ADVBUF(8);} - -#define SEQ_START_NOTE(dev, chn, note, vol) \ - _CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol) - -#define SEQ_STOP_NOTE(dev, chn, note, vol) \ - _CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol) - -#define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \ - _CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure) - -/* - * Midi channel messages - */ - -#define _CHN_COMMON(dev, event, chn, p1, p2, w14) \ - {_SEQ_NEEDBUF(8);\ - _seqbuf[_seqbufptr] = EV_CHN_COMMON;\ - _seqbuf[_seqbufptr+1] = (dev);\ - _seqbuf[_seqbufptr+2] = (event);\ - _seqbuf[_seqbufptr+3] = (chn);\ - _seqbuf[_seqbufptr+4] = (p1);\ - _seqbuf[_seqbufptr+5] = (p2);\ - *(short *)&_seqbuf[_seqbufptr+6] = (w14);\ - _SEQ_ADVBUF(8);} -/* - * SEQ_SYSEX permits sending of sysex messages. (It may look that it permits - * sending any MIDI bytes but it's absolutely not possible. Trying to do - * so _will_ cause problems with MPU401 intelligent mode). - * - * Sysex messages are sent in blocks of 1 to 6 bytes. Longer messages must be - * sent by calling SEQ_SYSEX() several times (there must be no other events - * between them). First sysex fragment must have 0xf0 in the first byte - * and the last byte (buf[len-1] of the last fragment must be 0xf7. No byte - * between these sysex start and end markers cannot be larger than 0x7f. Also - * lengths of each fragments (except the last one) must be 6. - * - * Breaking the above rules may work with some MIDI ports but is likely to - * cause fatal problems with some other devices (such as MPU401). - */ -#define SEQ_SYSEX(dev, buf, len) \ - {int ii, ll=(len); \ - unsigned char *bufp=buf;\ - if (ll>6)ll=6;\ - _SEQ_NEEDBUF(8);\ - _seqbuf[_seqbufptr] = EV_SYSEX;\ - _seqbuf[_seqbufptr+1] = (dev);\ - for(ii=0;ii>8)&0xff);\ - _seqbuf[_seqbufptr+7] = 0;\ - _SEQ_ADVBUF(8);} -/* - * The following 5 macros are incorrectly implemented and obsolete. - * Use SEQ_BENDER and SEQ_CONTROL (with proper controller) instead. - */ -#define SEQ_PITCHBEND(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER, value) -#define SEQ_BENDER_RANGE(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value) -#define SEQ_EXPRESSION(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_EXPRESSION, value*128) -#define SEQ_MAIN_VOLUME(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_MAIN_VOLUME, (value*16383)/100) -#define SEQ_PANNING(dev, voice, pos) SEQ_CONTROL(dev, voice, CTL_PAN, (pos+128) / 2) - -/* - * Timing and syncronization macros - */ - -#define _TIMER_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\ - _seqbuf[_seqbufptr+0] = EV_TIMING; \ - _seqbuf[_seqbufptr+1] = (ev); \ - _seqbuf[_seqbufptr+2] = 0;\ - _seqbuf[_seqbufptr+3] = 0;\ - *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \ - _SEQ_ADVBUF(8);} - -#define SEQ_START_TIMER() _TIMER_EVENT(TMR_START, 0) -#define SEQ_STOP_TIMER() _TIMER_EVENT(TMR_STOP, 0) -#define SEQ_CONTINUE_TIMER() _TIMER_EVENT(TMR_CONTINUE, 0) -#define SEQ_WAIT_TIME(ticks) _TIMER_EVENT(TMR_WAIT_ABS, ticks) -#define SEQ_DELTA_TIME(ticks) _TIMER_EVENT(TMR_WAIT_REL, ticks) -#define SEQ_ECHO_BACK(key) _TIMER_EVENT(TMR_ECHO, key) -#define SEQ_SET_TEMPO(value) _TIMER_EVENT(TMR_TEMPO, value) -#define SEQ_SONGPOS(pos) _TIMER_EVENT(TMR_SPP, pos) -#define SEQ_TIME_SIGNATURE(sig) _TIMER_EVENT(TMR_TIMESIG, sig) - -/* - * Local control events - */ - -#define _LOCAL_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\ - _seqbuf[_seqbufptr+0] = EV_SEQ_LOCAL; \ - _seqbuf[_seqbufptr+1] = (ev); \ - _seqbuf[_seqbufptr+2] = 0;\ - _seqbuf[_seqbufptr+3] = 0;\ - *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \ - _SEQ_ADVBUF(8);} - -#define SEQ_PLAYAUDIO(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO, devmask) -/* - * Events for the level 1 interface only - */ - -#define SEQ_MIDIOUT(device, byte) {_SEQ_NEEDBUF(4);\ - _seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\ - _seqbuf[_seqbufptr+1] = (byte);\ - _seqbuf[_seqbufptr+2] = (device);\ - _seqbuf[_seqbufptr+3] = 0;\ - _SEQ_ADVBUF(4);} - -/* - * Patch loading. - */ -#ifdef OSSLIB -# define SEQ_WRPATCH(patchx, len) \ - OSS_write_patch(seqfd, (char*)(patchx), len) -# define SEQ_WRPATCH2(patchx, len) \ - OSS_write_patch2(seqfd, (char*)(patchx), len) -#else -# define SEQ_WRPATCH(patchx, len) \ - {if (_seqbufptr) SEQ_DUMPBUF();\ - if (write(seqfd, (char*)(patchx), len)==-1) \ - perror("Write patch: /dev/sequencer");} -# define SEQ_WRPATCH2(patchx, len) \ - (SEQ_DUMPBUF(), write(seqfd, (char*)(patchx), len)) -#endif - -#endif -#endif diff --git a/winsup/cygwin/include/sys/statfs.h b/winsup/cygwin/include/sys/statfs.h deleted file mode 100644 index 51ad3c6b1..000000000 --- a/winsup/cygwin/include/sys/statfs.h +++ /dev/null @@ -1,11 +0,0 @@ -/* sys/statfs.h - - Copyright 2002 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include diff --git a/winsup/cygwin/include/sys/statvfs.h b/winsup/cygwin/include/sys/statvfs.h deleted file mode 100644 index aa86674af..000000000 --- a/winsup/cygwin/include/sys/statvfs.h +++ /dev/null @@ -1,44 +0,0 @@ -/* sys/statvfs.h - - Copyright 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_STATVFS_H_ -#define _SYS_STATVFS_H_ - -#include - -#define ST_RDONLY 0x80000 /* equals FILE_READ_ONLY_VOLUME */ -#define ST_NOSUID 0 /* Looking for that bit should always fail. */ - -struct statvfs { - unsigned long f_bsize; /* file system block size */ - unsigned long f_frsize; /* fragment size */ - fsblkcnt_t f_blocks; /* size of fs in f_frsize units */ - fsblkcnt_t f_bfree; /* free blocks in fs */ - fsblkcnt_t f_bavail; /* free blocks avail to non-superuser */ - fsfilcnt_t f_files; /* total file nodes in file system */ - fsfilcnt_t f_ffree; /* free file nodes in fs */ - fsfilcnt_t f_favail; /* avail file nodes in fs */ - unsigned long f_fsid; /* file system id */ - unsigned long f_flag; /* mount flags */ - unsigned long f_namemax; /* maximum length of filenames */ -}; - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -int statvfs (const char *__path, struct statvfs *__buf); -int fstatvfs (int __fd, struct statvfs *__buf); - -#ifdef __cplusplus -}; -#endif /* __cplusplus */ - -#endif /*_SYS_STATVFS_H_*/ diff --git a/winsup/cygwin/include/sys/stdio.h b/winsup/cygwin/include/sys/stdio.h deleted file mode 100644 index 7cc6f09f1..000000000 --- a/winsup/cygwin/include/sys/stdio.h +++ /dev/null @@ -1,38 +0,0 @@ -/* sys/stdio.h - - Copyright 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_STDIO_H_ -#define _SYS_STDIO_H_ - -#include -#include - -#if !defined(__SINGLE_THREAD__) -# if !defined(_flockfile) -# define _flockfile(fp) __cygwin_lock_lock ((_LOCK_T *)&(fp)->_lock) -# endif -# if !defined(_ftrylockfile) -# define _ftrylockfile(fp) __cygwin_lock_trylock ((_LOCK_T *)&(fp)->_lock) -# endif -# if !defined(_funlockfile) -# define _funlockfile(fp) __cygwin_lock_unlock ((_LOCK_T *)&(fp)->_lock) -# endif -#endif - -__BEGIN_DECLS - -#ifdef _GNU_SOURCE -ssize_t _EXFUN(getline, (char **, size_t *, FILE *)); -ssize_t _EXFUN(getdelim, (char **, size_t *, int, FILE *)); -#endif /* _GNU_SOURCE */ - -__END_DECLS - -#endif diff --git a/winsup/cygwin/include/sys/strace.h b/winsup/cygwin/include/sys/strace.h deleted file mode 100644 index 9b9da1743..000000000 --- a/winsup/cygwin/include/sys/strace.h +++ /dev/null @@ -1,155 +0,0 @@ -/* sys/strace.h - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* This file contains routines for tracing system calls and other internal - phenomenon. - - When tracing system calls, try to use the same style throughout: - - result = syscall (arg1, arg2, arg3) [optional extra stuff] - - If a system call can block (eg: read, write, wait), print another message - before hanging so the user will know why the program has stopped. - - Note: __seterrno will also print a trace message. Have that printed - *first*. This will make it easy to always know what __seterrno is - refering to. For the same reason, try not to have __seterrno messages - printed alone. -*/ - -#ifndef _SYS_STRACE_H -#define _SYS_STRACE_H - -#include - -#ifdef __cplusplus - -class child_info; -class strace -{ - int vsprntf (char *buf, const char *func, const char *infmt, va_list ap); - void write (unsigned category, const char *buf, int count); - unsigned char _active; -public: - int microseconds (); - int version; - int lmicrosec; - bool execing; - void hello () __attribute__ ((regparm (1))); - void prntf (unsigned, const char *func, const char *, ...) /*__attribute__ ((regparm(3)))*/; - void vprntf (unsigned, const char *func, const char *, va_list ap) /*__attribute__ ((regparm(3)))*/; - void wm (int message, int word, int lon) __attribute__ ((regparm(3))); - void write_childpid (child_info&, unsigned long) __attribute__ ((regparm (2))); - bool attached () const {return _active == 3;} - bool active () const {return _active & 1;} - unsigned char& active_val () {return _active;} -}; - -extern strace strace; - -#endif /* __cplusplus */ - -#define _STRACE_INTERFACE_ACTIVATE_ADDR -1 -#define _STRACE_INTERFACE_ACTIVATE_ADDR1 -2 -#define _STRACE_CHILD_PID -3 - -/* Bitmasks of tracing messages to print. */ - -#define _STRACE_ALL 0x00001 // so behaviour of strace=1 is unchanged -#define _STRACE_FLUSH 0x00002 // flush output buffer after every message -#define _STRACE_INHERIT 0x00004 // children inherit mask from parent -#define _STRACE_UHOH 0x00008 // unusual or weird phenomenon -#define _STRACE_SYSCALL 0x00010 // system calls -#define _STRACE_STARTUP 0x00020 // argc/envp printout at startup -#define _STRACE_DEBUG 0x00040 // info to help debugging -#define _STRACE_PARANOID 0x00080 // paranoid info -#define _STRACE_TERMIOS 0x00100 // info for debugging termios stuff -#define _STRACE_SELECT 0x00200 // info on ugly select internals -#define _STRACE_WM 0x00400 // trace windows messages (enable _strace_wm) -#define _STRACE_SIGP 0x00800 // trace signal and process handling -#define _STRACE_MINIMAL 0x01000 // very minimal strace output -#define _STRACE_EXITDUMP 0x04000 // dump strace cache on exit -#define _STRACE_SYSTEM 0x08000 // cache strace messages -#define _STRACE_NOMUTEX 0x10000 // don't use mutex for synchronization -#define _STRACE_MALLOC 0x20000 // trace malloc calls -#define _STRACE_THREAD 0x40000 // thread-locking calls -#define _STRACE_NOTALL 0x80000 // don't include if _STRACE_ALL - -#ifdef __cplusplus -extern "C" { -#endif - -void small_printf (const char *, ...); -void strace_printf (unsigned, const char *func, const char *, ...); - -#ifdef __cplusplus -} -#endif - -#ifdef __cplusplus - -#ifdef NOSTRACE -#define define_strace(c, f) -#define define_strace1(c, f) -#else -#ifdef NEW_MACRO_VARARGS -/* Output message to strace log */ - -#define define_strace0(c,...) \ - do { \ - if ((c & _STRACE_SYSTEM) || strace.active ()) \ - strace.prntf (c, __PRETTY_FUNCTION__, __VA_ARGS__); \ - } \ - while (0) - -#define define_strace(c, ...) define_strace0 (_STRACE_ ## c, __VA_ARGS__) -#define define_strace1(c, ...) define_strace0 ((_STRACE_ ## c | _STRACE_NOTALL), __VA_ARGS__) - -#define debug_printf(...) define_strace (DEBUG, __VA_ARGS__) -#define paranoid_printf(...) define_strace1 (PARANOID, __VA_ARGS__) -#define select_printf(...) define_strace (SELECT, __VA_ARGS__) -#define sigproc_printf(...) define_strace (SIGP, __VA_ARGS__) -#define syscall_printf(...) define_strace (SYSCALL, __VA_ARGS__) -#define system_printf(...) define_strace (SYSTEM, __VA_ARGS__) -#define termios_printf(...) define_strace (TERMIOS, __VA_ARGS__) -#define wm_printf(...) define_strace (WM, __VA_ARGS__) -#define minimal_printf(...) define_strace1 (MINIMAL, __VA_ARGS__) -#define malloc_printf(...) define_strace1 (MALLOC, __VA_ARGS__) -#define thread_printf(...) define_strace1 (THREAD, __VA_ARGS__) -#else -#define strace_printf_wrap(what, fmt, args...) \ - ((void) ({\ - if ((_STRACE_ ## what & _STRACE_SYSTEM) || strace.active ()) \ - strace.prntf(_STRACE_ ## what, __PRETTY_FUNCTION__, fmt, ## args); \ - 0; \ - })) -#define strace_printf_wrap1(what, fmt, args...) \ - ((void) ({\ - if ((_STRACE_ ## what & _STRACE_SYSTEM) || strace.active ()) \ - strace.prntf((_STRACE_ ## what) | _STRACE_NOTALL, __PRETTY_FUNCTION__, fmt, ## args); \ - 0; \ - })) - -#define debug_printf(fmt, args...) strace_printf_wrap(DEBUG, fmt , ## args) -#define paranoid_printf(fmt, args...) strace_printf_wrap1(PARANOID, fmt , ## args) -#define select_printf(fmt, args...) strace_printf_wrap(SELECT, fmt , ## args) -#define sigproc_printf(fmt, args...) strace_printf_wrap(SIGP, fmt , ## args) -#define syscall_printf(fmt, args...) strace_printf_wrap(SYSCALL, fmt , ## args) -#define system_printf(fmt, args...) strace_printf_wrap(SYSTEM, fmt , ## args) -#define termios_printf(fmt, args...) strace_printf_wrap(TERMIOS, fmt , ## args) -#define wm_printf(fmt, args...) strace_printf_wrap(WM, fmt , ## args) -#define minimal_printf(fmt, args...) strace_printf_wrap1(MINIMAL, fmt , ## args) -#define malloc_printf(fmt, args...) strace_printf_wrap1(MALLOC, fmt , ## args) -#define thread_printf(fmt, args...) strace_printf_wrap1(THREAD, fmt , ## args) -#endif /*NEW_MACRO_VARARGS*/ -#endif /*NOSTRACE*/ -#endif /* __cplusplus */ -#endif /* _SYS_STRACE_H */ diff --git a/winsup/cygwin/include/sys/syslog.h b/winsup/cygwin/include/sys/syslog.h deleted file mode 100644 index d7279d3be..000000000 --- a/winsup/cygwin/include/sys/syslog.h +++ /dev/null @@ -1,143 +0,0 @@ -/* sys/syslog.h - - Copyright 1996, 1998, 2001, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_LOG_H -#define _SYS_LOG_H - -#include -#include - -#define _PATH_LOG "/dev/log" -#define _PATH_KLOG "/dev/kmsg" - -#define LOG_EMERG 0 -#define LOG_ALERT 1 -#define LOG_CRIT 2 -#define LOG_ERR 3 -#define LOG_WARNING 4 -#define LOG_NOTICE 5 -#define LOG_INFO 6 -#define LOG_DEBUG 7 - -#define LOG_PRIMASK 0x07 - -#define LOG_PRI(p) ((p) & LOG_PRIMASK) -#define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri)) - -#define LOG_KERN (0<<3) -#define LOG_USER (1<<3) -#define LOG_MAIL (2<<3) -#define LOG_DAEMON (3<<3) -#define LOG_AUTH (4<<3) -#define LOG_SYSLOG (5<<3) -#define LOG_LPR (6<<3) -#define LOG_NEWS (7<<3) -#define LOG_UUCP (8<<3) -#define LOG_CRON (9<<3) -#define LOG_AUTHPRIV (10<<3) -#define LOG_FTP (11<<3) - -/* Codes through 15 are reserved for system use */ -#define LOG_LOCAL0 (16<<3) -#define LOG_LOCAL1 (17<<3) -#define LOG_LOCAL2 (18<<3) -#define LOG_LOCAL3 (19<<3) -#define LOG_LOCAL4 (20<<3) -#define LOG_LOCAL5 (21<<3) -#define LOG_LOCAL6 (22<<3) -#define LOG_LOCAL7 (23<<3) - -#define LOG_NFACILITIES 24 -#define LOG_FACMASK 0x03f8 -#define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3) - -#ifdef SYSLOG_NAMES - -#define INTERNAL_NOPRI 0x10 /* Maps to "none" */ -#define INTERNAL_MARK LOG_MAKEPRI(LOG_NFACILITIES, 0) /* Maps to "mark" */ - -typedef struct _code { - char *c_name; - int c_val; -} CODE; - -CODE prioritynames[] = { - { "alert", LOG_ALERT }, - { "crit", LOG_CRIT }, - { "debug", LOG_DEBUG }, - { "emerg", LOG_EMERG }, - { "err", LOG_ERR }, - { "error", LOG_ERR }, /* Deprecated */ - { "info", LOG_INFO }, - { "none", INTERNAL_NOPRI }, - { "notice", LOG_NOTICE }, - { "panic", LOG_EMERG }, /* Deprecated */ - { "warn", LOG_WARNING }, /* Deprecated */ - { "warning", LOG_WARNING }, - { NULL, -1 } -}; - -CODE facilitynames[] = { - { "auth", LOG_AUTH }, - { "authpriv", LOG_AUTHPRIV }, - { "cron", LOG_CRON }, - { "daemon", LOG_DAEMON }, - { "ftp", LOG_FTP }, - { "kern", LOG_KERN }, - { "lpr", LOG_LPR }, - { "mail", LOG_MAIL }, - { "mark", INTERNAL_MARK }, - { "news", LOG_NEWS }, - { "security", LOG_AUTH }, /* Deprecated */ - { "syslog", LOG_SYSLOG }, - { "user", LOG_USER }, - { "uucp", LOG_UUCP }, - { "local0", LOG_LOCAL0 }, - { "local1", LOG_LOCAL1 }, - { "local2", LOG_LOCAL2 }, - { "local3", LOG_LOCAL3 }, - { "local4", LOG_LOCAL4 }, - { "local5", LOG_LOCAL5 }, - { "local6", LOG_LOCAL6 }, - { "local7", LOG_LOCAL7 }, - { NULL, -1 } -}; - -#endif /* SYSLOG_NAMES */ - -#define LOG_MASK(pri) (1 << (pri)) -#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1) - -/* - * Option flags for openlog. - * - * LOG_ODELAY no longer does anything. - * LOG_NDELAY is the inverse of what it used to be. - */ -#define LOG_PID 0x01 /* log the pid with each message */ -#define LOG_CONS 0x02 /* log on the console if errors in sending */ -#define LOG_ODELAY 0x04 /* delay open until first syslog() (default) */ -#define LOG_NDELAY 0x08 /* don't delay open */ -#define LOG_NOWAIT 0x10 /* don't wait for console forks: DEPRECATED */ -#define LOG_PERROR 0x20 /* log to stderr as well */ - -__BEGIN_DECLS - - -void closelog (void); -void openlog (const char *, int, int); -int setlogmask (int); -void syslog (int, const char *, ...); -void vsyslog (int, const char *, va_list ap); - -__END_DECLS - - -#endif /* _SYS_LOG_H */ diff --git a/winsup/cygwin/include/sys/sysmacros.h b/winsup/cygwin/include/sys/sysmacros.h deleted file mode 100644 index 2c9c69923..000000000 --- a/winsup/cygwin/include/sys/sysmacros.h +++ /dev/null @@ -1,24 +0,0 @@ -/* sys/sysmacros.h - - Copyright 1998, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_SYSMACROS_H -#define _SYS_SYSMACROS_H - -#ifdef __CYGWIN_USE_BIG_TYPES__ -#define major(dev) ((int)(((dev) >> 16) & 0xffff)) -#define minor(dev) ((int)((dev) & 0xffff)) -#define makedev(major, minor) (((major) << 16) | ((minor) & 0xffff)) -#else -#define major(dev) ((int)(((dev) >> 8) & 0xff)) -#define minor(dev) ((int)((dev) & 0xff)) -#define makedev(major, minor) (((major) << 8) | ((minor) & 0xff)) -#endif - -#endif /* _SYS_SYSMACROS_H */ diff --git a/winsup/cygwin/include/sys/sysproto.h b/winsup/cygwin/include/sys/sysproto.h deleted file mode 100644 index 488782b89..000000000 --- a/winsup/cygwin/include/sys/sysproto.h +++ /dev/null @@ -1,18 +0,0 @@ -/* sys/sysproto.h - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* sys/sysproto.h header file for Cygwin. */ - -#ifndef _SYS_SYSPROTO_H -#define _SYS_SYSPROTO_H - -#include - -#endif /* _SYS_SYSPROTO_H */ diff --git a/winsup/cygwin/include/sys/termio.h b/winsup/cygwin/include/sys/termio.h deleted file mode 100644 index 87f2eb461..000000000 --- a/winsup/cygwin/include/sys/termio.h +++ /dev/null @@ -1,12 +0,0 @@ -/* sys/termio.h - - Copyright 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include - diff --git a/winsup/cygwin/include/sys/termios.h b/winsup/cygwin/include/sys/termios.h deleted file mode 100644 index 51e31ac0a..000000000 --- a/winsup/cygwin/include/sys/termios.h +++ /dev/null @@ -1,341 +0,0 @@ -/* sys/termios.h - - Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* sys/termios.h */ - -#ifndef _SYS_TERMIOS_H -#define _SYS_TERMIOS_H - -#define TIOCMGET 0x5415 -#define TIOCMBIS 0x5416 -#define TIOCMBIC 0x5417 -#define TIOCMSET 0x5418 -#define TIOCINQ 0x541B - -/* TIOCINQ is utilized instead of FIONREAD which has been -accupied for other purposes under CYGWIN. -Other UNIX ioctl requests has been omited because -effects of their work one can achive by standard -POSIX commands */ - -#define TIOCSBRK 0x5427 -#define TIOCCBRK 0x5428 - -#define TIOCM_DTR 0x002 -#define TIOCM_RTS 0x004 -#define TIOCM_CTS 0x020 -#define TIOCM_CAR 0x040 -#define TIOCM_RNG 0x080 -#define TIOCM_DSR 0x100 -#define TIOCM_CD TIOCM_CAR -#define TIOCM_RI TIOCM_RNG - -#define TCOOFF 0 -#define TCOON 1 -#define TCIOFF 2 -#define TCION 3 - -#define TCGETA 5 -#define TCSETA 6 -#define TCSETAW 7 -#define TCSETAF 8 - -#define TCIFLUSH 0 -#define TCOFLUSH 1 -#define TCIOFLUSH 2 -#define TCFLSH 3 - -#define TCSAFLUSH 1 -#define TCSANOW 2 -#define TCSADRAIN 3 -#define TCSADFLUSH 4 - -#define TIOCPKT 6 - -#define TIOCPKT_DATA 0 -#define TIOCPKT_FLUSHREAD 1 -#define TIOCPKT_FLUSHWRITE 2 -#define TIOCPKT_STOP 4 -#define TIOCPKT_START 8 -#define TIOCPKT_NOSTOP 16 -#define TIOCPKT_DOSTOP 32 - -#define FIONBIO 0x8004667e /* To be compatible with socket version */ - -#define CTRL(ch) ((ch)&0x1F) - -#define CNUL 0 -#define CDEL 0x0007f -#define CESC '\\' -#define CINTR CTRL('C') -#define CQUIT 0x0001c -#define CERASE CTRL('H') -#define CKILL CTRL('U') -#define CEOT CTRL('D') -#define CEOL 0 -#define CEOL2 0 -#define CEOF CTRL('D') -#define CSTART CTRL('Q') -#define CSTOP CTRL('S') -#define CSWTCH 0x0001a -#define NSWTCH 0 -#define CSUSP CTRL('Z') -#define CDSUSP CTRL('Y') -#define CRPRNT CTRL('R') -#define CFLUSH CTRL('O') -#define CWERASE CTRL('W') -#define CLNEXT CTRL('V') - -/* iflag bits */ -#define IGNBRK 0x00001 -#define BRKINT 0x00002 -#define IGNPAR 0x00004 -#define IMAXBEL 0x00008 -#define INPCK 0x00010 -#define ISTRIP 0x00020 -#define INLCR 0x00040 -#define IGNCR 0x00080 -#define ICRNL 0x00100 -#define IXON 0x00400 -#define IXOFF 0x01000 -#define IUCLC 0x04000 -#define IXANY 0x08000 -#define PARMRK 0x10000 - -/* oflag bits */ - -#define OPOST 0x00001 -#define OLCUC 0x00002 -#define OCRNL 0x00004 -#define ONLCR 0x00008 -#define ONOCR 0x00010 -#define ONLRET 0x00020 -#define OFILL 0x00040 -#define CRDLY 0x00180 -#define CR0 0x00000 -#define CR1 0x00080 -#define CR2 0x00100 -#define CR3 0x00180 -#define NLDLY 0x00200 -#define NL0 0x00000 -#define NL1 0x00200 -#define BSDLY 0x00400 -#define BS0 0x00000 -#define BS1 0x00400 -#define TABDLY 0x01800 -#define TAB0 0x00000 -#define TAB1 0x00800 -#define TAB2 0x01000 -#define TAB3 0x01800 -#define XTABS 0x01800 -#define VTDLY 0x02000 -#define VT0 0x00000 -#define VT1 0x02000 -#define FFDLY 0x04000 -#define FF0 0x00000 -#define FF1 0x04000 -#define OFDEL 0x08000 - -/* cflag bits */ - -/* Baud rate values. These must fit in speed_t, which is unsigned - char. See also the extended baud rates below. These baud rates - set an additional bit. */ -#define CBAUD 0x0100f -#define B0 0x00000 -#define B50 0x00001 -#define B75 0x00002 -#define B110 0x00003 -#define B134 0x00004 -#define B150 0x00005 -#define B200 0x00006 -#define B300 0x00007 -#define B600 0x00008 -#define B1200 0x00009 -#define B1800 0x0000a -#define B2400 0x0000b -#define B4800 0x0000c -#define B9600 0x0000d -#define B19200 0x0000e -#define B38400 0x0000f - -#define CSIZE 0x00030 -#define CS5 0x00000 -#define CS6 0x00010 -#define CS7 0x00020 -#define CS8 0x00030 -#define CSTOPB 0x00040 -#define CREAD 0x00080 -#define PARENB 0x00100 -#define PARODD 0x00200 -#define HUPCL 0x00400 -#define CLOCAL 0x00800 -#define CBAUDEX 0x0100f -#define B57600 0x01001 -#define B115200 0x01002 -#define B128000 0x01003 -#define B230400 0x01004 -#define B256000 0x01005 -#define CRTSXOFF 0x04000 -#define CRTSCTS 0x08000 - -/* lflag bits */ -#define ISIG 0x0001 -#define ICANON 0x0002 -#define ECHO 0x0004 -#define ECHOE 0x0008 -#define ECHOK 0x0010 -#define ECHONL 0x0020 -#define NOFLSH 0x0040 -#define TOSTOP 0x0080 -#define IEXTEN 0x0100 -#define FLUSHO 0x0200 -#define ECHOKE 0x0400 -#define ECHOCTL 0x0800 - -#define VDISCARD 1 -#define VEOL 2 -#define VEOL2 3 -#define VEOF 4 -#define VERASE 5 -#define VINTR 6 -#define VKILL 7 -#define VLNEXT 8 -#define VMIN 9 -#define VQUIT 10 -#define VREPRINT 11 -#define VSTART 12 -#define VSTOP 13 -#define VSUSP 14 -#define VSWTC 15 -#define VTIME 16 -#define VWERASE 17 - -#define NCCS 18 - -/* `c_cc' member of 'struct termios' structure can be disabled by - using the value _POSIX_VDISABLE. */ -#define _POSIX_VDISABLE '\0' - -/* Compare a character C to a value VAL from the `c_cc' array in a - `struct termios'. If VAL is _POSIX_VDISABLE, no character can match it. */ -#define CCEQ(val, c) ((c) == (val) && (val) != _POSIX_VDISABLE) - -typedef unsigned char cc_t; -typedef unsigned int tcflag_t; -typedef unsigned int speed_t; -typedef unsigned short otcflag_t; -typedef unsigned char ospeed_t; - -struct __oldtermios -{ - otcflag_t c_iflag; - otcflag_t c_oflag; - otcflag_t c_cflag; - otcflag_t c_lflag; - char c_line; - cc_t c_cc[NCCS]; - ospeed_t c_ispeed; - ospeed_t c_ospeed; -}; - -struct termios -{ - tcflag_t c_iflag; - tcflag_t c_oflag; - tcflag_t c_cflag; - tcflag_t c_lflag; - char c_line; - cc_t c_cc[NCCS]; - speed_t c_ispeed; - speed_t c_ospeed; -}; - -#ifdef CYGWIN_VERSION_DLL_IS_OLD_TERMIOS -#ifdef __GNUC__ -# define __tonew_termios(ti) \ - ({ \ - struct termios *__newti; \ - \ - if (!CYGWIN_VERSION_DLL_IS_OLD_TERMIOS) \ - __newti = (struct termios *) ti; \ - else \ - { \ - __newti = (struct termios *) alloca(sizeof(struct termios)); \ - __newti->c_iflag = ((struct __oldtermios *)ti)->c_iflag; \ - __newti->c_oflag = ((struct __oldtermios *)ti)->c_oflag; \ - __newti->c_cflag = ((struct __oldtermios *)ti)->c_cflag; \ - __newti->c_lflag = ((struct __oldtermios *)ti)->c_lflag; \ - __newti->c_line = ((struct __oldtermios *)ti)->c_line; \ - __newti->c_ispeed = ((struct __oldtermios *)ti)->c_ispeed; \ - __newti->c_ospeed = ((struct __oldtermios *)ti)->c_ospeed; \ - memcpy (__newti->c_cc, ((struct __oldtermios *)ti)->c_cc, sizeof(__newti->c_cc)); \ - } \ - __newti; \ - }) - -# define __makenew_termios(ti) \ - (CYGWIN_VERSION_DLL_IS_OLD_TERMIOS ? \ - (struct termios *) alloca (sizeof (struct termios)) : (ti)) - -# define __toapp_termios(toti, fromti) \ - ({ \ - if (!CYGWIN_VERSION_DLL_IS_OLD_TERMIOS) \ - toti = fromti; \ - else \ - { \ - ((struct __oldtermios *)toti)->c_iflag = fromti->c_iflag; \ - ((struct __oldtermios *)toti)->c_oflag = fromti->c_oflag; \ - ((struct __oldtermios *)toti)->c_cflag = fromti->c_cflag; \ - ((struct __oldtermios *)toti)->c_lflag = fromti->c_lflag; \ - ((struct __oldtermios *)toti)->c_line = fromti->c_line; \ - ((struct __oldtermios *)toti)->c_ispeed = fromti->c_ispeed; \ - ((struct __oldtermios *)toti)->c_ospeed = fromti->c_ospeed; \ - memcpy (((struct __oldtermios*)toti)->c_cc, fromti->c_cc, sizeof(fromti->c_cc)); \ - } \ - toti; \ - }) -#endif /*__GNUC__*/ -#endif - -#define termio termios - -#define cfgetospeed(tp) ((tp)->c_ospeed) -#define cfgetispeed(tp) ((tp)->c_ispeed) - -#ifdef __cplusplus -extern "C" { -#endif - -int tcgetattr (int, struct termios *); -int tcsetattr (int, int, const struct termios *); -int tcsendbreak (int, int); -int tcdrain (int); -int tcflush (int, int); -int tcflow (int, int); -int cfsetispeed (struct termios *, speed_t); -int cfsetospeed (struct termios *, speed_t); - -#ifdef __cplusplus -} -#endif - -/* Extra stuff to make porting stuff easier. */ -struct winsize -{ - unsigned short ws_row, ws_col; - unsigned short ws_xpixel, ws_ypixel; -}; - -#define TIOCGWINSZ (('T' << 8) | 1) -#define TIOCSWINSZ (('T' << 8) | 2) -#define TIOCLINUX (('T' << 8) | 3) - -#endif /* _SYS_TERMIOS_H */ diff --git a/winsup/cygwin/include/sys/ttychars.h b/winsup/cygwin/include/sys/ttychars.h deleted file mode 100644 index 2d313646f..000000000 --- a/winsup/cygwin/include/sys/ttychars.h +++ /dev/null @@ -1 +0,0 @@ -/* ttychars.h */ diff --git a/winsup/cygwin/include/sys/uio.h b/winsup/cygwin/include/sys/uio.h deleted file mode 100644 index e28f14e7e..000000000 --- a/winsup/cygwin/include/sys/uio.h +++ /dev/null @@ -1,38 +0,0 @@ -/* sys/uio.h - - Copyright 1996, 2000, 2001, 2002 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _UIO_H_ -#define _UIO_H_ - -/* For size_t */ -#include -/* For ssize_t */ -#include - -#include - -__BEGIN_DECLS - -/* - * Define the uio buffers used for writev, readv. - */ - -struct iovec -{ - void *iov_base; - size_t iov_len; -}; - -extern ssize_t readv __P ((int filedes, const struct iovec *vector, int count)); -extern ssize_t writev __P ((int filedes, const struct iovec *vector, int count)); - -__END_DECLS - -#endif /* _UIO_H_ */ diff --git a/winsup/cygwin/include/sys/un.h b/winsup/cygwin/include/sys/un.h deleted file mode 100644 index 2bd107d50..000000000 --- a/winsup/cygwin/include/sys/un.h +++ /dev/null @@ -1,28 +0,0 @@ -/* sys/un.h - - Copyright 1999, 2001, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_UN_H -#define _SYS_UN_H - -#include - -/* POSIX requires only at least 100 bytes */ -#define UNIX_PATH_LEN 108 - -struct sockaddr_un { - sa_family_t sun_family; /* address family AF_LOCAL/AF_UNIX */ - char sun_path[UNIX_PATH_LEN]; /* 108 bytes of socket address */ -}; - -/* Evaluates the actual length of `sockaddr_un' structure. */ -#define SUN_LEN(p) ((size_t)(((struct sockaddr_un *) NULL)->sun_path) \ - + strlen ((p)->sun_path)) - -#endif diff --git a/winsup/cygwin/include/sys/utime.h b/winsup/cygwin/include/sys/utime.h deleted file mode 100644 index 8a9ec15b0..000000000 --- a/winsup/cygwin/include/sys/utime.h +++ /dev/null @@ -1,30 +0,0 @@ -/* sys/utime.h - - Copyright 2001 Red Hat, Inc. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#ifndef _SYS_UTIME_H -#define _SYS_UTIME_H - -#ifdef __cplusplus -extern "C" { -#endif -#include <_ansi.h> -#include - -struct utimbuf -{ - time_t actime; - time_t modtime; -}; - -int _EXFUN(utime, (const char *__path, const struct utimbuf *__buf)); - -#ifdef __cplusplus -}; -#endif - -#endif /* _SYS_UTIME_H */ diff --git a/winsup/cygwin/include/sys/utmp.h b/winsup/cygwin/include/sys/utmp.h deleted file mode 100644 index 8828d0f88..000000000 --- a/winsup/cygwin/include/sys/utmp.h +++ /dev/null @@ -1,55 +0,0 @@ -/* sys/utmp.h - - Copyright 2001, 2004 Red Hat, Inc. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#ifndef UTMP_H -#define UTMP_H - -#include - -#define UTMP_FILE _PATH_UTMP - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef ut_name -#define ut_name ut_user -#endif - - -struct utmp -{ - short ut_type; - pid_t ut_pid; - char ut_line[UT_LINESIZE]; - char ut_id[UT_IDLEN]; - time_t ut_time; - char ut_user[UT_NAMESIZE]; - char ut_host[UT_HOSTSIZE]; - long ut_addr; -}; - -extern struct utmp *_getutline (struct utmp *); -extern struct utmp *getutent (void); -extern struct utmp *getutid (struct utmp *); -extern struct utmp *getutline (struct utmp *); -extern struct utmp *pututline (struct utmp *); -extern void endutent (void); -extern void setutent (void); -extern void utmpname (const char *); - -void login (struct utmp *); -int logout (char *); -int login_tty (int); -void updwtmp (const char *, const struct utmp *); -void logwtmp (const char *, const char *, const char *); - -#ifdef __cplusplus -} -#endif -#endif /* UTMP_H */ diff --git a/winsup/cygwin/include/sys/utsname.h b/winsup/cygwin/include/sys/utsname.h deleted file mode 100644 index bb770c0f1..000000000 --- a/winsup/cygwin/include/sys/utsname.h +++ /dev/null @@ -1,33 +0,0 @@ -/* sys/utsname.h - - Copyright 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_UTSNAME_H -#define _SYS_UTSNAME_H - -#ifdef __cplusplus -extern "C" { -#endif - -struct utsname -{ - char sysname[20]; - char nodename[20]; - char release[20]; - char version[20]; - char machine[20]; -}; - -int uname (struct utsname *); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/winsup/cygwin/include/sys/vfs.h b/winsup/cygwin/include/sys/vfs.h deleted file mode 100644 index 57b6f9232..000000000 --- a/winsup/cygwin/include/sys/vfs.h +++ /dev/null @@ -1,38 +0,0 @@ -/* sys/vfs.h - - Copyright 1997, 1998, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_VFS_H_ -#define _SYS_VFS_H_ - -struct statfs { - long f_type; /* type of filesystem */ - long f_bsize; /* optimal transfer block size */ - long f_blocks; /* total data blocks in file system */ - long f_bfree; /* free blocks in fs */ - long f_bavail; /* free blocks avail to non-superuser */ - long f_files; /* total file nodes in file system */ - long f_ffree; /* free file nodes in fs */ - long f_fsid; /* file system id */ - long f_namelen; /* maximum length of filenames */ - long f_spare[6]; /* spare for later */ -}; - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -int statfs (const char *__path, struct statfs *__buf); -int fstatfs (int __fd, struct statfs *__buf); - -#ifdef __cplusplus -}; -#endif /* __cplusplus */ - -#endif /*_SYS_VFS_H_*/ diff --git a/winsup/cygwin/include/sys/wait.h b/winsup/cygwin/include/sys/wait.h deleted file mode 100644 index d0708383f..000000000 --- a/winsup/cygwin/include/sys/wait.h +++ /dev/null @@ -1,74 +0,0 @@ -/* sys/wait.h - - Copyright 1997, 1998, 2001, 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYS_WAIT_H -#define _SYS_WAIT_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define WNOHANG 1 -#define WUNTRACED 2 - -/* A status looks like: - <2 bytes info> <2 bytes code> - - == 0, child has exited, info is the exit value - == 1..7e, child has exited, info is the signal number. - == 7f, child has stopped, info was the signal number. - == 80, there was a core dump. -*/ - -#define WIFEXITED(w) (((w) & 0xff) == 0) -#define WIFSIGNALED(w) (((w) & 0x7f) > 0 && (((w) & 0x7f) < 0x7f)) -#define WIFSTOPPED(w) (((w) & 0xff) == 0x7f) -#define WEXITSTATUS(w) (((w) >> 8) & 0xff) -#define WTERMSIG(w) ((w) & 0x7f) -#define WSTOPSIG WEXITSTATUS -#define WCOREDUMP(w) (WIFSIGNALED(w) && (w & 0x80)) - -pid_t wait (int *); -pid_t waitpid (pid_t, int *, int); -pid_t wait3 (int *__status, int __options, struct rusage *__rusage); -pid_t wait4 (pid_t __pid, int *__status, int __options, struct rusage *__rusage); - -union wait - { - int w_status; - struct - { - unsigned int __w_termsig:7; /* Terminating signal. */ - unsigned int __w_coredump:1; /* Set if dumped core. */ - unsigned int __w_retcode:8; /* Return code if exited normally. */ - unsigned int:16; - } __wait_terminated; - struct - { - unsigned int __w_stopval:8; /* W_STOPPED if stopped. */ - unsigned int __w_stopsig:8; /* Stopping signal. */ - unsigned int:16; - } __wait_stopped; - }; - -#define w_termsig __wait_terminated.__w_termsig -#define w_coredump __wait_terminated.__w_coredump -#define w_retcode __wait_terminated.__w_retcode -#define w_stopsig __wait_stopped.__w_stopsig -#define w_stopval __wait_stopped.__w_stopval - -#ifdef __cplusplus -}; -#endif - -#endif diff --git a/winsup/cygwin/include/sysexits.h b/winsup/cygwin/include/sysexits.h deleted file mode 100644 index eba0b92dd..000000000 --- a/winsup/cygwin/include/sysexits.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 1987, 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. - * - * @(#)sysexits.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _SYSEXITS_H_ -#define _SYSEXITS_H_ - -/* - * SYSEXITS.H -- Exit status codes for system programs. - * - * This include file attempts to categorize possible error - * exit statuses for system programs, notably delivermail - * and the Berkeley network. - * - * Error numbers begin at EX__BASE to reduce the possibility of - * clashing with other exit statuses that random programs may - * already return. The meaning of the codes is approximately - * as follows: - * - * EX_USAGE -- The command was used incorrectly, e.g., with - * the wrong number of arguments, a bad flag, a bad - * syntax in a parameter, or whatever. - * EX_DATAERR -- The input data was incorrect in some way. - * This should only be used for user's data & not - * system files. - * EX_NOINPUT -- An input file (not a system file) did not - * exist or was not readable. This could also include - * errors like "No message" to a mailer (if it cared - * to catch it). - * EX_NOUSER -- The user specified did not exist. This might - * be used for mail addresses or remote logins. - * EX_NOHOST -- The host specified did not exist. This is used - * in mail addresses or network requests. - * EX_UNAVAILABLE -- A service is unavailable. This can occur - * if a support program or file does not exist. This - * can also be used as a catchall message when something - * you wanted to do doesn't work, but you don't know - * why. - * EX_SOFTWARE -- An internal software error has been detected. - * This should be limited to non-operating system related - * errors as possible. - * EX_OSERR -- An operating system error has been detected. - * This is intended to be used for such things as "cannot - * fork", "cannot create pipe", or the like. It includes - * things like getuid returning a user that does not - * exist in the passwd file. - * EX_OSFILE -- Some system file (e.g., /etc/passwd, /etc/utmp, - * etc.) does not exist, cannot be opened, or has some - * sort of error (e.g., syntax error). - * EX_CANTCREAT -- A (user specified) output file cannot be - * created. - * EX_IOERR -- An error occurred while doing I/O on some file. - * EX_TEMPFAIL -- temporary failure, indicating something that - * is not really an error. In sendmail, this means - * that a mailer (e.g.) could not create a connection, - * and the request should be reattempted later. - * EX_PROTOCOL -- the remote system returned something that - * was "not possible" during a protocol exchange. - * EX_NOPERM -- You did not have sufficient permission to - * perform the operation. This is not intended for - * file system problems, which should use NOINPUT or - * CANTCREAT, but rather for higher level permissions. - */ - -#define EX_OK 0 /* successful termination */ - -#define EX__BASE 64 /* base value for error messages */ - -#define EX_USAGE 64 /* command line usage error */ -#define EX_DATAERR 65 /* data format error */ -#define EX_NOINPUT 66 /* cannot open input */ -#define EX_NOUSER 67 /* addressee unknown */ -#define EX_NOHOST 68 /* host name unknown */ -#define EX_UNAVAILABLE 69 /* service unavailable */ -#define EX_SOFTWARE 70 /* internal software error */ -#define EX_OSERR 71 /* system error (e.g., can't fork) */ -#define EX_OSFILE 72 /* critical OS file missing */ -#define EX_CANTCREAT 73 /* can't create (user) output file */ -#define EX_IOERR 74 /* input/output error */ -#define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */ -#define EX_PROTOCOL 76 /* remote error in protocol */ -#define EX_NOPERM 77 /* permission denied */ -#define EX_CONFIG 78 /* configuration error */ - -#define EX__MAX 78 /* maximum listed value */ - -#endif /* !_SYSEXITS_H_ */ diff --git a/winsup/cygwin/include/syslog.h b/winsup/cygwin/include/syslog.h deleted file mode 100644 index 5721ca5e4..000000000 --- a/winsup/cygwin/include/syslog.h +++ /dev/null @@ -1,16 +0,0 @@ -/* syslog.h - - Copyright 1996, 1998, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYSLOG_H -#define _SYSLOG_H - -#include - -#endif /* _SYSLOG_H */ diff --git a/winsup/cygwin/include/termio.h b/winsup/cygwin/include/termio.h deleted file mode 100644 index ba7b3b10b..000000000 --- a/winsup/cygwin/include/termio.h +++ /dev/null @@ -1,16 +0,0 @@ -/* termio.h - - Copyright 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _TERMIO_H -#define _TERMIO_H - -#include - -#endif diff --git a/winsup/cygwin/include/tzfile.h b/winsup/cygwin/include/tzfile.h deleted file mode 100644 index 5586380a8..000000000 --- a/winsup/cygwin/include/tzfile.h +++ /dev/null @@ -1,51 +0,0 @@ -/* tzfile.h - - Copyright 2001, 2002, 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _TZFILE_H -#define _TZFILE_H - -#define SECSPERMIN 60 -#define MINSPERHOUR 60 -#define HOURSPERDAY 24 -#define DAYSPERWEEK 7 -#define DAYSPERNYEAR 365 -#define DAYSPERLYEAR 366 -#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) -#define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY) -#define MONSPERYEAR 12 - -#define TM_SUNDAY 0 -#define TM_MONDAY 1 -#define TM_TUESDAY 2 -#define TM_WEDNESDAY 3 -#define TM_THURSDAY 4 -#define TM_FRIDAY 5 -#define TM_SATURDAY 6 - -#define TM_JANUARY 0 -#define TM_FEBRUARY 1 -#define TM_MARCH 2 -#define TM_APRIL 3 -#define TM_MAY 4 -#define TM_JUNE 5 -#define TM_JULY 6 -#define TM_AUGUST 7 -#define TM_SEPTEMBER 8 -#define TM_OCTOBER 9 -#define TM_NOVEMBER 10 -#define TM_DECEMBER 11 - -#define TM_YEAR_BASE 1900 - -#define EPOCH_YEAR 1970 -#define EPOCH_WDAY TM_THURSDAY - -#define isleap(y) (((y) % 4) == 0 && ((y) % 100) != 0 || ((y) % 400) == 0) -#endif diff --git a/winsup/cygwin/include/utmpx.h b/winsup/cygwin/include/utmpx.h deleted file mode 100644 index 2239a6353..000000000 --- a/winsup/cygwin/include/utmpx.h +++ /dev/null @@ -1,55 +0,0 @@ -/* utmpx.h - - Copyright 2004 Red Hat, Inc. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#ifndef UTMPX_H -#define UTMPX_H - -#include -#include - -#define UTMPX_FILE _PATH_UTMP - -#ifdef __cplusplus -extern "C" { -#endif - -/* Must be kept in sync with struct utmp as defined in sys/utmp.h! */ -struct utmpx -{ - short ut_type; - pid_t ut_pid; - char ut_line[UT_LINESIZE]; - char ut_id[UT_IDLEN]; - time_t ut_time; - char ut_user[UT_NAMESIZE]; - char ut_host[UT_HOSTSIZE]; - long ut_addr; - struct timeval ut_tv; -}; - -#ifndef ut_name -#define ut_name ut_user -#endif - -#ifndef ut_xtime -#define ut_xtime ut_tv.tv_sec -#endif - -extern void endutxent (void); -extern struct utmpx *getutxent (void); -extern struct utmpx *getutxid (const struct utmpx *id); -extern struct utmpx *getutxline (const struct utmpx *line); -extern struct utmpx *pututxline (const struct utmpx *utmpx); -extern void setutxent (void); -extern void utmpxname (const char *file); -extern void updwtmpx (const char *file, const struct utmpx *utmpx); - -#ifdef __cplusplus -} -#endif -#endif /* UTMPX_H */ diff --git a/winsup/cygwin/init.cc b/winsup/cygwin/init.cc deleted file mode 100644 index f8b6cd652..000000000 --- a/winsup/cygwin/init.cc +++ /dev/null @@ -1,163 +0,0 @@ -/* init.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include "thread.h" -#include "perprocess.h" -#include "cygtls.h" -#include "pinfo.h" -#include -#include "ntdll.h" - -int NO_COPY dynamically_loaded; -static char NO_COPY *search_for = (char *) cygthread::stub; -unsigned threadfunc_ix[8] __attribute__((section (".cygwin_dll_common"), shared)); -extern cygthread *hwait_sig; - -#define OLDFUNC_OFFSET -1 - -static void WINAPI -threadfunc_fe (VOID *arg) -{ - (void)__builtin_return_address(1); - asm volatile ("andl $-16,%%esp" ::: "%esp"); - _cygtls::call ((DWORD (*) (void *, void *)) (((char **) _tlsbase)[OLDFUNC_OFFSET]), arg); -} - -/* If possible, redirect the thread entry point to a cygwin routine which - adds tls stuff to the stack. */ -static void -munge_threadfunc () -{ - int i; - char **ebp = (char **) __builtin_frame_address (0); - if (!threadfunc_ix[0]) - { - char **peb; - char **top = (char **) _tlsbase; - for (peb = ebp, i = 0; peb < top && i < 7; peb++) - if (*peb == search_for) - threadfunc_ix[i++] = peb - ebp; - if (0 && !threadfunc_ix[0]) - { - try_to_debug (); - return; - } - } - - if (threadfunc_ix[0]) - { - char *threadfunc = ebp[threadfunc_ix[0]]; - if (!search_for || threadfunc == search_for) - { - search_for = NULL; - for (i = 0; threadfunc_ix[i]; i++) - ebp[threadfunc_ix[i]] = (char *) threadfunc_fe; - ((char **) _tlsbase)[OLDFUNC_OFFSET] = threadfunc; - } - } -} - -inline static void -respawn_wow64_process () -{ - NTSTATUS ret; - PROCESS_BASIC_INFORMATION pbi; - HANDLE parent; - - BOOL is_wow64_proc = TRUE; /* Opt on the safe side. */ - - /* Unfortunately there's no simpler way to retrieve the - parent process in NT, as far as I know. Hints welcome. */ - ret = NtQueryInformationProcess (GetCurrentProcess (), - ProcessBasicInformation, - (PVOID) &pbi, - sizeof pbi, NULL); - if (ret == STATUS_SUCCESS - && (parent = OpenProcess (PROCESS_QUERY_INFORMATION, - FALSE, - pbi.InheritedFromUniqueProcessId))) - { - IsWow64Process (parent, &is_wow64_proc); - CloseHandle (parent); - } - - /* The parent is a real 64 bit process? Respawn! */ - if (!is_wow64_proc) - { - PROCESS_INFORMATION pi; - STARTUPINFO si; - DWORD ret = 0; - - GetStartupInfo (&si); - if (!CreateProcessA (NULL, GetCommandLineA (), NULL, NULL, TRUE, - CREATE_DEFAULT_ERROR_MODE - | GetPriorityClass (GetCurrentProcess ()), - NULL, NULL, &si, &pi)) - api_fatal ("Failed to create process <%s>, %E", GetCommandLineA ()); - CloseHandle (pi.hThread); - if (WaitForSingleObject (pi.hProcess, INFINITE) == WAIT_FAILED) - api_fatal ("Waiting for process %d failed, %E", pi.dwProcessId); - GetExitCodeProcess (pi.hProcess, &ret); - CloseHandle (pi.hProcess); - ExitProcess (ret); - } -} - -extern void __stdcall dll_crt0_0 (); - -HMODULE NO_COPY cygwin_hmodule; -bool in_dllentry; - -extern "C" BOOL WINAPI -dll_entry (HANDLE h, DWORD reason, void *static_load) -{ - BOOL wow64_test_stack_marker; - - in_dllentry = true; - - switch (reason) - { - case DLL_PROCESS_ATTACH: - wincap.init (); - init_console_handler (false); - - cygwin_hmodule = (HMODULE) h; - dynamically_loaded = (static_load == NULL); - - /* Is the stack at an unusual address? This is, an address which - is in the usual space occupied by the process image, but below - the auto load address of DLLs? - Check if we're running in WOW64 on a 64 bit machine *and* are - spawned by a genuine 64 bit process. If so, respawn. */ - if (wincap.is_wow64 () - && &wow64_test_stack_marker >= (PBOOL) 0x400000 - && &wow64_test_stack_marker <= (PBOOL) 0x10000000) - respawn_wow64_process (); - - dll_crt0_0 (); - break; - case DLL_PROCESS_DETACH: - break; - case DLL_THREAD_ATTACH: - if (hwait_sig) - munge_threadfunc (); - break; - case DLL_THREAD_DETACH: - if (hwait_sig) - _my_tls.remove (0); - break; - } - - in_dllentry = false; - return TRUE; -} diff --git a/winsup/cygwin/ioctl.cc b/winsup/cygwin/ioctl.cc deleted file mode 100644 index bd9b3ca3c..000000000 --- a/winsup/cygwin/ioctl.cc +++ /dev/null @@ -1,63 +0,0 @@ -/* ioctl.cc: ioctl routines. - - Copyright 1996, 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. - - Written by Doug Evans of Cygnus Support - dje@cygnus.com - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "sigproc.h" -#include - -extern "C" int -ioctl (int fd, int cmd, ...) -{ - - cygheap_fdget cfd (fd); - if (cfd < 0) - return -1; - - /* check for optional mode argument */ - va_list ap; - va_start (ap, cmd); - char *argp = va_arg (ap, char *); - va_end (ap); - - debug_printf ("fd %d, cmd %x", fd, cmd); - int res; - if (cfd->is_tty () && cfd->get_device () != FH_PTYM) - switch (cmd) - { - case TCGETA: - res = tcgetattr (fd, (struct termios *) argp); - goto out; - case TCSETA: - res = tcsetattr (fd, TCSANOW, (struct termios *) argp); - goto out; - case TCSETAW: - res = tcsetattr (fd, TCSADRAIN, (struct termios *) argp); - goto out; - case TCSETAF: - res = tcsetattr (fd, TCSAFLUSH, (struct termios *) argp); - goto out; - } - - res = cfd->ioctl (cmd, argp); - -out: - debug_printf ("returning %d", res); - return res; -} diff --git a/winsup/cygwin/ipc.cc b/winsup/cygwin/ipc.cc deleted file mode 100644 index c89b23e21..000000000 --- a/winsup/cygwin/ipc.cc +++ /dev/null @@ -1,92 +0,0 @@ -/* ipc.cc: Single unix specification IPC interface for Cygwin - - Copyright 2001, 2002, 2003 Red Hat, Inc. - - Originally written by Robert Collins - Updated to 64 bit key_t by Charles Wilson - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include "winsup.h" -#include -#include - -/* Notes: we return a valid key even if id's low order 8 bits are 0. */ -extern "C" key_t -ftok (const char *path, int id) -{ - struct __stat64 statbuf; - key_t tmp; - if (stat64 (path, &statbuf)) - { - /* stat set the appropriate errno for us */ - return (key_t) -1; - } - - /* Since __CYGWIN_USE_BIG_TYPES__, - dev_t is 32bits for cygwin - ino_t is 64bits for cygwin - and we need 8 bits for the id. - thus key_t needs 104 bits total -- but we only have 64 (long long) - We will have to alias; leaving open the possibility that the same - key will be returned for multiple files. This possibility exists - also on Linux; the question is, how to minimize this possibility. - - How to solve? Well, based on C. Vinschen's research, the nFileIndex* - words vary as follows, on a partition with > 110,000 files - nFileIndexHigh: 564 values between 0x00010000 -- 0xffff0000 - nFileIndexLow : 103812 values between 0x00000000 -- 0x0003ffff - R. Collins suggests that these may represent a tree path, - and that it would require ~2.9M files to force the tree depth - to increase and reveal more bit usage. - - Implementation details: dev_t is 32bits, but is formed by - device(32bits) << 16 | unit(32bits) - But device is ACTUALLY == status & FH_DEVMASK, where FH_DEVMASK - is 0x00000fff --> 12 bits - - As it happens, the maximum number of devices is actually - FH_NDEV, not FH_DEVMASK, where FH_NDEV is currently 0x0000001d. - However, FH_NDEV grows as new device types are added. So - currently the device number needs 5 bits, but later? Let's - take a cue from Linux, and use the lower 8 bits (instead of the - lower 12 or 16) for the device (major?) number. - - Similarly, while 'units' is an int (32bits), it is unclear - how many of these are significant. For most devices, it seems that - 'units' is equivalent to 'minor'. For FH_TAPE, it's obvious that - only 8 bits are important. However, for FH_SOCKET...it might be - as high as 16 significant bits. - - Let's assume that we only need 8 bits from device (major) and - only 8 bits from unit (minor). (On linux, only 8 bits of minor - are used, and none from major). - ---> so, we only need 0x00ff00ff (16 bits) of dev_t - - ---> we MUST have all 8 bits of id. - - ---> So, we only have 64 - 8 - 16 = 40 bits for ino_t. But, we - need 0xffff0000 for nFileIndexHigh and 0x0003ffff for nFileIndexLow - minimum, or 16 + 18 = 34 bits. Lucky us - we have 6 more bits - to distribute. - - For lack of a better idea, we'll allocate 2 of the extra bits to - nFileIndexHigh and 4 to nFileIndexLow. */ - - /* get 8 bits from dev_t (major), put into 0xff00000000000000L */ - tmp = (((key_t) statbuf.st_dev) & 0x0000000000ff0000LL) << 40; - /* get 8 bits from dev_t (minor), put into 0x00ff000000000000L */ - tmp |= (((key_t) statbuf.st_dev) & 0x00000000000000ffLL) << 48; - /* get upper 16+2 bits from nFileInfoHigh, put into 0x0000ffffc0000000L - shift down first, then mask, to avoid sign extension on rightshift */ - tmp |= (((key_t) statbuf.st_ino) & 0xffffc00000000000LL) >> 16; - /* get lower 18+4 bits from nFileInfoLow, put into 0x000000003fffff00L */ - tmp |= (((key_t) statbuf.st_ino) & 0x00000000003fffffLL) << 8; - /* use all 8 bits of id, and put into 0x00000000000000ffL */ - tmp |= (id & 0x00ff); - return tmp; -} diff --git a/winsup/cygwin/lib/_cygwin_crt0_common.cc b/winsup/cygwin/lib/_cygwin_crt0_common.cc deleted file mode 100644 index 935b84f31..000000000 --- a/winsup/cygwin/lib/_cygwin_crt0_common.cc +++ /dev/null @@ -1,103 +0,0 @@ -/* common.cc: common crt0 function for cygwin crt0's. - - Copyright 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include "perprocess.h" -#include "cygwin/version.h" -#include "crt0.h" -#include -#include - -/* Avoid an info message from linker when linking applications. */ -extern __declspec(dllimport) struct _reent *_impure_ptr; - -#undef environ - -extern "C" -{ -char **environ; -int cygwin_attach_dll (HMODULE, MainFunc); -int cygwin_attach_noncygwin_dll (HMODULE, MainFunc); -int main (int, char **, char **); -int _fmode; -void _pei386_runtime_relocator (); - -/* Set up pointers to various pieces so the dll can then use them, - and then jump to the dll. */ - -int __stdcall -_cygwin_crt0_common (MainFunc f, per_process *u) -{ - /* This is used to record what the initial sp was. The value is needed - when copying the parent's stack to the child during a fork. */ - DWORD newu; - int uwasnull; - - if (u != NULL) - uwasnull = 0; /* Caller allocated space for per_process structure */ - else if ((newu = cygwin_internal (CW_USER_DATA)) == (DWORD) -1) - return 0; - else - { - u = (per_process *) newu; /* Using DLL built-in per_process */ - uwasnull = 1; /* Remember for later */ - } - - /* The version numbers are the main source of compatibility checking. - As a backup to them, we use the size of the per_process struct. */ - u->magic_biscuit = sizeof (per_process); - - /* cygwin.dll version number in effect at the time the app was created. */ - u->dll_major = CYGWIN_VERSION_DLL_MAJOR; - u->dll_minor = CYGWIN_VERSION_DLL_MINOR; - u->api_major = CYGWIN_VERSION_API_MAJOR; - u->api_minor = CYGWIN_VERSION_API_MINOR; - - u->ctors = &__CTOR_LIST__; - u->dtors = &__DTOR_LIST__; - u->envptr = &environ; - if (uwasnull) - _impure_ptr = u->impure_ptr; /* Use field initialized in newer DLLs. */ - else - u->impure_ptr_ptr = &_impure_ptr; /* Older DLLs need this. */ - - u->forkee = 0; /* This should only be set in dcrt0.cc - when the process is actually forked */ - u->main = f; - - /* These functions are executed prior to main. They are just stubs unless the - user overrides them. */ - u->premain[0] = cygwin_premain0; - u->premain[1] = cygwin_premain1; - u->premain[2] = cygwin_premain2; - u->premain[3] = cygwin_premain3; - u->fmode_ptr = &_fmode; - u->initial_sp = (char *) __builtin_frame_address (1); - - /* Remember whatever the user linked his application with - or - point to entries in the dll. */ - u->malloc = &malloc; - u->free = &free; - u->realloc = &realloc; - u->calloc = &calloc; - - /* Setup the module handle so fork can get the path name. */ - u->hmodule = GetModuleHandle (0); - - /* variables for fork */ - u->data_start = &_data_start__; - u->data_end = &_data_end__; - u->bss_start = &_bss_start__; - u->bss_end = &_bss_end__; - - _pei386_runtime_relocator (); - return 1; -} -} /* "C" */ diff --git a/winsup/cygwin/lib/crt0.h b/winsup/cygwin/lib/crt0.h deleted file mode 100644 index 7bd240622..000000000 --- a/winsup/cygwin/lib/crt0.h +++ /dev/null @@ -1,22 +0,0 @@ -/* crt0.h: header file for crt0. - - Copyright 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifdef __cplusplus -extern "C" { -#endif - -struct per_process; -typedef int (*MainFunc) (int argc, char *argv[], char **env); -int __stdcall _cygwin_crt0_common (MainFunc, struct per_process *); -int dll_dllcrt0 (HMODULE, struct per_process *); - -#ifdef __cplusplus -} -#endif diff --git a/winsup/cygwin/lib/cygwin_attach_dll.c b/winsup/cygwin/lib/cygwin_attach_dll.c deleted file mode 100644 index 3788bdf9c..000000000 --- a/winsup/cygwin/lib/cygwin_attach_dll.c +++ /dev/null @@ -1,25 +0,0 @@ -/* attach_dll.cc: crt0 for attaching cygwin DLL from a non-cygwin app. - - Copyright 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#undef __INSIDE_CYGWIN__ -#include -#include -#include "crt0.h" - -/* for a loaded dll */ -int -cygwin_attach_dll (HMODULE h, MainFunc f) -{ - static struct per_process u; - (void) _cygwin_crt0_common (f, &u); - - /* jump into the dll. */ - return dll_dllcrt0 (h, &u); -} diff --git a/winsup/cygwin/lib/cygwin_crt0.c b/winsup/cygwin/lib/cygwin_crt0.c deleted file mode 100644 index fb2a84b18..000000000 --- a/winsup/cygwin/lib/cygwin_crt0.c +++ /dev/null @@ -1,33 +0,0 @@ -/* cygwin_crt0.cc: crt0 for cygwin - - Copyright 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#undef __INSIDE_CYGWIN__ -#include -#include -#include -#include "crt0.h" - -extern void dll_crt0__FP11per_process (struct per_process *) __declspec (dllimport) __attribute ((noreturn)); - -/* for main module */ -void -cygwin_crt0 (MainFunc f) -{ - struct per_process *u; - if (_cygwin_crt0_common (f, NULL)) - u = NULL; /* Newer DLL. Use DLL internal per_process. */ - else /* Older DLL. Provide a per_process */ - { - u = (struct per_process *) alloca (sizeof (*u)); - memset (u, 0, sizeof (u)); - (void) _cygwin_crt0_common (f, u); - } - dll_crt0__FP11per_process (u); /* Jump into the dll, never to return */ -} diff --git a/winsup/cygwin/lib/dll_entry.c b/winsup/cygwin/lib/dll_entry.c deleted file mode 100644 index 781f6a3ea..000000000 --- a/winsup/cygwin/lib/dll_entry.c +++ /dev/null @@ -1,17 +0,0 @@ -/* dll_entry.cc: Provide the default user DLL linker entry point. - - Copyright 1998, 2000, 2001 Red Hat, Inc. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* Here we simply instantiate the DECLARE_CYGWIN_DLL to define the - linker entry point, __cygwin_dll_entry@12, which in turn calls - _DllMain@12 to do user-specific initialization, if any. There is a - default DllMain stub in the library if there is no user supplied - one. */ - -#include "cygwin/cygwin_dll.h" - -DECLARE_CYGWIN_DLL (DllMain); diff --git a/winsup/cygwin/lib/dll_main.cc b/winsup/cygwin/lib/dll_main.cc deleted file mode 100644 index a224a0a2f..000000000 --- a/winsup/cygwin/lib/dll_main.cc +++ /dev/null @@ -1,41 +0,0 @@ -/* dll_main.cc: Provide the DllMain stub that the user can override. - - Copyright 1998, 2000, 2001 Red Hat, Inc. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include - -#define WIN32_LEAN_AND_MEAN -#include -#undef WIN32_LEAN_AND_MEAN -#include - -extern "C" -BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, - LPVOID reserved /* Not used. */); - -BOOL APIENTRY -DllMain ( - HINSTANCE hInst /* Library instance handle. */ , - DWORD reason /* Reason this function is being called. */ , - LPVOID reserved /* Not used. */) -{ - switch (reason) - { - case DLL_PROCESS_ATTACH: - break; - - case DLL_PROCESS_DETACH: - break; - - case DLL_THREAD_ATTACH: - break; - - case DLL_THREAD_DETACH: - break; - } - return TRUE; -} diff --git a/winsup/cygwin/lib/libcmain.c b/winsup/cygwin/lib/libcmain.c deleted file mode 100644 index b0c011999..000000000 --- a/winsup/cygwin/lib/libcmain.c +++ /dev/null @@ -1,44 +0,0 @@ -/* libcmain.c - - Copyright 1996, 1997, 1998, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include -#include - -#define SP " \t\n" - -/* Allow apps which don't have a main work, as long as they define WinMain */ -int -main () -{ - HMODULE x = GetModuleHandle (0); - char *s = GetCommandLine (); - STARTUPINFO si; - char *nexts; - - s += strspn (s, SP); - - if (*s != '"') - nexts = strpbrk (s, SP); - else - while ((nexts = strchr (s + 1, '"')) != NULL && nexts[-1] == '\\') - s = nexts; - - if (!nexts) - nexts = strchr (s, '\0'); - else - nexts += strspn (nexts + 1, SP); - - GetStartupInfo (&si); - - return WinMain (x, 0, nexts, - ((si.dwFlags & STARTF_USESHOWWINDOW) != 0 - ? si.wShowWindow - : SW_SHOWNORMAL)); -} diff --git a/winsup/cygwin/lib/premain0.c b/winsup/cygwin/lib/premain0.c deleted file mode 100644 index b77e02e8e..000000000 --- a/winsup/cygwin/lib/premain0.c +++ /dev/null @@ -1,14 +0,0 @@ -/* premain0.c - - Copyright 2000 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -void -cygwin_premain0(int argc, char **argv) -{ -} diff --git a/winsup/cygwin/lib/premain1.c b/winsup/cygwin/lib/premain1.c deleted file mode 100644 index 99aeac916..000000000 --- a/winsup/cygwin/lib/premain1.c +++ /dev/null @@ -1,14 +0,0 @@ -/* premain1.c - - Copyright 2000 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -void -cygwin_premain1(int argc, char **argv) -{ -} diff --git a/winsup/cygwin/lib/premain2.c b/winsup/cygwin/lib/premain2.c deleted file mode 100644 index a89e76ec3..000000000 --- a/winsup/cygwin/lib/premain2.c +++ /dev/null @@ -1,14 +0,0 @@ -/* premain2.c - - Copyright 2000 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -void -cygwin_premain2(int argc, char **argv) -{ -} diff --git a/winsup/cygwin/lib/premain3.c b/winsup/cygwin/lib/premain3.c deleted file mode 100644 index c5b99b918..000000000 --- a/winsup/cygwin/lib/premain3.c +++ /dev/null @@ -1,14 +0,0 @@ -/* premain3.c - - Copyright 2000 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -void -cygwin_premain3(int argc, char **argv) -{ -} diff --git a/winsup/cygwin/lib/pseudo-reloc.c b/winsup/cygwin/lib/pseudo-reloc.c deleted file mode 100644 index 5760a69ad..000000000 --- a/winsup/cygwin/lib/pseudo-reloc.c +++ /dev/null @@ -1,46 +0,0 @@ -/* pseudo-reloc.c - - Written by Egor Duda - THIS SOFTWARE IS NOT COPYRIGHTED - - This source code is offered for use in the public domain. You may - use, modify or distribute it freely. - - This code is distributed in the hope that it will be useful but - WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY - DISCLAMED. This includes but is not limited to warrenties of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -*/ - -#include - -extern char __RUNTIME_PSEUDO_RELOC_LIST__; -extern char __RUNTIME_PSEUDO_RELOC_LIST_END__; -extern char _image_base__; - -typedef struct - { - DWORD addend; - DWORD target; - } -runtime_pseudo_reloc; - -void -do_pseudo_reloc (void* start, void* end, void* base) -{ - DWORD reloc_target; - runtime_pseudo_reloc* r; - for (r = (runtime_pseudo_reloc*) start; r < (runtime_pseudo_reloc*) end; r++) - { - reloc_target = (DWORD) base + r->target; - *((DWORD*) reloc_target) += r->addend; - } -} - -void -_pei386_runtime_relocator () -{ - do_pseudo_reloc (&__RUNTIME_PSEUDO_RELOC_LIST__, - &__RUNTIME_PSEUDO_RELOC_LIST_END__, - &_image_base__); -} diff --git a/winsup/cygwin/libc/bsdlib.cc b/winsup/cygwin/libc/bsdlib.cc deleted file mode 100644 index 48ccc4578..000000000 --- a/winsup/cygwin/libc/bsdlib.cc +++ /dev/null @@ -1,312 +0,0 @@ -/*- - * Copyright (c) 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. 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. - * - * CV 2003-09-10: Cygwin specific changes applied. Code simplified just - * for Cygwin alone. - */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "thread.h" -#include "cygtls.h" - -extern "C" int -daemon (int nochdir, int noclose) -{ - int fd; - - switch (fork ()) - { - case -1: - return -1; - case 0: - if (!wincap.is_winnt ()) - { - /* Register as service under 9x/Me which allows to close - the parent window with the daemon still running. - This function only exists on 9x/Me and is autoloaded - so it fails silently on NT. */ - DWORD WINAPI RegisterServiceProcess (DWORD, DWORD); - RegisterServiceProcess (0, 1); - } - break; - default: - /* This sleep avoids a race condition which kills the - child process if parent is started by a NT/W2K service. - FIXME: Is that still true? */ - Sleep (1000L); - _exit (0); - } - if (setsid () == -1) - return -1; - if (!nochdir) - chdir ("/"); - if (!noclose && (fd = open (_PATH_DEVNULL, O_RDWR, 0)) >= 0) - { - dup2 (fd, STDIN_FILENO); - dup2 (fd, STDOUT_FILENO); - dup2 (fd, STDERR_FILENO); - if (fd > 2) - close (fd); - } - return 0; -} - -extern "C" int -login_tty (int fd) -{ - char *fdname; - int newfd; - - if (setsid () == -1) - return -1; - if ((fdname = ttyname (fd))) - { - if (fd != STDIN_FILENO) - close (STDIN_FILENO); - if (fd != STDOUT_FILENO) - close (STDOUT_FILENO); - if (fd != STDERR_FILENO) - close (STDERR_FILENO); - newfd = open (fdname, O_RDWR); - close (newfd); - } - dup2 (fd, STDIN_FILENO); - dup2 (fd, STDOUT_FILENO); - dup2 (fd, STDERR_FILENO); - if (fd > 2) - close (fd); - return 0; -} - -extern "C" int -openpty (int *amaster, int *aslave, char *name, struct termios *termp, - struct winsize *winp) -{ - int master, slave; - char pts[CYG_MAX_PATH]; - - if ((master = open ("/dev/ptmx", O_RDWR | O_NOCTTY)) >= 0) - { - grantpt (master); - unlockpt (master); - strcpy (pts, ptsname (master)); - revoke (pts); - if ((slave = open (pts, O_RDWR | O_NOCTTY)) >= 0) - { - if (amaster) - *amaster = master; - if (aslave) - *aslave = slave; - if (name) - strcpy (name, pts); - if (termp) - tcsetattr (slave, TCSAFLUSH, termp); - if (winp) - ioctl (slave, TIOCSWINSZ, (char *) winp); - return 0; - } - close (master); - } - set_errno (ENOENT); - return -1; -} - -extern "C" int -forkpty (int *amaster, char *name, struct termios *termp, struct winsize *winp) -{ - int master, slave, pid; - - if (openpty (&master, &slave, name, termp, winp) == -1) - return -1; - switch (pid = fork ()) - { - case -1: - return -1; - case 0: - close (master); - login_tty (slave); - return 0; - } - if (amaster) - *amaster = master; - close (slave); - return pid; -} - -extern "C" char *__progname; - -static void -_vwarnx (const char *fmt, va_list ap) -{ - fprintf (stderr, "%s: ", __progname); - vfprintf (stderr, fmt, ap); -} - -extern "C" void -vwarn (const char *fmt, va_list ap) -{ - _vwarnx (fmt, ap); - fprintf (stderr, ": %s", strerror (get_errno ())); - fputc ('\n', stderr); -} - -extern "C" void -vwarnx (const char *fmt, va_list ap) -{ - _vwarnx (fmt, ap); - fputc ('\n', stderr); -} - -extern "C" void -warn (const char *fmt, ...) -{ - va_list ap; - va_start (ap, fmt); - vwarn (fmt, ap); -} - -extern "C" void -warnx (const char *fmt, ...) -{ - va_list ap; - va_start (ap, fmt); - vwarnx (fmt, ap); -} - -extern "C" void -verr (int eval, const char *fmt, va_list ap) -{ - vwarn (fmt, ap); - exit (eval); -} - -extern "C" void -verrx (int eval, const char *fmt, va_list ap) -{ - vwarnx (fmt, ap); - exit (eval); -} - -extern "C" void -err (int eval, const char *fmt, ...) -{ - va_list ap; - va_start (ap, fmt); - vwarn (fmt, ap); - exit (eval); -} - -extern "C" void -errx (int eval, const char *fmt, ...) -{ - va_list ap; - va_start (ap, fmt); - vwarnx (fmt, ap); - exit (eval); -} - -extern "C" const char * -getprogname (void) -{ - return __progname; -} - -extern "C" void -setprogname (const char *newprogname) -{ - myfault efault; - if (!efault.faulted (EFAULT)) - { - /* Per BSD man page, setprogname keeps a pointer to the last - path component of the argument. It does *not* copy the - argument before. */ - __progname = strrchr (newprogname, '/'); - if (__progname) - ++__progname; - else - __progname = (char *)newprogname; - } -} - -extern "C" void -logwtmp (const char *line, const char *user, const char *host) -{ - struct utmp ut; - memset (&ut, 0, sizeof ut); - ut.ut_type = USER_PROCESS; - ut.ut_pid = getpid (); - if (line) - strncpy (ut.ut_line, line, sizeof ut.ut_line); - time (&ut.ut_time); - if (user) - strncpy (ut.ut_user, user, sizeof ut.ut_user); - if (host) - strncpy (ut.ut_host, host, sizeof ut.ut_host); - updwtmp (_PATH_WTMP, &ut); -} - -extern "C" void -login (struct utmp *ut) -{ - pututline (ut); - endutent (); - updwtmp (_PATH_WTMP, ut); -} - -extern "C" int -logout (char *line) -{ - struct utmp ut_buf, *ut; - - memset (&ut_buf, 0, sizeof ut_buf); - strncpy (ut_buf.ut_line, line, sizeof ut_buf.ut_line); - setutent (); - ut = getutline (&ut_buf); - - if (ut) - { - ut->ut_type = DEAD_PROCESS; - memset (ut->ut_user, 0, sizeof ut->ut_user); - memset (ut->ut_host, 0, sizeof ut->ut_host); - time (&ut->ut_time); - debug_printf ("set logout time for %s", line); - pututline (ut); - endutent (); - return 1; - } - return 0; -} diff --git a/winsup/cygwin/libc/fnmatch.c b/winsup/cygwin/libc/fnmatch.c deleted file mode 100644 index b48d9e00a..000000000 --- a/winsup/cygwin/libc/fnmatch.c +++ /dev/null @@ -1,220 +0,0 @@ -/* $OpenBSD: fnmatch.c,v 1.7 2000/03/23 19:13:51 millert Exp $ */ - -/* - * Copyright (c) 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Guido van Rossum. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -#if 0 -static char sccsid[] = "@(#)fnmatch.c 8.2 (Berkeley) 4/16/94"; -#else -static char rcsid[] = "$OpenBSD: fnmatch.c,v 1.7 2000/03/23 19:13:51 millert Exp $"; -#endif -#endif /* LIBC_SCCS and not lint */ - -/* - * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. - * Compares a filename or pathname to a pattern. - */ - -/* Just this single line added for Cygwin. */ -#include "winsup.h" - -#include -#include -#include -#include - -#define EOS '\0' - -#define RANGE_MATCH 1 -#define RANGE_NOMATCH 0 -#define RANGE_ERROR (-1) - -static int rangematch __P((const char *, char, int, char **)); - -int -fnmatch(const char *pattern, const char *string, int flags) -{ - const char *stringstart; - char *newp; - char c, test; - - for (stringstart = string;;) - switch (c = *pattern++) { - case EOS: - if ((flags & FNM_LEADING_DIR) && *string == '/') - return (0); - return (*string == EOS ? 0 : FNM_NOMATCH); - case '?': - if (*string == EOS) - return (FNM_NOMATCH); - if (*string == '/' && (flags & FNM_PATHNAME)) - return (FNM_NOMATCH); - if (*string == '.' && (flags & FNM_PERIOD) && - (string == stringstart || - ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) - return (FNM_NOMATCH); - ++string; - break; - case '*': - c = *pattern; - /* Collapse multiple stars. */ - while (c == '*') - c = *++pattern; - - if (*string == '.' && (flags & FNM_PERIOD) && - (string == stringstart || - ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) - return (FNM_NOMATCH); - - /* Optimize for pattern with * at end or before /. */ - if (c == EOS) { - if (flags & FNM_PATHNAME) - return ((flags & FNM_LEADING_DIR) || - strchr(string, '/') == NULL ? - 0 : FNM_NOMATCH); - else - return (0); - } else if (c == '/' && (flags & FNM_PATHNAME)) { - if ((string = strchr(string, '/')) == NULL) - return (FNM_NOMATCH); - break; - } - - /* General case, use recursion. */ - while ((test = *string) != EOS) { - if (!fnmatch(pattern, string, flags & ~FNM_PERIOD)) - return (0); - if (test == '/' && (flags & FNM_PATHNAME)) - break; - ++string; - } - return (FNM_NOMATCH); - case '[': - if (*string == EOS) - return (FNM_NOMATCH); - if (*string == '/' && (flags & FNM_PATHNAME)) - return (FNM_NOMATCH); - if (*string == '.' && (flags & FNM_PERIOD) && - (string == stringstart || - ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) - return (FNM_NOMATCH); - - switch (rangematch(pattern, *string, flags, &newp)) { - case RANGE_ERROR: - /* not a good range, treat as normal text */ - goto normal; - case RANGE_MATCH: - pattern = newp; - break; - case RANGE_NOMATCH: - return (FNM_NOMATCH); - } - ++string; - break; - case '\\': - if (!(flags & FNM_NOESCAPE)) { - if ((c = *pattern++) == EOS) { - c = '\\'; - --pattern; - } - } - /* FALLTHROUGH */ - default: - normal: - if (c != *string && !((flags & FNM_CASEFOLD) && - (tolower((unsigned char)c) == - tolower((unsigned char)*string)))) - return (FNM_NOMATCH); - ++string; - break; - } - /* NOTREACHED */ -} - -static int -rangematch(const char *pattern, char test, int flags, char **newp) -{ - int negate, ok; - char c, c2; - - /* - * A bracket expression starting with an unquoted circumflex - * character produces unspecified results (IEEE 1003.2-1992, - * 3.13.2). This implementation treats it like '!', for - * consistency with the regular expression syntax. - * J.T. Conklin (conklin@ngai.kaleida.com) - */ - if ((negate = (*pattern == '!' || *pattern == '^'))) - ++pattern; - - if (flags & FNM_CASEFOLD) - test = tolower((unsigned char)test); - - /* - * A right bracket shall lose its special meaning and represent - * itself in a bracket expression if it occurs first in the list. - * -- POSIX.2 2.8.3.2 - */ - ok = 0; - c = *pattern++; - do { - if (c == '\\' && !(flags & FNM_NOESCAPE)) - c = *pattern++; - if (c == EOS) - return (RANGE_ERROR); - if (c == '/' && (flags & FNM_PATHNAME)) - return (RANGE_NOMATCH); - if ((flags & FNM_CASEFOLD)) - c = tolower((unsigned char)c); - if (*pattern == '-' - && (c2 = *(pattern+1)) != EOS && c2 != ']') { - pattern += 2; - if (c2 == '\\' && !(flags & FNM_NOESCAPE)) - c2 = *pattern++; - if (c2 == EOS) - return (RANGE_ERROR); - if (flags & FNM_CASEFOLD) - c2 = tolower((unsigned char)c2); - if (c <= test && test <= c2) - ok = 1; - } else if (c == test) - ok = 1; - } while ((c = *pattern++) != ']'); - - *newp = (char *)pattern; - return (ok == negate ? RANGE_NOMATCH : RANGE_MATCH); -} diff --git a/winsup/cygwin/libc/fts.c b/winsup/cygwin/libc/fts.c deleted file mode 100644 index d0e77892d..000000000 --- a/winsup/cygwin/libc/fts.c +++ /dev/null @@ -1,1253 +0,0 @@ -/*- - * Copyright (c) 1990, 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. 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. - * - * $OpenBSD: fts.c,v 1.22 1999/10/03 19:22:22 millert Exp $ - */ - -#if 0 -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)fts.c 8.6 (Berkeley) 8/14/94"; -#endif /* LIBC_SCCS and not lint */ -#endif -#ifdef __CYGWIN__ -#include "winsup.h" -#include -#define __FBSDID(x) -#define _open open -#define _close close -#define reallocf realloc -#endif -#include -__FBSDID("$FreeBSD: /repoman/r/ncvs/src/lib/libc/gen/fts.c,v 1.27 2004/06/08 06:23:23 das Exp $"); - -#ifndef __CYGWIN__ -#include "namespace.h" -#endif -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#ifndef __CYGWIN__ -#include "un-namespace.h" -#endif - -static FTSENT *fts_alloc(FTS *, const char *, int); -static FTSENT *fts_build(FTS *, int); -static void fts_lfree(FTSENT *); -static void fts_load(FTS *, FTSENT *); -static size_t fts_maxarglen(char * const *); -static void fts_padjust(FTS *, FTSENT *); -static int fts_palloc(FTS *, size_t); -static FTSENT *fts_sort(FTS *, FTSENT *, int); -static u_short fts_stat(FTS *, FTSENT *, int); -static int fts_safe_changedir(FTS *, FTSENT *, int, const char *); -static int fts_ufslinks(FTS *, const FTSENT *); - -#define ISDOT(a) (a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2]))) - -#define CLR(opt) (sp->fts_options &= ~(opt)) -#define ISSET(opt) (sp->fts_options & (opt)) -#define SET(opt) (sp->fts_options |= (opt)) - -#define FCHDIR(sp, fd) (!ISSET(FTS_NOCHDIR) && fchdir(fd)) - -/* fts_build flags */ -#define BCHILD 1 /* fts_children */ -#define BNAMES 2 /* fts_children, names only */ -#define BREAD 3 /* fts_read */ - -/* - * Internal representation of an FTS, including extra implementation - * details. The FTS returned from fts_open points to this structure's - * ftsp_fts member (and can be cast to an _fts_private as required) - */ -struct _fts_private { - FTS ftsp_fts; - struct statfs ftsp_statfs; - __dev32_t ftsp_dev; - int ftsp_linksreliable; -}; - -/* - * The "FTS_NOSTAT" option can avoid a lot of calls to stat(2) if it - * knows that a directory could not possibly have subdirectories. This - * is decided by looking at the link count: a subdirectory would - * increment its parent's link count by virtue of its own ".." entry. - * This assumption only holds for UFS-like filesystems that implement - * links and directories this way, so we must punt for others. - */ - -#ifndef __CYGWIN__ -static const char *ufslike_filesystems[] = { - "ufs", - "nfs", - "nfs4", - "ext2fs", - 0 -}; -#endif - -FTS * -fts_open(argv, options, compar) - char * const *argv; - int options; - int (*compar)(const FTSENT * const *, const FTSENT * const *); -{ - struct _fts_private *priv; - FTS *sp; - FTSENT *p, *root; - int nitems; - FTSENT *parent, *tmp; - int len; - - /* Options check. */ - if (options & ~FTS_OPTIONMASK) { - errno = EINVAL; - return (NULL); - } - - /* Allocate/initialize the stream. */ - if ((priv = malloc(sizeof(*priv))) == NULL) - return (NULL); - memset(priv, 0, sizeof(*priv)); - sp = &priv->ftsp_fts; - sp->fts_compar = compar; - sp->fts_options = options; - - /* Shush, GCC. */ - tmp = NULL; - - /* Logical walks turn on NOCHDIR; symbolic links are too hard. */ - if (ISSET(FTS_LOGICAL)) - SET(FTS_NOCHDIR); - - /* - * Start out with 1K of path space, and enough, in any case, - * to hold the user's paths. - */ - if (fts_palloc(sp, MAX(fts_maxarglen(argv), MAXPATHLEN))) - goto mem1; - - /* Allocate/initialize root's parent. */ - if ((parent = fts_alloc(sp, "", 0)) == NULL) - goto mem2; - parent->fts_level = FTS_ROOTPARENTLEVEL; - - /* Allocate/initialize root(s). */ - for (root = NULL, nitems = 0; *argv != NULL; ++argv, ++nitems) { - /* Don't allow zero-length paths. */ - if ((len = strlen(*argv)) == 0) { - errno = ENOENT; - goto mem3; - } - - p = fts_alloc(sp, *argv, len); - p->fts_level = FTS_ROOTLEVEL; - p->fts_parent = parent; - p->fts_accpath = p->fts_name; - p->fts_info = fts_stat(sp, p, ISSET(FTS_COMFOLLOW)); - - /* Command-line "." and ".." are real directories. */ - if (p->fts_info == FTS_DOT) - p->fts_info = FTS_D; - - /* - * If comparison routine supplied, traverse in sorted - * order; otherwise traverse in the order specified. - */ - if (compar) { - p->fts_link = root; - root = p; - } else { - p->fts_link = NULL; - if (root == NULL) - tmp = root = p; - else { - tmp->fts_link = p; - tmp = p; - } - } - } - if (compar && nitems > 1) - root = fts_sort(sp, root, nitems); - - /* - * Allocate a dummy pointer and make fts_read think that we've just - * finished the node before the root(s); set p->fts_info to FTS_INIT - * so that everything about the "current" node is ignored. - */ - if ((sp->fts_cur = fts_alloc(sp, "", 0)) == NULL) - goto mem3; - sp->fts_cur->fts_link = root; - sp->fts_cur->fts_info = FTS_INIT; - - /* - * If using chdir(2), grab a file descriptor pointing to dot to ensure - * that we can get back here; this could be avoided for some paths, - * but almost certainly not worth the effort. Slashes, symbolic links, - * and ".." are all fairly nasty problems. Note, if we can't get the - * descriptor we run anyway, just more slowly. - */ - if (!ISSET(FTS_NOCHDIR) && (sp->fts_rfd = _open(".", O_RDONLY, 0)) < 0) - SET(FTS_NOCHDIR); - - return (sp); - -mem3: fts_lfree(root); - free(parent); -mem2: free(sp->fts_path); -mem1: free(sp); - return (NULL); -} - -static void -fts_load(sp, p) - FTS *sp; - FTSENT *p; -{ - int len; - char *cp; - - /* - * Load the stream structure for the next traversal. Since we don't - * actually enter the directory until after the preorder visit, set - * the fts_accpath field specially so the chdir gets done to the right - * place and the user can access the first node. From fts_open it's - * known that the path will fit. - */ - len = p->fts_pathlen = p->fts_namelen; - memmove(sp->fts_path, p->fts_name, len + 1); - if ((cp = strrchr(p->fts_name, '/')) && (cp != p->fts_name || cp[1])) { - len = strlen(++cp); - memmove(p->fts_name, cp, len + 1); - p->fts_namelen = len; - } - p->fts_accpath = p->fts_path = sp->fts_path; - sp->fts_dev = p->fts_dev; -} - -int -fts_close(sp) - FTS *sp; -{ - FTSENT *freep, *p; - int saved_errno; - - /* - * This still works if we haven't read anything -- the dummy structure - * points to the root list, so we step through to the end of the root - * list which has a valid parent pointer. - */ - if (sp->fts_cur) { - for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) { - freep = p; - p = p->fts_link != NULL ? p->fts_link : p->fts_parent; - free(freep); - } - free(p); - } - - /* Free up child linked list, sort array, path buffer. */ - if (sp->fts_child) - fts_lfree(sp->fts_child); - if (sp->fts_array) - free(sp->fts_array); - free(sp->fts_path); - - /* Return to original directory, save errno if necessary. */ - if (!ISSET(FTS_NOCHDIR)) { - saved_errno = fchdir(sp->fts_rfd) ? errno : 0; - (void)_close(sp->fts_rfd); - - /* Set errno and return. */ - if (saved_errno != 0) { - /* Free up the stream pointer. */ - free(sp); - errno = saved_errno; - return (-1); - } - } - - /* Free up the stream pointer. */ - free(sp); - return (0); -} - -/* - * Special case of "/" at the end of the path so that slashes aren't - * appended which would cause paths to be written as "....//foo". - */ -#define NAPPEND(p) \ - (p->fts_path[p->fts_pathlen - 1] == '/' \ - ? p->fts_pathlen - 1 : p->fts_pathlen) - -FTSENT * -fts_read(sp) - FTS *sp; -{ - FTSENT *p, *tmp; - int instr; - char *t; - int saved_errno; - - /* If finished or unrecoverable error, return NULL. */ - if (sp->fts_cur == NULL || ISSET(FTS_STOP)) - return (NULL); - - /* Set current node pointer. */ - p = sp->fts_cur; - - /* Save and zero out user instructions. */ - instr = p->fts_instr; - p->fts_instr = FTS_NOINSTR; - - /* Any type of file may be re-visited; re-stat and re-turn. */ - if (instr == FTS_AGAIN) { - p->fts_info = fts_stat(sp, p, 0); - return (p); - } - - /* - * Following a symlink -- SLNONE test allows application to see - * SLNONE and recover. If indirecting through a symlink, have - * keep a pointer to current location. If unable to get that - * pointer, follow fails. - */ - if (instr == FTS_FOLLOW && - (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) { - p->fts_info = fts_stat(sp, p, 1); - if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) { - if ((p->fts_symfd = _open(".", O_RDONLY, 0)) < 0) { - p->fts_errno = errno; - p->fts_info = FTS_ERR; - } else - p->fts_flags |= FTS_SYMFOLLOW; - } - return (p); - } - - /* Directory in pre-order. */ - if (p->fts_info == FTS_D) { - /* If skipped or crossed mount point, do post-order visit. */ - if (instr == FTS_SKIP || - (ISSET(FTS_XDEV) && p->fts_dev != sp->fts_dev)) { - if (p->fts_flags & FTS_SYMFOLLOW) - (void)_close(p->fts_symfd); - if (sp->fts_child) { - fts_lfree(sp->fts_child); - sp->fts_child = NULL; - } - p->fts_info = FTS_DP; - return (p); - } - - /* Rebuild if only read the names and now traversing. */ - if (sp->fts_child != NULL && ISSET(FTS_NAMEONLY)) { - CLR(FTS_NAMEONLY); - fts_lfree(sp->fts_child); - sp->fts_child = NULL; - } - - /* - * Cd to the subdirectory. - * - * If have already read and now fail to chdir, whack the list - * to make the names come out right, and set the parent errno - * so the application will eventually get an error condition. - * Set the FTS_DONTCHDIR flag so that when we logically change - * directories back to the parent we don't do a chdir. - * - * If haven't read do so. If the read fails, fts_build sets - * FTS_STOP or the fts_info field of the node. - */ - if (sp->fts_child != NULL) { - if (fts_safe_changedir(sp, p, -1, p->fts_accpath)) { - p->fts_errno = errno; - p->fts_flags |= FTS_DONTCHDIR; - for (p = sp->fts_child; p != NULL; - p = p->fts_link) - p->fts_accpath = - p->fts_parent->fts_accpath; - } - } else if ((sp->fts_child = fts_build(sp, BREAD)) == NULL) { - if (ISSET(FTS_STOP)) - return (NULL); - return (p); - } - p = sp->fts_child; - sp->fts_child = NULL; - goto name; - } - - /* Move to the next node on this level. */ -next: tmp = p; - if ((p = p->fts_link) != NULL) { - free(tmp); - - /* - * If reached the top, return to the original directory (or - * the root of the tree), and load the paths for the next root. - */ - if (p->fts_level == FTS_ROOTLEVEL) { - if (FCHDIR(sp, sp->fts_rfd)) { - SET(FTS_STOP); - return (NULL); - } - fts_load(sp, p); - return (sp->fts_cur = p); - } - - /* - * User may have called fts_set on the node. If skipped, - * ignore. If followed, get a file descriptor so we can - * get back if necessary. - */ - if (p->fts_instr == FTS_SKIP) - goto next; - if (p->fts_instr == FTS_FOLLOW) { - p->fts_info = fts_stat(sp, p, 1); - if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) { - if ((p->fts_symfd = - _open(".", O_RDONLY, 0)) < 0) { - p->fts_errno = errno; - p->fts_info = FTS_ERR; - } else - p->fts_flags |= FTS_SYMFOLLOW; - } - p->fts_instr = FTS_NOINSTR; - } - -name: t = sp->fts_path + NAPPEND(p->fts_parent); - *t++ = '/'; - memmove(t, p->fts_name, p->fts_namelen + 1); - return (sp->fts_cur = p); - } - - /* Move up to the parent node. */ - p = tmp->fts_parent; - free(tmp); - - if (p->fts_level == FTS_ROOTPARENTLEVEL) { - /* - * Done; free everything up and set errno to 0 so the user - * can distinguish between error and EOF. - */ - free(p); - errno = 0; - return (sp->fts_cur = NULL); - } - - /* NUL terminate the pathname. */ - sp->fts_path[p->fts_pathlen] = '\0'; - - /* - * Return to the parent directory. If at a root node or came through - * a symlink, go back through the file descriptor. Otherwise, cd up - * one directory. - */ - if (p->fts_level == FTS_ROOTLEVEL) { - if (FCHDIR(sp, sp->fts_rfd)) { - SET(FTS_STOP); - return (NULL); - } - } else if (p->fts_flags & FTS_SYMFOLLOW) { - if (FCHDIR(sp, p->fts_symfd)) { - saved_errno = errno; - (void)_close(p->fts_symfd); - errno = saved_errno; - SET(FTS_STOP); - return (NULL); - } - (void)_close(p->fts_symfd); - } else if (!(p->fts_flags & FTS_DONTCHDIR) && - fts_safe_changedir(sp, p->fts_parent, -1, "..")) { - SET(FTS_STOP); - return (NULL); - } - p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP; - return (sp->fts_cur = p); -} - -/* - * Fts_set takes the stream as an argument although it's not used in this - * implementation; it would be necessary if anyone wanted to add global - * semantics to fts using fts_set. An error return is allowed for similar - * reasons. - */ -/* ARGSUSED */ -int -fts_set(sp, p, instr) - FTS *sp; - FTSENT *p; - int instr; -{ - if (instr != 0 && instr != FTS_AGAIN && instr != FTS_FOLLOW && - instr != FTS_NOINSTR && instr != FTS_SKIP) { - errno = EINVAL; - return (1); - } - p->fts_instr = instr; - return (0); -} - -FTSENT * -fts_children(sp, instr) - FTS *sp; - int instr; -{ - FTSENT *p; - int fd; - - if (instr != 0 && instr != FTS_NAMEONLY) { - errno = EINVAL; - return (NULL); - } - - /* Set current node pointer. */ - p = sp->fts_cur; - - /* - * Errno set to 0 so user can distinguish empty directory from - * an error. - */ - errno = 0; - - /* Fatal errors stop here. */ - if (ISSET(FTS_STOP)) - return (NULL); - - /* Return logical hierarchy of user's arguments. */ - if (p->fts_info == FTS_INIT) - return (p->fts_link); - - /* - * If not a directory being visited in pre-order, stop here. Could - * allow FTS_DNR, assuming the user has fixed the problem, but the - * same effect is available with FTS_AGAIN. - */ - if (p->fts_info != FTS_D /* && p->fts_info != FTS_DNR */) - return (NULL); - - /* Free up any previous child list. */ - if (sp->fts_child != NULL) - fts_lfree(sp->fts_child); - - if (instr == FTS_NAMEONLY) { - SET(FTS_NAMEONLY); - instr = BNAMES; - } else - instr = BCHILD; - - /* - * If using chdir on a relative path and called BEFORE fts_read does - * its chdir to the root of a traversal, we can lose -- we need to - * chdir into the subdirectory, and we don't know where the current - * directory is, so we can't get back so that the upcoming chdir by - * fts_read will work. - */ - if (p->fts_level != FTS_ROOTLEVEL || p->fts_accpath[0] == '/' || - ISSET(FTS_NOCHDIR)) - return (sp->fts_child = fts_build(sp, instr)); - - if ((fd = _open(".", O_RDONLY, 0)) < 0) - return (NULL); - sp->fts_child = fts_build(sp, instr); - if (fchdir(fd)) - return (NULL); - (void)_close(fd); - return (sp->fts_child); -} - -#ifndef fts_get_clientptr -#error "fts_get_clientptr not defined" -#endif - -void * -(fts_get_clientptr)(FTS *sp) -{ - - return (fts_get_clientptr(sp)); -} - -#ifndef fts_get_stream -#error "fts_get_stream not defined" -#endif - -FTS * -(fts_get_stream)(FTSENT *p) -{ - return (fts_get_stream(p)); -} - -void -fts_set_clientptr(FTS *sp, void *clientptr) -{ - - sp->fts_clientptr = clientptr; -} - -/* - * This is the tricky part -- do not casually change *anything* in here. The - * idea is to build the linked list of entries that are used by fts_children - * and fts_read. There are lots of special cases. - * - * The real slowdown in walking the tree is the stat calls. If FTS_NOSTAT is - * set and it's a physical walk (so that symbolic links can't be directories), - * we can do things quickly. First, if it's a 4.4BSD file system, the type - * of the file is in the directory entry. Otherwise, we assume that the number - * of subdirectories in a node is equal to the number of links to the parent. - * The former skips all stat calls. The latter skips stat calls in any leaf - * directories and for any files after the subdirectories in the directory have - * been found, cutting the stat calls by about 2/3. - */ -static FTSENT * -fts_build(sp, type) - FTS *sp; - int type; -{ - struct dirent *dp; - FTSENT *p, *head; - int nitems; - FTSENT *cur, *tail; - DIR *dirp; - void *oldaddr; - size_t dnamlen; - int cderrno, descend, len, level, maxlen, nlinks, /*oflag,*/ saved_errno, - nostat, doadjust; - char *cp; - - /* Set current node pointer. */ - cur = sp->fts_cur; - - /* - * Open the directory for reading. If this fails, we're done. - * If being called from fts_read, set the fts_info field. - */ -#ifdef FTS_WHITEOUT - if (ISSET(FTS_WHITEOUT)) - oflag = DTF_NODUP | DTF_REWIND; - else - oflag = DTF_HIDEW | DTF_NODUP | DTF_REWIND; -#else -#define __opendir2(path, flag) opendir(path) -#endif - if ((dirp = __opendir2(cur->fts_accpath, oflag)) == NULL) { - if (type == BREAD) { - cur->fts_info = FTS_DNR; - cur->fts_errno = errno; - } - return (NULL); - } - - /* - * Nlinks is the number of possible entries of type directory in the - * directory if we're cheating on stat calls, 0 if we're not doing - * any stat calls at all, -1 if we're doing stats on everything. - */ - if (type == BNAMES) { - nlinks = 0; - /* Be quiet about nostat, GCC. */ - nostat = 0; - } else if (ISSET(FTS_NOSTAT) && ISSET(FTS_PHYSICAL)) { - if (fts_ufslinks(sp, cur)) - nlinks = cur->fts_nlink - (ISSET(FTS_SEEDOT) ? 0 : 2); - else - nlinks = -1; - nostat = 1; - } else { - nlinks = -1; - nostat = 0; - } - -#ifdef notdef - (void)printf("nlinks == %d (cur: %d)\n", nlinks, cur->fts_nlink); - (void)printf("NOSTAT %d PHYSICAL %d SEEDOT %d\n", - ISSET(FTS_NOSTAT), ISSET(FTS_PHYSICAL), ISSET(FTS_SEEDOT)); -#endif - /* - * If we're going to need to stat anything or we want to descend - * and stay in the directory, chdir. If this fails we keep going, - * but set a flag so we don't chdir after the post-order visit. - * We won't be able to stat anything, but we can still return the - * names themselves. Note, that since fts_read won't be able to - * chdir into the directory, it will have to return different path - * names than before, i.e. "a/b" instead of "b". Since the node - * has already been visited in pre-order, have to wait until the - * post-order visit to return the error. There is a special case - * here, if there was nothing to stat then it's not an error to - * not be able to stat. This is all fairly nasty. If a program - * needed sorted entries or stat information, they had better be - * checking FTS_NS on the returned nodes. - */ - cderrno = 0; - if (nlinks || type == BREAD) { - if (fts_safe_changedir(sp, cur, dirfd(dirp), NULL)) { - if (nlinks && type == BREAD) - cur->fts_errno = errno; - cur->fts_flags |= FTS_DONTCHDIR; - descend = 0; - cderrno = errno; - } else - descend = 1; - } else - descend = 0; - - /* - * Figure out the max file name length that can be stored in the - * current path -- the inner loop allocates more path as necessary. - * We really wouldn't have to do the maxlen calculations here, we - * could do them in fts_read before returning the path, but it's a - * lot easier here since the length is part of the dirent structure. - * - * If not changing directories set a pointer so that can just append - * each new name into the path. - */ - len = NAPPEND(cur); - if (ISSET(FTS_NOCHDIR)) { - cp = sp->fts_path + len; - *cp++ = '/'; - } else { - /* GCC, you're too verbose. */ - cp = NULL; - } - len++; - maxlen = sp->fts_pathlen - len; - - level = cur->fts_level + 1; - - /* Read the directory, attaching each entry to the `link' pointer. */ - doadjust = 0; - for (head = tail = NULL, nitems = 0; dirp && (dp = readdir(dirp));) { -#ifdef __CYGWIN__ - dnamlen = strlen (dp->d_name); -#else - dnamlen = dp->d_namlen; -#endif - if (!ISSET(FTS_SEEDOT) && ISDOT(dp->d_name)) - continue; - - if ((p = fts_alloc(sp, dp->d_name, (int)dnamlen)) == NULL) - goto mem1; - if (dnamlen >= maxlen) { /* include space for NUL */ - oldaddr = sp->fts_path; - if (fts_palloc(sp, dnamlen + len + 1)) { - /* - * No more memory for path or structures. Save - * errno, free up the current structure and the - * structures already allocated. - */ -mem1: saved_errno = errno; - if (p) - free(p); - fts_lfree(head); - (void)closedir(dirp); - cur->fts_info = FTS_ERR; - SET(FTS_STOP); - errno = saved_errno; - return (NULL); - } - /* Did realloc() change the pointer? */ - if (oldaddr != sp->fts_path) { - doadjust = 1; - if (ISSET(FTS_NOCHDIR)) - cp = sp->fts_path + len; - } - maxlen = sp->fts_pathlen - len; - } - - if (len + dnamlen >= USHRT_MAX) { - /* - * In an FTSENT, fts_pathlen is a u_short so it is - * possible to wraparound here. If we do, free up - * the current structure and the structures already - * allocated, then error out with ENAMETOOLONG. - */ - free(p); - fts_lfree(head); - (void)closedir(dirp); - cur->fts_info = FTS_ERR; - SET(FTS_STOP); - errno = ENAMETOOLONG; - return (NULL); - } - p->fts_level = level; - p->fts_parent = sp->fts_cur; - p->fts_pathlen = len + dnamlen; - -#ifdef FTS_WHITEOUT - if (dp->d_type == DT_WHT) - p->fts_flags |= FTS_ISW; -#endif - - if (cderrno) { - if (nlinks) { - p->fts_info = FTS_NS; - p->fts_errno = cderrno; - } else - p->fts_info = FTS_NSOK; - p->fts_accpath = cur->fts_accpath; - } else if (nlinks == 0 -#if defined(DT_DIR) && !defined(__CYGWIN__) - || (nostat && - dp->d_type != DT_DIR && dp->d_type != DT_UNKNOWN) -#endif - ) { - p->fts_accpath = - ISSET(FTS_NOCHDIR) ? p->fts_path : p->fts_name; - p->fts_info = FTS_NSOK; - } else { - /* Build a file name for fts_stat to stat. */ - if (ISSET(FTS_NOCHDIR)) { - p->fts_accpath = p->fts_path; - memmove(cp, p->fts_name, p->fts_namelen + 1); - } else - p->fts_accpath = p->fts_name; - /* Stat it. */ - p->fts_info = fts_stat(sp, p, 0); - - /* Decrement link count if applicable. */ - if (nlinks > 0 && (p->fts_info == FTS_D || - p->fts_info == FTS_DC || p->fts_info == FTS_DOT)) - --nlinks; - } - - /* We walk in directory order so "ls -f" doesn't get upset. */ - p->fts_link = NULL; - if (head == NULL) - head = tail = p; - else { - tail->fts_link = p; - tail = p; - } - ++nitems; - } - if (dirp) - (void)closedir(dirp); - - /* - * If realloc() changed the address of the path, adjust the - * addresses for the rest of the tree and the dir list. - */ - if (doadjust) - fts_padjust(sp, head); - - /* - * If not changing directories, reset the path back to original - * state. - */ - if (ISSET(FTS_NOCHDIR)) { - if (len == sp->fts_pathlen || nitems == 0) - --cp; - *cp = '\0'; - } - - /* - * If descended after called from fts_children or after called from - * fts_read and nothing found, get back. At the root level we use - * the saved fd; if one of fts_open()'s arguments is a relative path - * to an empty directory, we wind up here with no other way back. If - * can't get back, we're done. - */ - if (descend && (type == BCHILD || !nitems) && - (cur->fts_level == FTS_ROOTLEVEL ? - FCHDIR(sp, sp->fts_rfd) : - fts_safe_changedir(sp, cur->fts_parent, -1, ".."))) { - cur->fts_info = FTS_ERR; - SET(FTS_STOP); - return (NULL); - } - - /* If didn't find anything, return NULL. */ - if (!nitems) { - if (type == BREAD) - cur->fts_info = FTS_DP; - return (NULL); - } - - /* Sort the entries. */ - if (sp->fts_compar && nitems > 1) - head = fts_sort(sp, head, nitems); - return (head); -} - -static u_short -fts_stat(sp, p, follow) - FTS *sp; - FTSENT *p; - int follow; -{ - FTSENT *t; - __dev32_t dev; - __ino64_t ino; - struct __stat64 *sbp, sb; - int saved_errno; - - /* If user needs stat info, stat buffer already allocated. */ - sbp = ISSET(FTS_NOSTAT) ? &sb : p->fts_statp; - -#ifdef FTS_WHITEOUT - /* Check for whiteout. */ - if (p->fts_flags & FTS_ISW) { - if (sbp != &sb) { - memset(sbp, '\0', sizeof(*sbp)); - sbp->st_mode = S_IFWHT; - } - return (FTS_W); - } -#endif - - /* - * If doing a logical walk, or application requested FTS_FOLLOW, do - * a stat(2). If that fails, check for a non-existent symlink. If - * fail, set the errno from the stat call. - */ - if (ISSET(FTS_LOGICAL) || follow) { - if (stat64(p->fts_accpath, sbp)) { - saved_errno = errno; - if (!lstat64(p->fts_accpath, sbp)) { - errno = 0; - return (FTS_SLNONE); - } - p->fts_errno = saved_errno; - goto err; - } - } else if (lstat64(p->fts_accpath, sbp)) { - p->fts_errno = errno; -err: memset(sbp, 0, sizeof(struct __stat64)); - return (FTS_NS); - } - - if (S_ISDIR(sbp->st_mode)) { - /* - * Set the device/inode. Used to find cycles and check for - * crossing mount points. Also remember the link count, used - * in fts_build to limit the number of stat calls. It is - * understood that these fields are only referenced if fts_info - * is set to FTS_D. - */ - dev = p->fts_dev = sbp->st_dev; - ino = p->fts_ino = sbp->st_ino; - p->fts_nlink = sbp->st_nlink; - - if (ISDOT(p->fts_name)) - return (FTS_DOT); - - /* - * Cycle detection is done by brute force when the directory - * is first encountered. If the tree gets deep enough or the - * number of symbolic links to directories is high enough, - * something faster might be worthwhile. - */ - for (t = p->fts_parent; - t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent) - if (ino == t->fts_ino && dev == t->fts_dev) { - p->fts_cycle = t; - return (FTS_DC); - } - return (FTS_D); - } - if (S_ISLNK(sbp->st_mode)) - return (FTS_SL); - if (S_ISREG(sbp->st_mode)) - return (FTS_F); - return (FTS_DEFAULT); -} - -/* - * The comparison function takes pointers to pointers to FTSENT structures. - * Qsort wants a comparison function that takes pointers to void. - * (Both with appropriate levels of const-poisoning, of course!) - * Use a trampoline function to deal with the difference. - */ -static int -fts_compar(const void *a, const void *b) -{ - FTS *parent; - - parent = (*(const FTSENT * const *)a)->fts_fts; - return (*parent->fts_compar)(a, b); -} - -static FTSENT * -fts_sort(sp, head, nitems) - FTS *sp; - FTSENT *head; - int nitems; -{ - FTSENT **ap, *p; - - /* - * Construct an array of pointers to the structures and call qsort(3). - * Reassemble the array in the order returned by qsort. If unable to - * sort for memory reasons, return the directory entries in their - * current order. Allocate enough space for the current needs plus - * 40 so don't realloc one entry at a time. - */ - if (nitems > sp->fts_nitems) { - sp->fts_nitems = nitems + 40; - if ((sp->fts_array = reallocf(sp->fts_array, - sp->fts_nitems * sizeof(FTSENT *))) == NULL) { - sp->fts_nitems = 0; - return (head); - } - } - for (ap = sp->fts_array, p = head; p; p = p->fts_link) - *ap++ = p; - qsort(sp->fts_array, nitems, sizeof(FTSENT *), fts_compar); - for (head = *(ap = sp->fts_array); --nitems; ++ap) - ap[0]->fts_link = ap[1]; - ap[0]->fts_link = NULL; - return (head); -} - -static FTSENT * -fts_alloc(sp, name, namelen) - FTS *sp; - const char *name; - int namelen; -{ - FTSENT *p; - size_t len; - - struct ftsent_withstat { - FTSENT ent; - struct __stat64 statbuf; - }; - - /* - * The file name is a variable length array and no stat structure is - * necessary if the user has set the nostat bit. Allocate the FTSENT - * structure, the file name and the stat structure in one chunk, but - * be careful that the stat structure is reasonably aligned. - */ - if (ISSET(FTS_NOSTAT)) - len = sizeof(FTSENT) + namelen + 1; - else - len = sizeof(struct ftsent_withstat) + namelen + 1; - - if ((p = malloc(len)) == NULL) - return (NULL); - - if (ISSET(FTS_NOSTAT)) { - p->fts_name = (char *)(p + 1); - p->fts_statp = NULL; - } else { - p->fts_name = (char *)((struct ftsent_withstat *)p + 1); - p->fts_statp = &((struct ftsent_withstat *)p)->statbuf; - } - - /* Copy the name and guarantee NUL termination. */ - memcpy(p->fts_name, name, namelen); - p->fts_name[namelen] = '\0'; - p->fts_namelen = namelen; - p->fts_path = sp->fts_path; - p->fts_errno = 0; - p->fts_flags = 0; - p->fts_instr = FTS_NOINSTR; - p->fts_number = 0; - p->fts_pointer = NULL; - p->fts_fts = sp; - return (p); -} - -static void -fts_lfree(head) - FTSENT *head; -{ - FTSENT *p; - - /* Free a linked list of structures. */ - while ((p = head)) { - head = head->fts_link; - free(p); - } -} - -/* - * Allow essentially unlimited paths; find, rm, ls should all work on any tree. - * Most systems will allow creation of paths much longer than MAXPATHLEN, even - * though the kernel won't resolve them. Add the size (not just what's needed) - * plus 256 bytes so don't realloc the path 2 bytes at a time. - */ -static int -fts_palloc(sp, more) - FTS *sp; - size_t more; -{ - - sp->fts_pathlen += more + 256; - /* - * Check for possible wraparound. In an FTS, fts_pathlen is - * a signed int but in an FTSENT it is an unsigned short. - * We limit fts_pathlen to USHRT_MAX to be safe in both cases. - */ - if (sp->fts_pathlen < 0 || sp->fts_pathlen >= USHRT_MAX) { - if (sp->fts_path) - free(sp->fts_path); - sp->fts_path = NULL; - errno = ENAMETOOLONG; - return (1); - } - sp->fts_path = reallocf(sp->fts_path, sp->fts_pathlen); - return (sp->fts_path == NULL); -} - -/* - * When the path is realloc'd, have to fix all of the pointers in structures - * already returned. - */ -static void -fts_padjust(sp, head) - FTS *sp; - FTSENT *head; -{ - FTSENT *p; - char *addr = sp->fts_path; - -#define ADJUST(p) do { \ - if ((p)->fts_accpath != (p)->fts_name) { \ - (p)->fts_accpath = \ - (char *)addr + ((p)->fts_accpath - (p)->fts_path); \ - } \ - (p)->fts_path = addr; \ -} while (0) - /* Adjust the current set of children. */ - for (p = sp->fts_child; p; p = p->fts_link) - ADJUST(p); - - /* Adjust the rest of the tree, including the current level. */ - for (p = head; p->fts_level >= FTS_ROOTLEVEL;) { - ADJUST(p); - p = p->fts_link ? p->fts_link : p->fts_parent; - } -} - -static size_t -fts_maxarglen(argv) - char * const *argv; -{ - size_t len, max; - - for (max = 0; *argv; ++argv) - if ((len = strlen(*argv)) > max) - max = len; - return (max + 1); -} - -/* - * Change to dir specified by fd or p->fts_accpath without getting - * tricked by someone changing the world out from underneath us. - * Assumes p->fts_dev and p->fts_ino are filled in. - */ -static int -fts_safe_changedir(sp, p, fd, path) - FTS *sp; - FTSENT *p; - int fd; - const char *path; -{ - int ret, oerrno, newfd; - struct __stat64 sb; - - newfd = fd; - if (ISSET(FTS_NOCHDIR)) - return (0); - if (fd < 0 && (newfd = _open(path, O_RDONLY, 0)) < 0) - return (-1); - if (fstat64(newfd, &sb)) { - ret = -1; - goto bail; - } - if (p->fts_dev != sb.st_dev || p->fts_ino != sb.st_ino) { - errno = ENOENT; /* disinformation */ - ret = -1; - goto bail; - } - ret = fchdir(newfd); -bail: - oerrno = errno; - if (fd < 0) - (void)_close(newfd); - errno = oerrno; - return (ret); -} - -/* - * Check if the filesystem for "ent" has UFS-style links. - */ -static int -fts_ufslinks(FTS *sp, const FTSENT *ent) -{ - struct _fts_private *priv; -#ifndef __CYGWIN__ - const char **cpp; -#endif - - priv = (struct _fts_private *)sp; - /* - * If this node's device is different from the previous, grab - * the filesystem information, and decide on the reliability - * of the link information from this filesystem for stat(2) - * avoidance. - */ - if (priv->ftsp_dev != ent->fts_dev) { - if (statfs(ent->fts_path, &priv->ftsp_statfs) != -1) { - priv->ftsp_dev = ent->fts_dev; -#ifdef __CYGWIN__ - /* The link count is reliable in Cygwin's directory - stat structures, unless the link count is 1. - This indicates a remote filesystem on which Cygwin - refuses to count the directory links for speed. */ - priv->ftsp_linksreliable = (ent->fts_dev == 1) ? 0 : 1; -#else - priv->ftsp_linksreliable = 0; - for (cpp = ufslike_filesystems; *cpp; cpp++) { - if (strcmp(priv->ftsp_statfs.f_fstypename, - *cpp) == 0) { - priv->ftsp_linksreliable = 1; - break; - } - } -#endif - } else { - priv->ftsp_linksreliable = 0; - } - } - return (priv->ftsp_linksreliable); -} diff --git a/winsup/cygwin/libc/ftw.c b/winsup/cygwin/libc/ftw.c deleted file mode 100644 index 2589e5b4f..000000000 --- a/winsup/cygwin/libc/ftw.c +++ /dev/null @@ -1,102 +0,0 @@ -/* $OpenBSD: ftw.c,v 1.4 2004/07/07 16:05:23 millert Exp $ */ - -/* - * Copyright (c) 2003, 2004 Todd C. Miller - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - * - * Sponsored in part by the Defense Advanced Research Projects - * Agency (DARPA) and Air Force Research Laboratory, Air Force - * Materiel Command, USAF, under agreement number F39502-99-1-0512. - */ - -#if 0 -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$OpenBSD: ftw.c,v 1.4 2004/07/07 16:05:23 millert Exp $"; -#endif /* LIBC_SCCS and not lint */ -#endif - -#ifdef __CYGWIN__ -#include "winsup.h" -#endif -#include -#if 0 -__FBSDID("$FreeBSD: /repoman/r/ncvs/src/lib/libc/gen/ftw.c,v 1.4 2004/08/24 13:00:55 tjr Exp $"); -#endif -#include -#include -#include -#include -#include -#include - -int -ftw(const char *path, int (*fn)(const char *, const struct __stat64 *, int), - int nfds) -{ - char * const paths[2] = { (char *)path, NULL }; - FTSENT *cur; - FTS *ftsp; - int error = 0, fnflag, sverrno; - - /* XXX - nfds is currently unused */ - if (nfds < 1 || nfds > OPEN_MAX) { - errno = EINVAL; - return (-1); - } - - ftsp = fts_open(paths, FTS_LOGICAL | FTS_COMFOLLOW | FTS_NOCHDIR, NULL); - if (ftsp == NULL) - return (-1); - while ((cur = fts_read(ftsp)) != NULL) { - switch (cur->fts_info) { - case FTS_D: - fnflag = FTW_D; - break; - case FTS_DNR: - fnflag = FTW_DNR; - break; - case FTS_DP: - /* we only visit in preorder */ - continue; - case FTS_F: - case FTS_DEFAULT: - fnflag = FTW_F; - break; - case FTS_NS: - case FTS_NSOK: - case FTS_SLNONE: - fnflag = FTW_NS; - break; - case FTS_SL: - fnflag = FTW_SL; - break; - case FTS_DC: - errno = ELOOP; - /* FALLTHROUGH */ - default: - error = -1; - goto done; - } - error = fn(cur->fts_path, cur->fts_statp, fnflag); - if (error != 0) - break; - } -done: - sverrno = errno; - if (fts_close(ftsp) != 0 && error == 0) - error = -1; - else - errno = sverrno; - return (error); -} diff --git a/winsup/cygwin/libc/getopt.c b/winsup/cygwin/libc/getopt.c deleted file mode 100644 index 0ed46310e..000000000 --- a/winsup/cygwin/libc/getopt.c +++ /dev/null @@ -1,548 +0,0 @@ -/* $OpenBSD: getopt_long.c,v 1.16 2004/02/04 18:17:25 millert Exp $ */ -/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ - -/* - * Copyright (c) 2002 Todd C. Miller - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - * - * Sponsored in part by the Defense Advanced Research Projects - * Agency (DARPA) and Air Force Research Laboratory, Air Force - * Materiel Command, USAF, under agreement number F39502-99-1-0512. - */ -/*- - * Copyright (c) 2000 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Dieter Baron and Thomas Klausner. - * - * 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 NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 defined(LIBC_SCCS) && !defined(lint) -static char *rcsid = "$OpenBSD: getopt_long.c,v 1.16 2004/02/04 18:17:25 millert Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include -#include -#include -#include -#include - -#define REPLACE_GETOPT /* use this getopt as the system getopt(3) */ - -#ifdef REPLACE_GETOPT -int opterr = 1; /* if error message should be printed */ -int optind = 1; /* index into parent argv vector */ -int optopt = '?'; /* character checked for validity */ -int optreset; /* reset getopt */ -char *optarg; /* argument associated with option */ -#endif - -#define PRINT_ERROR ((opterr) && (*options != ':')) - -#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */ -#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */ -#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */ - -/* return values */ -#define BADCH (int)'?' -#define BADARG ((*options == ':') ? (int)':' : (int)'?') -#define INORDER (int)1 - -#ifdef __CYGWIN__ -static char EMSG[] = ""; -#else -#define EMSG "" -#endif - -static int getopt_internal(int, char * const *, const char *, - const struct option *, int *, int); -static int parse_long_options(char * const *, const char *, - const struct option *, int *, int); -static int gcd(int, int); -static void permute_args(int, int, int, char * const *); - -static char *place = EMSG; /* option letter processing */ - -/* XXX: set optreset to 1 rather than these two */ -static int nonopt_start = -1; /* first non option argument (for permute) */ -static int nonopt_end = -1; /* first option after non options (for permute) */ - -/* Error messages */ -static const char recargchar[] = "option requires an argument -- %c"; -static const char recargstring[] = "option requires an argument -- %s"; -static const char ambig[] = "ambiguous option -- %.*s"; -static const char noarg[] = "option doesn't take an argument -- %.*s"; -static const char illoptchar[] = "unknown option -- %c"; -static const char illoptstring[] = "unknown option -- %s"; - -/* - * Compute the greatest common divisor of a and b. - */ -static int -gcd(int a, int b) -{ - int c; - - c = a % b; - while (c != 0) { - a = b; - b = c; - c = a % b; - } - - return (b); -} - -/* - * Exchange the block from nonopt_start to nonopt_end with the block - * from nonopt_end to opt_end (keeping the same order of arguments - * in each block). - */ -static void -permute_args(int panonopt_start, int panonopt_end, int opt_end, - char * const *nargv) -{ - int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos; - char *swap; - - /* - * compute lengths of blocks and number and size of cycles - */ - nnonopts = panonopt_end - panonopt_start; - nopts = opt_end - panonopt_end; - ncycle = gcd(nnonopts, nopts); - cyclelen = (opt_end - panonopt_start) / ncycle; - - for (i = 0; i < ncycle; i++) { - cstart = panonopt_end+i; - pos = cstart; - for (j = 0; j < cyclelen; j++) { - if (pos >= panonopt_end) - pos -= nnonopts; - else - pos += nopts; - swap = nargv[pos]; - /* LINTED const cast */ - ((char **) nargv)[pos] = nargv[cstart]; - /* LINTED const cast */ - ((char **)nargv)[cstart] = swap; - } - } -} - -/* - * parse_long_options -- - * Parse long options in argc/argv argument vector. - * Returns -1 if short_too is set and the option does not match long_options. - */ -static int -parse_long_options(char * const *nargv, const char *options, - const struct option *long_options, int *idx, int short_too) -{ - char *current_argv, *has_equal; - size_t current_argv_len; - int i, match; - - current_argv = place; - match = -1; - - optind++; - - if ((has_equal = strchr(current_argv, '=')) != NULL) { - /* argument found (--option=arg) */ - current_argv_len = has_equal - current_argv; - has_equal++; - } else - current_argv_len = strlen(current_argv); - - for (i = 0; long_options[i].name; i++) { - /* find matching long option */ - if (strncmp(current_argv, long_options[i].name, - current_argv_len)) - continue; - - if (strlen(long_options[i].name) == current_argv_len) { - /* exact match */ - match = i; - break; - } - /* - * If this is a known short option, don't allow - * a partial match of a single character. - */ - if (short_too && current_argv_len == 1) - continue; - - if (match == -1) /* partial match */ - match = i; - else { - /* ambiguous abbreviation */ - if (PRINT_ERROR) - warnx(ambig, (int)current_argv_len, - current_argv); - optopt = 0; - return (BADCH); - } - } - if (match != -1) { /* option found */ - if (long_options[match].has_arg == no_argument - && has_equal) { - if (PRINT_ERROR) - warnx(noarg, (int)current_argv_len, - current_argv); - /* - * XXX: GNU sets optopt to val regardless of flag - */ - if (long_options[match].flag == NULL) - optopt = long_options[match].val; - else - optopt = 0; - return (BADARG); - } - if (long_options[match].has_arg == required_argument || - long_options[match].has_arg == optional_argument) { - if (has_equal) - optarg = has_equal; - else if (long_options[match].has_arg == - required_argument) { - /* - * optional argument doesn't use next nargv - */ - optarg = nargv[optind++]; - } - } - if ((long_options[match].has_arg == required_argument) - && (optarg == NULL)) { - /* - * Missing argument; leading ':' indicates no error - * should be generated. - */ - if (PRINT_ERROR) - warnx(recargstring, - current_argv); - /* - * XXX: GNU sets optopt to val regardless of flag - */ - if (long_options[match].flag == NULL) - optopt = long_options[match].val; - else - optopt = 0; - --optind; - return (BADARG); - } - } else { /* unknown option */ - if (short_too) { - --optind; - return (-1); - } - if (PRINT_ERROR) - warnx(illoptstring, current_argv); - optopt = 0; - return (BADCH); - } - if (idx) - *idx = match; - if (long_options[match].flag) { - *long_options[match].flag = long_options[match].val; - return (0); - } else - return (long_options[match].val); -} - -/* - * getopt_internal -- - * Parse argc/argv argument vector. Called by user level routines. - */ -static int -getopt_internal(int nargc, char * const *nargv, const char *options, - const struct option *long_options, int *idx, int flags) -{ - char *oli; /* option letter list index */ - int optchar, short_too; - static int posixly_correct = -1; - - if (options == NULL) - return (-1); - - /* - * Disable GNU extensions if POSIXLY_CORRECT is set or options - * string begins with a '+'. - */ - if (posixly_correct == -1) - posixly_correct = (getenv("POSIXLY_CORRECT") != NULL); - if (posixly_correct || *options == '+') - flags &= ~FLAG_PERMUTE; - else if (*options == '-') - flags |= FLAG_ALLARGS; - if (*options == '+' || *options == '-') - options++; - - /* - * XXX Some GNU programs (like cvs) set optind to 0 instead of - * XXX using optreset. Work around this braindamage. - */ - if (optind == 0) - optind = optreset = 1; - - optarg = NULL; - if (optreset) - nonopt_start = nonopt_end = -1; -start: - if (optreset || !*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= nargc) { /* end of argument vector */ - place = EMSG; - if (nonopt_end != -1) { - /* do permutation, if we have to */ - permute_args(nonopt_start, nonopt_end, - optind, nargv); - optind -= nonopt_end - nonopt_start; - } - else if (nonopt_start != -1) { - /* - * If we skipped non-options, set optind - * to the first of them. - */ - optind = nonopt_start; - } - nonopt_start = nonopt_end = -1; - return (-1); - } - if (*(place = nargv[optind]) != '-' || - (place[1] == '\0' && strchr(options, '-') == NULL)) { - place = EMSG; /* found non-option */ - if (flags & FLAG_ALLARGS) { - /* - * GNU extension: - * return non-option as argument to option 1 - */ - optarg = nargv[optind++]; - return (INORDER); - } - if (!(flags & FLAG_PERMUTE)) { - /* - * If no permutation wanted, stop parsing - * at first non-option. - */ - return (-1); - } - /* do permutation */ - if (nonopt_start == -1) - nonopt_start = optind; - else if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, - optind, nargv); - nonopt_start = optind - - (nonopt_end - nonopt_start); - nonopt_end = -1; - } - optind++; - /* process next argument */ - goto start; - } - if (nonopt_start != -1 && nonopt_end == -1) - nonopt_end = optind; - - /* - * If we have "-" do nothing, if "--" we are done. - */ - if (place[1] != '\0' && *++place == '-' && place[1] == '\0') { - optind++; - place = EMSG; - /* - * We found an option (--), so if we skipped - * non-options, we have to permute. - */ - if (nonopt_end != -1) { - permute_args(nonopt_start, nonopt_end, - optind, nargv); - optind -= nonopt_end - nonopt_start; - } - nonopt_start = nonopt_end = -1; - return (-1); - } - } - - /* - * Check long options if: - * 1) we were passed some - * 2) the arg is not just "-" - * 3) either the arg starts with -- we are getopt_long_only() - */ - if (long_options != NULL && place != nargv[optind] && - (*place == '-' || (flags & FLAG_LONGONLY))) { - short_too = 0; - if (*place == '-') - place++; /* --foo long option */ - else if (*place != ':' && strchr(options, *place) != NULL) - short_too = 1; /* could be short option too */ - - optchar = parse_long_options(nargv, options, long_options, - idx, short_too); - if (optchar != -1) { - place = EMSG; - return (optchar); - } - } - - if ((optchar = (int)*place++) == (int)':' || - (optchar == (int)'-' && *place != '\0') || - (oli = strchr(options, optchar)) == NULL) { - /* - * If the user specified "-" and '-' isn't listed in - * options, return -1 (non-option) as per POSIX. - * Otherwise, it is an unknown option character (or ':'). - */ - if (optchar == (int)'-' && *place == '\0') - return (-1); - if (!*place) - ++optind; - if (PRINT_ERROR) - warnx(illoptchar, optchar); - optopt = optchar; - return (BADCH); - } - if (long_options != NULL && optchar == 'W' && oli[1] == ';') { - /* -W long-option */ - if (*place) /* no space */ - /* NOTHING */; - else if (++optind >= nargc) { /* no arg */ - place = EMSG; - if (PRINT_ERROR) - warnx(recargchar, optchar); - optopt = optchar; - return (BADARG); - } else /* white space */ - place = nargv[optind]; - optchar = parse_long_options(nargv, options, long_options, - idx, 0); - place = EMSG; - return (optchar); - } - if (*++oli != ':') { /* doesn't take argument */ - if (!*place) - ++optind; - } else { /* takes (optional) argument */ - optarg = NULL; - if (*place) /* no white space */ - optarg = place; - /* XXX: disable test for :: if PC? (GNU doesn't) */ - else if (oli[1] != ':') { /* arg not optional */ - if (++optind >= nargc) { /* no arg */ - place = EMSG; - if (PRINT_ERROR) - warnx(recargchar, optchar); - optopt = optchar; - return (BADARG); - } else - optarg = nargv[optind]; - } else if (!(flags & FLAG_PERMUTE)) { - /* - * If permutation is disabled, we can accept an - * optional arg separated by whitespace. - */ - if (optind + 1 < nargc) - optarg = nargv[++optind]; - } - place = EMSG; - ++optind; - } - /* dump back option letter */ - return (optchar); -} - -#ifdef REPLACE_GETOPT -/* - * getopt -- - * Parse argc/argv argument vector. - * - * [eventually this will replace the BSD getopt] - */ -int -getopt(int nargc, char * const *nargv, const char *options) -{ - - /* - * We dont' pass FLAG_PERMUTE to getopt_internal() since - * the BSD getopt(3) (unlike GNU) has never done this. - * - * Furthermore, since many privileged programs call getopt() - * before dropping privileges it makes sense to keep things - * as simple (and bug-free) as possible. - */ - return (getopt_internal(nargc, nargv, options, NULL, NULL, 0)); -} -#endif /* REPLACE_GETOPT */ - -/* - * getopt_long -- - * Parse argc/argv argument vector. - */ -int -getopt_long(nargc, nargv, options, long_options, idx) - int nargc; - char * const *nargv; - const char *options; - const struct option *long_options; - int *idx; -{ - - return (getopt_internal(nargc, nargv, options, long_options, idx, - FLAG_PERMUTE)); -} - -/* - * getopt_long_only -- - * Parse argc/argv argument vector. - */ -int -getopt_long_only(nargc, nargv, options, long_options, idx) - int nargc; - char * const *nargv; - const char *options; - const struct option *long_options; - int *idx; -{ - - return (getopt_internal(nargc, nargv, options, long_options, idx, - FLAG_PERMUTE|FLAG_LONGONLY)); -} diff --git a/winsup/cygwin/libc/iruserok.c b/winsup/cygwin/libc/iruserok.c deleted file mode 100644 index 8326dd0a5..000000000 --- a/winsup/cygwin/libc/iruserok.c +++ /dev/null @@ -1,270 +0,0 @@ -/* Based on the rcmd.c.new file distributed with linux libc 5.4.19 - Adapted to inetutils by Bernhard Rosenkraenzer - - Note that a lot in this file is superfluous; hopefully it won't be a - problem for systems that need it for iruserok &c.... */ -/* - * Copyright (c) 1983, 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. 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. - */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef PATH_HEQUIV -# define PATH_HEQUIV "/etc/hosts.equiv" -#endif - -int __check_rhosts_file = 1; -const char *__rcmd_errstr; - -/* - * Returns "true" if match, 0 if no match. - */ -static int -__icheckhost(raddr, lhost) - u_long raddr; - register char *lhost; -{ - register struct hostent *hp; - register u_long laddr; - register char **pp; - - /* Try for raw ip address first. */ - if (isdigit(*lhost) && (long)(laddr = cygwin_inet_addr(lhost)) != -1) - return (raddr == laddr); - - /* Better be a hostname. */ - if ((hp = cygwin_gethostbyname(lhost)) == NULL) - return (0); - - /* Spin through ip addresses. */ - for (pp = hp->h_addr_list; *pp; ++pp) - if (!bcmp(&raddr, *pp, sizeof(u_long))) - return (1); - - /* No match. */ - return (0); -} - -/* - * XXX - * Don't make static, used by lpd(8). - * - * Returns 0 if ok, -1 if not ok. - */ -static int -__ivaliduser(hostf, raddr, luser, ruser) - struct __sFILE64 *hostf; - u_long raddr; - const char *luser; - const char *ruser; -{ - size_t buf_offs = 0; - size_t buf_len = 256; - char *buf = malloc (buf_len); - - if (! buf) - return -1; - - while (fgets(buf + buf_offs, buf_len - buf_offs, hostf)) { - /*int ch;*/ - register char *user, *p; - - if (strchr(buf + buf_offs, '\n') == NULL) { - /* No newline yet, read some more. */ - buf_offs += strlen (buf + buf_offs); - - if (buf_offs >= buf_len - 1) { - /* Make more room in BUF. */ - char *new_buf; - - buf_len += buf_len; - new_buf = realloc (buf, buf_len); - - if (! new_buf) { - free (buf); - return -1; - } - - buf = new_buf; - } - - continue; - } - - buf_offs = 0; /* Start at beginning next time around. */ - - p = buf; - while (*p != '\n' && *p != ' ' && *p != '\t' && *p != '\0') { - /* *p = isupper(*p) ? tolower(*p) : *p; -- Uli */ - *p = tolower(*p); /* works for linux libc */ - p++; - } - if (*p == ' ' || *p == '\t') { - *p++ = '\0'; - while (*p == ' ' || *p == '\t') - p++; - user = p; - while (*p != '\n' && *p != ' ' && - *p != '\t' && *p != '\0') - p++; - } else - user = p; - *p = '\0'; - - if (__icheckhost(raddr, buf) && !strcmp(ruser, *user ? user : luser)) { - free (buf); - return (0); - } - } - - free (buf); - - return (-1); -} - -/* - * New .rhosts strategy: We are passed an ip address. We spin through - * hosts.equiv and .rhosts looking for a match. When the .rhosts only - * has ip addresses, we don't have to trust a nameserver. When it - * contains hostnames, we spin through the list of addresses the nameserver - * gives us and look for a match. - * - * Returns 0 if ok, -1 if not ok. - */ -int -iruserok(raddr, superuser, ruser, luser) - u_long raddr; - int superuser; - const char *ruser; - const char *luser; -{ - register const char *cp; - struct __stat64 sbuf; - struct passwd *pwd; - struct __sFILE64 *hostf; - - uid_t uid; - int first = 1; - char *pbuf; - - first = 1; - hostf = superuser ? NULL : fopen64(PATH_HEQUIV, "rt"); -again: - if (hostf) { - if (__ivaliduser(hostf, raddr, luser, ruser) == 0) { - (void) fclose(hostf); - return(0); - } - (void) fclose(hostf); - } - if (first == 1 && (__check_rhosts_file || superuser)) { - first = 0; - if ((pwd = getpwnam(luser)) == NULL) - return(-1); - - pbuf = malloc (strlen (pwd->pw_dir) + sizeof "/.rhosts"); - if (! pbuf) - { - errno = ENOMEM; - return -1; - } - strcpy (pbuf, pwd->pw_dir); - strcat (pbuf, "/.rhosts"); - - /* - * Change effective uid while opening .rhosts. If root and - * reading an NFS mounted file system, can't read files that - * are protected read/write owner only. - */ - uid = geteuid32(); - (void)seteuid32(pwd->pw_uid); - hostf = fopen64(pbuf, "rt"); - (void)seteuid32(uid); - - if (hostf == NULL) - return(-1); - /* - * If not a regular file, or is owned by someone other than - * user or root or if writeable by anyone but the owner, quit. - */ - cp = NULL; - if (lstat64(pbuf, &sbuf) < 0) - cp = ".rhosts not regular file"; - else if (!S_ISREG(sbuf.st_mode)) - cp = ".rhosts not regular file"; - else if (fstat64(fileno(hostf), &sbuf) < 0) - cp = ".rhosts fstat failed"; - else if (sbuf.st_uid && sbuf.st_uid != pwd->pw_uid) - cp = "bad .rhosts owner"; - else if (sbuf.st_mode & (S_IWGRP|S_IWOTH)) - cp = ".rhosts writeable by other than owner"; - /* If there were any problems, quit. */ - if (cp) { - __rcmd_errstr = (char *) cp; - fclose(hostf); - return(-1); - } - goto again; - } - return (-1); -} - -int -ruserok(rhost, superuser, ruser, luser) - const char *rhost; - int superuser; - const char *ruser; - const char *luser; -{ - struct hostent *hp; - u_long addr; - char **ap; - - if ((hp = cygwin_gethostbyname(rhost)) == NULL) - return (-1); - for (ap = hp->h_addr_list; *ap; ++ap) { - bcopy(*ap, &addr, sizeof(addr)); - if (iruserok(addr, superuser, ruser, luser) == 0) - return (0); - } - return (-1); -} diff --git a/winsup/cygwin/libc/memmem.cc b/winsup/cygwin/libc/memmem.cc deleted file mode 100644 index cd9dc33d3..000000000 --- a/winsup/cygwin/libc/memmem.cc +++ /dev/null @@ -1,67 +0,0 @@ -/*- - * Copyright (c) 2005 Pascal Gloor - * - * 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 of the author may not be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * 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 -#if 0 -__FBSDID("$FreeBSD: src/lib/libc/string/memmem.c,v 1.1 2005/08/25 18:26:58 andre Exp $"); -#endif - -#include - -/* Find the first occurrence of the byte string s in byte string l. - */ - -extern "C" void * -memmem (const void *l, size_t l_len, - const void *s, size_t s_len) -{ - register char *cur, *last; - const char *cl = (const char *)l; - const char *cs = (const char *)s; - - /* we need something to compare */ - if (l_len == 0 || s_len == 0) - return NULL; - - /* "s" must be smaller or equal to "l" */ - if (l_len < s_len) - return NULL; - - /* special case where s_len == 1 */ - if (s_len == 1) - return memchr (l, (int) *cs, l_len); - - /* the last position where its possible to find "s" in "l" */ - last = (char *) cl + l_len - s_len; - - for (cur = (char *) cl; cur <= last; cur++) - if (cur[0] == cs[0] && memcmp (cur, cs, s_len) == 0) - return cur; - - return NULL; -} diff --git a/winsup/cygwin/libc/nftw.c b/winsup/cygwin/libc/nftw.c deleted file mode 100644 index f7c06b29d..000000000 --- a/winsup/cygwin/libc/nftw.c +++ /dev/null @@ -1,121 +0,0 @@ -/* $OpenBSD: nftw.c,v 1.4 2004/07/07 16:05:23 millert Exp $ */ - -/* - * Copyright (c) 2003, 2004 Todd C. Miller - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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. - * - * Sponsored in part by the Defense Advanced Research Projects - * Agency (DARPA) and Air Force Research Laboratory, Air Force - * Materiel Command, USAF, under agreement number F39502-99-1-0512. - */ - -#if 0 -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$OpenBSD: nftw.c,v 1.4 2004/07/07 16:05:23 millert Exp $"; -#endif /* LIBC_SCCS and not lint */ -#endif - -#ifdef __CYGWIN__ -#include "winsup.h" -#endif -#include -#if 0 -__FBSDID("$FreeBSD: /repoman/r/ncvs/src/lib/libc/gen/nftw.c,v 1.1.2.1 2004/08/29 06:10:53 tjr Exp $"); -#endif -#include -#include -#include -#include -#include -#include - -int -nftw(const char *path, int (*fn)(const char *, const struct __stat64 *, int, - struct FTW *), int nfds, int ftwflags) -{ - char * const paths[2] = { (char *)path, NULL }; - struct FTW ftw; - FTSENT *cur; - FTS *ftsp; - int error = 0, ftsflags, fnflag, postorder, sverrno; - - /* XXX - nfds is currently unused */ - if (nfds < 1 || nfds > OPEN_MAX) { - errno = EINVAL; - return (-1); - } - - ftsflags = FTS_COMFOLLOW; - if (!(ftwflags & FTW_CHDIR)) - ftsflags |= FTS_NOCHDIR; - if (ftwflags & FTW_MOUNT) - ftsflags |= FTS_XDEV; - if (ftwflags & FTW_PHYS) - ftsflags |= FTS_PHYSICAL; - else - ftsflags |= FTS_LOGICAL; - postorder = (ftwflags & FTW_DEPTH) != 0; - ftsp = fts_open(paths, ftsflags, NULL); - if (ftsp == NULL) - return (-1); - while ((cur = fts_read(ftsp)) != NULL) { - switch (cur->fts_info) { - case FTS_D: - if (postorder) - continue; - fnflag = FTW_D; - break; - case FTS_DNR: - fnflag = FTW_DNR; - break; - case FTS_DP: - if (!postorder) - continue; - fnflag = FTW_DP; - break; - case FTS_F: - case FTS_DEFAULT: - fnflag = FTW_F; - break; - case FTS_NS: - case FTS_NSOK: - fnflag = FTW_NS; - break; - case FTS_SL: - fnflag = FTW_SL; - break; - case FTS_SLNONE: - fnflag = FTW_SLN; - break; - case FTS_DC: - errno = ELOOP; - /* FALLTHROUGH */ - default: - error = -1; - goto done; - } - ftw.base = cur->fts_pathlen - cur->fts_namelen; - ftw.level = cur->fts_level; - error = fn(cur->fts_path, cur->fts_statp, fnflag, &ftw); - if (error != 0) - break; - } -done: - sverrno = errno; - if (fts_close(ftsp) != 0 && error == 0) - error = -1; - else - errno = sverrno; - return (error); -} diff --git a/winsup/cygwin/libc/strptime.cc b/winsup/cygwin/libc/strptime.cc deleted file mode 100644 index e81cdd580..000000000 --- a/winsup/cygwin/libc/strptime.cc +++ /dev/null @@ -1,545 +0,0 @@ -/* - * Powerdog Industries kindly requests feedback from anyone modifying - * this function: - * - * Date: Thu, 05 Jun 1997 23:17:17 -0400 - * From: Kevin Ruddy - * To: James FitzGibbon - * Subject: Re: Use of your strptime(3) code (fwd) - * - * The reason for the "no mod" clause was so that modifications would - * come back and we could integrate them and reissue so that a wider - * audience could use it (thereby spreading the wealth). This has - * made it possible to get strptime to work on many operating systems. - * I'm not sure why that's "plain unacceptable" to the FreeBSD team. - * - * Anyway, you can change it to "with or without modification" as - * you see fit. Enjoy. - * - * Kevin Ruddy - * Powerdog Industries, Inc. - */ -/* - * Copyright (c) 1994 Powerdog Industries. 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 Powerdog Industries. - * 4. The name of Powerdog Industries may not be used to endorse or - * promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY POWERDOG INDUSTRIES ``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 POWERDOG INDUSTRIES 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 -#ifdef __CYGWIN__ -#include "winsup.h" -#else -#ifndef lint -#ifndef NOID -static char copyright[] __unused = -"@(#) Copyright (c) 1994 Powerdog Industries. All rights reserved."; -static char sccsid[] __unused = "@(#)strptime.c 0.1 (Powerdog) 94/03/27"; -#endif /* !defined NOID */ -#endif /* not lint */ -__FBSDID("$FreeBSD: /repoman/r/ncvs/src/lib/libc/stdtime/strptime.c,v 1.35 2003/11/17 04:19:15 nectar Exp $"); - -#include "namespace.h" -#endif -#include -#include -#include -#include -#include -#ifndef __CYGWIN__ -#include -#include "un-namespace.h" -#include "libc_private.h" -#endif -#include "timelocal.h" - -static char * _strptime(const char *, const char *, struct tm *, int *); - -#define asizeof(a) ((int)(sizeof (a) / sizeof ((a)[0]))) - -static char * -_strptime(const char *buf, const char *fmt, struct tm *tm, int *GMTp) -{ - char c; - const char *ptr; - int i, - len; - int Ealternative, Oalternative; - struct lc_time_T *tptr = __get_current_time_locale(); - - ptr = fmt; - while (*ptr != 0) { - if (*buf == 0) - break; - - c = *ptr++; - - if (c != '%') { - if (isspace((unsigned char)c)) - while (*buf != 0 && isspace((unsigned char)*buf)) - buf++; - else if (c != *buf++) - return 0; - continue; - } - - Ealternative = 0; - Oalternative = 0; -label: - c = *ptr++; - switch (c) { - case 0: - case '%': - if (*buf++ != '%') - return 0; - break; - - case '+': - buf = _strptime(buf, tptr->date_fmt, tm, GMTp); - if (buf == 0) - return 0; - break; - - case 'C': - if (!isdigit((unsigned char)*buf)) - return 0; - - /* XXX This will break for 3-digit centuries. */ - len = 2; - for (i = 0; len && *buf != 0 && isdigit((unsigned char)*buf); buf++) { - i *= 10; - i += *buf - '0'; - len--; - } - if (i < 19) - return 0; - - tm->tm_year = i * 100 - 1900; - break; - - case 'c': - buf = _strptime(buf, tptr->c_fmt, tm, GMTp); - if (buf == 0) - return 0; - break; - - case 'D': - buf = _strptime(buf, "%m/%d/%y", tm, GMTp); - if (buf == 0) - return 0; - break; - - case 'E': - if (Ealternative || Oalternative) - break; - Ealternative++; - goto label; - - case 'O': - if (Ealternative || Oalternative) - break; - Oalternative++; - goto label; - - case 'F': - buf = _strptime(buf, "%Y-%m-%d", tm, GMTp); - if (buf == 0) - return 0; - break; - - case 'R': - buf = _strptime(buf, "%H:%M", tm, GMTp); - if (buf == 0) - return 0; - break; - - case 'r': - buf = _strptime(buf, tptr->ampm_fmt, tm, GMTp); - if (buf == 0) - return 0; - break; - - case 'T': - buf = _strptime(buf, "%H:%M:%S", tm, GMTp); - if (buf == 0) - return 0; - break; - - case 'X': - buf = _strptime(buf, tptr->X_fmt, tm, GMTp); - if (buf == 0) - return 0; - break; - - case 'x': - buf = _strptime(buf, tptr->x_fmt, tm, GMTp); - if (buf == 0) - return 0; - break; - - case 'j': - if (!isdigit((unsigned char)*buf)) - return 0; - - len = 3; - for (i = 0; len && *buf != 0 && isdigit((unsigned char)*buf); buf++) { - i *= 10; - i += *buf - '0'; - len--; - } - if (i < 1 || i > 366) - return 0; - - tm->tm_yday = i - 1; - break; - - case 'M': - case 'S': - if (*buf == 0 || isspace((unsigned char)*buf)) - break; - - if (!isdigit((unsigned char)*buf)) - return 0; - - len = 2; - for (i = 0; len && *buf != 0 && isdigit((unsigned char)*buf); buf++) { - i *= 10; - i += *buf - '0'; - len--; - } - - if (c == 'M') { - if (i > 59) - return 0; - tm->tm_min = i; - } else { - if (i > 60) - return 0; - tm->tm_sec = i; - } - - if (*buf != 0 && isspace((unsigned char)*buf)) - while (*ptr != 0 && !isspace((unsigned char)*ptr)) - ptr++; - break; - - case 'H': - case 'I': - case 'k': - case 'l': - /* - * Of these, %l is the only specifier explicitly - * documented as not being zero-padded. However, - * there is no harm in allowing zero-padding. - * - * XXX The %l specifier may gobble one too many - * digits if used incorrectly. - */ - if (!isdigit((unsigned char)*buf)) - return 0; - - len = 2; - for (i = 0; len && *buf != 0 && isdigit((unsigned char)*buf); buf++) { - i *= 10; - i += *buf - '0'; - len--; - } - if (c == 'H' || c == 'k') { - if (i > 23) - return 0; - } else if (i > 12) - return 0; - - tm->tm_hour = i; - - if (*buf != 0 && isspace((unsigned char)*buf)) - while (*ptr != 0 && !isspace((unsigned char)*ptr)) - ptr++; - break; - - case 'p': - /* - * XXX This is bogus if parsed before hour-related - * specifiers. - */ - len = strlen(tptr->am); - if (strncasecmp(buf, tptr->am, len) == 0) { - if (tm->tm_hour > 12) - return 0; - if (tm->tm_hour == 12) - tm->tm_hour = 0; - buf += len; - break; - } - - len = strlen(tptr->pm); - if (strncasecmp(buf, tptr->pm, len) == 0) { - if (tm->tm_hour > 12) - return 0; - if (tm->tm_hour != 12) - tm->tm_hour += 12; - buf += len; - break; - } - - return 0; - - case 'A': - case 'a': - len = 0; - for (i = 0; i < asizeof(tptr->weekday); i++) { - len = strlen(tptr->weekday[i]); - if (strncasecmp(buf, tptr->weekday[i], - len) == 0) - break; - len = strlen(tptr->wday[i]); - if (strncasecmp(buf, tptr->wday[i], - len) == 0) - break; - } - if (i == asizeof(tptr->weekday)) - return 0; - - tm->tm_wday = i; - buf += len; - break; - - case 'U': - case 'W': - /* - * XXX This is bogus, as we can not assume any valid - * information present in the tm structure at this - * point to calculate a real value, so just check the - * range for now. - */ - if (!isdigit((unsigned char)*buf)) - return 0; - - len = 2; - for (i = 0; len && *buf != 0 && isdigit((unsigned char)*buf); buf++) { - i *= 10; - i += *buf - '0'; - len--; - } - if (i > 53) - return 0; - - if (*buf != 0 && isspace((unsigned char)*buf)) - while (*ptr != 0 && !isspace((unsigned char)*ptr)) - ptr++; - break; - - case 'w': - if (!isdigit((unsigned char)*buf)) - return 0; - - i = *buf - '0'; - if (i > 6) - return 0; - - tm->tm_wday = i; - - if (*buf != 0 && isspace((unsigned char)*buf)) - while (*ptr != 0 && !isspace((unsigned char)*ptr)) - ptr++; - break; - - case 'd': - case 'e': - /* - * The %e specifier is explicitly documented as not - * being zero-padded but there is no harm in allowing - * such padding. - * - * XXX The %e specifier may gobble one too many - * digits if used incorrectly. - */ - if (!isdigit((unsigned char)*buf)) - return 0; - - len = 2; - for (i = 0; len && *buf != 0 && isdigit((unsigned char)*buf); buf++) { - i *= 10; - i += *buf - '0'; - len--; - } - if (i > 31) - return 0; - - tm->tm_mday = i; - - if (*buf != 0 && isspace((unsigned char)*buf)) - while (*ptr != 0 && !isspace((unsigned char)*ptr)) - ptr++; - break; - - case 'B': - case 'b': - case 'h': - len = 0; - for (i = 0; i < asizeof(tptr->month); i++) { - if (Oalternative) { - if (c == 'B') { - len = strlen(tptr->alt_month[i]); - if (strncasecmp(buf, - tptr->alt_month[i], - len) == 0) - break; - } - } else { - len = strlen(tptr->month[i]); - if (strncasecmp(buf, tptr->month[i], - len) == 0) - break; - len = strlen(tptr->mon[i]); - if (strncasecmp(buf, tptr->mon[i], - len) == 0) - break; - } - } - if (i == asizeof(tptr->month)) - return 0; - - tm->tm_mon = i; - buf += len; - break; - - case 'm': - if (!isdigit((unsigned char)*buf)) - return 0; - - len = 2; - for (i = 0; len && *buf != 0 && isdigit((unsigned char)*buf); buf++) { - i *= 10; - i += *buf - '0'; - len--; - } - if (i < 1 || i > 12) - return 0; - - tm->tm_mon = i - 1; - - if (*buf != 0 && isspace((unsigned char)*buf)) - while (*ptr != 0 && !isspace((unsigned char)*ptr)) - ptr++; - break; - - case 's': - { - char *cp; - int sverrno; - long n; - time_t t; - - sverrno = errno; - errno = 0; - n = strtol(buf, &cp, 10); - if (errno == ERANGE || (long)(t = n) != n) { - errno = sverrno; - return 0; - } - errno = sverrno; - buf = cp; - gmtime_r(&t, tm); - *GMTp = 1; - } - break; - - case 'Y': - case 'y': - if (*buf == 0 || isspace((unsigned char)*buf)) - break; - - if (!isdigit((unsigned char)*buf)) - return 0; - - len = (c == 'Y') ? 4 : 2; - for (i = 0; len && *buf != 0 && isdigit((unsigned char)*buf); buf++) { - i *= 10; - i += *buf - '0'; - len--; - } - if (c == 'Y') - i -= 1900; - if (c == 'y' && i < 69) - i += 100; - if (i < 0) - return 0; - - tm->tm_year = i; - - if (*buf != 0 && isspace((unsigned char)*buf)) - while (*ptr != 0 && !isspace((unsigned char)*ptr)) - ptr++; - break; - - case 'Z': - { - const char *cp; - char *zonestr; - - for (cp = buf; *cp && isupper((unsigned char)*cp); ++cp) {/*empty*/} - if (cp - buf) { - zonestr = (char *) alloca(cp - buf + 1); - strncpy(zonestr, buf, cp - buf); - zonestr[cp - buf] = '\0'; - tzset(); - if (0 == strcmp(zonestr, "GMT")) { - *GMTp = 1; - } else if (0 == strcmp(zonestr, tzname[0])) { - tm->tm_isdst = 0; - } else if (0 == strcmp(zonestr, tzname[1])) { - tm->tm_isdst = 1; - } else { - return 0; - } - buf += cp - buf; - } - } - break; - } - } - return (char *)buf; -} - -extern "C" char * -strptime(const char * __restrict buf, const char * __restrict fmt, - struct tm * __restrict tm) -{ - char *ret; - int gmt; - - gmt = 0; - ret = _strptime(buf, fmt, tm, &gmt); - if (ret && gmt) { - time_t t = timegm(tm); - localtime_r(&t, tm); - } - - return (ret); -} diff --git a/winsup/cygwin/libc/timelocal.cc b/winsup/cygwin/libc/timelocal.cc deleted file mode 100644 index 59a2e4155..000000000 --- a/winsup/cygwin/libc/timelocal.cc +++ /dev/null @@ -1,125 +0,0 @@ -/*- - * Copyright (c) 2001 Alexey Zelkin - * Copyright (c) 1997 FreeBSD Inc. - * 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 -//__FBSDID("$FreeBSD: /repoman/r/ncvs/src/lib/libc/stdtime/timelocal.c,v 1.25 2003/06/13 00:14:07 jkh Exp $"); - -#include - -//#include "ldpart.h" -#include "timelocal.h" - -#ifndef __CYGWIN__ -static struct lc_time_T _time_locale; -static int _time_using_locale; -static char *time_locale_buf; -#endif - -#define LCTIME_SIZE (sizeof(struct lc_time_T) / sizeof(char *)) - -static const struct lc_time_T _C_time_locale = { - { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" - }, { - "January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December" - }, { - "Sun", "Mon", "Tue", "Wed", - "Thu", "Fri", "Sat" - }, { - "Sunday", "Monday", "Tuesday", "Wednesday", - "Thursday", "Friday", "Saturday" - }, - - /* X_fmt */ - "%H:%M:%S", - - /* - * x_fmt - * Since the C language standard calls for - * "date, using locale's date format," anything goes. - * Using just numbers (as here) makes Quakers happier; - * it's also compatible with SVR4. - */ - "%m/%d/%y", - - /* - * c_fmt - */ - "%a %b %e %H:%M:%S %Y", - - /* am */ - "AM", - - /* pm */ - "PM", - - /* date_fmt */ - "%a %b %e %H:%M:%S %Z %Y", - - /* alt_month - * Standalone months forms for %OB - */ - { - "January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December" - }, - - /* md_order - * Month / day order in dates - */ - "md", - - /* ampm_fmt - * To determine 12-hour clock format time (empty, if N/A) - */ - "%I:%M:%S %p" -}; - -extern "C" struct lc_time_T * -__get_current_time_locale(void) -{ -#ifdef __CYGWIN__ - return (struct lc_time_T *)&_C_time_locale; -#else - return (_time_using_locale - ? &_time_locale - : (struct lc_time_T *)&_C_time_locale); -#endif -} - -#ifndef __CYGWIN__ -extern "C" int -__time_load_locale(const char *name) -{ - return (__part_load_locale(name, &_time_using_locale, - &time_locale_buf, "LC_TIME", - LCTIME_SIZE, LCTIME_SIZE, - (const char **)&_time_locale)); -} -#endif diff --git a/winsup/cygwin/libc/timelocal.h b/winsup/cygwin/libc/timelocal.h deleted file mode 100644 index e7d515276..000000000 --- a/winsup/cygwin/libc/timelocal.h +++ /dev/null @@ -1,65 +0,0 @@ -/*- - * Copyright (c) 1997-2002 FreeBSD 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. - * - * 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. - * - * $FreeBSD: /repoman/r/ncvs/src/lib/libc/stdtime/timelocal.h,v 1.11 2002/01/24 15:07:44 phantom Exp $ - */ - -#ifndef _TIMELOCAL_H_ -#define _TIMELOCAL_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Private header file for the strftime and strptime localization - * stuff. - */ -struct lc_time_T { - const char *mon[12]; - const char *month[12]; - const char *wday[7]; - const char *weekday[7]; - const char *X_fmt; - const char *x_fmt; - const char *c_fmt; - const char *am; - const char *pm; - const char *date_fmt; - const char *alt_month[12]; - const char *md_order; - const char *ampm_fmt; -}; - -struct lc_time_T *__get_current_time_locale(void); -#ifndef __CYGWIN__ -int __time_load_locale(const char *); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* !_TIMELOCAL_H_ */ diff --git a/winsup/cygwin/localtime.cc b/winsup/cygwin/localtime.cc deleted file mode 100644 index b8b1a6013..000000000 --- a/winsup/cygwin/localtime.cc +++ /dev/null @@ -1,2166 +0,0 @@ -/* -** This file is in the public domain, so clarified as of -** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov). -*/ -/* Temporarily merged private.h and tzfile.h for ease of management - DJ */ - -#include "winsup.h" -#include "cygerrno.h" -#include -#define STD_INSPIRED -#define lint - -#define USG_COMPAT - -#ifndef lint -#ifndef NOID -static char elsieid[] = "@(#)localtime.c 7.66"; -#endif /* !defined NOID */ -#endif /* !defined lint */ - -/* -** Leap second handling from Bradley White (bww@k.gp.cs.cmu.edu). -** POSIX-style TZ environment variable handling from Guy Harris -** (guy@auspex.com). -*/ - -/*LINTLIBRARY*/ - -#ifndef PRIVATE_H - -#define PRIVATE_H - -/* -** This file is in the public domain, so clarified as of -** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov). -*/ - -/* -** This header is for use ONLY with the time conversion code. -** There is no guarantee that it will remain unchanged, -** or that it will remain at all. -** Do NOT copy it to any system include directory. -** Thank you! -*/ - -/* -** ID -*/ - -#ifndef lint -#ifndef NOID -static char privatehid[] = "@(#)private.h 7.48"; -#endif /* !defined NOID */ -#endif /* !defined lint */ - -/* -** Defaults for preprocessor symbols. -** You can override these in your C compiler options, e.g. `-DHAVE_ADJTIME=0'. -*/ - -#ifndef HAVE_ADJTIME -#define HAVE_ADJTIME 1 -#endif /* !defined HAVE_ADJTIME */ - -#ifndef HAVE_GETTEXT -#define HAVE_GETTEXT 0 -#endif /* !defined HAVE_GETTEXT */ - -#ifndef HAVE_SETTIMEOFDAY -#define HAVE_SETTIMEOFDAY 3 -#endif /* !defined HAVE_SETTIMEOFDAY */ - -#ifndef HAVE_STRERROR -#define HAVE_STRERROR 0 -#endif /* !defined HAVE_STRERROR */ - -#ifndef HAVE_SYMLINK -#define HAVE_SYMLINK 1 -#endif /* !defined HAVE_SYMLINK */ - -#ifndef HAVE_UNISTD_H -#define HAVE_UNISTD_H 1 -#endif /* !defined HAVE_UNISTD_H */ - -#ifndef HAVE_UTMPX_H -#define HAVE_UTMPX_H 0 -#endif /* !defined HAVE_UTMPX_H */ - -#ifndef LOCALE_HOME -#define LOCALE_HOME "/usr/lib/locale" -#endif /* !defined LOCALE_HOME */ - -/* -** Nested includes -*/ - -#include "sys/types.h" /* for time_t */ -#include "stdio.h" -#include "limits.h" /* for CHAR_BIT */ -#include "time.h" -#include "stdlib.h" - -#if HAVE_GETTEXT - 0 -#include "libintl.h" -#endif /* HAVE_GETTEXT - 0 */ - -#if HAVE_UNISTD_H - 0 -#include "unistd.h" /* for F_OK and R_OK */ -#endif /* HAVE_UNISTD_H - 0 */ - -#if !(HAVE_UNISTD_H - 0) -#ifndef F_OK -#define F_OK 0 -#endif /* !defined F_OK */ -#ifndef R_OK -#define R_OK 4 -#endif /* !defined R_OK */ -#endif /* !(HAVE_UNISTD_H - 0) */ - -/* Unlike 's isdigit, this also works if c < 0 | c > UCHAR_MAX. */ -#define is_digit(c) ((unsigned)(c) - '0' <= 9) - -/* -** Workarounds for compilers/systems. -*/ - -/* -** SunOS 4.1.1 cc lacks const. -*/ - -#ifndef const -#ifndef __STDC__ -#define const -#endif /* !defined __STDC__ */ -#endif /* !defined const */ - -/* -** SunOS 4.1.1 cc lacks prototypes. -*/ - -#ifndef P -#ifdef __STDC__ -#define P(x) x -#endif /* defined __STDC__ */ -#ifndef __STDC__ -#define P(x) () -#endif /* !defined __STDC__ */ -#endif /* !defined P */ - -/* -** SunOS 4.1.1 headers lack EXIT_SUCCESS. -*/ - -#ifndef EXIT_SUCCESS -#define EXIT_SUCCESS 0 -#endif /* !defined EXIT_SUCCESS */ - -/* -** SunOS 4.1.1 headers lack EXIT_FAILURE. -*/ - -#ifndef EXIT_FAILURE -#define EXIT_FAILURE 1 -#endif /* !defined EXIT_FAILURE */ - -/* -** SunOS 4.1.1 headers lack FILENAME_MAX. -*/ - -#ifndef FILENAME_MAX - -#ifndef MAXPATHLEN -#ifdef unix -#include "sys/param.h" -#endif /* defined unix */ -#endif /* !defined MAXPATHLEN */ - -#ifdef MAXPATHLEN -#define FILENAME_MAX MAXPATHLEN -#endif /* defined MAXPATHLEN */ -#ifndef MAXPATHLEN -#define FILENAME_MAX 1024 /* Pure guesswork */ -#endif /* !defined MAXPATHLEN */ - -#endif /* !defined FILENAME_MAX */ - -/* -** SunOS 4.1.1 libraries lack remove. -*/ - -#ifndef remove -extern int unlink P((const char * filename)); -#define remove unlink -#endif /* !defined remove */ - -/* -** Finally, some convenience items. -*/ - -#ifndef TYPE_BIT -#define TYPE_BIT(type) (sizeof (type) * CHAR_BIT) -#endif /* !defined TYPE_BIT */ - -#ifndef TYPE_SIGNED -#define TYPE_SIGNED(type) (((type) -1) < 0) -#endif /* !defined TYPE_SIGNED */ - -#ifndef INT_STRLEN_MAXIMUM -/* -** 302 / 1000 is log10(2.0) rounded up. -** Subtract one for the sign bit if the type is signed; -** add one for integer division truncation; -** add one more for a minus sign if the type is signed. -*/ -#define INT_STRLEN_MAXIMUM(type) \ - ((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + 1 + TYPE_SIGNED(type)) -#endif /* !defined INT_STRLEN_MAXIMUM */ - -/* -** INITIALIZE(x) -*/ - -#ifndef GNUC_or_lint -#ifdef lint -#define GNUC_or_lint -#endif /* defined lint */ -#ifndef lint -#ifdef __GNUC__ -#define GNUC_or_lint -#endif /* defined __GNUC__ */ -#endif /* !defined lint */ -#endif /* !defined GNUC_or_lint */ - -#ifndef INITIALIZE -#ifdef GNUC_or_lint -#define INITIALIZE(x) ((x) = 0) -#endif /* defined GNUC_or_lint */ -#ifndef GNUC_or_lint -#define INITIALIZE(x) -#endif /* !defined GNUC_or_lint */ -#endif /* !defined INITIALIZE */ - -/* -** For the benefit of GNU folk... -** `_(MSGID)' uses the current locale's message library string for MSGID. -** The default is to use gettext if available, and use MSGID otherwise. -*/ - -#ifndef _ -#if HAVE_GETTEXT - 0 -#define _(msgid) gettext(msgid) -#else /* !(HAVE_GETTEXT - 0) */ -#define _(msgid) msgid -#endif /* !(HAVE_GETTEXT - 0) */ -#endif /* !defined _ */ - -#ifndef TZ_DOMAIN -#define TZ_DOMAIN "tz" -#endif /* !defined TZ_DOMAIN */ - -/* -** UNIX was a registered trademark of UNIX System Laboratories in 1993. -*/ - -#endif /* !defined PRIVATE_H */ - -#ifndef TZFILE_H - -#define TZFILE_H - -/* -** This file is in the public domain, so clarified as of -** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov). -*/ - -/* -** This header is for use ONLY with the time conversion code. -** There is no guarantee that it will remain unchanged, -** or that it will remain at all. -** Do NOT copy it to any system include directory. -** Thank you! -*/ - -/* -** ID -*/ - -#ifndef lint -#ifndef NOID -static char tzfilehid[] = "@(#)tzfile.h 7.14"; -#endif /* !defined NOID */ -#endif /* !defined lint */ - -/* -** Information about time zone files. -*/ - -#ifndef TZDIR -#define TZDIR "/usr/share/zoneinfo" /* Time zone object file directory */ -#endif /* !defined TZDIR */ - -#ifndef TZDEFAULT -#define TZDEFAULT "localtime" -#endif /* !defined TZDEFAULT */ - -#ifndef TZDEFRULES -#define TZDEFRULES "posixrules" -#endif /* !defined TZDEFRULES */ - -/* -** Each file begins with. . . -*/ - -#define TZ_MAGIC "TZif" - -struct tzhead { - char tzh_magic[4]; /* TZ_MAGIC */ - char tzh_reserved[16]; /* reserved for future use */ - char tzh_ttisgmtcnt[4]; /* coded number of trans. time flags */ - char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */ - char tzh_leapcnt[4]; /* coded number of leap seconds */ - char tzh_timecnt[4]; /* coded number of transition times */ - char tzh_typecnt[4]; /* coded number of local time types */ - char tzh_charcnt[4]; /* coded number of abbr. chars */ -}; - -/* -** . . .followed by. . . -** -** tzh_timecnt (char [4])s coded transition times a la time(2) -** tzh_timecnt (unsigned char)s types of local time starting at above -** tzh_typecnt repetitions of -** one (char [4]) coded UTC offset in seconds -** one (unsigned char) used to set tm_isdst -** one (unsigned char) that's an abbreviation list index -** tzh_charcnt (char)s '\0'-terminated zone abbreviations -** tzh_leapcnt repetitions of -** one (char [4]) coded leap second transition times -** one (char [4]) total correction after above -** tzh_ttisstdcnt (char)s indexed by type; if true, transition -** time is standard time, if false, -** transition time is wall clock time -** if absent, transition times are -** assumed to be wall clock time -** tzh_ttisgmtcnt (char)s indexed by type; if true, transition -** time is UTC, if false, -** transition time is local time -** if absent, transition times are -** assumed to be local time -*/ - -/* -** In the current implementation, "tzset()" refuses to deal with files that -** exceed any of the limits below. -*/ - -#ifndef TZ_MAX_TIMES -/* -** The TZ_MAX_TIMES value below is enough to handle a bit more than a -** year's worth of solar time (corrected daily to the nearest second) or -** 138 years of Pacific Presidential Election time -** (where there are three time zone transitions every fourth year). -*/ -#define TZ_MAX_TIMES 370 -#endif /* !defined TZ_MAX_TIMES */ - -#ifndef TZ_MAX_TYPES -#ifndef NOSOLAR -#define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */ -#endif /* !defined NOSOLAR */ -#ifdef NOSOLAR -/* -** Must be at least 14 for Europe/Riga as of Jan 12 1995, -** as noted by Earl Chew . -*/ -#define TZ_MAX_TYPES 20 /* Maximum number of local time types */ -#endif /* !defined NOSOLAR */ -#endif /* !defined TZ_MAX_TYPES */ - -#ifndef TZ_MAX_CHARS -#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */ - /* (limited by what unsigned chars can hold) */ -#endif /* !defined TZ_MAX_CHARS */ - -#ifndef TZ_MAX_LEAPS -#define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */ -#endif /* !defined TZ_MAX_LEAPS */ - -#define SECSPERMIN 60 -#define MINSPERHOUR 60 -#define HOURSPERDAY 24 -#define DAYSPERWEEK 7 -#define DAYSPERNYEAR 365 -#define DAYSPERLYEAR 366 -#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) -#define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY) -#define MONSPERYEAR 12 - -#define TM_SUNDAY 0 -#define TM_MONDAY 1 -#define TM_TUESDAY 2 -#define TM_WEDNESDAY 3 -#define TM_THURSDAY 4 -#define TM_FRIDAY 5 -#define TM_SATURDAY 6 - -#define TM_JANUARY 0 -#define TM_FEBRUARY 1 -#define TM_MARCH 2 -#define TM_APRIL 3 -#define TM_MAY 4 -#define TM_JUNE 5 -#define TM_JULY 6 -#define TM_AUGUST 7 -#define TM_SEPTEMBER 8 -#define TM_OCTOBER 9 -#define TM_NOVEMBER 10 -#define TM_DECEMBER 11 - -#define TM_YEAR_BASE 1900 - -#define EPOCH_YEAR 1970 -#define EPOCH_WDAY TM_THURSDAY - -/* -** Accurate only for the past couple of centuries; -** that will probably do. -*/ - -#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) - -#ifndef USG - -/* -** Use of the underscored variants may cause problems if you move your code to -** certain System-V-based systems; for maximum portability, use the -** underscore-free variants. The underscored variants are provided for -** backward compatibility only; they may disappear from future versions of -** this file. -*/ - -#define SECS_PER_MIN SECSPERMIN -#define MINS_PER_HOUR MINSPERHOUR -#define HOURS_PER_DAY HOURSPERDAY -#define DAYS_PER_WEEK DAYSPERWEEK -#define DAYS_PER_NYEAR DAYSPERNYEAR -#define DAYS_PER_LYEAR DAYSPERLYEAR -#define SECS_PER_HOUR SECSPERHOUR -#define SECS_PER_DAY SECSPERDAY -#define MONS_PER_YEAR MONSPERYEAR - -#endif /* !defined USG */ - -#endif /* !defined TZFILE_H */ - -#include "fcntl.h" - -/* -** SunOS 4.1.1 headers lack O_BINARY. -*/ - -#ifdef O_BINARY -#define OPEN_MODE (O_RDONLY | O_BINARY) -#endif /* defined O_BINARY */ -#ifndef O_BINARY -#define OPEN_MODE O_RDONLY -#endif /* !defined O_BINARY */ - -#ifndef WILDABBR -/* -** Someone might make incorrect use of a time zone abbreviation: -** 1. They might reference tzname[0] before calling tzset (explicitly -** or implicitly). -** 2. They might reference tzname[1] before calling tzset (explicitly -** or implicitly). -** 3. They might reference tzname[1] after setting to a time zone -** in which Daylight Saving Time is never observed. -** 4. They might reference tzname[0] after setting to a time zone -** in which Standard Time is never observed. -** 5. They might reference tm.TM_ZONE after calling offtime. -** What's best to do in the above cases is open to debate; -** for now, we just set things up so that in any of the five cases -** WILDABBR is used. Another possibility: initialize tzname[0] to the -** string "tzname[0] used before set", and similarly for the other cases. -** And another: initialize tzname[0] to "ERA", with an explanation in the -** manual page of what this "time zone abbreviation" means (doing this so -** that tzname[0] has the "normal" length of three characters). -*/ -#define WILDABBR " " -#endif /* !defined WILDABBR */ - -static char wildabbr[] NO_COPY = WILDABBR; - -static char gmt[] NO_COPY = "GMT"; - -struct ttinfo { /* time type information */ - long tt_gmtoff; /* UTC offset in seconds */ - int tt_isdst; /* used to set tm_isdst */ - int tt_abbrind; /* abbreviation list index */ - int tt_ttisstd; /* true if transition is std time */ - int tt_ttisgmt; /* true if transition is UTC */ -}; - -struct lsinfo { /* leap second information */ - time_t ls_trans; /* transition time */ - long ls_corr; /* correction to apply */ -}; - -#define BIGGEST(a, b) (((a) > (b)) ? (a) : (b)) - -#ifdef TZNAME_MAX -#define MY_TZNAME_MAX TZNAME_MAX -#endif /* defined TZNAME_MAX */ -#ifndef TZNAME_MAX -#define MY_TZNAME_MAX 255 -#endif /* !defined TZNAME_MAX */ - -struct state { - int leapcnt; - int timecnt; - int typecnt; - int charcnt; - time_t ats[TZ_MAX_TIMES]; - unsigned char types[TZ_MAX_TIMES]; - struct ttinfo ttis[TZ_MAX_TYPES]; - char chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + 1, sizeof gmt), - (2 * (MY_TZNAME_MAX + 1)))]; - struct lsinfo lsis[TZ_MAX_LEAPS]; -}; - -struct rule { - int r_type; /* type of rule--see below */ - int r_day; /* day number of rule */ - int r_week; /* week number of rule */ - int r_mon; /* month number of rule */ - long r_time; /* transition time of rule */ -}; - -#define JULIAN_DAY 0 /* Jn - Julian day */ -#define DAY_OF_YEAR 1 /* n - day of year */ -#define MONTH_NTH_DAY_OF_WEEK 2 /* Mm.n.d - month, week, day of week */ - -/* -** Prototypes for static functions. -*/ - -static long detzcode P((const char * codep)); -static const char * getzname P((const char * strp)); -static const char * getnum P((const char * strp, int * nump, int min, - int max)); -static const char * getsecs P((const char * strp, long * secsp)); -static const char * getoffset P((const char * strp, long * offsetp)); -static const char * getrule P((const char * strp, struct rule * rulep)); -static void gmtload P((struct state * sp)); -static void gmtsub P((const time_t * timep, long offset, - struct tm * tmp)); -static void localsub P((const time_t * timep, long offset, - struct tm * tmp)); -static int increment_overflow P((int * number, int delta)); -static int normalize_overflow P((int * tensptr, int * unitsptr, - int base)); -static void settzname P((void)); -static time_t time1 P((struct tm * tmp, - void(*funcp) P((const time_t *, - long, struct tm *)), - long offset)); -static time_t time2 P((struct tm *tmp, - void(*funcp) P((const time_t *, - long, struct tm*)), - long offset, int * okayp)); -static time_t time2sub P((struct tm *tmp, - void(*funcp) P((const time_t *, - long, struct tm*)), - long offset, int * okayp, int do_norm_secs)); -static void timesub P((const time_t * timep, long offset, - const struct state * sp, struct tm * tmp)); -static int tmcomp P((const struct tm * atmp, - const struct tm * btmp)); -static time_t transtime P((time_t janfirst, int year, - const struct rule * rulep, long offset)); -static int tzload P((const char * name, struct state * sp)); -static int tzparse P((const char * name, struct state * sp, - int lastditch)); - -#ifdef ALL_STATE -static struct state * lclptr; -static struct state * gmtptr; -#endif /* defined ALL_STATE */ - -#ifndef ALL_STATE -static struct state lclmem; -static struct state gmtmem; -#define lclptr (&lclmem) -#define gmtptr (&gmtmem) -#endif /* State Farm */ - -#ifndef TZ_STRLEN_MAX -#define TZ_STRLEN_MAX 255 -#endif /* !defined TZ_STRLEN_MAX */ - -static char lcl_TZname[TZ_STRLEN_MAX + 1]; -static int lcl_is_set; -static int gmt_is_set; - -#define tzname _tzname -#undef _tzname - -char * tzname[2] = { - wildabbr, - wildabbr -}; - -/* -** Section 4.12.3 of X3.159-1989 requires that -** Except for the strftime function, these functions [asctime, -** ctime, gmtime, localtime] return values in one of two static -** objects: a broken-down time structure and an array of char. -** Thanks to Paul Eggert (eggert@twinsun.com) for noting this. -*/ - -static struct tm tm; - - -/* These variables are initialized by tzset. The macro versions are - defined in time.h, and indirect through the __imp_ pointers. */ - -#define timezone _timezone -#define daylight _daylight -#undef _timezone -#undef _daylight - -#ifdef USG_COMPAT -long timezone; /* was time_t but POSIX requires long. */ -int daylight; -#endif /* defined USG_COMPAT */ - -#ifdef ALTZONE -time_t altzone; -#endif /* defined ALTZONE */ - -static long -detzcode(const char *codep) -{ - register long result; - register int i; - - result = (codep[0] & 0x80) ? ~0L : 0L; - for (i = 0; i < 4; ++i) - result = (result << 8) | (codep[i] & 0xff); - return result; -} - -static void -settzname P((void)) -{ - register struct state * const sp = lclptr; - register int i; - - tzname[0] = wildabbr; - tzname[1] = wildabbr; -#ifdef USG_COMPAT - daylight = 0; - timezone = 0; -#endif /* defined USG_COMPAT */ -#ifdef ALTZONE - altzone = 0; -#endif /* defined ALTZONE */ -#ifdef ALL_STATE - if (sp == NULL) { - tzname[0] = tzname[1] = gmt; - return; - } -#endif /* defined ALL_STATE */ - for (i = 0; i < sp->typecnt; ++i) { - register const struct ttinfo * const ttisp = &sp->ttis[i]; - - tzname[ttisp->tt_isdst] = - &sp->chars[ttisp->tt_abbrind]; -#ifdef USG_COMPAT - if (ttisp->tt_isdst) - daylight = 1; - if (i == 0 || !ttisp->tt_isdst) - timezone = -(ttisp->tt_gmtoff); -#endif /* defined USG_COMPAT */ -#ifdef ALTZONE - if (i == 0 || ttisp->tt_isdst) - altzone = -(ttisp->tt_gmtoff); -#endif /* defined ALTZONE */ - } - /* - ** And to get the latest zone names into tzname. . . - */ - for (i = 0; i < sp->timecnt; ++i) { - register const struct ttinfo * const ttisp = - &sp->ttis[ - sp->types[i]]; - - tzname[ttisp->tt_isdst] = - &sp->chars[ttisp->tt_abbrind]; - } -} - -#include "tz_posixrules.h" - -static int -tzload(const char *name, struct state *sp) -{ - register const char * p; - register int i; - register int fid; - save_errno save; - - if (name == NULL && (name = TZDEFAULT) == NULL) - return -1; - { - register int doaccess; - /* - ** Section 4.9.1 of the C standard says that - ** "FILENAME_MAX expands to an integral constant expression - ** that is the size needed for an array of char large enough - ** to hold the longest file name string that the implementation - ** guarantees can be opened." - */ - char fullname[FILENAME_MAX + 1]; - - if (name[0] == ':') - ++name; - doaccess = name[0] == '/'; - if (!doaccess) { - if ((p = TZDIR) == NULL) - return -1; - if ((strlen(p) + strlen(name) + 1) >= sizeof fullname) - return -1; - strcpy(fullname, p); - strcat(fullname, "/"); - strcat(fullname, name); - /* - ** Set doaccess if '.' (as in "../") shows up in name. - */ - if (strchr(name, '.') != NULL) - doaccess = true; - name = fullname; - } -#if 0 - if (doaccess && access(name, R_OK) != 0) - return -1; -#endif - if ((fid = open(name, OPEN_MODE)) == -1) - { - const char *base = strrchr(name, '/'); - if (base) - base++; - else - base = name; - if (strcmp(base, "posixrules")) - return -1; - - /* We've got a built-in copy of posixrules just in case */ - fid = -2; - } - } - { - struct tzhead * tzhp; - union { - struct tzhead tzhead; - char buf[sizeof *sp + sizeof *tzhp]; - } u; - int ttisstdcnt; - int ttisgmtcnt; - - if (fid == -2) - { - memcpy(u.buf, _posixrules_data, sizeof (_posixrules_data)); - i = sizeof (_posixrules_data); - } - else - { - i = read(fid, u.buf, sizeof u.buf); - if (close(fid) != 0) - return -1; - } - ttisstdcnt = (int) detzcode(u.tzhead.tzh_ttisgmtcnt); - ttisgmtcnt = (int) detzcode(u.tzhead.tzh_ttisstdcnt); - sp->leapcnt = (int) detzcode(u.tzhead.tzh_leapcnt); - sp->timecnt = (int) detzcode(u.tzhead.tzh_timecnt); - sp->typecnt = (int) detzcode(u.tzhead.tzh_typecnt); - sp->charcnt = (int) detzcode(u.tzhead.tzh_charcnt); - p = u.tzhead.tzh_charcnt + sizeof u.tzhead.tzh_charcnt; - if (sp->leapcnt < 0 || sp->leapcnt > TZ_MAX_LEAPS || - sp->typecnt <= 0 || sp->typecnt > TZ_MAX_TYPES || - sp->timecnt < 0 || sp->timecnt > TZ_MAX_TIMES || - sp->charcnt < 0 || sp->charcnt > TZ_MAX_CHARS || - (ttisstdcnt != sp->typecnt && ttisstdcnt != 0) || - (ttisgmtcnt != sp->typecnt && ttisgmtcnt != 0)) - return -1; - if (i - (p - u.buf) < sp->timecnt * 4 + /* ats */ - sp->timecnt + /* types */ - sp->typecnt * (4 + 2) + /* ttinfos */ - sp->charcnt + /* chars */ - sp->leapcnt * (4 + 4) + /* lsinfos */ - ttisstdcnt + /* ttisstds */ - ttisgmtcnt) /* ttisgmts */ - return -1; - for (i = 0; i < sp->timecnt; ++i) { - sp->ats[i] = detzcode(p); - p += 4; - } - for (i = 0; i < sp->timecnt; ++i) { - sp->types[i] = (unsigned char) *p++; - if (sp->types[i] >= sp->typecnt) - return -1; - } - for (i = 0; i < sp->typecnt; ++i) { - register struct ttinfo * ttisp; - - ttisp = &sp->ttis[i]; - ttisp->tt_gmtoff = detzcode(p); - p += 4; - ttisp->tt_isdst = (unsigned char) *p++; - if (ttisp->tt_isdst != 0 && ttisp->tt_isdst != 1) - return -1; - ttisp->tt_abbrind = (unsigned char) *p++; - if (ttisp->tt_abbrind < 0 || - ttisp->tt_abbrind > sp->charcnt) - return -1; - } - for (i = 0; i < sp->charcnt; ++i) - sp->chars[i] = *p++; - sp->chars[i] = '\0'; /* ensure '\0' at end */ - for (i = 0; i < sp->leapcnt; ++i) { - register struct lsinfo * lsisp; - - lsisp = &sp->lsis[i]; - lsisp->ls_trans = detzcode(p); - p += 4; - lsisp->ls_corr = detzcode(p); - p += 4; - } - for (i = 0; i < sp->typecnt; ++i) { - register struct ttinfo * ttisp; - - ttisp = &sp->ttis[i]; - if (ttisstdcnt == 0) - ttisp->tt_ttisstd = false; - else { - ttisp->tt_ttisstd = *p++; - if (ttisp->tt_ttisstd != true && - ttisp->tt_ttisstd != false) - return -1; - } - } - for (i = 0; i < sp->typecnt; ++i) { - register struct ttinfo * ttisp; - - ttisp = &sp->ttis[i]; - if (ttisgmtcnt == 0) - ttisp->tt_ttisgmt = false; - else { - ttisp->tt_ttisgmt = *p++; - if (ttisp->tt_ttisgmt != true && - ttisp->tt_ttisgmt != false) - return -1; - } - } - } - return 0; -} - -static const int mon_lengths[2][MONSPERYEAR] = { - { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, - { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } -}; - -static const int year_lengths[2] = { - DAYSPERNYEAR, DAYSPERLYEAR -}; - -/* -** Given a pointer into a time zone string, scan until a character that is not -** a valid character in a zone name is found. Return a pointer to that -** character. -*/ - -static const char * -getzname(const char *strp) -{ - register char c; - - while ((c = *strp) != '\0' && !is_digit(c) && c != ',' && c != '-' && - c != '+') - ++strp; - return strp; -} - -/* -** Given a pointer into a time zone string, extract a number from that string. -** Check that the number is within a specified range; if it is not, return -** NULL. -** Otherwise, return a pointer to the first character not part of the number. -*/ - -static const char * -getnum(const char *strp, int *nump, const int min, const int max) -{ - register char c; - register int num; - - if (strp == NULL || !is_digit(c = *strp)) - return NULL; - num = 0; - do { - num = num * 10 + (c - '0'); - if (num > max) - return NULL; /* illegal value */ - c = *++strp; - } while (is_digit(c)); - if (num < min) - return NULL; /* illegal value */ - *nump = num; - return strp; -} - -/* -** Given a pointer into a time zone string, extract a number of seconds, -** in hh[:mm[:ss]] form, from the string. -** If any error occurs, return NULL. -** Otherwise, return a pointer to the first character not part of the number -** of seconds. -*/ - -static const char * -getsecs(const char *strp, long *secsp) -{ - int num; - - /* - ** `HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-Posix rules like - ** "M10.4.6/26", which does not conform to Posix, - ** but which specifies the equivalent of - ** ``02:00 on the first Sunday on or after 23 Oct''. - */ - strp = getnum(strp, &num, 0, HOURSPERDAY * DAYSPERWEEK - 1); - if (strp == NULL) - return NULL; - *secsp = num * (long) SECSPERHOUR; - if (*strp == ':') { - ++strp; - strp = getnum(strp, &num, 0, MINSPERHOUR - 1); - if (strp == NULL) - return NULL; - *secsp += num * SECSPERMIN; - if (*strp == ':') { - ++strp; - /* `SECSPERMIN' allows for leap seconds. */ - strp = getnum(strp, &num, 0, SECSPERMIN); - if (strp == NULL) - return NULL; - *secsp += num; - } - } - return strp; -} - -/* -** Given a pointer into a time zone string, extract an offset, in -** [+-]hh[:mm[:ss]] form, from the string. -** If any error occurs, return NULL. -** Otherwise, return a pointer to the first character not part of the time. -*/ - -static const char * -getoffset(const char *strp, long *offsetp) -{ - register int neg = 0; - - if (*strp == '-') { - neg = 1; - ++strp; - } else if (*strp == '+') - ++strp; - strp = getsecs(strp, offsetp); - if (strp == NULL) - return NULL; /* illegal time */ - if (neg) - *offsetp = -*offsetp; - return strp; -} - -/* -** Given a pointer into a time zone string, extract a rule in the form -** date[/time]. See POSIX section 8 for the format of "date" and "time". -** If a valid rule is not found, return NULL. -** Otherwise, return a pointer to the first character not part of the rule. -*/ - -static const char * -getrule(const char *strp, struct rule *rulep) -{ - if (*strp == 'J') { - /* - ** Julian day. - */ - rulep->r_type = JULIAN_DAY; - ++strp; - strp = getnum(strp, &rulep->r_day, 1, DAYSPERNYEAR); - } else if (*strp == 'M') { - /* - ** Month, week, day. - */ - rulep->r_type = MONTH_NTH_DAY_OF_WEEK; - ++strp; - strp = getnum(strp, &rulep->r_mon, 1, MONSPERYEAR); - if (strp == NULL) - return NULL; - if (*strp++ != '.') - return NULL; - strp = getnum(strp, &rulep->r_week, 1, 5); - if (strp == NULL) - return NULL; - if (*strp++ != '.') - return NULL; - strp = getnum(strp, &rulep->r_day, 0, DAYSPERWEEK - 1); - } else if (is_digit(*strp)) { - /* - ** Day of year. - */ - rulep->r_type = DAY_OF_YEAR; - strp = getnum(strp, &rulep->r_day, 0, DAYSPERLYEAR - 1); - } else return NULL; /* invalid format */ - if (strp == NULL) - return NULL; - if (*strp == '/') { - /* - ** Time specified. - */ - ++strp; - strp = getsecs(strp, &rulep->r_time); - } else rulep->r_time = 2 * SECSPERHOUR; /* default = 2:00:00 */ - return strp; -} - -/* -** Given the Epoch-relative time of January 1, 00:00:00 UTC, in a year, the -** year, a rule, and the offset from UTC at the time that rule takes effect, -** calculate the Epoch-relative time that rule takes effect. -*/ - -static time_t -transtime(const time_t janfirst, const int year, const struct rule *rulep, - long offset) -{ - register int leapyear; - register time_t value; - register int i; - int d, m1, yy0, yy1, yy2, dow; - - INITIALIZE(value); - leapyear = isleap(year); - switch (rulep->r_type) { - - case JULIAN_DAY: - /* - ** Jn - Julian day, 1 == January 1, 60 == March 1 even in leap - ** years. - ** In non-leap years, or if the day number is 59 or less, just - ** add SECSPERDAY times the day number-1 to the time of - ** January 1, midnight, to get the day. - */ - value = janfirst + (rulep->r_day - 1) * SECSPERDAY; - if (leapyear && rulep->r_day >= 60) - value += SECSPERDAY; - break; - - case DAY_OF_YEAR: - /* - ** n - day of year. - ** Just add SECSPERDAY times the day number to the time of - ** January 1, midnight, to get the day. - */ - value = janfirst + rulep->r_day * SECSPERDAY; - break; - - case MONTH_NTH_DAY_OF_WEEK: - /* - ** Mm.n.d - nth "dth day" of month m. - */ - value = janfirst; - for (i = 0; i < rulep->r_mon - 1; ++i) - value += mon_lengths[leapyear][i] * SECSPERDAY; - - /* - ** Use Zeller's Congruence to get day-of-week of first day of - ** month. - */ - m1 = (rulep->r_mon + 9) % 12 + 1; - yy0 = (rulep->r_mon <= 2) ? (year - 1) : year; - yy1 = yy0 / 100; - yy2 = yy0 % 100; - dow = ((26 * m1 - 2) / 10 + - 1 + yy2 + yy2 / 4 + yy1 / 4 - 2 * yy1) % 7; - if (dow < 0) - dow += DAYSPERWEEK; - - /* - ** "dow" is the day-of-week of the first day of the month. Get - ** the day-of-month (zero-origin) of the first "dow" day of the - ** month. - */ - d = rulep->r_day - dow; - if (d < 0) - d += DAYSPERWEEK; - for (i = 1; i < rulep->r_week; ++i) { - if (d + DAYSPERWEEK >= - mon_lengths[leapyear][rulep->r_mon - 1]) - break; - d += DAYSPERWEEK; - } - - /* - ** "d" is the day-of-month (zero-origin) of the day we want. - */ - value += d * SECSPERDAY; - break; - } - - /* - ** "value" is the Epoch-relative time of 00:00:00 UTC on the day in - ** question. To get the Epoch-relative time of the specified local - ** time on that day, add the transition time and the current offset - ** from UTC. - */ - return value + rulep->r_time + offset; -} - -/* -** Given a POSIX section 8-style TZ string, fill in the rule tables as -** appropriate. -*/ - -static int -tzparse(const char *name, struct state *sp, const int lastditch) -{ - const char * stdname; - const char * dstname; - size_t stdlen; - size_t dstlen; - long stdoffset; - long dstoffset; - register time_t * atp; - register unsigned char * typep; - register char * cp; - register int load_result; - - INITIALIZE(dstname); - stdname = name; - if (lastditch) { - stdlen = strlen(name); /* length of standard zone name */ - name += stdlen; - if (stdlen >= sizeof sp->chars) - stdlen = (sizeof sp->chars) - 1; - stdoffset = 0; - } else { - name = getzname(name); - stdlen = name - stdname; - if (stdlen < 3) - return -1; - if (*name == '\0') - return -1; - name = getoffset(name, &stdoffset); - if (name == NULL) - return -1; - } - load_result = tzload(TZDEFRULES, sp); - if (load_result != 0) - sp->leapcnt = 0; /* so, we're off a little */ - if (*name != '\0') { - dstname = name; - name = getzname(name); - dstlen = name - dstname; /* length of DST zone name */ - if (dstlen < 3) - return -1; - if (*name != '\0' && *name != ',' && *name != ';') { - name = getoffset(name, &dstoffset); - if (name == NULL) - return -1; - } else dstoffset = stdoffset - SECSPERHOUR; - if (*name == ',' || *name == ';') { - struct rule start; - struct rule end; - register int year; - register time_t janfirst; - time_t starttime; - time_t endtime; - - ++name; - if ((name = getrule(name, &start)) == NULL) - return -1; - if (*name++ != ',') - return -1; - if ((name = getrule(name, &end)) == NULL) - return -1; - if (*name != '\0') - return -1; - sp->typecnt = 2; /* standard time and DST */ - /* - ** Two transitions per year, from EPOCH_YEAR to 2037. - */ - sp->timecnt = 2 * (2037 - EPOCH_YEAR + 1); - if (sp->timecnt > TZ_MAX_TIMES) - return -1; - sp->ttis[0].tt_gmtoff = -dstoffset; - sp->ttis[0].tt_isdst = 1; - sp->ttis[0].tt_abbrind = stdlen + 1; - sp->ttis[1].tt_gmtoff = -stdoffset; - sp->ttis[1].tt_isdst = 0; - sp->ttis[1].tt_abbrind = 0; - atp = sp->ats; - typep = sp->types; - janfirst = 0; - for (year = EPOCH_YEAR; year <= 2037; ++year) { - starttime = transtime(janfirst, year, &start, - stdoffset); - endtime = transtime(janfirst, year, &end, - dstoffset); - if (starttime > endtime) { - *atp++ = endtime; - *typep++ = 1; /* DST ends */ - *atp++ = starttime; - *typep++ = 0; /* DST begins */ - } else { - *atp++ = starttime; - *typep++ = 0; /* DST begins */ - *atp++ = endtime; - *typep++ = 1; /* DST ends */ - } - janfirst += year_lengths[isleap(year)] * - SECSPERDAY; - } - __gettzinfo ()->__tzrule[0].offset - = -sp->ttis[1].tt_gmtoff; - __gettzinfo ()->__tzrule[1].offset - = -sp->ttis[0].tt_gmtoff; - } else { - register long theirstdoffset; - register long theirdstoffset; - register long theiroffset; - register int isdst; - register int i; - register int j; - - if (*name != '\0') - return -1; - if (load_result != 0) - return -1; - /* - ** Initial values of theirstdoffset and theirdstoffset. - */ - theirstdoffset = 0; - for (i = 0; i < sp->timecnt; ++i) { - j = sp->types[i]; - if (!sp->ttis[j].tt_isdst) { - theirstdoffset = - -sp->ttis[j].tt_gmtoff; - break; - } - } - theirdstoffset = 0; - for (i = 0; i < sp->timecnt; ++i) { - j = sp->types[i]; - if (sp->ttis[j].tt_isdst) { - theirdstoffset = - -sp->ttis[j].tt_gmtoff; - break; - } - } - /* - ** Initially we're assumed to be in standard time. - */ - isdst = false; - theiroffset = theirstdoffset; - /* - ** Now juggle transition times and types - ** tracking offsets as you do. - */ - for (i = 0; i < sp->timecnt; ++i) { - j = sp->types[i]; - sp->types[i] = sp->ttis[j].tt_isdst; - if (sp->ttis[j].tt_ttisgmt) { - /* No adjustment to transition time */ - } else { - /* - ** If summer time is in effect, and the - ** transition time was not specified as - ** standard time, add the summer time - ** offset to the transition time; - ** otherwise, add the standard time - ** offset to the transition time. - */ - /* - ** Transitions from DST to DDST - ** will effectively disappear since - ** POSIX provides for only one DST - ** offset. - */ - if (isdst && !sp->ttis[j].tt_ttisstd) { - sp->ats[i] += dstoffset - - theirdstoffset; - } else { - sp->ats[i] += stdoffset - - theirstdoffset; - } - } - theiroffset = -sp->ttis[j].tt_gmtoff; - if (sp->ttis[j].tt_isdst) - theirdstoffset = theiroffset; - else theirstdoffset = theiroffset; - } - /* - ** Finally, fill in ttis. - ** ttisstd and ttisgmt need not be handled. - */ - sp->ttis[0].tt_gmtoff = -stdoffset; - sp->ttis[0].tt_isdst = false; - sp->ttis[0].tt_abbrind = 0; - sp->ttis[1].tt_gmtoff = -dstoffset; - sp->ttis[1].tt_isdst = true; - sp->ttis[1].tt_abbrind = stdlen + 1; - sp->typecnt = 2; - __gettzinfo ()->__tzrule[0].offset - = -sp->ttis[0].tt_gmtoff; - __gettzinfo ()->__tzrule[1].offset - = -sp->ttis[1].tt_gmtoff; - } - } else { - dstlen = 0; - sp->typecnt = 1; /* only standard time */ - sp->timecnt = 0; - sp->ttis[0].tt_gmtoff = -stdoffset; - sp->ttis[0].tt_isdst = 0; - sp->ttis[0].tt_abbrind = 0; - __gettzinfo ()->__tzrule[0].offset = -sp->ttis[0].tt_gmtoff; - __gettzinfo ()->__tzrule[1].offset = -sp->ttis[0].tt_gmtoff; - } - sp->charcnt = stdlen + 1; - if (dstlen != 0) - sp->charcnt += dstlen + 1; - if ((size_t) sp->charcnt > sizeof sp->chars) - return -1; - cp = sp->chars; - strncpy(cp, stdname, stdlen); - cp += stdlen; - *cp++ = '\0'; - if (dstlen != 0) { - strncpy(cp, dstname, dstlen); - *(cp + dstlen) = '\0'; - } - return 0; -} - -static void -gmtload(struct state *sp) -{ - if (tzload(gmt, sp) != 0) - tzparse(gmt, sp, true); -} - -#ifndef STD_INSPIRED -/* -** A non-static declaration of tzsetwall in a system header file -** may cause a warning about this upcoming static declaration... -*/ -static -#endif /* !defined STD_INSPIRED */ -void -tzsetwall P((void)) -{ - if (lcl_is_set < 0) - return; - lcl_is_set = -1; - -#ifdef ALL_STATE - if (lclptr == NULL) { - lclptr = (struct state *) malloc(sizeof *lclptr); - if (lclptr == NULL) { - settzname(); /* all we can do */ - return; - } - } -#endif /* defined ALL_STATE */ -#if defined (_WIN32) || defined (__CYGWIN__) -#define is_upper(c) ((unsigned)(c) - 'A' <= 26) - { - TIME_ZONE_INFORMATION tz; - char buf[BUFSIZ]; - char *cp, *dst; - wchar_t *src; - div_t d; - GetTimeZoneInformation(&tz); - dst = cp = buf; - for (src = tz.StandardName; *src; src++) - if (is_upper(*src)) *dst++ = *src; - if ((dst - cp) < 3) - { - /* In non-english Windows, converted tz.StandardName - may not contain a valid standard timezone name. */ - strcpy(cp, wildabbr); - cp += strlen(wildabbr); - } - else - cp = dst; - d = div(tz.Bias+tz.StandardBias, 60); - sprintf(cp, "%d", d.quot); - if (d.rem) - sprintf(cp=strchr(cp, 0), ":%d", abs(d.rem)); - if(tz.StandardDate.wMonth) { - cp = strchr(cp, 0); - dst = cp; - for (src = tz.DaylightName; *src; src++) - if (is_upper(*src)) *dst++ = *src; - if ((dst - cp) < 3) - { - /* In non-english Windows, converted tz.DaylightName - may not contain a valid daylight timezone name. */ - strcpy(cp, wildabbr); - cp += strlen(wildabbr); - } - else - cp = dst; - d = div(tz.Bias+tz.DaylightBias, 60); - sprintf(cp, "%d", d.quot); - if (d.rem) - sprintf(cp=strchr(cp, 0), ":%d", abs(d.rem)); - cp = strchr(cp, 0); - sprintf(cp=strchr(cp, 0), ",M%d.%d.%d/%d", - tz.DaylightDate.wMonth, - tz.DaylightDate.wDay, - tz.DaylightDate.wDayOfWeek, - tz.DaylightDate.wHour); - if (tz.DaylightDate.wMinute || tz.DaylightDate.wSecond) - sprintf(cp=strchr(cp, 0), ":%d", tz.DaylightDate.wMinute); - if (tz.DaylightDate.wSecond) - sprintf(cp=strchr(cp, 0), ":%d", tz.DaylightDate.wSecond); - cp = strchr(cp, 0); - sprintf(cp=strchr(cp, 0), ",M%d.%d.%d/%d", - tz.StandardDate.wMonth, - tz.StandardDate.wDay, - tz.StandardDate.wDayOfWeek, - tz.StandardDate.wHour); - if (tz.StandardDate.wMinute || tz.StandardDate.wSecond) - sprintf(cp=strchr(cp, 0), ":%d", tz.StandardDate.wMinute); - if (tz.StandardDate.wSecond) - sprintf(cp=strchr(cp, 0), ":%d", tz.StandardDate.wSecond); - } - /* printf("TZ deduced as `%s'\n", buf); */ - if (tzparse(buf, lclptr, false) == 0) { - settzname(); - lcl_is_set = 1; - strlcpy(lcl_TZname, buf, sizeof (lcl_TZname)); - setenv("TZ", lcl_TZname, 1); - return; - } - } -#endif - if (tzload((char *) NULL, lclptr) != 0) - gmtload(lclptr); - settzname(); -} - -extern "C" void -tzset P((void)) -{ - const char * name = getenv("TZ"); - - if (name == NULL) { - tzsetwall(); - return; - } - - if (lcl_is_set > 0 && strcmp(lcl_TZname, name) == 0) - return; - lcl_is_set = (strlen(name) < sizeof (lcl_TZname)); - if (lcl_is_set) - strcpy(lcl_TZname, name); - -#ifdef ALL_STATE - if (lclptr == NULL) { - lclptr = (struct state *) malloc(sizeof *lclptr); - if (lclptr == NULL) { - settzname(); /* all we can do */ - return; - } - } -#endif /* defined ALL_STATE */ - if (*name == '\0') { - /* - ** User wants it fast rather than right. - */ - lclptr->leapcnt = 0; /* so, we're off a little */ - lclptr->timecnt = 0; - lclptr->ttis[0].tt_gmtoff = 0; - lclptr->ttis[0].tt_abbrind = 0; - strcpy(lclptr->chars, gmt); - } else if (tzload(name, lclptr) != 0) { - if (name[0] == ':' || tzparse(name, lclptr, false) != 0) - gmtload(lclptr); - } - settzname(); -} - -/* -** The easy way to behave "as if no library function calls" localtime -** is to not call it--so we drop its guts into "localsub", which can be -** freely called. (And no, the PANS doesn't require the above behavior-- -** but it *is* desirable.) -** -** The unused offset argument is for the benefit of mktime variants. -*/ - -/*ARGSUSED*/ -static void -localsub (const time_t * const timep, - const long offset, - struct tm * const tmp) -{ - register struct state * sp; - register const struct ttinfo * ttisp; - register int i; - const time_t t = *timep; - - sp = lclptr; -#ifdef ALL_STATE - if (sp == NULL) { - gmtsub(timep, offset, tmp); - return; - } -#endif /* defined ALL_STATE */ - if (sp->timecnt == 0 || t < sp->ats[0]) { - i = 0; - while (sp->ttis[i].tt_isdst) - if (++i >= sp->typecnt) { - i = 0; - break; - } - } else { - for (i = 1; i < sp->timecnt; ++i) - if (t < sp->ats[i]) - break; - i = sp->types[i - 1]; - } - ttisp = &sp->ttis[i]; - /* - ** To get (wrong) behavior that's compatible with System V Release 2.0 - ** you'd replace the statement below with - ** t += ttisp->tt_gmtoff; - ** timesub(&t, 0L, sp, tmp); - */ - timesub(&t, ttisp->tt_gmtoff, sp, tmp); - tmp->tm_isdst = ttisp->tt_isdst; - tzname[tmp->tm_isdst] = &sp->chars[ttisp->tt_abbrind]; -#ifdef TM_ZONE - tmp->TM_ZONE = &sp->chars[ttisp->tt_abbrind]; -#endif /* defined TM_ZONE */ -} - -extern "C" struct tm * -localtime(const time_t *timep) -{ - tzset(); - localsub(timep, 0L, &tm); - return &tm; -} - -/* - * Re-entrant version of localtime - */ -extern "C" struct tm * -localtime_r(const time_t *timep, struct tm *tm) -{ - tzset(); - localsub(timep, 0L, tm); - return tm; -} - -/* -** gmtsub is to gmtime as localsub is to localtime. -*/ - -static void -gmtsub(const time_t *timep, const long offset, struct tm *tmp) -{ - if (!gmt_is_set) { - gmt_is_set = true; -#ifdef ALL_STATE - gmtptr = (struct state *) malloc(sizeof *gmtptr); - if (gmtptr != NULL) -#endif /* defined ALL_STATE */ - gmtload(gmtptr); - } - timesub(timep, offset, gmtptr, tmp); -#ifdef TM_ZONE - /* - ** Could get fancy here and deliver something such as - ** "UTC+xxxx" or "UTC-xxxx" if offset is non-zero, - ** but this is no time for a treasure hunt. - */ - if (offset != 0) - tmp->TM_ZONE = wildabbr; - else { -#ifdef ALL_STATE - if (gmtptr == NULL) - tmp->TM_ZONE = gmt; - else tmp->TM_ZONE = gmtptr->chars; -#endif /* defined ALL_STATE */ -#ifndef ALL_STATE - tmp->TM_ZONE = gmtptr->chars; -#endif /* State Farm */ - } -#endif /* defined TM_ZONE */ -} - -extern "C" struct tm * -gmtime(const time_t *timep) -{ - gmtsub(timep, 0L, &tm); - return &tm; -} - -/* - * Re-entrant version of gmtime - */ -extern "C" struct tm * -gmtime_r(const time_t *timep, struct tm *tm) -{ - gmtsub(timep, 0L, tm); - return tm; -} - -#ifdef STD_INSPIRED - -extern "C" struct tm * -offtime(const time_t *timep, const long offset) -{ - gmtsub(timep, offset, &tm); - return &tm; -} - -#endif /* defined STD_INSPIRED */ - -static void -timesub(const time_t *timep, const long offset, const struct state *sp, - struct tm *tmp) -{ - register const struct lsinfo * lp; - register long days; - register long rem; - register int y; - register int yleap; - register const int * ip; - register long corr; - register int hit; - register int i; - - corr = 0; - hit = 0; -#ifdef ALL_STATE - i = (sp == NULL) ? 0 : sp->leapcnt; -#endif /* defined ALL_STATE */ -#ifndef ALL_STATE - i = sp->leapcnt; -#endif /* State Farm */ - while (--i >= 0) { - lp = &sp->lsis[i]; - if (*timep >= lp->ls_trans) { - if (*timep == lp->ls_trans) { - hit = ((i == 0 && lp->ls_corr > 0) || - lp->ls_corr > sp->lsis[i - 1].ls_corr); - if (hit) - while (i > 0 && - sp->lsis[i].ls_trans == - sp->lsis[i - 1].ls_trans + 1 && - sp->lsis[i].ls_corr == - sp->lsis[i - 1].ls_corr + 1) { - ++hit; - --i; - } - } - corr = lp->ls_corr; - break; - } - } - days = *timep / SECSPERDAY; - rem = *timep % SECSPERDAY; -#ifdef mc68k - if (*timep == 0x80000000) { - /* - ** A 3B1 muffs the division on the most negative number. - */ - days = -24855; - rem = -11648; - } -#endif /* defined mc68k */ - rem += (offset - corr); - while (rem < 0) { - rem += SECSPERDAY; - --days; - } - while (rem >= SECSPERDAY) { - rem -= SECSPERDAY; - ++days; - } - tmp->tm_hour = (int) (rem / SECSPERHOUR); - rem = rem % SECSPERHOUR; - tmp->tm_min = (int) (rem / SECSPERMIN); - /* - ** A positive leap second requires a special - ** representation. This uses "... ??:59:60" et seq. - */ - tmp->tm_sec = (int) (rem % SECSPERMIN) + hit; - tmp->tm_wday = (int) ((EPOCH_WDAY + days) % DAYSPERWEEK); - if (tmp->tm_wday < 0) - tmp->tm_wday += DAYSPERWEEK; - y = EPOCH_YEAR; -#define LEAPS_THRU_END_OF(y) ((y) / 4 - (y) / 100 + (y) / 400) - while (days < 0 || days >= (long) year_lengths[yleap = isleap(y)]) { - register int newy; - - newy = y + days / DAYSPERNYEAR; - if (days < 0) - --newy; - days -= (newy - y) * DAYSPERNYEAR + - LEAPS_THRU_END_OF(newy - 1) - - LEAPS_THRU_END_OF(y - 1); - y = newy; - } - tmp->tm_year = y - TM_YEAR_BASE; - tmp->tm_yday = (int) days; - ip = mon_lengths[yleap]; - for (tmp->tm_mon = 0; days >= (long) ip[tmp->tm_mon]; ++(tmp->tm_mon)) - days = days - (long) ip[tmp->tm_mon]; - tmp->tm_mday = (int) (days + 1); - tmp->tm_isdst = 0; -#ifdef TM_GMTOFF - tmp->TM_GMTOFF = offset; -#endif /* defined TM_GMTOFF */ -} - -extern "C" char * -ctime(const time_t *timep) -{ -/* -** Section 4.12.3.2 of X3.159-1989 requires that -** The ctime function converts the calendar time pointed to by timer -** to local time in the form of a string. It is equivalent to -** asctime(localtime(timer)) -*/ - return asctime(localtime(timep)); -} - -extern "C" char * -ctime_r(const time_t *timep, char *buf) -{ - struct tm tm; - - return asctime_r(localtime_r(timep, &tm), buf); -} - -/* -** Adapted from code provided by Robert Elz, who writes: -** The "best" way to do mktime I think is based on an idea of Bob -** Kridle's (so its said...) from a long time ago. -** [kridle@xinet.com as of 1996-01-16.] -** It does a binary search of the time_t space. Since time_t's are -** just 32 bits, its a max of 32 iterations (even at 64 bits it -** would still be very reasonable). -*/ - -#ifndef WRONG -#define WRONG (-1) -#endif /* !defined WRONG */ - -/* -** Simplified normalize logic courtesy Paul Eggert (eggert@twinsun.com). -*/ - -static int -increment_overflow(int *number, int delta) -{ - int number0; - - number0 = *number; - *number += delta; - return (*number < number0) != (delta < 0); -} - -static int -normalize_overflow(int *tensptr, int *unitsptr, const int base) -{ - register int tensdelta; - - tensdelta = (*unitsptr >= 0) ? - (*unitsptr / base) : - (-1 - (-1 - *unitsptr) / base); - *unitsptr -= tensdelta * base; - return increment_overflow(tensptr, tensdelta); -} - -static int -tmcomp(register const struct tm *atmp, register const struct tm *btmp) -{ - register int result; - - if ((result = (atmp->tm_year - btmp->tm_year)) == 0 && - (result = (atmp->tm_mon - btmp->tm_mon)) == 0 && - (result = (atmp->tm_mday - btmp->tm_mday)) == 0 && - (result = (atmp->tm_hour - btmp->tm_hour)) == 0 && - (result = (atmp->tm_min - btmp->tm_min)) == 0) - result = atmp->tm_sec - btmp->tm_sec; - return result; -} - -static time_t -time2sub(struct tm *tmp, void (*funcp) P((const time_t*, long, struct tm*)), - const long offset, int *okayp, const int do_norm_secs) -{ - register const struct state * sp; - register int dir; - register int bits; - register int i, j ; - register int saved_seconds; - time_t newt; - time_t t; - struct tm yourtm, mytm; - - *okayp = false; - yourtm = *tmp; - if (do_norm_secs) { - if (normalize_overflow(&yourtm.tm_min, &yourtm.tm_sec, - SECSPERMIN)) - return WRONG; - } - if (normalize_overflow(&yourtm.tm_hour, &yourtm.tm_min, MINSPERHOUR)) - return WRONG; - if (normalize_overflow(&yourtm.tm_mday, &yourtm.tm_hour, HOURSPERDAY)) - return WRONG; - if (normalize_overflow(&yourtm.tm_year, &yourtm.tm_mon, MONSPERYEAR)) - return WRONG; - /* - ** Turn yourtm.tm_year into an actual year number for now. - ** It is converted back to an offset from TM_YEAR_BASE later. - */ - if (increment_overflow(&yourtm.tm_year, TM_YEAR_BASE)) - return WRONG; - while (yourtm.tm_mday <= 0) { - if (increment_overflow(&yourtm.tm_year, -1)) - return WRONG; - i = yourtm.tm_year + (1 < yourtm.tm_mon); - yourtm.tm_mday += year_lengths[isleap(i)]; - } - while (yourtm.tm_mday > DAYSPERLYEAR) { - i = yourtm.tm_year + (1 < yourtm.tm_mon); - yourtm.tm_mday -= year_lengths[isleap(i)]; - if (increment_overflow(&yourtm.tm_year, 1)) - return WRONG; - } - for ( ; ; ) { - i = mon_lengths[isleap(yourtm.tm_year)][yourtm.tm_mon]; - if (yourtm.tm_mday <= i) - break; - yourtm.tm_mday -= i; - if (++yourtm.tm_mon >= MONSPERYEAR) { - yourtm.tm_mon = 0; - if (increment_overflow(&yourtm.tm_year, 1)) - return WRONG; - } - } - if (increment_overflow(&yourtm.tm_year, -TM_YEAR_BASE)) - return WRONG; - if (yourtm.tm_year + TM_YEAR_BASE < EPOCH_YEAR) { - /* - ** We can't set tm_sec to 0, because that might push the - ** time below the minimum representable time. - ** Set tm_sec to 59 instead. - ** This assumes that the minimum representable time is - ** not in the same minute that a leap second was deleted from, - ** which is a safer assumption than using 58 would be. - */ - if (increment_overflow(&yourtm.tm_sec, 1 - SECSPERMIN)) - return WRONG; - saved_seconds = yourtm.tm_sec; - yourtm.tm_sec = SECSPERMIN - 1; - } else { - saved_seconds = yourtm.tm_sec; - yourtm.tm_sec = 0; - } - /* - ** Divide the search space in half - ** (this works whether time_t is signed or unsigned). - */ - bits = TYPE_BIT(time_t) - 1; - /* - ** If time_t is signed, then 0 is just above the median, - ** assuming two's complement arithmetic. - ** If time_t is unsigned, then (1 << bits) is just above the median. - */ - t = TYPE_SIGNED(time_t) ? 0 : (((time_t) 1) << bits); - for ( ; ; ) { - (*funcp)(&t, offset, &mytm); - dir = tmcomp(&mytm, &yourtm); - if (dir != 0) { - if (bits-- < 0) - return WRONG; - if (bits < 0) - --t; /* may be needed if new t is minimal */ - else if (dir > 0) - t -= ((time_t) 1) << bits; - else t += ((time_t) 1) << bits; - continue; - } - if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst) - break; - /* - ** Right time, wrong type. - ** Hunt for right time, right type. - ** It's okay to guess wrong since the guess - ** gets checked. - */ - /* - ** The (void *) casts are the benefit of SunOS 3.3 on Sun 2's. - */ - sp = (const struct state *) - (((void *) funcp == (void *) localsub) ? - lclptr : gmtptr); -#ifdef ALL_STATE - if (sp == NULL) - return WRONG; -#endif /* defined ALL_STATE */ - for (i = sp->typecnt - 1; i >= 0; --i) { - if (sp->ttis[i].tt_isdst != yourtm.tm_isdst) - continue; - for (j = sp->typecnt - 1; j >= 0; --j) { - if (sp->ttis[j].tt_isdst == yourtm.tm_isdst) - continue; - newt = t + sp->ttis[j].tt_gmtoff - - sp->ttis[i].tt_gmtoff; - (*funcp)(&newt, offset, &mytm); - if (tmcomp(&mytm, &yourtm) != 0) - continue; - if (mytm.tm_isdst != yourtm.tm_isdst) - continue; - /* - ** We have a match. - */ - t = newt; - goto label; - } - } - return WRONG; - } -label: - newt = t + saved_seconds; - if ((newt < t) != (saved_seconds < 0)) - return WRONG; - t = newt; - (*funcp)(&t, offset, tmp); - *okayp = true; - return t; -} - -static time_t -time2(struct tm *tmp, void (*funcp) P((const time_t*, long, struct tm*)), - const long offset, int *okayp) -{ - time_t t; - - /* - ** First try without normalization of seconds - ** (in case tm_sec contains a value associated with a leap second). - ** If that fails, try with normalization of seconds. - */ - t = time2sub(tmp, funcp, offset, okayp, false); - return *okayp ? t : time2sub(tmp, funcp, offset, okayp, true); -} - -static time_t -time1(struct tm *tmp, void (*funcp) P((const time_t *, long, struct tm *)), - const long offset) -{ - register time_t t; - register const struct state * sp; - register int samei, otheri; - int okay; - - if (tmp->tm_isdst > 1) - tmp->tm_isdst = 1; - t = time2(tmp, funcp, offset, &okay); -#ifdef PCTS - /* - ** PCTS code courtesy Grant Sullivan (grant@osf.org). - */ - if (okay) - return t; - if (tmp->tm_isdst < 0) - tmp->tm_isdst = 0; /* reset to std and try again */ -#endif /* defined PCTS */ -#ifndef PCTS - if (okay || tmp->tm_isdst < 0) - return t; -#endif /* !defined PCTS */ - /* - ** We're supposed to assume that somebody took a time of one type - ** and did some math on it that yielded a "struct tm" that's bad. - ** We try to divine the type they started from and adjust to the - ** type they need. - */ - /* - ** The (void *) casts are the benefit of SunOS 3.3 on Sun 2's. - */ - sp = (const struct state *) (((void *) funcp == (void *) localsub) ? - lclptr : gmtptr); -#ifdef ALL_STATE - if (sp == NULL) - return WRONG; -#endif /* defined ALL_STATE */ - for (samei = sp->typecnt - 1; samei >= 0; --samei) { - if (sp->ttis[samei].tt_isdst != tmp->tm_isdst) - continue; - for (otheri = sp->typecnt - 1; otheri >= 0; --otheri) { - if (sp->ttis[otheri].tt_isdst == tmp->tm_isdst) - continue; - tmp->tm_sec += sp->ttis[otheri].tt_gmtoff - - sp->ttis[samei].tt_gmtoff; - tmp->tm_isdst = !tmp->tm_isdst; - t = time2(tmp, funcp, offset, &okay); - if (okay) - return t; - tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff - - sp->ttis[samei].tt_gmtoff; - tmp->tm_isdst = !tmp->tm_isdst; - } - } - return WRONG; -} - -extern "C" time_t -mktime(struct tm *tmp) -{ - tzset(); - return time1(tmp, localsub, 0L); -} - -#ifdef STD_INSPIRED - -extern "C" time_t -timelocal(struct tm *tmp) -{ - tmp->tm_isdst = -1; /* in case it wasn't initialized */ - return mktime(tmp); -} - -extern "C" time_t -timegm(struct tm *tmp) -{ - tmp->tm_isdst = 0; - return time1(tmp, gmtsub, 0L); -} - -extern "C" time_t -timeoff(struct tm *tmp, const long offset) -{ - tmp->tm_isdst = 0; - return time1(tmp, gmtsub, offset); -} - -#endif /* defined STD_INSPIRED */ - -#ifdef CMUCS - -/* -** The following is supplied for compatibility with -** previous versions of the CMUCS runtime library. -*/ - -extern "C" long -gtime(struct tm *tmp) -{ - const time_t t = mktime(tmp); - - if (t == WRONG) - return -1; - return t; -} - -#endif /* defined CMUCS */ - -/* -** XXX--is the below the right way to conditionalize?? -*/ - -#ifdef STD_INSPIRED - -/* -** IEEE Std 1003.1-1988 (POSIX) legislates that 536457599 -** shall correspond to "Wed Dec 31 23:59:59 UTC 1986", which -** is not the case if we are accounting for leap seconds. -** So, we provide the following conversion routines for use -** when exchanging timestamps with POSIX conforming systems. -*/ - -static long -leapcorr(time_t *timep) -{ - register struct state * sp; - register struct lsinfo * lp; - register int i; - - sp = lclptr; - i = sp->leapcnt; - while (--i >= 0) { - lp = &sp->lsis[i]; - if (*timep >= lp->ls_trans) - return lp->ls_corr; - } - return 0; -} - -extern "C" time_t -time2posix(time_t t) -{ - tzset(); - return t - leapcorr(&t); -} - -extern "C" time_t -posix2time(time_t t) -{ - time_t x; - time_t y; - - tzset(); - /* - ** For a positive leap second hit, the result - ** is not unique. For a negative leap second - ** hit, the corresponding time doesn't exist, - ** so we return an adjacent second. - */ - x = t + leapcorr(&t); - y = x - leapcorr(&x); - if (y < t) { - do { - x++; - y = x - leapcorr(&x); - } while (y < t); - if (t != y) - return x - 1; - } else if (y > t) { - do { - --x; - y = x - leapcorr(&x); - } while (y > t); - if (t != y) - return x + 1; - } - return x; -} - -#endif /* defined STD_INSPIRED */ diff --git a/winsup/cygwin/lsearch.cc b/winsup/cygwin/lsearch.cc deleted file mode 100644 index 6f5ca980d..000000000 --- a/winsup/cygwin/lsearch.cc +++ /dev/null @@ -1,56 +0,0 @@ -/* Initial implementation: - Copyright (c) 2002 Robert Drehmel - All rights reserved. - - As long as the above copyright statement and this notice remain - unchanged, you can do what ever you want with this file. */ - -#include -#include -#define _SEARCH_PRIVATE -#include -#include /* for uint8_t */ -#include /* for NULL */ -#include /* for memcpy () prototype */ - -static void *lwork (const void *, const void *, size_t *, size_t, - int (*) (const void *, const void *), int); - -extern "C" void * -lsearch (const void *key, void *base, size_t *nelp, size_t width, - int (*compar) (const void *, const void *)) -{ - return lwork (key, base, nelp, width, compar, 1); -} - -extern "C" void * -lfind (const void *key, const void *base, size_t *nelp, size_t width, - int (*compar) (const void *, const void *)) -{ - return lwork (key, base, nelp, width, compar, 0); -} - -static void * -lwork (const void *key, const void *base, size_t *nelp, size_t width, - int (*compar) (const void *, const void *), int addelem) -{ - uint8_t *ep, *endp; - - /* Cast to an integer value first to avoid the warning for removing - 'const' via a cast. */ - ep = (uint8_t *) (uintptr_t)base; - for (endp = (uint8_t *) (ep + width * *nelp); ep < endp; ep += width) - if (compar (key, ep) == 0) - return ep; - - /* lfind () shall return when the key was not found. */ - if (!addelem) - return NULL; - - /* lsearch () adds the key to the end of the table and increments - the number of elements. */ - memcpy (endp, key, width); - ++*nelp; - - return endp; -} diff --git a/winsup/cygwin/malloc.cc b/winsup/cygwin/malloc.cc deleted file mode 100644 index f9c3d557a..000000000 --- a/winsup/cygwin/malloc.cc +++ /dev/null @@ -1,5064 +0,0 @@ -/* - This is a version (aka dlmalloc) of malloc/free/realloc written by - Doug Lea and released to the public domain, as explained at - http://creativecommons.org/licenses/publicdomain. Send questions, - comments, complaints, performance data, etc to dl@cs.oswego.edu - -* Version 2.8.3 Thu Sep 22 11:16:15 2005 Doug Lea (dl at gee) - - Note: There may be an updated version of this malloc obtainable at - ftp://gee.cs.oswego.edu/pub/misc/malloc.c - Check before installing! - -* Quickstart - - This library is all in one file to simplify the most common usage: - ftp it, compile it (-O3), and link it into another program. All of - the compile-time options default to reasonable values for use on - most platforms. You might later want to step through various - compile-time and dynamic tuning options. - - For convenience, an include file for code using this malloc is at: - ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h - You don't really need this .h file unless you call functions not - defined in your system include files. The .h file contains only the - excerpts from this file needed for using this malloc on ANSI C/C++ - systems, so long as you haven't changed compile-time options about - naming and tuning parameters. If you do, then you can create your - own malloc.h that does include all settings by cutting at the point - indicated below. Note that you may already by default be using a C - library containing a malloc that is based on some version of this - malloc (for example in linux). You might still want to use the one - in this file to customize settings or to avoid overheads associated - with library versions. - -* Vital statistics: - - Supported pointer/size_t representation: 4 or 8 bytes - size_t MUST be an unsigned type of the same width as - pointers. (If you are using an ancient system that declares - size_t as a signed type, or need it to be a different width - than pointers, you can use a previous release of this malloc - (e.g. 2.7.2) supporting these.) - - Alignment: 8 bytes (default) - This suffices for nearly all current machines and C compilers. - However, you can define MALLOC_ALIGNMENT to be wider than this - if necessary (up to 128bytes), at the expense of using more space. - - Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes) - 8 or 16 bytes (if 8byte sizes) - Each malloced chunk has a hidden word of overhead holding size - and status information, and additional cross-check word - if FOOTERS is defined. - - Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead) - 8-byte ptrs: 32 bytes (including overhead) - - Even a request for zero bytes (i.e., malloc(0)) returns a - pointer to something of the minimum allocatable size. - The maximum overhead wastage (i.e., number of extra bytes - allocated than were requested in malloc) is less than or equal - to the minimum size, except for requests >= mmap_threshold that - are serviced via mmap(), where the worst case wastage is about - 32 bytes plus the remainder from a system page (the minimal - mmap unit); typically 4096 or 8192 bytes. - - Security: static-safe; optionally more or less - The "security" of malloc refers to the ability of malicious - code to accentuate the effects of errors (for example, freeing - space that is not currently malloc'ed or overwriting past the - ends of chunks) in code that calls malloc. This malloc - guarantees not to modify any memory locations below the base of - heap, i.e., static variables, even in the presence of usage - errors. The routines additionally detect most improper frees - and reallocs. All this holds as long as the static bookkeeping - for malloc itself is not corrupted by some other means. This - is only one aspect of security -- these checks do not, and - cannot, detect all possible programming errors. - - If FOOTERS is defined nonzero, then each allocated chunk - carries an additional check word to verify that it was malloced - from its space. These check words are the same within each - execution of a program using malloc, but differ across - executions, so externally crafted fake chunks cannot be - freed. This improves security by rejecting frees/reallocs that - could corrupt heap memory, in addition to the checks preventing - writes to statics that are always on. This may further improve - security at the expense of time and space overhead. (Note that - FOOTERS may also be worth using with MSPACES.) - - By default detected errors cause the program to abort (calling - "abort()"). You can override this to instead proceed past - errors by defining PROCEED_ON_ERROR. In this case, a bad free - has no effect, and a malloc that encounters a bad address - caused by user overwrites will ignore the bad address by - dropping pointers and indices to all known memory. This may - be appropriate for programs that should continue if at all - possible in the face of programming errors, although they may - run out of memory because dropped memory is never reclaimed. - - If you don't like either of these options, you can define - CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything - else. And if if you are sure that your program using malloc has - no errors or vulnerabilities, you can define INSECURE to 1, - which might (or might not) provide a small performance improvement. - - Thread-safety: NOT thread-safe unless USE_LOCKS defined - When USE_LOCKS is defined, each public call to malloc, free, - etc is surrounded with either a pthread mutex or a win32 - spinlock (depending on WIN32). This is not especially fast, and - can be a major bottleneck. It is designed only to provide - minimal protection in concurrent environments, and to provide a - basis for extensions. If you are using malloc in a concurrent - program, consider instead using ptmalloc, which is derived from - a version of this malloc. (See http://www.malloc.de). - - System requirements: Any combination of MORECORE and/or MMAP/MUNMAP - This malloc can use unix sbrk or any emulation (invoked using - the CALL_MORECORE macro) and/or mmap/munmap or any emulation - (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system - memory. On most unix systems, it tends to work best if both - MORECORE and MMAP are enabled. On Win32, it uses emulations - based on VirtualAlloc. It also uses common C library functions - like memset. - - Compliance: I believe it is compliant with the Single Unix Specification - (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably - others as well. - -* Overview of algorithms - - This is not the fastest, most space-conserving, most portable, or - most tunable malloc ever written. However it is among the fastest - while also being among the most space-conserving, portable and - tunable. Consistent balance across these factors results in a good - general-purpose allocator for malloc-intensive programs. - - In most ways, this malloc is a best-fit allocator. Generally, it - chooses the best-fitting existing chunk for a request, with ties - broken in approximately least-recently-used order. (This strategy - normally maintains low fragmentation.) However, for requests less - than 256bytes, it deviates from best-fit when there is not an - exactly fitting available chunk by preferring to use space adjacent - to that used for the previous small request, as well as by breaking - ties in approximately most-recently-used order. (These enhance - locality of series of small allocations.) And for very large requests - (>= 256Kb by default), it relies on system memory mapping - facilities, if supported. (This helps avoid carrying around and - possibly fragmenting memory used only for large chunks.) - - All operations (except malloc_stats and mallinfo) have execution - times that are bounded by a constant factor of the number of bits in - a size_t, not counting any clearing in calloc or copying in realloc, - or actions surrounding MORECORE and MMAP that have times - proportional to the number of non-contiguous regions returned by - system allocation routines, which is often just 1. - - The implementation is not very modular and seriously overuses - macros. Perhaps someday all C compilers will do as good a job - inlining modular code as can now be done by brute-force expansion, - but now, enough of them seem not to. - - Some compilers issue a lot of warnings about code that is - dead/unreachable only on some platforms, and also about intentional - uses of negation on unsigned types. All known cases of each can be - ignored. - - For a longer but out of date high-level description, see - http://gee.cs.oswego.edu/dl/html/malloc.html - -* MSPACES - If MSPACES is defined, then in addition to malloc, free, etc., - this file also defines mspace_malloc, mspace_free, etc. These - are versions of malloc routines that take an "mspace" argument - obtained using create_mspace, to control all internal bookkeeping. - If ONLY_MSPACES is defined, only these versions are compiled. - So if you would like to use this allocator for only some allocations, - and your system malloc for others, you can compile with - ONLY_MSPACES and then do something like... - static mspace mymspace = create_mspace(0,0); // for example - #define mymalloc(bytes) mspace_malloc(mymspace, bytes) - - (Note: If you only need one instance of an mspace, you can instead - use "USE_DL_PREFIX" to relabel the global malloc.) - - You can similarly create thread-local allocators by storing - mspaces as thread-locals. For example: - static __thread mspace tlms = 0; - void* tlmalloc(size_t bytes) { - if (tlms == 0) tlms = create_mspace(0, 0); - return mspace_malloc(tlms, bytes); - } - void tlfree(void* mem) { mspace_free(tlms, mem); } - - Unless FOOTERS is defined, each mspace is completely independent. - You cannot allocate from one and free to another (although - conformance is only weakly checked, so usage errors are not always - caught). If FOOTERS is defined, then each chunk carries around a tag - indicating its originating mspace, and frees are directed to their - originating spaces. - - ------------------------- Compile-time options --------------------------- - -Be careful in setting #define values for numerical constants of type -size_t. On some systems, literal values are not automatically extended -to size_t precision unless they are explicitly casted. - -WIN32 default: defined if _WIN32 defined - Defining WIN32 sets up defaults for MS environment and compilers. - Otherwise defaults are for unix. - -MALLOC_ALIGNMENT default: (size_t)8 - Controls the minimum alignment for malloc'ed chunks. It must be a - power of two and at least 8, even on machines for which smaller - alignments would suffice. It may be defined as larger than this - though. Note however that code and data structures are optimized for - the case of 8-byte alignment. - -MSPACES default: 0 (false) - If true, compile in support for independent allocation spaces. - This is only supported if HAVE_MMAP is true. - -ONLY_MSPACES default: 0 (false) - If true, only compile in mspace versions, not regular versions. - -USE_LOCKS default: 0 (false) - Causes each call to each public routine to be surrounded with - pthread or WIN32 mutex lock/unlock. (If set true, this can be - overridden on a per-mspace basis for mspace versions.) - -FOOTERS default: 0 - If true, provide extra checking and dispatching by placing - information in the footers of allocated chunks. This adds - space and time overhead. - -INSECURE default: 0 - If true, omit checks for usage errors and heap space overwrites. - -USE_DL_PREFIX default: NOT defined - Causes compiler to prefix all public routines with the string 'dl'. - This can be useful when you only want to use this malloc in one part - of a program, using your regular system malloc elsewhere. - -ABORT default: defined as abort() - Defines how to abort on failed checks. On most systems, a failed - check cannot die with an "assert" or even print an informative - message, because the underlying print routines in turn call malloc, - which will fail again. Generally, the best policy is to simply call - abort(). It's not very useful to do more than this because many - errors due to overwriting will show up as address faults (null, odd - addresses etc) rather than malloc-triggered checks, so will also - abort. Also, most compilers know that abort() does not return, so - can better optimize code conditionally calling it. - -PROCEED_ON_ERROR default: defined as 0 (false) - Controls whether detected bad addresses cause them to bypassed - rather than aborting. If set, detected bad arguments to free and - realloc are ignored. And all bookkeeping information is zeroed out - upon a detected overwrite of freed heap space, thus losing the - ability to ever return it from malloc again, but enabling the - application to proceed. If PROCEED_ON_ERROR is defined, the - static variable malloc_corruption_error_count is compiled in - and can be examined to see if errors have occurred. This option - generates slower code than the default abort policy. - -DEBUG default: NOT defined - The DEBUG setting is mainly intended for people trying to modify - this code or diagnose problems when porting to new platforms. - However, it may also be able to better isolate user errors than just - using runtime checks. The assertions in the check routines spell - out in more detail the assumptions and invariants underlying the - algorithms. The checking is fairly extensive, and will slow down - execution noticeably. Calling malloc_stats or mallinfo with DEBUG - set will attempt to check every non-mmapped allocated and free chunk - in the course of computing the summaries. - -ABORT_ON_ASSERT_FAILURE default: defined as 1 (true) - Debugging assertion failures can be nearly impossible if your - version of the assert macro causes malloc to be called, which will - lead to a cascade of further failures, blowing the runtime stack. - ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(), - which will usually make debugging easier. - -MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32 - The action to take before "return 0" when malloc fails to be able to - return memory because there is none available. - -HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES - True if this system supports sbrk or an emulation of it. - -MORECORE default: sbrk - The name of the sbrk-style system routine to call to obtain more - memory. See below for guidance on writing custom MORECORE - functions. The type of the argument to sbrk/MORECORE varies across - systems. It cannot be size_t, because it supports negative - arguments, so it is normally the signed type of the same width as - size_t (sometimes declared as "intptr_t"). It doesn't much matter - though. Internally, we only call it with arguments less than half - the max value of a size_t, which should work across all reasonable - possibilities, although sometimes generating compiler warnings. See - near the end of this file for guidelines for creating a custom - version of MORECORE. - -MORECORE_CONTIGUOUS default: 1 (true) - If true, take advantage of fact that consecutive calls to MORECORE - with positive arguments always return contiguous increasing - addresses. This is true of unix sbrk. It does not hurt too much to - set it true anyway, since malloc copes with non-contiguities. - Setting it false when definitely non-contiguous saves time - and possibly wasted space it would take to discover this though. - -MORECORE_CANNOT_TRIM default: NOT defined - True if MORECORE cannot release space back to the system when given - negative arguments. This is generally necessary only if you are - using a hand-crafted MORECORE function that cannot handle negative - arguments. - -HAVE_MMAP default: 1 (true) - True if this system supports mmap or an emulation of it. If so, and - HAVE_MORECORE is not true, MMAP is used for all system - allocation. If set and HAVE_MORECORE is true as well, MMAP is - primarily used to directly allocate very large blocks. It is also - used as a backup strategy in cases where MORECORE fails to provide - space from system. Note: A single call to MUNMAP is assumed to be - able to unmap memory that may have be allocated using multiple calls - to MMAP, so long as they are adjacent. - -HAVE_MREMAP default: 1 on linux, else 0 - If true realloc() uses mremap() to re-allocate large blocks and - extend or shrink allocation spaces. - -MMAP_CLEARS default: 1 on unix - True if mmap clears memory so calloc doesn't need to. This is true - for standard unix mmap using /dev/zero. - -USE_BUILTIN_FFS default: 0 (i.e., not used) - Causes malloc to use the builtin ffs() function to compute indices. - Some compilers may recognize and intrinsify ffs to be faster than the - supplied C version. Also, the case of x86 using gcc is special-cased - to an asm instruction, so is already as fast as it can be, and so - this setting has no effect. (On most x86s, the asm version is only - slightly faster than the C version.) - -malloc_getpagesize default: derive from system includes, or 4096. - The system page size. To the extent possible, this malloc manages - memory from the system in page-size units. This may be (and - usually is) a function rather than a constant. This is ignored - if WIN32, where page size is determined using getSystemInfo during - initialization. - -USE_DEV_RANDOM default: 0 (i.e., not used) - Causes malloc to use /dev/random to initialize secure magic seed for - stamping footers. Otherwise, the current time is used. - -NO_MALLINFO default: 0 - If defined, don't compile "mallinfo". This can be a simple way - of dealing with mismatches between system declarations and - those in this file. - -MALLINFO_FIELD_TYPE default: size_t - The type of the fields in the mallinfo struct. This was originally - defined as "int" in SVID etc, but is more usefully defined as - size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set - -REALLOC_ZERO_BYTES_FREES default: not defined - This should be set if a call to realloc with zero bytes should - be the same as a call to free. Some people think it should. Otherwise, - since this malloc returns a unique pointer for malloc(0), so does - realloc(p, 0). - -LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H -LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H -LACKS_STDLIB_H default: NOT defined unless on WIN32 - Define these if your system does not have these header files. - You might need to manually insert some of the declarations they provide. - -DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS, - system_info.dwAllocationGranularity in WIN32, - otherwise 64K. - Also settable using mallopt(M_GRANULARITY, x) - The unit for allocating and deallocating memory from the system. On - most systems with contiguous MORECORE, there is no reason to - make this more than a page. However, systems with MMAP tend to - either require or encourage larger granularities. You can increase - this value to prevent system allocation functions to be called so - often, especially if they are slow. The value must be at least one - page and must be a power of two. Setting to 0 causes initialization - to either page size or win32 region size. (Note: In previous - versions of malloc, the equivalent of this option was called - "TOP_PAD") - -DEFAULT_TRIM_THRESHOLD default: 2MB - Also settable using mallopt(M_TRIM_THRESHOLD, x) - The maximum amount of unused top-most memory to keep before - releasing via malloc_trim in free(). Automatic trimming is mainly - useful in long-lived programs using contiguous MORECORE. Because - trimming via sbrk can be slow on some systems, and can sometimes be - wasteful (in cases where programs immediately afterward allocate - more large chunks) the value should be high enough so that your - overall system performance would improve by releasing this much - memory. As a rough guide, you might set to a value close to the - average size of a process (program) running on your system. - Releasing this much memory would allow such a process to run in - memory. Generally, it is worth tuning trim thresholds when a - program undergoes phases where several large chunks are allocated - and released in ways that can reuse each other's storage, perhaps - mixed with phases where there are no such chunks at all. The trim - value must be greater than page size to have any useful effect. To - disable trimming completely, you can set to MAX_SIZE_T. Note that the trick - some people use of mallocing a huge space and then freeing it at - program startup, in an attempt to reserve system memory, doesn't - have the intended effect under automatic trimming, since that memory - will immediately be returned to the system. - -DEFAULT_MMAP_THRESHOLD default: 256K - Also settable using mallopt(M_MMAP_THRESHOLD, x) - The request size threshold for using MMAP to directly service a - request. Requests of at least this size that cannot be allocated - using already-existing space will be serviced via mmap. (If enough - normal freed space already exists it is used instead.) Using mmap - segregates relatively large chunks of memory so that they can be - individually obtained and released from the host system. A request - serviced through mmap is never reused by any other request (at least - not directly; the system may just so happen to remap successive - requests to the same locations). Segregating space in this way has - the benefits that: Mmapped space can always be individually released - back to the system, which helps keep the system level memory demands - of a long-lived program low. Also, mapped memory doesn't become - `locked' between other chunks, as can happen with normally allocated - chunks, which means that even trimming via malloc_trim would not - release them. However, it has the disadvantage that the space - cannot be reclaimed, consolidated, and then used to service later - requests, as happens with normal chunks. The advantages of mmap - nearly always outweigh disadvantages for "large" chunks, but the - value of "large" may vary across systems. The default is an - empirically derived value that works well in most systems. You can - disable mmap by setting to MAX_SIZE_T. - -*/ - -#ifndef WIN32 -#ifdef _WIN32 -#define WIN32 1 -#endif /* _WIN32 */ -#endif /* WIN32 */ -#ifdef WIN32 -#define WIN32_LEAN_AND_MEAN -#include -#define HAVE_MMAP 1 -#define HAVE_MORECORE 0 -#define LACKS_UNISTD_H -#define LACKS_SYS_PARAM_H -#define LACKS_SYS_MMAN_H -#define LACKS_STRING_H -#define LACKS_STRINGS_H -#define LACKS_SYS_TYPES_H -#define LACKS_ERRNO_H -#define MALLOC_FAILURE_ACTION -#define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */ -#endif /* WIN32 */ - -#if defined(DARWIN) || defined(_DARWIN) -/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */ -#ifndef HAVE_MORECORE -#define HAVE_MORECORE 0 -#define HAVE_MMAP 1 -#endif /* HAVE_MORECORE */ -#endif /* DARWIN */ - -#ifndef LACKS_SYS_TYPES_H -#include /* For size_t */ -#endif /* LACKS_SYS_TYPES_H */ -#ifdef __CYGWIN__ -#include "cygmalloc.h" -#endif /* __CYGWIN__ */ - -/* The maximum possible size_t value has all bits set */ -#define MAX_SIZE_T (~(size_t)0) - -#ifndef ONLY_MSPACES -#define ONLY_MSPACES 0 -#endif /* ONLY_MSPACES */ -#ifndef MSPACES -#if ONLY_MSPACES -#define MSPACES 1 -#else /* ONLY_MSPACES */ -#define MSPACES 0 -#endif /* ONLY_MSPACES */ -#endif /* MSPACES */ -#ifndef MALLOC_ALIGNMENT -#define MALLOC_ALIGNMENT ((size_t)8U) -#endif /* MALLOC_ALIGNMENT */ -#ifndef FOOTERS -#define FOOTERS 0 -#endif /* FOOTERS */ -#ifndef ABORT -#define ABORT abort() -#endif /* ABORT */ -#ifndef ABORT_ON_ASSERT_FAILURE -#define ABORT_ON_ASSERT_FAILURE 1 -#endif /* ABORT_ON_ASSERT_FAILURE */ -#ifndef PROCEED_ON_ERROR -#define PROCEED_ON_ERROR 0 -#endif /* PROCEED_ON_ERROR */ -#ifndef USE_LOCKS -#define USE_LOCKS 0 -#endif /* USE_LOCKS */ -#ifndef INSECURE -#define INSECURE 0 -#endif /* INSECURE */ -#ifndef HAVE_MMAP -#define HAVE_MMAP 1 -#endif /* HAVE_MMAP */ -#ifndef MMAP_CLEARS -#define MMAP_CLEARS 1 -#endif /* MMAP_CLEARS */ -#ifndef HAVE_MREMAP -#ifdef linux -#define HAVE_MREMAP 1 -#else /* linux */ -#define HAVE_MREMAP 0 -#endif /* linux */ -#endif /* HAVE_MREMAP */ -#ifndef MALLOC_FAILURE_ACTION -#define MALLOC_FAILURE_ACTION errno = ENOMEM; -#endif /* MALLOC_FAILURE_ACTION */ -#ifndef HAVE_MORECORE -#if ONLY_MSPACES -#define HAVE_MORECORE 0 -#else /* ONLY_MSPACES */ -#define HAVE_MORECORE 1 -#endif /* ONLY_MSPACES */ -#endif /* HAVE_MORECORE */ -#if !HAVE_MORECORE -#define MORECORE_CONTIGUOUS 0 -#else /* !HAVE_MORECORE */ -#ifndef MORECORE -#define MORECORE sbrk -#endif /* MORECORE */ -#ifndef MORECORE_CONTIGUOUS -#define MORECORE_CONTIGUOUS 1 -#endif /* MORECORE_CONTIGUOUS */ -#endif /* HAVE_MORECORE */ -#ifndef DEFAULT_GRANULARITY -#if MORECORE_CONTIGUOUS -#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */ -#else /* MORECORE_CONTIGUOUS */ -#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U) -#endif /* MORECORE_CONTIGUOUS */ -#endif /* DEFAULT_GRANULARITY */ -#ifndef DEFAULT_TRIM_THRESHOLD -#ifndef MORECORE_CANNOT_TRIM -#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) -#else /* MORECORE_CANNOT_TRIM */ -#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T -#endif /* MORECORE_CANNOT_TRIM */ -#endif /* DEFAULT_TRIM_THRESHOLD */ -#ifndef DEFAULT_MMAP_THRESHOLD -#if HAVE_MMAP -#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U) -#else /* HAVE_MMAP */ -#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T -#endif /* HAVE_MMAP */ -#endif /* DEFAULT_MMAP_THRESHOLD */ -#ifndef USE_BUILTIN_FFS -#define USE_BUILTIN_FFS 0 -#endif /* USE_BUILTIN_FFS */ -#ifndef USE_DEV_RANDOM -#define USE_DEV_RANDOM 0 -#endif /* USE_DEV_RANDOM */ -#ifndef NO_MALLINFO -#define NO_MALLINFO 0 -#endif /* NO_MALLINFO */ -#ifndef MALLINFO_FIELD_TYPE -#define MALLINFO_FIELD_TYPE size_t -#endif /* MALLINFO_FIELD_TYPE */ - -/* - mallopt tuning options. SVID/XPG defines four standard parameter - numbers for mallopt, normally defined in malloc.h. None of these - are used in this malloc, so setting them has no effect. But this - malloc does support the following options. -*/ - -#define M_TRIM_THRESHOLD (-1) -#define M_GRANULARITY (-2) -#define M_MMAP_THRESHOLD (-3) - -/* ------------------------ Mallinfo declarations ------------------------ */ - -#if !NO_MALLINFO -/* - This version of malloc supports the standard SVID/XPG mallinfo - routine that returns a struct containing usage properties and - statistics. It should work on any system that has a - /usr/include/malloc.h defining struct mallinfo. The main - declaration needed is the mallinfo struct that is returned (by-copy) - by mallinfo(). The malloinfo struct contains a bunch of fields that - are not even meaningful in this version of malloc. These fields are - are instead filled by mallinfo() with other numbers that might be of - interest. - - HAVE_USR_INCLUDE_MALLOC_H should be set if you have a - /usr/include/malloc.h file that includes a declaration of struct - mallinfo. If so, it is included; else a compliant version is - declared below. These must be precisely the same for mallinfo() to - work. The original SVID version of this struct, defined on most - systems with mallinfo, declares all fields as ints. But some others - define as unsigned long. If your system defines the fields using a - type of different width than listed here, you MUST #include your - system version and #define HAVE_USR_INCLUDE_MALLOC_H. -*/ - -/* #define HAVE_USR_INCLUDE_MALLOC_H */ - -#ifdef HAVE_USR_INCLUDE_MALLOC_H -#include "/usr/include/malloc.h" -#else /* HAVE_USR_INCLUDE_MALLOC_H */ - -struct mallinfo { - MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ - MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ - MALLINFO_FIELD_TYPE smblks; /* always 0 */ - MALLINFO_FIELD_TYPE hblks; /* always 0 */ - MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ - MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ - MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ - MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ - MALLINFO_FIELD_TYPE fordblks; /* total free space */ - MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ -}; - -#endif /* HAVE_USR_INCLUDE_MALLOC_H */ -#endif /* NO_MALLINFO */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#if !ONLY_MSPACES - -/* ------------------- Declarations of public routines ------------------- */ - -#ifndef USE_DL_PREFIX -#define dlcalloc calloc -#define dlfree free -#define dlmalloc malloc -#define dlmemalign memalign -#define dlrealloc realloc -#define dlvalloc valloc -#define dlpvalloc pvalloc -#define dlmallinfo mallinfo -#define dlmallopt mallopt -#define dlmalloc_trim malloc_trim -#define dlmalloc_stats malloc_stats -#define dlmalloc_usable_size malloc_usable_size -#define dlmalloc_footprint malloc_footprint -#define dlmalloc_max_footprint malloc_max_footprint -#define dlindependent_calloc independent_calloc -#define dlindependent_comalloc independent_comalloc -#endif /* USE_DL_PREFIX */ - - -/* - malloc(size_t n) - Returns a pointer to a newly allocated chunk of at least n bytes, or - null if no space is available, in which case errno is set to ENOMEM - on ANSI C systems. - - If n is zero, malloc returns a minimum-sized chunk. (The minimum - size is 16 bytes on most 32bit systems, and 32 bytes on 64bit - systems.) Note that size_t is an unsigned type, so calls with - arguments that would be negative if signed are interpreted as - requests for huge amounts of space, which will often fail. The - maximum supported value of n differs across systems, but is in all - cases less than the maximum representable value of a size_t. -*/ -void* dlmalloc(size_t); - -/* - free(void* p) - Releases the chunk of memory pointed to by p, that had been previously - allocated using malloc or a related routine such as realloc. - It has no effect if p is null. If p was not malloced or already - freed, free(p) will by default cause the current program to abort. -*/ -void dlfree(void*); - -/* - calloc(size_t n_elements, size_t element_size); - Returns a pointer to n_elements * element_size bytes, with all locations - set to zero. -*/ -void* dlcalloc(size_t, size_t); - -/* - realloc(void* p, size_t n) - Returns a pointer to a chunk of size n that contains the same data - as does chunk p up to the minimum of (n, p's size) bytes, or null - if no space is available. - - The returned pointer may or may not be the same as p. The algorithm - prefers extending p in most cases when possible, otherwise it - employs the equivalent of a malloc-copy-free sequence. - - If p is null, realloc is equivalent to malloc. - - If space is not available, realloc returns null, errno is set (if on - ANSI) and p is NOT freed. - - if n is for fewer bytes than already held by p, the newly unused - space is lopped off and freed if possible. realloc with a size - argument of zero (re)allocates a minimum-sized chunk. - - The old unix realloc convention of allowing the last-free'd chunk - to be used as an argument to realloc is not supported. -*/ - -void* dlrealloc(void*, size_t); - -/* - memalign(size_t alignment, size_t n); - Returns a pointer to a newly allocated chunk of n bytes, aligned - in accord with the alignment argument. - - The alignment argument should be a power of two. If the argument is - not a power of two, the nearest greater power is used. - 8-byte alignment is guaranteed by normal malloc calls, so don't - bother calling memalign with an argument of 8 or less. - - Overreliance on memalign is a sure way to fragment space. -*/ -void* dlmemalign(size_t, size_t); - -/* - valloc(size_t n); - Equivalent to memalign(pagesize, n), where pagesize is the page - size of the system. If the pagesize is unknown, 4096 is used. -*/ -void* dlvalloc(size_t); - -/* - mallopt(int parameter_number, int parameter_value) - Sets tunable parameters The format is to provide a - (parameter-number, parameter-value) pair. mallopt then sets the - corresponding parameter to the argument value if it can (i.e., so - long as the value is meaningful), and returns 1 if successful else - 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, - normally defined in malloc.h. None of these are use in this malloc, - so setting them has no effect. But this malloc also supports other - options in mallopt. See below for details. Briefly, supported - parameters are as follows (listed defaults are for "typical" - configurations). - - Symbol param # default allowed param values - M_TRIM_THRESHOLD -1 2*1024*1024 any (MAX_SIZE_T disables) - M_GRANULARITY -2 page size any power of 2 >= page size - M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) -*/ -int dlmallopt(int, int); - -/* - malloc_footprint(); - Returns the number of bytes obtained from the system. The total - number of bytes allocated by malloc, realloc etc., is less than this - value. Unlike mallinfo, this function returns only a precomputed - result, so can be called frequently to monitor memory consumption. - Even if locks are otherwise defined, this function does not use them, - so results might not be up to date. -*/ -size_t dlmalloc_footprint(void); - -/* - malloc_max_footprint(); - Returns the maximum number of bytes obtained from the system. This - value will be greater than current footprint if deallocated space - has been reclaimed by the system. The peak number of bytes allocated - by malloc, realloc etc., is less than this value. Unlike mallinfo, - this function returns only a precomputed result, so can be called - frequently to monitor memory consumption. Even if locks are - otherwise defined, this function does not use them, so results might - not be up to date. -*/ -size_t dlmalloc_max_footprint(void); - -#if !NO_MALLINFO -/* - mallinfo() - Returns (by copy) a struct containing various summary statistics: - - arena: current total non-mmapped bytes allocated from system - ordblks: the number of free chunks - smblks: always zero. - hblks: current number of mmapped regions - hblkhd: total bytes held in mmapped regions - usmblks: the maximum total allocated space. This will be greater - than current total if trimming has occurred. - fsmblks: always zero - uordblks: current total allocated space (normal or mmapped) - fordblks: total free space - keepcost: the maximum number of bytes that could ideally be released - back to system via malloc_trim. ("ideally" means that - it ignores page restrictions etc.) - - Because these fields are ints, but internal bookkeeping may - be kept as longs, the reported values may wrap around zero and - thus be inaccurate. -*/ -struct mallinfo dlmallinfo(void); -#endif /* NO_MALLINFO */ - -/* - independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); - - independent_calloc is similar to calloc, but instead of returning a - single cleared space, it returns an array of pointers to n_elements - independent elements that can hold contents of size elem_size, each - of which starts out cleared, and can be independently freed, - realloc'ed etc. The elements are guaranteed to be adjacently - allocated (this is not guaranteed to occur with multiple callocs or - mallocs), which may also improve cache locality in some - applications. - - The "chunks" argument is optional (i.e., may be null, which is - probably the most typical usage). If it is null, the returned array - is itself dynamically allocated and should also be freed when it is - no longer needed. Otherwise, the chunks array must be of at least - n_elements in length. It is filled in with the pointers to the - chunks. - - In either case, independent_calloc returns this pointer array, or - null if the allocation failed. If n_elements is zero and "chunks" - is null, it returns a chunk representing an array with zero elements - (which should be freed if not wanted). - - Each element must be individually freed when it is no longer - needed. If you'd like to instead be able to free all at once, you - should instead use regular calloc and assign pointers into this - space to represent elements. (In this case though, you cannot - independently free elements.) - - independent_calloc simplifies and speeds up implementations of many - kinds of pools. It may also be useful when constructing large data - structures that initially have a fixed number of fixed-sized nodes, - but the number is not known at compile time, and some of the nodes - may later need to be freed. For example: - - struct Node { int item; struct Node* next; }; - - struct Node* build_list() { - struct Node** pool; - int n = read_number_of_nodes_needed(); - if (n <= 0) return 0; - pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); - if (pool == 0) die(); - // organize into a linked list... - struct Node* first = pool[0]; - for (i = 0; i < n-1; ++i) - pool[i]->next = pool[i+1]; - free(pool); // Can now free the array (or not, if it is needed later) - return first; - } -*/ -void** dlindependent_calloc(size_t, size_t, void**); - -/* - independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); - - independent_comalloc allocates, all at once, a set of n_elements - chunks with sizes indicated in the "sizes" array. It returns - an array of pointers to these elements, each of which can be - independently freed, realloc'ed etc. The elements are guaranteed to - be adjacently allocated (this is not guaranteed to occur with - multiple callocs or mallocs), which may also improve cache locality - in some applications. - - The "chunks" argument is optional (i.e., may be null). If it is null - the returned array is itself dynamically allocated and should also - be freed when it is no longer needed. Otherwise, the chunks array - must be of at least n_elements in length. It is filled in with the - pointers to the chunks. - - In either case, independent_comalloc returns this pointer array, or - null if the allocation failed. If n_elements is zero and chunks is - null, it returns a chunk representing an array with zero elements - (which should be freed if not wanted). - - Each element must be individually freed when it is no longer - needed. If you'd like to instead be able to free all at once, you - should instead use a single regular malloc, and assign pointers at - particular offsets in the aggregate space. (In this case though, you - cannot independently free elements.) - - independent_comallac differs from independent_calloc in that each - element may have a different size, and also that it does not - automatically clear elements. - - independent_comalloc can be used to speed up allocation in cases - where several structs or objects must always be allocated at the - same time. For example: - - struct Head { ... } - struct Foot { ... } - - void send_message(char* msg) { - int msglen = strlen(msg); - size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; - void* chunks[3]; - if (independent_comalloc(3, sizes, chunks) == 0) - die(); - struct Head* head = (struct Head*)(chunks[0]); - char* body = (char*)(chunks[1]); - struct Foot* foot = (struct Foot*)(chunks[2]); - // ... - } - - In general though, independent_comalloc is worth using only for - larger values of n_elements. For small values, you probably won't - detect enough difference from series of malloc calls to bother. - - Overuse of independent_comalloc can increase overall memory usage, - since it cannot reuse existing noncontiguous small chunks that - might be available for some of the elements. -*/ -void** dlindependent_comalloc(size_t, size_t*, void**); - - -/* - pvalloc(size_t n); - Equivalent to valloc(minimum-page-that-holds(n)), that is, - round up n to nearest pagesize. - */ -void* dlpvalloc(size_t); - -/* - malloc_trim(size_t pad); - - If possible, gives memory back to the system (via negative arguments - to sbrk) if there is unused memory at the `high' end of the malloc - pool or in unused MMAP segments. You can call this after freeing - large blocks of memory to potentially reduce the system-level memory - requirements of a program. However, it cannot guarantee to reduce - memory. Under some allocation patterns, some large free blocks of - memory will be locked between two used chunks, so they cannot be - given back to the system. - - The `pad' argument to malloc_trim represents the amount of free - trailing space to leave untrimmed. If this argument is zero, only - the minimum amount of memory to maintain internal data structures - will be left. Non-zero arguments can be supplied to maintain enough - trailing space to service future expected allocations without having - to re-obtain memory from the system. - - Malloc_trim returns 1 if it actually released any memory, else 0. -*/ -int dlmalloc_trim(size_t); - -/* - malloc_usable_size(void* p); - - Returns the number of bytes you can actually use in - an allocated chunk, which may be more than you requested (although - often not) due to alignment and minimum size constraints. - You can use this many bytes without worrying about - overwriting other allocated objects. This is not a particularly great - programming practice. malloc_usable_size can be more useful in - debugging and assertions, for example: - - p = malloc(n); - assert(malloc_usable_size(p) >= 256); -*/ -size_t dlmalloc_usable_size(void*); - -/* - malloc_stats(); - Prints on stderr the amount of space obtained from the system (both - via sbrk and mmap), the maximum amount (which may be more than - current if malloc_trim and/or munmap got called), and the current - number of bytes allocated via malloc (or realloc, etc) but not yet - freed. Note that this is the number of bytes allocated, not the - number requested. It will be larger than the number requested - because of alignment and bookkeeping overhead. Because it includes - alignment wastage as being in use, this figure may be greater than - zero even when no user-level chunks are allocated. - - The reported current and maximum system memory can be inaccurate if - a program makes other calls to system memory allocation functions - (normally sbrk) outside of malloc. - - malloc_stats prints only the most commonly interesting statistics. - More information can be obtained by calling mallinfo. -*/ -void dlmalloc_stats(void); - -#endif /* ONLY_MSPACES */ - -#if MSPACES - -/* - mspace is an opaque type representing an independent - region of space that supports mspace_malloc, etc. -*/ -typedef void* mspace; - -/* - create_mspace creates and returns a new independent space with the - given initial capacity, or, if 0, the default granularity size. It - returns null if there is no system memory available to create the - space. If argument locked is non-zero, the space uses a separate - lock to control access. The capacity of the space will grow - dynamically as needed to service mspace_malloc requests. You can - control the sizes of incremental increases of this space by - compiling with a different DEFAULT_GRANULARITY or dynamically - setting with mallopt(M_GRANULARITY, value). -*/ -mspace create_mspace(size_t capacity, int locked); - -/* - destroy_mspace destroys the given space, and attempts to return all - of its memory back to the system, returning the total number of - bytes freed. After destruction, the results of access to all memory - used by the space become undefined. -*/ -size_t destroy_mspace(mspace msp); - -/* - create_mspace_with_base uses the memory supplied as the initial base - of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this - space is used for bookkeeping, so the capacity must be at least this - large. (Otherwise 0 is returned.) When this initial space is - exhausted, additional memory will be obtained from the system. - Destroying this space will deallocate all additionally allocated - space (if possible) but not the initial base. -*/ -mspace create_mspace_with_base(void* base, size_t capacity, int locked); - -/* - mspace_malloc behaves as malloc, but operates within - the given space. -*/ -void* mspace_malloc(mspace msp, size_t bytes); - -/* - mspace_free behaves as free, but operates within - the given space. - - If compiled with FOOTERS==1, mspace_free is not actually needed. - free may be called instead of mspace_free because freed chunks from - any space are handled by their originating spaces. -*/ -void mspace_free(mspace msp, void* mem); - -/* - mspace_realloc behaves as realloc, but operates within - the given space. - - If compiled with FOOTERS==1, mspace_realloc is not actually - needed. realloc may be called instead of mspace_realloc because - realloced chunks from any space are handled by their originating - spaces. -*/ -void* mspace_realloc(mspace msp, void* mem, size_t newsize); - -/* - mspace_calloc behaves as calloc, but operates within - the given space. -*/ -void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); - -/* - mspace_memalign behaves as memalign, but operates within - the given space. -*/ -void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); - -/* - mspace_independent_calloc behaves as independent_calloc, but - operates within the given space. -*/ -void** mspace_independent_calloc(mspace msp, size_t n_elements, - size_t elem_size, void* chunks[]); - -/* - mspace_independent_comalloc behaves as independent_comalloc, but - operates within the given space. -*/ -void** mspace_independent_comalloc(mspace msp, size_t n_elements, - size_t sizes[], void* chunks[]); - -/* - mspace_footprint() returns the number of bytes obtained from the - system for this space. -*/ -size_t mspace_footprint(mspace msp); - -/* - mspace_max_footprint() returns the peak number of bytes obtained from the - system for this space. -*/ -size_t mspace_max_footprint(mspace msp); - - -#if !NO_MALLINFO -/* - mspace_mallinfo behaves as mallinfo, but reports properties of - the given space. -*/ -struct mallinfo mspace_mallinfo(mspace msp); -#endif /* NO_MALLINFO */ - -/* - mspace_malloc_stats behaves as malloc_stats, but reports - properties of the given space. -*/ -void mspace_malloc_stats(mspace msp); - -/* - mspace_trim behaves as malloc_trim, but - operates within the given space. -*/ -int mspace_trim(mspace msp, size_t pad); - -/* - An alias for mallopt. -*/ -int mspace_mallopt(int, int); - -#endif /* MSPACES */ - -#ifdef __cplusplus -}; /* end of extern "C" */ -#endif /* __cplusplus */ - -/* - ======================================================================== - To make a fully customizable malloc.h header file, cut everything - above this line, put into file malloc.h, edit to suit, and #include it - on the next line, as well as in programs that use this malloc. - ======================================================================== -*/ - -/* #include "malloc.h" */ - -/*------------------------------ internal #includes ---------------------- */ - -#ifdef WIN32 -#pragma warning( disable : 4146 ) /* no "unsigned" warnings */ -#endif /* WIN32 */ - -#include /* for printing in malloc_stats */ - -#ifndef LACKS_ERRNO_H -#include /* for MALLOC_FAILURE_ACTION */ -#endif /* LACKS_ERRNO_H */ -#if FOOTERS -#include /* for magic initialization */ -#endif /* FOOTERS */ -#ifndef LACKS_STDLIB_H -#include /* for abort() */ -#endif /* LACKS_STDLIB_H */ -#ifdef DEBUG -#if ABORT_ON_ASSERT_FAILURE -#define assert(x) if(!(x)) ABORT -#else /* ABORT_ON_ASSERT_FAILURE */ -#include -#endif /* ABORT_ON_ASSERT_FAILURE */ -#else /* DEBUG */ -#define assert(x) -#endif /* DEBUG */ -#ifndef LACKS_STRING_H -#include /* for memset etc */ -#endif /* LACKS_STRING_H */ -#if USE_BUILTIN_FFS -#ifndef LACKS_STRINGS_H -#include /* for ffs */ -#endif /* LACKS_STRINGS_H */ -#endif /* USE_BUILTIN_FFS */ -#if HAVE_MMAP -#ifndef LACKS_SYS_MMAN_H -#include /* for mmap */ -#endif /* LACKS_SYS_MMAN_H */ -#ifndef LACKS_FCNTL_H -#include -#endif /* LACKS_FCNTL_H */ -#endif /* HAVE_MMAP */ -#if HAVE_MORECORE -#ifndef LACKS_UNISTD_H -#include /* for sbrk */ -#else /* LACKS_UNISTD_H */ -#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) -extern void* sbrk(ptrdiff_t); -#endif /* FreeBSD etc */ -#endif /* LACKS_UNISTD_H */ -#endif /* HAVE_MMAP */ - -#ifndef WIN32 -#ifndef malloc_getpagesize -# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ -# ifndef _SC_PAGE_SIZE -# define _SC_PAGE_SIZE _SC_PAGESIZE -# endif -# endif -# ifdef _SC_PAGE_SIZE -# define malloc_getpagesize sysconf(_SC_PAGE_SIZE) -# else -# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) - extern size_t getpagesize(); -# define malloc_getpagesize getpagesize() -# else -# ifdef WIN32 /* use supplied emulation of getpagesize */ -# define malloc_getpagesize getpagesize() -# else -# ifndef LACKS_SYS_PARAM_H -# include -# endif -# ifdef EXEC_PAGESIZE -# define malloc_getpagesize EXEC_PAGESIZE -# else -# ifdef NBPG -# ifndef CLSIZE -# define malloc_getpagesize NBPG -# else -# define malloc_getpagesize (NBPG * CLSIZE) -# endif -# else -# ifdef NBPC -# define malloc_getpagesize NBPC -# else -# ifdef PAGESIZE -# define malloc_getpagesize PAGESIZE -# else /* just guess */ -# define malloc_getpagesize ((size_t)4096U) -# endif -# endif -# endif -# endif -# endif -# endif -# endif -#endif -#endif - -/* ------------------- size_t and alignment properties -------------------- */ - -/* The byte and bit size of a size_t */ -#define SIZE_T_SIZE (sizeof(size_t)) -#define SIZE_T_BITSIZE (sizeof(size_t) << 3) - -/* Some constants coerced to size_t */ -/* Annoying but necessary to avoid errors on some plaftorms */ -#define SIZE_T_ZERO ((size_t)0) -#define SIZE_T_ONE ((size_t)1) -#define SIZE_T_TWO ((size_t)2) -#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) -#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) -#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) -#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) - -/* The bit mask value corresponding to MALLOC_ALIGNMENT */ -#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) - -/* True if address a has acceptable alignment */ -#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0) - -/* the number of bytes to offset an address to align it */ -#define align_offset(A)\ - ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ - ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) - -/* -------------------------- MMAP preliminaries ------------------------- */ - -/* - If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and - checks to fail so compiler optimizer can delete code rather than - using so many "#if"s. -*/ - - -/* MORECORE and MMAP must return MFAIL on failure */ -#define MFAIL ((void*)(MAX_SIZE_T)) -#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */ - -#if !HAVE_MMAP -#define IS_MMAPPED_BIT (SIZE_T_ZERO) -#define USE_MMAP_BIT (SIZE_T_ZERO) -#define CALL_MMAP(s) MFAIL -#define CALL_MUNMAP(a, s) (-1) -#define DIRECT_MMAP(s) MFAIL - -#else /* HAVE_MMAP */ -#define IS_MMAPPED_BIT (SIZE_T_ONE) -#define USE_MMAP_BIT (SIZE_T_ONE) - -#ifndef WIN32 -#define CALL_MUNMAP(a, s) munmap((a), (s)) -#define MMAP_PROT (PROT_READ|PROT_WRITE) -#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) -#define MAP_ANONYMOUS MAP_ANON -#endif /* MAP_ANON */ -#ifdef MAP_ANONYMOUS -#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) -#define CALL_MMAP(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0) -#else /* MAP_ANONYMOUS */ -/* - Nearly all versions of mmap support MAP_ANONYMOUS, so the following - is unlikely to be needed, but is supplied just in case. -*/ -#define MMAP_FLAGS (MAP_PRIVATE) -static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ -#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \ - (dev_zero_fd = open("/dev/zero", O_RDWR), \ - mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \ - mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) -#endif /* MAP_ANONYMOUS */ - -#define DIRECT_MMAP(s) CALL_MMAP(s) -#else /* WIN32 */ - -/* Win32 MMAP via VirtualAlloc */ -static void* win32mmap(size_t size) { - void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); - return (ptr != 0)? ptr: MFAIL; -} - -/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ -static void* win32direct_mmap(size_t size) { - void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, - PAGE_READWRITE); - return (ptr != 0)? ptr: MFAIL; -} - -/* This function supports releasing coalesed segments */ -static int win32munmap(void* ptr, size_t size) { - MEMORY_BASIC_INFORMATION minfo; - char* cptr = ptr; - while (size) { - if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) - return -1; - if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || - minfo.State != MEM_COMMIT || minfo.RegionSize > size) - return -1; - if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) - return -1; - cptr += minfo.RegionSize; - size -= minfo.RegionSize; - } - return 0; -} - -#define CALL_MMAP(s) win32mmap(s) -#define CALL_MUNMAP(a, s) win32munmap((a), (s)) -#define DIRECT_MMAP(s) win32direct_mmap(s) -#endif /* WIN32 */ -#endif /* HAVE_MMAP */ - -#if HAVE_MMAP && HAVE_MREMAP -#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) -#else /* HAVE_MMAP && HAVE_MREMAP */ -#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL -#endif /* HAVE_MMAP && HAVE_MREMAP */ - -#if HAVE_MORECORE -#define CALL_MORECORE(S) MORECORE(S) -#else /* HAVE_MORECORE */ -#define CALL_MORECORE(S) MFAIL -#endif /* HAVE_MORECORE */ - -/* mstate bit set if continguous morecore disabled or failed */ -#define USE_NONCONTIGUOUS_BIT (4U) - -/* segment bit set in create_mspace_with_base */ -#define EXTERN_BIT (8U) - - -/* --------------------------- Lock preliminaries ------------------------ */ - -#if USE_LOCKS - -/* - When locks are defined, there are up to two global locks: - - * If HAVE_MORECORE, morecore_mutex protects sequences of calls to - MORECORE. In many cases sys_alloc requires two calls, that should - not be interleaved with calls by other threads. This does not - protect against direct calls to MORECORE by other threads not - using this lock, so there is still code to cope the best we can on - interference. - - * magic_init_mutex ensures that mparams.magic and other - unique mparams values are initialized only once. -*/ - -#ifndef WIN32 -/* By default use posix locks */ -#include -#define MLOCK_T pthread_mutex_t -#define INITIAL_LOCK(l) pthread_mutex_init(l, NULL) -#define ACQUIRE_LOCK(l) pthread_mutex_lock(l) -#define RELEASE_LOCK(l) pthread_mutex_unlock(l) - -#if HAVE_MORECORE -static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER; -#endif /* HAVE_MORECORE */ - -static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER; - -#else /* WIN32 */ -/* - Because lock-protected regions have bounded times, and there - are no recursive lock calls, we can use simple spinlocks. -*/ - -#define MLOCK_T long -static int win32_acquire_lock (MLOCK_T *sl) { - for (;;) { -#ifdef InterlockedCompareExchangePointer - if (!InterlockedCompareExchange(sl, 1, 0)) - return 0; -#else /* Use older void* version */ - if (!InterlockedCompareExchange((void**)sl, (void*)1, (void*)0)) - return 0; -#endif /* InterlockedCompareExchangePointer */ - Sleep (0); - } -} - -static void win32_release_lock (MLOCK_T *sl) { - InterlockedExchange (sl, 0); -} - -#define INITIAL_LOCK(l) *(l)=0 -#define ACQUIRE_LOCK(l) win32_acquire_lock(l) -#define RELEASE_LOCK(l) win32_release_lock(l) -#if HAVE_MORECORE -static MLOCK_T morecore_mutex; -#endif /* HAVE_MORECORE */ -static MLOCK_T magic_init_mutex; -#endif /* WIN32 */ - -#define USE_LOCK_BIT (2U) -#else /* USE_LOCKS */ -#define USE_LOCK_BIT (0U) -#define INITIAL_LOCK(l) -#endif /* USE_LOCKS */ - -#if USE_LOCKS && HAVE_MORECORE -#define ACQUIRE_MORECORE_LOCK() ACQUIRE_LOCK(&morecore_mutex); -#define RELEASE_MORECORE_LOCK() RELEASE_LOCK(&morecore_mutex); -#else /* USE_LOCKS && HAVE_MORECORE */ -#define ACQUIRE_MORECORE_LOCK() -#define RELEASE_MORECORE_LOCK() -#endif /* USE_LOCKS && HAVE_MORECORE */ - -#if USE_LOCKS -#define ACQUIRE_MAGIC_INIT_LOCK() ACQUIRE_LOCK(&magic_init_mutex); -#define RELEASE_MAGIC_INIT_LOCK() RELEASE_LOCK(&magic_init_mutex); -#else /* USE_LOCKS */ -#define ACQUIRE_MAGIC_INIT_LOCK() -#define RELEASE_MAGIC_INIT_LOCK() -#endif /* USE_LOCKS */ - - -/* ----------------------- Chunk representations ------------------------ */ - -/* - (The following includes lightly edited explanations by Colin Plumb.) - - The malloc_chunk declaration below is misleading (but accurate and - necessary). It declares a "view" into memory allowing access to - necessary fields at known offsets from a given base. - - Chunks of memory are maintained using a `boundary tag' method as - originally described by Knuth. (See the paper by Paul Wilson - ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such - techniques.) Sizes of free chunks are stored both in the front of - each chunk and at the end. This makes consolidating fragmented - chunks into bigger chunks fast. The head fields also hold bits - representing whether chunks are free or in use. - - Here are some pictures to make it clearer. They are "exploded" to - show that the state of a chunk can be thought of as extending from - the high 31 bits of the head field of its header through the - prev_foot and PINUSE_BIT bit of the following chunk header. - - A chunk that's in use looks like: - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk (if P = 1) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| - | Size of this chunk 1| +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | | - +- -+ - | | - +- -+ - | : - +- size - sizeof(size_t) available payload bytes -+ - : | - chunk-> +- -+ - | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1| - | Size of next chunk (may or may not be in use) | +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - And if it's free, it looks like this: - - chunk-> +- -+ - | User payload (must be in use, or we would have merged!) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| - | Size of this chunk 0| +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Next pointer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Prev pointer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | : - +- size - sizeof(struct chunk) unused bytes -+ - : | - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of this chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| - | Size of next chunk (must be in use, or we would have merged)| +-+ - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | : - +- User payload -+ - : | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - |0| - +-+ - Note that since we always merge adjacent free chunks, the chunks - adjacent to a free chunk must be in use. - - Given a pointer to a chunk (which can be derived trivially from the - payload pointer) we can, in O(1) time, find out whether the adjacent - chunks are free, and if so, unlink them from the lists that they - are on and merge them with the current chunk. - - Chunks always begin on even word boundaries, so the mem portion - (which is returned to the user) is also on an even word boundary, and - thus at least double-word aligned. - - The P (PINUSE_BIT) bit, stored in the unused low-order bit of the - chunk size (which is always a multiple of two words), is an in-use - bit for the *previous* chunk. If that bit is *clear*, then the - word before the current chunk size contains the previous chunk - size, and can be used to find the front of the previous chunk. - The very first chunk allocated always has this bit set, preventing - access to non-existent (or non-owned) memory. If pinuse is set for - any given chunk, then you CANNOT determine the size of the - previous chunk, and might even get a memory addressing fault when - trying to do so. - - The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of - the chunk size redundantly records whether the current chunk is - inuse. This redundancy enables usage checks within free and realloc, - and reduces indirection when freeing and consolidating chunks. - - Each freshly allocated chunk must have both cinuse and pinuse set. - That is, each allocated chunk borders either a previously allocated - and still in-use chunk, or the base of its memory arena. This is - ensured by making all allocations from the the `lowest' part of any - found chunk. Further, no free chunk physically borders another one, - so each free chunk is known to be preceded and followed by either - inuse chunks or the ends of memory. - - Note that the `foot' of the current chunk is actually represented - as the prev_foot of the NEXT chunk. This makes it easier to - deal with alignments etc but can be very confusing when trying - to extend or adapt this code. - - The exceptions to all this are - - 1. The special chunk `top' is the top-most available chunk (i.e., - the one bordering the end of available memory). It is treated - specially. Top is never included in any bin, is used only if - no other chunk is available, and is released back to the - system if it is very large (see M_TRIM_THRESHOLD). In effect, - the top chunk is treated as larger (and thus less well - fitting) than any other available chunk. The top chunk - doesn't update its trailing size field since there is no next - contiguous chunk that would have to index off it. However, - space is still allocated for it (TOP_FOOT_SIZE) to enable - separation or merging when space is extended. - - 3. Chunks allocated via mmap, which have the lowest-order bit - (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set - PINUSE_BIT in their head fields. Because they are allocated - one-by-one, each must carry its own prev_foot field, which is - also used to hold the offset this chunk has within its mmapped - region, which is needed to preserve alignment. Each mmapped - chunk is trailed by the first two fields of a fake next-chunk - for sake of usage checks. - -*/ - -struct malloc_chunk { - size_t prev_foot; /* Size of previous chunk (if free). */ - size_t head; /* Size and inuse bits. */ - struct malloc_chunk* fd; /* double links -- used only if free. */ - struct malloc_chunk* bk; -}; - -typedef struct malloc_chunk mchunk; -typedef struct malloc_chunk* mchunkptr; -typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ -typedef unsigned int bindex_t; /* Described below */ -typedef unsigned int binmap_t; /* Described below */ -typedef unsigned int flag_t; /* The type of various bit flag sets */ - -/* ------------------- Chunks sizes and alignments ----------------------- */ - -#define MCHUNK_SIZE (sizeof(mchunk)) - -#if FOOTERS -#define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) -#else /* FOOTERS */ -#define CHUNK_OVERHEAD (SIZE_T_SIZE) -#endif /* FOOTERS */ - -/* MMapped chunks need a second word of overhead ... */ -#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) -/* ... and additional padding for fake next-chunk at foot */ -#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) - -/* The smallest size we can malloc is an aligned minimal chunk */ -#define MIN_CHUNK_SIZE\ - ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) - -/* conversion from malloc headers to user pointers, and back */ -#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) -#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) -/* chunk associated with aligned address A */ -#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) - -/* Bounds on request (not chunk) sizes. */ -#define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2) -#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) - -/* pad request bytes into a usable size */ -#define pad_request(req) \ - (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) - -/* pad request, checking for minimum (but not maximum) */ -#define request2size(req) \ - (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) - - -/* ------------------ Operations on head and foot fields ----------------- */ - -/* - The head field of a chunk is or'ed with PINUSE_BIT when previous - adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in - use. If the chunk was obtained with mmap, the prev_foot field has - IS_MMAPPED_BIT set, otherwise holding the offset of the base of the - mmapped region to the base of the chunk. -*/ - -#define PINUSE_BIT (SIZE_T_ONE) -#define CINUSE_BIT (SIZE_T_TWO) -#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) - -/* Head value for fenceposts */ -#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) - -/* extraction of fields from head words */ -#define cinuse(p) ((p)->head & CINUSE_BIT) -#define pinuse(p) ((p)->head & PINUSE_BIT) -#define chunksize(p) ((p)->head & ~(INUSE_BITS)) - -#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) -#define clear_cinuse(p) ((p)->head &= ~CINUSE_BIT) - -/* Treat space at ptr +/- offset as a chunk */ -#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) -#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s))) - -/* Ptr to next or previous physical malloc_chunk. */ -#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS))) -#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) )) - -/* extract next chunk's pinuse bit */ -#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) - -/* Get/set size at footer */ -#define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot) -#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s)) - -/* Set size, pinuse bit, and foot */ -#define set_size_and_pinuse_of_free_chunk(p, s)\ - ((p)->head = (s|PINUSE_BIT), set_foot(p, s)) - -/* Set size, pinuse bit, foot, and clear next pinuse */ -#define set_free_with_pinuse(p, s, n)\ - (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) - -#define is_mmapped(p)\ - (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT)) - -/* Get the internal overhead associated with chunk p */ -#define overhead_for(p)\ - (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) - -/* Return true if malloced space is not necessarily cleared */ -#if MMAP_CLEARS -#define calloc_must_clear(p) (!is_mmapped(p)) -#else /* MMAP_CLEARS */ -#define calloc_must_clear(p) (1) -#endif /* MMAP_CLEARS */ - -/* ---------------------- Overlaid data structures ----------------------- */ - -/* - When chunks are not in use, they are treated as nodes of either - lists or trees. - - "Small" chunks are stored in circular doubly-linked lists, and look - like this: - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `head:' | Size of chunk, in bytes |P| - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Forward pointer to next chunk in list | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Back pointer to previous chunk in list | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Unused space (may be 0 bytes long) . - . . - . | -nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `foot:' | Size of chunk, in bytes | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - Larger chunks are kept in a form of bitwise digital trees (aka - tries) keyed on chunksizes. Because malloc_tree_chunks are only for - free chunks greater than 256 bytes, their size doesn't impose any - constraints on user chunk sizes. Each node looks like: - - chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Size of previous chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `head:' | Size of chunk, in bytes |P| - mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Forward pointer to next chunk of same size | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Back pointer to previous chunk of same size | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Pointer to left child (child[0]) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Pointer to right child (child[1]) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Pointer to parent | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | bin index of this chunk | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Unused space . - . | -nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - `foot:' | Size of chunk, in bytes | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - Each tree holding treenodes is a tree of unique chunk sizes. Chunks - of the same size are arranged in a circularly-linked list, with only - the oldest chunk (the next to be used, in our FIFO ordering) - actually in the tree. (Tree members are distinguished by a non-null - parent pointer.) If a chunk with the same size an an existing node - is inserted, it is linked off the existing node using pointers that - work in the same way as fd/bk pointers of small chunks. - - Each tree contains a power of 2 sized range of chunk sizes (the - smallest is 0x100 <= x < 0x180), which is is divided in half at each - tree level, with the chunks in the smaller half of the range (0x100 - <= x < 0x140 for the top nose) in the left subtree and the larger - half (0x140 <= x < 0x180) in the right subtree. This is, of course, - done by inspecting individual bits. - - Using these rules, each node's left subtree contains all smaller - sizes than its right subtree. However, the node at the root of each - subtree has no particular ordering relationship to either. (The - dividing line between the subtree sizes is based on trie relation.) - If we remove the last chunk of a given size from the interior of the - tree, we need to replace it with a leaf node. The tree ordering - rules permit a node to be replaced by any leaf below it. - - The smallest chunk in a tree (a common operation in a best-fit - allocator) can be found by walking a path to the leftmost leaf in - the tree. Unlike a usual binary tree, where we follow left child - pointers until we reach a null, here we follow the right child - pointer any time the left one is null, until we reach a leaf with - both child pointers null. The smallest chunk in the tree will be - somewhere along that path. - - The worst case number of steps to add, find, or remove a node is - bounded by the number of bits differentiating chunks within - bins. Under current bin calculations, this ranges from 6 up to 21 - (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case - is of course much better. -*/ - -struct malloc_tree_chunk { - /* The first four fields must be compatible with malloc_chunk */ - size_t prev_foot; - size_t head; - struct malloc_tree_chunk* fd; - struct malloc_tree_chunk* bk; - - struct malloc_tree_chunk* child[2]; - struct malloc_tree_chunk* parent; - bindex_t index; -}; - -typedef struct malloc_tree_chunk tchunk; -typedef struct malloc_tree_chunk* tchunkptr; -typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */ - -/* A little helper macro for trees */ -#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) - -/* ----------------------------- Segments -------------------------------- */ - -/* - Each malloc space may include non-contiguous segments, held in a - list headed by an embedded malloc_segment record representing the - top-most space. Segments also include flags holding properties of - the space. Large chunks that are directly allocated by mmap are not - included in this list. They are instead independently created and - destroyed without otherwise keeping track of them. - - Segment management mainly comes into play for spaces allocated by - MMAP. Any call to MMAP might or might not return memory that is - adjacent to an existing segment. MORECORE normally contiguously - extends the current space, so this space is almost always adjacent, - which is simpler and faster to deal with. (This is why MORECORE is - used preferentially to MMAP when both are available -- see - sys_alloc.) When allocating using MMAP, we don't use any of the - hinting mechanisms (inconsistently) supported in various - implementations of unix mmap, or distinguish reserving from - committing memory. Instead, we just ask for space, and exploit - contiguity when we get it. It is probably possible to do - better than this on some systems, but no general scheme seems - to be significantly better. - - Management entails a simpler variant of the consolidation scheme - used for chunks to reduce fragmentation -- new adjacent memory is - normally prepended or appended to an existing segment. However, - there are limitations compared to chunk consolidation that mostly - reflect the fact that segment processing is relatively infrequent - (occurring only when getting memory from system) and that we - don't expect to have huge numbers of segments: - - * Segments are not indexed, so traversal requires linear scans. (It - would be possible to index these, but is not worth the extra - overhead and complexity for most programs on most platforms.) - * New segments are only appended to old ones when holding top-most - memory; if they cannot be prepended to others, they are held in - different segments. - - Except for the top-most segment of an mstate, each segment record - is kept at the tail of its segment. Segments are added by pushing - segment records onto the list headed by &mstate.seg for the - containing mstate. - - Segment flags control allocation/merge/deallocation policies: - * If EXTERN_BIT set, then we did not allocate this segment, - and so should not try to deallocate or merge with others. - (This currently holds only for the initial segment passed - into create_mspace_with_base.) - * If IS_MMAPPED_BIT set, the segment may be merged with - other surrounding mmapped segments and trimmed/de-allocated - using munmap. - * If neither bit is set, then the segment was obtained using - MORECORE so can be merged with surrounding MORECORE'd segments - and deallocated/trimmed using MORECORE with negative arguments. -*/ - -struct malloc_segment { - char* base; /* base address */ - size_t size; /* allocated size */ - struct malloc_segment* next; /* ptr to next segment */ - flag_t sflags; /* mmap and extern flag */ -}; - -#define is_mmapped_segment(S) ((S)->sflags & IS_MMAPPED_BIT) -#define is_extern_segment(S) ((S)->sflags & EXTERN_BIT) - -typedef struct malloc_segment msegment; -typedef struct malloc_segment* msegmentptr; - -/* ---------------------------- malloc_state ----------------------------- */ - -/* - A malloc_state holds all of the bookkeeping for a space. - The main fields are: - - Top - The topmost chunk of the currently active segment. Its size is - cached in topsize. The actual size of topmost space is - topsize+TOP_FOOT_SIZE, which includes space reserved for adding - fenceposts and segment records if necessary when getting more - space from the system. The size at which to autotrim top is - cached from mparams in trim_check, except that it is disabled if - an autotrim fails. - - Designated victim (dv) - This is the preferred chunk for servicing small requests that - don't have exact fits. It is normally the chunk split off most - recently to service another small request. Its size is cached in - dvsize. The link fields of this chunk are not maintained since it - is not kept in a bin. - - SmallBins - An array of bin headers for free chunks. These bins hold chunks - with sizes less than MIN_LARGE_SIZE bytes. Each bin contains - chunks of all the same size, spaced 8 bytes apart. To simplify - use in double-linked lists, each bin header acts as a malloc_chunk - pointing to the real first node, if it exists (else pointing to - itself). This avoids special-casing for headers. But to avoid - waste, we allocate only the fd/bk pointers of bins, and then use - repositioning tricks to treat these as the fields of a chunk. - - TreeBins - Treebins are pointers to the roots of trees holding a range of - sizes. There are 2 equally spaced treebins for each power of two - from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything - larger. - - Bin maps - There is one bit map for small bins ("smallmap") and one for - treebins ("treemap). Each bin sets its bit when non-empty, and - clears the bit when empty. Bit operations are then used to avoid - bin-by-bin searching -- nearly all "search" is done without ever - looking at bins that won't be selected. The bit maps - conservatively use 32 bits per map word, even if on 64bit system. - For a good description of some of the bit-based techniques used - here, see Henry S. Warren Jr's book "Hacker's Delight" (and - supplement at http://hackersdelight.org/). Many of these are - intended to reduce the branchiness of paths through malloc etc, as - well as to reduce the number of memory locations read or written. - - Segments - A list of segments headed by an embedded malloc_segment record - representing the initial space. - - Address check support - The least_addr field is the least address ever obtained from - MORECORE or MMAP. Attempted frees and reallocs of any address less - than this are trapped (unless INSECURE is defined). - - Magic tag - A cross-check field that should always hold same value as mparams.magic. - - Flags - Bits recording whether to use MMAP, locks, or contiguous MORECORE - - Statistics - Each space keeps track of current and maximum system memory - obtained via MORECORE or MMAP. - - Locking - If USE_LOCKS is defined, the "mutex" lock is acquired and released - around every public call using this mspace. -*/ - -/* Bin types, widths and sizes */ -#define NSMALLBINS (32U) -#define NTREEBINS (32U) -#define SMALLBIN_SHIFT (3U) -#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) -#define TREEBIN_SHIFT (8U) -#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) -#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) -#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) - -struct malloc_state { - binmap_t smallmap; - binmap_t treemap; - size_t dvsize; - size_t topsize; - char* least_addr; - mchunkptr dv; - mchunkptr top; - size_t trim_check; - size_t magic; - mchunkptr smallbins[(NSMALLBINS+1)*2]; - tbinptr treebins[NTREEBINS]; - size_t footprint; - size_t max_footprint; - flag_t mflags; -#if USE_LOCKS - MLOCK_T mutex; /* locate lock among fields that rarely change */ -#endif /* USE_LOCKS */ - msegment seg; -}; - -typedef struct malloc_state* mstate; - -/* ------------- Global malloc_state and malloc_params ------------------- */ - -/* - malloc_params holds global properties, including those that can be - dynamically set using mallopt. There is a single instance, mparams, - initialized in init_mparams. -*/ - -struct malloc_params { - size_t magic; - size_t page_size; - size_t granularity; - size_t mmap_threshold; - size_t trim_threshold; - flag_t default_mflags; -}; - -static struct malloc_params mparams; - -/* The global malloc_state used for all non-"mspace" calls */ -static struct malloc_state _gm_; -#define gm (&_gm_) -#define is_global(M) ((M) == &_gm_) -#define is_initialized(M) ((M)->top != 0) - -/* -------------------------- system alloc setup ------------------------- */ - -/* Operations on mflags */ - -#define use_lock(M) ((M)->mflags & USE_LOCK_BIT) -#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT) -#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT) - -#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT) -#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT) -#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT) - -#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT) -#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT) - -#define set_lock(M,L)\ - ((M)->mflags = (L)?\ - ((M)->mflags | USE_LOCK_BIT) :\ - ((M)->mflags & ~USE_LOCK_BIT)) - -/* page-align a size */ -#define page_align(S)\ - (((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE)) - -/* granularity-align a size */ -#define granularity_align(S)\ - (((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE)) - -#define is_page_aligned(S)\ - (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0) -#define is_granularity_aligned(S)\ - (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0) - -/* True if segment S holds address A */ -#define segment_holds(S, A)\ - ((char*)(A) >= S->base && (char*)(A) < S->base + S->size) - -/* Return segment holding given address */ -static msegmentptr segment_holding(mstate m, char* addr) { - msegmentptr sp = &m->seg; - for (;;) { - if (addr >= sp->base && addr < sp->base + sp->size) - return sp; - if ((sp = sp->next) == 0) - return 0; - } -} - -/* Return true if segment contains a segment link */ -static int has_segment_link(mstate m, msegmentptr ss) { - msegmentptr sp = &m->seg; - for (;;) { - if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size) - return 1; - if ((sp = sp->next) == 0) - return 0; - } -} - -#ifndef MORECORE_CANNOT_TRIM -#define should_trim(M,s) ((s) > (M)->trim_check) -#else /* MORECORE_CANNOT_TRIM */ -#define should_trim(M,s) (0) -#endif /* MORECORE_CANNOT_TRIM */ - -/* - TOP_FOOT_SIZE is padding at the end of a segment, including space - that may be needed to place segment records and fenceposts when new - noncontiguous segments are added. -*/ -#define TOP_FOOT_SIZE\ - (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) - - -/* ------------------------------- Hooks -------------------------------- */ - -/* - PREACTION should be defined to return 0 on success, and nonzero on - failure. If you are not using locking, you can redefine these to do - anything you like. -*/ - -#if USE_LOCKS - -/* Ensure locks are initialized */ -#define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams()) - -#define PREACTION(M) ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0) -#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); } -#else /* USE_LOCKS */ - -#ifndef PREACTION -#define PREACTION(M) (0) -#endif /* PREACTION */ - -#ifndef POSTACTION -#define POSTACTION(M) -#endif /* POSTACTION */ - -#endif /* USE_LOCKS */ - -/* - CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses. - USAGE_ERROR_ACTION is triggered on detected bad frees and - reallocs. The argument p is an address that might have triggered the - fault. It is ignored by the two predefined actions, but might be - useful in custom actions that try to help diagnose errors. -*/ - -#if PROCEED_ON_ERROR - -/* A count of the number of corruption errors causing resets */ -int malloc_corruption_error_count; - -/* default corruption action */ -static void reset_on_error(mstate m); - -#define CORRUPTION_ERROR_ACTION(m) reset_on_error(m) -#define USAGE_ERROR_ACTION(m, p) - -#else /* PROCEED_ON_ERROR */ - -#ifndef CORRUPTION_ERROR_ACTION -#define CORRUPTION_ERROR_ACTION(m) ABORT -#endif /* CORRUPTION_ERROR_ACTION */ - -#ifndef USAGE_ERROR_ACTION -#define USAGE_ERROR_ACTION(m,p) ABORT -#endif /* USAGE_ERROR_ACTION */ - -#endif /* PROCEED_ON_ERROR */ - -/* -------------------------- Debugging setup ---------------------------- */ - -#if ! DEBUG - -#define check_free_chunk(M,P) -#define check_inuse_chunk(M,P) -#define check_malloced_chunk(M,P,N) -#define check_mmapped_chunk(M,P) -#define check_malloc_state(M) -#define check_top_chunk(M,P) - -#else /* DEBUG */ -#define check_free_chunk(M,P) do_check_free_chunk(M,P) -#define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P) -#define check_top_chunk(M,P) do_check_top_chunk(M,P) -#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N) -#define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P) -#define check_malloc_state(M) do_check_malloc_state(M) - -static void do_check_any_chunk(mstate m, mchunkptr p); -static void do_check_top_chunk(mstate m, mchunkptr p); -static void do_check_mmapped_chunk(mstate m, mchunkptr p); -static void do_check_inuse_chunk(mstate m, mchunkptr p); -static void do_check_free_chunk(mstate m, mchunkptr p); -static void do_check_malloced_chunk(mstate m, void* mem, size_t s); -static void do_check_tree(mstate m, tchunkptr t); -static void do_check_treebin(mstate m, bindex_t i); -static void do_check_smallbin(mstate m, bindex_t i); -static void do_check_malloc_state(mstate m); -static int bin_find(mstate m, mchunkptr x); -static size_t traverse_and_check(mstate m); -#endif /* DEBUG */ - -/* ---------------------------- Indexing Bins ---------------------------- */ - -#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) -#define small_index(s) ((s) >> SMALLBIN_SHIFT) -#define small_index2size(i) ((i) << SMALLBIN_SHIFT) -#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) - -/* addressing by index. See above about smallbin repositioning */ -#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1]))) -#define treebin_at(M,i) (&((M)->treebins[i])) - -/* assign tree index for size S to variable I */ -#if defined(__GNUC__) && defined(i386) -#define compute_tree_index(S, I)\ -{\ - size_t X = S >> TREEBIN_SHIFT;\ - if (X == 0)\ - I = 0;\ - else if (X > 0xFFFF)\ - I = NTREEBINS-1;\ - else {\ - unsigned int K;\ - __asm__("bsrl %1,%0\n\t" : "=r" (K) : "rm" (X));\ - I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ - }\ -} -#else /* GNUC */ -#define compute_tree_index(S, I)\ -{\ - size_t X = S >> TREEBIN_SHIFT;\ - if (X == 0)\ - I = 0;\ - else if (X > 0xFFFF)\ - I = NTREEBINS-1;\ - else {\ - unsigned int Y = (unsigned int)X;\ - unsigned int N = ((Y - 0x100) >> 16) & 8;\ - unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\ - N += K;\ - N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\ - K = 14 - N + ((Y <<= K) >> 15);\ - I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\ - }\ -} -#endif /* GNUC */ - -/* Bit representing maximum resolved size in a treebin at i */ -#define bit_for_tree_index(i) \ - (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) - -/* Shift placing maximum resolved bit in a treebin at i as sign bit */ -#define leftshift_for_tree_index(i) \ - ((i == NTREEBINS-1)? 0 : \ - ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) - -/* The size of the smallest chunk held in bin with index i */ -#define minsize_for_tree_index(i) \ - ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ - (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) - - -/* ------------------------ Operations on bin maps ----------------------- */ - -/* bit corresponding to given index */ -#define idx2bit(i) ((binmap_t)(1) << (i)) - -/* Mark/Clear bits with given index */ -#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) -#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) -#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) - -#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) -#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) -#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) - -/* index corresponding to given bit */ - -#if defined(__GNUC__) && defined(i386) -#define compute_bit2idx(X, I)\ -{\ - unsigned int J;\ - __asm__("bsfl %1,%0\n\t" : "=r" (J) : "rm" (X));\ - I = (bindex_t)J;\ -} - -#else /* GNUC */ -#if USE_BUILTIN_FFS -#define compute_bit2idx(X, I) I = ffs(X)-1 - -#else /* USE_BUILTIN_FFS */ -#define compute_bit2idx(X, I)\ -{\ - unsigned int Y = X - 1;\ - unsigned int K = Y >> (16-4) & 16;\ - unsigned int N = K; Y >>= K;\ - N += K = Y >> (8-3) & 8; Y >>= K;\ - N += K = Y >> (4-2) & 4; Y >>= K;\ - N += K = Y >> (2-1) & 2; Y >>= K;\ - N += K = Y >> (1-0) & 1; Y >>= K;\ - I = (bindex_t)(N + Y);\ -} -#endif /* USE_BUILTIN_FFS */ -#endif /* GNUC */ - -/* isolate the least set bit of a bitmap */ -#define least_bit(x) ((x) & -(x)) - -/* mask with all bits to left of least bit of x on */ -#define left_bits(x) ((x<<1) | -(x<<1)) - -/* mask with all bits to left of or equal to least bit of x on */ -#define same_or_left_bits(x) ((x) | -(x)) - - -/* ----------------------- Runtime Check Support ------------------------- */ - -/* - For security, the main invariant is that malloc/free/etc never - writes to a static address other than malloc_state, unless static - malloc_state itself has been corrupted, which cannot occur via - malloc (because of these checks). In essence this means that we - believe all pointers, sizes, maps etc held in malloc_state, but - check all of those linked or offsetted from other embedded data - structures. These checks are interspersed with main code in a way - that tends to minimize their run-time cost. - - When FOOTERS is defined, in addition to range checking, we also - verify footer fields of inuse chunks, which can be used guarantee - that the mstate controlling malloc/free is intact. This is a - streamlined version of the approach described by William Robertson - et al in "Run-time Detection of Heap-based Overflows" LISA'03 - http://www.usenix.org/events/lisa03/tech/robertson.html The footer - of an inuse chunk holds the xor of its mstate and a random seed, - that is checked upon calls to free() and realloc(). This is - (probablistically) unguessable from outside the program, but can be - computed by any code successfully malloc'ing any chunk, so does not - itself provide protection against code that has already broken - security through some other means. Unlike Robertson et al, we - always dynamically check addresses of all offset chunks (previous, - next, etc). This turns out to be cheaper than relying on hashes. -*/ - -#if !INSECURE -/* Check if address a is at least as high as any from MORECORE or MMAP */ -#define ok_address(M, a) ((char*)(a) >= (M)->least_addr) -/* Check if address of next chunk n is higher than base chunk p */ -#define ok_next(p, n) ((char*)(p) < (char*)(n)) -/* Check if p has its cinuse bit on */ -#define ok_cinuse(p) cinuse(p) -/* Check if p has its pinuse bit on */ -#define ok_pinuse(p) pinuse(p) - -#else /* !INSECURE */ -#define ok_address(M, a) (1) -#define ok_next(b, n) (1) -#define ok_cinuse(p) (1) -#define ok_pinuse(p) (1) -#endif /* !INSECURE */ - -#if (FOOTERS && !INSECURE) -/* Check if (alleged) mstate m has expected magic field */ -#define ok_magic(M) ((M)->magic == mparams.magic) -#else /* (FOOTERS && !INSECURE) */ -#define ok_magic(M) (1) -#endif /* (FOOTERS && !INSECURE) */ - - -/* In gcc, use __builtin_expect to minimize impact of checks */ -#if !INSECURE -#if defined(__GNUC__) && __GNUC__ >= 3 -#define RTCHECK(e) __builtin_expect(e, 1) -#else /* GNUC */ -#define RTCHECK(e) (e) -#endif /* GNUC */ -#else /* !INSECURE */ -#define RTCHECK(e) (1) -#endif /* !INSECURE */ - -/* macros to set up inuse chunks with or without footers */ - -#if !FOOTERS - -#define mark_inuse_foot(M,p,s) - -/* Set cinuse bit and pinuse bit of next chunk */ -#define set_inuse(M,p,s)\ - ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ - ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) - -/* Set cinuse and pinuse of this chunk and pinuse of next chunk */ -#define set_inuse_and_pinuse(M,p,s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ - ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) - -/* Set size, cinuse and pinuse bit of this chunk */ -#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) - -#else /* FOOTERS */ - -/* Set foot of inuse chunk to be xor of mstate and seed */ -#define mark_inuse_foot(M,p,s)\ - (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic)) - -#define get_mstate_for(p)\ - ((mstate)(((mchunkptr)((char*)(p) +\ - (chunksize(p))))->prev_foot ^ mparams.magic)) - -#define set_inuse(M,p,s)\ - ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ - (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \ - mark_inuse_foot(M,p,s)) - -#define set_inuse_and_pinuse(M,p,s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ - (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\ - mark_inuse_foot(M,p,s)) - -#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ - mark_inuse_foot(M, p, s)) - -#endif /* !FOOTERS */ - -/* ---------------------------- setting mparams -------------------------- */ - -/* Initialize mparams */ -static int init_mparams(void) { - if (mparams.page_size == 0) { - size_t s; - - mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD; - mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD; -#if MORECORE_CONTIGUOUS - mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT; -#else /* MORECORE_CONTIGUOUS */ - mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT; -#endif /* MORECORE_CONTIGUOUS */ - -#if (FOOTERS && !INSECURE) - { -#if USE_DEV_RANDOM - int fd; - unsigned char buf[sizeof(size_t)]; - /* Try to use /dev/urandom, else fall back on using time */ - if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 && - read(fd, buf, sizeof(buf)) == sizeof(buf)) { - s = *((size_t *) buf); - close(fd); - } - else -#endif /* USE_DEV_RANDOM */ - s = (size_t)(time(0) ^ (size_t)0x55555555U); - - s |= (size_t)8U; /* ensure nonzero */ - s &= ~(size_t)7U; /* improve chances of fault for bad values */ - - } -#else /* (FOOTERS && !INSECURE) */ - s = (size_t)0x58585858U; -#endif /* (FOOTERS && !INSECURE) */ - ACQUIRE_MAGIC_INIT_LOCK(); - if (mparams.magic == 0) { - mparams.magic = s; - /* Set up lock for main malloc area */ - INITIAL_LOCK(&gm->mutex); - gm->mflags = mparams.default_mflags; - } - RELEASE_MAGIC_INIT_LOCK(); - -#ifndef WIN32 - mparams.page_size = malloc_getpagesize; - mparams.granularity = ((DEFAULT_GRANULARITY != 0)? - DEFAULT_GRANULARITY : mparams.page_size); -#else /* WIN32 */ - { - SYSTEM_INFO system_info; - GetSystemInfo(&system_info); - mparams.page_size = system_info.dwPageSize; - mparams.granularity = system_info.dwAllocationGranularity; - } -#endif /* WIN32 */ - - /* Sanity-check configuration: - size_t must be unsigned and as wide as pointer type. - ints must be at least 4 bytes. - alignment must be at least 8. - Alignment, min chunk size, and page size must all be powers of 2. - */ - if ((sizeof(size_t) != sizeof(char*)) || - (MAX_SIZE_T < MIN_CHUNK_SIZE) || - (sizeof(int) < 4) || - (MALLOC_ALIGNMENT < (size_t)8U) || - ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) || - ((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) || - ((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) || - ((mparams.page_size & (mparams.page_size-SIZE_T_ONE)) != 0)) - ABORT; - } - return 0; -} - -/* support for mallopt */ -static int change_mparam(int param_number, int value) { - size_t val = (size_t)value; - init_mparams(); - switch(param_number) { - case M_TRIM_THRESHOLD: - mparams.trim_threshold = val; - return 1; - case M_GRANULARITY: - if (val >= mparams.page_size && ((val & (val-1)) == 0)) { - mparams.granularity = val; - return 1; - } - else - return 0; - case M_MMAP_THRESHOLD: - mparams.mmap_threshold = val; - return 1; - default: - return 0; - } -} - -#if DEBUG -/* ------------------------- Debugging Support --------------------------- */ - -/* Check properties of any chunk, whether free, inuse, mmapped etc */ -static void do_check_any_chunk(mstate m, mchunkptr p) { - assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); - assert(ok_address(m, p)); -} - -/* Check properties of top chunk */ -static void do_check_top_chunk(mstate m, mchunkptr p) { - msegmentptr sp = segment_holding(m, (char*)p); - size_t sz = chunksize(p); - assert(sp != 0); - assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); - assert(ok_address(m, p)); - assert(sz == m->topsize); - assert(sz > 0); - assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE); - assert(pinuse(p)); - assert(!next_pinuse(p)); -} - -/* Check properties of (inuse) mmapped chunks */ -static void do_check_mmapped_chunk(mstate m, mchunkptr p) { - size_t sz = chunksize(p); - size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD); - assert(is_mmapped(p)); - assert(use_mmap(m)); - assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); - assert(ok_address(m, p)); - assert(!is_small(sz)); - assert((len & (mparams.page_size-SIZE_T_ONE)) == 0); - assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD); - assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0); -} - -/* Check properties of inuse chunks */ -static void do_check_inuse_chunk(mstate m, mchunkptr p) { - do_check_any_chunk(m, p); - assert(cinuse(p)); - assert(next_pinuse(p)); - /* If not pinuse and not mmapped, previous chunk has OK offset */ - assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p); - if (is_mmapped(p)) - do_check_mmapped_chunk(m, p); -} - -/* Check properties of free chunks */ -static void do_check_free_chunk(mstate m, mchunkptr p) { - size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); - mchunkptr next = chunk_plus_offset(p, sz); - do_check_any_chunk(m, p); - assert(!cinuse(p)); - assert(!next_pinuse(p)); - assert (!is_mmapped(p)); - if (p != m->dv && p != m->top) { - if (sz >= MIN_CHUNK_SIZE) { - assert((sz & CHUNK_ALIGN_MASK) == 0); - assert(is_aligned(chunk2mem(p))); - assert(next->prev_foot == sz); - assert(pinuse(p)); - assert (next == m->top || cinuse(next)); - assert(p->fd->bk == p); - assert(p->bk->fd == p); - } - else /* markers are always of size SIZE_T_SIZE */ - assert(sz == SIZE_T_SIZE); - } -} - -/* Check properties of malloced chunks at the point they are malloced */ -static void do_check_malloced_chunk(mstate m, void* mem, size_t s) { - if (mem != 0) { - mchunkptr p = mem2chunk(mem); - size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); - do_check_inuse_chunk(m, p); - assert((sz & CHUNK_ALIGN_MASK) == 0); - assert(sz >= MIN_CHUNK_SIZE); - assert(sz >= s); - /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */ - assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE)); - } -} - -/* Check a tree and its subtrees. */ -static void do_check_tree(mstate m, tchunkptr t) { - tchunkptr head = 0; - tchunkptr u = t; - bindex_t tindex = t->index; - size_t tsize = chunksize(t); - bindex_t idx; - compute_tree_index(tsize, idx); - assert(tindex == idx); - assert(tsize >= MIN_LARGE_SIZE); - assert(tsize >= minsize_for_tree_index(idx)); - assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1)))); - - do { /* traverse through chain of same-sized nodes */ - do_check_any_chunk(m, ((mchunkptr)u)); - assert(u->index == tindex); - assert(chunksize(u) == tsize); - assert(!cinuse(u)); - assert(!next_pinuse(u)); - assert(u->fd->bk == u); - assert(u->bk->fd == u); - if (u->parent == 0) { - assert(u->child[0] == 0); - assert(u->child[1] == 0); - } - else { - assert(head == 0); /* only one node on chain has parent */ - head = u; - assert(u->parent != u); - assert (u->parent->child[0] == u || - u->parent->child[1] == u || - *((tbinptr*)(u->parent)) == u); - if (u->child[0] != 0) { - assert(u->child[0]->parent == u); - assert(u->child[0] != u); - do_check_tree(m, u->child[0]); - } - if (u->child[1] != 0) { - assert(u->child[1]->parent == u); - assert(u->child[1] != u); - do_check_tree(m, u->child[1]); - } - if (u->child[0] != 0 && u->child[1] != 0) { - assert(chunksize(u->child[0]) < chunksize(u->child[1])); - } - } - u = u->fd; - } while (u != t); - assert(head != 0); -} - -/* Check all the chunks in a treebin. */ -static void do_check_treebin(mstate m, bindex_t i) { - tbinptr* tb = treebin_at(m, i); - tchunkptr t = *tb; - int empty = (m->treemap & (1U << i)) == 0; - if (t == 0) - assert(empty); - if (!empty) - do_check_tree(m, t); -} - -/* Check all the chunks in a smallbin. */ -static void do_check_smallbin(mstate m, bindex_t i) { - sbinptr b = smallbin_at(m, i); - mchunkptr p = b->bk; - unsigned int empty = (m->smallmap & (1U << i)) == 0; - if (p == b) - assert(empty); - if (!empty) { - for (; p != b; p = p->bk) { - size_t size = chunksize(p); - mchunkptr q; - /* each chunk claims to be free */ - do_check_free_chunk(m, p); - /* chunk belongs in bin */ - assert(small_index(size) == i); - assert(p->bk == b || chunksize(p->bk) == chunksize(p)); - /* chunk is followed by an inuse chunk */ - q = next_chunk(p); - if (q->head != FENCEPOST_HEAD) - do_check_inuse_chunk(m, q); - } - } -} - -/* Find x in a bin. Used in other check functions. */ -static int bin_find(mstate m, mchunkptr x) { - size_t size = chunksize(x); - if (is_small(size)) { - bindex_t sidx = small_index(size); - sbinptr b = smallbin_at(m, sidx); - if (smallmap_is_marked(m, sidx)) { - mchunkptr p = b; - do { - if (p == x) - return 1; - } while ((p = p->fd) != b); - } - } - else { - bindex_t tidx; - compute_tree_index(size, tidx); - if (treemap_is_marked(m, tidx)) { - tchunkptr t = *treebin_at(m, tidx); - size_t sizebits = size << leftshift_for_tree_index(tidx); - while (t != 0 && chunksize(t) != size) { - t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; - sizebits <<= 1; - } - if (t != 0) { - tchunkptr u = t; - do { - if (u == (tchunkptr)x) - return 1; - } while ((u = u->fd) != t); - } - } - } - return 0; -} - -/* Traverse each chunk and check it; return total */ -static size_t traverse_and_check(mstate m) { - size_t sum = 0; - if (is_initialized(m)) { - msegmentptr s = &m->seg; - sum += m->topsize + TOP_FOOT_SIZE; - while (s != 0) { - mchunkptr q = align_as_chunk(s->base); - mchunkptr lastq = 0; - assert(pinuse(q)); - while (segment_holds(s, q) && - q != m->top && q->head != FENCEPOST_HEAD) { - sum += chunksize(q); - if (cinuse(q)) { - assert(!bin_find(m, q)); - do_check_inuse_chunk(m, q); - } - else { - assert(q == m->dv || bin_find(m, q)); - assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */ - do_check_free_chunk(m, q); - } - lastq = q; - q = next_chunk(q); - } - s = s->next; - } - } - return sum; -} - -/* Check all properties of malloc_state. */ -static void do_check_malloc_state(mstate m) { - bindex_t i; - size_t total; - /* check bins */ - for (i = 0; i < NSMALLBINS; ++i) - do_check_smallbin(m, i); - for (i = 0; i < NTREEBINS; ++i) - do_check_treebin(m, i); - - if (m->dvsize != 0) { /* check dv chunk */ - do_check_any_chunk(m, m->dv); - assert(m->dvsize == chunksize(m->dv)); - assert(m->dvsize >= MIN_CHUNK_SIZE); - assert(bin_find(m, m->dv) == 0); - } - - if (m->top != 0) { /* check top chunk */ - do_check_top_chunk(m, m->top); - assert(m->topsize == chunksize(m->top)); - assert(m->topsize > 0); - assert(bin_find(m, m->top) == 0); - } - - total = traverse_and_check(m); - assert(total <= m->footprint); - assert(m->footprint <= m->max_footprint); -} -#endif /* DEBUG */ - -/* ----------------------------- statistics ------------------------------ */ - -#if !NO_MALLINFO -static struct mallinfo internal_mallinfo(mstate m) { - struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - if (!PREACTION(m)) { - check_malloc_state(m); - if (is_initialized(m)) { - size_t nfree = SIZE_T_ONE; /* top always free */ - size_t mfree = m->topsize + TOP_FOOT_SIZE; - size_t sum = mfree; - msegmentptr s = &m->seg; - while (s != 0) { - mchunkptr q = align_as_chunk(s->base); - while (segment_holds(s, q) && - q != m->top && q->head != FENCEPOST_HEAD) { - size_t sz = chunksize(q); - sum += sz; - if (!cinuse(q)) { - mfree += sz; - ++nfree; - } - q = next_chunk(q); - } - s = s->next; - } - - nm.arena = sum; - nm.ordblks = nfree; - nm.hblkhd = m->footprint - sum; - nm.usmblks = m->max_footprint; - nm.uordblks = m->footprint - mfree; - nm.fordblks = mfree; - nm.keepcost = m->topsize; - } - - POSTACTION(m); - } - return nm; -} -#endif /* !NO_MALLINFO */ - -static void internal_malloc_stats(mstate m) { - if (!PREACTION(m)) { - size_t maxfp = 0; - size_t fp = 0; - size_t used = 0; - check_malloc_state(m); - if (is_initialized(m)) { - msegmentptr s = &m->seg; - maxfp = m->max_footprint; - fp = m->footprint; - used = fp - (m->topsize + TOP_FOOT_SIZE); - - while (s != 0) { - mchunkptr q = align_as_chunk(s->base); - while (segment_holds(s, q) && - q != m->top && q->head != FENCEPOST_HEAD) { - if (!cinuse(q)) - used -= chunksize(q); - q = next_chunk(q); - } - s = s->next; - } - } - - fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp)); - fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp)); - fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used)); - - POSTACTION(m); - } -} - -/* ----------------------- Operations on smallbins ----------------------- */ - -/* - Various forms of linking and unlinking are defined as macros. Even - the ones for trees, which are very long but have very short typical - paths. This is ugly but reduces reliance on inlining support of - compilers. -*/ - -/* Link a free chunk into a smallbin */ -#define insert_small_chunk(M, P, S) {\ - bindex_t I = small_index(S);\ - mchunkptr B = smallbin_at(M, I);\ - mchunkptr F = B;\ - assert(S >= MIN_CHUNK_SIZE);\ - if (!smallmap_is_marked(M, I))\ - mark_smallmap(M, I);\ - else if (RTCHECK(ok_address(M, B->fd)))\ - F = B->fd;\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - B->fd = P;\ - F->bk = P;\ - P->fd = F;\ - P->bk = B;\ -} - -/* Unlink a chunk from a smallbin */ -#define unlink_small_chunk(M, P, S) {\ - mchunkptr F = P->fd;\ - mchunkptr B = P->bk;\ - bindex_t I = small_index(S);\ - assert(P != B);\ - assert(P != F);\ - assert(chunksize(P) == small_index2size(I));\ - if (F == B)\ - clear_smallmap(M, I);\ - else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\ - (B == smallbin_at(M,I) || ok_address(M, B)))) {\ - F->bk = B;\ - B->fd = F;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ -} - -/* Unlink the first chunk from a smallbin */ -#define unlink_first_small_chunk(M, B, P, I) {\ - mchunkptr F = P->fd;\ - assert(P != B);\ - assert(P != F);\ - assert(chunksize(P) == small_index2size(I));\ - if (B == F)\ - clear_smallmap(M, I);\ - else if (RTCHECK(ok_address(M, F))) {\ - B->fd = F;\ - F->bk = B;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ -} - -/* Replace dv node, binning the old one */ -/* Used only when dvsize known to be small */ -#define replace_dv(M, P, S) {\ - size_t DVS = M->dvsize;\ - if (DVS != 0) {\ - mchunkptr DV = M->dv;\ - assert(is_small(DVS));\ - insert_small_chunk(M, DV, DVS);\ - }\ - M->dvsize = S;\ - M->dv = P;\ -} - -/* ------------------------- Operations on trees ------------------------- */ - -/* Insert chunk into tree */ -#define insert_large_chunk(M, X, S) {\ - tbinptr* H;\ - bindex_t I;\ - compute_tree_index(S, I);\ - H = treebin_at(M, I);\ - X->index = I;\ - X->child[0] = X->child[1] = 0;\ - if (!treemap_is_marked(M, I)) {\ - mark_treemap(M, I);\ - *H = X;\ - X->parent = (tchunkptr)H;\ - X->fd = X->bk = X;\ - }\ - else {\ - tchunkptr T = *H;\ - size_t K = S << leftshift_for_tree_index(I);\ - for (;;) {\ - if (chunksize(T) != S) {\ - tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ - K <<= 1;\ - if (*C != 0)\ - T = *C;\ - else if (RTCHECK(ok_address(M, C))) {\ - *C = X;\ - X->parent = T;\ - X->fd = X->bk = X;\ - break;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - break;\ - }\ - }\ - else {\ - tchunkptr F = T->fd;\ - if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\ - T->fd = F->bk = X;\ - X->fd = F;\ - X->bk = T;\ - X->parent = 0;\ - break;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - break;\ - }\ - }\ - }\ - }\ -} - -/* - Unlink steps: - - 1. If x is a chained node, unlink it from its same-sized fd/bk links - and choose its bk node as its replacement. - 2. If x was the last node of its size, but not a leaf node, it must - be replaced with a leaf node (not merely one with an open left or - right), to make sure that lefts and rights of descendents - correspond properly to bit masks. We use the rightmost descendent - of x. We could use any other leaf, but this is easy to locate and - tends to counteract removal of leftmosts elsewhere, and so keeps - paths shorter than minimally guaranteed. This doesn't loop much - because on average a node in a tree is near the bottom. - 3. If x is the base of a chain (i.e., has parent links) relink - x's parent and children to x's replacement (or null if none). -*/ - -#define unlink_large_chunk(M, X) {\ - tchunkptr XP = X->parent;\ - tchunkptr R;\ - if (X->bk != X) {\ - tchunkptr F = X->fd;\ - R = X->bk;\ - if (RTCHECK(ok_address(M, F))) {\ - F->bk = R;\ - R->fd = F;\ - }\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ - else {\ - tchunkptr* RP;\ - if (((R = *(RP = &(X->child[1]))) != 0) ||\ - ((R = *(RP = &(X->child[0]))) != 0)) {\ - tchunkptr* CP;\ - while ((*(CP = &(R->child[1])) != 0) ||\ - (*(CP = &(R->child[0])) != 0)) {\ - R = *(RP = CP);\ - }\ - if (RTCHECK(ok_address(M, RP)))\ - *RP = 0;\ - else {\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ - }\ - if (XP != 0) {\ - tbinptr* H = treebin_at(M, X->index);\ - if (X == *H) {\ - if ((*H = R) == 0) \ - clear_treemap(M, X->index);\ - }\ - else if (RTCHECK(ok_address(M, XP))) {\ - if (XP->child[0] == X) \ - XP->child[0] = R;\ - else \ - XP->child[1] = R;\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - if (R != 0) {\ - if (RTCHECK(ok_address(M, R))) {\ - tchunkptr C0, C1;\ - R->parent = XP;\ - if ((C0 = X->child[0]) != 0) {\ - if (RTCHECK(ok_address(M, C0))) {\ - R->child[0] = C0;\ - C0->parent = R;\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - if ((C1 = X->child[1]) != 0) {\ - if (RTCHECK(ok_address(M, C1))) {\ - R->child[1] = C1;\ - C1->parent = R;\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ - else\ - CORRUPTION_ERROR_ACTION(M);\ - }\ - }\ -} - -/* Relays to large vs small bin operations */ - -#define insert_chunk(M, P, S)\ - if (is_small(S)) insert_small_chunk(M, P, S)\ - else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } - -#define unlink_chunk(M, P, S)\ - if (is_small(S)) unlink_small_chunk(M, P, S)\ - else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } - - -/* Relays to internal calls to malloc/free from realloc, memalign etc */ - -#if ONLY_MSPACES -#define internal_malloc(m, b) mspace_malloc(m, b) -#define internal_free(m, mem) mspace_free(m,mem); -#else /* ONLY_MSPACES */ -#if MSPACES -#define internal_malloc(m, b)\ - (m == gm)? dlmalloc(b) : mspace_malloc(m, b) -#define internal_free(m, mem)\ - if (m == gm) dlfree(mem); else mspace_free(m,mem); -#else /* MSPACES */ -#define internal_malloc(m, b) dlmalloc(b) -#define internal_free(m, mem) dlfree(mem) -#endif /* MSPACES */ -#endif /* ONLY_MSPACES */ - -/* ----------------------- Direct-mmapping chunks ----------------------- */ - -/* - Directly mmapped chunks are set up with an offset to the start of - the mmapped region stored in the prev_foot field of the chunk. This - allows reconstruction of the required argument to MUNMAP when freed, - and also allows adjustment of the returned chunk to meet alignment - requirements (especially in memalign). There is also enough space - allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain - the PINUSE bit so frees can be checked. -*/ - -/* Malloc using mmap */ -static void* mmap_alloc(mstate m, size_t nb) { - size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); - if (mmsize > nb) { /* Check for wrap around 0 */ - char* mm = (char*)(DIRECT_MMAP(mmsize)); - if (mm != CMFAIL) { - size_t offset = align_offset(chunk2mem(mm)); - size_t psize = mmsize - offset - MMAP_FOOT_PAD; - mchunkptr p = (mchunkptr)(mm + offset); - p->prev_foot = offset | IS_MMAPPED_BIT; - (p)->head = (psize|CINUSE_BIT); - mark_inuse_foot(m, p, psize); - chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; - chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; - - if (mm < m->least_addr) - m->least_addr = mm; - if ((m->footprint += mmsize) > m->max_footprint) - m->max_footprint = m->footprint; - assert(is_aligned(chunk2mem(p))); - check_mmapped_chunk(m, p); - return chunk2mem(p); - } - } - return 0; -} - -/* Realloc using mmap */ -static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) { - size_t oldsize = chunksize(oldp); - if (is_small(nb)) /* Can't shrink mmap regions below small size */ - return 0; - /* Keep old chunk if big enough but not too big */ - if (oldsize >= nb + SIZE_T_SIZE && - (oldsize - nb) <= (mparams.granularity << 1)) - return oldp; - else { - size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT; - size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD; - size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES + - CHUNK_ALIGN_MASK); - char* cp = (char*)CALL_MREMAP((char*)oldp - offset, - oldmmsize, newmmsize, 1); - if (cp != CMFAIL) { - mchunkptr newp = (mchunkptr)(cp + offset); - size_t psize = newmmsize - offset - MMAP_FOOT_PAD; - newp->head = (psize|CINUSE_BIT); - mark_inuse_foot(m, newp, psize); - chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; - chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; - - if (cp < m->least_addr) - m->least_addr = cp; - if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint) - m->max_footprint = m->footprint; - check_mmapped_chunk(m, newp); - return newp; - } - } - return 0; -} - -/* -------------------------- mspace management -------------------------- */ - -/* Initialize top chunk and its size */ -static void init_top(mstate m, mchunkptr p, size_t psize) { - /* Ensure alignment */ - size_t offset = align_offset(chunk2mem(p)); - p = (mchunkptr)((char*)p + offset); - psize -= offset; - - m->top = p; - m->topsize = psize; - p->head = psize | PINUSE_BIT; - /* set size of fake trailing chunk holding overhead space only once */ - chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; - m->trim_check = mparams.trim_threshold; /* reset on each update */ -} - -/* Initialize bins for a new mstate that is otherwise zeroed out */ -static void init_bins(mstate m) { - /* Establish circular links for smallbins */ - bindex_t i; - for (i = 0; i < NSMALLBINS; ++i) { - sbinptr bin = smallbin_at(m,i); - bin->fd = bin->bk = bin; - } -} - -#if PROCEED_ON_ERROR - -/* default corruption action */ -static void reset_on_error(mstate m) { - int i; - ++malloc_corruption_error_count; - /* Reinitialize fields to forget about all memory */ - m->smallbins = m->treebins = 0; - m->dvsize = m->topsize = 0; - m->seg.base = 0; - m->seg.size = 0; - m->seg.next = 0; - m->top = m->dv = 0; - for (i = 0; i < NTREEBINS; ++i) - *treebin_at(m, i) = 0; - init_bins(m); -} -#endif /* PROCEED_ON_ERROR */ - -/* Allocate chunk and prepend remainder with chunk in successor base. */ -static void* prepend_alloc(mstate m, char* newbase, char* oldbase, - size_t nb) { - mchunkptr p = align_as_chunk(newbase); - mchunkptr oldfirst = align_as_chunk(oldbase); - size_t psize = (char*)oldfirst - (char*)p; - mchunkptr q = chunk_plus_offset(p, nb); - size_t qsize = psize - nb; - set_size_and_pinuse_of_inuse_chunk(m, p, nb); - - assert((char*)oldfirst > (char*)q); - assert(pinuse(oldfirst)); - assert(qsize >= MIN_CHUNK_SIZE); - - /* consolidate remainder with first chunk of old base */ - if (oldfirst == m->top) { - size_t tsize = m->topsize += qsize; - m->top = q; - q->head = tsize | PINUSE_BIT; - check_top_chunk(m, q); - } - else if (oldfirst == m->dv) { - size_t dsize = m->dvsize += qsize; - m->dv = q; - set_size_and_pinuse_of_free_chunk(q, dsize); - } - else { - if (!cinuse(oldfirst)) { - size_t nsize = chunksize(oldfirst); - unlink_chunk(m, oldfirst, nsize); - oldfirst = chunk_plus_offset(oldfirst, nsize); - qsize += nsize; - } - set_free_with_pinuse(q, qsize, oldfirst); - insert_chunk(m, q, qsize); - check_free_chunk(m, q); - } - - check_malloced_chunk(m, chunk2mem(p), nb); - return chunk2mem(p); -} - - -/* Add a segment to hold a new noncontiguous region */ -static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) { - /* Determine locations and sizes of segment, fenceposts, old top */ - char* old_top = (char*)m->top; - msegmentptr oldsp = segment_holding(m, old_top); - char* old_end = oldsp->base + oldsp->size; - size_t ssize = pad_request(sizeof(struct malloc_segment)); - char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); - size_t offset = align_offset(chunk2mem(rawsp)); - char* asp = rawsp + offset; - char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; - mchunkptr sp = (mchunkptr)csp; - msegmentptr ss = (msegmentptr)(chunk2mem(sp)); - mchunkptr tnext = chunk_plus_offset(sp, ssize); - mchunkptr p = tnext; - int nfences = 0; - - /* reset top to new space */ - init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); - - /* Set up segment record */ - assert(is_aligned(ss)); - set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); - *ss = m->seg; /* Push current record */ - m->seg.base = tbase; - m->seg.size = tsize; - m->seg.sflags = mmapped; - m->seg.next = ss; - - /* Insert trailing fenceposts */ - for (;;) { - mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); - p->head = FENCEPOST_HEAD; - ++nfences; - if ((char*)(&(nextp->head)) < old_end) - p = nextp; - else - break; - } - assert(nfences >= 2); - - /* Insert the rest of old top into a bin as an ordinary free chunk */ - if (csp != old_top) { - mchunkptr q = (mchunkptr)old_top; - size_t psize = csp - old_top; - mchunkptr tn = chunk_plus_offset(q, psize); - set_free_with_pinuse(q, psize, tn); - insert_chunk(m, q, psize); - } - - check_top_chunk(m, m->top); -} - -/* -------------------------- System allocation -------------------------- */ - -/* Get memory from system using MORECORE or MMAP */ -static void* sys_alloc(mstate m, size_t nb) { - char* tbase = CMFAIL; - size_t tsize = 0; - flag_t mmap_flag = 0; - - init_mparams(); - - /* Directly map large chunks */ - if (use_mmap(m) && nb >= mparams.mmap_threshold) { - void* mem = mmap_alloc(m, nb); - if (mem != 0) - return mem; - } - - /* - Try getting memory in any of three ways (in most-preferred to - least-preferred order): - 1. A call to MORECORE that can normally contiguously extend memory. - (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or - or main space is mmapped or a previous contiguous call failed) - 2. A call to MMAP new space (disabled if not HAVE_MMAP). - Note that under the default settings, if MORECORE is unable to - fulfill a request, and HAVE_MMAP is true, then mmap is - used as a noncontiguous system allocator. This is a useful backup - strategy for systems with holes in address spaces -- in this case - sbrk cannot contiguously expand the heap, but mmap may be able to - find space. - 3. A call to MORECORE that cannot usually contiguously extend memory. - (disabled if not HAVE_MORECORE) - */ - - if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) { - char* br = CMFAIL; - msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top); - size_t asize = 0; - ACQUIRE_MORECORE_LOCK(); - - if (ss == 0) { /* First time through or recovery */ - char* base = (char*)CALL_MORECORE(0); - if (base != CMFAIL) { - asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); - /* Adjust to end on a page boundary */ - if (!is_page_aligned(base)) - asize += (page_align((size_t)base) - (size_t)base); - /* Can't call MORECORE if size is negative when treated as signed */ - if (asize < HALF_MAX_SIZE_T && - (br = (char*)(CALL_MORECORE(asize))) == base) { - tbase = base; - tsize = asize; - } - } - } - else { - /* Subtract out existing available top space from MORECORE request. */ - asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE); - /* Use mem here only if it did continuously extend old space */ - if (asize < HALF_MAX_SIZE_T && - (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) { - tbase = br; - tsize = asize; - } - } - - if (tbase == CMFAIL) { /* Cope with partial failure */ - if (br != CMFAIL) { /* Try to use/extend the space we did get */ - if (asize < HALF_MAX_SIZE_T && - asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) { - size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize); - if (esize < HALF_MAX_SIZE_T) { - char* end = (char*)CALL_MORECORE(esize); - if (end != CMFAIL) - asize += esize; - else { /* Can't use; try to release */ - CALL_MORECORE(-asize); - br = CMFAIL; - } - } - } - } - if (br != CMFAIL) { /* Use the space we did get */ - tbase = br; - tsize = asize; - } - else - disable_contiguous(m); /* Don't try contiguous path in the future */ - } - - RELEASE_MORECORE_LOCK(); - } - - if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ - size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE; - size_t rsize = granularity_align(req); - if (rsize > nb) { /* Fail if wraps around zero */ - char* mp = (char*)(CALL_MMAP(rsize)); - if (mp != CMFAIL) { - tbase = mp; - tsize = rsize; - mmap_flag = IS_MMAPPED_BIT; - } - } - } - - if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ - size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); - if (asize < HALF_MAX_SIZE_T) { - char* br = CMFAIL; - char* end = CMFAIL; - ACQUIRE_MORECORE_LOCK(); - br = (char*)(CALL_MORECORE(asize)); - end = (char*)(CALL_MORECORE(0)); - RELEASE_MORECORE_LOCK(); - if (br != CMFAIL && end != CMFAIL && br < end) { - size_t ssize = end - br; - if (ssize > nb + TOP_FOOT_SIZE) { - tbase = br; - tsize = ssize; - } - } - } - } - - if (tbase != CMFAIL) { - - if ((m->footprint += tsize) > m->max_footprint) - m->max_footprint = m->footprint; - - if (!is_initialized(m)) { /* first-time initialization */ - m->seg.base = m->least_addr = tbase; - m->seg.size = tsize; - m->seg.sflags = mmap_flag; - m->magic = mparams.magic; - init_bins(m); - if (is_global(m)) - init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); - else { - /* Offset top by embedded malloc_state */ - mchunkptr mn = next_chunk(mem2chunk(m)); - init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); - } - } - - else { - /* Try to merge with an existing segment */ - msegmentptr sp = &m->seg; - while (sp != 0 && tbase != sp->base + sp->size) - sp = sp->next; - if (sp != 0 && - !is_extern_segment(sp) && - (sp->sflags & IS_MMAPPED_BIT) == mmap_flag && - segment_holds(sp, m->top)) { /* append */ - sp->size += tsize; - init_top(m, m->top, m->topsize + tsize); - } - else { - if (tbase < m->least_addr) - m->least_addr = tbase; - sp = &m->seg; - while (sp != 0 && sp->base != tbase + tsize) - sp = sp->next; - if (sp != 0 && - !is_extern_segment(sp) && - (sp->sflags & IS_MMAPPED_BIT) == mmap_flag) { - char* oldbase = sp->base; - sp->base = tbase; - sp->size += tsize; - return prepend_alloc(m, tbase, oldbase, nb); - } - else - add_segment(m, tbase, tsize, mmap_flag); - } - } - - if (nb < m->topsize) { /* Allocate from new or extended top space */ - size_t rsize = m->topsize -= nb; - mchunkptr p = m->top; - mchunkptr r = m->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(m, p, nb); - check_top_chunk(m, m->top); - check_malloced_chunk(m, chunk2mem(p), nb); - return chunk2mem(p); - } - } - - MALLOC_FAILURE_ACTION; - return 0; -} - -/* ----------------------- system deallocation -------------------------- */ - -/* Unmap and unlink any mmapped segments that don't contain used chunks */ -static size_t release_unused_segments(mstate m) { - size_t released = 0; - msegmentptr pred = &m->seg; - msegmentptr sp = pred->next; - while (sp != 0) { - char* base = sp->base; - size_t size = sp->size; - msegmentptr next = sp->next; - if (is_mmapped_segment(sp) && !is_extern_segment(sp)) { - mchunkptr p = align_as_chunk(base); - size_t psize = chunksize(p); - /* Can unmap if first chunk holds entire segment and not pinned */ - if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) { - tchunkptr tp = (tchunkptr)p; - assert(segment_holds(sp, (char*)sp)); - if (p == m->dv) { - m->dv = 0; - m->dvsize = 0; - } - else { - unlink_large_chunk(m, tp); - } - if (CALL_MUNMAP(base, size) == 0) { - released += size; - m->footprint -= size; - /* unlink obsoleted record */ - sp = pred; - sp->next = next; - } - else { /* back out if cannot unmap */ - insert_large_chunk(m, tp, psize); - } - } - } - pred = sp; - sp = next; - } - return released; -} - -static int sys_trim(mstate m, size_t pad) { - size_t released = 0; - if (pad < MAX_REQUEST && is_initialized(m)) { - pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ - - if (m->topsize > pad) { - /* Shrink top space in granularity-size units, keeping at least one */ - size_t unit = mparams.granularity; - size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - - SIZE_T_ONE) * unit; - msegmentptr sp = segment_holding(m, (char*)m->top); - - if (!is_extern_segment(sp)) { - if (is_mmapped_segment(sp)) { - if (HAVE_MMAP && - sp->size >= extra && - !has_segment_link(m, sp)) { /* can't shrink if pinned */ - size_t newsize = sp->size - extra; - /* Prefer mremap, fall back to munmap */ - if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) || - (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { - released = extra; - } - } - } - else if (HAVE_MORECORE) { - if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */ - extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit; - ACQUIRE_MORECORE_LOCK(); - { - /* Make sure end of memory is where we last set it. */ - char* old_br = (char*)(CALL_MORECORE(0)); - if (old_br == sp->base + sp->size) { - char* rel_br = (char*)(CALL_MORECORE(-extra)); - char* new_br = (char*)(CALL_MORECORE(0)); - if (rel_br != CMFAIL && new_br < old_br) - released = old_br - new_br; - } - } - RELEASE_MORECORE_LOCK(); - } - } - - if (released != 0) { - sp->size -= released; - m->footprint -= released; - init_top(m, m->top, m->topsize - released); - check_top_chunk(m, m->top); - } - } - - /* Unmap any unused mmapped segments */ - if (HAVE_MMAP) - released += release_unused_segments(m); - - /* On failure, disable autotrim to avoid repeated failed future calls */ - if (released == 0) - m->trim_check = MAX_SIZE_T; - } - - return (released != 0)? 1 : 0; -} - -/* ---------------------------- malloc support --------------------------- */ - -/* allocate a large request from the best fitting chunk in a treebin */ -static void* tmalloc_large(mstate m, size_t nb) { - tchunkptr v = 0; - size_t rsize = -nb; /* Unsigned negation */ - tchunkptr t; - bindex_t idx; - compute_tree_index(nb, idx); - - if ((t = *treebin_at(m, idx)) != 0) { - /* Traverse tree for this bin looking for node with size == nb */ - size_t sizebits = nb << leftshift_for_tree_index(idx); - tchunkptr rst = 0; /* The deepest untaken right subtree */ - for (;;) { - tchunkptr rt; - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - v = t; - if ((rsize = trem) == 0) - break; - } - rt = t->child[1]; - t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; - if (rt != 0 && rt != t) - rst = rt; - if (t == 0) { - t = rst; /* set t to least subtree holding sizes > nb */ - break; - } - sizebits <<= 1; - } - } - - if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ - binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; - if (leftbits != 0) { - bindex_t i; - binmap_t leastbit = least_bit(leftbits); - compute_bit2idx(leastbit, i); - t = *treebin_at(m, i); - } - } - - while (t != 0) { /* find smallest of tree or subtree */ - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - rsize = trem; - v = t; - } - t = leftmost_child(t); - } - - /* If dv is a better fit, return 0 so malloc will use it */ - if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { - if (RTCHECK(ok_address(m, v))) { /* split */ - mchunkptr r = chunk_plus_offset(v, nb); - assert(chunksize(v) == rsize + nb); - if (RTCHECK(ok_next(v, r))) { - unlink_large_chunk(m, v); - if (rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(m, v, (rsize + nb)); - else { - set_size_and_pinuse_of_inuse_chunk(m, v, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - insert_chunk(m, r, rsize); - } - return chunk2mem(v); - } - } - CORRUPTION_ERROR_ACTION(m); - } - return 0; -} - -/* allocate a small request from the best fitting chunk in a treebin */ -static void* tmalloc_small(mstate m, size_t nb) { - tchunkptr t, v; - size_t rsize; - bindex_t i; - binmap_t leastbit = least_bit(m->treemap); - compute_bit2idx(leastbit, i); - - v = t = *treebin_at(m, i); - rsize = chunksize(t) - nb; - - while ((t = leftmost_child(t)) != 0) { - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - rsize = trem; - v = t; - } - } - - if (RTCHECK(ok_address(m, v))) { - mchunkptr r = chunk_plus_offset(v, nb); - assert(chunksize(v) == rsize + nb); - if (RTCHECK(ok_next(v, r))) { - unlink_large_chunk(m, v); - if (rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(m, v, (rsize + nb)); - else { - set_size_and_pinuse_of_inuse_chunk(m, v, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(m, r, rsize); - } - return chunk2mem(v); - } - } - - CORRUPTION_ERROR_ACTION(m); - return 0; -} - -/* --------------------------- realloc support --------------------------- */ - -static void* internal_realloc(mstate m, void* oldmem, size_t bytes) { - if (bytes >= MAX_REQUEST) { - MALLOC_FAILURE_ACTION; - return 0; - } - if (!PREACTION(m)) { - mchunkptr oldp = mem2chunk(oldmem); - size_t oldsize = chunksize(oldp); - mchunkptr next = chunk_plus_offset(oldp, oldsize); - mchunkptr newp = 0; - void* extra = 0; - - /* Try to either shrink or extend into top. Else malloc-copy-free */ - - if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) && - ok_next(oldp, next) && ok_pinuse(next))) { - size_t nb = request2size(bytes); - if (is_mmapped(oldp)) - newp = mmap_resize(m, oldp, nb); - else if (oldsize >= nb) { /* already big enough */ - size_t rsize = oldsize - nb; - newp = oldp; - if (rsize >= MIN_CHUNK_SIZE) { - mchunkptr remainder = chunk_plus_offset(newp, nb); - set_inuse(m, newp, nb); - set_inuse(m, remainder, rsize); - extra = chunk2mem(remainder); - } - } - else if (next == m->top && oldsize + m->topsize > nb) { - /* Expand into top */ - size_t newsize = oldsize + m->topsize; - size_t newtopsize = newsize - nb; - mchunkptr newtop = chunk_plus_offset(oldp, nb); - set_inuse(m, oldp, nb); - newtop->head = newtopsize |PINUSE_BIT; - m->top = newtop; - m->topsize = newtopsize; - newp = oldp; - } - } - else { - USAGE_ERROR_ACTION(m, oldmem); - POSTACTION(m); - return 0; - } - - POSTACTION(m); - - if (newp != 0) { - if (extra != 0) { - internal_free(m, extra); - } - check_inuse_chunk(m, newp); - return chunk2mem(newp); - } - else { - void* newmem = internal_malloc(m, bytes); - if (newmem != 0) { - size_t oc = oldsize - overhead_for(oldp); - memcpy(newmem, oldmem, (oc < bytes)? oc : bytes); - internal_free(m, oldmem); - } - return newmem; - } - } - return 0; -} - -/* --------------------------- memalign support -------------------------- */ - -static void* internal_memalign(mstate m, size_t alignment, size_t bytes) { - if (alignment <= MALLOC_ALIGNMENT) /* Can just use malloc */ - return internal_malloc(m, bytes); - if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */ - alignment = MIN_CHUNK_SIZE; - if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */ - size_t a = MALLOC_ALIGNMENT << 1; - while (a < alignment) a <<= 1; - alignment = a; - } - - if (bytes >= MAX_REQUEST - alignment) { - if (m != 0) { /* Test isn't needed but avoids compiler warning */ - MALLOC_FAILURE_ACTION; - } - } - else { - size_t nb = request2size(bytes); - size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD; - char* mem = (char*)internal_malloc(m, req); - if (mem != 0) { - void* leader = 0; - void* trailer = 0; - mchunkptr p = mem2chunk(mem); - - if (PREACTION(m)) return 0; - if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */ - /* - Find an aligned spot inside chunk. Since we need to give - back leading space in a chunk of at least MIN_CHUNK_SIZE, if - the first calculation places us at a spot with less than - MIN_CHUNK_SIZE leader, we can move to the next aligned spot. - We've allocated enough total room so that this is always - possible. - */ - char* br = (char*)mem2chunk((size_t)(((size_t)(mem + - alignment - - SIZE_T_ONE)) & - -alignment)); - char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)? - br : br+alignment; - mchunkptr newp = (mchunkptr)pos; - size_t leadsize = pos - (char*)(p); - size_t newsize = chunksize(p) - leadsize; - - if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */ - newp->prev_foot = p->prev_foot + leadsize; - newp->head = (newsize|CINUSE_BIT); - } - else { /* Otherwise, give back leader, use the rest */ - set_inuse(m, newp, newsize); - set_inuse(m, p, leadsize); - leader = chunk2mem(p); - } - p = newp; - } - - /* Give back spare room at the end */ - if (!is_mmapped(p)) { - size_t size = chunksize(p); - if (size > nb + MIN_CHUNK_SIZE) { - size_t remainder_size = size - nb; - mchunkptr remainder = chunk_plus_offset(p, nb); - set_inuse(m, p, nb); - set_inuse(m, remainder, remainder_size); - trailer = chunk2mem(remainder); - } - } - - assert (chunksize(p) >= nb); - assert((((size_t)(chunk2mem(p))) % alignment) == 0); - check_inuse_chunk(m, p); - POSTACTION(m); - if (leader != 0) { - internal_free(m, leader); - } - if (trailer != 0) { - internal_free(m, trailer); - } - return chunk2mem(p); - } - } - return 0; -} - -/* ------------------------ comalloc/coalloc support --------------------- */ - -static void** ialloc(mstate m, - size_t n_elements, - size_t* sizes, - int opts, - void* chunks[]) { - /* - This provides common support for independent_X routines, handling - all of the combinations that can result. - - The opts arg has: - bit 0 set if all elements are same size (using sizes[0]) - bit 1 set if elements should be zeroed - */ - - size_t element_size; /* chunksize of each element, if all same */ - size_t contents_size; /* total size of elements */ - size_t array_size; /* request size of pointer array */ - void* mem; /* malloced aggregate space */ - mchunkptr p; /* corresponding chunk */ - size_t remainder_size; /* remaining bytes while splitting */ - void** marray; /* either "chunks" or malloced ptr array */ - mchunkptr array_chunk; /* chunk for malloced ptr array */ - flag_t was_enabled; /* to disable mmap */ - size_t size; - size_t i; - - /* compute array length, if needed */ - if (chunks != 0) { - if (n_elements == 0) - return chunks; /* nothing to do */ - marray = chunks; - array_size = 0; - } - else { - /* if empty req, must still return chunk representing empty array */ - if (n_elements == 0) - return (void**)internal_malloc(m, 0); - marray = 0; - array_size = request2size(n_elements * (sizeof(void*))); - } - - /* compute total element size */ - if (opts & 0x1) { /* all-same-size */ - element_size = request2size(*sizes); - contents_size = n_elements * element_size; - } - else { /* add up all the sizes */ - element_size = 0; - contents_size = 0; - for (i = 0; i != n_elements; ++i) - contents_size += request2size(sizes[i]); - } - - size = contents_size + array_size; - - /* - Allocate the aggregate chunk. First disable direct-mmapping so - malloc won't use it, since we would not be able to later - free/realloc space internal to a segregated mmap region. - */ - was_enabled = use_mmap(m); - disable_mmap(m); - mem = internal_malloc(m, size - CHUNK_OVERHEAD); - if (was_enabled) - enable_mmap(m); - if (mem == 0) - return 0; - - if (PREACTION(m)) return 0; - p = mem2chunk(mem); - remainder_size = chunksize(p); - - assert(!is_mmapped(p)); - - if (opts & 0x2) { /* optionally clear the elements */ - memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size); - } - - /* If not provided, allocate the pointer array as final part of chunk */ - if (marray == 0) { - size_t array_chunk_size; - array_chunk = chunk_plus_offset(p, contents_size); - array_chunk_size = remainder_size - contents_size; - marray = (void**) (chunk2mem(array_chunk)); - set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size); - remainder_size = contents_size; - } - - /* split out elements */ - for (i = 0; ; ++i) { - marray[i] = chunk2mem(p); - if (i != n_elements-1) { - if (element_size != 0) - size = element_size; - else - size = request2size(sizes[i]); - remainder_size -= size; - set_size_and_pinuse_of_inuse_chunk(m, p, size); - p = chunk_plus_offset(p, size); - } - else { /* the final element absorbs any overallocation slop */ - set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size); - break; - } - } - -#if DEBUG - if (marray != chunks) { - /* final element must have exactly exhausted chunk */ - if (element_size != 0) { - assert(remainder_size == element_size); - } - else { - assert(remainder_size == request2size(sizes[i])); - } - check_inuse_chunk(m, mem2chunk(marray)); - } - for (i = 0; i != n_elements; ++i) - check_inuse_chunk(m, mem2chunk(marray[i])); - -#endif /* DEBUG */ - - POSTACTION(m); - return marray; -} - - -/* -------------------------- public routines ---------------------------- */ - -#if !ONLY_MSPACES - -void* dlmalloc(size_t bytes) { - /* - Basic algorithm: - If a small request (< 256 bytes minus per-chunk overhead): - 1. If one exists, use a remainderless chunk in associated smallbin. - (Remainderless means that there are too few excess bytes to - represent as a chunk.) - 2. If it is big enough, use the dv chunk, which is normally the - chunk adjacent to the one used for the most recent small request. - 3. If one exists, split the smallest available chunk in a bin, - saving remainder in dv. - 4. If it is big enough, use the top chunk. - 5. If available, get memory from system and use it - Otherwise, for a large request: - 1. Find the smallest available binned chunk that fits, and use it - if it is better fitting than dv chunk, splitting if necessary. - 2. If better fitting than any binned chunk, use the dv chunk. - 3. If it is big enough, use the top chunk. - 4. If request size >= mmap threshold, try to directly mmap this chunk. - 5. If available, get memory from system and use it - - The ugly goto's here ensure that postaction occurs along all paths. - */ - - if (!PREACTION(gm)) { - void* mem; - size_t nb; - if (bytes <= MAX_SMALL_REQUEST) { - bindex_t idx; - binmap_t smallbits; - nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); - idx = small_index(nb); - smallbits = gm->smallmap >> idx; - - if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ - mchunkptr b, p; - idx += ~smallbits & 1; /* Uses next bin if idx empty */ - b = smallbin_at(gm, idx); - p = b->fd; - assert(chunksize(p) == small_index2size(idx)); - unlink_first_small_chunk(gm, b, p, idx); - set_inuse_and_pinuse(gm, p, small_index2size(idx)); - mem = chunk2mem(p); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - else if (nb > gm->dvsize) { - if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ - mchunkptr b, p, r; - size_t rsize; - bindex_t i; - binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); - binmap_t leastbit = least_bit(leftbits); - compute_bit2idx(leastbit, i); - b = smallbin_at(gm, i); - p = b->fd; - assert(chunksize(p) == small_index2size(i)); - unlink_first_small_chunk(gm, b, p, i); - rsize = small_index2size(i) - nb; - /* Fit here cannot be remainderless if 4byte sizes */ - if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(gm, p, small_index2size(i)); - else { - set_size_and_pinuse_of_inuse_chunk(gm, p, nb); - r = chunk_plus_offset(p, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(gm, r, rsize); - } - mem = chunk2mem(p); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) { - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - } - } - else if (bytes >= MAX_REQUEST) - nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ - else { - nb = pad_request(bytes); - if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) { - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - } - - if (nb <= gm->dvsize) { - size_t rsize = gm->dvsize - nb; - mchunkptr p = gm->dv; - if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ - mchunkptr r = gm->dv = chunk_plus_offset(p, nb); - gm->dvsize = rsize; - set_size_and_pinuse_of_free_chunk(r, rsize); - set_size_and_pinuse_of_inuse_chunk(gm, p, nb); - } - else { /* exhaust dv */ - size_t dvs = gm->dvsize; - gm->dvsize = 0; - gm->dv = 0; - set_inuse_and_pinuse(gm, p, dvs); - } - mem = chunk2mem(p); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - else if (nb < gm->topsize) { /* Split top */ - size_t rsize = gm->topsize -= nb; - mchunkptr p = gm->top; - mchunkptr r = gm->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(gm, p, nb); - mem = chunk2mem(p); - check_top_chunk(gm, gm->top); - check_malloced_chunk(gm, mem, nb); - goto postaction; - } - - mem = sys_alloc(gm, nb); - - postaction: - POSTACTION(gm); - return mem; - } - - return 0; -} - -void dlfree(void* mem) { - /* - Consolidate freed chunks with preceeding or succeeding bordering - free chunks, if they exist, and then place in a bin. Intermixed - with special cases for top, dv, mmapped chunks, and usage errors. - */ - - if (mem != 0) { - mchunkptr p = mem2chunk(mem); -#if FOOTERS - mstate fm = get_mstate_for(p); - if (!ok_magic(fm)) { - USAGE_ERROR_ACTION(fm, p); - return; - } -#else /* FOOTERS */ -#define fm gm -#endif /* FOOTERS */ - if (!PREACTION(fm)) { - check_inuse_chunk(fm, p); - if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { - size_t psize = chunksize(p); - mchunkptr next = chunk_plus_offset(p, psize); - if (!pinuse(p)) { - size_t prevsize = p->prev_foot; - if ((prevsize & IS_MMAPPED_BIT) != 0) { - prevsize &= ~IS_MMAPPED_BIT; - psize += prevsize + MMAP_FOOT_PAD; - if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) - fm->footprint -= psize; - goto postaction; - } - else { - mchunkptr prev = chunk_minus_offset(p, prevsize); - psize += prevsize; - p = prev; - if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ - if (p != fm->dv) { - unlink_chunk(fm, p, prevsize); - } - else if ((next->head & INUSE_BITS) == INUSE_BITS) { - fm->dvsize = psize; - set_free_with_pinuse(p, psize, next); - goto postaction; - } - } - else - goto erroraction; - } - } - - if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { - if (!cinuse(next)) { /* consolidate forward */ - if (next == fm->top) { - size_t tsize = fm->topsize += psize; - fm->top = p; - p->head = tsize | PINUSE_BIT; - if (p == fm->dv) { - fm->dv = 0; - fm->dvsize = 0; - } - if (should_trim(fm, tsize)) - sys_trim(fm, 0); - goto postaction; - } - else if (next == fm->dv) { - size_t dsize = fm->dvsize += psize; - fm->dv = p; - set_size_and_pinuse_of_free_chunk(p, dsize); - goto postaction; - } - else { - size_t nsize = chunksize(next); - psize += nsize; - unlink_chunk(fm, next, nsize); - set_size_and_pinuse_of_free_chunk(p, psize); - if (p == fm->dv) { - fm->dvsize = psize; - goto postaction; - } - } - } - else - set_free_with_pinuse(p, psize, next); - insert_chunk(fm, p, psize); - check_free_chunk(fm, p); - goto postaction; - } - } - erroraction: - USAGE_ERROR_ACTION(fm, p); - postaction: - POSTACTION(fm); - } - } -#if !FOOTERS -#undef fm -#endif /* FOOTERS */ -} - -void* dlcalloc(size_t n_elements, size_t elem_size) { - void* mem; - size_t req = 0; - if (n_elements != 0) { - req = n_elements * elem_size; - if (((n_elements | elem_size) & ~(size_t)0xffff) && - (req / n_elements != elem_size)) - req = MAX_SIZE_T; /* force downstream failure on overflow */ - } - mem = dlmalloc(req); - if (mem != 0 && calloc_must_clear(mem2chunk(mem))) - memset(mem, 0, req); - return mem; -} - -void* dlrealloc(void* oldmem, size_t bytes) { - if (oldmem == 0) - return dlmalloc(bytes); -#ifdef REALLOC_ZERO_BYTES_FREES - if (bytes == 0) { - dlfree(oldmem); - return 0; - } -#endif /* REALLOC_ZERO_BYTES_FREES */ - else { -#if ! FOOTERS - mstate m = gm; -#else /* FOOTERS */ - mstate m = get_mstate_for(mem2chunk(oldmem)); - if (!ok_magic(m)) { - USAGE_ERROR_ACTION(m, oldmem); - return 0; - } -#endif /* FOOTERS */ - return internal_realloc(m, oldmem, bytes); - } -} - -void* dlmemalign(size_t alignment, size_t bytes) { - return internal_memalign(gm, alignment, bytes); -} - -void** dlindependent_calloc(size_t n_elements, size_t elem_size, - void* chunks[]) { - size_t sz = elem_size; /* serves as 1-element array */ - return ialloc(gm, n_elements, &sz, 3, chunks); -} - -void** dlindependent_comalloc(size_t n_elements, size_t sizes[], - void* chunks[]) { - return ialloc(gm, n_elements, sizes, 0, chunks); -} - -void* dlvalloc(size_t bytes) { - size_t pagesz; - init_mparams(); - pagesz = mparams.page_size; - return dlmemalign(pagesz, bytes); -} - -void* dlpvalloc(size_t bytes) { - size_t pagesz; - init_mparams(); - pagesz = mparams.page_size; - return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE)); -} - -int dlmalloc_trim(size_t pad) { - int result = 0; - if (!PREACTION(gm)) { - result = sys_trim(gm, pad); - POSTACTION(gm); - } - return result; -} - -size_t dlmalloc_footprint(void) { - return gm->footprint; -} - -size_t dlmalloc_max_footprint(void) { - return gm->max_footprint; -} - -#if !NO_MALLINFO -struct mallinfo dlmallinfo(void) { - return internal_mallinfo(gm); -} -#endif /* NO_MALLINFO */ - -void dlmalloc_stats() { - internal_malloc_stats(gm); -} - -size_t dlmalloc_usable_size(void* mem) { - if (mem != 0) { - mchunkptr p = mem2chunk(mem); - if (cinuse(p)) - return chunksize(p) - overhead_for(p); - } - return 0; -} - -int dlmallopt(int param_number, int value) { - return change_mparam(param_number, value); -} - -#endif /* !ONLY_MSPACES */ - -/* ----------------------------- user mspaces ---------------------------- */ - -#if MSPACES - -static mstate init_user_mstate(char* tbase, size_t tsize) { - size_t msize = pad_request(sizeof(struct malloc_state)); - mchunkptr mn; - mchunkptr msp = align_as_chunk(tbase); - mstate m = (mstate)(chunk2mem(msp)); - memset(m, 0, msize); - INITIAL_LOCK(&m->mutex); - msp->head = (msize|PINUSE_BIT|CINUSE_BIT); - m->seg.base = m->least_addr = tbase; - m->seg.size = m->footprint = m->max_footprint = tsize; - m->magic = mparams.magic; - m->mflags = mparams.default_mflags; - disable_contiguous(m); - init_bins(m); - mn = next_chunk(mem2chunk(m)); - init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE); - check_top_chunk(m, m->top); - return m; -} - -mspace create_mspace(size_t capacity, int locked) { - mstate m = 0; - size_t msize = pad_request(sizeof(struct malloc_state)); - init_mparams(); /* Ensure pagesize etc initialized */ - - if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { - size_t rs = ((capacity == 0)? mparams.granularity : - (capacity + TOP_FOOT_SIZE + msize)); - size_t tsize = granularity_align(rs); - char* tbase = (char*)(CALL_MMAP(tsize)); - if (tbase != CMFAIL) { - m = init_user_mstate(tbase, tsize); - m->seg.sflags = IS_MMAPPED_BIT; - set_lock(m, locked); - } - } - return (mspace)m; -} - -mspace create_mspace_with_base(void* base, size_t capacity, int locked) { - mstate m = 0; - size_t msize = pad_request(sizeof(struct malloc_state)); - init_mparams(); /* Ensure pagesize etc initialized */ - - if (capacity > msize + TOP_FOOT_SIZE && - capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { - m = init_user_mstate((char*)base, capacity); - m->seg.sflags = EXTERN_BIT; - set_lock(m, locked); - } - return (mspace)m; -} - -size_t destroy_mspace(mspace msp) { - size_t freed = 0; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - msegmentptr sp = &ms->seg; - while (sp != 0) { - char* base = sp->base; - size_t size = sp->size; - flag_t flag = sp->sflags; - sp = sp->next; - if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) && - CALL_MUNMAP(base, size) == 0) - freed += size; - } - } - else { - USAGE_ERROR_ACTION(ms,ms); - } - return freed; -} - -/* - mspace versions of routines are near-clones of the global - versions. This is not so nice but better than the alternatives. -*/ - - -void* mspace_malloc(mspace msp, size_t bytes) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - if (!PREACTION(ms)) { - void* mem; - size_t nb; - if (bytes <= MAX_SMALL_REQUEST) { - bindex_t idx; - binmap_t smallbits; - nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); - idx = small_index(nb); - smallbits = ms->smallmap >> idx; - - if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ - mchunkptr b, p; - idx += ~smallbits & 1; /* Uses next bin if idx empty */ - b = smallbin_at(ms, idx); - p = b->fd; - assert(chunksize(p) == small_index2size(idx)); - unlink_first_small_chunk(ms, b, p, idx); - set_inuse_and_pinuse(ms, p, small_index2size(idx)); - mem = chunk2mem(p); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - else if (nb > ms->dvsize) { - if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ - mchunkptr b, p, r; - size_t rsize; - bindex_t i; - binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); - binmap_t leastbit = least_bit(leftbits); - compute_bit2idx(leastbit, i); - b = smallbin_at(ms, i); - p = b->fd; - assert(chunksize(p) == small_index2size(i)); - unlink_first_small_chunk(ms, b, p, i); - rsize = small_index2size(i) - nb; - /* Fit here cannot be remainderless if 4byte sizes */ - if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) - set_inuse_and_pinuse(ms, p, small_index2size(i)); - else { - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - r = chunk_plus_offset(p, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(ms, r, rsize); - } - mem = chunk2mem(p); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - } - } - else if (bytes >= MAX_REQUEST) - nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ - else { - nb = pad_request(bytes); - if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - } - - if (nb <= ms->dvsize) { - size_t rsize = ms->dvsize - nb; - mchunkptr p = ms->dv; - if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ - mchunkptr r = ms->dv = chunk_plus_offset(p, nb); - ms->dvsize = rsize; - set_size_and_pinuse_of_free_chunk(r, rsize); - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - } - else { /* exhaust dv */ - size_t dvs = ms->dvsize; - ms->dvsize = 0; - ms->dv = 0; - set_inuse_and_pinuse(ms, p, dvs); - } - mem = chunk2mem(p); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - else if (nb < ms->topsize) { /* Split top */ - size_t rsize = ms->topsize -= nb; - mchunkptr p = ms->top; - mchunkptr r = ms->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - mem = chunk2mem(p); - check_top_chunk(ms, ms->top); - check_malloced_chunk(ms, mem, nb); - goto postaction; - } - - mem = sys_alloc(ms, nb); - - postaction: - POSTACTION(ms); - return mem; - } - - return 0; -} - -void mspace_free(mspace msp, void* mem) { - if (mem != 0) { - mchunkptr p = mem2chunk(mem); -#if FOOTERS - mstate fm = get_mstate_for(p); -#else /* FOOTERS */ - mstate fm = (mstate)msp; -#endif /* FOOTERS */ - if (!ok_magic(fm)) { - USAGE_ERROR_ACTION(fm, p); - return; - } - if (!PREACTION(fm)) { - check_inuse_chunk(fm, p); - if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { - size_t psize = chunksize(p); - mchunkptr next = chunk_plus_offset(p, psize); - if (!pinuse(p)) { - size_t prevsize = p->prev_foot; - if ((prevsize & IS_MMAPPED_BIT) != 0) { - prevsize &= ~IS_MMAPPED_BIT; - psize += prevsize + MMAP_FOOT_PAD; - if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) - fm->footprint -= psize; - goto postaction; - } - else { - mchunkptr prev = chunk_minus_offset(p, prevsize); - psize += prevsize; - p = prev; - if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ - if (p != fm->dv) { - unlink_chunk(fm, p, prevsize); - } - else if ((next->head & INUSE_BITS) == INUSE_BITS) { - fm->dvsize = psize; - set_free_with_pinuse(p, psize, next); - goto postaction; - } - } - else - goto erroraction; - } - } - - if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { - if (!cinuse(next)) { /* consolidate forward */ - if (next == fm->top) { - size_t tsize = fm->topsize += psize; - fm->top = p; - p->head = tsize | PINUSE_BIT; - if (p == fm->dv) { - fm->dv = 0; - fm->dvsize = 0; - } - if (should_trim(fm, tsize)) - sys_trim(fm, 0); - goto postaction; - } - else if (next == fm->dv) { - size_t dsize = fm->dvsize += psize; - fm->dv = p; - set_size_and_pinuse_of_free_chunk(p, dsize); - goto postaction; - } - else { - size_t nsize = chunksize(next); - psize += nsize; - unlink_chunk(fm, next, nsize); - set_size_and_pinuse_of_free_chunk(p, psize); - if (p == fm->dv) { - fm->dvsize = psize; - goto postaction; - } - } - } - else - set_free_with_pinuse(p, psize, next); - insert_chunk(fm, p, psize); - check_free_chunk(fm, p); - goto postaction; - } - } - erroraction: - USAGE_ERROR_ACTION(fm, p); - postaction: - POSTACTION(fm); - } - } -} - -void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) { - void* mem; - size_t req = 0; - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - if (n_elements != 0) { - req = n_elements * elem_size; - if (((n_elements | elem_size) & ~(size_t)0xffff) && - (req / n_elements != elem_size)) - req = MAX_SIZE_T; /* force downstream failure on overflow */ - } - mem = internal_malloc(ms, req); - if (mem != 0 && calloc_must_clear(mem2chunk(mem))) - memset(mem, 0, req); - return mem; -} - -void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) { - if (oldmem == 0) - return mspace_malloc(msp, bytes); -#ifdef REALLOC_ZERO_BYTES_FREES - if (bytes == 0) { - mspace_free(msp, oldmem); - return 0; - } -#endif /* REALLOC_ZERO_BYTES_FREES */ - else { -#if FOOTERS - mchunkptr p = mem2chunk(oldmem); - mstate ms = get_mstate_for(p); -#else /* FOOTERS */ - mstate ms = (mstate)msp; -#endif /* FOOTERS */ - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return internal_realloc(ms, oldmem, bytes); - } -} - -void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return internal_memalign(ms, alignment, bytes); -} - -void** mspace_independent_calloc(mspace msp, size_t n_elements, - size_t elem_size, void* chunks[]) { - size_t sz = elem_size; /* serves as 1-element array */ - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return ialloc(ms, n_elements, &sz, 3, chunks); -} - -void** mspace_independent_comalloc(mspace msp, size_t n_elements, - size_t sizes[], void* chunks[]) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - return 0; - } - return ialloc(ms, n_elements, sizes, 0, chunks); -} - -int mspace_trim(mspace msp, size_t pad) { - int result = 0; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - if (!PREACTION(ms)) { - result = sys_trim(ms, pad); - POSTACTION(ms); - } - } - else { - USAGE_ERROR_ACTION(ms,ms); - } - return result; -} - -void mspace_malloc_stats(mspace msp) { - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - internal_malloc_stats(ms); - } - else { - USAGE_ERROR_ACTION(ms,ms); - } -} - -size_t mspace_footprint(mspace msp) { - size_t result; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - result = ms->footprint; - } - USAGE_ERROR_ACTION(ms,ms); - return result; -} - - -size_t mspace_max_footprint(mspace msp) { - size_t result; - mstate ms = (mstate)msp; - if (ok_magic(ms)) { - result = ms->max_footprint; - } - USAGE_ERROR_ACTION(ms,ms); - return result; -} - - -#if !NO_MALLINFO -struct mallinfo mspace_mallinfo(mspace msp) { - mstate ms = (mstate)msp; - if (!ok_magic(ms)) { - USAGE_ERROR_ACTION(ms,ms); - } - return internal_mallinfo(ms); -} -#endif /* NO_MALLINFO */ - -int mspace_mallopt(int param_number, int value) { - return change_mparam(param_number, value); -} - -#endif /* MSPACES */ - -/* -------------------- Alternative MORECORE functions ------------------- */ - -/* - Guidelines for creating a custom version of MORECORE: - - * For best performance, MORECORE should allocate in multiples of pagesize. - * MORECORE may allocate more memory than requested. (Or even less, - but this will usually result in a malloc failure.) - * MORECORE must not allocate memory when given argument zero, but - instead return one past the end address of memory from previous - nonzero call. - * For best performance, consecutive calls to MORECORE with positive - arguments should return increasing addresses, indicating that - space has been contiguously extended. - * Even though consecutive calls to MORECORE need not return contiguous - addresses, it must be OK for malloc'ed chunks to span multiple - regions in those cases where they do happen to be contiguous. - * MORECORE need not handle negative arguments -- it may instead - just return MFAIL when given negative arguments. - Negative arguments are always multiples of pagesize. MORECORE - must not misinterpret negative args as large positive unsigned - args. You can suppress all such calls from even occurring by defining - MORECORE_CANNOT_TRIM, - - As an example alternative MORECORE, here is a custom allocator - kindly contributed for pre-OSX macOS. It uses virtually but not - necessarily physically contiguous non-paged memory (locked in, - present and won't get swapped out). You can use it by uncommenting - this section, adding some #includes, and setting up the appropriate - defines above: - - #define MORECORE osMoreCore - - There is also a shutdown routine that should somehow be called for - cleanup upon program exit. - - #define MAX_POOL_ENTRIES 100 - #define MINIMUM_MORECORE_SIZE (64 * 1024U) - static int next_os_pool; - void *our_os_pools[MAX_POOL_ENTRIES]; - - void *osMoreCore(int size) - { - void *ptr = 0; - static void *sbrk_top = 0; - - if (size > 0) - { - if (size < MINIMUM_MORECORE_SIZE) - size = MINIMUM_MORECORE_SIZE; - if (CurrentExecutionLevel() == kTaskLevel) - ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0); - if (ptr == 0) - { - return (void *) MFAIL; - } - // save ptrs so they can be freed during cleanup - our_os_pools[next_os_pool] = ptr; - next_os_pool++; - ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK); - sbrk_top = (char *) ptr + size; - return ptr; - } - else if (size < 0) - { - // we don't currently support shrink behavior - return (void *) MFAIL; - } - else - { - return sbrk_top; - } - } - - // cleanup any allocated memory pools - // called as last thing before shutting down driver - - void osCleanupMem(void) - { - void **ptr; - - for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++) - if (*ptr) - { - PoolDeallocate(*ptr); - *ptr = 0; - } - } - -*/ - - -/* ----------------------------------------------------------------------- -History: - V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee) - * Add max_footprint functions - * Ensure all appropriate literals are size_t - * Fix conditional compilation problem for some #define settings - * Avoid concatenating segments with the one provided - in create_mspace_with_base - * Rename some variables to avoid compiler shadowing warnings - * Use explicit lock initialization. - * Better handling of sbrk interference. - * Simplify and fix segment insertion, trimming and mspace_destroy - * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x - * Thanks especially to Dennis Flanagan for help on these. - - V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee) - * Fix memalign brace error. - - V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee) - * Fix improper #endif nesting in C++ - * Add explicit casts needed for C++ - - V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee) - * Use trees for large bins - * Support mspaces - * Use segments to unify sbrk-based and mmap-based system allocation, - removing need for emulation on most platforms without sbrk. - * Default safety checks - * Optional footer checks. Thanks to William Robertson for the idea. - * Internal code refactoring - * Incorporate suggestions and platform-specific changes. - Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas, - Aaron Bachmann, Emery Berger, and others. - * Speed up non-fastbin processing enough to remove fastbins. - * Remove useless cfree() to avoid conflicts with other apps. - * Remove internal memcpy, memset. Compilers handle builtins better. - * Remove some options that no one ever used and rename others. - - V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee) - * Fix malloc_state bitmap array misdeclaration - - V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee) - * Allow tuning of FIRST_SORTED_BIN_SIZE - * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte. - * Better detection and support for non-contiguousness of MORECORE. - Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger - * Bypass most of malloc if no frees. Thanks To Emery Berger. - * Fix freeing of old top non-contiguous chunk im sysmalloc. - * Raised default trim and map thresholds to 256K. - * Fix mmap-related #defines. Thanks to Lubos Lunak. - * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield. - * Branch-free bin calculation - * Default trim and mmap thresholds now 256K. - - V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee) - * Introduce independent_comalloc and independent_calloc. - Thanks to Michael Pachos for motivation and help. - * Make optional .h file available - * Allow > 2GB requests on 32bit systems. - * new WIN32 sbrk, mmap, munmap, lock code from . - Thanks also to Andreas Mueller , - and Anonymous. - * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for - helping test this.) - * memalign: check alignment arg - * realloc: don't try to shift chunks backwards, since this - leads to more fragmentation in some programs and doesn't - seem to help in any others. - * Collect all cases in malloc requiring system memory into sysmalloc - * Use mmap as backup to sbrk - * Place all internal state in malloc_state - * Introduce fastbins (although similar to 2.5.1) - * Many minor tunings and cosmetic improvements - * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK - * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS - Thanks to Tony E. Bennett and others. - * Include errno.h to support default failure action. - - V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee) - * return null for negative arguments - * Added Several WIN32 cleanups from Martin C. Fong - * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h' - (e.g. WIN32 platforms) - * Cleanup header file inclusion for WIN32 platforms - * Cleanup code to avoid Microsoft Visual C++ compiler complaints - * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing - memory allocation routines - * Set 'malloc_getpagesize' for WIN32 platforms (needs more work) - * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to - usage of 'assert' in non-WIN32 code - * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to - avoid infinite loop - * Always call 'fREe()' rather than 'free()' - - V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) - * Fixed ordering problem with boundary-stamping - - V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) - * Added pvalloc, as recommended by H.J. Liu - * Added 64bit pointer support mainly from Wolfram Gloger - * Added anonymously donated WIN32 sbrk emulation - * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen - * malloc_extend_top: fix mask error that caused wastage after - foreign sbrks - * Add linux mremap support code from HJ Liu - - V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) - * Integrated most documentation with the code. - * Add support for mmap, with help from - Wolfram Gloger (Gloger@lrz.uni-muenchen.de). - * Use last_remainder in more cases. - * Pack bins using idea from colin@nyx10.cs.du.edu - * Use ordered bins instead of best-fit threshhold - * Eliminate block-local decls to simplify tracing and debugging. - * Support another case of realloc via move into top - * Fix error occuring when initial sbrk_base not word-aligned. - * Rely on page size for units instead of SBRK_UNIT to - avoid surprises about sbrk alignment conventions. - * Add mallinfo, mallopt. Thanks to Raymond Nijssen - (raymond@es.ele.tue.nl) for the suggestion. - * Add `pad' argument to malloc_trim and top_pad mallopt parameter. - * More precautions for cases where other routines call sbrk, - courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). - * Added macros etc., allowing use in linux libc from - H.J. Lu (hjl@gnu.ai.mit.edu) - * Inverted this history list - - V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) - * Re-tuned and fixed to behave more nicely with V2.6.0 changes. - * Removed all preallocation code since under current scheme - the work required to undo bad preallocations exceeds - the work saved in good cases for most test programs. - * No longer use return list or unconsolidated bins since - no scheme using them consistently outperforms those that don't - given above changes. - * Use best fit for very large chunks to prevent some worst-cases. - * Added some support for debugging - - V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) - * Removed footers when chunks are in use. Thanks to - Paul Wilson (wilson@cs.texas.edu) for the suggestion. - - V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) - * Added malloc_trim, with help from Wolfram Gloger - (wmglo@Dent.MED.Uni-Muenchen.DE). - - V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) - - V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) - * realloc: try to expand in both directions - * malloc: swap order of clean-bin strategy; - * realloc: only conditionally expand backwards - * Try not to scavenge used bins - * Use bin counts as a guide to preallocation - * Occasionally bin return list chunks in first scan - * Add a few optimizations from colin@nyx10.cs.du.edu - - V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) - * faster bin computation & slightly different binning - * merged all consolidations to one part of malloc proper - (eliminating old malloc_find_space & malloc_clean_bin) - * Scan 2 returns chunks (not just 1) - * Propagate failure in realloc if malloc returns 0 - * Add stuff to allow compilation on non-ANSI compilers - from kpv@research.att.com - - V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) - * removed potential for odd address access in prev_chunk - * removed dependency on getpagesize.h - * misc cosmetics and a bit more internal documentation - * anticosmetics: mangled names in macros to evade debugger strangeness - * tested on sparc, hp-700, dec-mips, rs6000 - with gcc & native cc (hp, dec only) allowing - Detlefs & Zorn comparison study (in SIGPLAN Notices.) - - Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) - * Based loosely on libg++-1.2X malloc. (It retains some of the overall - structure of old version, but most details differ.) - -*/ diff --git a/winsup/cygwin/malloc_wrapper.cc b/winsup/cygwin/malloc_wrapper.cc deleted file mode 100644 index 90689ffee..000000000 --- a/winsup/cygwin/malloc_wrapper.cc +++ /dev/null @@ -1,273 +0,0 @@ -/* malloc_wrapper.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 - Red Hat, Inc. - - Originally written by Steve Chamberlain of Cygnus Support - sac@cygnus.com - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "heap.h" -#include "sync.h" -#include "perprocess.h" -#include "cygmalloc.h" -#ifndef MALLOC_DEBUG -#include -#endif -extern "C" struct mallinfo dlmallinfo (); - -/* we provide these stubs to call into a user's - provided malloc if there is one - otherwise - functions we provide - like strdup will cause - problems if malloced on our heap and free'd on theirs. -*/ - -static int export_malloc_called; -static int use_internal_malloc = 1; - -/* These routines are used by the application if it - doesn't provide its own malloc. */ - -extern "C" void -free (void *p) -{ - malloc_printf ("(%p), called by %p", p, __builtin_return_address (0)); - if (!use_internal_malloc) - user_data->free (p); - else - { - __malloc_lock (); - dlfree (p); - __malloc_unlock (); - } -} - -extern "C" void * -malloc (size_t size) -{ - void *res; - export_malloc_called = 1; - if (!use_internal_malloc) - res = user_data->malloc (size); - else - { - __malloc_lock (); - res = dlmalloc (size); - __malloc_unlock (); - } - malloc_printf ("(%d) = %x, called by %p", size, res, __builtin_return_address (0)); - return res; -} - -extern "C" void * -realloc (void *p, size_t size) -{ - void *res; - if (!use_internal_malloc) - res = user_data->realloc (p, size); - else - { - __malloc_lock (); - res = dlrealloc (p, size); - __malloc_unlock (); - } - malloc_printf ("(%x, %d) = %x, called by %x", p, size, res, __builtin_return_address (0)); - return res; -} - -extern "C" void * -calloc (size_t nmemb, size_t size) -{ - void *res; - if (!use_internal_malloc) - res = user_data->calloc (nmemb, size); - else - { - __malloc_lock (); - res = dlcalloc (nmemb, size); - __malloc_unlock (); - } - malloc_printf ("(%d, %d) = %x, called by %x", nmemb, size, res, __builtin_return_address (0)); - return res; -} - -extern "C" void * -memalign (size_t alignment, size_t bytes) -{ - void *res; - if (!use_internal_malloc) - { - set_errno (ENOSYS); - res = NULL; - } - else - { - __malloc_lock (); - res = dlmemalign (alignment, bytes); - __malloc_unlock (); - } - - return res; -} - -extern "C" void * -valloc (size_t bytes) -{ - void *res; - if (!use_internal_malloc) - { - set_errno (ENOSYS); - res = NULL; - } - else - { - __malloc_lock (); - res = dlvalloc (bytes); - __malloc_unlock (); - } - - return res; -} - -extern "C" size_t -malloc_usable_size (void *p) -{ - size_t res; - if (!use_internal_malloc) - { - set_errno (ENOSYS); - res = 0; - } - else - { - __malloc_lock (); - res = dlmalloc_usable_size (p); - __malloc_unlock (); - } - - return res; -} - -extern "C" int -malloc_trim (size_t pad) -{ - size_t res; - if (!use_internal_malloc) - { - set_errno (ENOSYS); - res = 0; - } - else - { - __malloc_lock (); - res = dlmalloc_trim (pad); - __malloc_unlock (); - } - - return res; -} - -extern "C" int -mallopt (int p, int v) -{ - int res; - if (!use_internal_malloc) - { - set_errno (ENOSYS); - res = 0; - } - else - { - __malloc_lock (); - res = dlmallopt (p, v); - __malloc_unlock (); - } - - return res; -} - -extern "C" void -malloc_stats () -{ - if (!use_internal_malloc) - set_errno (ENOSYS); - else - { - __malloc_lock (); - dlmalloc_stats (); - __malloc_unlock (); - } -} - -extern "C" struct mallinfo -mallinfo () -{ - struct mallinfo m; - if (!use_internal_malloc) - set_errno (ENOSYS); - else - { - __malloc_lock (); - m = dlmallinfo (); - __malloc_unlock (); - } - - return m; -} - -extern "C" char * -strdup (const char *s) -{ - char *p; - size_t len = strlen (s) + 1; - if ((p = (char *) malloc (len)) != NULL) - memcpy (p, s, len); - return p; -} - -/* We use a critical section to lock access to the malloc data - structures. This permits malloc to be called from different - threads. Note that it does not make malloc reentrant, and it does - not permit a signal handler to call malloc. The malloc code in - newlib will call __malloc_lock and __malloc_unlock at appropriate - times. */ - -muto NO_COPY mallock; - -void -malloc_init () -{ - mallock.init ("mallock"); - -#ifndef MALLOC_DEBUG - /* Check if malloc is provided by application. If so, redirect all - calls to malloc/free/realloc to application provided. This may - happen if some other dll calls cygwin's malloc, but main code provides - its own malloc */ - if (!in_forkee) - { - user_data->free (user_data->malloc (16)); - if (export_malloc_called) - malloc_printf ("using internal malloc"); - else - { - use_internal_malloc = 0; - malloc_printf ("using external malloc"); - } - } -#endif -} diff --git a/winsup/cygwin/mcount.c b/winsup/cygwin/mcount.c deleted file mode 100644 index dcdbc2b06..000000000 --- a/winsup/cygwin/mcount.c +++ /dev/null @@ -1,173 +0,0 @@ -/*- - * Copyright (c) 1983, 1992, 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. - */ - -#if !defined(lint) && !defined(_KERNEL) && defined(LIBC_SCCS) -static char rcsid[] = "$OpenBSD: mcount.c,v 1.6 1997/07/23 21:11:27 kstailey Exp $"; -#endif - -#include -#include -#include - -/* - * mcount is called on entry to each function compiled with the profiling - * switch set. _mcount(), which is declared in a machine-dependent way - * with _MCOUNT_DECL, does the actual work and is either inlined into a - * C routine or called by an assembly stub. In any case, this magic is - * taken care of by the MCOUNT definition in . - * - * _mcount updates data structures that represent traversals of the - * program's call graph edges. frompc and selfpc are the return - * address and function address that represents the given call graph edge. - * - * Note: the original BSD code used the same variable (frompcindex) for - * both frompcindex and frompc. Any reasonable, modern compiler will - * perform this optimization. - */ -//_MCOUNT_DECL __P((u_long frompc, u_long selfpc)); -_MCOUNT_DECL(frompc, selfpc) /* _mcount; may be static, inline, etc */ - register u_long frompc, selfpc; -{ - register u_short *frompcindex; - register struct tostruct *top, *prevtop; - register struct gmonparam *p; - register long toindex; - - p = &_gmonparam; - /* - * check that we are profiling - * and that we aren't recursively invoked. - */ - if (p->state != GMON_PROF_ON) - return; - p->state = GMON_PROF_BUSY; - /* - * check that frompcindex is a reasonable pc value. - * for example: signal catchers get called from the stack, - * not from text space. too bad. - */ - frompc -= p->lowpc; - if (frompc > p->textsize) - goto done; - -#if (HASHFRACTION & (HASHFRACTION - 1)) == 0 - if (p->hashfraction == HASHFRACTION) - frompcindex = - &p->froms[frompc / (HASHFRACTION * sizeof(*p->froms))]; - else -#endif - frompcindex = - &p->froms[frompc / (p->hashfraction * sizeof(*p->froms))]; - toindex = *frompcindex; - if (toindex == 0) { - /* - * first time traversing this arc - */ - toindex = ++p->tos[0].link; - if (toindex >= p->tolimit) - /* halt further profiling */ - goto overflow; - - *frompcindex = toindex; - top = &p->tos[toindex]; - top->selfpc = selfpc; - top->count = 1; - top->link = 0; - goto done; - } - top = &p->tos[toindex]; - if (top->selfpc == selfpc) { - /* - * arc at front of chain; usual case. - */ - top->count++; - goto done; - } - /* - * have to go looking down chain for it. - * top points to what we are looking at, - * prevtop points to previous top. - * we know it is not at the head of the chain. - */ - for (; /* goto done */; ) { - if (top->link == 0) { - /* - * top is end of the chain and none of the chain - * had top->selfpc == selfpc. - * so we allocate a new tostruct - * and link it to the head of the chain. - */ - toindex = ++p->tos[0].link; - if (toindex >= p->tolimit) - goto overflow; - - top = &p->tos[toindex]; - top->selfpc = selfpc; - top->count = 1; - top->link = *frompcindex; - *frompcindex = toindex; - goto done; - } - /* - * otherwise, check the next arc on the chain. - */ - prevtop = top; - top = &p->tos[top->link]; - if (top->selfpc == selfpc) { - /* - * there it is. - * increment its count - * move it to the head of the chain. - */ - top->count++; - toindex = prevtop->link; - prevtop->link = top->link; - top->link = *frompcindex; - *frompcindex = toindex; - goto done; - } - } -done: - p->state = GMON_PROF_ON; - return; -overflow: - p->state = GMON_PROF_ERROR; - return; -} - -/* - * Actual definition of mcount function. Defined in , - * which is included by - */ -MCOUNT - diff --git a/winsup/cygwin/misc-std.sgml b/winsup/cygwin/misc-std.sgml deleted file mode 100644 index 01ac231cd..000000000 --- a/winsup/cygwin/misc-std.sgml +++ /dev/null @@ -1,74 +0,0 @@ - -Compatibility with Miscellaneous Other Standards - -The following functions are compatible with miscellaneous other -standards: - - -Networking - -(Standardized by POSIX 1.g, which is probably still in draft?) - -accept, bind, connect, getdomainname, gethostbyaddr, -gethostbyname, getpeername, getprotobyname, getprotobynumber, -getservbyname, getservbyport, getsockname, getsockopt, herror, htonl, -htons, inet_addr, inet_makeaddr, inet_netof, inet_ntoa, listen, ntohl, -ntohs, rcmd, recv, recvfrom, rexec, rresvport, send, sendto, -setsockopt, shutdown, socket, socketpair - -Of these networking calls, rexec, rcmd and rresvport are -implemented in MS IP stack but may not be implemented in other -vendors' stacks. - - - -Other - -chroot, closelog, cwait, dlclose, dlerror, dlfork, dlopen, dlsym, -endgrent, ffs, fstatfs, ftime, get_osfhandle, getdtablesize, getgrent, -gethostname, getitimer, getmntent, getpagesize, getpgid, getpwent, -gettimeofday, grantpt, initgroups, ioctl, killpg, login, logout, -lstat, mknod, memccpy, nice, openlog, pclose, popen, ptsname, putenv, -random, readv, realpath, regfree, rexec, select, setegid setenv, -seterrno, seteuid, setitimer, setmntent, setmode, setpassent, setpgrp, -setpwent, settimeofday, sexecl, sexecle, sexeclp, sexeclpe, sexeclpe, -sexecp, sexecv, sexecve, sexecvpe, sigpause, spawnl, spawnle, spawnlp, -spawnlpe, spawnv, spawnve, spawnvp, spawnvpe, srandom, statfs, -strsignal, strtosigno, swab, syslog, timezone, truncate, ttyslot, -unlockpt, unsetenv, usleep, utimes, vfork, vhangup, wait3, wait4, -wcscmp, wcslen, wprintf, writev - - -Implementation Notes - - initgroups does nothing - - chroot, mknod, -settimeofday, and vhangup -always return -1 and sets errno to ENOSYS. - - nice allows Cygwin programs to alter their -current runtime priority through the use of its incr argument. Cygwin -processes can be set to IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, -HIGH_PRIORITY_CLASS, or REALTIME_PRIORITY_CLASS with the -nice call. NORMAL_PRIORITY_CLASS is the -default. If you pass a positive number to nice(), then the priority -level will decrease by one (within the above list of priorities). A -negative number would make it increase by one. It is not possible to -change it by more than one at a time without making repeated calls. -An increment above REALTIME_PRIORITY_CLASS results in the process -staying at that priority. Likewise, a decrement to -IDLE_PRIORITY_CLASS has it stay at that priority. Note that in the -Win32 API, there are 32 priorities. So currently we only give access -to four of these through nice. - - seteuid and setegid -always return 0 and set errno to -ENOSYS. - -vfork just calls -fork - - - - diff --git a/winsup/cygwin/miscfuncs.cc b/winsup/cygwin/miscfuncs.cc deleted file mode 100644 index 0f5804ed6..000000000 --- a/winsup/cygwin/miscfuncs.cc +++ /dev/null @@ -1,371 +0,0 @@ -/* miscfuncs.cc: misc funcs that don't belong anywhere else - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#define _WIN32_WINNT 0x400 -#include "winsup.h" -#include "cygerrno.h" -#include -#include -#include -#include -#include -#include -#include "cygthread.h" -#include "cygtls.h" - -long tls_ix = -1; - -const char case_folded_lower[] NO_COPY = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, '!', '"', '#', '$', '%', '&', 39, '(', ')', '*', '+', ',', '-', '.', '/', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', - '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '[', 92, ']', '^', '_', - '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 -}; - -const char case_folded_upper[] NO_COPY = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, '!', '"', '#', '$', '%', '&', 39, '(', ')', '*', '+', ',', '-', '.', '/', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', - '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', 92, ']', '^', '_', - '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '{', '|', '}', '~', 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 -}; - -const char isalpha_array[] NO_COPY = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0, 0, 0, 0, 0, - 0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -#define ch_case_eq(ch1, ch2) (cyg_tolower(ch1) == cyg_tolower(ch2)) - -#if 0 - -/* Return TRUE if two strings match up to length n */ -extern "C" int __stdcall -strncasematch (const char *s1, const char *s2, size_t n) -{ - if (s1 == s2) - return 1; - - n++; - while (--n && *s1) - { - if (!ch_case_eq (*s1, *s2)) - return 0; - s1++; s2++; - } - return !n || *s2 == '\0'; -} - -/* Return TRUE if two strings match */ -extern "C" int __stdcall -strcasematch (const char *s1, const char *s2) -{ - if (s1 == s2) - return 1; - - while (*s1) - { - if (!ch_case_eq (*s1, *s2)) - return 0; - s1++; s2++; - } - return *s2 == '\0'; -} -#endif - -extern "C" char * __stdcall -strcasestr (const char *searchee, const char *lookfor) -{ - if (*searchee == 0) - { - if (*lookfor) - return NULL; - return (char *) searchee; - } - - while (*searchee) - { - int i = 0; - while (1) - { - if (lookfor[i] == 0) - return (char *) searchee; - - if (!ch_case_eq (lookfor[i], searchee[i])) - break; - lookfor++; - } - searchee++; - } - - return NULL; -} - -int __stdcall -check_invalid_virtual_addr (const void *s, unsigned sz) -{ - MEMORY_BASIC_INFORMATION mbuf; - const void *end; - - for (end = (char *) s + sz; s < end; - s = (char *) mbuf.BaseAddress + mbuf.RegionSize) - if (!VirtualQuery (s, &mbuf, sizeof mbuf)) - return EINVAL; - return 0; -} - -static char __attribute__ ((noinline)) -dummytest (volatile char *p) -{ - return *p; -} -ssize_t -check_iovec (const struct iovec *iov, int iovcnt, bool forwrite) -{ - if (iovcnt <= 0 || iovcnt > IOV_MAX) - { - set_errno (EINVAL); - return -1; - } - - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - size_t tot = 0; - - while (iovcnt != 0) - { - if (iov->iov_len > SSIZE_MAX || (tot += iov->iov_len) > SSIZE_MAX) - { - set_errno (EINVAL); - return -1; - } - - volatile char *p = ((char *) iov->iov_base) + iov->iov_len - 1; - if (!iov->iov_len) - /* nothing to do */; - else if (!forwrite) - *p = dummytest (p); - else - dummytest (p); - - iov++; - iovcnt--; - } - - assert (tot <= SSIZE_MAX); - - return (ssize_t) tot; -} - -UINT -get_cp () -{ - return current_codepage == ansi_cp ? GetACP() : GetOEMCP(); -} - -/* tlen is always treated as the maximum buffer size, including the '\0' - character. sys_wcstombs will always return a 0-terminated result, no - matter what. */ -int __stdcall -sys_wcstombs (char *tgt, int tlen, const WCHAR *src, int slen) -{ - int ret; - - ret = WideCharToMultiByte (get_cp (), 0, src, slen, tgt, tlen, NULL, NULL); - if (ret) - tgt[ret < tlen ? ret : tlen - 1] = '\0'; - return ret; -} - -int __stdcall -sys_mbstowcs (WCHAR *tgt, const char *src, int len) -{ - int res = MultiByteToWideChar (get_cp (), 0, src, -1, tgt, len); - if (!res) - debug_printf ("MultiByteToWideChar %E"); - return res; -} - -extern "C" int -low_priority_sleep (DWORD secs) -{ - HANDLE thisthread = GetCurrentThread (); - int curr_prio = GetThreadPriority (thisthread); - bool staylow; - if (secs != INFINITE) - staylow = false; - else - { - secs = 0; - staylow = true; - } - - if (!secs && wincap.has_switch_to_thread ()) - { - for (int i = 0; i < 3; i++) - SwitchToThread (); - } - else - { - int new_prio; - if (GetCurrentThreadId () == cygthread::main_thread_id) - new_prio = THREAD_PRIORITY_LOWEST; - else - new_prio = GetThreadPriority (hMainThread); - - if (curr_prio != new_prio) - /* Force any threads in normal priority to be scheduled */ - SetThreadPriority (thisthread, new_prio); - Sleep (secs); - - if (!staylow && curr_prio != new_prio) - SetThreadPriority (thisthread, curr_prio); - } - - return curr_prio; -} - -/* Get a default value for the nice factor. When changing these values, - have a look into the below function nice_to_winprio. The values must - match the layout of the static "priority" array. */ -int -winprio_to_nice (DWORD prio) -{ - switch (prio) - { - case REALTIME_PRIORITY_CLASS: - return -20; - case HIGH_PRIORITY_CLASS: - return -16; - case ABOVE_NORMAL_PRIORITY_CLASS: - return -8; - case NORMAL_PRIORITY_CLASS: - return 0; - case BELOW_NORMAL_PRIORITY_CLASS: - return 8; - case IDLE_PRIORITY_CLASS: - return 16; - } - return 0; -} - -/* Get a Win32 priority matching the incoming nice factor. The incoming - nice is limited to the interval [-NZERO,NZERO-1]. */ -DWORD -nice_to_winprio (int &nice) -{ - static const DWORD priority[] NO_COPY = - { - REALTIME_PRIORITY_CLASS, /* 0 */ - HIGH_PRIORITY_CLASS, /* 1 */ - HIGH_PRIORITY_CLASS, - HIGH_PRIORITY_CLASS, - HIGH_PRIORITY_CLASS, - HIGH_PRIORITY_CLASS, - HIGH_PRIORITY_CLASS, - HIGH_PRIORITY_CLASS, /* 7 */ - ABOVE_NORMAL_PRIORITY_CLASS, /* 8 */ - ABOVE_NORMAL_PRIORITY_CLASS, - ABOVE_NORMAL_PRIORITY_CLASS, - ABOVE_NORMAL_PRIORITY_CLASS, - ABOVE_NORMAL_PRIORITY_CLASS, - ABOVE_NORMAL_PRIORITY_CLASS, - ABOVE_NORMAL_PRIORITY_CLASS, - ABOVE_NORMAL_PRIORITY_CLASS, /* 15 */ - NORMAL_PRIORITY_CLASS, /* 16 */ - NORMAL_PRIORITY_CLASS, - NORMAL_PRIORITY_CLASS, - NORMAL_PRIORITY_CLASS, - NORMAL_PRIORITY_CLASS, - NORMAL_PRIORITY_CLASS, - NORMAL_PRIORITY_CLASS, - NORMAL_PRIORITY_CLASS, /* 23 */ - BELOW_NORMAL_PRIORITY_CLASS, /* 24 */ - BELOW_NORMAL_PRIORITY_CLASS, - BELOW_NORMAL_PRIORITY_CLASS, - BELOW_NORMAL_PRIORITY_CLASS, - BELOW_NORMAL_PRIORITY_CLASS, - BELOW_NORMAL_PRIORITY_CLASS, - BELOW_NORMAL_PRIORITY_CLASS, - BELOW_NORMAL_PRIORITY_CLASS, /* 31 */ - IDLE_PRIORITY_CLASS, /* 32 */ - IDLE_PRIORITY_CLASS, - IDLE_PRIORITY_CLASS, - IDLE_PRIORITY_CLASS, - IDLE_PRIORITY_CLASS, - IDLE_PRIORITY_CLASS, - IDLE_PRIORITY_CLASS, - IDLE_PRIORITY_CLASS /* 39 */ - }; - if (nice < -NZERO) - nice = -NZERO; - else if (nice > NZERO - 1) - nice = NZERO - 1; - DWORD prio = priority[nice + NZERO]; - if (!wincap.has_extended_priority_class () - && (prio == BELOW_NORMAL_PRIORITY_CLASS - || prio == ABOVE_NORMAL_PRIORITY_CLASS)) - prio = NORMAL_PRIORITY_CLASS; - return prio; -} - -#undef CreatePipe -bool -create_pipe (PHANDLE hr,PHANDLE hw, LPSECURITY_ATTRIBUTES sa, DWORD n) -{ - for (int i = 0; i < 10; i++) - if (CreatePipe (hr, hw, sa, n)) - return true; - else if (GetLastError () == ERROR_PIPE_BUSY && i < 9) - Sleep (10); - else - break; - return false; -} diff --git a/winsup/cygwin/mktemp.cc b/winsup/cygwin/mktemp.cc deleted file mode 100644 index f7b7236f1..000000000 --- a/winsup/cygwin/mktemp.cc +++ /dev/null @@ -1,186 +0,0 @@ -/* mktemp.cc: mktemp functions - -This file is adapted for Cygwin from FreeBSD. - -See the copyright at the bottom of this file. */ - -#include "winsup.h" -#include "cygerrno.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define link_warning(symbol, msg) \ - asm (".stabs \"" msg "\",30,0,0,0\n\t" \ - ".stabs \"_" #symbol "\",1,0,0,0\n"); - - -static int _gettemp(char *, int *, int); -static uint32_t arc4random (); - -static const char padchar[] = -"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - -extern "C" int -mkstemp(char *path) -{ - int fd; - return _gettemp(path, &fd, 0) ? fd : -1; -} - -extern "C" char * -mkdtemp(char *path) -{ - return _gettemp(path, NULL, 1) ? path : NULL; -} - -link_warning (mktemp, "the use of `mktemp' is dangerous, better use `mkstemp'") -link_warning (_imp__mktemp, "the use of `mktemp' is dangerous, better use `mkstemp'") - -extern "C" char * -mktemp(char *path) -{ - return _gettemp(path, NULL, 0) ? path : (char *) NULL; -} - -static int -_gettemp(char *path, int *doopen, int domkdir) -{ - char *start, *trv, *suffp; - char *pad; - - if (doopen && domkdir) - { - set_errno (EINVAL); - return 0; - } - - suffp = trv = strchr (path, '\0'); - if (--trv < path) - { - set_errno (EINVAL); - return 0; - } - - /* Fill space with random characters */ - while (trv >= path && *trv == 'X') - { - uint32_t rand = arc4random () % (sizeof (padchar) - 1); - *trv-- = padchar[rand]; - } - start = trv + 1; - - /* - * check the target directory. - */ - struct __stat64 sbuf; - if (doopen != NULL || domkdir) - { - for (; trv > path; trv--) - { - if (*trv == '/') - { - *trv = '\0'; - int rval = stat64 (path, &sbuf); - *trv = '/'; - if (rval != 0) - return 0; - if (!S_ISDIR (sbuf.st_mode)) - { - set_errno (ENOTDIR); - return 0; - } - break; - } - } - } - - for (;;) - { - if (doopen) - { - if ((*doopen = open (path, O_CREAT | O_EXCL | O_RDWR, 0600)) >= 0) - return 1; - if (errno != EEXIST) - return 0; - } - else if (domkdir) - { - if (mkdir (path, 0700) == 0) - return 1; - if (errno != EEXIST) - return 0; - } - else if (lstat64 (path, &sbuf)) - return errno == ENOENT; - - /* If we have a collision, cycle through the space of filenames */ - for (trv = start;;) - { - if (*trv == '\0' || trv == suffp) - return 0; - pad = strchr (padchar, *trv); - if (pad == NULL || *++pad == '\0') - *trv++ = padchar[0]; - else - { - *trv++ = *pad; - break; - } - } - } - /*NOTREACHED*/ -} - -static uint32_t -arc4random () -{ - union - { - uint32_t rand; - char buf[sizeof (int) / 8]; - } r; - int fd = open ("/dev/urandom", O_RDONLY); - read (fd, r.buf, 4); - close (fd); - return r.rand; -} - -/* -* Copyright (c) 1987, 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. -*/ diff --git a/winsup/cygwin/mkvers.sh b/winsup/cygwin/mkvers.sh deleted file mode 100755 index 665f35868..000000000 --- a/winsup/cygwin/mkvers.sh +++ /dev/null @@ -1,177 +0,0 @@ -#!/bin/sh -# mkvers.sh - Make version information for cygwin DLL -# -# Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. -# -# This file is part of Cygwin. -# -# This software is a copyrighted work licensed under the terms of the -# Cygwin license. Please consult the file "CYGWIN_LICENSE" for -# details. - -exec 9> version.cc - -# -# Arg 1 is the name of the version include file -# -incfile="$1" -rcfile="$2" -windres="$3" - -[ -r $incfile ] || { - echo "**** Couldn't open file '$incfile'. Aborting." -} - -# -# Load the current date so we can work on individual fields -# -build_date=`date` -set -$- $build_date -# -# Translate the month into a number -# -case "$2" in - Jan) m=01 ;; - Feb) m=02 ;; - Mar) m=03 ;; - Apr) m=04 ;; - May) m=05 ;; - Jun) m=06 ;; - Jul) m=07 ;; - Aug) m=08 ;; - Sep) m=09 ;; - Oct) m=10 ;; - Nov) m=11 ;; - Dec) m=12 ;; -esac - -if [ "$3" -lt 10 ]; then - d=0$3 -else - d=$3 -fi -hhmm="`echo $4 | sed 's/:..$//'`" -# -# Set date into YYYY-MM-DD HH:MM:SS format -# -builddate="${6-$5}-$m-$d $hhmm" - -set -$- '' - -# -# Output the initial part of version.cc -# -cat <&9 -#include "config.h" -#include "cygwin_version.h" - -#define strval(x) #x -#define str(x) strval(x) -#define shared_data_version str(CYGWIN_VERSION_SHARED_DATA) - -const char *cygwin_version_strings = - "BEGIN_CYGWIN_VERSION_INFO\n" -EOF - -# -# Split version file into dir and filename components -# -dir=`dirname $incfile` -fn=`basename $incfile` - -# -# Look in the include file CVS directory for a CVS Tag file. This file, -# if it exists, will contain the name of the sticky tag associated with -# the current build. Save that for output later. -# -cvs_tag="`sed -e '/dontuse/d' -e 's%^.\(.*\)%\1%' $dir/CVS/Tag 2>/dev/null`" - -wv_cvs_tag="$cvs_tag" -[ -n "$cvs_tag" ] && cvs_tag=" CVS tag"' -'"$cvs_tag" - -# -# Look in the source directory containing the include/cygwin/version.h -# and set dir accordingly. -dir=`echo $dir | sed -e 's%/include/cygwin.*$%%' -e 's%include/cygwin.*$%.%'` - -# Look in $dir for a a ".snapshot-date" file. If one is found then this -# information will be saved for output to the DLL. -# -if [ -r "$dir/.snapshot-date" ]; then - read snapshotdate < "$dir/.snapshot-date" - snapshot="snapshot date -$snapshotdate" -fi - -# -# Scan the version.h file for strings that begin with CYGWIN_INFO or -# CYGWIN_VERSION. Perform crude parsing on the lines to get the values -# associated with these values and then pipe it into a while loop which -# outputs these values in C palatable format for inclusion in the DLL -# with a '%% ' identifier that will introduce "interesting" strings. -# These strings are strictly for use by a user to scan the DLL for -# interesting information. -# -(sed -n -e 's%#define CYGWIN_INFO_\([A-Z_]*\)[ ][ ]*\([a-zA-Z0-9"][^/]*\).*%_\1\ -\2%p' -e 's%#define CYGWIN_VERSION_\([A-Z_]*\)[ ][ ]*\([a-zA-Z0-9"][^/]*\).*%_\1\ -\2%p' $incfile | sed -e 's/["\\]//g' -e '/^_/y/ABCDEFGHIJKLMNOPQRSTUVWXYZ_/abcdefghijklmnopqrstuvwxyz /'; -echo ' build date'; echo $build_date; [ -n "$cvs_tag" ] && echo "$cvs_tag";\ -[ -n "$snapshot" ] && echo "$snapshot" -) | while read var; do - read val -cat <&9 - -trap "rm -f /tmp/mkvers.$$" 0 1 2 15 - -if [ -n "$snapshotdate" ]; then - usedate="`echo $snapshotdate | sed 's/-\\(..:..[^-]*\\).*$/ \1SNP/'`" -else - usedate="$builddate" -fi - -# -# Finally, output the shared ID and set up the cygwin_version structure -# for use by Cygwin itself. -# -cat <&9 -#ifdef DEBUGGING - "%%% Cygwin shared id: " CYGWIN_VERSION_DLL_IDENTIFIER "S" shared_data_version "-$builddate\n" -#else - "%%% Cygwin shared id: " CYGWIN_VERSION_DLL_IDENTIFIER "S" shared_data_version "\n" -#endif - "END_CYGWIN_VERSION_INFO\n\0"; -cygwin_version_info cygwin_version = -{ - CYGWIN_VERSION_API_MAJOR, CYGWIN_VERSION_API_MINOR, - CYGWIN_VERSION_DLL_MAJOR, CYGWIN_VERSION_DLL_MINOR, - CYGWIN_VERSION_SHARED_DATA, - CYGWIN_VERSION_MOUNT_REGISTRY, - "$usedate", -#ifdef DEBUGGING - CYGWIN_VERSION_DLL_IDENTIFIER "S" shared_data_version "-$builddate" -#else - CYGWIN_VERSION_DLL_IDENTIFIER "S" shared_data_version -#endif -}; -EOF - -# -# Generate winver.o using cygwin/version.h information. -# Turn the cygwin major number from some large number to something like 1.1.0. -# -eval `sed -n 's/^.*dll \(m[ai][jn]or\): \([0-9]*\)[^0-9]*$/\1=\2/p' /tmp/mkvers.$$` -cygverhigh=`expr $major / 1000` -cygverlow=`expr $major % 1000` -cygwin_ver="$cygverhigh.$cygverlow.$minor" -if [ -n "$cvs_tag" ]; then - cvs_tag="`echo $wv_cvs_tag | sed -e 's/-branch.*//'`" - cygwin_ver="$cygwin_ver-$cvs_tag" -fi - -echo "Version $cygwin_ver" -set -$- $builddate -$windres --include-dir $dir/../w32api/include --include-dir $dir/include --define CYGWIN_BUILD_DATE="$1" --define CYGWIN_BUILD_TIME="$2" --define CYGWIN_VERSION='"'"$cygwin_ver"'"' $rcfile winver.o diff --git a/winsup/cygwin/mmap.cc b/winsup/cygwin/mmap.cc deleted file mode 100644 index e58405594..000000000 --- a/winsup/cygwin/mmap.cc +++ /dev/null @@ -1,2022 +0,0 @@ -/* mmap.cc - - Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, - 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "pinfo.h" -#include "sys/cygwin.h" -#include "ntdll.h" - -/* __PROT_ATTACH indicates an anonymous mapping which is supposed to be - attached to a file mapping for pages beyond the file's EOF. The idea - is to support mappings longer than the file, without the file growing - to mapping length (POSIX semantics). */ -#define __PROT_ATTACH 0x8000000 -/* Filler pages are the pages from the last file backed page to the next - 64K boundary. These pages are created as anonymous pages, but with - the same page protection as the file's pages, since POSIX applications - expect to be able to access this part the same way as the file pages. */ -#define __PROT_FILLER 0x4000000 - -#define PAGE_CNT(bytes) howmany((bytes),getpagesize()) - -#define PGBITS (sizeof (DWORD)*8) -#define MAPSIZE(pages) howmany ((pages), PGBITS) - -#define MAP_SET(n) (page_map[(n)/PGBITS] |= (1L << ((n) % PGBITS))) -#define MAP_CLR(n) (page_map[(n)/PGBITS] &= ~(1L << ((n) % PGBITS))) -#define MAP_ISSET(n) (page_map[(n)/PGBITS] & (1L << ((n) % PGBITS))) - -/* Used for anonymous mappings. */ -static fhandler_dev_zero fh_anonymous; -/* Used for reopening a disk file when necessary. */ -static fhandler_disk_file fh_disk_file; - -/* Small helpers to avoid having lots of flag bit tests in the code. */ -static inline bool -priv (int flags) -{ - return (flags & MAP_PRIVATE) == MAP_PRIVATE; -} - -static inline bool -fixed (int flags) -{ - return (flags & MAP_FIXED) == MAP_FIXED; -} - -static inline bool -anonymous (int flags) -{ - return (flags & MAP_ANONYMOUS) == MAP_ANONYMOUS; -} - -static inline bool -noreserve (int flags) -{ - return (flags & MAP_NORESERVE) == MAP_NORESERVE; -} - -static inline bool -autogrow (int flags) -{ - return (flags & MAP_AUTOGROW) == MAP_AUTOGROW; -} - -static inline bool -attached (int prot) -{ - return (prot & __PROT_ATTACH) == __PROT_ATTACH; -} - -static inline bool -filler (int prot) -{ - return (prot & __PROT_FILLER) == __PROT_FILLER; -} - -static inline DWORD -gen_create_protect (DWORD openflags, int flags) -{ - DWORD ret = PAGE_READONLY; - - if (priv (flags)) - ret = PAGE_WRITECOPY; - else if (openflags & GENERIC_WRITE) - ret = PAGE_READWRITE; - - /* Ignore EXECUTE permission on 9x. */ - if ((openflags & GENERIC_EXECUTE) - && wincap.virtual_protect_works_on_shared_pages ()) - ret <<= 4; - - return ret; -} - -/* Generate Windows protection flags from mmap prot and flag values. */ -static inline DWORD -gen_protect (int prot, int flags) -{ - DWORD ret = PAGE_NOACCESS; - - /* Attached pages are only reserved, but the protection must be a - valid value, so we just return PAGE_READWRITE. */ - if (attached (prot)) - return PAGE_EXECUTE_READWRITE; - - if (prot & PROT_WRITE) - ret = (priv (flags) && (!anonymous (flags) || filler (prot))) - ? PAGE_WRITECOPY : PAGE_READWRITE; - else if (prot & PROT_READ) - ret = PAGE_READONLY; - - /* Ignore EXECUTE permission on 9x. */ - if ((prot & PROT_EXEC) - && wincap.virtual_protect_works_on_shared_pages ()) - ret <<= 4; - - return ret; -} - -/* Generate Windows access flags from mmap prot and flag values. - Only used on 9x. PROT_EXEC not supported here since it's not - necessary. */ -static inline DWORD -gen_access (DWORD openflags, int flags) -{ - DWORD ret = FILE_MAP_READ; - if (priv (flags)) - ret = FILE_MAP_COPY; - else if (openflags & GENERIC_WRITE) - ret = priv (flags) ? FILE_MAP_COPY : FILE_MAP_WRITE; - return ret; -} - -/* OS specific wrapper functions for map/section functions. */ -static BOOL -VirtualProt9x (PVOID addr, SIZE_T len, DWORD prot, PDWORD oldprot) -{ - if (addr >= (caddr_t)0x80000000 && addr <= (caddr_t)0xBFFFFFFF) - return TRUE; /* FAKEALARM! */ - return VirtualProtect (addr, len, prot, oldprot); -} - -static BOOL -VirtualProtNT (PVOID addr, SIZE_T len, DWORD prot, PDWORD oldprot) -{ - return VirtualProtect (addr, len, prot, oldprot); -} - -static BOOL -VirtualProtEx9x (HANDLE parent, PVOID addr, SIZE_T len, DWORD prot, - PDWORD oldprot) -{ - if (addr >= (caddr_t)0x80000000 && addr <= (caddr_t)0xBFFFFFFF) - return TRUE; /* FAKEALARM! */ - return VirtualProtectEx (parent, addr, len, prot, oldprot); -} -static BOOL -VirtualProtExNT (HANDLE parent, PVOID addr, SIZE_T len, DWORD prot, - PDWORD oldprot) -{ - return VirtualProtectEx (parent, addr, len, prot, oldprot); -} - -/* This allows to stay lazy about VirtualProtect usage in subsequent code. */ -#define VirtualProtect(a,l,p,o) (mmap_func->VirtualProt((a),(l),(p),(o))) -#define VirtualProtectEx(h,a,l,p,o) (mmap_func->VirtualProtEx((h),(a),(l),(p),(o))) - -static HANDLE -CreateMapping9x (HANDLE fhdl, size_t len, _off64_t off, DWORD openflags, - int prot, int flags, const char *name) -{ - HANDLE h; - DWORD high, low; - - DWORD protect = gen_create_protect (openflags, flags); - - /* copy-on-write doesn't work properly on 9x with real files. While the - changes are not propagated to the file, they are visible to other - processes sharing the same file mapping object. Workaround: Don't - use named file mapping. That should work since sharing file - mappings only works reliable using named file mapping on 9x. - - On 9x/ME try first to open the mapping by name when opening a - shared file object. This is needed since 9x/ME only shares objects - between processes by name. What a mess... */ - - if (fhdl != INVALID_HANDLE_VALUE && !priv (flags)) - { - /* Grrr, the whole stuff is just needed to try to get a reliable - mapping of the same file. Even that uprising isn't bullet - proof but it does it's best... */ - char namebuf[CYG_MAX_PATH]; - cygwin_conv_to_full_posix_path (name, namebuf); - for (int i = strlen (namebuf) - 1; i >= 0; --i) - namebuf[i] = cyg_tolower (namebuf [i]); - - debug_printf ("named sharing"); - DWORD access = gen_access (openflags, flags); - /* Different access modes result in incompatible mappings. So we - create different maps per access mode by using different names. */ - switch (access) - { - case FILE_MAP_READ: - namebuf[0] = 'R'; - break; - case FILE_MAP_WRITE: - namebuf[0] = 'W'; - break; - case FILE_MAP_COPY: - namebuf[0] = 'C'; - break; - } - if (!(h = OpenFileMapping (access, TRUE, namebuf))) - h = CreateFileMapping (fhdl, &sec_none, protect, 0, 0, namebuf); - } - else if (fhdl == INVALID_HANDLE_VALUE) - { - /* Standard anonymous mapping needs non-zero len. */ - h = CreateFileMapping (fhdl, &sec_none, protect, 0, len, NULL); - } - else if (autogrow (flags)) - { - high = (off + len) >> 32; - low = (off + len) & UINT32_MAX; - /* Auto-grow only works if the protection is PAGE_READWRITE. So, - first we call CreateFileMapping with PAGE_READWRITE, then, if the - requested protection is different, we close the mapping and - reopen it again with the correct protection, if auto-grow worked. */ - h = CreateFileMapping (fhdl, &sec_none, PAGE_READWRITE, - high, low, NULL); - if (h && protect != PAGE_READWRITE) - { - CloseHandle (h); - h = CreateFileMapping (fhdl, &sec_none, protect, - high, low, NULL); - } - } - else - { - /* Zero len creates mapping for whole file. */ - h = CreateFileMapping (fhdl, &sec_none, protect, 0, 0, NULL); - } - return h; -} - -static HANDLE -CreateMappingNT (HANDLE fhdl, size_t len, _off64_t off, DWORD openflags, - int prot, int flags, const char *) -{ - HANDLE h; - NTSTATUS ret; - - LARGE_INTEGER sectionsize = { QuadPart: len }; - ULONG protect = gen_create_protect (openflags, flags); - ULONG attributes = attached (prot) ? SEC_RESERVE : SEC_COMMIT; - - OBJECT_ATTRIBUTES oa; - InitializeObjectAttributes (&oa, NULL, OBJ_INHERIT, NULL, - sec_none.lpSecurityDescriptor); - - if (fhdl == INVALID_HANDLE_VALUE) - { - /* Standard anonymous mapping needs non-zero len. */ - ret = NtCreateSection (&h, SECTION_ALL_ACCESS, &oa, - §ionsize, protect, attributes, NULL); - } - else if (autogrow (flags)) - { - /* Auto-grow only works if the protection is PAGE_READWRITE. So, - first we call NtCreateSection with PAGE_READWRITE, then, if the - requested protection is different, we close the mapping and - reopen it again with the correct protection, if auto-grow worked. */ - sectionsize.QuadPart += off; - ret = NtCreateSection (&h, SECTION_ALL_ACCESS, &oa, - §ionsize, PAGE_READWRITE, attributes, fhdl); - if (NT_SUCCESS (ret) && protect != PAGE_READWRITE) - { - CloseHandle (h); - ret = NtCreateSection (&h, SECTION_ALL_ACCESS, &oa, - §ionsize, protect, attributes, fhdl); - } - } - else - { - /* Zero len creates mapping for whole file and allows - AT_EXTENDABLE_FILE mapping, if we ever use it... */ - sectionsize.QuadPart = 0; - ret = NtCreateSection (&h, SECTION_ALL_ACCESS, &oa, - §ionsize, protect, attributes, fhdl); - } - if (!NT_SUCCESS (ret)) - { - h = NULL; - SetLastError (RtlNtStatusToDosError (ret)); - } - return h; -} - -void * -MapView9x (HANDLE h, void *addr, size_t len, DWORD openflags, - int prot, int flags, _off64_t off) -{ - DWORD high = off >> 32; - DWORD low = off & UINT32_MAX; - DWORD access = gen_access (openflags, flags); - void *base; - - /* Try mapping using the given address first, even if it's NULL. - If it failed, and addr was not NULL and flags is not MAP_FIXED, - try again with NULL address. */ - if (!addr) - base = MapViewOfFile (h, access, high, low, len); - else - { - base = MapViewOfFileEx (h, access, high, low, len, addr); - if (!base && !fixed (flags)) - base = MapViewOfFile (h, access, high, low, len); - } - debug_printf ("%x = MapViewOfFileEx (h:%x, access:%x, 0, off:%D, " - "len:%u, addr:%x)", base, h, access, off, len, addr); - return base; -} - -void * -MapViewNT (HANDLE h, void *addr, size_t len, DWORD openflags, - int prot, int flags, _off64_t off) -{ - NTSTATUS ret; - LARGE_INTEGER offset = { QuadPart:off }; - DWORD protect = gen_create_protect (openflags, flags); - void *base = addr; - ULONG commitsize = attached (prot) ? 0 : len; - ULONG viewsize = len; - ULONG alloc_type = base && !wincap.is_wow64 () ? AT_ROUND_TO_PAGE : 0; - - /* Try mapping using the given address first, even if it's NULL. - If it failed, and addr was not NULL and flags is not MAP_FIXED, - try again with NULL address. */ - ret = NtMapViewOfSection (h, GetCurrentProcess (), &base, 0, commitsize, - &offset, &viewsize, ViewShare, alloc_type, protect); - if (!NT_SUCCESS (ret) && addr && !fixed (flags)) - { - base = NULL; - ret = NtMapViewOfSection (h, GetCurrentProcess (), &base, 0, commitsize, - &offset, &viewsize, ViewShare, 0, protect); - } - if (!NT_SUCCESS (ret)) - { - base = NULL; - SetLastError (RtlNtStatusToDosError (ret)); - } - debug_printf ("%x = NtMapViewOfSection (h:%x, addr:%x, len:%u, off:%D, " - "protect:%x, type:%x)", base, h, addr, len, off, protect, 0); - return base; -} - -struct mmap_func_t -{ - HANDLE (*CreateMapping)(HANDLE, size_t, _off64_t, DWORD, int, int, - const char *); - void * (*MapView)(HANDLE, void *, size_t, DWORD, int, int, _off64_t); - BOOL (*VirtualProt)(PVOID, SIZE_T, DWORD, PDWORD); - BOOL (*VirtualProtEx)(HANDLE, PVOID, SIZE_T, DWORD, PDWORD); -}; - -mmap_func_t mmap_funcs_9x = -{ - CreateMapping9x, - MapView9x, - VirtualProt9x, - VirtualProtEx9x -}; - -mmap_func_t mmap_funcs_nt = -{ - CreateMappingNT, - MapViewNT, - VirtualProtNT, - VirtualProtExNT -}; - -mmap_func_t *mmap_func; - -void -mmap_init () -{ - mmap_func = wincap.is_winnt () ? &mmap_funcs_nt : &mmap_funcs_9x; -} - -/* Class structure used to keep a record of all current mmap areas - in a process. Needed for bookkeeping all mmaps in a process and - for duplicating all mmaps after fork() since mmaps are not propagated - to child processes by Windows. All information must be duplicated - by hand, see fixup_mmaps_after_fork(). - - The class structure: - - One member of class map per process, global variable mmapped_areas. - Contains a dynamic class list array. Each list entry represents all - mapping to a file, keyed by file descriptor and file name hash. - Each list entry contains a dynamic class mmap_record array. Each - mmap_record represents exactly one mapping. For each mapping, there's - an additional so called `page_map'. It's an array of bits, one bit - per mapped memory page. The bit is set if the page is accessible, - unset otherwise. */ - -class mmap_record -{ - private: - int fd; - HANDLE mapping_hdl; - DWORD openflags; - int prot; - int flags; - _off64_t offset; - DWORD len; - caddr_t base_address; - DWORD *page_map; - device dev; - - public: - mmap_record (int nfd, HANDLE h, DWORD of, int p, int f, _off64_t o, DWORD l, - caddr_t b) : - fd (nfd), - mapping_hdl (h), - openflags (of), - prot (p), - flags (f), - offset (o), - len (l), - base_address (b), - page_map (NULL) - { - dev.devn = 0; - if (fd >= 0 && !cygheap->fdtab.not_open (fd)) - dev = cygheap->fdtab[fd]->dev (); - else if (fd == -1) - dev.parse (FH_ZERO); - } - - int get_fd () const { return fd; } - HANDLE get_handle () const { return mapping_hdl; } - device& get_device () { return dev; } - int get_prot () const { return prot; } - int get_openflags () const { return openflags; } - int get_flags () const { return flags; } - bool priv () const { return ::priv (flags); } - bool fixed () const { return ::fixed (flags); } - bool anonymous () const { return ::anonymous (flags); } - bool noreserve () const { return ::noreserve (flags); } - bool autogrow () const { return ::autogrow (flags); } - bool attached () const { return ::attached (prot); } - bool filler () const { return ::filler (prot); } - _off64_t get_offset () const { return offset; } - DWORD get_len () const { return len; } - caddr_t get_address () const { return base_address; } - - bool alloc_page_map (); - void free_page_map () { if (page_map) cfree (page_map); } - - DWORD find_unused_pages (DWORD pages) const; - _off64_t map_pages (_off64_t off, DWORD len); - bool map_pages (caddr_t addr, DWORD len); - bool unmap_pages (caddr_t addr, DWORD len); - int access (caddr_t address); - - fhandler_base *alloc_fh (); - void free_fh (fhandler_base *fh); - - DWORD gen_create_protect () const - { return ::gen_create_protect (get_openflags (), get_flags ()); } - DWORD gen_protect () const - { return ::gen_protect (get_prot (), get_flags ()); } - DWORD gen_access () const - { return ::gen_access (get_openflags (), get_flags ()); } - bool compatible_flags (int fl) const; -}; - -class list -{ - private: - mmap_record *recs; - int nrecs, maxrecs; - int fd; - DWORD hash; - - public: - int get_fd () const { return fd; } - DWORD get_hash () const { return hash; } - mmap_record *get_record (int i) { return i >= nrecs ? NULL : recs + i; } - - bool anonymous () const { return fd == -1; } - void set (int nfd); - mmap_record *add_record (mmap_record r); - bool del_record (int i); - void free_recs () { if (recs) cfree (recs); } - mmap_record *search_record (_off64_t off, DWORD len); - long search_record (caddr_t addr, DWORD len, caddr_t &m_addr, DWORD &m_len, - long start); - caddr_t try_map (void *addr, size_t len, int flags, _off64_t off); -}; - -class map -{ - private: - list *lists; - unsigned nlists, maxlists; - - public: - list *get_list (unsigned i) { return i >= nlists ? NULL : lists + i; } - list *get_list_by_fd (int fd); - list *add_list (int fd); - void del_list (unsigned i); -}; - -/* This is the global map structure pointer. */ -static map mmapped_areas; - -bool -mmap_record::compatible_flags (int fl) const -{ -#define MAP_COMPATMASK (MAP_TYPE | MAP_NORESERVE) - return (get_flags () & MAP_COMPATMASK) == (fl & MAP_COMPATMASK); -} - -DWORD -mmap_record::find_unused_pages (DWORD pages) const -{ - DWORD mapped_pages = PAGE_CNT (get_len ()); - DWORD start; - - if (pages > mapped_pages) - return (DWORD)-1; - for (start = 0; start <= mapped_pages - pages; ++start) - if (!MAP_ISSET (start)) - { - DWORD cnt; - for (cnt = 0; cnt < pages; ++cnt) - if (MAP_ISSET (start + cnt)) - break; - if (cnt >= pages) - return start; - } - return (DWORD)-1; -} - -bool -mmap_record::alloc_page_map () -{ - /* Allocate one bit per page */ - if (!(page_map = (DWORD *) ccalloc (HEAP_MMAP, - MAPSIZE (PAGE_CNT (get_len ())), - sizeof (DWORD)))) - return false; - - DWORD start_protect = gen_create_protect (); - DWORD real_protect = gen_protect (); - if (real_protect != start_protect - && !VirtualProtect (get_address (), get_len (), - real_protect, &start_protect)) - system_printf ("Warning: VirtualProtect (addr: %p, len: 0x%x, " - "new_prot: 0x%x, old_prot: 0x%x), %E", - get_address (), get_len (), - real_protect, start_protect); - DWORD len = PAGE_CNT (get_len ()); - while (len-- > 0) - MAP_SET (len); - return true; -} - -_off64_t -mmap_record::map_pages (_off64_t off, DWORD len) -{ - /* Used ONLY if this mapping matches into the chunk of another already - performed mapping in a special case of MAP_ANON|MAP_PRIVATE. - - Otherwise it's job is now done by alloc_page_map(). */ - DWORD old_prot; - debug_printf ("map_pages (fd=%d, off=%D, len=%u)", get_fd (), off, len); - len = PAGE_CNT (len); - - if ((off = find_unused_pages (len)) == (DWORD)-1) - return 0L; - if (!noreserve () - && !VirtualProtect (get_address () + off * getpagesize (), - len * getpagesize (), gen_protect (), &old_prot)) - { - __seterrno (); - return (_off64_t)-1; - } - - while (len-- > 0) - MAP_SET (off + len); - return off * getpagesize (); -} - -bool -mmap_record::map_pages (caddr_t addr, DWORD len) -{ - debug_printf ("map_pages (addr=%x, len=%u)", addr, len); - DWORD old_prot; - DWORD off = addr - get_address (); - off /= getpagesize (); - len = PAGE_CNT (len); - /* First check if the area is unused right now. */ - for (DWORD l = 0; l < len; ++l) - if (MAP_ISSET (off + l)) - { - set_errno (EINVAL); - return false; - } - if (!noreserve () - && !VirtualProtect (get_address () + off * getpagesize (), - len * getpagesize (), gen_protect (), &old_prot)) - { - __seterrno (); - return false; - } - for (; len-- > 0; ++off) - MAP_SET (off); - return true; -} - -bool -mmap_record::unmap_pages (caddr_t addr, DWORD len) -{ - DWORD old_prot; - DWORD off = addr - get_address (); - off /= getpagesize (); - len = PAGE_CNT (len); - if (anonymous () && priv () && noreserve () - && !VirtualFree (get_address () + off * getpagesize (), - len * getpagesize (), MEM_DECOMMIT)) - debug_printf ("VirtualFree in unmap_pages () failed, %E"); - else if (!VirtualProtect (get_address () + off * getpagesize (), - len * getpagesize (), PAGE_NOACCESS, &old_prot)) - debug_printf ("VirtualProtect in unmap_pages () failed, %E"); - - for (; len-- > 0; ++off) - MAP_CLR (off); - /* Return TRUE if all pages are free'd which may result in unmapping - the whole chunk. */ - for (len = MAPSIZE (PAGE_CNT (get_len ())); len > 0; ) - if (page_map[--len]) - return false; - return true; -} - -int -mmap_record::access (caddr_t address) -{ - if (address < get_address () || address >= get_address () + get_len ()) - return 0; - DWORD off = (address - get_address ()) / getpagesize (); - return MAP_ISSET (off); -} - -fhandler_base * -mmap_record::alloc_fh () -{ - if (anonymous ()) - { - fh_anonymous.set_io_handle (INVALID_HANDLE_VALUE); - fh_anonymous.set_access (GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE); - return &fh_anonymous; - } - - /* The file descriptor could have been closed or, even - worse, could have been reused for another file before - the call to fork(). This requires creating a fhandler - of the correct type to be sure to call the method of the - correct class. */ - fhandler_base *fh = build_fh_dev (get_device ()); - fh->set_access (get_openflags ()); - return fh; -} - -void -mmap_record::free_fh (fhandler_base *fh) -{ - if (!anonymous ()) - cfree (fh); -} - -mmap_record * -list::add_record (mmap_record r) -{ - if (nrecs == maxrecs) - { - mmap_record *new_recs; - if (maxrecs == 0) - new_recs = (mmap_record *) - cmalloc (HEAP_MMAP, 5 * sizeof (mmap_record)); - else - new_recs = (mmap_record *) - crealloc (recs, (maxrecs + 5) * sizeof (mmap_record)); - if (!new_recs) - return NULL; - maxrecs += 5; - recs = new_recs; - } - recs[nrecs] = r; - if (!recs[nrecs].alloc_page_map ()) - return NULL; - return recs + nrecs++; -} - -/* Used in mmap() */ -mmap_record * -list::search_record (_off64_t off, DWORD len) -{ - if (anonymous () && !off) - { - len = PAGE_CNT (len); - for (int i = 0; i < nrecs; ++i) - if (recs[i].find_unused_pages (len) != (DWORD)-1) - return recs + i; - } - else - { - for (int i = 0; i < nrecs; ++i) - if (off >= recs[i].get_offset () - && off + len <= recs[i].get_offset () - + (PAGE_CNT (recs[i].get_len ()) * getpagesize ())) - return recs + i; - } - return NULL; -} - -/* Used in munmap() */ -long -list::search_record (caddr_t addr, DWORD len, caddr_t &m_addr, DWORD &m_len, - long start) -{ - caddr_t low, high; - - for (long i = start + 1; i < nrecs; ++i) - { - low = (addr >= recs[i].get_address ()) ? addr : recs[i].get_address (); - high = recs[i].get_address (); - if (recs[i].filler ()) - high += recs[i].get_len (); - else - high += (PAGE_CNT (recs[i].get_len ()) * getpagesize ()); - high = (addr + len < high) ? addr + len : high; - if (low < high) - { - m_addr = low; - m_len = high - low; - return i; - } - } - return -1; -} - -void -list::set (int nfd) -{ - fd = nfd; - if (!anonymous ()) - { - /* The fd isn't sufficient since it could already be the fd of another - file. So we use the inode number as evaluated by fstat to identify - the file. */ - struct stat st; - fstat (nfd, &st); - hash = st.st_ino; - } - nrecs = maxrecs = 0; - recs = NULL; -} - -bool -list::del_record (int i) -{ - if (i < nrecs) - { - recs[i].free_page_map (); - for (; i < nrecs - 1; i++) - recs[i] = recs[i + 1]; - nrecs--; - } - /* Return true if the list is empty which allows the caller to remove - this list from the list array. */ - return !nrecs; -} - -caddr_t -list::try_map (void *addr, size_t len, int flags, _off64_t off) -{ - mmap_record *rec; - - if (off == 0 && !fixed (flags)) - { - /* If MAP_FIXED isn't given, check if this mapping matches into the - chunk of another already performed mapping. */ - if ((rec = search_record (off, len)) != NULL - && rec->compatible_flags (flags)) - { - if ((off = rec->map_pages (off, len)) == (_off64_t)-1) - return (caddr_t) MAP_FAILED; - return (caddr_t) rec->get_address () + off; - } - } - else if (fixed (flags)) - { - /* If MAP_FIXED is given, test if the requested area is in an - unmapped part of an still active mapping. This can happen - if a memory region is unmapped and remapped with MAP_FIXED. */ - caddr_t u_addr; - DWORD u_len; - long record_idx = -1; - if ((record_idx = search_record ((caddr_t) addr, len, u_addr, u_len, - record_idx)) >= 0) - { - rec = get_record (record_idx); - if (u_addr > (caddr_t) addr || u_addr + len < (caddr_t) addr + len - || !rec->compatible_flags (flags)) - { - /* Partial match only, or access mode doesn't match. */ - /* FIXME: Handle partial mappings gracefully if adjacent - memory is available. */ - set_errno (EINVAL); - return (caddr_t) MAP_FAILED; - } - if (!rec->map_pages ((caddr_t) addr, len)) - return (caddr_t) MAP_FAILED; - return (caddr_t) addr; - } - } - return NULL; -} - -list * -map::get_list_by_fd (int fd) -{ - unsigned i; - for (i = 0; i < nlists; i++) - { - if (fd == -1 && lists[i].anonymous ()) - return lists + i; - /* The fd isn't sufficient since it could already be the fd of another - file. So we use the inode number as evaluated by fstat to identify - the file. */ - struct stat st; - if (fd != -1 && !fstat (fd, &st) && lists[i].get_hash () == st.st_ino) - return lists + i; - } - return 0; -} - -list * -map::add_list (int fd) -{ - if (nlists == maxlists) - { - list *new_lists; - if (maxlists == 0) - new_lists = (list *) cmalloc (HEAP_MMAP, 5 * sizeof (list)); - else - new_lists = (list *) crealloc (lists, (maxlists + 5) * sizeof (list)); - if (!new_lists) - return NULL; - maxlists += 5; - lists = new_lists; - } - lists[nlists].set (fd); - return lists + nlists++; -} - -void -map::del_list (unsigned i) -{ - if (i < nlists) - { - lists[i].free_recs (); - for (; i < nlists - 1; i++) - lists[i] = lists[i + 1]; - nlists--; - } -} - -/* This function is called from exception_handler when a segmentation - violation has happened. The function should return true, if the - faulting address (the parameter) is within attached pages. In this - case the exception_handler raises SIGBUS, as demanded by the memory - protection extension described in SUSv3 (see the mmap man page). - If false is returned, a normal SIGSEGV is raised. */ -bool -mmap_is_attached_page (ULONG_PTR addr) -{ - list *map_list; - long record_idx; - caddr_t u_addr; - DWORD u_len; - DWORD pagesize = getsystempagesize (); - - addr = rounddown (addr, pagesize); - if (!(map_list = mmapped_areas.get_list_by_fd (-1))) - return false; - if ((record_idx = map_list->search_record ((caddr_t)addr, pagesize, - u_addr, u_len, -1)) < 0) - return false; - if (!map_list->get_record (record_idx)->attached ()) - return false; - return true; -} - -static caddr_t -mmap_worker (fhandler_base *fh, caddr_t base, size_t len, int prot, int flags, - int fd, _off64_t off) -{ - list *map_list; - HANDLE h = fh->mmap (&base, len, prot, flags, off); - if (h == INVALID_HANDLE_VALUE) - return NULL; - if (!(map_list = mmapped_areas.get_list_by_fd (fd)) - && !(map_list = mmapped_areas.add_list (fd))) - { - fh->munmap (h, base, len); - return NULL; - } - mmap_record mmap_rec (fd, h, fh->get_access (), prot, flags, off, len, base); - mmap_record *rec = map_list->add_record (mmap_rec); - if (!rec) - { - fh->munmap (h, base, len); - return NULL; - } - return base; -} - -extern "C" void * -mmap64 (void *addr, size_t len, int prot, int flags, int fd, _off64_t off) -{ - syscall_printf ("addr %x, len %u, prot %x, flags %x, fd %d, off %D", - addr, len, prot, flags, fd, off); - - caddr_t ret = (caddr_t) MAP_FAILED; - fhandler_base *fh = NULL; - list *map_list = NULL; - size_t orig_len = 0; - caddr_t base = NULL; - - DWORD pagesize = getpagesize (); - - fh_anonymous.set_io_handle (INVALID_HANDLE_VALUE); - fh_anonymous.set_access (GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE); - fh_disk_file.set_io_handle (NULL); - - SetResourceLock (LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap"); - - /* EINVAL error conditions. Note that the addr%pagesize test is deferred - to workaround a serious alignment problem in Windows 98. */ - if (off % pagesize - || ((prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC))) - || ((flags & MAP_TYPE) != MAP_SHARED - && (flags & MAP_TYPE) != MAP_PRIVATE) -#if 0 - || (fixed (flags) && ((uintptr_t) addr % pagesize)) -#endif - || !len) - { - set_errno (EINVAL); - goto out; - } - - /* There's a serious alignment problem in Windows 98. MapViewOfFile - sometimes returns addresses which are page aligned instead of - granularity aligned. OTOH, it's not possible to force such an - address using MapViewOfFileEx. So what we do here to let it work - at least most of the time is, allow 4K aligned addresses in 98, - to enable remapping of formerly mapped pages. If no matching - free pages exist, check addr again, this time for the real alignment. */ - DWORD checkpagesize = wincap.has_mmap_alignment_bug () ? - getsystempagesize () : pagesize; - if (fixed (flags) && ((uintptr_t) addr % checkpagesize)) - { - set_errno (EINVAL); - goto out; - } - - if (!anonymous (flags) && fd != -1) - { - /* Ensure that fd is open */ - cygheap_fdget cfd (fd); - if (cfd < 0) - goto out; - - fh = cfd; - - /* mmap /dev/zero is like MAP_ANONYMOUS. */ - if (fh->get_device () == FH_ZERO) - flags |= MAP_ANONYMOUS; - } - if (anonymous (flags) || fd == -1) - { - fh = &fh_anonymous; - fd = -1; - flags |= MAP_ANONYMOUS; - /* Anonymous mappings are always forced to pagesize length with - no offset. */ - len = roundup2 (len, pagesize); - off = 0; - } - else if (fh->get_device () == FH_FS) - { - /* EACCES error conditions according to SUSv3. File must be opened - for reading, regardless of the requested protection, and file must - be opened for writing when PROT_WRITE together with MAP_SHARED - is requested. */ - if (!(fh->get_access () & GENERIC_READ) - || (!(fh->get_access () & GENERIC_WRITE) - && (prot & PROT_WRITE) && !priv (flags))) - { - set_errno (EACCES); - goto out; - } - - /* On 9x you can't create mappings with PAGE_WRITECOPY protection if - the file isn't explicitely opened with WRITE access. */ - if (!wincap.is_winnt () && priv (flags) - && !(fh->get_access () & GENERIC_WRITE)) - { - HANDLE h = CreateFile (fh->get_win32_name (), - fh->get_access () | GENERIC_WRITE, - wincap.shared (), &sec_none_nih, - OPEN_EXISTING, 0, NULL); - if (h == INVALID_HANDLE_VALUE) - { - set_errno (EACCES); - goto out; - } - fh_disk_file.set_io_handle (h); - fh_disk_file.set_access (fh->get_access () | GENERIC_WRITE); - path_conv pc; - pc.set_name (fh->get_win32_name (), ""); - fh_disk_file.set_name (pc); - fh = &fh_disk_file; - } - - /* On NT you can't create mappings with PAGE_EXECUTE protection if - the file isn't explicitely opened with EXECUTE access. */ - if (wincap.is_winnt ()) - { - HANDLE h = CreateFile (fh->get_win32_name (), - fh->get_access () | GENERIC_EXECUTE, - wincap.shared (), &sec_none_nih, - OPEN_EXISTING, 0, NULL); - if (h != INVALID_HANDLE_VALUE) - { - fh_disk_file.set_io_handle (h); - fh_disk_file.set_access (fh->get_access () | GENERIC_EXECUTE); - fh = &fh_disk_file; - } - else if (prot & PROT_EXEC) - { - /* TODO: To be or not to be... I'm opting for refusing this - mmap request rather than faking it, but that might break - some non-portable code. */ - set_errno (EACCES); - goto out; - } - } - - DWORD high; - DWORD low = GetFileSize (fh->get_handle (), &high); - _off64_t fsiz = ((_off64_t)high << 32) + low; - - /* Don't allow file mappings beginning beyond EOF since Windows can't - handle that POSIX like, unless MAP_AUTOGROW flag is set, which - mimics Windows behaviour. */ - if (off >= fsiz && !autogrow (flags)) - { - /* Instead, it seems suitable to return an anonymous mapping of - the given size instead. Mapped addresses beyond EOF aren't - written back to the file anyway, so the handling is identical - to other pages beyond EOF. */ - fh = &fh_anonymous; - len = roundup2 (len, pagesize); - prot = PROT_READ | PROT_WRITE | __PROT_ATTACH; - flags &= MAP_FIXED; - flags |= MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE; - fd = -1; - off = 0; - goto go_ahead; - } - fsiz -= off; - /* On NT systems we're creating the pages beyond EOF as reserved, - anonymous pages. That's not possible on 9x for two reasons. - It neither allows to create reserved pages in the shared memory - area, nor does it allow to create page aligend mappings (in - contrast to granularity aligned mappings). - - Note that this isn't done in WOW64 environments since apparently - WOW64 does not support the AT_ROUND_TO_PAGE flag which is required - to get this right. Too bad. */ - if (wincap.virtual_protect_works_on_shared_pages () - && !wincap.is_wow64 () - && ((len > fsiz && !autogrow (flags)) - || len < pagesize)) - orig_len = len; - if (len > fsiz) - { - if (autogrow (flags)) - { - /* Allow mapping beyond EOF if MAP_AUTOGROW flag is set. - Check if file has been opened for writing, otherwise - MAP_AUTOGROW is invalid. */ - if (!(fh->get_access () & GENERIC_WRITE)) - { - set_errno (EINVAL); - goto out; - } - } - else - /* Otherwise, don't map beyond EOF, since Windows would change - the file to the new length, in contrast to POSIX. */ - len = fsiz; - } - - /* If the requested offset + len is <= file size, drop MAP_AUTOGROW. - This simplifes fhandler::mmap's job. */ - if (autogrow (flags) && (off + len) <= fsiz) - flags &= ~MAP_AUTOGROW; - } - -go_ahead: - - map_list = mmapped_areas.get_list_by_fd (fd); - - /* Test if an existing anonymous mapping can be recycled. */ - if (map_list && anonymous (flags)) - { - caddr_t tried = map_list->try_map (addr, len, flags, off); - /* try_map returns NULL if no map matched, otherwise it returns - a valid address, of MAP_FAILED in case of a fatal error. */ - if (tried) - { - ret = tried; - goto out; - } - } - - /* Deferred alignment test, see above. */ - if (wincap.has_mmap_alignment_bug () - && fixed (flags) && ((uintptr_t) addr % pagesize)) - { - set_errno (EINVAL); - goto out; - } - - base = mmap_worker (fh, (caddr_t) addr, len, prot, flags, fd, off); - if (!base) - goto out; - - if (orig_len) - { - /* If the requested length is bigger than the file size, the - remainder is created as anonymous mapping. Actually two - mappings are created, first the reminder from the file end to - the next 64K boundary as accessible pages with the same - protection as the file's pages, then as much pages as necessary - to accomodate the requested length, but as reserved pages which - raise a SIGBUS when trying to access them. AT_ROUND_TO_PAGE - and page protection on shared pages is only supported by 32 bit NT, - so don't even try on 9x and in WOW64. This is accomplished by not - setting orig_len on 9x and in WOW64 above. */ - orig_len = roundup2 (orig_len, pagesize); - len = roundup2 (len, getsystempagesize ()); - if (orig_len - len) - { - orig_len -= len; - size_t valid_page_len = orig_len % pagesize; - size_t sigbus_page_len = orig_len - valid_page_len; - - caddr_t at_base = base + len; - if (valid_page_len) - { - prot |= __PROT_FILLER; - flags &= MAP_SHARED | MAP_PRIVATE; - flags |= MAP_ANONYMOUS | MAP_FIXED; - at_base = mmap_worker (&fh_anonymous, at_base, valid_page_len, - prot, flags, -1, 0); - if (!at_base) - { - fh->munmap (fh->get_handle (), base, len); - set_errno (ENOMEM); - goto out; - } - at_base += valid_page_len; - } - if (sigbus_page_len) - { - prot = PROT_READ | PROT_WRITE | __PROT_ATTACH; - flags = MAP_ANONYMOUS | MAP_NORESERVE | MAP_FIXED; - at_base = mmap_worker (&fh_anonymous, at_base, sigbus_page_len, - prot, flags, -1, 0); - if (!at_base) - debug_printf ("Warning: Mapping beyond EOF failed, %E"); - } - } - } - - ret = base; - -out: - - ReleaseResourceLock (LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap"); - - if (fh_disk_file.get_handle ()) - CloseHandle (fh_disk_file.get_handle ()); - - syscall_printf ("%p = mmap() ", ret); - return ret; -} - -extern "C" void * -mmap (void *addr, size_t len, int prot, int flags, int fd, _off_t off) -{ - return mmap64 (addr, len, prot, flags, fd, (_off64_t)off); -} - -/* munmap () removes all mmapped pages between addr and addr+len. */ - -extern "C" int -munmap (void *addr, size_t len) -{ - syscall_printf ("munmap (addr %x, len %u)", addr, len); - - /* Error conditions according to SUSv3 */ - if (!addr || !len || check_invalid_virtual_addr (addr, len)) - { - set_errno (EINVAL); - return -1; - } - /* See comment in mmap64 for a description. */ - size_t pagesize = wincap.has_mmap_alignment_bug () ? - getsystempagesize () : getpagesize (); - if (((uintptr_t) addr % pagesize) || !len) - { - set_errno (EINVAL); - return -1; - } - len = roundup2 (len, pagesize); - - SetResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "munmap"); - - /* Iterate through the map, unmap pages between addr and addr+len - in all maps. */ - list *map_list; - for (unsigned list_idx = 0; - (map_list = mmapped_areas.get_list (list_idx)); - ++list_idx) - { - long record_idx = -1; - caddr_t u_addr; - DWORD u_len; - - while ((record_idx = map_list->search_record((caddr_t)addr, len, u_addr, - u_len, record_idx)) >= 0) - { - mmap_record *rec = map_list->get_record (record_idx); - if (rec->unmap_pages (u_addr, u_len)) - { - /* The whole record has been unmapped, so we now actually - unmap it from the system in full length... */ - fhandler_base *fh = rec->alloc_fh (); - fh->munmap (rec->get_handle (), - rec->get_address (), - rec->get_len ()); - rec->free_fh (fh); - - /* ...and delete the record. */ - if (map_list->del_record (record_idx--)) - { - /* Yay, the last record has been removed from the list, - we can remove the list now, too. */ - mmapped_areas.del_list (list_idx--); - break; - } - } - } - } - - ReleaseResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "munmap"); - syscall_printf ("0 = munmap(): %x", addr); - return 0; -} - -/* Sync file with memory. Ignore flags for now. */ - -extern "C" int -msync (void *addr, size_t len, int flags) -{ - int ret = -1; - list *map_list; - - syscall_printf ("msync (addr: %p, len %u, flags %x)", addr, len, flags); - - SetResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "msync"); - - /* See comment in mmap64 for a description. */ - size_t pagesize = wincap.has_mmap_alignment_bug () ? - getsystempagesize () : getpagesize (); - if (((uintptr_t) addr % pagesize) - || (flags & ~(MS_ASYNC | MS_SYNC | MS_INVALIDATE)) - || (flags & (MS_ASYNC | MS_SYNC) == (MS_ASYNC | MS_SYNC))) - { - set_errno (EINVAL); - goto out; - } - len = roundup2 (len, pagesize); - - /* Iterate through the map, looking for the mmapped area. - Error if not found. */ - for (unsigned list_idx = 0; - (map_list = mmapped_areas.get_list (list_idx)); - ++list_idx) - { - mmap_record *rec; - for (int record_idx = 0; - (rec = map_list->get_record (record_idx)); - ++record_idx) - { - if (rec->access ((caddr_t)addr)) - { - /* Check whole area given by len. */ - for (DWORD i = getpagesize (); i < len; ++i) - if (!rec->access ((caddr_t)addr + i)) - { - set_errno (ENOMEM); - goto out; - } - fhandler_base *fh = rec->alloc_fh (); - ret = fh->msync (rec->get_handle (), (caddr_t)addr, len, flags); - rec->free_fh (fh); - goto out; - } - } - } - - /* No matching mapping exists. */ - set_errno (ENOMEM); - -out: - syscall_printf ("%d = msync()", ret); - ReleaseResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "msync"); - return ret; -} - -/* Set memory protection */ - -extern "C" int -mprotect (void *addr, size_t len, int prot) -{ - bool in_mapped = false; - bool ret = false; - DWORD old_prot; - DWORD new_prot = 0; - - syscall_printf ("mprotect (addr: %p, len %u, prot %x)", addr, len, prot); - - /* See comment in mmap64 for a description. */ - size_t pagesize = wincap.has_mmap_alignment_bug () ? - getsystempagesize () : getpagesize (); - if ((uintptr_t) addr % pagesize) - { - set_errno (EINVAL); - goto out; - } - len = roundup2 (len, pagesize); - - SetResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "mprotect"); - - /* Iterate through the map, protect pages between addr and addr+len - in all maps. */ - list *map_list; - for (unsigned list_idx = 0; - (map_list = mmapped_areas.get_list (list_idx)); - ++list_idx) - { - long record_idx = -1; - caddr_t u_addr; - DWORD u_len; - - while ((record_idx = map_list->search_record((caddr_t)addr, len, - u_addr, u_len, - record_idx)) >= 0) - { - mmap_record *rec = map_list->get_record (record_idx); - in_mapped = true; - if (rec->attached ()) - continue; - new_prot = gen_protect (prot, rec->get_flags ()); - if (rec->anonymous () && rec->priv () && rec->noreserve ()) - { - if (new_prot == PAGE_NOACCESS) - ret = VirtualFree (u_addr, u_len, MEM_DECOMMIT); - else - ret = !!VirtualAlloc (u_addr, u_len, MEM_COMMIT, new_prot); - } - else - ret = VirtualProtect (u_addr, u_len, new_prot, &old_prot); - if (!ret) - { - __seterrno (); - break; - } - } - } - - ReleaseResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "mprotect"); - - if (!in_mapped) - { - int flags = 0; - MEMORY_BASIC_INFORMATION mbi; - - ret = VirtualQuery (addr, &mbi, sizeof mbi); - if (ret) - { - /* If write protection is requested, check if the page was - originally protected writecopy. In this case call VirtualProtect - requesting PAGE_WRITECOPY, otherwise the VirtualProtect will fail - on NT version >= 5.0 */ - if (prot & PROT_WRITE) - { - if (mbi.AllocationProtect == PAGE_WRITECOPY - || mbi.AllocationProtect == PAGE_EXECUTE_WRITECOPY) - flags = MAP_PRIVATE; - } - new_prot = gen_protect (prot, flags); - if (new_prot != PAGE_NOACCESS && mbi.State == MEM_RESERVE) - ret = VirtualAlloc (addr, len, MEM_COMMIT, new_prot); - else - ret = VirtualProtect (addr, len, new_prot, &old_prot); - } - if (!ret) - __seterrno (); - } - -out: - - syscall_printf ("%d = mprotect ()", ret ? 0 : -1); - return ret ? 0 : -1; -} - -extern "C" int -mlock (const void *addr, size_t len) -{ - if (!wincap.has_working_virtual_lock ()) - return 0; - - int ret = -1; - - /* Instead of using VirtualLock, which does not guarantee that the pages - aren't swapped out when the process is inactive, we're using - ZwLockVirtualMemory with the LOCK_VM_IN_RAM flag to do what mlock on - POSIX systems does. On NT, this requires SeLockMemoryPrivilege, - which is given only to SYSTEM by default. */ - - push_thread_privilege (SE_LOCK_MEMORY_PRIV, true); - - /* Align address and length values to page size. */ - size_t pagesize = getpagesize (); - PVOID base = (PVOID) rounddown((uintptr_t) addr, pagesize); - ULONG size = roundup2 (((uintptr_t) addr - (uintptr_t) base) + len, pagesize); - NTSTATUS status = 0; - do - { - status = NtLockVirtualMemory (hMainProc, &base, &size, LOCK_VM_IN_RAM); - if (status == STATUS_WORKING_SET_QUOTA) - { - /* The working set is too small, try to increase it so that the - requested locking region fits in. Unfortunately I don't know - any function which would return the currently locked pages of - a process (no go with NtQueryVirtualMemory). - - So, except for the border cases, what we do here is something - really embarrassing. We raise the working set by 64K at a time - and retry, until either we fail to raise the working set size - further, or until NtLockVirtualMemory returns successfully (or - with another error). */ - ULONG min, max; - if (!GetProcessWorkingSetSize (hMainProc, &min, &max)) - { - set_errno (ENOMEM); - break; - } - if (min < size) - min = size + pagesize; - else if (size < pagesize) - min += size; - else - min += pagesize; - if (max < min) - max = min; - if (!SetProcessWorkingSetSize (hMainProc, min, max)) - { - set_errno (ENOMEM); - break; - } - } - else if (!NT_SUCCESS (status)) - __seterrno_from_nt_status (status); - else - ret = 0; - } - while (status == STATUS_WORKING_SET_QUOTA); - - pop_thread_privilege (); - - return ret; -} - -extern "C" int -munlock (const void *addr, size_t len) -{ - if (!wincap.has_working_virtual_lock ()) - return 0; - - int ret = -1; - - push_thread_privilege (SE_LOCK_MEMORY_PRIV, true); - - /* Align address and length values to page size. */ - size_t pagesize = getpagesize (); - PVOID base = (PVOID) rounddown((uintptr_t) addr, pagesize); - ULONG size = roundup2 (((uintptr_t) addr - (uintptr_t) base) + len, pagesize); - NTSTATUS status = NtUnlockVirtualMemory (hMainProc, &base, &size, - LOCK_VM_IN_RAM); - if (!NT_SUCCESS (status)) - __seterrno_from_nt_status (status); - else - ret = 0; - - pop_thread_privilege (); - - return ret; -} - -/* - * Base implementation: - * - * `mmap' returns ENODEV as documented in SUSv2. - * In contrast to the global function implementation, the member function - * `mmap' has to return the mapped base address in `addr' and the handle to - * the mapping object as return value. In case of failure, the fhandler - * mmap has to close that handle by itself and return INVALID_HANDLE_VALUE. - * - * `munmap' and `msync' get the handle to the mapping object as first parameter - * additionally. -*/ -HANDLE -fhandler_base::mmap (caddr_t *addr, size_t len, int prot, - int flags, _off64_t off) -{ - set_errno (ENODEV); - return INVALID_HANDLE_VALUE; -} - -int -fhandler_base::munmap (HANDLE h, caddr_t addr, size_t len) -{ - set_errno (ENODEV); - return -1; -} - -int -fhandler_base::msync (HANDLE h, caddr_t addr, size_t len, int flags) -{ - set_errno (ENODEV); - return -1; -} - -bool -fhandler_base::fixup_mmap_after_fork (HANDLE h, int prot, int flags, - _off64_t offset, DWORD size, - void *address) -{ - set_errno (ENODEV); - return -1; -} - -/* Implementation for anonymous maps. Using fhandler_dev_zero looks - quite the natural way. */ -HANDLE -fhandler_dev_zero::mmap (caddr_t *addr, size_t len, int prot, - int flags, _off64_t off) -{ - HANDLE h; - void *base; - - if (priv (flags) && !filler (prot)) - { - /* Private anonymous maps are now implemented using VirtualAlloc. - This has two advantages: - - - VirtualAlloc has a smaller footprint than a copy-on-write - anonymous map. - - - It supports decommitting using VirtualFree, in contrast to - section maps. This allows minimum footprint private maps, - when using the (non-POSIX, yay-Linux) MAP_NORESERVE flag. - */ - DWORD protect = gen_protect (prot, flags); - DWORD alloc_type = MEM_RESERVE | (noreserve (flags) ? 0 : MEM_COMMIT); - base = VirtualAlloc (*addr, len, alloc_type, protect); - if (!base && addr && !fixed (flags)) - base = VirtualAlloc (NULL, len, alloc_type, protect); - if (!base || (fixed (flags) && base != *addr)) - { - if (!base) - __seterrno (); - else - { - VirtualFree (base, 0, MEM_RELEASE); - set_errno (EINVAL); - debug_printf ("VirtualAlloc: address shift with MAP_FIXED given"); - } - return INVALID_HANDLE_VALUE; - } - h = (HANDLE) 1; /* Fake handle to indicate success. */ - } - else - { - h = mmap_func->CreateMapping (get_handle (), len, off, get_access (), - prot, flags, get_win32_name ()); - if (!h) - { - __seterrno (); - debug_printf ("CreateMapping failed with %E"); - return INVALID_HANDLE_VALUE; - } - - base = mmap_func->MapView (h, *addr, len, get_access(), prot, flags, off); - if (!base || (fixed (flags) && base != *addr)) - { - if (!base) - __seterrno (); - else - { - UnmapViewOfFile (base); - set_errno (EINVAL); - debug_printf ("MapView: address shift with MAP_FIXED given"); - } - CloseHandle (h); - return INVALID_HANDLE_VALUE; - } - } - *addr = (caddr_t) base; - return h; -} - -int -fhandler_dev_zero::munmap (HANDLE h, caddr_t addr, size_t len) -{ - if (h == (HANDLE) 1) /* See fhandler_dev_zero::mmap. */ - VirtualFree (addr, 0, MEM_RELEASE); - else - { - UnmapViewOfFile (addr); - CloseHandle (h); - } - return 0; -} - -int -fhandler_dev_zero::msync (HANDLE h, caddr_t addr, size_t len, int flags) -{ - return 0; -} - -bool -fhandler_dev_zero::fixup_mmap_after_fork (HANDLE h, int prot, int flags, - _off64_t offset, DWORD size, - void *address) -{ - /* Re-create the map */ - void *base; - if (priv (flags) && !filler (prot)) - { - DWORD alloc_type = MEM_RESERVE | (noreserve (flags) ? 0 : MEM_COMMIT); - /* Always allocate R/W so that ReadProcessMemory doesn't fail - due to a non-writable target address. The protection is - set to the correct one anyway in the fixup loop. */ - base = VirtualAlloc (address, size, alloc_type, PAGE_READWRITE); - } - else - base = mmap_func->MapView (h, address, size, get_access (), - prot, flags, offset); - if (base != address) - { - MEMORY_BASIC_INFORMATION m; - VirtualQuery (address, &m, sizeof (m)); - system_printf ("requested %p != %p mem alloc base %p, state %p, " - "size %d, %E", address, base, m.AllocationBase, m.State, - m.RegionSize); - } - return base == address; -} - -/* Implementation for disk files and anonymous mappings. */ -HANDLE -fhandler_disk_file::mmap (caddr_t *addr, size_t len, int prot, - int flags, _off64_t off) -{ - HANDLE h = mmap_func->CreateMapping (get_handle (), len, off, get_access (), - prot, flags, get_win32_name ()); - if (!h) - { - __seterrno (); - debug_printf ("CreateMapping failed with %E"); - return INVALID_HANDLE_VALUE; - } - - void *base = mmap_func->MapView (h, *addr, len, get_access (), - prot, flags, off); - if (!base || (fixed (flags) && base != *addr)) - { - if (!base) - __seterrno (); - else - { - UnmapViewOfFile (base); - set_errno (EINVAL); - debug_printf ("MapView: address shift with MAP_FIXED given"); - } - CloseHandle (h); - return INVALID_HANDLE_VALUE; - } - - *addr = (caddr_t) base; - return h; -} - -int -fhandler_disk_file::munmap (HANDLE h, caddr_t addr, size_t len) -{ - UnmapViewOfFile (addr); - CloseHandle (h); - return 0; -} - -int -fhandler_disk_file::msync (HANDLE h, caddr_t addr, size_t len, int flags) -{ - if (FlushViewOfFile (addr, len) == 0) - { - __seterrno (); - return -1; - } - return 0; -} - -bool -fhandler_disk_file::fixup_mmap_after_fork (HANDLE h, int prot, int flags, - _off64_t offset, DWORD size, - void *address) -{ - /* Re-create the map */ - void *base = mmap_func->MapView (h, address, size, get_access (), - prot, flags, offset); - if (base != address) - { - MEMORY_BASIC_INFORMATION m; - VirtualQuery (address, &m, sizeof (m)); - system_printf ("requested %p != %p mem alloc base %p, state %p, " - "size %d, %E", address, base, m.AllocationBase, m.State, - m.RegionSize); - } - return base == address; -} - -HANDLE -fhandler_dev_mem::mmap (caddr_t *addr, size_t len, int prot, - int flags, _off64_t off) -{ - if (off >= mem_size - || (DWORD) len >= mem_size - || off + len >= mem_size) - { - set_errno (EINVAL); - debug_printf ("-1 = mmap(): illegal parameter, set EINVAL"); - return INVALID_HANDLE_VALUE; - } - - UNICODE_STRING memstr; - RtlInitUnicodeString (&memstr, L"\\device\\physicalmemory"); - - OBJECT_ATTRIBUTES attr; - InitializeObjectAttributes (&attr, &memstr, - OBJ_CASE_INSENSITIVE | OBJ_INHERIT, - NULL, NULL); - - /* Section access is bit-wise ored, while on the Win32 level access - is only one of the values. It's not quite clear if the section - access has to be defined this way, or if SECTION_ALL_ACCESS would - be sufficient but this worked fine so far, so why change? */ - ACCESS_MASK section_access; - if (prot & PROT_WRITE) - section_access = SECTION_MAP_READ | SECTION_MAP_WRITE; - else - section_access = SECTION_MAP_READ; - - HANDLE h; - NTSTATUS ret = NtOpenSection (&h, section_access, &attr); - if (!NT_SUCCESS (ret)) - { - __seterrno_from_nt_status (ret); - debug_printf ("-1 = mmap(): NtOpenSection failed with %E"); - return INVALID_HANDLE_VALUE; - } - - void *base = MapViewNT (h, *addr, len, get_access (), - prot, flags | MAP_ANONYMOUS, off); - if (!base || (fixed (flags) && base != *addr)) - { - if (!base) - __seterrno (); - else - { - NtUnmapViewOfSection (GetCurrentProcess (), base); - set_errno (EINVAL); - debug_printf ("MapView: address shift with MAP_FIXED given"); - } - CloseHandle (h); - return INVALID_HANDLE_VALUE; - } - - *addr = (caddr_t) base; - return h; -} - -int -fhandler_dev_mem::munmap (HANDLE h, caddr_t addr, size_t len) -{ - NTSTATUS ret; - if (!NT_SUCCESS (ret = NtUnmapViewOfSection (INVALID_HANDLE_VALUE, addr))) - { - __seterrno_from_nt_status (ret); - return -1; - } - CloseHandle (h); - return 0; -} - -int -fhandler_dev_mem::msync (HANDLE h, caddr_t addr, size_t len, int flags) -{ - return 0; -} - -bool -fhandler_dev_mem::fixup_mmap_after_fork (HANDLE h, int prot, int flags, - _off64_t offset, DWORD size, - void *address) -{ - void *base = MapViewNT (h, address, size, get_access (), prot, - flags | MAP_ANONYMOUS, offset); - if (base != address) - { - MEMORY_BASIC_INFORMATION m; - VirtualQuery (address, &m, sizeof (m)); - system_printf ("requested %p != %p mem alloc base %p, state %p, " - "size %d, %E", address, base, m.AllocationBase, m.State, - m.RegionSize); - } - return base == address; -} - -/* Call to re-create all the file mappings in a forked child. Called from - the child in initialization. At this point we are passed a valid - mmapped_areas map, and all the HANDLE's are valid for the child, but - none of the mapped areas are in our address space. We need to iterate - through the map, doing the MapViewOfFile calls. */ - -int __stdcall -fixup_mmaps_after_fork (HANDLE parent) -{ - /* Iterate through the map */ - list *map_list; - for (unsigned list_idx = 0; - (map_list = mmapped_areas.get_list (list_idx)); - ++list_idx) - { - mmap_record *rec; - for (int record_idx = 0; - (rec = map_list->get_record (record_idx)); - ++record_idx) - { - debug_printf ("fd %d, h 0x%x, address %p, len 0x%x, prot: 0x%x, " - "flags: 0x%x, offset %X", - rec->get_fd (), rec->get_handle (), rec->get_address (), - rec->get_len (), rec->get_prot (), rec->get_flags (), - rec->get_offset ()); - - fhandler_base *fh = rec->alloc_fh (); - bool ret = fh->fixup_mmap_after_fork (rec->get_handle (), - rec->get_prot (), - rec->get_flags () | MAP_FIXED, - rec->get_offset (), - rec->get_len (), - rec->get_address ()); - rec->free_fh (fh); - - if (!ret) - { - if (rec->attached ()) - { - system_printf ("Warning: Fixup mapping beyond EOF failed"); - continue; - } - return -1; - } - - MEMORY_BASIC_INFORMATION mbi; - DWORD old_prot; - - for (char *address = rec->get_address (); - address < rec->get_address () + rec->get_len (); - address += mbi.RegionSize) - { - if (!VirtualQueryEx (parent, address, &mbi, sizeof mbi)) - { - system_printf ("VirtualQueryEx failed for MAP_PRIVATE " - "address %p, %E", address); - return -1; - } - /* Just skip reserved pages. */ - if (mbi.State == MEM_RESERVE) - continue; - /* Copy-on-write pages must be copied to the child to circumvent - a strange notion how copy-on-write is supposed to work. */ - if (rec->priv ()) - { - if (rec->anonymous () && rec->noreserve () - && !VirtualAlloc (address, mbi.RegionSize, - MEM_COMMIT, PAGE_READWRITE)) - { - system_printf ("VirtualAlloc failed for MAP_PRIVATE " - "address %p, %E", address); - return -1; - } - if (mbi.Protect == PAGE_NOACCESS - && !VirtualProtectEx (parent, address, mbi.RegionSize, - PAGE_READONLY, &old_prot)) - { - system_printf ("VirtualProtectEx failed for MAP_PRIVATE " - "address %p, %E", address); - return -1; - } - else if ((mbi.AllocationProtect == PAGE_WRITECOPY - || mbi.AllocationProtect == PAGE_EXECUTE_WRITECOPY) - && (mbi.Protect == PAGE_READWRITE - || mbi.Protect == PAGE_EXECUTE_READWRITE)) - /* A WRITECOPY page which has been written to is set to - READWRITE, but that's an incompatible protection to - set the page to. Convert the protection to WRITECOPY - so that the below VirtualProtect doesn't fail. */ - mbi.Protect <<= 1; - - if (!ReadProcessMemory (parent, address, address, - mbi.RegionSize, NULL)) - { - system_printf ("ReadProcessMemory failed for MAP_PRIVATE " - "address %p, %E", address); - return -1; - } - if (mbi.Protect == PAGE_NOACCESS - && !VirtualProtectEx (parent, address, mbi.RegionSize, - PAGE_NOACCESS, &old_prot)) - { - system_printf ("WARNING: VirtualProtectEx to return to " - "PAGE_NOACCESS state in parent failed for " - "MAP_PRIVATE address %p, %E", address); - return -1; - } - } - /* Set child page protection to parent protection */ - if (!VirtualProtect (address, mbi.RegionSize, - mbi.Protect, &old_prot)) - { - MEMORY_BASIC_INFORMATION m; - VirtualQuery (address, &m, sizeof m); - system_printf ("VirtualProtect failed for " - "address %p, " - "parentstate: 0x%x, " - "state: 0x%x, " - "parentprot: 0x%x, " - "prot: 0x%x, %E", - address, mbi.State, m.State, - mbi.Protect, m.Protect); - return -1; - } - } - } - } - - debug_printf ("succeeded"); - return 0; -} diff --git a/winsup/cygwin/msg.cc b/winsup/cygwin/msg.cc deleted file mode 100644 index 00d13a854..000000000 --- a/winsup/cygwin/msg.cc +++ /dev/null @@ -1,213 +0,0 @@ -/* msg.cc: XSI IPC interface for Cygwin. - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include "cygerrno.h" -#include -#ifdef USE_SERVER -#include -#include - -#include "sigproc.h" -#include "cygtls.h" - -#include "cygserver_ipc.h" -#include "cygserver_msg.h" - -/* - * client_request_msg Constructors - */ - -client_request_msg::client_request_msg (int msqid, - int cmd, - struct msqid_ds *buf) - : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters)) -{ - _parameters.in.msgop = MSGOP_msgctl; - ipc_set_proc_info (_parameters.in.ipcblk); - - _parameters.in.ctlargs.msqid = msqid; - _parameters.in.ctlargs.cmd = cmd; - _parameters.in.ctlargs.buf = buf; - - msglen (sizeof (_parameters.in)); -} - -client_request_msg::client_request_msg (key_t key, - int msgflg) - : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters)) -{ - _parameters.in.msgop = MSGOP_msgget; - ipc_set_proc_info (_parameters.in.ipcblk); - - _parameters.in.getargs.key = key; - _parameters.in.getargs.msgflg = msgflg; - - msglen (sizeof (_parameters.in)); -} - -client_request_msg::client_request_msg (int msqid, - void *msgp, - size_t msgsz, - long msgtyp, - int msgflg) - : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters)) -{ - _parameters.in.msgop = MSGOP_msgrcv; - ipc_set_proc_info (_parameters.in.ipcblk); - - _parameters.in.rcvargs.msqid = msqid; - _parameters.in.rcvargs.msgp = msgp; - _parameters.in.rcvargs.msgsz = msgsz; - _parameters.in.rcvargs.msgtyp = msgtyp; - _parameters.in.rcvargs.msgflg = msgflg; - - msglen (sizeof (_parameters.in)); -} - -client_request_msg::client_request_msg (int msqid, - const void *msgp, - size_t msgsz, - int msgflg) - : client_request (CYGSERVER_REQUEST_MSG, &_parameters, sizeof (_parameters)) -{ - _parameters.in.msgop = MSGOP_msgsnd; - ipc_set_proc_info (_parameters.in.ipcblk); - - _parameters.in.sndargs.msqid = msqid; - _parameters.in.sndargs.msgp = msgp; - _parameters.in.sndargs.msgsz = msgsz; - _parameters.in.sndargs.msgflg = msgflg; - - msglen (sizeof (_parameters.in)); -} -#endif /* USE_SERVER */ - -/* - * XSI message queue API. These are exported by the DLL. - */ - -extern "C" int -msgctl (int msqid, int cmd, struct msqid_ds *buf) -{ -#ifdef USE_SERVER - syscall_printf ("msgctl (msqid = %d, cmd = 0x%x, buf = %p)", - msqid, cmd, buf); - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - switch (cmd) - { - case IPC_STAT: - break; - case IPC_SET: - break; - case IPC_RMID: - break; - case IPC_INFO: - break; - case MSG_INFO: - break; - default: - syscall_printf ("-1 [%d] = msgctl ()", EINVAL); - set_errno (EINVAL); - return -1; - } - client_request_msg request (msqid, cmd, buf); - if (request.make_request () == -1 || request.retval () == -1) - { - syscall_printf ("-1 [%d] = msgctl ()", request.error_code ()); - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return -1; - } - return request.retval (); -#else - set_errno (ENOSYS); - raise (SIGSYS); - return -1; -#endif -} - -extern "C" int -msgget (key_t key, int msgflg) -{ -#ifdef USE_SERVER - syscall_printf ("msgget (key = %U, msgflg = 0x%x)", key, msgflg); - client_request_msg request (key, msgflg); - if (request.make_request () == -1 || request.retval () == -1) - { - syscall_printf ("-1 [%d] = msgget ()", request.error_code ()); - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return -1; - } - return request.retval (); -#else - set_errno (ENOSYS); - raise (SIGSYS); - return -1; -#endif -} - -extern "C" ssize_t -msgrcv (int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg) -{ -#ifdef USE_SERVER - syscall_printf ("msgrcv (msqid = %d, msgp = %p, msgsz = %d, " - "msgtyp = %d, msgflg = 0x%x)", - msqid, msgp, msgsz, msgtyp, msgflg); - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - client_request_msg request (msqid, msgp, msgsz, msgtyp, msgflg); - if (request.make_request () == -1 || request.rcvval () == -1) - { - syscall_printf ("-1 [%d] = msgrcv ()", request.error_code ()); - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return -1; - } - return request.rcvval (); -#else - set_errno (ENOSYS); - raise (SIGSYS); - return -1; -#endif -} - -extern "C" int -msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg) -{ -#ifdef USE_SERVER - syscall_printf ("msgsnd (msqid = %d, msgp = %p, msgsz = %d, msgflg = 0x%x)", - msqid, msgp, msgsz, msgflg); - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - client_request_msg request (msqid, msgp, msgsz, msgflg); - if (request.make_request () == -1 || request.retval () == -1) - { - syscall_printf ("-1 [%d] = msgsnd ()", request.error_code ()); - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return -1; - } - return request.retval (); -#else - set_errno (ENOSYS); - raise (SIGSYS); - return -1; -#endif -} diff --git a/winsup/cygwin/mtinfo.h b/winsup/cygwin/mtinfo.h deleted file mode 100644 index 66e74cc33..000000000 --- a/winsup/cygwin/mtinfo.h +++ /dev/null @@ -1,147 +0,0 @@ -/* mtinfo.h: Defininitions for the Cygwin tape driver class. - - Copyright 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#define MTINFO_MAGIC 0x179b2af0 -#define MTINFO_VERSION 2 - -/* Maximum number of supported partitions per drive. */ -#define MAX_PARTITION_NUM 64 -/* Maximum number of supported drives. */ -#define MAX_DRIVE_NUM 8 - -/* Values for bookkeeping of the tape position relative to filemarks - and eod/eom. */ -enum eom_val -{ - no_eof, - eof_hit, - eof, - eod_hit, - eod, - eom_hit, - eom -}; - -enum dirty_state -{ - clean, - has_read, - has_written, - async_write_pending -}; - -enum lock_state -{ - unlocked, - lock_error, - auto_locked, - locked -}; - -/* Partition specific information */ -class mtinfo_part -{ -public: - long block; /* logical block no */ - long file; /* current file no */ - long fblock; /* relative block no */ - bool smark; /* At setmark? */ - eom_val emark; /* "end-of"-mark */ - - void initialize (long nblock = -1); -}; - -class mtinfo_drive -{ - int drive; - int lasterr; - long partition; - long block; - dirty_state dirty; - lock_state lock; - TAPE_GET_DRIVE_PARAMETERS _dp; - TAPE_GET_MEDIA_PARAMETERS _mp; - OVERLAPPED ov; - struct status_flags - { - unsigned buffer_writes : 1; - unsigned async_writes : 1; - unsigned two_fm : 1; - unsigned fast_eom : 1; - unsigned auto_lock : 1; - unsigned sysv : 1; - unsigned nowait : 1; - } status; - mtinfo_part _part[MAX_PARTITION_NUM]; - - inline int error (const char *str) - { - if (lasterr) - debug_printf ("%s: Win32 error %d", str, lasterr); - return lasterr; - } - inline bool get_feature (DWORD parm) - { - return ((parm & TAPE_DRIVE_HIGH_FEATURES) - ? ((_dp.FeaturesHigh & parm) != 0) - : ((_dp.FeaturesLow & parm) != 0)); - } - int get_pos (HANDLE mt, long *ppartition = NULL, long *pblock = NULL); - int _set_pos (HANDLE mt, int mode, long count, int partition, BOOL dont_wait); - int create_partitions (HANDLE mt, long count); - int set_partition (HANDLE mt, long count); - int write_marks (HANDLE mt, int marktype, DWORD count); - int erase (HANDLE mt, int mode); - int prepare (HANDLE mt, int action, bool is_auto = false); - int set_compression (HANDLE mt, long count); - int set_blocksize (HANDLE mt, long count); - int get_status (HANDLE mt, struct mtget *get); - int set_options (HANDLE mt, long options); - int async_wait (HANDLE mt, DWORD *bytes_written); - -public: - void initialize (int num, bool first_time); - int get_dp (HANDLE mt); - int get_mp (HANDLE mt); - int open (HANDLE mt); - int close (HANDLE mt, bool rewind); - int read (HANDLE mt, HANDLE mt_evt, void *ptr, size_t &ulen); - int write (HANDLE mt, HANDLE mt_evt, const void *ptr, size_t &len); - int ioctl (HANDLE mt, unsigned int cmd, void *buf); - int set_pos (HANDLE mt, int mode, long count, bool sfm_func); - - IMPLEMENT_STATUS_FLAG (bool, buffer_writes) - IMPLEMENT_STATUS_FLAG (bool, async_writes) - IMPLEMENT_STATUS_FLAG (bool, two_fm) - IMPLEMENT_STATUS_FLAG (bool, fast_eom) - IMPLEMENT_STATUS_FLAG (bool, auto_lock) - IMPLEMENT_STATUS_FLAG (bool, sysv) - IMPLEMENT_STATUS_FLAG (bool, nowait) - - PTAPE_GET_DRIVE_PARAMETERS dp () { return &_dp; } - PTAPE_GET_MEDIA_PARAMETERS mp () { return &_mp; } - mtinfo_part *part (int num) { return &_part[num]; } -}; - -class mtinfo -{ - DWORD magic; - DWORD version; - mtinfo_drive _drive[MAX_DRIVE_NUM]; - -public: - void initialize (); - mtinfo_drive *drive (int num) { return &_drive[num]; } -}; - -extern HANDLE mt_h; -extern mtinfo *mt; - -extern void __stdcall mtinfo_init (); diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc deleted file mode 100644 index 91d18fd65..000000000 --- a/winsup/cygwin/net.cc +++ /dev/null @@ -1,2270 +0,0 @@ -/* net.cc: network-related routines. - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* #define DEBUG_NEST_ON 1 */ - -#define __INSIDE_CYGWIN_NET__ - -#include "winsup.h" -#include -#include -#include -#include -#include - -#include -#define gethostname cygwin_gethostname -#include -#undef gethostname -#include -#define USE_SYS_TYPES_FD_SET -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "cygwin/version.h" -#include "perprocess.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "sigproc.h" -#include "pinfo.h" -#include "registry.h" -#include "cygtls.h" - -extern "C" -{ - int h_errno; - - int __stdcall rcmd (char **ahost, unsigned short inport, char *locuser, - char *remuser, char *cmd, SOCKET * fd2p); - int __stdcall rexec (char **ahost, unsigned short inport, char *locuser, - char *password, char *cmd, SOCKET * fd2p); - int sscanf (const char *, const char *, ...); -} /* End of "C" section */ - -static fhandler_socket * -get (const int fd) -{ - cygheap_fdget cfd (fd); - - if (cfd < 0) - return 0; - - fhandler_socket *const fh = cfd->is_socket (); - - if (!fh) - set_errno (ENOTSOCK); - - return fh; -} - -/* htonl: standards? */ -extern "C" unsigned long int -htonl (unsigned long int x) -{ - return ((((x & 0x000000ffU) << 24) | - ((x & 0x0000ff00U) << 8) | - ((x & 0x00ff0000U) >> 8) | - ((x & 0xff000000U) >> 24))); -} - -/* ntohl: standards? */ -extern "C" unsigned long int -ntohl (unsigned long int x) -{ - return htonl (x); -} - -/* htons: standards? */ -extern "C" unsigned short -htons (unsigned short x) -{ - return ((((x & 0x000000ffU) << 8) | - ((x & 0x0000ff00U) >> 8))); -} - -/* ntohs: standards? */ -extern "C" unsigned short -ntohs (unsigned short x) -{ - return htons (x); -} - -/* exported as inet_ntoa: BSD 4.3 */ -extern "C" char * -cygwin_inet_ntoa (struct in_addr in) -{ - char *res = inet_ntoa (in); - - if (_my_tls.locals.ntoa_buf) - { - free (_my_tls.locals.ntoa_buf); - _my_tls.locals.ntoa_buf = NULL; - } - if (res) - _my_tls.locals.ntoa_buf = strdup (res); - return _my_tls.locals.ntoa_buf; -} - -/* exported as inet_addr: BSD 4.3 */ -extern "C" unsigned long -cygwin_inet_addr (const char *cp) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return INADDR_NONE; - unsigned long res = inet_addr (cp); - - return res; -} - -/* exported as inet_aton: BSD 4.3 - inet_aton is not exported by wsock32 and ws2_32, - so it has to be implemented here. */ -extern "C" int -cygwin_inet_aton (const char *cp, struct in_addr *inp) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return 0; - - unsigned long res = inet_addr (cp); - - if (res == INADDR_NONE && strcmp (cp, "255.255.255.255")) - return 0; - if (inp) - inp->s_addr = res; - return 1; -} - -/* undocumented in wsock32.dll */ -extern "C" unsigned int WINAPI inet_network (const char *); - -extern "C" unsigned int -cygwin_inet_network (const char *cp) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return INADDR_NONE; - unsigned int res = inet_network (cp); - - return res; -} - -/* inet_netof is in the standard BSD sockets library. It is useless - for modern networks, since it assumes network values which are no - longer meaningful, but some existing code calls it. */ - -extern "C" unsigned long -inet_netof (struct in_addr in) -{ - unsigned long i, res; - - i = ntohl (in.s_addr); - if (IN_CLASSA (i)) - res = (i & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT; - else if (IN_CLASSB (i)) - res = (i & IN_CLASSB_NET) >> IN_CLASSB_NSHIFT; - else - res = (i & IN_CLASSC_NET) >> IN_CLASSC_NSHIFT; - - - return res; -} - -/* inet_makeaddr is in the standard BSD sockets library. It is - useless for modern networks, since it assumes network values which - are no longer meaningful, but some existing code calls it. */ - -extern "C" struct in_addr -inet_makeaddr (int net, int lna) -{ - unsigned long i; - struct in_addr in; - - if (net < IN_CLASSA_MAX) - i = (net << IN_CLASSA_NSHIFT) | (lna & IN_CLASSA_HOST); - else if (net < IN_CLASSB_MAX) - i = (net << IN_CLASSB_NSHIFT) | (lna & IN_CLASSB_HOST); - else if (net < 0x1000000) - i = (net << IN_CLASSC_NSHIFT) | (lna & IN_CLASSC_HOST); - else - i = net | lna; - - in.s_addr = htonl (i); - - - return in; -} - -struct tl -{ - int w; - const char *s; - int e; -}; - -static NO_COPY struct tl errmap[] = { - {WSAEINTR, "WSAEINTR", EINTR}, - {WSAEWOULDBLOCK, "WSAEWOULDBLOCK", EWOULDBLOCK}, - {WSAEINPROGRESS, "WSAEINPROGRESS", EINPROGRESS}, - {WSAEALREADY, "WSAEALREADY", EALREADY}, - {WSAENOTSOCK, "WSAENOTSOCK", ENOTSOCK}, - {WSAEDESTADDRREQ, "WSAEDESTADDRREQ", EDESTADDRREQ}, - {WSAEMSGSIZE, "WSAEMSGSIZE", EMSGSIZE}, - {WSAEPROTOTYPE, "WSAEPROTOTYPE", EPROTOTYPE}, - {WSAENOPROTOOPT, "WSAENOPROTOOPT", ENOPROTOOPT}, - {WSAEPROTONOSUPPORT, "WSAEPROTONOSUPPORT", EPROTONOSUPPORT}, - {WSAESOCKTNOSUPPORT, "WSAESOCKTNOSUPPORT", ESOCKTNOSUPPORT}, - {WSAEOPNOTSUPP, "WSAEOPNOTSUPP", EOPNOTSUPP}, - {WSAEPFNOSUPPORT, "WSAEPFNOSUPPORT", EPFNOSUPPORT}, - {WSAEAFNOSUPPORT, "WSAEAFNOSUPPORT", EAFNOSUPPORT}, - {WSAEADDRINUSE, "WSAEADDRINUSE", EADDRINUSE}, - {WSAEADDRNOTAVAIL, "WSAEADDRNOTAVAIL", EADDRNOTAVAIL}, - {WSAENETDOWN, "WSAENETDOWN", ENETDOWN}, - {WSAENETUNREACH, "WSAENETUNREACH", ENETUNREACH}, - {WSAENETRESET, "WSAENETRESET", ENETRESET}, - {WSAECONNABORTED, "WSAECONNABORTED", ECONNABORTED}, - {WSAECONNRESET, "WSAECONNRESET", ECONNRESET}, - {WSAENOBUFS, "WSAENOBUFS", ENOBUFS}, - {WSAEISCONN, "WSAEISCONN", EISCONN}, - {WSAENOTCONN, "WSAENOTCONN", ENOTCONN}, - {WSAESHUTDOWN, "WSAESHUTDOWN", ESHUTDOWN}, - {WSAETOOMANYREFS, "WSAETOOMANYREFS", ETOOMANYREFS}, - {WSAETIMEDOUT, "WSAETIMEDOUT", ETIMEDOUT}, - {WSAECONNREFUSED, "WSAECONNREFUSED", ECONNREFUSED}, - {WSAELOOP, "WSAELOOP", ELOOP}, - {WSAENAMETOOLONG, "WSAENAMETOOLONG", ENAMETOOLONG}, - {WSAEHOSTDOWN, "WSAEHOSTDOWN", EHOSTDOWN}, - {WSAEHOSTUNREACH, "WSAEHOSTUNREACH", EHOSTUNREACH}, - {WSAENOTEMPTY, "WSAENOTEMPTY", ENOTEMPTY}, - {WSAEPROCLIM, "WSAEPROCLIM", EPROCLIM}, - {WSAEUSERS, "WSAEUSERS", EUSERS}, - {WSAEDQUOT, "WSAEDQUOT", EDQUOT}, - {WSAESTALE, "WSAESTALE", ESTALE}, - {WSAEREMOTE, "WSAEREMOTE", EREMOTE}, - {WSAEINVAL, "WSAEINVAL", EINVAL}, - {WSAEFAULT, "WSAEFAULT", EFAULT}, - {0, "NOERROR", 0}, - {0, NULL, 0} -}; - -static int -find_winsock_errno (int why) -{ - for (int i = 0; errmap[i].s != NULL; ++i) - if (why == errmap[i].w) - return errmap[i].e; - - return EPERM; -} - -void -__set_winsock_errno (const char *fn, int ln) -{ - DWORD werr = WSAGetLastError (); - int err = find_winsock_errno (werr); - - set_errno (err); - syscall_printf ("%s:%d - winsock error %d -> errno %d", fn, ln, werr, err); -} - -/* - * Since the member `s' isn't used for debug output we can use it - * for the error text returned by herror and hstrerror. - */ -static NO_COPY struct tl host_errmap[] = { - {WSAHOST_NOT_FOUND, "Unknown host", HOST_NOT_FOUND}, - {WSATRY_AGAIN, "Host name lookup failure", TRY_AGAIN}, - {WSANO_RECOVERY, "Unknown server error", NO_RECOVERY}, - {WSANO_DATA, "No address associated with name", NO_DATA}, - {0, NULL, 0} -}; - -static void -set_host_errno () -{ - int i; - - int why = WSAGetLastError (); - - for (i = 0; host_errmap[i].w != 0; ++i) - if (why == host_errmap[i].w) - break; - - if (host_errmap[i].w != 0) - h_errno = host_errmap[i].e; - else - h_errno = NETDB_INTERNAL; -} - -inline int -DWORD_round (int n) -{ - return sizeof (DWORD) * (((n + sizeof (DWORD) - 1)) / sizeof (DWORD)); -} - -inline int -strlen_round (const char *s) -{ - if (!s) - return 0; - return DWORD_round (strlen (s) + 1); -} - -#pragma pack(push,2) -struct pservent -{ - char *s_name; - char **s_aliases; - short s_port; - char *s_proto; -}; -#pragma pack(pop) - -struct unionent -{ - char *name; - char **list; - short port_proto_addrtype; - short h_len; - union - { - char *s_proto; - char **h_addr_list; - }; -}; - -enum struct_type -{ - t_hostent, t_protoent, t_servent -}; - -static const char *entnames[] = {"host", "proto", "serv"}; - -/* Generic "dup a {host,proto,serv}ent structure" function. - This is complicated because we need to be able to free the - structure at any point and we can't rely on the pointer contents - being untouched by callers. So, we allocate a chunk of memory - large enough to hold the structure and all of the stuff it points - to then we copy the source into this new block of memory. - The 'unionent' struct is a union of all of the currently used - *ent structure. */ - -#define dup_ent(old, src, type) __dup_ent ((unionent *&) (_my_tls.locals.old), (unionent *) (src), type) -#ifdef DEBUGGING -static void * -#else -static inline void * -#endif -__dup_ent (unionent *&dst, unionent *src, struct_type type) -{ - if (dst) - debug_printf ("old %sent structure \"%s\" %p\n", entnames[type], - ((unionent *) dst)->name, dst); - - if (!src) - { - set_winsock_errno (); - return NULL; - } - - debug_printf ("duping %sent \"%s\", %p", entnames[type], src->name, src); - - /* Find the size of the raw structure minus any character strings, etc. */ - int sz, struct_sz; - switch (type) - { - case t_protoent: - struct_sz = sizeof (protoent); - break; - case t_servent: - struct_sz = sizeof (servent); - break; - case t_hostent: - struct_sz = sizeof (hostent); - break; - default: - api_fatal ("called with invalid value %d", type); - break; - } - - /* Every *ent begins with a name. Calculate it's length. */ - int namelen = strlen_round (src->name); - sz = struct_sz + namelen; - - char **av; - /* The next field in every *ent is an argv list of "something". - Calculate the number of components and how much space the - character strings will take. */ - int list_len = 0; - for (av = src->list; av && *av; av++) - { - list_len++; - sz += sizeof (char **) + strlen_round (*av); - } - - /* NULL terminate if there actually was a list */ - if (av) - { - sz += sizeof (char **); - list_len++; - } - - /* Do servent/hostent specific processing */ - int protolen = 0; - int addr_list_len = 0; - char *s_proto = NULL; - if (type == t_servent) - { - if (src->s_proto) - { - /* Windows 95 idiocy. Structure is misaligned on Windows 95. - Kludge around this by trying a different pointer alignment. */ - if (!IsBadStringPtr (src->s_proto, INT32_MAX)) - s_proto = src->s_proto; - else if (!IsBadStringPtr (((pservent *) src)->s_proto, INT32_MAX)) - s_proto = ((pservent *) src)->s_proto; - sz += (protolen = strlen_round (s_proto)); - } - } - else if (type == t_hostent) - { - /* Calculate the length and storage used for h_addr_list */ - for (av = src->h_addr_list; av && *av; av++) - { - addr_list_len++; - sz += sizeof (char **) + DWORD_round (src->h_len); - } - if (av) - { - sz += sizeof (char **); - addr_list_len++; - } - } - - /* Allocate the storage needed. Allocate a rounded size to attempt to force - reuse of this buffer so that a poorly-written caller will not be using - a freed buffer. */ - unsigned rsz = 256 * ((sz + 255) / 256); - dst = (unionent *) realloc (dst, rsz); - - /* Hopefully, this worked. */ - if (dst) - { - memset (dst, 0, sz); - /* This field is common to all *ent structures but named differently - in each, of course. */ - dst->port_proto_addrtype = src->port_proto_addrtype; - - char *dp = ((char *) dst) + struct_sz; - if (namelen) - { - /* Copy the name field to dst, using space just beyond the end of - the dst structure. */ - strcpy (dst->name = dp, src->name); - dp += namelen; - } - - /* Copy the 'list' type to dst, using space beyond end of structure - + storage for name. */ - if (src->list) - { - char **dav = dst->list = (char **) dp; - dp += sizeof (char **) * list_len; - for (av = src->list; av && *av; av++) - { - int len = strlen (*av) + 1; - memcpy (*dav++ = dp, *av, len); - dp += DWORD_round (len); - } - } - - /* Do servent/protoent/hostent specific processing. */ - if (type == t_protoent) - debug_printf ("protoent %s %x %x", dst->name, dst->list, dst->port_proto_addrtype); - else if (type == t_servent) - { - if (s_proto) - { - strcpy (dst->s_proto = dp, s_proto); - dp += protolen; - } - } - else if (type == t_hostent) - { - /* Transfer h_len and duplicate contents of h_addr_list, using - memory after 'list' allocation. */ - dst->h_len = src->h_len; - char **dav = dst->h_addr_list = (char **) dp; - dp += sizeof (char **) * addr_list_len; - for (av = src->h_addr_list; av && *av; av++) - { - memcpy (*dav++ = dp, *av, src->h_len); - dp += DWORD_round (src->h_len); - } - } - /* Sanity check that we did our bookkeeping correctly. */ - assert ((dp - (char *) dst) == sz); - } - debug_printf ("duped %sent \"%s\", %p", entnames[type], dst ? dst->name : "", dst); - return dst; -} - -/* exported as getprotobyname: standards? */ -extern "C" struct protoent * -cygwin_getprotobyname (const char *p) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return NULL; - return (protoent *) dup_ent (protoent_buf, getprotobyname (p), t_protoent); -} - -/* exported as getprotobynumber: standards? */ -extern "C" struct protoent * -cygwin_getprotobynumber (int number) -{ - return (protoent *) dup_ent (protoent_buf, getprotobynumber (number), t_protoent); -} - -bool -fdsock (cygheap_fdmanip& fd, const device *dev, SOCKET soc) -{ - if (wincap.has_set_handle_information ()) - { - /* NT systems apparently set sockets to inheritable by default */ - SetHandleInformation ((HANDLE) soc, HANDLE_FLAG_INHERIT, 0); - debug_printf ("reset socket inheritance"); - } - else - debug_printf ("not setting socket inheritance"); - fd = build_fh_dev (*dev); - if (!fd.isopen ()) - return false; - fd->set_io_handle ((HANDLE) soc); - fd->set_flags (O_RDWR | O_BINARY); - fd->uninterruptible_io (true); - cygheap->fdtab.inc_need_fixup_before (); - debug_printf ("fd %d, name '%s', soc %p", (int) fd, dev->name, soc); - return true; -} - -/* exported as socket: standards? */ -extern "C" int -cygwin_socket (int af, int type, int protocol) -{ - int res = -1; - SOCKET soc = 0; - - debug_printf ("socket (%d, %d, %d)", af, type, protocol); - - soc = socket (AF_INET, type, af == AF_LOCAL ? 0 : protocol); - - if (soc == INVALID_SOCKET) - { - set_winsock_errno (); - goto done; - } - - const device *dev; - - if (af == AF_INET) - dev = type == SOCK_STREAM ? tcp_dev : udp_dev; - else - dev = type == SOCK_STREAM ? stream_dev : dgram_dev; - - { - cygheap_fdnew fd; - if (fd < 0 || !fdsock (fd, dev, soc)) - closesocket (soc); - else - { - ((fhandler_socket *) fd)->set_addr_family (af); - ((fhandler_socket *) fd)->set_socket_type (type); - res = fd; - } - } - -done: - syscall_printf ("%d = socket (%d, %d, %d)", res, af, type, protocol); - return res; -} - -/* exported as sendto: standards? */ -extern "C" int -cygwin_sendto (int fd, const void *buf, int len, int flags, - const struct sockaddr *to, int tolen) -{ - int res; - sig_dispatch_pending (); - - fhandler_socket *fh = get (fd); - - myfault efault; - if (efault.faulted (EFAULT) || !fh) - res = -1; - else if ((res = len) != 0) - res = fh->sendto (buf, len, flags, to, tolen); - - syscall_printf ("%d = sendto (%d, %p, %d, %x, %p, %d)", - res, fd, buf, len, flags, to, tolen); - - return res; -} - -/* exported as recvfrom: standards? */ -extern "C" int -cygwin_recvfrom (int fd, void *buf, int len, int flags, - struct sockaddr *from, int *fromlen) -{ - int res; - sig_dispatch_pending (); - - fhandler_socket *fh = get (fd); - - myfault efault; - if (efault.faulted (EFAULT) || !fh) - res = -1; - else if ((res = len) != 0) - res = fh->recvfrom (buf, len, flags, from, fromlen); - - syscall_printf ("%d = recvfrom (%d, %p, %d, %x, %p, %p)", - res, fd, buf, len, flags, from, fromlen); - - return res; -} - -static int -convert_ws1_ip_optname (int optname) -{ - static int ws2_optname[] = - { - 0, - IP_OPTIONS, - IP_MULTICAST_IF, - IP_MULTICAST_TTL, - IP_MULTICAST_LOOP, - IP_ADD_MEMBERSHIP, - IP_DROP_MEMBERSHIP, - IP_TTL, - IP_TOS, - IP_DONTFRAGMENT - }; - return (optname < 1 || optname > _WS1_IP_DONTFRAGMENT) - ? optname - : ws2_optname[optname]; -} - -/* exported as setsockopt: standards? */ -extern "C" int -cygwin_setsockopt (int fd, int level, int optname, const void *optval, - int optlen) -{ - int res; - fhandler_socket *fh = get (fd); - - myfault efault; - if (efault.faulted (EFAULT) || !fh) - res = -1; - else - { - /* Old applications still use the old Winsock1 IPPROTO_IP values. */ - if (level == IPPROTO_IP && CYGWIN_VERSION_CHECK_FOR_USING_WINSOCK1_VALUES) - optname = convert_ws1_ip_optname (optname); - - res = setsockopt (fh->get_socket (), level, optname, - (const char *) optval, optlen); - - if (optlen == 4) - syscall_printf ("setsockopt optval=%x", *(long *) optval); - - if (res) - { - /* KB 248611: - - Windows 2000 and above don't support setting the IP_TOS field - with setsockopt. Additionally, TOS was always (also under 9x - and NT) only implemented for UDP and ICMP, never for TCP. - - The difference is that beginning with Windows 2000 the - setsockopt call returns WinSock error 10022, WSAEINVAL when - trying to set the IP_TOS field, instead of just ignoring the - call. This is *not* explained in KB 248611, but only in KB - 258978. - - Either case, the official workaround is to add a new registry - DWORD value HKLM/System/CurrentControlSet/Services/Tcpip/... - ... Parameters/DisableUserTOSSetting, set to 0, and reboot. - - Sidenote: The reasoning for dropping ToS in Win2K is that ToS - per RFC 1349 is incompatible with DiffServ per RFC 2474/2475. - - We just ignore the return value of setting IP_TOS under Windows - 2000 and above entirely. */ - if (level == IPPROTO_IP && optname == IP_TOS - && WSAGetLastError () == WSAEINVAL - && wincap.has_disabled_user_tos_setting ()) - { - debug_printf ("Faked IP_TOS success"); - res = 0; - } - else - set_winsock_errno (); - } - else if (level == SOL_SOCKET && optname == SO_REUSEADDR) - fh->saw_reuseaddr (*(int *) optval); - } - - syscall_printf ("%d = setsockopt (%d, %d, %x, %p, %d)", - res, fd, level, optname, optval, optlen); - return res; -} - -/* exported as getsockopt: standards? */ -extern "C" int -cygwin_getsockopt (int fd, int level, int optname, void *optval, int *optlen) -{ - int res; - fhandler_socket *fh = get (fd); - - myfault efault; - if (efault.faulted (EFAULT) || !fh) - res = -1; - else if (optname == SO_PEERCRED) - { - struct ucred *cred = (struct ucred *) optval; - res = fh->getpeereid (&cred->pid, &cred->uid, &cred->gid); - } - else - { - /* Old applications still use the old Winsock1 IPPROTO_IP values. */ - if (level == IPPROTO_IP && CYGWIN_VERSION_CHECK_FOR_USING_WINSOCK1_VALUES) - optname = convert_ws1_ip_optname (optname); - res = getsockopt (fh->get_socket (), level, optname, (char *) optval, - (int *) optlen); - - if (optname == SO_ERROR) - { - int *e = (int *) optval; - - debug_printf ("WinSock SO_ERROR = %d", *e); - *e = find_winsock_errno (*e); - } - - if (res) - set_winsock_errno (); - } - - syscall_printf ("%d = getsockopt (%d, %d, 0x%x, %p, %p)", - res, fd, level, optname, optval, optlen); - return res; -} - -extern "C" int -getpeereid (int fd, __uid32_t *euid, __gid32_t *egid) -{ - sig_dispatch_pending (); - fhandler_socket *fh = get (fd); - if (fh) - return fh->getpeereid (NULL, euid, egid); - return -1; -} - -/* exported as connect: standards? */ -extern "C" int -cygwin_connect (int fd, const struct sockaddr *name, int namelen) -{ - int res; - sig_dispatch_pending (); - - fhandler_socket *fh = get (fd); - - myfault efault; - if (efault.faulted (EFAULT) || !fh) - res = -1; - else - res = fh->connect (name, namelen); - - syscall_printf ("%d = connect (%d, %p, %d)", res, fd, name, namelen); - - return res; -} - -/* exported as getservbyname: standards? */ -extern "C" struct servent * -cygwin_getservbyname (const char *name, const char *proto) -{ - sig_dispatch_pending (); - myfault efault; - if (efault.faulted (EFAULT)) - return NULL; - - servent *res = (servent *) dup_ent (servent_buf, getservbyname (name, proto), t_servent); - syscall_printf ("%p = getservbyname (%s, %s)", res, name, proto); - return res; -} - -/* exported as getservbyport: standards? */ -extern "C" struct servent * -cygwin_getservbyport (int port, const char *proto) -{ - sig_dispatch_pending (); - myfault efault; - if (efault.faulted (EFAULT)) - return NULL; - - servent *res = (servent *) dup_ent (servent_buf, getservbyport (port, proto), t_servent); - syscall_printf ("%p = getservbyport (%d, %s)", _my_tls.locals.servent_buf, port, proto); - return res; -} - -extern "C" int -cygwin_gethostname (char *name, size_t len) -{ - sig_dispatch_pending (); - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - if (gethostname (name, len)) - { - DWORD local_len = len; - - if (!GetComputerNameA (name, &local_len)) - { - set_winsock_errno (); - return -1; - } - } - debug_printf ("name %s", name); - return 0; -} - -/* exported as gethostbyname: standards? */ -extern "C" struct hostent * -cygwin_gethostbyname (const char *name) -{ - sig_dispatch_pending (); - myfault efault; - if (efault.faulted (EFAULT)) - return NULL; - - unsigned char tmp_addr[4]; - struct hostent tmp, *h; - char *tmp_aliases[1] = {0}; - char *tmp_addr_list[2] = {0,0}; - unsigned int a, b, c, d; - char dummy; - - if (sscanf (name, "%u.%u.%u.%u%c", &a, &b, &c, &d, &dummy) != 4 - || a >= 256 || b >= 256 || c >= 256 || d >= 256) - h = gethostbyname (name); - else - { - /* In case you don't have DNS, at least x.x.x.x still works */ - memset (&tmp, 0, sizeof (tmp)); - tmp_addr[0] = a; - tmp_addr[1] = b; - tmp_addr[2] = c; - tmp_addr[3] = d; - tmp_addr_list[0] = (char *) tmp_addr; - tmp.h_name = name; - tmp.h_aliases = tmp_aliases; - tmp.h_addrtype = 2; - tmp.h_length = 4; - tmp.h_addr_list = tmp_addr_list; - h = &tmp; - } - - hostent *res = (hostent *) dup_ent (hostent_buf, h, t_hostent); - if (res) - debug_printf ("h_name %s", res->h_name); - else - { - debug_printf ("dup_ent returned NULL for name %s, h %p", name, h); - set_host_errno (); - } - return res; -} - -/* exported as gethostbyaddr: standards? */ -extern "C" struct hostent * -cygwin_gethostbyaddr (const char *addr, int len, int type) -{ - sig_dispatch_pending (); - myfault efault; - if (efault.faulted (EFAULT)) - return NULL; - - hostent *res = (hostent *) dup_ent (hostent_buf, gethostbyaddr (addr, len, type), t_hostent); - if (res) - debug_printf ("h_name %s", _my_tls.locals.hostent_buf->h_name); - else - set_host_errno (); - return res; -} - -/* exported as accept: standards? */ -extern "C" int -cygwin_accept (int fd, struct sockaddr *peer, int *len) -{ - int res; - sig_dispatch_pending (); - - fhandler_socket *fh = get (fd); - - myfault efault; - if (efault.faulted (EFAULT) || !fh) - res = -1; - else - res = fh->accept (peer, len); - - syscall_printf ("%d = accept (%d, %p, %p)", res, fd, peer, len); - return res; -} - -/* exported as bind: standards? */ -extern "C" int -cygwin_bind (int fd, const struct sockaddr *my_addr, int addrlen) -{ - int res; - sig_dispatch_pending (); - fhandler_socket *fh = get (fd); - - myfault efault; - if (efault.faulted (EFAULT) || !fh) - res = -1; - else - res = fh->bind (my_addr, addrlen); - - syscall_printf ("%d = bind (%d, %p, %d)", res, fd, my_addr, addrlen); - return res; -} - -/* exported as getsockname: standards? */ -extern "C" int -cygwin_getsockname (int fd, struct sockaddr *addr, int *namelen) -{ - int res; - sig_dispatch_pending (); - - fhandler_socket *fh = get (fd); - - myfault efault; - if (efault.faulted (EFAULT) || !fh) - res = -1; - else - res = fh->getsockname (addr, namelen); - - syscall_printf ("%d = getsockname (%d, %p, %p)", res, fd, addr, namelen); - return res; -} - -/* exported as listen: standards? */ -extern "C" int -cygwin_listen (int fd, int backlog) -{ - int res; - sig_dispatch_pending (); - fhandler_socket *fh = get (fd); - - if (!fh) - res = -1; - else - res = fh->listen (backlog); - - syscall_printf ("%d = listen (%d, %d)", res, fd, backlog); - return res; -} - -/* exported as shutdown: standards? */ -extern "C" int -cygwin_shutdown (int fd, int how) -{ - int res; - sig_dispatch_pending (); - - fhandler_socket *fh = get (fd); - - if (!fh) - res = -1; - else - res = fh->shutdown (how); - - syscall_printf ("%d = shutdown (%d, %d)", res, fd, how); - return res; -} - -/* exported as hstrerror: BSD 4.3 */ -extern "C" const char * -cygwin_hstrerror (int err) -{ - int i; - - for (i = 0; host_errmap[i].e != 0; ++i) - if (err == host_errmap[i].e) - break; - - return host_errmap[i].s; -} - -/* exported as herror: BSD 4.3 */ -extern "C" void -cygwin_herror (const char *s) -{ - myfault efault; - if (efault.faulted ()) - return; - if (cygheap->fdtab.not_open (2)) - return; - - if (s) - { - write (2, s, strlen (s)); - write (2, ": ", 2); - } - - const char *h_errstr = cygwin_hstrerror (h_errno); - - if (!h_errstr) - switch (h_errno) - { - case NETDB_INTERNAL: - h_errstr = "Resolver internal error"; - break; - case NETDB_SUCCESS: - h_errstr = "Resolver error 0 (no error)"; - break; - default: - h_errstr = "Unknown resolver error"; - break; - } - write (2, h_errstr, strlen (h_errstr)); - write (2, "\n", 1); -} - -/* exported as getpeername: standards? */ -extern "C" int -cygwin_getpeername (int fd, struct sockaddr *name, int *len) -{ - int res; - sig_dispatch_pending (); - - fhandler_socket *fh = get (fd); - - myfault efault; - if (efault.faulted (EFAULT) || !fh) - res = -1; - else - res = fh->getpeername (name, len); - - syscall_printf ("%d = getpeername (%d) %d", res, fd, (fh ? fh->get_socket () : -1)); - return res; -} - -/* exported as recv: standards? */ -extern "C" int -cygwin_recv (int fd, void *buf, int len, int flags) -{ - return cygwin_recvfrom (fd, buf, len, flags, NULL, NULL); -} - -/* exported as send: standards? */ -extern "C" int -cygwin_send (int fd, const void *buf, int len, int flags) -{ - return cygwin_sendto (fd, buf, len, flags, NULL, 0); -} - -/* getdomainname: standards? */ -extern "C" int -getdomainname (char *domain, size_t len) -{ - /* - * This works for Win95 only if the machine is configured to use MS-TCP. - * If a third-party TCP is being used this will fail. - * FIXME: On Win95, is there a way to portably check the TCP stack - * in use and include paths for the Domain name in each ? - * Punt for now and assume MS-TCP on Win95. - */ - sig_dispatch_pending (); - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - PFIXED_INFO info = NULL; - ULONG size = 0; - - if (GetNetworkParams(info, &size) == ERROR_BUFFER_OVERFLOW - && (info = (PFIXED_INFO) alloca(size)) - && GetNetworkParams(info, &size) == ERROR_SUCCESS) - { - strncpy(domain, info->DomainName, len); - return 0; - } - - /* This is only used by Win95 and NT <= 4.0. - The registry names are language independent. - FIXME: Handle DHCP on Win95. The DhcpDomain(s) may be available - in ..VxD\DHCP\DhcpInfoXX\OptionInfo, RFC 1533 format */ - - reg_key r (HKEY_LOCAL_MACHINE, KEY_READ, - (!wincap.is_winnt ()) ? "System" : "SYSTEM", - "CurrentControlSet", "Services", - (!wincap.is_winnt ()) ? "VxD" : "Tcpip", - (!wincap.is_winnt ()) ? "MSTCP" : "Parameters", NULL); - - if (!r.error ()) - { - int res1, res2 = 0; /* Suppress compiler warning */ - res1 = r.get_string ("Domain", domain, len, ""); - if (res1 != ERROR_SUCCESS || !domain[0]) - res2 = r.get_string ("DhcpDomain", domain, len, ""); - if (res1 == ERROR_SUCCESS || res2 == ERROR_SUCCESS) - return 0; - } - __seterrno (); - return -1; -} - -/* Fill out an ifconf struct. */ - -/* - * IFCONF 98/ME, NTSP4, W2K: - * Use IP Helper Library - */ -static void -get_2k_ifconf (struct ifconf *ifc, int what) -{ - int cnt = 0; - int ethId = 0, pppId = 0, slpId = 0, tokId = 0; - - /* Union maps buffer to correct struct */ - struct ifreq *ifr = ifc->ifc_req; - - DWORD ip_cnt, lip, lnp; - DWORD siz_ip_table = 0; - PMIB_IPADDRTABLE ipt; - PMIB_IFROW ifrow; - struct sockaddr_in *sa = NULL; - struct sockaddr *so = NULL; - - typedef struct ifcount_t - { - DWORD ifIndex; - size_t count; - unsigned int enumerated; // for eth0:1 - unsigned int classId; // for eth0, tok0 ... - - }; - ifcount_t *iflist, *ifEntry; - - if (GetIpAddrTable (NULL, &siz_ip_table, TRUE) == ERROR_INSUFFICIENT_BUFFER - && (ifrow = (PMIB_IFROW) alloca (sizeof (MIB_IFROW))) - && (ipt = (PMIB_IPADDRTABLE) alloca (siz_ip_table)) - && !GetIpAddrTable (ipt, &siz_ip_table, TRUE)) - { - iflist = - (ifcount_t *) alloca (sizeof (ifcount_t) * (ipt->dwNumEntries + 1)); - memset (iflist, 0, sizeof (ifcount_t) * (ipt->dwNumEntries + 1)); - for (ip_cnt = 0; ip_cnt < ipt->dwNumEntries; ++ip_cnt) - { - ifEntry = iflist; - /* search for matching entry (and stop at first free entry) */ - while (ifEntry->count != 0) - { - if (ifEntry->ifIndex == ipt->table[ip_cnt].dwIndex) - break; - ifEntry++; - } - if (ifEntry->count == 0) - { - ifEntry->count = 1; - ifEntry->ifIndex = ipt->table[ip_cnt].dwIndex; - } - else - { - ifEntry->count++; - } - } - // reset the last element. This is just the stopper for the loop. - iflist[ipt->dwNumEntries].count = 0; - - /* Iterate over all configured IP-addresses */ - for (ip_cnt = 0; ip_cnt < ipt->dwNumEntries; ++ip_cnt) - { - memset (ifrow, 0, sizeof (MIB_IFROW)); - ifrow->dwIndex = ipt->table[ip_cnt].dwIndex; - if (GetIfEntry (ifrow) != NO_ERROR) - continue; - - ifcount_t *ifEntry = iflist; - - /* search for matching entry (and stop at first free entry) */ - while (ifEntry->count != 0) - { - if (ifEntry->ifIndex == ipt->table[ip_cnt].dwIndex) - break; - ifEntry++; - } - - /* Setup the interface name */ - switch (ifrow->dwType) - { - case MIB_IF_TYPE_TOKENRING: - if (ifEntry->enumerated == 0) - { - ifEntry->classId = tokId++; - __small_sprintf (ifr->ifr_name, "tok%u", - ifEntry->classId); - } - else - { - __small_sprintf (ifr->ifr_name, "tok%u:%u", - ifEntry->classId, - ifEntry->enumerated - 1); - } - ifEntry->enumerated++; - break; - case MIB_IF_TYPE_ETHERNET: - if (ifEntry->enumerated == 0) - { - ifEntry->classId = ethId++; - __small_sprintf (ifr->ifr_name, "eth%u", - ifEntry->classId); - } - else - { - __small_sprintf (ifr->ifr_name, "eth%u:%u", - ifEntry->classId, - ifEntry->enumerated - 1); - } - ifEntry->enumerated++; - break; - case MIB_IF_TYPE_PPP: - if (ifEntry->enumerated == 0) - { - ifEntry->classId = pppId++; - __small_sprintf (ifr->ifr_name, "ppp%u", - ifEntry->classId); - } - else - { - __small_sprintf (ifr->ifr_name, "ppp%u:%u", - ifEntry->classId, - ifEntry->enumerated - 1); - } - ifEntry->enumerated++; - break; - case MIB_IF_TYPE_SLIP: - if (ifEntry->enumerated == 0) - { - ifEntry->classId = slpId++; - __small_sprintf (ifr->ifr_name, "slp%u", - ifEntry->classId); - } - else - { - __small_sprintf (ifr->ifr_name, "slp%u:%u", - ifEntry->classId, - ifEntry->enumerated - 1); - } - ifEntry->enumerated++; - break; - case MIB_IF_TYPE_LOOPBACK: - strcpy (ifr->ifr_name, "lo"); - break; - default: - continue; - } - /* setup sockaddr struct */ - switch (what) - { - case SIOCGIFCONF: - case SIOCGIFADDR: - sa = (struct sockaddr_in *) &ifr->ifr_addr; - sa->sin_addr.s_addr = ipt->table[ip_cnt].dwAddr; - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFBRDADDR: - sa = (struct sockaddr_in *) &ifr->ifr_broadaddr; -#if 0 - /* Unfortunately, the field returns only crap. */ - sa->sin_addr.s_addr = ipt->table[ip_cnt].dwBCastAddr; -#else - lip = ipt->table[ip_cnt].dwAddr; - lnp = ipt->table[ip_cnt].dwMask; - sa->sin_addr.s_addr = lip & lnp | ~lnp; - sa->sin_family = AF_INET; - sa->sin_port = 0; -#endif - break; - case SIOCGIFNETMASK: - sa = (struct sockaddr_in *) &ifr->ifr_netmask; - sa->sin_addr.s_addr = ipt->table[ip_cnt].dwMask; - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFHWADDR: - so = &ifr->ifr_hwaddr; - for (UINT i = 0; i < IFHWADDRLEN; ++i) - if (i >= ifrow->dwPhysAddrLen) - so->sa_data[i] = '\0'; - else - so->sa_data[i] = ifrow->bPhysAddr[i]; - so->sa_family = AF_INET; - break; - case SIOCGIFMETRIC: - ifr->ifr_metric = 1; - break; - case SIOCGIFMTU: - ifr->ifr_mtu = ifrow->dwMtu; - break; - } - ++cnt; - if ((caddr_t)++ ifr > - ifc->ifc_buf + ifc->ifc_len - sizeof (struct ifreq)) - goto done; - } - } - -done: - /* Set the correct length */ - ifc->ifc_len = cnt * sizeof (struct ifreq); -} - -/* - * IFCONF Windows NT < SP4: - * Look at the Bind value in - * HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Linkage\ - * This is a REG_MULTI_SZ with strings of the form: - * \Device\, where netcard is the name of the net device. - * Then look under: - * HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\\ - * Parameters\Tcpip - * at the IPAddress, Subnetmask and DefaultGateway values for the - * required values. - */ -static void -get_nt_ifconf (struct ifconf *ifc, int what) -{ - HKEY key; - unsigned long lip, lnp; - struct sockaddr_in *sa = NULL; - struct sockaddr *so = NULL; - DWORD size; - int cnt = 1; - char *binding = (char *) 0; - - /* Union maps buffer to correct struct */ - struct ifreq *ifr = ifc->ifc_req; - - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, - "SYSTEM\\" - "CurrentControlSet\\" - "Services\\" - "Tcpip\\" "Linkage", - 0, KEY_READ, &key) == ERROR_SUCCESS) - { - if (RegQueryValueEx (key, "Bind", - NULL, NULL, - NULL, &size) == ERROR_SUCCESS) - { - binding = (char *) alloca (size); - if (RegQueryValueEx (key, "Bind", - NULL, NULL, - (unsigned char *) binding, - &size) != ERROR_SUCCESS) - { - binding = NULL; - } - } - RegCloseKey (key); - } - - if (binding) - { - char *bp, eth[2] = "/"; - char cardkey[256], ipaddress[256], netmask[256]; - - for (bp = binding; *bp; bp += strlen (bp) + 1) - { - bp += strlen ("\\Device\\"); - strcpy (cardkey, "SYSTEM\\CurrentControlSet\\Services\\"); - strcat (cardkey, bp); - strcat (cardkey, "\\Parameters\\Tcpip"); - - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, cardkey, - 0, KEY_READ, &key) != ERROR_SUCCESS) - continue; - - if (RegQueryValueEx (key, "IPAddress", - NULL, NULL, - (unsigned char *) ipaddress, - (size = 256, &size)) == ERROR_SUCCESS - && RegQueryValueEx (key, "SubnetMask", - NULL, NULL, - (unsigned char *) netmask, - (size = 256, &size)) == ERROR_SUCCESS) - { - char *ip, *np; - char dhcpaddress[256], dhcpnetmask[256]; - - for (ip = ipaddress, np = netmask; - *ip && *np; - ip += strlen (ip) + 1, np += strlen (np) + 1) - { - if ((caddr_t)++ ifr > ifc->ifc_buf - + ifc->ifc_len - sizeof (struct ifreq)) - break; - - if (!strncmp (bp, "NdisWan", 7)) - { - strcpy (ifr->ifr_name, "ppp"); - strcat (ifr->ifr_name, bp + 7); - } - else - { - ++*eth; - strcpy (ifr->ifr_name, "eth"); - strcat (ifr->ifr_name, eth); - } - memset (&ifr->ifr_addr, '\0', sizeof ifr->ifr_addr); - if (cygwin_inet_addr (ip) == 0L - && RegQueryValueEx (key, "DhcpIPAddress", - NULL, NULL, - (unsigned char *) dhcpaddress, - (size = 256, &size)) - == ERROR_SUCCESS - && RegQueryValueEx (key, "DhcpSubnetMask", - NULL, NULL, - (unsigned char *) dhcpnetmask, - (size = 256, &size)) - == ERROR_SUCCESS) - { - switch (what) - { - case SIOCGIFCONF: - case SIOCGIFADDR: - sa = (struct sockaddr_in *) &ifr->ifr_addr; - sa->sin_addr.s_addr = - cygwin_inet_addr (dhcpaddress); - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFBRDADDR: - lip = cygwin_inet_addr (dhcpaddress); - lnp = cygwin_inet_addr (dhcpnetmask); - sa = (struct sockaddr_in *) &ifr->ifr_broadaddr; - sa->sin_addr.s_addr = lip & lnp | ~lnp; - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFNETMASK: - sa = (struct sockaddr_in *) &ifr->ifr_netmask; - sa->sin_addr.s_addr = - cygwin_inet_addr (dhcpnetmask); - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFHWADDR: - so = &ifr->ifr_hwaddr; - memset (so->sa_data, 0, IFHWADDRLEN); - so->sa_family = AF_INET; - break; - case SIOCGIFMETRIC: - ifr->ifr_metric = 1; - break; - case SIOCGIFMTU: - ifr->ifr_mtu = 1500; - break; - } - } - else - { - switch (what) - { - case SIOCGIFCONF: - case SIOCGIFADDR: - sa = (struct sockaddr_in *) &ifr->ifr_addr; - sa->sin_addr.s_addr = cygwin_inet_addr (ip); - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFBRDADDR: - lip = cygwin_inet_addr (ip); - lnp = cygwin_inet_addr (np); - sa = (struct sockaddr_in *) &ifr->ifr_broadaddr; - sa->sin_addr.s_addr = lip & lnp | ~lnp; - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFNETMASK: - sa = (struct sockaddr_in *) &ifr->ifr_netmask; - sa->sin_addr.s_addr = cygwin_inet_addr (np); - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFHWADDR: - so = &ifr->ifr_hwaddr; - memset (so->sa_data, 0, IFHWADDRLEN); - so->sa_family = AF_INET; - break; - case SIOCGIFMETRIC: - ifr->ifr_metric = 1; - break; - case SIOCGIFMTU: - ifr->ifr_mtu = 1500; - break; - } - } - ++cnt; - } - } - RegCloseKey (key); - } - } - - /* Set the correct length */ - ifc->ifc_len = cnt * sizeof (struct ifreq); -} - -/* - * IFCONF Windows 95: - * HKLM/Enum/Network/MSTCP/"*" - * -> Value "Driver" enthält Subkey relativ zu - * HKLM/System/CurrentControlSet/Class/ - * -> In Subkey "Bindings" die Values aufzählen - * -> Enthält Subkeys der Form "VREDIR\*" - * Das * ist ein Subkey relativ zu - * HKLM/System/CurrentControlSet/Class/Net/ - * HKLM/System/CurrentControlSet/Class/"Driver" - * -> Value "IPAddress" - * -> Value "IPMask" - * HKLM/System/CurrentControlSet/Class/Net/"*"(aus "VREDIR\*") - * -> Wenn Value "AdapterName" == "MS$PPP" -> ppp interface - * -> Value "DriverDesc" enthält den Namen - * - */ -static void -get_95_ifconf (struct ifconf *ifc, int what) -{ - HKEY key; - unsigned long lip, lnp; - struct sockaddr_in *sa = NULL; - struct sockaddr *so = NULL; - FILETIME update; - LONG res; - DWORD size; - int cnt = 1; - char ifname[256]; - char eth[2] = "/"; - char ppp[2] = "/"; - - /* Union maps buffer to correct struct */ - struct ifreq *ifr = ifc->ifc_req; - - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, "Enum\\Network\\MSTCP", - 0, KEY_READ, &key) != ERROR_SUCCESS) - { - /* Set the correct length */ - ifc->ifc_len = cnt * sizeof (struct ifreq); - return; - } - - for (int i = 0; - (res = RegEnumKeyEx (key, i, ifname, - (size = sizeof ifname, &size), - 0, 0, 0, &update)) != ERROR_NO_MORE_ITEMS; - ++i) - { - HKEY ifkey, subkey; - char driver[256], classname[256], netname[256]; - char adapter[256], ip[256], np[256]; - - if (res != ERROR_SUCCESS - || RegOpenKeyEx (key, ifname, 0, KEY_READ, &ifkey) != ERROR_SUCCESS) - continue; - - if (RegQueryValueEx (ifkey, "Driver", 0, - NULL, (unsigned char *) driver, - (size = sizeof driver, &size)) != ERROR_SUCCESS) - { - RegCloseKey (ifkey); - continue; - } - - strcpy (classname, "System\\CurrentControlSet\\Services\\Class\\"); - strcat (classname, driver); - if ((res = RegOpenKeyEx (HKEY_LOCAL_MACHINE, classname, - 0, KEY_READ, &subkey)) != ERROR_SUCCESS) - { - RegCloseKey (ifkey); - continue; - } - - if (RegQueryValueEx (subkey, "IPAddress", 0, - NULL, (unsigned char *) ip, - (size = sizeof ip, &size)) == ERROR_SUCCESS - && RegQueryValueEx (subkey, "IPMask", 0, - NULL, (unsigned char *) np, - (size = sizeof np, &size)) == ERROR_SUCCESS) - { - if ((caddr_t)++ ifr > ifc->ifc_buf - + ifc->ifc_len - sizeof (struct ifreq)) - goto out; - - switch (what) - { - case SIOCGIFCONF: - case SIOCGIFADDR: - sa = (struct sockaddr_in *) &ifr->ifr_addr; - sa->sin_addr.s_addr = cygwin_inet_addr (ip); - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFBRDADDR: - lip = cygwin_inet_addr (ip); - lnp = cygwin_inet_addr (np); - sa = (struct sockaddr_in *) &ifr->ifr_broadaddr; - sa->sin_addr.s_addr = lip & lnp | ~lnp; - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFNETMASK: - sa = (struct sockaddr_in *) &ifr->ifr_netmask; - sa->sin_addr.s_addr = cygwin_inet_addr (np); - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFHWADDR: - so = &ifr->ifr_hwaddr; - memset (so->sa_data, 0, IFHWADDRLEN); - so->sa_family = AF_INET; - break; - case SIOCGIFMETRIC: - ifr->ifr_metric = 1; - break; - case SIOCGIFMTU: - ifr->ifr_mtu = 1500; - break; - } - } - - RegCloseKey (subkey); - - strcpy (netname, "System\\CurrentControlSet\\Services\\Class\\Net\\"); - strcat (netname, ifname); - - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, netname, - 0, KEY_READ, &subkey) != ERROR_SUCCESS) - { - RegCloseKey (ifkey); - --ifr; - continue; - } - - if (RegQueryValueEx (subkey, "AdapterName", 0, - NULL, (unsigned char *) adapter, - (size = sizeof adapter, &size)) == ERROR_SUCCESS - && strcasematch (adapter, "MS$PPP")) - { - ++*ppp; - strcpy (ifr->ifr_name, "ppp"); - strcat (ifr->ifr_name, ppp); - } - else - { - ++*eth; - strcpy (ifr->ifr_name, "eth"); - strcat (ifr->ifr_name, eth); - } - - RegCloseKey (subkey); - RegCloseKey (ifkey); - - ++cnt; - } - -out: - - RegCloseKey (key); - - /* Set the correct length */ - ifc->ifc_len = cnt * sizeof (struct ifreq); -} - -int -get_ifconf (struct ifconf *ifc, int what) -{ - unsigned long lip, lnp; - struct sockaddr_in *sa; - - sig_dispatch_pending (); - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - /* Union maps buffer to correct struct */ - struct ifreq *ifr = ifc->ifc_req; - - /* Ensure we have space for two struct ifreqs, fail if not. */ - if (ifc->ifc_len < (int) (2 * sizeof (struct ifreq))) - { - set_errno (EFAULT); - return -1; - } - - /* Set up interface lo0 first */ - strcpy (ifr->ifr_name, "lo"); - memset (&ifr->ifr_addr, '\0', sizeof (ifr->ifr_addr)); - switch (what) - { - case SIOCGIFCONF: - case SIOCGIFADDR: - sa = (struct sockaddr_in *) &ifr->ifr_addr; - sa->sin_addr.s_addr = htonl (INADDR_LOOPBACK); - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFBRDADDR: - lip = htonl (INADDR_LOOPBACK); - lnp = cygwin_inet_addr ("255.0.0.0"); - sa = (struct sockaddr_in *) &ifr->ifr_broadaddr; - sa->sin_addr.s_addr = lip & lnp | ~lnp; - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFNETMASK: - sa = (struct sockaddr_in *) &ifr->ifr_netmask; - sa->sin_addr.s_addr = cygwin_inet_addr ("255.0.0.0"); - sa->sin_family = AF_INET; - sa->sin_port = 0; - break; - case SIOCGIFHWADDR: - ifr->ifr_hwaddr.sa_family = AF_INET; - memset (ifr->ifr_hwaddr.sa_data, 0, IFHWADDRLEN); - break; - case SIOCGIFMETRIC: - ifr->ifr_metric = 1; - break; - case SIOCGIFMTU: - /* This funny value is returned by `ifconfig lo' on Linux 2.2 kernel. */ - ifr->ifr_mtu = 3924; - break; - default: - set_errno (EINVAL); - return -1; - } - - if (wincap.has_ip_helper_lib ()) - get_2k_ifconf (ifc, what); - else if (wincap.is_winnt ()) - get_nt_ifconf (ifc, what); - else - get_95_ifconf (ifc, what); - return 0; -} - -/* exported as rcmd: standards? */ -extern "C" int -cygwin_rcmd (char **ahost, unsigned short inport, char *locuser, - char *remuser, char *cmd, int *fd2p) -{ - int res = -1; - SOCKET fd2s; - - sig_dispatch_pending (); - - myfault efault; - if (efault.faulted (EFAULT)) - return (int) INVALID_SOCKET; - if (!*locuser) - { - set_errno (EINVAL); - return (int) INVALID_SOCKET; - } - - res = rcmd (ahost, inport, locuser, remuser, cmd, fd2p ? &fd2s : NULL); - if (res != (int) INVALID_SOCKET) - { - cygheap_fdnew res_fd; - - if (res_fd >= 0 && fdsock (res_fd, tcp_dev, res)) - { - ((fhandler_socket *) res_fd)->connect_state (connected); - res = res_fd; - } - else - { - closesocket (res); - res = -1; - } - - if (res >= 0 && fd2p) - { - cygheap_fdnew newfd (res_fd, false); - cygheap_fdget fd (*fd2p); - - if (newfd >= 0 && fdsock (newfd, tcp_dev, fd2s)) - { - *fd2p = newfd; - ((fhandler_socket *) fd2p)->connect_state (connected); - } - else - { - closesocket (res); - closesocket (fd2s); - res = -1; - } - } - } - - syscall_printf ("%d = rcmd (...)", res); - return res; -} - -/* The below implementation of rresvport looks pretty ugly, but there's - a problem in Winsock. The bind(2) call does not fail if a local - address is still in TIME_WAIT state, and there's no way to get this - behaviour. Unfortunately the first time when this is detected is when - the calling application tries to connect. - - One (also not really foolproof) way around this problem would be to use - the iphlpapi function GetTcpTable and to check if the port in question is - in TIME_WAIT state and if so, choose another port number. But this method - is as prone to races as the below one, or any other method using random - port numbers, etc. The below method at least tries to avoid races between - multiple applications using rrecvport. - - As for the question "why don't you just use the Winsock rresvport?"... - For some reason I do NOT understand, the call to WinSocks rresvport - corrupts the stack when Cygwin is built using -fomit-frame-pointers. - And then again, the Winsock rresvport function has the exact same - problem with reusing ports in the TIME_WAIT state as the socket/bind - method has. So there's no gain in using that function. */ - -#define PORT_LOW (IPPORT_EFSSERVER + 1) -#define PORT_HIGH (IPPORT_RESERVED - 1) -#define NUM_PORTS (PORT_HIGH - PORT_LOW + 1) - -LONG last_used_rrecvport __attribute__((section (".cygwin_dll_common"), shared)) = IPPORT_RESERVED; - -/* exported as rresvport: standards? */ -extern "C" int -cygwin_rresvport (int *port) -{ - int res; - sig_dispatch_pending (); - - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - res = socket (AF_INET, SOCK_STREAM, 0); - if (res != (int) INVALID_SOCKET) - { - LONG myport; - int ret = SOCKET_ERROR; - struct sockaddr_in sin; - sin.sin_family = AF_INET; - sin.sin_addr.s_addr = INADDR_ANY; - - for (int i = 0; i < NUM_PORTS; i++) - { - while ((myport = InterlockedExchange (&last_used_rrecvport, 0)) == 0) - low_priority_sleep (0); - if (--myport < PORT_LOW) - myport = PORT_HIGH; - InterlockedExchange (&last_used_rrecvport, myport); - - sin.sin_port = htons (myport); - if (!(ret = bind (res, (struct sockaddr *) &sin, sizeof sin))) - break; - int err = WSAGetLastError (); - if (err != WSAEADDRINUSE && err != WSAEINVAL) - break; - } - if (ret == SOCKET_ERROR) - { - closesocket (res); - res = (int) INVALID_SOCKET; - } - else if (port) - *port = myport; - } - - if (res != (int) INVALID_SOCKET) - { - cygheap_fdnew res_fd; - - if (res_fd >= 0 && fdsock (res_fd, tcp_dev, res)) - res = res_fd; - else - res = -1; - } - - syscall_printf ("%d = rresvport (%d)", res, port ? *port : 0); - return res; -} - -/* exported as rexec: standards? */ -extern "C" int -cygwin_rexec (char **ahost, unsigned short inport, char *locuser, - char *password, char *cmd, int *fd2p) -{ - int res = -1; - SOCKET fd2s; - sig_dispatch_pending (); - - myfault efault; - if (efault.faulted (EFAULT)) - return (int) INVALID_SOCKET; - - res = rexec (ahost, inport, locuser, password, cmd, fd2p ? &fd2s : NULL); - if (res != (int) INVALID_SOCKET) - { - cygheap_fdnew res_fd; - - if (res_fd >= 0 && fdsock (res_fd, tcp_dev, res)) - { - ((fhandler_socket *) res_fd)->connect_state (connected); - res = res_fd; - } - else - { - closesocket (res); - res = -1; - } - - if (res >= 0 && fd2p) - { - cygheap_fdnew newfd (res_fd, false); - cygheap_fdget fd (*fd2p); - - if (newfd >= 0 && fdsock (newfd, tcp_dev, fd2s)) - { - ((fhandler_socket *) fd2p)->connect_state (connected); - *fd2p = newfd; - } - else - { - closesocket (res); - closesocket (fd2s); - res = -1; - } - } - } - - syscall_printf ("%d = rexec (...)", res); - return res; -} - -/* socketpair: standards? */ -/* Win32 supports AF_INET only, so ignore domain and protocol arguments */ -extern "C" int -socketpair (int family, int type, int protocol, int *sb) -{ - int res = -1; - SOCKET insock, outsock, newsock; - struct sockaddr_in sock_in, sock_out; - int len; - - sig_dispatch_pending (); - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - if (family != AF_LOCAL && family != AF_INET) - { - set_errno (EAFNOSUPPORT); - goto done; - } - if (type != SOCK_STREAM && type != SOCK_DGRAM) - { - set_errno (EPROTOTYPE); - goto done; - } - if ((family == AF_LOCAL && protocol != PF_UNSPEC && protocol != PF_LOCAL) - || (family == AF_INET && protocol != PF_UNSPEC && protocol != PF_INET)) - { - set_errno (EPROTONOSUPPORT); - goto done; - } - - /* create the first socket */ - newsock = socket (AF_INET, type, 0); - if (newsock == INVALID_SOCKET) - { - debug_printf ("first socket call failed"); - set_winsock_errno (); - goto done; - } - - /* bind the socket to any unused port */ - sock_in.sin_family = AF_INET; - sock_in.sin_port = 0; - sock_in.sin_addr.s_addr = INADDR_ANY; - if (bind (newsock, (struct sockaddr *) &sock_in, sizeof (sock_in)) < 0) - { - debug_printf ("bind failed"); - set_winsock_errno (); - closesocket (newsock); - goto done; - } - len = sizeof (sock_in); - if (getsockname (newsock, (struct sockaddr *) &sock_in, &len) < 0) - { - debug_printf ("getsockname error"); - set_winsock_errno (); - closesocket (newsock); - goto done; - } - - /* For stream sockets, create a listener */ - if (type == SOCK_STREAM) - listen (newsock, 2); - - /* create a connecting socket */ - outsock = socket (AF_INET, type, 0); - if (outsock == INVALID_SOCKET) - { - debug_printf ("second socket call failed"); - set_winsock_errno (); - closesocket (newsock); - goto done; - } - - /* For datagram sockets, bind the 2nd socket to an unused address, too */ - if (type == SOCK_DGRAM) - { - sock_out.sin_family = AF_INET; - sock_out.sin_port = 0; - sock_out.sin_addr.s_addr = INADDR_ANY; - if (bind (outsock, (struct sockaddr *) &sock_out, sizeof (sock_out)) < 0) - { - debug_printf ("bind failed"); - set_winsock_errno (); - closesocket (newsock); - closesocket (outsock); - goto done; - } - len = sizeof (sock_out); - if (getsockname (outsock, (struct sockaddr *) &sock_out, &len) < 0) - { - debug_printf ("getsockname error"); - set_winsock_errno (); - closesocket (newsock); - closesocket (outsock); - goto done; - } - } - - /* Force IP address to loopback */ - sock_in.sin_addr.s_addr = htonl (INADDR_LOOPBACK); - if (type == SOCK_DGRAM) - sock_out.sin_addr.s_addr = htonl (INADDR_LOOPBACK); - - /* Do a connect */ - if (connect (outsock, (struct sockaddr *) &sock_in, sizeof (sock_in)) < 0) - { - debug_printf ("connect error"); - set_winsock_errno (); - closesocket (newsock); - closesocket (outsock); - goto done; - } - - if (type == SOCK_STREAM) - { - /* For stream sockets, accept the connection and close the listener */ - len = sizeof (sock_in); - insock = accept (newsock, (struct sockaddr *) &sock_in, &len); - if (insock == INVALID_SOCKET) - { - debug_printf ("accept error"); - set_winsock_errno (); - closesocket (newsock); - closesocket (outsock); - goto done; - } - closesocket (newsock); - } - else - { - /* For datagram sockets, connect the 2nd socket */ - if (connect (newsock, (struct sockaddr *) &sock_out, - sizeof (sock_out)) < 0) - { - debug_printf ("connect error"); - set_winsock_errno (); - closesocket (newsock); - closesocket (outsock); - goto done; - } - insock = newsock; - } - - { - cygheap_fdnew sb0; - const device *dev; - - if (family == AF_INET) - dev = (type == SOCK_STREAM ? tcp_dev : udp_dev); - else - dev = (type == SOCK_STREAM ? stream_dev : dgram_dev); - - if (sb0 >= 0 && fdsock (sb0, dev, insock)) - { - ((fhandler_socket *) sb0)->set_sun_path (""); - ((fhandler_socket *) sb0)->set_addr_family (family); - ((fhandler_socket *) sb0)->set_socket_type (type); - ((fhandler_socket *) sb0)->connect_state (connected); - if (family == AF_LOCAL && type == SOCK_STREAM) - ((fhandler_socket *) sb0)->af_local_set_sockpair_cred (); - - cygheap_fdnew sb1 (sb0, false); - - if (sb1 >= 0 && fdsock (sb1, dev, outsock)) - { - ((fhandler_socket *) sb1)->set_sun_path (""); - ((fhandler_socket *) sb1)->set_addr_family (family); - ((fhandler_socket *) sb1)->set_socket_type (type); - ((fhandler_socket *) sb1)->connect_state (connected); - if (family == AF_LOCAL && type == SOCK_STREAM) - ((fhandler_socket *) sb1)->af_local_set_sockpair_cred (); - - sb[0] = sb0; - sb[1] = sb1; - res = 0; - } - } - - if (res == -1) - { - closesocket (insock); - closesocket (outsock); - } - } - -done: - syscall_printf ("%d = socketpair (...)", res); - return res; -} - -/* sethostent: standards? */ -extern "C" void -sethostent (int) -{ -} - -/* endhostent: standards? */ -extern "C" void -endhostent (void) -{ -} - -/* exported as recvmsg: standards? */ -extern "C" int -cygwin_recvmsg (int fd, struct msghdr *msg, int flags) -{ - int res; - sig_dispatch_pending (); - - fhandler_socket *fh = get (fd); - - myfault efault; - if (efault.faulted (EFAULT) || !fh) - res = -1; - else - { - res = check_iovec_for_read (msg->msg_iov, msg->msg_iovlen); - if (res > 0) - res = fh->recvmsg (msg, flags, res); // res == iovec tot - } - - syscall_printf ("%d = recvmsg (%d, %p, %x)", res, fd, msg, flags); - return res; -} - -/* exported as sendmsg: standards? */ -extern "C" int -cygwin_sendmsg (int fd, const struct msghdr *msg, int flags) -{ - int res; - sig_dispatch_pending (); - - fhandler_socket *fh = get (fd); - - myfault efault; - if (efault.faulted (EFAULT) || !fh) - res = -1; - else - { - res = check_iovec_for_write (msg->msg_iov, msg->msg_iovlen); - if (res > 0) - res = fh->sendmsg (msg, flags, res); // res == iovec tot - } - - syscall_printf ("%d = sendmsg (%d, %p, %x)", res, fd, msg, flags); - return res; -} - -/* See "UNIX Network Programming, Networing APIs: Sockets and XTI", - W. Richard Stevens, Prentice Hall PTR, 1998. */ -extern "C" int -cygwin_inet_pton (int family, const char *strptr, void *addrptr) -{ - if (family == AF_INET) - { - struct in_addr in_val; - - if (cygwin_inet_aton (strptr, &in_val)) - { - memcpy (addrptr, &in_val, sizeof (struct in_addr)); - return 1; - } - return 0; - } - set_errno (EAFNOSUPPORT); - return -1; -} - -/* See "UNIX Network Programming, Networing APIs: Sockets and XTI", - W. Richard Stevens, Prentice Hall PTR, 1998. */ -extern "C" const char * -cygwin_inet_ntop (int family, const void *addrptr, char *strptr, socklen_t len) -{ - const u_char *p = (const u_char *) addrptr; - - myfault efault; - if (efault.faulted (EFAULT)) - return NULL; - if (family == AF_INET) - { - char temp[64]; /* Big enough for 4 ints ... */ - - __small_sprintf (temp, "%u.%u.%u.%u", p[0], p[1], p[2], p[3]); - if (strlen (temp) >= (size_t) len) - { - set_errno (ENOSPC); - return NULL; - } - strcpy (strptr, temp); - return strptr; - } - set_errno (EAFNOSUPPORT); - return NULL; -} diff --git a/winsup/cygwin/netdb.cc b/winsup/cygwin/netdb.cc deleted file mode 100644 index 53f0412dc..000000000 --- a/winsup/cygwin/netdb.cc +++ /dev/null @@ -1,423 +0,0 @@ -/* netdb.cc: network database related routines. - - Copyright 2002 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include - -/* Locate and open a system network database file. relative_path - should be one of the following values: - "protocol" - "services" - "networks" - "hosts" - - This routine will try to locate these files based on system type. - Currently the only distinction made is between NT and non-NT systems. - - It is the callers responsibility to close the file. */ -static FILE * -open_system_file (const char *relative_path) -{ - char win32_name[CYG_MAX_PATH]; - char posix_name[CYG_MAX_PATH]; - if (wincap.is_winnt ()) - { - if (!GetSystemDirectory (win32_name, CYG_MAX_PATH)) - return NULL; - strcat (win32_name, "\\drivers\\etc\\"); - } - else - { - if (!GetWindowsDirectory (win32_name, CYG_MAX_PATH)) - return NULL; - strcat (win32_name, "\\"); - } - strcat (win32_name, relative_path); - cygwin_conv_to_full_posix_path (win32_name, posix_name); - debug_printf ("netdb file to open %s", win32_name); - FILE *result = fopen (posix_name, "rt"); - debug_printf ("handle to netdb file %p", result); - return result; -} - -inline static FILE * -open_protocol_file () -{ - return open_system_file ("protocol"); -} - -/* Wrapper for open_system_file(), fixing the constant name -"services". Returns the open file. */ -inline static FILE * -open_services_file () -{ - return open_system_file ("services"); -} - -/* Read an entire line up till the next \n character. Memory for the -line is dynamically allocated, and the caller must call free() to -deallocate it. When the end of file is reached, NULL is returned. */ -static char * -get_entire_line (FILE *fd) -{ - static const int BUFF_SIZE = 1024; - struct line_fragment - { - char buffer[BUFF_SIZE]; - line_fragment *next; - }; - - line_fragment *fragment_list_head = NULL; - line_fragment *fragment = NULL; - int fragment_count = 0; - char *result; - - do - { - line_fragment *new_fragment = (line_fragment *) malloc (sizeof (line_fragment)); - paranoid_printf ("line fragment allocated %p", new_fragment); - if (!fragment_list_head) - fragment_list_head = new_fragment; - if (fragment) - fragment->next = new_fragment; - fragment = new_fragment; - fragment->next = NULL; - *fragment->buffer = '\0'; - result = fgets (fragment->buffer, BUFF_SIZE, fd); - ++fragment_count; - } - while (result && !strchr (fragment->buffer, '\n')); - - if (*fragment_list_head->buffer != '\0') - { - char *concatenated_line = (char *) calloc (fragment_count * BUFF_SIZE , sizeof (char)); - paranoid_printf ("concatenated line allocated %p", concatenated_line); - *concatenated_line = '\0'; - fragment = fragment_list_head; - while (fragment != NULL) - { - line_fragment *previous = fragment; - strcat (concatenated_line, fragment->buffer); - fragment = fragment->next; - free (previous); - } - return concatenated_line; - } - else - { - fragment = fragment_list_head; - while (fragment != NULL) - { - line_fragment *previous = fragment; - fragment = fragment->next; - free (previous); - } - return NULL; - } -} - -/* Characters representing whitespace. Used by parse_* routines to -delimit tokens. */ -static const NO_COPY char *SPACE = " \t\n\r\f"; - -/* Parse a list aliases from a network database file. Returns a -char** structure terminated by a NULL. */ -static void -parse_alias_list (char ***aliases, char **lasts) -{ - struct alias_t - { - char *alias_name; - alias_t *next; - }; - alias_t *alias_list_head = NULL, *alias_list_tail = NULL; - char *alias; - int alias_count = 0; - alias = strtok_r (NULL, SPACE, lasts); - - while (alias) - { - ++alias_count; - alias_t *new_alias = (alias_t *) malloc (sizeof (alias_t)); - paranoid_printf ("new alias alloc %p", new_alias); - if (!alias_list_head) - alias_list_head = new_alias; - if (alias_list_tail) - alias_list_tail->next = new_alias; - new_alias->next = NULL; - new_alias->alias_name = alias; - alias_list_tail = new_alias; - alias = strtok_r (NULL, SPACE, lasts); - } - - *aliases = (char**) calloc (alias_count + 1, sizeof (char *)); - paranoid_printf ("aliases alloc %p", *aliases); - - char **current_entry = *aliases; - while (alias_list_head) - { - alias_t *previous = alias_list_head; - *current_entry = strdup (alias_list_head->alias_name); - paranoid_printf ("*current entry strdup %p", *current_entry); - alias_list_head = alias_list_head->next; - free (previous); - ++current_entry; - } - - *current_entry = NULL; -} - -/* Read the next line from svc_file, and parse it into the structure -pointed to by sep. sep can point to stack or static data, but it's -members will be overwritten with pointers to dynamically allocated -heap data accommodating parsed data. It is the responsibility of the -caller to free up the allocated structures. The function returns true -to indicate that a line was successfully read and parsed. False is -used to indicate that no more lines can be read and parsed. This -should also interpreted as end of file. */ -static bool -parse_services_line (FILE *svc_file, struct servent *sep) -{ - char *line; - while ((line = get_entire_line (svc_file))) - { - char *name, *port, *protocol, *lasts; - - line[strcspn (line, "#")] = '\0'; // truncate at comment marker. - name = strtok_r (line, SPACE, &lasts); - if (!name) - { - free (line); - continue; - } - port = strtok_r (NULL, SPACE, &lasts); - protocol = strchr (port, '/'); - *protocol++ = '\0'; - sep->s_name = strdup (name); - paranoid_printf ("sep->s_name strdup %p", sep->s_name); - sep->s_port = atoi (port); - sep->s_proto = strdup (protocol); - paranoid_printf ("sep->s_proto strdup %p", sep->s_proto); - /* parse_alias_list relies on side effects. Read the comments - for that function.*/ - parse_alias_list (& sep->s_aliases, &lasts); - free (line); - return true; - } - return false; -} - -static FILE *svc_file = NULL; -static long int svc_read_pos = 0; -static struct servent current_servent; - -/* Steps through a struct servent, and frees all of the internal -structures.*/ -static void -free_servent (struct servent *sep) -{ - free (sep->s_name); - free (sep->s_proto); - char ** current = sep->s_aliases; - while (current && *current) - { - free (*current); - ++current; - } - free (sep->s_aliases); - sep->s_name = NULL; - sep->s_port = 0; - sep->s_proto = NULL; - sep->s_aliases = NULL; -} - -extern "C" void -cygwin_setservent (int stay_open) -{ - if (svc_file) - fclose (svc_file); - if (stay_open) - svc_file = open_services_file (); - free_servent (¤t_servent); - svc_read_pos = 0; - syscall_printf ("setservent (%d)", stay_open); -} - -extern "C" struct servent * -cygwin_getservent (void) -{ - FILE *fd; - if (svc_file) - fd = svc_file; - else - { - fd = open_services_file (); - if (!fd) - { - syscall_printf ("%p = getservent()", NULL); - return NULL; - } - fseek (fd, svc_read_pos, SEEK_SET); - } - free_servent (¤t_servent); - bool found = parse_services_line (fd, ¤t_servent); - if (!svc_file) - { - svc_read_pos = ftell (fd); - fclose (fd); - } - struct servent *result; - if (found) - result = ¤t_servent; - else - result = NULL; - syscall_printf ("%p = getservent()", result); - return result; -} - -extern "C" void -cygwin_endservent (void) -{ - if (svc_file) - { - fclose (svc_file); - svc_file = NULL; - } - free_servent (¤t_servent); - svc_read_pos = 0; - syscall_printf ("endservent ()"); -} - -/* Read the next line from proto_file, and parse it into the structure -pointed to by pep. pep can point to stack or static data, but it's -members will be overwritten with pointers to dynamically allocated -heap data accommodating parsed data. It is the responsibility of the -caller to free up the allocated structures. The function returns true -to indicate that a line was successfully read and parsed. False is -used to indicate that no more lines can be read and parsed. This -should also interpreted as end of file. */ -static bool -parse_protocol_line (FILE *proto_file, struct protoent *pep) -{ - char *line; - while ((line = get_entire_line (proto_file))) - { - char *name, *protocol, *lasts; - - line[strcspn (line, "#")] = '\0'; // truncate at comment marker. - name = strtok_r (line, SPACE, &lasts); - if (!name) - { - free (line); - continue; - } - protocol = strtok_r (NULL, SPACE, &lasts); - pep->p_name = strdup (name); - paranoid_printf ("pep->p_name strdup %p", pep->p_name); - pep->p_proto = atoi (protocol); - /* parse_alias_list relies on side effects. Read the comments - for that function.*/ - parse_alias_list (& pep->p_aliases, &lasts); - free (line); - return true; - } - return false; -} - -static FILE *proto_file = NULL; -static long int proto_read_pos = 0; -static struct protoent current_protoent; - -/* Steps through a struct protoent, and frees all the internal -structures. */ -static void -free_protoent (struct protoent *pep) -{ - free (pep->p_name); - char ** current = pep->p_aliases; - while (current && *current) - { - free (*current); - ++current; - } - free (pep->p_aliases); - pep->p_name = NULL; - pep->p_proto = 0; - pep->p_aliases = NULL; -} - -extern "C" void -cygwin_setprotoent (int stay_open) -{ - if (proto_file) - fclose (proto_file); - - if (stay_open) - proto_file = open_protocol_file (); - - free_protoent (¤t_protoent); - proto_read_pos = 0; - syscall_printf ("setprotoent (%d)", stay_open); -} - -extern "C" struct protoent * -cygwin_getprotoent (void) -{ - FILE *fd; - - if (proto_file) - fd = proto_file; - else - { - fd = open_protocol_file (); - if (!fd) - { - syscall_printf ("%p = getprotoent()", NULL); - return NULL; - } - fseek (fd, proto_read_pos, SEEK_SET); - } - free_protoent (¤t_protoent); - - bool found = parse_protocol_line (fd, ¤t_protoent); - if (!proto_file) - { - proto_read_pos = ftell (fd); - fclose (fd); - } - - struct protoent *result; - if (found) - result = ¤t_protoent; - else - result = NULL; - - syscall_printf ("%p = getprotoent()", result); - return result; -} - -extern "C" void -cygwin_endprotoent (void) -{ - if (proto_file) - { - fclose (proto_file); - proto_file = NULL; - } - - free_protoent (¤t_protoent); - proto_read_pos = 0; - syscall_printf ("endprotoent ()"); -} diff --git a/winsup/cygwin/newsym b/winsup/cygwin/newsym deleted file mode 100755 index a2c7206cd..000000000 --- a/winsup/cygwin/newsym +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh -lib=$1; shift -as=$1; shift -ar=$1; shift -rm -rf newsym.dir -trap "rm -rf newsym.dir" 0 1 2 15 -mkdir newsym.dir -while [ -n "$1" ]; do - newsym=$1; shift - oldsym=$1; shift - cat < newsym.dir/$newsym.s - .section .text - .global _$newsym - .global __imp__$newsym -_$newsym: - jmp *__imp__$oldsym - - .section .idata\$7 - .long __head_cygwin1_dll - - .section .idata\$5 -__imp__$newsym: .rva 1f - - .section .idata\$4 - .rva 1f - - .section .idata\$6 -1: .short 2 - .asciz "$oldsym" -EOF - $as -o newsym.dir/$newsym.o newsym.dir/$newsym.s -done -$ar crus $lib newsym.dir/*.o diff --git a/winsup/cygwin/ntdll.h b/winsup/cygwin/ntdll.h deleted file mode 100644 index 3f5035c17..000000000 --- a/winsup/cygwin/ntdll.h +++ /dev/null @@ -1,615 +0,0 @@ -/* ntdll.h. Contains ntdll specific stuff not defined elsewhere. - - Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xc0000004) -#define STATUS_INVALID_PARAMETER ((NTSTATUS) 0xc000000d) -#define STATUS_BUFFER_TOO_SMALL ((NTSTATUS) 0xc0000023) -#define STATUS_WORKING_SET_QUOTA ((NTSTATUS) 0xc00000a1L) -#define STATUS_INVALID_LEVEL ((NTSTATUS) 0xc0000148) -#define STATUS_NO_MORE_FILES ((NTSTATUS)0x80000006L) -#define PDI_MODULES 0x01 -#define PDI_HEAPS 0x04 -#define LDRP_IMAGE_DLL 0x00000004 -#define WSLE_PAGE_READONLY 0x001 -#define WSLE_PAGE_EXECUTE 0x002 -#define WSLE_PAGE_EXECUTE_READ 0x003 -#define WSLE_PAGE_READWRITE 0x004 -#define WSLE_PAGE_WRITECOPY 0x005 -#define WSLE_PAGE_EXECUTE_READWRITE 0x006 -#define WSLE_PAGE_EXECUTE_WRITECOPY 0x007 -#define WSLE_PAGE_SHARE_COUNT_MASK 0x0E0 -#define WSLE_PAGE_SHAREABLE 0x100 - -typedef enum _FILE_INFORMATION_CLASS -{ - FileDirectoryInformation = 1, - FileFullDirectoryInformation, // 2 - FileBothDirectoryInformation, // 3 - FileBasicInformation, // 4 wdm - FileStandardInformation, // 5 wdm - FileInternalInformation, // 6 - FileEaInformation, // 7 - FileAccessInformation, // 8 - FileNameInformation, // 9 - FileRenameInformation, // 10 - FileLinkInformation, // 11 - FileNamesInformation, // 12 - FileDispositionInformation, // 13 - FilePositionInformation, // 14 wdm - FileFullEaInformation, // 15 - FileModeInformation, // 16 - FileAlignmentInformation, // 17 - FileAllInformation, // 18 - FileAllocationInformation, // 19 - FileEndOfFileInformation, // 20 wdm - FileAlternateNameInformation, // 21 - FileStreamInformation, // 22 - FilePipeInformation, // 23 - FilePipeLocalInformation, // 24 - FilePipeRemoteInformation, // 25 - FileMailslotQueryInformation, // 26 - FileMailslotSetInformation, // 27 - FileCompressionInformation, // 28 - FileObjectIdInformation, // 29 - FileCompletionInformation, // 30 - FileMoveClusterInformation, // 31 - FileQuotaInformation, // 32 - FileReparsePointInformation, // 33 - FileNetworkOpenInformation, // 34 - FileAttributeTagInformation, // 35 - FileTrackingInformation, // 36 - FileIdBothDirectoryInformation, // 37 - FileIdFullDirectoryInformation, // 38 - FileValidDataLengthInformation, // 39 - FileShortNameInformation, // 40 - FileMaximumInformation -} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; - -typedef struct _FILE_BOTH_DIR_INFORMATION -{ - ULONG NextEntryOffset; - ULONG FileIndex; - LARGE_INTEGER CreationTime; - LARGE_INTEGER LastAccessTime; - LARGE_INTEGER LastWriteTime; - LARGE_INTEGER ChangeTime; - LARGE_INTEGER EndOfFile; - LARGE_INTEGER AllocationSize; - ULONG FileAttributes; - ULONG FileNameLength; - ULONG EaSize; - CCHAR ShortNameLength; - WCHAR ShortName[12]; - WCHAR FileName[1]; -} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION; - -typedef struct _FILE_ID_BOTH_DIR_INFORMATION -{ - ULONG NextEntryOffset; - ULONG FileIndex; - LARGE_INTEGER CreationTime; - LARGE_INTEGER LastAccessTime; - LARGE_INTEGER LastWriteTime; - LARGE_INTEGER ChangeTime; - LARGE_INTEGER EndOfFile; - LARGE_INTEGER AllocationSize; - ULONG FileAttributes; - ULONG FileNameLength; - ULONG EaSize; - CCHAR ShortNameLength; - WCHAR ShortName[12]; - LARGE_INTEGER FileId; - WCHAR FileName[1]; -} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION; - - -#define AT_EXTENDABLE_FILE 0x00002000 -#define AT_ROUND_TO_PAGE 0x40000000 - -#define LOCK_VM_IN_WSL 1 -#define LOCK_VM_IN_RAM 2 - -#define DIRECTORY_QUERY 1 - -typedef ULONG KAFFINITY; - -typedef enum _SYSTEM_INFORMATION_CLASS -{ - SystemBasicInformation = 0, - SystemPerformanceInformation = 2, - SystemTimeOfDayInformation = 3, - SystemProcessesAndThreadsInformation = 5, - SystemProcessorTimes = 8, - SystemPagefileInformation = 18, - /* There are a lot more of these... */ -} SYSTEM_INFORMATION_CLASS; - -typedef struct _SYSTEM_BASIC_INFORMATION -{ - ULONG Unknown; - ULONG MaximumIncrement; - ULONG PhysicalPageSize; - ULONG NumberOfPhysicalPages; - ULONG LowestPhysicalPage; - ULONG HighestPhysicalPage; - ULONG AllocationGranularity; - ULONG LowestUserAddress; - ULONG HighestUserAddress; - ULONG ActiveProcessors; - UCHAR NumberProcessors; -} SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION; - -typedef struct _SYSTEM_PAGEFILE_INFORMATION -{ - ULONG NextEntryOffset; - ULONG CurrentSize; - ULONG TotalUsed; - ULONG PeakUsed; - UNICODE_STRING FileName; -} SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION; - -typedef struct __attribute__ ((aligned (8))) _SYSTEM_PROCESSOR_TIMES -{ - LARGE_INTEGER IdleTime; - LARGE_INTEGER KernelTime; - LARGE_INTEGER UserTime; - LARGE_INTEGER DpcTime; - LARGE_INTEGER InterruptTime; - ULONG InterruptCount; -} SYSTEM_PROCESSOR_TIMES, *PSYSTEM_PROCESSOR_TIMES; - -typedef LONG KPRIORITY; -typedef struct _VM_COUNTERS -{ - ULONG PeakVirtualSize; - ULONG VirtualSize; - ULONG PageFaultCount; - ULONG PeakWorkingSetSize; - ULONG WorkingSetSize; - ULONG QuotaPeakPagedPoolUsage; - ULONG QuotaPagedPoolUsage; - ULONG QuotaPeakNonPagedPoolUsage; - ULONG QuotaNonPagedPoolUsage; - ULONG PagefileUsage; - ULONG PeakPagefileUsage; -} VM_COUNTERS, *PVM_COUNTERS; - -typedef struct _CLIENT_ID -{ - HANDLE UniqueProcess; - HANDLE UniqueThread; -} CLIENT_ID, *PCLIENT_ID; - -typedef enum -{ - StateInitialized, - StateReady, - StateRunning, - StateStandby, - StateTerminated, - StateWait, - StateTransition, - StateUnknown, -} THREAD_STATE; - -typedef enum -{ - Executive, - FreePage, - PageIn, - PoolAllocation, - DelayExecution, - Suspended, - UserRequest, - WrExecutive, - WrFreePage, - WrPageIn, - WrPoolAllocation, - WrDelayExecution, - WrSuspended, - WrUserRequest, - WrEventPair, - WrQueue, - WrLpcReceive, - WrLpcReply, - WrVirtualMemory, - WrPageOut, - WrRendezvous, - Spare2, - Spare3, - Spare4, - Spare5, - Spare6, - WrKernel, - MaximumWaitReason -} KWAIT_REASON; - -typedef struct _SYSTEM_THREADS -{ - LARGE_INTEGER KernelTime; - LARGE_INTEGER UserTime; - LARGE_INTEGER CreateTime; - ULONG WaitTime; - PVOID StartAddress; - CLIENT_ID ClientId; - KPRIORITY Priority; - KPRIORITY BasePriority; - ULONG ContextSwitchCount; - THREAD_STATE State; - KWAIT_REASON WaitReason; - DWORD Reserved; -} SYSTEM_THREADS, *PSYSTEM_THREADS; - -typedef struct _SYSTEM_PROCESSES -{ - ULONG NextEntryDelta; - ULONG ThreadCount; - ULONG Reserved1[6]; - LARGE_INTEGER CreateTime; - LARGE_INTEGER UserTime; - LARGE_INTEGER KernelTime; - UNICODE_STRING ProcessName; - KPRIORITY BasePriority; - ULONG ProcessId; - ULONG InheritedFromProcessId; - ULONG HandleCount; - ULONG Reserved2[2]; - VM_COUNTERS VmCounters; - IO_COUNTERS IoCounters; - SYSTEM_THREADS Threads[1]; -} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES; - -typedef struct _IO_STATUS_BLOCK -{ - NTSTATUS Status; - ULONG Information; -} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; - -typedef struct _SYSTEM_PERFORMANCE_INFORMATION -{ - LARGE_INTEGER IdleTime; - LARGE_INTEGER ReadTransferCount; - LARGE_INTEGER WriteTransferCount; - LARGE_INTEGER OtherTransferCount; - ULONG ReadOperationCount; - ULONG WriteOperationCount; - ULONG OtherOperationCount; - ULONG AvailablePages; - ULONG TotalCommittedPages; - ULONG TotalCommitLimit; - ULONG PeakCommitment; - ULONG PageFaults; - ULONG WriteCopyFaults; - ULONG TransitionFaults; - ULONG Reserved1; - ULONG DemandZeroFaults; - ULONG PagesRead; - ULONG PageReadIos; - ULONG Reserved2[2]; - ULONG PagefilePagesWritten; - ULONG PagefilePageWriteIos; - ULONG MappedFilePagesWritten; - ULONG MappedFilePageWriteIos; - ULONG PagedPoolUsage; - ULONG NonPagedPoolUsage; - ULONG PagedPoolAllocs; - ULONG PagedPoolFrees; - ULONG NonPagedPoolAllocs; - ULONG NonPagedPoolFrees; - ULONG TotalFreeSystemPtes; - ULONG SystemCodePage; - ULONG TotalSystemDriverPages; - ULONG TotalSystemCodePages; - ULONG SmallNonPagedLookasideListAllocateHits; - ULONG SmallPagedLookasideListAllocateHits; - ULONG Reserved3; - ULONG MmSystemCachePage; - ULONG PagedPoolPage; - ULONG SystemDriverPage; - ULONG FastReadNoWait; - ULONG FastReadWait; - ULONG FastReadResourceMiss; - ULONG FastReadNotPossible; - ULONG FastMdlReadNoWait; - ULONG FastMdlReadWait; - ULONG FastMdlReadResourceMiss; - ULONG FastMdlReadNotPossible; - ULONG MapDataNoWait; - ULONG MapDataWait; - ULONG MapDataNoWaitMiss; - ULONG MapDataWaitMiss; - ULONG PinMappedDataCount; - ULONG PinReadNoWait; - ULONG PinReadWait; - ULONG PinReadNoWaitMiss; - ULONG PinReadWaitMiss; - ULONG CopyReadNoWait; - ULONG CopyReadWait; - ULONG CopyReadNoWaitMiss; - ULONG CopyReadWaitMiss; - ULONG MdlReadNoWait; - ULONG MdlReadWait; - ULONG MdlReadNoWaitMiss; - ULONG MdlReadWaitMiss; - ULONG ReadAheadIos; - ULONG LazyWriteIos; - ULONG LazyWritePages; - ULONG DataFlushes; - ULONG DataPages; - ULONG ContextSwitches; - ULONG FirstLevelTbFills; - ULONG SecondLevelTbFills; - ULONG SystemCalls; -} SYSTEM_PERFORMANCE_INFORMATION, *PSYSTEM_PERFORMANCE_INFORMATION; - -typedef struct __attribute__ ((aligned(8))) _SYSTEM_TIME_OF_DAY_INFORMATION -{ - LARGE_INTEGER BootTime; - LARGE_INTEGER CurrentTime; - LARGE_INTEGER TimeZoneBias; - ULONG CurrentTimeZoneId; -} SYSTEM_TIME_OF_DAY_INFORMATION, *PSYSTEM_TIME_OF_DAY_INFORMATION; - -typedef enum _PROCESSINFOCLASS -{ - ProcessBasicInformation = 0, - ProcessQuotaLimits = 1, - ProcessVmCounters = 3, - ProcessTimes =4, -} PROCESSINFOCLASS; - -typedef struct _DEBUG_BUFFER -{ - HANDLE SectionHandle; - PVOID SectionBase; - PVOID RemoteSectionBase; - ULONG SectionBaseDelta; - HANDLE EventPairHandle; - ULONG Unknown[2]; - HANDLE RemoteThreadHandle; - ULONG InfoClassMask; - ULONG SizeOfInfo; - ULONG AllocatedSize; - ULONG SectionSize; - PVOID ModuleInformation; - PVOID BackTraceInformation; - PVOID HeapInformation; - PVOID LockInformation; - PVOID Reserved[9]; -} DEBUG_BUFFER, *PDEBUG_BUFFER; - -typedef struct _DEBUG_HEAP_INFORMATION -{ - ULONG Base; - ULONG Flags; - USHORT Granularity; - USHORT Unknown; - ULONG Allocated; - ULONG Committed; - ULONG TagCount; - ULONG BlockCount; - ULONG Reserved[7]; - PVOID Tags; - PVOID Blocks; -} DEBUG_HEAP_INFORMATION, *PDEBUG_HEAP_INFORMATION; - -typedef struct _DEBUG_MODULE_INFORMATION -{ - ULONG Reserved[2]; - ULONG Base; - ULONG Size; - ULONG Flags; - USHORT Index; - USHORT Unknown; - USHORT LoadCount; - USHORT ModuleNameOffset; - CHAR ImageName[256]; -} DEBUG_MODULE_INFORMATION, *PDEBUG_MODULE_INFORMATION; - -typedef struct _KERNEL_USER_TIMES -{ - LARGE_INTEGER CreateTime; - LARGE_INTEGER ExitTime; - LARGE_INTEGER KernelTime; - LARGE_INTEGER UserTime; -} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES; - -typedef void *PPEB; - -typedef struct _PROCESS_BASIC_INFORMATION -{ - NTSTATUS ExitStatus; - PPEB PebBaseAddress; - KAFFINITY AffinityMask; - KPRIORITY BasePriority; - ULONG UniqueProcessId; - ULONG InheritedFromUniqueProcessId; -} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION; - -typedef enum _MEMORY_INFORMATION_CLASS -{ - MemoryBasicInformation, - MemoryWorkingSetList, - MemorySectionName, - MemoryBasicVlmInformation -} MEMORY_INFORMATION_CLASS; - -typedef struct _MEMORY_WORKING_SET_LIST -{ - ULONG NumberOfPages; - ULONG WorkingSetList[1]; -} MEMORY_WORKING_SET_LIST, *PMEMORY_WORKING_SET_LIST; - -typedef struct _FILE_BASIC_INFORMATION { - LARGE_INTEGER CreationTime; - LARGE_INTEGER LastAccessTime; - LARGE_INTEGER LastWriteTime; - LARGE_INTEGER ChangeTime; - ULONG FileAttributes; -} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; - -typedef struct _FILE_STANDARD_INFORMATION { - LARGE_INTEGER AllocationSize; - LARGE_INTEGER EndOfFile; - ULONG NumberOfLinks; - BOOLEAN DeletePending; - BOOLEAN Directory; -} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION; - -typedef struct _FILE_INTERNAL_INFORMATION { - LARGE_INTEGER FileId; -} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION; - -typedef struct _FILE_EA_INFORMATION { - ULONG EaSize; -} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION; - -typedef struct _FILE_ACCESS_INFORMATION { - ACCESS_MASK AccessFlags; -} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION; - -typedef struct _FILE_POSITION_INFORMATION { - LARGE_INTEGER CurrentByteOffset; -} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; - -typedef struct _FILE_MODE_INFORMATION { - ULONG Mode; -} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION; - -typedef struct _FILE_ALIGNMENT_INFORMATION { - ULONG AlignmentRequirement; -} FILE_ALIGNMENT_INFORMATION; - -typedef struct _FILE_NAME_INFORMATION { - ULONG FileNameLength; - WCHAR FileName[1]; -} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; - -typedef struct _FILE_ALL_INFORMATION { - FILE_BASIC_INFORMATION BasicInformation; - FILE_STANDARD_INFORMATION StandardInformation; - FILE_INTERNAL_INFORMATION InternalInformation; - FILE_EA_INFORMATION EaInformation; - FILE_ACCESS_INFORMATION AccessInformation; - FILE_POSITION_INFORMATION PositionInformation; - FILE_MODE_INFORMATION ModeInformation; - FILE_ALIGNMENT_INFORMATION AlignmentInformation; - FILE_NAME_INFORMATION NameInformation; -} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION; - -typedef struct _FILE_PIPE_LOCAL_INFORMATION -{ - ULONG NamedPipeType; - ULONG NamedPipeConfiguration; - ULONG MaximumInstances; - ULONG CurrentInstances; - ULONG InboundQuota; - ULONG ReadDataAvailable; - ULONG OutboundQuota; - ULONG WriteQuotaAvailable; - ULONG NamedPipeState; - ULONG NamedPipeEnd; -} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION; - -typedef struct _FILE_COMPRESSION_INFORMATION -{ - LARGE_INTEGER CompressedSize; - USHORT CompressionFormat; - UCHAR CompressionUnitShift; - UCHAR Unknown; - UCHAR ClusterSizeShift; -} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION; - -typedef struct _FILE_FS_VOLUME_INFORMATION -{ - LARGE_INTEGER VolumeCreationTime; - ULONG VolumeSerialNumber; - ULONG VolumeLabelLength; - BOOLEAN SupportsObjects; - WCHAR VolumeLabel[1]; -} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; - -typedef enum _FSINFOCLASS -{ - FileFsVolumeInformation = 1 -} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; - -typedef enum _OBJECT_INFORMATION_CLASS -{ - ObjectBasicInformation = 0, - ObjectNameInformation = 1, - ObjectHandleInformation = 4 - // and many more -} OBJECT_INFORMATION_CLASS; - -typedef struct _OBJECT_NAME_INFORMATION -{ - UNICODE_STRING Name; -} OBJECT_NAME_INFORMATION; - -typedef struct _DIRECTORY_BASIC_INFORMATION -{ - UNICODE_STRING ObjectName; - UNICODE_STRING ObjectTypeName; -} DIRECTORY_BASIC_INFORMATION, *PDIRECTORY_BASIC_INFORMATION; - -/* Function declarations for ntdll.dll. These don't appear in any - standard Win32 header. */ -extern "C" -{ - NTSTATUS NTAPI NtClose (HANDLE); - NTSTATUS NTAPI NtCreateFile (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, - PIO_STATUS_BLOCK, PLARGE_INTEGER, ULONG, ULONG, - ULONG, ULONG, PVOID, ULONG); - NTSTATUS NTAPI NtCreateSection (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, - PLARGE_INTEGER, ULONG, ULONG, HANDLE); - NTSTATUS NTAPI NtCreateToken (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, - TOKEN_TYPE, PLUID, PLARGE_INTEGER, PTOKEN_USER, - PTOKEN_GROUPS, PTOKEN_PRIVILEGES, PTOKEN_OWNER, - PTOKEN_PRIMARY_GROUP, PTOKEN_DEFAULT_DACL, - PTOKEN_SOURCE); - NTSTATUS NTAPI NtLockVirtualMemory (HANDLE, PVOID *, ULONG *, ULONG); - NTSTATUS NTAPI NtMapViewOfSection (HANDLE, HANDLE, PVOID *, ULONG, ULONG, - PLARGE_INTEGER, PULONG, SECTION_INHERIT, - ULONG, ULONG); - NTSTATUS NTAPI NtOpenDirectoryObject (PHANDLE, ACCESS_MASK, - POBJECT_ATTRIBUTES); - NTSTATUS NTAPI NtOpenFile (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, - PIO_STATUS_BLOCK, ULONG, ULONG); - NTSTATUS NTAPI NtOpenSection (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES); - NTSTATUS NTAPI NtQueryDirectoryFile(HANDLE, HANDLE, PVOID, PVOID, - PIO_STATUS_BLOCK, PVOID, ULONG, - FILE_INFORMATION_CLASS, BOOLEAN, - PUNICODE_STRING, BOOLEAN); - NTSTATUS NTAPI NtQueryDirectoryObject (HANDLE, PVOID, ULONG, BOOLEAN, - BOOLEAN, PULONG, PULONG); - NTSTATUS NTAPI NtQueryInformationFile (HANDLE, PIO_STATUS_BLOCK, PVOID, - ULONG, FILE_INFORMATION_CLASS); - NTSTATUS NTAPI NtQueryInformationProcess (HANDLE, PROCESSINFOCLASS, - PVOID, ULONG, PULONG); - NTSTATUS NTAPI NtQueryObject (HANDLE, OBJECT_INFORMATION_CLASS, VOID *, - ULONG, ULONG *); - NTSTATUS NTAPI NtQuerySystemInformation (SYSTEM_INFORMATION_CLASS, - PVOID, ULONG, PULONG); - NTSTATUS NTAPI NtQuerySecurityObject (HANDLE, SECURITY_INFORMATION, - PSECURITY_DESCRIPTOR, ULONG, PULONG); - NTSTATUS NTAPI NtQueryVirtualMemory (HANDLE, PVOID, MEMORY_INFORMATION_CLASS, - PVOID, ULONG, PULONG); - NTSTATUS NTAPI NtQueryVolumeInformationFile (HANDLE, IO_STATUS_BLOCK *, - VOID *, ULONG, - FS_INFORMATION_CLASS); - NTSTATUS NTAPI NtSetSecurityObject (HANDLE, SECURITY_INFORMATION, - PSECURITY_DESCRIPTOR); - NTSTATUS NTAPI NtUnlockVirtualMemory (HANDLE, PVOID *, ULONG *, ULONG); - NTSTATUS NTAPI NtUnmapViewOfSection (HANDLE, PVOID); - VOID NTAPI RtlInitUnicodeString (PUNICODE_STRING, PCWSTR); - ULONG NTAPI RtlIsDosDeviceName_U (PCWSTR); - ULONG NTAPI RtlNtStatusToDosError (NTSTATUS); -} diff --git a/winsup/cygwin/ntea.cc b/winsup/cygwin/ntea.cc deleted file mode 100644 index f33d82250..000000000 --- a/winsup/cygwin/ntea.cc +++ /dev/null @@ -1,325 +0,0 @@ -/* ntea.cc: code for manipulating NTEA information - - Copyright 1997, 1998, 2000, 2001 Red Hat, Inc. - - Written by Sergey S. Okhapkin (sos@prospect.com.ru) - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include "security.h" - -/* Default to not using NTEA information */ -bool allow_ntea; - -/* -From Windows NT DDK: - -FILE_FULL_EA_INFORMATION provides extended attribute information. -This structure is used primarily by network drivers. - -Members - -NextEntryOffset -The offset of the next FILE_FULL_EA_INFORMATION-type entry. This member is -zero if no other entries follow this one. - -Flags -Can be zero or can be set with FILE_NEED_EA, indicating that the file to which -the EA belongs cannot be interpreted without understanding the associated -extended attributes. - -EaNameLength -The length in bytes of the EaName array. This value does not include a -zero-terminator to EaName. - -EaValueLength -The length in bytes of each EA value in the array. - -EaName -An array of characters naming the EA for this entry. - -Comments -This structure is longword-aligned. If a set of FILE_FULL_EA_INFORMATION -entries is buffered, NextEntryOffset value in each entry, except the last, -falls on a longword boundary. -The value(s) associated with each entry follows the EaName array. That is, an -EA's values are located at EaName + (EaNameLength + 1). -*/ - -typedef struct _FILE_FULL_EA_INFORMATION { - ULONG NextEntryOffset; - UCHAR Flags; - UCHAR EaNameLength; - USHORT EaValueLength; - CHAR EaName[1]; -} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION; - -/* Functions prototypes */ - -int NTReadEA (const char *file, const char *attrname, char *buf, int len); -static PFILE_FULL_EA_INFORMATION NTReadEARaw (HANDLE file, int *len); -BOOL NTWriteEA(const char *file, const char *attrname, char *buf, int len); - -/* - * NTReadEA - read file's Extended Attribute. - * - * Parameters: - * file - pointer to filename - * attrname- pointer to EA name (case insensitivy. EAs are sored in upper - * case). - * attrbuf - pointer to buffer to store EA's value. - * len - length of attrbuf. - * Return value: - * 0 - if file or attribute "attrname" not found. - * N - number of bytes stored in attrbuf if succes. - * -1 - attrbuf too small for EA value. - */ - -int __stdcall -NTReadEA (const char *file, const char *attrname, char *attrbuf, int len) -{ - HANDLE hFileSource; - int eafound = 0; - PFILE_FULL_EA_INFORMATION ea, sea; - int easize = 0; - - hFileSource = CreateFile (file, FILE_READ_EA, - FILE_SHARE_READ | FILE_SHARE_WRITE, - &sec_none_nih, // sa - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, - NULL); - - if (hFileSource == INVALID_HANDLE_VALUE) - return 0; - - /* Read in raw array of EAs */ - ea = sea = NTReadEARaw (hFileSource, &easize); - - /* Search for requested attribute */ - while (sea) - { - if (strcasematch (ea->EaName, attrname)) /* EA found */ - { - if (ea->EaValueLength > len) - { - eafound = -1; /* buffer too small */ - break; - } - memcpy (attrbuf, ea->EaName + (ea->EaNameLength + 1), - ea->EaValueLength); - eafound = ea->EaValueLength; - break; - } - if ((ea->NextEntryOffset == 0) || ((int) ea->NextEntryOffset > easize)) - break; - ea = (PFILE_FULL_EA_INFORMATION) ((char *) ea + ea->NextEntryOffset); - } - - if (sea) - free (sea); - CloseHandle (hFileSource); - - return eafound; -} - -/* - * NTReadEARaw - internal routine to read EAs array to malloced buffer. The - * caller should free this buffer after usage. - * Parameters: - * hFileSource - handle to file. This handle should have FILE_READ_EA - * rights. - * len - pointer to int variable where length of buffer will - * be stored. - * Return value: - * pointer to buffer with file's EAs, or NULL if any error occured. - */ - -static PFILE_FULL_EA_INFORMATION -NTReadEARaw (HANDLE hFileSource, int *len) -{ - WIN32_STREAM_ID StreamId; - DWORD dwBytesWritten; - LPVOID lpContext; - DWORD StreamSize; - PFILE_FULL_EA_INFORMATION eafound = NULL; - - lpContext = NULL; - StreamSize = sizeof (WIN32_STREAM_ID) - sizeof (WCHAR**); - - /* Read the WIN32_STREAM_ID in */ - - while (BackupRead (hFileSource, (LPBYTE) &StreamId, StreamSize, - &dwBytesWritten, - FALSE, // don't abort yet - FALSE, // don't process security - &lpContext)) - { - DWORD sl,sh; - - if (dwBytesWritten == 0) /* No more Stream IDs */ - break; - /* skip StreamName */ - if (StreamId.dwStreamNameSize) - { - unsigned char *buf; - buf = (unsigned char *) malloc (StreamId.dwStreamNameSize); - - if (buf == NULL) - break; - - if (!BackupRead (hFileSource, buf, // buffer to read - StreamId.dwStreamNameSize, // num bytes to read - &dwBytesWritten, - FALSE, // don't abort yet - FALSE, // don't process security - &lpContext)) // Stream name read error - { - free (buf); - break; - } - free (buf); - } - - /* Is it EA stream? */ - if (StreamId.dwStreamId == BACKUP_EA_DATA) - { - unsigned char *buf; - buf = (unsigned char *) malloc (StreamId.Size.LowPart); - - if (buf == NULL) - break; - if (!BackupRead (hFileSource, buf, // buffer to read - StreamId.Size.LowPart, // num bytes to write - &dwBytesWritten, - FALSE, // don't abort yet - FALSE, // don't process security - &lpContext)) - { - free (buf); /* EA read error */ - break; - } - eafound = (PFILE_FULL_EA_INFORMATION) buf; - *len = StreamId.Size.LowPart; - break; - } - /* Skip current stream */ - if (!BackupSeek (hFileSource, - StreamId.Size.LowPart, - StreamId.Size.HighPart, - &sl, - &sh, - &lpContext)) - break; - } - - /* free context */ - BackupRead ( - hFileSource, - NULL, // buffer to write - 0, // number of bytes to write - &dwBytesWritten, - TRUE, // abort - FALSE, // don't process security - &lpContext); - - return eafound; -} - -/* - * NTWriteEA - write file's Extended Attribute. - * - * Parameters: - * file - pointer to filename - * attrname- pointer to EA name (case insensitivy. EAs are sored in upper - * case). - * buf - pointer to buffer with EA value. - * len - length of buf. - * Return value: - * true if success, false otherwice. - * Note: if len=0 given EA will be deleted. - */ - -BOOL __stdcall -NTWriteEA (const char *file, const char *attrname, const char *buf, int len) -{ - HANDLE hFileSource; - WIN32_STREAM_ID StreamId; - DWORD dwBytesWritten; - LPVOID lpContext; - DWORD StreamSize, easize; - bool bSuccess = false; - PFILE_FULL_EA_INFORMATION ea; - - hFileSource = CreateFile (file, FILE_WRITE_EA, - FILE_SHARE_READ | FILE_SHARE_WRITE, - &sec_none_nih, // sa - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, - NULL); - - if (hFileSource == INVALID_HANDLE_VALUE) - return FALSE; - - lpContext = NULL; - StreamSize = sizeof (WIN32_STREAM_ID) - sizeof (WCHAR**); - - /* FILE_FULL_EA_INFORMATION structure is longword-aligned */ - easize = sizeof (*ea) - sizeof (WCHAR**) + strlen (attrname) + 1 + len - + (sizeof (DWORD) - 1); - easize &= ~(sizeof (DWORD) - 1); - - if ((ea = (PFILE_FULL_EA_INFORMATION) malloc (easize)) == NULL) - goto cleanup; - - memset (ea, 0, easize); - ea->EaNameLength = strlen (attrname); - ea->EaValueLength = len; - strcpy (ea->EaName, attrname); - memcpy (ea->EaName + (ea->EaNameLength + 1), buf, len); - - StreamId.dwStreamId = BACKUP_EA_DATA; - StreamId.dwStreamAttributes = 0; - StreamId.Size.HighPart = 0; - StreamId.Size.LowPart = easize; - StreamId.dwStreamNameSize = 0; - - if (!BackupWrite (hFileSource, (LPBYTE) &StreamId, StreamSize, - &dwBytesWritten, - FALSE, // don't abort yet - FALSE, // don't process security - &lpContext)) - goto cleanup; - - if (!BackupWrite (hFileSource, (LPBYTE) ea, easize, - &dwBytesWritten, - FALSE, // don't abort yet - FALSE, // don't process security - &lpContext)) - goto cleanup; - - bSuccess = true; - /* free context */ - -cleanup: - BackupRead (hFileSource, - NULL, // buffer to write - 0, // number of bytes to write - &dwBytesWritten, - TRUE, // abort - FALSE, // don't process security - &lpContext); - - CloseHandle (hFileSource); - if (ea) - free (ea); - - return bSuccess; -} diff --git a/winsup/cygwin/passwd.cc b/winsup/cygwin/passwd.cc deleted file mode 100644 index 127d32380..000000000 --- a/winsup/cygwin/passwd.cc +++ /dev/null @@ -1,309 +0,0 @@ -/* passwd.cc: getpwnam () and friends - - Copyright 1996, 1997, 1998, 2001, 2002, 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "pinfo.h" -#include "cygheap.h" -#include -#include "pwdgrp.h" - -/* Read /etc/passwd only once for better performance. This is done - on the first call that needs information from it. */ - -passwd *passwd_buf; -static pwdgrp pr (passwd_buf); - -/* Parse /etc/passwd line into passwd structure. */ -bool -pwdgrp::parse_passwd () -{ -# define res (*passwd_buf)[curr_lines] - res.pw_name = next_str (':'); - res.pw_passwd = next_str (':'); - if (!next_num (res.pw_uid)) - return false; - if (!next_num (res.pw_gid)) - return false; - res.pw_comment = NULL; - res.pw_gecos = next_str (':'); - res.pw_dir = next_str (':'); - res.pw_shell = next_str (':'); - return true; -# undef res -} - -/* Read in /etc/passwd and save contents in the password cache. - This sets pr to loaded or emulated so functions in this file can - tell that /etc/passwd has been read in or will be emulated. */ -void -pwdgrp::read_passwd () -{ - load ("/etc/passwd"); - - char strbuf[128] = ""; - bool searchentry = true; - struct passwd *pw; - - if (wincap.has_security ()) - { - /* must be static */ - static char NO_COPY pretty_ls[] = "????????:*:-1:-1:"; - add_line (pretty_ls); - cygsid tu = cygheap->user.sid (); - tu.string (strbuf); - if (myself->uid == ILLEGAL_UID) - searchentry = !internal_getpwsid (tu); - } - else if (myself->uid == ILLEGAL_UID) - searchentry = !internal_getpwuid (DEFAULT_UID); - if (searchentry && - (!(pw = internal_getpwnam (cygheap->user.name ())) || - (myself->uid != ILLEGAL_UID && - myself->uid != (__uid32_t) pw->pw_uid && - !internal_getpwuid (myself->uid)))) - { - static char linebuf[1024]; // must be static and - // should not be NO_COPY - cygheap->user.ontherange (CH_HOME, NULL); - snprintf (linebuf, sizeof (linebuf), "%s:*:%lu:%lu:,%s:%s:/bin/sh", - cygheap->user.name (), - myself->uid == ILLEGAL_UID ? UNKNOWN_UID : myself->uid, - myself->gid, - strbuf, getenv ("HOME") ?: ""); - debug_printf ("Completing /etc/passwd: %s", linebuf); - add_line (linebuf); - } -} - -struct passwd * -internal_getpwsid (cygpsid &sid) -{ - struct passwd *pw; - char *ptr1, *ptr2, *endptr; - char sid_string[128] = {0,','}; - - pr.refresh (false); - - if (sid.string (sid_string + 2)) - { - endptr = strchr (sid_string + 2, 0) - 1; - for (int i = 0; i < pr.curr_lines; i++) - if ((pw = passwd_buf + i)->pw_dir > pw->pw_gecos + 8) - for (ptr1 = endptr, ptr2 = pw->pw_dir - 2; - *ptr1 == *ptr2; ptr2--) - if (!*--ptr1) - return pw; - } - return NULL; -} - -struct passwd * -internal_getpwuid (__uid32_t uid, bool check) -{ - pr.refresh (check); - - for (int i = 0; i < pr.curr_lines; i++) - if (uid == (__uid32_t) passwd_buf[i].pw_uid) - return passwd_buf + i; - return NULL; -} - -struct passwd * -internal_getpwnam (const char *name, bool check) -{ - pr.refresh (check); - - for (int i = 0; i < pr.curr_lines; i++) - /* on Windows NT user names are case-insensitive */ - if (strcasematch (name, passwd_buf[i].pw_name)) - return passwd_buf + i; - return NULL; -} - - -extern "C" struct passwd * -getpwuid32 (__uid32_t uid) -{ - struct passwd *temppw = internal_getpwuid (uid, true); - pthread_testcancel (); - return temppw; -} - -extern "C" struct passwd * -getpwuid (__uid16_t uid) -{ - return getpwuid32 (uid16touid32 (uid)); -} - -extern "C" int -getpwuid_r32 (__uid32_t uid, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result) -{ - *result = NULL; - - if (!pwd || !buffer) - return ERANGE; - - struct passwd *temppw = internal_getpwuid (uid, true); - pthread_testcancel (); - if (!temppw) - return 0; - - /* check needed buffer size. */ - size_t needsize = strlen (temppw->pw_name) + strlen (temppw->pw_dir) + - strlen (temppw->pw_shell) + strlen (temppw->pw_gecos) + - strlen (temppw->pw_passwd) + 5; - if (needsize > bufsize) - return ERANGE; - - /* make a copy of temppw */ - *result = pwd; - pwd->pw_uid = temppw->pw_uid; - pwd->pw_gid = temppw->pw_gid; - pwd->pw_name = buffer; - pwd->pw_dir = pwd->pw_name + strlen (temppw->pw_name) + 1; - pwd->pw_shell = pwd->pw_dir + strlen (temppw->pw_dir) + 1; - pwd->pw_gecos = pwd->pw_shell + strlen (temppw->pw_shell) + 1; - pwd->pw_comment = NULL; - pwd->pw_passwd = pwd->pw_gecos + strlen (temppw->pw_gecos) + 1; - strcpy (pwd->pw_name, temppw->pw_name); - strcpy (pwd->pw_dir, temppw->pw_dir); - strcpy (pwd->pw_shell, temppw->pw_shell); - strcpy (pwd->pw_gecos, temppw->pw_gecos); - strcpy (pwd->pw_passwd, temppw->pw_passwd); - return 0; -} - -extern "C" int -getpwuid_r (__uid16_t uid, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result) -{ - return getpwuid_r32 (uid16touid32 (uid), pwd, buffer, bufsize, result); -} - -extern "C" struct passwd * -getpwnam (const char *name) -{ - struct passwd *temppw = internal_getpwnam (name, true); - pthread_testcancel (); - return temppw; -} - - -/* the max size buffer we can expect to - * use is returned via sysconf with _SC_GETPW_R_SIZE_MAX. - * This may need updating! - Rob Collins April 2001. - */ -extern "C" int -getpwnam_r (const char *nam, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result) -{ - *result = NULL; - - if (!pwd || !buffer || !nam) - return ERANGE; - - struct passwd *temppw = internal_getpwnam (nam, true); - pthread_testcancel (); - - if (!temppw) - return 0; - - /* check needed buffer size. */ - size_t needsize = strlen (temppw->pw_name) + strlen (temppw->pw_dir) + - strlen (temppw->pw_shell) + strlen (temppw->pw_gecos) + - strlen (temppw->pw_passwd) + 5; - if (needsize > bufsize) - return ERANGE; - - /* make a copy of temppw */ - *result = pwd; - pwd->pw_uid = temppw->pw_uid; - pwd->pw_gid = temppw->pw_gid; - pwd->pw_name = buffer; - pwd->pw_dir = pwd->pw_name + strlen (temppw->pw_name) + 1; - pwd->pw_shell = pwd->pw_dir + strlen (temppw->pw_dir) + 1; - pwd->pw_gecos = pwd->pw_shell + strlen (temppw->pw_shell) + 1; - pwd->pw_comment = NULL; - pwd->pw_passwd = pwd->pw_gecos + strlen (temppw->pw_gecos) + 1; - strcpy (pwd->pw_name, temppw->pw_name); - strcpy (pwd->pw_dir, temppw->pw_dir); - strcpy (pwd->pw_shell, temppw->pw_shell); - strcpy (pwd->pw_gecos, temppw->pw_gecos); - strcpy (pwd->pw_passwd, temppw->pw_passwd); - return 0; -} - -extern "C" struct passwd * -getpwent (void) -{ - if (_my_tls.locals.pw_pos == 0) - pr.refresh (true); - if (_my_tls.locals.pw_pos < pr.curr_lines) - return passwd_buf + _my_tls.locals.pw_pos++; - - return NULL; -} - -extern "C" struct passwd * -getpwduid (__uid16_t) -{ - return NULL; -} - -extern "C" void -setpwent (void) -{ - _my_tls.locals.pw_pos = 0; -} - -extern "C" void -endpwent (void) -{ - _my_tls.locals.pw_pos = 0; -} - -extern "C" int -setpassent () -{ - return 0; -} - -extern "C" char * -getpass (const char * prompt) -{ - char *pass = _my_tls.locals.pass; - struct termios ti, newti; - - cygheap_fdget fhstdin (0); - - if (fhstdin < 0) - pass[0] = '\0'; - else - { - fhstdin->tcgetattr (&ti); - newti = ti; - newti.c_lflag &= ~ECHO; - fhstdin->tcsetattr (TCSANOW, &newti); - fputs (prompt, stderr); - fgets (pass, _PASSWORD_LEN, stdin); - fprintf (stderr, "\n"); - for (int i=0; pass[i]; i++) - if (pass[i] == '\r' || pass[i] == '\n') - pass[i] = '\0'; - fhstdin->tcsetattr (TCSANOW, &ti); - } - return pass; -} diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc deleted file mode 100644 index 44ceb6c1c..000000000 --- a/winsup/cygwin/path.cc +++ /dev/null @@ -1,4314 +0,0 @@ -/* path.cc: path support. - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* This module's job is to - - convert between POSIX and Win32 style filenames, - - support the `mount' functionality, - - support symlinks for files and directories - - Pathnames are handled as follows: - - - A \ or : in a path denotes a pure windows spec. - - Paths beginning with // (or \\) are not translated (i.e. looked - up in the mount table) and are assumed to be UNC path names. - - The goal in the above set of rules is to allow both POSIX and Win32 - flavors of pathnames without either interfering. The rules are - intended to be as close to a superset of both as possible. - - Note that you can have more than one path to a file. The mount - table is always prefered when translating Win32 paths to POSIX - paths. Win32 paths in mount table entries may be UNC paths or - standard Win32 paths starting with : - - Text vs Binary issues are not considered here in path style - decisions, although the appropriate flags are retrieved and - stored in various structures. - - Removing mounted filesystem support would simplify things greatly, - but having it gives us a mechanism of treating disk that lives on a - UNIX machine as having UNIX semantics [it allows one to edit a text - file on that disk and not have cr's magically appear and perhaps - break apps running on UNIX boxes]. It also useful to be able to - layout a hierarchy without changing the underlying directories. - - The semantics of mounting file systems is not intended to precisely - follow normal UNIX systems. - - Each DOS drive is defined to have a current directory. Supporting - this would complicate things so for now things are defined so that - c: means c:\. -*/ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "sync.h" -#include "sigproc.h" -#include "pinfo.h" -#include "dtable.h" -#include "cygheap.h" -#include "shared_info.h" -#include "registry.h" -#include "cygtls.h" -#include - -static int normalize_win32_path (const char *, char *, char *&); -static void slashify (const char *, char *, int); -static void backslashify (const char *, char *, int); - -struct symlink_info -{ - char contents[CYG_MAX_PATH + 4]; - char *ext_here; - int extn; - unsigned pflags; - DWORD fileattr; - int issymlink; - bool ext_tacked_on; - int error; - bool case_clash; - bool isdevice; - _major_t major; - _minor_t minor; - _mode_t mode; - int check (char *path, const suffix_info *suffixes, unsigned opt); - int set (char *path); - bool parse_device (const char *); - bool case_check (char *path); - int check_sysfile (const char *path, HANDLE h); - int check_shortcut (const char *path, HANDLE h); - bool set_error (int); -}; - -muto NO_COPY cwdstuff::cwd_lock; - -int pcheck_case = PCHECK_RELAXED; /* Determines the case check behaviour. */ - -static const GUID GUID_shortcut - = { 0x00021401L, 0, 0, 0xc0, 0, 0, 0, 0, 0, 0, 0x46 }; - -enum { - WSH_FLAG_IDLIST = 0x01, /* Contains an ITEMIDLIST. */ - WSH_FLAG_FILE = 0x02, /* Contains a file locator element. */ - WSH_FLAG_DESC = 0x04, /* Contains a description. */ - WSH_FLAG_RELPATH = 0x08, /* Contains a relative path. */ - WSH_FLAG_WD = 0x10, /* Contains a working dir. */ - WSH_FLAG_CMDLINE = 0x20, /* Contains command line args. */ - WSH_FLAG_ICON = 0x40 /* Contains a custom icon. */ -}; - -struct win_shortcut_hdr - { - DWORD size; /* Header size in bytes. Must contain 0x4c. */ - GUID magic; /* GUID of shortcut files. */ - DWORD flags; /* Content flags. See above. */ - - /* The next fields from attr to icon_no are always set to 0 in Cygwin - and U/Win shortcuts. */ - DWORD attr; /* Target file attributes. */ - FILETIME ctime; /* These filetime items are never touched by the */ - FILETIME mtime; /* system, apparently. Values don't matter. */ - FILETIME atime; - DWORD filesize; /* Target filesize. */ - DWORD icon_no; /* Icon number. */ - - DWORD run; /* Values defined in winuser.h. Use SW_NORMAL. */ - DWORD hotkey; /* Hotkey value. Set to 0. */ - DWORD dummy[2]; /* Future extension probably. Always 0. */ - }; - -/* Determine if path prefix matches current cygdrive */ -#define iscygdrive(path) \ - (path_prefix_p (mount_table->cygdrive, (path), mount_table->cygdrive_len)) - -#define iscygdrive_device(path) \ - (isalpha (path[mount_table->cygdrive_len]) && \ - (path[mount_table->cygdrive_len + 1] == '/' || \ - !path[mount_table->cygdrive_len + 1])) - -#define isproc(path) \ - (path_prefix_p (proc, (path), proc_len)) - -#define isvirtual_dev(devn) \ - (devn == FH_CYGDRIVE || devn == FH_PROC || devn == FH_REGISTRY \ - || devn == FH_PROCESS || devn == FH_NETDRIVE ) - -/* Return non-zero if PATH1 is a prefix of PATH2. - Both are assumed to be of the same path style and / vs \ usage. - Neither may be "". - LEN1 = strlen (PATH1). It's passed because often it's already known. - - Examples: - /foo/ is a prefix of /foo <-- may seem odd, but desired - /foo is a prefix of /foo/ - / is a prefix of /foo/bar - / is not a prefix of foo/bar - foo/ is a prefix foo/bar - /foo is not a prefix of /foobar -*/ - -int -path_prefix_p (const char *path1, const char *path2, int len1) -{ - /* Handle case where PATH1 has trailing '/' and when it doesn't. */ - if (len1 > 0 && isdirsep (path1[len1 - 1])) - len1--; - - if (len1 == 0) - return isdirsep (path2[0]) && !isdirsep (path2[1]); - - if (isdirsep (path2[len1]) || path2[len1] == 0 || path1[len1 - 1] == ':') - return pathnmatch (path1, path2, len1); - - return 0; -} - -/* Return non-zero if paths match in first len chars. - Check is dependent of the case sensitivity setting. */ -int -pathnmatch (const char *path1, const char *path2, int len) -{ - return pcheck_case == PCHECK_STRICT ? !strncmp (path1, path2, len) - : strncasematch (path1, path2, len); -} - -/* Return non-zero if paths match. Check is dependent of the case - sensitivity setting. */ -int -pathmatch (const char *path1, const char *path2) -{ - return pcheck_case == PCHECK_STRICT ? !strcmp (path1, path2) - : strcasematch (path1, path2); -} - -/* TODO: This function is used in mkdir and rmdir to generate correct - error messages in case of paths ending in /. or /.. components. - This test should eventually end up in path_conv::check in one way - or another. Right now, normalize_posix_path will just normalize - those components away, which changes the semantics. */ -bool -has_dot_last_component (const char *dir) -{ - /* SUSv3: . and .. are not allowed as last components in various system - calls. Don't test for backslash path separator since that's a Win32 - path following Win32 rules. */ - const char *last_comp = strrchr (dir, '/'); - return last_comp - && last_comp[1] == '.' - && (last_comp[2] == '\0' - || (last_comp[2] == '.' && last_comp[3] == '\0')); -} - -#define isslash(c) ((c) == '/') - -/* Normalize a POSIX path. - All duplicate /'s, except for 2 leading /'s, are deleted. - The result is 0 for success, or an errno error value. */ - -static int -normalize_posix_path (const char *src, char *dst, char *&tail) -{ - const char *in_src = src; - char *dst_start = dst; - syscall_printf ("src %s", src); - - if (isdrive (src) || *src == '\\') - goto win32_path; - - tail = dst; - if (!isslash (src[0])) - { - if (!cygheap->cwd.get (dst)) - return get_errno (); - tail = strchr (tail, '\0'); - if (isslash (dst[0]) && isslash (dst[1])) - ++dst_start; - if (*src == '.') - { - if (tail == dst_start + 1 && *dst_start == '/') - tail--; - goto sawdot; - } - if (tail > dst && !isslash (tail[-1])) - *tail++ = '/'; - } - /* Two leading /'s? If so, preserve them. */ - else if (isslash (src[1]) && !isslash (src[2])) - { - *tail++ = *src++; - ++dst_start; - } - - while (*src) - { - if (*src == '\\') - goto win32_path; - /* Strip runs of /'s. */ - if (!isslash (*src)) - *tail++ = *src++; - else - { - while (*++src) - { - if (isslash (*src)) - continue; - - if (*src != '.') - break; - - sawdot: - if (src[1] != '.') - { - if (!src[1]) - { - *tail++ = '/'; - goto done; - } - if (!isslash (src[1])) - break; - } - else if (src[2] && !isslash (src[2])) - break; - else - { - while (tail > dst_start && !isslash (*--tail)) - continue; - src++; - } - } - - *tail++ = '/'; - } - if ((tail - dst) >= CYG_MAX_PATH) - { - debug_printf ("ENAMETOOLONG = normalize_posix_path (%s)", src); - return ENAMETOOLONG; - } - } - -done: - *tail = '\0'; - - debug_printf ("%s = normalize_posix_path (%s)", dst, in_src); - return 0; - -win32_path: - int err = normalize_win32_path (in_src, dst, tail); - if (!err) - for (char *p = dst; (p = strchr (p, '\\')); p++) - *p = '/'; - return err; -} - -inline void -path_conv::add_ext_from_sym (symlink_info &sym) -{ - if (sym.ext_here && *sym.ext_here) - { - known_suffix = path + sym.extn; - if (sym.ext_tacked_on) - strcpy (known_suffix, sym.ext_here); - } -} - -static void __stdcall mkrelpath (char *dst) __attribute__ ((regparm (2))); -static void __stdcall -mkrelpath (char *path) -{ - char cwd_win32[CYG_MAX_PATH]; - if (!cygheap->cwd.get (cwd_win32, 0)) - return; - - unsigned cwdlen = strlen (cwd_win32); - if (!path_prefix_p (cwd_win32, path, cwdlen)) - return; - - size_t n = strlen (path); - if (n < cwdlen) - return; - - char *tail = path; - if (n == cwdlen) - tail += cwdlen; - else - tail += isdirsep (cwd_win32[cwdlen - 1]) ? cwdlen : cwdlen + 1; - - memmove (path, tail, strlen (tail) + 1); - if (!*path) - strcpy (path, "."); -} - -#define MAX_FS_INFO_CNT 25 -fs_info fsinfo[MAX_FS_INFO_CNT]; -LONG fsinfo_cnt; - -bool -fs_info::update (const char *win32_path) -{ - char fsname [CYG_MAX_PATH]; - char root_dir [CYG_MAX_PATH]; - bool ret; - - if (!rootdir (win32_path, root_dir)) - { - debug_printf ("Cannot get root component of path %s", win32_path); - clear (); - return false; - } - - __ino64_t tmp_name_hash = hash_path_name (1, root_dir); - if (tmp_name_hash == name_hash) - return true; - int idx = 0; - LONG cur_fsinfo_cnt = fsinfo_cnt; - while (idx < cur_fsinfo_cnt && fsinfo[idx].name_hash) - { - if (tmp_name_hash == fsinfo[idx].name_hash) - { - *this = fsinfo[idx]; - return true; - } - ++idx; - } - name_hash = tmp_name_hash; - - /* I have no idea why, but some machines require SeChangeNotifyPrivilege - to access volume information. */ - push_thread_privilege (SE_CHANGE_NOTIFY_PRIV, true); - - drive_type (GetDriveType (root_dir)); - if (drive_type () == DRIVE_REMOTE - || (drive_type () == DRIVE_UNKNOWN - && (root_dir[0] == '\\' && root_dir[1] == '\\'))) - is_remote_drive (true); - else - is_remote_drive (false); - - ret = GetVolumeInformation (root_dir, NULL, 0, &status.serial, NULL, - &status.flags, fsname, sizeof (fsname)); - - pop_thread_privilege (); - - if (!ret && !is_remote_drive ()) - { - debug_printf ("Cannot get volume information (%s), %E", root_dir); - has_buggy_open (false); - has_ea (false); - flags () = serial () = 0; - return false; - } - - /* FIXME: Samba by default returns "NTFS" in file system name, but - * doesn't support Extended Attributes. If there's some fast way to - * distinguish between samba and real ntfs, it should be implemented - * here. - */ - has_ea (!is_remote_drive () && strcmp (fsname, "NTFS") == 0); - has_acls ((flags () & FS_PERSISTENT_ACLS) - && (allow_smbntsec || !is_remote_drive ())); - is_fat (strncasematch (fsname, "FAT", 3)); - /* Known file systems with buggy open calls. Further explanation - in fhandler.cc (fhandler_disk_file::open). */ - has_buggy_open (!strcmp (fsname, "SUNWNFS")); - - /* Only append non-removable drives to the global fsinfo storage */ - if (drive_type () != DRIVE_REMOVABLE && drive_type () != DRIVE_CDROM - && idx < MAX_FS_INFO_CNT) - { - LONG exc_cnt; - while ((exc_cnt = InterlockedExchange (&fsinfo_cnt, -1)) == -1) - low_priority_sleep (0); - if (exc_cnt < MAX_FS_INFO_CNT) - { - /* Check if another thread has already appended that very drive */ - while (idx < exc_cnt) - { - if (fsinfo[idx++].name_hash == name_hash) - goto done; - } - fsinfo[exc_cnt++] = *this; - } - done: - InterlockedExchange (&fsinfo_cnt, exc_cnt); - } - return true; -} - -void -path_conv::fillin (HANDLE h) -{ - BY_HANDLE_FILE_INFORMATION local; - if (!GetFileInformationByHandle (h, &local)) - { - fileattr = INVALID_FILE_ATTRIBUTES; - fs.serial () = 0; - } - else - { - fileattr = local.dwFileAttributes; - fs.serial () = local.dwVolumeSerialNumber; - } - fs.drive_type (DRIVE_UNKNOWN); -} - -void -path_conv::set_normalized_path (const char *path_copy, bool strip_tail) -{ - char *p = strchr (path_copy, '\0'); - - if (strip_tail) - { - while (*--p == '.' || *p == ' ') - continue; - *++p = '\0'; - } - - size_t n = 1 + p - path_copy; - - normalized_path = path + sizeof (path) - n; - - char *eopath = strchr (path, '\0'); - if (normalized_path > eopath) - normalized_path_size = n; - else - { - normalized_path = (char *) cmalloc (HEAP_STR, n); - normalized_path_size = 0; - } - - memcpy (normalized_path, path_copy, n); -} - -PUNICODE_STRING -path_conv::get_nt_native_path (UNICODE_STRING &upath) -{ - if (path[0] != '\\') /* X:\... or NUL, etc. */ - { - str2uni_cat (upath, "\\??\\"); - str2uni_cat (upath, path); - } - else if (path[1] != '\\') /* \Device\... */ - str2uni_cat (upath, path); - else if (path[2] != '.' - || path[3] != '\\') /* \\server\share\... */ - { - str2uni_cat (upath, "\\??\\UNC\\"); - str2uni_cat (upath, path + 2); - } - else /* \\.\device */ - { - str2uni_cat (upath, "\\??\\"); - str2uni_cat (upath, path + 4); - } - return &upath; -} - -/* Convert an arbitrary path SRC to a pure Win32 path, suitable for - passing to Win32 API routines. - - If an error occurs, `error' is set to the errno value. - Otherwise it is set to 0. - - follow_mode values: - SYMLINK_FOLLOW - convert to PATH symlink points to - SYMLINK_NOFOLLOW - convert to PATH of symlink itself - SYMLINK_IGNORE - do not check PATH for symlinks - SYMLINK_CONTENTS - just return symlink contents -*/ - -void -path_conv::check (const char *src, unsigned opt, - const suffix_info *suffixes) -{ - /* This array is used when expanding symlinks. It is CYG_MAX_PATH * 2 - in length so that we can hold the expanded symlink plus a - trailer. */ - char path_copy[CYG_MAX_PATH + 3]; - char tmp_buf[2 * CYG_MAX_PATH + 3]; - symlink_info sym; - bool need_directory = 0; - bool saw_symlinks = 0; - bool is_relpath; - char *tail, *path_end; - -#if 0 - static path_conv last_path_conv; - static char last_src[CYG_MAX_PATH]; - - if (*last_src && strcmp (last_src, src) == 0) - { - *this = last_path_conv; - return; - } -#endif - - myfault efault; - if (efault.faulted ()) - { - error = EFAULT; - return; - } - int loop = 0; - path_flags = 0; - known_suffix = NULL; - fileattr = INVALID_FILE_ATTRIBUTES; - case_clash = false; - memset (&dev, 0, sizeof (dev)); - fs.clear (); - normalized_path = NULL; - int component = 0; // Number of translated components - - if (!(opt & PC_NULLEMPTY)) - error = 0; - else if (!*src) - { - error = ENOENT; - return; - } - - /* This loop handles symlink expansion. */ - for (;;) - { - MALLOC_CHECK; - assert (src); - - is_relpath = !isabspath (src); - error = normalize_posix_path (src, path_copy, tail); - if (error) - return; - - /* Detect if the user was looking for a directory. We have to strip the - trailing slash initially while trying to add extensions but take it - into account during processing */ - if (tail > path_copy + 2 && isslash (tail[-1])) - { - need_directory = 1; - *--tail = '\0'; - } - path_end = tail; - - /* Scan path_copy from right to left looking either for a symlink - or an actual existing file. If an existing file is found, just - return. If a symlink is found, exit the for loop. - Also: be careful to preserve the errno returned from - symlink.check as the caller may need it. */ - /* FIXME: Do we have to worry about multiple \'s here? */ - component = 0; // Number of translated components - sym.contents[0] = '\0'; - - int symlen = 0; - - for (unsigned pflags_or = opt & PC_NO_ACCESS_CHECK; ; pflags_or = 0) - { - const suffix_info *suff; - char pathbuf[CYG_MAX_PATH]; - char *full_path; - - /* Don't allow symlink.check to set anything in the path_conv - class if we're working on an inner component of the path */ - if (component) - { - suff = NULL; - sym.pflags = 0; - full_path = pathbuf; - } - else - { - suff = suffixes; - sym.pflags = path_flags; - full_path = this->path; - } - - /* Convert to native path spec sans symbolic link info. */ - error = mount_table->conv_to_win32_path (path_copy, full_path, dev, - &sym.pflags); - - if (error) - return; - - sym.pflags |= pflags_or; - - if (dev.major == DEV_CYGDRIVE_MAJOR) - { - if (!component) - fileattr = FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_READONLY; - else - { - fileattr = GetFileAttributes (this->path); - dev.devn = FH_FS; - } - goto out; - } - else if (dev == FH_DEV) - { - dev.devn = FH_FS; -#if 0 - fileattr = GetFileAttributes (this->path); - if (!component && fileattr == INVALID_FILE_ATTRIBUTES) - { - fileattr = FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_READONLY; - goto out; - } -#endif - } - else if (isvirtual_dev (dev.devn)) - { - /* FIXME: Calling build_fhandler here is not the right way to handle this. */ - fhandler_virtual *fh = (fhandler_virtual *) build_fh_dev (dev, path_copy); - int file_type = fh->exists (); - if (file_type == -2) - { - fh->fill_filebuf (); - symlen = sym.set (fh->get_filebuf ()); - } - delete fh; - switch (file_type) - { - case 1: - case 2: - if (component == 0) - fileattr = FILE_ATTRIBUTE_DIRECTORY; - break; - case -1: - if (component == 0) - fileattr = 0; - break; - case -2: /* /proc/self or /proc//symlinks */ - goto is_virtual_symlink; - case -3: /* /proc//fd/pipe:[] */ - if (component == 0) - { - fileattr = 0; - dev.parse (FH_PIPE); - } - break; - case -4: /* /proc//fd/socket:[] */ - if (component == 0) - { - fileattr = 0; - dev.parse (FH_TCP); - } - break; - default: - if (component == 0) - fileattr = INVALID_FILE_ATTRIBUTES; - goto virtual_component_retry; - } - if (component == 0 || dev.devn != FH_NETDRIVE) - path_flags |= PATH_RO; - goto out; - } - /* devn should not be a device. If it is, then stop parsing now. */ - else if (dev.devn != FH_FS) - { - fileattr = 0; - path_flags = sym.pflags; - if (component) - { - error = ENOTDIR; - return; - } - goto out; /* Found a device. Stop parsing. */ - } - - /* If path is only a drivename, Windows interprets it as the - current working directory on this drive instead of the root - dir which is what we want. So we need the trailing backslash - in this case. */ - if (full_path[0] && full_path[1] == ':' && full_path[2] == '\0') - { - full_path[2] = '\\'; - full_path[3] = '\0'; - } - - symlen = sym.check (full_path, suff, opt | fs.has_ea ()); - -is_virtual_symlink: - - if (sym.isdevice) - { - dev.parse (sym.major, sym.minor); - dev.setfs (1); - dev.mode = sym.mode; - fileattr = sym.fileattr; - goto out; - } - - if (sym.pflags & PATH_SOCKET) - { - if (component) - { - error = ENOTDIR; - return; - } - fileattr = sym.fileattr; - dev.parse (FH_UNIX); - dev.setfs (1); - goto out; - } - - if (sym.case_clash) - { - if (pcheck_case == PCHECK_STRICT) - { - case_clash = true; - error = ENOENT; - goto out; - } - /* If pcheck_case==PCHECK_ADJUST the case_clash is remembered - if the last component is concerned. This allows functions - which shall create files to avoid overriding already existing - files with another case. */ - if (!component) - case_clash = true; - } - if (!(opt & PC_SYM_IGNORE)) - { - if (!component) - { - fileattr = sym.fileattr; - path_flags = sym.pflags; - } - - /* If symlink.check found an existing non-symlink file, then - it sets the appropriate flag. It also sets any suffix found - into `ext_here'. */ - if (!sym.issymlink && sym.fileattr != INVALID_FILE_ATTRIBUTES) - { - error = sym.error; - if (component == 0) - add_ext_from_sym (sym); - else if (!(sym.fileattr & FILE_ATTRIBUTE_DIRECTORY)) - { - error = ENOTDIR; - goto out; - } - if (pcheck_case == PCHECK_RELAXED) - goto out; // file found - /* Avoid further symlink evaluation. Only case checks are - done now. */ - opt |= PC_SYM_IGNORE; - } - /* Found a symlink if symlen > 0. If component == 0, then the - src path itself was a symlink. If !follow_mode then - we're done. Otherwise we have to insert the path found - into the full path that we are building and perform all of - these operations again on the newly derived path. */ - else if (symlen > 0) - { - saw_symlinks = 1; - if (component == 0 && !need_directory && !(opt & PC_SYM_FOLLOW)) - { - set_symlink (symlen); // last component of path is a symlink. - if (opt & PC_SYM_CONTENTS) - { - strcpy (path, sym.contents); - goto out; - } - add_ext_from_sym (sym); - if (pcheck_case == PCHECK_RELAXED) - goto out; - /* Avoid further symlink evaluation. Only case checks are - done now. */ - opt |= PC_SYM_IGNORE; - } - else - break; - } - else if (sym.error && sym.error != ENOENT && sym.error != ENOSHARE) - { - error = sym.error; - goto out; - } - /* No existing file found. */ - } - -virtual_component_retry: - /* Find the new "tail" of the path, e.g. in '/for/bar/baz', - /baz is the tail. */ - if (tail != path_end) - *tail = '/'; - while (--tail > path_copy + 1 && *tail != '/') {} - /* Exit loop if there is no tail or we are at the - beginning of a UNC path */ - if (tail <= path_copy + 1) - goto out; // all done - - /* Haven't found an existing pathname component yet. - Pinch off the tail and try again. */ - *tail = '\0'; - component++; - } - - /* Arrive here if above loop detected a symlink. */ - if (++loop > MAX_LINK_DEPTH) - { - error = ELOOP; // Eep. - return; - } - - MALLOC_CHECK; - - - /* Place the link content, possibly with head and/or tail, in tmp_buf */ - - char *headptr; - if (isabspath (sym.contents)) - headptr = tmp_buf; /* absolute path */ - else - { - /* Copy the first part of the path (with ending /) and point to the end. */ - char *prevtail = tail; - while (--prevtail > path_copy && *prevtail != '/') {} - int headlen = prevtail - path_copy + 1;; - memcpy (tmp_buf, path_copy, headlen); - headptr = &tmp_buf[headlen]; - } - - /* Make sure there is enough space */ - if (headptr + symlen >= tmp_buf + sizeof (tmp_buf)) - { - too_long: - error = ENAMETOOLONG; - strcpy (path, "::ENAMETOOLONG::"); - return; - } - - /* Copy the symlink contents to the end of tmp_buf. - Convert slashes. */ - for (char *p = sym.contents; *p; p++) - *headptr++ = *p == '\\' ? '/' : *p; - *headptr = '\0'; - - /* Copy any tail component (with the 0) */ - if (tail++ < path_end) - { - /* Add a slash if needed. There is space. */ - if (*(headptr - 1) != '/') - *headptr++ = '/'; - int taillen = path_end - tail + 1; - if (headptr + taillen > tmp_buf + sizeof (tmp_buf)) - goto too_long; - memcpy (headptr, tail, taillen); - } - - /* Evaluate everything all over again. */ - src = tmp_buf; - } - - if (!(opt & PC_SYM_CONTENTS)) - add_ext_from_sym (sym); - -out: - bool strip_tail = false; - if (dev.devn == FH_NETDRIVE && component) - { - /* This case indicates a non-existant resp. a non-retrievable - share. This happens for instance if the share is a printer. - In this case the path must not be treated like a FH_NETDRIVE, - but like a FH_FS instead, so the usual open call for files - is used on it. */ - dev.parse (FH_FS); - } - else if (isvirtual_dev (dev.devn) && fileattr == INVALID_FILE_ATTRIBUTES) - { - error = dev.devn == FH_NETDRIVE ? ENOSHARE : ENOENT; - return; - } - else if (!need_directory || error) - /* nothing to do */; - else if (fileattr & FILE_ATTRIBUTE_DIRECTORY) - path_flags &= ~PATH_SYMLINK; - else - { - debug_printf ("%s is a non-directory", path); - error = ENOTDIR; - return; - } - - if (dev.isfs ()) - { - if (strncmp (path, "\\\\.\\", 4)) - { - /* Windows ignores trailing dots and spaces in the last path - component, and ignores exactly one trailing dot in inner - path components. */ - char *tail = NULL; - for (char *p = path; *p; p++) - { - if (*p != '.' && *p != ' ') - tail = NULL; - else if (!tail) - tail = p; - if (tail && p[1] == '\\') - { - if (p > tail || *tail != '.') - { - error = ENOENT; - return; - } - tail = NULL; - } - } - - if (!tail || tail == path) - /* nothing */; - else if (tail[-1] != '\\') - { - *tail = '\0'; - strip_tail = true; - } - else - { - error = ENOENT; - return; - } - } - - if (fs.update (path)) - { - debug_printf ("this->path(%s), has_acls(%d)", path, fs.has_acls ()); - if (fs.has_acls () && allow_ntsec) - set_exec (0); /* We really don't know if this is executable or not here - but set it to not executable since it will be figured out - later by anything which cares about this. */ - } - if (exec_state () != dont_know_if_executable) - /* ok */; - else if (isdir ()) - set_exec (1); - else if (issymlink () || issocket ()) - set_exec (0); - } - -#if 0 - if (issocket ()) - devn = FH_SOCKET; -#endif - - if (opt & PC_NOFULL) - { - if (is_relpath) - mkrelpath (this->path); - if (need_directory) - { - size_t n = strlen (this->path); - /* Do not add trailing \ to UNC device names like \\.\a: */ - if (this->path[n - 1] != '\\' && - (strncmp (this->path, "\\\\.\\", 4) != 0)) - { - this->path[n] = '\\'; - this->path[n + 1] = '\0'; - } - } - } - - if (saw_symlinks) - set_has_symlinks (); - - if (!error && !isdir () && !(path_flags & PATH_ALL_EXEC)) - { - const char *p = strchr (path, '\0') - 4; - if (p >= path && - (strcasematch (".exe", p) || - strcasematch (".bat", p) || - strcasematch (".com", p))) - path_flags |= PATH_EXEC; - } - - if (!(opt & PC_POSIX)) - normalized_path_size = 0; - else - { - if (tail < path_end && tail > path_copy + 1) - *tail = '/'; - set_normalized_path (path_copy, strip_tail); - } - -#if 0 - if (!error) - { - last_path_conv = *this; - strcpy (last_src, src); - } -#endif -} - -void -path_conv::set_name (const char *win32, const char *posix) -{ - if (!normalized_path_size && normalized_path) - cfree (normalized_path); - strcpy (path, win32); - set_normalized_path (posix, false); -} - -path_conv::~path_conv () -{ - if (!normalized_path_size && normalized_path) - { - cfree (normalized_path); - normalized_path = NULL; - } -} - -/* Return true if src_path is a valid, internally supported device name. - In that case, win32_path gets the corresponding NT device name and - dev is appropriately filled with device information. */ - -static bool -win32_device_name (const char *src_path, char *win32_path, device& dev) -{ - dev.parse (src_path); - if (dev == FH_FS || dev == FH_DEV) - return false; - strcpy (win32_path, dev.native); - return true; -} - -/* is_unc_share: Return non-zero if PATH begins with //UNC/SHARE */ - -static bool __stdcall -is_unc_share (const char *path) -{ - const char *p; - return (isdirsep (path[0]) - && isdirsep (path[1]) - && (isalnum (path[2]) || path[2] == '.') - && ((p = strpbrk (path + 3, "\\/")) != NULL) - && isalnum (p[1])); -} - -/* Normalize a Win32 path. - /'s are converted to \'s in the process. - All duplicate \'s, except for 2 leading \'s, are deleted. - - The result is 0 for success, or an errno error value. - FIXME: A lot of this should be mergeable with the POSIX critter. */ -static int -normalize_win32_path (const char *src, char *dst, char *&tail) -{ - const char *src_start = src; - bool beg_src_slash = isdirsep (src[0]); - - tail = dst; - if (beg_src_slash && isdirsep (src[1])) - { - if (isdirsep (src[2])) - { - /* More than two slashes are just folded into one. */ - src += 2; - while (isdirsep (src[1])) - ++src; - } - else - { - /* Two slashes start a network or device path. */ - *tail++ = '\\'; - src++; - if (src[1] == '.' && isdirsep (src[2])) - { - *tail++ = '\\'; - *tail++ = '.'; - src += 2; - } - } - } - if (tail == dst && !isdrive (src) && *src != '/') - { - if (beg_src_slash) - tail += cygheap->cwd.get_drive (dst); - else if (!cygheap->cwd.get (dst, 0)) - return get_errno (); - else - { - tail = strchr (tail, '\0'); - *tail++ = '\\'; - } - } - - while (*src) - { - /* Strip duplicate /'s. */ - if (isdirsep (src[0]) && isdirsep (src[1])) - src++; - /* Ignore "./". */ - else if (src[0] == '.' && isdirsep (src[1]) - && (src == src_start || isdirsep (src[-1]))) - src += 2; - - /* Backup if "..". */ - else if (src[0] == '.' && src[1] == '.' - /* dst must be greater than dst_start */ - && tail[-1] == '\\') - { - if (!isdirsep (src[2]) && src[2] != '\0') - *tail++ = *src++; - else - { - /* Back up over /, but not if it's the first one. */ - if (tail > dst + 1) - tail--; - /* Now back up to the next /. */ - while (tail > dst + 1 && tail[-1] != '\\' && tail[-2] != ':') - tail--; - src += 2; - if (isdirsep (*src)) - src++; - } - } - /* Otherwise, add char to result. */ - else - { - if (*src == '/') - *tail++ = '\\'; - else - *tail++ = *src; - src++; - } - if ((tail - dst) >= CYG_MAX_PATH) - return ENAMETOOLONG; - } - if (tail > dst + 1 && tail[-1] == '.' && tail[-2] == '\\') - tail--; - *tail = '\0'; - debug_printf ("%s = normalize_win32_path (%s)", dst, src_start); - return 0; -} - -/* Various utilities. */ - -/* slashify: Convert all back slashes in src path to forward slashes - in dst path. Add a trailing slash to dst when trailing_slash_p arg - is set to 1. */ - -static void -slashify (const char *src, char *dst, int trailing_slash_p) -{ - const char *start = src; - - while (*src) - { - if (*src == '\\') - *dst++ = '/'; - else - *dst++ = *src; - ++src; - } - if (trailing_slash_p - && src > start - && !isdirsep (src[-1])) - *dst++ = '/'; - *dst++ = 0; -} - -/* backslashify: Convert all forward slashes in src path to back slashes - in dst path. Add a trailing slash to dst when trailing_slash_p arg - is set to 1. */ - -static void -backslashify (const char *src, char *dst, int trailing_slash_p) -{ - const char *start = src; - - while (*src) - { - if (*src == '/') - *dst++ = '\\'; - else - *dst++ = *src; - ++src; - } - if (trailing_slash_p - && src > start - && !isdirsep (src[-1])) - *dst++ = '\\'; - *dst++ = 0; -} - -/* nofinalslash: Remove trailing / and \ from SRC (except for the - first one). It is ok for src == dst. */ - -void __stdcall -nofinalslash (const char *src, char *dst) -{ - int len = strlen (src); - if (src != dst) - memcpy (dst, src, len + 1); - while (len > 1 && isdirsep (dst[--len])) - dst[len] = '\0'; -} - -/* conv_path_list: Convert a list of path names to/from Win32/POSIX. */ - -static int -conv_path_list (const char *src, char *dst, int to_posix) -{ - char src_delim, dst_delim; - int (*conv_fn) (const char *, char *); - - if (to_posix) - { - src_delim = ';'; - dst_delim = ':'; - conv_fn = cygwin_conv_to_posix_path; - } - else - { - src_delim = ':'; - dst_delim = ';'; - conv_fn = cygwin_conv_to_win32_path; - } - - char *srcbuf = (char *) alloca (strlen (src) + 1); - - int err = 0; - char *d = dst - 1; - do - { - char *s = strccpy (srcbuf, &src, src_delim); - int len = s - srcbuf; - if (len >= CYG_MAX_PATH) - { - err = ENAMETOOLONG; - break; - } - if (len) - err = conv_fn (srcbuf, ++d); - else if (!to_posix) - err = conv_fn (".", ++d); - else - continue; - if (err) - break; - d = strchr (d, '\0'); - *d = dst_delim; - } - while (*src++); - - if (d < dst) - d++; - *d = '\0'; - return err; -} - -/* init: Initialize the mount table. */ - -void -mount_info::init () -{ - nmounts = 0; - - /* Fetch the mount table and cygdrive-related information from - the registry. */ - from_registry (); -} - -static void -set_flags (unsigned *flags, unsigned val) -{ - *flags = val; - if (!(*flags & PATH_BINARY)) - { - *flags |= PATH_TEXT; - debug_printf ("flags: text (%p)", *flags & (PATH_TEXT | PATH_BINARY)); - } - else - { - *flags |= PATH_BINARY; - debug_printf ("flags: binary (%p)", *flags & (PATH_TEXT | PATH_BINARY)); - } -} - -static char dot_special_chars[] = - "." - "\001" "\002" "\003" "\004" "\005" "\006" "\007" "\010" - "\011" "\012" "\013" "\014" "\015" "\016" "\017" "\020" - "\021" "\022" "\023" "\024" "\025" "\026" "\027" "\030" - "\031" "\032" "\033" "\034" "\035" "\036" "\037" ":" - "\\" "*" "?" "%" "\"" "<" ">" "|" - "A" "B" "C" "D" "E" "F" "G" "H" - "I" "J" "K" "L" "M" "N" "O" "P" - "Q" "R" "S" "T" "U" "V" "W" "X" - "Y" "Z"; -static char *special_chars = dot_special_chars + 1; -static char special_introducers[] = - "anpcl"; - -static char -special_char (const char *s, const char *valid_chars = special_chars) -{ - if (*s != '%' || strlen (s) < 3) - return 0; - - char *p; - char hex[] = {s[1], s[2], '\0'}; - unsigned char c = strtoul (hex, &p, 16); - p = strechr (valid_chars, c); - return *p; -} - -/* Determines if name is "special". Assumes that name is empty or "absolute" */ -static int -special_name (const char *s, int inc = 1) -{ - if (!*s) - return false; - - s += inc; - - if (strcmp (s, ".") == 0 || strcmp (s, "..") == 0) - return false; - - int n; - const char *p = NULL; - if (strncasematch (s, "conin$", n = 5) - || strncasematch (s, "conout$", n = 7) - || strncasematch (s, "nul", n = 3) - || strncasematch (s, "aux", 3) - || strncasematch (s, "prn", 3) - || strncasematch (s, "con", 3)) - p = s + n; - else if (strncasematch (s, "com", 3) || strncasematch (s, "lpt", 3)) - strtoul (s + 3, (char **) &p, 10); - if (p && (*p == '\0' || *p == '.')) - return -1; - - return (strchr (s, '\0')[-1] == '.') - || (strpbrk (s, special_chars) && !strncasematch (s, "%2f", 3)); -} - -bool -fnunmunge (char *dst, const char *src) -{ - bool converted = false; - char c; - - if ((c = special_char (src, special_introducers))) - { - __small_sprintf (dst, "%c%s", c, src + 3); - if (special_name (dst, 0)) - { - *dst++ = c; - src += 3; - } - } - - while (*src) - if (!(c = special_char (src, dot_special_chars))) - *dst++ = *src++; - else - { - converted = true; - *dst++ = c; - src += 3; - } - - *dst = *src; - return converted; -} - -static bool -copy1 (char *&d, const char *&src, int& left) -{ - left--; - if (left || !*src) - *d++ = *src++; - else - return true; - return false; -} - -static bool -copyenc (char *&d, const char *&src, int& left) -{ - char buf[16]; - int n = __small_sprintf (buf, "%%%02x", (unsigned char) *src++); - left -= n; - if (left <= 0) - return true; - strcpy (d, buf); - d += n; - return false; -} - -int -mount_item::fnmunge (char *dst, const char *src, int& left) -{ - int name_type; - if (!(name_type = special_name (src))) - { - if ((int) strlen (src) >= left) - return ENAMETOOLONG; - else - strcpy (dst, src); - } - else - { - char *d = dst; - if (copy1 (d, src, left)) - return ENAMETOOLONG; - if (name_type < 0 && copyenc (d, src, left)) - return ENAMETOOLONG; - - while (*src) - if (!strchr (special_chars, *src) || (*src == '%' && !special_char (src))) - { - if (copy1 (d, src, left)) - return ENAMETOOLONG; - } - else if (copyenc (d, src, left)) - return ENAMETOOLONG; - - char dot[] = "."; - const char *p = dot; - if (*--d != '.') - d++; - else if (copyenc (d, p, left)) - return ENAMETOOLONG; - - *d = *src; - } - - backslashify (dst, dst, 0); - return 0; -} - -int -mount_item::build_win32 (char *dst, const char *src, unsigned *outflags, unsigned chroot_pathlen) -{ - int n, err = 0; - const char *real_native_path; - int real_posix_pathlen; - set_flags (outflags, (unsigned) flags); - if (!cygheap->root.exists () || posix_pathlen != 1 || posix_path[0] != '/') - { - n = native_pathlen; - real_native_path = native_path; - real_posix_pathlen = chroot_pathlen ?: posix_pathlen; - } - else - { - n = cygheap->root.native_length (); - real_native_path = cygheap->root.native_path (); - real_posix_pathlen = posix_pathlen; - } - memcpy (dst, real_native_path, n + 1); - const char *p = src + real_posix_pathlen; - if (*p == '/') - /* nothing */; - else if ((!(flags & MOUNT_ENC) && isdrive (dst) && !dst[2]) || *p) - dst[n++] = '\\'; - if (!*p || !(flags & MOUNT_ENC)) - { - if ((n + strlen (p)) >= CYG_MAX_PATH) - err = ENAMETOOLONG; - else - backslashify (p, dst + n, 0); - } - else - { - int left = CYG_MAX_PATH - n; - while (*p) - { - char slash = 0; - char *s = strchr (p + 1, '/'); - if (s) - { - slash = *s; - *s = '\0'; - } - err = fnmunge (dst += n, p, left); - if (!s || err) - break; - n = strlen (dst); - *s = slash; - p = s; - } - } - return err; -} - -/* conv_to_win32_path: Ensure src_path is a pure Win32 path and store - the result in win32_path. - - If win32_path != NULL, the relative path, if possible to keep, is - stored in win32_path. If the relative path isn't possible to keep, - the full path is stored. - - If full_win32_path != NULL, the full path is stored there. - - The result is zero for success, or an errno value. - - {,full_}win32_path must have sufficient space (i.e. CYG_MAX_PATH bytes). */ - -int -mount_info::conv_to_win32_path (const char *src_path, char *dst, device& dev, - unsigned *flags) -{ - bool chroot_ok = !cygheap->root.exists (); - while (sys_mount_table_counter < cygwin_shared->sys_mount_table_counter) - { - int current = cygwin_shared->sys_mount_table_counter; - init (); - sys_mount_table_counter = current; - } - MALLOC_CHECK; - - dev.devn = FH_FS; - - *flags = 0; - debug_printf ("conv_to_win32_path (%s)", src_path); - - int i, rc; - mount_item *mi = NULL; /* initialized to avoid compiler warning */ - - /* The path is already normalized, without ../../ stuff, we need to have this - so that we can move from one mounted directory to another with relative - stuff. - - eg mounting c:/foo /foo - d:/bar /bar - - cd /bar - ls ../foo - - should look in c:/foo, not d:/foo. - - converting normalizex UNIX path to a DOS-style path, looking up the - appropriate drive in the mount table. */ - - /* See if this is a cygwin "device" */ - if (win32_device_name (src_path, dst, dev)) - { - *flags = MOUNT_BINARY; /* FIXME: Is this a sensible default for devices? */ - rc = 0; - goto out_no_chroot_check; - } - - MALLOC_CHECK; - /* If the path is on a network drive, bypass the mount table. - If it's // or //MACHINE, use the netdrive device. */ - if (src_path[1] == '/') - { - if (!strchr (src_path + 2, '/')) - { - dev = *netdrive_dev; - set_flags (flags, PATH_BINARY); - } - backslashify (src_path, dst, 0); - /* Go through chroot check */ - goto out; - } - if (isproc (src_path)) - { - dev = *proc_dev; - dev.devn = fhandler_proc::get_proc_fhandler (src_path); - if (dev.devn == FH_BAD) - return ENOENT; - set_flags (flags, PATH_BINARY); - strcpy (dst, src_path); - goto out; - } - /* Check if the cygdrive prefix was specified. If so, just strip - off the prefix and transform it into an MS-DOS path. */ - else if (iscygdrive (src_path)) - { - int n = mount_table->cygdrive_len - 1; - int unit; - - if (!src_path[n]) - { - unit = 0; - dst[0] = '\0'; - if (mount_table->cygdrive_len > 1) - dev = *cygdrive_dev; - } - else if (cygdrive_win32_path (src_path, dst, unit)) - { - set_flags (flags, (unsigned) cygdrive_flags); - goto out; - } - else if (mount_table->cygdrive_len > 1) - return ENOENT; - } - - int chroot_pathlen; - chroot_pathlen = 0; - /* Check the mount table for prefix matches. */ - for (i = 0; i < nmounts; i++) - { - const char *path; - int len; - - mi = mount + posix_sorted[i]; - if (!cygheap->root.exists () - || (mi->posix_pathlen == 1 && mi->posix_path[0] == '/')) - { - path = mi->posix_path; - len = mi->posix_pathlen; - } - else if (cygheap->root.posix_ok (mi->posix_path)) - { - path = cygheap->root.unchroot (mi->posix_path); - chroot_pathlen = len = strlen (path); - } - else - { - chroot_pathlen = 0; - continue; - } - - if (path_prefix_p (path, src_path, len)) - break; - } - - if (i < nmounts) - { - int err = mi->build_win32 (dst, src_path, flags, chroot_pathlen); - if (err) - return err; - chroot_ok = true; - } - else - { - int offset = 0; - if (src_path[1] != '/' && src_path[1] != ':') - offset = cygheap->cwd.get_drive (dst); - backslashify (src_path, dst + offset, 0); - } - out: - MALLOC_CHECK; - if (chroot_ok || cygheap->root.ischroot_native (dst)) - rc = 0; - else - { - debug_printf ("attempt to access outside of chroot '%s - %s'", - cygheap->root.posix_path (), cygheap->root.native_path ()); - rc = ENOENT; - } - - out_no_chroot_check: - debug_printf ("src_path %s, dst %s, flags %p, rc %d", src_path, dst, *flags, rc); - return rc; -} - -int -mount_info::get_mounts_here (const char *parent_dir, int parent_dir_len, - char **mount_points) -{ - int n_mounts = 0; - - for (int i = 0; i < nmounts; i++) - { - mount_item *mi = mount + posix_sorted[i]; - char *last_slash = strrchr (mi->posix_path, '/'); - if (!last_slash) - continue; - if (last_slash == mi->posix_path) - { - if (parent_dir_len == 1 && mi->posix_pathlen > 1) - mount_points[n_mounts++] = last_slash + 1; - } - else if (parent_dir_len == last_slash - mi->posix_path - && strncasematch (parent_dir, mi->posix_path, parent_dir_len)) - mount_points[n_mounts++] = last_slash + 1; - } - return n_mounts; -} - -/* cygdrive_posix_path: Build POSIX path used as the - mount point for cygdrives created when there is no other way to - obtain a POSIX path from a Win32 one. */ - -void -mount_info::cygdrive_posix_path (const char *src, char *dst, int trailing_slash_p) -{ - int len = cygdrive_len; - - memcpy (dst, cygdrive, len + 1); - - /* Now finish the path off with the drive letter to be used. - The cygdrive prefix always ends with a trailing slash so - the drive letter is added after the path. */ - dst[len++] = cyg_tolower (src[0]); - if (!src[2] || (isdirsep (src[2]) && !src[3])) - dst[len++] = '\000'; - else - { - int n; - dst[len++] = '/'; - if (isdirsep (src[2])) - n = 3; - else - n = 2; - strcpy (dst + len, src + n); - } - slashify (dst, dst, trailing_slash_p); -} - -int -mount_info::cygdrive_win32_path (const char *src, char *dst, int& unit) -{ - int res; - const char *p = src + cygdrive_len; - if (!isalpha (*p) || (!isdirsep (p[1]) && p[1])) - { - unit = -1; /* FIXME: should be zero, maybe? */ - dst[0] = '\0'; - res = 0; - } - else - { - dst[0] = cyg_tolower (*p); - dst[1] = ':'; - strcpy (dst + 2, p + 1); - backslashify (dst, dst, !dst[2]); - unit = dst[0]; - res = 1; - } - debug_printf ("src '%s', dst '%s'", src, dst); - return res; -} - -/* conv_to_posix_path: Ensure src_path is a POSIX path. - - The result is zero for success, or an errno value. - posix_path must have sufficient space (i.e. CYG_MAX_PATH bytes). - If keep_rel_p is non-zero, relative paths stay that way. */ - -int -mount_info::conv_to_posix_path (const char *src_path, char *posix_path, - int keep_rel_p) -{ - int src_path_len = strlen (src_path); - int relative_path_p = !isabspath (src_path); - int trailing_slash_p; - - if (src_path_len <= 1) - trailing_slash_p = 0; - else - { - const char *lastchar = src_path + src_path_len - 1; - trailing_slash_p = isdirsep (*lastchar) && lastchar[-1] != ':'; - } - - debug_printf ("conv_to_posix_path (%s, %s, %s)", src_path, - keep_rel_p ? "keep-rel" : "no-keep-rel", - trailing_slash_p ? "add-slash" : "no-add-slash"); - MALLOC_CHECK; - - if (src_path_len >= CYG_MAX_PATH) - { - debug_printf ("ENAMETOOLONG"); - return ENAMETOOLONG; - } - - /* FIXME: For now, if the path is relative and it's supposed to stay - that way, skip mount table processing. */ - - if (keep_rel_p && relative_path_p) - { - slashify (src_path, posix_path, 0); - debug_printf ("%s = conv_to_posix_path (%s)", posix_path, src_path); - return 0; - } - - char pathbuf[CYG_MAX_PATH]; - char *tail; - int rc = normalize_win32_path (src_path, pathbuf, tail); - if (rc != 0) - { - debug_printf ("%d = conv_to_posix_path (%s)", rc, src_path); - return rc; - } - - int pathbuflen = tail - pathbuf; - for (int i = 0; i < nmounts; ++i) - { - mount_item &mi = mount[native_sorted[i]]; - if (!path_prefix_p (mi.native_path, pathbuf, mi.native_pathlen)) - continue; - - if (cygheap->root.exists () && !cygheap->root.posix_ok (mi.posix_path)) - continue; - - /* SRC_PATH is in the mount table. */ - int nextchar; - const char *p = pathbuf + mi.native_pathlen; - - if (!*p || !p[1]) - nextchar = 0; - else if (isdirsep (*p)) - nextchar = -1; - else - nextchar = 1; - - int addslash = nextchar > 0 ? 1 : 0; - if ((mi.posix_pathlen + (pathbuflen - mi.native_pathlen) + addslash) >= CYG_MAX_PATH) - return ENAMETOOLONG; - strcpy (posix_path, mi.posix_path); - if (addslash) - strcat (posix_path, "/"); - if (nextchar) - slashify (p, - posix_path + addslash + (mi.posix_pathlen == 1 ? 0 : mi.posix_pathlen), - trailing_slash_p); - - if (cygheap->root.exists ()) - { - const char *p = cygheap->root.unchroot (posix_path); - memmove (posix_path, p, strlen (p) + 1); - } - if (mi.flags & MOUNT_ENC) - { - char tmpbuf[CYG_MAX_PATH]; - if (fnunmunge (tmpbuf, posix_path)) - strcpy (posix_path, tmpbuf); - } - goto out; - } - - if (!cygheap->root.exists ()) - /* nothing */; - else if (!cygheap->root.ischroot_native (pathbuf)) - return ENOENT; - else - { - const char *p = pathbuf + cygheap->root.native_length (); - if (*p) - slashify (p, posix_path, trailing_slash_p); - else - { - posix_path[0] = '/'; - posix_path[1] = '\0'; - } - goto out; - } - - /* Not in the database. This should [theoretically] only happen if either - the path begins with //, or / isn't mounted, or the path has a drive - letter not covered by the mount table. If it's a relative path then the - caller must want an absolute path (otherwise we would have returned - above). So we always return an absolute path at this point. */ - if (isdrive (pathbuf)) - cygdrive_posix_path (pathbuf, posix_path, trailing_slash_p); - else - { - /* The use of src_path and not pathbuf here is intentional. - We couldn't translate the path, so just ensure no \'s are present. */ - slashify (src_path, posix_path, trailing_slash_p); - } - -out: - debug_printf ("%s = conv_to_posix_path (%s)", posix_path, src_path); - MALLOC_CHECK; - return 0; -} - -/* Return flags associated with a mount point given the win32 path. */ - -unsigned -mount_info::set_flags_from_win32_path (const char *p) -{ - for (int i = 0; i < nmounts; i++) - { - mount_item &mi = mount[native_sorted[i]]; - if (path_prefix_p (mi.native_path, p, mi.native_pathlen)) - return mi.flags; - } - return PATH_BINARY; -} - -/* read_mounts: Given a specific regkey, read mounts from under its - key. */ - -void -mount_info::read_mounts (reg_key& r) -{ - char posix_path[CYG_MAX_PATH]; - HKEY key = r.get_key (); - DWORD i, posix_path_size; - int res; - - /* Loop through subkeys */ - /* FIXME: we would like to not check MAX_MOUNTS but the heap in the - shared area is currently statically allocated so we can't have an - arbitrarily large number of mounts. */ - for (i = 0; ; i++) - { - char native_path[CYG_MAX_PATH]; - int mount_flags; - - posix_path_size = sizeof (posix_path); - /* FIXME: if maximum posix_path_size is 256, we're going to - run into problems if we ever try to store a mount point that's - over 256 but is under CYG_MAX_PATH. */ - res = RegEnumKeyEx (key, i, posix_path, &posix_path_size, NULL, - NULL, NULL, NULL); - - if (res == ERROR_NO_MORE_ITEMS) - break; - else if (res != ERROR_SUCCESS) - { - debug_printf ("RegEnumKeyEx failed, error %d!", res); - break; - } - - /* Get a reg_key based on i. */ - reg_key subkey = reg_key (key, KEY_READ, posix_path, NULL); - - /* Fetch info from the subkey. */ - subkey.get_string ("native", native_path, sizeof (native_path), ""); - mount_flags = subkey.get_int ("flags", 0); - - /* Add mount_item corresponding to registry mount point. */ - res = mount_table->add_item (native_path, posix_path, mount_flags, false); - if (res && get_errno () == EMFILE) - break; /* The number of entries exceeds MAX_MOUNTS */ - } -} - -/* from_registry: Build the entire mount table from the registry. Also, - read in cygdrive-related information from its registry location. */ - -void -mount_info::from_registry () -{ - - /* Retrieve cygdrive-related information. */ - read_cygdrive_info_from_registry (); - - nmounts = 0; - - /* First read mounts from user's table. - Then read mounts from system-wide mount table while deimpersonated . */ - for (int i = 0; i < 2; i++) - { - if (i) - cygheap->user.deimpersonate (); - reg_key r (i, KEY_READ, CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL); - read_mounts (r); - if (i) - cygheap->user.reimpersonate (); - } -} - -/* add_reg_mount: Add mount item to registry. Return zero on success, - non-zero on failure. */ -/* FIXME: Need a mutex to avoid collisions with other tasks. */ - -int -mount_info::add_reg_mount (const char *native_path, const char *posix_path, unsigned mountflags) -{ - int res; - - /* Add the mount to the right registry location, depending on - whether MOUNT_SYSTEM is set in the mount flags. */ - - reg_key reg (mountflags & MOUNT_SYSTEM, KEY_ALL_ACCESS, - CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL); - - /* Start by deleting existing mount if one exists. */ - res = reg.kill (posix_path); - if (res != ERROR_SUCCESS && res != ERROR_FILE_NOT_FOUND) - { - err: - __seterrno_from_win_error (res); - return -1; - } - - /* Create the new mount. */ - reg_key subkey (reg.get_key (), KEY_ALL_ACCESS, posix_path, NULL); - - res = subkey.set_string ("native", native_path); - if (res != ERROR_SUCCESS) - goto err; - res = subkey.set_int ("flags", mountflags); - - if (mountflags & MOUNT_SYSTEM) - { - sys_mount_table_counter++; - cygwin_shared->sys_mount_table_counter++; - } - return 0; /* Success */ -} - -/* del_reg_mount: delete mount item from registry indicated in flags. - Return zero on success, non-zero on failure.*/ -/* FIXME: Need a mutex to avoid collisions with other tasks. */ - -int -mount_info::del_reg_mount (const char * posix_path, unsigned flags) -{ - int res; - - reg_key reg (flags & MOUNT_SYSTEM, KEY_ALL_ACCESS, - CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL); - res = reg.kill (posix_path); - - if (res != ERROR_SUCCESS) - { - __seterrno_from_win_error (res); - return -1; - } - - if (flags & MOUNT_SYSTEM) - { - sys_mount_table_counter++; - cygwin_shared->sys_mount_table_counter++; - } - - return 0; /* Success */ -} - -/* read_cygdrive_info_from_registry: Read the default prefix and flags - to use when creating cygdrives from the special user registry - location used to store cygdrive information. */ - -void -mount_info::read_cygdrive_info_from_registry () -{ - /* First read cygdrive from user's registry. - If failed, then read cygdrive from system-wide registry - while deimpersonated. */ - for (int i = 0; i < 2; i++) - { - if (i) - cygheap->user.deimpersonate (); - reg_key r (i, KEY_READ, CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL); - if (i) - cygheap->user.reimpersonate (); - - if (r.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, cygdrive, sizeof (cygdrive), - CYGWIN_INFO_CYGDRIVE_DEFAULT_PREFIX) != ERROR_SUCCESS && i == 0) - continue; - - /* Fetch user cygdrive_flags from registry; returns MOUNT_CYGDRIVE on error. */ - cygdrive_flags = r.get_int (CYGWIN_INFO_CYGDRIVE_FLAGS, - MOUNT_CYGDRIVE | MOUNT_BINARY); - /* Sanitize */ - if (i == 0) - cygdrive_flags &= ~MOUNT_SYSTEM; - else - cygdrive_flags |= MOUNT_SYSTEM; - slashify (cygdrive, cygdrive, 1); - cygdrive_len = strlen (cygdrive); - break; - } -} - -/* write_cygdrive_info_to_registry: Write the default prefix and flags - to use when creating cygdrives to the special user registry - location used to store cygdrive information. */ - -int -mount_info::write_cygdrive_info_to_registry (const char *cygdrive_prefix, unsigned flags) -{ - /* Verify cygdrive prefix starts with a forward slash and if there's - another character, it's not a slash. */ - if ((cygdrive_prefix == NULL) || (*cygdrive_prefix == 0) || - (!isslash (cygdrive_prefix[0])) || - ((cygdrive_prefix[1] != '\0') && (isslash (cygdrive_prefix[1])))) - { - set_errno (EINVAL); - return -1; - } - - char hold_cygdrive_prefix[strlen (cygdrive_prefix) + 1]; - /* Ensure that there is never a final slash */ - nofinalslash (cygdrive_prefix, hold_cygdrive_prefix); - - reg_key r (flags & MOUNT_SYSTEM, KEY_ALL_ACCESS, - CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL); - int res; - res = r.set_string (CYGWIN_INFO_CYGDRIVE_PREFIX, hold_cygdrive_prefix); - if (res != ERROR_SUCCESS) - { - __seterrno_from_win_error (res); - return -1; - } - r.set_int (CYGWIN_INFO_CYGDRIVE_FLAGS, flags); - - if (flags & MOUNT_SYSTEM) - sys_mount_table_counter = ++cygwin_shared->sys_mount_table_counter; - - /* This also needs to go in the in-memory copy of "cygdrive", but only if - appropriate: - 1. setting user path prefix, or - 2. overwriting (a previous) system path prefix */ - if (!(flags & MOUNT_SYSTEM) || (mount_table->cygdrive_flags & MOUNT_SYSTEM)) - { - slashify (cygdrive_prefix, cygdrive, 1); - cygdrive_flags = flags; - cygdrive_len = strlen (cygdrive); - } - - return 0; -} - -int -mount_info::remove_cygdrive_info_from_registry (const char *cygdrive_prefix, unsigned flags) -{ - reg_key r (flags & MOUNT_SYSTEM, KEY_ALL_ACCESS, - CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, - NULL); - - /* Delete cygdrive prefix and flags. */ - int res = r.killvalue (CYGWIN_INFO_CYGDRIVE_PREFIX); - int res2 = r.killvalue (CYGWIN_INFO_CYGDRIVE_FLAGS); - - if (flags & MOUNT_SYSTEM) - sys_mount_table_counter = ++cygwin_shared->sys_mount_table_counter; - - /* Reinitialize the cygdrive path prefix to reflect to removal from the - registry. */ - read_cygdrive_info_from_registry (); - - if (res == ERROR_SUCCESS) - res = res2; - if (res == ERROR_SUCCESS) - return 0; - - __seterrno_from_win_error (res); - return -1; -} - -int -mount_info::get_cygdrive_info (char *user, char *system, char* user_flags, - char* system_flags) -{ - /* Get the user path prefix from HKEY_CURRENT_USER. */ - reg_key r (false, KEY_READ, CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL); - int res = r.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, user, CYG_MAX_PATH, ""); - - /* Get the user flags, if appropriate */ - if (res == ERROR_SUCCESS) - { - int flags = r.get_int (CYGWIN_INFO_CYGDRIVE_FLAGS, MOUNT_CYGDRIVE | MOUNT_BINARY); - strcpy (user_flags, (flags & MOUNT_BINARY) ? "binmode" : "textmode"); - } - - /* Get the system path prefix from HKEY_LOCAL_MACHINE. */ - reg_key r2 (true, KEY_READ, CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL); - int res2 = r2.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, system, CYG_MAX_PATH, ""); - - /* Get the system flags, if appropriate */ - if (res2 == ERROR_SUCCESS) - { - int flags = r2.get_int (CYGWIN_INFO_CYGDRIVE_FLAGS, MOUNT_CYGDRIVE | MOUNT_BINARY); - strcpy (system_flags, (flags & MOUNT_BINARY) ? "binmode" : "textmode"); - } - - return (res != ERROR_SUCCESS) ? res : res2; -} - -static mount_item *mounts_for_sort; - -/* sort_by_posix_name: qsort callback to sort the mount entries. Sort - user mounts ahead of system mounts to the same POSIX path. */ -/* FIXME: should the user should be able to choose whether to - prefer user or system mounts??? */ -static int -sort_by_posix_name (const void *a, const void *b) -{ - mount_item *ap = mounts_for_sort + (*((int*) a)); - mount_item *bp = mounts_for_sort + (*((int*) b)); - - /* Base weighting on longest posix path first so that the most - obvious path will be chosen. */ - size_t alen = strlen (ap->posix_path); - size_t blen = strlen (bp->posix_path); - - int res = blen - alen; - - if (res) - return res; /* Path lengths differed */ - - /* The two paths were the same length, so just determine normal - lexical sorted order. */ - res = strcmp (ap->posix_path, bp->posix_path); - - if (res == 0) - { - /* need to select between user and system mount to same POSIX path */ - if (!(bp->flags & MOUNT_SYSTEM)) /* user mount */ - return 1; - else - return -1; - } - - return res; -} - -/* sort_by_native_name: qsort callback to sort the mount entries. Sort - user mounts ahead of system mounts to the same POSIX path. */ -/* FIXME: should the user should be able to choose whether to - prefer user or system mounts??? */ -static int -sort_by_native_name (const void *a, const void *b) -{ - mount_item *ap = mounts_for_sort + (*((int*) a)); - mount_item *bp = mounts_for_sort + (*((int*) b)); - - /* Base weighting on longest win32 path first so that the most - obvious path will be chosen. */ - size_t alen = strlen (ap->native_path); - size_t blen = strlen (bp->native_path); - - int res = blen - alen; - - if (res) - return res; /* Path lengths differed */ - - /* The two paths were the same length, so just determine normal - lexical sorted order. */ - res = strcmp (ap->native_path, bp->native_path); - - if (res == 0) - { - /* need to select between user and system mount to same POSIX path */ - if (!(bp->flags & MOUNT_SYSTEM)) /* user mount */ - return 1; - else - return -1; - } - - return res; -} - -void -mount_info::sort () -{ - for (int i = 0; i < nmounts; i++) - native_sorted[i] = posix_sorted[i] = i; - /* Sort them into reverse length order, otherwise we won't - be able to look for /foo in /. */ - mounts_for_sort = mount; /* ouch. */ - qsort (posix_sorted, nmounts, sizeof (posix_sorted[0]), sort_by_posix_name); - qsort (native_sorted, nmounts, sizeof (native_sorted[0]), sort_by_native_name); -} - -/* Add an entry to the mount table. - Returns 0 on success, -1 on failure and errno is set. - - This is where all argument validation is done. It may not make sense to - do this when called internally, but it's cleaner to keep it all here. */ - -int -mount_info::add_item (const char *native, const char *posix, unsigned mountflags, int reg_p) -{ - char nativetmp[CYG_MAX_PATH]; - char posixtmp[CYG_MAX_PATH]; - char *nativetail, *posixtail, error[] = "error"; - int nativeerr, posixerr; - - /* Something's wrong if either path is NULL or empty, or if it's - not a UNC or absolute path. */ - - if (native == NULL || !isabspath (native) || - !(is_unc_share (native) || isdrive (native))) - nativeerr = EINVAL; - else - nativeerr = normalize_win32_path (native, nativetmp, nativetail); - - if (posix == NULL || !isabspath (posix) || - is_unc_share (posix) || isdrive (posix)) - posixerr = EINVAL; - else - posixerr = normalize_posix_path (posix, posixtmp, posixtail); - - debug_printf ("%s[%s], %s[%s], %p", - native, nativeerr ? error : nativetmp, - posix, posixerr ? error : posixtmp, mountflags); - - if (nativeerr || posixerr) - { - set_errno (nativeerr?:posixerr); - return -1; - } - - /* Make sure both paths do not end in /. */ - if (nativetail > nativetmp + 1 && nativetail[-1] == '\\') - nativetail[-1] = '\0'; - if (posixtail > posixtmp + 1 && posixtail[-1] == '/') - posixtail[-1] = '\0'; - - /* Write over an existing mount item with the same POSIX path if - it exists and is from the same registry area. */ - int i; - for (i = 0; i < nmounts; i++) - { - if (strcasematch (mount[i].posix_path, posixtmp) && - (mount[i].flags & MOUNT_SYSTEM) == (mountflags & MOUNT_SYSTEM)) - break; - } - - if (i == nmounts && nmounts == MAX_MOUNTS) - { - set_errno (EMFILE); - return -1; - } - - if (reg_p && add_reg_mount (nativetmp, posixtmp, mountflags)) - return -1; - - if (i == nmounts) - nmounts++; - mount[i].init (nativetmp, posixtmp, mountflags); - sort (); - - return 0; -} - -/* Delete a mount table entry where path is either a Win32 or POSIX - path. Since the mount table is really just a table of aliases, - deleting / is ok (although running without a slash mount is - strongly discouraged because some programs may run erratically - without one). If MOUNT_SYSTEM is set in flags, remove from system - registry, otherwise remove the user registry mount. -*/ - -int -mount_info::del_item (const char *path, unsigned flags, int reg_p) -{ - char pathtmp[CYG_MAX_PATH]; - int posix_path_p = false; - - /* Something's wrong if path is NULL or empty. */ - if (path == NULL || *path == 0 || !isabspath (path)) - { - set_errno (EINVAL); - return -1; - } - - if (is_unc_share (path) || strpbrk (path, ":\\")) - backslashify (path, pathtmp, 0); - else - { - slashify (path, pathtmp, 0); - posix_path_p = true; - } - nofinalslash (pathtmp, pathtmp); - - if (reg_p && posix_path_p && - del_reg_mount (pathtmp, flags) && - del_reg_mount (path, flags)) /* for old irregular entries */ - return -1; - - for (int i = 0; i < nmounts; i++) - { - int ent = native_sorted[i]; /* in the same order as getmntent() */ - if (((posix_path_p) - ? strcasematch (mount[ent].posix_path, pathtmp) - : strcasematch (mount[ent].native_path, pathtmp)) && - (mount[ent].flags & MOUNT_SYSTEM) == (flags & MOUNT_SYSTEM)) - { - if (!posix_path_p && - reg_p && del_reg_mount (mount[ent].posix_path, flags)) - return -1; - - nmounts--; /* One less mount table entry */ - /* Fill in the hole if not at the end of the table */ - if (ent < nmounts) - memmove (mount + ent, mount + ent + 1, - sizeof (mount[ent]) * (nmounts - ent)); - sort (); /* Resort the table */ - return 0; - } - } - set_errno (EINVAL); - return -1; -} - -/************************* mount_item class ****************************/ - -static mntent * -fillout_mntent (const char *native_path, const char *posix_path, unsigned flags) -{ - struct mntent& ret=_my_tls.locals.mntbuf; - - /* Remove drivenum from list if we see a x: style path */ - if (strlen (native_path) == 2 && native_path[1] == ':') - { - int drivenum = cyg_tolower (native_path[0]) - 'a'; - if (drivenum >= 0 && drivenum <= 31) - _my_tls.locals.available_drives &= ~(1 << drivenum); - } - - /* Pass back pointers to mount_table strings reserved for use by - getmntent rather than pointers to strings in the internal mount - table because the mount table might change, causing weird effects - from the getmntent user's point of view. */ - - strcpy (_my_tls.locals.mnt_fsname, native_path); - ret.mnt_fsname = _my_tls.locals.mnt_fsname; - strcpy (_my_tls.locals.mnt_dir, posix_path); - ret.mnt_dir = _my_tls.locals.mnt_dir; - - if (!(flags & MOUNT_SYSTEM)) /* user mount */ - strcpy (_my_tls.locals.mnt_type, (char *) "user"); - else /* system mount */ - strcpy (_my_tls.locals.mnt_type, (char *) "system"); - - ret.mnt_type = _my_tls.locals.mnt_type; - - /* mnt_opts is a string that details mount params such as - binary or textmode, or exec. We don't print - `silent' here; it's a magic internal thing. */ - - if (!(flags & MOUNT_BINARY)) - strcpy (_my_tls.locals.mnt_opts, (char *) "textmode"); - else - strcpy (_my_tls.locals.mnt_opts, (char *) "binmode"); - - if (flags & MOUNT_CYGWIN_EXEC) - strcat (_my_tls.locals.mnt_opts, (char *) ",cygexec"); - else if (flags & MOUNT_EXEC) - strcat (_my_tls.locals.mnt_opts, (char *) ",exec"); - else if (flags & MOUNT_NOTEXEC) - strcat (_my_tls.locals.mnt_opts, (char *) ",noexec"); - if (flags & MOUNT_ENC) - strcat (_my_tls.locals.mnt_opts, ",managed"); - - if ((flags & MOUNT_CYGDRIVE)) /* cygdrive */ - strcat (_my_tls.locals.mnt_opts, (char *) ",noumount"); - ret.mnt_opts = _my_tls.locals.mnt_opts; - - ret.mnt_freq = 1; - ret.mnt_passno = 1; - return &ret; -} - -struct mntent * -mount_item::getmntent () -{ - return fillout_mntent (native_path, posix_path, flags); -} - -static struct mntent * -cygdrive_getmntent () -{ - char native_path[4]; - char posix_path[CYG_MAX_PATH]; - DWORD mask = 1, drive = 'a'; - struct mntent *ret = NULL; - - while (_my_tls.locals.available_drives) - { - for (/* nothing */; drive <= 'z'; mask <<= 1, drive++) - if (_my_tls.locals.available_drives & mask) - break; - - __small_sprintf (native_path, "%c:\\", drive); - if (GetFileAttributes (native_path) == INVALID_FILE_ATTRIBUTES) - { - _my_tls.locals.available_drives &= ~mask; - continue; - } - native_path[2] = '\0'; - __small_sprintf (posix_path, "%s%c", mount_table->cygdrive, drive); - ret = fillout_mntent (native_path, posix_path, mount_table->cygdrive_flags); - break; - } - - return ret; -} - -struct mntent * -mount_info::getmntent (int x) -{ - if (x < 0 || x >= nmounts) - return cygdrive_getmntent (); - - return mount[native_sorted[x]].getmntent (); -} - -/* Fill in the fields of a mount table entry. */ - -void -mount_item::init (const char *native, const char *posix, unsigned mountflags) -{ - strcpy ((char *) native_path, native); - strcpy ((char *) posix_path, posix); - - native_pathlen = strlen (native_path); - posix_pathlen = strlen (posix_path); - - flags = mountflags; -} - -/********************** Mount System Calls **************************/ - -/* Mount table system calls. - Note that these are exported to the application. */ - -/* mount: Add a mount to the mount table in memory and to the registry - that will cause paths under win32_path to be translated to paths - under posix_path. */ - -extern "C" int -mount (const char *win32_path, const char *posix_path, unsigned flags) -{ - int res = -1; - - myfault efault; - if (efault.faulted (EFAULT)) - /* errno set */; - else if (!*posix_path) - set_errno (EINVAL); - else if (strpbrk (posix_path, "\\:")) - set_errno (EINVAL); - else if (flags & MOUNT_CYGDRIVE) /* normal mount */ - { - /* When flags include MOUNT_CYGDRIVE, take this to mean that - we actually want to change the cygdrive prefix and flags - without actually mounting anything. */ - res = mount_table->write_cygdrive_info_to_registry (posix_path, flags); - win32_path = NULL; - } - else if (!*win32_path) - set_errno (EINVAL); - else - res = mount_table->add_item (win32_path, posix_path, flags, true); - - syscall_printf ("%d = mount (%s, %s, %p)", res, win32_path, posix_path, flags); - return res; -} - -/* umount: The standard umount call only has a path parameter. Since - it is not possible for this call to specify whether to remove the - mount from the user or global mount registry table, assume the user - table. */ - -extern "C" int -umount (const char *path) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (!*path) - { - set_errno (EINVAL); - return -1; - } - return cygwin_umount (path, 0); -} - -/* cygwin_umount: This is like umount but takes an additional flags - parameter that specifies whether to umount from the user or system-wide - registry area. */ - -extern "C" int -cygwin_umount (const char *path, unsigned flags) -{ - int res = -1; - - if (flags & MOUNT_CYGDRIVE) - { - /* When flags include MOUNT_CYGDRIVE, take this to mean that we actually want - to remove the cygdrive prefix and flags without actually unmounting - anything. */ - res = mount_table->remove_cygdrive_info_from_registry (path, flags); - } - else - { - res = mount_table->del_item (path, flags, true); - } - - syscall_printf ("%d = cygwin_umount (%s, %d)", res, path, flags); - return res; -} - -bool -is_floppy (const char *dos) -{ - char dev[256]; - if (!QueryDosDevice (dos, dev, 256)) - return false; - return strncasematch (dev, "\\Device\\Floppy", 14) - || strcasematch (dev, "A:"); -} - -extern "C" FILE * -setmntent (const char *filep, const char *) -{ - _my_tls.locals.iteration = 0; - _my_tls.locals.available_drives = GetLogicalDrives (); - /* Filter floppy drives on A: and B: */ - if ((_my_tls.locals.available_drives & 1) && is_floppy ("A:")) - _my_tls.locals.available_drives &= ~1; - if ((_my_tls.locals.available_drives & 2) && is_floppy ("B:")) - _my_tls.locals.available_drives &= ~2; - return (FILE *) filep; -} - -extern "C" struct mntent * -getmntent (FILE *) -{ - return mount_table->getmntent (_my_tls.locals.iteration++); -} - -extern "C" int -endmntent (FILE *) -{ - return 1; -} - -/********************** Symbolic Link Support **************************/ - -/* Read symlink from Extended Attribute */ -int -get_symlink_ea (const char* frompath, char* buf, int buf_size) -{ - int res = NTReadEA (frompath, SYMLINK_EA_NAME, buf, buf_size); - if (res == 0) - debug_printf ("Cannot read symlink from EA"); - return (res - 1); -} - -/* Save symlink to Extended Attribute */ -bool -set_symlink_ea (const char* frompath, const char* topath) -{ - if (!NTWriteEA (frompath, SYMLINK_EA_NAME, topath, strlen (topath) + 1)) - { - debug_printf ("Cannot save symlink in EA"); - return false; - } - return true; -} - -/* Create a symlink from FROMPATH to TOPATH. */ - -/* If TRUE create symlinks as Windows shortcuts, if false create symlinks - as normal files with magic number and system bit set. */ -bool allow_winsymlinks = true; - -extern "C" int -symlink (const char *oldpath, const char *newpath) -{ - return symlink_worker (oldpath, newpath, allow_winsymlinks, false); -} - -int -symlink_worker (const char *oldpath, const char *newpath, bool use_winsym, - bool isdevice) -{ - extern suffix_info stat_suffixes[]; - - HANDLE h; - int res = -1; - path_conv win32_path, win32_oldpath; - char from[CYG_MAX_PATH + 5]; - char cwd[CYG_MAX_PATH], *cp = NULL, c = 0; - char w32oldpath[CYG_MAX_PATH]; - char reloldpath[CYG_MAX_PATH] = { 0 }; - DWORD written; - SECURITY_ATTRIBUTES sa = sec_none_nih; - security_descriptor sd; - - /* POSIX says that empty 'newpath' is invalid input while empty - 'oldpath' is valid -- it's symlink resolver job to verify if - symlink contents point to existing filesystem object */ - myfault efault; - if (efault.faulted (EFAULT)) - goto done; - if (!*oldpath || !*newpath) - { - set_errno (ENOENT); - goto done; - } - - if (strlen (oldpath) >= CYG_MAX_PATH) - { - set_errno (ENAMETOOLONG); - goto done; - } - - win32_path.check (newpath, PC_SYM_NOFOLLOW, - transparent_exe ? stat_suffixes : NULL); - if (use_winsym && !win32_path.exists ()) - { - strcpy (from, newpath); - strcat (from, ".lnk"); - win32_path.check (from, PC_SYM_NOFOLLOW); - } - - if (win32_path.error) - { - set_errno (win32_path.case_clash ? ECASECLASH : win32_path.error); - goto done; - } - - syscall_printf ("symlink (%s, %s)", oldpath, win32_path.get_win32 ()); - - if (win32_path.is_auto_device ()) - { - set_errno (EEXIST); - goto done; - } - - DWORD create_how; - if (!use_winsym) - create_how = CREATE_NEW; - else if (isdevice) - { - strcpy (w32oldpath, oldpath); - create_how = CREATE_ALWAYS; - SetFileAttributes (win32_path, FILE_ATTRIBUTE_NORMAL); - } - else - { - if (!isabspath (oldpath)) - { - getcwd (cwd, CYG_MAX_PATH); - if ((cp = strrchr (from, '/')) || (cp = strrchr (from, '\\'))) - { - c = *cp; - *cp = '\0'; - chdir (from); - } - backslashify (oldpath, reloldpath, 0); - /* Creating an ITEMIDLIST requires an absolute path. So if we - create a shortcut file, we create relative and absolute Win32 - paths, the first for the relpath field and the latter for the - ITEMIDLIST field. */ - if (GetFileAttributes (reloldpath) == INVALID_FILE_ATTRIBUTES) - { - win32_oldpath.check (oldpath, PC_SYM_NOFOLLOW, - transparent_exe ? stat_suffixes : NULL); - if (win32_oldpath.error != ENOENT) - strcpy (use_winsym ? reloldpath : w32oldpath, win32_oldpath); - } - else if (!use_winsym) - strcpy (w32oldpath, reloldpath); - if (use_winsym) - { - win32_oldpath.check (oldpath, PC_SYM_NOFOLLOW, - transparent_exe ? stat_suffixes : NULL); - strcpy (w32oldpath, win32_oldpath); - } - if (cp) - { - *cp = c; - chdir (cwd); - } - } - else - { - win32_oldpath.check (oldpath, PC_SYM_NOFOLLOW, - transparent_exe ? stat_suffixes : NULL); - strcpy (w32oldpath, win32_oldpath); - } - create_how = CREATE_NEW; - } - - if (allow_ntsec && win32_path.has_acls ()) - set_security_attribute (S_IFLNK | STD_RBITS | STD_WBITS, - &sa, sd); - - h = CreateFile (win32_path, GENERIC_WRITE, 0, &sa, create_how, - FILE_ATTRIBUTE_NORMAL, 0); - if (h == INVALID_HANDLE_VALUE) - __seterrno (); - else - { - bool success = false; - - if (use_winsym) - { - /* A path of 240 chars with 120 one character directories in it - can result in a 6K shortcut. */ - char *buf = (char *) alloca (8192); - win_shortcut_hdr *shortcut_header = (win_shortcut_hdr *) buf; - HRESULT hres; - IShellFolder *psl; - WCHAR wc_path[CYG_MAX_PATH]; - ITEMIDLIST *pidl = NULL, *p; - unsigned short len; - - memset (shortcut_header, 0, sizeof *shortcut_header); - shortcut_header->size = sizeof *shortcut_header; - shortcut_header->magic = GUID_shortcut; - shortcut_header->flags = (WSH_FLAG_DESC | WSH_FLAG_RELPATH); - shortcut_header->run = SW_NORMAL; - cp = buf + sizeof (win_shortcut_hdr); - /* Creating an IDLIST */ - hres = SHGetDesktopFolder (&psl); - if (SUCCEEDED (hres)) - { - MultiByteToWideChar (CP_ACP, 0, w32oldpath, -1, wc_path, - CYG_MAX_PATH); - hres = psl->ParseDisplayName (NULL, NULL, wc_path, NULL, - &pidl, NULL); - if (SUCCEEDED (hres)) - { - shortcut_header->flags |= WSH_FLAG_IDLIST; - for (p = pidl; p->mkid.cb > 0; - p = (ITEMIDLIST *)((char *) p + p->mkid.cb)) - ; - len = (char *) p - (char *) pidl + 2; - *(unsigned short *)cp = len; - memcpy (cp += 2, pidl, len); - cp += len; - CoTaskMemFree (pidl); - } - psl->Release (); - } - /* Creating a description */ - *(unsigned short *)cp = len = strlen (oldpath); - memcpy (cp += 2, oldpath, len); - cp += len; - /* Creating a relpath */ - if (reloldpath[0]) - { - *(unsigned short *)cp = len = strlen (reloldpath); - memcpy (cp += 2, reloldpath, len); - } - else - { - *(unsigned short *)cp = len = strlen (w32oldpath); - memcpy (cp += 2, w32oldpath, len); - } - cp += len; - success = WriteFile (h, buf, cp - buf, &written, NULL) - && written == (DWORD) (cp - buf); - } - else - { - /* This is the old technique creating a symlink. */ - char buf[sizeof (SYMLINK_COOKIE) + CYG_MAX_PATH + 10]; - - __small_sprintf (buf, "%s%s", SYMLINK_COOKIE, oldpath); - DWORD len = strlen (buf) + 1; - - /* Note that the terminating nul is written. */ - success = WriteFile (h, buf, len, &written, NULL) - || written != len; - - } - if (success) - { - CloseHandle (h); - if (!allow_ntsec && allow_ntea) - set_file_attribute (false, NULL, win32_path.get_win32 (), - S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO); - - DWORD attr = use_winsym ? FILE_ATTRIBUTE_READONLY - : FILE_ATTRIBUTE_SYSTEM; -#ifdef HIDDEN_DOT_FILES - cp = strrchr (win32_path, '\\'); - if ((cp && cp[1] == '.') || *win32_path == '.') - attr |= FILE_ATTRIBUTE_HIDDEN; -#endif - SetFileAttributes (win32_path, attr); - - if (!isdevice && win32_path.fs_has_ea ()) - set_symlink_ea (win32_path, oldpath); - res = 0; - } - else - { - __seterrno (); - CloseHandle (h); - DeleteFileA (win32_path.get_win32 ()); - } - } - -done: - syscall_printf ("%d = symlink_worker (%s, %s, %d, %d)", res, oldpath, - newpath, use_winsym, isdevice); - return res; -} - -static bool -cmp_shortcut_header (win_shortcut_hdr *file_header) -{ - /* A Cygwin or U/Win shortcut only contains a description and a relpath. - Cygwin shortcuts also might contain an ITEMIDLIST. The run type is - always set to SW_NORMAL. */ - return file_header->size == sizeof (win_shortcut_hdr) - && !memcmp (&file_header->magic, &GUID_shortcut, sizeof GUID_shortcut) - && (file_header->flags & ~WSH_FLAG_IDLIST) - == (WSH_FLAG_DESC | WSH_FLAG_RELPATH) - && file_header->run == SW_NORMAL; -} - -int -symlink_info::check_shortcut (const char *path, HANDLE h) -{ - win_shortcut_hdr *file_header; - char *buf, *cp; - unsigned short len; - int res = 0; - DWORD size, got = 0; - - /* Valid Cygwin & U/WIN shortcuts are R/O. */ - if (!(fileattr & FILE_ATTRIBUTE_READONLY)) - goto file_not_symlink; - - if ((size = GetFileSize (h, NULL)) > 8192) /* Not a Cygwin symlink. */ - goto file_not_symlink; - buf = (char *) alloca (size); - if (!ReadFile (h, buf, size, &got, 0)) - { - set_error (EIO); - goto close_it; - } - file_header = (win_shortcut_hdr *) buf; - if (got != size || !cmp_shortcut_header (file_header)) - goto file_not_symlink; - cp = buf + sizeof (win_shortcut_hdr); - if (file_header->flags & WSH_FLAG_IDLIST) /* Skip ITEMIDLIST */ - cp += *(unsigned short *) cp + 2; - if ((len = *(unsigned short *) cp) == 0 || len >= CYG_MAX_PATH) - goto file_not_symlink; - strncpy (contents, cp += 2, len); - contents[len] = '\0'; - res = len; - if (res) /* It's a symlink. */ - pflags = PATH_SYMLINK | PATH_LNK; - goto close_it; - -file_not_symlink: - /* Not a symlink, see if executable. */ - if (!(pflags & PATH_ALL_EXEC) && has_exec_chars ((const char *) &file_header, got)) - pflags |= PATH_EXEC; - -close_it: - CloseHandle (h); - return res; -} - - -int -symlink_info::check_sysfile (const char *path, HANDLE h) -{ - char cookie_buf[sizeof (SYMLINK_COOKIE) - 1]; - DWORD got; - int res = 0; - - if (!ReadFile (h, cookie_buf, sizeof (cookie_buf), &got, 0)) - { - debug_printf ("ReadFile1 failed"); - set_error (EIO); - } - else if (got == sizeof (cookie_buf) - && memcmp (cookie_buf, SYMLINK_COOKIE, sizeof (cookie_buf)) == 0) - { - /* It's a symlink. */ - pflags = PATH_SYMLINK; - - res = ReadFile (h, contents, CYG_MAX_PATH, &got, 0); - if (!res) - { - debug_printf ("ReadFile2 failed"); - set_error (EIO); - } - else - { - /* Versions prior to b16 stored several trailing - NULs with the path (to fill the path out to 1024 - chars). Current versions only store one trailing - NUL. The length returned is the path without - *any* trailing NULs. We also have to handle (or - at least not die from) corrupted paths. */ - char *end; - if ((end = (char *) memchr (contents, 0, got)) != NULL) - res = end - contents; - else - res = got; - } - } - else if (got == sizeof (cookie_buf) - && memcmp (cookie_buf, SOCKET_COOKIE, sizeof (cookie_buf)) == 0) - pflags |= PATH_SOCKET; - else - { - /* Not a symlink, see if executable. */ - if (pflags & PATH_ALL_EXEC) - /* Nothing to do */; - else if (has_exec_chars (cookie_buf, got)) - pflags |= PATH_EXEC; - else - pflags |= PATH_NOTEXEC; - } - syscall_printf ("%d = symlink.check_sysfile (%s, %s) (%p)", - res, path, contents, pflags); - - CloseHandle (h); - return res; -} - -enum -{ - SCAN_BEG, - SCAN_LNK, - SCAN_HASLNK, - SCAN_JUSTCHECK, - SCAN_APPENDLNK, - SCAN_EXTRALNK, - SCAN_DONE, -}; - -class suffix_scan -{ - const suffix_info *suffixes, *suffixes_start; - int nextstate; - char *eopath; -public: - const char *path; - char *has (const char *, const suffix_info *); - int next (); - int lnk_match () {return nextstate >= SCAN_APPENDLNK;} -}; - -char * -suffix_scan::has (const char *in_path, const suffix_info *in_suffixes) -{ - nextstate = SCAN_BEG; - suffixes = suffixes_start = in_suffixes; - - char *ext_here = strrchr (in_path, '.'); - path = in_path; - eopath = strchr (path, '\0'); - - if (!ext_here) - goto noext; - - if (suffixes) - { - /* Check if the extension matches a known extension */ - for (const suffix_info *ex = in_suffixes; ex->name != NULL; ex++) - if (strcasematch (ext_here, ex->name)) - { - nextstate = SCAN_JUSTCHECK; - suffixes = NULL; /* Has an extension so don't scan for one. */ - goto done; - } - } - - /* Didn't match. Use last resort -- .lnk. */ - if (strcasematch (ext_here, ".lnk")) - { - nextstate = SCAN_HASLNK; - suffixes = NULL; - } - - noext: - ext_here = eopath; - - done: - return ext_here; -} - -int -suffix_scan::next () -{ - for (;;) - { - if (!suffixes) - switch (nextstate) - { - case SCAN_BEG: - suffixes = suffixes_start; - if (!suffixes) - { - nextstate = SCAN_LNK; - return 1; - } - nextstate = SCAN_EXTRALNK; - /* fall through to suffix checking below */ - break; - case SCAN_HASLNK: - nextstate = SCAN_APPENDLNK; /* Skip SCAN_BEG */ - return 1; - case SCAN_EXTRALNK: - nextstate = SCAN_DONE; - *eopath = '\0'; - return 0; - case SCAN_JUSTCHECK: - nextstate = SCAN_LNK; - return 1; - case SCAN_LNK: - case SCAN_APPENDLNK: - strcat (eopath, ".lnk"); - nextstate = SCAN_DONE; - return 1; - default: - *eopath = '\0'; - return 0; - } - - while (suffixes && suffixes->name) - if (nextstate == SCAN_EXTRALNK && !suffixes->addon) - suffixes++; - else - { - strcpy (eopath, suffixes->name); - if (nextstate == SCAN_EXTRALNK) - strcat (eopath, ".lnk"); - suffixes++; - return 1; - } - suffixes = NULL; - } -} - -bool -symlink_info::set_error (int in_errno) -{ - bool res; - if (!(pflags & PATH_NO_ACCESS_CHECK) || in_errno == ENAMETOOLONG || in_errno == EIO) - { - error = in_errno; - res = true; - } - else if (in_errno == ENOENT) - res = true; - else - { - fileattr = FILE_ATTRIBUTE_NORMAL; - res = false; - } - return res; -} - -bool -symlink_info::parse_device (const char *contents) -{ - char *endptr; - _major_t mymajor; - _major_t myminor; - _mode_t mymode; - - mymajor = strtol (contents += 2, &endptr, 16); - if (endptr == contents) - return isdevice = false; - - contents = endptr; - myminor = strtol (++contents, &endptr, 16); - if (endptr == contents) - return isdevice = false; - - contents = endptr; - mymode = strtol (++contents, &endptr, 16); - if (endptr == contents) - return isdevice = false; - - if ((mymode & S_IFMT) == S_IFIFO) - { - mymajor = _major (FH_FIFO); - myminor = _minor (FH_FIFO); - } - - major = mymajor; - minor = myminor; - mode = mymode; - return isdevice = true; -} - -/* Check if PATH is a symlink. PATH must be a valid Win32 path name. - - If PATH is a symlink, put the value of the symlink--the file to - which it points--into BUF. The value stored in BUF is not - necessarily null terminated. BUFLEN is the length of BUF; only up - to BUFLEN characters will be stored in BUF. BUF may be NULL, in - which case nothing will be stored. - - Set *SYML if PATH is a symlink. - - Set *EXEC if PATH appears to be executable. This is an efficiency - hack because we sometimes have to open the file anyhow. *EXEC will - not be set for every executable file. - - Return -1 on error, 0 if PATH is not a symlink, or the length - stored into BUF if PATH is a symlink. */ - -int -symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt) -{ - HANDLE h; - int res = 0; - suffix_scan suffix; - contents[0] = '\0'; - - issymlink = true; - isdevice = false; - ext_here = suffix.has (path, suffixes); - extn = ext_here - path; - major = 0; - minor = 0; - mode = 0; - - pflags &= ~(PATH_SYMLINK | PATH_LNK); - unsigned pflags_or = pflags & PATH_NO_ACCESS_CHECK; - - case_clash = false; - - while (suffix.next ()) - { - error = 0; - fileattr = GetFileAttributes (suffix.path); - if (fileattr == INVALID_FILE_ATTRIBUTES) - { - /* The GetFileAttributes call can fail for reasons that don't - matter, so we just return 0. For example, getting the - attributes of \\HOST will typically fail. */ - debug_printf ("GetFileAttributes (%s) failed", suffix.path); - - /* The above comment is not *quite* right. When calling - GetFileAttributes for a non-existant file an a Win9x share, - GetLastError returns ERROR_INVALID_FUNCTION. Go figure! - Also, GetFileAttributes fails with ERROR_SHARING_VIOLATION - if the file is locked exclusively by another process. - If we don't special handle this here, the file is accidentally - treated as non-existant. */ - DWORD win_error = GetLastError (); - if (win_error == ERROR_INVALID_FUNCTION) - win_error = ERROR_FILE_NOT_FOUND; - else if (win_error == ERROR_SHARING_VIOLATION) - { - ext_tacked_on = !!*ext_here; - fileattr = 0; - goto file_not_symlink; - } - if (set_error (geterrno_from_win_error (win_error, EACCES))) - continue; - } - - ext_tacked_on = !!*ext_here; - - if (pcheck_case != PCHECK_RELAXED && !case_check (path) - || (opt & PC_SYM_IGNORE)) - goto file_not_symlink; - - int sym_check; - - sym_check = 0; - - if (fileattr & FILE_ATTRIBUTE_DIRECTORY) - goto file_not_symlink; - - /* Windows shortcuts are treated as symlinks. */ - if (suffix.lnk_match ()) - sym_check = 1; - - /* This is the old Cygwin method creating symlinks: */ - /* A symlink will have the `system' file attribute. */ - /* Only files can be symlinks (which can be symlinks to directories). */ - if (fileattr & FILE_ATTRIBUTE_SYSTEM) - sym_check = 2; - - if (!sym_check) - goto file_not_symlink; - - if (sym_check > 0 && opt & PC_CHECK_EA && - (res = get_symlink_ea (suffix.path, contents, sizeof (contents))) > 0) - { - pflags = PATH_SYMLINK | pflags_or; - if (sym_check == 1) - pflags |= PATH_LNK; - debug_printf ("Got symlink from EA: %s", contents); - break; - } - - /* Open the file. */ - - h = CreateFile (suffix.path, GENERIC_READ, FILE_SHARE_READ, - &sec_none_nih, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - res = -1; - if (h == INVALID_HANDLE_VALUE) - goto file_not_symlink; - - /* FIXME: if symlink isn't present in EA, but EAs are supported, - should we write it there? */ - switch (sym_check) - { - case 1: - res = check_shortcut (suffix.path, h); - if (!res) - /* check more below */; - else if (contents[0] == ':' && contents[1] == '\\' && parse_device (contents)) - goto file_not_symlink; - else - break; - /* If searching for `foo' and then finding a `foo.lnk' which is - no shortcut, return the same as if file not found. */ - if (!suffix.lnk_match () || !ext_tacked_on) - goto file_not_symlink; - - fileattr = INVALID_FILE_ATTRIBUTES; - continue; /* in case we're going to tack *another* .lnk on this filename. */ - case 2: - res = check_sysfile (suffix.path, h); - if (!res) - goto file_not_symlink; - break; - } - break; - - file_not_symlink: - issymlink = false; - syscall_printf ("%s", isdevice ? "is a device" : "not a symlink"); - res = 0; - break; - } - - syscall_printf ("%d = symlink.check (%s, %p) (%p)", - res, suffix.path, contents, pflags); - return res; -} - -/* "path" is the path in a virtual symlink. Set a symlink_info struct from - that and proceed with further path checking afterwards. */ -int -symlink_info::set (char *path) -{ - strcpy (contents, path); - pflags = PATH_SYMLINK; - fileattr = FILE_ATTRIBUTE_NORMAL; - error = 0; - issymlink = true; - isdevice = false; - ext_tacked_on = case_clash = false; - ext_here = NULL; - extn = major = minor = mode = 0; - return strlen (path); -} - -/* Check the correct case of the last path component (given in DOS style). - Adjust the case in this->path if pcheck_case == PCHECK_ADJUST or return - false if pcheck_case == PCHECK_STRICT. - Dont't call if pcheck_case == PCHECK_RELAXED. -*/ - -bool -symlink_info::case_check (char *path) -{ - WIN32_FIND_DATA data; - HANDLE h; - char *c; - - /* Set a pointer to the beginning of the last component. */ - if (!(c = strrchr (path, '\\'))) - c = path; - else - ++c; - - if ((h = FindFirstFile (path, &data)) - != INVALID_HANDLE_VALUE) - { - FindClose (h); - - /* If that part of the component exists, check the case. */ - if (strncmp (c, data.cFileName, strlen (data.cFileName))) - { - case_clash = true; - - /* If check is set to STRICT, a wrong case results - in returning a ENOENT. */ - if (pcheck_case == PCHECK_STRICT) - return false; - - /* PCHECK_ADJUST adjusts the case in the incoming - path which points to the path in *this. */ - strcpy (c, data.cFileName); - } - } - return true; -} - -/* readlink system call */ - -extern "C" int -readlink (const char *path, char *buf, int buflen) -{ - extern suffix_info stat_suffixes[]; - - if (buflen < 0) - { - set_errno (ENAMETOOLONG); - return -1; - } - - path_conv pathbuf (path, PC_SYM_CONTENTS, stat_suffixes); - - if (pathbuf.error) - { - set_errno (pathbuf.error); - syscall_printf ("-1 = readlink (%s, %p, %d)", path, buf, buflen); - return -1; - } - - if (!pathbuf.exists ()) - { - set_errno (ENOENT); - return -1; - } - - if (!pathbuf.issymlink ()) - { - if (pathbuf.exists ()) - set_errno (EINVAL); - return -1; - } - - int len = min (buflen, (int) strlen (pathbuf.get_win32 ())); - memcpy (buf, pathbuf.get_win32 (), len); - - /* errno set by symlink.check if error */ - return len; -} - -/* Some programs rely on st_dev/st_ino being unique for each file. - Hash the path name and hope for the best. The hash arg is not - always initialized to zero since readdir needs to compute the - dirent ino_t based on a combination of the hash of the directory - done during the opendir call and the hash or the filename within - the directory. FIXME: Not bullet-proof. */ -/* Cygwin internal */ - -__ino64_t __stdcall -hash_path_name (__ino64_t hash, const char *name) -{ - if (!*name) - return hash; - - /* Perform some initial permutations on the pathname if this is - not "seeded" */ - if (!hash) - { - /* Simplistic handling of drives. If there is a drive specified, - make sure that the initial letter is upper case. If there is - no \ after the ':' assume access through the root directory - of that drive. - FIXME: Should really honor MS-Windows convention of using - the environment to track current directory on various drives. */ - if (name[1] == ':') - { - char *nn, *newname = (char *) alloca (strlen (name) + 2); - nn = newname; - *nn = isupper (*name) ? cyg_tolower (*name) : *name; - *++nn = ':'; - name += 2; - if (*name != '\\') - *++nn = '\\'; - strcpy (++nn, name); - name = newname; - goto hashit; - } - - /* Fill out the hashed path name with the current working directory if - this is not an absolute path and there is no pre-specified hash value. - Otherwise the inodes same will differ depending on whether a file is - referenced with an absolute value or relatively. */ - - if (!hash && !isabspath (name)) - { - hash = cygheap->cwd.get_hash (); - if (name[0] == '.' && name[1] == '\0') - return hash; - hash = '\\' + (hash << 6) + (hash << 16) - hash; - } - } - -hashit: - /* Build up hash. Name is already normalized */ - do - { - int ch = cyg_tolower (*name); - hash = ch + (hash << 6) + (hash << 16) - hash; - } - while (*++name != '\0'); - return hash; -} - -char * -getcwd (char *buf, size_t ulen) -{ - char* res = NULL; - myfault efault; - if (efault.faulted (EFAULT)) - /* errno set */; - else if (ulen == 0 && buf) - set_errno (EINVAL); - else - res = cygheap->cwd.get (buf, 1, 1, ulen); - return res; -} - -/* getwd: standards? */ -extern "C" char * -getwd (char *buf) -{ - return getcwd (buf, CYG_MAX_PATH); -} - -/* chdir: POSIX 5.2.1.1 */ -extern "C" int -chdir (const char *in_dir) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (!*in_dir) - { - set_errno (ENOENT); - return -1; - } - - syscall_printf ("dir '%s'", in_dir); - - /* Convert path. First argument ensures that we don't check for NULL/empty/invalid - again. */ - path_conv path (PC_NONULLEMPTY, in_dir, PC_SYM_FOLLOW | PC_POSIX); - if (path.error) - { - set_errno (path.error); - syscall_printf ("-1 = chdir (%s)", in_dir); - return -1; - } - - int res = -1; - bool doit = false; - const char *native_dir = path, *posix_cwd = NULL; - int devn = path.get_devn (); - if (!isvirtual_dev (devn)) - { - /* Check to see if path translates to something like C:. - If it does, append a \ to the native directory specification to - defeat the Windows 95 (i.e. MS-DOS) tendency of returning to - the last directory visited on the given drive. */ - if (isdrive (native_dir) && !native_dir[2]) - { - path.get_win32 ()[2] = '\\'; - path.get_win32 ()[3] = '\0'; - } - /* The sequence chdir("xx"); chdir(".."); must be a noop if xx - is not a symlink. This is exploited by find.exe. - The posix_cwd is just path.normalized_path. - In other cases we let cwd.set obtain the Posix path through - the mount table. */ - if (!isdrive(path.normalized_path)) - posix_cwd = path.normalized_path; - res = 0; - doit = true; - } - else if (!path.exists ()) - set_errno (ENOENT); - else if (!path.isdir ()) - set_errno (ENOTDIR); - else - { - posix_cwd = path.normalized_path; - res = 0; - } - - if (!res) - res = cygheap->cwd.set (native_dir, posix_cwd, doit); - - /* Note that we're accessing cwd.posix without a lock here. I didn't think - it was worth locking just for strace. */ - syscall_printf ("%d = chdir() cygheap->cwd.posix '%s' native '%s'", res, - cygheap->cwd.posix, native_dir); - MALLOC_CHECK; - return res; -} - -extern "C" int -fchdir (int fd) -{ - int res; - cygheap_fdget cfd (fd); - if (cfd >= 0) - res = chdir (cfd->get_name ()); - else - res = -1; - - syscall_printf ("%d = fchdir (%d)", res, fd); - return res; -} - -/******************** Exported Path Routines *********************/ - -/* Cover functions to the path conversion routines. - These are exported to the world as cygwin_foo by cygwin.din. */ - -#define return_with_errno(x) \ - do {\ - int err = (x);\ - if (!err)\ - return 0;\ - set_errno (err);\ - return -1;\ - } while (0) - -extern "C" int -cygwin_conv_to_win32_path (const char *path, char *win32_path) -{ - path_conv p (path, PC_SYM_FOLLOW | PC_NO_ACCESS_CHECK | PC_NOFULL); - if (p.error) - { - win32_path[0] = '\0'; - set_errno (p.error); - return -1; - } - - - strcpy (win32_path, strcmp ((char *) p, ".\\") == 0 ? "." : (char *) p); - return 0; -} - -extern "C" int -cygwin_conv_to_full_win32_path (const char *path, char *win32_path) -{ - path_conv p (path, PC_SYM_FOLLOW | PC_NO_ACCESS_CHECK); - if (p.error) - { - win32_path[0] = '\0'; - set_errno (p.error); - return -1; - } - - strcpy (win32_path, p); - return 0; -} - -/* This is exported to the world as cygwin_foo by cygwin.din. */ - -extern "C" int -cygwin_conv_to_posix_path (const char *path, char *posix_path) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (!*path) - { - set_errno (ENOENT); - return -1; - } - return_with_errno (mount_table->conv_to_posix_path (path, posix_path, 1)); -} - -extern "C" int -cygwin_conv_to_full_posix_path (const char *path, char *posix_path) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (!*path) - { - set_errno (ENOENT); - return -1; - } - return_with_errno (mount_table->conv_to_posix_path (path, posix_path, 0)); -} - -/* The realpath function is supported on some UNIX systems. */ - -extern "C" char * -realpath (const char *path, char *resolved) -{ - extern suffix_info stat_suffixes[]; - - /* Make sure the right errno is returned if path is NULL. */ - if (!path) - { - set_errno (EINVAL); - return NULL; - } - - /* Guard reading from a potentially invalid path and writing to a - potentially invalid resolved. */ - myfault efault; - if (efault.faulted (EFAULT)) - return NULL; - - char *tpath; - if (isdrive (path)) - { - tpath = (char *) alloca (strlen (path) - + strlen (mount_table->cygdrive) - + 1); - mount_table->cygdrive_posix_path (path, tpath, 0); - } - else - tpath = (char *) path; - - path_conv real_path (tpath, PC_SYM_FOLLOW | PC_POSIX, stat_suffixes); - - - /* Linux has this funny non-standard extension. If "resolved" is NULL, - realpath mallocs the space by itself and returns it to the application. - The application is responsible for calling free() then. This extension - is backed by POSIX, which allows implementation-defined behaviour if - "resolved" is NULL. That's good enough for us to do the same here. */ - - if (!real_path.error && real_path.exists ()) - { - /* Check for the suffix being tacked on. */ - int tack_on = 0; - if (!transparent_exe && real_path.known_suffix) - { - char *c = strrchr (real_path.normalized_path, '.'); - if (!c || !strcasematch (c, real_path.known_suffix)) - tack_on = strlen (real_path.known_suffix); - } - - if (!resolved) - { - resolved = (char *) malloc (strlen (real_path.normalized_path) - + tack_on + 1); - if (!resolved) - return NULL; - } - strcpy (resolved, real_path.normalized_path); - if (tack_on) - strcat (resolved, real_path.known_suffix); - return resolved; - } - - /* FIXME: on error, we are supposed to put the name of the path - component which could not be resolved into RESOLVED. */ - if (resolved) - resolved[0] = '\0'; - set_errno (real_path.error ?: ENOENT); - return NULL; -} - -/* Return non-zero if path is a POSIX path list. - This is exported to the world as cygwin_foo by cygwin.din. - -DOCTOOL-START - - Rather than use a mode to say what the "proper" path list - format is, we allow any, and give apps the tools they need to - convert between the two. If a ';' is present in the path list it's - a Win32 path list. Otherwise, if the first path begins with - [letter]: (in which case it can be the only element since if it - wasn't a ';' would be present) it's a Win32 path list. Otherwise, - it's a POSIX path list. - -DOCTOOL-END - */ - -extern "C" int -cygwin_posix_path_list_p (const char *path) -{ - int posix_p = !(strchr (path, ';') || isdrive (path)); - return posix_p; -} - -/* These are used for apps that need to convert env vars like PATH back and - forth. The conversion is a two step process. First, an upper bound on the - size of the buffer needed is computed. Then the conversion is done. This - allows the caller to use alloca if it wants. */ - -static int -conv_path_list_buf_size (const char *path_list, bool to_posix) -{ - int i, num_elms, max_mount_path_len, size; - const char *p; - - path_conv pc(".", PC_POSIX); - /* The theory is that an upper bound is - current_size + (num_elms * max_mount_path_len) */ - - unsigned nrel; - char delim = to_posix ? ';' : ':'; - for (p = path_list, num_elms = nrel = 0; p; num_elms++) - { - if (!isabspath (p)) - nrel++; - p = strchr (++p, delim); - } - - /* 7: strlen ("//c") + slop, a conservative initial value */ - for (max_mount_path_len = sizeof ("/cygdrive/X"), i = 0; - i < mount_table->nmounts; i++) - { - int mount_len = (to_posix - ? mount_table->mount[i].posix_pathlen - : mount_table->mount[i].native_pathlen); - if (max_mount_path_len < mount_len) - max_mount_path_len = mount_len; - } - - /* 100: slop */ - size = strlen (path_list) - + (num_elms * max_mount_path_len) - + (nrel * strlen (to_posix ? pc.normalized_path : pc.get_win32 ())) - + 100; - - return size; -} - - -extern "C" int -cygwin_win32_to_posix_path_list_buf_size (const char *path_list) -{ - return conv_path_list_buf_size (path_list, true); -} - -extern "C" int -cygwin_posix_to_win32_path_list_buf_size (const char *path_list) -{ - return conv_path_list_buf_size (path_list, false); -} - -extern "C" int -cygwin_win32_to_posix_path_list (const char *win32, char *posix) -{ - return_with_errno (conv_path_list (win32, posix, 1)); -} - -extern "C" int -cygwin_posix_to_win32_path_list (const char *posix, char *win32) -{ - return_with_errno (conv_path_list (posix, win32, 0)); -} - -/* cygwin_split_path: Split a path into directory and file name parts. - Buffers DIR and FILE are assumed to be big enough. - - Examples (path -> `dir' / `file'): - / -> `/' / `' - "" -> `.' / `' - . -> `.' / `.' (FIXME: should this be `.' / `'?) - .. -> `.' / `..' (FIXME: should this be `..' / `'?) - foo -> `.' / `foo' - foo/bar -> `foo' / `bar' - foo/bar/ -> `foo' / `bar' - /foo -> `/' / `foo' - /foo/bar -> `/foo' / `bar' - c: -> `c:/' / `' - c:/ -> `c:/' / `' - c:foo -> `c:/' / `foo' - c:/foo -> `c:/' / `foo' - */ - -extern "C" void -cygwin_split_path (const char *path, char *dir, char *file) -{ - int dir_started_p = 0; - - /* Deal with drives. - Remember that c:foo <==> c:/foo. */ - if (isdrive (path)) - { - *dir++ = *path++; - *dir++ = *path++; - *dir++ = '/'; - if (!*path) - { - *dir = 0; - *file = 0; - return; - } - if (isdirsep (*path)) - ++path; - dir_started_p = 1; - } - - /* Determine if there are trailing slashes and "delete" them if present. - We pretend as if they don't exist. */ - const char *end = path + strlen (path); - /* path + 1: keep leading slash. */ - while (end > path + 1 && isdirsep (end[-1])) - --end; - - /* At this point, END points to one beyond the last character - (with trailing slashes "deleted"). */ - - /* Point LAST_SLASH at the last slash (duh...). */ - const char *last_slash; - for (last_slash = end - 1; last_slash >= path; --last_slash) - if (isdirsep (*last_slash)) - break; - - if (last_slash == path) - { - *dir++ = '/'; - *dir = 0; - } - else if (last_slash > path) - { - memcpy (dir, path, last_slash - path); - dir[last_slash - path] = 0; - } - else - { - if (dir_started_p) - ; /* nothing to do */ - else - *dir++ = '.'; - *dir = 0; - } - - memcpy (file, last_slash + 1, end - last_slash - 1); - file[end - last_slash - 1] = 0; -} - -/*****************************************************************************/ - -/* Return the hash value for the current win32 value. - This is used when constructing inodes. */ -DWORD -cwdstuff::get_hash () -{ - DWORD hashnow; - cwd_lock.acquire (); - hashnow = hash; - cwd_lock.release (); - return hashnow; -} - -/* Initialize cygcwd 'muto' for serializing access to cwd info. */ -void -cwdstuff::init () -{ - cwd_lock.init ("cwd_lock"); -} - -/* Get initial cwd. Should only be called once in a - process tree. */ -bool -cwdstuff::get_initial () -{ - cwd_lock.acquire (); - - if (win32) - return 1; - - /* Leaves cwd lock unreleased, if success */ - return !set (NULL, NULL, false); -} - -/* Chdir and fill out the elements of a cwdstuff struct. - It is assumed that the lock for the cwd is acquired if - win32_cwd == NULL. */ -int -cwdstuff::set (const char *win32_cwd, const char *posix_cwd, bool doit) -{ - char pathbuf[2 * CYG_MAX_PATH]; - int res = -1; - - if (win32_cwd) - { - cwd_lock.acquire (); - if (doit && !SetCurrentDirectory (win32_cwd)) - { - /* When calling SetCurrentDirectory for a non-existant dir on a - Win9x share, it returns ERROR_INVALID_FUNCTION. */ - if (GetLastError () == ERROR_INVALID_FUNCTION) - set_errno (ENOENT); - else - __seterrno (); - goto out; - } - } - /* If there is no win32 path or it has the form c:xxx, get the value */ - if (!win32_cwd || (isdrive (win32_cwd) && win32_cwd[2] != '\\')) - { - int i; - DWORD len, dlen; - for (i = 0, dlen = CYG_MAX_PATH/3; i < 2; i++, dlen = len) - { - win32 = (char *) crealloc (win32, dlen); - if ((len = GetCurrentDirectoryA (dlen, win32)) < dlen) - break; - } - if (len == 0) - { - __seterrno (); - debug_printf ("GetCurrentDirectory, %E"); - win32_cwd = pathbuf; /* Force lock release */ - goto out; - } - posix_cwd = NULL; - } - else - { - win32 = (char *) crealloc (win32, strlen (win32_cwd) + 1); - strcpy (win32, win32_cwd); - } - if (win32[1] == ':') - drive_length = 2; - else if (win32[1] == '\\') - { - char * ptr = strechr (win32 + 2, '\\'); - if (*ptr) - ptr = strechr (ptr + 1, '\\'); - drive_length = ptr - win32; - } - else - drive_length = 0; - - if (!posix_cwd) - { - mount_table->conv_to_posix_path (win32, pathbuf, 0); - posix_cwd = pathbuf; - } - posix = (char *) crealloc (posix, strlen (posix_cwd) + 1); - strcpy (posix, posix_cwd); - - hash = hash_path_name (0, win32); - - res = 0; -out: - if (win32_cwd) - cwd_lock.release (); - return res; -} - -/* Copy the value for either the posix or the win32 cwd into a buffer. */ -char * -cwdstuff::get (char *buf, int need_posix, int with_chroot, unsigned ulen) -{ - MALLOC_CHECK; - - if (ulen) - /* nothing */; - else if (buf == NULL) - ulen = (unsigned) -1; - else - { - set_errno (EINVAL); - goto out; - } - - if (!get_initial ()) /* Get initial cwd and set cwd lock */ - return NULL; - - char *tocopy; - if (!need_posix) - tocopy = win32; - else - tocopy = posix; - - debug_printf ("posix %s", posix); - if (strlen (tocopy) >= ulen) - { - set_errno (ERANGE); - buf = NULL; - } - else - { - if (!buf) - buf = (char *) malloc (strlen (tocopy) + 1); - strcpy (buf, tocopy); - if (!buf[0]) /* Should only happen when chroot */ - strcpy (buf, "/"); - } - - cwd_lock.release (); - -out: - syscall_printf ("(%s) = cwdstuff::get (%p, %d, %d, %d), errno %d", - buf, buf, ulen, need_posix, with_chroot, errno); - MALLOC_CHECK; - return buf; -} - -int etc::curr_ix = 0; -/* Note that the first elements of the below arrays are unused */ -bool etc::change_possible[MAX_ETC_FILES + 1]; -const char *etc::fn[MAX_ETC_FILES + 1]; -FILETIME etc::last_modified[MAX_ETC_FILES + 1]; - -int -etc::init (int n, const char *etc_fn) -{ - if (n > 0) - /* ok */; - else if (++curr_ix <= MAX_ETC_FILES) - n = curr_ix; - else - api_fatal ("internal error"); - - fn[n] = etc_fn; - change_possible[n] = false; - test_file_change (n); - paranoid_printf ("fn[%d] %s, curr_ix %d", n, fn[n], curr_ix); - return n; -} - -bool -etc::test_file_change (int n) -{ - HANDLE h; - WIN32_FIND_DATA data; - bool res; - - if ((h = FindFirstFile (fn[n], &data)) == INVALID_HANDLE_VALUE) - { - res = true; - memset (last_modified + n, 0, sizeof (last_modified[n])); - debug_printf ("FindFirstFile failed, %E"); - } - else - { - FindClose (h); - res = CompareFileTime (&data.ftLastWriteTime, last_modified + n) > 0; - last_modified[n] = data.ftLastWriteTime; - debug_printf ("FindFirstFile succeeded"); - } - - paranoid_printf ("fn[%d] %s res %d", n, fn[n], res); - return res; -} - -bool -etc::dir_changed (int n) -{ - if (!change_possible[n]) - { - static HANDLE changed_h NO_COPY; - - if (!changed_h) - { - path_conv pwd ("/etc"); - changed_h = FindFirstChangeNotification (pwd, FALSE, - FILE_NOTIFY_CHANGE_LAST_WRITE - | FILE_NOTIFY_CHANGE_FILE_NAME); -#ifdef DEBUGGING - if (changed_h == INVALID_HANDLE_VALUE) - system_printf ("Can't open %s for checking, %E", (char *) pwd); -#endif - memset (change_possible, true, sizeof (change_possible)); - } - - if (changed_h == INVALID_HANDLE_VALUE) - change_possible[n] = true; - else if (WaitForSingleObject (changed_h, 0) == WAIT_OBJECT_0) - { - FindNextChangeNotification (changed_h); - memset (change_possible, true, sizeof change_possible); - } - } - - paranoid_printf ("fn[%d] %s change_possible %d", n, fn[n], change_possible[n]); - return change_possible[n]; -} - -bool -etc::file_changed (int n) -{ - bool res = false; - if (dir_changed (n) && test_file_change (n)) - res = true; - change_possible[n] = false; /* Change is no longer possible */ - paranoid_printf ("fn[%d] %s res %d", n, fn[n], res); - return res; -} - -/* No need to be reentrant or thread-safe according to SUSv3. - / and \\ are treated equally. Leading drive specifiers are - kept intact as far as it makes sense. Everything else is - POSIX compatible. */ -extern "C" char * -basename (char *path) -{ - static char buf[CYG_MAX_PATH]; - char *c, *d, *bs = buf; - - if (!path || !*path) - return strcpy (buf, "."); - strncpy (buf, path, CYG_MAX_PATH); - if (isalpha (buf[0]) && buf[1] == ':') - bs += 2; - else if (strspn (buf, "/\\") > 1) - ++bs; - c = strrchr (bs, '/'); - if ((d = strrchr (c ?: bs, '\\')) > c) - c = d; - if (c) - { - /* Trailing (back)slashes are eliminated. */ - while (c && c > bs && c[1] == '\0') - { - *c = '\0'; - c = strrchr (bs, '/'); - if ((d = strrchr (c ?: bs, '\\')) > c) - c = d; - } - if (c && (c > bs || c[1])) - return c + 1; - } - else if (!bs[0]) - strcpy (bs, "."); - return buf; -} - -/* No need to be reentrant or thread-safe according to SUSv3. - / and \\ are treated equally. Leading drive specifiers and - leading double (back)slashes are kept intact as far as it - makes sense. Everything else is POSIX compatible. */ -extern "C" char * -dirname (char *path) -{ - static char buf[CYG_MAX_PATH]; - char *c, *d, *bs = buf; - - if (!path || !*path) - return strcpy (buf, "."); - strncpy (buf, path, CYG_MAX_PATH); - if (isalpha (buf[0]) && buf[1] == ':') - bs += 2; - else if (strspn (buf, "/\\") > 1) - ++bs; - c = strrchr (bs, '/'); - if ((d = strrchr (c ?: bs, '\\')) > c) - c = d; - if (c) - { - /* Trailing (back)slashes are eliminated. */ - while (c && c > bs && c[1] == '\0') - { - *c = '\0'; - c = strrchr (bs, '/'); - if ((d = strrchr (c ?: bs, '\\')) > c) - c = d; - } - if (!c) - strcpy (bs, "."); - else if (c > bs) - { - /* More trailing (back)slashes are eliminated. */ - while (c > bs && (*c == '/' || *c == '\\')) - *c-- = '\0'; - } - else - c[1] = '\0'; - } - else - strcpy (bs, "."); - return buf; -} diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h deleted file mode 100644 index 233dd15b8..000000000 --- a/winsup/cygwin/path.h +++ /dev/null @@ -1,317 +0,0 @@ -/* path.h: path data structures - - Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, - 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "devices.h" - -#include -#include -#include - -inline bool -has_attribute (DWORD attributes, DWORD attribs_to_test) -{ - return attributes != INVALID_FILE_ATTRIBUTES - && (attributes & attribs_to_test); -} - -enum executable_states -{ - is_executable, - dont_care_if_executable, - not_executable = dont_care_if_executable, - dont_know_if_executable -}; - -struct suffix_info -{ - const char *name; - int addon; - suffix_info (const char *s, int addit = 0): name (s), addon (addit) {} -}; - -enum pathconv_arg -{ - PC_SYM_FOLLOW = 0x0001, - PC_SYM_NOFOLLOW = 0x0002, - PC_SYM_IGNORE = 0x0004, - PC_SYM_CONTENTS = 0x0008, - PC_NOFULL = 0x0010, - PC_NULLEMPTY = 0x0020, - PC_CHECK_EA = 0x0040, - PC_POSIX = 0x0080, - PC_NO_ACCESS_CHECK = 0x00800000 -}; - -enum case_checking -{ - PCHECK_RELAXED = 0, - PCHECK_ADJUST = 1, - PCHECK_STRICT = 2 -}; - -#define PC_NONULLEMPTY -1 - -#include "sys/mount.h" - -enum path_types -{ - PATH_NOTHING = 0, - PATH_SYMLINK = MOUNT_SYMLINK, - PATH_BINARY = MOUNT_BINARY, - PATH_EXEC = MOUNT_EXEC, - PATH_NOTEXEC = MOUNT_NOTEXEC, - PATH_CYGWIN_EXEC = MOUNT_CYGWIN_EXEC, - PATH_ENC = MOUNT_ENC, - PATH_RO = MOUNT_RO, - PATH_ALL_EXEC = (PATH_CYGWIN_EXEC | PATH_EXEC), - PATH_NO_ACCESS_CHECK = PC_NO_ACCESS_CHECK, - PATH_LNK = 0x01000000, - PATH_TEXT = 0x02000000, - PATH_HAS_SYMLINKS = 0x10000000, - PATH_SOCKET = 0x40000000 -}; - -class symlink_info; -struct fs_info -{ - private: - __ino64_t name_hash; - struct status_flags - { - DWORD flags; /* Volume flags */ - DWORD serial; /* Volume serial number */ - unsigned is_remote_drive : 1; - unsigned has_buggy_open : 1; - unsigned has_ea : 1; - unsigned has_acls : 1; - unsigned is_fat : 1; - unsigned drive_type : 3; - } status; - public: - void clear () - { - name_hash = 0; - flags () = serial () = 0; - is_remote_drive (false); - has_buggy_open (false); - has_ea (false); - has_acls (false); - is_fat (false); - drive_type (false); - } - inline DWORD& flags () {return status.flags;}; - inline DWORD& serial () {return status.serial;}; - - IMPLEMENT_STATUS_FLAG (bool, is_remote_drive) - IMPLEMENT_STATUS_FLAG (bool, has_buggy_open) - IMPLEMENT_STATUS_FLAG (bool, is_fat) - IMPLEMENT_STATUS_FLAG (bool, has_ea) - IMPLEMENT_STATUS_FLAG (bool, has_acls) - IMPLEMENT_STATUS_FLAG (DWORD, drive_type) - - bool update (const char *); -}; - -class path_conv -{ - DWORD fileattr; - fs_info fs; - void add_ext_from_sym (symlink_info&); - public: - - unsigned path_flags; - char *known_suffix; - int error; - device dev; - bool case_clash; - - bool isremote () {return fs.is_remote_drive ();} - int has_acls () const {return fs.has_acls (); } - int has_symlinks () const {return path_flags & PATH_HAS_SYMLINKS;} - bool hasgood_inode (); /* Implemented in fhandler_disk_file.cc */ - bool is_samba (); /* Implemented in fhandler_disk_file.cc */ - int has_buggy_open () const {return fs.has_buggy_open ();} - bool isencoded () {return path_flags & PATH_ENC;} - int binmode () const - { - if (path_flags & PATH_BINARY) - return O_BINARY; - if (path_flags & PATH_TEXT) - return O_TEXT; - return 0; - } - int issymlink () const {return path_flags & PATH_SYMLINK;} - int is_lnk_symlink () const {return path_flags & PATH_LNK;} - int isdevice () const {return dev.devn && dev.devn != FH_FS && dev.devn != FH_FIFO;} - int isfifo () const {return dev == FH_FIFO;} - int isspecial () const {return dev.devn && dev.devn != FH_FS;} - int iscygdrive () const {return dev.devn == FH_CYGDRIVE;} - int is_auto_device () const {return isdevice () && !is_fs_special ();} - int is_fs_device () const {return isdevice () && is_fs_special ();} - int is_fs_special () const {return dev.is_fs_special ();} - int is_lnk_special () const {return is_fs_device () || isfifo () || is_lnk_symlink ();} - int issocket () const {return dev.devn == FH_UNIX;} - int iscygexec () const {return path_flags & PATH_CYGWIN_EXEC;} - void set_cygexec (bool isset) - { - if (isset) - path_flags |= PATH_CYGWIN_EXEC; - else - path_flags &= ~PATH_CYGWIN_EXEC; - } - bool isro () const {return !!(path_flags & PATH_RO);} - bool exists () const {return fileattr != INVALID_FILE_ATTRIBUTES;} - bool has_attribute (DWORD x) const {return exists () && (fileattr & x);} - int isdir () const {return has_attribute (FILE_ATTRIBUTE_DIRECTORY);} - executable_states exec_state () - { - extern int _check_for_executable; - if (path_flags & PATH_ALL_EXEC) - return is_executable; - if (path_flags & PATH_NOTEXEC) - return not_executable; - if (!_check_for_executable) - return dont_care_if_executable; - return dont_know_if_executable; - } - - void set_binary () {path_flags |= PATH_BINARY;} - void set_symlink (DWORD n) {path_flags |= PATH_SYMLINK; symlink_length = n;} - void set_has_symlinks () {path_flags |= PATH_HAS_SYMLINKS;} - void set_exec (int x = 1) {path_flags |= x ? PATH_EXEC : PATH_NOTEXEC;} - - void check (const char *src, unsigned opt = PC_SYM_FOLLOW, - const suffix_info *suffixes = NULL) __attribute__ ((regparm(3))); - - path_conv (const device& in_dev): fileattr (INVALID_FILE_ATTRIBUTES), - path_flags (0), known_suffix (NULL), error (0), dev (in_dev) - { - strcpy (path, in_dev.native); - } - - path_conv (int, const char *src, unsigned opt = PC_SYM_FOLLOW, - const suffix_info *suffixes = NULL) - { - check (src, opt, suffixes); - } - - path_conv (const char *src, unsigned opt = PC_SYM_FOLLOW, - const suffix_info *suffixes = NULL) - { - check (src, opt | PC_NULLEMPTY, suffixes); - } - - path_conv (): fileattr (INVALID_FILE_ATTRIBUTES), path_flags (0), - known_suffix (NULL), error (0), normalized_path (NULL) - {path[0] = '\0';} - - ~path_conv (); - void set_name (const char *win32, const char *posix); - inline char *get_win32 () { return path; } - PUNICODE_STRING get_nt_native_path (UNICODE_STRING &upath); - operator char *() {return path;} - operator const char *() {return path;} - operator DWORD &() {return fileattr;} - operator int () {return fileattr; } - char operator [](int i) const {return path[i];} - DWORD get_devn () {return dev.devn;} - short get_unitn () {return dev.minor;} - DWORD file_attributes () {return fileattr;} - void file_attributes (DWORD new_attr) {fileattr = new_attr;} - DWORD drive_type () {return fs.drive_type ();} - DWORD fs_flags () {return fs.flags ();} - bool fs_has_ea () {return fs.has_ea ();} - bool fs_is_fat () {return fs.is_fat ();} - void set_path (const char *p) {strcpy (path, p);} - DWORD volser () { return fs.serial (); } - void fillin (HANDLE h); - inline size_t size () - { - return (sizeof (*this) - sizeof (path)) + strlen (path) + 1 + normalized_path_size; - } - - unsigned __stdcall ndisk_links (DWORD); - char *normalized_path; - size_t normalized_path_size; - void set_normalized_path (const char *, bool) __attribute__ ((regparm (3))); - DWORD get_symlink_length () { return symlink_length; }; - private: - DWORD symlink_length; - char path[CYG_MAX_PATH]; -}; - -/* Symlink marker */ -#define SYMLINK_COOKIE "!" - -#define SYMLINK_EA_NAME ".CYGSYMLINK" - -/* Socket marker */ -#define SOCKET_COOKIE "!" - -/* The sizeof header written to a shortcut by Cygwin or U/WIN. */ -#define SHORTCUT_HDR_SIZE 76 - -/* Maximum depth of symlinks (after which ELOOP is issued). */ -#define MAX_LINK_DEPTH 10 -int __stdcall slash_unc_prefix_p (const char *path) __attribute__ ((regparm(1))); - -enum fe_types -{ - FE_NADA = 0, /* Nothing special */ - FE_NNF = 1, /* Return NULL if not found */ - FE_NATIVE = 2, /* Return native path in path_conv struct */ - FE_CWD = 4, /* Search CWD for program */ - FE_DLL = 8 /* Search for DLLs, not executables. */ -}; -const char * __stdcall find_exec (const char *name, path_conv& buf, - const char *winenv = "PATH=", - unsigned opt = FE_NADA, - const char **known_suffix = NULL) - __attribute__ ((regparm(3))); - -/* Common macros for checking for invalid path names */ -#define isdrive(s) (isalpha (*(s)) && (s)[1] == ':') - -static inline bool -has_exec_chars (const char *buf, int len) -{ - return len >= 2 && - ((buf[0] == '#' && buf[1] == '!') || - (buf[0] == ':' && buf[1] == '\n') || - (buf[0] == 'M' && buf[1] == 'Z')); -} - -int pathmatch (const char *path1, const char *path2) __attribute__ ((regparm (2))); -int pathnmatch (const char *path1, const char *path2, int len) __attribute__ ((regparm (2))); -bool has_dot_last_component (const char *dir) __attribute__ ((regparm (1))); - -bool fnunmunge (char *, const char *) __attribute__ ((regparm (2))); - -int path_prefix_p (const char *path1, const char *path2, int len1) __attribute__ ((regparm (3))); - -bool is_floppy (const char *); - -/* FIXME: Move to own include file eventually */ - -#define MAX_ETC_FILES 2 -class etc -{ - friend class dtable; - static int curr_ix; - static bool change_possible[MAX_ETC_FILES + 1]; - static const char *fn[MAX_ETC_FILES + 1]; - static FILETIME last_modified[MAX_ETC_FILES + 1]; - static bool dir_changed (int); - static int init (int, const char *); - static bool file_changed (int); - static bool test_file_change (int); - friend class pwdgrp; -}; diff --git a/winsup/cygwin/path.sgml b/winsup/cygwin/path.sgml deleted file mode 100644 index 05e01d86b..000000000 --- a/winsup/cygwin/path.sgml +++ /dev/null @@ -1,207 +0,0 @@ - -cygwin_posix_to_win32_path_list - - -extern "C" void -cygwin_posix_to_win32_path_list -const char *posix -char *win32 - - -Given a POSIX path-style string (i.e. /foo:/bar) convert it to -the equivalent Win32 path-style string (i.e. d:\;e:\bar). -win32 must point to a sufficiently large -buffer. - - -Example use of cygwin_posix_to_win32_path_list - - - - - -See also -cygwin_posix_to_win32_path_list_buf_size - - - - -cygwin_win32_to_posix_path_list - - -extern "C" void -cygwin_win32_to_posix_path_list -const char *win32 -char *posix - - -Given a Win32 path-style string (i.e. d:\;e:\bar) convert it to -the equivalent POSIX path-style string (i.e. /foo:/bar). -posix must point to a sufficiently large -buffer. See also -cygwin_win32_to_posix_path_list_buf_size - - - - -cygwin_posix_to_win32_path_list_buf_size - - -extern "C" int -cygwin_posix_to_win32_path_list_buf_size -const char *path_list - - -Returns the number of bytes needed to hold the result of calling - -cygwin_posix_to_win32_path_list. - - - - -cygwin_win32_to_posix_path_list_buf_size - - -extern "C" int -cygwin_win32_to_posix_path_list_buf_size -const char *path_list - - -Tells you how many bytes are needed for the results of -cygwin_win32_to_posix_path_list. - - - - -cygwin_conv_to_posix_path - - -extern "C" void -cygwin_conv_to_posix_path -const char *path -char *posix_path - - -Converts a Win32 path to a POSIX path. If -path is already a POSIX path, leaves it alone. -If path is relative, then -posix_path will also be relative. Note that -posix_path must point to a buffer of sufficient -size; use MAX_PATH if needed. - - - - -cygwin_conv_to_win32_path - - -extern "C" void -cygwin_conv_to_win32_path -const char *path -char *win32_path - - -Converts a POSIX path to a Win32 path. If -path is already a Win32 path, leaves it alone. -If path is relative, then -win32_path will also be relative. Note that -win32_path must point to a buffer of sufficient -size; use MAX_PATH if needed. - - - -cygwin_conv_to_full_posix_path - - -extern "C" void -cygwin_conv_to_full_posix_path -const char *path -char *posix_path - - -Converts a Win32 path to a POSIX path. If -path is already a POSIX path, leaves it alone. -If path is relative, then -posix_path will be converted to an absolute -path. Note that posix_path must point to a -buffer of sufficient size; use MAX_PATH if needed. - - - - -cygwin_conv_to_full_win32_path - - -extern "C" void -cygwin_conv_to_full_win32_path -const char *path -char *win32_path - - -Converts a POSIX path to a Win32 path. If -path is already a Win32 path, leaves it alone. -If path is relative, then -win32_path will be converted to an absolute -path. Note that win32_path must point to a -buffer of sufficient size; use MAX_PATH if needed. - - - - -cygwin_posix_path_list_p - - -extern "C" int -posix_path_list_p -const char *path - - -This function tells you if the supplied -path is a POSIX-style path (i.e. posix names, -forward slashes, colon delimiters) or a Win32-style path (drive -letters, reverse slashes, semicolon delimiters. The return value is -true if the path is a POSIX path. Note that "_p" means "predicate", a -lisp term meaning that the function tells you something about the -parameter. - - - - -cygwin_split_path - - -extern "C" void -cygwin_split_path - -const char * path -char * dir -char * file - - -Split a path into the directory and the file portions. Both -dir and file are -expected to point to buffers of sufficient size. - - -Example use of cygwin_split_path - -char dir[200], file[100]; -cygwin_split_path("c:/foo/bar.c", dir, file); -printf("dir=%s, file=%s\n", dir, file); - - - diff --git a/winsup/cygwin/perprocess.h b/winsup/cygwin/perprocess.h deleted file mode 100644 index c0a555983..000000000 --- a/winsup/cygwin/perprocess.h +++ /dev/null @@ -1,28 +0,0 @@ -/* per_process.h: main Cygwin header file. - - Copyright 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Pointer into application's static data */ -extern struct per_process __cygwin_user_data; -#define user_data (&__cygwin_user_data) - -/* We use the following to test that sizeof hasn't changed. When adding - or deleting members, insert fillers or use the reserved entries. - Do not change this value. */ -#define SIZEOF_PER_PROCESS (42 * 4) - -#ifdef __cplusplus -} -#endif diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc deleted file mode 100644 index cc64e2f81..000000000 --- a/winsup/cygwin/pinfo.cc +++ /dev/null @@ -1,1326 +0,0 @@ -/* pinfo.cc: process table support - - Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, - 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "sigproc.h" -#include "pinfo.h" -#include "cygwin_version.h" -#include "perprocess.h" -#include "environ.h" -#include -#include -#include -#include "ntdll.h" -#include "shared_info.h" -#include "cygheap.h" -#include "fhandler.h" -#include "cygmalloc.h" -#include "cygtls.h" -#include "child_info.h" - -static char NO_COPY pinfo_dummy[sizeof (_pinfo)] = {0}; - -pinfo NO_COPY myself ((_pinfo *)&pinfo_dummy); // Avoid myself != NULL checks - -bool is_toplevel_proc; - -/* Initialize the process table. - This is done once when the dll is first loaded. */ - -void __stdcall -set_myself (HANDLE h) -{ - if (!h) - cygheap->pid = cygwin_pid (GetCurrentProcessId ()); - myself.init (cygheap->pid, PID_IN_USE, h ?: INVALID_HANDLE_VALUE); - myself->process_state |= PID_IN_USE; - myself->dwProcessId = GetCurrentProcessId (); - - GetModuleFileName (NULL, myself->progname, sizeof (myself->progname)); - strace.hello (); - debug_printf ("myself->dwProcessId %u", myself->dwProcessId); - if (h) - { - /* here if execed */ - static pinfo NO_COPY myself_identity; - myself_identity.init (cygwin_pid (myself->dwProcessId), PID_EXECED, NULL); - myself->exec_sendsig = NULL; - myself->exec_dwProcessId = 0; - } - else if (!myself->wr_proc_pipe) - myself->start_time = time (NULL); /* Register our starting time. */ - else if (cygheap->pid_handle) - { - ForceCloseHandle (cygheap->pid_handle); - cygheap->pid_handle = NULL; - } -} - -/* Initialize the process table entry for the current task. - This is not called for forked tasks, only execed ones. */ -void __stdcall -pinfo_init (char **envp, int envc) -{ - if (envp) - { - environ_init (envp, envc); - /* spawn has already set up a pid structure for us so we'll use that */ - myself->process_state |= PID_CYGPARENT; - } - else - { - /* Invent our own pid. */ - - set_myself (NULL); - myself->ppid = 1; - myself->pgid = myself->sid = myself->pid; - myself->ctty = -1; - myself->uid = ILLEGAL_UID; - myself->gid = UNKNOWN_GID; - environ_init (NULL, 0); /* call after myself has been set up */ - myself->nice = winprio_to_nice (GetPriorityClass (hMainProc)); - debug_printf ("Set nice to %d", myself->nice); - } - - debug_printf ("pid %d, pgid %d", myself->pid, myself->pgid); -} - -# define self (*this) -void -pinfo::maybe_set_exit_code_from_windows () -{ - DWORD x = 0xdeadbeef; - DWORD oexitcode = self->exitcode; - extern int sigExeced; - - if (hProcess && !(self->exitcode & EXITCODE_SET)) - { - WaitForSingleObject (hProcess, INFINITE); // just to be safe, in case - // process hasn't quite exited - // after closing pipe - GetExitCodeProcess (hProcess, &x); - self->exitcode = EXITCODE_SET | (sigExeced ?: (x & 0xff) << 8); - } - sigproc_printf ("pid %d, exit value - old %p, windows %p, cygwin %p", - self->pid, oexitcode, x, self->exitcode); -} - -void -pinfo::zap_cwd () -{ - extern char windows_system_directory[]; - /* Move to an innocuous location to avoid a race with other processes - that may want to manipulate the current directory before this - process has completely exited. */ - SetCurrentDirectory (windows_system_directory); -} - -void -pinfo::exit (DWORD n) -{ - minimal_printf ("winpid %d, exit %d", GetCurrentProcessId (), n); - lock_process until_exit (); - cygthread::terminate (); - - if (n != EXITCODE_NOSET) - self->exitcode = EXITCODE_SET | n;/* We're really exiting. Record the UNIX exit code. */ - else - { - exit_state = ES_EXEC_EXIT; - maybe_set_exit_code_from_windows (); - } - - sigproc_terminate (ES_FINAL); - zap_cwd (); - - /* FIXME: There is a potential race between an execed process and its - parent here. I hated to add a mutex just for that, though. */ - struct rusage r; - fill_rusage (&r, hMainProc); - add_rusage (&self->rusage_self, &r); - int exitcode = self->exitcode & 0xffff; - if (!self->cygstarted) - exitcode = ((exitcode & 0xff) << 8) | ((exitcode >> 8) & 0xff); - sigproc_printf ("Calling ExitProcess n %p, exitcode %p", n, exitcode); - ExitProcess (exitcode); -} -# undef self - -void -pinfo::init (pid_t n, DWORD flag, HANDLE h0) -{ - shared_locations shloc; - h = NULL; - if (myself && !(flag & PID_EXECED) - && (n == myself->pid || (DWORD) n == myself->dwProcessId)) - { - procinfo = myself; - destroy = 0; - return; - } - - void *mapaddr; - int createit = flag & (PID_IN_USE | PID_EXECED); - DWORD access = FILE_MAP_READ - | (flag & (PID_IN_USE | PID_EXECED | PID_MAP_RW) - ? FILE_MAP_WRITE : 0); - if (!h0) - shloc = (flag & (PID_IN_USE | PID_EXECED)) ? SH_JUSTCREATE : SH_JUSTOPEN; - else - { - shloc = SH_MYSELF; - if (h0 == INVALID_HANDLE_VALUE) - h0 = NULL; - } - - procinfo = NULL; - PSECURITY_ATTRIBUTES sa_buf = (PSECURITY_ATTRIBUTES) alloca (1024); - PSECURITY_ATTRIBUTES sec_attribs = sec_user_nih (sa_buf, cygheap->user.sid(), - well_known_world_sid, - FILE_MAP_READ); - - for (int i = 0; i < 20; i++) - { - DWORD mapsize; - if (flag & PID_EXECED) - mapsize = PINFO_REDIR_SIZE; - else - mapsize = sizeof (_pinfo); - - procinfo = (_pinfo *) open_shared ("cygpid", n, h0, mapsize, shloc, - sec_attribs, access); - if (!h0) - { - if (createit) - __seterrno (); - return; - } - - if (!procinfo) - { - if (exit_state) - return; - - switch (GetLastError ()) - { - case ERROR_INVALID_HANDLE: - api_fatal ("MapViewOfFileEx h0 %p, i %d failed, %E", h0, i); - case ERROR_INVALID_ADDRESS: - mapaddr = NULL; - } - debug_printf ("MapViewOfFileEx h0 %p, i %d failed, %E", h0, i); - low_priority_sleep (0); - continue; - } - - bool created = shloc != SH_JUSTOPEN; - - if ((procinfo->process_state & PID_INITIALIZING) && (flag & PID_NOREDIR) - && cygwin_pid (procinfo->dwProcessId) != procinfo->pid) - { - set_errno (ESRCH); - break; - } - - if (procinfo->process_state & PID_EXECED) - { - assert (i == 0); - pid_t realpid = procinfo->pid; - debug_printf ("execed process windows pid %d, cygwin pid %d", n, realpid); - if (realpid == n) - api_fatal ("retrieval of execed process info for pid %d failed due to recursion.", n); - - n = realpid; - CloseHandle (h0); - h0 = NULL; - goto loop; - } - - /* In certain pathological cases, it is possible for the shared memory - region to exist for a while after a process has exited. This should - only be a brief occurrence, so rather than introduce some kind of - locking mechanism, just loop. */ - if (!created && createit && (procinfo->process_state & PID_EXITED)) - { - debug_printf ("looping because pid %d, procinfo->pid %d, " - "procinfo->dwProcessid %u has PID_EXITED set", - n, procinfo->pid, procinfo->dwProcessId); - goto loop; - } - - if (!created) - /* nothing */; - else if (!(flag & PID_EXECED)) - procinfo->pid = n; - else - { - procinfo->process_state |= PID_IN_USE | PID_EXECED; - procinfo->pid = myself->pid; - } - - h = h0; /* Success! */ - break; - - loop: - release (); - if (h0) - low_priority_sleep (0); - } - - if (h) - { - destroy = 1; - ProtectHandle1 (h, pinfo_shared_handle); - } - else - { - h = h0; - release (); - } -} - -void -pinfo::set_acl() -{ - PACL acl_buf = (PACL) alloca (1024); - SECURITY_DESCRIPTOR sd; - - sec_acl (acl_buf, true, true, cygheap->user.sid (), - well_known_world_sid, FILE_MAP_READ); - if (!InitializeSecurityDescriptor (&sd, SECURITY_DESCRIPTOR_REVISION)) - debug_printf ("InitializeSecurityDescriptor %E"); - else if (!SetSecurityDescriptorDacl (&sd, TRUE, acl_buf, FALSE)) - debug_printf ("SetSecurityDescriptorDacl %E"); - else if (!SetKernelObjectSecurity (h, DACL_SECURITY_INFORMATION, &sd)) - debug_printf ("SetKernelObjectSecurity %E"); -} - -const char * -_pinfo::_ctty (char *buf) -{ - if (ctty == TTY_CONSOLE) - strcpy (buf, "ctty /dev/console"); - else if (ctty < 0) - strcpy (buf, "no ctty"); - else - __small_sprintf (buf, "ctty /dev/tty%d", ctty); - return buf; -} - -void -_pinfo::set_ctty (tty_min *tc, int flags, fhandler_tty_slave *arch) -{ - debug_printf ("old %s", __ctty ()); - if ((ctty < 0 || ctty == tc->ntty) && !(flags & O_NOCTTY)) - { - ctty = tc->ntty; - syscall_printf ("attached %s sid %d, pid %d, tty->pgid %d, tty->sid %d", - __ctty (), sid, pid, pgid, tc->getsid ()); - - pinfo p (tc->getsid ()); - if (sid == pid && (!p || p->pid == pid || !p->exists ())) - { - paranoid_printf ("resetting %s sid. Was %d, now %d. pgid was %d, now %d.", - __ctty (), tc->getsid (), sid, tc->getpgid (), pgid); - /* We are the session leader */ - tc->setsid (sid); - tc->setpgid (pgid); - } - else - sid = tc->getsid (); - if (tc->getpgid () == 0) - tc->setpgid (pgid); - if (cygheap->ctty != arch) - { - debug_printf ("cygheap->ctty %p, arch %p", cygheap->ctty, arch); - if (!cygheap->ctty) - syscall_printf ("ctty NULL"); - else - { - syscall_printf ("ctty %p, usecount %d", cygheap->ctty, - cygheap->ctty->usecount); - cygheap->ctty->close (); - } - cygheap->ctty = arch; - if (arch) - { - arch->usecount++; - /* guard ctty arch */ - cygheap->manage_console_count ("_pinfo::set_ctty", 1); - report_tty_counts (cygheap->ctty, "ctty", ""); - } - } - } -} - -/* Test to determine if a process really exists and is processing signals. - */ -bool __stdcall -_pinfo::exists () -{ - return this && !(process_state & PID_EXITED); -} - -bool -_pinfo::alive () -{ - HANDLE h = OpenProcess (PROCESS_QUERY_INFORMATION, false, dwProcessId); - if (h) - CloseHandle (h); - return !!h; -} - -extern char **__argv; - -DWORD WINAPI -commune_process (void *arg) -{ - siginfo_t& si = *((siginfo_t *) arg); - char path[CYG_MAX_PATH]; - DWORD nr; - HANDLE& tothem = si._si_commune._si_write_handle; - HANDLE process_sync = - OpenSemaphore (SYNCHRONIZE, false, shared_name (path, "commune", si.si_pid)); - if (process_sync) // FIXME: this test shouldn't be necessary - ProtectHandle (process_sync); - - lock_process now (false); - if (si._si_commune._si_code & PICOM_EXTRASTR) - si._si_commune._si_str = (char *) (&si + 1); - - switch (si._si_commune._si_code) - { - case PICOM_CMDLINE: - { - sigproc_printf ("processing PICOM_CMDLINE"); - unsigned n = 1; - extern int __argc_safe; - const char *argv[__argc_safe + 1]; - - for (int i = 0; i < __argc_safe; i++) - { - if (IsBadStringPtr (__argv[i], INT32_MAX)) - argv[i] = ""; - else - argv[i] = __argv[i]; - n += strlen (argv[i]) + 1; - } - argv[__argc_safe] = NULL; - if (!WriteFile (tothem, &n, sizeof n, &nr, NULL)) - { - /*__seterrno ();*/ // this is run from the signal thread, so don't set errno - sigproc_printf ("WriteFile sizeof argv failed, %E"); - } - else - for (const char **a = argv; *a; a++) - if (!WriteFile (tothem, *a, strlen (*a) + 1, &nr, NULL)) - { - sigproc_printf ("WriteFile arg %d failed, %E", a - argv); - break; - } - if (!WriteFile (tothem, "", 1, &nr, NULL)) - { - sigproc_printf ("WriteFile null failed, %E"); - break; - } - break; - } - case PICOM_CWD: - { - sigproc_printf ("processing PICOM_CWD"); - unsigned int n = strlen (cygheap->cwd.get (path, 1, 1, - CYG_MAX_PATH)) + 1; - if (!WriteFile (tothem, &n, sizeof n, &nr, NULL)) - sigproc_printf ("WriteFile sizeof cwd failed, %E"); - else if (!WriteFile (tothem, path, n, &nr, NULL)) - sigproc_printf ("WriteFile cwd failed, %E"); - break; - } - case PICOM_ROOT: - { - sigproc_printf ("processing PICOM_ROOT"); - unsigned n; - if (cygheap->root.exists ()) - n = strlen (strcpy (path, cygheap->root.posix_path ())) + 1; - else - n = strlen (strcpy (path, "/")) + 1; - if (!WriteFile (tothem, &n, sizeof n, &nr, NULL)) - sigproc_printf ("WriteFile sizeof root failed, %E"); - else if (!WriteFile (tothem, path, n, &nr, NULL)) - sigproc_printf ("WriteFile root failed, %E"); - break; - } - case PICOM_FDS: - { - sigproc_printf ("processing PICOM_FDS"); - unsigned int n = 0; - int fd; - cygheap_fdenum cfd; - while ((fd = cfd.next ()) >= 0) - n += sizeof (int); - cfd.rewind (); - if (!WriteFile (tothem, &n, sizeof n, &nr, NULL)) - sigproc_printf ("WriteFile sizeof fds failed, %E"); - else - while ((fd = cfd.next ()) >= 0) - if (!WriteFile (tothem, &fd, sizeof fd, &nr, NULL)) - { - sigproc_printf ("WriteFile fd %d failed, %E", fd); - break; - } - break; - } - case PICOM_PIPE_FHANDLER: - { - sigproc_printf ("processing PICOM_FDS"); - HANDLE hdl = si._si_commune._si_pipe_fhandler; - unsigned int n = 0; - cygheap_fdenum cfd; - while (cfd.next () >= 0) - if (cfd->get_handle () == hdl) - { - fhandler_pipe *fh = cfd; - n = sizeof *fh; - if (!WriteFile (tothem, &n, sizeof n, &nr, NULL)) - sigproc_printf ("WriteFile sizeof hdl failed, %E"); - else if (!WriteFile (tothem, fh, n, &nr, NULL)) - sigproc_printf ("WriteFile hdl failed, %E"); - break; - } - if (!n && !WriteFile (tothem, &n, sizeof n, &nr, NULL)) - sigproc_printf ("WriteFile sizeof hdl failed, %E"); - break; - } - case PICOM_FD: - { - sigproc_printf ("processing PICOM_FD"); - int fd = si._si_commune._si_fd; - unsigned int n = 0; - cygheap_fdget cfd (fd); - if (cfd < 0) - n = strlen (strcpy (path, "")) + 1; - else - n = strlen (cfd->get_proc_fd_name (path)) + 1; - if (!WriteFile (tothem, &n, sizeof n, &nr, NULL)) - sigproc_printf ("WriteFile sizeof fd failed, %E"); - else if (!WriteFile (tothem, path, n, &nr, NULL)) - sigproc_printf ("WriteFile fd failed, %E"); - break; - } - case PICOM_FIFO: - { - sigproc_printf ("processing PICOM_FIFO for %s", si._si_commune._si_str); - fhandler_fifo *fh = cygheap->fdtab.find_fifo (si._si_commune._si_str); - HANDLE it[2]; - if (fh == NULL) - it[0] = it[1] = NULL; - else - { - it[0] = fh->get_handle (); - it[1] = fh->get_output_handle (); - } - - debug_printf ("fifo %sfound %p, %p", fh ? "" : "not ", it[0], it[1]); - if (!WriteFile (tothem, it, sizeof (it), &nr, NULL)) - { - /*__seterrno ();*/ // this is run from the signal thread, so don't set errno - sigproc_printf ("WriteFile read handle failed, %E"); - } - WaitForSingleObject (process_sync, INFINITE); - process_sync = NULL; - if (fh) - fh->close_one_end (); - break; - } - } - if (process_sync) - { - DWORD res = WaitForSingleObject (process_sync, 5000); - if (res != WAIT_OBJECT_0) - sigproc_printf ("WFSO failed - %d, %E", res); - else - sigproc_printf ("synchronized with pid %d", si.si_pid); - ForceCloseHandle (process_sync); - } - CloseHandle (tothem); - _my_tls._ctinfo->auto_release (); - return 0; -} - -commune_result -_pinfo::commune_request (__uint32_t code, ...) -{ - DWORD nr; - commune_result res; - va_list args; - siginfo_t si = {0}; - HANDLE& hp = si._si_commune._si_process_handle; - HANDLE& fromthem = si._si_commune._si_read_handle; - HANDLE request_sync = NULL; - bool locked = false; - - va_start (args, code); - - res.s = NULL; - res.n = 0; - - if (!this || !pid) - { - set_errno (ESRCH); - goto err; - } - - si._si_commune._si_code = code; - switch (code) - { - case PICOM_PIPE_FHANDLER: - si._si_commune._si_pipe_fhandler = va_arg (args, HANDLE); - break; - - case PICOM_FD: - si._si_commune._si_fd = va_arg (args, int); - break; - - case PICOM_FIFO: - si._si_commune._si_str = va_arg (args, char *); - break; - } - - lock_process now (); - locked = true; - char name_buf[CYG_MAX_PATH]; - request_sync = CreateSemaphore (&sec_none_nih, 0, LONG_MAX, - shared_name (name_buf, "commune", myself->pid)); - if (!request_sync) - goto err; - ProtectHandle (request_sync); - - si.si_signo = __SIGCOMMUNE; - if (sig_send (this, si)) - { - ForceCloseHandle (request_sync); /* don't signal semaphore since there was apparently no receiving process */ - request_sync = NULL; - goto err; - } - - size_t n; - switch (code) - { - case PICOM_CMDLINE: - case PICOM_CWD: - case PICOM_ROOT: - case PICOM_FDS: - case PICOM_FD: - case PICOM_PIPE_FHANDLER: - if (!ReadFile (fromthem, &n, sizeof n, &nr, NULL) || nr != sizeof n) - { - __seterrno (); - goto err; - } - if (!n) - res.s = NULL; - else - { - res.s = (char *) cmalloc (HEAP_COMMUNE, n); - char *p; - for (p = res.s; n && ReadFile (fromthem, p, n, &nr, NULL); p += nr, n -= nr) - continue; - if (n) - { - __seterrno (); - goto err; - } - res.n = p - res.s; - } - break; - case PICOM_FIFO: - { - DWORD x = ReadFile (fromthem, res.handles, sizeof (res.handles), &nr, NULL); - if (!x || nr != sizeof (res.handles)) - { - __seterrno (); - goto err; - } - for (int i = 0; i < 2; i++) - if (!DuplicateHandle (hp, res.handles[i], hMainProc, &res.handles[i], - 0, false, DUPLICATE_SAME_ACCESS)) - { - if (i) - CloseHandle (res.handles[0]); - res.handles[0] = res.handles[1] = NULL; /* FIXME: possibly left a handle open in child? */ - goto err; - } - break; - } - } - goto out; - -err: - memset (&res, 0, sizeof (res)); - -out: - if (request_sync) - { - LONG res; - ReleaseSemaphore (request_sync, 1, &res); - ForceCloseHandle (request_sync); - } - if (hp) - CloseHandle (hp); - if (fromthem) - CloseHandle (fromthem); - return res; -} - -fhandler_pipe * -_pinfo::pipe_fhandler (HANDLE hdl, size_t &n) -{ - if (!this || !pid) - return NULL; - if (pid == myself->pid) - return NULL; - commune_result cr = commune_request (PICOM_PIPE_FHANDLER, hdl); - n = cr.n; - return (fhandler_pipe *) cr.s; -} - -char * -_pinfo::fd (int fd, size_t &n) -{ - char *s; - if (!this || !pid) - return NULL; - if (pid != myself->pid) - { - commune_result cr = commune_request (PICOM_FD, fd); - s = cr.s; - n = cr.n; - } - else - { - cygheap_fdget cfd (fd); - if (cfd < 0) - s = cstrdup (""); - else - s = cfd->get_proc_fd_name ((char *) cmalloc (HEAP_COMMUNE, CYG_MAX_PATH)); - n = strlen (s) + 1; - } - return s; -} - -char * -_pinfo::fds (size_t &n) -{ - char *s; - if (!this || !pid) - return NULL; - if (pid != myself->pid) - { - commune_result cr = commune_request (PICOM_FDS); - s = cr.s; - n = cr.n; - } - else - { - n = 0; - int fd; - cygheap_fdenum cfd (true); - while ((fd = cfd.next ()) >= 0) - n += sizeof (int); - cfd.rewind (); - s = (char *) cmalloc (HEAP_COMMUNE, n); - int *p = (int *) s; - while ((fd = cfd.next ()) >= 0 && (char *) p - s < (int) n) - *p++ = fd; - } - return s; -} - -char * -_pinfo::root (size_t& n) -{ - char *s; - if (!this || !pid) - return NULL; - if (pid != myself->pid) - { - commune_result cr = commune_request (PICOM_ROOT); - s = cr.s; - n = cr.n; - } - else - { - if (cygheap->root.exists ()) - s = cstrdup (cygheap->root.posix_path ()); - else - s = cstrdup ("/"); - n = strlen (s) + 1; - } - return s; -} - -char * -_pinfo::cwd (size_t& n) -{ - char *s; - if (!this || !pid) - return NULL; - if (pid != myself->pid) - { - commune_result cr = commune_request (PICOM_CWD); - s = cr.s; - n = cr.n; - } - else - { - s = (char *) cmalloc (HEAP_COMMUNE, CYG_MAX_PATH); - cygheap->cwd.get (s, 1, 1, CYG_MAX_PATH); - n = strlen (s) + 1; - } - return s; -} - -char * -_pinfo::cmdline (size_t& n) -{ - char *s; - if (!this || !pid) - return NULL; - if (pid != myself->pid) - { - commune_result cr = commune_request (PICOM_CMDLINE); - s = cr.s; - n = cr.n; - } - else - { - n = 1; - for (char **a = __argv; *a; a++) - n += strlen (*a) + 1; - char *p; - p = s = (char *) cmalloc (HEAP_COMMUNE, n); - for (char **a = __argv; *a; a++) - { - strcpy (p, *a); - p = strchr (p, '\0') + 1; - } - *p = '\0'; - } - return s; -} - -/* This is the workhorse which waits for the write end of the pipe - created during new process creation. If the pipe is closed or a zero - is received on the pipe, it is assumed that the cygwin pid has exited. - Otherwise, various "signals" can be sent to the parent to inform the - parent to perform a certain action. */ -static DWORD WINAPI -proc_waiter (void *arg) -{ - pinfo vchild = *(pinfo *) arg; - ((pinfo *) arg)->waiter_ready = true; - - siginfo_t si = {0}; - si.si_signo = SIGCHLD; - si.si_code = CLD_EXITED; - si.si_pid = vchild->pid; -#if 0 // FIXME: This is tricky to get right - si.si_utime = pchildren[rc]->rusage_self.ru_utime; - si.si_stime = pchildren[rc].rusage_self.ru_stime; -#endif - pid_t pid = vchild->pid; - - for (;;) - { - DWORD nb; - char buf = '\0'; - - if (!ReadFile (vchild.rd_proc_pipe, &buf, 1, &nb, NULL) - && GetLastError () != ERROR_BROKEN_PIPE) - { - system_printf ("error on read of child wait pipe %p, %E", vchild.rd_proc_pipe); - break; - } - - si.si_uid = vchild->uid; - - switch (buf) - { - case __ALERT_ALIVE: - continue; - case 0: - /* Child exited. Do some cleanup and signal myself. */ - CloseHandle (vchild.rd_proc_pipe); - vchild.rd_proc_pipe = NULL; - vchild.maybe_set_exit_code_from_windows (); - if (WIFEXITED (vchild->exitcode)) - si.si_code = CLD_EXITED; - else if (WCOREDUMP (vchild->exitcode)) - si.si_code = CLD_DUMPED; - else - si.si_code = CLD_KILLED; - si.si_status = vchild->exitcode; - vchild->process_state = PID_EXITED; - /* This should always be last. Do not use vchild-> beyond this point */ - break; - case SIGTTIN: - case SIGTTOU: - case SIGTSTP: - case SIGSTOP: - if (ISSTATE (myself, PID_NOCLDSTOP)) // FIXME: No need for this flag to be in _pinfo any longer - continue; - /* Child stopped. Signal myself. */ - si.si_code = CLD_STOPPED; - break; - case SIGCONT: - continue; - default: - system_printf ("unknown value %d on proc pipe", buf); - continue; - } - - /* Special case: If the "child process" that died is us, then we're - execing. Just call proc_subproc directly and then exit this loop. - We're done here. */ - if (hExeced) - { - /* execing. no signals available now. */ - proc_subproc (PROC_CLEARWAIT, 0); - break; - } - - /* Send a SIGCHLD to myself. We do this here, rather than in proc_subproc - to avoid the proc_subproc lock since the signal thread will eventually - be calling proc_subproc and could unnecessarily block. */ - sig_send (myself_nowait, si); - - /* If we're just stopped or got a continue signal, keep looping. - Otherwise, return this thread to the pool. */ - if (buf != '\0') - sigproc_printf ("looping"); - else - break; - } - - sigproc_printf ("exiting wait thread for pid %d", pid); - vchild.wait_thread = NULL; - _my_tls._ctinfo->auto_release (); /* automatically return the cygthread to the cygthread pool */ - return 0; -} - -bool -_pinfo::dup_proc_pipe (HANDLE hProcess) -{ - DWORD flags = DUPLICATE_SAME_ACCESS; - HANDLE orig_wr_proc_pipe = wr_proc_pipe; - /* Can't set DUPLICATE_CLOSE_SOURCE for exec case because we could be - execing a non-cygwin process and we need to set the exit value before the - parent sees it. */ - if (this != myself || is_toplevel_proc) - flags |= DUPLICATE_CLOSE_SOURCE; - bool res = DuplicateHandle (hMainProc, wr_proc_pipe, hProcess, &wr_proc_pipe, - 0, FALSE, flags); - if (!res && WaitForSingleObject (hProcess, 0) != WAIT_OBJECT_0) - system_printf ("DuplicateHandle failed, pid %d, hProcess %p, wr_proc_pipe %p, %E", - pid, hProcess, orig_wr_proc_pipe); - else - { - wr_proc_pipe_owner = dwProcessId; - sigproc_printf ("duped wr_proc_pipe %p for pid %d(%u)", wr_proc_pipe, - pid, dwProcessId); - res = true; - } - return res; -} - -/* function to set up the process pipe and kick off proc_waiter */ -int -pinfo::wait () -{ - /* FIXME: execed processes should be able to wait for pids that were started - by the process which execed them. */ - if (!CreatePipe (&rd_proc_pipe, &((*this)->wr_proc_pipe), &sec_none_nih, 16)) - { - system_printf ("Couldn't create pipe tracker for pid %d, %E", - (*this)->pid); - return 0; - } - - if (!(*this)->dup_proc_pipe (hProcess)) - { - system_printf ("Couldn't duplicate pipe topid %d(%p), %E", (*this)->pid, hProcess); - return 0; - } - - preserve (); /* Preserve the shared memory associated with the pinfo */ - - waiter_ready = false; - /* Fire up a new thread to track the subprocess */ - cygthread *h = new cygthread (proc_waiter, 0, this, "proc_waiter"); - if (!h) - sigproc_printf ("tracking thread creation failed for pid %d", (*this)->pid); - else - { - wait_thread = h; - sigproc_printf ("created tracking thread for pid %d, winpid %p, rd_pipe %p", - (*this)->pid, (*this)->dwProcessId, rd_proc_pipe); - } - - return 1; -} - -void -_pinfo::sync_proc_pipe () -{ - if (wr_proc_pipe && wr_proc_pipe != INVALID_HANDLE_VALUE) - while (wr_proc_pipe_owner != GetCurrentProcessId ()) - low_priority_sleep (0); -} - -/* function to send a "signal" to the parent when something interesting happens - in the child. */ -bool -_pinfo::alert_parent (char sig) -{ - DWORD nb = 0; - - /* Send something to our parent. If the parent has gone away, close the pipe. - Don't send if this is an exec stub. - - FIXME: Is there a race here if we run this while another thread is attempting - to exec()? */ - if (wr_proc_pipe == INVALID_HANDLE_VALUE || !myself->wr_proc_pipe || hExeced) - /* no parent */; - else - { - sync_proc_pipe (); - if (WriteFile (wr_proc_pipe, &sig, 1, &nb, NULL)) - /* all is well */; - else if (GetLastError () != ERROR_BROKEN_PIPE) - debug_printf ("sending %d notification to parent failed, %E", sig); - else - { - ppid = 1; - HANDLE closeit = wr_proc_pipe; - wr_proc_pipe = INVALID_HANDLE_VALUE; - CloseHandle (closeit); - } - } - return (bool) nb; -} - -void -pinfo::release () -{ - if (procinfo) - { - void *unmap_procinfo = procinfo; - procinfo = NULL; - UnmapViewOfFile (unmap_procinfo); - } - if (h) - { - HANDLE close_h = h; - h = NULL; - ForceCloseHandle1 (close_h, pinfo_shared_handle); - } -} - -/* DOCTOOL-START - - - cygwin_winpid_to_pid - - - extern "C" pid_t - cygwin_winpid_to_pid - - int winpid - - - Given a windows pid, converts to the corresponding Cygwin -pid, if any. Returns -1 if windows pid does not correspond to -a cygwin pid. - - Example use of cygwin_winpid_to_pid - - extern "C" cygwin_winpid_to_pid (int winpid); - pid_t mypid; - mypid = cygwin_winpid_to_pid (windows_pid); - - - - - DOCTOOL-END */ - -extern "C" pid_t -cygwin_winpid_to_pid (int winpid) -{ - pinfo p (cygwin_pid (winpid)); - if (p) - return p->pid; - - set_errno (ESRCH); - return (pid_t) -1; -} - -#include - -#define slop_pidlist 200 -#define size_pidlist(i) (sizeof (pidlist[0]) * ((i) + 1)) -#define size_pinfolist(i) (sizeof (pinfolist[0]) * ((i) + 1)) -class _onreturn -{ - HANDLE *h; -public: - ~_onreturn () - { - if (h) - { - CloseHandle (*h); - *h = NULL; - } - } - void no_close_p_handle () {h = NULL;} - _onreturn (HANDLE& _h): h (&_h) {} -}; - -inline void -winpids::add (DWORD& nelem, bool winpid, DWORD pid) -{ - pid_t cygpid = cygwin_pid (pid); - - if (nelem >= npidlist) - { - npidlist += slop_pidlist; - pidlist = (DWORD *) realloc (pidlist, size_pidlist (npidlist + 1)); - pinfolist = (pinfo *) realloc (pinfolist, size_pinfolist (npidlist + 1)); - } - - pinfo& p = pinfolist[nelem]; - - /* Open a the process to prevent a subsequent exit from invalidating the - shared memory region. */ - p.hProcess = OpenProcess (PROCESS_QUERY_INFORMATION, false, pid); - _onreturn onreturn (p.hProcess); - - /* If we couldn't open the process then we don't have rights to it and should - make a copy of the shared memory area if it exists (it may not). - */ - bool perform_copy; - if (!p.hProcess) - perform_copy = true; - else - perform_copy = make_copy; - - p.init (cygpid, PID_NOREDIR | pinfo_access, NULL); - - /* If we're just looking for winpids then don't do any special cygwin "stuff* */ - if (winpid) - goto out; - - /* !p means that we couldn't find shared memory for this pid. Probably means - that it isn't a cygwin process. */ - if (!p) - { - if (!pinfo_access) - return; - p.init (cygpid, PID_NOREDIR, NULL); - if (!p) - return; - } - - /* Scan list of previously recorded pids to make sure that this pid hasn't - shown up before. This can happen when a process execs. */ - for (unsigned i = 0; i < nelem; i++) - if (pinfolist[i]->pid == p->pid) - { - if ((_pinfo *) p != (_pinfo *) myself) - p.release (); - return; - } - -out: - /* Exit here. - - If p is "false" then, eventually any opened process handle will be closed and - the function will exit without adding anything to the pid list. - - If p is "true" then we've discovered a cygwin process. - - Handle "myself" differently. Don't copy it and close/zero the handle we - just opened to it. - If not performing a copy, then keep the process handle open for the duration - of the life of the procinfo region to potential races when a new process uses - this pid. - Otherwise, malloc some memory for a copy of the shared memory. - - If the malloc failed, then "oh well". Just keep the shared memory around - and eventually close the handle when the winpids goes out of scope. - - If malloc succeeds, copy the procinfo we just grabbed into the new region, - release the shared memory and allow the handle to be closed when this - function returns. - - Oh, and add the pid to the list and bump the number of elements. */ - - if (p) - { - if (p == (_pinfo *) myself) - /* handle specially. Close the handle but (eventually) don't - deallocate procinfo in release call */; - else if (!perform_copy) - onreturn.no_close_p_handle (); /* Don't close the handle until release */ - else - { - _pinfo *pnew = (_pinfo *) malloc (sizeof (*p.procinfo)); - if (!pnew) - onreturn.no_close_p_handle (); - else - { - *pnew = *p.procinfo; - if ((_pinfo *) p != (_pinfo *) myself) - p.release (); - p.procinfo = pnew; - p.destroy = false; - } - } - } - if (p || winpid) - pidlist[nelem++] = pid; -} - -DWORD -winpids::enumNT (bool winpid) -{ - static DWORD szprocs; - static SYSTEM_PROCESSES *procs; - - DWORD nelem = 0; - if (!szprocs) - procs = (SYSTEM_PROCESSES *) malloc (sizeof (*procs) + (szprocs = 200 * sizeof (*procs))); - - NTSTATUS res; - for (;;) - { - res = NtQuerySystemInformation (SystemProcessesAndThreadsInformation, - procs, szprocs, NULL); - if (res == 0) - break; - - if (res == STATUS_INFO_LENGTH_MISMATCH) - procs = (SYSTEM_PROCESSES *) realloc (procs, szprocs += 200 * sizeof (*procs)); - else - { - system_printf ("error %p reading system process information", res); - return 0; - } - } - - SYSTEM_PROCESSES *px = procs; - for (;;) - { - if (px->ProcessId) - add (nelem, winpid, px->ProcessId); - if (!px->NextEntryDelta) - break; - px = (SYSTEM_PROCESSES *) ((char *) px + px->NextEntryDelta); - } - - return nelem; -} - -DWORD -winpids::enum9x (bool winpid) -{ - DWORD nelem = 0; - - HANDLE h = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); - if (!h) - { - system_printf ("Couldn't create process snapshot, %E"); - return 0; - } - - PROCESSENTRY32 proc; - proc.dwSize = sizeof (proc); - - if (Process32First (h, &proc)) - do - { - if (proc.th32ProcessID) - add (nelem, winpid, proc.th32ProcessID); - } - while (Process32Next (h, &proc)); - - CloseHandle (h); - return nelem; -} - -void -winpids::set (bool winpid) -{ - __malloc_lock (); - npids = (this->*enum_processes) (winpid); - if (pidlist) - pidlist[npids] = 0; - __malloc_unlock (); -} - -DWORD -winpids::enum_init (bool winpid) -{ - if (wincap.is_winnt ()) - enum_processes = &winpids::enumNT; - else - enum_processes = &winpids::enum9x; - - return (this->*enum_processes) (winpid); -} - -void -winpids::release () -{ - _pinfo *p; - for (unsigned i = 0; i < npids; i++) - if (pinfolist[i] == (_pinfo *) myself) - continue; - else if (pinfolist[i].hProcess) - { - if (pinfolist[i]) - pinfolist[i].release (); - CloseHandle (pinfolist[i].hProcess); - } - else if ((p = pinfolist[i])) - { - pinfolist[i].procinfo = NULL; - free (p); - } -} - -winpids::~winpids () -{ - if (npidlist) - { - release (); - free (pidlist); - free (pinfolist); - } -} diff --git a/winsup/cygwin/pinfo.h b/winsup/cygwin/pinfo.h deleted file mode 100644 index fbd73dab9..000000000 --- a/winsup/cygwin/pinfo.h +++ /dev/null @@ -1,258 +0,0 @@ -/* pinfo.h: process table info - - Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _PINFO_H -#define _PINFO_H -#include -#include "thread.h" - -struct commune_result -{ - char *s; - int n; - HANDLE handles[2]; -}; - -enum picom -{ - PICOM_EXTRASTR = 0x80000000, - PICOM_CMDLINE = 1, - PICOM_FIFO = PICOM_EXTRASTR | 2, - PICOM_CWD = 3, - PICOM_ROOT = 4, - PICOM_FDS = 5, - PICOM_FD = 6, - PICOM_PIPE_FHANDLER = 7 -}; - -#define EXITCODE_SET 0x8000000 -#define EXITCODE_NOSET 0x4000000 -#define EXITCODE_RETRY 0x2000000 -#define EXITCODE_OK 0x1000000 - -class fhandler_pipe; - -class _pinfo -{ -public: - /* Cygwin pid */ - pid_t pid; - - /* Various flags indicating the state of the process. See PID_ - constants below. */ - DWORD process_state; - - DWORD exitcode; /* set when process exits */ - -#define PINFO_REDIR_SIZE ((char *) &myself.procinfo->exitcode - (char *) myself.procinfo) - - /* > 0 if started by a cygwin process */ - DWORD cygstarted; - - /* Parent process id. */ - pid_t ppid; - - /* dwProcessId contains the processid used for sending signals. It - will be reset in a child process when it is capable of receiving - signals. */ - DWORD dwProcessId; - - /* Used to spawn a child for fork(), among other things. */ - char progname[CYG_MAX_PATH]; - - /* User information. - The information is derived from the GetUserName system call, - with the name looked up in /etc/passwd and assigned a default value - if not found. This data resides in the shared data area (allowing - tasks to store whatever they want here) so it's for informational - purposes only. */ - __uid32_t uid; /* User ID */ - __gid32_t gid; /* Group ID */ - pid_t pgid; /* Process group ID */ - pid_t sid; /* Session ID */ - int ctty; /* Control tty */ - bool has_pgid_children;/* True if we've forked or spawned children with our GID. */ - - /* Resources used by process. */ - long start_time; - struct rusage rusage_self; - struct rusage rusage_children; - int nice; - - /* Non-zero if process was stopped by a signal. */ - char stopsig; - - inline void set_has_pgid_children () - { - if (pgid == pid) - has_pgid_children = 1; - } - - inline void set_has_pgid_children (bool val) {has_pgid_children = val;} - - inline sigset_t& getsigmask () - { - return sig_mask; - } - - inline void setsigmask (sigset_t mask) - { - sig_mask = mask; - } - - commune_result commune_request (__uint32_t, ...); - bool alive (); - fhandler_pipe *pipe_fhandler (HANDLE, size_t &); - char *fd (int fd, size_t &); - char *fds (size_t &); - char *root (size_t &); - char *cwd (size_t &); - char *cmdline (size_t &); - void set_ctty (class tty_min *, int, class fhandler_tty_slave *); - bool dup_proc_pipe (HANDLE) __attribute__ ((regparm(2))); - void sync_proc_pipe (); - bool alert_parent (char); - int __stdcall kill (siginfo_t&) __attribute__ ((regparm (2))); - bool __stdcall exists () __attribute__ ((regparm (1))); - const char *_ctty (char *); - - friend void __stdcall set_myself (HANDLE); - - /* signals */ - HANDLE sendsig; - HANDLE exec_sendsig; - DWORD exec_dwProcessId; -private: - sigset_t sig_mask; -public: - HANDLE wr_proc_pipe; - DWORD wr_proc_pipe_owner; - friend class pinfo; -}; - -DWORD WINAPI commune_process (void *); - -enum parent_alerter -{ - __ALERT_REPARENT = 111, // arbitrary non-signal value - __ALERT_ALIVE = 112 -}; - -class pinfo -{ - HANDLE h; - _pinfo *procinfo; - bool destroy; -public: - HANDLE rd_proc_pipe; - HANDLE hProcess; - bool waiter_ready; - class cygthread *wait_thread; - void init (pid_t, DWORD, HANDLE) __attribute__ ((regparm(3))); - pinfo () {} - pinfo (_pinfo *x): procinfo (x), hProcess (NULL) {} - pinfo (pid_t n) : rd_proc_pipe (NULL), hProcess (NULL) {init (n, 0, NULL);} - pinfo (pid_t n, DWORD flag) : rd_proc_pipe (NULL), hProcess (NULL), waiter_ready (0), wait_thread (NULL) {init (n, flag, NULL);} - void release (); - int wait () __attribute__ ((regparm (1))); - ~pinfo () - { - if (destroy && procinfo) - release (); - } - void exit (DWORD n) __attribute__ ((noreturn, regparm(2))); - void maybe_set_exit_code_from_windows () __attribute__ ((regparm(1))); - _pinfo *operator -> () const {return procinfo;} - int operator == (pinfo *x) const {return x->procinfo == procinfo;} - int operator == (pinfo &x) const {return x.procinfo == procinfo;} - int operator == (_pinfo *x) const {return x == procinfo;} - int operator == (void *x) const {return procinfo == x;} - int operator == (int x) const {return (int) procinfo == (int) x;} - int operator == (char *x) const {return (char *) procinfo == x;} - _pinfo *operator * () const {return procinfo;} - operator _pinfo * () const {return procinfo;} - // operator bool () const {return (int) h;} - void preserve () { destroy = false; } -#ifndef _SIGPROC_H - int remember () {system_printf ("remember is not here"); return 0;} -#else - int remember (bool detach) - { - int res = proc_subproc (detach ? PROC_DETACHED_CHILD : PROC_ADDCHILD, - (DWORD) this); - destroy = res ? false : true; - return res; - } -#endif - HANDLE shared_handle () {return h;} - void set_acl (); - void zap_cwd (); - friend class _pinfo; - friend class winpids; -}; - -#define ISSTATE(p, f) (!!((p)->process_state & f)) -#define NOTSTATE(p, f) (!((p)->process_state & f)) - -class winpids -{ - bool make_copy; - DWORD npidlist; - DWORD *pidlist; - pinfo *pinfolist; - DWORD pinfo_access; // access type for pinfo open - DWORD (winpids::* enum_processes) (bool winpid); - DWORD enum_init (bool winpid); - DWORD enumNT (bool winpid); - DWORD enum9x (bool winpid); - void add (DWORD& nelem, bool, DWORD pid); -public: - DWORD npids; - inline void reset () { release (); npids = 0;} - void set (bool winpid); - winpids (): make_copy (true), enum_processes (&winpids::enum_init) {} - winpids (int): make_copy (false), npidlist (0), pidlist (NULL), pinfolist (NULL), - pinfo_access (0), enum_processes (&winpids::enum_init), npids (0) {} - winpids (DWORD acc): make_copy (false), npidlist (0), pidlist (NULL), pinfolist (NULL), - pinfo_access (acc), enum_processes (&winpids::enum_init), - npids (0) - { - set (0); - } - inline DWORD& winpid (int i) const {return pidlist[i];} - inline _pinfo *operator [] (int i) const {return (_pinfo *) pinfolist[i];} - ~winpids (); - void release (); -}; - -extern __inline pid_t -cygwin_pid (pid_t pid) -{ - return (pid_t) (wincap.has_negative_pids ()) ? -(int) pid : pid; -} - -void __stdcall pinfo_init (char **, int); -void __stdcall set_myself (HANDLE h); -extern pinfo myself; - -#define _P_VFORK 0 -#define _P_SYSTEM 512 - -#define __ctty() _ctty ((char *) alloca (sizeof ("ctty /dev/tty") + 20)) -#define myctty() myself->__ctty () - -/* For mmaps across fork(). */ -int __stdcall fixup_mmaps_after_fork (HANDLE parent); -/* for shm areas across fork (). */ -int __stdcall fixup_shms_after_fork (); - -void __stdcall fill_rusage (struct rusage *, HANDLE); -void __stdcall add_rusage (struct rusage *, struct rusage *); -#endif /*_PINFO_H*/ diff --git a/winsup/cygwin/pipe.cc b/winsup/cygwin/pipe.cc deleted file mode 100644 index a01a2dc39..000000000 --- a/winsup/cygwin/pipe.cc +++ /dev/null @@ -1,538 +0,0 @@ -/* pipe.cc: pipe for Cygwin. - - Copyright 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* FIXME: Should this really be fhandler_pipe.cc? */ - -#include "winsup.h" -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "thread.h" -#include "pinfo.h" -#include "cygthread.h" -#include "ntdll.h" - -static unsigned pipecount; -static const NO_COPY char pipeid_fmt[] = "stupid_pipe.%u.%u"; - -fhandler_pipe::fhandler_pipe () - : fhandler_base (), guard (NULL), broken_pipe (false), writepipe_exists(0), - orig_pid (0), id (0) -{ -} - -extern "C" int sscanf (const char *, const char *, ...); - -int -fhandler_pipe::open (int flags, mode_t mode) -{ - HANDLE proc, pipe_hdl, nio_hdl = NULL, nwrp_hdl = NULL; - fhandler_pipe *fh = NULL; - size_t size; - int pid, rwflags = (flags & O_ACCMODE); - - sscanf (get_name (), "/proc/%d/fd/pipe:[%d]", &pid, (int *) &pipe_hdl); - if (pid == myself->pid) - { - cygheap_fdenum cfd (true); - while (cfd.next () >= 0) - { - if (cfd->get_handle () != pipe_hdl) - continue; - if ((rwflags == O_RDONLY && !(cfd->get_access () & GENERIC_READ)) - || (rwflags == O_WRONLY && !(cfd->get_access () & GENERIC_WRITE))) - { - set_errno (EACCES); - return 0; - } - if (!cfd->dup (this)) - return 1; - return 0; - } - set_errno (ENOENT); - return 0; - } - - pinfo p (pid); - if (!p) - { - set_errno (ESRCH); - return 0; - } - if (!(proc = OpenProcess (PROCESS_DUP_HANDLE, false, p->dwProcessId))) - { - __seterrno (); - return 0; - } - if (!(fh = p->pipe_fhandler (pipe_hdl, size)) || !size) - { - set_errno (ENOENT); - goto out; - } - /* Too bad, but Windows only allows the same access mode when dup'ing - the pipe. */ - if ((rwflags == O_RDONLY && !(fh->get_access () & GENERIC_READ)) - || (rwflags == O_WRONLY && !(fh->get_access () & GENERIC_WRITE))) - { - set_errno (EACCES); - goto out; - } - if (!DuplicateHandle (proc, pipe_hdl, hMainProc, &nio_hdl, - 0, false, DUPLICATE_SAME_ACCESS)) - { - __seterrno (); - goto out; - } - if (fh->writepipe_exists - && !DuplicateHandle (proc, fh->writepipe_exists, - hMainProc, &nwrp_hdl, - 0, false, DUPLICATE_SAME_ACCESS)) - { - __seterrno (); - goto out; - } - if (fh->read_state) - { - create_read_state (2); - need_fork_fixup (true); - ProtectHandle1 (read_state, read_state); - } - if (fh->get_guard ()) - create_guard ((flags & O_NOINHERIT) ? &sec_none_nih : &sec_none); - init (nio_hdl, fh->get_access (), mode & O_TEXT ?: O_BINARY); - writepipe_exists = nwrp_hdl; - if (flags & O_NOINHERIT) - close_on_exec (true); - uninterruptible_io (fh->uninterruptible_io ()); - cfree (fh); - CloseHandle (proc); - return 1; -out: - if (nwrp_hdl) - CloseHandle (nwrp_hdl); - if (nio_hdl) - CloseHandle (nio_hdl); - if (fh) - free (fh); - if (proc) - CloseHandle (proc); - return 0; -} - -_off64_t -fhandler_pipe::lseek (_off64_t offset, int whence) -{ - debug_printf ("(%d, %d)", offset, whence); - set_errno (ESPIPE); - return -1; -} - -void -fhandler_pipe::set_close_on_exec (bool val) -{ - fhandler_base::set_close_on_exec (val); - if (guard) - set_no_inheritance (guard, val); - if (writepipe_exists) - set_no_inheritance (writepipe_exists, val); -} - -char *fhandler_pipe::get_proc_fd_name (char *buf) -{ - __small_sprintf (buf, "pipe:[%d]", get_handle ()); - return buf; -} - -struct pipeargs -{ - fhandler_base *fh; - void *ptr; - size_t *len; -}; - -static DWORD WINAPI -read_pipe (void *arg) -{ - pipeargs *pi = (pipeargs *) arg; - pi->fh->fhandler_base::read (pi->ptr, *pi->len); - return 0; -} - -void __stdcall -fhandler_pipe::read (void *in_ptr, size_t& in_len) -{ - if (broken_pipe) - in_len = 0; - else - { - pipeargs pi = {dynamic_cast(this), in_ptr, &in_len}; - cygthread *th = new cygthread (read_pipe, 0, &pi, "read_pipe"); - if (th->detach (read_state) && !in_len) - in_len = (size_t) -1; /* received a signal */ - } - ReleaseMutex (guard); -} - -int -fhandler_pipe::close () -{ - if (guard) - CloseHandle (guard); - if (writepipe_exists) - CloseHandle (writepipe_exists); -#ifndef NEWVFORK - if (read_state) -#else - // FIXME is this vfork_cleanup test right? Is it responsible for some of - // the strange pipe behavior that has been reported in the cygwin mailing - // list? - if (read_state && !cygheap->fdtab.in_vfork_cleanup ()) -#endif - ForceCloseHandle (read_state); - return fhandler_base::close (); -} - -bool -fhandler_pipe::hit_eof () -{ - char buf[80]; - HANDLE ev; - if (broken_pipe) - return 1; - if (!orig_pid) - return false; - __small_sprintf (buf, pipeid_fmt, orig_pid, id); - if ((ev = OpenEvent (EVENT_ALL_ACCESS, FALSE, buf))) - CloseHandle (ev); - debug_printf ("%s %p", buf, ev); - return ev == NULL; -} - -void -fhandler_pipe::fixup_in_child () -{ - if (read_state) - { - create_read_state (2); - ProtectHandle (read_state); - } -} - -void -fhandler_pipe::fixup_after_exec () -{ - if (!close_on_exec ()) - fixup_in_child (); -} - -void -fhandler_pipe::fixup_after_fork (HANDLE parent) -{ - fhandler_base::fixup_after_fork (parent); - if (guard) - fork_fixup (parent, guard, "guard"); - if (writepipe_exists) - fork_fixup (parent, writepipe_exists, "guard"); - fixup_in_child (); -} - -int -fhandler_pipe::dup (fhandler_base *child) -{ - int res = -1; - fhandler_pipe *ftp = (fhandler_pipe *) child; - ftp->guard = ftp->writepipe_exists = ftp->read_state = NULL; - - if (get_handle ()) - { - res = fhandler_base::dup (child); - if (res) - goto err; - } - - if (guard == NULL) - ftp->guard = NULL; - else if (!DuplicateHandle (hMainProc, guard, hMainProc, &ftp->guard, 0, 1, - DUPLICATE_SAME_ACCESS)) - { - debug_printf ("couldn't duplicate guard %p, %E", guard); - goto err; - } - - if (writepipe_exists == NULL) - ftp->writepipe_exists = NULL; - else if (!DuplicateHandle (hMainProc, writepipe_exists, hMainProc, - &ftp->writepipe_exists, 0, 1, - DUPLICATE_SAME_ACCESS)) - { - debug_printf ("couldn't duplicate writepipe_exists %p, %E", writepipe_exists); - goto err; - } - - if (read_state == NULL) - ftp->read_state = NULL; - else if (!DuplicateHandle (hMainProc, read_state, hMainProc, - &ftp->read_state, 0, 0, - DUPLICATE_SAME_ACCESS)) - { - debug_printf ("couldn't duplicate read_state %p, %E", read_state); - goto err; - } - - res = 0; - goto out; - -err: - if (ftp->guard) - CloseHandle (ftp->guard); - if (ftp->writepipe_exists) - CloseHandle (ftp->writepipe_exists); - if (ftp->read_state) - CloseHandle (ftp->read_state); - goto leave; - -out: - ftp->id = id; - ftp->orig_pid = orig_pid; - VerifyHandle (ftp->guard); - VerifyHandle (ftp->writepipe_exists); - VerifyHandle (ftp->read_state); - -leave: - debug_printf ("res %d", res); - return res; -} - -/* Create a pipe, and return handles to the read and write ends, - just like CreatePipe, but ensure that the write end permits - FILE_READ_ATTRIBUTES access, on later versions of win32 where - this is supported. This access is needed by NtQueryInformationFile, - which is used to implement select and nonblocking writes. - Note that the return value is either 0 or GetLastError, - unlike CreatePipe, which returns a bool for success or failure. */ -int -fhandler_pipe::create_selectable (LPSECURITY_ATTRIBUTES sa_ptr, HANDLE& r, - HANDLE& w, DWORD psize, bool fifo) -{ - /* Default to error. */ - r = w = INVALID_HANDLE_VALUE; - - /* Ensure that there is enough pipe buffer space for atomic writes. */ - if (!fifo && psize < PIPE_BUF) - psize = PIPE_BUF; - - char pipename[CYG_MAX_PATH]; - - /* Retry CreateNamedPipe as long as the pipe name is in use. - Retrying will probably never be necessary, but we want - to be as robust as possible. */ - while (1) - { - static volatile ULONG pipe_unique_id; - - __small_sprintf (pipename, "\\\\.\\pipe\\cygwin-%p-%p", myself->pid, - InterlockedIncrement ((LONG *) &pipe_unique_id)); - - debug_printf ("CreateNamedPipe: name %s, size %lu", pipename, psize); - - /* Use CreateNamedPipe instead of CreatePipe, because the latter - returns a write handle that does not permit FILE_READ_ATTRIBUTES - access, on versions of win32 earlier than WinXP SP2. - CreatePipe also stupidly creates a full duplex pipe, which is - a waste, since only a single direction is actually used. - It's important to only allow a single instance, to ensure that - the pipe was not created earlier by some other process, even if - the pid has been reused. We avoid FILE_FLAG_FIRST_PIPE_INSTANCE - because that is only available for Win2k SP2 and WinXP. */ - r = CreateNamedPipe (pipename, PIPE_ACCESS_INBOUND, - PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, psize, - psize, NMPWAIT_USE_DEFAULT_WAIT, sa_ptr); - - /* Win 95 seems to return NULL instead of INVALID_HANDLE_VALUE */ - if (r && r != INVALID_HANDLE_VALUE) - { - debug_printf ("pipe read handle %p", r); - break; - } - - DWORD err = GetLastError (); - switch (err) - { - case ERROR_PIPE_BUSY: - /* The pipe is already open with compatible parameters. - Pick a new name and retry. */ - debug_printf ("pipe busy, retrying"); - break; - case ERROR_ACCESS_DENIED: - /* The pipe is already open with incompatible parameters. - Pick a new name and retry. */ - debug_printf ("pipe access denied, retrying"); - break; - default: - /* CreateNamePipe failed. Maybe we are on an older Win9x platform without - named pipes. Return an anonymous pipe as the best approximation. */ - debug_printf ("CreateNamedPipe failed, resorting to CreatePipe size %lu", - psize); - if (CreatePipe (&r, &w, sa_ptr, psize)) - { - debug_printf ("pipe read handle %p", r); - debug_printf ("pipe write handle %p", w); - return 0; - } - err = GetLastError (); - debug_printf ("CreatePipe failed, %E"); - return err; - } - } - - debug_printf ("CreateFile: name %s", pipename); - - /* Open the named pipe for writing. - Be sure to permit FILE_READ_ATTRIBUTES access. */ - w = CreateFile (pipename, GENERIC_WRITE | FILE_READ_ATTRIBUTES, 0, sa_ptr, - OPEN_EXISTING, 0, 0); - - if (!w || w == INVALID_HANDLE_VALUE) - { - /* Failure. */ - DWORD err = GetLastError (); - debug_printf ("CreateFile failed, %E"); - CloseHandle (r); - return err; - } - - debug_printf ("pipe write handle %p", w); - - /* Success. */ - return 0; -} - -int -fhandler_pipe::create (fhandler_pipe *fhs[2], unsigned psize, int mode, bool fifo) -{ - HANDLE r, w; - SECURITY_ATTRIBUTES *sa = (mode & O_NOINHERIT) ? &sec_none_nih : &sec_none; - int res = -1; - - int ret = create_selectable (sa, r, w, psize, fifo); - if (ret) - __seterrno_from_win_error (ret); - else - { - fhs[0] = (fhandler_pipe *) build_fh_dev (*piper_dev); - fhs[1] = (fhandler_pipe *) build_fh_dev (*pipew_dev); - - int binmode = mode & O_TEXT ?: O_BINARY; - fhs[0]->init (r, GENERIC_READ, binmode); - fhs[1]->init (w, GENERIC_WRITE, binmode); - if (mode & O_NOINHERIT) - { - fhs[0]->close_on_exec (true); - fhs[1]->close_on_exec (true); - } - - fhs[0]->create_read_state (2); - fhs[0]->need_fork_fixup (true); - ProtectHandle1 (fhs[0]->read_state, read_state); - - res = 0; - fhs[0]->create_guard (sa); - if (wincap.has_unreliable_pipes ()) - { - char buf[80]; - int count = pipecount++; /* FIXME: Should this be InterlockedIncrement? */ - __small_sprintf (buf, pipeid_fmt, myself->pid, count); - fhs[1]->writepipe_exists = CreateEvent (sa, TRUE, FALSE, buf); - fhs[0]->orig_pid = myself->pid; - fhs[0]->id = count; - } - } - - syscall_printf ("%d = pipe ([%p, %p], %d, %p)", res, fhs[0], fhs[1], psize, mode); - return res; -} - -int -fhandler_pipe::ioctl (unsigned int cmd, void *p) -{ - int n; - - switch (cmd) - { - case FIONREAD: - if (get_device () == FH_PIPEW) - { - set_errno (EINVAL); - return -1; - } - if (!PeekNamedPipe (get_handle (), NULL, 0, NULL, (DWORD *) &n, NULL)) - { - __seterrno (); - return -1; - } - break; - default: - return fhandler_base::ioctl (cmd, p); - break; - } - *(int *) p = n; - return 0; -} - -#define DEFAULT_PIPEBUFSIZE (4 * PIPE_BUF) - -extern "C" int -pipe (int filedes[2]) -{ - extern DWORD binmode; - fhandler_pipe *fhs[2]; - int res = fhandler_pipe::create (fhs, DEFAULT_PIPEBUFSIZE, - (!binmode || binmode == O_BINARY) - ? O_BINARY : O_TEXT); - if (res == 0) - { - cygheap_fdnew fdin; - cygheap_fdnew fdout (fdin, false); - fdin = fhs[0]; - fdout = fhs[1]; - filedes[0] = fdin; - filedes[1] = fdout; - } - - return res; -} - -extern "C" int -_pipe (int filedes[2], unsigned int psize, int mode) -{ - fhandler_pipe *fhs[2]; - int res = fhandler_pipe::create (fhs, psize, mode); - /* This type of pipe is not interruptible so set the appropriate flag. */ - if (!res) - { - cygheap_fdnew fdin; - cygheap_fdnew fdout (fdin, false); - fhs[0]->uninterruptible_io (true); - fdin = fhs[0]; - fdout = fhs[1]; - filedes[0] = fdin; - filedes[1] = fdout; - } - - return res; -} diff --git a/winsup/cygwin/poll.cc b/winsup/cygwin/poll.cc deleted file mode 100644 index 0ff62379e..000000000 --- a/winsup/cygwin/poll.cc +++ /dev/null @@ -1,152 +0,0 @@ -/* poll.cc. Implements poll(2) via usage of select(2) call. - - Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#define __INSIDE_CYGWIN_NET__ - -#define FD_SETSIZE 16384 // lots of fds -#include "winsup.h" -#include -#include -#include -#include -#define USE_SYS_TYPES_FD_SET -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "sigproc.h" - -extern "C" int -poll (struct pollfd *fds, unsigned int nfds, int timeout) -{ - int max_fd = 0; - fd_set *read_fds, *write_fds, *except_fds; - struct timeval tv = { timeout / 1000, (timeout % 1000) * 1000 }; - - for (unsigned int i = 0; i < nfds; ++i) - if (fds[i].fd > max_fd) - max_fd = fds[i].fd; - - size_t fds_size = howmany (max_fd + 1, NFDBITS) * sizeof (fd_mask); - - read_fds = (fd_set *) alloca (fds_size); - write_fds = (fd_set *) alloca (fds_size); - except_fds = (fd_set *) alloca (fds_size); - - if (!read_fds || !write_fds || !except_fds) - { - set_errno (EINVAL); /* According to SUSv3. */ - return -1; - } - - memset (read_fds, 0, fds_size); - memset (write_fds, 0, fds_size); - memset (except_fds, 0, fds_size); - - int invalid_fds = 0; - for (unsigned int i = 0; i < nfds; ++i) - { - fds[i].revents = 0; - if (!cygheap->fdtab.not_open (fds[i].fd)) - { - if (fds[i].events & POLLIN) - FD_SET(fds[i].fd, read_fds); - if (fds[i].events & POLLOUT) - FD_SET(fds[i].fd, write_fds); - /* On sockets, except_fds is needed to catch failed connects. */ - if ((fds[i].events & POLLPRI) - || cygheap->fdtab[fds[i].fd]->is_socket ()) - FD_SET(fds[i].fd, except_fds); - } - else if (fds[i].fd >= 0) - { - ++invalid_fds; - fds[i].revents = POLLNVAL; - } - } - - if (invalid_fds) - return invalid_fds; - - int ret = cygwin_select (max_fd + 1, read_fds, write_fds, except_fds, timeout < 0 ? NULL : &tv); - - if (ret > 0) - for (unsigned int i = 0; i < nfds; ++i) - { - if (fds[i].fd >= 0) - { - if (cygheap->fdtab.not_open (fds[i].fd)) - fds[i].revents = POLLHUP; - else - { - fhandler_socket *sock; - - if (FD_ISSET(fds[i].fd, read_fds)) - { - char peek[1]; - sock = cygheap->fdtab[fds[i].fd]->is_socket (); - if (!sock) - fds[i].revents |= POLLIN; - else - { - /* The following action can change errno. We have to - reset it to it's old value. */ - int old_errno = get_errno (); - switch (sock->recvfrom (peek, sizeof (peek), MSG_PEEK, - NULL, NULL)) - { - case -1: /* Something weird happened */ - /* When select returns that data is available, - that could mean that the socket is in - listen mode and a client tries to connect. - Unfortunately, recvfrom() doesn't make much - sense then. It returns WSAENOTCONN in that - case. Since that's not actually an error, - we must not set POLLERR but POLLIN. */ - if (WSAGetLastError () != WSAENOTCONN) - fds[i].revents |= POLLERR; - else - fds[i].revents |= POLLIN; - break; - case 0: /* Closed on the read side... */ - /* ...or shutdown(SHUT_WR) on the write side. - We set revents to POLLHUP until 1.5.18, but - this is semantically borderline. */ - fds[i].revents |= POLLIN; - break; - default: - fds[i].revents |= POLLIN; - break; - } - set_errno (old_errno); - } - } - /* Handle failed connect. */ - if (FD_ISSET(fds[i].fd, write_fds) - && FD_ISSET(fds[i].fd, except_fds) - && (sock = cygheap->fdtab[fds[i].fd]->is_socket ()) - && sock->connect_state () == connect_failed) - fds[i].revents |= (POLLIN | POLLERR); - else - { - if (FD_ISSET(fds[i].fd, write_fds)) - fds[i].revents |= POLLOUT; - if (FD_ISSET(fds[i].fd, except_fds)) - fds[i].revents |= POLLPRI; - } - } - } - } - - return ret; -} diff --git a/winsup/cygwin/posix.sgml b/winsup/cygwin/posix.sgml deleted file mode 100644 index 80e9c6e97..000000000 --- a/winsup/cygwin/posix.sgml +++ /dev/null @@ -1,98 +0,0 @@ - -Compatibility with POSIX.1 - -The following functions are compatible with POSIX.1: - -Process Primitives (Section 3) - -fork, execl, execle, execlp, execv, execve, execvp, wait, waitpid, -_exit, kill, sigemptyset, sigfillset, sigaddset, sigdelset, -sigismember, sigaction, pthread_sigmask, sigprocmask, sigpending, -sigsuspend, alarm, pause, sleep, pthread_kill, pthread_sigmask - - -Process Environment (Section 4) - -getpid, getppid, getuid, geteuid, getgid, getegid, setuid, setgid, -getgroups, getlogin, getpgrp, setsid, setpgid, uname, time, times, -getenv, ctermid, ttyname, isatty, sysconf - - -Files and Directories (Section 5) - -opendir, readdir, rewinddir, closedir, chdir, getcwd, open, creat, -umask, link, mkdir, unlink, rmdir, rename, stat, fstat, access, chmod, -fchmod, chown, utime, ftruncate, pathconf, fpathconf - - -Input and Output Primitives (Section 6) - -pipe, dup, dup2, close, read, write, fcntl, lseek, fsync - - -Device- and Class-Specific Functions (Section 7) - -cfgetispeed, cfgetospeed, cfsetispeed, cfsetospeed, tcdrain, tcflow, -tcflush, tcgetattr, tcgetpgrp, tcsendbreak, tcsetattr, tcsetpgrp - - -Language-Specific Services for the C Programming Language (Section 8) - -abort, exit, fclose, fdopen, fflush, fgetc, fgets, fileno, fopen, -fprintf, fputc, fputs, fread, freopen, fscanf, fseek, ftell, fwrite, -getc, getchar, gets, perror, printf, putc, putchar, puts, remove, -rewind, scanf, setlocale, siglongjmp, sigsetjmp, tmpfile, tmpnam, -tzset - - -System Databases (Section 9) - -getgrgid, getgrnam, getpwnam, getpwuid - - -Synchronization (Section 11) - -sem_init, sem_destroy, sem_wait, sem_trywait, sem_post, -pthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock, -pthread_mutex_trylock, pthread_mutex_unlock - - -Memory Management (Section 12) - -mmap, mprotect, msync, munmap - - -Thread Management (Section 16) - -pthread_attr_init, pthread_attr_destroy, pthread_attr_setstacksize, -pthread_attr_getstacksize, pthread_create, pthread_exit, pthread_self, -pthread_equal - - -Thread-Specific Data Functions (Section 17) - -pthread_key_create, pthread_setspecific, pthread_getspecific, -pthread_key_delete - - - -Implementation Details - -setuid and setgid -always return ENOSYS. - -link will copy the file if it can't -implement a true symbolic link. Currently, symbolic links work, if at -all, only under Windows NT. - -chown always returns zero. - -fcntl doesn't support F_GETLK - it returns --1 and sets errno to ENOSYS. - -lseek only works properly on binary -files. - - - - diff --git a/winsup/cygwin/profil.c b/winsup/cygwin/profil.c deleted file mode 100644 index cbfffc1b2..000000000 --- a/winsup/cygwin/profil.c +++ /dev/null @@ -1,175 +0,0 @@ -/* profil.c -- win32 profil.c equivalent - - Copyright 1998, 1999, 2000, 2001 Red Hat, Inc. - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include -#include -#include -#include -#include - -#include - -#define SLEEPTIME (1000 / PROF_HZ) - -/* global profinfo for profil() call */ -static struct profinfo prof; - -/* Get the pc for thread THR */ - -static u_long -get_thrpc (HANDLE thr) -{ - CONTEXT ctx; - u_long pc; - int res; - - res = SuspendThread (thr); - if (res == -1) - return (u_long) - 1; - ctx.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER; - pc = (u_long) - 1; - if (GetThreadContext (thr, &ctx)) - pc = ctx.Eip; - ResumeThread (thr); - return pc; -} - -/* Display cell of profile buffer */ -#if 0 -static void -print_prof (struct profinfo *p) -{ - printf ("profthr %x\ttarget thr %x\n", p->profthr, p->targthr); - printf ("pc: %x - %x\n", p->lowpc, p->highpc); - printf ("scale: %x\n", p->scale); - return; -} -#endif - -/* Everytime we wake up use the main thread pc to hash into the cell in the - profile buffer ARG. */ - -static DWORD CALLBACK -profthr_func (LPVOID arg) -{ - struct profinfo *p = (struct profinfo *) arg; - u_long pc, idx; - - SetThreadPriority(p->profthr, THREAD_PRIORITY_TIME_CRITICAL); - - for (;;) - { - pc = (u_long) get_thrpc (p->targthr); - if (pc >= p->lowpc && pc < p->highpc) - { - idx = PROFIDX (pc, p->lowpc, p->scale); - p->counter[idx]++; - } -#if 0 - print_prof (p); -#endif - Sleep (SLEEPTIME); - } - return 0; -} - -/* Stop profiling to the profiling buffer pointed to by P. */ - -static int -profile_off (struct profinfo *p) -{ - if (p->profthr) - { - TerminateThread (p->profthr, 0); - CloseHandle (p->profthr); - } - if (p->targthr) - CloseHandle (p->targthr); - return 0; -} - -/* Create a timer thread and pass it a pointer P to the profiling buffer. */ - -static int -profile_on (struct profinfo *p) -{ - DWORD thrid; - - /* get handle for this thread */ - if (!DuplicateHandle (GetCurrentProcess (), GetCurrentThread (), - GetCurrentProcess (), &p->targthr, 0, FALSE, - DUPLICATE_SAME_ACCESS)) - { - errno = ESRCH; - return -1; - } - - p->profthr = CreateThread (0, 0, profthr_func, (void *) p, 0, &thrid); - if (!p->profthr) - { - CloseHandle (p->targthr); - p->targthr = 0; - errno = EAGAIN; - return -1; - } - return 0; -} - -/* - * start or stop profiling - * - * profiling goes into the SAMPLES buffer of size SIZE (which is treated - * as an array of u_shorts of size size/2) - * - * each bin represents a range of pc addresses from OFFSET. The number - * of pc addresses in a bin depends on SCALE. (A scale of 65536 maps - * each bin to two addresses, A scale of 32768 maps each bin to 4 addresses, - * a scale of 1 maps each bin to 128k addreses). Scale may be 1 - 65536, - * or zero to turn off profiling - */ -int -profile_ctl (struct profinfo * p, char *samples, size_t size, - u_long offset, u_int scale) -{ - u_long maxbin; - - if (scale > 65536) - { - errno = EINVAL; - return -1; - } - - profile_off (p); - if (scale) - { - memset (samples, 0, size); - memset (p, 0, sizeof *p); - maxbin = size >> 1; - prof.counter = (u_short *) samples; - prof.lowpc = offset; - prof.highpc = PROFADDR (maxbin, offset, scale); - prof.scale = scale; - - return profile_on (p); - } - return 0; -} - -/* Equivalent to unix profil() - Every SLEEPTIME interval, the user's program counter (PC) is examined: - offset is subtracted and the result is multiplied by scale. - The word pointed to by this address is incremented. Buf is unused. */ - -int -profil (char *samples, size_t size, u_long offset, u_int scale) -{ - return profile_ctl (&prof, samples, size, offset, scale); -} - diff --git a/winsup/cygwin/profil.h b/winsup/cygwin/profil.h deleted file mode 100644 index 7ec4dfa09..000000000 --- a/winsup/cygwin/profil.h +++ /dev/null @@ -1,44 +0,0 @@ -/* profil.h: gprof profiling header file - - Copyright 1998, 1999, 2000, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* profiling frequency. (No larger than 1000) */ -#define PROF_HZ 100 - -/* convert an addr to an index */ -#define PROFIDX(pc, base, scale) \ - ({ \ - size_t i = (pc - base) / 2; \ - if (sizeof (unsigned long long int) > sizeof (size_t)) \ - i = (unsigned long long int) i * scale / 65536; \ - else \ - i = i / 65536 * scale + i % 65536 * scale / 65536; \ - i; \ - }) - -/* convert an index into an address */ -#define PROFADDR(idx, base, scale) \ - ((base) + ((((unsigned long long)(idx) << 16) / (scale)) << 1)) - -/* convert a bin size into a scale */ -#define PROFSCALE(range, bins) (((bins) << 16) / ((range) >> 1)) - -typedef void *_WINHANDLE; - -struct profinfo { - _WINHANDLE targthr; /* thread to profile */ - _WINHANDLE profthr; /* profiling thread */ - u_short *counter; /* profiling counters */ - u_long lowpc, highpc; /* range to be profiled */ - u_int scale; /* scale value of bins */ -}; - -int profile_ctl(struct profinfo *, char *, size_t, u_long, u_int); -int profil(char *, size_t, u_long, u_int); - diff --git a/winsup/cygwin/pseudo-reloc.cc b/winsup/cygwin/pseudo-reloc.cc deleted file mode 100644 index 5760a69ad..000000000 --- a/winsup/cygwin/pseudo-reloc.cc +++ /dev/null @@ -1,46 +0,0 @@ -/* pseudo-reloc.c - - Written by Egor Duda - THIS SOFTWARE IS NOT COPYRIGHTED - - This source code is offered for use in the public domain. You may - use, modify or distribute it freely. - - This code is distributed in the hope that it will be useful but - WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY - DISCLAMED. This includes but is not limited to warrenties of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -*/ - -#include - -extern char __RUNTIME_PSEUDO_RELOC_LIST__; -extern char __RUNTIME_PSEUDO_RELOC_LIST_END__; -extern char _image_base__; - -typedef struct - { - DWORD addend; - DWORD target; - } -runtime_pseudo_reloc; - -void -do_pseudo_reloc (void* start, void* end, void* base) -{ - DWORD reloc_target; - runtime_pseudo_reloc* r; - for (r = (runtime_pseudo_reloc*) start; r < (runtime_pseudo_reloc*) end; r++) - { - reloc_target = (DWORD) base + r->target; - *((DWORD*) reloc_target) += r->addend; - } -} - -void -_pei386_runtime_relocator () -{ - do_pseudo_reloc (&__RUNTIME_PSEUDO_RELOC_LIST__, - &__RUNTIME_PSEUDO_RELOC_LIST_END__, - &_image_base__); -} diff --git a/winsup/cygwin/pthread.cc b/winsup/cygwin/pthread.cc deleted file mode 100644 index 949bc0970..000000000 --- a/winsup/cygwin/pthread.cc +++ /dev/null @@ -1,251 +0,0 @@ -/* pthread.cc: posix pthread interface for Cygwin - - Copyright 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. - - Originally written by Marco Fuykschot - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include "winsup.h" -#include "thread.h" -#include "cygerrno.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include -#include -#include "cygtls.h" - -extern "C" -{ -/* ThreadCreation */ -int -pthread_create (pthread_t * thread, const pthread_attr_t * attr, - void *(*start_routine) (void *), void *arg) -{ - return pthread::create (thread, attr, start_routine, arg); -} - -int -pthread_once (pthread_once_t * once_control, void (*init_routine) (void)) -{ - return pthread::once (once_control, init_routine); -} - -int -pthread_atfork (void (*prepare)(void), void (*parent)(void), void (*child)(void)) -{ - return pthread::atfork (prepare, parent, child); -} - -/* Thread Exit */ -void -pthread_exit (void *value_ptr) -{ - return pthread::self ()->exit (value_ptr); -} - -int -pthread_join (pthread_t thread, void **return_val) -{ - return pthread::join (&thread, (void **) return_val); -} - -int -pthread_detach (pthread_t thread) -{ - return pthread::detach (&thread); -} - - -/* This isn't a posix call... should we keep it? */ -int -pthread_suspend (pthread_t thread) -{ - return pthread::suspend (&thread); -} - -/* same */ -int -pthread_continue (pthread_t thread) -{ - return pthread::resume (&thread); -} - -unsigned long -pthread_getsequence_np (pthread_t * thread) -{ - if (!pthread::is_good_object (thread)) - return EINVAL; - return (*thread)->getsequence_np (); -} - -/* ID */ - -pthread_t pthread_self () -{ - return pthread::self (); -} - -/* Mutexes */ -int -pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t * attr) -{ - return pthread_mutex::init (mutex, attr); -} - -/* Synchronisation */ -int -pthread_cond_init (pthread_cond_t * cond, const pthread_condattr_t * attr) -{ - return pthread_cond::init (cond, attr); -} - -/* RW Locks */ -int -pthread_rwlock_init (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr) -{ - return pthread_rwlock::init (rwlock, attr); -} - -/* Cancelability */ - -int -pthread_cancel (pthread_t thread) -{ - return pthread::cancel (thread); -} - -int -pthread_setcancelstate (int state, int *oldstate) -{ - return pthread::self ()->setcancelstate (state, oldstate); -} - -int -pthread_setcanceltype (int type, int *oldtype) -{ - return pthread::self ()->setcanceltype (type, oldtype); -} - -void -pthread_testcancel () -{ - pthread::self ()->testcancel (); -} - -void -_pthread_cleanup_push (__pthread_cleanup_handler *handler) -{ - pthread::self ()->push_cleanup_handler (handler); -} - -void -_pthread_cleanup_pop (int execute) -{ - pthread::self ()->pop_cleanup_handler (execute); -} - -/* Semaphores */ -int -sem_init (sem_t * sem, int pshared, unsigned int value) -{ - return semaphore::init (sem, pshared, value); -} - -int -sem_destroy (sem_t * sem) -{ - return semaphore::destroy (sem); -} - -/* Mangle semaphore name to follow windows naming rules. Prepend "Global\" - if running on terminal service aware machine. Substitute invalid backslash - by forward slash characters, hoping not to collide. */ -static bool -mangle_sem_name (char *mangled, const char *name) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return false; - if (!*name) - { - set_errno (ENOENT); - return false; - } - size_t len = strlen (cygheap->shared_prefix); - if (strlen (name) >= CYG_MAX_PATH - len) - { - set_errno (EINVAL); - return false; - } - strcpy (mangled, cygheap->shared_prefix); - char *d = mangled + len; - const char *s = name; - while (*s) - *d++ = (*s == '\\') ? '/' : *s++; - *d = '\0'; - return true; -} - -sem_t * -sem_open (const char *name, int oflag, ...) -{ - mode_t mode = 0; - unsigned int value = 0; - if (oflag & O_CREAT) - { - va_list ap; - va_start (ap, oflag); - mode = va_arg (ap, mode_t); - value = va_arg (ap, unsigned int); - va_end (ap); - } - char mangled_name[CYG_MAX_PATH]; - if (!mangle_sem_name (mangled_name, name)) - return NULL; - return semaphore::open (mangled_name, oflag, mode, value); -} - -int -sem_close (sem_t * sem) -{ - return semaphore::destroy (sem); -} - -int -sem_wait (sem_t * sem) -{ - return semaphore::wait (sem); -} - -int -sem_trywait (sem_t * sem) -{ - return semaphore::trywait (sem); -} - -int -sem_timedwait (sem_t * sem, const struct timespec *abstime) -{ - return semaphore::timedwait (sem, abstime); -} - -int -sem_post (sem_t * sem) -{ - return semaphore::post (sem); -} - -int -sem_getvalue (sem_t * sem, int *sval) -{ - return semaphore::getvalue (sem, sval); -} - -} diff --git a/winsup/cygwin/pwdgrp.h b/winsup/cygwin/pwdgrp.h deleted file mode 100644 index 94631c5e6..000000000 --- a/winsup/cygwin/pwdgrp.h +++ /dev/null @@ -1,83 +0,0 @@ -/* pwdgrp.h - - Copyright 2001, 2002, 2003 Red Hat inc. - - Stuff common to pwd and grp handling. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* These functions are needed to allow searching and walking through - the passwd and group lists */ -extern struct passwd *internal_getpwsid (cygpsid &); -extern struct passwd *internal_getpwnam (const char *, bool = FALSE); -extern struct passwd *internal_getpwuid (__uid32_t, bool = FALSE); -extern struct __group32 *internal_getgrsid (cygpsid &); -extern struct __group32 *internal_getgrgid (__gid32_t gid, bool = FALSE); -extern struct __group32 *internal_getgrnam (const char *, bool = FALSE); -extern struct __group32 *internal_getgrent (int); -int internal_getgroups (int, __gid32_t *, cygpsid * = NULL); - -#include "sync.h" -#include "cygtls.h" -class pwdgrp -{ - unsigned pwdgrp_buf_elem_size; - union - { - passwd **passwd_buf; - __group32 **group_buf; - void **pwdgrp_buf; - }; - void (pwdgrp::*read) (); - bool (pwdgrp::*parse) (); - int etc_ix; - path_conv pc; - char *buf, *lptr; - int max_lines; - bool initialized; - static muto pglock; - - bool parse_passwd (); - bool parse_group (); - void read_passwd (); - void read_group (); - char *add_line (char *); - char *raw_ptr () const {return lptr;} - char *next_str (char); - bool next_num (unsigned long&); - bool next_num (unsigned int& i) - { - unsigned long x; - bool res = next_num (x); - i = (unsigned int) x; - return res; - } - inline bool next_num (int& i) - { - unsigned long x; - bool res = next_num (x); - i = (int) x; - return res; - } - -public: - int curr_lines; - - void load (const char *); - inline void refresh (bool check) - { - if (!check && initialized) - return; - if (pglock.acquire () == 1 && - (!initialized || (check && etc::file_changed (etc_ix)))) - (this->*read) (); - pglock.release (); - } - - pwdgrp (passwd *&pbuf); - pwdgrp (__group32 *&gbuf); -}; diff --git a/winsup/cygwin/regex/COPYRIGHT b/winsup/cygwin/regex/COPYRIGHT deleted file mode 100644 index 30c1f7a48..000000000 --- a/winsup/cygwin/regex/COPYRIGHT +++ /dev/null @@ -1,20 +0,0 @@ -Copyright 1992, 1993, 1994, 1997 Henry Spencer. All rights reserved. -This software is not subject to any license of the American Telephone -and Telegraph Company or of the Regents of the University of California. - -Permission is granted to anyone to use this software for any purpose on -any computer system, and to alter it and redistribute it, subject -to the following restrictions: - -1. The author is not responsible for the consequences of use of this - software, no matter how awful, even if they arise from flaws in it. - -2. The origin of this software must not be misrepresented, either by - explicit claim or by omission. Since few users ever read sources, - credits must appear in the documentation. - -3. Altered versions must be plainly marked as such, and must not be - misrepresented as being the original software. Since few users - ever read sources, credits must appear in the documentation. - -4. This notice may not be removed or altered. diff --git a/winsup/cygwin/regex/cclass.h b/winsup/cygwin/regex/cclass.h deleted file mode 100644 index 7ddb44afb..000000000 --- a/winsup/cygwin/regex/cclass.h +++ /dev/null @@ -1,31 +0,0 @@ -/* character-class table */ -static struct cclass { - const char *name; - const char *chars; - const char *multis; -} cclasses[] = { - {"alnum", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ -0123456789", ""}, - {"alpha", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", - ""}, - {"blank", " \t", ""}, - {"cntrl", "\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\ - \25\26\27\30\31\32\33\34\35\36\37\177", ""}, - {"digit", "0123456789", ""}, - {"graph", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ - 0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", - ""}, - {"lower", "abcdefghijklmnopqrstuvwxyz", - ""}, - {"print", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ - 0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ", - ""}, - {"punct", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", - ""}, - {"space", "\t\n\v\f\r ", ""}, - {"upper", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - ""}, - {"xdigit", "0123456789ABCDEFabcdef", - ""}, - {NULL, 0, ""} -}; diff --git a/winsup/cygwin/regex/cname.h b/winsup/cygwin/regex/cname.h deleted file mode 100644 index 1000f603e..000000000 --- a/winsup/cygwin/regex/cname.h +++ /dev/null @@ -1,102 +0,0 @@ -/* character-name table */ -static struct cname { - const char *name; - char code; -} cnames[] = { - {"NUL", '\0'}, - {"SOH", '\001'}, - {"STX", '\002'}, - {"ETX", '\003'}, - {"EOT", '\004'}, - {"ENQ", '\005'}, - {"ACK", '\006'}, - {"BEL", '\007'}, - {"alert", '\007'}, - {"BS", '\010'}, - {"backspace", '\b'}, - {"HT", '\011'}, - {"tab", '\t'}, - {"LF", '\012'}, - {"newline", '\n'}, - {"VT", '\013'}, - {"vertical-tab", '\v'}, - {"FF", '\014'}, - {"form-feed", '\f'}, - {"CR", '\015'}, - {"carriage-return", '\r'}, - {"SO", '\016'}, - {"SI", '\017'}, - {"DLE", '\020'}, - {"DC1", '\021'}, - {"DC2", '\022'}, - {"DC3", '\023'}, - {"DC4", '\024'}, - {"NAK", '\025'}, - {"SYN", '\026'}, - {"ETB", '\027'}, - {"CAN", '\030'}, - {"EM", '\031'}, - {"SUB", '\032'}, - {"ESC", '\033'}, - {"IS4", '\034'}, - {"FS", '\034'}, - {"IS3", '\035'}, - {"GS", '\035'}, - {"IS2", '\036'}, - {"RS", '\036'}, - {"IS1", '\037'}, - {"US", '\037'}, - {"space", ' '}, - {"exclamation-mark", '!'}, - {"quotation-mark", '"'}, - {"number-sign", '#'}, - {"dollar-sign", '$'}, - {"percent-sign", '%'}, - {"ampersand", '&'}, - {"apostrophe", '\''}, - {"left-parenthesis", '('}, - {"right-parenthesis", ')'}, - {"asterisk", '*'}, - {"plus-sign", '+'}, - {"comma", ','}, - {"hyphen", '-'}, - {"hyphen-minus", '-'}, - {"period", '.'}, - {"full-stop", '.'}, - {"slash", '/'}, - {"solidus", '/'}, - {"zero", '0'}, - {"one", '1'}, - {"two", '2'}, - {"three", '3'}, - {"four", '4'}, - {"five", '5'}, - {"six", '6'}, - {"seven", '7'}, - {"eight", '8'}, - {"nine", '9'}, - {"colon", ':'}, - {"semicolon", ';'}, - {"less-than-sign", '<'}, - {"equals-sign", '='}, - {"greater-than-sign", '>'}, - {"question-mark", '?'}, - {"commercial-at", '@'}, - {"left-square-bracket", '['}, - {"backslash", '\\'}, - {"reverse-solidus", '\\'}, - {"right-square-bracket", ']'}, - {"circumflex", '^'}, - {"circumflex-accent", '^'}, - {"underscore", '_'}, - {"low-line", '_'}, - {"grave-accent", '`'}, - {"left-brace", '{'}, - {"left-curly-bracket", '{'}, - {"vertical-line", '|'}, - {"right-brace", '}'}, - {"right-curly-bracket", '}'}, - {"tilde", '~'}, - {"DEL", '\177'}, - {NULL, 0} -}; diff --git a/winsup/cygwin/regex/engine.c b/winsup/cygwin/regex/engine.c deleted file mode 100644 index 42c91dc0f..000000000 --- a/winsup/cygwin/regex/engine.c +++ /dev/null @@ -1,1019 +0,0 @@ -/* - * The matching engine and friends. This file is #included by regexec.c - * after suitable #defines of a variety of macros used herein, so that - * different state representations can be used without duplicating masses - * of code. - */ - -#ifdef SNAMES -#define matcher smatcher -#define fast sfast -#define slow sslow -#define dissect sdissect -#define backref sbackref -#define step sstep -#define print sprint -#define at sat -#define match smat -#endif -#ifdef LNAMES -#define matcher lmatcher -#define fast lfast -#define slow lslow -#define dissect ldissect -#define backref lbackref -#define step lstep -#define print lprint -#define at lat -#define match lmat -#endif - -/* another structure passed up and down to avoid zillions of parameters */ -struct match { - struct re_guts *g; - int eflags; - regmatch_t *pmatch; /* [nsub+1] (0 element unused) */ - char *offp; /* offsets work from here */ - char *beginp; /* start of string -- virtual NUL precedes */ - char *endp; /* end of string -- virtual NUL here */ - char *coldp; /* can be no match starting before here */ - char **lastpos; /* [nplus+1] */ - STATEVARS; - states st; /* current states */ - states fresh; /* states for a fresh start */ - states tmp; /* temporary */ - states empty; /* empty set of states */ -}; - -#include "engine.ih" - -#ifdef REDEBUG -#define SP(t, s, c) print(m, t, s, c, stdout) -#define AT(t, p1, p2, s1, s2) at(m, t, p1, p2, s1, s2) -#define NOTE(str) { if (m->eflags®_TRACE) printf("=%s\n", (str)); } -#else -#define SP(t, s, c) /* nothing */ -#define AT(t, p1, p2, s1, s2) /* nothing */ -#define NOTE(s) /* nothing */ -#endif - -/* - - matcher - the actual matching engine - == static int matcher(register struct re_guts *g, char *string, \ - == size_t nmatch, regmatch_t pmatch[], int eflags); - */ -static int /* 0 success, REG_NOMATCH failure */ -matcher(g, string, nmatch, pmatch, eflags) -register struct re_guts *g; -char *string; -size_t nmatch; -regmatch_t pmatch[]; -int eflags; -{ - register char *endp; - register size_t i; - struct match mv; - register struct match *m = &mv; - register char *dp; - const register sopno gf = g->firststate+1; /* +1 for OEND */ - const register sopno gl = g->laststate; - char *start; - char *stop; - - /* simplify the situation where possible */ - if (g->cflags®_NOSUB) - nmatch = 0; - if (eflags®_STARTEND) { - start = string + pmatch[0].rm_so; - stop = string + pmatch[0].rm_eo; - } else { - start = string; - stop = start + strlen(start); - } - if (stop < start) - return(REG_INVARG); - - /* prescreening; this does wonders for this rather slow code */ - if (g->must != NULL) { - for (dp = start; dp < stop; dp++) - if (*dp == g->must[0] && stop - dp >= g->mlen && - memcmp(dp, g->must, (size_t)g->mlen) == 0) - break; - if (dp == stop) /* we didn't find g->must */ - return(REG_NOMATCH); - } - - /* match struct setup */ - m->g = g; - m->eflags = eflags; - m->pmatch = NULL; - m->lastpos = NULL; - m->offp = string; - m->beginp = start; - m->endp = stop; - STATESETUP(m, 4); - SETUP(m->st); - SETUP(m->fresh); - SETUP(m->tmp); - SETUP(m->empty); - CLEAR(m->empty); - - /* this loop does only one repetition except for backrefs */ - for (;;) { - endp = fast(m, start, stop, gf, gl); - if (endp == NULL) { /* a miss */ - STATETEARDOWN(m); - return(REG_NOMATCH); - } - if (nmatch == 0 && !g->backrefs) - break; /* no further info needed */ - - /* where? */ - assert(m->coldp != NULL); - for (;;) { - NOTE("finding start"); - endp = slow(m, m->coldp, stop, gf, gl); - if (endp != NULL) - break; - assert(m->coldp < m->endp); - m->coldp++; - } - if (nmatch == 1 && !g->backrefs) - break; /* no further info needed */ - - /* oh my, he wants the subexpressions... */ - if (m->pmatch == NULL) - m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) * - sizeof(regmatch_t)); - if (m->pmatch == NULL) { - STATETEARDOWN(m); - return(REG_ESPACE); - } - for (i = 1; i <= m->g->nsub; i++) - m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1; - if (!g->backrefs && !(m->eflags®_BACKR)) { - NOTE("dissecting"); - dp = dissect(m, m->coldp, endp, gf, gl); - } else { - if (g->nplus > 0 && m->lastpos == NULL) - m->lastpos = (char **)malloc((g->nplus+1) * - sizeof(char *)); - if (g->nplus > 0 && m->lastpos == NULL) { - free(m->pmatch); - STATETEARDOWN(m); - return(REG_ESPACE); - } - NOTE("backref dissect"); - dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); - } - if (dp != NULL) - break; - - /* uh-oh... we couldn't find a subexpression-level match */ - assert(g->backrefs); /* must be back references doing it */ - assert(g->nplus == 0 || m->lastpos != NULL); - for (;;) { - if (dp != NULL || endp <= m->coldp) - break; /* defeat */ - NOTE("backoff"); - endp = slow(m, m->coldp, endp-1, gf, gl); - if (endp == NULL) - break; /* defeat */ - /* try it on a shorter possibility */ -#ifndef NDEBUG - for (i = 1; i <= m->g->nsub; i++) { - assert(m->pmatch[i].rm_so == -1); - assert(m->pmatch[i].rm_eo == -1); - } -#endif - NOTE("backoff dissect"); - dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); - } - assert(dp == NULL || dp == endp); - if (dp != NULL) /* found a shorter one */ - break; - - /* despite initial appearances, there is no match here */ - NOTE("false alarm"); - start = m->coldp + 1; /* recycle starting later */ - assert(start <= stop); - } - - /* fill in the details if requested */ - if (nmatch > 0) { - pmatch[0].rm_so = m->coldp - m->offp; - pmatch[0].rm_eo = endp - m->offp; - } - if (nmatch > 1) { - assert(m->pmatch != NULL); - for (i = 1; i < nmatch; i++) - if (i <= m->g->nsub) - pmatch[i] = m->pmatch[i]; - else { - pmatch[i].rm_so = -1; - pmatch[i].rm_eo = -1; - } - } - - if (m->pmatch != NULL) - free((char *)m->pmatch); - if (m->lastpos != NULL) - free((char *)m->lastpos); - STATETEARDOWN(m); - return(0); -} - -/* - - dissect - figure out what matched what, no back references - == static char *dissect(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst); - */ -static char * /* == stop (success) always */ -dissect(m, start, stop, startst, stopst) -register struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; -{ - register int i; - register sopno ss; /* start sop of current subRE */ - register sopno es; /* end sop of current subRE */ - register char *sp; /* start of string matched by it */ - register char *stp; /* string matched by it cannot pass here */ - register char *rest; /* start of rest of string */ - register char *tail; /* string unmatched by rest of RE */ - register sopno ssub; /* start sop of subsubRE */ - register sopno esub; /* end sop of subsubRE */ - register char *ssp; /* start of string matched by subsubRE */ - register char *sep; /* end of string matched by subsubRE */ - register char *oldssp; /* previous ssp */ - register char *dp; - - AT("diss", start, stop, startst, stopst); - sp = start; - for (ss = startst; ss < stopst; ss = es) { - /* identify end of subRE */ - es = ss; - switch (OP(m->g->strip[es])) { - case OPLUS_: - case OQUEST_: - es += OPND(m->g->strip[es]); - break; - case OCH_: - while (OP(m->g->strip[es]) != O_CH) - es += OPND(m->g->strip[es]); - break; - } - es++; - - /* figure out what it matched */ - switch (OP(m->g->strip[ss])) { - case OEND: - assert(nope); - break; - case OCHAR: - sp++; - break; - case OBOL: - case OEOL: - case OBOW: - case OEOW: - break; - case OANY: - case OANYOF: - sp++; - break; - case OBACK_: - case O_BACK: - assert(nope); - break; - /* cases where length of match is hard to find */ - case OQUEST_: - stp = stop; - for (;;) { - /* how long could this one be? */ - rest = slow(m, sp, stp, ss, es); - assert(rest != NULL); /* it did match */ - /* could the rest match the rest? */ - tail = slow(m, rest, stop, es, stopst); - if (tail == stop) - break; /* yes! */ - /* no -- try a shorter match for this one */ - stp = rest - 1; - assert(stp >= sp); /* it did work */ - } - ssub = ss + 1; - esub = es - 1; - /* did innards match? */ - if (slow(m, sp, rest, ssub, esub) != NULL) { - dp = dissect(m, sp, rest, ssub, esub); - assert(dp == rest); - } else /* no */ - assert(sp == rest); - sp = rest; - break; - case OPLUS_: - stp = stop; - for (;;) { - /* how long could this one be? */ - rest = slow(m, sp, stp, ss, es); - assert(rest != NULL); /* it did match */ - /* could the rest match the rest? */ - tail = slow(m, rest, stop, es, stopst); - if (tail == stop) - break; /* yes! */ - /* no -- try a shorter match for this one */ - stp = rest - 1; - assert(stp >= sp); /* it did work */ - } - ssub = ss + 1; - esub = es - 1; - ssp = sp; - oldssp = ssp; - for (;;) { /* find last match of innards */ - sep = slow(m, ssp, rest, ssub, esub); - if (sep == NULL || sep == ssp) - break; /* failed or matched null */ - oldssp = ssp; /* on to next try */ - ssp = sep; - } - if (sep == NULL) { - /* last successful match */ - sep = ssp; - ssp = oldssp; - } - assert(sep == rest); /* must exhaust substring */ - assert(slow(m, ssp, sep, ssub, esub) == rest); - dp = dissect(m, ssp, sep, ssub, esub); - assert(dp == sep); - sp = rest; - break; - case OCH_: - stp = stop; - for (;;) { - /* how long could this one be? */ - rest = slow(m, sp, stp, ss, es); - assert(rest != NULL); /* it did match */ - /* could the rest match the rest? */ - tail = slow(m, rest, stop, es, stopst); - if (tail == stop) - break; /* yes! */ - /* no -- try a shorter match for this one */ - stp = rest - 1; - assert(stp >= sp); /* it did work */ - } - ssub = ss + 1; - esub = ss + OPND(m->g->strip[ss]) - 1; - assert(OP(m->g->strip[esub]) == OOR1); - for (;;) { /* find first matching branch */ - if (slow(m, sp, rest, ssub, esub) == rest) - break; /* it matched all of it */ - /* that one missed, try next one */ - assert(OP(m->g->strip[esub]) == OOR1); - esub++; - assert(OP(m->g->strip[esub]) == OOR2); - ssub = esub + 1; - esub += OPND(m->g->strip[esub]); - if (OP(m->g->strip[esub]) == OOR2) - esub--; - else - assert(OP(m->g->strip[esub]) == O_CH); - } - dp = dissect(m, sp, rest, ssub, esub); - assert(dp == rest); - sp = rest; - break; - case O_PLUS: - case O_QUEST: - case OOR1: - case OOR2: - case O_CH: - assert(nope); - break; - case OLPAREN: - i = OPND(m->g->strip[ss]); - assert(0 < i && i <= m->g->nsub); - m->pmatch[i].rm_so = sp - m->offp; - break; - case ORPAREN: - i = OPND(m->g->strip[ss]); - assert(0 < i && i <= m->g->nsub); - m->pmatch[i].rm_eo = sp - m->offp; - break; - default: /* uh oh */ - assert(nope); - break; - } - } - - assert(sp == stop); - return(sp); -} - -/* - - backref - figure out what matched what, figuring in back references - == static char *backref(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst, sopno lev); - */ -static char * /* == stop (success) or NULL (failure) */ -backref(m, start, stop, startst, stopst, lev) -register struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; -sopno lev; /* PLUS nesting level */ -{ - register int i; - register sopno ss; /* start sop of current subRE */ - register char *sp; /* start of string matched by it */ - register sopno ssub; /* start sop of subsubRE */ - register sopno esub; /* end sop of subsubRE */ - register char *ssp; /* start of string matched by subsubRE */ - register char *dp; - register size_t len; - register int hard; - register sop s; - register regoff_t offsave; - register cset *cs; - - AT("back", start, stop, startst, stopst); - sp = start; - - /* get as far as we can with easy stuff */ - hard = 0; - for (ss = startst; !hard && ss < stopst; ss++) - switch (OP(s = m->g->strip[ss])) { - case OCHAR: - if (sp == stop || *sp++ != (char)OPND(s)) - return(NULL); - break; - case OANY: - if (sp == stop) - return(NULL); - sp++; - break; - case OANYOF: - cs = &m->g->sets[OPND(s)]; - if (sp == stop || !CHIN(cs, *sp++)) - return(NULL); - break; - case OBOL: - if ( (sp == m->beginp && !(m->eflags®_NOTBOL)) || - (sp < m->endp && *(sp-1) == '\n' && - (m->g->cflags®_NEWLINE)) ) - { /* yes */ } - else - return(NULL); - break; - case OEOL: - if ( (sp == m->endp && !(m->eflags®_NOTEOL)) || - (sp < m->endp && *sp == '\n' && - (m->g->cflags®_NEWLINE)) ) - { /* yes */ } - else - return(NULL); - break; - case OBOW: - if (( (sp == m->beginp && !(m->eflags®_NOTBOL)) || - (sp < m->endp && *(sp-1) == '\n' && - (m->g->cflags®_NEWLINE)) || - (sp > m->beginp && - !ISWORD(*(sp-1))) ) && - (sp < m->endp && ISWORD(*sp)) ) - { /* yes */ } - else - return(NULL); - break; - case OEOW: - if (( (sp == m->endp && !(m->eflags®_NOTEOL)) || - (sp < m->endp && *sp == '\n' && - (m->g->cflags®_NEWLINE)) || - (sp < m->endp && !ISWORD(*sp)) ) && - (sp > m->beginp && ISWORD(*(sp-1))) ) - { /* yes */ } - else - return(NULL); - break; - case O_QUEST: - break; - case OOR1: /* matches null but needs to skip */ - ss++; - s = m->g->strip[ss]; - do { - assert(OP(s) == OOR2); - ss += OPND(s); - } while (OP(s = m->g->strip[ss]) != O_CH); - /* note that the ss++ gets us past the O_CH */ - break; - default: /* have to make a choice */ - hard = 1; - break; - } - if (!hard) { /* that was it! */ - if (sp != stop) - return(NULL); - return(sp); - } - ss--; /* adjust for the for's final increment */ - - /* the hard stuff */ - AT("hard", sp, stop, ss, stopst); - s = m->g->strip[ss]; - switch (OP(s)) { - case OBACK_: /* the vilest depths */ - i = OPND(s); - assert(0 < i && i <= m->g->nsub); - if (m->pmatch[i].rm_eo == -1) - return(NULL); - assert(m->pmatch[i].rm_so != -1); - len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so; - assert(stop - m->beginp >= len); - if (sp > stop - len) - return(NULL); /* not enough left to match */ - ssp = m->offp + m->pmatch[i].rm_so; - if (memcmp(sp, ssp, len) != 0) - return(NULL); - while (m->g->strip[ss] != SOP(O_BACK, i)) - ss++; - return(backref(m, sp+len, stop, ss+1, stopst, lev)); - break; - case OQUEST_: /* to null or not */ - dp = backref(m, sp, stop, ss+1, stopst, lev); - if (dp != NULL) - return(dp); /* not */ - return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev)); - break; - case OPLUS_: - assert(m->lastpos != NULL); - assert(lev+1 <= m->g->nplus); - m->lastpos[lev+1] = sp; - return(backref(m, sp, stop, ss+1, stopst, lev+1)); - break; - case O_PLUS: - if (sp == m->lastpos[lev]) /* last pass matched null */ - return(backref(m, sp, stop, ss+1, stopst, lev-1)); - /* try another pass */ - m->lastpos[lev] = sp; - dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev); - if (dp == NULL) - return(backref(m, sp, stop, ss+1, stopst, lev-1)); - else - return(dp); - break; - case OCH_: /* find the right one, if any */ - ssub = ss + 1; - esub = ss + OPND(s) - 1; - assert(OP(m->g->strip[esub]) == OOR1); - for (;;) { /* find first matching branch */ - dp = backref(m, sp, stop, ssub, esub, lev); - if (dp != NULL) - return(dp); - /* that one missed, try next one */ - if (OP(m->g->strip[esub]) == O_CH) - return(NULL); /* there is none */ - esub++; - assert(OP(m->g->strip[esub]) == OOR2); - ssub = esub + 1; - esub += OPND(m->g->strip[esub]); - if (OP(m->g->strip[esub]) == OOR2) - esub--; - else - assert(OP(m->g->strip[esub]) == O_CH); - } - break; - case OLPAREN: /* must undo assignment if rest fails */ - i = OPND(s); - assert(0 < i && i <= m->g->nsub); - offsave = m->pmatch[i].rm_so; - m->pmatch[i].rm_so = sp - m->offp; - dp = backref(m, sp, stop, ss+1, stopst, lev); - if (dp != NULL) - return(dp); - m->pmatch[i].rm_so = offsave; - return(NULL); - break; - case ORPAREN: /* must undo assignment if rest fails */ - i = OPND(s); - assert(0 < i && i <= m->g->nsub); - offsave = m->pmatch[i].rm_eo; - m->pmatch[i].rm_eo = sp - m->offp; - dp = backref(m, sp, stop, ss+1, stopst, lev); - if (dp != NULL) - return(dp); - m->pmatch[i].rm_eo = offsave; - return(NULL); - break; - default: /* uh oh */ - assert(nope); - break; - } - - /* "can't happen" */ - assert(nope); - /* NOTREACHED */ - return((char *)NULL); /* dummy */ -} - -/* - - fast - step through the string at top speed - == static char *fast(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst); - */ -static char * /* where tentative match ended, or NULL */ -fast(m, start, stop, startst, stopst) -register struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; -{ - register states st = m->st; - register states fresh = m->fresh; - register states tmp = m->tmp; - register char *p = start; - register int c = (start == m->beginp) ? OUT : *(start-1); - register int lastc; /* previous c */ - register int flagch; - register int i; - register char *coldp; /* last p after which no match was underway */ - - CLEAR(st); - SET1(st, startst); - st = step(m->g, startst, stopst, st, NOTHING, st); - ASSIGN(fresh, st); - SP("start", st, *p); - coldp = NULL; - for (;;) { - /* next character */ - lastc = c; - c = (p == m->endp) ? OUT : *p; - if (EQ(st, fresh)) - coldp = p; - - /* is there an EOL and/or BOL between lastc and c? */ - flagch = '\0'; - i = 0; - if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || - (lastc == OUT && !(m->eflags®_NOTBOL)) ) { - flagch = BOL; - i = m->g->nbol; - } - if ( (c == '\n' && m->g->cflags®_NEWLINE) || - (c == OUT && !(m->eflags®_NOTEOL)) ) { - flagch = (flagch == BOL) ? BOLEOL : EOL; - i += m->g->neol; - } - if (i != 0) { - for (; i > 0; i--) - st = step(m->g, startst, stopst, st, flagch, st); - SP("boleol", st, c); - } - - /* how about a word boundary? */ - if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && - (c != OUT && ISWORD(c)) ) { - flagch = BOW; - } - if ( (lastc != OUT && ISWORD(lastc)) && - (flagch == EOL || (c != OUT && !ISWORD(c))) ) { - flagch = EOW; - } - if (flagch == BOW || flagch == EOW) { - st = step(m->g, startst, stopst, st, flagch, st); - SP("boweow", st, c); - } - - /* are we done? */ - if (ISSET(st, stopst) || p == stop) - break; /* NOTE BREAK OUT */ - - /* no, we must deal with this character */ - ASSIGN(tmp, st); - ASSIGN(st, fresh); - assert(c != OUT); - st = step(m->g, startst, stopst, tmp, c, st); - SP("aft", st, c); - assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); - p++; - } - - assert(coldp != NULL); - m->coldp = coldp; - if (ISSET(st, stopst)) - return(p+1); - else - return(NULL); -} - -/* - - slow - step through the string more deliberately - == static char *slow(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst); - */ -static char * /* where it ended */ -slow(m, start, stop, startst, stopst) -register struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; -{ - register states st = m->st; - register states empty = m->empty; - register states tmp = m->tmp; - register char *p = start; - register int c = (start == m->beginp) ? OUT : *(start-1); - register int lastc; /* previous c */ - register int flagch; - register int i; - register char *matchp; /* last p at which a match ended */ - - AT("slow", start, stop, startst, stopst); - CLEAR(st); - SET1(st, startst); - SP("sstart", st, *p); - st = step(m->g, startst, stopst, st, NOTHING, st); - matchp = NULL; - for (;;) { - /* next character */ - lastc = c; - c = (p == m->endp) ? OUT : *p; - - /* is there an EOL and/or BOL between lastc and c? */ - flagch = '\0'; - i = 0; - if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || - (lastc == OUT && !(m->eflags®_NOTBOL)) ) { - flagch = BOL; - i = m->g->nbol; - } - if ( (c == '\n' && m->g->cflags®_NEWLINE) || - (c == OUT && !(m->eflags®_NOTEOL)) ) { - flagch = (flagch == BOL) ? BOLEOL : EOL; - i += m->g->neol; - } - if (i != 0) { - for (; i > 0; i--) - st = step(m->g, startst, stopst, st, flagch, st); - SP("sboleol", st, c); - } - - /* how about a word boundary? */ - if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && - (c != OUT && ISWORD(c)) ) { - flagch = BOW; - } - if ( (lastc != OUT && ISWORD(lastc)) && - (flagch == EOL || (c != OUT && !ISWORD(c))) ) { - flagch = EOW; - } - if (flagch == BOW || flagch == EOW) { - st = step(m->g, startst, stopst, st, flagch, st); - SP("sboweow", st, c); - } - - /* are we done? */ - if (ISSET(st, stopst)) - matchp = p; - if (EQ(st, empty) || p == stop) - break; /* NOTE BREAK OUT */ - - /* no, we must deal with this character */ - ASSIGN(tmp, st); - ASSIGN(st, empty); - assert(c != OUT); - st = step(m->g, startst, stopst, tmp, c, st); - SP("saft", st, c); - assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); - p++; - } - - return(matchp); -} - - -/* - - step - map set of states reachable before char to set reachable after - == static states step(register struct re_guts *g, sopno start, sopno stop, \ - == register states bef, int ch, register states aft); - == #define BOL (OUT+1) - == #define EOL (BOL+1) - == #define BOLEOL (BOL+2) - == #define NOTHING (BOL+3) - == #define BOW (BOL+4) - == #define EOW (BOL+5) - == #define CODEMAX (BOL+5) // highest code used - == #define NONCHAR(c) ((c) > CHAR_MAX) - == #define NNONCHAR (CODEMAX-CHAR_MAX) - */ -static states -step(g, start, stop, bef, ch, aft) -register struct re_guts *g; -sopno start; /* start state within strip */ -sopno stop; /* state after stop state within strip */ -register states bef; /* states reachable before */ -int ch; /* character or NONCHAR code */ -register states aft; /* states already known reachable after */ -{ - register cset *cs; - register sop s; - register sopno pc; - register onestate here; /* note, macros know this name */ - register sopno look; - register long i; - - for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) { - s = g->strip[pc]; - switch (OP(s)) { - case OEND: - assert(pc == stop-1); - break; - case OCHAR: - /* only characters can match */ - assert(!NONCHAR(ch) || ch != (char)OPND(s)); - if (ch == (char)OPND(s)) - FWD(aft, bef, 1); - break; - case OBOL: - if (ch == BOL || ch == BOLEOL) - FWD(aft, bef, 1); - break; - case OEOL: - if (ch == EOL || ch == BOLEOL) - FWD(aft, bef, 1); - break; - case OBOW: - if (ch == BOW) - FWD(aft, bef, 1); - break; - case OEOW: - if (ch == EOW) - FWD(aft, bef, 1); - break; - case OANY: - if (!NONCHAR(ch)) - FWD(aft, bef, 1); - break; - case OANYOF: - cs = &g->sets[OPND(s)]; - if (!NONCHAR(ch) && CHIN(cs, ch)) - FWD(aft, bef, 1); - break; - case OBACK_: /* ignored here */ - case O_BACK: - FWD(aft, aft, 1); - break; - case OPLUS_: /* forward, this is just an empty */ - FWD(aft, aft, 1); - break; - case O_PLUS: /* both forward and back */ - FWD(aft, aft, 1); - i = ISSETBACK(aft, OPND(s)); - BACK(aft, aft, OPND(s)); - if (!i && ISSETBACK(aft, OPND(s))) { - /* oho, must reconsider loop body */ - pc -= OPND(s) + 1; - INIT(here, pc); - } - break; - case OQUEST_: /* two branches, both forward */ - FWD(aft, aft, 1); - FWD(aft, aft, OPND(s)); - break; - case O_QUEST: /* just an empty */ - FWD(aft, aft, 1); - break; - case OLPAREN: /* not significant here */ - case ORPAREN: - FWD(aft, aft, 1); - break; - case OCH_: /* mark the first two branches */ - FWD(aft, aft, 1); - assert(OP(g->strip[pc+OPND(s)]) == OOR2); - FWD(aft, aft, OPND(s)); - break; - case OOR1: /* done a branch, find the O_CH */ - if (ISSTATEIN(aft, here)) { - for (look = 1; - OP(s = g->strip[pc+look]) != O_CH; - look += OPND(s)) - assert(OP(s) == OOR2); - FWD(aft, aft, look); - } - break; - case OOR2: /* propagate OCH_'s marking */ - FWD(aft, aft, 1); - if (OP(g->strip[pc+OPND(s)]) != O_CH) { - assert(OP(g->strip[pc+OPND(s)]) == OOR2); - FWD(aft, aft, OPND(s)); - } - break; - case O_CH: /* just empty */ - FWD(aft, aft, 1); - break; - default: /* ooooops... */ - assert(nope); - break; - } - } - - return(aft); -} - -#ifdef REDEBUG -/* - - print - print a set of states - == #ifdef REDEBUG - == static void print(struct match *m, char *caption, states st, \ - == int ch, FILE *d); - == #endif - */ -static void -print(m, caption, st, ch, d) -struct match *m; -char *caption; -states st; -int ch; -FILE *d; -{ - register struct re_guts *g = m->g; - register int i; - register int first = 1; - - if (!(m->eflags®_TRACE)) - return; - - fprintf(d, "%s", caption); - if (ch != '\0') - fprintf(d, " %s", pchar(ch)); - for (i = 0; i < g->nstates; i++) - if (ISSET(st, i)) { - fprintf(d, "%s%d", (first) ? "\t" : ", ", i); - first = 0; - } - fprintf(d, "\n"); -} - -/* - - at - print current situation - == #ifdef REDEBUG - == static void at(struct match *m, char *title, char *start, char *stop, \ - == sopno startst, sopno stopst); - == #endif - */ -static void -at(m, title, start, stop, startst, stopst) -struct match *m; -char *title; -char *start; -char *stop; -sopno startst; -sopno stopst; -{ - if (!(m->eflags®_TRACE)) - return; - - printf("%s %s-", title, pchar(*start)); - printf("%s ", pchar(*stop)); - printf("%ld-%ld\n", (long)startst, (long)stopst); -} - -#ifndef PCHARDONE -#define PCHARDONE /* never again */ -/* - - pchar - make a character printable - == #ifdef REDEBUG - == static char *pchar(int ch); - == #endif - * - * Is this identical to regchar() over in debug.c? Well, yes. But a - * duplicate here avoids having a debugging-capable regexec.o tied to - * a matching debug.o, and this is convenient. It all disappears in - * the non-debug compilation anyway, so it doesn't matter much. - */ -static char * /* -> representation */ -pchar(ch) -int ch; -{ - static char pbuf[10]; - - if (isprint(ch) || ch == ' ') - sprintf(pbuf, "%c", ch); - else - sprintf(pbuf, "\\%o", ch); - return(pbuf); -} -#endif -#endif - -#undef matcher -#undef fast -#undef slow -#undef dissect -#undef backref -#undef step -#undef print -#undef at -#undef match diff --git a/winsup/cygwin/regex/engine.ih b/winsup/cygwin/regex/engine.ih deleted file mode 100644 index cc98334e7..000000000 --- a/winsup/cygwin/regex/engine.ih +++ /dev/null @@ -1,35 +0,0 @@ -/* ========= begin header generated by ./mkh ========= */ -#ifdef __cplusplus -extern "C" { -#endif - -/* === engine.c === */ -static int matcher(register struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[], int eflags); -static char *dissect(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); -static char *backref(register struct match *m, char *start, char *stop, sopno startst, sopno stopst, sopno lev); -static char *fast(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); -static char *slow(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); -static states step(register struct re_guts *g, sopno start, sopno stop, register states bef, int ch, register states aft); -#define BOL (OUT+1) -#define EOL (BOL+1) -#define BOLEOL (BOL+2) -#define NOTHING (BOL+3) -#define BOW (BOL+4) -#define EOW (BOL+5) -#define CODEMAX (BOL+5) /* highest code used */ -#define NONCHAR(c) ((c) > CHAR_MAX) -#define NNONCHAR (CODEMAX-CHAR_MAX) -#ifdef REDEBUG -static void print(struct match *m, char *caption, states st, int ch, FILE *d); -#endif -#ifdef REDEBUG -static void at(struct match *m, char *title, char *start, char *stop, sopno startst, sopno stopst); -#endif -#ifdef REDEBUG -static char *pchar(int ch); -#endif - -#ifdef __cplusplus -} -#endif -/* ========= end header generated by ./mkh ========= */ diff --git a/winsup/cygwin/regex/mkh b/winsup/cygwin/regex/mkh deleted file mode 100755 index 252b246c7..000000000 --- a/winsup/cygwin/regex/mkh +++ /dev/null @@ -1,76 +0,0 @@ -#! /bin/sh -# mkh - pull headers out of C source -PATH=/bin:/usr/bin ; export PATH - -# egrep pattern to pick out marked lines -egrep='^ =([ ]|$)' - -# Sed program to process marked lines into lines for the header file. -# The markers have already been removed. Two things are done here: removal -# of backslashed newlines, and some fudging of comments. The first is done -# because -o needs to have prototypes on one line to strip them down. -# Getting comments into the output is tricky; we turn C++-style // comments -# into /* */ comments, after altering any existing */'s to avoid trouble. -peel=' /\\$/N - /\\\n[ ]*/s///g - /\/\//s;\*/;* /;g - /\/\//s;//\(.*\);/*\1 */;' - -for a -do - case "$a" in - -o) # old (pre-function-prototype) compiler - # add code to comment out argument lists - peel="$peel - "'/^\([^#\/][^\/]*[a-zA-Z0-9_)]\)(\(.*\))/s;;\1(/*\2*/);' - shift - ;; - -b) # funny Berkeley __P macro - peel="$peel - "'/^\([^#\/][^\/]*[a-zA-Z0-9_)]\)(\(.*\))/s;;\1 __P((\2));' - shift - ;; - -s) # compiler doesn't like `static foo();' - # add code to get rid of the `static' - peel="$peel - "'/^static[ ][^\/]*[a-zA-Z0-9_)](.*)/s;static.;;' - shift - ;; - -p) # private declarations - egrep='^ ==([ ]|$)' - shift - ;; - -i) # wrap in #ifndef, argument is name - ifndef="$2" - shift ; shift - ;; - *) break - ;; - esac -done - -if test " $ifndef" != " " -then - echo "#ifndef $ifndef" - echo "#define $ifndef /* never again */" -fi -echo "/* ========= begin header generated by $0 ========= */" -echo '#ifdef __cplusplus' -echo 'extern "C" {' -echo '#endif' -for f -do - echo - echo "/* === $f === */" - egrep "$egrep" $f | sed 's/^ ==*[ ]//;s/^ ==*$//' | sed "$peel" - echo -done -echo '#ifdef __cplusplus' -echo '}' -echo '#endif' -echo "/* ========= end header generated by $0 ========= */" -if test " $ifndef" != " " -then - echo "#endif" -fi -exit 0 diff --git a/winsup/cygwin/regex/regcomp.c b/winsup/cygwin/regex/regcomp.c deleted file mode 100644 index 580c70328..000000000 --- a/winsup/cygwin/regex/regcomp.c +++ /dev/null @@ -1,1546 +0,0 @@ -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include "regex.h" - -#include "utils.h" -#include "regex2.h" - -#include "cclass.h" -#include "cname.h" - -/* - * parse structure, passed up and down to avoid global variables and - * other clumsinesses - */ -struct parse { - char *next; /* next character in RE */ - char *end; /* end of string (-> NUL normally) */ - int error; /* has an error been seen? */ - sop *strip; /* malloced strip */ - sopno ssize; /* malloced strip size (allocated) */ - sopno slen; /* malloced strip length (used) */ - int ncsalloc; /* number of csets allocated */ - struct re_guts *g; -# define NPAREN 10 /* we need to remember () 1-9 for back refs */ - sopno pbegin[NPAREN]; /* -> ( ([0] unused) */ - sopno pend[NPAREN]; /* -> ) ([0] unused) */ -}; - -#include "regcomp.ih" - -static char nuls[10]; /* place to point scanner in event of error */ - -/* - * macros for use with parse structure - * BEWARE: these know that the parse structure is named `p' !!! - */ -#define PEEK() (*p->next) -#define PEEK2() (*(p->next+1)) -#define MORE() (p->next < p->end) -#define MORE2() (p->next+1 < p->end) -#define SEE(c) (MORE() && PEEK() == (c)) -#define SEETWO(a, b) (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b)) -#define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0) -#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0) -#define NEXT() (p->next++) -#define NEXT2() (p->next += 2) -#define NEXTn(n) (p->next += (n)) -#define GETNEXT() (*p->next++) -#define SETERROR(e) seterr(p, (e)) -#define REQUIRE(co, e) (void) ((co) || SETERROR(e)) -#define MUSTSEE(c, e) (REQUIRE(MORE() && PEEK() == (c), e)) -#define MUSTEAT(c, e) (REQUIRE(MORE() && GETNEXT() == (c), e)) -#define MUSTNOTSEE(c, e) (REQUIRE(!MORE() || PEEK() != (c), e)) -#define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd)) -#define INSERT(op, pos) doinsert(p, (sop)(op), HERE()-(pos)+1, pos) -#define AHEAD(pos) dofwd(p, pos, HERE()-(pos)) -#define ASTERN(sop, pos) EMIT(sop, HERE()-pos) -#define HERE() (p->slen) -#define THERE() (p->slen - 1) -#define THERETHERE() (p->slen - 2) -#define DROP(n) (p->slen -= (n)) - -#ifndef NDEBUG -static int never = 0; /* for use in asserts; shuts lint up */ -#else -#define never 0 /* some s have bugs too */ -#endif - -/* - - regcomp - interface for parser and compilation - = extern int regcomp(regex_t *, const char *, int); - = #define REG_BASIC 0000 - = #define REG_EXTENDED 0001 - = #define REG_ICASE 0002 - = #define REG_NOSUB 0004 - = #define REG_NEWLINE 0010 - = #define REG_NOSPEC 0020 - = #define REG_PEND 0040 - = #define REG_DUMP 0200 - */ -int /* 0 success, otherwise REG_something */ -regcomp(preg, pattern, cflags) -regex_t *preg; -const char *pattern; -int cflags; -{ - struct parse pa; - register struct re_guts *g; - register struct parse *p = &pa; - register int i; - register size_t len; -#ifdef REDEBUG -# define GOODFLAGS(f) (f) -#else -# define GOODFLAGS(f) ((f)&~REG_DUMP) -#endif - - cflags = GOODFLAGS(cflags); - if ((cflags®_EXTENDED) && (cflags®_NOSPEC)) - return(REG_INVARG); - - if (cflags®_PEND) { - if (preg->re_endp < pattern) - return(REG_INVARG); - len = preg->re_endp - pattern; - } else - len = strlen((char *)pattern); - - /* do the mallocs early so failure handling is easy */ - g = (struct re_guts *)malloc(sizeof(struct re_guts) + - (NC-1)*sizeof(cat_t)); - if (g == NULL) - return(REG_ESPACE); - p->ssize = len/(size_t)2*(size_t)3 + (size_t)1; /* ugh */ - p->strip = (sop *)malloc(p->ssize * sizeof(sop)); - p->slen = 0; - if (p->strip == NULL) { - free((char *)g); - return(REG_ESPACE); - } - - /* set things up */ - p->g = g; - p->next = (char *)pattern; /* convenience; we do not modify it */ - p->end = p->next + len; - p->error = 0; - p->ncsalloc = 0; - for (i = 0; i < NPAREN; i++) { - p->pbegin[i] = 0; - p->pend[i] = 0; - } - g->csetsize = NC; - g->sets = NULL; - g->setbits = NULL; - g->ncsets = 0; - g->cflags = cflags; - g->iflags = 0; - g->nbol = 0; - g->neol = 0; - g->must = NULL; - g->mlen = 0; - g->nsub = 0; - g->ncategories = 1; /* category 0 is "everything else" */ - g->categories = &g->catspace[-(CHAR_MIN)]; - (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t)); - g->backrefs = 0; - - /* do it */ - EMIT(OEND, 0); - g->firststate = THERE(); - if (cflags®_EXTENDED) - p_ere(p, OUT); - else if (cflags®_NOSPEC) - p_str(p); - else - p_bre(p, OUT, OUT); - EMIT(OEND, 0); - g->laststate = THERE(); - - /* tidy up loose ends and fill things in */ - categorize(p, g); - stripsnug(p, g); - findmust(p, g); - g->nplus = pluscount(p, g); - g->magic = MAGIC2; - preg->re_nsub = g->nsub; - preg->re_g = g; - preg->re_magic = MAGIC1; -#ifndef REDEBUG - /* not debugging, so can't rely on the assert() in regexec() */ - if (g->iflags&BAD) - SETERROR(REG_ASSERT); -#endif - - /* win or lose, we're done */ - if (p->error != 0) /* lose */ - regfree(preg); - return(p->error); -} - -/* - - p_ere - ERE parser top level, concatenation and alternation - == static void p_ere(register struct parse *p, int stop); - */ -static void -p_ere(p, stop) -register struct parse *p; -int stop; /* character this ERE should end at */ -{ - register char c; - register sopno prevback = 0; - register sopno prevfwd = 0; - register sopno conc = 0; - register int first = 1; /* is this the first alternative? */ - - for (;;) { - /* do a bunch of concatenated expressions */ - conc = HERE(); - while (MORE() && (c = PEEK()) != '|' && c != stop) - p_ere_exp(p); - REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */ - - if (!EAT('|')) - break; /* NOTE BREAK OUT */ - - if (first) { - INSERT(OCH_, conc); /* offset is wrong */ - prevfwd = conc; - prevback = conc; - first = 0; - } - ASTERN(OOR1, prevback); - prevback = THERE(); - AHEAD(prevfwd); /* fix previous offset */ - prevfwd = HERE(); - EMIT(OOR2, 0); /* offset is very wrong */ - } - - if (!first) { /* tail-end fixups */ - AHEAD(prevfwd); - ASTERN(O_CH, prevback); - } - - assert(!MORE() || SEE(stop)); -} - -/* - - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op - == static void p_ere_exp(register struct parse *p); - */ -static void -p_ere_exp(p) -register struct parse *p; -{ - register char c; - register sopno pos; - register int count; - register int count2; - register sopno subno; - int wascaret = 0; - - assert(MORE()); /* caller should have ensured this */ - c = GETNEXT(); - - pos = HERE(); - switch (c) { - case '(': - REQUIRE(MORE(), REG_EPAREN); - p->g->nsub++; - subno = p->g->nsub; - if (subno < NPAREN) - p->pbegin[subno] = HERE(); - EMIT(OLPAREN, subno); - if (!SEE(')')) - p_ere(p, ')'); - if (subno < NPAREN) { - p->pend[subno] = HERE(); - assert(p->pend[subno] != 0); - } - EMIT(ORPAREN, subno); - MUSTEAT(')', REG_EPAREN); - break; -#ifndef POSIX_MISTAKE - case ')': /* happens only if no current unmatched ( */ - /* - * You may ask, why the ifndef? Because I didn't notice - * this until slightly too late for 1003.2, and none of the - * other 1003.2 regular-expression reviewers noticed it at - * all. So an unmatched ) is legal POSIX, at least until - * we can get it fixed. - */ - SETERROR(REG_EPAREN); - break; -#endif - case '^': - EMIT(OBOL, 0); - p->g->iflags |= USEBOL; - p->g->nbol++; - wascaret = 1; - break; - case '$': - EMIT(OEOL, 0); - p->g->iflags |= USEEOL; - p->g->neol++; - break; - case '|': - SETERROR(REG_EMPTY); - break; - case '*': - case '+': - case '?': - SETERROR(REG_BADRPT); - break; - case '.': - if (p->g->cflags®_NEWLINE) - nonnewline(p); - else - EMIT(OANY, 0); - break; - case '[': - p_bracket(p); - break; - case '\\': - REQUIRE(MORE(), REG_EESCAPE); - c = GETNEXT(); - ordinary(p, c); - break; - case '{': /* okay as ordinary except if digit follows */ - REQUIRE(!MORE() || !isdigit(PEEK()), REG_BADRPT); - /* FALLTHROUGH */ - default: - ordinary(p, c); - break; - } - - if (!MORE()) - return; - c = PEEK(); - /* we call { a repetition if followed by a digit */ - if (!( c == '*' || c == '+' || c == '?' || - (c == '{' && MORE2() && isdigit(PEEK2())) )) - return; /* no repetition, we're done */ - NEXT(); - - REQUIRE(!wascaret, REG_BADRPT); - switch (c) { - case '*': /* implemented as +? */ - /* this case does not require the (y|) trick, noKLUDGE */ - INSERT(OPLUS_, pos); - ASTERN(O_PLUS, pos); - INSERT(OQUEST_, pos); - ASTERN(O_QUEST, pos); - break; - case '+': - INSERT(OPLUS_, pos); - ASTERN(O_PLUS, pos); - break; - case '?': - /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ - INSERT(OCH_, pos); /* offset slightly wrong */ - ASTERN(OOR1, pos); /* this one's right */ - AHEAD(pos); /* fix the OCH_ */ - EMIT(OOR2, 0); /* offset very wrong... */ - AHEAD(THERE()); /* ...so fix it */ - ASTERN(O_CH, THERETHERE()); - break; - case '{': - count = p_count(p); - if (EAT(',')) { - if (isdigit(PEEK())) { - count2 = p_count(p); - REQUIRE(count <= count2, REG_BADBR); - } else /* single number with comma */ - count2 = INFINITY; - } else /* just a single number */ - count2 = count; - repeat(p, pos, count, count2); - if (!EAT('}')) { /* error heuristics */ - while (MORE() && PEEK() != '}') - NEXT(); - REQUIRE(MORE(), REG_EBRACE); - SETERROR(REG_BADBR); - } - break; - } - - if (!MORE()) - return; - c = PEEK(); - if (!( c == '*' || c == '+' || c == '?' || - (c == '{' && MORE2() && isdigit(PEEK2())) ) ) - return; - SETERROR(REG_BADRPT); -} - -/* - - p_str - string (no metacharacters) "parser" - == static void p_str(register struct parse *p); - */ -static void -p_str(p) -register struct parse *p; -{ - REQUIRE(MORE(), REG_EMPTY); - while (MORE()) - ordinary(p, GETNEXT()); -} - -/* - - p_bre - BRE parser top level, anchoring and concatenation - == static void p_bre(register struct parse *p, register int end1, \ - == register int end2); - * Giving end1 as OUT essentially eliminates the end1/end2 check. - * - * This implementation is a bit of a kludge, in that a trailing $ is first - * taken as an ordinary character and then revised to be an anchor. The - * only undesirable side effect is that '$' gets included as a character - * category in such cases. This is fairly harmless; not worth fixing. - * The amount of lookahead needed to avoid this kludge is excessive. - */ -static void -p_bre(p, end1, end2) -register struct parse *p; -register int end1; /* first terminating character */ -register int end2; /* second terminating character */ -{ - register sopno start = HERE(); - register int first = 1; /* first subexpression? */ - register int wasdollar = 0; - - if (EAT('^')) { - EMIT(OBOL, 0); - p->g->iflags |= USEBOL; - p->g->nbol++; - } - while (MORE() && !SEETWO(end1, end2)) { - wasdollar = p_simp_re(p, first); - first = 0; - } - if (wasdollar) { /* oops, that was a trailing anchor */ - DROP(1); - EMIT(OEOL, 0); - p->g->iflags |= USEEOL; - p->g->neol++; - } - - REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */ -} - -/* - - p_simp_re - parse a simple RE, an atom possibly followed by a repetition - == static int p_simp_re(register struct parse *p, int starordinary); - */ -static int /* was the simple RE an unbackslashed $? */ -p_simp_re(p, starordinary) -register struct parse *p; -int starordinary; /* is a leading * an ordinary character? */ -{ - register int c; - register int count; - register int count2; - register sopno pos; - register int i; - register sopno subno; -# define BACKSL (1<g->cflags®_NEWLINE) - nonnewline(p); - else - EMIT(OANY, 0); - break; - case '[': - p_bracket(p); - break; - case BACKSL|'{': - SETERROR(REG_BADRPT); - break; - case BACKSL|'(': - p->g->nsub++; - subno = p->g->nsub; - if (subno < NPAREN) - p->pbegin[subno] = HERE(); - EMIT(OLPAREN, subno); - /* the MORE here is an error heuristic */ - if (MORE() && !SEETWO('\\', ')')) - p_bre(p, '\\', ')'); - if (subno < NPAREN) { - p->pend[subno] = HERE(); - assert(p->pend[subno] != 0); - } - EMIT(ORPAREN, subno); - REQUIRE(EATTWO('\\', ')'), REG_EPAREN); - break; - case BACKSL|')': /* should not get here -- must be user */ - case BACKSL|'}': - SETERROR(REG_EPAREN); - break; - case BACKSL|'1': - case BACKSL|'2': - case BACKSL|'3': - case BACKSL|'4': - case BACKSL|'5': - case BACKSL|'6': - case BACKSL|'7': - case BACKSL|'8': - case BACKSL|'9': - i = (c&~BACKSL) - '0'; - assert(i < NPAREN); - if (p->pend[i] != 0) { - assert(i <= p->g->nsub); - EMIT(OBACK_, i); - assert(p->pbegin[i] != 0); - assert(OP(p->strip[p->pbegin[i]]) == OLPAREN); - assert(OP(p->strip[p->pend[i]]) == ORPAREN); - (void) dupl(p, p->pbegin[i]+1, p->pend[i]); - EMIT(O_BACK, i); - } else - SETERROR(REG_ESUBREG); - p->g->backrefs = 1; - break; - case '*': - REQUIRE(starordinary, REG_BADRPT); - /* FALLTHROUGH */ - default: - ordinary(p, (char)c); /* takes off BACKSL, if any */ - break; - } - - if (EAT('*')) { /* implemented as +? */ - /* this case does not require the (y|) trick, noKLUDGE */ - INSERT(OPLUS_, pos); - ASTERN(O_PLUS, pos); - INSERT(OQUEST_, pos); - ASTERN(O_QUEST, pos); - } else if (EATTWO('\\', '{')) { - count = p_count(p); - if (EAT(',')) { - if (MORE() && isdigit(PEEK())) { - count2 = p_count(p); - REQUIRE(count <= count2, REG_BADBR); - } else /* single number with comma */ - count2 = INFINITY; - } else /* just a single number */ - count2 = count; - repeat(p, pos, count, count2); - if (!EATTWO('\\', '}')) { /* error heuristics */ - while (MORE() && !SEETWO('\\', '}')) - NEXT(); - REQUIRE(MORE(), REG_EBRACE); - SETERROR(REG_BADBR); - } - } else if (c == (unsigned char)'$') /* $ (but not \$) ends it */ - return(1); - - return(0); -} - -/* - - p_count - parse a repetition count - == static int p_count(register struct parse *p); - */ -static int /* the value */ -p_count(p) -register struct parse *p; -{ - register int count = 0; - register int ndigits = 0; - - while (MORE() && isdigit(PEEK()) && count <= DUPMAX) { - count = count*10 + (GETNEXT() - '0'); - ndigits++; - } - - REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR); - return(count); -} - -/* - - p_bracket - parse a bracketed character list - == static void p_bracket(register struct parse *p); - * - * Note a significant property of this code: if the allocset() did SETERROR, - * no set operations are done. - */ -static void -p_bracket(p) -register struct parse *p; -{ - register cset *cs = allocset(p); - register int invert = 0; - - /* Dept of Truly Sickening Special-Case Kludges */ - if (p->next + 5 < p->end && strncmp(p->next, "[:<:]]", 6) == 0) { - EMIT(OBOW, 0); - NEXTn(6); - return; - } - if (p->next + 5 < p->end && strncmp(p->next, "[:>:]]", 6) == 0) { - EMIT(OEOW, 0); - NEXTn(6); - return; - } - - if (EAT('^')) - invert++; /* make note to invert set at end */ - if (EAT(']')) - CHadd(cs, ']'); - else if (EAT('-')) - CHadd(cs, '-'); - while (MORE() && PEEK() != ']' && !SEETWO('-', ']')) - p_b_term(p, cs); - if (EAT('-')) - CHadd(cs, '-'); - MUSTEAT(']', REG_EBRACK); - - if (p->error != 0) /* don't mess things up further */ - return; - - if (p->g->cflags®_ICASE) { - register int i; - register int ci; - - for (i = p->g->csetsize - 1; i >= 0; i--) - if (CHIN(cs, i) && isalpha(i)) { - ci = othercase(i); - if (ci != i) - CHadd(cs, ci); - } - if (cs->multis != NULL) - mccase(p, cs); - } - if (invert) { - register int i; - - for (i = p->g->csetsize - 1; i >= 0; i--) - if (CHIN(cs, i)) - CHsub(cs, i); - else - CHadd(cs, i); - if (p->g->cflags®_NEWLINE) - CHsub(cs, '\n'); - if (cs->multis != NULL) - mcinvert(p, cs); - } - - assert(cs->multis == NULL); /* xxx */ - - if (nch(p, cs) == 1) { /* optimize singleton sets */ - ordinary(p, firstch(p, cs)); - freeset(p, cs); - } else - EMIT(OANYOF, freezeset(p, cs)); -} - -/* - - p_b_term - parse one term of a bracketed character list - == static void p_b_term(register struct parse *p, register cset *cs); - */ -static void -p_b_term(p, cs) -register struct parse *p; -register cset *cs; -{ - register char c; - register char start, finish; - register int i; - - /* classify what we've got */ - switch ((MORE()) ? PEEK() : '\0') { - case '[': - c = (MORE2()) ? PEEK2() : '\0'; - break; - case '-': - SETERROR(REG_ERANGE); - return; /* NOTE RETURN */ - break; - default: - c = '\0'; - break; - } - - switch (c) { - case ':': /* character class */ - NEXT2(); - REQUIRE(MORE(), REG_EBRACK); - c = PEEK(); - REQUIRE(c != '-' && c != ']', REG_ECTYPE); - p_b_cclass(p, cs); - REQUIRE(MORE(), REG_EBRACK); - REQUIRE(EATTWO(':', ']'), REG_ECTYPE); - break; - case '=': /* equivalence class */ - NEXT2(); - REQUIRE(MORE(), REG_EBRACK); - c = PEEK(); - REQUIRE(c != '-' && c != ']', REG_ECOLLATE); - p_b_eclass(p, cs); - REQUIRE(MORE(), REG_EBRACK); - REQUIRE(EATTWO('=', ']'), REG_ECOLLATE); - break; - default: /* symbol, ordinary character, or range */ -/* xxx revision needed for multichar stuff */ - start = p_b_symbol(p); - if (SEE('-') && MORE2() && PEEK2() != ']') { - /* range */ - NEXT(); - if (EAT('-')) - finish = '-'; - else - finish = p_b_symbol(p); - } else - finish = start; -/* xxx what about signed chars here... */ - REQUIRE(start <= finish, REG_ERANGE); - for (i = start; i <= finish; i++) - CHadd(cs, i); - break; - } -} - -/* - - p_b_cclass - parse a character-class name and deal with it - == static void p_b_cclass(register struct parse *p, register cset *cs); - */ -static void -p_b_cclass(p, cs) -register struct parse *p; -register cset *cs; -{ - register char *sp = p->next; - register struct cclass *cp; - register size_t len; - register const char *u; - register char c; - - while (MORE() && isalpha(PEEK())) - NEXT(); - len = p->next - sp; - for (cp = cclasses; cp->name != NULL; cp++) - if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') - break; - if (cp->name == NULL) { - /* oops, didn't find it */ - SETERROR(REG_ECTYPE); - return; - } - - u = cp->chars; - while ((c = *u++) != '\0') - CHadd(cs, c); - for (u = cp->multis; *u != '\0'; u += strlen(u) + 1) - MCadd(p, cs, u); -} - -/* - - p_b_eclass - parse an equivalence-class name and deal with it - == static void p_b_eclass(register struct parse *p, register cset *cs); - * - * This implementation is incomplete. xxx - */ -static void -p_b_eclass(p, cs) -register struct parse *p; -register cset *cs; -{ - register char c; - - c = p_b_coll_elem(p, '='); - CHadd(cs, c); -} - -/* - - p_b_symbol - parse a character or [..]ed multicharacter collating symbol - == static char p_b_symbol(register struct parse *p); - */ -static char /* value of symbol */ -p_b_symbol(p) -register struct parse *p; -{ - register char value; - - REQUIRE(MORE(), REG_EBRACK); - if (!EATTWO('[', '.')) - return(GETNEXT()); - - /* collating symbol */ - value = p_b_coll_elem(p, '.'); - REQUIRE(EATTWO('.', ']'), REG_ECOLLATE); - return(value); -} - -/* - - p_b_coll_elem - parse a collating-element name and look it up - == static char p_b_coll_elem(register struct parse *p, int endc); - */ -static char /* value of collating element */ -p_b_coll_elem(p, endc) -register struct parse *p; -int endc; /* name ended by endc,']' */ -{ - register char *sp = p->next; - register struct cname *cp; - register int len; - - while (MORE() && !SEETWO(endc, ']')) - NEXT(); - if (!MORE()) { - SETERROR(REG_EBRACK); - return(0); - } - len = p->next - sp; - for (cp = cnames; cp->name != NULL; cp++) - if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') - return(cp->code); /* known name */ - if (len == 1) - return(*sp); /* single character */ - SETERROR(REG_ECOLLATE); /* neither */ - return(0); -} - -/* - - othercase - return the case counterpart of an alphabetic - == static char othercase(int ch); - */ -static char /* if no counterpart, return ch */ -othercase(ch) -int ch; -{ - assert(isalpha(ch)); - if (isupper(ch)) - return(tolower(ch)); - else if (islower(ch)) - return(toupper(ch)); - else /* peculiar, but could happen */ - return(ch); -} - -/* - - bothcases - emit a dualcase version of a two-case character - == static void bothcases(register struct parse *p, int ch); - * - * Boy, is this implementation ever a kludge... - */ -static void -bothcases(p, ch) -register struct parse *p; -int ch; -{ - register char *oldnext = p->next; - register char *oldend = p->end; - char bracket[3]; - - assert(othercase(ch) != ch); /* p_bracket() would recurse */ - p->next = bracket; - p->end = bracket+2; - bracket[0] = ch; - bracket[1] = ']'; - bracket[2] = '\0'; - p_bracket(p); - assert(p->next == bracket+2); - p->next = oldnext; - p->end = oldend; -} - -/* - - ordinary - emit an ordinary character - == static void ordinary(register struct parse *p, register int ch); - */ -static void -ordinary(p, ch) -register struct parse *p; -register int ch; -{ - register cat_t *cap = p->g->categories; - - if ((p->g->cflags®_ICASE) && isalpha(ch) && othercase(ch) != ch) - bothcases(p, ch); - else { - EMIT(OCHAR, (unsigned char)ch); - if (cap[ch] == 0) - cap[ch] = p->g->ncategories++; - } -} - -/* - - nonnewline - emit REG_NEWLINE version of OANY - == static void nonnewline(register struct parse *p); - * - * Boy, is this implementation ever a kludge... - */ -static void -nonnewline(p) -register struct parse *p; -{ - register char *oldnext = p->next; - register char *oldend = p->end; - char bracket[4]; - - p->next = bracket; - p->end = bracket+3; - bracket[0] = '^'; - bracket[1] = '\n'; - bracket[2] = ']'; - bracket[3] = '\0'; - p_bracket(p); - assert(p->next == bracket+3); - p->next = oldnext; - p->end = oldend; -} - -/* - - repeat - generate code for a bounded repetition, recursively if needed - == static void repeat(register struct parse *p, sopno start, int from, int to); - */ -static void -repeat(p, start, from, to) -register struct parse *p; -sopno start; /* operand from here to end of strip */ -int from; /* repeated from this number */ -int to; /* to this number of times (maybe INFINITY) */ -{ - register sopno finish = HERE(); -# define N 2 -# define INF 3 -# define REP(f, t) ((f)*8 + (t)) -# define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N) - register sopno copy; - - if (p->error != 0) /* head off possible runaway recursion */ - return; - - assert(from <= to); - - switch (REP(MAP(from), MAP(to))) { - case REP(0, 0): /* must be user doing this */ - DROP(finish-start); /* drop the operand */ - break; - case REP(0, 1): /* as x{1,1}? */ - case REP(0, N): /* as x{1,n}? */ - case REP(0, INF): /* as x{1,}? */ - /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ - INSERT(OCH_, start); /* offset is wrong... */ - repeat(p, start+1, 1, to); - ASTERN(OOR1, start); - AHEAD(start); /* ... fix it */ - EMIT(OOR2, 0); - AHEAD(THERE()); - ASTERN(O_CH, THERETHERE()); - break; - case REP(1, 1): /* trivial case */ - /* done */ - break; - case REP(1, N): /* as x?x{1,n-1} */ - /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ - INSERT(OCH_, start); - ASTERN(OOR1, start); - AHEAD(start); - EMIT(OOR2, 0); /* offset very wrong... */ - AHEAD(THERE()); /* ...so fix it */ - ASTERN(O_CH, THERETHERE()); - copy = dupl(p, start+1, finish+1); - assert(copy == finish+4); - repeat(p, copy, 1, to-1); - break; - case REP(1, INF): /* as x+ */ - INSERT(OPLUS_, start); - ASTERN(O_PLUS, start); - break; - case REP(N, N): /* as xx{m-1,n-1} */ - copy = dupl(p, start, finish); - repeat(p, copy, from-1, to-1); - break; - case REP(N, INF): /* as xx{n-1,INF} */ - copy = dupl(p, start, finish); - repeat(p, copy, from-1, to); - break; - default: /* "can't happen" */ - SETERROR(REG_ASSERT); /* just in case */ - break; - } -} - -/* - - seterr - set an error condition - == static int seterr(register struct parse *p, int e); - */ -static int /* useless but makes type checking happy */ -seterr(p, e) -register struct parse *p; -int e; -{ - if (p->error == 0) /* keep earliest error condition */ - p->error = e; - p->next = nuls; /* try to bring things to a halt */ - p->end = nuls; - return(0); /* make the return value well-defined */ -} - -/* - - allocset - allocate a set of characters for [] - == static cset *allocset(register struct parse *p); - */ -static cset * -allocset(p) -register struct parse *p; -{ - register int no = p->g->ncsets++; - register size_t nc; - register size_t nbytes; - register cset *cs; - register size_t css = (size_t)p->g->csetsize; - register int i; - - if (no >= p->ncsalloc) { /* need another column of space */ - p->ncsalloc += CHAR_BIT; - nc = p->ncsalloc; - assert(nc % CHAR_BIT == 0); - nbytes = nc / CHAR_BIT * css; - if (p->g->sets == NULL) - p->g->sets = (cset *)malloc(nc * sizeof(cset)); - else - p->g->sets = (cset *)realloc((char *)p->g->sets, - nc * sizeof(cset)); - if (p->g->setbits == NULL) - p->g->setbits = (uch *)malloc(nbytes); - else { - p->g->setbits = (uch *)realloc((char *)p->g->setbits, - nbytes); - /* xxx this isn't right if setbits is now NULL */ - for (i = 0; i < no; i++) - p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT); - } - if (p->g->sets != NULL && p->g->setbits != NULL) - (void) memset((char *)p->g->setbits + (nbytes - css), - 0, css); - else { - no = 0; - SETERROR(REG_ESPACE); - /* caller's responsibility not to do set ops */ - } - } - - assert(p->g->sets != NULL); /* xxx */ - cs = &p->g->sets[no]; - cs->ptr = p->g->setbits + css*((no)/CHAR_BIT); - cs->mask = 1 << ((no) % CHAR_BIT); - cs->hash = 0; - cs->smultis = 0; - cs->multis = NULL; - - return(cs); -} - -/* - - freeset - free a now-unused set - == static void freeset(register struct parse *p, register cset *cs); - */ -static void -freeset(p, cs) -register struct parse *p; -register cset *cs; -{ - register size_t i; - register cset *top = &p->g->sets[p->g->ncsets]; - register size_t css = (size_t)p->g->csetsize; - - for (i = 0; i < css; i++) - CHsub(cs, i); - if (cs == top-1) /* recover only the easy case */ - p->g->ncsets--; -} - -/* - - freezeset - final processing on a set of characters - == static int freezeset(register struct parse *p, register cset *cs); - * - * The main task here is merging identical sets. This is usually a waste - * of time (although the hash code minimizes the overhead), but can win - * big if REG_ICASE is being used. REG_ICASE, by the way, is why the hash - * is done using addition rather than xor -- all ASCII [aA] sets xor to - * the same value! - */ -static int /* set number */ -freezeset(p, cs) -register struct parse *p; -register cset *cs; -{ - register uch h = cs->hash; - register size_t i; - register cset *top = &p->g->sets[p->g->ncsets]; - register cset *cs2; - register size_t css = (size_t)p->g->csetsize; - - /* look for an earlier one which is the same */ - for (cs2 = &p->g->sets[0]; cs2 < top; cs2++) - if (cs2->hash == h && cs2 != cs) { - /* maybe */ - for (i = 0; i < css; i++) - if (!!CHIN(cs2, i) != !!CHIN(cs, i)) - break; /* no */ - if (i == css) - break; /* yes */ - } - - if (cs2 < top) { /* found one */ - freeset(p, cs); - cs = cs2; - } - - return((int)(cs - p->g->sets)); -} - -/* - - firstch - return first character in a set (which must have at least one) - == static int firstch(register struct parse *p, register cset *cs); - */ -static int /* character; there is no "none" value */ -firstch(p, cs) -register struct parse *p; -register cset *cs; -{ - register size_t i; - register size_t css = (size_t)p->g->csetsize; - - for (i = 0; i < css; i++) - if (CHIN(cs, i)) - return((char)i); - assert(never); - return(0); /* arbitrary */ -} - -/* - - nch - number of characters in a set - == static int nch(register struct parse *p, register cset *cs); - */ -static int -nch(p, cs) -register struct parse *p; -register cset *cs; -{ - register size_t i; - register size_t css = (size_t)p->g->csetsize; - register int n = 0; - - for (i = 0; i < css; i++) - if (CHIN(cs, i)) - n++; - return(n); -} - -/* - - mcadd - add a collating element to a cset - == static void mcadd(register struct parse *p, register cset *cs, \ - == register char *cp); - */ -static void -mcadd(p, cs, cp) -register struct parse *p; -register cset *cs; -register const char *cp; -{ - register size_t oldend = cs->smultis; - - cs->smultis += strlen(cp) + 1; - if (cs->multis == NULL) - cs->multis = malloc(cs->smultis); - else - cs->multis = realloc(cs->multis, cs->smultis); - if (cs->multis == NULL) { - SETERROR(REG_ESPACE); - return; - } - - (void) strcpy(cs->multis + oldend - 1, cp); - cs->multis[cs->smultis - 1] = '\0'; -} - -/* - - mcinvert - invert the list of collating elements in a cset - == static void mcinvert(register struct parse *p, register cset *cs); - * - * This would have to know the set of possibilities. Implementation - * is deferred. - */ -static void -mcinvert(p, cs) -register struct parse *p; -register cset *cs; -{ - assert(cs->multis == NULL); /* xxx */ -} - -/* - - mccase - add case counterparts of the list of collating elements in a cset - == static void mccase(register struct parse *p, register cset *cs); - * - * This would have to know the set of possibilities. Implementation - * is deferred. - */ -static void -mccase(p, cs) -register struct parse *p; -register cset *cs; -{ - assert(cs->multis == NULL); /* xxx */ -} - -/* - - isinsets - is this character in any sets? - == static int isinsets(register struct re_guts *g, int c); - */ -static int /* predicate */ -isinsets(g, c) -register struct re_guts *g; -int c; -{ - register uch *col; - register int i; - register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; - register unsigned uc = (unsigned char)c; - - for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) - if (col[uc] != 0) - return(1); - return(0); -} - -/* - - samesets - are these two characters in exactly the same sets? - == static int samesets(register struct re_guts *g, int c1, int c2); - */ -static int /* predicate */ -samesets(g, c1, c2) -register struct re_guts *g; -int c1; -int c2; -{ - register uch *col; - register int i; - register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; - register unsigned uc1 = (unsigned char)c1; - register unsigned uc2 = (unsigned char)c2; - - for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) - if (col[uc1] != col[uc2]) - return(0); - return(1); -} - -/* - - categorize - sort out character categories - == static void categorize(struct parse *p, register struct re_guts *g); - */ -static void -categorize(p, g) -struct parse *p; -register struct re_guts *g; -{ - register cat_t *cats = g->categories; - register int c; - register int c2; - register cat_t cat; - - /* avoid making error situations worse */ - if (p->error != 0) - return; - - for (c = CHAR_MIN; c <= CHAR_MAX; c++) - if (cats[c] == 0 && isinsets(g, c)) { - cat = g->ncategories++; - cats[c] = cat; - for (c2 = c+1; c2 <= CHAR_MAX; c2++) - if (cats[c2] == 0 && samesets(g, c, c2)) - cats[c2] = cat; - } -} - -/* - - dupl - emit a duplicate of a bunch of sops - == static sopno dupl(register struct parse *p, sopno start, sopno finish); - */ -static sopno /* start of duplicate */ -dupl(p, start, finish) -register struct parse *p; -sopno start; /* from here */ -sopno finish; /* to this less one */ -{ - register sopno ret = HERE(); - register sopno len = finish - start; - - assert(finish >= start); - if (len == 0) - return(ret); - enlarge(p, p->ssize + len); /* this many unexpected additions */ - assert(p->ssize >= p->slen + len); - (void) memcpy((char *)(p->strip + p->slen), - (char *)(p->strip + start), (size_t)len*sizeof(sop)); - p->slen += len; - return(ret); -} - -/* - - doemit - emit a strip operator - == static void doemit(register struct parse *p, sop op, size_t opnd); - * - * It might seem better to implement this as a macro with a function as - * hard-case backup, but it's just too big and messy unless there are - * some changes to the data structures. Maybe later. - */ -static void -doemit(p, op, opnd) -register struct parse *p; -sop op; -size_t opnd; -{ - /* avoid making error situations worse */ - if (p->error != 0) - return; - - /* deal with oversize operands ("can't happen", more or less) */ - assert(opnd < 1<slen >= p->ssize) - enlarge(p, (p->ssize+1) / 2 * 3); /* +50% */ - assert(p->slen < p->ssize); - - /* finally, it's all reduced to the easy case */ - p->strip[p->slen++] = SOP(op, opnd); -} - -/* - - doinsert - insert a sop into the strip - == static void doinsert(register struct parse *p, sop op, size_t opnd, sopno pos); - */ -static void -doinsert(p, op, opnd, pos) -register struct parse *p; -sop op; -size_t opnd; -sopno pos; -{ - register sopno sn; - register sop s; - register int i; - - /* avoid making error situations worse */ - if (p->error != 0) - return; - - sn = HERE(); - EMIT(op, opnd); /* do checks, ensure space */ - assert(HERE() == sn+1); - s = p->strip[sn]; - - /* adjust paren pointers */ - assert(pos > 0); - for (i = 1; i < NPAREN; i++) { - if (p->pbegin[i] >= pos) { - p->pbegin[i]++; - } - if (p->pend[i] >= pos) { - p->pend[i]++; - } - } - - memmove((char *)&p->strip[pos+1], (char *)&p->strip[pos], - (HERE()-pos-1)*sizeof(sop)); - p->strip[pos] = s; -} - -/* - - dofwd - complete a forward reference - == static void dofwd(register struct parse *p, sopno pos, sop value); - */ -static void -dofwd(p, pos, value) -register struct parse *p; -register sopno pos; -sop value; -{ - /* avoid making error situations worse */ - if (p->error != 0) - return; - - assert(value < 1<strip[pos] = OP(p->strip[pos]) | value; -} - -/* - - enlarge - enlarge the strip - == static void enlarge(register struct parse *p, sopno size); - */ -static void -enlarge(p, size) -register struct parse *p; -register sopno size; -{ - register sop *sp; - - if (p->ssize >= size) - return; - - sp = (sop *)realloc(p->strip, size*sizeof(sop)); - if (sp == NULL) { - SETERROR(REG_ESPACE); - return; - } - p->strip = sp; - p->ssize = size; -} - -/* - - stripsnug - compact the strip - == static void stripsnug(register struct parse *p, register struct re_guts *g); - */ -static void -stripsnug(p, g) -register struct parse *p; -register struct re_guts *g; -{ - g->nstates = p->slen; - g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop)); - if (g->strip == NULL) { - SETERROR(REG_ESPACE); - g->strip = p->strip; - } -} - -/* - - findmust - fill in must and mlen with longest mandatory literal string - == static void findmust(register struct parse *p, register struct re_guts *g); - * - * This algorithm could do fancy things like analyzing the operands of | - * for common subsequences. Someday. This code is simple and finds most - * of the interesting cases. - * - * Note that must and mlen got initialized during setup. - */ -static void -findmust(p, g) -struct parse *p; -register struct re_guts *g; -{ - register sop *scan; - sop *start = NULL; - register sop *newstart = NULL; - register sopno newlen; - register sop s; - register char *cp; - register sopno i; - - /* avoid making error situations worse */ - if (p->error != 0) - return; - - /* find the longest OCHAR sequence in strip */ - newlen = 0; - scan = g->strip + 1; - do { - s = *scan++; - switch (OP(s)) { - case OCHAR: /* sequence member */ - if (newlen == 0) /* new sequence */ - newstart = scan - 1; - newlen++; - break; - case OPLUS_: /* things that don't break one */ - case OLPAREN: - case ORPAREN: - break; - case OQUEST_: /* things that must be skipped */ - case OCH_: - scan--; - do { - scan += OPND(s); - s = *scan; - /* assert() interferes w debug printouts */ - if (OP(s) != O_QUEST && OP(s) != O_CH && - OP(s) != OOR2) { - g->iflags |= BAD; - return; - } - } while (OP(s) != O_QUEST && OP(s) != O_CH); - /* fallthrough */ - default: /* things that break a sequence */ - if (newlen > g->mlen) { /* ends one */ - start = newstart; - g->mlen = newlen; - } - newlen = 0; - break; - } - } while (OP(s) != OEND); - - if (g->mlen == 0) /* there isn't one */ - return; - - /* turn it into a character string */ - g->must = malloc((size_t)g->mlen + 1); - if (g->must == NULL) { /* argh; just forget it */ - g->mlen = 0; - return; - } - cp = g->must; - scan = start; - for (i = g->mlen; i > 0; i--) { - while (OP(s = *scan++) != OCHAR) - continue; - assert(cp < g->must + g->mlen); - *cp++ = (char)OPND(s); - } - assert(cp == g->must + g->mlen); - *cp++ = '\0'; /* just on general principles */ -} - -/* - - pluscount - count + nesting - == static sopno pluscount(register struct parse *p, register struct re_guts *g); - */ -static sopno /* nesting depth */ -pluscount(p, g) -struct parse *p; -register struct re_guts *g; -{ - register sop *scan; - register sop s; - register sopno plusnest = 0; - register sopno maxnest = 0; - - if (p->error != 0) - return(0); /* there may not be an OEND */ - - scan = g->strip + 1; - do { - s = *scan++; - switch (OP(s)) { - case OPLUS_: - plusnest++; - break; - case O_PLUS: - if (plusnest > maxnest) - maxnest = plusnest; - plusnest--; - break; - } - } while (OP(s) != OEND); - if (plusnest != 0) - g->iflags |= BAD; - return(maxnest); -} diff --git a/winsup/cygwin/regex/regcomp.ih b/winsup/cygwin/regex/regcomp.ih deleted file mode 100644 index e16d5ab2f..000000000 --- a/winsup/cygwin/regex/regcomp.ih +++ /dev/null @@ -1,48 +0,0 @@ -/* ========= begin header generated by ./mkh ========= */ -#ifdef __cplusplus -extern "C" { -#endif - -/* === regcomp.c === */ -static void p_ere(register struct parse *p, int stop); -static void p_ere_exp(register struct parse *p); -static void p_str(register struct parse *p); -static void p_bre(register struct parse *p, register int end1, register int end2); -static int p_simp_re(register struct parse *p, int starordinary); -static int p_count(register struct parse *p); -static void p_bracket(register struct parse *p); -static void p_b_term(register struct parse *p, register cset *cs); -static void p_b_cclass(register struct parse *p, register cset *cs); -static void p_b_eclass(register struct parse *p, register cset *cs); -static char p_b_symbol(register struct parse *p); -static char p_b_coll_elem(register struct parse *p, int endc); -static char othercase(int ch); -static void bothcases(register struct parse *p, int ch); -static void ordinary(register struct parse *p, register int ch); -static void nonnewline(register struct parse *p); -static void repeat(register struct parse *p, sopno start, int from, int to); -static int seterr(register struct parse *p, int e); -static cset *allocset(register struct parse *p); -static void freeset(register struct parse *p, register cset *cs); -static int freezeset(register struct parse *p, register cset *cs); -static int firstch(register struct parse *p, register cset *cs); -static int nch(register struct parse *p, register cset *cs); -static void mcadd(register struct parse *p, register cset *cs, register const char *cp); -static void mcinvert(register struct parse *p, register cset *cs); -static void mccase(register struct parse *p, register cset *cs); -static int isinsets(register struct re_guts *g, int c); -static int samesets(register struct re_guts *g, int c1, int c2); -static void categorize(struct parse *p, register struct re_guts *g); -static sopno dupl(register struct parse *p, sopno start, sopno finish); -static void doemit(register struct parse *p, sop op, size_t opnd); -static void doinsert(register struct parse *p, sop op, size_t opnd, sopno pos); -static void dofwd(register struct parse *p, sopno pos, sop value); -static void enlarge(register struct parse *p, sopno size); -static void stripsnug(register struct parse *p, register struct re_guts *g); -static void findmust(register struct parse *p, register struct re_guts *g); -static sopno pluscount(register struct parse *p, register struct re_guts *g); - -#ifdef __cplusplus -} -#endif -/* ========= end header generated by ./mkh ========= */ diff --git a/winsup/cygwin/regex/regerror.c b/winsup/cygwin/regex/regerror.c deleted file mode 100644 index 42b045bae..000000000 --- a/winsup/cygwin/regex/regerror.c +++ /dev/null @@ -1,127 +0,0 @@ -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include "regex.h" - -#include "utils.h" -#include "regerror.ih" - -/* - = #define REG_OKAY 0 - = #define REG_NOMATCH 1 - = #define REG_BADPAT 2 - = #define REG_ECOLLATE 3 - = #define REG_ECTYPE 4 - = #define REG_EESCAPE 5 - = #define REG_ESUBREG 6 - = #define REG_EBRACK 7 - = #define REG_EPAREN 8 - = #define REG_EBRACE 9 - = #define REG_BADBR 10 - = #define REG_ERANGE 11 - = #define REG_ESPACE 12 - = #define REG_BADRPT 13 - = #define REG_EMPTY 14 - = #define REG_ASSERT 15 - = #define REG_INVARG 16 - = #define REG_ATOI 255 // convert name to number (!) - = #define REG_ITOA 0400 // convert number to name (!) - */ -static struct rerr { - int code; - const char *name; - const char *explain; -} rerrs[] = { - {REG_OKAY, "REG_OKAY", "no errors detected"}, - {REG_NOMATCH, "REG_NOMATCH", "regexec() failed to match"}, - {REG_BADPAT, "REG_BADPAT", "invalid regular expression"}, - {REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element"}, - {REG_ECTYPE, "REG_ECTYPE", "invalid character class"}, - {REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\\)"}, - {REG_ESUBREG, "REG_ESUBREG", "invalid backreference number"}, - {REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced"}, - {REG_EPAREN, "REG_EPAREN", "parentheses not balanced"}, - {REG_EBRACE, "REG_EBRACE", "braces not balanced"}, - {REG_BADBR, "REG_BADBR", "invalid repetition count(s)"}, - {REG_ERANGE, "REG_ERANGE", "invalid character range"}, - {REG_ESPACE, "REG_ESPACE", "out of memory"}, - {REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid"}, - {REG_EMPTY, "REG_EMPTY", "empty (sub)expression"}, - {REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug"}, - {REG_INVARG, "REG_INVARG", "invalid argument to regex routine"}, - {-1, "", "*** unknown regexp error code ***"}, -}; - -/* - - regerror - the interface to error numbers - = extern size_t regerror(int, const regex_t *, char *, size_t); - */ -/* ARGSUSED */ -size_t -regerror(errcode, preg, errbuf, errbuf_size) -int errcode; -const regex_t *preg; -char *errbuf; -size_t errbuf_size; -{ - register struct rerr *r; - register size_t len; - register int target = errcode &~ REG_ITOA; - register const char *s; - char convbuf[50]; - - if (errcode == REG_ATOI) - s = regatoi(preg, convbuf); - else { - for (r = rerrs; r->code >= 0; r++) - if (r->code == target) - break; - - if (errcode®_ITOA) { - if (r->code >= 0) - (void) strcpy(convbuf, r->name); - else - sprintf(convbuf, "REG_0x%x", target); - assert(strlen(convbuf) < sizeof(convbuf)); - s = convbuf; - } else - s = r->explain; - } - - len = strlen(s) + 1; - if (errbuf_size > 0) { - if (errbuf_size > len) - (void) strcpy(errbuf, s); - else { - (void) strncpy(errbuf, s, errbuf_size-1); - errbuf[errbuf_size-1] = '\0'; - } - } - - return(len); -} - -/* - - regatoi - internal routine to implement REG_ATOI - == static char *regatoi(const regex_t *preg, char *localbuf); - */ -static const char * -regatoi(preg, localbuf) -const regex_t *preg; -char *localbuf; -{ - register struct rerr *r; - - for (r = rerrs; r->code >= 0; r++) - if (strcmp(r->name, preg->re_endp) == 0) - break; - if (r->code < 0) - return("0"); - - sprintf(localbuf, "%d", r->code); - return(localbuf); -} diff --git a/winsup/cygwin/regex/regerror.ih b/winsup/cygwin/regex/regerror.ih deleted file mode 100644 index d428544e3..000000000 --- a/winsup/cygwin/regex/regerror.ih +++ /dev/null @@ -1,12 +0,0 @@ -/* ========= begin header generated by ./mkh ========= */ -#ifdef __cplusplus -extern "C" { -#endif - -/* === regerror.c === */ -static const char *regatoi(const regex_t *preg, char *localbuf); - -#ifdef __cplusplus -} -#endif -/* ========= end header generated by ./mkh ========= */ diff --git a/winsup/cygwin/regex/regex.3 b/winsup/cygwin/regex/regex.3 deleted file mode 100644 index bc747096d..000000000 --- a/winsup/cygwin/regex/regex.3 +++ /dev/null @@ -1,509 +0,0 @@ -.TH REGEX 3 "25 Sept 1997" -.BY "Henry Spencer" -.de ZR -.\" one other place knows this name: the SEE ALSO section -.IR regex (7) \\$1 -.. -.SH NAME -regcomp, regexec, regerror, regfree \- regular-expression library -.SH SYNOPSIS -.ft B -.\".na -#include -.br -#include -.HP 10 -int regcomp(regex_t\ *preg, const\ char\ *pattern, int\ cflags); -.HP -int\ regexec(const\ regex_t\ *preg, const\ char\ *string, -size_t\ nmatch, regmatch_t\ pmatch[], int\ eflags); -.HP -size_t\ regerror(int\ errcode, const\ regex_t\ *preg, -char\ *errbuf, size_t\ errbuf_size); -.HP -void\ regfree(regex_t\ *preg); -.\".ad -.ft -.SH DESCRIPTION -These routines implement POSIX 1003.2 regular expressions (``RE''s); -see -.ZR . -.I Regcomp -compiles an RE written as a string into an internal form, -.I regexec -matches that internal form against a string and reports results, -.I regerror -transforms error codes from either into human-readable messages, -and -.I regfree -frees any dynamically-allocated storage used by the internal form -of an RE. -.PP -The header -.I -declares two structure types, -.I regex_t -and -.IR regmatch_t , -the former for compiled internal forms and the latter for match reporting. -It also declares the four functions, -a type -.IR regoff_t , -and a number of constants with names starting with ``REG_''. -.PP -.I Regcomp -compiles the regular expression contained in the -.I pattern -string, -subject to the flags in -.IR cflags , -and places the results in the -.I regex_t -structure pointed to by -.IR preg . -.I Cflags -is the bitwise OR of zero or more of the following flags: -.IP REG_EXTENDED \w'REG_EXTENDED'u+2n -Compile modern (``extended'') REs, -rather than the obsolete (``basic'') REs that -are the default. -.IP REG_BASIC -This is a synonym for 0, -provided as a counterpart to REG_EXTENDED to improve readability. -This is an extension, -compatible with but not specified by POSIX 1003.2, -and should be used with -caution in software intended to be portable to other systems. -.IP REG_NOSPEC -Compile with recognition of all special characters turned off. -All characters are thus considered ordinary, -so the ``RE'' is a literal string. -This is an extension, -compatible with but not specified by POSIX 1003.2, -and should be used with -caution in software intended to be portable to other systems. -REG_EXTENDED and REG_NOSPEC may not be used -in the same call to -.IR regcomp . -.IP REG_ICASE -Compile for matching that ignores upper/lower case distinctions. -See -.ZR . -.IP REG_NOSUB -Compile for matching that need only report success or failure, -not what was matched. -.IP REG_NEWLINE -Compile for newline-sensitive matching. -By default, newline is a completely ordinary character with no special -meaning in either REs or strings. -With this flag, -`[^' bracket expressions and `.' never match newline, -a `^' anchor matches the null string after any newline in the string -in addition to its normal function, -and the `$' anchor matches the null string before any newline in the -string in addition to its normal function. -.IP REG_PEND -The regular expression ends, -not at the first NUL, -but just before the character pointed to by the -.I re_endp -member of the structure pointed to by -.IR preg . -The -.I re_endp -member is of type -.IR const\ char\ * . -This flag permits inclusion of NULs in the RE; -they are considered ordinary characters. -This is an extension, -compatible with but not specified by POSIX 1003.2, -and should be used with -caution in software intended to be portable to other systems. -.PP -When successful, -.I regcomp -returns 0 and fills in the structure pointed to by -.IR preg . -One member of that structure -(other than -.IR re_endp ) -is publicized: -.IR re_nsub , -of type -.IR size_t , -contains the number of parenthesized subexpressions within the RE -(except that the value of this member is undefined if the -REG_NOSUB flag was used). -If -.I regcomp -fails, it returns a non-zero error code; -see DIAGNOSTICS. -.PP -.I Regexec -matches the compiled RE pointed to by -.I preg -against the -.IR string , -subject to the flags in -.IR eflags , -and reports results using -.IR nmatch , -.IR pmatch , -and the returned value. -The RE must have been compiled by a previous invocation of -.IR regcomp . -The compiled form is not altered during execution of -.IR regexec , -so a single compiled RE can be used simultaneously by multiple threads. -.PP -By default, -the NUL-terminated string pointed to by -.I string -is considered to be the text of an entire line, -with the NUL indicating the end of the line. -(That is, -any other end-of-line marker is considered to have been removed -and replaced by the NUL.) -The -.I eflags -argument is the bitwise OR of zero or more of the following flags: -.IP REG_NOTBOL \w'REG_STARTEND'u+2n -The first character of -the string -is not the beginning of a line, so the `^' anchor should not match before it. -This does not affect the behavior of newlines under REG_NEWLINE. -.IP REG_NOTEOL -The NUL terminating -the string -does not end a line, so the `$' anchor should not match before it. -This does not affect the behavior of newlines under REG_NEWLINE. -.IP REG_STARTEND -The string is considered to start at -\fIstring\fR\ + \fIpmatch\fR[0].\fIrm_so\fR -and to have a terminating NUL located at -\fIstring\fR\ + \fIpmatch\fR[0].\fIrm_eo\fR -(there need not actually be a NUL at that location), -regardless of the value of -.IR nmatch . -See below for the definition of -.IR pmatch -and -.IR nmatch . -This is an extension, -compatible with but not specified by POSIX 1003.2, -and should be used with -caution in software intended to be portable to other systems. -Note that a non-zero \fIrm_so\fR does not imply REG_NOTBOL; -REG_STARTEND affects only the location of the string, -not how it is matched. -.PP -See -.ZR -for a discussion of what is matched in situations where an RE or a -portion thereof could match any of several substrings of -.IR string . -.PP -Normally, -.I regexec -returns 0 for success and the non-zero code REG_NOMATCH for failure. -Other non-zero error codes may be returned in exceptional situations; -see DIAGNOSTICS. -.PP -If REG_NOSUB was specified in the compilation of the RE, -or if -.I nmatch -is 0, -.I regexec -ignores the -.I pmatch -argument (but see below for the case where REG_STARTEND is specified). -Otherwise, -.I pmatch -points to an array of -.I nmatch -structures of type -.IR regmatch_t . -Such a structure has at least the members -.I rm_so -and -.IR rm_eo , -both of type -.I regoff_t -(a signed arithmetic type at least as large as an -.I off_t -and a -.IR ssize_t ), -containing respectively the offset of the first character of a substring -and the offset of the first character after the end of the substring. -Offsets are measured from the beginning of the -.I string -argument given to -.IR regexec . -An empty substring is denoted by equal offsets, -both indicating the character following the empty substring. -.PP -The 0th member of the -.I pmatch -array is filled in to indicate what substring of -.I string -was matched by the entire RE. -Remaining members report what substring was matched by parenthesized -subexpressions within the RE; -member -.I i -reports subexpression -.IR i , -with subexpressions counted (starting at 1) by the order of their opening -parentheses in the RE, left to right. -Unused entries in the array\(emcorresponding either to subexpressions that -did not participate in the match at all, or to subexpressions that do not -exist in the RE (that is, \fIi\fR\ > \fIpreg\fR\->\fIre_nsub\fR)\(emhave both -.I rm_so -and -.I rm_eo -set to \-1. -If a subexpression participated in the match several times, -the reported substring is the last one it matched. -(Note, as an example in particular, that when the RE `(b*)+' matches `bbb', -the parenthesized subexpression matches the three `b's and then -an infinite number of empty strings following the last `b', -so the reported substring is one of the empties.) -.PP -If REG_STARTEND is specified, -.I pmatch -must point to at least one -.I regmatch_t -(even if -.I nmatch -is 0 or REG_NOSUB was specified), -to hold the input offsets for REG_STARTEND. -Use for output is still entirely controlled by -.IR nmatch ; -if -.I nmatch -is 0 or REG_NOSUB was specified, -the value of -.IR pmatch [0] -will not be changed by a successful -.IR regexec . -.PP -.I Regerror -maps a non-zero -.I errcode -from either -.I regcomp -or -.I regexec -to a human-readable, printable message. -If -.I preg -is non-NULL, -the error code should have arisen from use of -the -.I regex_t -pointed to by -.IR preg , -and if the error code came from -.IR regcomp , -it should have been the result from the most recent -.I regcomp -using that -.IR regex_t . -.RI ( Regerror -may be able to supply a more detailed message using information -from the -.IR regex_t .) -.I Regerror -places the NUL-terminated message into the buffer pointed to by -.IR errbuf , -limiting the length (including the NUL) to at most -.I errbuf_size -bytes. -If the whole message won't fit, -as much of it as will fit before the terminating NUL is supplied. -In any case, -the returned value is the size of buffer needed to hold the whole -message (including terminating NUL). -If -.I errbuf_size -is 0, -.I errbuf -is ignored but the return value is still correct. -.PP -If the -.I errcode -given to -.I regerror -is first ORed with REG_ITOA, -the ``message'' that results is the printable name of the error code, -e.g. ``REG_NOMATCH'', -rather than an explanation thereof. -If -.I errcode -is REG_ATOI, -then -.I preg -shall be non-NULL and the -.I re_endp -member of the structure it points to -must point to the printable name of an error code; -in this case, the result in -.I errbuf -is the decimal digits of -the numeric value of the error code -(0 if the name is not recognized). -REG_ITOA and REG_ATOI are intended primarily as debugging facilities; -they are extensions, -compatible with but not specified by POSIX 1003.2, -and should be used with -caution in software intended to be portable to other systems. -Be warned also that they are considered experimental and changes are possible. -.PP -.I Regfree -frees any dynamically-allocated storage associated with the compiled RE -pointed to by -.IR preg . -The remaining -.I regex_t -is no longer a valid compiled RE -and the effect of supplying it to -.I regexec -or -.I regerror -is undefined. -.PP -None of these functions references global variables except for tables -of constants; -all are safe for use from multiple threads if the arguments are safe. -.SH IMPLEMENTATION CHOICES -There are a number of decisions that 1003.2 leaves up to the implementor, -either by explicitly saying ``undefined'' or by virtue of them being -forbidden by the RE grammar. -This implementation treats them as follows. -.PP -See -.ZR -for a discussion of the definition of case-independent matching. -.PP -There is no particular limit on the length of REs, -except insofar as memory is limited. -Memory usage is approximately linear in RE size, and largely insensitive -to RE complexity, except for bounded repetitions. -See BUGS for one short RE using them -that will run almost any system out of memory. -.PP -A backslashed character other than one specifically given a magic meaning -by 1003.2 (such magic meanings occur only in obsolete [``basic''] REs) -is taken as an ordinary character. -.PP -Any unmatched [ is a REG_EBRACK error. -.PP -Equivalence classes cannot begin or end bracket-expression ranges. -The endpoint of one range cannot begin another. -.PP -RE_DUP_MAX, the limit on repetition counts in bounded repetitions, is 255. -.PP -A repetition operator (?, *, +, or bounds) cannot follow another -repetition operator. -A repetition operator cannot begin an expression or subexpression -or follow `^' or `|'. -.PP -`|' cannot appear first or last in a (sub)expression or after another `|', -i.e. an operand of `|' cannot be an empty subexpression. -An empty parenthesized subexpression, `()', is legal and matches an -empty (sub)string. -An empty string is not a legal RE. -.PP -A `{' followed by a digit is considered the beginning of bounds for a -bounded repetition, which must then follow the syntax for bounds. -A `{' \fInot\fR followed by a digit is considered an ordinary character. -.PP -`^' and `$' beginning and ending subexpressions in obsolete (``basic'') -REs are anchors, not ordinary characters. -.SH SEE ALSO -grep(1), regex(7) -.PP -POSIX 1003.2, sections 2.8 (Regular Expression Notation) -and -B.5 (C Binding for Regular Expression Matching). -.SH DIAGNOSTICS -Non-zero error codes from -.I regcomp -and -.I regexec -include the following: -.PP -.nf -.ta \w'REG_ECOLLATE'u+3n -REG_NOMATCH regexec() failed to match -REG_BADPAT invalid regular expression -REG_ECOLLATE invalid collating element -REG_ECTYPE invalid character class -REG_EESCAPE \e applied to unescapable character -REG_ESUBREG invalid backreference number -REG_EBRACK brackets [ ] not balanced -REG_EPAREN parentheses ( ) not balanced -REG_EBRACE braces { } not balanced -REG_BADBR invalid repetition count(s) in { } -REG_ERANGE invalid character range in [ ] -REG_ESPACE ran out of memory -REG_BADRPT ?, *, or + operand invalid -REG_EMPTY empty (sub)expression -REG_ASSERT ``can't happen''\(emyou found a bug -REG_INVARG invalid argument, e.g. negative-length string -.fi -.SH HISTORY -Written by Henry Spencer, -henry@zoo.toronto.edu. -.SH BUGS -This is an alpha release with known defects. -Please report problems. -.PP -There is one known functionality bug. -The implementation of internationalization is incomplete: -the locale is always assumed to be the default one of 1003.2, -and only the collating elements etc. of that locale are available. -.PP -The back-reference code is subtle and doubts linger about its correctness -in complex cases. -.PP -.I Regexec -performance is poor. -This will improve with later releases. -.I Nmatch -exceeding 0 is expensive; -.I nmatch -exceeding 1 is worse. -.I Regexec -is largely insensitive to RE complexity \fIexcept\fR that back -references are massively expensive. -RE length does matter; in particular, there is a strong speed bonus -for keeping RE length under about 30 characters, -with most special characters counting roughly double. -.PP -.I Regcomp -implements bounded repetitions by macro expansion, -which is costly in time and space if counts are large -or bounded repetitions are nested. -An RE like, say, -`((((a{1,100}){1,100}){1,100}){1,100}){1,100}' -will (eventually) run almost any existing machine out of swap space. -.PP -There are suspected problems with response to obscure error conditions. -Notably, -certain kinds of internal overflow, -produced only by truly enormous REs or by multiply nested bounded repetitions, -are probably not handled well. -.PP -Due to a mistake in 1003.2, things like `a)b' are legal REs because `)' is -a special character only in the presence of a previous unmatched `('. -This can't be fixed until the spec is fixed. -.PP -The standard's definition of back references is vague. -For example, does -`a\e(\e(b\e)*\e2\e)*d' match `abbbd'? -Until the standard is clarified, -behavior in such cases should not be relied on. -.PP -The implementation of word-boundary matching is a bit of a kludge, -and bugs may lurk in combinations of word-boundary matching and anchoring. diff --git a/winsup/cygwin/regex/regex.7 b/winsup/cygwin/regex/regex.7 deleted file mode 100644 index dc53e8c47..000000000 --- a/winsup/cygwin/regex/regex.7 +++ /dev/null @@ -1,235 +0,0 @@ -.TH REGEX 7 "25 Oct 1995" -.BY "Henry Spencer" -.SH NAME -regex \- POSIX 1003.2 regular expressions -.SH DESCRIPTION -Regular expressions (``RE''s), -as defined in POSIX 1003.2, come in two forms: -modern REs (roughly those of -.IR egrep ; -1003.2 calls these ``extended'' REs) -and obsolete REs (roughly those of -.IR ed ; -1003.2 ``basic'' REs). -Obsolete REs mostly exist for backward compatibility in some old programs; -they will be discussed at the end. -1003.2 leaves some aspects of RE syntax and semantics open; -`\(dg' marks decisions on these aspects that -may not be fully portable to other 1003.2 implementations. -.PP -A (modern) RE is one\(dg or more non-empty\(dg \fIbranches\fR, -separated by `|'. -It matches anything that matches one of the branches. -.PP -A branch is one\(dg or more \fIpieces\fR, concatenated. -It matches a match for the first, followed by a match for the second, etc. -.PP -A piece is an \fIatom\fR possibly followed -by a single\(dg `*', `+', `?', or \fIbound\fR. -An atom followed by `*' matches a sequence of 0 or more matches of the atom. -An atom followed by `+' matches a sequence of 1 or more matches of the atom. -An atom followed by `?' matches a sequence of 0 or 1 matches of the atom. -.PP -A \fIbound\fR is `{' followed by an unsigned decimal integer, -possibly followed by `,' -possibly followed by another unsigned decimal integer, -always followed by `}'. -The integers must lie between 0 and RE_DUP_MAX (255\(dg) inclusive, -and if there are two of them, the first may not exceed the second. -An atom followed by a bound containing one integer \fIi\fR -and no comma matches -a sequence of exactly \fIi\fR matches of the atom. -An atom followed by a bound -containing one integer \fIi\fR and a comma matches -a sequence of \fIi\fR or more matches of the atom. -An atom followed by a bound -containing two integers \fIi\fR and \fIj\fR matches -a sequence of \fIi\fR through \fIj\fR (inclusive) matches of the atom. -.PP -An atom is a regular expression enclosed in `()' (matching a match for the -regular expression), -an empty set of `()' (matching the null string)\(dg, -a \fIbracket expression\fR (see below), `.' -(matching any single character), `^' (matching the null string at the -beginning of a line), `$' (matching the null string at the -end of a line), a `\e' followed by one of the characters -`^.[$()|*+?{\e' -(matching that character taken as an ordinary character), -a `\e' followed by any other character\(dg -(matching that character taken as an ordinary character, -as if the `\e' had not been present\(dg), -or a single character with no other significance (matching that character). -A `{' followed by a character other than a digit is an ordinary -character, not the beginning of a bound\(dg. -It is illegal to end an RE with `\e'. -.PP -A \fIbracket expression\fR is a list of characters enclosed in `[]'. -It normally matches any single character from the list (but see below). -If the list begins with `^', -it matches any single character -(but see below) \fInot\fR from the rest of the list. -If two characters in the list are separated by `\-', this is shorthand -for the full \fIrange\fR of characters between those two (inclusive) in the -collating sequence, -e.g. `[0\-9]' in ASCII matches any decimal digit. -It is illegal\(dg for two ranges to share an -endpoint, e.g. `a\-c\-e'. -Ranges are very collating-sequence-dependent, -and portable programs should avoid relying on them. -.PP -To include a literal `]' in the list, make it the first character -(following a possible `^'). -To include a literal `\-', make it the first or last character, -or the second endpoint of a range. -To use a literal `\-' as the first endpoint of a range, -enclose it in `[.' and `.]' to make it a collating element (see below). -With the exception of these and some combinations using `[' (see next -paragraphs), all other special characters, including `\e', lose their -special significance within a bracket expression. -.PP -Within a bracket expression, a collating element (a character, -a multi-character sequence that collates as if it were a single character, -or a collating-sequence name for either) -enclosed in `[.' and `.]' stands for the -sequence of characters of that collating element. -The sequence is a single element of the bracket expression's list. -A bracket expression containing a multi-character collating element -can thus match more than one character, -e.g. if the collating sequence includes a `ch' collating element, -then the RE `[[.ch.]]*c' matches the first five characters -of `chchcc'. -.PP -Within a bracket expression, a collating element enclosed in `[=' and -`=]' is an equivalence class, standing for the sequences of characters -of all collating elements equivalent to that one, including itself. -(If there are no other equivalent collating elements, -the treatment is as if the enclosing delimiters were `[.' and `.]'.) -For example, if o and \o'o^' are the members of an equivalence class, -then `[[=o=]]', `[[=\o'o^'=]]', and `[o\o'o^']' are all synonymous. -An equivalence class may not\(dg be an endpoint -of a range. -.PP -Within a bracket expression, the name of a \fIcharacter class\fR enclosed -in `[:' and `:]' stands for the list of all characters belonging to that -class. -Standard character class names are: -.PP -.RS -.nf -.ta 3c 6c 9c -alnum digit punct -alpha graph space -blank lower upper -cntrl print xdigit -.fi -.RE -.PP -These stand for the character classes defined in -.IR ctype (3). -A locale may provide others. -A character class may not be used as an endpoint of a range. -.PP -There are two special cases\(dg of bracket expressions: -the bracket expressions `[[:<:]]' and `[[:>:]]' match the null string at -the beginning and end of a word respectively. -A word is defined as a sequence of -word characters -which is neither preceded nor followed by -word characters. -A word character is an -.I alnum -character (as defined by -.IR ctype (3)) -or an underscore. -This is an extension, -compatible with but not specified by POSIX 1003.2, -and should be used with -caution in software intended to be portable to other systems. -.PP -In the event that an RE could match more than one substring of a given -string, -the RE matches the one starting earliest in the string. -If the RE could match more than one substring starting at that point, -it matches the longest. -Subexpressions also match the longest possible substrings, subject to -the constraint that the whole match be as long as possible, -with subexpressions starting earlier in the RE taking priority over -ones starting later. -Note that higher-level subexpressions thus take priority over -their lower-level component subexpressions. -.PP -Match lengths are measured in characters, not collating elements. -A null string is considered longer than no match at all. -For example, -`bb*' matches the three middle characters of `abbbc', -`(wee|week)(knights|nights)' matches all ten characters of `weeknights', -when `(.*).*' is matched against `abc' the parenthesized subexpression -matches all three characters, and -when `(a*)*' is matched against `bc' both the whole RE and the parenthesized -subexpression match the null string. -.PP -If case-independent matching is specified, -the effect is much as if all case distinctions had vanished from the -alphabet. -When an alphabetic that exists in multiple cases appears as an -ordinary character outside a bracket expression, it is effectively -transformed into a bracket expression containing both cases, -e.g. `x' becomes `[xX]'. -When it appears inside a bracket expression, all case counterparts -of it are added to the bracket expression, so that (e.g.) `[x]' -becomes `[xX]' and `[^x]' becomes `[^xX]'. -.PP -No particular limit is imposed on the length of REs\(dg. -Programs intended to be portable should not employ REs longer -than 256 bytes, -as an implementation can refuse to accept such REs and remain -POSIX-compliant. -.PP -Obsolete (``basic'') regular expressions differ in several respects. -`|', `+', and `?' are ordinary characters and there is no equivalent -for their functionality. -The delimiters for bounds are `\e{' and `\e}', -with `{' and `}' by themselves ordinary characters. -The parentheses for nested subexpressions are `\e(' and `\e)', -with `(' and `)' by themselves ordinary characters. -`^' is an ordinary character except at the beginning of the -RE or\(dg the beginning of a parenthesized subexpression, -`$' is an ordinary character except at the end of the -RE or\(dg the end of a parenthesized subexpression, -and `*' is an ordinary character if it appears at the beginning of the -RE or the beginning of a parenthesized subexpression -(after a possible leading `^'). -Finally, there is one new type of atom, a \fIback reference\fR: -`\e' followed by a non-zero decimal digit \fId\fR -matches the same sequence of characters -matched by the \fId\fRth parenthesized subexpression -(numbering subexpressions by the positions of their opening parentheses, -left to right), -so that (e.g.) `\e([bc]\e)\e1' matches `bb' or `cc' but not `bc'. -.SH SEE ALSO -regex(3) -.PP -POSIX 1003.2, section 2.8 (Regular Expression Notation). -.SH HISTORY -Written by Henry Spencer, based on the 1003.2 spec. -.SH BUGS -Having two kinds of REs is a botch. -.PP -The current 1003.2 spec says that `)' is an ordinary character in -the absence of an unmatched `('; -this was an unintentional result of a wording error, -and change is likely. -Avoid relying on it. -.PP -Back references are a dreadful botch, -posing major problems for efficient implementations. -They are also somewhat vaguely defined -(does -`a\e(\e(b\e)*\e2\e)*d' match `abbbd'?). -Avoid using them. -.PP -1003.2's specification of case-independent matching is vague. -The ``one case implies all cases'' definition given above -is current consensus among implementors as to the right interpretation. -.PP -The syntax for word boundaries is incredibly ugly. diff --git a/winsup/cygwin/regex/regex.h b/winsup/cygwin/regex/regex.h deleted file mode 100644 index ecba140b0..000000000 --- a/winsup/cygwin/regex/regex.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef _REGEX_H_ -#define _REGEX_H_ /* never again */ -#include -/* ========= begin header generated by ./mkh ========= */ -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __INSIDE_CYGWIN__ -#define regcomp posix_regcomp -#define regerror posix_regerror -#define regexec posix_regexec -#define regfree posix_regfree -#endif - -/* === regex2.h === */ -typedef _off_t regoff_t; -typedef struct { - int re_magic; - size_t re_nsub; /* number of parenthesized subexpressions */ - const char *re_endp; /* end pointer for REG_PEND */ - struct re_guts *re_g; /* none of your business :-) */ -} regex_t; -typedef struct { - regoff_t rm_so; /* start of match */ - regoff_t rm_eo; /* end of match */ -} regmatch_t; - - -/* === regcomp.c === */ -extern int regcomp(regex_t *, const char *, int); -#define REG_BASIC 0000 -#define REG_EXTENDED 0001 -#define REG_ICASE 0002 -#define REG_NOSUB 0004 -#define REG_NEWLINE 0010 -#define REG_NOSPEC 0020 -#define REG_PEND 0040 -#define REG_DUMP 0200 - - -/* === regerror.c === */ -#define REG_OKAY 0 -#define REG_NOMATCH 1 -#define REG_BADPAT 2 -#define REG_ECOLLATE 3 -#define REG_ECTYPE 4 -#define REG_EESCAPE 5 -#define REG_ESUBREG 6 -#define REG_EBRACK 7 -#define REG_EPAREN 8 -#define REG_EBRACE 9 -#define REG_BADBR 10 -#define REG_ERANGE 11 -#define REG_ESPACE 12 -#define REG_BADRPT 13 -#define REG_EMPTY 14 -#define REG_ASSERT 15 -#define REG_INVARG 16 -#define REG_ATOI 255 /* convert name to number (!) */ -#define REG_ITOA 0400 /* convert number to name (!) */ -extern size_t regerror(int, const regex_t *, char *, size_t); - - -/* === regexec.c === */ -extern int regexec(const regex_t *, const char *, size_t, regmatch_t [], int); -#define REG_NOTBOL 00001 -#define REG_NOTEOL 00002 -#define REG_STARTEND 00004 -#define REG_TRACE 00400 /* tracing of execution */ -#define REG_LARGE 01000 /* force large representation */ -#define REG_BACKR 02000 /* force use of backref code */ - - -/* === regfree.c === */ -extern void regfree(regex_t *); - - -#ifdef __cplusplus -} -#endif -/* ========= end header generated by ./mkh ========= */ -#endif diff --git a/winsup/cygwin/regex/regex2.h b/winsup/cygwin/regex/regex2.h deleted file mode 100644 index 8c103fa54..000000000 --- a/winsup/cygwin/regex/regex2.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * First, the stuff that ends up in the outside-world include file - = typedef _off_t regoff_t; - = typedef struct { - = int re_magic; - = size_t re_nsub; // number of parenthesized subexpressions - = const char *re_endp; // end pointer for REG_PEND - = struct re_guts *re_g; // none of your business :-) - = } regex_t; - = typedef struct { - = regoff_t rm_so; // start of match - = regoff_t rm_eo; // end of match - = } regmatch_t; - */ -/* - * internals of regex_t - */ -#define MAGIC1 ((('r'^0200)<<8) | 'e') - -/* - * The internal representation is a *strip*, a sequence of - * operators ending with an endmarker. (Some terminology etc. is a - * historical relic of earlier versions which used multiple strips.) - * Certain oddities in the representation are there to permit running - * the machinery backwards; in particular, any deviation from sequential - * flow must be marked at both its source and its destination. Some - * fine points: - * - * - OPLUS_ and O_PLUS are *inside* the loop they create. - * - OQUEST_ and O_QUEST are *outside* the bypass they create. - * - OCH_ and O_CH are *outside* the multi-way branch they create, while - * OOR1 and OOR2 are respectively the end and the beginning of one of - * the branches. Note that there is an implicit OOR2 following OCH_ - * and an implicit OOR1 preceding O_CH. - * - * In state representations, an operator's bit is on to signify a state - * immediately *preceding* "execution" of that operator. - */ -typedef long sop; /* strip operator */ -typedef long sopno; -#define OPRMASK 0x7c000000 -#define OPDMASK 0x03ffffff -#define OPSHIFT (26) -#define OP(n) ((n)&OPRMASK) -#define OPND(n) ((n)&OPDMASK) -#define SOP(op, opnd) ((op)|(opnd)) -/* operators meaning operand */ -/* (back, fwd are offsets) */ -#define OEND (1< uch [csetsize] */ - uch mask; /* bit within array */ - uch hash; /* hash code */ - size_t smultis; - char *multis; /* -> char[smulti] ab\0cd\0ef\0\0 */ -} cset; -/* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */ -#define CHadd(cs, c) ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (c)) -#define CHsub(cs, c) ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (c)) -#define CHIN(cs, c) ((cs)->ptr[(uch)(c)] & (cs)->mask) -#define MCadd(p, cs, cp) mcadd(p, cs, cp) /* regcomp() internal fns */ -#define MCsub(p, cs, cp) mcsub(p, cs, cp) -#define MCin(p, cs, cp) mcin(p, cs, cp) - -/* stuff for character categories */ -typedef unsigned char cat_t; - -/* - * main compiled-expression structure - */ -struct re_guts { - int magic; -# define MAGIC2 ((('R'^0200)<<8)|'E') - sop *strip; /* malloced area for strip */ - int csetsize; /* number of bits in a cset vector */ - int ncsets; /* number of csets in use */ - cset *sets; /* -> cset [ncsets] */ - uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */ - int cflags; /* copy of regcomp() cflags argument */ - sopno nstates; /* = number of sops */ - sopno firststate; /* the initial OEND (normally 0) */ - sopno laststate; /* the final OEND */ - int iflags; /* internal flags */ -# define USEBOL 01 /* used ^ */ -# define USEEOL 02 /* used $ */ -# define BAD 04 /* something wrong */ - int nbol; /* number of ^ used */ - int neol; /* number of $ used */ - int ncategories; /* how many character categories */ - cat_t *categories; /* ->catspace[-CHAR_MIN] */ - char *must; /* match must contain this string */ - int mlen; /* length of must */ - size_t nsub; /* copy of re_nsub */ - int backrefs; /* does it use back references? */ - sopno nplus; /* how deep does it nest +s? */ - /* catspace must be last */ - cat_t catspace[1]; /* actually [NC] */ -}; - -/* misc utilities */ -#define OUT (CHAR_MAX+1) /* a non-character value */ -#define ISWORD(c) (isalnum(c) || (c) == '_') diff --git a/winsup/cygwin/regex/regexec.c b/winsup/cygwin/regex/regexec.c deleted file mode 100644 index 35b99c272..000000000 --- a/winsup/cygwin/regex/regexec.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - * the outer shell of regexec() - * - * This file includes engine.c *twice*, after muchos fiddling with the - * macros that code uses. This lets the same code operate on two different - * representations for state sets. - */ -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include "regex.h" - -#include "utils.h" -#include "regex2.h" - -#ifdef lint -static int nope = 0; /* for use in asserts; shuts lint up */ -#endif - -/* macros for manipulating states, small version */ -#define states unsigned -#define states1 unsigned /* for later use in regexec() decision */ -#define CLEAR(v) ((v) = 0) -#define SET0(v, n) ((v) &= ~((unsigned)1 << (n))) -#define SET1(v, n) ((v) |= (unsigned)1 << (n)) -#define ISSET(v, n) ((v) & ((unsigned)1 << (n))) -#define ASSIGN(d, s) ((d) = (s)) -#define EQ(a, b) ((a) == (b)) -#define STATEVARS int dummy /* dummy version */ -#define STATESETUP(m, n) /* nothing */ -#define STATETEARDOWN(m) /* nothing */ -#define SETUP(v) ((v) = 0) -#define onestate unsigned -#define INIT(o, n) ((o) = (unsigned)1 << (n)) -#define INC(o) ((o) <<= 1) -#define ISSTATEIN(v, o) ((v) & (o)) -/* some abbreviations; note that some of these know variable names! */ -/* do "if I'm here, I can also be there" etc without branches */ -#define FWD(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) << (n)) -#define BACK(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) >> (n)) -#define ISSETBACK(v, n) ((v) & ((unsigned)here >> (n))) -/* function names */ -#define SNAMES /* engine.c looks after details */ - -#include "engine.c" - -/* now undo things */ -#undef states -#undef CLEAR -#undef SET0 -#undef SET1 -#undef ISSET -#undef ASSIGN -#undef EQ -#undef STATEVARS -#undef STATESETUP -#undef STATETEARDOWN -#undef SETUP -#undef onestate -#undef INIT -#undef INC -#undef ISSTATEIN -#undef FWD -#undef BACK -#undef ISSETBACK -#undef SNAMES - -/* macros for manipulating states, large version */ -#define states char * -#define CLEAR(v) memset(v, 0, m->g->nstates) -#define SET0(v, n) ((v)[n] = 0) -#define SET1(v, n) ((v)[n] = 1) -#define ISSET(v, n) ((v)[n]) -#define ASSIGN(d, s) memcpy(d, s, m->g->nstates) -#define EQ(a, b) (memcmp(a, b, m->g->nstates) == 0) -#define STATEVARS int vn; char *space -#define STATESETUP(m, nv) { (m)->space = malloc((nv)*(m)->g->nstates); \ - if ((m)->space == NULL) return(REG_ESPACE); \ - (m)->vn = 0; } -#define STATETEARDOWN(m) { free((m)->space); } -#define SETUP(v) ((v) = &m->space[m->vn++ * m->g->nstates]) -#define onestate int -#define INIT(o, n) ((o) = (n)) -#define INC(o) ((o)++) -#define ISSTATEIN(v, o) ((v)[o]) -/* some abbreviations; note that some of these know variable names! */ -/* do "if I'm here, I can also be there" etc without branches */ -#define FWD(dst, src, n) ((dst)[here+(n)] |= (src)[here]) -#define BACK(dst, src, n) ((dst)[here-(n)] |= (src)[here]) -#define ISSETBACK(v, n) ((v)[here - (n)]) -/* function names */ -#define LNAMES /* flag */ - -#include "engine.c" - -/* - - regexec - interface for matching - = extern int regexec(const regex_t *, const char *, size_t, \ - = regmatch_t [], int); - = #define REG_NOTBOL 00001 - = #define REG_NOTEOL 00002 - = #define REG_STARTEND 00004 - = #define REG_TRACE 00400 // tracing of execution - = #define REG_LARGE 01000 // force large representation - = #define REG_BACKR 02000 // force use of backref code - * - * We put this here so we can exploit knowledge of the state representation - * when choosing which matcher to call. Also, by this point the matchers - * have been prototyped. - */ -int /* 0 success, REG_NOMATCH failure */ -regexec(preg, string, nmatch, pmatch, eflags) -const regex_t *preg; -const char *string; -size_t nmatch; -regmatch_t pmatch[]; -int eflags; -{ - register struct re_guts *g = preg->re_g; -#ifdef REDEBUG -# define GOODFLAGS(f) (f) -#else -# define GOODFLAGS(f) ((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND)) -#endif - - if (preg->re_magic != MAGIC1 || g->magic != MAGIC2) - return(REG_BADPAT); - assert(!(g->iflags&BAD)); - if (g->iflags&BAD) /* backstop for no-debug case */ - return(REG_BADPAT); - eflags = GOODFLAGS(eflags); - - if ((unsigned) g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags®_LARGE)) - return(smatcher(g, (char *)string, nmatch, pmatch, eflags)); - else - return(lmatcher(g, (char *)string, nmatch, pmatch, eflags)); -} diff --git a/winsup/cygwin/regex/regfree.c b/winsup/cygwin/regex/regfree.c deleted file mode 100644 index b8be143d8..000000000 --- a/winsup/cygwin/regex/regfree.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "winsup.h" -#include -#include -#include -#include "regex.h" - -#include "utils.h" -#include "regex2.h" - -/* - - regfree - free everything - = extern void regfree(regex_t *); - */ -void -regfree(preg) -regex_t *preg; -{ - register struct re_guts *g; - - if (preg->re_magic != MAGIC1) /* oops */ - return; /* nice to complain, but hard */ - - g = preg->re_g; - if (g == NULL || g->magic != MAGIC2) /* oops again */ - return; - preg->re_magic = 0; /* mark it invalid */ - g->magic = 0; /* mark it invalid */ - - if (g->strip != NULL) - free((char *)g->strip); - if (g->sets != NULL) - free((char *)g->sets); - if (g->setbits != NULL) - free((char *)g->setbits); - if (g->must != NULL) - free(g->must); - free((char *)g); -} diff --git a/winsup/cygwin/regex/tests b/winsup/cygwin/regex/tests deleted file mode 100644 index e4d928dad..000000000 --- a/winsup/cygwin/regex/tests +++ /dev/null @@ -1,477 +0,0 @@ -# regular expression test set -# Lines are at least three fields, separated by one or more tabs. "" stands -# for an empty field. First field is an RE. Second field is flags. If -# C flag given, regcomp() is expected to fail, and the third field is the -# error name (minus the leading REG_). -# -# Otherwise it is expected to succeed, and the third field is the string to -# try matching it against. If there is no fourth field, the match is -# expected to fail. If there is a fourth field, it is the substring that -# the RE is expected to match. If there is a fifth field, it is a comma- -# separated list of what the subexpressions should match, with - indicating -# no match for that one. In both the fourth and fifth fields, a (sub)field -# starting with @ indicates that the (sub)expression is expected to match -# a null string followed by the stuff after the @; this provides a way to -# test where null strings match. The character `N' in REs and strings -# is newline, `S' is space, `T' is tab, `Z' is NUL. -# -# The full list of flags: -# - placeholder, does nothing -# b RE is a BRE, not an ERE -# & try it as both an ERE and a BRE -# C regcomp() error expected, third field is error name -# i REG_ICASE -# m ("mundane") REG_NOSPEC -# s REG_NOSUB (not really testable) -# n REG_NEWLINE -# ^ REG_NOTBOL -# $ REG_NOTEOL -# # REG_STARTEND (see below) -# p REG_PEND -# -# For REG_STARTEND, the start/end offsets are those of the substring -# enclosed in (). - -# basics -a & a a -abc & abc abc -abc|de - abc abc -a|b|c - abc a - -# parentheses and perversions thereof -a(b)c - abc abc -a\(b\)c b abc abc -a( C EPAREN -a( b a( a( -a\( - a( a( -a\( bC EPAREN -a\(b bC EPAREN -a(b C EPAREN -a(b b a(b a(b -# gag me with a right parenthesis -- 1003.2 goofed here (my fault, partly) -a) - a) a) -) - ) ) -# end gagging (in a just world, those *should* give EPAREN) -a) b a) a) -a\) bC EPAREN -\) bC EPAREN -a()b - ab ab -a\(\)b b ab ab - -# anchoring and REG_NEWLINE -^abc$ & abc abc -a^b - a^b -a^b b a^b a^b -a$b - a$b -a$b b a$b a$b -^ & abc @abc -$ & abc @ -^$ & "" @ -$^ - "" @ -\($\)\(^\) b "" @ -# stop retching, those are legitimate (although disgusting) -^^ - "" @ -$$ - "" @ -b$ & abNc -b$ &n abNc b -^b$ & aNbNc -^b$ &n aNbNc b -^$ &n aNNb @Nb -^$ n abc -^$ n abcN @ -$^ n aNNb @Nb -\($\)\(^\) bn aNNb @Nb -^^ n^ aNNb @Nb -$$ n aNNb @NN -^a ^ a -a$ $ a -^a ^n aNb -^b ^n aNb b -a$ $n bNa -b$ $n bNa b -a*(^b$)c* - b b -a*\(^b$\)c* b b b - -# certain syntax errors and non-errors -| C EMPTY -| b | | -* C BADRPT -* b * * -+ C BADRPT -? C BADRPT -"" &C EMPTY -() - abc @abc -\(\) b abc @abc -a||b C EMPTY -|ab C EMPTY -ab| C EMPTY -(|a)b C EMPTY -(a|)b C EMPTY -(*a) C BADRPT -(+a) C BADRPT -(?a) C BADRPT -({1}a) C BADRPT -\(\{1\}a\) bC BADRPT -(a|*b) C BADRPT -(a|+b) C BADRPT -(a|?b) C BADRPT -(a|{1}b) C BADRPT -^* C BADRPT -^* b * * -^+ C BADRPT -^? C BADRPT -^{1} C BADRPT -^\{1\} bC BADRPT - -# metacharacters, backslashes -a.c & abc abc -a[bc]d & abd abd -a\*c & a*c a*c -a\\b & a\b a\b -a\\\*b & a\*b a\*b -a\bc & abc abc -a\ &C EESCAPE -a\\bc & a\bc a\bc -\{ bC BADRPT -a\[b & a[b a[b -a[b &C EBRACK -# trailing $ is a peculiar special case for the BRE code -a$ & a a -a$ & a$ -a\$ & a -a\$ & a$ a$ -a\\$ & a -a\\$ & a$ -a\\$ & a\$ -a\\$ & a\ a\ - -# back references, ugh -a\(b\)\2c bC ESUBREG -a\(b\1\)c bC ESUBREG -a\(b*\)c\1d b abbcbbd abbcbbd bb -a\(b*\)c\1d b abbcbd -a\(b*\)c\1d b abbcbbbd -^\(.\)\1 b abc -a\([bc]\)\1d b abcdabbd abbd b -a\(\([bc]\)\2\)*d b abbccd abbccd -a\(\([bc]\)\2\)*d b abbcbd -# actually, this next one probably ought to fail, but the spec is unclear -a\(\(b\)*\2\)*d b abbbd abbbd -# here is a case that no NFA implementation does right -\(ab*\)[ab]*\1 b ababaaa ababaaa a -# check out normal matching in the presence of back refs -\(a\)\1bcd b aabcd aabcd -\(a\)\1bc*d b aabcd aabcd -\(a\)\1bc*d b aabd aabd -\(a\)\1bc*d b aabcccd aabcccd -\(a\)\1bc*[ce]d b aabcccd aabcccd -^\(a\)\1b\(c\)*cd$ b aabcccd aabcccd - -# ordinary repetitions -ab*c & abc abc -ab+c - abc abc -ab?c - abc abc -a\(*\)b b a*b a*b -a\(**\)b b ab ab -a\(***\)b bC BADRPT -*a b *a *a -**a b a a -***a bC BADRPT - -# the dreaded bounded repetitions -{ & { { -{abc & {abc {abc -{1 C BADRPT -{1} C BADRPT -a{b & a{b a{b -a{1}b - ab ab -a\{1\}b b ab ab -a{1,}b - ab ab -a\{1,\}b b ab ab -a{1,2}b - aab aab -a\{1,2\}b b aab aab -a{1 C EBRACE -a\{1 bC EBRACE -a{1a C EBRACE -a\{1a bC EBRACE -a{1a} C BADBR -a\{1a\} bC BADBR -a{,2} - a{,2} a{,2} -a\{,2\} bC BADBR -a{,} - a{,} a{,} -a\{,\} bC BADBR -a{1,x} C BADBR -a\{1,x\} bC BADBR -a{1,x C EBRACE -a\{1,x bC EBRACE -a{300} C BADBR -a\{300\} bC BADBR -a{1,0} C BADBR -a\{1,0\} bC BADBR -ab{0,0}c - abcac ac -ab\{0,0\}c b abcac ac -ab{0,1}c - abcac abc -ab\{0,1\}c b abcac abc -ab{0,3}c - abbcac abbc -ab\{0,3\}c b abbcac abbc -ab{1,1}c - acabc abc -ab\{1,1\}c b acabc abc -ab{1,3}c - acabc abc -ab\{1,3\}c b acabc abc -ab{2,2}c - abcabbc abbc -ab\{2,2\}c b abcabbc abbc -ab{2,4}c - abcabbc abbc -ab\{2,4\}c b abcabbc abbc -((a{1,10}){1,10}){1,10} - a a a,a - -# multiple repetitions -a** &C BADRPT -a++ C BADRPT -a?? C BADRPT -a*+ C BADRPT -a*? C BADRPT -a+* C BADRPT -a+? C BADRPT -a?* C BADRPT -a?+ C BADRPT -a{1}{1} C BADRPT -a*{1} C BADRPT -a+{1} C BADRPT -a?{1} C BADRPT -a{1}* C BADRPT -a{1}+ C BADRPT -a{1}? C BADRPT -a*{b} - a{b} a{b} -a\{1\}\{1\} bC BADRPT -a*\{1\} bC BADRPT -a\{1\}* bC BADRPT - -# brackets, and numerous perversions thereof -a[b]c & abc abc -a[ab]c & abc abc -a[^ab]c & adc adc -a[]b]c & a]c a]c -a[[b]c & a[c a[c -a[-b]c & a-c a-c -a[^]b]c & adc adc -a[^-b]c & adc adc -a[b-]c & a-c a-c -a[b &C EBRACK -a[] &C EBRACK -a[1-3]c & a2c a2c -a[3-1]c &C ERANGE -a[1-3-5]c &C ERANGE -a[[.-.]--]c & a-c a-c -a[1- &C ERANGE -a[[. &C EBRACK -a[[.x &C EBRACK -a[[.x. &C EBRACK -a[[.x.] &C EBRACK -a[[.x.]] & ax ax -a[[.x,.]] &C ECOLLATE -a[[.one.]]b & a1b a1b -a[[.notdef.]]b &C ECOLLATE -a[[.].]]b & a]b a]b -a[[:alpha:]]c & abc abc -a[[:notdef:]]c &C ECTYPE -a[[: &C EBRACK -a[[:alpha &C EBRACK -a[[:alpha:] &C EBRACK -a[[:alpha,:] &C ECTYPE -a[[:]:]]b &C ECTYPE -a[[:-:]]b &C ECTYPE -a[[:alph:]] &C ECTYPE -a[[:alphabet:]] &C ECTYPE -[[:alnum:]]+ - -%@a0X- a0X -[[:alpha:]]+ - -%@aX0- aX -[[:blank:]]+ - aSSTb SST -[[:cntrl:]]+ - aNTb NT -[[:digit:]]+ - a019b 019 -[[:graph:]]+ - Sa%bS a%b -[[:lower:]]+ - AabC ab -[[:print:]]+ - NaSbN aSb -[[:punct:]]+ - S%-&T %-& -[[:space:]]+ - aSNTb SNT -[[:upper:]]+ - aBCd BC -[[:xdigit:]]+ - p0f3Cq 0f3C -a[[=b=]]c & abc abc -a[[= &C EBRACK -a[[=b &C EBRACK -a[[=b= &C EBRACK -a[[=b=] &C EBRACK -a[[=b,=]] &C ECOLLATE -a[[=one=]]b & a1b a1b - -# complexities -a(((b)))c - abc abc -a(b|(c))d - abd abd -a(b*|c)d - abbd abbd -# just gotta have one DFA-buster, of course -a[ab]{20} - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab -# and an inline expansion in case somebody gets tricky -a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab] - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab -# and in case somebody just slips in an NFA... -a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab](wee|week)(knights|night) - aaaaabaaaabaaaabaaaabweeknights aaaaabaaaabaaaabaaaabweeknights -# fish for anomalies as the number of states passes 32 -12345678901234567890123456789 - a12345678901234567890123456789b 12345678901234567890123456789 -123456789012345678901234567890 - a123456789012345678901234567890b 123456789012345678901234567890 -1234567890123456789012345678901 - a1234567890123456789012345678901b 1234567890123456789012345678901 -12345678901234567890123456789012 - a12345678901234567890123456789012b 12345678901234567890123456789012 -123456789012345678901234567890123 - a123456789012345678901234567890123b 123456789012345678901234567890123 -# and one really big one, beyond any plausible word width -1234567890123456789012345678901234567890123456789012345678901234567890 - a1234567890123456789012345678901234567890123456789012345678901234567890b 1234567890123456789012345678901234567890123456789012345678901234567890 -# fish for problems as brackets go past 8 -[ab][cd][ef][gh][ij][kl][mn] - xacegikmoq acegikm -[ab][cd][ef][gh][ij][kl][mn][op] - xacegikmoq acegikmo -[ab][cd][ef][gh][ij][kl][mn][op][qr] - xacegikmoqy acegikmoq -[ab][cd][ef][gh][ij][kl][mn][op][q] - xacegikmoqy acegikmoq - -# subtleties of matching -abc & xabcy abc -a\(b\)?c\1d b acd -aBc i Abc Abc -a[Bc]*d i abBCcd abBCcd -0[[:upper:]]1 &i 0a1 0a1 -0[[:lower:]]1 &i 0A1 0A1 -a[^b]c &i abc -a[^b]c &i aBc -a[^b]c &i adc adc -[a]b[c] - abc abc -[a]b[a] - aba aba -[abc]b[abc] - abc abc -[abc]b[abd] - abd abd -a(b?c)+d - accd accd -(wee|week)(knights|night) - weeknights weeknights -(we|wee|week|frob)(knights|night|day) - weeknights weeknights -a[bc]d - xyzaaabcaababdacd abd -a[ab]c - aaabc abc -abc s abc abc -a* & b @b - -# Let's have some fun -- try to match a C comment. -# first the obvious, which looks okay at first glance... -/\*.*\*/ - /*x*/ /*x*/ -# but... -/\*.*\*/ - /*x*/y/*z*/ /*x*/y/*z*/ -# okay, we must not match */ inside; try to do that... -/\*([^*]|\*[^/])*\*/ - /*x*/ /*x*/ -/\*([^*]|\*[^/])*\*/ - /*x*/y/*z*/ /*x*/ -# but... -/\*([^*]|\*[^/])*\*/ - /*x**/y/*z*/ /*x**/y/*z*/ -# and a still fancier version, which does it right (I think)... -/\*([^*]|\*+[^*/])*\*+/ - /*x*/ /*x*/ -/\*([^*]|\*+[^*/])*\*+/ - /*x*/y/*z*/ /*x*/ -/\*([^*]|\*+[^*/])*\*+/ - /*x**/y/*z*/ /*x**/ -/\*([^*]|\*+[^*/])*\*+/ - /*x****/y/*z*/ /*x****/ -/\*([^*]|\*+[^*/])*\*+/ - /*x**x*/y/*z*/ /*x**x*/ -/\*([^*]|\*+[^*/])*\*+/ - /*x***x/y/*z*/ /*x***x/y/*z*/ - -# subexpressions -.* - abc abc - -a(b)(c)d - abcd abcd b,c -a(((b)))c - abc abc b,b,b -a(b|(c))d - abd abd b,- -a(b*|c|e)d - abbd abbd bb -a(b*|c|e)d - acd acd c -a(b*|c|e)d - ad ad @d -a(b?)c - abc abc b -a(b?)c - ac ac @c -a(b+)c - abc abc b -a(b+)c - abbbc abbbc bbb -a(b*)c - ac ac @c -(a|ab)(bc([de]+)f|cde) - abcdef abcdef a,bcdef,de -# the regression tester only asks for 9 subexpressions -a(b)(c)(d)(e)(f)(g)(h)(i)(j)k - abcdefghijk abcdefghijk b,c,d,e,f,g,h,i,j -a(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)l - abcdefghijkl abcdefghijkl b,c,d,e,f,g,h,i,j,k -a([bc]?)c - abc abc b -a([bc]?)c - ac ac @c -a([bc]+)c - abc abc b -a([bc]+)c - abcc abcc bc -a([bc]+)bc - abcbc abcbc bc -a(bb+|b)b - abb abb b -a(bbb+|bb+|b)b - abb abb b -a(bbb+|bb+|b)b - abbb abbb bb -a(bbb+|bb+|b)bb - abbb abbb b -(.*).* - abcdef abcdef abcdef -(a*)* - bc @b @b - -# do we get the right subexpression when it is used more than once? -a(b|c)*d - ad ad - -a(b|c)*d - abcd abcd c -a(b|c)+d - abd abd b -a(b|c)+d - abcd abcd c -a(b|c?)+d - ad ad @d -a(b|c?)+d - abcd abcd @d -a(b|c){0,0}d - ad ad - -a(b|c){0,1}d - ad ad - -a(b|c){0,1}d - abd abd b -a(b|c){0,2}d - ad ad - -a(b|c){0,2}d - abcd abcd c -a(b|c){0,}d - ad ad - -a(b|c){0,}d - abcd abcd c -a(b|c){1,1}d - abd abd b -a(b|c){1,1}d - acd acd c -a(b|c){1,2}d - abd abd b -a(b|c){1,2}d - abcd abcd c -a(b|c){1,}d - abd abd b -a(b|c){1,}d - abcd abcd c -a(b|c){2,2}d - acbd acbd b -a(b|c){2,2}d - abcd abcd c -a(b|c){2,4}d - abcd abcd c -a(b|c){2,4}d - abcbd abcbd b -a(b|c){2,4}d - abcbcd abcbcd c -a(b|c){2,}d - abcd abcd c -a(b|c){2,}d - abcbd abcbd b -a(b+|((c)*))+d - abd abd @d,@d,- -a(b+|((c)*))+d - abcd abcd @d,@d,- - -# check out the STARTEND option -[abc] &# a(b)c b -[abc] &# a(d)c -[abc] &# a(bc)d b -[abc] &# a(dc)d c -. &# a()c -b.*c &# b(bc)c bc -b.* &# b(bc)c bc -.*c &# b(bc)c bc - -# plain strings, with the NOSPEC flag -abc m abc abc -abc m xabcy abc -abc m xyz -a*b m aba*b a*b -a*b m ab -"" mC EMPTY - -# cases involving NULs -aZb & a a -aZb &p a -aZb &p# (aZb) aZb -aZ*b &p# (ab) ab -a.b &# (aZb) aZb -a.* &# (aZb)c aZb - -# word boundaries (ick) -[[:<:]]a & a a -[[:<:]]a & ba -[[:<:]]a & -a a -a[[:>:]] & a a -a[[:>:]] & ab -a[[:>:]] & a- a -[[:<:]]a.c[[:>:]] & axcd-dayc-dazce-abc abc -[[:<:]]a.c[[:>:]] & axcd-dayc-dazce-abc-q abc -[[:<:]]a.c[[:>:]] & axc-dayc-dazce-abc axc -[[:<:]]b.c[[:>:]] & a_bxc-byc_d-bzc-q bzc -[[:<:]].x..[[:>:]] & y_xa_-_xb_y-_xc_-axdc _xc_ -[[:<:]]a_b[[:>:]] & x_a_b - -# past problems, and suspected problems -(A[1])|(A[2])|(A[3])|(A[4])|(A[5])|(A[6])|(A[7])|(A[8])|(A[9])|(A[A]) - A1 A1 -abcdefghijklmnop i abcdefghijklmnop abcdefghijklmnop -abcdefghijklmnopqrstuv i abcdefghijklmnopqrstuv abcdefghijklmnopqrstuv -(ALAK)|(ALT[AB])|(CC[123]1)|(CM[123]1)|(GAMC)|(LC[23][EO ])|(SEM[1234])|(SL[ES][12])|(SLWW)|(SLF )|(SLDT)|(VWH[12])|(WH[34][EW])|(WP1[ESN]) - CC11 CC11 -CC[13]1|a{21}[23][EO][123][Es][12]a{15}aa[34][EW]aaaaaaa[X]a - CC11 CC11 -Char \([a-z0-9_]*\)\[.* b Char xyz[k Char xyz[k xyz -a?b - ab ab --\{0,1\}[0-9]*$ b -5 -5 -a*a*a*a*a*a*a* & aaaaaa aaaaaa diff --git a/winsup/cygwin/regex/utils.h b/winsup/cygwin/regex/utils.h deleted file mode 100644 index 1a997ac8f..000000000 --- a/winsup/cygwin/regex/utils.h +++ /dev/null @@ -1,22 +0,0 @@ -/* utility definitions */ -#ifdef _POSIX2_RE_DUP_MAX -#define DUPMAX _POSIX2_RE_DUP_MAX -#else -#define DUPMAX 255 -#endif -#define INFINITY (DUPMAX + 1) -#define NC (CHAR_MAX - CHAR_MIN + 1) -typedef unsigned char uch; - -/* switch off assertions (if not already off) if no REDEBUG */ -#ifndef REDEBUG -#ifndef NDEBUG -#define NDEBUG /* no assertions please */ -#endif -#endif -#include - -/* for old systems with bcopy() but no memmove() */ -#ifdef USEBCOPY -#define memmove(d, s, c) bcopy(s, d, c) -#endif diff --git a/winsup/cygwin/regexp/COPYRIGHT b/winsup/cygwin/regexp/COPYRIGHT deleted file mode 100644 index 48b3f4339..000000000 --- a/winsup/cygwin/regexp/COPYRIGHT +++ /dev/null @@ -1,22 +0,0 @@ -This entire subtree is copyright the University of Toronto. -The following copyright notice applies to all files found here. None of -these files contain AT&T proprietary source code. -_____________________________________________________________________________ - - Copyright (c) 1986 by University of Toronto. - Written by Henry Spencer. Not derived from licensed software. - - Permission is granted to anyone to use this software for any - purpose on any computer system, and to redistribute it freely, - subject to the following restrictions: - - 1. The author is not responsible for the consequences of use of - this software, no matter how awful, even if they arise - from defects in it. - - 2. The origin of this software must not be misrepresented, either - by explicit claim or by omission. - - 3. Altered versions must be plainly marked as such, and must not - be misrepresented as being the original software. - diff --git a/winsup/cygwin/regexp/README b/winsup/cygwin/regexp/README deleted file mode 100644 index 37d6f51c7..000000000 --- a/winsup/cygwin/regexp/README +++ /dev/null @@ -1,84 +0,0 @@ -This is a nearly-public-domain reimplementation of the V8 regexp(3) package. -It gives C programs the ability to use egrep-style regular expressions, and -does it in a much cleaner fashion than the analogous routines in SysV. - - Copyright (c) 1986 by University of Toronto. - Written by Henry Spencer. Not derived from licensed software. - - Permission is granted to anyone to use this software for any - purpose on any computer system, and to redistribute it freely, - subject to the following restrictions: - - 1. The author is not responsible for the consequences of use of - this software, no matter how awful, even if they arise - from defects in it. - - 2. The origin of this software must not be misrepresented, either - by explicit claim or by omission. - - 3. Altered versions must be plainly marked as such, and must not - be misrepresented as being the original software. - -Barring a couple of small items in the BUGS list, this implementation is -believed 100% compatible with V8. It should even be binary-compatible, -sort of, since the only fields in a "struct regexp" that other people have -any business touching are declared in exactly the same way at the same -location in the struct (the beginning). - -This implementation is *NOT* AT&T/Bell code, and is not derived from licensed -software. Even though U of T is a V8 licensee. This software is based on -a V8 manual page sent to me by Dennis Ritchie (the manual page enclosed -here is a complete rewrite and hence is not covered by AT&T copyright). -The software was nearly complete at the time of arrival of our V8 tape. -I haven't even looked at V8 yet, although a friend elsewhere at U of T has -been kind enough to run a few test programs using the V8 regexp(3) to resolve -a few fine points. I admit to some familiarity with regular-expression -implementations of the past, but the only one that this code traces any -ancestry to is the one published in Kernighan & Plauger (from which this -one draws ideas but not code). - -Simplistically: put this stuff into a source directory, copy regexp.h into -/usr/include, inspect Makefile for compilation options that need changing -to suit your local environment, and then do "make r". This compiles the -regexp(3) functions, compiles a test program, and runs a large set of -regression tests. If there are no complaints, then put regexp.o, regsub.o, -and regerror.o into your C library, and regexp.3 into your manual-pages -directory. - -Note that if you don't put regexp.h into /usr/include *before* compiling, -you'll have to add "-I." to CFLAGS before compiling. - -The files are: - -Makefile instructions to make everything -regexp.3 manual page -regexp.h header file, for /usr/include -regexp.c source for regcomp() and regexec() -regsub.c source for regsub() -regerror.c source for default regerror() -regmagic.h internal header file -try.c source for test program -timer.c source for timing program -tests test list for try and timer - -This implementation uses nondeterministic automata rather than the -deterministic ones found in some other implementations, which makes it -simpler, smaller, and faster at compiling regular expressions, but slower -at executing them. In theory, anyway. This implementation does employ -some special-case optimizations to make the simpler cases (which do make -up the bulk of regular expressions actually used) run quickly. In general, -if you want blazing speed you're in the wrong place. Replacing the insides -of egrep with this stuff is probably a mistake; if you want your own egrep -you're going to have to do a lot more work. But if you want to use regular -expressions a little bit in something else, you're in luck. Note that many -existing text editors use nondeterministic regular-expression implementations, -so you're in good company. - -This stuff should be pretty portable, given appropriate option settings. -If your chars have less than 8 bits, you're going to have to change the -internal representation of the automaton, although knowledge of the details -of this is fairly localized. There are no "reserved" char values except for -NUL, and no special significance is attached to the top bit of chars. -The string(3) functions are used a fair bit, on the grounds that they are -probably faster than coding the operations in line. Some attempts at code -tuning have been made, but this is invariably a bit machine-specific. diff --git a/winsup/cygwin/regexp/regexp.h b/winsup/cygwin/regexp/regexp.h deleted file mode 100644 index 0850d70a4..000000000 --- a/winsup/cygwin/regexp/regexp.h +++ /dev/null @@ -1,34 +0,0 @@ -/* regexp.h - - Copyright 1996, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* - * Definitions etc. for regexp(3) routines. - * - * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof], - * not the System V one. - * - * $Id$ - */ - -#define NSUBEXP 10 -typedef struct regexp { - char *startp[NSUBEXP]; - char *endp[NSUBEXP]; - char regstart; /* Internal use only. */ - char reganch; /* Internal use only. */ - char *regmust; /* Internal use only. */ - int regmlen; /* Internal use only. */ - char program[1]; /* Unwarranted chumminess with compiler. */ -} regexp; - -extern regexp *regcomp(); -extern int regexec(); -extern void regsub(); -extern void regerror(); diff --git a/winsup/cygwin/regexp/regmagic.h b/winsup/cygwin/regexp/regmagic.h deleted file mode 100644 index ea7835711..000000000 --- a/winsup/cygwin/regexp/regmagic.h +++ /dev/null @@ -1,17 +0,0 @@ -/* regmagic.h - - Copyright 1996, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* $Id$ */ - -/* - * The first byte of the regexp internal "program" is actually this magic - * number; the start node begins in the second byte. - */ -#define MAGIC 0234 diff --git a/winsup/cygwin/regexp/v8_regerror.c b/winsup/cygwin/regexp/v8_regerror.c deleted file mode 100644 index 56d63ff2f..000000000 --- a/winsup/cygwin/regexp/v8_regerror.c +++ /dev/null @@ -1,28 +0,0 @@ -/* regerror.c - - Copyright 1996, 1998, 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include "regexp.h" -#include - -void __declspec(dllexport) -regerror(const char *s __attribute__ ((unused))) -{ -#ifdef ERRAVAIL - error("regexp: %s", s); -#else -/* - fprintf(stderr, "regexp(3): %s\n", s); - exit(1); -*/ - return; /* let std. egrep handle errors */ -#endif - /* NOTREACHED */ -} diff --git a/winsup/cygwin/regexp/v8_regexp.c b/winsup/cygwin/regexp/v8_regexp.c deleted file mode 100644 index fef1267a0..000000000 --- a/winsup/cygwin/regexp/v8_regexp.c +++ /dev/null @@ -1,1321 +0,0 @@ -/* - * regcomp and regexec -- regsub and regerror are elsewhere - * - * Copyright (c) 1986 by University of Toronto. - * Written by Henry Spencer. Not derived from licensed software. - * - * Permission is granted to anyone to use this software for any - * purpose on any computer system, and to redistribute it freely, - * subject to the following restrictions: - * - * 1. The author is not responsible for the consequences of use of - * this software, no matter how awful, even if they arise - * from defects in it. - * - * 2. The origin of this software must not be misrepresented, either - * by explicit claim or by omission. - * - * 3. Altered versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - *** THIS IS AN ALTERED VERSION. It was altered by John Gilmore, - *** hoptoad!gnu, on 27 Dec 1986, to add \n as an alternative to | - *** to assist in implementing egrep. - *** THIS IS AN ALTERED VERSION. It was altered by John Gilmore, - *** hoptoad!gnu, on 27 Dec 1986, to add \< and \> for word-matching - *** as in BSD grep and ex. - *** THIS IS AN ALTERED VERSION. It was altered by John Gilmore, - *** hoptoad!gnu, on 28 Dec 1986, to optimize characters quoted with \. - *** THIS IS AN ALTERED VERSION. It was altered by James A. Woods, - *** ames!jaw, on 19 June 1987, to quash a regcomp() redundancy. - *** THIS IS AN ALTERED VERSION. It was altered by Geoffrey Noer, - *** noer@cygnus.com, on 6 Oct 1997, to change the prototype format - *** for inclusion in the Cygwin32 library. - * - * Beware that some of this code is subtly aware of the way operator - * precedence is structured in regular expressions. Serious changes in - * regular-expression syntax might require a total rethink. - */ - -#include "winsup.h" -#include "regexp.h" -#include -#include -#include -#include -#include "regmagic.h" - -/* - * The "internal use only" fields in regexp.h are present to pass info from - * compile to execute that permits the execute phase to run lots faster on - * simple cases. They are: - * - * regstart char that must begin a match; '\0' if none obvious - * reganch is the match anchored (at beginning-of-line only)? - * regmust string (pointer into program) that match must include, or NULL - * regmlen length of regmust string - * - * Regstart and reganch permit very fast decisions on suitable starting points - * for a match, cutting down the work a lot. Regmust permits fast rejection - * of lines that cannot possibly match. The regmust tests are costly enough - * that regcomp() supplies a regmust only if the r.e. contains something - * potentially expensive (at present, the only such thing detected is * or + - * at the start of the r.e., which can involve a lot of backup). Regmlen is - * supplied because the test in regexec() needs it and regcomp() is computing - * it anyway. - */ - -/* - * Structure for regexp "program". This is essentially a linear encoding - * of a nondeterministic finite-state machine (aka syntax charts or - * "railroad normal form" in parsing technology). Each node is an opcode - * plus a "next" pointer, possibly plus an operand. "Next" pointers of - * all nodes except BRANCH implement concatenation; a "next" pointer with - * a BRANCH on both ends of it is connecting two alternatives. (Here we - * have one of the subtle syntax dependencies: an individual BRANCH (as - * opposed to a collection of them) is never concatenated with anything - * because of operator precedence.) The operand of some types of node is - * a literal string; for others, it is a node leading into a sub-FSM. In - * particular, the operand of a BRANCH node is the first node of the branch. - * (NB this is *not* a tree structure: the tail of the branch connects - * to the thing following the set of BRANCHes.) The opcodes are: - */ - -/* definition number opnd? meaning */ -#define END 0 /* no End of program. */ -#define BOL 1 /* no Match "" at beginning of line. */ -#define EOL 2 /* no Match "" at end of line. */ -#define ANY 3 /* no Match any one character. */ -#define ANYOF 4 /* str Match any character in this string. */ -#define ANYBUT 5 /* str Match any character not in this string. */ -#define BRANCH 6 /* node Match this alternative, or the next... */ -#define BACK 7 /* no Match "", "next" ptr points backward. */ -#define EXACTLY 8 /* str Match this string. */ -#define NOTHING 9 /* no Match empty string. */ -#define STAR 10 /* node Match this (simple) thing 0 or more times. */ -#define PLUS 11 /* node Match this (simple) thing 1 or more times. */ -#define WORDA 12 /* no Match "" at wordchar, where prev is nonword */ -#define WORDZ 13 /* no Match "" at nonwordchar, where prev is word */ -#define OPEN 20 /* no Mark this point in input as start of #n. */ - /* OPEN+1 is number 1, etc. */ -#define CLOSE 30 /* no Analogous to OPEN. */ - -/* - * Opcode notes: - * - * BRANCH The set of branches constituting a single choice are hooked - * together with their "next" pointers, since precedence prevents - * anything being concatenated to any individual branch. The - * "next" pointer of the last BRANCH in a choice points to the - * thing following the whole choice. This is also where the - * final "next" pointer of each individual branch points; each - * branch starts with the operand node of a BRANCH node. - * - * BACK Normal "next" pointers all implicitly point forward; BACK - * exists to make loop structures possible. - * - * STAR,PLUS '?', and complex '*' and '+', are implemented as circular - * BRANCH structures using BACK. Simple cases (one character - * per match) are implemented with STAR and PLUS for speed - * and to minimize recursive plunges. - * - * OPEN,CLOSE ...are numbered at compile time. - */ - -/* - * A node is one char of opcode followed by two chars of "next" pointer. - * "Next" pointers are stored as two 8-bit pieces, high order first. The - * value is a positive offset from the opcode of the node containing it. - * An operand, if any, simply follows the node. (Note that much of the - * code generation knows about this implicit relationship.) - * - * Using two bytes for the "next" pointer is vast overkill for most things, - * but allows patterns to get big without disasters. - */ -#define OP(p) (*(p)) -#define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377)) -#define OPERAND(p) ((p) + 3) - -/* - * See regmagic.h for one further detail of program structure. - */ - - -/* - * Utility definitions. - */ -#ifndef CHARBITS -#define UCHARAT(p) ((int)*(unsigned char *)(p)) -#else -#define UCHARAT(p) ((int)*(p)&CHARBITS) -#endif - -#define FAIL(m) { regerror(m); return(NULL); } -#define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?') - -/* - * Flags to be passed up and down. - */ -#define HASWIDTH 01 /* Known never to match null string. */ -#define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */ -#define SPSTART 04 /* Starts with * or +. */ -#define WORST 0 /* Worst case. */ - -/* - * Global work variables for regcomp(). - */ -static char *regparse; /* Input-scan pointer. */ -static int regnpar; /* () count. */ -static char regdummy; -static char *regcode; /* Code-emit pointer; ®dummy = don't. */ -static long regsize; /* Code size. */ - -/* - * Forward declarations for regcomp()'s friends. - */ -#ifndef STATIC -#define STATIC static -#endif -STATIC char *reg (int, int *); -STATIC char *regbranch (int *); -STATIC char *regpiece (int *); -STATIC char *regatom (int *); -STATIC char *regnode (char); -STATIC char *regnext (char *); -STATIC void regc (char); -STATIC void reginsert (char, char *); -STATIC void regtail (char *, char *); -STATIC void regoptail (char *, char *); -#ifdef STRCSPN -STATIC int strcspn (char *, char *); -#endif - -/* - - regcomp - compile a regular expression into internal code - * - * We can't allocate space until we know how big the compiled form will be, - * but we can't compile it (and thus know how big it is) until we've got a - * place to put the code. So we cheat: we compile it twice, once with code - * generation turned off and size counting turned on, and once "for real". - * This also means that we don't allocate space until we are sure that the - * thing really will compile successfully, and we never have to move the - * code and thus invalidate pointers into it. (Note that it has to be in - * one piece because free() must be able to free it all.) - * - * Beware that the optimization-preparation code in here knows about some - * of the structure of the compiled regexp. - */ -regexp * __declspec(dllexport) -regcomp(exp) -const char *exp; -{ - register regexp *r; - register char *scan; - register char *longest; - register int len; - int flags; - - if (exp == NULL) - FAIL("NULL argument"); - - /* First pass: determine size, legality. */ -#ifdef notdef - if (exp[0] == '.' && exp[1] == '*') exp += 2; /* aid grep */ -#endif - regparse = (char *)exp; - regnpar = 1; - regsize = 0L; - regcode = ®dummy; - regc(MAGIC); - if (reg(0, &flags) == NULL) - return(NULL); - - /* Small enough for pointer-storage convention? */ - if (regsize >= 32767L) /* Probably could be 65535L. */ - FAIL("regexp too big"); - - /* Allocate space. */ - r = (regexp *)malloc(sizeof(regexp) + (unsigned)regsize); - if (r == NULL) - FAIL("out of space"); - - /* Second pass: emit code. */ - regparse = (char *)exp; - regnpar = 1; - regcode = r->program; - regc(MAGIC); - if (reg(0, &flags) == NULL) - return(NULL); - - /* Dig out information for optimizations. */ - r->regstart = '\0'; /* Worst-case defaults. */ - r->reganch = 0; - r->regmust = NULL; - r->regmlen = 0; - scan = r->program+1; /* First BRANCH. */ - if (OP(regnext(scan)) == END) { /* Only one top-level choice. */ - scan = OPERAND(scan); - - /* Starting-point info. */ - if (OP(scan) == EXACTLY) - r->regstart = *OPERAND(scan); - else if (OP(scan) == BOL) - r->reganch++; - - /* - * If there's something expensive in the r.e., find the - * longest literal string that must appear and make it the - * regmust. Resolve ties in favor of later strings, since - * the regstart check works with the beginning of the r.e. - * and avoiding duplication strengthens checking. Not a - * strong reason, but sufficient in the absence of others. - */ - if (flags&SPSTART) { - longest = NULL; - len = 0; - for (; scan != NULL; scan = regnext(scan)) - if (OP(scan) == EXACTLY && (int) strlen(OPERAND(scan)) >= len) { - longest = OPERAND(scan); - len = strlen(OPERAND(scan)); - } - r->regmust = longest; - r->regmlen = len; - } - } - - return(r); -} - -/* - - reg - regular expression, i.e. main body or parenthesized thing - * - * Caller must absorb opening parenthesis. - * - * Combining parenthesis handling with the base level of regular expression - * is a trifle forced, but the need to tie the tails of the branches to what - * follows makes it hard to avoid. - */ -static char * -reg(paren, flagp) -int paren; /* Parenthesized? */ -int *flagp; -{ - register char *ret; - register char *br; - register char *ender; - register int parno = 0; - int flags; - - *flagp = HASWIDTH; /* Tentatively. */ - - /* Make an OPEN node, if parenthesized. */ - if (paren) { - if (regnpar >= NSUBEXP) - FAIL("too many ()"); - parno = regnpar; - regnpar++; - ret = regnode(OPEN+parno); - } else - ret = NULL; - - /* Pick up the branches, linking them together. */ - br = regbranch(&flags); - if (br == NULL) - return(NULL); - if (ret != NULL) - regtail(ret, br); /* OPEN -> first. */ - else - ret = br; - if (!(flags&HASWIDTH)) - *flagp &= ~HASWIDTH; - *flagp |= flags&SPSTART; - while (*regparse == '|' || *regparse == '\n') { - regparse++; - br = regbranch(&flags); - if (br == NULL) - return(NULL); - regtail(ret, br); /* BRANCH -> BRANCH. */ - if (!(flags&HASWIDTH)) - *flagp &= ~HASWIDTH; - *flagp |= flags&SPSTART; - } - - /* Make a closing node, and hook it on the end. */ - ender = regnode((paren) ? CLOSE+parno : END); - regtail(ret, ender); - - /* Hook the tails of the branches to the closing node. */ - for (br = ret; br != NULL; br = regnext(br)) - regoptail(br, ender); - - /* Check for proper termination. */ - if (paren && *regparse++ != ')') { - FAIL("unmatched ()"); - } else if (!paren && *regparse != '\0') { - if (*regparse == ')') { - FAIL("unmatched ()"); - } else - FAIL("junk on end"); /* "Can't happen". */ - /* NOTREACHED */ - } - - return(ret); -} - -/* - - regbranch - one alternative of an | operator - * - * Implements the concatenation operator. - */ -static char * -regbranch(flagp) -int *flagp; -{ - register char *ret; - register char *chain; - register char *latest; - int flags; - - *flagp = WORST; /* Tentatively. */ - - ret = regnode(BRANCH); - chain = NULL; - while (*regparse != '\0' && *regparse != ')' && - *regparse != '\n' && *regparse != '|') { - latest = regpiece(&flags); - if (latest == NULL) - return(NULL); - *flagp |= flags&HASWIDTH; - if (chain == NULL) /* First piece. */ - *flagp |= flags&SPSTART; - else - regtail(chain, latest); - chain = latest; - } - if (chain == NULL) /* Loop ran zero times. */ - (void) regnode(NOTHING); - - return(ret); -} - -/* - - regpiece - something followed by possible [*+?] - * - * Note that the branching code sequences used for ? and the general cases - * of * and + are somewhat optimized: they use the same NOTHING node as - * both the endmarker for their branch list and the body of the last branch. - * It might seem that this node could be dispensed with entirely, but the - * endmarker role is not redundant. - */ -static char * -regpiece(flagp) -int *flagp; -{ - register char *ret; - register char op; - register char *next; - int flags; - - ret = regatom(&flags); - if (ret == NULL) - return(NULL); - - op = *regparse; - if (!ISMULT(op)) { - *flagp = flags; - return(ret); - } - - if (!(flags&HASWIDTH) && op != '?') - FAIL("*+ operand could be empty"); - *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH); - - if (op == '*' && (flags&SIMPLE)) - reginsert(STAR, ret); - else if (op == '*') { - /* Emit x* as (x&|), where & means "self". */ - reginsert(BRANCH, ret); /* Either x */ - regoptail(ret, regnode(BACK)); /* and loop */ - regoptail(ret, ret); /* back */ - regtail(ret, regnode(BRANCH)); /* or */ - regtail(ret, regnode(NOTHING)); /* null. */ - } else if (op == '+' && (flags&SIMPLE)) - reginsert(PLUS, ret); - else if (op == '+') { - /* Emit x+ as x(&|), where & means "self". */ - next = regnode(BRANCH); /* Either */ - regtail(ret, next); - regtail(regnode(BACK), ret); /* loop back */ - regtail(next, regnode(BRANCH)); /* or */ - regtail(ret, regnode(NOTHING)); /* null. */ - } else if (op == '?') { - /* Emit x? as (x|) */ - reginsert(BRANCH, ret); /* Either x */ - regtail(ret, regnode(BRANCH)); /* or */ - next = regnode(NOTHING); /* null. */ - regtail(ret, next); - regoptail(ret, next); - } - regparse++; - if (ISMULT(*regparse)) - FAIL("nested *?+"); - - return(ret); -} - -/* - - regatom - the lowest level - * - * Optimization: gobbles an entire sequence of ordinary characters so that - * it can turn them into a single node, which is smaller to store and - * faster to run. Backslashed characters are exceptions, each becoming a - * separate node; the code is simpler that way and it's not worth fixing. - */ -static char * -regatom(flagp) -int *flagp; -{ - register char *ret; - int flags; - - *flagp = WORST; /* Tentatively. */ - - switch (*regparse++) { - /* FIXME: these chars only have meaning at beg/end of pat? */ - case '^': - ret = regnode(BOL); - break; - case '$': - ret = regnode(EOL); - break; - case '.': - ret = regnode(ANY); - *flagp |= HASWIDTH|SIMPLE; - break; - case '[': { - register int class; - register int classend; - - if (*regparse == '^') { /* Complement of range. */ - ret = regnode(ANYBUT); - regparse++; - } else - ret = regnode(ANYOF); - if (*regparse == ']' || *regparse == '-') - regc(*regparse++); - while (*regparse != '\0' && *regparse != ']') { - if (*regparse == '-') { - regparse++; - if (*regparse == ']' || *regparse == '\0') - regc('-'); - else { - class = UCHARAT(regparse-2)+1; - classend = UCHARAT(regparse); - if (class > classend+1) - FAIL("invalid [] range"); - for (; class <= classend; class++) - regc(class); - regparse++; - } - } else - regc(*regparse++); - } - regc('\0'); - if (*regparse != ']') - FAIL("unmatched []"); - regparse++; - *flagp |= HASWIDTH|SIMPLE; - } - break; - case '(': - ret = reg(1, &flags); - if (ret == NULL) - return(NULL); - *flagp |= flags&(HASWIDTH|SPSTART); - break; - case '\0': - case '|': - case '\n': - case ')': - FAIL("internal urp"); /* Supposed to be caught earlier. */ - break; - case '?': - case '+': - case '*': - FAIL("?+* follows nothing"); - break; - case '\\': - switch (*regparse++) { - case '\0': - FAIL("trailing \\"); - break; - case '<': - ret = regnode(WORDA); - break; - case '>': - ret = regnode(WORDZ); - break; - /* FIXME: Someday handle \1, \2, ... */ - default: - /* Handle general quoted chars in exact-match routine */ - goto de_fault; - } - break; - de_fault: - default: - /* - * Encode a string of characters to be matched exactly. - * - * This is a bit tricky due to quoted chars and due to - * '*', '+', and '?' taking the SINGLE char previous - * as their operand. - * - * On entry, the char at regparse[-1] is going to go - * into the string, no matter what it is. (It could be - * following a \ if we are entered from the '\' case.) - * - * Basic idea is to pick up a good char in ch and - * examine the next char. If it's *+? then we twiddle. - * If it's \ then we frozzle. If it's other magic char - * we push ch and terminate the string. If none of the - * above, we push ch on the string and go around again. - * - * regprev is used to remember where "the current char" - * starts in the string, if due to a *+? we need to back - * up and put the current char in a separate, 1-char, string. - * When regprev is NULL, ch is the only char in the - * string; this is used in *+? handling, and in setting - * flags |= SIMPLE at the end. - */ - { - char *regprev; - register char ch = 0; - - regparse--; /* Look at cur char */ - ret = regnode(EXACTLY); - for ( regprev = 0 ; ; ) { - ch = *regparse++; /* Get current char */ - switch (*regparse) { /* look at next one */ - - default: - regc(ch); /* Add cur to string */ - break; - - case '.': case '[': case '(': - case ')': case '|': case '\n': - case '$': case '^': - case '\0': - /* FIXME, $ and ^ should not always be magic */ - magic: - regc(ch); /* dump cur char */ - goto done; /* and we are done */ - - case '?': case '+': case '*': - if (!regprev) /* If just ch in str, */ - goto magic; /* use it */ - /* End mult-char string one early */ - regparse = regprev; /* Back up parse */ - goto done; - - case '\\': - regc(ch); /* Cur char OK */ - switch (regparse[1]){ /* Look after \ */ - case '\0': - case '<': - case '>': - /* FIXME: Someday handle \1, \2, ... */ - goto done; /* Not quoted */ - default: - /* Backup point is \, scan * point is after it. */ - regprev = regparse; - regparse++; - continue; /* NOT break; */ - } - } - regprev = regparse; /* Set backup point */ - } - done: - regc('\0'); - *flagp |= HASWIDTH; - if (!regprev) /* One char? */ - *flagp |= SIMPLE; - } - break; - } - - return(ret); -} - -/* - - regnode - emit a node - */ -static char * /* Location. */ -regnode(op) -char op; -{ - register char *ret; - register char *ptr; - - ret = regcode; - if (ret == ®dummy) { - regsize += 3; - return(ret); - } - - ptr = ret; - *ptr++ = op; - *ptr++ = '\0'; /* Null "next" pointer. */ - *ptr++ = '\0'; - regcode = ptr; - - return(ret); -} - -/* - - regc - emit (if appropriate) a byte of code - */ -static void -regc(b) -char b; -{ - if (regcode != ®dummy) - *regcode++ = b; - else - regsize++; -} - -/* - - reginsert - insert an operator in front of already-emitted operand - * - * Means relocating the operand. - */ -static void -reginsert(op, opnd) -char op; -char *opnd; -{ - register char *src; - register char *dst; - register char *place; - - if (regcode == ®dummy) { - regsize += 3; - return; - } - - src = regcode; - regcode += 3; - dst = regcode; - while (src > opnd) - *--dst = *--src; - - place = opnd; /* Op node, where operand used to be. */ - *place++ = op; - *place++ = '\0'; - *place++ = '\0'; -} - -/* - - regtail - set the next-pointer at the end of a node chain - */ -static void -regtail(p, val) -char *p; -char *val; -{ - register char *scan; - register char *temp; - register int offset; - - if (p == ®dummy) - return; - - /* Find last node. */ - scan = p; - for (;;) { - temp = regnext(scan); - if (temp == NULL) - break; - scan = temp; - } - - if (OP(scan) == BACK) - offset = scan - val; - else - offset = val - scan; - *(scan+1) = (offset>>8)&0377; - *(scan+2) = offset&0377; -} - -/* - - regoptail - regtail on operand of first argument; nop if operandless - */ -static void -regoptail(p, val) -char *p; -char *val; -{ - /* "Operandless" and "op != BRANCH" are synonymous in practice. */ - if (p == NULL || p == ®dummy || OP(p) != BRANCH) - return; - regtail(OPERAND(p), val); -} - -/* - * regexec and friends - */ - -/* - * Global work variables for regexec(). - */ -static char *reginput; /* String-input pointer. */ -static char *regbol; /* Beginning of input, for ^ check. */ -static char **regstartp; /* Pointer to startp array. */ -static char **regendp; /* Ditto for endp. */ - -/* - * Forwards. - */ -STATIC int regtry (const regexp *, const char *); -STATIC int regmatch (char *); -STATIC int regrepeat (char *); - -#ifdef DEBUG -int regnarrate = 0; -void regdump __P((regexp *)); -STATIC char *regprop __P((char *)); -#endif - -/* - - regexec - match a regexp against a string - */ -int __declspec(dllexport) -regexec(prog, string) -register const regexp *prog; -register const char *string; -{ - register char *s; - - /* Be paranoid... */ - if (prog == NULL || string == NULL) { - regerror("NULL parameter"); - return(0); - } - - /* Check validity of program. */ - if (UCHARAT(prog->program) != MAGIC) { - regerror("corrupted program"); - return(0); - } - - /* If there is a "must appear" string, look for it. */ - if (prog->regmust != NULL) { - s = (char *)string; - while ((s = strchr(s, prog->regmust[0])) != NULL) { - if (strncmp(s, prog->regmust, prog->regmlen) == 0) - break; /* Found it. */ - s++; - } - if (s == NULL) /* Not present. */ - return(0); - } - - /* Mark beginning of line for ^ . */ - regbol = (char *)string; - - /* Simplest case: anchored match need be tried only once. */ - if (prog->reganch) - return(regtry(prog, string)); - - /* Messy cases: unanchored match. */ - s = (char *)string; - if (prog->regstart != '\0') - /* We know what char it must start with. */ - while ((s = strchr(s, prog->regstart)) != NULL) { - if (regtry(prog, s)) - return(1); - s++; - } - else - /* We don't -- general case. */ - do { - if (regtry(prog, s)) - return(1); - } while (*s++ != '\0'); - - /* Failure. */ - return(0); -} - -/* - - regtry - try match at specific point - */ -static int /* 0 failure, 1 success */ -regtry(prog, string) -const regexp *prog; -const char *string; -{ - register int i; - register char **sp; - register char **ep; - - reginput = (char *)string; /* XXX */ - regstartp = (char **)prog->startp; /* XXX */ - regendp = (char **)prog->endp; /* XXX */ - - sp = (char **)prog->startp; /* XXX */ - ep = (char **)prog->endp; /* XXX */ - for (i = NSUBEXP; i > 0; i--) { - *sp++ = NULL; - *ep++ = NULL; - } - if (regmatch((char *)prog->program + 1)) { /* XXX */ - ((regexp *)prog)->startp[0] = (char *)string; /* XXX */ - ((regexp *)prog)->endp[0] = reginput; /* XXX */ - return(1); - } else - return(0); -} - -/* - - regmatch - main matching routine - * - * Conceptually the strategy is simple: check to see whether the current - * node matches, call self recursively to see whether the rest matches, - * and then act accordingly. In practice we make some effort to avoid - * recursion, in particular by going through "ordinary" nodes (that don't - * need to know whether the rest of the match failed) by a loop instead of - * by recursion. - */ -static int /* 0 failure, 1 success */ -regmatch(prog) -char *prog; -{ - register char *scan; /* Current node. */ - char *next; /* Next node. */ - - scan = prog; -#ifdef DEBUG - if (scan != NULL && regnarrate) - fprintf(stderr, "%s(\n", regprop(scan)); -#endif - while (scan != NULL) { -#ifdef DEBUG - if (regnarrate) - fprintf(stderr, "%s...\n", regprop(scan)); -#endif - next = regnext(scan); - - switch (OP(scan)) { - case BOL: - if (reginput != regbol) - return(0); - break; - case EOL: - if (*reginput != '\0') - return(0); - break; - case WORDA: - /* Must be looking at a letter, digit, or _ */ - if ((!isalnum(*reginput)) && *reginput != '_') - return(0); - /* Prev must be BOL or nonword */ - if (reginput > regbol && - (isalnum(reginput[-1]) || reginput[-1] == '_')) - return(0); - break; - case WORDZ: - /* Must be looking at non letter, digit, or _ */ - if (isalnum(*reginput) || *reginput == '_') - return(0); - /* We don't care what the previous char was */ - break; - case ANY: - if (*reginput == '\0') - return(0); - reginput++; - break; - case EXACTLY: { - register int len; - register char *opnd; - - opnd = OPERAND(scan); - /* Inline the first character, for speed. */ - if (*opnd != *reginput) - return(0); - len = strlen(opnd); - if (len > 1 && strncmp(opnd, reginput, len) != 0) - return(0); - reginput += len; - } - break; - case ANYOF: - if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) == NULL) - return(0); - reginput++; - break; - case ANYBUT: - if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) != NULL) - return(0); - reginput++; - break; - case NOTHING: - break; - case BACK: - break; - case OPEN+1: - case OPEN+2: - case OPEN+3: - case OPEN+4: - case OPEN+5: - case OPEN+6: - case OPEN+7: - case OPEN+8: - case OPEN+9: { - register int no; - register char *save; - - no = OP(scan) - OPEN; - save = reginput; - - if (regmatch(next)) { - /* - * Don't set startp if some later - * invocation of the same parentheses - * already has. - */ - if (regstartp[no] == NULL) - regstartp[no] = save; - return(1); - } else - return(0); - } - break; - case CLOSE+1: - case CLOSE+2: - case CLOSE+3: - case CLOSE+4: - case CLOSE+5: - case CLOSE+6: - case CLOSE+7: - case CLOSE+8: - case CLOSE+9: { - register int no; - register char *save; - - no = OP(scan) - CLOSE; - save = reginput; - - if (regmatch(next)) { - /* - * Don't set endp if some later - * invocation of the same parentheses - * already has. - */ - if (regendp[no] == NULL) - regendp[no] = save; - return(1); - } else - return(0); - } - break; - case BRANCH: { - register char *save; - - if (OP(next) != BRANCH) /* No choice. */ - next = OPERAND(scan); /* Avoid recursion. */ - else { - do { - save = reginput; - if (regmatch(OPERAND(scan))) - return(1); - reginput = save; - scan = regnext(scan); - } while (scan != NULL && OP(scan) == BRANCH); - return(0); - /* NOTREACHED */ - } - } - break; - case STAR: - case PLUS: { - register char nextch; - register int no; - register char *save; - register int min; - - /* - * Lookahead to avoid useless match attempts - * when we know what character comes next. - */ - nextch = '\0'; - if (OP(next) == EXACTLY) - nextch = *OPERAND(next); - min = (OP(scan) == STAR) ? 0 : 1; - save = reginput; - no = regrepeat(OPERAND(scan)); - while (no >= min) { - /* If it could work, try it. */ - if (nextch == '\0' || *reginput == nextch) - if (regmatch(next)) - return(1); - /* Couldn't or didn't -- back up. */ - no--; - reginput = save + no; - } - return(0); - } - break; - case END: - return(1); /* Success! */ - break; - default: - regerror("memory corruption"); - return(0); - break; - } - - scan = next; - } - - /* - * We get here only if there's trouble -- normally "case END" is - * the terminating point. - */ - regerror("corrupted pointers"); - return(0); -} - -/* - - regrepeat - repeatedly match something simple, report how many - */ -static int -regrepeat(p) -char *p; -{ - register int count = 0; - register char *scan; - register char *opnd; - - scan = reginput; - opnd = OPERAND(p); - switch (OP(p)) { - case ANY: - count = strlen(scan); - scan += count; - break; - case EXACTLY: - while (*opnd == *scan) { - count++; - scan++; - } - break; - case ANYOF: - while (*scan != '\0' && strchr(opnd, *scan) != NULL) { - count++; - scan++; - } - break; - case ANYBUT: - while (*scan != '\0' && strchr(opnd, *scan) == NULL) { - count++; - scan++; - } - break; - default: /* Oh dear. Called inappropriately. */ - regerror("internal foulup"); - count = 0; /* Best compromise. */ - break; - } - reginput = scan; - - return(count); -} - -/* - - regnext - dig the "next" pointer out of a node - */ -static char * -regnext(p) -register char *p; -{ - register int offset; - - if (p == ®dummy) - return(NULL); - - offset = NEXT(p); - if (offset == 0) - return(NULL); - - if (OP(p) == BACK) - return(p-offset); - else - return(p+offset); -} - -#ifdef DEBUG - -/* - - regdump - dump a regexp onto stdout in vaguely comprehensible form - */ -void -regdump(r) -regexp *r; -{ - register char *s; - register char op = EXACTLY; /* Arbitrary non-END op. */ - register char *next; - extern char *strchr(); - - - s = r->program + 1; - while (op != END) { /* While that wasn't END last time... */ - op = OP(s); - printf("%2d%s", s-r->program, regprop(s)); /* Where, what. */ - next = regnext(s); - if (next == NULL) /* Next ptr. */ - printf("(0)"); - else - printf("(%d)", (s-r->program)+(next-s)); - s += 3; - if (op == ANYOF || op == ANYBUT || op == EXACTLY) { - /* Literal string, where present. */ - while (*s != '\0') { - putchar(*s); - s++; - } - s++; - } - putchar('\n'); - } - - /* Header fields of interest. */ - if (r->regstart != '\0') - printf("start `%c' ", r->regstart); - if (r->reganch) - printf("anchored "); - if (r->regmust != NULL) - printf("must have \"%s\"", r->regmust); - printf("\n"); -} - -/* - - regprop - printable representation of opcode - */ -static char * -regprop(op) -char *op; -{ - register char *p; - static char buf[50]; - - (void) strcpy(buf, ":"); - - switch (OP(op)) { - case BOL: - p = "BOL"; - break; - case EOL: - p = "EOL"; - break; - case ANY: - p = "ANY"; - break; - case ANYOF: - p = "ANYOF"; - break; - case ANYBUT: - p = "ANYBUT"; - break; - case BRANCH: - p = "BRANCH"; - break; - case EXACTLY: - p = "EXACTLY"; - break; - case NOTHING: - p = "NOTHING"; - break; - case BACK: - p = "BACK"; - break; - case END: - p = "END"; - break; - case OPEN+1: - case OPEN+2: - case OPEN+3: - case OPEN+4: - case OPEN+5: - case OPEN+6: - case OPEN+7: - case OPEN+8: - case OPEN+9: - sprintf(buf+strlen(buf), "OPEN%d", OP(op)-OPEN); - p = NULL; - break; - case CLOSE+1: - case CLOSE+2: - case CLOSE+3: - case CLOSE+4: - case CLOSE+5: - case CLOSE+6: - case CLOSE+7: - case CLOSE+8: - case CLOSE+9: - sprintf(buf+strlen(buf), "CLOSE%d", OP(op)-CLOSE); - p = NULL; - break; - case STAR: - p = "STAR"; - break; - case PLUS: - p = "PLUS"; - break; - case WORDA: - p = "WORDA"; - break; - case WORDZ: - p = "WORDZ"; - break; - default: - regerror("corrupted opcode"); - break; - } - if (p != NULL) - (void) strcat(buf, p); - return(buf); -} -#endif - -/* - * The following is provided for those people who do not have strcspn() in - * their C libraries. They should get off their butts and do something - * about it; at least one public-domain implementation of those (highly - * useful) string routines has been published on Usenet. - */ -#ifdef STRCSPN -/* - * strcspn - find length of initial segment of s1 consisting entirely - * of characters not from s2 - */ - -static int -strcspn(s1, s2) -char *s1; -char *s2; -{ - register char *scan1; - register char *scan2; - register int count; - - count = 0; - for (scan1 = s1; *scan1 != '\0'; scan1++) { - for (scan2 = s2; *scan2 != '\0';) /* ++ moved down. */ - if (*scan1 == *scan2++) - return(count); - count++; - } - return(count); -} -#endif diff --git a/winsup/cygwin/regexp/v8_regsub.c b/winsup/cygwin/regexp/v8_regsub.c deleted file mode 100644 index aa95b876a..000000000 --- a/winsup/cygwin/regexp/v8_regsub.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * regsub - * - * Copyright (c) 1986 by University of Toronto. - * Written by Henry Spencer. Not derived from licensed software. - * - * Permission is granted to anyone to use this software for any - * purpose on any computer system, and to redistribute it freely, - * subject to the following restrictions: - * - * 1. The author is not responsible for the consequences of use of - * this software, no matter how awful, even if they arise - * from defects in it. - * - * 2. The origin of this software must not be misrepresented, either - * by explicit claim or by omission. - * - * 3. Altered versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - */ - -#if 0 -#ifndef lint -static char *rcsid = "$Id$"; -#endif /* not lint */ -#endif - -#include "winsup.h" -#include "regexp.h" -#include -#include -#include "regmagic.h" - -#ifndef CHARBITS -#define UCHARAT(p) ((int)*(unsigned char *)(p)) -#else -#define UCHARAT(p) ((int)*(p)&CHARBITS) -#endif - -/* - - regsub - perform substitutions after a regexp match - */ -void __declspec(dllexport) -regsub(prog, source, dest) -const regexp *prog; -const char *source; -char *dest; -{ - register char *src; - register char *dst; - register char c; - register int no; - register int len; - - if (prog == NULL || source == NULL || dest == NULL) { - regerror("NULL parm to regsub"); - return; - } - if (UCHARAT(prog->program) != MAGIC) { - regerror("damaged regexp fed to regsub"); - return; - } - - src = (char *)source; - dst = dest; - while ((c = *src++) != '\0') { - if (c == '&') - no = 0; - else if (c == '\\' && '0' <= *src && *src <= '9') - no = *src++ - '0'; - else - no = -1; - if (no < 0) { /* Ordinary character. */ - if (c == '\\' && (*src == '\\' || *src == '&')) - c = *src++; - *dst++ = c; - } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) { - len = prog->endp[no] - prog->startp[no]; - (void) strncpy(dst, prog->startp[no], len); - dst += len; - if (len != 0 && *(dst-1) == '\0') { /* strncpy hit NUL. */ - regerror("damaged match string"); - return; - } - } - } - *dst++ = '\0'; -} diff --git a/winsup/cygwin/registry.cc b/winsup/cygwin/registry.cc deleted file mode 100644 index 723a71098..000000000 --- a/winsup/cygwin/registry.cc +++ /dev/null @@ -1,264 +0,0 @@ -/* registry.cc: registry interface - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include "shared_info.h" -#include "registry.h" -#include "security.h" -#include -#include "cygerrno.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -static const char cygnus_class[] = "cygnus"; - -reg_key::reg_key (HKEY top, REGSAM access, ...): _disposition (0) -{ - va_list av; - va_start (av, access); - build_reg (top, access, av); - va_end (av); -} - -/* Opens a key under the appropriate Cygwin key. - Do not use HKCU per MS KB 199190 */ - -reg_key::reg_key (bool isHKLM, REGSAM access, ...): _disposition (0) -{ - va_list av; - HKEY top; - - if (isHKLM) - top = HKEY_LOCAL_MACHINE; - else - { - char name[128]; - const char *names[2] = {cygheap->user.get_windows_id (name), ".DEFAULT"}; - for (int i = 0; i < 2; i++) - { - key_is_invalid = RegOpenKeyEx (HKEY_USERS, names[i], 0, access, &top); - if (key_is_invalid == ERROR_SUCCESS) - goto OK; - debug_printf ("HKU\\%s failed, Win32 error %ld", names[i], key_is_invalid); - } - return; - } -OK: - new (this) reg_key (top, access, "SOFTWARE", - CYGWIN_INFO_CYGNUS_REGISTRY_NAME, - CYGWIN_INFO_CYGWIN_REGISTRY_NAME, NULL); - if (top != HKEY_LOCAL_MACHINE) - RegCloseKey (top); - if (key_is_invalid) - return; - - top = key; - va_start (av, access); - build_reg (top, access, av); - va_end (av); - if (top != key) - RegCloseKey (top); -} - -void -reg_key::build_reg (HKEY top, REGSAM access, va_list av) -{ - char *name; - HKEY r = top; - key_is_invalid = 0; - - /* FIXME: Most of the time a valid mount area should exist. Perhaps - we should just try an open of the correct key first and only resort - to this method in the unlikely situation that it's the first time - the current mount areas are being used. */ - - while ((name = va_arg (av, char *)) != NULL) - { - int res = RegCreateKeyExA (r, - name, - 0, - (char *) cygnus_class, - REG_OPTION_NON_VOLATILE, - access, - &sec_none_nih, - &key, - &_disposition); - if (r != top) - RegCloseKey (r); - r = key; - if (res != ERROR_SUCCESS) - { - key_is_invalid = res; - debug_printf ("failed to create key %s in the registry", name); - break; - } - } -} - -/* Given the current registry key, return the specific int value - requested. Return def on failure. */ - -int -reg_key::get_int (const char *name, int def) -{ - DWORD type; - DWORD dst; - DWORD size = sizeof (dst); - - if (key_is_invalid) - return def; - - LONG res = RegQueryValueExA (key, name, 0, &type, (unsigned char *) &dst, - &size); - - if (type != REG_DWORD || res != ERROR_SUCCESS) - return def; - - return dst; -} - -/* Given the current registry key, set a specific int value. */ - -int -reg_key::set_int (const char *name, int val) -{ - DWORD value = val; - if (key_is_invalid) - return key_is_invalid; - - return (int) RegSetValueExA (key, name, 0, REG_DWORD, - (unsigned char *) &value, sizeof (value)); -} - -/* Given the current registry key, return the specific string value - requested. Return zero on success, non-zero on failure. */ - -int -reg_key::get_string (const char *name, char *dst, size_t max, const char * def) -{ - DWORD size = max; - DWORD type; - LONG res; - - if (key_is_invalid) - res = key_is_invalid; - else - res = RegQueryValueExA (key, name, 0, &type, (unsigned char *) dst, &size); - - if ((def != 0) && ((type != REG_SZ) || (res != ERROR_SUCCESS))) - strcpy (dst, def); - return (int) res; -} - -/* Given the current registry key, set a specific string value. */ - -int -reg_key::set_string (const char *name, const char *src) -{ - if (key_is_invalid) - return key_is_invalid; - return (int) RegSetValueExA (key, name, 0, REG_SZ, (unsigned char*) src, - strlen (src) + 1); -} - -/* Return the handle to key. */ - -HKEY -reg_key::get_key () -{ - return key; -} - -/* Delete subkey of current key. Returns the error code from the - RegDeleteKeyA invocation. */ - -int -reg_key::kill (const char *name) -{ - if (key_is_invalid) - return key_is_invalid; - return RegDeleteKeyA (key, name); -} - -/* Delete the value specified by name of current key. Returns the error code - from the RegDeleteValueA invocation. */ - -int -reg_key::killvalue (const char *name) -{ - if (key_is_invalid) - return key_is_invalid; - return RegDeleteValueA (key, name); -} - -reg_key::~reg_key () -{ - if (!key_is_invalid) - RegCloseKey (key); - key_is_invalid = 1; -} - -char * -get_registry_hive_path (const char *name, char *path) -{ - char key[256]; - HKEY hkey; - - if (!name || !path) - return NULL; - __small_sprintf (key, "SOFTWARE\\Microsoft\\Windows%s\\CurrentVersion\\ProfileList\\", - wincap.is_winnt ()?" NT":""); - strcat (key, name); - if (!RegOpenKeyExA (HKEY_LOCAL_MACHINE, key, 0, KEY_READ, &hkey)) - { - char buf[256]; - DWORD type, siz; - - path[0] = '\0'; - if (!RegQueryValueExA (hkey, "ProfileImagePath", 0, &type, - (BYTE *)buf, (siz = sizeof (buf), &siz))) - ExpandEnvironmentStringsA (buf, path, CYG_MAX_PATH); - RegCloseKey (hkey); - if (path[0]) - return path; - } - debug_printf ("HKLM\\%s not found", key); - return NULL; -} - -void -load_registry_hive (const char * name) -{ - char path[CYG_MAX_PATH]; - HKEY hkey; - LONG ret; - - if (!name) - return; - /* Check if user hive is already loaded. */ - if (!RegOpenKeyExA (HKEY_USERS, name, 0, KEY_READ, &hkey)) - { - debug_printf ("User registry hive for %s already exists", name); - RegCloseKey (hkey); - return; - } - if (get_registry_hive_path (name, path)) - { - if (wincap.is_winnt ()) - strcat (path, "\\NTUSER.DAT"); - else - strcat (path, "\\USER.DAT"); - if ((ret = RegLoadKeyA (HKEY_USERS, name, path)) != ERROR_SUCCESS) - debug_printf ("Loading user registry hive for %s failed: %d", name, ret); - } -} - diff --git a/winsup/cygwin/registry.h b/winsup/cygwin/registry.h deleted file mode 100644 index 3d1aea65d..000000000 --- a/winsup/cygwin/registry.h +++ /dev/null @@ -1,44 +0,0 @@ -/* registry.h: shared info for cygwin - - Copyright 2000, 2001, 2004, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -class reg_key -{ -private: - - HKEY key; - LONG key_is_invalid; - DWORD _disposition; - -public: - - reg_key (HKEY toplev, REGSAM access, ...); - reg_key (bool isHKLM, REGSAM access, ...); - - void *operator new (size_t, void *p) {return p;} - void build_reg (HKEY key, REGSAM access, va_list av); - - int error () {return key == (HKEY) INVALID_HANDLE_VALUE;} - - int kill (const char *child); - int killvalue (const char *name); - - HKEY get_key (); - int get_int (const char *,int def); - int get_string (const char *, char *buf, size_t len, const char *def); - int set_string (const char *,const char *); - int set_int (const char *, int val); - bool created () const {return _disposition & REG_CREATED_NEW_KEY;} - - ~reg_key (); -}; - -/* Evaluates path to the directory of the local user registry hive */ -char *__stdcall get_registry_hive_path (const char *name, char *path); -void __stdcall load_registry_hive (const char *name); diff --git a/winsup/cygwin/resource.cc b/winsup/cygwin/resource.cc deleted file mode 100644 index 9112bbe77..000000000 --- a/winsup/cygwin/resource.cc +++ /dev/null @@ -1,193 +0,0 @@ -/* resource.cc: getrusage () and friends. - - Copyright 1996, 1997, 1998, 2000, 2001, 2002 Red Hat, Inc. - - Written by Steve Chamberlain (sac@cygnus.com), Doug Evans (dje@cygnus.com), - Geoffrey Noer (noer@cygnus.com) of Cygnus Support. - Rewritten by Sergey S. Okhapkin (sos@prospect.com.ru) - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include "cygerrno.h" -#include "pinfo.h" -#include "psapi.h" -#include "cygtls.h" - -/* add timeval values */ -static void -add_timeval (struct timeval *tv1, struct timeval *tv2) -{ - tv1->tv_sec += tv2->tv_sec; - tv1->tv_usec += tv2->tv_usec; - if (tv1->tv_usec >= 1000000) - { - tv1->tv_usec -= 1000000; - tv1->tv_sec++; - } -} - -/* add rusage values of r2 to r1 */ -void __stdcall -add_rusage (struct rusage *r1, struct rusage *r2) -{ - add_timeval (&r1->ru_utime, &r2->ru_utime); - add_timeval (&r1->ru_stime, &r2->ru_stime); - r1->ru_maxrss += r2->ru_maxrss; - r1->ru_ixrss += r2->ru_ixrss; - r1->ru_idrss += r2->ru_idrss; - r1->ru_isrss += r2->ru_isrss; - r1->ru_minflt += r2->ru_minflt; - r1->ru_majflt += r2->ru_majflt; - r1->ru_nswap += r2->ru_nswap; - r1->ru_inblock += r2->ru_inblock; - r1->ru_oublock += r2->ru_oublock; - r1->ru_msgsnd += r2->ru_msgsnd; - r1->ru_msgrcv += r2->ru_msgrcv; - r1->ru_nsignals += r2->ru_nsignals; - r1->ru_nvcsw += r2->ru_nvcsw; - r1->ru_nivcsw += r2->ru_nivcsw; -} - -/* FIXME: what about other fields? */ -void __stdcall -fill_rusage (struct rusage *r, HANDLE h) -{ - FILETIME creation_time = {0,0}; - FILETIME exit_time = {0,0}; - FILETIME kernel_time = {0,0}; - FILETIME user_time = {0,0}; - - struct timeval tv; - - memset (r, 0, sizeof (*r)); - GetProcessTimes (h, &creation_time, &exit_time, &kernel_time, &user_time); - totimeval (&tv, &kernel_time, 0, 0); - add_timeval (&r->ru_stime, &tv); - totimeval (&tv, &user_time, 0, 0); - add_timeval (&r->ru_utime, &tv); - - PROCESS_MEMORY_COUNTERS pmc; - - memset (&pmc, 0, sizeof (pmc)); - if (GetProcessMemoryInfo (h, &pmc, sizeof (pmc))) - { - r->ru_maxrss += (long) (pmc.WorkingSetSize /1024); - r->ru_majflt += pmc.PageFaultCount; - } -} - -extern "C" int -getrusage (int intwho, struct rusage *rusage_in) -{ - int res = 0; - struct rusage r; - - if (intwho == RUSAGE_SELF) - { - memset (&r, 0, sizeof (r)); - fill_rusage (&r, hMainProc); - *rusage_in = r; - } - else if (intwho == RUSAGE_CHILDREN) - *rusage_in = myself->rusage_children; - else - { - set_errno (EINVAL); - res = -1; - } - - syscall_printf ("%d = getrusage (%d, %p)", res, intwho, rusage_in); - return res; -} - -unsigned long rlim_core = RLIM_INFINITY; - -extern "C" int -getrlimit (int resource, struct rlimit *rlp) -{ - MEMORY_BASIC_INFORMATION m; - - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - rlp->rlim_cur = RLIM_INFINITY; - rlp->rlim_max = RLIM_INFINITY; - - switch (resource) - { - case RLIMIT_CPU: - case RLIMIT_FSIZE: - case RLIMIT_DATA: - break; - case RLIMIT_STACK: - if (!VirtualQuery ((LPCVOID) &m, &m, sizeof m)) - debug_printf ("couldn't get stack info, returning def.values. %E"); - else - { - rlp->rlim_cur = (DWORD) &m - (DWORD) m.AllocationBase; - rlp->rlim_max = (DWORD) m.BaseAddress + m.RegionSize - - (DWORD) m.AllocationBase; - } - break; - case RLIMIT_NOFILE: - rlp->rlim_cur = getdtablesize (); - if (rlp->rlim_cur < OPEN_MAX) - rlp->rlim_cur = OPEN_MAX; - break; - case RLIMIT_CORE: - rlp->rlim_cur = rlim_core; - break; - case RLIMIT_AS: - rlp->rlim_cur = 0x80000000UL; - rlp->rlim_max = 0x80000000UL; - break; - default: - set_errno (EINVAL); - return -1; - } - return 0; -} - -extern "C" int -setrlimit (int resource, const struct rlimit *rlp) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - struct rlimit oldlimits; - - // Check if the request is to actually change the resource settings. - // If it does not result in a change, take no action and do not - // fail. - if (getrlimit (resource, &oldlimits) < 0) - return -1; - - if (oldlimits.rlim_cur == rlp->rlim_cur && - oldlimits.rlim_max == rlp->rlim_max) - // No change in resource requirements, succeed immediately - return 0; - - switch (resource) - { - case RLIMIT_CORE: - rlim_core = rlp->rlim_cur; - break; - case RLIMIT_NOFILE: - if (rlp->rlim_cur != RLIM_INFINITY) - return setdtablesize (rlp->rlim_cur); - break; - default: - set_errno (EINVAL); - return -1; - } - return 0; -} diff --git a/winsup/cygwin/rmsym b/winsup/cygwin/rmsym deleted file mode 100755 index 1549eed99..000000000 --- a/winsup/cygwin/rmsym +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -lib=$1; shift -nm=$1; shift -ar=$1; shift -grepit=`echo $* | sed 's/ /\$|__imp__/g'` -[ -n "$grepit" ] && grepit="__imp__$grepit\$" -objs=`$nm $lib | awk -F: '/^d*[0-9][0-9]*.o:/ {obj=$1} '"/$grepit/"'{print obj}'` -[ -n "$objs" ] || exit 1 -$ar ds $lib $objs diff --git a/winsup/cygwin/scandir.cc b/winsup/cygwin/scandir.cc deleted file mode 100644 index 84b6538a4..000000000 --- a/winsup/cygwin/scandir.cc +++ /dev/null @@ -1,93 +0,0 @@ -/* scandir.cc - - Copyright 1998, 1999, 2000, 2001 Red Hat, Inc. - - Written by Corinna Vinschen - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#include "winsup.h" -#include -#include -#include "cygerrno.h" - -extern "C" int -alphasort (const struct dirent **a, const struct dirent **b) -{ - return strcoll ((*a)->d_name, (*b)->d_name); -} - -extern "C" int -scandir (const char *dir, - struct dirent ***namelist, - int (*select) (const struct dirent *), - int (*compar) (const struct dirent **, const struct dirent **)) -{ - DIR *dirp; - struct dirent *ent, *etmp, **nl = NULL, **ntmp; - int count = 0; - int allocated = 0; - int err = 0; - - if (!(dirp = opendir (dir))) - return -1; - - if (!compar) - compar = alphasort; - - while ((ent = readdir (dirp))) - { - if (!select || select (ent)) - { - if (count == allocated) - { - - if (allocated == 0) - allocated = 10; - else - allocated *= 2; - - ntmp = (struct dirent **) realloc (nl, allocated * sizeof *nl); - if (!ntmp) - { - err = ENOMEM; - break; - } - nl = ntmp; - } - - if (!(etmp = (struct dirent *) malloc (sizeof *ent))) - { - err = ENOMEM; - break; - } - *etmp = *ent; - nl[count++] = etmp; - } - } - - if (err != 0) - { - closedir (dirp); - if (nl) - { - while (count > 0) - free (nl[--count]); - free (nl); - } - /* Ignore errors from closedir() and what not else. */ - set_errno (err); - return -1; - } - - closedir (dirp); - - qsort (nl, count, sizeof *nl, (int (*)(const void *, const void *)) compar); - if (namelist) - *namelist = nl; - return count; -} diff --git a/winsup/cygwin/sched.cc b/winsup/cygwin/sched.cc deleted file mode 100644 index 85f9738fd..000000000 --- a/winsup/cygwin/sched.cc +++ /dev/null @@ -1,501 +0,0 @@ -/* sched.cc: scheduler interface for Cygwin - - Copyright 2001, 2002 Red Hat, Inc. - - Written by Robert Collins - - This file is part of Cygwin. - - This software is a copyrighted work licensed under the terms of the - Cygwin license. Please consult the file "CYGWIN_LICENSE" for - details. */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#define _WIN32_WINNT 0x300 -#include "winsup.h" -#include -#include "cygerrno.h" -#include -#include -#include -#include -#include "pinfo.h" -/* for getpid */ -#include -#include "registry.h" - -extern "C" HWND WINAPI GetForegroundWindow(); - -/* Win32 priority to UNIX priority Mapping. - For now, I'm just following the spec: any range of priorities is ok. - There are probably many many issues with this... - - We don't want process's going realtime. Well, they probably could, but the issues - with avoiding the priority values 17-22 and 27-30 (not supported before win2k) - make that inefficient. - However to complicate things most unixes use lower is better priorities. - - So we map -14 to 15, and 15 to 1 via (16- ((n+16) >> 1)) - we then map 1 to 15 to various process class and thread priority combinations - - Then we need to look at the threads vi process priority. As win95 98 and NT 4 - Don't support opening threads cross-process (unless a thread HANDLE is passed around) - for now, we'll just use the priority class. - - The code and logic are present to calculate the priority for thread - , if a thread handle can be obtained. Alternatively, if the symbols wouldn't be - resolved until they are used - we could support this on windows 2000 and ME now, and just fall back to the - class only on pre win2000 machines. - - Lastly, because we can't assume that the pid we're given are Windows pids, we can't - alter non-cygwin started programs. -*/ - -extern "C" -{ - -/* max priority for policy */ -int -sched_get_priority_max (int policy) -{ - if (policy < 1 || policy > 3) - { - set_errno (EINVAL); - return -1; - } - return -14; -} - -/* min priority for policy */ -int -sched_get_priority_min (int policy) -{ - if (policy < 1 || policy > 3) - { - set_errno (EINVAL); - return -1; - } - return 15; -} - -/* Check a scheduler parameter struct for valid settings */ -int -valid_sched_parameters (const struct sched_param *param) -{ - if (param->sched_priority < -14 || param->sched_priority > 15) - { - return 0; - } - return -1; - -} - -/* get sched params for process - - Note, I'm never returning EPERM, - Always ESRCH. This is by design (If cygwin ever looks at paranoid security - Walking the pid values is a known hole in some os's) -*/ -int -sched_getparam (pid_t pid, struct sched_param *param) -{ - pid_t localpid; - int winpri; - if (!param || pid < 0) - { - set_errno (EINVAL); - return -1; - } - - localpid = pid ? pid : getpid (); - - DWORD Class; - int ThreadPriority; - HANDLE process; - pinfo p (localpid); - - /* get the class */ - - if (!p) - { - set_errno (ESRCH); - return -1; - } - process = OpenProcess (PROCESS_QUERY_INFORMATION, FALSE, p->dwProcessId); - if (!process) - { - set_errno (ESRCH); - return -1; - } - Class = GetPriorityClass (process); - CloseHandle (process); - if (!Class) - { - set_errno (ESRCH); - return -1; - } - ThreadPriority = THREAD_PRIORITY_NORMAL; - - /* calculate the unix priority. - - FIXME: windows 2000 supports ABOVE_NORMAL and BELOW_NORMAL class's - So this logic just defaults those class factors to NORMAL in the calculations */ - - switch (Class) - { - case IDLE_PRIORITY_CLASS: - switch (ThreadPriority) - { - case THREAD_PRIORITY_IDLE: - winpri = 1; - break; - case THREAD_PRIORITY_LOWEST: - winpri = 2; - break; - case THREAD_PRIORITY_BELOW_NORMAL: - winpri = 3; - break; - case THREAD_PRIORITY_NORMAL: - winpri = 4; - break; - case THREAD_PRIORITY_ABOVE_NORMAL: - winpri = 5; - break; - case THREAD_PRIORITY_HIGHEST: - default: - winpri = 6; - break; - } - break; - case HIGH_PRIORITY_CLASS: - switch (ThreadPriority) - { - case THREAD_PRIORITY_IDLE: - winpri = 1; - break; - case THREAD_PRIORITY_LOWEST: - winpri = 11; - break; - case THREAD_PRIORITY_BELOW_NORMAL: - winpri = 12; - break; - case THREAD_PRIORITY_NORMAL: - winpri = 13; - break; - case THREAD_PRIORITY_ABOVE_NORMAL: - winpri = 14; - break; - case THREAD_PRIORITY_HIGHEST: - default: - winpri = 15; - break; - } - break; - case NORMAL_PRIORITY_CLASS: - default: - switch (ThreadPriority) - { - case THREAD_PRIORITY_IDLE: - winpri = 1; - break; - case THREAD_PRIORITY_LOWEST: - winpri = 7; - break; - case THREAD_PRIORITY_BELOW_NORMAL: - winpri = 8; - break; - case THREAD_PRIORITY_NORMAL: - winpri = 9; - break; - case THREAD_PRIORITY_ABOVE_NORMAL: - winpri = 10; - break; - case THREAD_PRIORITY_HIGHEST: - default: - winpri = 11; - break; - } - break; - } - - /* reverse out winpri = (16- ((unixpri+16) >> 1)) */ - /* - winpri-16 = - (unixpri +16 ) >> 1 - - -(winpri-16) = unixpri +16 >> 1 - (-(winpri-16)) << 1 = unixpri+16 - ((-(winpri - 16)) << 1) - 16 = unixpri - */ - - param->sched_priority = ((-(winpri - 16)) << 1) - 16; - - return 0; -} - -/* get the scheduler for pid - - All process's on WIN32 run with SCHED_FIFO. - So we just give an answer. - (WIN32 uses a multi queue FIFO). -*/ -int -sched_getscheduler (pid_t pid) -{ - if (pid < 0) - return ESRCH; - else - return SCHED_FIFO; -} - -/* get the time quantum for pid - - Implemented only for NT systems, it fails and sets errno to ESRCH - for non-NT systems. -*/ -int -sched_rr_get_interval (pid_t pid, struct timespec *interval) -{ - static const char quantable[2][2][3] = - {{{12, 24, 36}, { 6, 12, 18}}, - {{36, 36, 36}, {18, 18, 18}}}; - /* FIXME: Clocktickinterval can be 15 ms for multi-processor system. */ - static const int clocktickinterval = 10; - static const int quantapertick = 3; - - HWND forwin; - DWORD forprocid; - int vfindex, slindex, qindex, prisep; - long nsec; - - if (!wincap.is_winnt ()) - { - set_errno (ESRCH); - return -1; - } - - forwin = GetForegroundWindow (); - if (!forwin) - GetWindowThreadProcessId (forwin, &forprocid); - else - forprocid = 0; - - reg_key reg (HKEY_LOCAL_MACHINE, KEY_READ, "SYSTEM", "CurrentControlSet", - "Control", "PriorityControl", NULL); - if (reg.error ()) - { - set_errno (ESRCH); - return -1; - } - prisep = reg.get_int ("Win32PrioritySeparation", 2); - pinfo pi (pid ? pid : myself->pid); - if (!pi) - { - set_errno (ESRCH); - return -1; - } - - if (pi->dwProcessId == forprocid) - { - qindex = prisep & 3; - qindex = qindex == 3 ? 2 : qindex; - } - else - qindex = 0; - vfindex = ((prisep >> 2) & 3) % 3; - if (vfindex == 0) - vfindex = wincap.is_server () || prisep & 3 == 0 ? 1 : 0; - else - vfindex -= 1; - slindex = ((prisep >> 4) & 3) % 3; - if (slindex == 0) - slindex = wincap.is_server () ? 1 : 0; - else - slindex -= 1; - - nsec = quantable[vfindex][slindex][qindex] / quantapertick - * clocktickinterval * 1000000; - interval->tv_sec = nsec / 1000000000; - interval->tv_nsec = nsec % 1000000000; - - return 0; -} - -/* set the scheduling parameters */ -int -sched_setparam (pid_t pid, const struct sched_param *param) -{ - pid_t localpid; - int winpri; - DWORD Class; - int ThreadPriority; - HANDLE process; - - if (!param || pid < 0) - { - set_errno (EINVAL); - return -1; - } - - if (!valid_sched_parameters (param)) - { - set_errno (EINVAL); - return -1; - } - - /* winpri = (16- ((unixpri+16) >> 1)) */ - winpri = 16 - ((param->sched_priority + 16) >> 1); - - /* calculate our desired priority class and thread priority */ - - if (winpri < 7) - Class = IDLE_PRIORITY_CLASS; - else if (winpri > 10) - Class = HIGH_PRIORITY_CLASS; - else - Class = NORMAL_PRIORITY_CLASS; - - switch (Class) - { - case IDLE_PRIORITY_CLASS: - switch (winpri) - { - case 1: - ThreadPriority = THREAD_PRIORITY_IDLE; - break; - case 2: - ThreadPriority = THREAD_PRIORITY_LOWEST; - break; - case 3: - ThreadPriority = THREAD_PRIORITY_BELOW_NORMAL; - break; - case 4: - ThreadPriority = THREAD_PRIORITY_NORMAL; - break; - case 5: - ThreadPriority = THREAD_PRIORITY_ABOVE_NORMAL; - break; - case 6: - ThreadPriority = THREAD_PRIORITY_HIGHEST; - break; - } - break; - case NORMAL_PRIORITY_CLASS: - switch (winpri) - { - case 7: - ThreadPriority = THREAD_PRIORITY_LOWEST; - break; - case 8: - ThreadPriority = THREAD_PRIORITY_BELOW_NORMAL; - break; - case 9: - ThreadPriority = THREAD_PRIORITY_NORMAL; - break; - case 10: - ThreadPriority = THREAD_PRIORITY_ABOVE_NORMAL; - break; - case 11: - ThreadPriority = THREAD_PRIORITY_HIGHEST; - break; - } - break; - case HIGH_PRIORITY_CLASS: - switch (winpri) - { - case 12: - ThreadPriority = THREAD_PRIORITY_BELOW_NORMAL; - break; - case 13: - ThreadPriority = THREAD_PRIORITY_NORMAL; - break; - case 14: - ThreadPriority = THREAD_PRIORITY_ABOVE_NORMAL; - break; - case 15: - ThreadPriority = THREAD_PRIORITY_HIGHEST; - break; - } - break; - } - - localpid = pid ? pid : getpid (); - - pinfo p (localpid); - - /* set the class */ - - if (!p) - { - set_errno (1); //ESRCH); - return -1; - } - process = - OpenProcess (PROCESS_SET_INFORMATION, FALSE, (DWORD) p->dwProcessId); - if (!process) - { - set_errno (2); //ESRCH); - return -1; - } - if (!SetPriorityClass (process, Class)) - { - CloseHandle (process); - set_errno (EPERM); - return -1; - } - CloseHandle (process); - - return 0; -} - -/* we map -14 to 15, and 15 to 1 via (16- ((n+16) >> 1)). This lines up with the allowed - * valueswe return elsewhere in the sched* functions. We then map in groups of three to - * allowed thread priority's. The reason for dropping accuracy while still returning - * a wide range of values is to allow more flexible code in the future. - */ -int -sched_set_thread_priority (HANDLE thread, int priority) -{ - int real_pri; - real_pri = 16 - ((priority + 16) >> 1); - if (real_pri <1 || real_pri > 15) - return EINVAL; - - if (real_pri < 4) - real_pri = THREAD_PRIORITY_LOWEST; - else if (real_pri < 7) - real_pri = THREAD_PRIORITY_BELOW_NORMAL; - else if (real_pri < 10) - real_pri = THREAD_PRIORITY_NORMAL; - else if (real_pri < 13) - real_pri = THREAD_PRIORITY_ABOVE_NORMAL; - else - real_pri = THREAD_PRIORITY_HIGHEST; - - if (!SetThreadPriority (thread, real_pri)) - /* invalid handle, no access are the only expected errors. */ - return EPERM; - return 0; -} - -/* set the scheduler */ -int -sched_setscheduler (pid_t pid, int policy, - const struct sched_param *param) -{ - /* on win32, you can't change the scheduler. Doh! */ - set_errno (ENOSYS); - return -1; -} - -/* yield the cpu */ -int -sched_yield () -{ - low_priority_sleep (0); - return 0; -} -} diff --git a/winsup/cygwin/sec_acl.cc b/winsup/cygwin/sec_acl.cc deleted file mode 100644 index 0c198dc25..000000000 --- a/winsup/cygwin/sec_acl.cc +++ /dev/null @@ -1,975 +0,0 @@ -/* sec_acl.cc: Sun compatible ACL functions. - - Copyright 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - - Written by Corinna Vinschen - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "pinfo.h" -#include "cygheap.h" -#include "pwdgrp.h" - -static int -searchace (__aclent32_t *aclp, int nentries, int type, __uid32_t id = ILLEGAL_UID) -{ - int i; - - for (i = 0; i < nentries; ++i) - if ((aclp[i].a_type == type && (id == ILLEGAL_UID || aclp[i].a_id == id)) - || !aclp[i].a_type) - return i; - return -1; -} - -int -setacl (HANDLE handle, const char *file, int nentries, __aclent32_t *aclbufp) -{ - security_descriptor sd_ret; - - if ((!handle || get_nt_object_security (handle, SE_FILE_OBJECT, sd_ret)) - && read_sd (file, sd_ret) <= 0) - { - debug_printf ("read_sd %E"); - return -1; - } - - BOOL dummy; - - /* Get owner SID. */ - PSID owner_sid; - if (!GetSecurityDescriptorOwner (sd_ret, &owner_sid, &dummy)) - { - __seterrno (); - return -1; - } - cygsid owner (owner_sid); - - /* Get group SID. */ - PSID group_sid; - if (!GetSecurityDescriptorGroup (sd_ret, &group_sid, &dummy)) - { - __seterrno (); - return -1; - } - cygsid group (group_sid); - - /* Initialize local security descriptor. */ - SECURITY_DESCRIPTOR sd; - if (!InitializeSecurityDescriptor (&sd, SECURITY_DESCRIPTOR_REVISION)) - { - __seterrno (); - return -1; - } - if (!SetSecurityDescriptorOwner (&sd, owner, FALSE)) - { - __seterrno (); - return -1; - } - if (!SetSecurityDescriptorGroup (&sd, group, FALSE)) - { - __seterrno (); - return -1; - } - - /* Fill access control list. */ - PACL acl = (PACL) alloca (3072); - size_t acl_len = sizeof (ACL); - int ace_off = 0; - - cygsid sid; - struct passwd *pw; - struct __group32 *gr; - int pos; - - if (!InitializeAcl (acl, 3072, ACL_REVISION)) - { - __seterrno (); - return -1; - } - for (int i = 0; i < nentries; ++i) - { - DWORD allow; - /* Owner has more standard rights set. */ - if ((aclbufp[i].a_type & ~ACL_DEFAULT) == USER_OBJ) - allow = STANDARD_RIGHTS_ALL | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA; - else - allow = STANDARD_RIGHTS_READ | FILE_READ_ATTRIBUTES | FILE_READ_EA; - if (aclbufp[i].a_perm & S_IROTH) - allow |= FILE_GENERIC_READ; - if (aclbufp[i].a_perm & S_IWOTH) - allow |= STANDARD_RIGHTS_WRITE | FILE_GENERIC_WRITE; - if (aclbufp[i].a_perm & S_IXOTH) - allow |= FILE_GENERIC_EXECUTE; - if ((aclbufp[i].a_perm & (S_IWOTH | S_IXOTH)) == (S_IWOTH | S_IXOTH)) - allow |= FILE_DELETE_CHILD; - /* Set inherit property. */ - DWORD inheritance = (aclbufp[i].a_type & ACL_DEFAULT) - ? (SUB_CONTAINERS_AND_OBJECTS_INHERIT | INHERIT_ONLY) - : NO_INHERITANCE; - /* - * If a specific acl contains a corresponding default entry with - * identical permissions, only one Windows ACE with proper - * inheritance bits is created. - */ - if (!(aclbufp[i].a_type & ACL_DEFAULT) - && aclbufp[i].a_type & (USER|GROUP|OTHER_OBJ) - && (pos = searchace (aclbufp + i + 1, nentries - i - 1, - aclbufp[i].a_type | ACL_DEFAULT, - (aclbufp[i].a_type & (USER|GROUP)) - ? aclbufp[i].a_id : ILLEGAL_UID)) >= 0 - && aclbufp[i].a_perm == aclbufp[i + 1 + pos].a_perm) - { - inheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT; - /* This invalidates the corresponding default entry. */ - aclbufp[i + 1 + pos].a_type = USER|GROUP|ACL_DEFAULT; - } - switch (aclbufp[i].a_type) - { - case USER_OBJ: - if (!add_access_allowed_ace (acl, ace_off++, allow, - owner, acl_len, inheritance)) - return -1; - break; - case DEF_USER_OBJ: - if (!add_access_allowed_ace (acl, ace_off++, allow, - well_known_creator_owner_sid, acl_len, inheritance)) - return -1; - break; - case USER: - case DEF_USER: - if (!(pw = internal_getpwuid (aclbufp[i].a_id)) - || !sid.getfrompw (pw) - || !add_access_allowed_ace (acl, ace_off++, allow, - sid, acl_len, inheritance)) - return -1; - break; - case GROUP_OBJ: - if (!add_access_allowed_ace (acl, ace_off++, allow, - group, acl_len, inheritance)) - return -1; - break; - case DEF_GROUP_OBJ: - if (!add_access_allowed_ace (acl, ace_off++, allow, - well_known_creator_group_sid, acl_len, inheritance)) - return -1; - break; - case GROUP: - case DEF_GROUP: - if (!(gr = internal_getgrgid (aclbufp[i].a_id)) - || !sid.getfromgr (gr) - || !add_access_allowed_ace (acl, ace_off++, allow, - sid, acl_len, inheritance)) - return -1; - break; - case OTHER_OBJ: - case DEF_OTHER_OBJ: - if (!add_access_allowed_ace (acl, ace_off++, allow, - well_known_world_sid, - acl_len, inheritance)) - return -1; - break; - } - } - /* Set AclSize to computed value. */ - acl->AclSize = acl_len; - debug_printf ("ACL-Size: %d", acl_len); - /* Create DACL for local security descriptor. */ - if (!SetSecurityDescriptorDacl (&sd, TRUE, acl, FALSE)) - { - __seterrno (); - return -1; - } - /* Make self relative security descriptor in sd_ret. */ - DWORD sd_size = 0; - MakeSelfRelativeSD (&sd, sd_ret, &sd_size); - if (sd_size <= 0) - { - __seterrno (); - return -1; - } - if (!sd_ret.realloc (sd_size)) - { - set_errno (ENOMEM); - return -1; - } - if (!MakeSelfRelativeSD (&sd, sd_ret, &sd_size)) - { - __seterrno (); - return -1; - } - debug_printf ("Created SD-Size: %d", sd_ret.size ()); - return write_sd (handle, file, sd_ret); -} - -/* Temporary access denied bits */ -#define DENY_R 040000 -#define DENY_W 020000 -#define DENY_X 010000 - -static void -getace (__aclent32_t &acl, int type, int id, DWORD win_ace_mask, - DWORD win_ace_type) -{ - acl.a_type = type; - acl.a_id = id; - - if ((win_ace_mask & FILE_READ_BITS) && !(acl.a_perm & (S_IROTH | DENY_R))) - if (win_ace_type == ACCESS_ALLOWED_ACE_TYPE) - acl.a_perm |= S_IROTH; - else if (win_ace_type == ACCESS_DENIED_ACE_TYPE) - acl.a_perm |= DENY_R; - - if ((win_ace_mask & FILE_WRITE_BITS) && !(acl.a_perm & (S_IWOTH | DENY_W))) - if (win_ace_type == ACCESS_ALLOWED_ACE_TYPE) - acl.a_perm |= S_IWOTH; - else if (win_ace_type == ACCESS_DENIED_ACE_TYPE) - acl.a_perm |= DENY_W; - - if ((win_ace_mask & FILE_EXEC_BITS) && !(acl.a_perm & (S_IXOTH | DENY_X))) - if (win_ace_type == ACCESS_ALLOWED_ACE_TYPE) - acl.a_perm |= S_IXOTH; - else if (win_ace_type == ACCESS_DENIED_ACE_TYPE) - acl.a_perm |= DENY_X; -} - -int -getacl (HANDLE handle, const char *file, DWORD attr, int nentries, - __aclent32_t *aclbufp) -{ - security_descriptor sd; - - if ((!handle || get_nt_object_security (handle, SE_FILE_OBJECT, sd)) - && read_sd (file, sd) <= 0) - { - debug_printf ("read_sd %E"); - return -1; - } - - cygpsid owner_sid; - cygpsid group_sid; - BOOL dummy; - __uid32_t uid; - __gid32_t gid; - - if (!GetSecurityDescriptorOwner (sd, (PSID *) &owner_sid, &dummy)) - { - debug_printf ("GetSecurityDescriptorOwner %E"); - __seterrno (); - return -1; - } - uid = owner_sid.get_uid (); - - if (!GetSecurityDescriptorGroup (sd, (PSID *) &group_sid, &dummy)) - { - debug_printf ("GetSecurityDescriptorGroup %E"); - __seterrno (); - return -1; - } - gid = group_sid.get_gid (); - - __aclent32_t lacl[MAX_ACL_ENTRIES]; - memset (&lacl, 0, MAX_ACL_ENTRIES * sizeof (__aclent32_t)); - lacl[0].a_type = USER_OBJ; - lacl[0].a_id = uid; - lacl[1].a_type = GROUP_OBJ; - lacl[1].a_id = gid; - lacl[2].a_type = OTHER_OBJ; - lacl[2].a_id = ILLEGAL_GID; - lacl[3].a_type = CLASS_OBJ; - lacl[3].a_id = ILLEGAL_GID; - lacl[3].a_perm = S_IROTH | S_IWOTH | S_IXOTH; - - PACL acl; - BOOL acl_exists; - - if (!GetSecurityDescriptorDacl (sd, &acl_exists, &acl, &dummy)) - { - __seterrno (); - debug_printf ("GetSecurityDescriptorDacl %E"); - return -1; - } - - int pos, i, types_def = 0; - - if (!acl_exists || !acl) - for (pos = 0; pos < 3; ++pos) /* Don't change CLASS_OBJ entry */ - lacl[pos].a_perm = S_IROTH | S_IWOTH | S_IXOTH; - else - { - for (i = 0; i < acl->AceCount; ++i) - { - ACCESS_ALLOWED_ACE *ace; - - if (!GetAce (acl, i, (PVOID *) &ace)) - continue; - - cygpsid ace_sid ((PSID) &ace->SidStart); - int id; - int type = 0; - - if (ace_sid == well_known_world_sid) - { - type = OTHER_OBJ; - id = ILLEGAL_GID; - } - else if (ace_sid == group_sid) - { - type = GROUP_OBJ; - id = gid; - } - else if (ace_sid == owner_sid) - { - type = USER_OBJ; - id = uid; - } - else if (ace_sid == well_known_creator_group_sid) - { - type = GROUP_OBJ | ACL_DEFAULT; - id = ILLEGAL_GID; - } - else if (ace_sid == well_known_creator_owner_sid) - { - type = USER_OBJ | ACL_DEFAULT; - id = ILLEGAL_GID; - } - else - id = ace_sid.get_id (true, &type); - - if (!type) - continue; - if (!(ace->Header.AceFlags & INHERIT_ONLY || type & ACL_DEFAULT)) - { - if ((pos = searchace (lacl, MAX_ACL_ENTRIES, type, id)) >= 0) - getace (lacl[pos], type, id, ace->Mask, ace->Header.AceType); - } - if ((ace->Header.AceFlags & SUB_CONTAINERS_AND_OBJECTS_INHERIT) - && (attr & FILE_ATTRIBUTE_DIRECTORY)) - { - if (type == USER_OBJ) - type = USER; - else if (type == GROUP_OBJ) - type = GROUP; - type |= ACL_DEFAULT; - types_def |= type; - if ((pos = searchace (lacl, MAX_ACL_ENTRIES, type, id)) >= 0) - getace (lacl[pos], type, id, ace->Mask, ace->Header.AceType); - } - } - /* Include DEF_CLASS_OBJ if any default ace exists */ - if ((types_def & (USER|GROUP)) - && ((pos = searchace (lacl, MAX_ACL_ENTRIES, DEF_CLASS_OBJ)) >= 0)) - { - lacl[pos].a_type = DEF_CLASS_OBJ; - lacl[pos].a_id = ILLEGAL_GID; - lacl[pos].a_perm = S_IRWXU | S_IRWXG | S_IRWXO; - } - } - if ((pos = searchace (lacl, MAX_ACL_ENTRIES, 0)) < 0) - pos = MAX_ACL_ENTRIES; - if (aclbufp) { - if (owner_sid == group_sid) - lacl[0].a_perm = lacl[1].a_perm; - if (pos > nentries) - { - set_errno (ENOSPC); - return -1; - } - memcpy (aclbufp, lacl, pos * sizeof (__aclent32_t)); - for (i = 0; i < pos; ++i) - aclbufp[i].a_perm &= ~(DENY_R | DENY_W | DENY_X); - aclsort32 (pos, 0, aclbufp); - } - syscall_printf ("%d = getacl (%s)", pos, file); - return pos; -} - -static int -acl_worker (const char *path, int cmd, int nentries, __aclent32_t *aclbufp, - unsigned fmode) -{ - extern suffix_info stat_suffixes[]; - int res = -1; - fhandler_base *fh = build_fh_name (path, NULL, fmode, stat_suffixes); - if (fh->error ()) - { - debug_printf ("got %d error from build_fh_name", fh->error ()); - set_errno (fh->error ()); - } - else - res = fh->facl (cmd, nentries, aclbufp); - - delete fh; - syscall_printf ("%d = acl (%s)", res, path); - return res; -} - -extern "C" int -acl32 (const char *path, int cmd, int nentries, __aclent32_t *aclbufp) -{ - return acl_worker (path, cmd, nentries, aclbufp, PC_SYM_FOLLOW); -} - -extern "C" int -lacl32 (const char *path, int cmd, int nentries, __aclent32_t *aclbufp) -{ - return acl_worker (path, cmd, nentries, aclbufp, PC_SYM_NOFOLLOW); -} - -extern "C" int -facl32 (int fd, int cmd, int nentries, __aclent32_t *aclbufp) -{ - cygheap_fdget cfd (fd); - if (cfd < 0) - { - syscall_printf ("-1 = facl (%d)", fd); - return -1; - } - int res = cfd->facl (cmd, nentries, aclbufp); - syscall_printf ("%d = facl (%s) )", res, cfd->get_name ()); - return res; -} - -extern "C" int -aclcheck32 (__aclent32_t *aclbufp, int nentries, int *which) -{ - bool has_user_obj = false; - bool has_group_obj = false; - bool has_other_obj = false; - bool has_class_obj = false; - bool has_ug_objs = false; - bool has_def_user_obj = false; - bool has_def_group_obj = false; - bool has_def_other_obj = false; - bool has_def_class_obj = false; - bool has_def_ug_objs = false; - int pos2; - - for (int pos = 0; pos < nentries; ++pos) - switch (aclbufp[pos].a_type) - { - case USER_OBJ: - if (has_user_obj) - { - if (which) - *which = pos; - return USER_ERROR; - } - has_user_obj = true; - break; - case GROUP_OBJ: - if (has_group_obj) - { - if (which) - *which = pos; - return GRP_ERROR; - } - has_group_obj = true; - break; - case OTHER_OBJ: - if (has_other_obj) - { - if (which) - *which = pos; - return OTHER_ERROR; - } - has_other_obj = true; - break; - case CLASS_OBJ: - if (has_class_obj) - { - if (which) - *which = pos; - return CLASS_ERROR; - } - has_class_obj = true; - break; - case USER: - case GROUP: - if ((pos2 = searchace (aclbufp + pos + 1, nentries - pos - 1, - aclbufp[pos].a_type, aclbufp[pos].a_id)) >= 0) - { - if (which) - *which = pos2; - return DUPLICATE_ERROR; - } - has_ug_objs = true; - break; - case DEF_USER_OBJ: - if (has_def_user_obj) - { - if (which) - *which = pos; - return USER_ERROR; - } - has_def_user_obj = true; - break; - case DEF_GROUP_OBJ: - if (has_def_group_obj) - { - if (which) - *which = pos; - return GRP_ERROR; - } - has_def_group_obj = true; - break; - case DEF_OTHER_OBJ: - if (has_def_other_obj) - { - if (which) - *which = pos; - return OTHER_ERROR; - } - has_def_other_obj = true; - break; - case DEF_CLASS_OBJ: - if (has_def_class_obj) - { - if (which) - *which = pos; - return CLASS_ERROR; - } - has_def_class_obj = true; - break; - case DEF_USER: - case DEF_GROUP: - if ((pos2 = searchace (aclbufp + pos + 1, nentries - pos - 1, - aclbufp[pos].a_type, aclbufp[pos].a_id)) >= 0) - { - if (which) - *which = pos2; - return DUPLICATE_ERROR; - } - has_def_ug_objs = true; - break; - default: - return ENTRY_ERROR; - } - if (!has_user_obj - || !has_group_obj - || !has_other_obj -#if 0 - /* These checks are not ok yet since CLASS_OBJ isn't fully implemented. */ - || (has_ug_objs && !has_class_obj) - || (has_def_ug_objs && !has_def_class_obj) -#endif - ) - { - if (which) - *which = -1; - return MISS_ERROR; - } - return 0; -} - -static int -acecmp (const void *a1, const void *a2) -{ -#define ace(i) ((const __aclent32_t *) a##i) - int ret = ace (1)->a_type - ace (2)->a_type; - if (!ret) - ret = ace (1)->a_id - ace (2)->a_id; - return ret; -#undef ace -} - -extern "C" int -aclsort32 (int nentries, int, __aclent32_t *aclbufp) -{ - if (aclcheck32 (aclbufp, nentries, NULL)) - return -1; - if (!aclbufp || nentries < 1) - { - set_errno (EINVAL); - return -1; - } - qsort ((void *) aclbufp, nentries, sizeof (__aclent32_t), acecmp); - return 0; -} - -extern "C" int -acltomode32 (__aclent32_t *aclbufp, int nentries, mode_t *modep) -{ - int pos; - - if (!aclbufp || nentries < 1 || !modep) - { - set_errno (EINVAL); - return -1; - } - *modep = 0; - if ((pos = searchace (aclbufp, nentries, USER_OBJ)) < 0 - || !aclbufp[pos].a_type) - { - set_errno (EINVAL); - return -1; - } - *modep |= (aclbufp[pos].a_perm & S_IRWXO) << 6; - if ((pos = searchace (aclbufp, nentries, GROUP_OBJ)) < 0 - || !aclbufp[pos].a_type) - { - set_errno (EINVAL); - return -1; - } - *modep |= (aclbufp[pos].a_perm & S_IRWXO) << 3; - int cpos; - if ((cpos = searchace (aclbufp, nentries, CLASS_OBJ)) >= 0 - && aclbufp[cpos].a_type == CLASS_OBJ) - *modep |= ((aclbufp[pos].a_perm & S_IRWXO) & aclbufp[cpos].a_perm) << 3; - if ((pos = searchace (aclbufp, nentries, OTHER_OBJ)) < 0 - || !aclbufp[pos].a_type) - { - set_errno (EINVAL); - return -1; - } - *modep |= aclbufp[pos].a_perm & S_IRWXO; - return 0; -} - -extern "C" int -aclfrommode32 (__aclent32_t *aclbufp, int nentries, mode_t *modep) -{ - int pos; - - if (!aclbufp || nentries < 1 || !modep) - { - set_errno (EINVAL); - return -1; - } - if ((pos = searchace (aclbufp, nentries, USER_OBJ)) < 0 - || !aclbufp[pos].a_type) - { - set_errno (EINVAL); - return -1; - } - aclbufp[pos].a_perm = (*modep & S_IRWXU) >> 6; - if ((pos = searchace (aclbufp, nentries, GROUP_OBJ)) < 0 - || !aclbufp[pos].a_type) - { - set_errno (EINVAL); - return -1; - } - aclbufp[pos].a_perm = (*modep & S_IRWXG) >> 3; - if ((pos = searchace (aclbufp, nentries, CLASS_OBJ)) >= 0 - && aclbufp[pos].a_type == CLASS_OBJ) - aclbufp[pos].a_perm = (*modep & S_IRWXG) >> 3; - if ((pos = searchace (aclbufp, nentries, OTHER_OBJ)) < 0 - || !aclbufp[pos].a_type) - { - set_errno (EINVAL); - return -1; - } - aclbufp[pos].a_perm = (*modep & S_IRWXO); - return 0; -} - -extern "C" int -acltopbits32 (__aclent32_t *aclbufp, int nentries, mode_t *pbitsp) -{ - return acltomode32 (aclbufp, nentries, pbitsp); -} - -extern "C" int -aclfrompbits32 (__aclent32_t *aclbufp, int nentries, mode_t *pbitsp) -{ - return aclfrommode32 (aclbufp, nentries, pbitsp); -} - -static char * -permtostr (mode_t perm) -{ - static char pbuf[4]; - - pbuf[0] = (perm & S_IROTH) ? 'r' : '-'; - pbuf[1] = (perm & S_IWOTH) ? 'w' : '-'; - pbuf[2] = (perm & S_IXOTH) ? 'x' : '-'; - pbuf[3] = '\0'; - return pbuf; -} - -extern "C" char * -acltotext32 (__aclent32_t *aclbufp, int aclcnt) -{ - if (!aclbufp || aclcnt < 1 || aclcnt > MAX_ACL_ENTRIES - || aclcheck32 (aclbufp, aclcnt, NULL)) - { - set_errno (EINVAL); - return NULL; - } - char buf[32000]; - buf[0] = '\0'; - bool first = true; - - for (int pos = 0; pos < aclcnt; ++pos) - { - if (!first) - strcat (buf, ","); - first = false; - if (aclbufp[pos].a_type & ACL_DEFAULT) - strcat (buf, "default"); - switch (aclbufp[pos].a_type) - { - case USER_OBJ: - __small_sprintf (buf + strlen (buf), "user::%s", - permtostr (aclbufp[pos].a_perm)); - break; - case USER: - __small_sprintf (buf + strlen (buf), "user:%d:%s", - aclbufp[pos].a_id, permtostr (aclbufp[pos].a_perm)); - break; - case GROUP_OBJ: - __small_sprintf (buf + strlen (buf), "group::%s", - permtostr (aclbufp[pos].a_perm)); - break; - case GROUP: - __small_sprintf (buf + strlen (buf), "group:%d:%s", - aclbufp[pos].a_id, permtostr (aclbufp[pos].a_perm)); - break; - case CLASS_OBJ: - __small_sprintf (buf + strlen (buf), "mask::%s", - permtostr (aclbufp[pos].a_perm)); - break; - case OTHER_OBJ: - __small_sprintf (buf + strlen (buf), "other::%s", - permtostr (aclbufp[pos].a_perm)); - break; - default: - set_errno (EINVAL); - return NULL; - } - } - return strdup (buf); -} - -static mode_t -permfromstr (char *perm) -{ - mode_t mode = 0; - - if (strlen (perm) != 3) - return 01000; - if (perm[0] == 'r') - mode |= S_IROTH; - else if (perm[0] != '-') - return 01000; - if (perm[1] == 'w') - mode |= S_IWOTH; - else if (perm[1] != '-') - return 01000; - if (perm[2] == 'x') - mode |= S_IXOTH; - else if (perm[2] != '-') - return 01000; - return mode; -} - -extern "C" __aclent32_t * -aclfromtext32 (char *acltextp, int *) -{ - if (!acltextp) - { - set_errno (EINVAL); - return NULL; - } - char buf[strlen (acltextp) + 1]; - __aclent32_t lacl[MAX_ACL_ENTRIES]; - memset (lacl, 0, sizeof lacl); - int pos = 0; - strcpy (buf, acltextp); - char *lasts; - for (char *c = strtok_r (buf, ",", &lasts); - c; - c = strtok_r (NULL, ",", &lasts)) - { - if (!strncmp (c, "default", 7)) - { - lacl[pos].a_type |= ACL_DEFAULT; - c += 7; - } - if (!strncmp (c, "user:", 5)) - { - if (c[5] == ':') - lacl[pos].a_type |= USER_OBJ; - else - { - lacl[pos].a_type |= USER; - c += 5; - if (isalpha (*c)) - { - struct passwd *pw = internal_getpwnam (c); - if (!pw) - { - set_errno (EINVAL); - return NULL; - } - lacl[pos].a_id = pw->pw_uid; - c = strechr (c, ':'); - } - else if (isdigit (*c)) - lacl[pos].a_id = strtol (c, &c, 10); - if (*c != ':') - { - set_errno (EINVAL); - return NULL; - } - } - } - else if (!strncmp (c, "group:", 6)) - { - if (c[5] == ':') - lacl[pos].a_type |= GROUP_OBJ; - else - { - lacl[pos].a_type |= GROUP; - c += 5; - if (isalpha (*c)) - { - struct __group32 *gr = internal_getgrnam (c); - if (!gr) - { - set_errno (EINVAL); - return NULL; - } - lacl[pos].a_id = gr->gr_gid; - c = strechr (c, ':'); - } - else if (isdigit (*c)) - lacl[pos].a_id = strtol (c, &c, 10); - if (*c != ':') - { - set_errno (EINVAL); - return NULL; - } - } - } - else if (!strncmp (c, "mask:", 5)) - { - if (c[5] == ':') - lacl[pos].a_type |= CLASS_OBJ; - else - { - set_errno (EINVAL); - return NULL; - } - } - else if (!strncmp (c, "other:", 6)) - { - if (c[5] == ':') - lacl[pos].a_type |= OTHER_OBJ; - else - { - set_errno (EINVAL); - return NULL; - } - } - if ((lacl[pos].a_perm = permfromstr (c)) == 01000) - { - set_errno (EINVAL); - return NULL; - } - ++pos; - } - __aclent32_t *aclp = (__aclent32_t *) malloc (pos * sizeof (__aclent32_t)); - if (aclp) - memcpy (aclp, lacl, pos * sizeof (__aclent32_t)); - return aclp; -} - -/* __aclent16_t and __aclent32_t have same size and same member offsets */ -static __aclent32_t * -acl16to32 (__aclent16_t *aclbufp, int nentries) -{ - __aclent32_t *aclbufp32 = (__aclent32_t *) aclbufp; - if (aclbufp32) - for (int i = 0; i < nentries; i++) - aclbufp32[i].a_id &= USHRT_MAX; - return aclbufp32; -} - -extern "C" int -acl (const char *path, int cmd, int nentries, __aclent16_t *aclbufp) -{ - return acl32 (path, cmd, nentries, acl16to32 (aclbufp, nentries)); -} - -extern "C" int -facl (int fd, int cmd, int nentries, __aclent16_t *aclbufp) -{ - return facl32 (fd, cmd, nentries, acl16to32 (aclbufp, nentries)); -} - -extern "C" int -lacl (const char *path, int cmd, int nentries, __aclent16_t *aclbufp) -{ - return lacl32 (path, cmd, nentries, acl16to32 (aclbufp, nentries)); -} - -extern "C" int -aclcheck (__aclent16_t *aclbufp, int nentries, int *which) -{ - return aclcheck32 (acl16to32 (aclbufp, nentries), nentries, which); -} - -extern "C" int -aclsort (int nentries, int i, __aclent16_t *aclbufp) -{ - return aclsort32 (nentries, i, acl16to32 (aclbufp, nentries)); -} - - -extern "C" int -acltomode (__aclent16_t *aclbufp, int nentries, mode_t *modep) -{ - return acltomode32 (acl16to32 (aclbufp, nentries), nentries, modep); -} - -extern "C" int -aclfrommode (__aclent16_t *aclbufp, int nentries, mode_t *modep) -{ - return aclfrommode32 ((__aclent32_t *)aclbufp, nentries, modep); -} - -extern "C" int -acltopbits (__aclent16_t *aclbufp, int nentries, mode_t *pbitsp) -{ - return acltopbits32 (acl16to32 (aclbufp, nentries), nentries, pbitsp); -} - -extern "C" int -aclfrompbits (__aclent16_t *aclbufp, int nentries, mode_t *pbitsp) -{ - return aclfrompbits32 ((__aclent32_t *)aclbufp, nentries, pbitsp); -} - -extern "C" char * -acltotext (__aclent16_t *aclbufp, int aclcnt) -{ - return acltotext32 (acl16to32 (aclbufp, aclcnt), aclcnt); -} - -extern "C" __aclent16_t * -aclfromtext (char *acltextp, int * aclcnt) -{ - return (__aclent16_t *) aclfromtext32 (acltextp, aclcnt); -} diff --git a/winsup/cygwin/sec_helper.cc b/winsup/cygwin/sec_helper.cc deleted file mode 100644 index d8cd16062..000000000 --- a/winsup/cygwin/sec_helper.cc +++ /dev/null @@ -1,566 +0,0 @@ -/* sec_helper.cc: NT security helper functions - - Copyright 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - - Written by Corinna Vinschen - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "pinfo.h" -#include "cygheap.h" -#include "cygtls.h" -#include "pwdgrp.h" - -/* General purpose security attribute objects for global use. */ -SECURITY_ATTRIBUTES NO_COPY sec_none; -SECURITY_ATTRIBUTES NO_COPY sec_none_nih; -SECURITY_ATTRIBUTES NO_COPY sec_all; -SECURITY_ATTRIBUTES NO_COPY sec_all_nih; - -SID_IDENTIFIER_AUTHORITY NO_COPY sid_auth[] = { - {SECURITY_NULL_SID_AUTHORITY}, - {SECURITY_WORLD_SID_AUTHORITY}, - {SECURITY_LOCAL_SID_AUTHORITY}, - {SECURITY_CREATOR_SID_AUTHORITY}, - {SECURITY_NON_UNIQUE_AUTHORITY}, - {SECURITY_NT_AUTHORITY} -}; - -SID (well_known_null_sid, "S-1-0-0", - SECURITY_NULL_SID_AUTHORITY, 1, SECURITY_NULL_RID); -SID (well_known_world_sid, "S-1-1-0", - SECURITY_WORLD_SID_AUTHORITY, 1, SECURITY_WORLD_RID); -SID (well_known_local_sid, "S-1-2-0", - SECURITY_LOCAL_SID_AUTHORITY, 1, SECURITY_LOCAL_RID); -SID (well_known_creator_owner_sid, "S-1-3-0", - SECURITY_CREATOR_SID_AUTHORITY, 1, SECURITY_CREATOR_OWNER_RID); -SID (well_known_creator_group_sid, "S-1-3-1", - SECURITY_CREATOR_SID_AUTHORITY, 1, SECURITY_CREATOR_GROUP_RID); -SID (well_known_dialup_sid, "S-1-5-1", - SECURITY_NT_AUTHORITY, 1, SECURITY_DIALUP_RID); -SID (well_known_network_sid, "S-1-5-2", - SECURITY_NT_AUTHORITY, 1, SECURITY_NETWORK_RID); -SID (well_known_batch_sid, "S-1-5-3", - SECURITY_NT_AUTHORITY, 1, SECURITY_BATCH_RID); -SID (well_known_interactive_sid, "S-1-5-4", - SECURITY_NT_AUTHORITY, 1, SECURITY_INTERACTIVE_RID); -SID (well_known_service_sid, "S-1-5-6", - SECURITY_NT_AUTHORITY, 1, SECURITY_SERVICE_RID); -SID (well_known_authenticated_users_sid, "S-1-5-11", - SECURITY_NT_AUTHORITY, 1, SECURITY_AUTHENTICATED_USER_RID); -SID (well_known_system_sid, "S-1-5-18", - SECURITY_NT_AUTHORITY, 1, SECURITY_LOCAL_SYSTEM_RID); -SID (well_known_admins_sid, "S-1-5-32-544", - SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, - DOMAIN_ALIAS_RID_ADMINS); - -bool -cygpsid::operator== (const char *nsidstr) const -{ - cygsid nsid (nsidstr); - return psid == nsid; -} - -__uid32_t -cygpsid::get_id (BOOL search_grp, int *type) -{ - /* First try to get SID from group, then passwd */ - __uid32_t id = ILLEGAL_UID; - - if (search_grp) - { - struct __group32 *gr; - if (cygheap->user.groups.pgsid == psid) - id = myself->gid; - else if ((gr = internal_getgrsid (*this))) - id = gr->gr_gid; - if (id != ILLEGAL_UID) - { - if (type) - *type = GROUP; - return id; - } - } - if (!search_grp || type) - { - struct passwd *pw; - if (*this == cygheap->user.sid ()) - id = myself->uid; - else if ((pw = internal_getpwsid (*this))) - id = pw->pw_uid; - if (id != ILLEGAL_UID && type) - *type = USER; - } - return id; -} - - -char * -cygpsid::string (char *nsidstr) const -{ - char *t; - DWORD i; - - if (!psid || !nsidstr) - return NULL; - strcpy (nsidstr, "S-1-"); - t = nsidstr + sizeof ("S-1-") - 1; - t += __small_sprintf (t, "%u", GetSidIdentifierAuthority (psid)->Value[5]); - for (i = 0; i < *GetSidSubAuthorityCount (psid); ++i) - t += __small_sprintf (t, "-%lu", *GetSidSubAuthority (psid, i)); - return nsidstr; -} - -PSID -cygsid::get_sid (DWORD s, DWORD cnt, DWORD *r) -{ - DWORD i; - - if (s > 5 || cnt < 1 || cnt > 8) - { - psid = NO_SID; - return NULL; - } - set (); - InitializeSid (psid, &sid_auth[s], cnt); - for (i = 0; i < cnt; ++i) - memcpy ((char *) psid + 8 + sizeof (DWORD) * i, &r[i], sizeof (DWORD)); - return psid; -} - -const PSID -cygsid::getfromstr (const char *nsidstr) -{ - char *lasts; - DWORD s, cnt = 0; - DWORD r[8]; - - if (nsidstr && !strncmp (nsidstr, "S-1-", 4)) - { - s = strtoul (nsidstr + 4, &lasts, 10); - while (cnt < 8 && *lasts == '-') - r[cnt++] = strtoul (lasts + 1, &lasts, 10); - if (!*lasts) - return get_sid (s, cnt, r); - } - return psid = NO_SID; -} - -BOOL -cygsid::getfrompw (const struct passwd *pw) -{ - char *sp = (pw && pw->pw_gecos) ? strrchr (pw->pw_gecos, ',') : NULL; - return (*this = sp ? sp + 1 : sp) != NULL; -} - -BOOL -cygsid::getfromgr (const struct __group32 *gr) -{ - char *sp = (gr && gr->gr_passwd) ? gr->gr_passwd : NULL; - return (*this = sp) != NULL; -} - -bool -get_sids_info (cygpsid owner_sid, cygpsid group_sid, __uid32_t * uidret, __gid32_t * gidret) -{ - struct passwd *pw; - struct __group32 *gr = NULL; - bool ret = false; - - owner_sid.debug_print ("get_sids_info: owner SID ="); - group_sid.debug_print ("get_sids_info: group SID ="); - - if (group_sid == cygheap->user.groups.pgsid) - *gidret = myself->gid; - else if ((gr = internal_getgrsid (group_sid))) - *gidret = gr->gr_gid; - else - *gidret = ILLEGAL_GID; - - if (owner_sid == cygheap->user.sid ()) - { - *uidret = myself->uid; - if (*gidret == myself->gid) - ret = true; - else - ret = (internal_getgroups (0, NULL, &group_sid) > 0); - } - else if ((pw = internal_getpwsid (owner_sid))) - { - *uidret = pw->pw_uid; - if (gr || (*gidret != ILLEGAL_GID - && (gr = internal_getgrgid (*gidret)))) - for (int idx = 0; gr->gr_mem[idx]; ++idx) - if ((ret = strcasematch (pw->pw_name, gr->gr_mem[idx]))) - break; - } - else - *uidret = ILLEGAL_UID; - - return ret; -} - -PSECURITY_DESCRIPTOR -security_descriptor::malloc (size_t nsize) -{ - if (psd) - ::free (psd); - psd = (PSECURITY_DESCRIPTOR) ::malloc (nsize); - sd_size = psd ? nsize : 0; - return psd; -} - -PSECURITY_DESCRIPTOR -security_descriptor::realloc (size_t nsize) -{ - PSECURITY_DESCRIPTOR tmp = (PSECURITY_DESCRIPTOR) ::realloc (psd, nsize); - if (!tmp) - return NULL; - sd_size = nsize; - return psd = tmp; -} - -void -security_descriptor::free () -{ - if (psd) - ::free (psd); - psd = NULL; - sd_size = 0; -} - -#if 0 // unused -#define SIDLEN (sidlen = MAX_SID_LEN, &sidlen) -#define DOMLEN (domlen = INTERNET_MAX_HOST_NAME_LENGTH, &domlen) - -BOOL -lookup_name (const char *name, const char *logsrv, PSID ret_sid) -{ - cygsid sid; - DWORD sidlen; - char domuser[INTERNET_MAX_HOST_NAME_LENGTH + UNLEN + 2]; - char dom[INTERNET_MAX_HOST_NAME_LENGTH + 1]; - DWORD domlen; - SID_NAME_USE acc_type; - - debug_printf ("name : %s", name ? name : "NULL"); - - if (!name) - return FALSE; - - if (cygheap->user.domain ()) - { - strcat (strcat (strcpy (domuser, cygheap->user.domain ()), "\\"), name); - if (LookupAccountName (NULL, domuser, sid, SIDLEN, dom, DOMLEN, &acc_type) - && legal_sid_type (acc_type)) - goto got_it; - if (logsrv && *logsrv - && LookupAccountName (logsrv, domuser, sid, SIDLEN, - dom, DOMLEN, &acc_type) - && legal_sid_type (acc_type)) - goto got_it; - } - if (logsrv && *logsrv) - { - if (LookupAccountName (logsrv, name, sid, SIDLEN, dom, DOMLEN, &acc_type) - && legal_sid_type (acc_type)) - goto got_it; - if (acc_type == SidTypeDomain) - { - strcat (strcat (strcpy (domuser, dom), "\\"), name); - if (LookupAccountName (logsrv, domuser, sid, SIDLEN, - dom, DOMLEN, &acc_type)) - goto got_it; - } - } - if (LookupAccountName (NULL, name, sid, SIDLEN, dom, DOMLEN, &acc_type) - && legal_sid_type (acc_type)) - goto got_it; - if (acc_type == SidTypeDomain) - { - strcat (strcat (strcpy (domuser, dom), "\\"), name); - if (LookupAccountName (NULL, domuser, sid, SIDLEN, dom, DOMLEN,&acc_type)) - goto got_it; - } - debug_printf ("LookupAccountName (%s) %E", name); - __seterrno (); - return FALSE; - -got_it: - debug_printf ("sid : [%d]", *GetSidSubAuthority ((PSID) sid, - *GetSidSubAuthorityCount ((PSID) sid) - 1)); - - if (ret_sid) - memcpy (ret_sid, sid, sidlen); - - return TRUE; -} - -#undef SIDLEN -#undef DOMLEN -#endif //unused - -/* Order must be same as cygperm_idx in winsup.h. */ -static const char *cygpriv[] = -{ - SE_CREATE_TOKEN_NAME, - SE_ASSIGNPRIMARYTOKEN_NAME, - SE_LOCK_MEMORY_NAME, - SE_INCREASE_QUOTA_NAME, - SE_UNSOLICITED_INPUT_NAME, - SE_MACHINE_ACCOUNT_NAME, - SE_TCB_NAME, - SE_SECURITY_NAME, - SE_TAKE_OWNERSHIP_NAME, - SE_LOAD_DRIVER_NAME, - SE_SYSTEM_PROFILE_NAME, - SE_SYSTEMTIME_NAME, - SE_PROF_SINGLE_PROCESS_NAME, - SE_INC_BASE_PRIORITY_NAME, - SE_CREATE_PAGEFILE_NAME, - SE_CREATE_PERMANENT_NAME, - SE_BACKUP_NAME, - SE_RESTORE_NAME, - SE_SHUTDOWN_NAME, - SE_DEBUG_NAME, - SE_AUDIT_NAME, - SE_SYSTEM_ENVIRONMENT_NAME, - SE_CHANGE_NOTIFY_NAME, - SE_REMOTE_SHUTDOWN_NAME, - SE_CREATE_GLOBAL_NAME, - SE_UNDOCK_NAME, - SE_MANAGE_VOLUME_NAME, - SE_IMPERSONATE_NAME, - SE_ENABLE_DELEGATION_NAME, - SE_SYNC_AGENT_NAME -}; - -const LUID * -privilege_luid (cygpriv_idx idx) -{ - if (idx < 0 || idx >= SE_NUM_PRIVS) - return NULL; - if (!cygheap->luid[idx].LowPart && !cygheap->luid[idx].HighPart - && !LookupPrivilegeValue (NULL, cygpriv[idx], &cygheap->luid[idx])) - { - __seterrno (); - return NULL; - } - return &cygheap->luid[idx]; -} - -const LUID * -privilege_luid_by_name (const char *pname) -{ - int idx; - - if (!pname) - return NULL; - for (idx = 0; idx < SE_NUM_PRIVS; ++idx) - if (!strcmp (pname, cygpriv[idx])) - return privilege_luid ((cygpriv_idx) idx); - return NULL; -} - -const char * -privilege_name (cygpriv_idx idx) -{ - if (idx < 0 || idx >= SE_NUM_PRIVS) - return ""; - return cygpriv[idx]; -} - -int -set_privilege (HANDLE token, cygpriv_idx privilege, bool enable) -{ - int ret = -1; - const LUID *priv_luid; - TOKEN_PRIVILEGES new_priv, orig_priv; - DWORD size; - - if (!(priv_luid = privilege_luid (privilege))) - { - __seterrno (); - goto out; - } - - new_priv.PrivilegeCount = 1; - new_priv.Privileges[0].Luid = *priv_luid; - new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0; - - if (!AdjustTokenPrivileges (token, FALSE, &new_priv, - sizeof orig_priv, &orig_priv, &size)) - { - __seterrno (); - goto out; - } - /* AdjustTokenPrivileges returns TRUE even if the privilege could not - be enabled. GetLastError () returns an correct error code, though. */ - if (enable && GetLastError () == ERROR_NOT_ALL_ASSIGNED) - { - __seterrno (); - goto out; - } - - /* If orig_priv.PrivilegeCount is 0, the privilege hasn't been changed. */ - if (!orig_priv.PrivilegeCount) - ret = enable ? 1 : 0; - else - ret = (orig_priv.Privileges[0].Attributes & SE_PRIVILEGE_ENABLED) ? 1 : 0; - -out: - syscall_printf ("%d = set_privilege ((token %x) %s, %d)", - ret, token, privilege_name (privilege), enable); - return ret; -} - -void -set_cygwin_privileges (HANDLE token) -{ - set_privilege (token, SE_RESTORE_PRIV, true); - set_privilege (token, SE_BACKUP_PRIV, true); - set_privilege (token, SE_CHANGE_NOTIFY_PRIV, !allow_traverse); -} - -/* - * Function to return a common SECURITY_DESCRIPTOR * that - * allows all access. - */ - -static NO_COPY SECURITY_DESCRIPTOR *null_sdp = 0; - -SECURITY_DESCRIPTOR *__stdcall -get_null_sd () -{ - static NO_COPY SECURITY_DESCRIPTOR sd; - - if (null_sdp == 0) - { - InitializeSecurityDescriptor (&sd, SECURITY_DESCRIPTOR_REVISION); - SetSecurityDescriptorDacl (&sd, TRUE, 0, FALSE); - null_sdp = &sd; - } - return null_sdp; -} - -/* - * Initialize global security attributes. - * - * Called from dcrt0.cc (_dll_crt0). - */ - -void -init_global_security () -{ - sec_none.nLength = sec_none_nih.nLength = - sec_all.nLength = sec_all_nih.nLength = sizeof (SECURITY_ATTRIBUTES); - sec_none.bInheritHandle = sec_all.bInheritHandle = TRUE; - sec_none_nih.bInheritHandle = sec_all_nih.bInheritHandle = FALSE; - sec_none.lpSecurityDescriptor = sec_none_nih.lpSecurityDescriptor = NULL; - sec_all.lpSecurityDescriptor = sec_all_nih.lpSecurityDescriptor = - get_null_sd (); -} - -bool -sec_acl (PACL acl, bool original, bool admins, PSID sid1, PSID sid2, DWORD access2) -{ - size_t acl_len = MAX_DACL_LEN(5); - LPVOID pAce; - cygpsid psid; - -#ifdef DEBUGGING - if ((unsigned long) acl % 4) - api_fatal ("Incorrectly aligned incoming ACL buffer!"); -#endif - if (!InitializeAcl (acl, acl_len, ACL_REVISION)) - { - debug_printf ("InitializeAcl %E"); - return false; - } - if (sid1) - if (!AddAccessAllowedAce (acl, ACL_REVISION, - GENERIC_ALL, sid1)) - debug_printf ("AddAccessAllowedAce(sid1) %E"); - if (original && (psid = cygheap->user.saved_sid ()) - && psid != sid1 && psid != well_known_system_sid) - if (!AddAccessAllowedAce (acl, ACL_REVISION, - GENERIC_ALL, psid)) - debug_printf ("AddAccessAllowedAce(original) %E"); - if (sid2) - if (!AddAccessAllowedAce (acl, ACL_REVISION, - access2, sid2)) - debug_printf ("AddAccessAllowedAce(sid2) %E"); - if (admins) - if (!AddAccessAllowedAce (acl, ACL_REVISION, - GENERIC_ALL, well_known_admins_sid)) - debug_printf ("AddAccessAllowedAce(admin) %E"); - if (!AddAccessAllowedAce (acl, ACL_REVISION, - GENERIC_ALL, well_known_system_sid)) - debug_printf ("AddAccessAllowedAce(system) %E"); - FindFirstFreeAce (acl, &pAce); - if (pAce) - acl->AclSize = (char *) pAce - (char *) acl; - else - debug_printf ("FindFirstFreeAce %E"); - - return true; -} - -PSECURITY_ATTRIBUTES __stdcall -__sec_user (PVOID sa_buf, PSID sid1, PSID sid2, DWORD access2, BOOL inherit) -{ - PSECURITY_ATTRIBUTES psa = (PSECURITY_ATTRIBUTES) sa_buf; - PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) - ((char *) sa_buf + sizeof (*psa)); - PACL acl = (PACL) ((char *) sa_buf + sizeof (*psa) + sizeof (*psd)); - -#ifdef DEBUGGING - if ((unsigned long) sa_buf % 4) - api_fatal ("Incorrectly aligned incoming SA buffer!"); -#endif - if (!wincap.has_security () - || !sec_acl (acl, true, true, sid1, sid2, access2)) - return inherit ? &sec_none : &sec_none_nih; - - if (!InitializeSecurityDescriptor (psd, SECURITY_DESCRIPTOR_REVISION)) - debug_printf ("InitializeSecurityDescriptor %E"); - -/* - * Setting the owner lets the created security attribute not work - * on NT4 SP3 Server. Don't know why, but the function still does - * what it should do also if the owner isn't set. -*/ -#if 0 - if (!SetSecurityDescriptorOwner (psd, sid, FALSE)) - debug_printf ("SetSecurityDescriptorOwner %E"); -#endif - - if (!SetSecurityDescriptorDacl (psd, TRUE, acl, FALSE)) - debug_printf ("SetSecurityDescriptorDacl %E"); - - psa->nLength = sizeof (SECURITY_ATTRIBUTES); - psa->lpSecurityDescriptor = psd; - psa->bInheritHandle = inherit; - return psa; -} diff --git a/winsup/cygwin/security.cc b/winsup/cygwin/security.cc deleted file mode 100644 index 8a994fe80..000000000 --- a/winsup/cygwin/security.cc +++ /dev/null @@ -1,1862 +0,0 @@ -/* security.cc: NT security functions - - Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - - Originaly written by Gunther Ebert, gunther.ebert@ixos-leipzig.de - Completely rewritten by Corinna Vinschen - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "pinfo.h" -#include "cygheap.h" -#include -#include "ntdll.h" -#include "lm.h" -#include "pwdgrp.h" - -bool allow_ntsec; -/* allow_smbntsec is handled exclusively in path.cc (path_conv::check). - It's defined here because of it's strong relationship to allow_ntsec. */ -bool allow_smbntsec; -bool allow_traverse; - -cygsid * -cygsidlist::alloc_sids (int n) -{ - if (n > 0) - return (cygsid *) cmalloc (HEAP_STR, n * sizeof (cygsid)); - else - return NULL; -} - -void -cygsidlist::free_sids () -{ - if (sids) - cfree (sids); - sids = NULL; - count = maxcount = 0; - type = cygsidlist_empty; -} - -extern "C" void -cygwin_set_impersonation_token (const HANDLE hToken) -{ - debug_printf ("set_impersonation_token (%d)", hToken); - cygheap->user.external_token = hToken == INVALID_HANDLE_VALUE ? NO_IMPERSONATION : hToken; -} - -void -extract_nt_dom_user (const struct passwd *pw, char *domain, char *user) -{ - char *d, *u, *c; - - domain[0] = 0; - strlcpy (user, pw->pw_name, UNLEN + 1); - debug_printf ("pw_gecos %x (%s)", pw->pw_gecos, pw->pw_gecos); - - if ((d = strstr (pw->pw_gecos, "U-")) != NULL && - (d == pw->pw_gecos || d[-1] == ',')) - { - c = strechr (d + 2, ','); - if ((u = strechr (d + 2, '\\')) >= c) - u = d + 1; - else if (u - d <= INTERNET_MAX_HOST_NAME_LENGTH + 2) - strlcpy (domain, d + 2, u - d - 1); - if (c - u <= UNLEN + 1) - strlcpy (user, u + 1, c - u); - } - if (domain[0]) - return; - - cygsid psid; - DWORD ulen = UNLEN + 1; - DWORD dlen = INTERNET_MAX_HOST_NAME_LENGTH + 1; - SID_NAME_USE use; - if (psid.getfrompw (pw)) - LookupAccountSid (NULL, psid, user, &ulen, domain, &dlen, &use); -} - -extern "C" HANDLE -cygwin_logon_user (const struct passwd *pw, const char *password) -{ - if (!wincap.has_security ()) - { - set_errno (ENOSYS); - return INVALID_HANDLE_VALUE; - } - if (!pw) - { - set_errno (EINVAL); - return INVALID_HANDLE_VALUE; - } - - char nt_domain[INTERNET_MAX_HOST_NAME_LENGTH + 1]; - char nt_user[UNLEN + 1]; - HANDLE hToken; - - extract_nt_dom_user (pw, nt_domain, nt_user); - debug_printf ("LogonUserA (%s, %s, %s, ...)", nt_user, nt_domain, password); - /* CV 2005-06-08: LogonUser should run under the primary process token, - otherwise it returns with ERROR_ACCESS_DENIED on W2K. Don't ask me why. */ - RevertToSelf (); - if (!LogonUserA (nt_user, *nt_domain ? nt_domain : NULL, (char *) password, - LOGON32_LOGON_INTERACTIVE, - LOGON32_PROVIDER_DEFAULT, - &hToken)) - { - __seterrno (); - hToken = INVALID_HANDLE_VALUE; - } - else if (!SetHandleInformation (hToken, - HANDLE_FLAG_INHERIT, - HANDLE_FLAG_INHERIT)) - { - __seterrno (); - CloseHandle (hToken); - hToken = INVALID_HANDLE_VALUE; - } - cygheap->user.reimpersonate (); - debug_printf ("%d = logon_user(%s,...)", hToken, pw->pw_name); - return hToken; -} - -static void -str2lsa (LSA_STRING &tgt, const char *srcstr) -{ - tgt.Length = strlen (srcstr); - tgt.MaximumLength = tgt.Length + 1; - tgt.Buffer = (PCHAR) srcstr; -} - -static void -str2buf2lsa (LSA_STRING &tgt, char *buf, const char *srcstr) -{ - tgt.Length = strlen (srcstr); - tgt.MaximumLength = tgt.Length + 1; - tgt.Buffer = (PCHAR) buf; - memcpy (buf, srcstr, tgt.MaximumLength); -} - -/* The dimension of buf is assumed to be at least strlen(srcstr) + 1, - The result will be shorter if the input has multibyte chars */ -void -str2buf2uni (UNICODE_STRING &tgt, WCHAR *buf, const char *srcstr) -{ - tgt.Buffer = (PWCHAR) buf; - tgt.MaximumLength = (strlen (srcstr) + 1) * sizeof (WCHAR); - tgt.Length = sys_mbstowcs (buf, srcstr, tgt.MaximumLength / sizeof (WCHAR)) - * sizeof (WCHAR); - if (tgt.Length) - tgt.Length -= sizeof (WCHAR); -} - -void -str2uni_cat (UNICODE_STRING &tgt, const char *srcstr) -{ - int len = sys_mbstowcs (tgt.Buffer + tgt.Length / sizeof (WCHAR), srcstr, - (tgt.MaximumLength - tgt.Length) / sizeof (WCHAR)); - if (len) - tgt.Length += (len - 1) * sizeof (WCHAR); - else - tgt.Length = tgt.MaximumLength = 0; -} - -static LSA_HANDLE -open_local_policy () -{ - LSA_OBJECT_ATTRIBUTES oa = { 0, 0, 0, 0, 0, 0 }; - LSA_HANDLE lsa = INVALID_HANDLE_VALUE; - - NTSTATUS ret = LsaOpenPolicy (NULL, &oa, POLICY_EXECUTE, &lsa); - if (ret != STATUS_SUCCESS) - __seterrno_from_win_error (LsaNtStatusToWinError (ret)); - return lsa; -} - -static void -close_local_policy (LSA_HANDLE &lsa) -{ - if (lsa != INVALID_HANDLE_VALUE) - LsaClose (lsa); - lsa = INVALID_HANDLE_VALUE; -} - -bool -get_logon_server (const char *domain, char *server, WCHAR *wserver) -{ - WCHAR wdomain[INTERNET_MAX_HOST_NAME_LENGTH + 1]; - NET_API_STATUS ret; - WCHAR *buf; - DWORD size = INTERNET_MAX_HOST_NAME_LENGTH + 1; - - /* Empty domain is interpreted as local system */ - if ((GetComputerName (server + 2, &size)) && - (strcasematch (domain, server + 2) || !domain[0])) - { - server[0] = server[1] = '\\'; - if (wserver) - sys_mbstowcs (wserver, server, INTERNET_MAX_HOST_NAME_LENGTH + 1); - return true; - } - - /* Try to get the primary domain controller for the domain */ - sys_mbstowcs (wdomain, domain, INTERNET_MAX_HOST_NAME_LENGTH + 1); - if ((ret = NetGetDCName (NULL, wdomain, (LPBYTE *) &buf)) == STATUS_SUCCESS) - { - sys_wcstombs (server, INTERNET_MAX_HOST_NAME_LENGTH + 1, buf); - if (wserver) - for (WCHAR *ptr1 = buf; (*wserver++ = *ptr1++);) - ; - NetApiBufferFree (buf); - return true; - } - __seterrno_from_win_error (ret); - return false; -} - -static bool -get_user_groups (WCHAR *wlogonserver, cygsidlist &grp_list, char *user, - char *domain) -{ - char dgroup[INTERNET_MAX_HOST_NAME_LENGTH + GNLEN + 2]; - WCHAR wuser[UNLEN + 1]; - sys_mbstowcs (wuser, user, UNLEN + 1); - LPGROUP_USERS_INFO_0 buf; - DWORD cnt, tot, len; - NET_API_STATUS ret; - - /* Look only on logonserver */ - ret = NetUserGetGroups (wlogonserver, wuser, 0, (LPBYTE *) &buf, - MAX_PREFERRED_LENGTH, &cnt, &tot); - if (ret) - { - __seterrno_from_win_error (ret); - /* It's no error when the user name can't be found. */ - return ret == NERR_UserNotFound; - } - - len = strlen (domain); - strcpy (dgroup, domain); - dgroup[len++] = '\\'; - - for (DWORD i = 0; i < cnt; ++i) - { - cygsid gsid; - DWORD glen = MAX_SID_LEN; - char domain[INTERNET_MAX_HOST_NAME_LENGTH + 1]; - DWORD dlen = sizeof (domain); - SID_NAME_USE use = SidTypeInvalid; - - sys_wcstombs (dgroup + len, GNLEN + 1, buf[i].grui0_name); - if (!LookupAccountName (NULL, dgroup, gsid, &glen, domain, &dlen, &use)) - debug_printf ("LookupAccountName(%s), %E", dgroup); - else if (legal_sid_type (use)) - grp_list += gsid; - else - debug_printf ("Global group %s invalid. Domain: %s Use: %d", - dgroup, domain, use); - } - - NetApiBufferFree (buf); - return true; -} - -static bool -is_group_member (WCHAR *wgroup, PSID pusersid, cygsidlist &grp_list) -{ - LPLOCALGROUP_MEMBERS_INFO_1 buf; - DWORD cnt, tot; - NET_API_STATUS ret; - - /* Members can be users or global groups */ - ret = NetLocalGroupGetMembers (NULL, wgroup, 1, (LPBYTE *) &buf, - MAX_PREFERRED_LENGTH, &cnt, &tot, NULL); - if (ret) - return false; - - bool retval = true; - for (DWORD bidx = 0; bidx < cnt; ++bidx) - if (EqualSid (pusersid, buf[bidx].lgrmi1_sid)) - goto done; - else - { - /* The extra test for the group being a global group or a well-known - group is necessary, since apparently also aliases (for instance - Administrators or Users) can be members of local groups, even - though MSDN states otherwise. The GUI refuses to put aliases into - local groups, but the CLI interface allows it. However, a normal - logon token does not contain groups, in which the user is only - indirectly a member by being a member of an alias in this group. - So we also should not put them into the token group list. - Note: Allowing those groups in our group list renders external - tokens invalid, so that it becomes impossible to logon with - password and valid logon token. */ - for (int glidx = 0; glidx < grp_list.count; ++glidx) - if ((buf[bidx].lgrmi1_sidusage == SidTypeGroup - || buf[bidx].lgrmi1_sidusage == SidTypeWellKnownGroup) - && EqualSid (grp_list.sids[glidx], buf[bidx].lgrmi1_sid)) - goto done; - } - - retval = false; - done: - NetApiBufferFree (buf); - return retval; -} - -static bool -get_user_local_groups (cygsidlist &grp_list, PSID pusersid) -{ - LPLOCALGROUP_INFO_0 buf; - DWORD cnt, tot; - NET_API_STATUS ret; - - ret = NetLocalGroupEnum (NULL, 0, (LPBYTE *) &buf, - MAX_PREFERRED_LENGTH, &cnt, &tot, NULL); - if (ret) - { - __seterrno_from_win_error (ret); - return false; - } - - char bgroup[INTERNET_MAX_HOST_NAME_LENGTH + GNLEN + 2]; - char lgroup[INTERNET_MAX_HOST_NAME_LENGTH + GNLEN + 2]; - DWORD blen, llen; - SID_NAME_USE use; - - blen = llen = INTERNET_MAX_HOST_NAME_LENGTH + 1; - if (!LookupAccountSid (NULL, well_known_admins_sid, lgroup, &llen, bgroup, &blen, &use) - || !GetComputerNameA (lgroup, &(llen = INTERNET_MAX_HOST_NAME_LENGTH + 1))) - { - __seterrno (); - return false; - } - bgroup[blen++] = lgroup[llen++] = '\\'; - - for (DWORD i = 0; i < cnt; ++i) - if (is_group_member (buf[i].lgrpi0_name, pusersid, grp_list)) - { - cygsid gsid; - DWORD glen = MAX_SID_LEN; - char domain[INTERNET_MAX_HOST_NAME_LENGTH + 1]; - DWORD dlen = sizeof (domain); - - use = SidTypeInvalid; - sys_wcstombs (bgroup + blen, GNLEN + 1, buf[i].lgrpi0_name); - if (!LookupAccountName (NULL, bgroup, gsid, &glen, domain, &dlen, &use)) - { - if (GetLastError () != ERROR_NONE_MAPPED) - debug_printf ("LookupAccountName(%s), %E", bgroup); - strcpy (lgroup + llen, bgroup + blen); - if (!LookupAccountName (NULL, lgroup, gsid, &glen, - domain, &dlen, &use)) - debug_printf ("LookupAccountName(%s), %E", lgroup); - } - if (!legal_sid_type (use)) - debug_printf ("Rejecting local %s. use: %d", bgroup + blen, use); - else if (!grp_list.contains (gsid)) - grp_list += gsid; - } - NetApiBufferFree (buf); - return true; -} - -static bool -sid_in_token_groups (PTOKEN_GROUPS grps, cygpsid sid) -{ - if (!grps) - return false; - for (DWORD i = 0; i < grps->GroupCount; ++i) - if (sid == grps->Groups[i].Sid) - return true; - return false; -} - -#if 0 /* Unused */ -static BOOL -get_user_primary_group (WCHAR *wlogonserver, const char *user, - PSID pusersid, cygsid &pgrpsid) -{ - LPUSER_INFO_3 buf; - WCHAR wuser[UNLEN + 1]; - NET_API_STATUS ret; - BOOL retval = FALSE; - UCHAR count = 0; - - if (well_known_system_sid == pusersid) - { - pgrpsid = well_known_system_sid; - return TRUE; - } - - sys_mbstowcs (wuser, user, UNLEN + 1); - ret = NetUserGetInfo (wlogonserver, wuser, 3, (LPBYTE *) &buf); - if (ret) - { - __seterrno_from_win_error (ret); - return FALSE; - } - - pgrpsid = pusersid; - if (IsValidSid (pgrpsid) - && (count = *GetSidSubAuthorityCount (pgrpsid)) > 1) - { - *GetSidSubAuthority (pgrpsid, count - 1) = buf->usri3_primary_group_id; - retval = TRUE; - } - NetApiBufferFree (buf); - return retval; -} -#endif - -static void -get_unix_group_sidlist (struct passwd *pw, cygsidlist &grp_list) -{ - struct __group32 *gr; - cygsid gsid; - - for (int gidx = 0; (gr = internal_getgrent (gidx)); ++gidx) - { - if (gr->gr_gid == (__gid32_t) pw->pw_gid) - goto found; - else if (gr->gr_mem) - for (int gi = 0; gr->gr_mem[gi]; ++gi) - if (strcasematch (pw->pw_name, gr->gr_mem[gi])) - goto found; - continue; - found: - if (gsid.getfromgr (gr) && !grp_list.contains (gsid)) - grp_list += gsid; - - } -} - -static void -get_token_group_sidlist (cygsidlist &grp_list, PTOKEN_GROUPS my_grps, - LUID auth_luid, int &auth_pos) -{ - auth_pos = -1; - if (my_grps) - { - if (sid_in_token_groups (my_grps, well_known_local_sid)) - grp_list += well_known_local_sid; - if (sid_in_token_groups (my_grps, well_known_dialup_sid)) - grp_list += well_known_dialup_sid; - if (sid_in_token_groups (my_grps, well_known_network_sid)) - grp_list += well_known_network_sid; - if (sid_in_token_groups (my_grps, well_known_batch_sid)) - grp_list += well_known_batch_sid; - if (sid_in_token_groups (my_grps, well_known_interactive_sid)) - grp_list += well_known_interactive_sid; - if (sid_in_token_groups (my_grps, well_known_service_sid)) - grp_list += well_known_service_sid; - } - else - { - grp_list += well_known_local_sid; - grp_list += well_known_interactive_sid; - } - if (get_ll (auth_luid) != 999LL) /* != SYSTEM_LUID */ - { - char buf[64]; - __small_sprintf (buf, "S-1-5-5-%u-%u", auth_luid.HighPart, - auth_luid.LowPart); - grp_list += buf; - auth_pos = grp_list.count - 1; - } -} - -bool -get_server_groups (cygsidlist &grp_list, PSID usersid, struct passwd *pw) -{ - char user[UNLEN + 1]; - char domain[INTERNET_MAX_HOST_NAME_LENGTH + 1]; - WCHAR wserver[INTERNET_MAX_HOST_NAME_LENGTH + 3]; - char server[INTERNET_MAX_HOST_NAME_LENGTH + 3]; - - if (well_known_system_sid == usersid) - { - grp_list += well_known_admins_sid; - get_unix_group_sidlist (pw, grp_list); - return true; - } - - grp_list += well_known_world_sid; - grp_list += well_known_authenticated_users_sid; - extract_nt_dom_user (pw, domain, user); - if (get_logon_server (domain, server, wserver)) - get_user_groups (wserver, grp_list, user, domain); - get_unix_group_sidlist (pw, grp_list); - return get_user_local_groups (grp_list, usersid); -} - -static bool -get_initgroups_sidlist (cygsidlist &grp_list, - PSID usersid, PSID pgrpsid, struct passwd *pw, - PTOKEN_GROUPS my_grps, LUID auth_luid, int &auth_pos) -{ - grp_list += well_known_world_sid; - grp_list += well_known_authenticated_users_sid; - if (well_known_system_sid == usersid) - auth_pos = -1; - else - get_token_group_sidlist (grp_list, my_grps, auth_luid, auth_pos); - if (!get_server_groups (grp_list, usersid, pw)) - return false; - - /* special_pgrp true if pgrpsid is not in normal groups */ - if (!grp_list.contains (pgrpsid)) - grp_list += pgrpsid; - return true; -} - -static void -get_setgroups_sidlist (cygsidlist &tmp_list, PTOKEN_GROUPS my_grps, - user_groups &groups, LUID auth_luid, int &auth_pos) -{ - PSID pgpsid = groups.pgsid; - tmp_list += well_known_world_sid; - tmp_list += well_known_authenticated_users_sid; - get_token_group_sidlist (tmp_list, my_grps, auth_luid, auth_pos); - for (int gidx = 0; gidx < groups.sgsids.count; gidx++) - if (!tmp_list.contains (groups.sgsids.sids[gidx])) - tmp_list += groups.sgsids.sids[gidx]; - if (!groups.sgsids.contains (pgpsid)) - tmp_list += pgpsid; -} - -static const cygpriv_idx sys_privs[] = { - SE_TCB_PRIV, - SE_ASSIGNPRIMARYTOKEN_PRIV, - SE_CREATE_TOKEN_PRIV, - SE_CHANGE_NOTIFY_PRIV, - SE_SECURITY_PRIV, - SE_BACKUP_PRIV, - SE_RESTORE_PRIV, - SE_SYSTEMTIME_PRIV, - SE_SHUTDOWN_PRIV, - SE_REMOTE_SHUTDOWN_PRIV, - SE_TAKE_OWNERSHIP_PRIV, - SE_DEBUG_PRIV, - SE_SYSTEM_ENVIRONMENT_PRIV, - SE_SYSTEM_PROFILE_PRIV, - SE_PROF_SINGLE_PROCESS_PRIV, - SE_INC_BASE_PRIORITY_PRIV, - SE_LOAD_DRIVER_PRIV, - SE_CREATE_PAGEFILE_PRIV, - SE_INCREASE_QUOTA_PRIV, - SE_LOCK_MEMORY_PRIV, - SE_CREATE_PERMANENT_PRIV, - SE_AUDIT_PRIV, - SE_UNDOCK_PRIV, - SE_MANAGE_VOLUME_PRIV, - SE_IMPERSONATE_PRIV, - SE_CREATE_GLOBAL_PRIV -}; - -#define SYSTEM_PRIVILEGES_COUNT (sizeof sys_privs / sizeof *sys_privs) - -PTOKEN_PRIVILEGES -get_system_priv_list (cygsidlist &grp_list) -{ - const LUID *priv; - PTOKEN_PRIVILEGES privs = (PTOKEN_PRIVILEGES) - malloc (sizeof (ULONG) - + SYSTEM_PRIVILEGES_COUNT * sizeof (LUID_AND_ATTRIBUTES)); - if (!privs) - { - debug_printf ("malloc (system_privs) failed."); - return NULL; - } - privs->PrivilegeCount = 0; - - for (DWORD i = 0; i < SYSTEM_PRIVILEGES_COUNT; ++i) - if ((priv = privilege_luid (sys_privs[i]))) - { - privs->Privileges[privs->PrivilegeCount].Luid = *priv; - privs->Privileges[privs->PrivilegeCount].Attributes = - SE_PRIVILEGE_ENABLED | SE_PRIVILEGE_ENABLED_BY_DEFAULT; - ++privs->PrivilegeCount; - } - return privs; -} - -PTOKEN_PRIVILEGES -get_priv_list (LSA_HANDLE lsa, cygsid &usersid, cygsidlist &grp_list) -{ - PLSA_UNICODE_STRING privstrs; - ULONG cnt; - PTOKEN_PRIVILEGES privs = NULL; - NTSTATUS ret; - char buf[INTERNET_MAX_HOST_NAME_LENGTH + 1]; - - if (usersid == well_known_system_sid) - return get_system_priv_list (grp_list); - - for (int grp = -1; grp < grp_list.count; ++grp) - { - if (grp == -1) - { - if ((ret = LsaEnumerateAccountRights (lsa, usersid, &privstrs, - &cnt)) != STATUS_SUCCESS) - continue; - } - else if ((ret = LsaEnumerateAccountRights (lsa, grp_list.sids[grp], - &privstrs, &cnt)) - != STATUS_SUCCESS) - continue; - for (ULONG i = 0; i < cnt; ++i) - { - const LUID *priv; - PTOKEN_PRIVILEGES tmp; - DWORD tmp_count; - - sys_wcstombs (buf, sizeof (buf), - privstrs[i].Buffer, privstrs[i].Length / 2); - if (!(priv = privilege_luid_by_name (buf))) - continue; - - if (privs) - { - DWORD pcnt = privs->PrivilegeCount; - LUID_AND_ATTRIBUTES *p = privs->Privileges; - for (; pcnt > 0; --pcnt, ++p) - if (priv->HighPart == p->Luid.HighPart - && priv->LowPart == p->Luid.LowPart) - goto next_account_right; - } - - tmp_count = privs ? privs->PrivilegeCount : 0; - tmp = (PTOKEN_PRIVILEGES) - realloc (privs, sizeof (ULONG) + - (tmp_count + 1) * sizeof (LUID_AND_ATTRIBUTES)); - if (!tmp) - { - if (privs) - free (privs); - LsaFreeMemory (privstrs); - debug_printf ("realloc (privs) failed."); - return NULL; - } - tmp->PrivilegeCount = tmp_count; - privs = tmp; - privs->Privileges[privs->PrivilegeCount].Luid = *priv; - privs->Privileges[privs->PrivilegeCount].Attributes = - SE_PRIVILEGE_ENABLED | SE_PRIVILEGE_ENABLED_BY_DEFAULT; - ++privs->PrivilegeCount; - - next_account_right: - ; - } - LsaFreeMemory (privstrs); - } - return privs; -} - -/* Accept a token if - - the requested usersid matches the TokenUser and - - if setgroups has been called: - the token groups that are listed in /etc/group match the union of - the requested primary and supplementary groups in gsids. - - else the (unknown) implicitly requested supplementary groups and those - in the token are the groups associated with the usersid. We assume - they match and verify only the primary groups. - The requested primary group must appear in the token. - The primary group in the token is a group associated with the usersid, - except if the token is internal and the group is in the token SD - (see create_token). In that latter case that group must match the - requested primary group. */ -bool -verify_token (HANDLE token, cygsid &usersid, user_groups &groups, bool *pintern) -{ - DWORD size; - bool intern = false; - - if (pintern) - { - TOKEN_SOURCE ts; - if (!GetTokenInformation (token, TokenSource, - &ts, sizeof ts, &size)) - debug_printf ("GetTokenInformation(), %E"); - else - *pintern = intern = !memcmp (ts.SourceName, "Cygwin.1", 8); - } - /* Verify usersid */ - cygsid tok_usersid = NO_SID; - if (!GetTokenInformation (token, TokenUser, - &tok_usersid, sizeof tok_usersid, &size)) - debug_printf ("GetTokenInformation(), %E"); - if (usersid != tok_usersid) - return false; - - /* For an internal token, if setgroups was not called and if the sd group - is not well_known_null_sid, it must match pgrpsid */ - if (intern && !groups.issetgroups ()) - { - const DWORD sd_buf_siz = MAX_SID_LEN + sizeof (SECURITY_DESCRIPTOR); - PSECURITY_DESCRIPTOR sd_buf = (PSECURITY_DESCRIPTOR) alloca (sd_buf_siz); - cygpsid gsid (NO_SID); - if (!GetKernelObjectSecurity (token, GROUP_SECURITY_INFORMATION, - sd_buf, sd_buf_siz, &size)) - debug_printf ("GetKernelObjectSecurity(), %E"); - else if (!GetSecurityDescriptorGroup (sd_buf, (PSID *) &gsid, - (BOOL *) &size)) - debug_printf ("GetSecurityDescriptorGroup(), %E"); - if (well_known_null_sid != gsid) - return gsid == groups.pgsid; - } - - PTOKEN_GROUPS my_grps; - bool sawpg = false, ret = false; - - if (!GetTokenInformation (token, TokenGroups, NULL, 0, &size) && - GetLastError () != ERROR_INSUFFICIENT_BUFFER) - debug_printf ("GetTokenInformation(token, TokenGroups), %E"); - else if (!(my_grps = (PTOKEN_GROUPS) alloca (size))) - debug_printf ("alloca (my_grps) failed."); - else if (!GetTokenInformation (token, TokenGroups, my_grps, size, &size)) - debug_printf ("GetTokenInformation(my_token, TokenGroups), %E"); - else - { - if (groups.issetgroups ()) /* setgroups was called */ - { - cygsid gsid; - struct __group32 *gr; - bool saw[groups.sgsids.count]; - memset (saw, 0, sizeof(saw)); - - /* token groups found in /etc/group match the user.gsids ? */ - for (int gidx = 0; (gr = internal_getgrent (gidx)); ++gidx) - if (gsid.getfromgr (gr) && sid_in_token_groups (my_grps, gsid)) - { - int pos = groups.sgsids.position (gsid); - if (pos >= 0) - saw[pos] = true; - else if (groups.pgsid == gsid) - sawpg = true; - else if (gsid != well_known_world_sid - && gsid != usersid) - goto done; - } - /* user.sgsids groups must be in the token */ - for (int gidx = 0; gidx < groups.sgsids.count; gidx++) - if (!saw[gidx] && !sid_in_token_groups (my_grps, groups.sgsids.sids[gidx])) - goto done; - } - /* The primary group must be in the token */ - ret = sawpg - || sid_in_token_groups (my_grps, groups.pgsid) - || groups.pgsid == usersid; - } -done: - return ret; -} - -HANDLE -create_token (cygsid &usersid, user_groups &new_groups, struct passwd *pw) -{ - NTSTATUS ret; - LSA_HANDLE lsa = INVALID_HANDLE_VALUE; - - cygsidlist tmp_gsids (cygsidlist_auto, 12); - - SECURITY_QUALITY_OF_SERVICE sqos = - { sizeof sqos, SecurityImpersonation, SECURITY_STATIC_TRACKING, FALSE }; - OBJECT_ATTRIBUTES oa = { sizeof oa, 0, 0, 0, 0, &sqos }; - LUID auth_luid = SYSTEM_LUID; - LARGE_INTEGER exp = { QuadPart:INT64_MAX }; - - TOKEN_USER user; - PTOKEN_GROUPS new_tok_gsids = NULL; - PTOKEN_PRIVILEGES privs = NULL; - TOKEN_OWNER owner; - TOKEN_PRIMARY_GROUP pgrp; - TOKEN_DEFAULT_DACL dacl = {}; - TOKEN_SOURCE source; - TOKEN_STATISTICS stats; - memcpy (source.SourceName, "Cygwin.1", 8); - source.SourceIdentifier.HighPart = 0; - source.SourceIdentifier.LowPart = 0x0101; - - HANDLE token = INVALID_HANDLE_VALUE; - HANDLE primary_token = INVALID_HANDLE_VALUE; - - PTOKEN_GROUPS my_tok_gsids = NULL; - DWORD size; - - /* SE_CREATE_TOKEN_NAME privilege needed to call NtCreateToken. */ - push_self_privilege (SE_CREATE_TOKEN_PRIV, true); - - /* Open policy object. */ - if ((lsa = open_local_policy ()) == INVALID_HANDLE_VALUE) - goto out; - - /* User, owner, primary group. */ - user.User.Sid = usersid; - user.User.Attributes = 0; - owner.Owner = usersid; - - /* Retrieve authentication id and group list from own process. */ - if (hProcToken) - { - /* Switching user context to SYSTEM doesn't inherit the authentication - id of the user account running current process. */ - if (usersid != well_known_system_sid) - if (!GetTokenInformation (hProcToken, TokenStatistics, - &stats, sizeof stats, &size)) - debug_printf - ("GetTokenInformation(hProcToken, TokenStatistics), %E"); - else - auth_luid = stats.AuthenticationId; - - /* Retrieving current processes group list to be able to inherit - some important well known group sids. */ - if (!GetTokenInformation (hProcToken, TokenGroups, NULL, 0, &size) && - GetLastError () != ERROR_INSUFFICIENT_BUFFER) - debug_printf ("GetTokenInformation(hProcToken, TokenGroups), %E"); - else if (!(my_tok_gsids = (PTOKEN_GROUPS) malloc (size))) - debug_printf ("malloc (my_tok_gsids) failed."); - else if (!GetTokenInformation (hProcToken, TokenGroups, my_tok_gsids, - size, &size)) - { - debug_printf ("GetTokenInformation(hProcToken, TokenGroups), %E"); - free (my_tok_gsids); - my_tok_gsids = NULL; - } - } - - /* Create list of groups, the user is member in. */ - int auth_pos; - if (new_groups.issetgroups ()) - get_setgroups_sidlist (tmp_gsids, my_tok_gsids, new_groups, auth_luid, - auth_pos); - else if (!get_initgroups_sidlist (tmp_gsids, usersid, new_groups.pgsid, pw, - my_tok_gsids, auth_luid, auth_pos)) - goto out; - - /* Primary group. */ - pgrp.PrimaryGroup = new_groups.pgsid; - - /* Create a TOKEN_GROUPS list from the above retrieved list of sids. */ - char grps_buf[sizeof (ULONG) + tmp_gsids.count * sizeof (SID_AND_ATTRIBUTES)]; - new_tok_gsids = (PTOKEN_GROUPS) grps_buf; - new_tok_gsids->GroupCount = tmp_gsids.count; - for (DWORD i = 0; i < new_tok_gsids->GroupCount; ++i) - { - new_tok_gsids->Groups[i].Sid = tmp_gsids.sids[i]; - new_tok_gsids->Groups[i].Attributes = SE_GROUP_MANDATORY | - SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_ENABLED; - } - if (auth_pos >= 0) - new_tok_gsids->Groups[auth_pos].Attributes |= SE_GROUP_LOGON_ID; - - /* Retrieve list of privileges of that user. */ - if (!(privs = get_priv_list (lsa, usersid, tmp_gsids))) - goto out; - - /* Let's be heroic... */ - ret = NtCreateToken (&token, TOKEN_ALL_ACCESS, &oa, TokenImpersonation, - &auth_luid, &exp, &user, new_tok_gsids, privs, &owner, - &pgrp, &dacl, &source); - if (ret) - __seterrno_from_nt_status (ret); - else if (GetLastError () == ERROR_PROC_NOT_FOUND) - { - __seterrno (); - debug_printf ("Loading NtCreateToken failed."); - } - else - { - /* Convert to primary token. */ - if (!DuplicateTokenEx (token, MAXIMUM_ALLOWED, &sec_none, - SecurityImpersonation, TokenPrimary, - &primary_token)) - { - __seterrno (); - debug_printf ("DuplicateTokenEx %E"); - } - } - -out: - pop_self_privilege (); - if (token != INVALID_HANDLE_VALUE) - CloseHandle (token); - if (privs) - free (privs); - if (my_tok_gsids) - free (my_tok_gsids); - close_local_policy (lsa); - - debug_printf ("%d = create_token ()", primary_token); - return primary_token; -} - -int subauth_id = 255; - -HANDLE -subauth (struct passwd *pw) -{ - LSA_STRING name; - HANDLE lsa_hdl; - LSA_OPERATIONAL_MODE sec_mode; - NTSTATUS ret, ret2; - ULONG package_id, size; - struct { - LSA_STRING str; - CHAR buf[16]; - } origin; - struct { - MSV1_0_LM20_LOGON auth; - WCHAR dombuf[INTERNET_MAX_HOST_NAME_LENGTH + 1]; - WCHAR usrbuf[UNLEN + 1]; - WCHAR wkstbuf[1]; - CHAR authinf1[1]; - CHAR authinf2[1]; - } subbuf; - TOKEN_SOURCE ts; - PMSV1_0_LM20_LOGON_PROFILE profile; - LUID luid; - QUOTA_LIMITS quota; - char nt_domain[INTERNET_MAX_HOST_NAME_LENGTH + 1]; - char nt_user[UNLEN + 1]; - HANDLE user_token = INVALID_HANDLE_VALUE; - HANDLE primary_token = INVALID_HANDLE_VALUE; - - push_self_privilege (SE_TCB_PRIV, true); - - /* Register as logon process. */ - str2lsa (name, "Cygwin"); - SetLastError (0); - ret = LsaRegisterLogonProcess (&name, &lsa_hdl, &sec_mode); - if (ret != STATUS_SUCCESS) - { - debug_printf ("LsaRegisterLogonProcess: %d", ret); - __seterrno_from_win_error (LsaNtStatusToWinError (ret)); - goto out; - } - else if (GetLastError () == ERROR_PROC_NOT_FOUND) - { - debug_printf ("Couldn't load Secur32.dll"); - goto out; - } - /* Get handle to MSV1_0 package. */ - str2lsa (name, MSV1_0_PACKAGE_NAME); - ret = LsaLookupAuthenticationPackage (lsa_hdl, &name, &package_id); - if (ret != STATUS_SUCCESS) - { - debug_printf ("LsaLookupAuthenticationPackage: %d", ret); - __seterrno_from_win_error (LsaNtStatusToWinError (ret)); - LsaDeregisterLogonProcess (lsa_hdl); - goto out; - } - /* Create origin. */ - str2buf2lsa (origin.str, origin.buf, "Cygwin"); - /* Create token source. */ - memcpy (ts.SourceName, "Cygwin.1", 8); - ts.SourceIdentifier.HighPart = 0; - ts.SourceIdentifier.LowPart = 0x0100; - /* Get user information. */ - extract_nt_dom_user (pw, nt_domain, nt_user); - /* Fill subauth with values. */ - subbuf.auth.MessageType = MsV1_0NetworkLogon; - str2buf2uni (subbuf.auth.LogonDomainName, subbuf.dombuf, nt_domain); - str2buf2uni (subbuf.auth.UserName, subbuf.usrbuf, nt_user); - str2buf2uni (subbuf.auth.Workstation, subbuf.wkstbuf, ""); - memcpy (subbuf.auth.ChallengeToClient, "12345678", MSV1_0_CHALLENGE_LENGTH); - str2buf2lsa (subbuf.auth.CaseSensitiveChallengeResponse, subbuf.authinf1, ""); - str2buf2lsa (subbuf.auth.CaseInsensitiveChallengeResponse,subbuf.authinf2,""); - subbuf.auth.ParameterControl = 0 | (subauth_id << 24); - /* Try to logon... */ - ret = LsaLogonUser (lsa_hdl, (PLSA_STRING) &origin, Network, - package_id, &subbuf, sizeof subbuf, - NULL, &ts, (PVOID *) &profile, &size, - &luid, &user_token, "a, &ret2); - if (ret != STATUS_SUCCESS) - { - debug_printf ("LsaLogonUser: %d", ret); - __seterrno_from_win_error (LsaNtStatusToWinError (ret)); - LsaDeregisterLogonProcess (lsa_hdl); - goto out; - } - LsaFreeReturnBuffer (profile); - /* Convert to primary token. */ - if (!DuplicateTokenEx (user_token, TOKEN_ALL_ACCESS, &sec_none, - SecurityImpersonation, TokenPrimary, &primary_token)) - __seterrno (); - -out: - pop_self_privilege (); - if (user_token != INVALID_HANDLE_VALUE) - CloseHandle (user_token); - return primary_token; -} - -/* read_sd reads a security descriptor from a file. - In case of error, -1 is returned and errno is set. - If sd_buf is too small, 0 is returned and sd_size - is set to the needed buffer size. - On success, 1 is returned. - - GetFileSecurity() is used instead of BackupRead() - to avoid access denied errors if the caller has - not the permission to open that file for read. - - Originally the function should return the size - of the SD on success. Unfortunately NT returns - 0 in `len' on success, while W2K returns the - correct size! - - 2003-11-26: Now the function allocates the space needed by itself so - it knows the real size and returns it in the security_descriptor object. -*/ - -LONG -read_sd (const char *file, security_descriptor &sd) -{ - - DWORD len = 0; - const char *pfile = file; - char fbuf[CYG_MAX_PATH]; - if (current_codepage == oem_cp) - { - DWORD fname_len = min (sizeof (fbuf) - 1, strlen (file)); - bzero (fbuf, sizeof (fbuf)); - OemToCharBuff (file, fbuf, fname_len); - pfile = fbuf; - } - - if (!GetFileSecurity (pfile, - OWNER_SECURITY_INFORMATION - | GROUP_SECURITY_INFORMATION - | DACL_SECURITY_INFORMATION, - NULL, 0, &len) - && GetLastError () != ERROR_INSUFFICIENT_BUFFER) - { - debug_printf ("file %s", file); - __seterrno (); - return -1; - } - debug_printf ("file %s: len %d", file, len); - if (!sd.malloc (len)) - { - set_errno (ENOMEM); - return -1; - } - if (!GetFileSecurity (pfile, - OWNER_SECURITY_INFORMATION - | GROUP_SECURITY_INFORMATION - | DACL_SECURITY_INFORMATION, - sd, len, &len)) - { - __seterrno (); - return -1; - } - return sd.size (); -} - -LONG -write_sd (HANDLE fh, const char *file, security_descriptor &sd) -{ - NTSTATUS ret = STATUS_SUCCESS; - int retry = 0; - int res = -1; - for (; retry < 2; ++retry) - { - if (retry && (fh = CreateFile (file, WRITE_OWNER | WRITE_DAC, - FILE_SHARE_READ | FILE_SHARE_WRITE, - &sec_none_nih, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL - | FILE_FLAG_BACKUP_SEMANTICS, - NULL)) == INVALID_HANDLE_VALUE) - break; - if (fh && (ret = NtSetSecurityObject (fh, - DACL_SECURITY_INFORMATION - | GROUP_SECURITY_INFORMATION - | OWNER_SECURITY_INFORMATION, - sd)) == STATUS_SUCCESS) - break; - } - if (retry && fh != INVALID_HANDLE_VALUE) - CloseHandle (fh); - if (fh == INVALID_HANDLE_VALUE) /* CreateFile failed */ - __seterrno (); - else if (ret != STATUS_SUCCESS) /* NtSetSecurityObject failed */ - __seterrno_from_nt_status (ret); - else /* Everything's fine. */ - res = 0; - return res; -} - -static void -get_attribute_from_acl (mode_t *attribute, PACL acl, PSID owner_sid, - PSID group_sid, bool grp_member) -{ - ACCESS_ALLOWED_ACE *ace; - int allow = 0; - int deny = 0; - int *flags, *anti; - - for (DWORD i = 0; i < acl->AceCount; ++i) - { - if (!GetAce (acl, i, (PVOID *) &ace)) - continue; - if (ace->Header.AceFlags & INHERIT_ONLY) - continue; - switch (ace->Header.AceType) - { - case ACCESS_ALLOWED_ACE_TYPE: - flags = &allow; - anti = &deny; - break; - case ACCESS_DENIED_ACE_TYPE: - flags = &deny; - anti = &allow; - break; - default: - continue; - } - - cygpsid ace_sid ((PSID) &ace->SidStart); - if (ace_sid == well_known_world_sid) - { - if (ace->Mask & FILE_READ_BITS) - *flags |= ((!(*anti & S_IROTH)) ? S_IROTH : 0) - | ((!(*anti & S_IRGRP)) ? S_IRGRP : 0) - | ((!(*anti & S_IRUSR)) ? S_IRUSR : 0); - if (ace->Mask & FILE_WRITE_BITS) - *flags |= ((!(*anti & S_IWOTH)) ? S_IWOTH : 0) - | ((!(*anti & S_IWGRP)) ? S_IWGRP : 0) - | ((!(*anti & S_IWUSR)) ? S_IWUSR : 0); - if (ace->Mask & FILE_EXEC_BITS) - *flags |= ((!(*anti & S_IXOTH)) ? S_IXOTH : 0) - | ((!(*anti & S_IXGRP)) ? S_IXGRP : 0) - | ((!(*anti & S_IXUSR)) ? S_IXUSR : 0); - if ((S_ISDIR (*attribute)) && - (ace->Mask & (FILE_WRITE_DATA | FILE_EXECUTE | FILE_DELETE_CHILD)) - == (FILE_WRITE_DATA | FILE_EXECUTE)) - *flags |= S_ISVTX; - } - else if (ace_sid == well_known_null_sid) - { - /* Read SUID, SGID and VTX bits from NULL ACE. */ - if (ace->Mask & FILE_READ_DATA) - *flags |= S_ISVTX; - if (ace->Mask & FILE_WRITE_DATA) - *flags |= S_ISGID; - if (ace->Mask & FILE_APPEND_DATA) - *flags |= S_ISUID; - } - else if (ace_sid == owner_sid) - { - if (ace->Mask & FILE_READ_BITS) - *flags |= ((!(*anti & S_IRUSR)) ? S_IRUSR : 0); - if (ace->Mask & FILE_WRITE_BITS) - *flags |= ((!(*anti & S_IWUSR)) ? S_IWUSR : 0); - if (ace->Mask & FILE_EXEC_BITS) - *flags |= ((!(*anti & S_IXUSR)) ? S_IXUSR : 0); - } - else if (ace_sid == group_sid) - { - if (ace->Mask & FILE_READ_BITS) - *flags |= ((!(*anti & S_IRGRP)) ? S_IRGRP : 0) - | ((grp_member && !(*anti & S_IRUSR)) ? S_IRUSR : 0); - if (ace->Mask & FILE_WRITE_BITS) - *flags |= ((!(*anti & S_IWGRP)) ? S_IWGRP : 0) - | ((grp_member && !(*anti & S_IWUSR)) ? S_IWUSR : 0); - if (ace->Mask & FILE_EXEC_BITS) - *flags |= ((!(*anti & S_IXGRP)) ? S_IXGRP : 0) - | ((grp_member && !(*anti & S_IXUSR)) ? S_IXUSR : 0); - } - } - *attribute &= ~(S_IRWXU | S_IRWXG | S_IRWXO | S_ISVTX | S_ISGID | S_ISUID); - if (owner_sid && group_sid && EqualSid (owner_sid, group_sid) - /* FIXME: temporary exception for /var/empty */ - && well_known_system_sid != group_sid) - { - allow &= ~(S_IRGRP | S_IWGRP | S_IXGRP); - allow |= (((allow & S_IRUSR) ? S_IRGRP : 0) - | ((allow & S_IWUSR) ? S_IWGRP : 0) - | ((allow & S_IXUSR) ? S_IXGRP : 0)); - } - *attribute |= allow; -} - -static void -get_info_from_sd (PSECURITY_DESCRIPTOR psd, mode_t *attribute, - __uid32_t *uidret, __gid32_t *gidret) -{ - if (!psd) - { - /* If reading the security descriptor failed, treat the object - as unreadable. */ - if (attribute) - *attribute &= ~(S_IRWXU | S_IRWXG | S_IRWXO); - if (uidret) - *uidret = ILLEGAL_UID; - if (gidret) - *gidret = ILLEGAL_GID; - return; - } - - cygpsid owner_sid; - cygpsid group_sid; - BOOL dummy; - - if (!GetSecurityDescriptorOwner (psd, (PSID *) &owner_sid, &dummy)) - debug_printf ("GetSecurityDescriptorOwner %E"); - if (!GetSecurityDescriptorGroup (psd, (PSID *) &group_sid, &dummy)) - debug_printf ("GetSecurityDescriptorGroup %E"); - - __uid32_t uid; - __gid32_t gid; - bool grp_member = get_sids_info (owner_sid, group_sid, &uid, &gid); - if (uidret) - *uidret = uid; - if (gidret) - *gidret = gid; - - if (!attribute) - { - syscall_printf ("uid %d, gid %d", uid, gid); - return; - } - - PACL acl; - BOOL acl_exists; - - if (!GetSecurityDescriptorDacl (psd, &acl_exists, &acl, &dummy)) - { - __seterrno (); - debug_printf ("GetSecurityDescriptorDacl %E"); - *attribute &= ~(S_IRWXU | S_IRWXG | S_IRWXO); - } - else if (!acl_exists || !acl) - *attribute |= S_IRWXU | S_IRWXG | S_IRWXO; - else - get_attribute_from_acl (attribute, acl, owner_sid, group_sid, grp_member); - - syscall_printf ("%sACL %x, uid %d, gid %d", - (!acl_exists || !acl)?"NO ":"", *attribute, uid, gid); -} - -static void -get_nt_attribute (const char *file, mode_t *attribute, - __uid32_t *uidret, __gid32_t *gidret) -{ - security_descriptor sd; - - if (read_sd (file, sd) <= 0) - debug_printf ("read_sd %E"); - get_info_from_sd (sd, attribute, uidret, gidret); -} - -static int -get_reg_security (HANDLE handle, security_descriptor &sd_ret) -{ - LONG ret; - DWORD len = 0; - - ret = RegGetKeySecurity ((HKEY) handle, - DACL_SECURITY_INFORMATION - | GROUP_SECURITY_INFORMATION - | OWNER_SECURITY_INFORMATION, - sd_ret, &len); - if (ret == ERROR_INSUFFICIENT_BUFFER) - { - if (!sd_ret.malloc (len)) - set_errno (ENOMEM); - else - ret = RegGetKeySecurity ((HKEY) handle, - DACL_SECURITY_INFORMATION - | GROUP_SECURITY_INFORMATION - | OWNER_SECURITY_INFORMATION, - sd_ret, &len); - } - if (ret != STATUS_SUCCESS) - { - __seterrno (); - return -1; - } - return 0; -} - -int -get_nt_object_security (HANDLE handle, SE_OBJECT_TYPE object_type, - security_descriptor &sd_ret) -{ - NTSTATUS ret; - ULONG len = 0; - - /* Unfortunately, NtQuerySecurityObject doesn't work on predefined registry - keys like HKEY_LOCAL_MACHINE. It fails with "Invalid Handle". So we - have to retreat to the Win32 registry functions for registry keys. - What bugs me is that RegGetKeySecurity is obviously just a wrapper - around NtQuerySecurityObject, but there seems to be no function to - convert pseudo HKEY values to real handles. */ - if (object_type == SE_REGISTRY_KEY) - return get_reg_security (handle, sd_ret); - - ret = NtQuerySecurityObject (handle, - DACL_SECURITY_INFORMATION - | GROUP_SECURITY_INFORMATION - | OWNER_SECURITY_INFORMATION, - sd_ret, len, &len); - if (ret == STATUS_BUFFER_TOO_SMALL) - { - if (!sd_ret.malloc (len)) - set_errno (ENOMEM); - else - ret = NtQuerySecurityObject (handle, - DACL_SECURITY_INFORMATION - | GROUP_SECURITY_INFORMATION - | OWNER_SECURITY_INFORMATION, - sd_ret, len, &len); - } - if (ret != STATUS_SUCCESS) - { - __seterrno_from_nt_status (ret); - return -1; - } - return 0; -} - -static int -get_nt_object_attribute (HANDLE handle, SE_OBJECT_TYPE object_type, - mode_t *attribute, __uid32_t *uidret, - __gid32_t *gidret) -{ - security_descriptor sd; - PSECURITY_DESCRIPTOR psd = NULL; - - if (get_nt_object_security (handle, object_type, sd)) - { - if (object_type == SE_FILE_OBJECT) - return -1; - } - else - psd = sd; - get_info_from_sd (psd, attribute, uidret, gidret); - return 0; -} - -int -get_object_attribute (HANDLE handle, SE_OBJECT_TYPE object_type, - mode_t *attribute, __uid32_t *uidret, __gid32_t *gidret) -{ - if (allow_ntsec) - { - get_nt_object_attribute (handle, object_type, attribute, uidret, gidret); - return 0; - } - /* The entries are already set to default values */ - return -1; -} - -int -get_file_attribute (int use_ntsec, HANDLE handle, const char *file, - mode_t *attribute, __uid32_t *uidret, __gid32_t *gidret) -{ - int res; - syscall_printf ("file: %s", file); - - if (use_ntsec && allow_ntsec) - { - if (!handle || get_nt_object_attribute (handle, SE_FILE_OBJECT, - attribute, uidret, gidret)) - get_nt_attribute (file, attribute, uidret, gidret); - return 0; - } - - if (uidret) - *uidret = myself->uid; - if (gidret) - *gidret = myself->gid; - - if (!attribute) - return 0; - - if (allow_ntea) - { - int oatt = *attribute; - res = NTReadEA (file, ".UNIXATTR", (char *)attribute, sizeof (*attribute)); - *attribute |= oatt; - } - else - res = 0; - - return res > 0 ? 0 : -1; -} - -bool -add_access_allowed_ace (PACL acl, int offset, DWORD attributes, - PSID sid, size_t &len_add, DWORD inherit) -{ - if (!AddAccessAllowedAce (acl, ACL_REVISION, attributes, sid)) - { - __seterrno (); - return false; - } - ACCESS_ALLOWED_ACE *ace; - if (inherit && GetAce (acl, offset, (PVOID *) &ace)) - ace->Header.AceFlags |= inherit; - len_add += sizeof (ACCESS_ALLOWED_ACE) - sizeof (DWORD) + GetLengthSid (sid); - return true; -} - -bool -add_access_denied_ace (PACL acl, int offset, DWORD attributes, - PSID sid, size_t &len_add, DWORD inherit) -{ - if (!AddAccessDeniedAce (acl, ACL_REVISION, attributes, sid)) - { - __seterrno (); - return false; - } - ACCESS_DENIED_ACE *ace; - if (inherit && GetAce (acl, offset, (PVOID *) &ace)) - ace->Header.AceFlags |= inherit; - len_add += sizeof (ACCESS_DENIED_ACE) - sizeof (DWORD) + GetLengthSid (sid); - return true; -} - -static PSECURITY_DESCRIPTOR -alloc_sd (__uid32_t uid, __gid32_t gid, int attribute, - security_descriptor &sd_ret) -{ - BOOL dummy; - - debug_printf("uid %d, gid %d, attribute %x", uid, gid, attribute); - - /* Get owner and group from current security descriptor. */ - PSID cur_owner_sid = NULL; - PSID cur_group_sid = NULL; - if (!GetSecurityDescriptorOwner (sd_ret, &cur_owner_sid, &dummy)) - debug_printf ("GetSecurityDescriptorOwner %E"); - if (!GetSecurityDescriptorGroup (sd_ret, &cur_group_sid, &dummy)) - debug_printf ("GetSecurityDescriptorGroup %E"); - - /* Get SID of owner. */ - cygsid owner_sid; - /* Check for current user first */ - if (uid == myself->uid) - owner_sid = cygheap->user.sid (); - else if (uid == ILLEGAL_UID) - owner_sid = cur_owner_sid; - else if (!owner_sid.getfrompw (internal_getpwuid (uid))) - { - set_errno (EINVAL); - return NULL; - } - owner_sid.debug_print ("alloc_sd: owner SID ="); - - /* Get SID of new group. */ - cygsid group_sid; - /* Check for current user first */ - if (gid == myself->gid) - group_sid = cygheap->user.groups.pgsid; - else if (gid == ILLEGAL_GID) - group_sid = cur_group_sid; - else if (!group_sid.getfromgr (internal_getgrgid (gid))) - { - set_errno (EINVAL); - return NULL; - } - group_sid.debug_print ("alloc_sd: group SID ="); - - /* Initialize local security descriptor. */ - SECURITY_DESCRIPTOR sd; - if (!InitializeSecurityDescriptor (&sd, SECURITY_DESCRIPTOR_REVISION)) - { - __seterrno (); - return NULL; - } - - /* - * We set the SE_DACL_PROTECTED flag here to prevent the DACL from being - * modified by inheritable ACEs. - * This flag as well as the SetSecurityDescriptorControl call are available - * only since Win2K. - */ - if (wincap.has_security_descriptor_control ()) - SetSecurityDescriptorControl (&sd, SE_DACL_PROTECTED, SE_DACL_PROTECTED); - - /* Create owner for local security descriptor. */ - if (!SetSecurityDescriptorOwner (&sd, owner_sid, FALSE)) - { - __seterrno (); - return NULL; - } - - /* Create group for local security descriptor. */ - if (!SetSecurityDescriptorGroup (&sd, group_sid, FALSE)) - { - __seterrno (); - return NULL; - } - - /* Initialize local access control list. */ - PACL acl = (PACL) alloca (3072); - if (!InitializeAcl (acl, 3072, ACL_REVISION)) - { - __seterrno (); - return NULL; - } - - /* From here fill ACL. */ - size_t acl_len = sizeof (ACL); - int ace_off = 0; - - /* Construct allow attribute for owner. */ - DWORD owner_allow = STANDARD_RIGHTS_ALL - | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA; - /* This has nothing to do with traverse checking in the first place, but - since traverse checking is the setting which switches to POSIX-like - permission rules, the below is all too similar. Removing the delete - bit for a file or directory results in checking the parent directories' - ACL, if the current user has the FILE_DELETE_CHILD bit set. This is - how it is on POSIX systems. */ - if (allow_traverse) - owner_allow &= ~DELETE; - if (attribute & S_IRUSR) - owner_allow |= FILE_GENERIC_READ; - if (attribute & S_IWUSR) - owner_allow |= FILE_GENERIC_WRITE; - if (attribute & S_IXUSR) - owner_allow |= FILE_GENERIC_EXECUTE; - if (S_ISDIR (attribute) - && (attribute & (S_IWUSR | S_IXUSR)) == (S_IWUSR | S_IXUSR)) - owner_allow |= FILE_DELETE_CHILD; - - /* Construct allow attribute for group. */ - DWORD group_allow = STANDARD_RIGHTS_READ - | FILE_READ_ATTRIBUTES | FILE_READ_EA; - if (attribute & S_IRGRP) - group_allow |= FILE_GENERIC_READ; - if (attribute & S_IWGRP) - group_allow |= STANDARD_RIGHTS_WRITE | FILE_GENERIC_WRITE; - if (attribute & S_IXGRP) - group_allow |= FILE_GENERIC_EXECUTE; - if (S_ISDIR (attribute) - && (attribute & (S_IWGRP | S_IXGRP)) == (S_IWGRP | S_IXGRP) - && !(attribute & S_ISVTX)) - group_allow |= FILE_DELETE_CHILD; - - /* Construct allow attribute for everyone. */ - DWORD other_allow = STANDARD_RIGHTS_READ - | FILE_READ_ATTRIBUTES | FILE_READ_EA; - if (attribute & S_IROTH) - other_allow |= FILE_GENERIC_READ; - if (attribute & S_IWOTH) - other_allow |= STANDARD_RIGHTS_WRITE | FILE_GENERIC_WRITE; - if (attribute & S_IXOTH) - other_allow |= FILE_GENERIC_EXECUTE; - if (S_ISDIR (attribute) - && (attribute & (S_IWOTH | S_IXOTH)) == (S_IWOTH | S_IXOTH) - && !(attribute & S_ISVTX)) - other_allow |= FILE_DELETE_CHILD; - - /* Construct SUID, SGID and VTX bits in NULL ACE. */ - DWORD null_allow = 0L; - if (attribute & (S_ISUID | S_ISGID | S_ISVTX)) - { - if (attribute & S_ISUID) - null_allow |= FILE_APPEND_DATA; - if (attribute & S_ISGID) - null_allow |= FILE_WRITE_DATA; - if (attribute & S_ISVTX) - null_allow |= FILE_READ_DATA; - } - - /* Add owner and group permissions if SIDs are equal - and construct deny attributes for group and owner. */ - bool isownergroup; - if ((isownergroup = (owner_sid == group_sid))) - owner_allow |= group_allow; - - DWORD owner_deny = ~owner_allow & (group_allow | other_allow); - owner_deny &= ~(STANDARD_RIGHTS_READ - | FILE_READ_ATTRIBUTES | FILE_READ_EA - | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA); - - DWORD group_deny = ~group_allow & other_allow; - group_deny &= ~(STANDARD_RIGHTS_READ - | FILE_READ_ATTRIBUTES | FILE_READ_EA); - - /* Set deny ACE for owner. */ - if (owner_deny - && !add_access_denied_ace (acl, ace_off++, owner_deny, - owner_sid, acl_len, NO_INHERITANCE)) - return NULL; - /* Set deny ACE for group here to respect the canonical order, - if this does not impact owner */ - if (group_deny && !(group_deny & owner_allow) && !isownergroup - && !add_access_denied_ace (acl, ace_off++, group_deny, - group_sid, acl_len, NO_INHERITANCE)) - return NULL; - /* Set allow ACE for owner. */ - if (!add_access_allowed_ace (acl, ace_off++, owner_allow, - owner_sid, acl_len, NO_INHERITANCE)) - return NULL; - /* Set deny ACE for group, if still needed. */ - if (group_deny & owner_allow && !isownergroup - && !add_access_denied_ace (acl, ace_off++, group_deny, - group_sid, acl_len, NO_INHERITANCE)) - return NULL; - /* Set allow ACE for group. */ - if (!isownergroup - && !add_access_allowed_ace (acl, ace_off++, group_allow, - group_sid, acl_len, NO_INHERITANCE)) - return NULL; - - /* Set allow ACE for everyone. */ - if (!add_access_allowed_ace (acl, ace_off++, other_allow, - well_known_world_sid, acl_len, NO_INHERITANCE)) - return NULL; - /* Set null ACE for special bits. */ - if (null_allow - && !add_access_allowed_ace (acl, ace_off++, null_allow, - well_known_null_sid, acl_len, NO_INHERITANCE)) - return NULL; - - /* Fill ACL with unrelated ACEs from current security descriptor. */ - PACL oacl; - BOOL acl_exists = FALSE; - ACCESS_ALLOWED_ACE *ace; - if (GetSecurityDescriptorDacl (sd_ret, &acl_exists, &oacl, &dummy) - && acl_exists && oacl) - for (DWORD i = 0; i < oacl->AceCount; ++i) - if (GetAce (oacl, i, (PVOID *) &ace)) - { - cygpsid ace_sid ((PSID) &ace->SidStart); - - /* Check for related ACEs. */ - if (ace_sid == well_known_null_sid) - continue; - if ((ace_sid == cur_owner_sid) - || (ace_sid == owner_sid) - || (ace_sid == cur_group_sid) - || (ace_sid == group_sid) - || (ace_sid == well_known_world_sid)) - { - if (ace->Header.AceFlags & SUB_CONTAINERS_AND_OBJECTS_INHERIT) - ace->Header.AceFlags |= INHERIT_ONLY; - else - continue; - } - /* - * Add unrelated ACCESS_DENIED_ACE to the beginning but - * behind the owner_deny, ACCESS_ALLOWED_ACE to the end. - * FIXME: this would break the order of the inherit_only ACEs - */ - if (!AddAce (acl, ACL_REVISION, - ace->Header.AceType == ACCESS_DENIED_ACE_TYPE? - (owner_deny ? 1 : 0) : MAXDWORD, - (LPVOID) ace, ace->Header.AceSize)) - { - __seterrno (); - return NULL; - } - acl_len += ace->Header.AceSize; - } - - /* Construct appropriate inherit attribute for new directories */ - if (S_ISDIR (attribute) && !acl_exists) - { - const DWORD inherit = SUB_CONTAINERS_AND_OBJECTS_INHERIT | INHERIT_ONLY; - -#if 0 /* FIXME: Not done currently as this breaks the canonical order */ - /* Set deny ACE for owner. */ - if (owner_deny - && !add_access_denied_ace (acl, ace_off++, owner_deny, - well_known_creator_owner_sid, acl_len, inherit)) - return NULL; - /* Set deny ACE for group here to respect the canonical order, - if this does not impact owner */ - if (group_deny && !(group_deny & owner_allow) - && !add_access_denied_ace (acl, ace_off++, group_deny, - well_known_creator_group_sid, acl_len, inherit)) - return NULL; -#endif - /* Set allow ACE for owner. */ - if (!add_access_allowed_ace (acl, ace_off++, owner_allow, - well_known_creator_owner_sid, acl_len, inherit)) - return NULL; -#if 0 /* FIXME: Not done currently as this breaks the canonical order and - won't be preserved on chown and chmod */ - /* Set deny ACE for group, conflicting with owner_allow. */ - if (group_deny & owner_allow - && !add_access_denied_ace (acl, ace_off++, group_deny, - well_known_creator_group_sid, acl_len, inherit)) - return NULL; -#endif - /* Set allow ACE for group. */ - if (!add_access_allowed_ace (acl, ace_off++, group_allow, - well_known_creator_group_sid, acl_len, inherit)) - return NULL; - /* Set allow ACE for everyone. */ - if (!add_access_allowed_ace (acl, ace_off++, other_allow, - well_known_world_sid, acl_len, inherit)) - return NULL; - } - - /* Set AclSize to computed value. */ - acl->AclSize = acl_len; - debug_printf ("ACL-Size: %d", acl_len); - - /* Create DACL for local security descriptor. */ - if (!SetSecurityDescriptorDacl (&sd, TRUE, acl, FALSE)) - { - __seterrno (); - return NULL; - } - - /* Make self relative security descriptor. */ - DWORD sd_size = 0; - MakeSelfRelativeSD (&sd, sd_ret, &sd_size); - if (sd_size <= 0) - { - __seterrno (); - return NULL; - } - if (!sd_ret.malloc (sd_size)) - { - set_errno (ENOMEM); - return NULL; - } - if (!MakeSelfRelativeSD (&sd, sd_ret, &sd_size)) - { - __seterrno (); - return NULL; - } - debug_printf ("Created SD-Size: %u", sd_ret.size ()); - - return sd_ret; -} - -void -set_security_attribute (int attribute, PSECURITY_ATTRIBUTES psa, - security_descriptor &sd) -{ - psa->lpSecurityDescriptor = sd.malloc (SECURITY_DESCRIPTOR_MIN_LENGTH); - InitializeSecurityDescriptor ((PSECURITY_DESCRIPTOR)psa->lpSecurityDescriptor, - SECURITY_DESCRIPTOR_REVISION); - psa->lpSecurityDescriptor = alloc_sd (geteuid32 (), getegid32 (), - attribute, sd); -} - -static int -set_nt_attribute (HANDLE handle, const char *file, - __uid32_t uid, __gid32_t gid, int attribute) -{ - if (!wincap.has_security ()) - return 0; - - security_descriptor sd; - - if ((!handle || get_nt_object_security (handle, SE_FILE_OBJECT, sd)) - && read_sd (file, sd) <= 0) - { - debug_printf ("read_sd %E"); - return -1; - } - - if (!alloc_sd (uid, gid, attribute, sd)) - return -1; - - return write_sd (handle, file, sd); -} - -int -set_file_attribute (bool use_ntsec, HANDLE handle, const char *file, - __uid32_t uid, __gid32_t gid, int attribute) -{ - int ret = 0; - - if (use_ntsec && allow_ntsec) - ret = set_nt_attribute (handle, file, uid, gid, attribute); - else if (allow_ntea && !NTWriteEA (file, ".UNIXATTR", (char *) &attribute, - sizeof (attribute))) - { - __seterrno (); - ret = -1; - } - syscall_printf ("%d = set_file_attribute (%s, %d, %d, %p)", - ret, file, uid, gid, attribute); - return ret; -} - -int -set_file_attribute (bool use_ntsec, HANDLE handle, const char *file, - int attribute) -{ - return set_file_attribute (use_ntsec, handle, file, - myself->uid, myself->gid, attribute); -} - -int -check_file_access (const char *fn, int flags) -{ - int ret = -1; - - security_descriptor sd; - - HANDLE hToken; - BOOL status; - char pbuf[sizeof (PRIVILEGE_SET) + 3 * sizeof (LUID_AND_ATTRIBUTES)]; - DWORD desired = 0, granted, plength = sizeof pbuf; - static GENERIC_MAPPING NO_COPY mapping = { FILE_GENERIC_READ, - FILE_GENERIC_WRITE, - FILE_GENERIC_EXECUTE, - FILE_ALL_ACCESS }; - if (read_sd (fn, sd) <= 0) - goto done; - - if (cygheap->user.issetuid ()) - hToken = cygheap->user.token (); - else - hToken = hProcImpToken; - - if (flags & R_OK) - desired |= FILE_READ_DATA; - if (flags & W_OK) - desired |= FILE_WRITE_DATA; - if (flags & X_OK) - desired |= FILE_EXECUTE; - if (!AccessCheck (sd, hToken, desired, &mapping, - (PPRIVILEGE_SET) pbuf, &plength, &granted, &status)) - __seterrno (); - else if (!status) - set_errno (EACCES); - else - ret = 0; - done: - debug_printf ("flags %x, ret %d", flags, ret); - return ret; -} diff --git a/winsup/cygwin/security.h b/winsup/cygwin/security.h deleted file mode 100644 index a15f55ed2..000000000 --- a/winsup/cygwin/security.h +++ /dev/null @@ -1,397 +0,0 @@ -/* security.h: security declarations - - Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SECURITY_H -#define _SECURITY_H - -#include - -#define DEFAULT_UID DOMAIN_USER_RID_ADMIN -#define UNKNOWN_UID 400 /* Non conflicting number */ -#define UNKNOWN_GID 401 - -#define MAX_SID_LEN 40 -#define MAX_DACL_LEN(n) (sizeof (ACL) \ - + (n) * (sizeof (ACCESS_ALLOWED_ACE) - sizeof (DWORD) + MAX_SID_LEN)) -#define ACL_DEFAULT_SIZE 3072 -#define NO_SID ((PSID)NULL) - -/* Macro to define variable length SID structures */ -#define SID(name, comment, authority, count, rid...) \ -static NO_COPY struct { \ - BYTE Revision; \ - BYTE SubAuthorityCount; \ - SID_IDENTIFIER_AUTHORITY IdentifierAuthority; \ - DWORD SubAuthority[count]; \ -} name##_struct = { SID_REVISION, count, {authority}, {rid}}; \ -cygpsid NO_COPY name = (PSID) &name##_struct; - -#define FILE_READ_BITS (FILE_READ_DATA | GENERIC_READ | GENERIC_ALL) -#define FILE_WRITE_BITS (FILE_WRITE_DATA | GENERIC_WRITE | GENERIC_ALL) -#define FILE_EXEC_BITS (FILE_EXECUTE | GENERIC_EXECUTE | GENERIC_ALL) - -class cygpsid { -protected: - PSID psid; -public: - cygpsid () {} - cygpsid (PSID nsid) { psid = nsid; } - operator const PSID () { return psid; } - const PSID operator= (PSID nsid) { return psid = nsid;} - __uid32_t get_id (BOOL search_grp, int *type = NULL); - int get_uid () { return get_id (FALSE); } - int get_gid () { return get_id (TRUE); } - - char *string (char *nsidstr) const; - - bool operator== (const PSID nsid) const - { - if (!psid || !nsid) - return nsid == psid; - return EqualSid (psid, nsid); - } - bool operator!= (const PSID nsid) const - { return !(*this == nsid); } - bool operator== (const char *nsidstr) const; - bool operator!= (const char *nsidstr) const - { return !(*this == nsidstr); } - - void debug_print (const char *prefix = NULL) const - { - char buf[256] __attribute__ ((unused)); - debug_printf ("%s %s", prefix ?: "", string (buf) ?: "NULL"); - } -}; - -class cygsid : public cygpsid { - char sbuf[MAX_SID_LEN]; - - const PSID getfromstr (const char *nsidstr); - PSID get_sid (DWORD s, DWORD cnt, DWORD *r); - - inline const PSID assign (const PSID nsid) - { - if (!nsid) - psid = NO_SID; - else - { - psid = (PSID) sbuf; - CopySid (MAX_SID_LEN, psid, nsid); - } - return psid; - } - -public: - inline operator const PSID () { return psid; } - - inline const PSID operator= (cygsid &nsid) - { return assign (nsid); } - inline const PSID operator= (const PSID nsid) - { return assign (nsid); } - inline const PSID operator= (const char *nsidstr) - { return getfromstr (nsidstr); } - - inline cygsid () : cygpsid ((PSID) sbuf) {} - inline cygsid (const PSID nsid) { *this = nsid; } - inline cygsid (const char *nstrsid) { *this = nstrsid; } - - inline PSID set () { return psid = (PSID) sbuf; } - - BOOL getfrompw (const struct passwd *pw); - BOOL getfromgr (const struct __group32 *gr); -}; - -typedef enum { cygsidlist_empty, cygsidlist_alloc, cygsidlist_auto } cygsidlist_type; -class cygsidlist { - int maxcount; -public: - int count; - cygsid *sids; - cygsidlist_type type; - - cygsidlist (cygsidlist_type t, int m) - { - type = t; - count = 0; - maxcount = m; - if (t == cygsidlist_alloc) - sids = alloc_sids (m); - else - sids = new cygsid [m]; - } - ~cygsidlist () { if (type == cygsidlist_auto) delete [] sids; } - - BOOL add (const PSID nsi) /* Only with auto for now */ - { - if (count >= maxcount) - { - cygsid *tmp = new cygsid [ 2 * maxcount]; - if (!tmp) - return FALSE; - maxcount *= 2; - for (int i = 0; i < count; ++i) - tmp[i] = sids[i]; - delete [] sids; - sids = tmp; - } - sids[count++] = nsi; - return TRUE; - } - BOOL add (cygsid &nsi) { return add ((PSID) nsi); } - BOOL add (const char *sidstr) - { cygsid nsi (sidstr); return add (nsi); } - BOOL addfromgr (struct __group32 *gr) /* Only with alloc */ - { return sids[count].getfromgr (gr) && ++count; } - - BOOL operator+= (cygsid &si) { return add (si); } - BOOL operator+= (const char *sidstr) { return add (sidstr); } - BOOL operator+= (const PSID psid) { return add (psid); } - - int position (const PSID sid) const - { - for (int i = 0; i < count; ++i) - if (sids[i] == sid) - return i; - return -1; - } - - BOOL contains (const PSID sid) const { return position (sid) >= 0; } - cygsid *alloc_sids (int n); - void free_sids (); - void debug_print (const char *prefix = NULL) const - { - debug_printf ("-- begin sidlist ---"); - if (!count) - debug_printf ("No elements"); - for (int i = 0; i < count; ++i) - sids[i].debug_print (prefix); - debug_printf ("-- ende sidlist ---"); - } -}; - -/* Wrapper class to allow simple deleting of buffer space allocated - by read_sd() */ -class security_descriptor { -protected: - PSECURITY_DESCRIPTOR psd; - DWORD sd_size; -public: - security_descriptor () : psd (NULL), sd_size (0) {} - ~security_descriptor () { free (); } - - PSECURITY_DESCRIPTOR malloc (size_t nsize); - PSECURITY_DESCRIPTOR realloc (size_t nsize); - void free (); - - inline DWORD size () const { return sd_size; } - inline operator const PSECURITY_DESCRIPTOR () { return psd; } -}; - -class user_groups { -public: - cygsid pgsid; - cygsidlist sgsids; - BOOL ischanged; - - BOOL issetgroups () const { return (sgsids.type == cygsidlist_alloc); } - void update_supp (const cygsidlist &newsids) - { - sgsids.free_sids (); - sgsids = newsids; - ischanged = TRUE; - } - void clear_supp () - { - if (issetgroups ()) - { - sgsids.free_sids (); - ischanged = TRUE; - } - } - void update_pgrp (const PSID sid) - { - pgsid = sid; - ischanged = TRUE; - } -}; - -extern cygpsid well_known_null_sid; -extern cygpsid well_known_world_sid; -extern cygpsid well_known_local_sid; -extern cygpsid well_known_creator_owner_sid; -extern cygpsid well_known_creator_group_sid; -extern cygpsid well_known_dialup_sid; -extern cygpsid well_known_network_sid; -extern cygpsid well_known_batch_sid; -extern cygpsid well_known_interactive_sid; -extern cygpsid well_known_service_sid; -extern cygpsid well_known_authenticated_users_sid; -extern cygpsid well_known_system_sid; -extern cygpsid well_known_admins_sid; - -/* Order must be same as cygpriv in sec_helper.cc. */ -enum cygpriv_idx { - SE_CREATE_TOKEN_PRIV = 0, - SE_ASSIGNPRIMARYTOKEN_PRIV, - SE_LOCK_MEMORY_PRIV, - SE_INCREASE_QUOTA_PRIV, - SE_UNSOLICITED_INPUT_PRIV, - SE_MACHINE_ACCOUNT_PRIV, - SE_TCB_PRIV, - SE_SECURITY_PRIV, - SE_TAKE_OWNERSHIP_PRIV, - SE_LOAD_DRIVER_PRIV, - SE_SYSTEM_PROFILE_PRIV, - SE_SYSTEMTIME_PRIV, - SE_PROF_SINGLE_PROCESS_PRIV, - SE_INC_BASE_PRIORITY_PRIV, - SE_CREATE_PAGEFILE_PRIV, - SE_CREATE_PERMANENT_PRIV, - SE_BACKUP_PRIV, - SE_RESTORE_PRIV, - SE_SHUTDOWN_PRIV, - SE_DEBUG_PRIV, - SE_AUDIT_PRIV, - SE_SYSTEM_ENVIRONMENT_PRIV, - SE_CHANGE_NOTIFY_PRIV, - SE_REMOTE_SHUTDOWN_PRIV, - SE_CREATE_GLOBAL_PRIV, - SE_UNDOCK_PRIV, - SE_MANAGE_VOLUME_PRIV, - SE_IMPERSONATE_PRIV, - SE_ENABLE_DELEGATION_PRIV, - SE_SYNC_AGENT_PRIV, - - SE_NUM_PRIVS -}; - -const LUID *privilege_luid (enum cygpriv_idx idx); -const LUID *privilege_luid_by_name (const char *pname); -const char *privilege_name (enum cygpriv_idx idx); - -inline BOOL -legal_sid_type (SID_NAME_USE type) -{ - return type == SidTypeUser || type == SidTypeGroup - || type == SidTypeAlias || type == SidTypeWellKnownGroup; -} - -extern bool allow_ntea; -extern bool allow_ntsec; -extern bool allow_smbntsec; -extern bool allow_traverse; - -/* File manipulation */ -int __stdcall get_file_attribute (int, HANDLE, const char *, mode_t *, - __uid32_t * = NULL, __gid32_t * = NULL); -int __stdcall set_file_attribute (bool, HANDLE, const char *, int); -int __stdcall set_file_attribute (bool, HANDLE, const char *, __uid32_t, __gid32_t, int); -int __stdcall get_nt_object_security (HANDLE, SE_OBJECT_TYPE, - security_descriptor &); -int __stdcall get_object_attribute (HANDLE handle, SE_OBJECT_TYPE object_type, mode_t *, - __uid32_t * = NULL, __gid32_t * = NULL); -LONG __stdcall read_sd (const char *file, security_descriptor &sd); -LONG __stdcall write_sd (HANDLE fh, const char *file, security_descriptor &sd); -bool __stdcall add_access_allowed_ace (PACL acl, int offset, DWORD attributes, PSID sid, size_t &len_add, DWORD inherit); -bool __stdcall add_access_denied_ace (PACL acl, int offset, DWORD attributes, PSID sid, size_t &len_add, DWORD inherit); -int __stdcall check_file_access (const char *, int); - -void set_security_attribute (int attribute, PSECURITY_ATTRIBUTES psa, - security_descriptor &sd_buf); - -bool get_sids_info (cygpsid, cygpsid, __uid32_t * , __gid32_t *); - -/* sec_acl.cc */ -struct __acl32; -extern "C" int aclsort32 (int, int, __acl32 *); -extern "C" int acl32 (const char *, int, int, __acl32 *); -int getacl (HANDLE, const char *, DWORD, int, __acl32 *); -int setacl (HANDLE, const char *, int, __acl32 *); - -struct _UNICODE_STRING; -void __stdcall str2buf2uni (_UNICODE_STRING &, WCHAR *, const char *) __attribute__ ((regparm (3))); -void __stdcall str2uni_cat (_UNICODE_STRING &, const char *) __attribute__ ((regparm (2))); - -/* Try a subauthentication. */ -HANDLE subauth (struct passwd *pw); -/* Try creating a token directly. */ -HANDLE create_token (cygsid &usersid, user_groups &groups, struct passwd * pw); -/* Verify an existing token */ -bool verify_token (HANDLE token, cygsid &usersid, user_groups &groups, bool *pintern = NULL); -/* Get groups of a user */ -bool get_server_groups (cygsidlist &grp_list, PSID usersid, struct passwd *pw); - -/* Extract U-domain\user field from passwd entry. */ -void extract_nt_dom_user (const struct passwd *pw, char *domain, char *user); -/* Get default logonserver for a domain. */ -bool get_logon_server (const char * domain, char * server, WCHAR *wserver = NULL); - -/* sec_helper.cc: Security helper functions. */ -int set_privilege (HANDLE token, enum cygpriv_idx privilege, bool enable); -void set_cygwin_privileges (HANDLE token); - -#define set_process_privilege(p,v) set_privilege (hProcImpToken, (p), (v)) - -#define _push_thread_privilege(_priv, _val, _check) { \ - HANDLE _token = NULL, _dup_token = NULL; \ - if (wincap.has_security ()) \ - { \ - _token = (cygheap->user.issetuid () && (_check)) \ - ? cygheap->user.token () : hProcImpToken; \ - if (!DuplicateTokenEx (_token, MAXIMUM_ALLOWED, NULL, \ - SecurityImpersonation, TokenImpersonation, \ - &_dup_token)) \ - debug_printf ("DuplicateTokenEx: %E"); \ - else if (!ImpersonateLoggedOnUser (_dup_token)) \ - debug_printf ("ImpersonateLoggedOnUser: %E"); \ - else \ - set_privilege (_dup_token, (_priv), (_val)); \ - } -#define push_thread_privilege(_priv, _val) _push_thread_privilege(_priv,_val,1) -#define push_self_privilege(_priv, _val) _push_thread_privilege(_priv,_val,0) - -#define pop_thread_privilege() \ - if (_dup_token) \ - { \ - ImpersonateLoggedOnUser (_token); \ - CloseHandle (_dup_token); \ - } \ - } -#define pop_self_privilege() pop_thread_privilege() - -/* shared.cc: */ -/* Retrieve a security descriptor that allows all access */ -SECURITY_DESCRIPTOR *__stdcall get_null_sd (); - -/* Various types of security attributes for use in Create* functions. */ -extern SECURITY_ATTRIBUTES sec_none, sec_none_nih, sec_all, sec_all_nih; -extern SECURITY_ATTRIBUTES *__stdcall __sec_user (PVOID sa_buf, PSID sid1, PSID sid2, - DWORD access2, BOOL inherit) - __attribute__ ((regparm (3))); -extern bool sec_acl (PACL acl, bool original, bool admins, PSID sid1 = NO_SID, - PSID sid2 = NO_SID, DWORD access2 = 0); - -int __stdcall NTReadEA (const char *file, const char *attrname, char *buf, int len); -BOOL __stdcall NTWriteEA (const char *file, const char *attrname, const char *buf, int len); - -extern inline SECURITY_ATTRIBUTES * -sec_user_nih (SECURITY_ATTRIBUTES *sa_buf, PSID sid1 = NULL, PSID sid2 = NULL, - DWORD access2 = 0) -{ - return __sec_user (sa_buf, sid1, sid2, access2, FALSE); -} - -extern inline SECURITY_ATTRIBUTES * -sec_user (SECURITY_ATTRIBUTES *sa_buf, PSID sid1 = NULL, PSID sid2 = NULL, - DWORD access2 = 0) -{ - return __sec_user (sa_buf, sid1, sid2, access2, TRUE); -} -#endif /*_SECURITY_H*/ diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc deleted file mode 100644 index 073e8bcad..000000000 --- a/winsup/cygwin/select.cc +++ /dev/null @@ -1,1710 +0,0 @@ -/* select.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005 Red Hat, Inc. - - Written by Christopher Faylor of Cygnus Solutions - cgf@cygnus.com - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* The following line means that the BSD socket definitions for - fd_set, FD_ISSET etc. are used in this file. */ - -#define __INSIDE_CYGWIN_NET__ - -#include "winsup.h" -#include -#include -#include - -#include -#include -#include -#include -#include -#define USE_SYS_TYPES_FD_SET -#include -#include "cygerrno.h" -#include "select.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "pinfo.h" -#include "sigproc.h" -#include "tty.h" -#include "ntdll.h" -#include "cygtls.h" -#include - -/* - * All these defines below should be in sys/types.h - * but because of the includes above, they may not have - * been included. We create special UNIX_xxxx versions here. - */ - -#ifndef NBBY -#define NBBY 8 /* number of bits in a byte */ -#endif /* NBBY */ - -/* - * 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). - */ - -typedef long fd_mask; -#define UNIX_NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */ -#ifndef unix_howmany -#define unix_howmany(x,y) (((x)+((y)-1))/(y)) -#endif - -#define unix_fd_set fd_set - -#define NULL_fd_set ((fd_set *) NULL) -#define sizeof_fd_set(n) \ - ((unsigned) (NULL_fd_set->fds_bits + unix_howmany ((n), UNIX_NFDBITS))) -#define UNIX_FD_SET(n, p) \ - ((p)->fds_bits[(n)/UNIX_NFDBITS] |= (1L << ((n) % UNIX_NFDBITS))) -#define UNIX_FD_CLR(n, p) \ - ((p)->fds_bits[(n)/UNIX_NFDBITS] &= ~(1L << ((n) % UNIX_NFDBITS))) -#define UNIX_FD_ISSET(n, p) \ - ((p)->fds_bits[(n)/UNIX_NFDBITS] & (1L << ((n) % UNIX_NFDBITS))) -#define UNIX_FD_ZERO(p, n) \ - bzero ((caddr_t)(p), sizeof_fd_set ((n))) - -#define allocfd_set(n) ((fd_set *) memset (alloca (sizeof_fd_set (n)), 0, sizeof_fd_set (n))) -#define copyfd_set(to, from, n) memcpy (to, from, sizeof_fd_set (n)); - -#define set_handle_or_return_if_not_open(h, s) \ - h = (s)->fh->get_handle (); \ - if (cygheap->fdtab.not_open ((s)->fd)) \ - { \ - (s)->thread_errno = EBADF; \ - return -1; \ - } \ - -/* The main select code. - */ -extern "C" int -cygwin_select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, - struct timeval *to) -{ - select_stuff sel; - fd_set *dummy_readfds = allocfd_set (maxfds); - fd_set *dummy_writefds = allocfd_set (maxfds); - fd_set *dummy_exceptfds = allocfd_set (maxfds); - - select_printf ("%d, %p, %p, %p, %p", maxfds, readfds, writefds, exceptfds, to); - - if (!readfds) - readfds = dummy_readfds; - if (!writefds) - writefds = dummy_writefds; - if (!exceptfds) - exceptfds = dummy_exceptfds; - - for (int i = 0; i < maxfds; i++) - if (!sel.test_and_set (i, readfds, writefds, exceptfds)) - { - select_printf ("aborting due to test_and_set error"); - return -1; /* Invalid fd, maybe? */ - } - - /* Convert to milliseconds or INFINITE if to == NULL */ - DWORD ms = to ? (to->tv_sec * 1000) + (to->tv_usec / 1000) : INFINITE; - if (ms == 0 && to->tv_usec) - ms = 1; /* At least 1 ms granularity */ - - if (to) - select_printf ("to->tv_sec %d, to->tv_usec %d, ms %d", to->tv_sec, to->tv_usec, ms); - else - select_printf ("to NULL, ms %x", ms); - - select_printf ("sel.always_ready %d", sel.always_ready); - - int timeout = 0; - /* Allocate some fd_set structures using the number of fds as a guide. */ - fd_set *r = allocfd_set (maxfds); - fd_set *w = allocfd_set (maxfds); - fd_set *e = allocfd_set (maxfds); - - /* Degenerate case. No fds to wait for. Just wait. */ - if (sel.start.next == NULL) - { - if (WaitForSingleObject (signal_arrived, ms) == WAIT_OBJECT_0) - { - select_printf ("signal received"); - set_sig_errno (EINTR); - return -1; - } - timeout = 1; - } - else if (sel.always_ready || ms == 0) - /* Don't bother waiting. */; - else if ((timeout = sel.wait (r, w, e, ms) < 0)) - return -1; /* some kind of error */ - - sel.cleanup (); - copyfd_set (readfds, r, maxfds); - copyfd_set (writefds, w, maxfds); - copyfd_set (exceptfds, e, maxfds); - return timeout ? 0 : sel.poll (readfds, writefds, exceptfds); -} - -extern "C" int -pselect(int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, - const struct timespec *ts, const sigset_t *set) -{ - struct timeval tv; - sigset_t oldset = myself->getsigmask (); - - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (ts) - { - tv.tv_sec = ts->tv_sec; - tv.tv_usec = ts->tv_nsec / 1000; - } - if (set) - set_signal_mask (*set, myself->getsigmask ()); - int ret = cygwin_select (maxfds, readfds, writefds, exceptfds, - ts ? &tv : NULL); - if (set) - set_signal_mask (oldset, myself->getsigmask ()); - return ret; -} - -/* Call cleanup functions for all inspected fds. Gets rid of any - executing threads. */ -void -select_stuff::cleanup () -{ - select_record *s = &start; - - select_printf ("calling cleanup routines"); - while ((s = s->next)) - if (s->cleanup) - { - s->cleanup (s, this); - s->cleanup = NULL; - } -} - -/* Destroy all storage associated with select stuff. */ -select_stuff::~select_stuff () -{ - cleanup (); - select_record *s = &start; - select_record *snext = start.next; - - select_printf ("deleting select records"); - while ((s = snext)) - { - snext = s->next; - delete s; - } -} - -/* Add a record to the select chain */ -int -select_stuff::test_and_set (int i, fd_set *readfds, fd_set *writefds, - fd_set *exceptfds) -{ - select_record *s = NULL; - if (UNIX_FD_ISSET (i, readfds) && (s = cygheap->fdtab.select_read (i, s)) == NULL) - return 0; /* error */ - if (UNIX_FD_ISSET (i, writefds) && (s = cygheap->fdtab.select_write (i, s)) == NULL) - return 0; /* error */ - if (UNIX_FD_ISSET (i, exceptfds) && (s = cygheap->fdtab.select_except (i, s)) == NULL) - return 0; /* error */ - if (s == NULL) - return 1; /* nothing to do */ - - if (s->read_ready || s->write_ready || s->except_ready) - always_ready = true; - - if (s->windows_handle) - windows_used = true; - - s->next = start.next; - start.next = s; - return 1; -} - -/* The heart of select. Waits for an fd to do something interesting. */ -int -select_stuff::wait (fd_set *readfds, fd_set *writefds, fd_set *exceptfds, - DWORD ms) -{ - int wait_ret; - HANDLE w4[MAXIMUM_WAIT_OBJECTS]; - select_record *s = &start; - int m = 0; - int res = 0; - - w4[m++] = signal_arrived; /* Always wait for the arrival of a signal. */ - /* Loop through the select chain, starting up anything appropriate and - counting the number of active fds. */ - while ((s = s->next)) - { - if (m >= MAXIMUM_WAIT_OBJECTS) - { - set_sig_errno (EINVAL); - return -1; - } - if (!s->startup (s, this)) - { - s->set_select_errno (); - return -1; - } - if (s->h == NULL) - continue; - for (int i = 1; i < m; i++) - if (w4[i] == s->h) - goto next_while; - w4[m++] = s->h; - next_while: - continue; - } - - LONGLONG start_time = gtod.msecs (); /* Record the current time for later use. */ - - debug_printf ("m %d, ms %u", m, ms); - for (;;) - { - if (!windows_used) - wait_ret = WaitForMultipleObjects (m, w4, FALSE, ms); - else - wait_ret = MsgWaitForMultipleObjects (m, w4, FALSE, ms, QS_ALLINPUT); - - switch (wait_ret) - { - case WAIT_OBJECT_0: - select_printf ("signal received"); - set_sig_errno (EINTR); - return -1; - case WAIT_FAILED: - select_printf ("WaitForMultipleObjects failed"); - s->set_select_errno (); - return -1; - case WAIT_TIMEOUT: - select_printf ("timed out"); - res = 1; - goto out; - } - - select_printf ("woke up. wait_ret %d. verifying", wait_ret); - s = &start; - bool gotone = false; - /* Some types of object (e.g., consoles) wake up on "inappropriate" events - like mouse movements. The verify function will detect these situations. - If it returns false, then this wakeup was a false alarm and we should go - back to waiting. */ - while ((s = s->next)) - if (s->saw_error ()) - { - set_errno (s->saw_error ()); - return -1; /* Somebody detected an error */ - } - else if ((((wait_ret >= m && s->windows_handle) || s->h == w4[wait_ret])) && - s->verify (s, readfds, writefds, exceptfds)) - gotone = true; - - select_printf ("gotone %d", gotone); - if (gotone) - goto out; - - if (ms == INFINITE) - { - select_printf ("looping"); - continue; - } - select_printf ("recalculating ms"); - - LONGLONG now = gtod.msecs (); - if (now > (start_time + ms)) - { - select_printf ("timed out after verification"); - goto out; - } - ms -= (now - start_time); - start_time = now; - select_printf ("ms now %u", ms); - } - -out: - select_printf ("returning %d", res); - return res; -} - -static int -set_bits (select_record *me, fd_set *readfds, fd_set *writefds, - fd_set *exceptfds) -{ - int ready = 0; - fhandler_socket *sock; - select_printf ("me %p, testing fd %d (%s)", me, me->fd, me->fh->get_name ()); - if (me->read_selected && me->read_ready) - { - UNIX_FD_SET (me->fd, readfds); - ready++; - } - if (me->write_selected && me->write_ready) - { - UNIX_FD_SET (me->fd, writefds); - if (me->except_on_write && (sock = me->fh->is_socket ())) - { - /* Special AF_LOCAL handling. */ - if (!me->read_ready && sock->connect_state () == connect_pending - && sock->af_local_connect () && me->read_selected) - UNIX_FD_SET (me->fd, readfds); - sock->connect_state (connected); - } - ready++; - } - if ((me->except_selected || me->except_on_write) && me->except_ready) - { - if (me->except_on_write) /* Only on sockets */ - { - UNIX_FD_SET (me->fd, writefds); - if ((sock = me->fh->is_socket ())) - sock->connect_state (connect_failed); - } - if (me->except_selected) - UNIX_FD_SET (me->fd, exceptfds); - ready++; - } - select_printf ("ready %d", ready); - return ready; -} - -/* Poll every fd in the select chain. Set appropriate fd in mask. */ -int -select_stuff::poll (fd_set *readfds, fd_set *writefds, fd_set *exceptfds) -{ - int n = 0; - select_record *s = &start; - while ((s = s->next)) - n += (!s->peek || s->peek (s, true)) ? - set_bits (s, readfds, writefds, exceptfds) : 0; - select_printf ("returning %d", n); - return n; -} - -static int -verify_true (select_record *, fd_set *, fd_set *, fd_set *) -{ - return 1; -} - -static int -verify_ok (select_record *me, fd_set *readfds, fd_set *writefds, - fd_set *exceptfds) -{ - return set_bits (me, readfds, writefds, exceptfds); -} - -static int -no_startup (select_record *, select_stuff *) -{ - return 1; -} - -static int -no_verify (select_record *, fd_set *, fd_set *, fd_set *) -{ - return 0; -} - -static int -peek_pipe (select_record *s, bool from_select) -{ - int n = 0; - int gotone = 0; - fhandler_base *fh = s->fh; - - HANDLE h; - set_handle_or_return_if_not_open (h, s); - - /* pipes require a guard mutex to guard against the situation where multiple - readers are attempting to read from the same pipe. In this scenario, it - is possible for PeekNamedPipe to report available data to two readers but - only one will actually get the data. This will result in the other reader - entering fhandler_base::raw_read and blocking indefinitely in an interruptible - state. This causes things like "make -j2" to hang. So, for the non-select case - we use the pipe mutex, if it is available. */ - HANDLE guard_mutex = from_select ? NULL : fh->get_guard (); - - /* Don't perform complicated tests if we don't need to. */ - if (!s->read_selected && !s->except_selected) - goto out; - - if (s->read_selected) - { - if (s->read_ready) - { - select_printf ("%s, already ready for read", fh->get_name ()); - gotone = 1; - goto out; - } - - switch (fh->get_device ()) - { - case FH_PTYM: - case FH_TTYM: - if (((fhandler_pty_master *) fh)->need_nl) - { - gotone = s->read_ready = true; - goto out; - } - break; - default: - if (fh->get_readahead_valid ()) - { - select_printf ("readahead"); - gotone = s->read_ready = true; - goto out; - } - } - - if (fh->bg_check (SIGTTIN) <= bg_eof) - { - gotone = s->read_ready = true; - goto out; - } - } - - if (fh->get_device () == FH_PIPEW) - select_printf ("%s, select for read/except on write end of pipe", - fh->get_name ()); - else if (!PeekNamedPipe (h, NULL, 0, NULL, (DWORD *) &n, NULL)) - { - select_printf ("%s, PeekNamedPipe failed, %E", fh->get_name ()); - n = -1; - } - else if (!n || !guard_mutex) - /* no guard mutex or nothing to read from the pipe. */; - else if (WaitForSingleObject (guard_mutex, 0) != WAIT_OBJECT_0) - { - select_printf ("%s, couldn't get mutex %p, %E", fh->get_name (), - guard_mutex); - n = 0; - } - else - { - /* Now that we have the mutex, make sure that no one else has snuck - in and grabbed the data that we originally saw. */ - if (!PeekNamedPipe (h, NULL, 0, NULL, (DWORD *) &n, NULL)) - { - select_printf ("%s, PeekNamedPipe failed, %E", fh->get_name ()); - n = -1; - } - if (n <= 0) - ReleaseMutex (guard_mutex); /* Oops. We lost the race. */ - } - - if (n < 0) - { - fh->set_eof (); /* Flag that other end of pipe is gone */ - select_printf ("%s, n %d", fh->get_name (), n); - if (s->except_selected) - gotone += s->except_ready = true; - if (s->read_selected) - gotone += s->read_ready = true; - } - if (n > 0 && s->read_selected) - { - select_printf ("%s, ready for read: avail %d", fh->get_name (), n); - gotone += s->read_ready = true; - } - if (!gotone && s->fh->hit_eof ()) - { - select_printf ("%s, saw EOF", fh->get_name ()); - if (s->except_selected) - gotone += s->except_ready = true; - if (s->read_selected) - gotone += s->read_ready = true; - } - -out: - if (s->write_selected) - { - if (s->write_ready) - { - select_printf ("%s, already ready for write", fh->get_name ()); - gotone++; - } - /* Do we need to do anything about SIGTTOU here? */ - else if (fh->get_device () == FH_PIPER) - select_printf ("%s, select for write on read end of pipe", - fh->get_name ()); - else - { -#if 0 -/* FIXME: This code is not quite correct. There's no better solution - so far but to always treat the write side of the pipe as writable. */ - - /* We don't worry about the guard mutex, because that only applies - when from_select is false, and peek_pipe is never called that - way for writes. */ - - IO_STATUS_BLOCK iosb = {0}; - FILE_PIPE_LOCAL_INFORMATION fpli = {0}; - - if (NtQueryInformationFile (h, - &iosb, - &fpli, - sizeof (fpli), - FilePipeLocalInformation)) - { - /* If NtQueryInformationFile fails, optimistically assume the - pipe is writable. This could happen on Win9x, because - NtQueryInformationFile is not available, or if we somehow - inherit a pipe that doesn't permit FILE_READ_ATTRIBUTES - access on the write end. */ - select_printf ("%s, NtQueryInformationFile failed", - fh->get_name ()); - gotone += s->write_ready = true; - } - /* Ensure that enough space is available for atomic writes, - as required by POSIX. Subsequent writes with size > PIPE_BUF - can still block, but most (all?) UNIX variants seem to work - this way (e.g., BSD, Linux, Solaris). */ - else if (fpli.WriteQuotaAvailable >= PIPE_BUF) - { - select_printf ("%s, ready for write: size %lu, avail %lu", - fh->get_name (), - fpli.OutboundQuota, - fpli.WriteQuotaAvailable); - gotone += s->write_ready = true; - } - /* If we somehow inherit a tiny pipe (size < PIPE_BUF), then consider - the pipe writable only if it is completely empty, to minimize the - probability that a subsequent write will block. */ - else if (fpli.OutboundQuota < PIPE_BUF && - fpli.WriteQuotaAvailable == fpli.OutboundQuota) - { - select_printf ("%s, tiny pipe: size %lu, avail %lu", - fh->get_name (), - fpli.OutboundQuota, - fpli.WriteQuotaAvailable); - gotone += s->write_ready = true; - } -#else - gotone += s->write_ready = true; -#endif - } - } - - return gotone; -} - -static int start_thread_pipe (select_record *me, select_stuff *stuff); - -struct pipeinf - { - cygthread *thread; - bool stop_thread_pipe; - select_record *start; - }; - -static DWORD WINAPI -thread_pipe (void *arg) -{ - pipeinf *pi = (pipeinf *) arg; - bool gotone = false; - - for (;;) - { - select_record *s = pi->start; - while ((s = s->next)) - if (s->startup == start_thread_pipe) - { - if (peek_pipe (s, true)) - gotone = true; - if (pi->stop_thread_pipe) - { - select_printf ("stopping"); - goto out; - } - } - /* Paranoid check */ - if (pi->stop_thread_pipe) - { - select_printf ("stopping from outer loop"); - break; - } - if (gotone) - break; - Sleep (10); - } -out: - return 0; -} - -static int -start_thread_pipe (select_record *me, select_stuff *stuff) -{ - if (stuff->device_specific_pipe) - { - me->h = *((pipeinf *) stuff->device_specific_pipe)->thread; - return 1; - } - pipeinf *pi = new pipeinf; - pi->start = &stuff->start; - pi->stop_thread_pipe = false; - pi->thread = new cygthread (thread_pipe, 0, pi, "select_pipe"); - me->h = *pi->thread; - if (!me->h) - return 0; - stuff->device_specific_pipe = (void *) pi; - return 1; -} - -static void -pipe_cleanup (select_record *, select_stuff *stuff) -{ - pipeinf *pi = (pipeinf *) stuff->device_specific_pipe; - if (pi && pi->thread) - { - pi->stop_thread_pipe = true; - pi->thread->detach (); - delete pi; - stuff->device_specific_pipe = NULL; - } -} - -int -fhandler_pipe::ready_for_read (int fd, DWORD howlong) -{ - int res; - if (howlong) - res = true; - else - res = fhandler_base::ready_for_read (fd, howlong); - - if (res) - get_guard (); - return res; -} - -select_record * -fhandler_pipe::select_read (select_record *s) -{ - if (!s) - s = new select_record; - s->startup = start_thread_pipe; - s->peek = peek_pipe; - s->verify = verify_ok; - s->cleanup = pipe_cleanup; - s->read_selected = true; - s->read_ready = false; - return s; -} - -select_record * -fhandler_pipe::select_write (select_record *s) -{ - if (!s) - s = new select_record; - s->startup = start_thread_pipe; - s->peek = peek_pipe; - s->verify = verify_ok; - s->cleanup = pipe_cleanup; - s->write_selected = true; - s->write_ready = false; - return s; -} - -select_record * -fhandler_pipe::select_except (select_record *s) -{ - if (!s) - s = new select_record; - s->startup = start_thread_pipe; - s->peek = peek_pipe; - s->verify = verify_ok; - s->cleanup = pipe_cleanup; - s->except_selected = true; - s->except_ready = false; - return s; -} - -static int -peek_console (select_record *me, bool) -{ - extern const char * get_nonascii_key (INPUT_RECORD& input_rec, char *); - fhandler_console *fh = (fhandler_console *) me->fh; - - if (!me->read_selected) - return me->write_ready; - - if (fh->get_readahead_valid ()) - { - select_printf ("readahead"); - return me->read_ready = true; - } - - if (me->read_ready) - { - select_printf ("already ready"); - return 1; - } - - INPUT_RECORD irec; - DWORD events_read; - HANDLE h; - char tmpbuf[17]; - set_handle_or_return_if_not_open (h, me); - - for (;;) - if (fh->bg_check (SIGTTIN) <= bg_eof) - return me->read_ready = true; - else if (!PeekConsoleInput (h, &irec, 1, &events_read) || !events_read) - break; - else - { - if (irec.EventType == KEY_EVENT) - { - if (irec.Event.KeyEvent.bKeyDown - && (irec.Event.KeyEvent.uChar.AsciiChar - || get_nonascii_key (irec, tmpbuf))) - return me->read_ready = true; - } - else - { - fh->send_winch_maybe (); - if (irec.EventType == MOUSE_EVENT - && fh->mouse_aware () - && (irec.Event.MouseEvent.dwEventFlags == 0 - || irec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)) - return me->read_ready = true; - } - - /* Read and discard the event */ - ReadConsoleInput (h, &irec, 1, &events_read); - } - - return me->write_ready; -} - -static int -verify_console (select_record *me, fd_set *rfds, fd_set *wfds, - fd_set *efds) -{ - return peek_console (me, true); -} - - -select_record * -fhandler_console::select_read (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - s->verify = verify_console; - set_cursor_maybe (); - } - - s->peek = peek_console; - s->h = get_handle (); - s->read_selected = true; - s->read_ready = false; - return s; -} - -select_record * -fhandler_console::select_write (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - s->verify = no_verify; - set_cursor_maybe (); - } - - s->peek = peek_console; - s->write_selected = true; - s->write_ready = true; - return s; -} - -select_record * -fhandler_console::select_except (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - s->verify = no_verify; - set_cursor_maybe (); - } - - s->peek = peek_console; - s->except_selected = true; - s->except_ready = false; - return s; -} - -select_record * -fhandler_tty_common::select_read (select_record *s) -{ - return ((fhandler_pipe *) this)->fhandler_pipe::select_read (s); -} - -select_record * -fhandler_tty_common::select_write (select_record *s) -{ - return ((fhandler_pipe *) this)->fhandler_pipe::select_write (s); -} - -select_record * -fhandler_tty_common::select_except (select_record *s) -{ - return ((fhandler_pipe *) this)->fhandler_pipe::select_except (s); -} - -static int -verify_tty_slave (select_record *me, fd_set *readfds, fd_set *writefds, - fd_set *exceptfds) -{ - if (WaitForSingleObject (me->h, 0) == WAIT_OBJECT_0) - me->read_ready = true; - return set_bits (me, readfds, writefds, exceptfds); -} - -select_record * -fhandler_tty_slave::select_read (select_record *s) -{ - if (!s) - s = new select_record; - s->h = input_available_event; - s->startup = no_startup; - s->peek = peek_pipe; - s->verify = verify_tty_slave; - s->read_selected = true; - s->read_ready = false; - s->cleanup = NULL; - return s; -} - -select_record * -fhandler_dev_null::select_read (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - s->verify = no_verify; - } - s->h = get_handle (); - s->read_selected = true; - s->read_ready = true; - return s; -} - -select_record * -fhandler_dev_null::select_write (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - s->verify = no_verify; - } - s->h = get_handle (); - s->write_selected = true; - s->write_ready = true; - return s; -} - -select_record * -fhandler_dev_null::select_except (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - s->verify = no_verify; - } - s->h = get_handle (); - s->except_selected = true; - s->except_ready = false; - return s; -} - -static int start_thread_serial (select_record *me, select_stuff *stuff); - -struct serialinf - { - cygthread *thread; - bool stop_thread_serial; - select_record *start; - }; - -static int -peek_serial (select_record *s, bool) -{ - COMSTAT st; - - fhandler_serial *fh = (fhandler_serial *) s->fh; - - if (fh->get_readahead_valid () || fh->overlapped_armed < 0) - return s->read_ready = true; - - select_printf ("fh->overlapped_armed %d", fh->overlapped_armed); - - HANDLE h; - set_handle_or_return_if_not_open (h, s); - int ready = 0; - - if (s->read_selected && s->read_ready || (s->write_selected && s->write_ready)) - { - select_printf ("already ready"); - ready = 1; - goto out; - } - - SetCommMask (h, EV_RXCHAR); - - if (!fh->overlapped_armed) - { - COMSTAT st; - - ResetEvent (fh->io_status.hEvent); - - if (!ClearCommError (h, &fh->ev, &st)) - { - debug_printf ("ClearCommError"); - goto err; - } - else if (st.cbInQue) - return s->read_ready = true; - else if (WaitCommEvent (h, &fh->ev, &fh->io_status)) - return s->read_ready = true; - else if (GetLastError () == ERROR_IO_PENDING) - fh->overlapped_armed = 1; - else - { - debug_printf ("WaitCommEvent"); - goto err; - } - } - - HANDLE w4[2]; - DWORD to; - - w4[0] = fh->io_status.hEvent; - w4[1] = signal_arrived; - to = 10; - - switch (WaitForMultipleObjects (2, w4, FALSE, to)) - { - case WAIT_OBJECT_0: - if (!ClearCommError (h, &fh->ev, &st)) - { - debug_printf ("ClearCommError"); - goto err; - } - else if (!st.cbInQue) - Sleep (to); - else - { - return s->read_ready = true; - select_printf ("got something"); - } - break; - case WAIT_OBJECT_0 + 1: - select_printf ("interrupt"); - set_sig_errno (EINTR); - ready = -1; - break; - case WAIT_TIMEOUT: - break; - default: - debug_printf ("WaitForMultipleObjects"); - goto err; - } - -out: - return ready; - -err: - if (GetLastError () == ERROR_OPERATION_ABORTED) - { - select_printf ("operation aborted"); - return ready; - } - - s->set_select_errno (); - select_printf ("error %E"); - return -1; -} - -static DWORD WINAPI -thread_serial (void *arg) -{ - serialinf *si = (serialinf *) arg; - bool gotone = false; - - for (;;) - { - select_record *s = si->start; - while ((s = s->next)) - if (s->startup == start_thread_serial) - { - if (peek_serial (s, true)) - gotone = true; - } - if (si->stop_thread_serial) - { - select_printf ("stopping"); - break; - } - if (gotone) - break; - } - - select_printf ("exiting"); - return 0; -} - -static int -start_thread_serial (select_record *me, select_stuff *stuff) -{ - if (stuff->device_specific_serial) - { - me->h = *((serialinf *) stuff->device_specific_serial)->thread; - return 1; - } - serialinf *si = new serialinf; - si->start = &stuff->start; - si->stop_thread_serial = false; - si->thread = new cygthread (thread_serial, 0, si, "select_serial"); - me->h = *si->thread; - stuff->device_specific_serial = (void *) si; - return 1; -} - -static void -serial_cleanup (select_record *, select_stuff *stuff) -{ - serialinf *si = (serialinf *) stuff->device_specific_serial; - if (si && si->thread) - { - si->stop_thread_serial = true; - si->thread->detach (); - delete si; - stuff->device_specific_serial = NULL; - } -} - -select_record * -fhandler_serial::select_read (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = start_thread_serial; - s->verify = verify_ok; - s->cleanup = serial_cleanup; - } - s->peek = peek_serial; - s->read_selected = true; - s->read_ready = false; - return s; -} - -select_record * -fhandler_serial::select_write (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - s->verify = verify_ok; - } - s->peek = peek_serial; - s->h = get_handle (); - s->write_selected = true; - s->write_ready = true; - return s; -} - -select_record * -fhandler_serial::select_except (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - s->verify = verify_ok; - } - s->h = NULL; - s->peek = peek_serial; - s->except_selected = false; // Can't do this - s->except_ready = false; - return s; -} - -int -fhandler_base::ready_for_read (int fd, DWORD howlong) -{ - int avail = 0; - select_record me (this); - me.fd = fd; - while (!avail) - { - select_read (&me); - avail = me.read_ready ?: me.peek (&me, false); - - if (fd >= 0 && cygheap->fdtab.not_open (fd)) - { - set_sig_errno (EBADF); - avail = 0; - break; - } - - if (howlong != INFINITE) - { - if (!avail) - set_sig_errno (EAGAIN); - break; - } - - if (WaitForSingleObject (signal_arrived, avail ? 0 : 10) == WAIT_OBJECT_0) - { - debug_printf ("interrupted"); - set_sig_errno (EINTR); - avail = 0; - break; - } - } - - if (get_guard () && !avail && me.read_ready) - ReleaseMutex (get_guard ()); - - select_printf ("read_ready %d, avail %d", me.read_ready, avail); - return avail; -} - -select_record * -fhandler_base::select_read (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - s->verify = verify_ok; - } - s->h = get_handle (); - s->read_selected = true; - s->read_ready = true; - return s; -} - -select_record * -fhandler_base::select_write (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - s->verify = verify_ok; - } - s->h = get_handle (); - s->write_selected = true; - s->write_ready = true; - return s; -} - -select_record * -fhandler_base::select_except (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - s->verify = verify_ok; - } - s->h = NULL; - s->except_selected = true; - s->except_ready = false; - return s; -} - -struct socketinf - { - cygthread *thread; - winsock_fd_set readfds, writefds, exceptfds; - SOCKET exitsock; - select_record *start; - }; - -static int -peek_socket (select_record *me, bool) -{ - winsock_fd_set ws_readfds, ws_writefds, ws_exceptfds; - struct timeval tv = {0, 0}; - WINSOCK_FD_ZERO (&ws_readfds); - WINSOCK_FD_ZERO (&ws_writefds); - WINSOCK_FD_ZERO (&ws_exceptfds); - - HANDLE h; - set_handle_or_return_if_not_open (h, me); - select_printf ("considering handle %p", h); - - if (me->read_selected && !me->read_ready) - { - select_printf ("adding read fd_set %s, fd %d", me->fh->get_name (), - me->fd); - WINSOCK_FD_SET (h, &ws_readfds); - } - if (me->write_selected && !me->write_ready) - { - select_printf ("adding write fd_set %s, fd %d", me->fh->get_name (), - me->fd); - WINSOCK_FD_SET (h, &ws_writefds); - } - if ((me->except_selected || me->except_on_write) && !me->except_ready) - { - select_printf ("adding except fd_set %s, fd %d", me->fh->get_name (), - me->fd); - WINSOCK_FD_SET (h, &ws_exceptfds); - } - int r; - if ((me->read_selected && !me->read_ready) - || (me->write_selected && !me->write_ready) - || ((me->except_selected || me->except_on_write) && !me->except_ready)) - { - r = WINSOCK_SELECT (0, &ws_readfds, &ws_writefds, &ws_exceptfds, &tv); - select_printf ("WINSOCK_SELECT returned %d", r); - if (r == -1) - { - select_printf ("error %d", WSAGetLastError ()); - set_winsock_errno (); - return 0; - } - if (WINSOCK_FD_ISSET (h, &ws_readfds)) - me->read_ready = true; - if (WINSOCK_FD_ISSET (h, &ws_writefds)) - me->write_ready = true; - if (WINSOCK_FD_ISSET (h, &ws_exceptfds)) - me->except_ready = true; - } - return me->read_ready || me->write_ready || me->except_ready; -} - -static int start_thread_socket (select_record *, select_stuff *); - -static DWORD WINAPI -thread_socket (void *arg) -{ - socketinf *si = (socketinf *) arg; - - select_printf ("stuff_start %p", &si->start); - int r = WINSOCK_SELECT (0, &si->readfds, &si->writefds, &si->exceptfds, NULL); - select_printf ("Win32 select returned %d", r); - if (r == -1) - select_printf ("error %d", WSAGetLastError ()); - select_record *s = si->start; - while ((s = s->next)) - if (s->startup == start_thread_socket) - { - HANDLE h = s->fh->get_handle (); - select_printf ("s %p, testing fd %d (%s)", s, s->fd, s->fh->get_name ()); - if (WINSOCK_FD_ISSET (h, &si->readfds)) - { - select_printf ("read_ready"); - s->read_ready = true; - } - if (WINSOCK_FD_ISSET (h, &si->writefds)) - { - select_printf ("write_ready"); - s->write_ready = true; - } - if (WINSOCK_FD_ISSET (h, &si->exceptfds)) - { - select_printf ("except_ready"); - s->except_ready = true; - } - } - - if (WINSOCK_FD_ISSET (si->exitsock, &si->readfds)) - select_printf ("saw exitsock read"); - return 0; -} - -static int -start_thread_socket (select_record *me, select_stuff *stuff) -{ - socketinf *si; - - if ((si = (socketinf *) stuff->device_specific_socket)) - { - me->h = *si->thread; - return 1; - } - - si = new socketinf; - WINSOCK_FD_ZERO (&si->readfds); - WINSOCK_FD_ZERO (&si->writefds); - WINSOCK_FD_ZERO (&si->exceptfds); - select_record *s = &stuff->start; - while ((s = s->next)) - if (s->startup == start_thread_socket) - { - HANDLE h = s->fh->get_handle (); - select_printf ("Handle %p", h); - if (s->read_selected && !s->read_ready) - { - WINSOCK_FD_SET (h, &si->readfds); - select_printf ("Added to readfds"); - } - if (s->write_selected && !s->write_ready) - { - WINSOCK_FD_SET (h, &si->writefds); - select_printf ("Added to writefds"); - } - if ((s->except_selected || s->except_on_write) && !s->except_ready) - { - WINSOCK_FD_SET (h, &si->exceptfds); - select_printf ("Added to exceptfds"); - } - } - - if (_my_tls.locals.exitsock != INVALID_SOCKET) - si->exitsock = _my_tls.locals.exitsock; - else - { - si->exitsock = _my_tls.locals.exitsock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (_my_tls.locals.exitsock == INVALID_SOCKET) - { - set_winsock_errno (); - select_printf ("cannot create socket, %E"); - return -1; - } - int sin_len = sizeof (_my_tls.locals.exitsock_sin); - memset (&_my_tls.locals.exitsock_sin, 0, sin_len); - _my_tls.locals.exitsock_sin.sin_family = AF_INET; - _my_tls.locals.exitsock_sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK); - if (bind (si->exitsock, (struct sockaddr *) &_my_tls.locals.exitsock_sin, sin_len) < 0) - { - select_printf ("cannot bind socket %p, %E", si->exitsock); - goto err; - } - - if (getsockname (si->exitsock, (struct sockaddr *) &_my_tls.locals.exitsock_sin, &sin_len) < 0) - { - select_printf ("getsockname error"); - goto err; - } - if (wincap.has_set_handle_information ()) - SetHandleInformation ((HANDLE) si->exitsock, HANDLE_FLAG_INHERIT, 0); - /* else - too bad? */ - select_printf ("opened new socket %p", _my_tls.locals.exitsock); - } - - select_printf ("exitsock %p", si->exitsock); - WINSOCK_FD_SET ((HANDLE) si->exitsock, &si->readfds); - stuff->device_specific_socket = (void *) si; - si->start = &stuff->start; - select_printf ("stuff_start %p", &stuff->start); - si->thread = new cygthread (thread_socket, 0, si, "select_socket"); - me->h = *si->thread; - return 1; - -err: - set_winsock_errno (); - closesocket (si->exitsock); - return -1; -} - -void -socket_cleanup (select_record *, select_stuff *stuff) -{ - socketinf *si = (socketinf *) stuff->device_specific_socket; - select_printf ("si %p si->thread %p", si, si ? si->thread : NULL); - if (si && si->thread) - { - char buf[] = ""; - int res = sendto (_my_tls.locals.exitsock, buf, 1, 0, - (sockaddr *) &_my_tls.locals.exitsock_sin, - sizeof (_my_tls.locals.exitsock_sin)); - select_printf ("sent a byte to exitsock %p, res %d", _my_tls.locals.exitsock, res); - /* Wait for thread to go away */ - si->thread->detach (); - /* empty the socket */ - select_printf ("reading a byte from exitsock %p", si->exitsock); - res = recv (si->exitsock, buf, 1, 0); - select_printf ("recv returned %d", res); - stuff->device_specific_socket = NULL; - delete si; - } - select_printf ("returning"); -} - -select_record * -fhandler_socket::select_read (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = start_thread_socket; - s->verify = verify_true; - s->cleanup = socket_cleanup; - } - s->peek = peek_socket; - s->read_ready = saw_shutdown_read (); - s->read_selected = true; - return s; -} - -select_record * -fhandler_socket::select_write (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = start_thread_socket; - s->verify = verify_true; - s->cleanup = socket_cleanup; - } - s->peek = peek_socket; - s->write_ready = saw_shutdown_write () || connect_state () == unconnected; - s->write_selected = true; - if (connect_state () != unconnected) - { - s->except_ready = saw_shutdown_write () || saw_shutdown_read (); - s->except_on_write = true; - } - return s; -} - -select_record * -fhandler_socket::select_except (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = start_thread_socket; - s->verify = verify_true; - s->cleanup = socket_cleanup; - } - s->peek = peek_socket; - /* FIXME: Is this right? Should these be used as criteria for except? */ - s->except_ready = saw_shutdown_write () || saw_shutdown_read (); - s->except_selected = true; - return s; -} - -static int -peek_windows (select_record *me, bool) -{ - MSG m; - HANDLE h; - set_handle_or_return_if_not_open (h, me); - - if (me->read_selected && me->read_ready) - return 1; - - if (PeekMessage (&m, (HWND) h, 0, 0, PM_NOREMOVE)) - { - me->read_ready = true; - select_printf ("window %d(%p) ready", me->fd, me->fh->get_handle ()); - return 1; - } - - select_printf ("window %d(%p) not ready", me->fd, me->fh->get_handle ()); - return me->write_ready; -} - -static int -verify_windows (select_record *me, fd_set *rfds, fd_set *wfds, - fd_set *efds) -{ - return peek_windows (me, true); -} - -select_record * -fhandler_windows::select_read (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - } - s->verify = verify_windows; - s->peek = peek_windows; - s->read_selected = true; - s->read_ready = false; - s->h = get_handle (); - s->windows_handle = true; - return s; -} - -select_record * -fhandler_windows::select_write (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - s->verify = verify_ok; - } - s->peek = peek_windows; - s->h = get_handle (); - s->write_selected = true; - s->write_ready = true; - s->windows_handle = true; - return s; -} - -select_record * -fhandler_windows::select_except (select_record *s) -{ - if (!s) - { - s = new select_record; - s->startup = no_startup; - s->verify = verify_ok; - } - s->peek = peek_windows; - s->h = get_handle (); - s->except_selected = true; - s->except_ready = false; - s->windows_handle = true; - return s; -} - -static int -peek_mailslot (select_record *me, bool) -{ - HANDLE h; - set_handle_or_return_if_not_open (h, me); - - if (me->read_selected && me->read_ready) - return 1; - DWORD msgcnt = 0; - if (!GetMailslotInfo (h, NULL, NULL, &msgcnt, NULL)) - { - select_printf ("mailslot %d(%p) error %E", me->fd, h); - return 1; - } - if (msgcnt > 0) - { - me->read_ready = true; - select_printf ("mailslot %d(%p) ready", me->fd, h); - return 1; - } - select_printf ("mailslot %d(%p) not ready", me->fd, h); - return 0; -} - -static int -verify_mailslot (select_record *me, fd_set *rfds, fd_set *wfds, - fd_set *efds) -{ - return peek_mailslot (me, true); -} - -static int start_thread_mailslot (select_record *me, select_stuff *stuff); - -struct mailslotinf - { - cygthread *thread; - bool stop_thread_mailslot; - select_record *start; - }; - -static DWORD WINAPI -thread_mailslot (void *arg) -{ - mailslotinf *mi = (mailslotinf *) arg; - bool gotone = false; - - for (;;) - { - select_record *s = mi->start; - while ((s = s->next)) - if (s->startup == start_thread_mailslot) - { - if (peek_mailslot (s, true)) - gotone = true; - if (mi->stop_thread_mailslot) - { - select_printf ("stopping"); - goto out; - } - } - /* Paranoid check */ - if (mi->stop_thread_mailslot) - { - select_printf ("stopping from outer loop"); - break; - } - if (gotone) - break; - Sleep (10); - } -out: - return 0; -} - -static int -start_thread_mailslot (select_record *me, select_stuff *stuff) -{ - if (stuff->device_specific_mailslot) - { - me->h = *((mailslotinf *) stuff->device_specific_mailslot)->thread; - return 1; - } - mailslotinf *mi = new mailslotinf; - mi->start = &stuff->start; - mi->stop_thread_mailslot = false; - mi->thread = new cygthread (thread_mailslot, 0, mi, "select_mailslot"); - me->h = *mi->thread; - if (!me->h) - return 0; - stuff->device_specific_mailslot = (void *) mi; - return 1; -} - -static void -mailslot_cleanup (select_record *, select_stuff *stuff) -{ - mailslotinf *mi = (mailslotinf *) stuff->device_specific_mailslot; - if (mi && mi->thread) - { - mi->stop_thread_mailslot = true; - mi->thread->detach (); - delete mi; - stuff->device_specific_mailslot = NULL; - } -} - -select_record * -fhandler_mailslot::select_read (select_record *s) -{ - if (!s) - s = new select_record; - s->startup = start_thread_mailslot; - s->peek = peek_mailslot; - s->verify = verify_mailslot; - s->cleanup = mailslot_cleanup; - s->read_selected = true; - s->read_ready = false; - return s; -} diff --git a/winsup/cygwin/select.h b/winsup/cygwin/select.h deleted file mode 100644 index 0938708f2..000000000 --- a/winsup/cygwin/select.h +++ /dev/null @@ -1,55 +0,0 @@ -/* select.h - - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* Winsock select() types and macros */ - -/* - * Use this struct to interface to - * the system provided select. - */ -typedef struct winsock_fd_set -{ - unsigned int fd_count; - HANDLE fd_array[1024]; /* Dynamically allocated. */ -} winsock_fd_set; - -/* - * Define the Win32 winsock definitions to have a prefix WINSOCK_ - * so we can be explicit when we are using them. - */ -#define WINSOCK_FD_ISSET(fd, set) __WSAFDIsSet ((SOCKET)fd, (fd_set *)set) -#define WINSOCK_FD_SET(fd, set) do { \ - (set)->fd_array[(set)->fd_count++]=fd;\ -} while(0) -#define WINSOCK_FD_ZERO(set) ((set)->fd_count = 0) -#define WINSOCK_FD_CLR(fd, set) do { \ - u_int __i; \ - for (__i = 0; __i < (set)->fd_count ; __i++) { \ - if ((set)->fd_array[__i] == fd) { \ - while (__i < (set)->fd_count-1) { \ - (set)->fd_array[__i] = \ - (set)->fd_array[__i+1]; \ - __i++; \ - } \ - (set)->fd_count--; \ - break; \ - } \ - } \ -} while(0) - -extern "C" int PASCAL __WSAFDIsSet(SOCKET, fd_set*); -extern "C" int PASCAL win32_select(int, fd_set*, fd_set*, fd_set*, const struct timeval*); - -/* - * call to winsock's select() - - * type coercion need to appease confused prototypes - */ -#define WINSOCK_SELECT(nfd, rd, wr, ex, timeo) \ - win32_select (nfd, (fd_set *) rd, (fd_set *) wr, (fd_set *) ex, timeo) diff --git a/winsup/cygwin/sem.cc b/winsup/cygwin/sem.cc deleted file mode 100644 index ea617f664..000000000 --- a/winsup/cygwin/sem.cc +++ /dev/null @@ -1,164 +0,0 @@ -/* sem.cc: XSI IPC interface for Cygwin. - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include "cygerrno.h" -#include -#ifdef USE_SERVER -#include -#include -#include -#include - -#include "sigproc.h" - -#include "cygserver_ipc.h" -#include "cygserver_sem.h" -#include "cygtls.h" - -/* - * client_request_sem Constructors - */ - -client_request_sem::client_request_sem (int semid, - int semnum, - int cmd, - union semun *arg) - : client_request (CYGSERVER_REQUEST_SEM, &_parameters, sizeof (_parameters)) -{ - _parameters.in.semop = SEMOP_semctl; - ipc_set_proc_info (_parameters.in.ipcblk); - - _parameters.in.ctlargs.semid = semid; - _parameters.in.ctlargs.semnum = semnum; - _parameters.in.ctlargs.cmd = cmd; - _parameters.in.ctlargs.arg = arg; - - msglen (sizeof (_parameters.in)); -} - -client_request_sem::client_request_sem (key_t key, - int nsems, - int semflg) - : client_request (CYGSERVER_REQUEST_SEM, &_parameters, sizeof (_parameters)) -{ - _parameters.in.semop = SEMOP_semget; - ipc_set_proc_info (_parameters.in.ipcblk); - - _parameters.in.getargs.key = key; - _parameters.in.getargs.nsems = nsems; - _parameters.in.getargs.semflg = semflg; - - msglen (sizeof (_parameters.in)); -} - -client_request_sem::client_request_sem (int semid, - struct sembuf *sops, - size_t nsops) - : client_request (CYGSERVER_REQUEST_SEM, &_parameters, sizeof (_parameters)) -{ - _parameters.in.semop = SEMOP_semop; - ipc_set_proc_info (_parameters.in.ipcblk); - - _parameters.in.opargs.semid = semid; - _parameters.in.opargs.sops = sops; - _parameters.in.opargs.nsops = nsops; - - msglen (sizeof (_parameters.in)); -} -#endif /* USE_SERVER */ - -/* - * XSI semaphore API. These are exported by the DLL. - */ - -extern "C" int -semctl (int semid, int semnum, int cmd, ...) -{ -#ifdef USE_SERVER - union semun arg = {0}; - if (cmd == IPC_STAT || cmd == IPC_SET || cmd == IPC_INFO || cmd == SEM_INFO - || cmd == GETALL || cmd == SETALL || cmd == SETVAL) - { - va_list ap; - va_start (ap, cmd); - arg = va_arg (ap, union semun); - va_end (ap); - } - syscall_printf ("semctl (semid = %d, semnum = %d, cmd = %d, arg.val = 0x%x)", - semid, semnum, cmd, arg.val); - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - client_request_sem request (semid, semnum, cmd, &arg); - if (request.make_request () == -1 || request.retval () == -1) - { - syscall_printf ("-1 [%d] = semctl ()", request.error_code ()); - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return -1; - } - return request.retval (); -#else - set_errno (ENOSYS); - raise (SIGSYS); - return -1; -#endif -} - -extern "C" int -semget (key_t key, int nsems, int semflg) -{ -#ifdef USE_SERVER - syscall_printf ("semget (key = %U, nsems = %d, semflg = 0x%x)", - key, nsems, semflg); - client_request_sem request (key, nsems, semflg); - if (request.make_request () == -1 || request.retval () == -1) - { - syscall_printf ("-1 [%d] = semget ()", request.error_code ()); - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return -1; - } - return request.retval (); -#else - set_errno (ENOSYS); - raise (SIGSYS); - return -1; -#endif -} - -extern "C" int -semop (int semid, struct sembuf *sops, size_t nsops) -{ -#ifdef USE_SERVER - syscall_printf ("semop (semid = %d, sops = %p, nsops = %d)", - semid, sops, nsops); - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - client_request_sem request (semid, sops, nsops); - if (request.make_request () == -1 || request.retval () == -1) - { - syscall_printf ("-1 [%d] = semop ()", request.error_code ()); - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return -1; - } - return request.retval (); -#else - set_errno (ENOSYS); - raise (SIGSYS); - return -1; -#endif -} diff --git a/winsup/cygwin/shared.cc b/winsup/cygwin/shared.cc deleted file mode 100644 index c491708e3..000000000 --- a/winsup/cygwin/shared.cc +++ /dev/null @@ -1,292 +0,0 @@ -/* shared.cc: shared data area support. - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 - Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "pinfo.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "heap.h" -#include "shared_info_magic.h" -#include "registry.h" -#include "cygwin_version.h" -#include "child_info.h" -#include "mtinfo.h" - -shared_info NO_COPY *cygwin_shared; -user_info NO_COPY *user_shared; -HANDLE NO_COPY cygwin_user_h; - -char * __stdcall -shared_name (char *ret_buf, const char *str, int num) -{ - extern bool _cygwin_testing; - - __small_sprintf (ret_buf, "%s%s.%s.%d", cygheap->shared_prefix, - cygwin_version.shared_id, str, num); - if (_cygwin_testing) - strcat (ret_buf, cygwin_version.dll_build_date); - return ret_buf; -} - -#define page_const (65535) -#define pround(n) (((size_t) (n) + page_const) & ~page_const) - -static char *offsets[] = -{ - (char *) cygwin_shared_address, - (char *) cygwin_shared_address - + pround (sizeof (shared_info)), - (char *) cygwin_shared_address - + pround (sizeof (shared_info)) - + pround (sizeof (user_info)), - (char *) cygwin_shared_address - + pround (sizeof (shared_info)) - + pround (sizeof (user_info)) - + pround (sizeof (console_state)), - (char *) cygwin_shared_address - + pround (sizeof (shared_info)) - + pround (sizeof (user_info)) - + pround (sizeof (console_state)) - + pround (sizeof (_pinfo)), - (char *) cygwin_shared_address - + pround (sizeof (shared_info)) - + pround (sizeof (user_info)) - + pround (sizeof (console_state)) - + pround (sizeof (_pinfo)) - + pround (sizeof (mtinfo)) -}; - -void * __stdcall -open_shared (const char *name, int n, HANDLE& shared_h, DWORD size, - shared_locations& m, PSECURITY_ATTRIBUTES psa, DWORD access) -{ - void *shared; - - void *addr; - if ((m == SH_JUSTCREATE || m == SH_JUSTOPEN) - || !wincap.needs_memory_protection () && offsets[0]) - addr = NULL; - else - { - addr = offsets[m]; - VirtualFree (addr, 0, MEM_RELEASE); - } - - char map_buf[CYG_MAX_PATH]; - char *mapname = NULL; - - if (shared_h) - m = SH_JUSTOPEN; - else - { - if (name) - mapname = shared_name (map_buf, name, n); - if (m == SH_JUSTOPEN) - shared_h = OpenFileMapping (access, FALSE, mapname); - else - { - shared_h = CreateFileMapping (INVALID_HANDLE_VALUE, psa, PAGE_READWRITE, - 0, size, mapname); - if (GetLastError () == ERROR_ALREADY_EXISTS) - m = SH_JUSTOPEN; - } - if (shared_h) - /* ok! */; - else if (m != SH_JUSTOPEN) - api_fatal ("CreateFileMapping %s, %E. Terminating.", mapname); - else - return NULL; - } - - shared = (shared_info *) - MapViewOfFileEx (shared_h, access, 0, 0, 0, addr); - - if (!shared && addr) - { - /* Probably win95, so try without specifying the address. */ - shared = (shared_info *) MapViewOfFileEx (shared_h, - FILE_MAP_READ|FILE_MAP_WRITE, - 0, 0, 0, NULL); -#ifdef DEBUGGING - if (wincap.is_winnt ()) - system_printf ("relocating shared object %s(%d) from %p to %p on Windows NT", name, n, addr, shared); -#endif - offsets[0] = NULL; - } - - if (!shared) - api_fatal ("MapViewOfFileEx '%s'(%p), %E. Terminating.", mapname, shared_h); - - if (m == SH_CYGWIN_SHARED && offsets[0] && wincap.needs_memory_protection ()) - { - unsigned delta = (char *) shared - offsets[0]; - offsets[0] = (char *) shared; - for (int i = SH_CYGWIN_SHARED + 1; i < SH_TOTAL_SIZE; i++) - { - unsigned size = offsets[i + 1] - offsets[i]; - offsets[i] += delta; - if (!VirtualAlloc (offsets[i], size, MEM_RESERVE, PAGE_NOACCESS)) - continue; /* oh well */ - } - offsets[SH_TOTAL_SIZE] += delta; - -#if 0 - if (!child_proc_info && wincap.needs_memory_protection ()) - for (DWORD s = 0x950000; s <= 0xa40000; s += 0x1000) - VirtualAlloc ((void *) s, 4, MEM_RESERVE, PAGE_NOACCESS); -#endif - } - - debug_printf ("name %s, n %d, shared %p (wanted %p), h %p", mapname, n, shared, addr, shared_h); - - return shared; -} - -void -user_shared_initialize (bool reinit) -{ - char name[UNLEN + 1] = ""; /* Large enough for SID */ - - if (reinit) - { - if (!UnmapViewOfFile (user_shared)) - debug_printf("UnmapViewOfFile %E"); - if (!ForceCloseHandle (cygwin_user_h)) - debug_printf("CloseHandle %E"); - cygwin_user_h = NULL; - } - - if (!cygwin_user_h) - cygheap->user.get_windows_id (name); - - shared_locations sh_user_shared = SH_USER_SHARED; - user_shared = (user_info *) open_shared (name, USER_VERSION, - cygwin_user_h, sizeof (user_info), - sh_user_shared, &sec_none); - debug_printf ("opening user shared for '%s' at %p", name, user_shared); - ProtectHandleINH (cygwin_user_h); - debug_printf ("user shared version %x", user_shared->version); - - DWORD sversion = (DWORD) InterlockedExchange ((LONG *) &user_shared->version, USER_VERSION_MAGIC); - /* Initialize the Cygwin per-user shared, if necessary */ - if (!sversion) - { - debug_printf ("initializing user shared"); - user_shared->mountinfo.init (); /* Initialize the mount table. */ - user_shared->delqueue.init (); /* Initialize the queue of deleted files. */ - user_shared->cb = sizeof (*user_shared); - } - else - { - while (!user_shared->cb) - low_priority_sleep (0); // Should be hit only very very rarely - if (user_shared->version != sversion) - multiple_cygwin_problem ("user shared memory version", user_shared->version, sversion); - else if (user_shared->cb != sizeof (*user_shared)) - multiple_cygwin_problem ("user shared memory size", user_shared->cb, sizeof (*user_shared)); - } -} - -void -shared_info::initialize () -{ - DWORD sversion = (DWORD) InterlockedExchange ((LONG *) &version, SHARED_VERSION_MAGIC); - if (sversion) - { - if (sversion != SHARED_VERSION_MAGIC) - { - InterlockedExchange ((LONG *) &version, sversion); - multiple_cygwin_problem ("system shared memory version", sversion, SHARED_VERSION_MAGIC); - } - while (!cb) - low_priority_sleep (0); // Should be hit only very very rarely - } - - heap_init (); - - if (!sversion) - { - tty.init (); /* Initialize tty table. */ - cb = sizeof (*this); /* Do last, after all shared memory initialization */ - } - - if (cb != SHARED_INFO_CB) - system_printf ("size of shared memory region changed from %u to %u", - SHARED_INFO_CB, cb); -} - -void __stdcall -memory_init () -{ - getpagesize (); - - /* Initialize the Cygwin heap, if necessary */ - if (!cygheap) - { - cygheap_init (); - cygheap->user.init (); - } - - /* Initialize general shared memory */ - shared_locations sh_cygwin_shared = SH_CYGWIN_SHARED; - cygwin_shared = (shared_info *) open_shared ("shared", - CYGWIN_VERSION_SHARED_DATA, - cygheap->shared_h, - sizeof (*cygwin_shared), - sh_cygwin_shared); - - cygwin_shared->initialize (); - ProtectHandleINH (cygheap->shared_h); - - user_shared_initialize (false); - mtinfo_init (); -} - -unsigned -shared_info::heap_chunk_size () -{ - if (!heap_chunk) - { - /* Fetch from registry, first user then local machine. */ - for (int i = 0; i < 2; i++) - { - reg_key reg (i, KEY_READ, NULL); - - /* Note that reserving a huge amount of heap space does not result in - the use of swap since we are not committing it. */ - /* FIXME: We should not be restricted to a fixed size heap no matter - what the fixed size is. */ - - if ((heap_chunk = reg.get_int ("heap_chunk_in_mb", 0))) - break; - heap_chunk = 384; /* Default */ - } - - if (heap_chunk < 4) - heap_chunk = 4 * 1024 * 1024; - else - heap_chunk <<= 20; - if (!heap_chunk) - heap_chunk = 384 * 1024 * 1024; - debug_printf ("fixed heap size is %u", heap_chunk); - } - - return heap_chunk; -} diff --git a/winsup/cygwin/shared.sgml b/winsup/cygwin/shared.sgml deleted file mode 100644 index b8d111a55..000000000 --- a/winsup/cygwin/shared.sgml +++ /dev/null @@ -1,17 +0,0 @@ - - -cygwin_getshared - - -shared_info * -cygwin_getshared - - - -Returns a pointer to an internal Cygwin memory structure -containing shared information used by cooperating cygwin processes. -This function is intended for use only by "system" programs like -mount and ps. - - - diff --git a/winsup/cygwin/shared_info.h b/winsup/cygwin/shared_info.h deleted file mode 100644 index f0c037f61..000000000 --- a/winsup/cygwin/shared_info.h +++ /dev/null @@ -1,204 +0,0 @@ -/* shared_info.h: shared info for cygwin - - Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "tty.h" -#include "security.h" - -/* Mount table entry */ - -class mount_item -{ - public: - /* FIXME: Nasty static allocation. Need to have a heap in the shared - area [with the user being able to configure at runtime the max size]. */ - /* Win32-style mounted partition source ("C:\foo\bar"). - native_path[0] == 0 for unused entries. */ - char native_path[CYG_MAX_PATH]; - int native_pathlen; - - /* POSIX-style mount point ("/foo/bar") */ - char posix_path[CYG_MAX_PATH]; - int posix_pathlen; - - unsigned flags; - - void init (const char *dev, const char *path, unsigned flags); - - struct mntent *getmntent (); - int fnmunge (char *, const char *, int&); - int build_win32 (char *, const char *, unsigned *, unsigned); -}; - -/* Warning: Decreasing this value will cause cygwin.dll to ignore existing - higher numbered registry entries. Don't change this number willy-nilly. - What we need is to have a more dynamic allocation scheme, but the current - scheme should be satisfactory for a long while yet. */ -#define MAX_MOUNTS 30 - -#define USER_VERSION 1 // increment when mount table changes and -#define USER_VERSION_MAGIC CYGWIN_VERSION_MAGIC (USER_MAGIC, USER_VERSION) -#define CURR_USER_MAGIC 0x8dc7b1d5U - -class reg_key; -struct device; - -/* NOTE: Do not make gratuitous changes to the names or organization of the - below class. The layout is checksummed to determine compatibility between - different cygwin versions. */ -class mount_info -{ - public: - DWORD sys_mount_table_counter; - int nmounts; - mount_item mount[MAX_MOUNTS]; - - /* cygdrive_prefix is used as the root of the path automatically - prepended to a path when the path has no associated mount. - cygdrive_flags are the default flags for the cygdrives. */ - char cygdrive[CYG_MAX_PATH]; - size_t cygdrive_len; - unsigned cygdrive_flags; - private: - int posix_sorted[MAX_MOUNTS]; - int native_sorted[MAX_MOUNTS]; - - public: - void init (); - int add_item (const char *dev, const char *path, unsigned flags, int reg_p); - int del_item (const char *path, unsigned flags, int reg_p); - - void from_registry (); - int add_reg_mount (const char * native_path, const char * posix_path, - unsigned mountflags); - int del_reg_mount (const char * posix_path, unsigned mountflags); - - unsigned set_flags_from_win32_path (const char *path); - int conv_to_win32_path (const char *src_path, char *dst, device&, - unsigned *flags = NULL); - int conv_to_posix_path (const char *src_path, char *posix_path, - int keep_rel_p); - struct mntent *getmntent (int x); - - int write_cygdrive_info_to_registry (const char *cygdrive_prefix, unsigned flags); - int remove_cygdrive_info_from_registry (const char *cygdrive_prefix, unsigned flags); - int get_cygdrive_info (char *user, char *system, char* user_flags, - char* system_flags); - void cygdrive_posix_path (const char *src, char *dst, int trailing_slash_p); - int get_mounts_here (const char *parent_dir, int, char **mount_points); - - private: - - void sort (); - void read_mounts (reg_key& r); - void mount_slash (); - void to_registry (); - - int cygdrive_win32_path (const char *src, char *dst, int& unit); - void read_cygdrive_info_from_registry (); -}; - -/******** Close-on-delete queue ********/ - -/* First pass at a file deletion queue structure. - - We can't keep this list in the per-process info, since - one process may open a file, and outlive a process which - wanted to unlink the file - and the data would go away. -*/ - -#define MAX_DELQUEUES_PENDING 100 - -class delqueue_list -{ - char name[MAX_DELQUEUES_PENDING][CYG_MAX_PATH]; - char inuse[MAX_DELQUEUES_PENDING]; - int empty; - -public: - void init (); - void queue_file (const char *dosname); - void process_queue (); -}; - -class user_info -{ -public: - DWORD version; - DWORD cb; - delqueue_list delqueue; - mount_info mountinfo; -}; -/******** Shared Info ********/ -/* Data accessible to all tasks */ - -#define SHARED_VERSION (unsigned)(cygwin_version.api_major << 8 | \ - cygwin_version.api_minor) -#define SHARED_VERSION_MAGIC CYGWIN_VERSION_MAGIC (SHARED_MAGIC, SHARED_VERSION) - -#define SHARED_INFO_CB 21008 - -#define CURR_SHARED_MAGIC 0x818f75beU - -/* NOTE: Do not make gratuitous changes to the names or organization of the - below class. The layout is checksummed to determine compatibility between - different cygwin versions. */ -class shared_info -{ - DWORD version; - DWORD cb; - public: - unsigned heap_chunk; - DWORD sys_mount_table_counter; - - tty_list tty; - void initialize (); - unsigned heap_chunk_size (); -}; - -extern shared_info *cygwin_shared; -extern user_info *user_shared; -#define mount_table (&(user_shared->mountinfo)) -extern HANDLE cygwin_user_h; - -enum shared_locations -{ - SH_CYGWIN_SHARED, - SH_USER_SHARED, - SH_SHARED_CONSOLE, - SH_MYSELF, - SH_MTINFO, - SH_TOTAL_SIZE, - SH_JUSTCREATE, - SH_JUSTOPEN - -}; -void __stdcall memory_init (); - -#define shared_align_past(p) \ - ((char *) (system_info.dwAllocationGranularity * \ - (((DWORD) ((p) + 1) + system_info.dwAllocationGranularity - 1) / \ - system_info.dwAllocationGranularity))) - -#define cygwin_shared_address ((void *) 0x60000000) - -#ifdef _FHANDLER_H_ -struct console_state -{ - tty_min tty_min_state; - dev_console dev_state; -}; -#endif - -char *__stdcall shared_name (char *, const char *, int); -void *__stdcall open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, - shared_locations&, PSECURITY_ATTRIBUTES psa = &sec_all, - DWORD access = FILE_MAP_READ | FILE_MAP_WRITE); -extern void user_shared_initialize (bool reinit); - diff --git a/winsup/cygwin/shm.cc b/winsup/cygwin/shm.cc deleted file mode 100644 index f6cc30baf..000000000 --- a/winsup/cygwin/shm.cc +++ /dev/null @@ -1,370 +0,0 @@ -/* shm.cc: XSI IPC interface for Cygwin. - - Copyright 2003 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include "cygerrno.h" -#include -#ifdef USE_SERVER -#include -#include -#include -#include - -#include "pinfo.h" -#include "sigproc.h" - -#include "cygserver_ipc.h" -#include "cygserver_shm.h" -#include "cygtls.h" - -/* - * client_request_shm Constructors - */ - -client_request_shm::client_request_shm (int shmid, - const void *shmaddr, - int shmflg) - : client_request (CYGSERVER_REQUEST_SHM, &_parameters, sizeof (_parameters)) -{ - _parameters.in.shmop = SHMOP_shmat; - ipc_set_proc_info (_parameters.in.ipcblk); - - _parameters.in.atargs.shmid = shmid; - _parameters.in.atargs.shmaddr = shmaddr; - _parameters.in.atargs.shmflg = shmflg; - - msglen (sizeof (_parameters.in)); -} - -client_request_shm::client_request_shm (int shmid, - int cmd, - struct shmid_ds *buf) - : client_request (CYGSERVER_REQUEST_SHM, &_parameters, sizeof (_parameters)) -{ - _parameters.in.shmop = SHMOP_shmctl; - ipc_set_proc_info (_parameters.in.ipcblk); - - _parameters.in.ctlargs.shmid = shmid; - _parameters.in.ctlargs.cmd = cmd; - _parameters.in.ctlargs.buf = buf; - - msglen (sizeof (_parameters.in)); -} - -client_request_shm::client_request_shm (const void *shmaddr) - : client_request (CYGSERVER_REQUEST_SHM, &_parameters, sizeof (_parameters)) -{ - _parameters.in.shmop = SHMOP_shmdt; - ipc_set_proc_info (_parameters.in.ipcblk); - - _parameters.in.dtargs.shmaddr = shmaddr; - - msglen (sizeof (_parameters.in)); -} - -client_request_shm::client_request_shm (key_t key, - size_t size, - int shmflg) - : client_request (CYGSERVER_REQUEST_SHM, &_parameters, sizeof (_parameters)) -{ - _parameters.in.shmop = SHMOP_shmget; - ipc_set_proc_info (_parameters.in.ipcblk); - - _parameters.in.getargs.key = key; - _parameters.in.getargs.size = size; - _parameters.in.getargs.shmflg = shmflg; - - msglen (sizeof (_parameters.in)); -} - -client_request_shm::client_request_shm (proc *p1) - : client_request (CYGSERVER_REQUEST_SHM, &_parameters, sizeof (_parameters)) -{ - _parameters.in.shmop = SHMOP_shmfork; - ipc_set_proc_info (_parameters.in.ipcblk); - - _parameters.in.forkargs = *p1; -} - -/* List of shmid's with file mapping HANDLE and size, returned by shmget. */ -struct shm_shmid_list { - SLIST_ENTRY (shm_shmid_list) ssh_next; - int shmid; - vm_object_t hdl; - size_t size; -}; - -static SLIST_HEAD (, shm_shmid_list) ssh_list; - -/* List of attached mappings, as returned by shmat. */ -struct shm_attached_list { - SLIST_ENTRY (shm_attached_list) sph_next; - vm_object_t ptr; - vm_object_t hdl; - size_t size; - int access; -}; - -static SLIST_HEAD (, shm_attached_list) sph_list; - -int __stdcall -fixup_shms_after_fork () -{ - if (!SLIST_FIRST (&sph_list)) - return 0; - pinfo p (myself->ppid); - proc parent = { myself->ppid, p->dwProcessId, p->uid, p->gid }; - - client_request_shm request (&parent); - if (request.make_request () == -1 || request.retval () == -1) - { - syscall_printf ("-1 [%d] = fixup_shms_after_fork ()", request.error_code ()); - set_errno (request.error_code ()); - return 0; - } - shm_attached_list *sph_entry; - /* Remove map from list... */ - SLIST_FOREACH (sph_entry, &sph_list, sph_next) - { - vm_object_t ptr = MapViewOfFileEx (sph_entry->hdl, sph_entry->access, - 0, 0, sph_entry->size, sph_entry->ptr); - if (ptr != sph_entry->ptr) - api_fatal ("MapViewOfFileEx (%p), %E. Terminating.", sph_entry->ptr); - } - return 0; -} -#endif /* USE_SERVER */ - -/* - * XSI shmaphore API. These are exported by the DLL. - */ - -extern "C" void * -shmat (int shmid, const void *shmaddr, int shmflg) -{ -#ifdef USE_SERVER - syscall_printf ("shmat (shmid = %d, shmaddr = %p, shmflg = 0x%x)", - shmid, shmaddr, shmflg); - - shm_shmid_list *ssh_entry; - SLIST_FOREACH (ssh_entry, &ssh_list, ssh_next) - { - if (ssh_entry->shmid == shmid) - break; - } - if (!ssh_entry) - { - /* The shmid is unknown to this process so far. Try to get it from - the server if it exists. Use special internal call to shmget, - which interprets the key as a shmid and only returns a valid - shmid if one exists. Since shmctl inserts a new entry for this - shmid into ssh_list automatically, we just have to go through - that list again. If that still fails, well, bad luck. */ - if (shmid && shmget ((key_t) shmid, 0, IPC_KEY_IS_SHMID) != -1) - { - SLIST_FOREACH (ssh_entry, &ssh_list, ssh_next) - { - if (ssh_entry->shmid == shmid) - break; - } - } - if (!ssh_entry) - { - /* Invalid shmid */ - set_errno (EINVAL); - return (void *) -1; - } - } - vm_object_t attach_va = NULL; - if (shmaddr) - { - if (shmflg & SHM_RND) - attach_va = (vm_object_t)((vm_offset_t)shmaddr & ~(SHMLBA-1)); - else - attach_va = (vm_object_t)shmaddr; - /* Don't even bother to call anything if shmaddr is NULL or - not aligned. */ - if (!attach_va || (vm_offset_t)attach_va % SHMLBA) - { - set_errno (EINVAL); - return (void *) -1; - } - } - /* Try allocating memory before calling cygserver. */ - shm_attached_list *sph_entry = new (shm_attached_list); - if (!sph_entry) - { - set_errno (ENOMEM); - return (void *) -1; - } - DWORD access = (shmflg & SHM_RDONLY) ? FILE_MAP_READ : FILE_MAP_WRITE; - vm_object_t ptr = MapViewOfFileEx (ssh_entry->hdl, access, 0, 0, - ssh_entry->size, attach_va); - if (!ptr) - { - __seterrno (); - delete sph_entry; - return (void *) -1; - } - /* Use returned ptr address as is, so it's stored using the exact value - in cygserver. */ - client_request_shm request (shmid, ptr, shmflg & ~SHM_RND); - if (request.make_request () == -1 || request.ptrval () == NULL) - { - syscall_printf ("-1 [%d] = shmat ()", request.error_code ()); - UnmapViewOfFile (ptr); - delete sph_entry; - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return (void *) -1; - } - sph_entry->ptr = ptr; - sph_entry->hdl = ssh_entry->hdl; - sph_entry->size = ssh_entry->size; - sph_entry->access = access; - SLIST_INSERT_HEAD (&sph_list, sph_entry, sph_next); - return ptr; -#else - set_errno (ENOSYS); - raise (SIGSYS); - return (void *) -1; -#endif -} - -extern "C" int -shmctl (int shmid, int cmd, struct shmid_ds *buf) -{ -#ifdef USE_SERVER - syscall_printf ("shmctl (shmid = %d, cmd = %d, buf = 0x%x)", - shmid, cmd, buf); - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - client_request_shm request (shmid, cmd, buf); - if (request.make_request () == -1 || request.retval () == -1) - { - syscall_printf ("-1 [%d] = shmctl ()", request.error_code ()); - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return -1; - } - if (cmd == IPC_RMID) - { - /* The process must cleanup its own storage... */ - shm_shmid_list *ssh_entry, *ssh_next_entry; - SLIST_FOREACH_SAFE (ssh_entry, &ssh_list, ssh_next, ssh_next_entry) - { - if (ssh_entry->shmid == shmid) - { - SLIST_REMOVE (&ssh_list, ssh_entry, shm_shmid_list, ssh_next); - /* ...and close the handle. */ - CloseHandle (ssh_entry->hdl); - delete ssh_entry; - break; - } - } - } - return request.retval (); -#else - set_errno (ENOSYS); - raise (SIGSYS); - return -1; -#endif -} - -extern "C" int -shmdt (const void *shmaddr) -{ -#ifdef USE_SERVER - syscall_printf ("shmdt (shmaddr = %p)", shmaddr); - client_request_shm request (shmaddr); - if (request.make_request () == -1 || request.retval () == -1) - { - syscall_printf ("-1 [%d] = shmdt ()", request.error_code ()); - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return -1; - } - shm_attached_list *sph_entry, *sph_next_entry; - /* Remove map from list... */ - SLIST_FOREACH_SAFE (sph_entry, &sph_list, sph_next, sph_next_entry) - { - if (sph_entry->ptr == shmaddr) - { - SLIST_REMOVE (&sph_list, sph_entry, shm_attached_list, sph_next); - /* ...and unmap view. */ - UnmapViewOfFile (sph_entry->ptr); - delete sph_entry; - break; - } - } - return request.retval (); -#else - set_errno (ENOSYS); - raise (SIGSYS); - return -1; -#endif -} - -extern "C" int -shmget (key_t key, size_t size, int shmflg) -{ -#ifdef USE_SERVER - syscall_printf ("shmget (key = %U, size = %d, shmflg = 0x%x)", - key, size, shmflg); - /* Try allocating memory before calling cygserver. */ - shm_shmid_list *ssh_new_entry = new (shm_shmid_list); - if (!ssh_new_entry) - { - set_errno (ENOMEM); - return -1; - } - client_request_shm request (key, size, shmflg); - if (request.make_request () == -1 || request.retval () == -1) - { - syscall_printf ("-1 [%d] = shmget ()", request.error_code ()); - delete ssh_new_entry; - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return -1; - } - int shmid = request.retval (); /* Shared mem ID */ - vm_object_t hdl = request.objval (); /* HANDLE associated with it. */ - shm_shmid_list *ssh_entry; - SLIST_FOREACH (ssh_entry, &ssh_list, ssh_next) - { - if (ssh_entry->shmid == shmid) - { - /* We already maintain an entry for this shmid. That means, - the hdl returned by cygserver is a superfluous duplicate - of the original hdl maintained by cygserver. We can safely - delete it. */ - CloseHandle (hdl); - delete ssh_new_entry; - return shmid; - } - } - /* We arrive here only if shmid is a new one for this process. Add the - shmid and hdl value to the list. */ - ssh_new_entry->shmid = shmid; - ssh_new_entry->hdl = hdl; - ssh_new_entry->size = size; - SLIST_INSERT_HEAD (&ssh_list, ssh_new_entry, ssh_next); - return shmid; -#else - set_errno (ENOSYS); - raise (SIGSYS); - return -1; -#endif -} diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc deleted file mode 100644 index 1055b5fe9..000000000 --- a/winsup/cygwin/signal.cc +++ /dev/null @@ -1,549 +0,0 @@ -/* signal.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005 Red Hat, Inc. - - Written by Steve Chamberlain of Cygnus Support, sac@cygnus.com - Significant changes by Sergey Okhapkin - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include "cygerrno.h" -#include -#include "pinfo.h" -#include "sigproc.h" -#include "hires.h" -#include "security.h" -#include "cygtls.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" - -int sigcatchers; /* FIXME: Not thread safe. */ - -#define sigtrapped(func) ((func) != SIG_IGN && (func) != SIG_DFL) - -static inline void -set_sigcatchers (void (*oldsig) (int), void (*cursig) (int)) -{ -#ifdef DEBUGGING - int last_sigcatchers = sigcatchers; -#endif - if (!sigtrapped (oldsig) && sigtrapped (cursig)) - sigcatchers++; - else if (sigtrapped (oldsig) && !sigtrapped (cursig)) - sigcatchers--; -#ifdef DEBUGGING - if (last_sigcatchers != sigcatchers) - sigproc_printf ("last %d, old %d, cur %p, cur %p", last_sigcatchers, - sigcatchers, oldsig, cursig); -#endif -} - -extern "C" _sig_func_ptr -signal (int sig, _sig_func_ptr func) -{ - sig_dispatch_pending (); - _sig_func_ptr prev; - - /* check that sig is in right range */ - if (sig < 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) - { - set_errno (EINVAL); - syscall_printf ("SIG_ERR = signal (%d, %p)", sig, func); - return (_sig_func_ptr) SIG_ERR; - } - - prev = global_sigs[sig].sa_handler; - global_sigs[sig].sa_handler = func; - global_sigs[sig].sa_mask = 0; - /* SA_RESTART is set to maintain BSD compatible signal behaviour by default. - This is also compatible with the behaviour of signal(2) in Linux. */ - global_sigs[sig].sa_flags |= SA_RESTART; - global_sigs[sig].sa_flags &= ~ SA_SIGINFO; - set_sigcatchers (prev, func); - - syscall_printf ("%p = signal (%d, %p)", prev, sig, func); - return prev; -} - -extern "C" int -nanosleep (const struct timespec *rqtp, struct timespec *rmtp) -{ - int res = 0; - sig_dispatch_pending (); - pthread_testcancel (); - - if ((unsigned int) rqtp->tv_sec > (HIRES_DELAY_MAX / 1000 - 1) - || (unsigned int) rqtp->tv_nsec > 999999999) - { - set_errno (EINVAL); - return -1; - } - DWORD resolution = gtod.resolution (); - DWORD req = ((rqtp->tv_sec * 1000 + (rqtp->tv_nsec + 999999) / 1000000 - + resolution - 1) / resolution) * resolution; - DWORD end_time = gtod.dmsecs () + req; - syscall_printf ("nanosleep (%ld)", req); - - int rc = cancelable_wait (signal_arrived, req); - DWORD rem; - if ((rem = end_time - gtod.dmsecs ()) > HIRES_DELAY_MAX) - rem = 0; - if (rc == WAIT_OBJECT_0) - { - _my_tls.call_signal_handler (); - set_errno (EINTR); - res = -1; - } - - if (rmtp) - { - rmtp->tv_sec = rem / 1000; - rmtp->tv_nsec = (rem % 1000) * 1000000; - } - - syscall_printf ("%d = nanosleep (%ld, %ld)", res, req, rem); - return res; -} - -extern "C" unsigned int -sleep (unsigned int seconds) -{ - struct timespec req, rem; - req.tv_sec = seconds; - req.tv_nsec = 0; - nanosleep (&req, &rem); - return rem.tv_sec + (rem.tv_nsec > 0); -} - -extern "C" unsigned int -usleep (unsigned int useconds) -{ - struct timespec req; - req.tv_sec = useconds / 1000000; - req.tv_nsec = (useconds % 1000000) * 1000; - int res = nanosleep (&req, 0); - return res; -} - -extern "C" int -sigprocmask (int how, const sigset_t *set, sigset_t *oldset) -{ - return handle_sigprocmask (how, set, oldset, myself->getsigmask ()); -} - -int __stdcall -handle_sigprocmask (int how, const sigset_t *set, sigset_t *oldset, sigset_t& opmask) -{ - sig_dispatch_pending (); - /* check that how is in right range */ - if (how != SIG_BLOCK && how != SIG_UNBLOCK && how != SIG_SETMASK) - { - syscall_printf ("Invalid how value %d", how); - set_errno (EINVAL); - return -1; - } - - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - if (oldset) - *oldset = opmask; - - if (set) - { - sigset_t newmask = opmask; - switch (how) - { - case SIG_BLOCK: - /* add set to current mask */ - newmask |= *set; - break; - case SIG_UNBLOCK: - /* remove set from current mask */ - newmask &= ~*set; - break; - case SIG_SETMASK: - /* just set it */ - newmask = *set; - break; - } - set_signal_mask (newmask, opmask); - } - return 0; -} - -int __stdcall -_pinfo::kill (siginfo_t& si) -{ - sig_dispatch_pending (); - - int res = 0; - bool sendSIGCONT; - - if (!exists ()) - { - set_errno (ESRCH); - return -1; - } - - if ((sendSIGCONT = (si.si_signo < 0))) - si.si_signo = -si.si_signo; - - DWORD this_process_state = process_state; - if (si.si_signo == 0) - /* ok */; - else if ((res = sig_send (this, si))) - { - sigproc_printf ("%d = sig_send, %E ", res); - res = -1; - } - else if (sendSIGCONT) - { - siginfo_t si2 = {0}; - si2.si_signo = SIGCONT; - si2.si_code = SI_KERNEL; - sig_send (this, si2); - } - - syscall_printf ("%d = _pinfo::kill (%d, %d), process_state %p", res, pid, - si.si_signo, this_process_state); - return res; -} - -int -raise (int sig) -{ - return kill (myself->pid, sig); -} - -static int -kill0 (pid_t pid, siginfo_t& si) -{ - syscall_printf ("kill (%d, %d)", pid, si.si_signo); - /* check that sig is in right range */ - if (si.si_signo < 0 || si.si_signo >= NSIG) - { - set_errno (EINVAL); - syscall_printf ("signal %d out of range", si.si_signo); - return -1; - } - - /* Silently ignore stop signals from a member of orphaned process group. - FIXME: Why??? */ - if (ISSTATE (myself, PID_ORPHANED) && - (si.si_signo == SIGTSTP || si.si_signo == SIGTTIN || si.si_signo == SIGTTOU)) - si.si_signo = 0; - - return (pid > 0) ? pinfo (pid)->kill (si) : kill_pgrp (-pid, si); -} - -int -killsys (pid_t pid, int sig) -{ - siginfo_t si = {0}; - si.si_signo = sig; - si.si_code = SI_KERNEL; - return kill0 (pid, si); -} - -int -kill (pid_t pid, int sig) -{ - siginfo_t si = {0}; - si.si_signo = sig; - si.si_code = SI_USER; - return kill0 (pid, si); -} - -int -kill_pgrp (pid_t pid, siginfo_t& si) -{ - int res = 0; - int found = 0; - int killself = 0; - - sigproc_printf ("pid %d, signal %d", pid, si.si_signo); - - winpids pids ((DWORD) PID_MAP_RW); - for (unsigned i = 0; i < pids.npids; i++) - { - _pinfo *p = pids[i]; - - if (!p->exists ()) - continue; - - /* Is it a process we want to kill? */ - if ((pid == 0 && (p->pgid != myself->pgid || p->ctty != myself->ctty)) || - (pid > 1 && p->pgid != pid) || - (si.si_signo < 0 && NOTSTATE (p, PID_STOPPED))) - continue; - sigproc_printf ("killing pid %d, pgrp %d, p->%s, %s", p->pid, p->pgid, - p->__ctty (), myctty ()); - if (p == myself) - killself++; - else if (p->kill (si)) - res = -1; - found++; - } - - if (killself && !exit_state && myself->kill (si)) - res = -1; - - if (!found) - { - set_errno (ESRCH); - res = -1; - } - syscall_printf ("%d = kill (%d, %d)", res, pid, si.si_signo); - return res; -} - -extern "C" int -killpg (pid_t pgrp, int sig) -{ - return kill (-pgrp, sig); -} - -extern "C" void -abort (void) -{ - sig_dispatch_pending (); - /* Flush all streams as per SUSv2. - From my reading of this document, this isn't strictly correct. - The streams are supposed to be flushed prior to exit. However, - if there is I/O in any signal handler that will not necessarily - be flushed. - However this is the way FreeBSD does it, and it is much easier to - do things this way, so... */ - if (_GLOBAL_REENT->__cleanup) - _GLOBAL_REENT->__cleanup (_GLOBAL_REENT); - - /* Ensure that SIGABRT can be caught regardless of blockage. */ - sigset_t sig_mask; - sigfillset (&sig_mask); - sigdelset (&sig_mask, SIGABRT); - set_signal_mask (sig_mask, myself->getsigmask ()); - - raise (SIGABRT); - _my_tls.call_signal_handler (); /* Call any signal handler */ - do_exit (SIGABRT); /* signal handler didn't exit. Goodbye. */ -} - -extern "C" int -sigaction (int sig, const struct sigaction *newact, struct sigaction *oldact) -{ - sig_dispatch_pending (); - /* check that sig is in right range */ - if (sig < 0 || sig >= NSIG) - { - set_errno (EINVAL); - sigproc_printf ("signal %d, newact %p, oldact %p", sig, newact, oldact); - syscall_printf ("SIG_ERR = sigaction signal %d out of range", sig); - return -1; - } - - struct sigaction oa = global_sigs[sig]; - - if (!newact) - sigproc_printf ("signal %d, newact %p, oa %p", sig, newact, oa, oa.sa_handler); - else - { - sigproc_printf ("signal %d, newact %p (handler %p), oa %p", sig, newact, newact->sa_handler, oa, oa.sa_handler); - if (sig == SIGKILL || sig == SIGSTOP) - { - set_errno (EINVAL); - return -1; - } - struct sigaction& na = global_sigs[sig]; - na = *newact; - if (!(na.sa_flags & SA_NODEFER)) - na.sa_mask |= SIGTOMASK(sig); - if (na.sa_handler == SIG_IGN) - sig_clear (sig); - if (na.sa_handler == SIG_DFL && sig == SIGCHLD) - sig_clear (sig); - set_sigcatchers (oa.sa_handler, na.sa_handler); - if (sig == SIGCHLD) - { - myself->process_state &= ~PID_NOCLDSTOP; - if (na.sa_flags & SA_NOCLDSTOP) - myself->process_state |= PID_NOCLDSTOP; - } - } - - if (oldact) - *oldact = oa; - - return 0; -} - -extern "C" int -sigaddset (sigset_t *set, const int sig) -{ - /* check that sig is in right range */ - if (sig <= 0 || sig >= NSIG) - { - set_errno (EINVAL); - syscall_printf ("SIG_ERR = sigaddset signal %d out of range", sig); - return -1; - } - - *set |= SIGTOMASK (sig); - return 0; -} - -extern "C" int -sigdelset (sigset_t *set, const int sig) -{ - /* check that sig is in right range */ - if (sig <= 0 || sig >= NSIG) - { - set_errno (EINVAL); - syscall_printf ("SIG_ERR = sigdelset signal %d out of range", sig); - return -1; - } - - *set &= ~SIGTOMASK (sig); - return 0; -} - -extern "C" int -sigismember (const sigset_t *set, int sig) -{ - /* check that sig is in right range */ - if (sig <= 0 || sig >= NSIG) - { - set_errno (EINVAL); - syscall_printf ("SIG_ERR = sigdelset signal %d out of range", sig); - return -1; - } - - if (*set & SIGTOMASK (sig)) - return 1; - else - return 0; -} - -extern "C" int -sigemptyset (sigset_t *set) -{ - *set = (sigset_t) 0; - return 0; -} - -extern "C" int -sigfillset (sigset_t *set) -{ - *set = ~((sigset_t) 0); - return 0; -} - -extern "C" int -sigsuspend (const sigset_t *set) -{ - return handle_sigsuspend (*set); -} - -extern "C" int -sigpause (int signal_mask) -{ - return handle_sigsuspend ((sigset_t) signal_mask); -} - -extern "C" int -pause (void) -{ - return handle_sigsuspend (myself->getsigmask ()); -} - -extern "C" int -siginterrupt (int sig, int flag) -{ - struct sigaction act; - sigaction(sig, NULL, &act); - if (flag) - act.sa_flags &= ~SA_RESTART; - else - act.sa_flags |= SA_RESTART; - return sigaction (sig, &act, NULL); -} - -extern "C" int -sigwait (const sigset_t *set, int *sig_ptr) -{ - int sig = sigwaitinfo (set, NULL); - if (sig > 0) - *sig_ptr = sig; - return sig > 0 ? 0 : -1; -} - -extern "C" int -sigwaitinfo (const sigset_t *set, siginfo_t *info) -{ - pthread_testcancel (); - HANDLE h; - h = _my_tls.event = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); - if (!h) - { - __seterrno (); - return -1; - } - - _my_tls.sigwait_mask = *set; - sig_dispatch_pending (true); - - int res; - switch (WaitForSingleObject (h, INFINITE)) - { - case WAIT_OBJECT_0: - if (!sigismember (set, _my_tls.infodata.si_signo)) - { - set_errno (EINTR); - res = -1; - } - else - { - if (info) - *info = _my_tls.infodata; - res = _my_tls.infodata.si_signo; - InterlockedExchange ((LONG *) &_my_tls.sig, (LONG) 0); - } - break; - default: - __seterrno (); - res = -1; - } - CloseHandle (h); - sigproc_printf ("returning sig %d", res); - return res; -} - -/* FIXME: SUSv3 says that this function should block until the signal has - actually been delivered. Currently, this will only happen when sending - signals to the current process. It will not happen when sending signals - to other processes. */ -extern "C" int -sigqueue (pid_t pid, int sig, const union sigval value) -{ - siginfo_t si = {0}; - pinfo dest (pid); - if (!dest) - { - set_errno (ESRCH); - return -1; - } - si.si_signo = sig; - si.si_code = SI_QUEUE; - si.si_value = value; - return sig_send (dest, si); -} diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc deleted file mode 100644 index 00a6cf90e..000000000 --- a/winsup/cygwin/sigproc.cc +++ /dev/null @@ -1,1262 +0,0 @@ -/* sigproc.cc: inter/intra signal and sub process handler - - Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006 Red Hat, Inc. - - Written by Christopher Faylor - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "sync.h" -#include "pinfo.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "child_info_magic.h" -#include "shared_info.h" -#include "cygtls.h" -#include "sigproc.h" -#include "exceptions.h" - -/* - * Convenience defines - */ -#define WSSC 60000 // Wait for signal completion -#define WPSP 40000 // Wait for proc_subproc mutex - -#define no_signals_available(x) (!hwait_sig || ((x) && myself->exitcode & EXITCODE_SET) || &_my_tls == _sig_tls || in_dllentry) - -#define NPROCS 256 - -/* - * Global variables - */ -struct sigaction *global_sigs; - -const char *__sp_fn ; -int __sp_ln; - -char NO_COPY myself_nowait_dummy[1] = {'0'};// Flag to sig_send that signal goes to - // current process but no wait is required -HANDLE NO_COPY signal_arrived; // Event signaled when a signal has - // resulted in a user-specified - // function call - -#define Static static NO_COPY - -HANDLE NO_COPY sigCONT; // Used to "STOP" a process - -cygthread *hwait_sig; -Static HANDLE wait_sig_inited; // Control synchronization of - // message queue startup -static bool sigheld; // True if holding signals - -Static int nprocs; // Number of deceased children -Static char cprocs[(NPROCS + 1) * sizeof (pinfo)];// All my children info -#define procs ((pinfo *) cprocs) // All this just to avoid expensive - // constructor operation at DLL startup -Static waitq waitq_head = {0, 0, 0, 0, 0, 0, 0};// Start of queue for wait'ing threads - -static muto NO_COPY sync_proc_subproc; // Control access to subproc stuff - -_cygtls NO_COPY *_sig_tls; - -/* Function declarations */ -static int __stdcall checkstate (waitq *) __attribute__ ((regparm (1))); -static __inline__ bool get_proc_lock (DWORD, DWORD); -static bool __stdcall remove_proc (int); -static bool __stdcall stopped_or_terminated (waitq *, _pinfo *); -static DWORD WINAPI wait_sig (VOID *arg); -static HANDLE NO_COPY my_sendsig; - -/* wait_sig bookkeeping */ - -class pending_signals -{ - sigpacket sigs[NSIG + 1]; - sigpacket start; - sigpacket *end; - sigpacket *prev; - sigpacket *curr; -public: - void reset () {curr = &start; prev = &start;} - void add (sigpacket&); - void del (); - sigpacket *next (); - sigpacket *save () const {return curr;} - void restore (sigpacket *saved) {curr = saved;} - friend void __stdcall sig_dispatch_pending (bool); - friend DWORD WINAPI wait_sig (VOID *arg); -}; - -static pending_signals sigq; - -/* Functions */ -void __stdcall -sigalloc () -{ - cygheap->sigs = global_sigs = - (struct sigaction *) ccalloc (HEAP_SIGS, NSIG, sizeof (struct sigaction)); - global_sigs[SIGSTOP].sa_flags = SA_RESTART | SA_NODEFER; -} - -void __stdcall -signal_fixup_after_exec () -{ - global_sigs = cygheap->sigs; - /* Set up child's signal handlers */ - for (int i = 0; i < NSIG; i++) - { - global_sigs[i].sa_mask = 0; - if (global_sigs[i].sa_handler != SIG_IGN) - { - global_sigs[i].sa_handler = SIG_DFL; - global_sigs[i].sa_flags &= ~ SA_SIGINFO; - } - } -} - -void __stdcall -wait_for_sigthread () -{ - sigproc_printf ("wait_sig_inited %p", wait_sig_inited); - HANDLE hsig_inited = wait_sig_inited; - WaitForSingleObject (hsig_inited, INFINITE); - wait_sig_inited = NULL; - ForceCloseHandle1 (hsig_inited, wait_sig_inited); -} - -/* Get the sync_proc_subproc muto to control access to - * children, proc arrays. - * Attempt to handle case where process is exiting as we try to grab - * the mutex. - */ -static bool -get_proc_lock (DWORD what, DWORD val) -{ - Static int lastwhat = -1; - if (!sync_proc_subproc) - { - sigproc_printf ("sync_proc_subproc is NULL (1)"); - return false; - } - if (sync_proc_subproc.acquire (WPSP)) - { - lastwhat = what; - return true; - } - if (!sync_proc_subproc) - { - sigproc_printf ("sync_proc_subproc is NULL (2)"); - return false; - } - system_printf ("Couldn't aquire sync_proc_subproc for(%d,%d), last %d, %E", - what, val, lastwhat); - return true; -} - -static bool __stdcall -proc_can_be_signalled (_pinfo *p) -{ - if (!(p->exitcode & EXITCODE_SET)) - { - if (ISSTATE (p, PID_INITIALIZING) || - (((p)->process_state & (PID_ACTIVE | PID_IN_USE)) == - (PID_ACTIVE | PID_IN_USE))) - return true; - } - - set_errno (ESRCH); - return false; -} - -bool __stdcall -pid_exists (pid_t pid) -{ - return pinfo (pid)->exists (); -} - -/* Return true if this is one of our children, false otherwise. */ -static inline bool __stdcall -mychild (int pid) -{ - for (int i = 0; i < nprocs; i++) - if (procs[i]->pid == pid) - return true; - return false; -} - -/* Handle all subprocess requests - */ -int __stdcall -proc_subproc (DWORD what, DWORD val) -{ - int rc = 1; - int potential_match; - _pinfo *child; - int clearing; - waitq *w; - -#define wval ((waitq *) val) -#define vchild (*((pinfo *) val)) - - sigproc_printf ("args: %x, %d", what, val); - - if (!get_proc_lock (what, val)) // Serialize access to this function - { - system_printf ("couldn't get proc lock. what %d, val %d", what, val); - goto out1; - } - - switch (what) - { - /* Add a new subprocess to the children arrays. - * (usually called from the main thread) - */ - case PROC_ADDCHILD: - /* Filled up process table? */ - if (nprocs >= NPROCS) - { - sigproc_printf ("proc table overflow: hit %d processes, pid %d\n", - nprocs, vchild->pid); - rc = 0; - set_errno (EAGAIN); - break; - } - /* fall through intentionally */ - - case PROC_DETACHED_CHILD: - if (vchild != myself) - { - vchild->ppid = what == PROC_DETACHED_CHILD ? 1 : myself->pid; - vchild->uid = myself->uid; - vchild->gid = myself->gid; - vchild->pgid = myself->pgid; - vchild->sid = myself->sid; - vchild->ctty = myself->ctty; - vchild->cygstarted = true; - vchild->process_state |= PID_INITIALIZING | (myself->process_state & PID_USETTY); - } - if (what == PROC_DETACHED_CHILD) - break; - procs[nprocs] = vchild; - rc = procs[nprocs].wait (); - if (rc) - { - sigproc_printf ("added pid %d to proc table, slot %d", vchild->pid, - nprocs); - nprocs++; - } - break; - - /* Handle a wait4() operation. Allocates an event for the calling - * thread which is signaled when the appropriate pid exits or stops. - * (usually called from the main thread) - */ - case PROC_WAIT: - wval->ev = NULL; // Don't know event flag yet - - if (wval->pid == -1 || !wval->pid) - child = NULL; // Not looking for a specific pid - else if (!mychild (wval->pid)) - goto out; // invalid pid. flag no such child - - wval->status = 0; // Don't know status yet - sigproc_printf ("wval->pid %d, wval->options %d", wval->pid, wval->options); - - /* If the first time for this thread, create a new event, otherwise - * reset the event. - */ - if ((wval->ev = wval->thread_ev) == NULL) - { - wval->ev = wval->thread_ev = CreateEvent (&sec_none_nih, TRUE, FALSE, - NULL); - ProtectHandle1 (wval->ev, wq_ev); - } - - ResetEvent (wval->ev); - w = waitq_head.next; - waitq_head.next = wval; /* Add at the beginning. */ - wval->next = w; /* Link in rest of the list. */ - clearing = 0; - goto scan_wait; - - /* Clear all waiting threads. Called from exceptions.cc prior to - the main thread's dispatch to a signal handler function. - (called from wait_sig thread) */ - case PROC_CLEARWAIT: - /* Clear all "wait"ing threads. */ - if (val) - sigproc_printf ("clear waiting threads"); - else - sigproc_printf ("looking for processes to reap, nprocs %d", nprocs); - clearing = val; - - scan_wait: - /* Scan the linked list of wait()ing threads. If a wait's parameters - match this pid, then activate it. */ - for (w = &waitq_head; w->next != NULL; w = w->next) - { - if ((potential_match = checkstate (w)) > 0) - sigproc_printf ("released waiting thread"); - else if (!clearing && !(w->next->options & WNOHANG) && potential_match < 0) - sigproc_printf ("only found non-terminated children"); - else if (potential_match <= 0) // nothing matched - { - sigproc_printf ("waiting thread found no children"); - HANDLE oldw = w->next->ev; - w->next->pid = 0; - if (clearing) - w->next->status = -1; /* flag that a signal was received */ - else if (!potential_match || !(w->next->options & WNOHANG)) - w->next->ev = NULL; - if (!SetEvent (oldw)) - system_printf ("couldn't wake up wait event %p, %E", oldw); - w->next = w->next->next; - } - if (w->next == NULL) - break; - } - - if (!clearing) - sigproc_printf ("finished processing terminated/stopped child"); - else - { - waitq_head.next = NULL; - sigproc_printf ("finished clearing"); - } - - if (global_sigs[SIGCHLD].sa_handler == (void *) SIG_IGN) - for (int i = 0; i < nprocs; i += remove_proc (i)) - continue; - } - -out: - sync_proc_subproc.release (); // Release the lock -out1: - sigproc_printf ("returning %d", rc); - return rc; -#undef wval -#undef vchild -} - -// FIXME: This is inelegant -void -_cygtls::remove_wq (DWORD wait) -{ - if (exit_state < ES_FINAL && sync_proc_subproc - && sync_proc_subproc.acquire (wait)) - { - for (waitq *w = &waitq_head; w->next != NULL; w = w->next) - if (w->next == &wq) - { - ForceCloseHandle1 (wq.thread_ev, wq_ev); - w->next = wq.next; - break; - } - sync_proc_subproc.release (); - } -} - -/* Terminate the wait_subproc thread. - Called on process exit. - Also called by spawn_guts to disassociate any subprocesses from this - process. Subprocesses will then know to clean up after themselves and - will not become procs. */ -void __stdcall -proc_terminate () -{ - sigproc_printf ("nprocs %d", nprocs); - if (nprocs) - { - sync_proc_subproc.acquire (WPSP); - - proc_subproc (PROC_CLEARWAIT, 1); - - /* Clean out proc processes from the pid list. */ - int i; - for (i = 0; i < nprocs; i++) - { - procs[i]->ppid = 1; - if (procs[i].wait_thread) - { - // CloseHandle (procs[i].rd_proc_pipe); - procs[i].wait_thread->terminate_thread (); - } - procs[i].release (); - } - nprocs = 0; - sync_proc_subproc.release (); - } - sigproc_printf ("leaving"); -} - -/* Clear pending signal */ -void __stdcall -sig_clear (int target_sig) -{ - if (&_my_tls != _sig_tls) - sig_send (myself, -target_sig); - else - { - sigpacket *q; - sigpacket *save = sigq.save (); - sigq.reset (); - while ((q = sigq.next ())) - if (q->si.si_signo == target_sig) - { - q->si.si_signo = __SIGDELETE; - break; - } - sigq.restore (save); - } -} - -extern "C" int -sigpending (sigset_t *mask) -{ - sigset_t outset = (sigset_t) sig_send (myself, __SIGPENDING); - if (outset == SIG_BAD_MASK) - return -1; - *mask = outset; - return 0; -} - -/* Force the wait_sig thread to wake up and scan for pending signals */ -void __stdcall -sig_dispatch_pending (bool fast) -{ - if (exit_state || &_my_tls == _sig_tls) - { -#ifdef DEBUGGING - sigproc_printf ("exit_state %d, cur thread id %p, _sig_tls %p, sigq.start.next %p", - exit_state, GetCurrentThreadId (), _sig_tls, sigq.start.next); -#endif - return; - } - -#ifdef DEBUGGING - sigproc_printf ("flushing"); -#endif - sig_send (myself, fast ? __SIGFLUSHFAST : __SIGFLUSH); -} - -void __stdcall -create_signal_arrived () -{ - if (signal_arrived) - return; - /* local event signaled when main thread has been dispatched - to a signal handler function. */ - signal_arrived = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); - ProtectHandle (signal_arrived); -} - -/* Signal thread initialization. Called from dll_crt0_1. - - This routine starts the signal handling thread. The wait_sig_inited - event is used to signal that the thread is ready to handle signals. - We don't wait for this during initialization but instead detect it - in sig_send to gain a little concurrency. */ -void __stdcall -sigproc_init () -{ - wait_sig_inited = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); - ProtectHandle (wait_sig_inited); - - /* sync_proc_subproc is used by proc_subproc. It serialises - access to the children and proc arrays. */ - sync_proc_subproc.init ("sync_proc_subproc"); - - hwait_sig = new cygthread (wait_sig, 0, cygself, "sig"); - hwait_sig->zap_h (); - - sigproc_printf ("process/signal handling enabled, state %p", myself->process_state); -} - -/* Called on process termination to terminate signal and process threads. - */ -void __stdcall -sigproc_terminate (exit_states es) -{ - exit_states prior_exit_state = exit_state; - exit_state = es; - if (prior_exit_state >= ES_FINAL) - sigproc_printf ("already performed"); - else - { - sigproc_printf ("entering"); - sig_send (myself_nowait, __SIGEXIT); - proc_terminate (); // clean up process stuff - } -} - -int __stdcall -sig_send (_pinfo *p, int sig) -{ - if (sig == __SIGHOLD) - sigheld = true; - else if (!sigheld) - /* nothing */; - else if (sig == __SIGFLUSH || sig == __SIGFLUSHFAST) - return 0; - else if (sig == __SIGNOHOLD || sig == __SIGEXIT) - { - SetEvent (sigCONT); - sigheld = false; - } - else if (&_my_tls == _main_tls) - { -#ifdef DEBUGGING - system_printf ("signal %d sent to %p while signals are on hold", sig, p); -#endif - return -1; - } - siginfo_t si = {0}; - si.si_signo = sig; - si.si_code = SI_KERNEL; - si.si_pid = si.si_uid = si.si_errno = 0; - return sig_send (p, si); -} - -/* Send a signal to another process by raising its signal semaphore. - If pinfo *p == NULL, send to the current process. - If sending to this process, wait for notification that a signal has - completed before returning. */ -int __stdcall -sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls) -{ - int rc = 1; - bool its_me; - HANDLE sendsig; - sigpacket pack; - bool communing = si.si_signo == __SIGCOMMUNE; - - pack.wakeup = NULL; - bool wait_for_completion; - if (!(its_me = (p == NULL || p == myself || p == myself_nowait))) - { - /* It is possible that the process is not yet ready to receive messages - * or that it has exited. Detect this. - */ - if (!proc_can_be_signalled (p)) /* Is the process accepting messages? */ - { - sigproc_printf ("invalid pid %d(%x), signal %d", - p->pid, p->process_state, si.si_signo); - goto out; - } - wait_for_completion = false; - } - else - { - if (no_signals_available (si.si_signo != __SIGEXIT)) - { - sigproc_printf ("my_sendsig %p, myself->sendsig %p, exit_state %d", - my_sendsig, myself->sendsig, exit_state); - set_errno (EAGAIN); - goto out; // Either exiting or not yet initializing - } - if (wait_sig_inited) - wait_for_sigthread (); - wait_for_completion = p != myself_nowait && _my_tls.isinitialized () && !exit_state; - p = myself; - } - - - if (its_me) - sendsig = my_sendsig; - else - { - HANDLE dupsig; - DWORD dwProcessId; - for (int i = 0; !p->sendsig && i < 10000; i++) - low_priority_sleep (0); - if (p->sendsig) - { - dupsig = p->sendsig; - dwProcessId = p->dwProcessId; - } - else - { - dupsig = p->exec_sendsig; - dwProcessId = p->exec_dwProcessId; - } - if (!dupsig) - { - set_errno (EAGAIN); - sigproc_printf ("sendsig handle never materialized"); - goto out; - } - HANDLE hp = OpenProcess (PROCESS_DUP_HANDLE, false, dwProcessId); - if (!hp) - { - __seterrno (); - sigproc_printf ("OpenProcess failed, %E"); - goto out; - } - VerifyHandle (hp); - if (!DuplicateHandle (hp, dupsig, hMainProc, &sendsig, false, 0, - DUPLICATE_SAME_ACCESS) || !sendsig) - { - __seterrno (); - sigproc_printf ("DuplicateHandle failed, %E"); - CloseHandle (hp); - goto out; - } - VerifyHandle (sendsig); - if (!communing) - CloseHandle (hp); - else - { - si._si_commune._si_process_handle = hp; - - HANDLE& tome = si._si_commune._si_write_handle; - HANDLE& fromthem = si._si_commune._si_read_handle; - if (!CreatePipe (&fromthem, &tome, &sec_all_nih, 0)) - { - sigproc_printf ("CreatePipe for __SIGCOMMUNE failed, %E"); - __seterrno (); - goto out; - } - if (!DuplicateHandle (hMainProc, tome, hp, &tome, false, 0, - DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE)) - { - sigproc_printf ("DuplicateHandle for __SIGCOMMUNE failed, %E"); - __seterrno (); - goto out; - } - } - } - - sigproc_printf ("sendsig %p, pid %d, signal %d, its_me %d", sendsig, p->pid, si.si_signo, its_me); - - sigset_t pending; - if (!its_me) - pack.mask = NULL; - else if (si.si_signo == __SIGPENDING) - pack.mask = &pending; - else if (si.si_signo == __SIGFLUSH || si.si_signo > 0) - pack.mask = &myself->getsigmask (); - else - pack.mask = NULL; - - pack.si = si; - if (!pack.si.si_pid) - pack.si.si_pid = myself->pid; - if (!pack.si.si_uid) - pack.si.si_uid = myself->uid; - pack.pid = myself->pid; - pack.tls = (_cygtls *) tls; - if (wait_for_completion) - { - pack.wakeup = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); - sigproc_printf ("wakeup %p", pack.wakeup); - ProtectHandle (pack.wakeup); - } - - char *leader; - size_t packsize; - if (!communing || !(si._si_commune._si_code & PICOM_EXTRASTR)) - { - leader = (char *) &pack; - packsize = sizeof (pack); - } - else - { - size_t n = strlen (si._si_commune._si_str); - char *p = leader = (char *) alloca (sizeof (pack) + sizeof (n) + n); - memcpy (p, &pack, sizeof (pack)); p += sizeof (pack); - memcpy (p, &n, sizeof (n)); p += sizeof (n); - memcpy (p, si._si_commune._si_str, n); p += n; - packsize = p - leader; - } - - DWORD nb; - if (!WriteFile (sendsig, leader, packsize, &nb, NULL) || nb != packsize) - { - /* Couldn't send to the pipe. This probably means that the - process is exiting. */ - if (!its_me) - { - __seterrno (); - sigproc_printf ("WriteFile for pipe %p failed, %E", sendsig); - ForceCloseHandle (sendsig); - } - else - { - if (no_signals_available (true)) - sigproc_printf ("I'm going away now"); - else if (!p->exec_sendsig) - system_printf ("error sending signal %d to pid %d, pipe handle %p, %E", - si.si_signo, p->pid, sendsig); - set_errno (EACCES); - } - goto out; - } - - - /* No need to wait for signal completion unless this was a signal to - this process. - - If it was a signal to this process, wait for a dispatched signal. - Otherwise just wait for the wait_sig to signal that it has finished - processing the signal. */ - if (wait_for_completion) - { - sigproc_printf ("Waiting for pack.wakeup %p", pack.wakeup); - rc = WaitForSingleObject (pack.wakeup, WSSC); - ForceCloseHandle (pack.wakeup); - } - else - { - rc = WAIT_OBJECT_0; - sigproc_printf ("Not waiting for sigcomplete. its_me %d signal %d", - its_me, si.si_signo); - if (!its_me) - ForceCloseHandle (sendsig); - } - - pack.wakeup = NULL; - if (rc == WAIT_OBJECT_0) - rc = 0; // Successful exit - else - { - if (!no_signals_available (true)) - system_printf ("wait for sig_complete event failed, signal %d, rc %d, %E", - si.si_signo, rc); - set_errno (ENOSYS); - rc = -1; - } - - if (wait_for_completion && si.si_signo != __SIGFLUSHFAST) - _my_tls.call_signal_handler (); - goto out; - -out: - if (communing && rc) - { - if (si._si_commune._si_process_handle) - CloseHandle (si._si_commune._si_process_handle); - if (si._si_commune._si_read_handle) - CloseHandle (si._si_commune._si_read_handle); - } - if (pack.wakeup) - ForceCloseHandle (pack.wakeup); - if (si.si_signo != __SIGPENDING) - /* nothing */; - else if (!rc) - rc = (int) pending; - else - rc = SIG_BAD_MASK; - sigproc_printf ("returning %p from sending signal %d", rc, si.si_signo); - return rc; -} - -int child_info::retry_count = 10; -/* Initialize some of the memory block passed to child processes - by fork/spawn/exec. */ - -child_info::child_info (unsigned in_cb, child_info_types chtype, bool need_subproc_ready) -{ - memset (this, 0, in_cb); - cb = in_cb; - intro = PROC_MAGIC_GENERIC; - magic = CHILD_INFO_MAGIC; - type = chtype; - fhandler_union_cb = sizeof (fhandler_union); - user_h = cygwin_user_h; - if (need_subproc_ready) - subproc_ready = CreateEvent (&sec_all, FALSE, FALSE, NULL); - sigproc_printf ("subproc_ready %p", subproc_ready); - cygheap = ::cygheap; - cygheap_max = ::cygheap_max; - flag = 0; - if (strace.attached ()) - flag |= _CI_STRACED; - if (need_subproc_ready) - flag |= _CI_ISCYGWIN; - retry = child_info::retry_count; - /* Create an inheritable handle to pass to the child process. This will - allow the child to duplicate handles from the parent to itself. */ - parent = NULL; - if (!DuplicateHandle (hMainProc, hMainProc, hMainProc, &parent, 0, TRUE, - DUPLICATE_SAME_ACCESS)) - system_printf ("couldn't create handle to myself for child, %E"); -} - -child_info::~child_info () -{ - if (subproc_ready) - CloseHandle (subproc_ready); - if (parent) - CloseHandle (parent); -} - -child_info_fork::child_info_fork () : - child_info (sizeof *this, _PROC_FORK, true) -{ -} - -child_info_spawn::child_info_spawn (child_info_types chtype, bool need_subproc_ready) : - child_info (sizeof *this, chtype, need_subproc_ready) -{ -} - -void -child_info::ready (bool execed) -{ - if (!subproc_ready) - { - sigproc_printf ("subproc_ready not set"); - return; - } - - if (dynamically_loaded) - sigproc_printf ("not really ready"); - else if (!SetEvent (subproc_ready)) - api_fatal ("SetEvent failed"); - else - sigproc_printf ("signalled %p that I was ready", subproc_ready); - - if (execed) - { - CloseHandle (subproc_ready); - subproc_ready = NULL; - } -} - -bool -child_info::sync (pid_t pid, HANDLE& hProcess, DWORD howlong) -{ - bool res; - HANDLE w4[2]; - unsigned n = 0; - unsigned nsubproc_ready; - - if (!subproc_ready) - nsubproc_ready = WAIT_OBJECT_0 + 3; - else - { - w4[n++] = subproc_ready; - nsubproc_ready = 0; - } - w4[n++] = hProcess; - - sigproc_printf ("n %d, waiting for subproc_ready(%p) and child process(%p)", n, w4[0], w4[1]); - DWORD x = WaitForMultipleObjects (n, w4, FALSE, howlong); - x -= WAIT_OBJECT_0; - if (x >= n) - { - system_printf ("wait failed, pid %u, %E", pid); - res = false; - } - else - { - if (x != nsubproc_ready) - { - res = false; - GetExitCodeProcess (hProcess, &exit_code); - } - else - { - res = true; - exit_code = STILL_ACTIVE; - if (type == _PROC_EXEC && myself->wr_proc_pipe) - { - ForceCloseHandle1 (hProcess, childhProc); - hProcess = NULL; - } - } - sigproc_printf ("pid %u, WFMO returned %d, res %d", pid, x, res); - } - return res; -} - -DWORD -child_info::proc_retry (HANDLE h) -{ - if (!exit_code) - return EXITCODE_OK; - switch (exit_code) - { - case STILL_ACTIVE: /* shouldn't happen */ - sigproc_printf ("STILL_ACTIVE? How'd we get here?"); - break; - case STATUS_CONTROL_C_EXIT: - case STATUS_DLL_INIT_FAILED: - case STATUS_DLL_INIT_FAILED_LOGOFF: - case EXITCODE_RETRY: - if (retry-- > 0) - exit_code = 0; - break; - /* Count down non-recognized exit codes more quickly since they aren't - due to known conditions. */ - default: - if (!iscygwin () && (exit_code & 0xc0000000) != 0xc0000000) - break; - if ((retry -= 2) < 0) - retry = 0; - else - exit_code = 0; - } - if (!exit_code) - ForceCloseHandle1 (h, childhProc); - return exit_code; -} - -bool -child_info_fork::handle_failure (DWORD err) -{ - if (retry > 0) - ExitProcess (EXITCODE_RETRY); - return 0; -} - -/* Check the state of all of our children to see if any are stopped or - * terminated. - */ -static int __stdcall -checkstate (waitq *parent_w) -{ - int potential_match = 0; - - sigproc_printf ("nprocs %d", nprocs); - - /* Check already dead processes first to see if they match the criteria - * given in w->next. */ - int res; - for (int i = 0; i < nprocs; i++) - if ((res = stopped_or_terminated (parent_w, procs[i]))) - { - remove_proc (i); - potential_match = 1; - goto out; - } - - sigproc_printf ("no matching terminated children found"); - potential_match = -!!nprocs; - -out: - sigproc_printf ("returning %d", potential_match); - return potential_match; -} - -/* Remove a proc from procs by swapping it with the last child in the list. - Also releases shared memory of exited processes. */ -static bool __stdcall -remove_proc (int ci) -{ - if (procs[ci]->exists ()) - return true; - - sigproc_printf ("removing procs[%d], pid %d, nprocs %d", ci, procs[ci]->pid, - nprocs); - if (procs[ci] != myself) - { - procs[ci].release (); - if (procs[ci].hProcess) - ForceCloseHandle1 (procs[ci].hProcess, childhProc); - } - if (ci < --nprocs) - { - /* Wait for proc_waiter thread to make a copy of this element before - moving it or it may become confused. The chances are very high that - the proc_waiter thread has already done this by the time we - get here. */ - while (!procs[nprocs].waiter_ready) - low_priority_sleep (0); - procs[ci] = procs[nprocs]; - } - return 0; -} - -/* Check status of child process vs. waitq member. - - parent_w is the pointer to the parent of the waitq member in question. - child is the subprocess being considered. - - Returns non-zero if waiting thread released. */ -static bool __stdcall -stopped_or_terminated (waitq *parent_w, _pinfo *child) -{ - int might_match; - waitq *w = parent_w->next; - - sigproc_printf ("considering pid %d", child->pid); - if (w->pid == -1) - might_match = 1; - else if (w->pid == 0) - might_match = child->pgid == myself->pgid; - else if (w->pid < 0) - might_match = child->pgid == -w->pid; - else - might_match = (w->pid == child->pid); - - if (!might_match) - return 0; - - int terminated; - - if (!((terminated = (child->process_state == PID_EXITED)) || - ((w->options & WUNTRACED) && child->stopsig))) - return 0; - - parent_w->next = w->next; /* successful wait. remove from wait queue */ - w->pid = child->pid; - - if (!terminated) - { - sigproc_printf ("stopped child"); - w->status = (child->stopsig << 8) | 0x7f; - child->stopsig = 0; - } - else - { - w->status = (__uint16_t) child->exitcode; - - add_rusage (&myself->rusage_children, &child->rusage_children); - add_rusage (&myself->rusage_children, &child->rusage_self); - - if (w->rusage) - { - add_rusage ((struct rusage *) w->rusage, &child->rusage_children); - add_rusage ((struct rusage *) w->rusage, &child->rusage_self); - } - } - - if (!SetEvent (w->ev)) /* wake up wait4 () immediately */ - system_printf ("couldn't wake up wait event %p, %E", w->ev); - return true; -} - -static void -talktome (siginfo_t *si, HANDLE readsig) -{ - unsigned size = sizeof (*si); - sigproc_printf ("pid %d wants some information", si->si_pid); - if (si->_si_commune._si_code & PICOM_EXTRASTR) - { - size_t n; - DWORD nb; - if (!ReadFile (readsig, &n, sizeof (n), &nb, NULL) || nb != sizeof (n)) - return; - siginfo_t *newsi = (siginfo_t *) alloca (size += n + 1); - *newsi = *si; - newsi->_si_commune._si_str = (char *) (newsi + 1); - if (!ReadFile (readsig, newsi->_si_commune._si_str, n, &nb, NULL) || nb != n) - return; - newsi->_si_commune._si_str[n] = '\0'; - si = newsi; - } - - pinfo pi (si->si_pid); - if (pi) - new cygthread (commune_process, size, si, "commune_process"); -} - -void -pending_signals::add (sigpacket& pack) -{ - sigpacket *se; - if (sigs[pack.si.si_signo].si.si_signo) - return; - se = sigs + pack.si.si_signo; - *se = pack; - se->mask = &myself->getsigmask (); - se->next = NULL; - if (end) - end->next = se; - end = se; - if (!start.next) - start.next = se; -} - -void -pending_signals::del () -{ - sigpacket *next = curr->next; - prev->next = next; - curr->si.si_signo = 0; -#ifdef DEBUGGING - curr->next = NULL; -#endif - if (end == curr) - end = prev; - curr = next; -} - -sigpacket * -pending_signals::next () -{ - sigpacket *res; - prev = curr; - if (!curr || !(curr = curr->next)) - res = NULL; - else - res = curr; - return res; -} - -/* Process signals by waiting for signal data to arrive in a pipe. - Set a completion event if one was specified. */ -static DWORD WINAPI -wait_sig (VOID *) -{ - HANDLE readsig; - PSECURITY_ATTRIBUTES sa_buf = (PSECURITY_ATTRIBUTES) alloca (1024); - - /* Initialization */ - SetThreadPriority (GetCurrentThread (), WAIT_SIG_PRIORITY); - - sigCONT = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); - if (!CreatePipe (&readsig, &my_sendsig, sec_user_nih (sa_buf), 0)) - api_fatal ("couldn't create signal pipe, %E"); - ProtectHandle (readsig); - myself->sendsig = my_sendsig; - - /* Setting dwProcessId flags that this process is now capable of receiving - signals. Prior to this, dwProcessId was set to the windows pid of - of the original windows process which spawned us unless this was a - "toplevel" process. */ - myself->process_state |= PID_ACTIVE; - myself->process_state &= ~PID_INITIALIZING; - - _sig_tls = &_my_tls; - sigproc_printf ("myself->dwProcessId %u", myself->dwProcessId); - SetEvent (wait_sig_inited); - - _sig_tls->init_threadlist_exceptions (); - debug_printf ("entering ReadFile loop, readsig %p, myself->sendsig %p", - readsig, myself->sendsig); - - sigpacket pack; - if (in_forkee) - pack.si.si_signo = __SIGHOLD; - for (;;) - { - if (pack.si.si_signo == __SIGHOLD) - WaitForSingleObject (sigCONT, INFINITE); - DWORD nb; - pack.tls = NULL; - if (!ReadFile (readsig, &pack, sizeof (pack), &nb, NULL)) - break; - - if (nb != sizeof (pack)) - { - system_printf ("short read from signal pipe: %d != %d", nb, - sizeof (pack)); - continue; - } - - if (!pack.si.si_signo) - { -#ifdef DEBUGGING - system_printf ("zero signal?"); -#endif - continue; - } - - sigset_t dummy_mask; - if (!pack.mask) - { - dummy_mask = myself->getsigmask (); - pack.mask = &dummy_mask; - } - - sigpacket *q; - bool clearwait = false; - switch (pack.si.si_signo) - { - case __SIGCOMMUNE: - talktome (&pack.si, readsig); - break; - case __SIGSTRACE: - strace.hello (); - break; - case __SIGPENDING: - *pack.mask = 0; - unsigned bit; - sigq.reset (); - while ((q = sigq.next ())) - if (myself->getsigmask () & (bit = SIGTOMASK (q->si.si_signo))) - *pack.mask |= bit; - break; - case __SIGHOLD: - goto loop; - break; - case __SIGNOHOLD: - case __SIGFLUSH: - case __SIGFLUSHFAST: - sigq.reset (); - while ((q = sigq.next ())) - { - int sig = q->si.si_signo; - if (sig == __SIGDELETE || q->process () > 0) - sigq.del (); - if (sig == __SIGNOHOLD && q->si.si_signo == SIGCHLD) - clearwait = true; - } - break; - case __SIGEXIT: - hwait_sig = NULL; - sigproc_printf ("saw __SIGEXIT"); - break; /* handle below */ - default: - if (pack.si.si_signo < 0) - sig_clear (-pack.si.si_signo); - else - { - int sig = pack.si.si_signo; - // FIXME: REALLY not right when taking threads into consideration. - // We need a per-thread queue since each thread can have its own - // list of blocked signals. CGF 2005-08-24 - if (sigq.sigs[sig].si.si_signo && sigq.sigs[sig].tls == pack.tls) - sigproc_printf ("sig %d already queued", pack.si.si_signo); - else - { - int sigres = pack.process (); - if (sigres <= 0) - { -#ifdef DEBUGGING2 - if (!sigres) - system_printf ("Failed to arm signal %d from pid %d", pack.sig, pack.pid); -#endif - sigq.add (pack); // FIXME: Shouldn't add this in !sh condition - } - } - if (sig == SIGCHLD) - clearwait = true; - } - break; - } - if (clearwait) - proc_subproc (PROC_CLEARWAIT, 0); - loop: - if (pack.wakeup) - { - sigproc_printf ("signalling pack.wakeup %p", pack.wakeup); - SetEvent (pack.wakeup); - } - if (pack.si.si_signo == __SIGEXIT) - break; - } - - ForceCloseHandle (readsig); - sigproc_printf ("signal thread exiting"); - ExitThread (0); -} diff --git a/winsup/cygwin/sigproc.h b/winsup/cygwin/sigproc.h deleted file mode 100644 index e1230a1ea..000000000 --- a/winsup/cygwin/sigproc.h +++ /dev/null @@ -1,98 +0,0 @@ -/* sigproc.h - - Copyright 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SIGPROC_H -#define _SIGPROC_H -#include - -#ifdef NSIG -enum -{ - __SIGFLUSH = -(NSIG + 1), - __SIGSTRACE = -(NSIG + 2), - __SIGCOMMUNE = -(NSIG + 3), - __SIGPENDING = -(NSIG + 4), - __SIGDELETE = -(NSIG + 5), - __SIGFLUSHFAST = -(NSIG + 6), - __SIGHOLD = -(NSIG + 7), - __SIGNOHOLD = -(NSIG + 8), - __SIGEXIT = -(NSIG + 9) -}; -#endif - -#define SIG_BAD_MASK (1 << (SIGKILL - 1)) - -enum procstuff -{ - PROC_ADDCHILD = 1, // add a new subprocess to list - PROC_DETACHED_CHILD = 2, // set up a detached child - PROC_CLEARWAIT = 3, // clear all waits - signal arrived - PROC_WAIT = 4, // setup for wait() for subproc - PROC_NOTHING = 5 // nothing, really -}; - -struct sigpacket -{ - siginfo_t si; - pid_t pid; - class _cygtls *tls; - sigset_t *mask; - union - { - HANDLE wakeup; - HANDLE thread_handle; - struct sigpacket *next; - }; - int __stdcall process () __attribute__ ((regparm (1))); -}; - -extern HANDLE signal_arrived; -extern HANDLE sigCONT; - -void __stdcall sig_dispatch_pending (bool fast = false); -#ifdef _PINFO_H -extern "C" void __stdcall set_signal_mask (sigset_t newmask, sigset_t&); -#endif -int __stdcall handle_sigprocmask (int sig, const sigset_t *set, - sigset_t *oldset, sigset_t& opmask) - __attribute__ ((regparm (3))); - -extern "C" void __stdcall reset_signal_arrived (); -void __stdcall sig_clear (int) __attribute__ ((regparm (1))); -void __stdcall sig_set_pending (int) __attribute__ ((regparm (1))); -int __stdcall handle_sigsuspend (sigset_t); - -int __stdcall proc_subproc (DWORD, DWORD) __attribute__ ((regparm (2))); - -class _pinfo; -void __stdcall proc_terminate (); -void __stdcall sigproc_init (); -#ifdef __INSIDE_CYGWIN__ -void __stdcall sigproc_terminate (enum exit_states); -#endif -bool __stdcall pid_exists (pid_t) __attribute__ ((regparm(1))); -int __stdcall sig_send (_pinfo *, siginfo_t&, class _cygtls *tls = NULL) __attribute__ ((regparm (3))); -int __stdcall sig_send (_pinfo *, int) __attribute__ ((regparm (2))); -void __stdcall signal_fixup_after_exec (); -void __stdcall wait_for_sigthread (); -void __stdcall sigalloc (); -void __stdcall create_signal_arrived (); - -int kill_pgrp (pid_t, siginfo_t&); -int killsys (pid_t, int); - -extern char myself_nowait_dummy[]; - -extern struct sigaction *global_sigs; - -#define WAIT_SIG_PRIORITY THREAD_PRIORITY_NORMAL - -#define myself_nowait ((_pinfo *)myself_nowait_dummy) -#endif /*_SIGPROC_H*/ diff --git a/winsup/cygwin/smallprint.c b/winsup/cygwin/smallprint.c deleted file mode 100644 index 851e1414c..000000000 --- a/winsup/cygwin/smallprint.c +++ /dev/null @@ -1,247 +0,0 @@ -/* smallprint.c: small print routines for WIN32 - - Copyright 1996, 1998, 2000, 2001, 2002 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#define WIN32_LEAN_AND_MEAN -#include - -int __small_sprintf (char *dst, const char *fmt, ...); -int __small_vsprintf (char *dst, const char *fmt, va_list ap); - -#define LLMASK (0xffffffffffffffffULL) -#define LMASK (0xffffffff) - -#define rnarg(dst, base, dosign, len, pad) __rn ((dst), (base), (dosign), va_arg (ap, long), len, pad, LMASK) -#define rnargLL(dst, base, dosign, len, pad) __rn ((dst), (base), (dosign), va_arg (ap, unsigned long long), len, pad, LLMASK) - -static char __fastcall * -__rn (char *dst, int base, int dosign, long long val, int len, int pad, unsigned long long mask) -{ - /* longest number is ULLONG_MAX, 18446744073709551615, 20 digits */ - unsigned long long uval = 0; - char res[20]; - static const char str[16] = "0123456789ABCDEF"; - int l = 0; - - if (dosign && val < 0) - { - *dst++ = '-'; - uval = -val; - } - else if (dosign > 0 && val > 0) - { - *dst++ = '+'; - uval = val; - } - else - uval = val; - - uval &= mask; - - do - { - res[l++] = str[uval % base]; - uval /= base; - } - while (uval); - - while (len-- > l) - *dst++ = pad; - - while (l > 0) - *dst++ = res[--l]; - - return dst; -} - -int -__small_vsprintf (char *dst, const char *fmt, va_list ap) -{ - char tmp[CYG_MAX_PATH + 1]; - char *orig = dst; - const char *s; - - while (*fmt) - { - int i, n = 0x7fff; - if (*fmt != '%') - *dst++ = *fmt++; - else - { - int len = 0; - char pad = ' '; - int addsign = -1; - - switch (*++fmt) - { - case '+': - addsign = 1; - fmt++; - break; - case '%': - *dst++ = *fmt++; - continue; - } - - for (;;) - { - char c = *fmt++; - switch (c) - { - case '0': - if (len == 0) - { - pad = '0'; - continue; - } - case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - len = len * 10 + (c - '0'); - continue; - case 'l': - continue; - case 'c': - { - int c = va_arg (ap, int); - if (c > ' ' && c <= 127) - *dst++ = c; - else - { - *dst++ = '0'; - *dst++ = 'x'; - dst = __rn (dst, 16, 0, c, len, pad, LMASK); - } - } - break; - case 'E': - strcpy (dst, "Win32 error "); - dst = __rn (dst + sizeof ("Win32 error"), 10, 0, GetLastError (), len, pad, LMASK); - break; - case 'd': - dst = rnarg (dst, 10, addsign, len, pad); - break; - case 'D': - dst = rnargLL (dst, 10, addsign, len, pad); - break; - case 'u': - dst = rnarg (dst, 10, 0, len, pad); - break; - case 'U': - dst = rnargLL (dst, 10, 0, len, pad); - break; - case 'o': - dst = rnarg (dst, 8, 0, len, pad); - break; - case 'p': - *dst++ = '0'; - *dst++ = 'x'; - /* fall through */ - case 'x': - dst = rnarg (dst, 16, 0, len, pad); - break; - case 'X': - dst = rnargLL (dst, 16, 0, len, pad); - break; - case 'P': - if (!GetModuleFileName (NULL, tmp, CYG_MAX_PATH)) - s = "cygwin program"; - else - s = tmp; - goto fillin; - case '.': - n = strtol (fmt, (char **)&fmt, 10); - if (*fmt++ != 's') - goto endfor; - case 's': - s = va_arg (ap, char *); - if (s == NULL) - s = "(null)"; - fillin: - for (i = 0; *s && i < n; i++) - *dst++ = *s++; - break; - default: - *dst++ = '?'; - *dst++ = fmt[-1]; - } - endfor: - break; - } - } - } - *dst = 0; - return dst - orig; -} - -int -__small_sprintf (char *dst, const char *fmt, ...) -{ - int r; - va_list ap; - va_start (ap, fmt); - r = __small_vsprintf (dst, fmt, ap); - va_end (ap); - return r; -} - -void -small_printf (const char *fmt, ...) -{ - char buf[16384]; - va_list ap; - DWORD done; - int count; - -#if 0 /* Turn on to force console errors */ - extern SECURITY_ATTRIBUTES sec_none; - HANDLE h = CreateFileA ("CONOUT$", GENERIC_READ|GENERIC_WRITE, - FILE_SHARE_WRITE | FILE_SHARE_WRITE, &sec_none, - OPEN_EXISTING, 0, 0); - if (h) - SetStdHandle (STD_ERROR_HANDLE, h); -#endif - - va_start (ap, fmt); - count = __small_vsprintf (buf, fmt, ap); - va_end (ap); - - WriteFile (GetStdHandle (STD_ERROR_HANDLE), buf, count, &done, NULL); - FlushFileBuffers (GetStdHandle (STD_ERROR_HANDLE)); -} - -#ifdef DEBUGGING -static HANDLE NO_COPY console_handle = NULL; -void -console_printf (const char *fmt, ...) -{ - char buf[16384]; - va_list ap; - DWORD done; - int count; - - if (!console_handle) - console_handle = CreateFileA ("CON", GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, 0, 0); - - if (console_handle == INVALID_HANDLE_VALUE) - console_handle = GetStdHandle (STD_ERROR_HANDLE); - - va_start (ap, fmt); - count = __small_vsprintf (buf, fmt, ap); - va_end (ap); - - WriteFile (console_handle, buf, count, &done, NULL); - FlushFileBuffers (console_handle); -} -#endif diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc deleted file mode 100644 index 4b48de59e..000000000 --- a/winsup/cygwin/spawn.cc +++ /dev/null @@ -1,1195 +0,0 @@ -/* spawn.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "sigproc.h" -#include "cygheap.h" -#include "child_info.h" -#include "shared_info.h" -#include "pinfo.h" -#include "registry.h" -#include "environ.h" -#include "cygtls.h" - -#define LINE_BUF_CHUNK (CYG_MAX_PATH * 2) -#define MAXWINCMDLEN 32767 - -static suffix_info exe_suffixes[] = -{ - suffix_info ("", 1), - suffix_info (".exe", 1), - suffix_info (".com"), - suffix_info (NULL) -}; - -static suffix_info dll_suffixes[] = -{ - suffix_info (".dll"), - suffix_info ("", 1), - suffix_info (".exe", 1), - suffix_info (NULL) -}; - -HANDLE hExeced; -DWORD dwExeced; - -/* Add .exe to PROG if not already present and see if that exists. - If not, return PROG (converted from posix to win32 rules if necessary). - The result is always BUF. - - Returns (possibly NULL) suffix */ - -static const char * -perhaps_suffix (const char *prog, path_conv& buf, int& err, unsigned opt) -{ - char *ext; - - err = 0; - debug_printf ("prog '%s'", prog); - buf.check (prog, PC_SYM_FOLLOW | PC_NULLEMPTY, - (opt & FE_DLL) ? dll_suffixes : exe_suffixes); - - if (buf.isdir ()) - { - err = EACCES; - ext = NULL; - } - else if (!buf.exists ()) - { - err = ENOENT; - ext = NULL; - } - else if (buf.known_suffix) - ext = (char *) buf + (buf.known_suffix - buf.get_win32 ()); - else - ext = strchr (buf, '\0'); - - debug_printf ("buf %s, suffix found '%s'", (char *) buf, ext); - return ext; -} - -/* Find an executable name, possibly by appending known executable - suffixes to it. The win32-translated name is placed in 'buf'. - Any found suffix is returned in known_suffix. - - If the file is not found and !null_if_not_found then the win32 version - of name is placed in buf and returned. Otherwise the contents of buf - is undefined and NULL is returned. */ - -const char * __stdcall -find_exec (const char *name, path_conv& buf, const char *mywinenv, - unsigned opt, const char **known_suffix) -{ - const char *suffix = ""; - debug_printf ("find_exec (%s)", name); - const char *retval = buf; - char tmp[CYG_MAX_PATH]; - const char *posix = (opt & FE_NATIVE) ? NULL : name; - bool has_slash = strchr (name, '/'); - int err; - - /* Check to see if file can be opened as is first. - Win32 systems always check . first, but PATH may not be set up to - do this. */ - if ((has_slash || opt & FE_CWD) - && (suffix = perhaps_suffix (name, buf, err, opt)) != NULL) - { - if (posix && !has_slash) - { - tmp[0] = '.'; - tmp[1] = '/'; - strcpy (tmp + 2, name); - posix = tmp; - } - goto out; - } - - win_env *winpath; - const char *path; - const char *posix_path; - - posix = (opt & FE_NATIVE) ? NULL : tmp; - - if (strchr (mywinenv, '/')) - { - /* it's not really an environment variable at all */ - int n = cygwin_posix_to_win32_path_list_buf_size (mywinenv); - char *s = (char *) alloca (n + 1); - if (cygwin_posix_to_win32_path_list (mywinenv, s)) - goto errout; - path = s; - posix_path = mywinenv - 1; - } - else if (has_slash || strchr (name, '\\') || isdrive (name) - || !(winpath = getwinenv (mywinenv)) - || !(path = winpath->get_native ()) || *path == '\0') - /* Return the error condition if this is an absolute path or if there - is no PATH to search. */ - goto errout; - else - posix_path = winpath->get_posix () - 1; - - debug_printf ("%s%s", mywinenv, path); - /* Iterate over the specified path, looking for the file with and without - executable extensions. */ - do - { - posix_path++; - char *eotmp = strccpy (tmp, &path, ';'); - /* An empty path or '.' means the current directory, but we've - already tried that. */ - if (opt & FE_CWD && (tmp[0] == '\0' || (tmp[0] == '.' && tmp[1] == '\0'))) - continue; - - *eotmp++ = '\\'; - strcpy (eotmp, name); - - debug_printf ("trying %s", tmp); - - if ((suffix = perhaps_suffix (tmp, buf, err, opt)) != NULL) - { - if (buf.has_acls () && allow_ntsec && check_file_access (buf, X_OK)) - continue; - - if (posix == tmp) - { - eotmp = strccpy (tmp, &posix_path, ':'); - if (eotmp == tmp) - *eotmp++ = '.'; - *eotmp++ = '/'; - strcpy (eotmp, name); - } - goto out; - } - } - while (*path && *++path && (posix_path = strchr (posix_path, ':'))); - - errout: - posix = NULL; - /* Couldn't find anything in the given path. - Take the appropriate action based on null_if_not_found. */ - if (opt & FE_NNF) - retval = NULL; - else if (opt & FE_NATIVE) - buf.check (name); - else - retval = name; - - out: - if (posix) - buf.set_path (posix); - debug_printf ("%s = find_exec (%s)", (char *) buf, name); - if (known_suffix) - *known_suffix = suffix ?: strchr (buf, '\0'); - if (!retval && err) - set_errno (err); - return retval; -} - -/* Utility for spawn_guts. */ - -static HANDLE -handle (int fd, int direction) -{ - HANDLE h; - cygheap_fdget cfd (fd); - - if (cfd < 0) - h = INVALID_HANDLE_VALUE; - else if (cfd->close_on_exec ()) - h = INVALID_HANDLE_VALUE; - else if (direction == 0) - h = cfd->get_handle (); - else - h = cfd->get_output_handle (); - return h; -} - -int -iscmd (const char *argv0, const char *what) -{ - int n; - n = strlen (argv0) - strlen (what); - if (n >= 2 && argv0[1] != ':') - return 0; - return n >= 0 && strcasematch (argv0 + n, what) && - (n == 0 || isdirsep (argv0[n - 1])); -} - -class linebuf -{ - public: - size_t ix; - char *buf; - size_t alloced; - linebuf () : ix (0), buf (NULL), alloced (0) {} - ~linebuf () {if (buf) free (buf);} - void add (const char *what, int len) __attribute__ ((regparm (3))); - void add (const char *what) {add (what, strlen (what));} - void prepend (const char *what, int len); - void finish (bool) __attribute__ ((regparm (2))); -}; - -void -linebuf::finish (bool cmdlenoverflow_ok) -{ - if (!ix) - add ("", 1); - else - { - if (ix-- > MAXWINCMDLEN && cmdlenoverflow_ok) - ix = MAXWINCMDLEN - 1; - buf[ix] = '\0'; - } -} - -void -linebuf::add (const char *what, int len) -{ - size_t newix = ix + len; - if (newix >= alloced || !buf) - { - alloced += LINE_BUF_CHUNK + newix; - buf = (char *) realloc (buf, alloced + 1); - } - memcpy (buf + ix, what, len); - ix = newix; - buf[ix] = '\0'; -} - -void -linebuf::prepend (const char *what, int len) -{ - int buflen; - size_t newix; - if ((newix = ix + len) >= alloced) - { - alloced += LINE_BUF_CHUNK + newix; - buf = (char *) realloc (buf, alloced + 1); - buf[ix] = '\0'; - } - if ((buflen = strlen (buf))) - memmove (buf + len, buf, buflen + 1); - else - buf[newix] = '\0'; - memcpy (buf, what, len); - ix = newix; -} - -class av -{ - char **argv; - int calloced; - public: - int argc; - bool win16_exe; - bool iscui; - av (): argv (NULL), iscui (false) {} - av (int ac_in, const char * const *av_in) : calloced (0), argc (ac_in), win16_exe (false), iscui (false) - { - argv = (char **) cmalloc (HEAP_1_ARGV, (argc + 5) * sizeof (char *)); - memcpy (argv, av_in, (argc + 1) * sizeof (char *)); - } - void *operator new (size_t, void *p) __attribute__ ((nothrow)) {return p;} - void set (int ac_in, const char * const *av_in) {new (this) av (ac_in, av_in);} - ~av () - { - if (argv) - { - for (int i = 0; i < calloced; i++) - if (argv[i]) - cfree (argv[i]); - cfree (argv); - } - } - int unshift (const char *what, int conv = 0); - operator char **() {return argv;} - void all_calloced () {calloced = argc;} - void replace0_maybe (const char *arg0) - { - /* Note: Assumes that argv array has not yet been "unshifted" */ - if (!calloced) - { - argv[0] = cstrdup1 (arg0); - calloced = true; - } - } - void dup_maybe (int i) - { - if (i >= calloced) - argv[i] = cstrdup1 (argv[i]); - } - void dup_all () - { - for (int i = calloced; i < argc; i++) - argv[i] = cstrdup1 (argv[i]); - } - int fixup (const char *, path_conv&, const char *); -}; - -int -av::unshift (const char *what, int conv) -{ - char **av; - av = (char **) crealloc (argv, (argc + 2) * sizeof (char *)); - if (!av) - return 0; - - argv = av; - memmove (argv + 1, argv, (argc + 1) * sizeof (char *)); - char buf[CYG_MAX_PATH]; - if (conv) - { - cygwin_conv_to_posix_path (what, buf); - char *p = strchr (buf, '\0') - 4; - if (p > buf && strcasematch (p, ".exe")) - *p = '\0'; - what = buf; - } - *argv = cstrdup1 (what); - calloced++; - argc++; - return 1; -} - -struct pthread_cleanup -{ - _sig_func_ptr oldint; - _sig_func_ptr oldquit; - sigset_t oldmask; - pthread_cleanup (): oldint (NULL), oldquit (NULL), oldmask ((sigset_t) -1) {} -}; - -static void -do_cleanup (void *args) -{ -# define cleanup ((pthread_cleanup *) args) - if (cleanup->oldmask != (sigset_t) -1) - { - signal (SIGINT, cleanup->oldint); - signal (SIGQUIT, cleanup->oldquit); - sigprocmask (SIG_SETMASK, &(cleanup->oldmask), NULL); - } -# undef cleanup -} - - -static int __stdcall -spawn_guts (const char * prog_arg, const char *const *argv, - const char *const envp[], int mode) -{ - bool rc; - pid_t cygpid; - int res = -1; - - if (prog_arg == NULL) - { - syscall_printf ("prog_arg is NULL"); - set_errno (EINVAL); - return -1; - } - - syscall_printf ("spawn_guts (%d, %.9500s)", mode, prog_arg); - - if (argv == NULL) - { - syscall_printf ("argv is NULL"); - set_errno (EINVAL); - return -1; - } - - /* FIXME: There is a small race here and FIXME: not thread safe! */ - - pthread_cleanup cleanup; - if (mode == _P_SYSTEM) - { - sigset_t child_block; - cleanup.oldint = signal (SIGINT, SIG_IGN); - cleanup.oldquit = signal (SIGQUIT, SIG_IGN); - sigemptyset (&child_block); - sigaddset (&child_block, SIGCHLD); - sigprocmask (SIG_BLOCK, &child_block, &cleanup.oldmask); - } - pthread_cleanup_push (do_cleanup, (void *) &cleanup); - av newargv; - linebuf one_line; - child_info_spawn ch; - - char *envblock = NULL; - path_conv real_path; - bool reset_sendsig = false; - - bool null_app_name = false; - STARTUPINFO si = {0, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL}; - int looped = 0; - - myfault efault; - if (efault.faulted ()) - { - if (get_errno () == ENOMEM) - set_errno (E2BIG); - else - set_errno (EFAULT); - res = -1; - goto out; - } - - child_info_types chtype; - if (mode != _P_OVERLAY) - chtype = PROC_SPAWN; - else - chtype = PROC_EXEC; - - cygheap_exec_info *moreinfo = (cygheap_exec_info *) ccalloc (HEAP_1_EXEC, 1, sizeof (cygheap_exec_info)); - moreinfo->old_title = NULL; - - /* CreateProcess takes one long string that is the command line (sigh). - We need to quote any argument that has whitespace or embedded "'s. */ - - int ac; - for (ac = 0; argv[ac]; ac++) - /* nothing */; - - newargv.set (ac, argv); - - int err; - const char *ext; - if ((ext = perhaps_suffix (prog_arg, real_path, err, FE_NADA)) == NULL) - { - set_errno (err); - res = -1; - goto out; - } - - bool wascygexec = real_path.iscygexec (); - res = newargv.fixup (prog_arg, real_path, ext); - - if (res) - goto out; - - if (ac == 3 && argv[1][0] == '/' && argv[1][1] == 'c' && - (iscmd (argv[0], "command.com") || iscmd (argv[0], "cmd.exe"))) - { - real_path.check (prog_arg); - one_line.add ("\""); - if (!real_path.error) - one_line.add (real_path); - else - one_line.add (argv[0]); - one_line.add ("\""); - one_line.add (" "); - one_line.add (argv[1]); - one_line.add (" "); - one_line.add (argv[2]); - strcpy (real_path, argv[0]); - null_app_name = true; - } - else - { - if (wascygexec) - newargv.dup_all (); - else - { - for (int i = 0; i < newargv.argc; i++) - { - char *p = NULL; - const char *a; - - newargv.dup_maybe (i); - a = i ? newargv[i] : (char *) real_path; - int len = strlen (a); - if (len != 0 && !strpbrk (a, " \t\n\r\"")) - one_line.add (a, len); - else - { - one_line.add ("\"", 1); - /* Handle embedded special characters " and \. - A " is always preceded by a \. - A \ is not special unless it precedes a ". If it does, - then all preceding \'s must be doubled to avoid having - the Windows command line parser interpret the \ as quoting - the ". This rule applies to a string of \'s before the end - of the string, since cygwin/windows uses a " to delimit the - argument. */ - for (; (p = strpbrk (a, "\"\\")); a = ++p) - { - one_line.add (a, p - a); - /* Find length of string of backslashes */ - int n = strspn (p, "\\"); - if (!n) - one_line.add ("\\\"", 2); /* No backslashes, so it must be a ". - The " has to be protected with a backslash. */ - else - { - one_line.add (p, n); /* Add the run of backslashes */ - /* Need to double up all of the preceding - backslashes if they precede a quote or EOS. */ - if (!p[n] || p[n] == '"') - one_line.add (p, n); - p += n - 1; /* Point to last backslash */ - } - } - if (*a) - one_line.add (a); - one_line.add ("\"", 1); - } - one_line.add (" ", 1); - } - - one_line.finish (real_path.iscygexec ()); - - if (one_line.ix >= MAXWINCMDLEN) - { - debug_printf ("command line too long (>32K), return E2BIG"); - set_errno (E2BIG); - res = -1; - goto out; - } - } - - newargv.all_calloced (); - moreinfo->argc = newargv.argc; - moreinfo->argv = newargv; - - if (mode != _P_OVERLAY || - !DuplicateHandle (hMainProc, myself.shared_handle (), hMainProc, - &moreinfo->myself_pinfo, 0, - TRUE, DUPLICATE_SAME_ACCESS)) - moreinfo->myself_pinfo = NULL; - else - VerifyHandle (moreinfo->myself_pinfo); - } - - PROCESS_INFORMATION pi; - pi.hProcess = pi.hThread = NULL; - pi.dwProcessId = pi.dwThreadId = 0; - si.lpReserved = NULL; - si.lpDesktop = NULL; - si.dwFlags = STARTF_USESTDHANDLES; - si.hStdInput = handle (0, 0); /* Get input handle */ - si.hStdOutput = handle (1, 1); /* Get output handle */ - si.hStdError = handle (2, 1); /* Get output handle */ - si.cb = sizeof (si); - if (!wincap.pty_needs_alloc_console () && newargv.iscui && myself->ctty == -1) - { - si.dwFlags |= STARTF_USESHOWWINDOW; - si.wShowWindow = SW_HIDE; - } - - int flags = GetPriorityClass (hMainProc); - sigproc_printf ("priority class %d", flags); - flags |= CREATE_SEPARATE_WOW_VDM; - - if (mode == _P_DETACH) - flags |= DETACHED_PROCESS; - - if (mode != _P_OVERLAY) - myself->exec_sendsig = NULL; - else - { - /* Reset sendsig so that any process which wants to send a signal - to this pid will wait for the new process to become active. - Save the old value in case the exec fails. */ - if (!myself->exec_sendsig) - { - myself->exec_sendsig = myself->sendsig; - myself->exec_dwProcessId = myself->dwProcessId; - myself->sendsig = NULL; - reset_sendsig = true; - } - /* Save a copy of a handle to the current process around the first time we - exec so that the pid will not be reused. Why did I stop cygwin from - generating its own pids again? */ - if (cygheap->pid_handle) - /* already done previously */; - else if (DuplicateHandle (hMainProc, hMainProc, hMainProc, &cygheap->pid_handle, - PROCESS_QUERY_INFORMATION, TRUE, 0)) - ProtectHandle (cygheap->pid_handle); - else - system_printf ("duplicate to pid_handle failed, %E"); - if (mode != _P_DETACH) - set_console_state_for_spawn (real_path.iscygexec ()); - } - - /* Some file types (currently only sockets) need extra effort in the parent - after CreateProcess and before copying the datastructures to the child. - So we have to start the child in suspend state, unfortunately, to avoid - a race condition. */ - if (!newargv.win16_exe - && (wincap.start_proc_suspended () || mode != _P_OVERLAY - || cygheap->fdtab.need_fixup_before ())) - flags |= CREATE_SUSPENDED; - - const char *runpath = null_app_name ? NULL : (const char *) real_path; - - syscall_printf ("null_app_name %d (%s, %.9500s)", null_app_name, runpath, one_line.buf); - - cygbench ("spawn-guts"); - - cygheap->fdtab.set_file_pointers_for_exec (); - - moreinfo->envp = build_env (envp, envblock, moreinfo->envc, real_path.iscygexec ()); - if (!moreinfo->envp || !envblock) - { - set_errno (E2BIG); - res = -1; - goto out; - } - ch.set (chtype, real_path.iscygexec ()); - ch.moreinfo = moreinfo; - - si.lpReserved2 = (LPBYTE) &ch; - si.cbReserved2 = sizeof (ch); - - /* When ruid != euid we create the new process under the current original - account and impersonate in child, this way maintaining the different - effective vs. real ids. - FIXME: If ruid != euid and ruid != saved_uid we currently give - up on ruid. The new process will have ruid == euid. */ -loop: - cygheap->user.deimpersonate (); - - if (!cygheap->user.issetuid () - || (cygheap->user.saved_uid == cygheap->user.real_uid - && cygheap->user.saved_gid == cygheap->user.real_gid - && !cygheap->user.groups.issetgroups ())) - { - rc = CreateProcess (runpath, /* image name - with full path */ - one_line.buf, /* what was passed to exec */ - &sec_none_nih,/* process security attrs */ - &sec_none_nih,/* thread security attrs */ - TRUE, /* inherit handles from parent */ - flags, - envblock, /* environment */ - 0, /* use current drive/directory */ - &si, - &pi); - } - else - { - /* Give access to myself */ - if (mode == _P_OVERLAY) - myself.set_acl(); - - /* allow the child to interact with our window station/desktop */ - HANDLE hwst, hdsk; - SECURITY_INFORMATION dsi = DACL_SECURITY_INFORMATION; - DWORD n; - char wstname[1024]; - char dskname[1024]; - - hwst = GetProcessWindowStation (); - SetUserObjectSecurity (hwst, &dsi, get_null_sd ()); - GetUserObjectInformation (hwst, UOI_NAME, wstname, 1024, &n); - hdsk = GetThreadDesktop (GetCurrentThreadId ()); - SetUserObjectSecurity (hdsk, &dsi, get_null_sd ()); - GetUserObjectInformation (hdsk, UOI_NAME, dskname, 1024, &n); - strcat (wstname, "\\"); - strcat (wstname, dskname); - si.lpDesktop = wstname; - - rc = CreateProcessAsUser (cygheap->user.primary_token (), - runpath, /* image name - with full path */ - one_line.buf, /* what was passed to exec */ - &sec_none_nih, /* process security attrs */ - &sec_none_nih, /* thread security attrs */ - TRUE, /* inherit handles from parent */ - flags, - envblock, /* environment */ - 0, /* use current drive/directory */ - &si, - &pi); - } - - /* Restore impersonation. In case of _P_OVERLAY this isn't - allowed since it would overwrite child data. */ - if (mode != _P_OVERLAY || !rc) - cygheap->user.reimpersonate (); - - /* Set errno now so that debugging messages from it appear before our - final debugging message [this is a general rule for debugging - messages]. */ - if (!rc) - { - __seterrno (); - syscall_printf ("CreateProcess failed, %E"); - /* If this was a failed exec, restore the saved sendsig. */ - if (reset_sendsig) - { - myself->sendsig = myself->exec_sendsig; - myself->exec_sendsig = NULL; - } - res = -1; - if (moreinfo->myself_pinfo) - CloseHandle (moreinfo->myself_pinfo); - goto out; - } - - if (!(flags & CREATE_SUSPENDED)) - strace.write_childpid (ch, pi.dwProcessId); - - /* Fixup the parent data structures if needed and resume the child's - main thread. */ - if (cygheap->fdtab.need_fixup_before ()) - cygheap->fdtab.fixup_before_exec (pi.dwProcessId); - - if (mode != _P_OVERLAY) - cygpid = cygwin_pid (pi.dwProcessId); - else - cygpid = myself->pid; - - /* We print the original program name here so the user can see that too. */ - syscall_printf ("%d = spawn_guts (%s, %.9500s)", - rc ? cygpid : (unsigned int) -1, prog_arg, one_line.buf); - - /* Name the handle similarly to proc_subproc. */ - ProtectHandle1 (pi.hProcess, childhProc); - - bool synced; - pid_t pid; - if (mode == _P_OVERLAY) - { - myself->dwProcessId = dwExeced = pi.dwProcessId; - strace.execing = 1; - myself.hProcess = hExeced = pi.hProcess; - strcpy (myself->progname, real_path); // FIXME: race? - if (!looped) - close_all_files (true); - sigproc_printf ("new process name %s", myself->progname); - /* If wr_proc_pipe doesn't exist then this process was not started by a cygwin - process. So, we need to wait around until the process we've just "execed" - dies. Use our own wait facility to wait for our own pid to exit (there - is some minor special case code in proc_waiter and friends to accommodate - this). - - If wr_proc_pipe exists, then it should be duplicated to the child. - If the child has exited already, that's ok. The parent will pick up - on this fact when we exit. dup_proc_pipe will close our end of the pipe. - Note that wr_proc_pipe may also be == INVALID_HANDLE_VALUE. That will make - dup_proc_pipe essentially a no-op. */ - if (!newargv.win16_exe && myself->wr_proc_pipe) - { - if (!looped) - { - myself->sync_proc_pipe (); /* Make sure that we own wr_proc_pipe - just in case we've been previously - execed. */ - myself.zap_cwd (); - } - myself->dup_proc_pipe (pi.hProcess); - } - pid = myself->pid; - } - else - { - myself->set_has_pgid_children (); - ProtectHandle (pi.hThread); - pinfo child (cygpid, PID_IN_USE); - if (!child) - { - syscall_printf ("pinfo failed"); - if (get_errno () != ENOMEM) - set_errno (EAGAIN); - res = -1; - goto out; - } - child->dwProcessId = pi.dwProcessId; - child.hProcess = pi.hProcess; - - strcpy (child->progname, real_path); - /* FIXME: This introduces an unreferenced, open handle into the child. - The purpose is to keep the pid shared memory open so that all of - the fields filled out by child.remember do not disappear and so there - is not a brief period during which the pid is not available. - However, we should try to find another way to do this eventually. */ - DuplicateHandle (hMainProc, child.shared_handle (), pi.hProcess, - NULL, 0, 0, DUPLICATE_SAME_ACCESS); - child->start_time = time (NULL); /* Register child's starting time. */ - child->nice = myself->nice; - if (!child.remember (mode == _P_DETACH)) - { - /* FIXME: Child in strange state now */ - CloseHandle (pi.hProcess); - ForceCloseHandle (pi.hThread); - res = -1; - goto out; - } - pid = child->pid; - } - - /* Start the child running */ - if (flags & CREATE_SUSPENDED) - { - ResumeThread (pi.hThread); - strace.write_childpid (ch, pi.dwProcessId); - } - ForceCloseHandle (pi.hThread); - - sigproc_printf ("spawned windows pid %d", pi.dwProcessId); - - synced = ch.sync (pi.dwProcessId, pi.hProcess, INFINITE); - - switch (mode) - { - case _P_OVERLAY: - myself.hProcess = pi.hProcess; - if (!synced) - { - if (ch.proc_retry (pi.hProcess) == 0) - { - looped++; - goto loop; - } - } - else if (!myself->wr_proc_pipe - && WaitForSingleObject (pi.hProcess, 0) == WAIT_TIMEOUT) - { - extern bool is_toplevel_proc; - is_toplevel_proc = true; - myself.remember (false); - waitpid (myself->pid, &res, 0); - } - myself.exit (EXITCODE_NOSET); - break; - case _P_WAIT: - case _P_SYSTEM: - if (waitpid (cygpid, &res, 0) != cygpid) - res = -1; - break; - case _P_DETACH: - res = 0; /* Lost all memory of this child. */ - break; - case _P_NOWAIT: - case _P_NOWAITO: - case _P_VFORK: - res = cygpid; - break; - default: - break; - } - -out: - if (envblock) - free (envblock); - pthread_cleanup_pop (1); - return (int) res; -} - -extern "C" int -cwait (int *result, int pid, int) -{ - return waitpid (pid, result, 0); -} - -/* -* Helper function for spawn runtime calls. -* Doesn't search the path. -*/ - -extern "C" int -spawnve (int mode, const char *path, const char *const *argv, - const char *const *envp) -{ - int ret; -#ifdef NEWVFORK - vfork_save *vf = vfork_storage.val (); - - if (vf != NULL && (vf->pid < 0) && mode == _P_OVERLAY) - mode = _P_NOWAIT; - else - vf = NULL; -#endif - - syscall_printf ("spawnve (%s, %s, %x)", path, argv[0], envp); - - switch (mode) - { - case _P_OVERLAY: - /* We do not pass _P_SEARCH_PATH here. execve doesn't search PATH.*/ - /* Just act as an exec if _P_OVERLAY set. */ - spawn_guts (path, argv, envp, mode); - /* Errno should be set by spawn_guts. */ - ret = -1; - break; - case _P_VFORK: - case _P_NOWAIT: - case _P_NOWAITO: - case _P_WAIT: - case _P_DETACH: - case _P_SYSTEM: - ret = spawn_guts (path, argv, envp, mode); -#ifdef NEWVFORK - if (vf) - { - if (ret > 0) - { - debug_printf ("longjmping due to vfork"); - vf->restore_pid (ret); - } - } -#endif - break; - default: - set_errno (EINVAL); - ret = -1; - break; - } - return ret; -} - -/* -* spawn functions as implemented in the MS runtime library. -* Most of these based on (and copied from) newlib/libc/posix/execXX.c -*/ - -extern "C" int -spawnl (int mode, const char *path, const char *arg0, ...) -{ - int i; - va_list args; - const char *argv[256]; - - va_start (args, arg0); - argv[0] = arg0; - i = 1; - - do - argv[i] = va_arg (args, const char *); - while (argv[i++] != NULL); - - va_end (args); - - return spawnve (mode, path, (char * const *) argv, cur_environ ()); -} - -extern "C" int -spawnle (int mode, const char *path, const char *arg0, ...) -{ - int i; - va_list args; - const char * const *envp; - const char *argv[256]; - - va_start (args, arg0); - argv[0] = arg0; - i = 1; - - do - argv[i] = va_arg (args, const char *); - while (argv[i++] != NULL); - - envp = va_arg (args, const char * const *); - va_end (args); - - return spawnve (mode, path, (char * const *) argv, (char * const *) envp); -} - -extern "C" int -spawnlp (int mode, const char *path, const char *arg0, ...) -{ - int i; - va_list args; - const char *argv[256]; - - va_start (args, arg0); - argv[0] = arg0; - i = 1; - - do - argv[i] = va_arg (args, const char *); - while (argv[i++] != NULL); - - va_end (args); - - return spawnvpe (mode, path, (char * const *) argv, cur_environ ()); -} - -extern "C" int -spawnlpe (int mode, const char *path, const char *arg0, ...) -{ - int i; - va_list args; - const char * const *envp; - const char *argv[256]; - - va_start (args, arg0); - argv[0] = arg0; - i = 1; - - do - argv[i] = va_arg (args, const char *); - while (argv[i++] != NULL); - - envp = va_arg (args, const char * const *); - va_end (args); - - return spawnvpe (mode, path, (char * const *) argv, envp); -} - -extern "C" int -spawnv (int mode, const char *path, const char * const *argv) -{ - return spawnve (mode, path, argv, cur_environ ()); -} - -extern "C" int -spawnvp (int mode, const char *path, const char * const *argv) -{ - return spawnvpe (mode, path, argv, cur_environ ()); -} - -extern "C" int -spawnvpe (int mode, const char *file, const char * const *argv, - const char * const *envp) -{ - path_conv buf; - return spawnve (mode, find_exec (file, buf), argv, envp); -} - -int -av::fixup (const char *prog_arg, path_conv& real_path, const char *ext) -{ - const char *p; - bool exeext = strcasematch (ext, ".exe"); - if (exeext && real_path.iscygexec () || strcasematch (ext, ".bat")) - return 0; - if (!*ext && ((p = ext - 4) > (char *) real_path) - && (strcasematch (p, ".bat") || strcasematch (p, ".cmd") - || strcasematch (p, ".btm"))) - return 0; - while (1) - { - char *pgm = NULL; - char *arg1 = NULL; - - HANDLE h = CreateFile (real_path, GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_WRITE, - &sec_none_nih, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, 0); - if (h == INVALID_HANDLE_VALUE) - goto err; - - HANDLE hm = CreateFileMapping (h, &sec_none_nih, PAGE_READONLY, 0, 0, NULL); - CloseHandle (h); - if (!hm) - { - /* ERROR_FILE_INVALID indicates very likely an empty file. */ - if (GetLastError () == ERROR_FILE_INVALID) - { - debug_printf ("zero length file, treat as script."); - goto just_shell; - } - goto err; - } - char *buf = (char *) MapViewOfFile(hm, FILE_MAP_READ, 0, 0, 0); - CloseHandle (hm); - if (!buf) - goto err; - - { - myfault efault; - if (efault.faulted ()) - { - UnmapViewOfFile (buf); - real_path.set_cygexec (false); - break; - } - if (buf[0] == 'M' && buf[1] == 'Z') - { - WORD subsys; - unsigned off = (unsigned char) buf[0x18] | (((unsigned char) buf[0x19]) << 8); - win16_exe = off < sizeof (IMAGE_DOS_HEADER); - if (!win16_exe) - real_path.set_cygexec (!!hook_or_detect_cygwin (buf, NULL, subsys)); - else - real_path.set_cygexec (false); - UnmapViewOfFile (buf); - iscui = subsys == IMAGE_SUBSYSTEM_WINDOWS_CUI; - break; - } - } - - debug_printf ("%s is possibly a script", (char *) real_path); - - char *ptr = buf; - if (*ptr++ == '#' && *ptr++ == '!') - { - ptr += strspn (ptr, " \t"); - size_t len = strcspn (ptr, "\r\n"); - if (len) - { - char *namebuf = (char *) alloca (len + 1); - memcpy (namebuf, ptr, len); - namebuf[len] = '\0'; - for (ptr = pgm = namebuf; *ptr; ptr++) - if (!arg1 && (*ptr == ' ' || *ptr == '\t')) - { - /* Null terminate the initial command and step over any additional white - space. If we've hit the end of the line, exit the loop. Otherwise, - we've found the first argument. Position the current pointer on the - last known white space. */ - *ptr = '\0'; - char *newptr = ptr + 1; - newptr += strspn (newptr, " \t"); - if (!*newptr) - break; - arg1 = newptr; - ptr = newptr - 1; - } - } - } - UnmapViewOfFile (buf); -just_shell: - if (!pgm) - { - if (strcasematch (ext, ".com")) - break; - pgm = (char *) "/bin/sh"; - arg1 = NULL; - } - - /* Replace argv[0] with the full path to the script if this is the - first time through the loop. */ - replace0_maybe (prog_arg); - - /* pointers: - * pgm interpreter name - * arg1 optional string - */ - if (arg1) - unshift (arg1); - - /* FIXME: This should not be using FE_NATIVE. It should be putting - the posix path on the argv list. */ - find_exec (pgm, real_path, "PATH=", FE_NATIVE, &ext); - unshift (real_path, 1); - } - return 0; - -err: - __seterrno (); - return -1; -} diff --git a/winsup/cygwin/speclib b/winsup/cygwin/speclib deleted file mode 100755 index 6642414e7..000000000 --- a/winsup/cygwin/speclib +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh -x -# speclib - Make a special version of the cygwin import library. -# -# Copyright 2001, 2002 Red Hat, Inc. -# -# This file is part of Cygwin. -# -# This software is a copyrighted work licensed under the terms of the -# Cygwin license. Please consult the file "CYGWIN_LICENSE" for -# details. - -case "$1" in - -v) shift; v() { :; } ;; - *) v() { /bin/false; } ;; -esac -lib=$1; shift -nm=$1; shift -ar=$1; shift -libdll=$1; shift -cp /dev/null /tmp/$$.objs -trap "cd /tmp; /bin/rm -rf $lib.bak /tmp/$$.dir /tmp/$$.syms /tmp/$$.objs /tmp/$$.raw" 0 1 2 15 -$nm --extern-only --defined-only $* | sed -n -e 's%^.* [TD] \(.*\)$%/ \1\$/p%p' > /tmp/$$.syms -v || $nm -Ap --extern-only --defined-only $libdll | egrep ' I __head| I _.*_iname' | awk -F: '{print $2}' > /tmp/$$.objs -$nm -Ap --extern-only --defined-only $libdll | sed -n -f /tmp/$$.syms | awk -F: '{print $2}' >> /tmp/$$.objs -sort -o /tmp/$$.objs -u /tmp/$$.objs - -[ -s /tmp/$$.objs ] || { echo "speclib: couldn't find symbols for $lib" 1>&2; exit 1; } - -/bin/rm -rf /tmp/$$.dir -mkdir /tmp/$$.dir -cd /tmp/$$.dir -if v; then - $ar x $libdll - /bin/rm -f `cat /tmp/$$.objs` -else - $ar x $libdll `cat /tmp/$$.objs` -fi -/bin/rm -f $lib -$ar crus $lib *.o -export lib; -perl -pi.bak -- - $lib << 'EOF' -BEGIN { - binmode STDIN; - binmode STDOUT; - $lib = ($ENV{lib} =~ m!/([^/]+)$!o)[0] || $ENV{lib}; - $lib =~ s/\.a//o; - my $pad = length('cygwin1_dll') - length($lib); - die "speclib: library name too long (" . length($lib) . ")\n" if $pad < 0; - $lib = "__head_$lib" . "\0" x $pad; -} - s/__head_cygwin1_dll/$lib/g; -EOF diff --git a/winsup/cygwin/stackdump.sgml b/winsup/cygwin/stackdump.sgml deleted file mode 100644 index 1969e2e6f..000000000 --- a/winsup/cygwin/stackdump.sgml +++ /dev/null @@ -1,13 +0,0 @@ - -cygwin_stackdump - - -extern "C" void -cygwin_stackdump - - - - Outputs a stackdump to stderr from the called location. - - - diff --git a/winsup/cygwin/strace.cc b/winsup/cygwin/strace.cc deleted file mode 100644 index 8c778937e..000000000 --- a/winsup/cygwin/strace.cc +++ /dev/null @@ -1,469 +0,0 @@ -/* strace.cc: system/windows tracing - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "pinfo.h" -#include "perprocess.h" -#include "cygwin_version.h" -#include "hires.h" -#include "security.h" -#include "cygthread.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "child_info.h" - -#define PROTECT(x) x[sizeof (x)-1] = 0 -#define CHECK(x) if (x[sizeof (x)-1] != 0) { small_printf ("array bound exceeded %d\n", __LINE__); ExitProcess (1); } - -class strace NO_COPY strace; - -#ifndef NOSTRACE - -void -strace::hello () -{ - if (_active || !being_debugged ()) - return; - - char buf[30]; - __small_sprintf (buf, "cYg%8x %x", _STRACE_INTERFACE_ACTIVATE_ADDR, &_active); - OutputDebugString (buf); - - if (active ()) - { - char pidbuf[40]; - if (myself->progname[0]) - __small_sprintf (pidbuf, "(pid %d, ppid %d)", myself->pid, myself->ppid ?: 1); - else - { - GetModuleFileName (NULL, myself->progname, sizeof (myself->progname)); - __small_sprintf (pidbuf, "(windows pid %d)", GetCurrentProcessId ()); - } - prntf (1, NULL, "**********************************************"); - prntf (1, NULL, "Program name: %s %s", myself->progname, pidbuf); - prntf (1, NULL, "App version: %d.%d, api: %d.%d", - user_data->dll_major, user_data->dll_minor, - user_data->api_major, user_data->api_minor); - prntf (1, NULL, "DLL version: %d.%d, api: %d.%d", - cygwin_version.dll_major, cygwin_version.dll_minor, - cygwin_version.api_major, cygwin_version.api_minor); - prntf (1, NULL, "DLL build: %s", cygwin_version.dll_build_date); - prntf (1, NULL, "OS version: Windows %s", wincap.osname ()); - if (cygheap) - prntf (1, NULL, "Heap size: %u", cygheap->user_heap.chunk); - prntf (1, NULL, "**********************************************"); - } -} - -int -strace::microseconds () -{ - static hires_us now; - return (int) now.usecs (true); -} - -static int __stdcall -getfunc (char *in_dst, const char *func) -{ - const char *p; - const char *pe; - char *dst = in_dst; - for (p = func; (pe = strchr (p, '(')); p = pe + 1) - if (isalnum ((int)pe[-1]) || pe[-1] == '_') - break; - else if (isspace ((int)pe[-1])) - { - pe--; - break; - } - if (!pe) - pe = strchr (func, '\0'); - for (p = pe; p > func; p--) - if (p != pe && *p == ' ') - { - p++; - break; - } - if (*p == '*') - p++; - while (p < pe) - *dst++ = *p++; - - *dst++ = ':'; - *dst++ = ' '; - *dst = '\0'; - - return dst - in_dst; -} - -static char * -mypid (char *buf) -{ - if (myself && myself->pid) - __small_sprintf (buf, "%d", myself->pid); - else - __small_sprintf (buf, "(%d)", cygwin_pid (GetCurrentProcessId ())); - return buf; -} - -extern "C" char *__progname; - -/* sprintf analog for use by output routines. */ -int -strace::vsprntf (char *buf, const char *func, const char *infmt, va_list ap) -{ - int count; - char fmt[80]; - static NO_COPY bool nonewline = false; - DWORD err = GetLastError (); - const char *tn = cygthread::name (); - - int microsec = microseconds (); - lmicrosec = microsec; - - __small_sprintf (fmt, "%7d [%s] %s ", microsec, tn, "%s %s%s"); - - SetLastError (err); - - if (nonewline) - count = 0; - else - { - char *pn; - if (!cygwin_finished_initializing) - pn = myself ? myself->progname : NULL; - else if (__progname) - pn = __progname; - else - pn = NULL; - - char *p; - char progname[CYG_MAX_PATH]; - if (!pn) - GetModuleFileName (NULL, pn = progname, sizeof (progname)); - if (!pn) - /* hmm */; - else if ((p = strrchr (pn, '\\')) != NULL) - p++; - else if ((p = strrchr (pn, '/')) != NULL) - p++; - else - p = pn; - if (p != progname) - strcpy (progname, p); - if ((p = strrchr (progname, '.')) != NULL && strcasematch (p, ".exe")) - *p = '\000'; - p = progname; - char tmpbuf[20]; - count = __small_sprintf (buf, fmt, p && *p ? p : "?", mypid (tmpbuf), - execing ? "!" : ""); - if (func) - count += getfunc (buf + count, func); - } - - count += __small_vsprintf (buf + count, infmt, ap); - char *p; - for (p = buf + count; p > buf; p--) - switch (p[-1]) - { - case '\n': - p[-1] = '\0'; - break; - case '\b': - *--p = '\0'; - nonewline = true; - goto done; - default: - goto addnl; - } - -addnl: - *p++ = '\n'; - *p = '\0'; - nonewline = false; - -done: - return p - buf; -} - -/* Write to strace file or strace queue. */ -void -strace::write (unsigned category, const char *buf, int count) -{ -# define PREFIX (3 + 8 + 1 + 8 + 1) - char outbuf[PREFIX + 1 + count + 1]; -# define outstuff (outbuf + 12) - __small_sprintf (outstuff, "%x %s", category, buf); - __small_sprintf (outbuf, "cYg%08x", strlen (outstuff) + 1); - outstuff[-1] = ' '; - OutputDebugString (outbuf); -#undef outstuff -#undef PREFIX -} - -void -strace::write_childpid (child_info& ch, DWORD pid) -{ - char buf[30]; - - if (!attached () || !being_debugged ()) - return; - WaitForSingleObject (ch.subproc_ready, 30000); - __small_sprintf (buf, "cYg%8x %x", _STRACE_CHILD_PID, pid); - OutputDebugString (buf); -} - -/* Printf function used when tracing system calls. - Warning: DO NOT SET ERRNO HERE! */ - -void -strace::vprntf (unsigned category, const char *func, const char *fmt, va_list ap) -{ - DWORD err = GetLastError (); - int len; - char buf[10000]; - - PROTECT (buf); - SetLastError (err); - - len = vsprntf (buf, func, fmt, ap); - CHECK (buf); - if (category & _STRACE_SYSTEM) - { - DWORD done; - WriteFile (GetStdHandle (STD_ERROR_HANDLE), buf, len, &done, 0); - FlushFileBuffers (GetStdHandle (STD_ERROR_HANDLE)); - /* Make sure that the message shows up on the screen, too, since this is - a serious error. */ - if (GetFileType (GetStdHandle (STD_ERROR_HANDLE)) != FILE_TYPE_CHAR) - { - HANDLE h = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_WRITE | FILE_SHARE_WRITE, - &sec_none, OPEN_EXISTING, 0, 0); - if (h != INVALID_HANDLE_VALUE) - WriteFile (h, buf, len, &done, 0); - CloseHandle (h); - } - } - -#ifndef NOSTRACE - if (active ()) - write (category, buf, len); -#endif - SetLastError (err); -} - -void -strace::prntf (unsigned category, const char *func, const char *fmt, ...) -{ - va_list ap; - - va_start (ap, fmt); - vprntf (category, func, fmt, ap); -} - -extern "C" void -strace_printf (unsigned category, const char *func, const char *fmt, ...) -{ - va_list ap; - - if ((category & _STRACE_SYSTEM) || strace.active ()) - { - va_start (ap, fmt); - strace.vprntf (category, func, fmt, ap); - } -} - -static NO_COPY struct tab -{ - int v; - const char *n; -} -ta[] = -{ - { WM_NULL, "WM_NULL" }, - { WM_CREATE, "WM_CREATE" }, - { WM_DESTROY, "WM_DESTROY" }, - { WM_MOVE, "WM_MOVE" }, - { WM_SIZE, "WM_SIZE" }, - { WM_ACTIVATE, "WM_ACTIVATE" }, - { WM_SETFOCUS, "WM_SETFOCUS" }, - { WM_KILLFOCUS, "WM_KILLFOCUS" }, - { WM_ENABLE, "WM_ENABLE" }, - { WM_SETREDRAW, "WM_SETREDRAW" }, - { WM_SETTEXT, "WM_SETTEXT" }, - { WM_GETTEXT, "WM_GETTEXT" }, - { WM_GETTEXTLENGTH, "WM_GETTEXTLENGTH" }, - { WM_PAINT, "WM_PAINT" }, - { WM_CLOSE, "WM_CLOSE" }, - { WM_QUERYENDSESSION, "WM_QUERYENDSESSION" }, - { WM_QUIT, "WM_QUIT" }, - { WM_QUERYOPEN, "WM_QUERYOPEN" }, - { WM_ERASEBKGND, "WM_ERASEBKGND" }, - { WM_SYSCOLORCHANGE, "WM_SYSCOLORCHANGE" }, - { WM_ENDSESSION, "WM_ENDSESSION" }, - { WM_SHOWWINDOW, "WM_SHOWWINDOW" }, - { WM_WININICHANGE, "WM_WININICHANGE" }, - { WM_DEVMODECHANGE, "WM_DEVMODECHANGE" }, - { WM_ACTIVATEAPP, "WM_ACTIVATEAPP" }, - { WM_FONTCHANGE, "WM_FONTCHANGE" }, - { WM_TIMECHANGE, "WM_TIMECHANGE" }, - { WM_CANCELMODE, "WM_CANCELMODE" }, - { WM_SETCURSOR, "WM_SETCURSOR" }, - { WM_MOUSEACTIVATE, "WM_MOUSEACTIVATE" }, - { WM_CHILDACTIVATE, "WM_CHILDACTIVATE" }, - { WM_QUEUESYNC, "WM_QUEUESYNC" }, - { WM_GETMINMAXINFO, "WM_GETMINMAXINFO" }, - { WM_PAINTICON, "WM_PAINTICON" }, - { WM_ICONERASEBKGND, "WM_ICONERASEBKGND" }, - { WM_NEXTDLGCTL, "WM_NEXTDLGCTL" }, - { WM_SPOOLERSTATUS, "WM_SPOOLERSTATUS" }, - { WM_DRAWITEM, "WM_DRAWITEM" }, - { WM_MEASUREITEM, "WM_MEASUREITEM" }, - { WM_DELETEITEM, "WM_DELETEITEM" }, - { WM_VKEYTOITEM, "WM_VKEYTOITEM" }, - { WM_CHARTOITEM, "WM_CHARTOITEM" }, - { WM_SETFONT, "WM_SETFONT" }, - { WM_GETFONT, "WM_GETFONT" }, - { WM_SETHOTKEY, "WM_SETHOTKEY" }, - { WM_GETHOTKEY, "WM_GETHOTKEY" }, - { WM_QUERYDRAGICON, "WM_QUERYDRAGICON" }, - { WM_COMPAREITEM, "WM_COMPAREITEM" }, - { WM_COMPACTING, "WM_COMPACTING" }, - { WM_WINDOWPOSCHANGING, "WM_WINDOWPOSCHANGING" }, - { WM_WINDOWPOSCHANGED, "WM_WINDOWPOSCHANGED" }, - { WM_POWER, "WM_POWER" }, - { WM_COPYDATA, "WM_COPYDATA" }, - { WM_CANCELJOURNAL, "WM_CANCELJOURNAL" }, - { WM_NCCREATE, "WM_NCCREATE" }, - { WM_NCDESTROY, "WM_NCDESTROY" }, - { WM_NCCALCSIZE, "WM_NCCALCSIZE" }, - { WM_NCHITTEST, "WM_NCHITTEST" }, - { WM_NCPAINT, "WM_NCPAINT" }, - { WM_NCACTIVATE, "WM_NCACTIVATE" }, - { WM_GETDLGCODE, "WM_GETDLGCODE" }, - { WM_NCMOUSEMOVE, "WM_NCMOUSEMOVE" }, - { WM_NCLBUTTONDOWN, "WM_NCLBUTTONDOWN" }, - { WM_NCLBUTTONUP, "WM_NCLBUTTONUP" }, - { WM_NCLBUTTONDBLCLK, "WM_NCLBUTTONDBLCLK" }, - { WM_NCRBUTTONDOWN, "WM_NCRBUTTONDOWN" }, - { WM_NCRBUTTONUP, "WM_NCRBUTTONUP" }, - { WM_NCRBUTTONDBLCLK, "WM_NCRBUTTONDBLCLK" }, - { WM_NCMBUTTONDOWN, "WM_NCMBUTTONDOWN" }, - { WM_NCMBUTTONUP, "WM_NCMBUTTONUP" }, - { WM_NCMBUTTONDBLCLK, "WM_NCMBUTTONDBLCLK" }, - { WM_KEYFIRST, "WM_KEYFIRST" }, - { WM_KEYDOWN, "WM_KEYDOWN" }, - { WM_KEYUP, "WM_KEYUP" }, - { WM_CHAR, "WM_CHAR" }, - { WM_DEADCHAR, "WM_DEADCHAR" }, - { WM_SYSKEYDOWN, "WM_SYSKEYDOWN" }, - { WM_SYSKEYUP, "WM_SYSKEYUP" }, - { WM_SYSCHAR, "WM_SYSCHAR" }, - { WM_SYSDEADCHAR, "WM_SYSDEADCHAR" }, - { WM_KEYLAST, "WM_KEYLAST" }, - { WM_INITDIALOG, "WM_INITDIALOG" }, - { WM_COMMAND, "WM_COMMAND" }, - { WM_SYSCOMMAND, "WM_SYSCOMMAND" }, - { WM_TIMER, "WM_TIMER" }, - { WM_HSCROLL, "WM_HSCROLL" }, - { WM_VSCROLL, "WM_VSCROLL" }, - { WM_INITMENU, "WM_INITMENU" }, - { WM_INITMENUPOPUP, "WM_INITMENUPOPUP" }, - { WM_MENUSELECT, "WM_MENUSELECT" }, - { WM_MENUCHAR, "WM_MENUCHAR" }, - { WM_ENTERIDLE, "WM_ENTERIDLE" }, - { WM_CTLCOLORMSGBOX, "WM_CTLCOLORMSGBOX" }, - { WM_CTLCOLOREDIT, "WM_CTLCOLOREDIT" }, - { WM_CTLCOLORLISTBOX, "WM_CTLCOLORLISTBOX" }, - { WM_CTLCOLORBTN, "WM_CTLCOLORBTN" }, - { WM_CTLCOLORDLG, "WM_CTLCOLORDLG" }, - { WM_CTLCOLORSCROLLBAR, "WM_CTLCOLORSCROLLBAR" }, - { WM_CTLCOLORSTATIC, "WM_CTLCOLORSTATIC" }, - { WM_MOUSEFIRST, "WM_MOUSEFIRST" }, - { WM_MOUSEMOVE, "WM_MOUSEMOVE" }, - { WM_LBUTTONDOWN, "WM_LBUTTONDOWN" }, - { WM_LBUTTONUP, "WM_LBUTTONUP" }, - { WM_LBUTTONDBLCLK, "WM_LBUTTONDBLCLK" }, - { WM_RBUTTONDOWN, "WM_RBUTTONDOWN" }, - { WM_RBUTTONUP, "WM_RBUTTONUP" }, - { WM_RBUTTONDBLCLK, "WM_RBUTTONDBLCLK" }, - { WM_MBUTTONDOWN, "WM_MBUTTONDOWN" }, - { WM_MBUTTONUP, "WM_MBUTTONUP" }, - { WM_MBUTTONDBLCLK, "WM_MBUTTONDBLCLK" }, - { WM_MOUSELAST, "WM_MOUSELAST" }, - { WM_PARENTNOTIFY, "WM_PARENTNOTIFY" }, - { WM_ENTERMENULOOP, "WM_ENTERMENULOOP" }, - { WM_EXITMENULOOP, "WM_EXITMENULOOP" }, - { WM_MDICREATE, "WM_MDICREATE" }, - { WM_MDIDESTROY, "WM_MDIDESTROY" }, - { WM_MDIACTIVATE, "WM_MDIACTIVATE" }, - { WM_MDIRESTORE, "WM_MDIRESTORE" }, - { WM_MDINEXT, "WM_MDINEXT" }, - { WM_MDIMAXIMIZE, "WM_MDIMAXIMIZE" }, - { WM_MDITILE, "WM_MDITILE" }, - { WM_MDICASCADE, "WM_MDICASCADE" }, - { WM_MDIICONARRANGE, "WM_MDIICONARRANGE" }, - { WM_MDIGETACTIVE, "WM_MDIGETACTIVE" }, - { WM_MDISETMENU, "WM_MDISETMENU" }, - { WM_DROPFILES, "WM_DROPFILES" }, - { WM_MDIREFRESHMENU, "WM_MDIREFRESHMENU" }, - { WM_CUT, "WM_CUT" }, - { WM_COPY, "WM_COPY" }, - { WM_PASTE, "WM_PASTE" }, - { WM_CLEAR, "WM_CLEAR" }, - { WM_UNDO, "WM_UNDO" }, - { WM_RENDERFORMAT, "WM_RENDERFORMAT" }, - { WM_RENDERALLFORMATS, "WM_RENDERALLFORMATS" }, - { WM_DESTROYCLIPBOARD, "WM_DESTROYCLIPBOARD" }, - { WM_DRAWCLIPBOARD, "WM_DRAWCLIPBOARD" }, - { WM_PAINTCLIPBOARD, "WM_PAINTCLIPBOARD" }, - { WM_VSCROLLCLIPBOARD, "WM_VSCROLLCLIPBOARD" }, - { WM_SIZECLIPBOARD, "WM_SIZECLIPBOARD" }, - { WM_ASKCBFORMATNAME, "WM_ASKCBFORMATNAME" }, - { WM_CHANGECBCHAIN, "WM_CHANGECBCHAIN" }, - { WM_HSCROLLCLIPBOARD, "WM_HSCROLLCLIPBOARD" }, - { WM_QUERYNEWPALETTE, "WM_QUERYNEWPALETTE" }, - { WM_PALETTEISCHANGING, "WM_PALETTEISCHANGING" }, - { WM_PALETTECHANGED, "WM_PALETTECHANGED" }, - { WM_HOTKEY, "WM_HOTKEY" }, - { WM_PENWINFIRST, "WM_PENWINFIRST" }, - { WM_PENWINLAST, "WM_PENWINLAST" }, - { WM_ASYNCIO, "ASYNCIO" }, - { 0, 0 }}; - -void -strace::wm (int message, int word, int lon) -{ - if (active ()) - { - int i; - - for (i = 0; ta[i].n; i++) - { - if (ta[i].v == message) - { - prntf (_STRACE_WM, NULL, "wndproc %d %s %d %d", message, ta[i].n, word, lon); - return; - } - } - prntf (_STRACE_WM, NULL, "wndproc %d unknown %d %d", message, word, lon); - } -} -#endif /*NOSTRACE*/ diff --git a/winsup/cygwin/string.h b/winsup/cygwin/string.h deleted file mode 100644 index 1ad902134..000000000 --- a/winsup/cygwin/string.h +++ /dev/null @@ -1,129 +0,0 @@ -/* string.h: Extra string defs - - Copyright 2001 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _CYGWIN_STRING_H -#define _CYGWIN_STRING_H - -#include_next - -#ifdef __cplusplus -extern "C" { -#endif - -#undef strchr -#define strchr cygwin_strchr -static inline __stdcall char * -strchr (const char *s, int c) -{ - register char * res; - __asm__ __volatile__ ("\ - movb %%al,%%ah\n\ -1: movb (%1),%%al\n\ - cmpb %%ah,%%al\n\ - je 2f\n\ - incl %1\n\ - testb %%al,%%al\n\ - jne 1b\n\ - xorl %1,%1\n\ -2: movl %1,%0\n\ - ":"=a" (res), "=r" (s) - :"0" (c), "1" (s)); - return res; -} - -#undef strechr -#define strechr cygwin_strechr -static inline __stdcall char * -strechr (const char *s, int c) -{ - register char * res; - __asm__ __volatile__ ("\ - movb %%al,%%ah\n\ -1: movb (%1),%%al\n\ - cmpb %%ah,%%al\n\ - je 2f\n\ - incl %1\n\ - testb %%al,%%al\n\ - jne 1b\n\ - decl %1\n\ -2: movl %1,%0\n\ - ":"=a" (res), "=r" (s) - :"0" (c), "1" (s)); - return res; -} - -extern const char isalpha_array[]; - -#undef strcasematch -#define strcasematch cygwin_strcasematch - -static inline int -cygwin_strcasematch (const char *cs, const char *ct) -{ - register int __res; - int d0, d1; - __asm__ ("\ - .global _isalpha_array \n\ - cld \n\ - andl $0xff,%%eax \n\ -1: lodsb \n\ - scasb \n\ - je 2f \n\ - xorb _isalpha_array(%%eax),%%al \n\ - cmpb -1(%%edi),%%al \n\ - jne 3f \n\ -2: testb %%al,%%al \n\ - jnz 1b \n\ - movl $1,%%eax \n\ - jmp 4f \n\ -3: xor %0,%0 \n\ -4:" - :"=a" (__res), "=&S" (d0), "=&D" (d1) - : "1" (cs), "2" (ct)); - - return __res; -} - -#undef strncasematch -#define strncasematch cygwin_strncasematch - -static inline int -cygwin_strncasematch (const char *cs, const char *ct, size_t n) -{ - register int __res; - int d0, d1, d2; - __asm__ ("\ - .global _isalpha_array; \n\ - cld \n\ - andl $0xff,%%eax \n\ -1: decl %3 \n\ - js 3f \n\ - lodsb \n\ - scasb \n\ - je 2f \n\ - xorb _isalpha_array(%%eax),%%al \n\ - cmpb -1(%%edi),%%al \n\ - jne 4f \n\ -2: testb %%al,%%al \n\ - jnz 1b \n\ -3: movl $1,%%eax \n\ - jmp 5f \n\ -4: xor %0,%0 \n\ -5:" - :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2) - :"1" (cs), "2" (ct), "3" (n)); - - return __res; -} - -#ifdef __cplusplus -} -#endif -#endif /* _CYGWIN_STRING_H */ diff --git a/winsup/cygwin/strsep.cc b/winsup/cygwin/strsep.cc deleted file mode 100644 index f03df3d94..000000000 --- a/winsup/cygwin/strsep.cc +++ /dev/null @@ -1,64 +0,0 @@ -/* strsep.cc: strsep call */ - -#include - -/*- - * Copyright (c) 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. - */ - -extern "C" char * -strsep (char **stringp, - const char *delim) -{ - register char *s; - register const char *spanp; - register int c, sc; - char *tok; - - if ((s = *stringp) == NULL) - return (NULL); - for (tok = s;;) { - c = *s++; - spanp = delim; - do { - if ((sc = *spanp++) == c) { - if (c == 0) - s = NULL; - else - s[-1] = 0; - *stringp = s; - return (tok); - } - } while (sc != 0); - } - /* NOTREACHED */ -} diff --git a/winsup/cygwin/strsig.cc b/winsup/cygwin/strsig.cc deleted file mode 100644 index 6d3c479ec..000000000 --- a/winsup/cygwin/strsig.cc +++ /dev/null @@ -1,84 +0,0 @@ -/* strsig.cc - - Copyright 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include "thread.h" -#include -#include -#include -#include -#include - -struct sigdesc -{ - int n; - const char *name; - const char *str; -}; - -#define _s(n, s) {n, #n, s} -static const sigdesc siglist[] = -{ - _s(SIGHUP, "Hangup"), - _s(SIGINT, "Interrupt"), - _s(SIGQUIT, "Quit"), - _s(SIGILL, "Illegal instruction"), - _s(SIGTRAP, "Trace/breakpoint trap"), - _s(SIGABRT, "Aborted"), - _s(SIGEMT, "EMT instruction"), - _s(SIGFPE, "Floating point exception"), - _s(SIGKILL, "Killed"), - _s(SIGBUS, "Bus error"), - _s(SIGSEGV, "Segmentation fault"), - _s(SIGSYS, "Bad system call"), - _s(SIGPIPE, "Broken pipe"), - _s(SIGALRM, "Alarm clock"), - _s(SIGTERM, "Terminated"), - _s(SIGURG, "Urgent I/O condition"), - _s(SIGSTOP, "Stopped (signal)"), - _s(SIGTSTP, "Stopped"), - _s(SIGCONT, "Continued"), - _s(SIGCHLD, "Child exited"), - _s(SIGCLD, "Child exited"), - _s(SIGTTIN, "Stopped (tty input)"), - _s(SIGTTOU, "Stopped (tty output)"), - _s(SIGIO, "I/O possible"), - _s(SIGPOLL, "I/O possible"), - _s(SIGXCPU, "CPU time limit exceeded"), - _s(SIGXFSZ, "File size limit exceeded"), - _s(SIGVTALRM, "Virtual timer expired"), - _s(SIGPROF, "Profiling timer expired"), - _s(SIGWINCH, "Window changed"), - _s(SIGLOST, "Resource lost"), - _s(SIGUSR1, "User defined signal 1"), - _s(SIGUSR2, "User defined signal 2"), - _s(SIGRTMIN, "Real-time signal 0"), - _s(SIGRTMAX, "Real-time signal 0"), - {0, NULL, NULL} -}; - -extern "C" const char * -strsignal (int signo) -{ - for (int i = 0; siglist[i].n; i++) - if (siglist[i].n == signo) - return siglist[i].str; - __small_sprintf (_my_tls.locals.signamebuf, "Unknown signal %d", signo); - return _my_tls.locals.signamebuf; -} - -extern "C" int -strtosigno (const char *name) -{ - for (int i = 0; siglist[i].n; i++) - if (strcmp (siglist[i].name, name) == 0) - return siglist[i].n; - return 0; -} diff --git a/winsup/cygwin/sync.cc b/winsup/cygwin/sync.cc deleted file mode 100644 index e539e3893..000000000 --- a/winsup/cygwin/sync.cc +++ /dev/null @@ -1,157 +0,0 @@ -/* sync.cc: Synchronization functions for cygwin. - - This file implements the methods for controlling the "muto" class - which is intended to operate similarly to a mutex but attempts to - avoid making expensive calls to the kernel. - - Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - - Written by Christopher Faylor - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include "sync.h" -#include "security.h" -#include "thread.h" -#include "cygtls.h" - -#undef WaitForSingleObject - -DWORD NO_COPY muto::exiting_thread; - -void -muto::grab () -{ - tls = &_my_tls; -} - -/* Constructor */ -muto * -muto::init (const char *s) -{ - char *already_exists = (char *) InterlockedExchangePointer (&name, s); - if (already_exists) - while (!bruteforce) - low_priority_sleep (0); - else - { - waiters = -1; - /* Create event which is used in the fallback case when blocking is necessary */ - bruteforce = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); - if (!bruteforce) - api_fatal ("couldn't allocate muto '%s', %E", s); - } - - return this; -} - -#if 0 /* FIXME: Do we need this? mutos aren't destroyed until process exit */ -/* Destructor (racy?) */ -muto::~muto () -{ - while (visits) - release (); - - HANDLE h = bruteforce; - bruteforce = NULL; - /* Just need to close the event handle */ - if (h) - CloseHandle (h); -} -#endif - -/* Acquire the lock. Argument is the number of milliseconds to wait for - the lock. Multiple visits from the same thread are allowed and should - be handled correctly. - - Note: The goal here is to minimize, as much as possible, calls to the - OS. Hence the use of InterlockedIncrement, etc., rather than (much) more - expensive OS mutexes. Also note that the only two valid "ms" times are - 0 and INFINITE. */ -int -muto::acquire (DWORD ms) -{ - void *this_tls = &_my_tls; -#if 0 - if (exiting_thread) - return this_tid == exiting_thread; -#endif - - if (tls != this_tls) - { - /* Increment the waiters part of the class. Need to do this first to - avoid potential races. */ - LONG was_waiting = ms ? InterlockedIncrement (&waiters) : 0; - - while (was_waiting || InterlockedExchange (&sync, 1) != 0) - switch (WaitForSingleObject (bruteforce, ms)) - { - case WAIT_OBJECT_0: - was_waiting = 0; - break; - default: - return 0; /* failed. */ - } - - /* Have to do it this way to avoid a race */ - if (!ms) - InterlockedIncrement (&waiters); - - tls = this_tls; /* register this thread. */ - } - - return ++visits; /* Increment visit count. */ -} - -bool -muto::acquired () -{ - return tls == &_my_tls; -} - -/* Return the muto lock. Needs to be called once per every acquire. */ -int -muto::release () -{ - void *this_tls = &_my_tls; - - if (tls != this_tls || !visits) - { - SetLastError (ERROR_NOT_OWNER); /* Didn't have the lock. */ - return 0; /* failed. */ - } - - /* FIXME: Need to check that other thread has not exited, too. */ - if (!--visits) - { - tls = 0; /* We were the last unlocker. */ - InterlockedExchange (&sync, 0); /* Reset trigger. */ - /* This thread had incremented waiters but had never decremented it. - Decrement it now. If it is >= 0 then there are possibly other - threads waiting for the lock, so trigger bruteforce. */ - if (InterlockedDecrement (&waiters) >= 0) - SetEvent (bruteforce); /* Wake up one of the waiting threads */ - else if (*name == '!') - { - CloseHandle (bruteforce); /* If *name == '!' and there are no - other waiters, then this is the - last time this muto will ever be - used, so close the handle. */ -#ifdef DEBUGGING - bruteforce = NULL; -#endif - } - } - - return 1; /* success. */ -} diff --git a/winsup/cygwin/sync.h b/winsup/cygwin/sync.h deleted file mode 100644 index f8019a8fe..000000000 --- a/winsup/cygwin/sync.h +++ /dev/null @@ -1,71 +0,0 @@ -/* sync.h: Header file for cygwin synchronization primitives. - - Copyright 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - - Written by Christopher Faylor - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _SYNC_H -#define _SYNC_H -/* FIXME: Note that currently this class cannot be allocated via `new' since - there are issues with malloc and fork. */ -class muto -{ -public: - const char *name; -private: - static DWORD exiting_thread; - LONG sync; /* Used to serialize access to this class. */ - LONG waiters; /* Number of threads waiting for lock. */ - HANDLE bruteforce; /* event handle used to control waiting for lock. */ -public: - LONG visits; /* Count of number of times a thread has called acquire. */ - void *tls; /* Tls of lock owner. */ - // class muto *next; - - /* The real constructor. */ - muto *init (const char *) __attribute__ ((regparm (2))); - -#if 0 /* FIXME: See comment in sync.cc */ - ~muto () -#endif - int acquire (DWORD ms = INFINITE) __attribute__ ((regparm (2))); /* Acquire the lock. */ - int release () __attribute__ ((regparm (1))); /* Release the lock. */ - - bool acquired () __attribute__ ((regparm (1))); - void upforgrabs () {tls = this;} // just set to an invalid address - void grab () __attribute__ ((regparm (1))); - operator int () const {return !!name;} - static void set_exiting_thread () {exiting_thread = GetCurrentThreadId ();} -}; - -class lock_process -{ - bool skip_unlock; - static muto locker; -public: - static void init () {locker.init ("lock_process");} - lock_process (bool exiting = false) - { - locker.acquire (); - skip_unlock = exiting; - if (exiting && exit_state < ES_SET_MUTO) - { - exit_state = ES_SET_MUTO; - muto::set_exiting_thread (); - } - } - ~lock_process () - { - if (!skip_unlock) - locker.release (); - } - friend class dtable; -}; - -#endif /*_SYNC_H*/ diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc deleted file mode 100644 index 3b976c0d3..000000000 --- a/winsup/cygwin/syscalls.cc +++ /dev/null @@ -1,3164 +0,0 @@ -/* syscalls.cc: syscalls - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#define fstat __FOOfstat__ -#define lstat __FOOlstat__ -#define stat __FOOstat__ -#define _close __FOO_close__ -#define _lseek __FOO_lseek__ -#define _open __FOO_open__ -#define _read __FOO_read__ -#define _write __FOO_write__ -#define _open64 __FOO_open64__ -#define _lseek64 __FOO_lseek64__ -#define _fstat64 __FOO_fstat64__ -#define pread __FOO_pread -#define pwrite __FOO_pwrite - -#include "winsup.h" -#include -#include /* needed for statfs */ -#include /* needed for statvfs */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include /* for UNLEN */ -#include - -#undef fstat -#undef lstat -#undef stat -#undef pread -#undef pwrite - -#include -#include -#include "cygerrno.h" -#include "perprocess.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "sigproc.h" -#include "pinfo.h" -#include "shared_info.h" -#include "cygheap.h" -#include "pwdgrp.h" -#include "cpuid.h" -#include "registry.h" -#include "environ.h" - -#undef _close -#undef _lseek -#undef _open -#undef _read -#undef _write -#undef _open64 -#undef _lseek64 -#undef _fstat64 - -suffix_info stat_suffixes[] = -{ - suffix_info ("", 1), - suffix_info (".exe", 1), - suffix_info (NULL) -}; - -bool transparent_exe = false; - -SYSTEM_INFO system_info; - -static int __stdcall mknod_worker (const char *, mode_t, mode_t, _major_t, - _minor_t); - -static int __stdcall stat_worker (const char *name, struct __stat64 *buf, - int nofollow) __attribute__ ((regparm (3))); - -/* Close all files and process any queued deletions. - Lots of unix style applications will open a tmp file, unlink it, - but never call close. This function is called by _exit to - ensure we don't leave any such files lying around. */ - -void __stdcall -close_all_files (bool norelease) -{ - cygheap->fdtab.lock (); - - fhandler_base *fh; - for (int i = 0; i < (int) cygheap->fdtab.size; i++) - if ((fh = cygheap->fdtab[i]) != NULL) - { -#ifdef DEBUGGING - debug_printf ("closing fd %d", i); -#endif - fh->close (); - if (!norelease) - cygheap->fdtab.release (i); - } - - if (!hExeced && cygheap->ctty) - cygheap->close_ctty (); - - cygheap->fdtab.unlock (); - user_shared->delqueue.process_queue (); -} - -int -dup (int fd) -{ - return cygheap->fdtab.dup2 (fd, cygheap_fdnew ()); -} - -int -dup2 (int oldfd, int newfd) -{ - return cygheap->fdtab.dup2 (oldfd, newfd); -} - -extern "C" int -unlink (const char *ourname) -{ - int res = -1; - DWORD devn; - - path_conv win32_name (ourname, PC_SYM_NOFOLLOW, - transparent_exe ? stat_suffixes : NULL); - - if (win32_name.error) - { - set_errno (win32_name.error); - goto done; - } - - if ((devn = win32_name.get_devn ()) == FH_PROC || devn == FH_REGISTRY - || devn == FH_PROCESS) - { - set_errno (EROFS); - goto done; - } - - syscall_printf ("_unlink (%s)", win32_name.get_win32 ()); - - if (!win32_name.exists ()) - { - syscall_printf ("unlinking a nonexistent file"); - set_errno (ENOENT); - goto done; - } - else if (win32_name.isdir ()) - { - syscall_printf ("unlinking a directory"); - set_errno (EPERM); - goto done; - } - - bool setattrs; - if (!((DWORD) win32_name & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM))) - setattrs = false; - else - { - /* Allow us to delete even if read-only */ - setattrs = SetFileAttributes (win32_name, - (DWORD) win32_name - & ~(FILE_ATTRIBUTE_READONLY - | FILE_ATTRIBUTE_SYSTEM)); - } - /* Attempt to use "delete on close" semantics to handle removing - a file which may be open. - - CV 2004-09-17: Not if the file is on a remote share. If two processes - have open handles on a file and one of them calls unlink, then it - happens that the file is remove from the remote share even though the - other process still has an open handle. This other process than gets - Win32 error 59, ERROR_UNEXP_NET_ERR when trying to access the file. - - For some reason, that does not happen when using DeleteFile, which - nicely succeeds but still, the file is available for the other process. - To reproduce, mount /tmp on a remote share and call - - bash -c "cat << EOF" - - Microsoft KB 837665 describes this problem as a bug in 2K3, but I have - reproduced it on shares on Samba 2.2.8, Samba 3.0.2, NT4SP6, XP64SP1 and - 2K3 and in all cases, DeleteFile works, "delete on close" does not. */ - if (!win32_name.isremote () && wincap.has_delete_on_close ()) - { - HANDLE h; - h = CreateFile (win32_name, 0, FILE_SHARE_READ, &sec_none_nih, - OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0); - if (h != INVALID_HANDLE_VALUE) - { - if (wincap.has_hard_links () && setattrs) - SetFileAttributes (win32_name, (DWORD) win32_name); - BOOL res = CloseHandle (h); - syscall_printf ("%d = CloseHandle (%p)", res, h); - if (GetFileAttributes (win32_name) == INVALID_FILE_ATTRIBUTES - || !win32_name.isremote ()) - { - syscall_printf ("CreateFile (FILE_FLAG_DELETE_ON_CLOSE) succeeded"); - goto ok; - } - else - { - syscall_printf ("CreateFile (FILE_FLAG_DELETE_ON_CLOSE) failed"); - if (setattrs) - SetFileAttributes (win32_name, (DWORD) win32_name & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)); - } - } - } - - /* Try a delete with attributes reset */ - if (DeleteFile (win32_name)) - { - syscall_printf ("DeleteFile after CreateFile/CloseHandle succeeded"); - goto ok; - } - - DWORD lasterr; - lasterr = GetLastError (); - - SetFileAttributes (win32_name, (DWORD) win32_name); - - /* Windows 9x seems to report ERROR_ACCESS_DENIED rather than sharing - violation. So, set lasterr to ERROR_SHARING_VIOLATION in this case - to simplify tests. */ - if (wincap.access_denied_on_delete () && lasterr == ERROR_ACCESS_DENIED - && !win32_name.isremote ()) - lasterr = ERROR_SHARING_VIOLATION; - - /* FILE_FLAGS_DELETE_ON_CLOSE was a bust. If this is a sharing - violation, then queue the file for deletion when the process - exits. Otherwise, punt. */ - if (lasterr != ERROR_SHARING_VIOLATION) - goto err; - - syscall_printf ("couldn't delete file, err %d", lasterr); - - /* Add file to the "to be deleted" queue. */ - user_shared->delqueue.queue_file (win32_name); - - /* Success condition. */ - ok: - res = 0; - goto done; - - /* Error condition. */ - err: - __seterrno (); - res = -1; - - done: - syscall_printf ("%d = unlink (%s)", res, ourname); - return res; -} - -extern "C" int -_remove_r (struct _reent *, const char *ourname) -{ - path_conv win32_name (ourname, PC_SYM_NOFOLLOW); - - if (win32_name.error) - { - set_errno (win32_name.error); - syscall_printf ("-1 = remove (%s)", ourname); - return -1; - } - - return win32_name.isdir () ? rmdir (ourname) : unlink (ourname); -} - -extern "C" int -remove (const char *ourname) -{ - path_conv win32_name (ourname, PC_SYM_NOFOLLOW); - - if (win32_name.error) - { - set_errno (win32_name.error); - syscall_printf ("-1 = remove (%s)", ourname); - return -1; - } - - return win32_name.isdir () ? rmdir (ourname) : unlink (ourname); -} - -extern "C" pid_t -getpid () -{ - return myself->pid; -} - -extern "C" pid_t -_getpid_r (struct _reent *) -{ - return getpid (); -} - -/* getppid: POSIX 4.1.1.1 */ -extern "C" pid_t -getppid () -{ - return myself->ppid; -} - -/* setsid: POSIX 4.3.2.1 */ -extern "C" pid_t -setsid (void) -{ -#ifdef NEWVFORK - vfork_save *vf = vfork_storage.val (); - /* This is a horrible, horrible kludge */ - if (vf && vf->pid < 0) - { - pid_t pid = fork (); - if (pid > 0) - { - syscall_printf ("longjmping due to vfork"); - vf->restore_pid (pid); - } - /* assuming that fork was successful */ - } -#endif - - if (myself->pgid == myself->pid) - syscall_printf ("hmm. pgid %d pid %d", myself->pgid, myself->pid); - else - { - myself->ctty = -1; - cygheap->manage_console_count ("setsid", 0); - myself->sid = getpid (); - myself->pgid = getpid (); - if (cygheap->ctty) - cygheap->close_ctty (); - syscall_printf ("sid %d, pgid %d, %s", myself->sid, myself->pgid, myctty ()); - return myself->sid; - } - - set_errno (EPERM); - return -1; -} - -extern "C" pid_t -getsid (pid_t pid) -{ - pid_t res; - if (!pid) - res = myself->sid; - else - { - pinfo p (pid); - if (p) - res = p->sid; - else - { - set_errno (ESRCH); - res = -1; - } - } - return res; -} - -extern "C" ssize_t -read (int fd, void *ptr, size_t len) -{ - const iovec iov = - { - iov_base: ptr, - iov_len: len - }; - - return readv (fd, &iov, 1); -} - -extern "C" ssize_t -pread (int fd, void *ptr, size_t len, _off64_t off) -{ - ssize_t res; - cygheap_fdget cfd (fd); - if (cfd < 0) - res = -1; - else - res = cfd->pread (ptr, len, off); - - syscall_printf ("%d = pread (%d, %p, %d, %d), errno %d", - res, fd, ptr, len, off, get_errno ()); - return res; -} - -extern "C" ssize_t -pwrite (int fd, void *ptr, size_t len, _off64_t off) -{ - ssize_t res; - cygheap_fdget cfd (fd); - if (cfd < 0) - res = -1; - else - res = cfd->pwrite (ptr, len, off); - - syscall_printf ("%d = pwrite (%d, %p, %d, %d), errno %d", - res, fd, ptr, len, off, get_errno ()); - return res; -} - -EXPORT_ALIAS (read, _read) - -extern "C" ssize_t -write (int fd, const void *ptr, size_t len) -{ - const struct iovec iov = - { - iov_base: (void *) ptr, // const_cast - iov_len: len - }; - - return writev (fd, &iov, 1); -} - -EXPORT_ALIAS (write, _write) - -extern "C" ssize_t -readv (int fd, const struct iovec *const iov, const int iovcnt) -{ - extern int sigcatchers; - const int e = get_errno (); - - int res = -1; - - const ssize_t tot = check_iovec_for_read (iov, iovcnt); - - if (tot <= 0) - { - res = tot; - goto done; - } - - while (1) - { - sig_dispatch_pending (); - - cygheap_fdget cfd (fd); - if (cfd < 0) - break; - - if ((cfd->get_flags () & O_ACCMODE) == O_WRONLY) - { - set_errno (EBADF); - break; - } - - DWORD wait = cfd->is_nonblocking () ? 0 : INFINITE; - - /* Could block, so let user know we at least got here. */ - syscall_printf ("readv (%d, %p, %d) %sblocking, sigcatchers %d", - fd, iov, iovcnt, wait ? "" : "non", sigcatchers); - - if (wait && (!cfd->is_slow () || cfd->uninterruptible_io ())) - debug_printf ("no need to call ready_for_read"); - else if (!cfd->ready_for_read (fd, wait)) - { - res = -1; - goto out; - } - - /* FIXME: This is not thread safe. We need some method to - ensure that an fd, closed in another thread, aborts I/O - operations. */ - if (!cfd.isopen ()) - break; - - /* Check to see if this is a background read from a "tty", - sending a SIGTTIN, if appropriate */ - res = cfd->bg_check (SIGTTIN); - - if (!cfd.isopen ()) - { - res = -1; - break; - } - - if (res > bg_eof) - { - myself->process_state |= PID_TTYIN; - if (!cfd.isopen ()) - { - res = -1; - break; - } - res = cfd->readv (iov, iovcnt, tot); - myself->process_state &= ~PID_TTYIN; - } - - out: - if (res >= 0 || get_errno () != EINTR || !_my_tls.call_signal_handler ()) - break; - set_errno (e); - } - -done: - syscall_printf ("%d = readv (%d, %p, %d), errno %d", res, fd, iov, iovcnt, - get_errno ()); - MALLOC_CHECK; - return res; -} - -extern "C" ssize_t -writev (const int fd, const struct iovec *const iov, const int iovcnt) -{ - int res = -1; - sig_dispatch_pending (); - const ssize_t tot = check_iovec_for_write (iov, iovcnt); - - cygheap_fdget cfd (fd); - if (cfd < 0) - goto done; - - if (tot <= 0) - { - res = tot; - goto done; - } - - if ((cfd->get_flags () & O_ACCMODE) == O_RDONLY) - { - set_errno (EBADF); - goto done; - } - - /* Could block, so let user know we at least got here. */ - if (fd == 1 || fd == 2) - paranoid_printf ("writev (%d, %p, %d)", fd, iov, iovcnt); - else - syscall_printf ("writev (%d, %p, %d)", fd, iov, iovcnt); - - res = cfd->bg_check (SIGTTOU); - - if (res > (int) bg_eof) - { - myself->process_state |= PID_TTYOU; - res = cfd->writev (iov, iovcnt, tot); - myself->process_state &= ~PID_TTYOU; - } - -done: - if (fd == 1 || fd == 2) - paranoid_printf ("%d = write (%d, %p, %d), errno %d", - res, fd, iov, iovcnt, get_errno ()); - else - syscall_printf ("%d = write (%d, %p, %d), errno %d", - res, fd, iov, iovcnt, get_errno ()); - - MALLOC_CHECK; - return res; -} - -/* _open */ -/* newlib's fcntl.h defines _open as taking variable args so we must - correspond. The third arg if it exists is: mode_t mode. */ -extern "C" int -open (const char *unix_path, int flags, ...) -{ - int res = -1; - va_list ap; - mode_t mode = 0; - sig_dispatch_pending (); - - syscall_printf ("open (%s, %p)", unix_path, flags); - myfault efault; - if (efault.faulted (EFAULT)) - /* errno already set */; - else if (!*unix_path) - set_errno (ENOENT); - else - { - /* check for optional mode argument */ - va_start (ap, flags); - mode = va_arg (ap, mode_t); - va_end (ap); - - fhandler_base *fh; - cygheap_fdnew fd; - - if (fd >= 0) - { - if (!(fh = build_fh_name (unix_path, NULL, (flags & O_NOFOLLOW) ? - PC_SYM_NOFOLLOW : PC_SYM_FOLLOW, - transparent_exe ? stat_suffixes : NULL))) - res = -1; // errno already set - else if ((flags & O_NOFOLLOW) && fh->issymlink ()) - { - delete fh; - res = -1; - set_errno (ELOOP); - } - else if (((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) && fh->exists ()) - { - delete fh; - res = -1; - set_errno (EEXIST); - } - else if (fh->is_fs_special () && fh->device_access_denied (flags)) - { - delete fh; - res = -1; - } - else if (!fh->open (flags, (mode & 07777) & ~cygheap->umask)) - { - delete fh; - res = -1; - } - else - { - cygheap->fdtab[fd] = fh; - if ((res = fd) <= 2) - set_std_handle (res); - } - } - } - - syscall_printf ("%d = open (%s, %p)", res, unix_path, flags); - return res; -} - -EXPORT_ALIAS (open, _open ) -EXPORT_ALIAS (open, _open64 ) - -extern "C" _off64_t -lseek64 (int fd, _off64_t pos, int dir) -{ - _off64_t res; - - if (dir != SEEK_SET && dir != SEEK_CUR && dir != SEEK_END) - { - set_errno (EINVAL); - res = -1; - } - else - { - cygheap_fdget cfd (fd); - if (cfd >= 0) - res = cfd->lseek (pos, dir); - else - res = -1; - } - syscall_printf ("%D = lseek (%d, %D, %d)", res, fd, pos, dir); - - return res; -} - -EXPORT_ALIAS (lseek64, _lseek64) - -extern "C" _off_t -lseek (int fd, _off_t pos, int dir) -{ - return lseek64 (fd, (_off64_t) pos, dir); -} - -EXPORT_ALIAS (lseek, _lseek) - -extern "C" int -close (int fd) -{ - int res; - - syscall_printf ("close (%d)", fd); - - MALLOC_CHECK; - cygheap_fdget cfd (fd, true); - if (cfd < 0) - res = -1; - else - { - res = cfd->close (); - cfd.release (); - } - - syscall_printf ("%d = close (%d)", res, fd); - MALLOC_CHECK; - return res; -} - -EXPORT_ALIAS (close, _close) - -extern "C" int -isatty (int fd) -{ - int res; - - cygheap_fdget cfd (fd); - if (cfd < 0) - res = 0; - else - res = cfd->is_tty (); - syscall_printf ("%d = isatty (%d)", res, fd); - return res; -} - -/* Under NT, try to make a hard link using backup API. If that - fails or we are Win 95, just copy the file. - FIXME: We should actually be checking partition type, not OS. - Under NTFS, we should support hard links. On FAT partitions, - we should just copy the file. -*/ - -extern "C" int -link (const char *oldpath, const char *newpath) -{ - int res = -1; - fhandler_base *fh; - - if (!(fh = build_fh_name (oldpath, NULL, PC_SYM_NOFOLLOW, - transparent_exe ? stat_suffixes : NULL))) - goto error; - - if (fh->error ()) - { - debug_printf ("got %d error from build_fh_name", fh->error ()); - set_errno (fh->error ()); - } - else - res = fh->link (newpath); - - delete fh; - error: - syscall_printf ("%d = link (%s, %s)", res, oldpath, newpath); - return res; -} - -/* chown: POSIX 5.6.5.1 */ -/* - * chown () is only implemented for Windows NT. Under other operating - * systems, it is only a stub that always returns zero. - */ -static int -chown_worker (const char *name, unsigned fmode, __uid32_t uid, __gid32_t gid) -{ - if (!wincap.has_security ()) // real chown only works on NT - return 0; // return zero (and do nothing) under Windows 9x - - int res = -1; - fhandler_base *fh; - - if (!(fh = build_fh_name (name, NULL, fmode, stat_suffixes))) - goto error; - - if (fh->error ()) - { - debug_printf ("got %d error from build_fh_name", fh->error ()); - set_errno (fh->error ()); - } - else - res = fh->fchown (uid, gid); - - delete fh; - error: - syscall_printf ("%d = %schown (%s,...)", - res, (fmode & PC_SYM_NOFOLLOW) ? "l" : "", name); - return res; -} - -extern "C" int -chown32 (const char * name, __uid32_t uid, __gid32_t gid) -{ - return chown_worker (name, PC_SYM_FOLLOW, uid, gid); -} - -extern "C" int -chown (const char * name, __uid16_t uid, __gid16_t gid) -{ - return chown_worker (name, PC_SYM_FOLLOW, - uid16touid32 (uid), gid16togid32 (gid)); -} - -extern "C" int -lchown32 (const char * name, __uid32_t uid, __gid32_t gid) -{ - return chown_worker (name, PC_SYM_NOFOLLOW, uid, gid); -} - -extern "C" int -lchown (const char * name, __uid16_t uid, __gid16_t gid) -{ - return chown_worker (name, PC_SYM_NOFOLLOW, - uid16touid32 (uid), gid16togid32 (gid)); -} - -extern "C" int -fchown32 (int fd, __uid32_t uid, __gid32_t gid) -{ - if (!wincap.has_security ()) // real chown only works on NT - return 0; // return zero (and do nothing) under Windows 9x - - cygheap_fdget cfd (fd); - if (cfd < 0) - { - syscall_printf ("-1 = fchown (%d,...)", fd); - return -1; - } - - int res = cfd->fchown (uid, gid); - - syscall_printf ("%d = fchown (%s,...)", res, cfd->get_name ()); - return res; -} - -extern "C" int -fchown (int fd, __uid16_t uid, __gid16_t gid) -{ - return fchown32 (fd, uid16touid32 (uid), gid16togid32 (gid)); -} - -/* umask: POSIX 5.3.3.1 */ -extern "C" mode_t -umask (mode_t mask) -{ - mode_t oldmask; - - oldmask = cygheap->umask; - cygheap->umask = mask & 0777; - return oldmask; -} - -int -chmod_device (path_conv& pc, mode_t mode) -{ - return mknod_worker (pc, pc.dev.mode & S_IFMT, mode, pc.dev.major, pc.dev.minor); -} - -/* chmod: POSIX 5.6.4.1 */ -extern "C" int -chmod (const char *path, mode_t mode) -{ - int res = -1; - fhandler_base *fh; - if (!(fh = build_fh_name (path, NULL, PC_SYM_FOLLOW, stat_suffixes))) - goto error; - - if (fh->error ()) - { - debug_printf ("got %d error from build_fh_name", fh->error ()); - set_errno (fh->error ()); - } - else - res = fh->fchmod (mode); - - delete fh; - error: - syscall_printf ("%d = chmod (%s, %p)", res, path, mode); - return res; -} - -/* fchmod: P96 5.6.4.1 */ - -extern "C" int -fchmod (int fd, mode_t mode) -{ - cygheap_fdget cfd (fd); - if (cfd < 0) - { - syscall_printf ("-1 = fchmod (%d, 0%o)", fd, mode); - return -1; - } - - return cfd->fchmod (mode); -} - -static void -stat64_to_stat32 (struct __stat64 *src, struct __stat32 *dst) -{ - dst->st_dev = ((src->st_dev >> 8) & 0xff00) | (src->st_dev & 0xff); - dst->st_ino = ((unsigned) (src->st_ino >> 32)) | (unsigned) src->st_ino; - dst->st_mode = src->st_mode; - dst->st_nlink = src->st_nlink; - dst->st_uid = src->st_uid; - dst->st_gid = src->st_gid; - dst->st_rdev = ((src->st_rdev >> 8) & 0xff00) | (src->st_rdev & 0xff); - dst->st_size = src->st_size; - dst->st_atim = src->st_atim; - dst->st_mtim = src->st_mtim; - dst->st_ctim = src->st_ctim; - dst->st_blksize = src->st_blksize; - dst->st_blocks = src->st_blocks; -} - -extern "C" int -fstat64 (int fd, struct __stat64 *buf) -{ - int res; - - cygheap_fdget cfd (fd); - if (cfd < 0) - res = -1; - else - { - memset (buf, 0, sizeof (struct __stat64)); - res = cfd->fstat (buf); - if (!res) - { - if (!buf->st_ino) - buf->st_ino = cfd->get_namehash (); - if (!buf->st_dev) - buf->st_dev = cfd->get_device (); - if (!buf->st_rdev) - buf->st_rdev = buf->st_dev; - } - } - - syscall_printf ("%d = fstat (%d, %p)", res, fd, buf); - return res; -} - -extern "C" int -_fstat64_r (struct _reent *ptr, int fd, struct __stat64 *buf) -{ - int ret; - - if ((ret = fstat64 (fd, buf)) == -1) - ptr->_errno = get_errno (); - return ret; -} - -extern "C" int -fstat (int fd, struct __stat32 *buf) -{ - struct __stat64 buf64; - int ret = fstat64 (fd, &buf64); - if (!ret) - stat64_to_stat32 (&buf64, buf); - return ret; -} - -extern "C" int -_fstat_r (struct _reent *ptr, int fd, struct __stat32 *buf) -{ - int ret; - - if ((ret = fstat (fd, buf)) == -1) - ptr->_errno = get_errno (); - return ret; -} - -/* fsync: P96 6.6.1.1 */ -extern "C" int -fsync (int fd) -{ - cygheap_fdget cfd (fd); - if (cfd < 0) - { - syscall_printf ("-1 = fsync (%d)", fd); - return -1; - } - return cfd->fsync (); -} - -EXPORT_ALIAS (fsync, fdatasync) - -static void -sync_worker (const char *vol) -{ - HANDLE fh = CreateFileA (vol, GENERIC_WRITE, wincap.shared (), - &sec_none_nih, OPEN_EXISTING, 0, NULL); - if (fh != INVALID_HANDLE_VALUE) - { - FlushFileBuffers (fh); - CloseHandle (fh); - } - else - debug_printf ("Open failed with %E"); -} - -/* sync: SUSv3 */ -extern "C" void -sync () -{ - char vol[CYG_MAX_PATH]; - - if (wincap.has_guid_volumes ()) /* Win2k and newer */ - { - char a_drive[CYG_MAX_PATH] = {0}; - char b_drive[CYG_MAX_PATH] = {0}; - - if (is_floppy ("A:")) - GetVolumeNameForVolumeMountPointA ("A:\\", a_drive, CYG_MAX_PATH); - if (is_floppy ("B:")) - GetVolumeNameForVolumeMountPointA ("B:\\", a_drive, CYG_MAX_PATH); - - HANDLE sh = FindFirstVolumeA (vol, CYG_MAX_PATH); - if (sh != INVALID_HANDLE_VALUE) - { - do - { - debug_printf ("Try volume %s", vol); - - /* Check vol for being a floppy on A: or B:. Skip them. */ - if (strcasematch (vol, a_drive) || strcasematch (vol, b_drive)) - { - debug_printf ("Is floppy, don't sync"); - continue; - } - - /* Eliminate trailing backslash. */ - vol[strlen (vol) - 1] = '\0'; - sync_worker (vol); - } - while (FindNextVolumeA (sh, vol, CYG_MAX_PATH)); - FindVolumeClose (sh); - } - } - else if (wincap.is_winnt ()) /* 9x has no concept for opening volumes */ - { - DWORD drives = GetLogicalDrives (); - DWORD mask = 1; - /* Skip floppies on A: and B: as in setmntent. */ - if ((drives & 1) && is_floppy ("A:")) - drives &= ~1; - if ((drives & 2) && is_floppy ("B:")) - drives &= ~2; - strcpy (vol, "\\\\.\\A:"); - do - { - /* Geeh. Try to sync only non-floppy drives. */ - if (drives & mask) - { - debug_printf ("Try volume %s", vol); - sync_worker (vol); - } - vol[4]++; - } - while ((mask <<= 1) <= 1 << 25); - } -} - -/* Cygwin internal */ -static int __stdcall -stat_worker (const char *name, struct __stat64 *buf, int nofollow) -{ - int res = -1; - fhandler_base *fh = NULL; - - myfault efault; - if (efault.faulted (EFAULT)) - goto error; - - if (!(fh = build_fh_name (name, NULL, nofollow ? PC_SYM_NOFOLLOW : PC_SYM_FOLLOW, - stat_suffixes))) - goto error; - - if (fh->error ()) - { - debug_printf ("got %d error from build_fh_name", fh->error ()); - set_errno (fh->error ()); - } - else if (fh->exists ()) - { - debug_printf ("(%s, %p, %d, %p), file_attributes %d", name, buf, nofollow, - fh, (DWORD) *fh); - memset (buf, 0, sizeof (*buf)); - res = fh->fstat (buf); - if (!res) - { - if (!buf->st_ino) - buf->st_ino = fh->get_namehash (); - if (!buf->st_dev) - buf->st_dev = fh->get_device (); - if (!buf->st_rdev) - buf->st_rdev = buf->st_dev; - } - } - else - set_errno (ENOENT); - - delete fh; - error: - MALLOC_CHECK; - syscall_printf ("%d = (%s, %p)", res, name, buf); - return res; -} - -extern "C" int -stat64 (const char *name, struct __stat64 *buf) -{ - syscall_printf ("entering"); - return stat_worker (name, buf, 0); -} - -extern "C" int -_stat64_r (struct _reent *ptr, const char *name, struct __stat64 *buf) -{ - int ret; - - if ((ret = stat64 (name, buf)) == -1) - ptr->_errno = get_errno (); - return ret; -} - -extern "C" int -stat (const char *name, struct __stat32 *buf) -{ - struct __stat64 buf64; - int ret = stat64 (name, &buf64); - if (!ret) - stat64_to_stat32 (&buf64, buf); - return ret; -} - -extern "C" int -_stat_r (struct _reent *ptr, const char *name, struct __stat32 *buf) -{ - int ret; - - if ((ret = stat (name, buf)) == -1) - ptr->_errno = get_errno (); - return ret; -} - -/* lstat: Provided by SVR4 and 4.3+BSD, POSIX? */ -extern "C" int -lstat64 (const char *name, struct __stat64 *buf) -{ - syscall_printf ("entering"); - return stat_worker (name, buf, 1); -} - -/* lstat: Provided by SVR4 and 4.3+BSD, POSIX? */ -extern "C" int -lstat (const char *name, struct __stat32 *buf) -{ - struct __stat64 buf64; - int ret = lstat64 (name, &buf64); - if (!ret) - stat64_to_stat32 (&buf64, buf); - return ret; -} - -extern "C" int -access (const char *fn, int flags) -{ - // flags were incorrectly specified - int res = -1; - if (flags & ~(F_OK|R_OK|W_OK|X_OK)) - set_errno (EINVAL); - else - { - fhandler_base *fh = build_fh_name (fn, NULL, PC_SYM_FOLLOW, stat_suffixes); - if (fh) - { - res = fh->fhaccess (flags); - delete fh; - } - } - debug_printf ("returning %d", res); - return res; -} - -extern "C" int -rename (const char *oldpath, const char *newpath) -{ - int res = 0; - char *lnk_suffix = NULL; - bool no_lnk_file_exists = false; - - path_conv real_old (oldpath, PC_SYM_NOFOLLOW, - transparent_exe ? stat_suffixes : NULL); - - if (real_old.error) - { - syscall_printf ("-1 = rename (%s, %s)", oldpath, newpath); - set_errno (real_old.error); - return -1; - } - - if (!real_old.exists ()) /* file to move doesn't exist */ - { - syscall_printf ("file to move doesn't exist"); - set_errno (ENOENT); - return -1; - } - - path_conv real_new (newpath, PC_SYM_NOFOLLOW, - transparent_exe ? stat_suffixes : NULL); - - char new_buf[CYG_MAX_PATH + 5]; - if (!real_new.error && !real_new.case_clash) - { - DWORD bintype; - int len; - - if (real_old.is_lnk_special ()) - { - if (real_new.exists ()) - { - /* This early directory test is necessary because the below test - tests against the name with attached .lnk suffix. To avoid - name collisions, we shouldn't rename a file to "foo.lnk" - if a "foo" directory exists. */ - if (real_new.isdir ()) - { - syscall_printf ("newpath is directory, but oldpath is not"); - set_errno (EISDIR); - return -1; - } - /* Shortcut hack, No. 3, part 1 */ - no_lnk_file_exists = true; - } - /* Shortcut hack. */ - strcpy (new_buf, newpath); - strcat (new_buf, ".lnk"); - newpath = new_buf; - real_new.check (newpath, PC_SYM_NOFOLLOW); - } - else if (transparent_exe - && !real_old.isdir () - && GetBinaryType (real_old, &bintype) - && (len = strlen (real_new)) > 4 - && !strcasematch ((const char *) real_new + len - 4, ".exe")) - { - /* Executable hack. */ - strcpy (new_buf, newpath); - strcat (new_buf, ".exe"); - newpath = new_buf; - real_new.check (newpath, PC_SYM_NOFOLLOW); - } - } - - if (real_new.error || real_new.case_clash) - { - syscall_printf ("-1 = rename (%s, %s)", oldpath, newpath); - set_errno (real_new.case_clash ? ECASECLASH : real_new.error); - return -1; - } - - if (real_new.isdir () && !real_old.isdir ()) - { - syscall_printf ("newpath is directory, but oldpath is not"); - set_errno (EISDIR); - return -1; - } - - /* Destination file exists and is read only, change that or else - the rename won't work. */ - if (real_new.has_attribute (FILE_ATTRIBUTE_READONLY)) - SetFileAttributes (real_new, (DWORD) real_new & ~FILE_ATTRIBUTE_READONLY); - - /* Shortcut hack No. 2, part 1 */ - if (!real_old.issymlink () && !real_new.error && real_new.is_lnk_special () - && (lnk_suffix = strrchr (real_new.get_win32 (), '.'))) - *lnk_suffix = '\0'; - - if (MoveFile (real_old, real_new)) - goto done; - - res = -1; - - /* Test for an attempt to make a directory a subdirectory of itself first. - This test has to be made before any attempt to remove the potentially - existing file or directory real_new. Otherwise we end up with a - non-moved directory *and* a deleted read_new path. Also this case - has to generate an EINVAL in all circumstances, - - NB: We could test this also before calling MoveFile but the idea is - that this is a somewhat seldom case and we like to avoid expensive - string comparison. So we allow MoveFile to fail and test the error - code instead. - - The order in the condition is (hopefully) trimmed for doing the least - expensive stuff first. Nevertheless it would be nice if 9x could - generate the same error codes as NT. - NT generates ERROR_SHARING_VIOLATION in all cases, while 9x generates - ERROR_ACCESS_DENIED if the target path doesn't exist, - ERROR_ALREADY_EXISTS otherwise */ - int len; - DWORD lasterr; - lasterr = GetLastError (); - if (real_old.isdir () - && ((lasterr == ERROR_SHARING_VIOLATION && wincap.has_move_file_ex ()) - || (lasterr == ERROR_ACCESS_DENIED && !real_new.exists () - && !wincap.has_move_file_ex ()) - || (lasterr == ERROR_ALREADY_EXISTS && real_new.exists () - && !wincap.has_move_file_ex ())) - && (len = strlen (real_old), strncasematch (real_old, real_new, len)) - && real_new[len] == '\\') - SetLastError (ERROR_INVALID_PARAMETER); - else if (real_new.isdir ()) - { - /* Since neither MoveFileEx(MOVEFILE_REPLACE_EXISTING) nor DeleteFile - allow to remove directories, this case is handled separately. */ - if (!RemoveDirectoryA (real_new)) - { - syscall_printf ("Can't remove target directory"); - /* On 9X ERROR_ACCESS_DENIED is returned if you try to remove - a non-empty directory. */ - if (GetLastError () == ERROR_ACCESS_DENIED - && wincap.access_denied_on_delete ()) - SetLastError (ERROR_DIR_NOT_EMPTY); - } - else if (MoveFile (real_old, real_new)) - res = 0; - } - else if (wincap.has_move_file_ex ()) - { - if (MoveFileEx (real_old.get_win32 (), real_new.get_win32 (), - MOVEFILE_REPLACE_EXISTING)) - res = 0; - } - else if (lasterr == ERROR_ALREADY_EXISTS || lasterr == ERROR_FILE_EXISTS) - { - syscall_printf ("try win95 hack"); - for (int i = 0; i < 2; i++) - { - if (!DeleteFileA (real_new) && - GetLastError () != ERROR_FILE_NOT_FOUND) - { - syscall_printf ("deleting %s to be paranoid", - real_new.get_win32 ()); - break; - } - else if (MoveFile (real_old, real_new)) - { - res = 0; - break; - } - } - } - -done: - if (res) - { - __seterrno (); - /* Reset R/O attributes if neccessary. */ - if (real_new.has_attribute (FILE_ATTRIBUTE_READONLY)) - SetFileAttributes (real_new, real_new); - } - else - { - /* make the new file have the permissions of the old one */ - DWORD attr = real_old; -#ifdef HIDDEN_DOT_FILES - char *c = strrchr (real_old.get_win32 (), '\\'); - if ((c && c[1] == '.') || *real_old.get_win32 () == '.') - attr &= ~FILE_ATTRIBUTE_HIDDEN; - c = strrchr (real_new.get_win32 (), '\\'); - if ((c && c[1] == '.') || *real_new.get_win32 () == '.') - attr |= FILE_ATTRIBUTE_HIDDEN; -#endif - SetFileAttributes (real_new, attr); - - /* Shortcut hack, No. 2, part 2 */ - /* if the new filename was an existing shortcut, remove it now if the - new filename is equal to the shortcut name without .lnk suffix. */ - if (lnk_suffix) - { - *lnk_suffix = '.'; - DeleteFile (real_new); - } - /* Shortcut hack, No. 3, part 2 */ - /* If a file with the given name exists, it must be deleted after the - symlink has been renamed. Otherwise we end up with two files of - the same name in the directory, one file "newpath", which already - exited before rename has been called, and one file "newpath.lnk", - which is the result of the rename operation. */ - else if (no_lnk_file_exists) - { - lnk_suffix = strrchr (real_new.get_win32 (), '.'); - *lnk_suffix = '\0'; - DeleteFile (real_new); - } - } - - syscall_printf ("%d = rename (%s, %s)", res, (char *) real_old, - (char *) real_new); - - return res; -} - -extern "C" int -system (const char *cmdstring) -{ - pthread_testcancel (); - - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - int res; - const char* command[4]; - - if (cmdstring == NULL) - return 1; - - command[0] = "sh"; - command[1] = "-c"; - command[2] = cmdstring; - command[3] = (const char *) NULL; - - if ((res = spawnvp (_P_SYSTEM, "/bin/sh", command)) == -1) - { - // when exec fails, return value should be as if shell - // executed exit (127) - res = 127; - } - - return res; -} - -extern "C" int -setdtablesize (int size) -{ - if (size <= (int)cygheap->fdtab.size || cygheap->fdtab.extend (size - cygheap->fdtab.size)) - return 0; - - return -1; -} - -extern "C" int -getdtablesize () -{ - return cygheap->fdtab.size > OPEN_MAX ? cygheap->fdtab.size : OPEN_MAX; -} - -extern "C" size_t -getpagesize () -{ - if (!system_info.dwPageSize) - GetSystemInfo (&system_info); - return (size_t) system_info.dwAllocationGranularity; -} - -size_t -getsystempagesize () -{ - if (!system_info.dwAllocationGranularity) - GetSystemInfo (&system_info); - return (size_t) system_info.dwPageSize; -} - -static int -check_posix_perm (const char *fname, int v) -{ - /* Windows 95/98/ME don't support file system security at all. */ - if (!wincap.has_security ()) - return 0; - - /* ntea is ok for supporting permission bits but it doesn't support - full POSIX security settings. */ - if (v == _PC_POSIX_PERMISSIONS && allow_ntea) - return 1; - - if (!allow_ntsec) - return 0; - - char *root = rootdir (fname, (char *)alloca (strlen (fname))); - - if (!allow_smbntsec - && ((root[0] == '\\' && root[1] == '\\') - || GetDriveType (root) == DRIVE_REMOTE)) - return 0; - - DWORD vsn, len, flags; - if (!GetVolumeInformation (root, NULL, 0, &vsn, &len, &flags, NULL, 16)) - { - __seterrno (); - return 0; - } - - return (flags & FS_PERSISTENT_ACLS) ? 1 : 0; -} - -/* FIXME: not all values are correct... */ -extern "C" long int -fpathconf (int fd, int v) -{ - cygheap_fdget cfd (fd); - if (cfd < 0) - return -1; - switch (v) - { - case _PC_LINK_MAX: - return _POSIX_LINK_MAX; - case _PC_MAX_CANON: - case _PC_MAX_INPUT: - if (isatty (fd)) - return _POSIX_MAX_CANON; - else - { - set_errno (EBADF); - return -1; - } - case _PC_NAME_MAX: - case _PC_PATH_MAX: - return PATH_MAX; - case _PC_PIPE_BUF: - return PIPE_BUF; - case _PC_CHOWN_RESTRICTED: - case _PC_NO_TRUNC: - return -1; - case _PC_VDISABLE: - if (cfd->is_tty ()) - return -1; - else - { - set_errno (EBADF); - return -1; - } - case _PC_POSIX_PERMISSIONS: - case _PC_POSIX_SECURITY: - if (cfd->get_device () == FH_FS) - return check_posix_perm (cfd->get_win32_name (), v); - set_errno (EINVAL); - return -1; - default: - set_errno (EINVAL); - return -1; - } -} - -extern "C" long int -pathconf (const char *file, int v) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (!*file) - { - set_errno (ENOENT); - return -1; - } - switch (v) - { - case _PC_PATH_MAX: - return PATH_MAX - strlen (file); - case _PC_NAME_MAX: - return PATH_MAX; - case _PC_LINK_MAX: - return _POSIX_LINK_MAX; - case _PC_MAX_CANON: - case _PC_MAX_INPUT: - return _POSIX_MAX_CANON; - case _PC_PIPE_BUF: - return PIPE_BUF; - case _PC_CHOWN_RESTRICTED: - case _PC_NO_TRUNC: - return -1; - case _PC_VDISABLE: - return -1; - case _PC_POSIX_PERMISSIONS: - case _PC_POSIX_SECURITY: - { - path_conv full_path (file, PC_SYM_FOLLOW, - transparent_exe ? stat_suffixes : NULL); - if (full_path.error) - { - set_errno (full_path.error); - return -1; - } - if (full_path.is_auto_device ()) - { - set_errno (EINVAL); - return -1; - } - return check_posix_perm (full_path, v); - } - default: - set_errno (EINVAL); - return -1; - } -} - -extern "C" int -ttyname_r (int fd, char *buf, size_t buflen) -{ - int ret = 0; - myfault efault; - if (efault.faulted ()) - ret = EFAULT; - else - { - cygheap_fdget cfd (fd, true); - if (cfd < 0) - ret = EBADF; - else if (!cfd->is_tty ()) - ret = ENOTTY; - else if (buflen < strlen (cfd->ttyname ()) + 1) - ret = ERANGE; - else - strcpy (buf, cfd->ttyname ()); - } - debug_printf ("returning %d tty: %s", ret, ret ? "NULL" : buf); - return ret; -} - -extern "C" char * -ttyname (int fd) -{ - static char name[TTY_NAME_MAX + 1]; - int ret = ttyname_r (fd, name, TTY_NAME_MAX + 1); - if (ret) - { - set_errno (ret); - return NULL; - } - return name; -} - -extern "C" char * -ctermid (char *str) -{ - static NO_COPY char buf[16]; - if (str == NULL) - str = buf; - if (!real_tty_attached (myself)) - strcpy (str, "/dev/conin"); - else - __small_sprintf (str, "/dev/tty%d", myself->ctty); - return str; -} - -/* Tells stdio if it should do the cr/lf conversion for this file */ -extern "C" int -_cygwin_istext_for_stdio (int fd) -{ - if (CYGWIN_VERSION_OLD_STDIO_CRLF_HANDLING) - { - syscall_printf ("fd %d: old API", fd); - return 0; /* we do it for old apps, due to getc/putc macros */ - } - - cygheap_fdget cfd (fd, false, false); - if (cfd < 0) - { - syscall_printf ("fd %d: not open", fd); - return 0; - } - -#if 0 - if (cfd->get_device () != FH_FS) - { - syscall_printf ("fd not disk file. Defaulting to binary."); - return 0; - } -#endif - - if (cfd->wbinary () || cfd->rbinary ()) - { - syscall_printf ("fd %d: opened as binary", fd); - return 0; - } - - syscall_printf ("fd %d: defaulting to text", fd); - return 1; -} - -/* internal newlib function */ -extern "C" int _fwalk (struct _reent *ptr, int (*function) (FILE *)); - -static int -setmode_helper (FILE *f) -{ - if (fileno (f) != _my_tls.locals.setmode_file) - { - syscall_printf ("improbable, but %d != %d", fileno (f), _my_tls.locals.setmode_file); - return 0; - } - syscall_printf ("file was %s now %s", f->_flags & __SCLE ? "text" : "binary", - _my_tls.locals.setmode_mode & O_TEXT ? "text" : "binary"); - if (_my_tls.locals.setmode_mode & O_TEXT) - f->_flags |= __SCLE; - else - f->_flags &= ~__SCLE; - return 0; -} - -extern "C" int -getmode (int fd) -{ - cygheap_fdget cfd (fd); - if (cfd < 0) - return -1; - - return cfd->get_flags () & (O_BINARY | O_TEXT); -} - -/* Set a file descriptor into text or binary mode, returning the - previous mode. */ - -extern "C" int -setmode (int fd, int mode) -{ - cygheap_fdget cfd (fd); - if (cfd < 0) - return -1; - if (mode != O_BINARY && mode != O_TEXT && mode != 0) - { - set_errno (EINVAL); - return -1; - } - - /* Note that we have no way to indicate the case that writes are - binary but not reads, or vice-versa. These cases can arise when - using the tty or console interface. People using those - interfaces should not use setmode. */ - - int res; - if (cfd->wbinary () && cfd->rbinary ()) - res = O_BINARY; - else if (cfd->wbinset () && cfd->rbinset ()) - res = O_TEXT; /* Specifically set O_TEXT */ - else - res = 0; - - if (!mode) - cfd->reset_to_open_binmode (); - else - cfd->set_flags ((cfd->get_flags () & ~(O_TEXT | O_BINARY)) | mode); - - syscall_printf ("(%d<%s>, %p) returning %s", fd, cfd->get_name (), - mode, res & O_TEXT ? "text" : "binary"); - return res; -} - -extern "C" int -cygwin_setmode (int fd, int mode) -{ - int res = setmode (fd, mode); - if (res != -1) - { - _my_tls.locals.setmode_file = fd; - if (_cygwin_istext_for_stdio (fd)) - _my_tls.locals.setmode_mode = O_TEXT; - else - _my_tls.locals.setmode_mode = O_BINARY; - _fwalk (_GLOBAL_REENT, setmode_helper); - } - return res; -} - -extern "C" int -ftruncate64 (int fd, _off64_t length) -{ - int res = -1; - cygheap_fdget cfd (fd); - if (cfd >= 0) - res = cfd->ftruncate (length); - else - set_errno (EBADF); - syscall_printf ("%d = ftruncate (%d, %D)", res, fd, length); - return res; -} - -/* ftruncate: P96 5.6.7.1 */ -extern "C" int -ftruncate (int fd, _off_t length) -{ - return ftruncate64 (fd, (_off64_t)length); -} - -/* truncate: Provided by SVR4 and 4.3+BSD. Not part of POSIX.1 or XPG3 */ -extern "C" int -truncate64 (const char *pathname, _off64_t length) -{ - int fd; - int res = -1; - - fd = open (pathname, O_RDWR); - - if (fd != -1) - { - res = ftruncate64 (fd, length); - close (fd); - } - syscall_printf ("%d = truncate (%s, %D)", res, pathname, length); - - return res; -} - -/* truncate: Provided by SVR4 and 4.3+BSD. Not part of POSIX.1 or XPG3 */ -extern "C" int -truncate (const char *pathname, _off_t length) -{ - return truncate64 (pathname, (_off64_t)length); -} - -extern "C" long -get_osfhandle (int fd) -{ - long res; - - cygheap_fdget cfd (fd); - if (cfd >= 0) - res = (long) cfd->get_handle (); - else - res = -1; - - syscall_printf ("%d = get_osfhandle (%d)", res, fd); - return res; -} - -extern "C" int -statvfs (const char *fname, struct statvfs *sfs) -{ - int ret = -1; - char root[CYG_MAX_PATH]; - - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (!*fname) - { - set_errno (ENOENT); - return -1; - } - - syscall_printf ("statfs %s", fname); - - if (!sfs) - { - set_errno (EFAULT); - return -1; - } - - path_conv full_path (fname, PC_SYM_FOLLOW); - if (!rootdir (full_path, root)) - { - set_errno (ENOTDIR); - return -1; - } - - ULARGE_INTEGER availb, freeb, totalb; - DWORD spc, bps, availc, freec, totalc, vsn, maxlen, flags; - BOOL status, statusex; - - push_thread_privilege (SE_CHANGE_NOTIFY_PRIV, true); - - /* GetDiskFreeSpaceEx must be called before GetDiskFreeSpace on - WinME, to avoid the MS KB 314417 bug */ - statusex = GetDiskFreeSpaceEx (root, &availb, &totalb, &freeb); - status = GetDiskFreeSpace (root, &spc, &bps, &freec, &totalc); - if (!status && statusex) - { - /* Grrr, this can happen on 9x when a share isn't attached to - a drive letter. Fake, fake, hoorah. */ - status = TRUE; - bps = 512; - spc = 8; - while ((totalb.QuadPart % (spc*bps)) && spc > 1) - spc >>= 1; - } - if (status) - { - if (statusex) - { - availc = availb.QuadPart / (spc*bps); - totalc = totalb.QuadPart / (spc*bps); - freec = freeb.QuadPart / (spc*bps); - if (freec > availc) - { - /* Quotas active. We can't trust totalc. */ - HANDLE hdl = CreateFile (full_path, READ_CONTROL, - wincap.shared (), &sec_none_nih, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, NULL); - if (hdl == INVALID_HANDLE_VALUE) - debug_printf ("CreateFile (%s) failed, %E", (char *) full_path); - else - { - NTFS_VOLUME_DATA_BUFFER nvdb; - DWORD bytes; - if (!DeviceIoControl (hdl, FSCTL_GET_NTFS_VOLUME_DATA, NULL, - 0, &nvdb, sizeof nvdb, &bytes, NULL)) - debug_printf ("DeviceIoControl (%s) failed, %E", (char *) full_path); - else - totalc = nvdb.TotalClusters.QuadPart; - CloseHandle (hdl); - } - } - } - else - availc = freec; - if (GetVolumeInformation (root, NULL, 0, &vsn, &maxlen, &flags, NULL, 0)) - { - sfs->f_bsize = spc*bps; - sfs->f_frsize = spc*bps; - sfs->f_blocks = totalc; - sfs->f_bfree = freec; - sfs->f_bavail = availc; - sfs->f_files = ULONG_MAX; - sfs->f_ffree = ULONG_MAX; - sfs->f_favail = ULONG_MAX; - sfs->f_fsid = vsn; - sfs->f_flag = flags; - sfs->f_namemax = maxlen; - ret = 0; - } - } - if (ret) - __seterrno (); - - pop_thread_privilege (); - - return ret; -} - -extern "C" int -fstatvfs (int fd, struct statvfs *sfs) -{ - cygheap_fdget cfd (fd); - if (cfd < 0) - return -1; - return statvfs (cfd->get_name (), sfs); -} - -extern "C" int -statfs (const char *fname, struct statfs *sfs) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - struct statvfs vfs; - int ret = statvfs (fname, &vfs); - if (!ret) - { - sfs->f_type = vfs.f_flag; - sfs->f_bsize = vfs.f_bsize; - sfs->f_blocks = vfs.f_blocks; - sfs->f_bavail = vfs.f_bavail; - sfs->f_bfree = vfs.f_bfree; - sfs->f_files = -1; - sfs->f_ffree = -1; - sfs->f_fsid = vfs.f_fsid; - sfs->f_namelen = vfs.f_namemax; - } - return ret; -} - -extern "C" int -fstatfs (int fd, struct statfs *sfs) -{ - cygheap_fdget cfd (fd); - if (cfd < 0) - return -1; - return statfs (cfd->get_name (), sfs); -} - -/* setpgid: POSIX 4.3.3.1 */ -extern "C" int -setpgid (pid_t pid, pid_t pgid) -{ - int res = -1; - if (pid == 0) - pid = getpid (); - if (pgid == 0) - pgid = pid; - - if (pgid < 0) - set_errno (EINVAL); - else - { - pinfo p (pid, PID_MAP_RW); - if (!p) - set_errno (ESRCH); - else if (p->pgid == pgid) - res = 0; - /* A process may only change the process group of itself and its children */ - else if (p != myself && p->ppid != myself->pid) - set_errno (EPERM); - else - { - p->pgid = pgid; - if (p->pid != p->pgid) - p->set_has_pgid_children (0); - res = 0; - } - } - - syscall_printf ("pid %d, pgid %d, res %d", pid, pgid, res); - return res; -} - -extern "C" pid_t -getpgid (pid_t pid) -{ - if (pid == 0) - pid = getpid (); - - pinfo p (pid); - if (p == 0) - { - set_errno (ESRCH); - return -1; - } - return p->pgid; -} - -extern "C" int -setpgrp (void) -{ - return setpgid (0, 0); -} - -extern "C" pid_t -getpgrp (void) -{ - return getpgid (0); -} - -extern "C" char * -ptsname (int fd) -{ - cygheap_fdget cfd (fd); - if (cfd < 0) - return 0; - return (char *) (cfd->ptsname ()); -} - -/* FIXME: what is this? */ -extern "C" int __declspec(dllexport) -regfree () -{ - return 0; -} - -static int __stdcall -mknod_worker (const char *path, mode_t type, mode_t mode, _major_t major, - _minor_t minor) -{ - char buf[sizeof (":\\00000000:00000000:00000000") + CYG_MAX_PATH]; - sprintf (buf, ":\\%x:%x:%x", major, minor, - type | (mode & (S_IRWXU | S_IRWXG | S_IRWXO))); - return symlink_worker (buf, path, true, true); -} - -extern "C" int -mknod32 (const char *path, mode_t mode, __dev32_t dev) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (!*path) - { - set_errno (ENOENT); - return -1; - } - - if (strlen (path) >= CYG_MAX_PATH) - return -1; - - path_conv w32path (path, PC_SYM_NOFOLLOW); - if (w32path.exists ()) - { - set_errno (EEXIST); - return -1; - } - - mode_t type = mode & S_IFMT; - _major_t major = _major (dev); - _minor_t minor = _minor (dev); - switch (type) - { - case S_IFCHR: - case S_IFBLK: - break; - - case S_IFIFO: - major = _major (FH_FIFO); - minor = _minor (FH_FIFO); - break; - - case 0: - case S_IFREG: - { - int fd = open (path, O_CREAT, mode); - if (fd < 0) - return -1; - close (fd); - return 0; - } - - default: - set_errno (EINVAL); - return -1; - } - - return mknod_worker (w32path, type, mode, major, minor); -} - -extern "C" int -mknod (const char *_path, mode_t mode, __dev16_t dev) -{ - return mknod32 (_path, mode, (__dev32_t) dev); -} - -extern "C" int -mkfifo (const char *path, mode_t mode) -{ - return mknod32 (path, (mode & ~S_IFMT) | S_IFIFO, 0); -} - -/* seteuid: standards? */ -extern "C" int -seteuid32 (__uid32_t uid) -{ - debug_printf ("uid: %u myself->uid: %u myself->gid: %u", - uid, myself->uid, myself->gid); - - if (uid == myself->uid && !cygheap->user.groups.ischanged) - { - debug_printf ("Nothing happens"); - return 0; - } - - cygsid usersid; - user_groups &groups = cygheap->user.groups; - HANDLE new_token = INVALID_HANDLE_VALUE; - struct passwd * pw_new; - bool token_is_internal, issamesid = false; - - pw_new = internal_getpwuid (uid); - if (!wincap.has_security () && pw_new) - { - load_registry_hive (pw_new->pw_name); - goto success_9x; - } - if (!usersid.getfrompw (pw_new)) - { - set_errno (EINVAL); - return -1; - } - - cygheap->user.deimpersonate (); - - /* Verify if the process token is suitable. */ - if (verify_token (hProcToken, usersid, groups)) - new_token = hProcToken; - /* Verify if the external token is suitable */ - else if (cygheap->user.external_token != NO_IMPERSONATION - && verify_token (cygheap->user.external_token, usersid, groups)) - new_token = cygheap->user.external_token; - /* Verify if the current token (internal or former external) is suitable */ - else if (cygheap->user.curr_primary_token != NO_IMPERSONATION - && cygheap->user.curr_primary_token != cygheap->user.external_token - && verify_token (cygheap->user.curr_primary_token, usersid, groups, - &token_is_internal)) - new_token = cygheap->user.curr_primary_token; - /* Verify if the internal token is suitable */ - else if (cygheap->user.internal_token != NO_IMPERSONATION - && cygheap->user.internal_token != cygheap->user.curr_primary_token - && verify_token (cygheap->user.internal_token, usersid, groups, - &token_is_internal)) - new_token = cygheap->user.internal_token; - - debug_printf ("Found token %d", new_token); - - /* If no impersonation token is available, try to - authenticate using NtCreateToken () or subauthentication. */ - if (new_token == INVALID_HANDLE_VALUE) - { - new_token = create_token (usersid, groups, pw_new); - if (new_token == INVALID_HANDLE_VALUE) - { - /* create_token failed. Try subauthentication. */ - debug_printf ("create token failed, try subauthentication."); - new_token = subauth (pw_new); - if (new_token == INVALID_HANDLE_VALUE) - { - cygheap->user.reimpersonate (); - return -1; - } - } - /* Keep at most one internal token */ - if (cygheap->user.internal_token != NO_IMPERSONATION) - CloseHandle (cygheap->user.internal_token); - cygheap->user.internal_token = new_token; - } - - if (new_token != hProcToken) - { - /* Avoid having HKCU use default user */ - char name[128]; - load_registry_hive (usersid.string (name)); - - /* Try setting owner to same value as user. */ - if (!SetTokenInformation (new_token, TokenOwner, - &usersid, sizeof usersid)) - debug_printf ("SetTokenInformation(user.token, TokenOwner), %E"); - /* Try setting primary group in token to current group */ - if (!SetTokenInformation (new_token, TokenPrimaryGroup, - &groups.pgsid, sizeof (cygsid))) - debug_printf ("SetTokenInformation(user.token, TokenPrimaryGroup), %E"); - /* Try setting default DACL */ - PACL dacl_buf = (PACL) alloca (MAX_DACL_LEN (5)); - if (sec_acl (dacl_buf, true, true, usersid)) - { - TOKEN_DEFAULT_DACL tdacl = { dacl_buf }; - if (!SetTokenInformation (new_token, TokenDefaultDacl, - &tdacl, sizeof (tdacl))) - debug_printf ("SetTokenInformation (TokenDefaultDacl), %E"); - } - } - - issamesid = (usersid == cygheap->user.sid ()); - cygheap->user.set_sid (usersid); - cygheap->user.curr_primary_token = new_token == hProcToken ? NO_IMPERSONATION - : new_token; - if (cygheap->user.current_token != NO_IMPERSONATION) - { - CloseHandle (cygheap->user.current_token); - cygheap->user.current_token = NO_IMPERSONATION; - } - if (cygheap->user.curr_primary_token != NO_IMPERSONATION) - { - if (!DuplicateTokenEx (cygheap->user.curr_primary_token, MAXIMUM_ALLOWED, - &sec_none, SecurityImpersonation, - TokenImpersonation, &cygheap->user.current_token)) - { - __seterrno (); - cygheap->user.curr_primary_token = NO_IMPERSONATION; - return -1; - } - set_cygwin_privileges (cygheap->user.current_token); - } - if (!cygheap->user.reimpersonate ()) - { - __seterrno (); - return -1; - } - -success_9x: - cygheap->user.set_name (pw_new->pw_name); - myself->uid = uid; - groups.ischanged = FALSE; - if (!issamesid) - user_shared_initialize (true); - return 0; -} - -extern "C" int -seteuid (__uid16_t uid) -{ - return seteuid32 (uid16touid32 (uid)); -} - -/* setuid: POSIX 4.2.2.1 */ -extern "C" int -setuid32 (__uid32_t uid) -{ - int ret = seteuid32 (uid); - if (!ret) - cygheap->user.real_uid = myself->uid; - debug_printf ("real: %d, effective: %d", cygheap->user.real_uid, myself->uid); - return ret; -} - -extern "C" int -setuid (__uid16_t uid) -{ - return setuid32 (uid16touid32 (uid)); -} - -extern "C" int -setreuid32 (__uid32_t ruid, __uid32_t euid) -{ - int ret = 0; - bool tried = false; - __uid32_t old_euid = myself->uid; - - if (ruid != ILLEGAL_UID && cygheap->user.real_uid != ruid && euid != ruid) - tried = !(ret = seteuid32 (ruid)); - if (!ret && euid != ILLEGAL_UID) - ret = seteuid32 (euid); - if (tried && (ret || euid == ILLEGAL_UID) && seteuid32 (old_euid)) - system_printf ("Cannot restore original euid %u", old_euid); - if (!ret && ruid != ILLEGAL_UID) - cygheap->user.real_uid = ruid; - debug_printf ("real: %u, effective: %u", cygheap->user.real_uid, myself->uid); - return ret; -} - -extern "C" int -setreuid (__uid16_t ruid, __uid16_t euid) -{ - return setreuid32 (uid16touid32 (ruid), uid16touid32 (euid)); -} - -/* setegid: from System V. */ -extern "C" int -setegid32 (__gid32_t gid) -{ - debug_printf ("new egid: %u current: %u", gid, myself->gid); - - if (gid == myself->gid || !wincap.has_security ()) - { - myself->gid = gid; - return 0; - } - - user_groups * groups = &cygheap->user.groups; - cygsid gsid; - struct __group32 * gr = internal_getgrgid (gid); - - if (!gsid.getfromgr (gr)) - { - set_errno (EINVAL); - return -1; - } - myself->gid = gid; - - groups->update_pgrp (gsid); - if (cygheap->user.issetuid ()) - { - /* If impersonated, update impersonation token... */ - if (!SetTokenInformation (cygheap->user.primary_token (), - TokenPrimaryGroup, &gsid, sizeof gsid)) - debug_printf ("SetTokenInformation(primary_token, " - "TokenPrimaryGroup), %E"); - if (!SetTokenInformation (cygheap->user.token (), TokenPrimaryGroup, - &gsid, sizeof gsid)) - debug_printf ("SetTokenInformation(token, TokenPrimaryGroup), %E"); - } - cygheap->user.deimpersonate (); - if (!SetTokenInformation (hProcToken, TokenPrimaryGroup, &gsid, sizeof gsid)) - debug_printf ("SetTokenInformation(hProcToken, TokenPrimaryGroup), %E"); - if (!SetTokenInformation (hProcImpToken, TokenPrimaryGroup, &gsid, - sizeof gsid)) - debug_printf ("SetTokenInformation(hProcImpToken, TokenPrimaryGroup), %E"); - cygheap->user.reimpersonate (); - return 0; -} - -extern "C" int -setegid (__gid16_t gid) -{ - return setegid32 (gid16togid32 (gid)); -} - -/* setgid: POSIX 4.2.2.1 */ -extern "C" int -setgid32 (__gid32_t gid) -{ - int ret = setegid32 (gid); - if (!ret) - cygheap->user.real_gid = myself->gid; - return ret; -} - -extern "C" int -setgid (__gid16_t gid) -{ - int ret = setegid32 (gid16togid32 (gid)); - if (!ret) - cygheap->user.real_gid = myself->gid; - return ret; -} - -extern "C" int -setregid32 (__gid32_t rgid, __gid32_t egid) -{ - int ret = 0; - bool tried = false; - __gid32_t old_egid = myself->gid; - - if (rgid != ILLEGAL_GID && cygheap->user.real_gid != rgid && egid != rgid) - tried = !(ret = setegid32 (rgid)); - if (!ret && egid != ILLEGAL_GID) - ret = setegid32 (egid); - if (tried && (ret || egid == ILLEGAL_GID) && setegid32 (old_egid)) - system_printf ("Cannot restore original egid %u", old_egid); - if (!ret && rgid != ILLEGAL_GID) - cygheap->user.real_gid = rgid; - debug_printf ("real: %u, effective: %u", cygheap->user.real_gid, myself->gid); - return ret; -} - -extern "C" int -setregid (__gid16_t rgid, __gid16_t egid) -{ - return setregid32 (gid16togid32 (rgid), gid16togid32 (egid)); -} - -/* chroot: privileged Unix system call. */ -/* FIXME: Not privileged here. How should this be done? */ -extern "C" int -chroot (const char *newroot) -{ - path_conv path (newroot, PC_SYM_FOLLOW | PC_POSIX); - - int ret = -1; - if (path.error) - set_errno (path.error); - else if (!path.exists ()) - set_errno (ENOENT); - else if (!path.isdir ()) - set_errno (ENOTDIR); - else if (path.isspecial ()) - set_errno (EPERM); - else - { - getwinenv("PATH="); /* Save the native PATH */ - cygheap->root.set (path.normalized_path, path); - ret = 0; - } - - syscall_printf ("%d = chroot (%s)", ret ? get_errno () : 0, - newroot ? newroot : "NULL"); - return ret; -} - -extern "C" int -creat (const char *path, mode_t mode) -{ - return open (path, O_WRONLY | O_CREAT | O_TRUNC, mode); -} - -extern "C" void -__assertfail () -{ - exit (99); -} - -extern "C" int -getw (FILE *fp) -{ - int w, ret; - ret = fread (&w, sizeof (int), 1, fp); - return ret != 1 ? EOF : w; -} - -extern "C" int -putw (int w, FILE *fp) -{ - int ret; - ret = fwrite (&w, sizeof (int), 1, fp); - if (feof (fp) || ferror (fp)) - return -1; - return 0; -} - -extern "C" int -wcscmp (const wchar_t *s1, const wchar_t *s2) -{ - while (*s1 && *s1 == *s2) - { - s1++; - s2++; - } - - return (* (unsigned short *) s1) - (* (unsigned short *) s2); -} - -extern "C" size_t -wcslen (const wchar_t *s1) -{ - int l = 0; - while (s1[l]) - l++; - return l; -} - -/* FIXME: to do this right, maybe work out the usoft va_list machine - and use wsvprintfW instead? -*/ -extern "C" int -wprintf (const char *fmt, ...) -{ - va_list ap; - int ret; - - va_start (ap, fmt); - ret = vprintf (fmt, ap); - va_end (ap); - return ret; -} - -extern "C" int -vhangup () -{ - set_errno (ENOSYS); - return -1; -} - -extern "C" _PTR -memccpy (_PTR out, const _PTR in, int c, size_t len) -{ - const char *inc = (char *) in; - char *outc = (char *) out; - - while (len) - { - char x = *inc++; - *outc++ = x; - if (x == c) - return outc; - len --; - } - return 0; -} - -extern "C" int -setpriority (int which, id_t who, int value) -{ - DWORD prio = nice_to_winprio (value); - int error = 0; - - switch (which) - { - case PRIO_PROCESS: - if (!who) - who = myself->pid; - if ((pid_t) who == myself->pid) - { - if (!SetPriorityClass (hMainProc, prio)) - { - set_errno (EACCES); - return -1; - } - myself->nice = value; - debug_printf ("Set nice to %d", myself->nice); - return 0; - } - break; - case PRIO_PGRP: - if (!who) - who = myself->pgid; - break; - case PRIO_USER: - if (!who) - who = myself->uid; - break; - default: - set_errno (EINVAL); - return -1; - } - winpids pids ((DWORD) PID_MAP_RW); - for (DWORD i = 0; i < pids.npids; ++i) - { - _pinfo *p = pids[i]; - if (p) - { - switch (which) - { - case PRIO_PROCESS: - if ((pid_t) who != p->pid) - continue; - break; - case PRIO_PGRP: - if ((pid_t) who != p->pgid) - continue; - break; - case PRIO_USER: - if ((__uid32_t) who != p->uid) - continue; - break; - } - HANDLE proc_h = OpenProcess (PROCESS_SET_INFORMATION, FALSE, - p->dwProcessId); - if (!proc_h) - error = EPERM; - else - { - if (!SetPriorityClass (proc_h, prio)) - error = EACCES; - else - p->nice = value; - CloseHandle (proc_h); - } - } - } - pids.reset (); - if (error) - { - set_errno (error); - return -1; - } - return 0; -} - -extern "C" int -getpriority (int which, id_t who) -{ - int nice = NZERO * 2; /* Illegal value */ - - switch (which) - { - case PRIO_PROCESS: - if (!who) - who = myself->pid; - if ((pid_t) who == myself->pid) - return myself->nice; - break; - case PRIO_PGRP: - if (!who) - who = myself->pgid; - break; - case PRIO_USER: - if (!who) - who = myself->uid; - break; - default: - set_errno (EINVAL); - return -1; - } - winpids pids ((DWORD) 0); - for (DWORD i = 0; i < pids.npids; ++i) - { - _pinfo *p = pids[i]; - if (p) - switch (which) - { - case PRIO_PROCESS: - if ((pid_t) who == p->pid) - { - nice = p->nice; - goto out; - } - break; - case PRIO_PGRP: - if ((pid_t) who == p->pgid && p->nice < nice) - nice = p->nice; - break; - case PRIO_USER: - if ((__uid32_t) who == p->uid && p->nice < nice) - nice = p->nice; - break; - } - } -out: - pids.reset (); - if (nice == NZERO * 2) - { - set_errno (ESRCH); - return -1; - } - return nice; -} - -extern "C" int -nice (int incr) -{ - return setpriority (PRIO_PROCESS, myself->pid, myself->nice + incr); -} - -/* - * Find the first bit set in I. - */ - -extern "C" int -ffs (int i) -{ - static const unsigned char table[] = - { - 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 - }; - unsigned long int a; - unsigned long int x = i & -i; - - a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24); - - return table[x >> a] + a; -} - -static void -locked_append (int fd, const void * buf, size_t size) -{ - struct __flock64 lock_buffer = {F_WRLCK, SEEK_SET, 0, 0, 0}; - int count = 0; - - do - if ((lock_buffer.l_start = lseek64 (fd, 0, SEEK_END)) != (_off64_t) -1 - && fcntl_worker (fd, F_SETLKW, &lock_buffer) != -1) - { - if (lseek64 (fd, 0, SEEK_END) != (_off64_t) -1) - write (fd, buf, size); - lock_buffer.l_type = F_UNLCK; - fcntl_worker (fd, F_SETLK, &lock_buffer); - break; - } - while (count++ < 1000 - && (errno == EACCES || errno == EAGAIN) - && !usleep (1000)); -} - -extern "C" void -updwtmp (const char *wtmp_file, const struct utmp *ut) -{ - int fd; - - if ((fd = open (wtmp_file, O_WRONLY | O_BINARY, 0)) >= 0) - { - locked_append (fd, ut, sizeof *ut); - close (fd); - } -} - -static int utmp_fd = -1; -static bool utmp_readonly = false; -static char *utmp_file = (char *) _PATH_UTMP; - -static void -internal_setutent (bool force_readwrite) -{ - if (force_readwrite && utmp_readonly) - endutent (); - if (utmp_fd < 0) - { - utmp_fd = open (utmp_file, O_RDWR | O_BINARY); - /* If open fails, we assume an unprivileged process (who?). In this - case we try again for reading only unless the process calls - pututline() (==force_readwrite) in which case opening just fails. */ - if (utmp_fd < 0 && !force_readwrite) - { - utmp_fd = open (utmp_file, O_RDONLY | O_BINARY); - if (utmp_fd >= 0) - utmp_readonly = true; - } - } - else - lseek (utmp_fd, 0, SEEK_SET); -} - -extern "C" void -setutent () -{ - internal_setutent (false); -} - -extern "C" void -endutent () -{ - if (utmp_fd >= 0) - { - close (utmp_fd); - utmp_fd = -1; - utmp_readonly = false; - } -} - -extern "C" void -utmpname (const char *file) -{ - myfault efault; - if (efault.faulted () || !*file) - { - debug_printf ("Invalid file"); - return; - } - endutent (); - utmp_file = strdup (file); - debug_printf ("New UTMP file: %s", utmp_file); -} -EXPORT_ALIAS (utmpname, utmpxname) - -/* Note: do not make NO_COPY */ -static struct utmp utmp_data_buf[16]; -static unsigned utix = 0; -#define nutdbuf (sizeof (utmp_data_buf) / sizeof (utmp_data_buf[0])) -#define utmp_data ({ \ - if (utix > nutdbuf) \ - utix = 0; \ - utmp_data_buf + utix++; \ -}) - -static struct utmpx * -copy_ut_to_utx (struct utmp *ut, struct utmpx *utx) -{ - if (!ut) - return NULL; - memcpy (utx, ut, sizeof *ut); - utx->ut_tv.tv_sec = ut->ut_time; - utx->ut_tv.tv_usec = 0; - return utx; -} - -extern "C" struct utmp * -getutent () -{ - if (utmp_fd < 0) - { - internal_setutent (false); - if (utmp_fd < 0) - return NULL; - } - - utmp *ut = utmp_data; - if (read (utmp_fd, ut, sizeof *ut) != sizeof *ut) - return NULL; - return ut; -} - -extern "C" struct utmp * -getutid (struct utmp *id) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return NULL; - if (utmp_fd < 0) - { - internal_setutent (false); - if (utmp_fd < 0) - return NULL; - } - - utmp *ut = utmp_data; - while (read (utmp_fd, ut, sizeof *ut) == sizeof *ut) - { - switch (id->ut_type) - { - case RUN_LVL: - case BOOT_TIME: - case OLD_TIME: - case NEW_TIME: - if (id->ut_type == ut->ut_type) - return ut; - break; - case INIT_PROCESS: - case LOGIN_PROCESS: - case USER_PROCESS: - case DEAD_PROCESS: - if (strncmp (id->ut_id, ut->ut_id, UT_IDLEN) == 0) - return ut; - break; - default: - return NULL; - } - } - return NULL; -} - -extern "C" struct utmp * -getutline (struct utmp *line) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return NULL; - if (utmp_fd < 0) - { - internal_setutent (false); - if (utmp_fd < 0) - return NULL; - } - - utmp *ut = utmp_data; - while (read (utmp_fd, ut, sizeof *ut) == sizeof *ut) - if ((ut->ut_type == LOGIN_PROCESS || - ut->ut_type == USER_PROCESS) && - !strncmp (ut->ut_line, line->ut_line, sizeof (ut->ut_line))) - return ut; - - return NULL; -} - -extern "C" struct utmp * -pututline (struct utmp *ut) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return NULL; - internal_setutent (true); - if (utmp_fd < 0) - { - debug_printf ("error: utmp_fd %d", utmp_fd); - return NULL; - } - debug_printf ("ut->ut_type %d, ut->ut_pid %d, ut->ut_line '%s', ut->ut_id '%s'\n", - ut->ut_type, ut->ut_pid, ut->ut_line, ut->ut_id); - debug_printf ("ut->ut_user '%s', ut->ut_host '%s'\n", - ut->ut_user, ut->ut_host); - - struct utmp *u; - if ((u = getutid (ut))) - { - lseek (utmp_fd, -sizeof *ut, SEEK_CUR); - write (utmp_fd, ut, sizeof *ut); - } - else - locked_append (utmp_fd, ut, sizeof *ut); - return ut; -} - -extern "C" void -setutxent () -{ - internal_setutent (false); -} - -extern "C" void -endutxent () -{ - endutent (); -} - -extern "C" struct utmpx * -getutxent () -{ - static struct utmpx utx; - return copy_ut_to_utx (getutent (), &utx); -} - -extern "C" struct utmpx * -getutxid (const struct utmpx *id) -{ - static struct utmpx utx; - - myfault efault; - if (efault.faulted (EFAULT)) - return NULL; - ((struct utmpx *)id)->ut_time = id->ut_tv.tv_sec; - return copy_ut_to_utx (getutid ((struct utmp *) id), &utx); -} - -extern "C" struct utmpx * -getutxline (const struct utmpx *line) -{ - static struct utmpx utx; - - myfault efault; - if (efault.faulted (EFAULT)) - return NULL; - ((struct utmpx *)line)->ut_time = line->ut_tv.tv_sec; - return copy_ut_to_utx (getutline ((struct utmp *) line), &utx); -} - -extern "C" struct utmpx * -pututxline (const struct utmpx *utmpx) -{ - static struct utmpx utx; - - myfault efault; - if (efault.faulted (EFAULT)) - return NULL; - ((struct utmpx *)utmpx)->ut_time = utmpx->ut_tv.tv_sec; - return copy_ut_to_utx (pututline ((struct utmp *) utmpx), &utx); -} - -extern "C" void -updwtmpx (const char *wtmpx_file, const struct utmpx *utmpx) -{ - ((struct utmpx *)utmpx)->ut_time = utmpx->ut_tv.tv_sec; - updwtmp (wtmpx_file, (const struct utmp *) utmpx); -} - -extern "C" -long gethostid (void) -{ - unsigned data[13] = {0x92895012, - 0x10293412, - 0x29602018, - 0x81928167, - 0x34601329, - 0x75630198, - 0x89860395, - 0x62897564, - 0x00194362, - 0x20548593, - 0x96839102, - 0x12219854, - 0x00290012}; - - bool has_cpuid = false; - - DWORD opmask = SetThreadAffinityMask (GetCurrentThread (), 1); - if (!opmask) - debug_printf ("SetThreadAffinityMask to 1 failed, %E"); - - if (!can_set_flag (0x00040000)) - debug_printf ("386 processor - no cpuid"); - else - { - debug_printf ("486 processor"); - if (can_set_flag (0x00200000)) - { - debug_printf ("processor supports CPUID instruction"); - has_cpuid = true; - } - else - debug_printf ("processor does not support CPUID instruction"); - } - if (has_cpuid) - { - unsigned maxf, unused[3]; - cpuid (&maxf, &unused[0], &unused[1], &unused[2], 0); - maxf &= 0xffff; - if (maxf >= 1) - { - unsigned features; - cpuid (&data[0], &unused[0], &unused[1], &features, 1); - if (features & (1 << 18)) - { - debug_printf ("processor has psn"); - if (maxf >= 3) - { - cpuid (&unused[0], &unused[1], &data[1], &data[2], 3); - debug_printf ("Processor PSN: %04x-%04x-%04x-%04x-%04x-%04x", - data[0] >> 16, data[0] & 0xffff, data[2] >> 16, data[2] & 0xffff, data[1] >> 16, data[1] & 0xffff); - } - } - else - debug_printf ("processor does not have psn"); - } - } - - UUID Uuid; - RPC_STATUS status = UuidCreateSequential (&Uuid); - if (GetLastError () == ERROR_PROC_NOT_FOUND) - status = UuidCreate (&Uuid); - if (status == RPC_S_OK) - { - data[4] = *(unsigned *)&Uuid.Data4[2]; - data[5] = *(unsigned short *)&Uuid.Data4[6]; - // Unfortunately Windows will sometimes pick a virtual Ethernet card - // e.g. VMWare Virtual Ethernet Adaptor - debug_printf ("MAC address of first Ethernet card: %02x:%02x:%02x:%02x:%02x:%02x", - Uuid.Data4[2], Uuid.Data4[3], Uuid.Data4[4], - Uuid.Data4[5], Uuid.Data4[6], Uuid.Data4[7]); - } - else - { - debug_printf ("no Ethernet card installed"); - } - - reg_key key (HKEY_LOCAL_MACHINE, KEY_READ, "SOFTWARE", "Microsoft", "Windows", "CurrentVersion", NULL); - key.get_string ("ProductId", (char *)&data[6], 24, "00000-000-0000000-00000"); - debug_printf ("Windows Product ID: %s", (char *)&data[6]); - - /* Contrary to MSDN, NT4 requires the second argument - or a STATUS_ACCESS_VIOLATION is generated */ - ULARGE_INTEGER availb; - GetDiskFreeSpaceEx ("C:\\", &availb, (PULARGE_INTEGER) &data[11], NULL); - if (GetLastError () == ERROR_PROC_NOT_FOUND) - GetDiskFreeSpace ("C:\\", NULL, NULL, NULL, (DWORD *)&data[11]); - - debug_printf ("hostid entropy: %08x %08x %08x %08x " - "%08x %08x %08x %08x " - "%08x %08x %08x %08x " - "%08x", - data[0], data[1], - data[2], data[3], - data[4], data[5], - data[6], data[7], - data[8], data[9], - data[10], data[11], - data[12]); - - long hostid = 0x40291372; - // a random hashing algorithm - // dependancy on md5 is probably too costly - for (int i=0;i<13;i++) - hostid ^= ((data[i] << (i << 2)) | (data[i] >> (32 - (i << 2)))); - - if (opmask && !SetThreadAffinityMask (GetCurrentThread (), opmask)) - debug_printf ("SetThreadAffinityMask to %p failed, %E", opmask); - - debug_printf ("hostid: %08x", hostid); - - return hostid; -} - -#define ETC_SHELLS "/etc/shells" -static int shell_index; -static struct __sFILE64 *shell_fp; - -extern "C" char * -getusershell () -{ - /* List of default shells if no /etc/shells exists, defined as on Linux. - FIXME: SunOS has a far longer list, containing all shells which - might be shipped with the OS. Should we do the same for the Cygwin - distro, adding bash, tcsh, ksh, pdksh and zsh? */ - static NO_COPY const char *def_shells[] = { - "/bin/sh", - "/bin/csh", - "/usr/bin/sh", - "/usr/bin/csh", - NULL - }; - static char buf[CYG_MAX_PATH]; - int ch, buf_idx; - - if (!shell_fp && !(shell_fp = fopen64 (ETC_SHELLS, "rt"))) - { - if (def_shells[shell_index]) - return strcpy (buf, def_shells[shell_index++]); - return NULL; - } - /* Skip white space characters. */ - while ((ch = getc (shell_fp)) != EOF && isspace (ch)) - ; - /* Get each non-whitespace character as part of the shell path as long as - it fits in buf. */ - for (buf_idx = 0; - ch != EOF && !isspace (ch) && buf_idx < CYG_MAX_PATH; - buf_idx++, ch = getc (shell_fp)) - buf[buf_idx] = ch; - /* Skip any trailing non-whitespace character not fitting in buf. If the - path is longer than CYG_MAX_PATH, it's invalid anyway. */ - while (ch != EOF && !isspace (ch)) - ch = getc (shell_fp); - if (buf_idx) - { - buf[buf_idx] = '\0'; - return buf; - } - return NULL; -} - -extern "C" void -setusershell () -{ - if (shell_fp) - fseek (shell_fp, 0L, SEEK_SET); - shell_index = 0; -} - -extern "C" void -endusershell () -{ - if (shell_fp) - { - fclose (shell_fp); - shell_fp = NULL; - } - shell_index = 0; -} - -extern "C" void -flockfile (FILE *file) -{ - _flockfile (file); -} - -extern "C" int -ftrylockfile (FILE *file) -{ - return _ftrylockfile (file); -} - -extern "C" void -funlockfile (FILE *file) -{ - _funlockfile (file); -} diff --git a/winsup/cygwin/sysconf.cc b/winsup/cygwin/sysconf.cc deleted file mode 100644 index bdbbb99be..000000000 --- a/winsup/cygwin/sysconf.cc +++ /dev/null @@ -1,133 +0,0 @@ -/* sysconf.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "ntdll.h" - -/* sysconf: POSIX 4.8.1.1 */ -/* Allows a portable app to determine quantities of resources or - presence of an option at execution time. */ -long int -sysconf (int in) -{ - switch (in) - { - case _SC_ARG_MAX: - /* FIXME: what's the right value? _POSIX_ARG_MAX is only 4K */ - return 1048576; - case _SC_OPEN_MAX: - { - long max = getdtablesize (); - if (max < OPEN_MAX) - max = OPEN_MAX; - return max; - } - case _SC_PAGESIZE: - return getpagesize (); - case _SC_CLK_TCK: - return CLOCKS_PER_SEC; - case _SC_JOB_CONTROL: - return _POSIX_JOB_CONTROL; - case _SC_CHILD_MAX: - return CHILD_MAX; - case _SC_NGROUPS_MAX: - return NGROUPS_MAX; - case _SC_SAVED_IDS: - return _POSIX_SAVED_IDS; - case _SC_LOGIN_NAME_MAX: - return LOGIN_NAME_MAX; - case _SC_GETPW_R_SIZE_MAX: - case _SC_GETGR_R_SIZE_MAX: - return 16*1024; - case _SC_VERSION: - return _POSIX_VERSION; -#if 0 /* FIXME -- unimplemented */ - case _SC_TZNAME_MAX: - return _POSIX_TZNAME_MAX; - case _SC_STREAM_MAX: - return _POSIX_STREAM_MAX; -#endif - case _SC_NPROCESSORS_CONF: - case _SC_NPROCESSORS_ONLN: - if (!wincap.supports_smp ()) - return 1; - /*FALLTHRU*/ - case _SC_PHYS_PAGES: - if (wincap.supports_smp ()) - { - NTSTATUS ret; - SYSTEM_BASIC_INFORMATION sbi; - if ((ret = NtQuerySystemInformation (SystemBasicInformation, - (PVOID) &sbi, - sizeof sbi, NULL)) - != STATUS_SUCCESS) - { - __seterrno_from_nt_status (ret); - debug_printf ("NtQuerySystemInformation: ret %d, Dos(ret) %E", - ret); - return -1; - } - switch (in) - { - case _SC_NPROCESSORS_CONF: - return sbi.NumberProcessors; - case _SC_NPROCESSORS_ONLN: - { - int i = 0; - do - if (sbi.ActiveProcessors & 1) - i++; - while (sbi.ActiveProcessors >>= 1); - return i; - } - case _SC_PHYS_PAGES: - return sbi.NumberOfPhysicalPages; - } - } - break; - case _SC_AVPHYS_PAGES: - if (wincap.supports_smp ()) - { - NTSTATUS ret; - SYSTEM_PERFORMANCE_INFORMATION spi; - if ((ret = NtQuerySystemInformation (SystemPerformanceInformation, - (PVOID) &spi, - sizeof spi, NULL)) - != STATUS_SUCCESS) - { - __seterrno_from_nt_status (ret); - debug_printf ("NtQuerySystemInformation: ret %d, Dos(ret) %E", - ret); - return -1; - } - return spi.AvailablePages; - } - case _SC_RTSIG_MAX: - return RTSIG_MAX; - case _SC_TTY_NAME_MAX: - return TTY_NAME_MAX; - case _SC_MEMLOCK_RANGE: - return _POSIX_MEMLOCK_RANGE; - } - - /* Invalid input or unimplemented sysconf name */ - set_errno (EINVAL); - return -1; -} diff --git a/winsup/cygwin/syslog.cc b/winsup/cygwin/syslog.cc deleted file mode 100644 index 3c43c3552..000000000 --- a/winsup/cygwin/syslog.cc +++ /dev/null @@ -1,549 +0,0 @@ -/* syslog.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#define __INSIDE_CYGWIN_NET__ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "thread.h" -#include "cygtls.h" - -/* FIXME: These should probably be in the registry. */ -/* FIXME: The Win95 path should be whatever slash is */ - -#define WIN95_EVENT_LOG_PATH "C:\\CYGWIN_SYSLOG.TXT" -#define CYGWIN_LOG_NAME "Cygwin" - -/* - * Utility function to help enable moving - * WIN95_EVENT_LOG_PATH into registry later. - */ -static const char * -get_win95_event_log_path () -{ - return WIN95_EVENT_LOG_PATH; -} - -/* openlog: save the passed args. Don't open the - system log (NT) or log file (95) yet. */ -extern "C" void -openlog (const char *ident, int logopt, int facility) -{ - debug_printf ("openlog called with (%s, %d, %d)", - ident ? ident : "", logopt, facility); - - if (_my_tls.locals.process_ident != NULL) - { - free (_my_tls.locals.process_ident); - _my_tls.locals.process_ident = NULL; - } - if (ident) - { - _my_tls.locals.process_ident = (char *) malloc (strlen (ident) + 1); - if (!_my_tls.locals.process_ident) - { - debug_printf ("failed to allocate memory for _my_tls.locals.process_ident"); - return; - } - strcpy (_my_tls.locals.process_ident, ident); - } - _my_tls.locals.process_logopt = logopt; - _my_tls.locals.process_facility = facility; -} - -/* setlogmask: set the log priority mask and return previous mask. - If maskpri is zero, just return previous. */ -int -setlogmask (int maskpri) -{ - if (maskpri == 0) - return _my_tls.locals.process_logmask; - - int old_mask = _my_tls.locals.process_logmask; - _my_tls.locals.process_logmask = maskpri; - - return old_mask; -} - -/* Private class used to handle formatting of syslog message - It is named pass_handler because it does a two-pass handling of log - strings. The first pass counts the length of the string, and the second - one builds the string. */ - -class pass_handler -{ - private: - FILE *fp_; - char *message_; - int total_len_; - - void shutdown (); - - /* Explicitly disallow copies */ - pass_handler (const pass_handler &); - pass_handler & operator = (const pass_handler &); - - public: - pass_handler (); - ~pass_handler (); - - int initialize (int); - - int print (const char *,...); - int print_va (const char *, va_list); - char *get_message () const { return message_; } - void set_message (char *s) { message_ = s; *message_ = '\0'; } -}; - -pass_handler::pass_handler () : fp_ (0), message_ (0), total_len_ (0) -{ - ; -} - -pass_handler::~pass_handler () -{ - shutdown (); -} - -void -pass_handler::shutdown () -{ - if (fp_ != NULL) - { - fclose (fp_); - fp_ = 0; - } -} - -int -pass_handler::initialize (int pass_number) -{ - shutdown (); - if (pass_number) - return total_len_ + 1; - - fp_ = fopen ("/dev/null", "wb"); - setbuf (fp_, NULL); - if (fp_ == NULL) - { - debug_printf ("failed to open /dev/null"); - return -1; - } - total_len_ = 0; - return 0; -} - -int -pass_handler::print (const char *fmt, ...) -{ - va_list ap; - va_start (ap, fmt); - int ret = print_va (fmt, ap); - va_end (ap); - return ret; -} - -int -pass_handler::print_va (const char *fmt, va_list list) -{ - if (fp_ != NULL) - { - int len = vfprintf (fp_, fmt, list); - if (len < 0) - return -1; - total_len_ += len; - return 0; - } - else if (message_ != NULL) - { - char *printpos = &message_[strlen (message_)]; - vsprintf (printpos, fmt, list); - return 0; - } - debug_printf ("FAILURE ! fp_ and message_ both 0!! "); - return -1; -} - -static NO_COPY muto try_connect_guard; -static enum { - not_inited, - inited_failed, - inited_dgram, - inited_stream -} syslogd_inited; -static int syslogd_sock = -1; -extern "C" int cygwin_socket (int, int, int); -extern "C" int cygwin_connect (int, const struct sockaddr *, int); - -static void -connect_syslogd () -{ - struct __stat64 st; - int fd; - struct sockaddr_un sun; - - if (syslogd_inited != not_inited && syslogd_sock >= 0) - close (syslogd_sock); - syslogd_inited = inited_failed; - syslogd_sock = -1; - if (stat64 (_PATH_LOG, &st) || !S_ISSOCK (st.st_mode)) - return; - if ((fd = cygwin_socket (AF_LOCAL, SOCK_DGRAM, 0)) < 0) - return; - sun.sun_family = AF_LOCAL; - strncpy (sun.sun_path, _PATH_LOG, sizeof sun.sun_path); - if (cygwin_connect (fd, (struct sockaddr *) &sun, sizeof sun)) - { - if (get_errno () != EPROTOTYPE) - { - close (fd); - return; - } - /* Retry with SOCK_STREAM. */ - if ((fd = cygwin_socket (AF_LOCAL, SOCK_STREAM, 0)) < 0) - return; - if (cygwin_connect (fd, (struct sockaddr *) &sun, sizeof sun)) - { - close (fd); - return; - } - syslogd_inited = inited_stream; - } - else - syslogd_inited = inited_dgram; - syslogd_sock = fd; - fcntl (syslogd_sock, F_SETFD, FD_CLOEXEC); - return; -} - -static int -try_connect_syslogd (int priority, const char *msg, int len) -{ - ssize_t ret = -1; - - try_connect_guard.init ("try_connect_guard")->acquire (); - if (syslogd_inited == not_inited) - connect_syslogd (); - if (syslogd_sock >= 0) - { - char pribuf[16]; - sprintf (pribuf, "<%d>", priority); - struct iovec iv[2] = - { - { pribuf, strlen (pribuf) }, - { (char *) msg, len } - }; - - ret = writev (syslogd_sock, iv, 2); - /* If the syslog daemon has been restarted and /dev/log was - a stream socket, the connection is broken. In this case, - try to reopen the socket and try again. */ - if (ret < 0 && syslogd_inited == inited_stream) - { - connect_syslogd (); - if (syslogd_sock >= 0) - ret = writev (syslogd_sock, iv, 2); - } - /* If write fails and LOG_CONS is set, return failure to vsyslog so - it falls back to the usual logging method for this OS. */ - if (ret >= 0 || !(_my_tls.locals.process_logopt & LOG_CONS)) - ret = syslogd_sock; - } - try_connect_guard.release (); - return ret; -} - -/* - * syslog: creates the log message and writes to system - * log (NT) or log file (95). FIXME. WinNT log error messages - * don't look pretty, but in order to fix this we have to - * embed resources in the code and tell the NT registry - * where we are, blech (what happens if we move ?). - * We could, however, add the resources in Cygwin and - * always point to that. - */ - -extern "C" void -vsyslog (int priority, const char *message, va_list ap) -{ - debug_printf ("%x %s", priority, message); - /* If the priority fails the current mask, reject */ - if ((LOG_MASK (LOG_PRI (priority)) & _my_tls.locals.process_logmask) == 0) - { - debug_printf ("failing message %x due to priority mask %x", - priority, _my_tls.locals.process_logmask); - return; - } - - /* Add default facility if not in the given priority. */ - if (!(priority & LOG_FACMASK)) - priority |= _my_tls.locals.process_facility; - - /* Translate %m in the message to error text */ - char *errtext = strerror (get_errno ()); - int errlen = strlen (errtext); - int numfound = 0; - - for (const char *cp = message; *cp; cp++) - if (*cp == '%' && cp[1] == 'm') - numfound++; - - char *newmessage = (char *) alloca (strlen (message) + - (errlen * numfound) + 1); - - if (newmessage == NULL) - { - debug_printf ("failed to allocate newmessage"); - return; - } - - char *dst = newmessage; - for (const char *cp2 = message; *cp2; cp2++) - if (*cp2 == '%' && cp2[1] == 'm') - { - cp2++; - strcpy (dst, errtext); - while (*dst) - dst++; - } - else - *dst++ = *cp2; - - *dst = '\0'; - message = newmessage; - - /* Work out the priority type - we ignore the facility for now.. */ - WORD eventType; - switch (LOG_PRI (priority)) - { - case LOG_EMERG: - case LOG_ALERT: - case LOG_CRIT: - case LOG_ERR: - eventType = EVENTLOG_ERROR_TYPE; - break; - case LOG_WARNING: - eventType = EVENTLOG_WARNING_TYPE; - break; - case LOG_NOTICE: - case LOG_INFO: - case LOG_DEBUG: - eventType = EVENTLOG_INFORMATION_TYPE; - break; - default: - eventType = EVENTLOG_ERROR_TYPE; - break; - } - - /* We need to know how long the buffer needs to be. - The only legal way I can see of doing this is to - do a vfprintf to /dev/null, and count the bytes - output, then do it again to a malloc'ed string. This - is ugly, slow, but prevents core dumps :-). - */ - pass_handler pass; - for (int pass_number = 0; pass_number < 2; ++pass_number) - { - int n = pass.initialize (pass_number); - if (n == -1) - return; - else if (n > 0) - pass.set_message ((char *) alloca (n)); - - /* Deal with ident_string */ - if (_my_tls.locals.process_ident != NULL) - { - if (pass.print ("%s: ", _my_tls.locals.process_ident) == -1) - return; - } - if (_my_tls.locals.process_logopt & LOG_PID) - { - if (pass.print ("PID %u: ", getpid ()) == -1) - return; - } - - if (!wincap.has_eventlog ()) - { - /* Add a priority string - not needed for systems with - eventlog capability. */ - switch (LOG_PRI (priority)) - { - case LOG_EMERG: - pass.print ("%s: ", "LOG_EMERG"); - break; - case LOG_ALERT: - pass.print ("%s: ", "LOG_ALERT"); - break; - case LOG_CRIT: - pass.print ("%s: ", "LOG_CRIT"); - break; - case LOG_ERR: - pass.print ("%s: ", "LOG_ERR"); - break; - case LOG_WARNING: - pass.print ("%s: ", "LOG_WARNING"); - break; - case LOG_NOTICE: - pass.print ("%s: ", "LOG_NOTICE"); - break; - case LOG_INFO: - pass.print ("%s: ", "LOG_INFO"); - break; - case LOG_DEBUG: - pass.print ("%s: ", "LOG_DEBUG"); - break; - default: - pass.print ("%s: ", "LOG_ERR"); - break; - } - } - - /* Print out the variable part */ - if (pass.print_va (message, ap) == -1) - return; - - } - const char *msg_strings[1]; - char *total_msg = pass.get_message (); - int len = strlen (total_msg); - if (len != 0 && (total_msg[len - 1] == '\n')) - total_msg[--len] = '\0'; - - msg_strings[0] = total_msg; - - if (_my_tls.locals.process_logopt & LOG_PERROR) - { - write (STDERR_FILENO, total_msg, len); - write (STDERR_FILENO, "\n", 1); - } - - int fd; - if ((fd = try_connect_syslogd (priority, total_msg, len + 1)) >= 0) - ; - else if (wincap.has_eventlog ()) - { - /* For NT, open the event log and send the message */ - HANDLE hEventSrc = RegisterEventSourceA (NULL, (_my_tls.locals.process_ident != NULL) ? - _my_tls.locals.process_ident : CYGWIN_LOG_NAME); - if (hEventSrc == NULL) - { - debug_printf ("RegisterEventSourceA failed with %E"); - return; - } - if (!ReportEventA (hEventSrc, eventType, 0, 0, - cygheap->user.sid (), 1, 0, msg_strings, NULL)) - debug_printf ("ReportEventA failed with %E"); - DeregisterEventSource (hEventSrc); - } - else - { - /* Under Windows 95, append the message to the log file */ - char timestamp[24]; - time_t ctime; - FILE *fp = fopen (get_win95_event_log_path (), "a"); - if (fp == NULL) - { - debug_printf ("failed to open file %s", - get_win95_event_log_path ()); - return; - } - strftime (timestamp, sizeof timestamp, "%Y-%m-%d %H:%M:%S : ", - localtime (&(ctime = time (NULL)))); - - /* Now to prevent several syslog messages from being - interleaved, we must lock the first byte of the file - This works on Win32 even if we created the file above. - */ - HANDLE fHandle = cygheap->fdtab[fileno (fp)]->get_handle (); - for (int i = 0;; i++) - if (LockFile (fHandle, 0, 0, 1, 0) == FALSE) - if (i == 3) - { - debug_printf ("failed to lock file %s", get_win95_event_log_path ()); - fclose (fp); - return; - } - else - usleep (1000); - else - break; - fputs (timestamp, fp); - fputs (msg_strings[0], fp); - fputc ('\n', fp); - fclose (fp); - } -} - -extern "C" void -syslog (int priority, const char *message, ...) -{ - va_list ap; - va_start (ap, message); - vsyslog (priority, message, ap); - va_end (ap); -} - -static NO_COPY muto klog_guard; -fhandler_mailslot *dev_kmsg; - -extern "C" void -vklog (int priority, const char *message, va_list ap) -{ - /* TODO: kernel messages are under our control entirely and they should - be quick. No playing with /dev/null, but a fixed upper size for now. */ - char buf[2060]; /* 2048 + a prority */ - if (!(priority & ~LOG_PRIMASK)) - priority = LOG_KERN | LOG_PRI (priority); - __small_sprintf (buf, "<%d>", priority); - __small_vsprintf (buf + strlen (buf), message, ap); - klog_guard.init ("klog_guard")->acquire (); - if (!dev_kmsg) - dev_kmsg = (fhandler_mailslot *) build_fh_name ("/dev/kmsg"); - if (dev_kmsg && !dev_kmsg->get_handle ()) - dev_kmsg->open (O_WRONLY, 0); - if (dev_kmsg && dev_kmsg->get_handle ()) - dev_kmsg->write (buf, strlen (buf) + 1); - klog_guard.release (); -} - -extern "C" void -klog (int priority, const char *message, ...) -{ - va_list ap; - va_start (ap, message); - vklog (priority, message, ap); - va_end (ap); -} - -extern "C" void -closelog (void) -{ - try_connect_guard.init ("try_connect_guard")->acquire (); - if (syslogd_inited != not_inited && syslogd_sock >= 0) - { - close (syslogd_sock); - syslogd_sock = -1; - syslogd_inited = not_inited; - } - try_connect_guard.release (); -} diff --git a/winsup/cygwin/termios.cc b/winsup/cygwin/termios.cc deleted file mode 100644 index 6e0ab3e9f..000000000 --- a/winsup/cygwin/termios.cc +++ /dev/null @@ -1,306 +0,0 @@ -/* termios.cc: termios for WIN32. - - Copyright 1996, 1997, 1998, 2000, 2001, 2002 Red Hat, Inc. - - Written by Doug Evans and Steve Chamberlain of Cygnus Support - dje@cygnus.com, sac@cygnus.com - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "cygwin/version.h" -#include "perprocess.h" -#include "sigproc.h" -#include "cygtls.h" -#include - -/* tcsendbreak: POSIX 7.2.2.1 */ -extern "C" int -tcsendbreak (int fd, int duration) -{ - int res = -1; - - cygheap_fdget cfd (fd); - if (cfd < 0) - goto out; - - if (!cfd->is_tty ()) - set_errno (ENOTTY); - else if ((res = cfd->bg_check (-SIGTTOU)) > bg_eof) - res = cfd->tcsendbreak (duration); - -out: - syscall_printf ("%d = tcsendbreak (%d, %d)", res, fd, duration); - return res; -} - -/* tcdrain: POSIX 7.2.2.1 */ -extern "C" int -tcdrain (int fd) -{ - int res = -1; - - termios_printf ("tcdrain"); - - cygheap_fdget cfd (fd); - if (cfd < 0) - goto out; - - if (!cfd->is_tty ()) - set_errno (ENOTTY); - else if ((res = cfd->bg_check (-SIGTTOU)) > bg_eof) - res = cfd->tcdrain (); - -out: - syscall_printf ("%d = tcdrain (%d)", res, fd); - return res; -} - -/* tcflush: POSIX 7.2.2.1 */ -extern "C" int -tcflush (int fd, int queue) -{ - int res = -1; - - cygheap_fdget cfd (fd); - if (cfd < 0) - goto out; - - if (!cfd->is_tty ()) - set_errno (ENOTTY); - else if (queue != TCIFLUSH && queue != TCOFLUSH && queue != TCIOFLUSH) - set_errno (EINVAL); - else if ((res = cfd->bg_check (-SIGTTOU)) > bg_eof) - res = cfd->tcflush (queue); - -out: - termios_printf ("%d = tcflush (%d, %d)", res, fd, queue); - return res; -} - -/* tcflow: POSIX 7.2.2.1 */ -extern "C" int -tcflow (int fd, int action) -{ - int res = -1; - - cygheap_fdget cfd (fd); - if (cfd < 0) - goto out; - - if (!cfd->is_tty ()) - set_errno (ENOTTY); - else if ((res = cfd->bg_check (-SIGTTOU)) > bg_eof) - res = cfd->tcflow (action); - -out: - syscall_printf ("%d = tcflow (%d, %d)", res, fd, action); - return res; -} - -/* tcsetattr: POSIX96 7.2.1.1 */ -extern "C" int -tcsetattr (int fd, int a, const struct termios *t) -{ - int res; - t = __tonew_termios (t); - int e = get_errno (); - - while (1) - { - res = -1; - cygheap_fdget cfd (fd); - if (cfd < 0) - { - e = get_errno (); - break; - } - - if (!cfd->is_tty ()) - { - e = ENOTTY; - break; - } - - res = cfd->bg_check (-SIGTTOU); - - switch (res) - { - case bg_eof: - e = get_errno (); - break; - case bg_ok: - if (cfd.isopen ()) - res = cfd->tcsetattr (a, t); - e = get_errno (); - break; - case bg_signalled: - if (_my_tls.call_signal_handler ()) - continue; - res = -1; - /* fall through intentionally */ - default: - e = get_errno (); - break; - } - break; - } - - set_errno (e); - termios_printf ("iflag %p, oflag %p, cflag %p, lflag %p, VMIN %d, VTIME %d", - t->c_iflag, t->c_oflag, t->c_cflag, t->c_lflag, t->c_cc[VMIN], - t->c_cc[VTIME]); - termios_printf ("%d = tcsetattr (%d, %d, %x)", res, fd, a, t); - return res; -} - -/* tcgetattr: POSIX 7.2.1.1 */ -extern "C" int -tcgetattr (int fd, struct termios *in_t) -{ - int res = -1; - struct termios *t = __makenew_termios (in_t); - - cygheap_fdget cfd (fd); - if (cfd < 0) - /* saw an error */; - else if (!cfd->is_tty ()) - set_errno (ENOTTY); - else if ((res = cfd->tcgetattr (t)) == 0) - __toapp_termios (in_t, t); - - if (res) - termios_printf ("%d = tcgetattr (%d, %p)", res, fd, in_t); - else - termios_printf ("iflag %x, oflag %x, cflag %x, lflag %x, VMIN %d, VTIME %d", - t->c_iflag, t->c_oflag, t->c_cflag, t->c_lflag, t->c_cc[VMIN], - t->c_cc[VTIME]); - - return res; -} - -/* tcgetpgrp: POSIX 7.2.3.1 */ -extern "C" int -tcgetpgrp (int fd) -{ - int res = -1; - - cygheap_fdget cfd (fd); - if (cfd < 0) - /* saw an error */; - else if (!cfd->is_tty ()) - set_errno (ENOTTY); - else - res = cfd->tcgetpgrp (); - - termios_printf ("%d = tcgetpgrp (%d)", res, fd); - return res; -} - -/* tcsetpgrp: POSIX 7.2.4.1 */ -extern "C" int -tcsetpgrp (int fd, pid_t pgid) -{ - int res = -1; - - cygheap_fdget cfd (fd); - if (cfd < 0) - /* saw an error */; - else if (!cfd->is_tty ()) - set_errno (ENOTTY); - else - res = cfd->tcsetpgrp (pgid); - - termios_printf ("%d = tcsetpgrp (%d, %x)", res, fd, pgid); - return res; -} - -/* NIST PCTS requires not macro-only implementation */ -#undef cfgetospeed -#undef cfgetispeed -#undef cfsetospeed -#undef cfsetispeed - -/* cfgetospeed: POSIX96 7.1.3.1 */ -extern "C" speed_t -cfgetospeed (struct termios *tp) -{ - return __tonew_termios (tp)->c_ospeed; -} - -/* cfgetispeed: POSIX96 7.1.3.1 */ -extern "C" speed_t -cfgetispeed (struct termios *tp) -{ - return __tonew_termios (tp)->c_ispeed; -} - -static inline int -setspeed (speed_t &set_speed, speed_t from_speed) -{ - int res; - switch (from_speed) - { - case B0: - case B50: - case B75: - case B110: - case B134: - case B150: - case B200: - case B300: - case B600: - case B1200: - case B1800: - case B2400: - case B4800: - case B9600: - case B19200: - case B38400: - case B57600: - case B115200: - case B128000: - case B230400: - case B256000: - set_speed = from_speed; - res = 0; - break; - default: - set_errno (EINVAL); - res = -1; - break; - } - return res; -} - -/* cfsetospeed: POSIX96 7.1.3.1 */ -extern "C" int -cfsetospeed (struct termios *in_tp, speed_t speed) -{ - struct termios *tp = __tonew_termios (in_tp); - int res = setspeed (tp->c_ospeed, speed); - __toapp_termios (in_tp, tp); - return res; -} - -/* cfsetispeed: POSIX96 7.1.3.1 */ -extern "C" int -cfsetispeed (struct termios *in_tp, speed_t speed) -{ - struct termios *tp = __tonew_termios (in_tp); - int res = setspeed (tp->c_ispeed, speed); - __toapp_termios (in_tp, tp); - return res; -} diff --git a/winsup/cygwin/textmode.c b/winsup/cygwin/textmode.c deleted file mode 100644 index 6d52d50f8..000000000 --- a/winsup/cygwin/textmode.c +++ /dev/null @@ -1,21 +0,0 @@ -/* binmode.c - - Copyright 2000 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include -#include -#include - -extern int _fmode; -void -cygwin_premain0 (int argc, char **argv, struct per_process *myself) -{ - _fmode &= ~_O_BINARY; - _fmode |= _O_TEXT; -} diff --git a/winsup/cygwin/textreadmode.c b/winsup/cygwin/textreadmode.c deleted file mode 100644 index a94106d98..000000000 --- a/winsup/cygwin/textreadmode.c +++ /dev/null @@ -1,25 +0,0 @@ -/* textreadmode.c - - Copyright 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include -#include -#include - -extern int _fmode; -void -cygwin_premain0 (int argc, char **argv, struct per_process *myself) -{ - static struct __cygwin_perfile pf[] = - { - {"", O_RDONLY | O_TEXT}, - {NULL, 0} - }; - cygwin_internal (CW_PERFILE, pf); -} diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc deleted file mode 100644 index d7b2a1fa2..000000000 --- a/winsup/cygwin/thread.cc +++ /dev/null @@ -1,3334 +0,0 @@ -/* thread.cc: Locking and threading module functions - - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - - Originally written by Marco Fuykschot - Substantialy enhanced by Robert Collins - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* Implementation overview and caveats: - - Win32 puts some contraints on what can and cannot be implemented. Where - possible we work around those contrainsts. Where we cannot work around - the constraints we either pretend to be conformant, or return an error - code. - - Some caveats: PROCESS_SHARED objects while they pretend to be process - shared, may not actually work. Some test cases are needed to determine - win32's behaviour. My suspicion is that the win32 handle needs to be - opened with different flags for proper operation. - - R.Collins, April 2001. */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include "winsup.h" -#include -#include "cygerrno.h" -#include -#include -#include "pinfo.h" -#include "sigproc.h" -#include "perprocess.h" -#include "security.h" -#include "cygtls.h" -#include -#include -#include -#include -#include -#include - -extern "C" void __fp_lock_all (); -extern "C" void __fp_unlock_all (); -static inline verifyable_object_state - verifyable_object_isvalid (void const * objectptr, long magic, - void *static_ptr1 = NULL, - void *static_ptr2 = NULL, - void *static_ptr3 = NULL); - -extern int threadsafe; - -#undef __getreent -extern "C" struct _reent * -__getreent () -{ - return &_my_tls.local_clib; -} - -extern "C" void -__cygwin_lock_init (_LOCK_T *lock) -{ - *lock = _LOCK_T_INITIALIZER; -} - -extern "C" void -__cygwin_lock_init_recursive (_LOCK_T *lock) -{ - *lock = _LOCK_T_RECURSIVE_INITIALIZER; -} - -extern "C" void -__cygwin_lock_fini (_LOCK_T *lock) -{ - pthread_mutex_destroy ((pthread_mutex_t*) lock); -} - -extern "C" void -__cygwin_lock_lock (_LOCK_T *lock) -{ - if (MT_INTERFACE->threadcount <= 1) - paranoid_printf ("threadcount %d. not locking", MT_INTERFACE->threadcount); - else - { - paranoid_printf ("threadcount %d. locking", MT_INTERFACE->threadcount); - pthread_mutex_lock ((pthread_mutex_t*) lock); - } -} - -extern "C" int -__cygwin_lock_trylock (_LOCK_T *lock) -{ - return pthread_mutex_trylock ((pthread_mutex_t*) lock); -} - - -extern "C" void -__cygwin_lock_unlock (_LOCK_T *lock) -{ - if (MT_INTERFACE->threadcount <= 1) - paranoid_printf ("threadcount %d. not unlocking", MT_INTERFACE->threadcount); - else - { - pthread_mutex_unlock ((pthread_mutex_t*) lock); - paranoid_printf ("threadcount %d. unlocked", MT_INTERFACE->threadcount); - } -} - -static inline verifyable_object_state -verifyable_object_isvalid (void const * objectptr, long magic, void *static_ptr1, - void *static_ptr2, void *static_ptr3) -{ - verifyable_object **object = (verifyable_object **) objectptr; - - myfault efault; - if (efault.faulted ()) - return INVALID_OBJECT; - - if ((static_ptr1 && *object == static_ptr1) || - (static_ptr2 && *object == static_ptr2) || - (static_ptr3 && *object == static_ptr3)) - return VALID_STATIC_OBJECT; - if ((*object)->magic != magic) - return INVALID_OBJECT; - return VALID_OBJECT; -} - -/* static members */ -inline bool -pthread_attr::is_good_object (pthread_attr_t const *attr) -{ - if (verifyable_object_isvalid (attr, PTHREAD_ATTR_MAGIC) != VALID_OBJECT) - return false; - return true; -} - -inline bool -pthread_condattr::is_good_object (pthread_condattr_t const *attr) -{ - if (verifyable_object_isvalid (attr, PTHREAD_CONDATTR_MAGIC) != VALID_OBJECT) - return false; - return true; -} - -inline bool -pthread_rwlockattr::is_good_object (pthread_rwlockattr_t const *attr) -{ - if (verifyable_object_isvalid (attr, PTHREAD_RWLOCKATTR_MAGIC) != VALID_OBJECT) - return false; - return true; -} - -inline bool -pthread_key::is_good_object (pthread_key_t const *key) -{ - if (verifyable_object_isvalid (key, PTHREAD_KEY_MAGIC) != VALID_OBJECT) - return false; - return true; -} - -inline bool -pthread_mutex::is_good_object (pthread_mutex_t const *mutex) -{ - if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC) != VALID_OBJECT) - return false; - return true; -} - -inline bool -pthread_mutex::is_good_initializer (pthread_mutex_t const *mutex) -{ - if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC, - PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, - PTHREAD_NORMAL_MUTEX_INITIALIZER_NP, - PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP) != VALID_STATIC_OBJECT) - return false; - return true; -} - -inline bool -pthread_mutex::is_good_initializer_or_object (pthread_mutex_t const *mutex) -{ - if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC, - PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, - PTHREAD_NORMAL_MUTEX_INITIALIZER_NP, - PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP) == INVALID_OBJECT) - return false; - return true; -} - -inline bool -pthread_mutex::is_good_initializer_or_bad_object (pthread_mutex_t const *mutex) -{ - if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC, - PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, - PTHREAD_NORMAL_MUTEX_INITIALIZER_NP, - PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP) == VALID_OBJECT) - return false; - return true; -} - -inline bool -pthread_mutex::can_be_unlocked (pthread_mutex_t const *mutex) -{ - pthread_t self = pthread::self (); - - if (!is_good_object (mutex)) - return false; - /* Check if the mutex is owned by the current thread and can be unlocked. - * Also check for the ANONYMOUS owner to cover NORMAL mutexes as well. */ - return ((*mutex)->recursion_counter == 1 - && ((*mutex)->owner == MUTEX_OWNER_ANONYMOUS - || pthread::equal ((*mutex)->owner, self))); -} - -inline bool -pthread_mutexattr::is_good_object (pthread_mutexattr_t const * attr) -{ - if (verifyable_object_isvalid (attr, PTHREAD_MUTEXATTR_MAGIC) != VALID_OBJECT) - return false; - return true; -} - -inline bool __attribute__ ((used)) -pthread::is_good_object (pthread_t const *thread) -{ - if (verifyable_object_isvalid (thread, PTHREAD_MAGIC) != VALID_OBJECT) - return false; - return true; -} - -/* Thread synchronisation */ -inline bool -pthread_cond::is_good_object (pthread_cond_t const *cond) -{ - if (verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC) != VALID_OBJECT) - return false; - return true; -} - -inline bool -pthread_cond::is_good_initializer (pthread_cond_t const *cond) -{ - if (verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC, PTHREAD_COND_INITIALIZER) != VALID_STATIC_OBJECT) - return false; - return true; -} - -inline bool -pthread_cond::is_good_initializer_or_object (pthread_cond_t const *cond) -{ - if (verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC, PTHREAD_COND_INITIALIZER) == INVALID_OBJECT) - return false; - return true; -} - -inline bool -pthread_cond::is_good_initializer_or_bad_object (pthread_cond_t const *cond) -{ - if (verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC, PTHREAD_COND_INITIALIZER) == VALID_OBJECT) - return false; - return true; -} - -/* RW locks */ -inline bool -pthread_rwlock::is_good_object (pthread_rwlock_t const *rwlock) -{ - if (verifyable_object_isvalid (rwlock, PTHREAD_RWLOCK_MAGIC) != VALID_OBJECT) - return false; - return true; -} - -inline bool -pthread_rwlock::is_good_initializer (pthread_rwlock_t const *rwlock) -{ - if (verifyable_object_isvalid (rwlock, PTHREAD_RWLOCK_MAGIC, PTHREAD_RWLOCK_INITIALIZER) != VALID_STATIC_OBJECT) - return false; - return true; -} - -inline bool -pthread_rwlock::is_good_initializer_or_object (pthread_rwlock_t const *rwlock) -{ - if (verifyable_object_isvalid (rwlock, PTHREAD_RWLOCK_MAGIC, PTHREAD_RWLOCK_INITIALIZER) == INVALID_OBJECT) - return false; - return true; -} - -inline bool -pthread_rwlock::is_good_initializer_or_bad_object (pthread_rwlock_t const *rwlock) -{ - if (verifyable_object_isvalid (rwlock, PTHREAD_RWLOCK_MAGIC, PTHREAD_RWLOCK_INITIALIZER) == VALID_OBJECT) - return false; - return true; -} - -inline bool -semaphore::is_good_object (sem_t const * sem) -{ - if (verifyable_object_isvalid (sem, SEM_MAGIC) != VALID_OBJECT) - return false; - return true; -} - -LPCRITICAL_SECTION -ResourceLocks::Lock (int _resid) -{ - return &lock; -} - -void -SetResourceLock (int _res_id, int _mode, const char *_function) -{ - EnterCriticalSection (user_data->resourcelocks->Lock (_res_id)); -} - -void -ReleaseResourceLock (int _res_id, int _mode, const char *_function) -{ - LeaveCriticalSection (user_data->resourcelocks->Lock (_res_id)); -} - -void -ResourceLocks::Init () -{ - InitializeCriticalSection (&lock); - inited = true; - thread_printf ("lock %p inited by %p , %d", &lock, user_data, myself->pid); -} - -void -ResourceLocks::Delete () -{ - if (inited) - { - thread_printf ("Close Resource Locks %p ", &lock); - DeleteCriticalSection (&lock); - inited = false; - } -} - -void -MTinterface::Init () -{ - pthread_mutex::init_mutex (); - pthread_cond::init_mutex (); - pthread_rwlock::init_mutex (); -} - -void -MTinterface::fixup_before_fork () -{ - pthread_key::fixup_before_fork (); -} - -/* This function is called from a single threaded process */ -void -MTinterface::fixup_after_fork () -{ - pthread_key::fixup_after_fork (); - - threadcount = 0; - pthread::init_mainthread (); - - pthread::fixup_after_fork (); - pthread_mutex::fixup_after_fork (); - pthread_cond::fixup_after_fork (); - pthread_rwlock::fixup_after_fork (); - semaphore::fixup_after_fork (); -} - -/* pthread calls */ - -/* static methods */ -void -pthread::init_mainthread () -{ - pthread *thread = get_tls_self_pointer (); - if (!thread) - { - thread = new pthread (); - if (!thread) - api_fatal ("failed to create mainthread object"); - } - - set_tls_self_pointer (thread); - thread->thread_id = GetCurrentThreadId (); - if (!DuplicateHandle (hMainProc, GetCurrentThread (), hMainProc, - &thread->win32_obj_id, 0, FALSE, DUPLICATE_SAME_ACCESS)) - api_fatal ("failed to create mainthread handle"); - if (!thread->create_cancel_event ()) - api_fatal ("couldn't create cancel event for main thread"); - VerifyHandle (thread->win32_obj_id); - thread->postcreate (); -} - -pthread * -pthread::self () -{ - pthread *thread = get_tls_self_pointer (); - if (!thread) - { - thread = pthread_null::get_null_pthread (); - set_tls_self_pointer (thread); - } - return thread; -} - -pthread * -pthread::get_tls_self_pointer () -{ - return _my_tls.tid; -} - -void -pthread::set_tls_self_pointer (pthread *thread) -{ - thread->cygtls = &_my_tls; - _my_tls.tid = thread; -} - -List pthread::threads; - -/* member methods */ -pthread::pthread ():verifyable_object (PTHREAD_MAGIC), win32_obj_id (0), - valid (false), suspended (false), - cancelstate (0), canceltype (0), cancel_event (0), - joiner (NULL), next (NULL), cleanup_stack (NULL) -{ - if (this != pthread_null::get_null_pthread ()) - threads.insert (this); -} - -pthread::~pthread () -{ - if (win32_obj_id) - CloseHandle (win32_obj_id); - if (cancel_event) - CloseHandle (cancel_event); - - if (this != pthread_null::get_null_pthread ()) - threads.remove (this); -} - -bool -pthread::create_cancel_event () -{ - cancel_event = ::CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); - if (!cancel_event) - { - system_printf ("couldn't create cancel event, %E"); - /* we need the event for correct behaviour */ - return false; - } - return true; -} - -void -pthread::precreate (pthread_attr *newattr) -{ - pthread_mutex *verifyable_mutex_obj = &mutex; - - /* already running ? */ - if (win32_obj_id) - return; - - if (newattr) - { - attr.joinable = newattr->joinable; - attr.contentionscope = newattr->contentionscope; - attr.inheritsched = newattr->inheritsched; - attr.stacksize = newattr->stacksize; - } - - if (!pthread_mutex::is_good_object (&verifyable_mutex_obj)) - { - thread_printf ("New thread object access mutex is not valid. this %p", - this); - magic = 0; - return; - } - /* Change the mutex type to NORMAL to speed up mutex operations */ - mutex.type = PTHREAD_MUTEX_NORMAL; - if (!create_cancel_event ()) - magic = 0; -} - -bool -pthread::create (void *(*func) (void *), pthread_attr *newattr, - void *threadarg) -{ - bool retval; - - precreate (newattr); - if (!magic) - return false; - - function = func; - arg = threadarg; - - mutex.lock (); - win32_obj_id = ::CreateThread (&sec_none_nih, attr.stacksize, - thread_init_wrapper, this, 0, &thread_id); - - if (!win32_obj_id) - { - thread_printf ("CreateThread failed: this %p, %E", this); - magic = 0; - } - else - { - postcreate (); - while (!cygtls) - low_priority_sleep (0); - } - retval = magic; - mutex.unlock (); - return retval; -} - -void -pthread::postcreate () -{ - valid = true; - - InterlockedIncrement (&MT_INTERFACE->threadcount); - /* FIXME: set the priority appropriately for system contention scope */ - if (attr.inheritsched == PTHREAD_EXPLICIT_SCHED) - { - /* FIXME: set the scheduling settings for the new thread */ - /* sched_thread_setparam (win32_obj_id, attr.schedparam); */ - } -} - -void -pthread::exit (void *value_ptr) -{ - class pthread *thread = this; - - // run cleanup handlers - pop_all_cleanup_handlers (); - - pthread_key::run_all_destructors (); - - mutex.lock (); - // cleanup if thread is in detached state and not joined - if (equal (joiner, thread)) - delete this; - else - { - valid = false; - return_ptr = value_ptr; - mutex.unlock (); - } - - if (_my_tls.local_clib.__sdidinit < 0) - _my_tls.local_clib.__sdidinit = 0; - (_reclaim_reent) (_REENT); - - - if (InterlockedDecrement (&MT_INTERFACE->threadcount) == 0) - ::exit (0); - else - { - _my_tls.remove (INFINITE); - ExitThread (0); - } -} - -int -pthread::cancel () -{ - class pthread *thread = this; - class pthread *self = pthread::self (); - - mutex.lock (); - - if (!valid) - { - mutex.unlock (); - return 0; - } - - if (canceltype == PTHREAD_CANCEL_DEFERRED || - cancelstate == PTHREAD_CANCEL_DISABLE) - { - // cancel deferred - mutex.unlock (); - SetEvent (cancel_event); - return 0; - } - else if (equal (thread, self)) - { - mutex.unlock (); - cancel_self (); - return 0; // Never reached - } - - // cancel asynchronous - SuspendThread (win32_obj_id); - if (WaitForSingleObject (win32_obj_id, 0) == WAIT_TIMEOUT) - { - CONTEXT context; - context.ContextFlags = CONTEXT_CONTROL; - GetThreadContext (win32_obj_id, &context); - context.Eip = (DWORD) pthread::static_cancel_self; - SetThreadContext (win32_obj_id, &context); - } - mutex.unlock (); - ResumeThread (win32_obj_id); - - return 0; -/* - TODO: insert pthread_testcancel into the required functions - the required function list is: *indicates done, X indicates not present in cygwin. -aio_suspend () -*close () -*creat () -fcntl () -fsync () -getmsg () -getpmsg () -lockf () -mq_receive () -mq_send () -msgrcv () -msgsnd () -msync () -nanosleep () -open () -*pause () -poll () -pread () -*pthread_cond_timedwait () -*pthread_cond_wait () -*pthread_join () -*pthread_testcancel () -putmsg () -putpmsg () -pwrite () -read () -readv () -select () -*sem_wait () -*sigpause () -*sigsuspend () -sigtimedwait () -sigwait () -sigwaitinfo () -*sleep () -*system () -tcdrain () -*usleep () -*wait () -*wait3() -waitid () -*waitpid () -write () -writev () - -the optional list is: -catclose () -catgets () -catopen () -closedir () -closelog () -ctermid () -dbm_close () -dbm_delete () -dbm_fetch () -dbm_nextkey () -dbm_open () -dbm_store () -dlclose () -dlopen () -endgrent () -endpwent () -endutxent () -fclose () -fcntl () -fflush () -fgetc () -fgetpos () -fgets () -fgetwc () -fgetws () -fopen () -fprintf () -fputc () -fputs () -fputwc () -fputws () -fread () -freopen () -fscanf () -fseek () -fseeko () -fsetpos () -ftell () -ftello () -ftw () -fwprintf () -fwrite () -fwscanf () -getc () -getc_unlocked () -getchar () -getchar_unlocked () -getcwd () -getdate () -getgrent () -getgrgid () -getgrgid_r () -getgrnam () -getgrnam_r () -getlogin () -getlogin_r () -getpwent () -*getpwnam () -*getpwnam_r () -*getpwuid () -*getpwuid_r () -gets () -getutxent () -getutxid () -getutxline () -getw () -getwc () -getwchar () -getwd () -glob () -iconv_close () -iconv_open () -ioctl () -lseek () -mkstemp () -nftw () -opendir () -openlog () -pclose () -perror () -popen () -printf () -putc () -putc_unlocked () -putchar () -putchar_unlocked () -puts () -pututxline () -putw () -putwc () -putwchar () -readdir () -readdir_r () -remove () -rename () -rewind () -rewinddir () -scanf () -seekdir () -semop () -setgrent () -setpwent () -setutxent () -strerror () -syslog () -tmpfile () -tmpnam () -ttyname () -ttyname_r () -ungetc () -ungetwc () -unlink () -vfprintf () -vfwprintf () -vprintf () -vwprintf () -wprintf () -wscanf () - -Note, that for fcntl (), for any value of the cmd argument. - -And we must not introduce cancellation points anywhere else that's part of the posix or -opengroup specs. - */ -} - -void -pthread::testcancel () -{ - if (cancelstate == PTHREAD_CANCEL_DISABLE) - return; - - if (WaitForSingleObject (cancel_event, 0) == WAIT_OBJECT_0) - cancel_self (); -} - -void -pthread::static_cancel_self () -{ - pthread::self ()->cancel_self (); -} - -DWORD -cancelable_wait (HANDLE object, DWORD timeout, const cw_cancel_action cancel_action, - const enum cw_sig_wait sig_wait) -{ - DWORD res; - DWORD num = 0; - HANDLE wait_objects[3]; - pthread_t thread = pthread::self (); - - /* Do not change the wait order. - The object must have higher priority than the cancel event, - because WaitForMultipleObjects will return the smallest index - if both objects are signaled. */ - wait_objects[num++] = object; - DWORD cancel_n; - if (cancel_action == cw_no_cancel || !pthread::is_good_object (&thread) || - thread->cancelstate == PTHREAD_CANCEL_DISABLE) - cancel_n = (DWORD) -1; - else - { - cancel_n = WAIT_OBJECT_0 + num++; - wait_objects[cancel_n] = thread->cancel_event; - } - - DWORD sig_n; - if (sig_wait == cw_sig_nosig || &_my_tls != _main_tls) - sig_n = (DWORD) -1; - else - { - sig_n = WAIT_OBJECT_0 + num++; - wait_objects[sig_n] = signal_arrived; - } - - while (1) - { - res = WaitForMultipleObjects (num, wait_objects, FALSE, timeout); - if (res == cancel_n) - { - if (cancel_action == cw_cancel_self) - pthread::static_cancel_self (); - res = WAIT_CANCELED; - } - else if (res != sig_n) - /* all set */; - else if (sig_wait == cw_sig_eintr) - res = WAIT_SIGNALED; - else - { - _my_tls.call_signal_handler (); - continue; - } - break; - } - return res; -} - -int -pthread::setcancelstate (int state, int *oldstate) -{ - int result = 0; - - mutex.lock (); - - if (state != PTHREAD_CANCEL_ENABLE && state != PTHREAD_CANCEL_DISABLE) - result = EINVAL; - else - { - if (oldstate) - *oldstate = cancelstate; - cancelstate = state; - } - - mutex.unlock (); - - return result; -} - -int -pthread::setcanceltype (int type, int *oldtype) -{ - int result = 0; - - mutex.lock (); - - if (type != PTHREAD_CANCEL_DEFERRED && type != PTHREAD_CANCEL_ASYNCHRONOUS) - result = EINVAL; - else - { - if (oldtype) - *oldtype = canceltype; - canceltype = type; - } - - mutex.unlock (); - - return result; -} - -void -pthread::push_cleanup_handler (__pthread_cleanup_handler *handler) -{ - if (this != self ()) - // TODO: do it? - api_fatal ("Attempt to push a cleanup handler across threads"); - handler->next = cleanup_stack; - cleanup_stack = handler; -} - -void -pthread::pop_cleanup_handler (int const execute) -{ - if (this != self ()) - // TODO: send a signal or something to the thread ? - api_fatal ("Attempt to execute a cleanup handler across threads"); - - mutex.lock (); - - if (cleanup_stack != NULL) - { - __pthread_cleanup_handler *handler = cleanup_stack; - - if (execute) - (*handler->function) (handler->arg); - cleanup_stack = handler->next; - } - - mutex.unlock (); -} - -void -pthread::pop_all_cleanup_handlers () -{ - while (cleanup_stack != NULL) - pop_cleanup_handler (1); -} - -void -pthread::cancel_self () -{ - exit (PTHREAD_CANCELED); -} - -DWORD -pthread::get_thread_id () -{ - return thread_id; -} - -void -pthread::_fixup_after_fork () -{ - /* set thread to not running if it is not the forking thread */ - if (this != pthread::self ()) - { - magic = 0; - valid = false; - win32_obj_id = NULL; - cancel_event = NULL; - } -} - -void -pthread::suspend_except_self () -{ - if (valid && this != pthread::self ()) - SuspendThread (win32_obj_id); -} - -void -pthread::resume () -{ - if (valid) - ResumeThread (win32_obj_id); -} - -/* instance members */ - -pthread_attr::pthread_attr ():verifyable_object (PTHREAD_ATTR_MAGIC), -joinable (PTHREAD_CREATE_JOINABLE), contentionscope (PTHREAD_SCOPE_PROCESS), -inheritsched (PTHREAD_INHERIT_SCHED), stacksize (0) -{ - schedparam.sched_priority = 0; -} - -pthread_attr::~pthread_attr () -{ -} - -pthread_condattr::pthread_condattr ():verifyable_object - (PTHREAD_CONDATTR_MAGIC), shared (PTHREAD_PROCESS_PRIVATE) -{ -} - -pthread_condattr::~pthread_condattr () -{ -} - -List pthread_cond::conds; - -/* This is used for cond creation protection within a single process only */ -fast_mutex NO_COPY pthread_cond::cond_initialization_lock; - -/* We can only be called once. - TODO: (no rush) use a non copied memory section to - hold an initialization flag. */ -void -pthread_cond::init_mutex () -{ - if (!cond_initialization_lock.init ()) - api_fatal ("Could not create win32 Mutex for pthread cond static initializer support."); -} - -pthread_cond::pthread_cond (pthread_condattr *attr) : - verifyable_object (PTHREAD_COND_MAGIC), - shared (0), waiting (0), pending (0), sem_wait (NULL), - mtx_cond(NULL), next (NULL) -{ - pthread_mutex *verifyable_mutex_obj; - - if (attr) - if (attr->shared != PTHREAD_PROCESS_PRIVATE) - { - magic = 0; - return; - } - - verifyable_mutex_obj = &mtx_in; - if (!pthread_mutex::is_good_object (&verifyable_mutex_obj)) - { - thread_printf ("Internal cond mutex is not valid. this %p", this); - magic = 0; - return; - } - /* - * Change the mutex type to NORMAL. - * This mutex MUST be of type normal - */ - mtx_in.type = PTHREAD_MUTEX_NORMAL; - - verifyable_mutex_obj = &mtx_out; - if (!pthread_mutex::is_good_object (&verifyable_mutex_obj)) - { - thread_printf ("Internal cond mutex is not valid. this %p", this); - magic = 0; - return; - } - /* Change the mutex type to NORMAL to speed up mutex operations */ - mtx_out.type = PTHREAD_MUTEX_NORMAL; - - sem_wait = ::CreateSemaphore (&sec_none_nih, 0, LONG_MAX, NULL); - if (!sem_wait) - { - debug_printf ("CreateSemaphore failed. %E"); - magic = 0; - return; - } - - conds.insert (this); -} - -pthread_cond::~pthread_cond () -{ - if (sem_wait) - CloseHandle (sem_wait); - - conds.remove (this); -} - -void -pthread_cond::unblock (const bool all) -{ - unsigned long releaseable; - - /* - * Block outgoing threads (and avoid simultanous unblocks) - */ - mtx_out.lock (); - - releaseable = waiting - pending; - if (releaseable) - { - unsigned long released; - - if (!pending) - { - /* - * Block incoming threads until all waiting threads are released. - */ - mtx_in.lock (); - - /* - * Calculate releaseable again because threads can enter until - * the semaphore has been taken, but they can not leave, therefore pending - * is unchanged and releaseable can only get higher - */ - releaseable = waiting - pending; - } - - released = all ? releaseable : 1; - pending += released; - /* - * Signal threads - */ - ::ReleaseSemaphore (sem_wait, released, NULL); - } - - /* - * And let the threads release. - */ - mtx_out.unlock (); -} - -int -pthread_cond::wait (pthread_mutex_t mutex, DWORD dwMilliseconds) -{ - DWORD rv; - - mtx_in.lock (); - if (InterlockedIncrement ((long *)&waiting) == 1) - mtx_cond = mutex; - else if (mtx_cond != mutex) - { - InterlockedDecrement ((long *)&waiting); - mtx_in.unlock (); - return EINVAL; - } - mtx_in.unlock (); - - /* - * Release the mutex and wait on semaphore - */ - ++mutex->condwaits; - mutex->unlock (); - - rv = cancelable_wait (sem_wait, dwMilliseconds, cw_no_cancel_self, cw_sig_eintr); - - mtx_out.lock (); - - if (rv != WAIT_OBJECT_0) - { - /* - * It might happen that a signal is sent while the thread got canceled - * or timed out. Try to take one. - * If the thread gets one than a signal|broadcast is in progress. - */ - if (WaitForSingleObject (sem_wait, 0) == WAIT_OBJECT_0) - /* - * thread got cancelled ot timed out while a signalling is in progress. - * Set wait result back to signaled - */ - rv = WAIT_OBJECT_0; - } - - InterlockedDecrement ((long *)&waiting); - - if (rv == WAIT_OBJECT_0 && --pending == 0) - /* - * All signaled threads are released, - * new threads can enter Wait - */ - mtx_in.unlock (); - - mtx_out.unlock (); - - mutex->lock (); - --mutex->condwaits; - - if (rv == WAIT_CANCELED) - pthread::static_cancel_self (); - else if (rv == WAIT_SIGNALED) - /* SUSv3 states: If a signal is delivered to a thread waiting for a - condition variable, upon return from the signal handler the thread - resumes waiting for the condition variable as if it was not - interrupted, or it shall return zero due to spurious wakeup. - We opt for the latter choice here. */ - return 0; - else if (rv == WAIT_TIMEOUT) - return ETIMEDOUT; - - return 0; -} - -void -pthread_cond::_fixup_after_fork () -{ - waiting = pending = 0; - mtx_cond = NULL; - - /* Unlock eventually locked mutexes */ - mtx_in.unlock (); - mtx_out.unlock (); - - sem_wait = ::CreateSemaphore (&sec_none_nih, 0, LONG_MAX, NULL); - if (!sem_wait) - api_fatal ("pthread_cond::_fixup_after_fork () failed to recreate win32 semaphore"); -} - -pthread_rwlockattr::pthread_rwlockattr ():verifyable_object - (PTHREAD_RWLOCKATTR_MAGIC), shared (PTHREAD_PROCESS_PRIVATE) -{ -} - -pthread_rwlockattr::~pthread_rwlockattr () -{ -} - -List pthread_rwlock::rwlocks; - -/* This is used for rwlock creation protection within a single process only */ -fast_mutex NO_COPY pthread_rwlock::rwlock_initialization_lock; - -/* We can only be called once. - TODO: (no rush) use a non copied memory section to - hold an initialization flag. */ -void -pthread_rwlock::init_mutex () -{ - if (!rwlock_initialization_lock.init ()) - api_fatal ("Could not create win32 Mutex for pthread rwlock static initializer support."); -} - -pthread_rwlock::pthread_rwlock (pthread_rwlockattr *attr) : - verifyable_object (PTHREAD_RWLOCK_MAGIC), - shared (0), waiting_readers (0), waiting_writers (0), writer (NULL), - readers (NULL), readers_mx (), mtx (NULL), cond_readers (NULL), cond_writers (NULL), - next (NULL) -{ - pthread_mutex *verifyable_mutex_obj = &mtx; - pthread_cond *verifyable_cond_obj; - - if (!readers_mx.init ()) - { - thread_printf ("Internal rwlock synchronisation mutex is not valid. this %p", this); - magic = 0; - return; - } - - if (attr) - if (attr->shared != PTHREAD_PROCESS_PRIVATE) - { - magic = 0; - return; - } - - if (!pthread_mutex::is_good_object (&verifyable_mutex_obj)) - { - thread_printf ("Internal rwlock mutex is not valid. this %p", this); - magic = 0; - return; - } - /* Change the mutex type to NORMAL to speed up mutex operations */ - mtx.type = PTHREAD_MUTEX_NORMAL; - - verifyable_cond_obj = &cond_readers; - if (!pthread_cond::is_good_object (&verifyable_cond_obj)) - { - thread_printf ("Internal rwlock readers cond is not valid. this %p", this); - magic = 0; - return; - } - - verifyable_cond_obj = &cond_writers; - if (!pthread_cond::is_good_object (&verifyable_cond_obj)) - { - thread_printf ("Internal rwlock writers cond is not valid. this %p", this); - magic = 0; - return; - } - - - rwlocks.insert (this); -} - -pthread_rwlock::~pthread_rwlock () -{ - rwlocks.remove (this); -} - -int -pthread_rwlock::rdlock () -{ - int result = 0; - struct RWLOCK_READER *reader; - pthread_t self = pthread::self (); - - mtx.lock (); - - if (lookup_reader (self)) - { - result = EDEADLK; - goto DONE; - } - - reader = new struct RWLOCK_READER; - if (!reader) - { - result = EAGAIN; - goto DONE; - } - - while (writer || waiting_writers) - { - pthread_cleanup_push (pthread_rwlock::rdlock_cleanup, this); - - ++waiting_readers; - cond_readers.wait (&mtx); - --waiting_readers; - - pthread_cleanup_pop (0); - } - - reader->thread = self; - add_reader (reader); - - DONE: - mtx.unlock (); - - return result; -} - -int -pthread_rwlock::tryrdlock () -{ - int result = 0; - pthread_t self = pthread::self (); - - mtx.lock (); - - if (writer || waiting_writers || lookup_reader (self)) - result = EBUSY; - else - { - struct RWLOCK_READER *reader = new struct RWLOCK_READER; - if (reader) - { - reader->thread = self; - add_reader (reader); - } - else - result = EAGAIN; - } - - mtx.unlock (); - - return result; -} - -int -pthread_rwlock::wrlock () -{ - int result = 0; - pthread_t self = pthread::self (); - - mtx.lock (); - - if (writer == self || lookup_reader (self)) - { - result = EDEADLK; - goto DONE; - } - - while (writer || readers) - { - pthread_cleanup_push (pthread_rwlock::wrlock_cleanup, this); - - ++waiting_writers; - cond_writers.wait (&mtx); - --waiting_writers; - - pthread_cleanup_pop (0); - } - - writer = self; - - DONE: - mtx.unlock (); - - return result; -} - -int -pthread_rwlock::trywrlock () -{ - int result = 0; - pthread_t self = pthread::self (); - - mtx.lock (); - - if (writer || readers) - result = EBUSY; - else - writer = self; - - mtx.unlock (); - - return result; -} - -int -pthread_rwlock::unlock () -{ - int result = 0; - pthread_t self = pthread::self (); - - mtx.lock (); - - if (writer) - { - if (writer != self) - { - result = EPERM; - goto DONE; - } - - writer = NULL; - } - else - { - struct RWLOCK_READER *reader = lookup_reader (self); - - if (!reader) - { - result = EPERM; - goto DONE; - } - - remove_reader (reader); - delete reader; - } - - release (); - - DONE: - mtx.unlock (); - - return result; -} - -void -pthread_rwlock::add_reader (struct RWLOCK_READER *rd) -{ - List_insert (readers, rd); -} - -void -pthread_rwlock::remove_reader (struct RWLOCK_READER *rd) -{ - List_remove (readers_mx, readers, rd); -} - -struct pthread_rwlock::RWLOCK_READER * -pthread_rwlock::lookup_reader (pthread_t thread) -{ - readers_mx.lock (); - - struct RWLOCK_READER *cur = readers; - - while (cur && cur->thread != thread) - cur = cur->next; - - readers_mx.unlock (); - - return cur; -} - -void -pthread_rwlock::rdlock_cleanup (void *arg) -{ - pthread_rwlock *rwlock = (pthread_rwlock *) arg; - - --(rwlock->waiting_readers); - rwlock->release (); - rwlock->mtx.unlock (); -} - -void -pthread_rwlock::wrlock_cleanup (void *arg) -{ - pthread_rwlock *rwlock = (pthread_rwlock *) arg; - - --(rwlock->waiting_writers); - rwlock->release (); - rwlock->mtx.unlock (); -} - -void -pthread_rwlock::_fixup_after_fork () -{ - pthread_t self = pthread::self (); - struct RWLOCK_READER **temp = &readers; - - waiting_readers = 0; - waiting_writers = 0; - - if (!readers_mx.init ()) - api_fatal ("pthread_rwlock::_fixup_after_fork () failed to recreate mutex"); - - /* Unlock eventually locked mutex */ - mtx.unlock (); - /* - * Remove all readers except self - */ - while (*temp) - { - if ((*temp)->thread == self) - temp = &((*temp)->next); - else - { - struct RWLOCK_READER *cur = *temp; - *temp = (*temp)->next; - delete cur; - } - } -} - -/* pthread_key */ -/* static members */ -/* This stores pthread_key information across fork() boundaries */ -List pthread_key::keys; - -/* non-static members */ - -pthread_key::pthread_key (void (*aDestructor) (void *)):verifyable_object (PTHREAD_KEY_MAGIC), destructor (aDestructor) -{ - tls_index = TlsAlloc (); - if (tls_index == TLS_OUT_OF_INDEXES) - magic = 0; - else - keys.insert (this); -} - -pthread_key::~pthread_key () -{ - /* We may need to make the list code lock the list during operations - */ - if (magic != 0) - { - keys.remove (this); - TlsFree (tls_index); - } -} - -void -pthread_key::_fixup_before_fork () -{ - fork_buf = get (); -} - -void -pthread_key::_fixup_after_fork () -{ - tls_index = TlsAlloc (); - if (tls_index == TLS_OUT_OF_INDEXES) - api_fatal ("pthread_key::recreate_key_from_buffer () failed to reallocate Tls storage"); - set (fork_buf); -} - -void -pthread_key::run_destructor () -{ - if (destructor) - { - void *oldValue = get (); - if (oldValue) - { - set (NULL); - destructor (oldValue); - } - } -} - -/* pshared mutexs: - - REMOVED FROM CURRENT. These can be reinstated with the daemon, when all the - gymnastics can be a lot easier. - - the mutex_t (size 4) is not used as a verifyable object because we cannot - guarantee the same address space for all processes. - we use the following: - high bit set (never a valid address). - second byte is reserved for the priority. - third byte is reserved - fourth byte is the mutex id. (max 255 cygwin mutexs system wide). - creating mutex's does get slower and slower, but as creation is a one time - job, it should never become an issue - - And if you're looking at this and thinking, why not an array in cygwin for all mutexs, - - you incur a penalty on _every_ mutex call and you have toserialise them all. - ... Bad karma. - - option 2? put everything in userspace and update the ABI? - - bad karma as well - the HANDLE, while identical across process's, - Isn't duplicated, it's reopened. */ - -/* static members */ - -List pthread_mutex::mutexes; - -/* This is used for mutex creation protection within a single process only */ -fast_mutex NO_COPY pthread_mutex::mutex_initialization_lock; - -/* We can only be called once. - TODO: (no rush) use a non copied memory section to - hold an initialization flag. */ -void -pthread_mutex::init_mutex () -{ - if (!mutex_initialization_lock.init ()) - api_fatal ("Could not create win32 Mutex for pthread mutex static initializer support."); -} - -pthread_mutex::pthread_mutex (pthread_mutexattr *attr) : - verifyable_object (PTHREAD_MUTEX_MAGIC), - lock_counter (0), - win32_obj_id (NULL), recursion_counter (0), - condwaits (0), owner (NULL), type (PTHREAD_MUTEX_ERRORCHECK), - pshared (PTHREAD_PROCESS_PRIVATE) -{ - win32_obj_id = ::CreateSemaphore (&sec_none_nih, 0, LONG_MAX, NULL); - if (!win32_obj_id) - { - magic = 0; - return; - } - /*attr checked in the C call */ - if (attr) - { - if (attr->pshared == PTHREAD_PROCESS_SHARED) - { - // fail - magic = 0; - return; - } - - type = attr->mutextype; - } - - mutexes.insert (this); -} - -pthread_mutex::~pthread_mutex () -{ - if (win32_obj_id) - CloseHandle (win32_obj_id); - - mutexes.remove (this); -} - -int -pthread_mutex::_lock (pthread_t self) -{ - int result = 0; - - if (InterlockedIncrement ((long *)&lock_counter) == 1) - set_owner (self); - else if (type == PTHREAD_MUTEX_NORMAL || !pthread::equal (owner, self)) - { - cancelable_wait (win32_obj_id, INFINITE, cw_no_cancel, cw_sig_resume); - set_owner (self); - } - else - { - InterlockedDecrement ((long *) &lock_counter); - if (type == PTHREAD_MUTEX_RECURSIVE) - result = lock_recursive (); - else - result = EDEADLK; - } - - return result; -} - -int -pthread_mutex::_trylock (pthread_t self) -{ - int result = 0; - - if (InterlockedCompareExchange ((long *) &lock_counter, 1, 0) == 0) - set_owner (self); - else if (type == PTHREAD_MUTEX_RECURSIVE && pthread::equal (owner, self)) - result = lock_recursive (); - else - result = EBUSY; - - return result; -} - -int -pthread_mutex::_unlock (pthread_t self) -{ - if (!pthread::equal (owner, self)) - return EPERM; - - if (--recursion_counter == 0) - { - owner = NULL; - if (InterlockedDecrement ((long *)&lock_counter)) - // Another thread is waiting - ::ReleaseSemaphore (win32_obj_id, 1, NULL); - } - - return 0; -} - -int -pthread_mutex::_destroy (pthread_t self) -{ - if (condwaits || _trylock (self)) - // Do not destroy a condwaited or locked mutex - return EBUSY; - else if (recursion_counter != 1) - { - // Do not destroy a recursive locked mutex - --recursion_counter; - return EBUSY; - } - - delete this; - return 0; -} - -void -pthread_mutex::_fixup_after_fork () -{ - debug_printf ("mutex %x in _fixup_after_fork", this); - if (pshared != PTHREAD_PROCESS_PRIVATE) - api_fatal ("pthread_mutex::_fixup_after_fork () doesn'tunderstand PROCESS_SHARED mutex's"); - - if (owner == NULL) - /* mutex has no owner, reset to initial */ - lock_counter = 0; - else if (lock_counter != 0) - /* All waiting threads are gone after a fork */ - lock_counter = 1; - - win32_obj_id = ::CreateSemaphore (&sec_none_nih, 0, LONG_MAX, NULL); - if (!win32_obj_id) - api_fatal ("pthread_mutex::_fixup_after_fork () failed to recreate win32 semaphore for mutex"); - - condwaits = 0; -} - -pthread_mutexattr::pthread_mutexattr ():verifyable_object (PTHREAD_MUTEXATTR_MAGIC), -pshared (PTHREAD_PROCESS_PRIVATE), mutextype (PTHREAD_MUTEX_ERRORCHECK) -{ -} - -pthread_mutexattr::~pthread_mutexattr () -{ -} - -List semaphore::semaphores; - -semaphore::semaphore (int pshared, unsigned int value) -: verifyable_object (SEM_MAGIC), - shared (pshared), - currentvalue (value), - name (NULL) -{ - SECURITY_ATTRIBUTES sa = (pshared != PTHREAD_PROCESS_PRIVATE) - ? sec_all : sec_none_nih; - this->win32_obj_id = ::CreateSemaphore (&sa, value, LONG_MAX, NULL); - if (!this->win32_obj_id) - magic = 0; - - semaphores.insert (this); -} - -semaphore::semaphore (const char *sem_name, int oflag, mode_t mode, - unsigned int value) -: verifyable_object (SEM_MAGIC), - shared (PTHREAD_PROCESS_SHARED), - currentvalue (value), /* Unused for named semaphores. */ - name (NULL) -{ - if (oflag & O_CREAT) - { - SECURITY_ATTRIBUTES sa = sec_all; - security_descriptor sd; - if (allow_ntsec) - set_security_attribute (mode, &sa, sd); - this->win32_obj_id = ::CreateSemaphore (&sa, value, LONG_MAX, sem_name); - if (!this->win32_obj_id) - magic = 0; - if (GetLastError () == ERROR_ALREADY_EXISTS && (oflag & O_EXCL)) - { - __seterrno (); - CloseHandle (this->win32_obj_id); - magic = 0; - } - } - else - { - this->win32_obj_id = ::OpenSemaphore (SEMAPHORE_ALL_ACCESS, FALSE, - sem_name); - if (!this->win32_obj_id) - { - __seterrno (); - magic = 0; - } - } - if (magic) - { - name = new char [strlen (sem_name + 1)]; - if (!name) - { - set_errno (ENOSPC); - CloseHandle (this->win32_obj_id); - magic = 0; - } - else - strcpy (name, sem_name); - } - - semaphores.insert (this); -} - -semaphore::~semaphore () -{ - if (win32_obj_id) - CloseHandle (win32_obj_id); - - delete [] name; - - semaphores.remove (this); -} - -void -semaphore::_post () -{ - if (ReleaseSemaphore (win32_obj_id, 1, ¤tvalue)) - currentvalue++; -} - -int -semaphore::_getvalue (int *sval) -{ - long val; - - switch (WaitForSingleObject (win32_obj_id, 0)) - { - case WAIT_OBJECT_0: - ReleaseSemaphore (win32_obj_id, 1, &val); - *sval = val + 1; - break; - case WAIT_TIMEOUT: - *sval = 0; - break; - default: - set_errno (EAGAIN); - return -1; - } - return 0; -} - -int -semaphore::_trywait () -{ - /* FIXME: signals should be able to interrupt semaphores... - We probably need WaitForMultipleObjects here. */ - if (WaitForSingleObject (win32_obj_id, 0) == WAIT_TIMEOUT) - { - set_errno (EAGAIN); - return -1; - } - currentvalue--; - return 0; -} - -int -semaphore::_timedwait (const struct timespec *abstime) -{ - struct timeval tv; - long waitlength; - - myfault efault; - if (efault.faulted ()) - { - /* According to SUSv3, abstime need not be checked for validity, - if the semaphore can be locked immediately. */ - if (!_trywait ()) - return 0; - set_errno (EINVAL); - return -1; - } - - gettimeofday (&tv, NULL); - waitlength = abstime->tv_sec * 1000 + abstime->tv_nsec / (1000 * 1000); - waitlength -= tv.tv_sec * 1000 + tv.tv_usec / 1000; - if (waitlength < 0) - waitlength = 0; - switch (cancelable_wait (win32_obj_id, waitlength, cw_cancel_self, cw_sig_eintr)) - { - case WAIT_OBJECT_0: - currentvalue--; - break; - case WAIT_SIGNALED: - set_errno (EINTR); - return -1; - case WAIT_TIMEOUT: - set_errno (ETIMEDOUT); - return -1; - default: - debug_printf ("cancelable_wait failed. %E"); - __seterrno (); - return -1; - } - return 0; -} - -int -semaphore::_wait () -{ - switch (cancelable_wait (win32_obj_id, INFINITE, cw_cancel_self, cw_sig_eintr)) - { - case WAIT_OBJECT_0: - currentvalue--; - break; - case WAIT_SIGNALED: - set_errno (EINTR); - return -1; - default: - debug_printf ("cancelable_wait failed. %E"); - break; - } - return 0; -} - -void -semaphore::_fixup_after_fork () -{ - if (shared == PTHREAD_PROCESS_PRIVATE) - { - debug_printf ("sem %x in _fixup_after_fork", this); - /* FIXME: duplicate code here and in the constructor. */ - this->win32_obj_id = ::CreateSemaphore (&sec_none_nih, currentvalue, - LONG_MAX, NULL); - if (!win32_obj_id) - api_fatal ("failed to create new win32 semaphore, error %d"); - } -} - -verifyable_object::verifyable_object (long verifyer): -magic (verifyer) -{ -} - -verifyable_object::~verifyable_object () -{ - magic = 0; -} - -DWORD WINAPI -pthread::thread_init_wrapper (void *arg) -{ - pthread *thread = (pthread *) arg; - set_tls_self_pointer (thread); - - thread->mutex.lock (); - - // if thread is detached force cleanup on exit - if (thread->attr.joinable == PTHREAD_CREATE_DETACHED && thread->joiner == NULL) - thread->joiner = thread; - thread->mutex.unlock (); - - thread_printf ("started thread %p %p %p %p %p %p", arg, &_my_tls.local_clib, - _impure_ptr, thread, thread->function, thread->arg); - - // call the user's thread - void *ret = thread->function (thread->arg); - - thread->exit (ret); - - return 0; // just for show. Never returns. -} - -unsigned long -pthread::getsequence_np () -{ - return get_thread_id (); -} - -int -pthread::create (pthread_t *thread, const pthread_attr_t *attr, - void *(*start_routine) (void *), void *arg) -{ - if (attr && !pthread_attr::is_good_object (attr)) - return EINVAL; - - *thread = new pthread (); - if (!(*thread)->create (start_routine, attr ? *attr : NULL, arg)) - { - delete (*thread); - *thread = NULL; - return EAGAIN; - } - - return 0; -} - -int -pthread::once (pthread_once_t *once_control, void (*init_routine) (void)) -{ - // already done ? - if (once_control->state) - return 0; - - pthread_mutex_lock (&once_control->mutex); - /* Here we must set a cancellation handler to unlock the mutex if needed */ - /* but a cancellation handler is not the right thing. We need this in the thread - *cleanup routine. Assumption: a thread can only be in one pthread_once routine - *at a time. Stote a mutex_t *in the pthread_structure. if that's non null unlock - *on pthread_exit (); - */ - if (!once_control->state) - { - init_routine (); - once_control->state = 1; - } - /* Here we must remove our cancellation handler */ - pthread_mutex_unlock (&once_control->mutex); - return 0; -} - -int -pthread::cancel (pthread_t thread) -{ - if (!is_good_object (&thread)) - return ESRCH; - - return thread->cancel (); -} - -void -pthread::atforkprepare () -{ - callback *cb = MT_INTERFACE->pthread_prepare; - while (cb) - { - cb->cb (); - cb = cb->next; - } - - __fp_lock_all (); - - MT_INTERFACE->fixup_before_fork (); -} - -void -pthread::atforkparent () -{ - __fp_unlock_all (); - - callback *cb = MT_INTERFACE->pthread_parent; - while (cb) - { - cb->cb (); - cb = cb->next; - } -} - -void -pthread::atforkchild () -{ - MT_INTERFACE->fixup_after_fork (); - - __fp_unlock_all (); - - callback *cb = MT_INTERFACE->pthread_child; - while (cb) - { - cb->cb (); - cb = cb->next; - } -} - -/* Register a set of functions to run before and after fork. - prepare calls are called in LI-FC order. - parent and child calls are called in FI-FC order. */ -int -pthread::atfork (void (*prepare)(void), void (*parent)(void), void (*child)(void)) -{ - callback *prepcb = NULL, *parentcb = NULL, *childcb = NULL; - if (prepare) - { - prepcb = new callback; - if (!prepcb) - return ENOMEM; - } - if (parent) - { - parentcb = new callback; - if (!parentcb) - { - if (prepcb) - delete prepcb; - return ENOMEM; - } - } - if (child) - { - childcb = new callback; - if (!childcb) - { - if (prepcb) - delete prepcb; - if (parentcb) - delete parentcb; - return ENOMEM; - } - } - - if (prepcb) - { - prepcb->cb = prepare; - List_insert (MT_INTERFACE->pthread_prepare, prepcb); - } - if (parentcb) - { - parentcb->cb = parent; - callback **t = &MT_INTERFACE->pthread_parent; - while (*t) - t = &(*t)->next; - /* t = pointer to last next in the list */ - List_insert (*t, parentcb); - } - if (childcb) - { - childcb->cb = child; - callback **t = &MT_INTERFACE->pthread_child; - while (*t) - t = &(*t)->next; - /* t = pointer to last next in the list */ - List_insert (*t, childcb); - } - return 0; -} - -extern "C" int -pthread_attr_init (pthread_attr_t *attr) -{ - if (pthread_attr::is_good_object (attr)) - return EBUSY; - - *attr = new pthread_attr; - if (!pthread_attr::is_good_object (attr)) - { - delete (*attr); - *attr = NULL; - return ENOMEM; - } - return 0; -} - -extern "C" int -pthread_attr_getinheritsched (const pthread_attr_t *attr, - int *inheritsched) -{ - if (!pthread_attr::is_good_object (attr)) - return EINVAL; - *inheritsched = (*attr)->inheritsched; - return 0; -} - -extern "C" int -pthread_attr_getschedparam (const pthread_attr_t *attr, - struct sched_param *param) -{ - if (!pthread_attr::is_good_object (attr)) - return EINVAL; - *param = (*attr)->schedparam; - return 0; -} - -/* From a pure code point of view, this should call a helper in sched.cc, - to allow for someone adding scheduler policy changes to win32 in the future. - However that's extremely unlikely, so short and sweet will do us */ -extern "C" int -pthread_attr_getschedpolicy (const pthread_attr_t *attr, int *policy) -{ - if (!pthread_attr::is_good_object (attr)) - return EINVAL; - *policy = SCHED_FIFO; - return 0; -} - - -extern "C" int -pthread_attr_getscope (const pthread_attr_t *attr, int *contentionscope) -{ - if (!pthread_attr::is_good_object (attr)) - return EINVAL; - *contentionscope = (*attr)->contentionscope; - return 0; -} - -extern "C" int -pthread_attr_setdetachstate (pthread_attr_t *attr, int detachstate) -{ - if (!pthread_attr::is_good_object (attr)) - return EINVAL; - if (detachstate < 0 || detachstate > 1) - return EINVAL; - (*attr)->joinable = detachstate; - return 0; -} - -extern "C" int -pthread_attr_getdetachstate (const pthread_attr_t *attr, int *detachstate) -{ - if (!pthread_attr::is_good_object (attr)) - return EINVAL; - *detachstate = (*attr)->joinable; - return 0; -} - -extern "C" int -pthread_attr_setinheritsched (pthread_attr_t *attr, int inheritsched) -{ - if (!pthread_attr::is_good_object (attr)) - return EINVAL; - if (inheritsched != PTHREAD_INHERIT_SCHED - && inheritsched != PTHREAD_EXPLICIT_SCHED) - return ENOTSUP; - (*attr)->inheritsched = inheritsched; - return 0; -} - -extern "C" int -pthread_attr_setschedparam (pthread_attr_t *attr, - const struct sched_param *param) -{ - if (!pthread_attr::is_good_object (attr)) - return EINVAL; - if (!valid_sched_parameters (param)) - return ENOTSUP; - (*attr)->schedparam = *param; - return 0; -} - -/* See __pthread_attr_getschedpolicy for some notes */ -extern "C" int -pthread_attr_setschedpolicy (pthread_attr_t *attr, int policy) -{ - if (!pthread_attr::is_good_object (attr)) - return EINVAL; - if (policy != SCHED_FIFO) - return ENOTSUP; - return 0; -} - -extern "C" int -pthread_attr_setscope (pthread_attr_t *attr, int contentionscope) -{ - if (!pthread_attr::is_good_object (attr)) - return EINVAL; - if (contentionscope != PTHREAD_SCOPE_SYSTEM - && contentionscope != PTHREAD_SCOPE_PROCESS) - return EINVAL; - /* In future, we may be able to support system scope by escalating the thread - priority to exceed the priority class. For now we only support PROCESS scope. */ - if (contentionscope != PTHREAD_SCOPE_PROCESS) - return ENOTSUP; - (*attr)->contentionscope = contentionscope; - return 0; -} - -extern "C" int -pthread_attr_setstacksize (pthread_attr_t *attr, size_t size) -{ - if (!pthread_attr::is_good_object (attr)) - return EINVAL; - (*attr)->stacksize = size; - return 0; -} - -extern "C" int -pthread_attr_getstacksize (const pthread_attr_t *attr, size_t *size) -{ - if (!pthread_attr::is_good_object (attr)) - return EINVAL; - *size = (*attr)->stacksize; - return 0; -} - -extern "C" int -pthread_attr_destroy (pthread_attr_t *attr) -{ - if (!pthread_attr::is_good_object (attr)) - return EINVAL; - delete (*attr); - *attr = NULL; - return 0; -} - -int -pthread::join (pthread_t *thread, void **return_val) -{ - pthread_t joiner = self (); - - joiner->testcancel (); - - // Initialize return val with NULL - if (return_val) - *return_val = NULL; - - if (!is_good_object (&joiner)) - return EINVAL; - - if (!is_good_object (thread)) - return ESRCH; - - if (equal (*thread,joiner)) - return EDEADLK; - - (*thread)->mutex.lock (); - - if ((*thread)->attr.joinable == PTHREAD_CREATE_DETACHED) - { - (*thread)->mutex.unlock (); - return EINVAL; - } - else - { - (*thread)->joiner = joiner; - (*thread)->attr.joinable = PTHREAD_CREATE_DETACHED; - (*thread)->mutex.unlock (); - - switch (cancelable_wait ((*thread)->win32_obj_id, INFINITE, cw_no_cancel_self, cw_sig_resume)) - { - case WAIT_OBJECT_0: - if (return_val) - *return_val = (*thread)->return_ptr; - delete (*thread); - break; - case WAIT_CANCELED: - // set joined thread back to joinable since we got canceled - (*thread)->joiner = NULL; - (*thread)->attr.joinable = PTHREAD_CREATE_JOINABLE; - joiner->cancel_self (); - // never reached - break; - default: - // should never happen - return EINVAL; - } - } - - return 0; -} - -int -pthread::detach (pthread_t *thread) -{ - if (!is_good_object (thread)) - return ESRCH; - - (*thread)->mutex.lock (); - if ((*thread)->attr.joinable == PTHREAD_CREATE_DETACHED) - { - (*thread)->mutex.unlock (); - return EINVAL; - } - - // check if thread is still alive - if ((*thread)->valid && WaitForSingleObject ((*thread)->win32_obj_id, 0) == WAIT_TIMEOUT) - { - // force cleanup on exit - (*thread)->joiner = *thread; - (*thread)->attr.joinable = PTHREAD_CREATE_DETACHED; - (*thread)->mutex.unlock (); - } - else - { - // thread has already terminated. - (*thread)->mutex.unlock (); - delete (*thread); - } - - return 0; -} - -int -pthread::suspend (pthread_t *thread) -{ - if (!is_good_object (thread)) - return ESRCH; - - if ((*thread)->suspended == false) - { - (*thread)->suspended = true; - SuspendThread ((*thread)->win32_obj_id); - } - - return 0; -} - - -int -pthread::resume (pthread_t *thread) -{ - if (!is_good_object (thread)) - return ESRCH; - - if ((*thread)->suspended == true) - ResumeThread ((*thread)->win32_obj_id); - (*thread)->suspended = false; - - return 0; -} - -/* provided for source level compatability. - See http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_getconcurrency.html -*/ -extern "C" int -pthread_getconcurrency () -{ - return MT_INTERFACE->concurrency; -} - -/* keep this in sync with sched.cc */ -extern "C" int -pthread_getschedparam (pthread_t thread, int *policy, - struct sched_param *param) -{ - if (!pthread::is_good_object (&thread)) - return ESRCH; - *policy = SCHED_FIFO; - /* we don't return the current effective priority, we return the current - requested priority */ - *param = thread->attr.schedparam; - return 0; -} - -/* Thread Specific Data */ -extern "C" int -pthread_key_create (pthread_key_t *key, void (*destructor) (void *)) -{ - /* The opengroup docs don't define if we should check this or not, - but creation is relatively rare. */ - if (pthread_key::is_good_object (key)) - return EBUSY; - - *key = new pthread_key (destructor); - - if (!pthread_key::is_good_object (key)) - { - delete (*key); - *key = NULL; - return EAGAIN; - } - return 0; -} - -extern "C" int -pthread_key_delete (pthread_key_t key) -{ - if (!pthread_key::is_good_object (&key)) - return EINVAL; - - delete (key); - return 0; -} - -/* provided for source level compatability. See -http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_getconcurrency.html -*/ -extern "C" int -pthread_setconcurrency (int new_level) -{ - if (new_level < 0) - return EINVAL; - MT_INTERFACE->concurrency = new_level; - return 0; -} - -/* keep syncronised with sched.cc */ -extern "C" int -pthread_setschedparam (pthread_t thread, int policy, - const struct sched_param *param) -{ - if (!pthread::is_good_object (&thread)) - return ESRCH; - if (policy != SCHED_FIFO) - return ENOTSUP; - if (!param) - return EINVAL; - int rv = - sched_set_thread_priority (thread->win32_obj_id, param->sched_priority); - if (!rv) - thread->attr.schedparam.sched_priority = param->sched_priority; - return rv; -} - - -extern "C" int -pthread_setspecific (pthread_key_t key, const void *value) -{ - if (!pthread_key::is_good_object (&key)) - return EINVAL; - (key)->set (value); - return 0; -} - -extern "C" void * -pthread_getspecific (pthread_key_t key) -{ - if (!pthread_key::is_good_object (&key)) - return NULL; - - return (key)->get (); - -} - -extern "C" int -pthread_cond_destroy (pthread_cond_t *cond) -{ - if (pthread_cond::is_good_initializer (cond)) - return 0; - if (!pthread_cond::is_good_object (cond)) - return EINVAL; - - /* reads are atomic */ - if ((*cond)->waiting) - return EBUSY; - - delete (*cond); - *cond = NULL; - - return 0; -} - -int -pthread_cond::init (pthread_cond_t *cond, const pthread_condattr_t *attr) -{ - - pthread_cond_t new_cond; - - if (attr && !pthread_condattr::is_good_object (attr)) - return EINVAL; - - cond_initialization_lock.lock (); - - if (!is_good_initializer_or_bad_object (cond)) - { - cond_initialization_lock.unlock (); - return EBUSY; - } - - new_cond = new pthread_cond (attr ? (*attr) : NULL); - if (!is_good_object (&new_cond)) - { - delete new_cond; - cond_initialization_lock.unlock (); - return EAGAIN; - } - - *cond = new_cond; - cond_initialization_lock.unlock (); - - return 0; -} - -extern "C" int -pthread_cond_broadcast (pthread_cond_t *cond) -{ - if (pthread_cond::is_good_initializer (cond)) - return 0; - if (!pthread_cond::is_good_object (cond)) - return EINVAL; - - (*cond)->unblock (true); - - return 0; -} - -extern "C" int -pthread_cond_signal (pthread_cond_t *cond) -{ - if (pthread_cond::is_good_initializer (cond)) - return 0; - if (!pthread_cond::is_good_object (cond)) - return EINVAL; - - (*cond)->unblock (false); - - return 0; -} - -static int -__pthread_cond_dowait (pthread_cond_t *cond, pthread_mutex_t *mutex, - DWORD waitlength) -{ - if (!pthread_mutex::is_good_object (mutex)) - return EINVAL; - if (!pthread_mutex::can_be_unlocked (mutex)) - return EPERM; - - if (pthread_cond::is_good_initializer (cond)) - pthread_cond::init (cond, NULL); - if (!pthread_cond::is_good_object (cond)) - return EINVAL; - - return (*cond)->wait (*mutex, waitlength); -} - -extern "C" int -pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex, - const struct timespec *abstime) -{ - struct timeval tv; - DWORD waitlength; - - myfault efault; - if (efault.faulted ()) - return EINVAL; - - pthread_testcancel (); - - /* According to SUSv3, the abstime value must be checked for validity. */ - if (abstime->tv_sec < 0 - || abstime->tv_nsec < 0 - || abstime->tv_nsec > 999999999) - return EINVAL; - - gettimeofday (&tv, NULL); - /* Check for immediate timeout before converting to microseconds, since - the resulting value can easily overflow long. This also allows to - evaluate microseconds directly in DWORD. */ - if (tv.tv_sec > abstime->tv_sec - || (tv.tv_sec == abstime->tv_sec - && tv.tv_usec > abstime->tv_nsec / 1000)) - return ETIMEDOUT; - - waitlength = (abstime->tv_sec - tv.tv_sec) * 1000; - waitlength += (abstime->tv_nsec / 1000 - tv.tv_usec) / 1000; - return __pthread_cond_dowait (cond, mutex, waitlength); -} - -extern "C" int -pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) -{ - pthread_testcancel (); - - return __pthread_cond_dowait (cond, mutex, INFINITE); -} - -extern "C" int -pthread_condattr_init (pthread_condattr_t *condattr) -{ - if (pthread_condattr::is_good_object (condattr)) - return EBUSY; - - *condattr = new pthread_condattr; - if (!pthread_condattr::is_good_object (condattr)) - { - delete (*condattr); - *condattr = NULL; - return ENOMEM; - } - return 0; -} - -extern "C" int -pthread_condattr_getpshared (const pthread_condattr_t *attr, int *pshared) -{ - if (!pthread_condattr::is_good_object (attr)) - return EINVAL; - *pshared = (*attr)->shared; - return 0; -} - -extern "C" int -pthread_condattr_setpshared (pthread_condattr_t *attr, int pshared) -{ - if (!pthread_condattr::is_good_object (attr)) - return EINVAL; - if ((pshared < 0) || (pshared > 1)) - return EINVAL; - /* shared cond vars not currently supported */ - if (pshared != PTHREAD_PROCESS_PRIVATE) - return EINVAL; - (*attr)->shared = pshared; - return 0; -} - -extern "C" int -pthread_condattr_destroy (pthread_condattr_t *condattr) -{ - if (!pthread_condattr::is_good_object (condattr)) - return EINVAL; - delete (*condattr); - *condattr = NULL; - return 0; -} - -extern "C" int -pthread_rwlock_destroy (pthread_rwlock_t *rwlock) -{ - if (pthread_rwlock::is_good_initializer (rwlock)) - return 0; - if (!pthread_rwlock::is_good_object (rwlock)) - return EINVAL; - - if ((*rwlock)->writer || (*rwlock)->readers || - (*rwlock)->waiting_readers || (*rwlock)->waiting_writers) - return EBUSY; - - delete (*rwlock); - *rwlock = NULL; - - return 0; -} - -int -pthread_rwlock::init (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr) -{ - pthread_rwlock_t new_rwlock; - - if (attr && !pthread_rwlockattr::is_good_object (attr)) - return EINVAL; - - rwlock_initialization_lock.lock (); - - if (!is_good_initializer_or_bad_object (rwlock)) - { - rwlock_initialization_lock.unlock (); - return EBUSY; - } - - new_rwlock = new pthread_rwlock (attr ? (*attr) : NULL); - if (!is_good_object (&new_rwlock)) - { - delete new_rwlock; - rwlock_initialization_lock.unlock (); - return EAGAIN; - } - - *rwlock = new_rwlock; - rwlock_initialization_lock.unlock (); - - return 0; -} - -extern "C" int -pthread_rwlock_rdlock (pthread_rwlock_t *rwlock) -{ - pthread_testcancel (); - - if (pthread_rwlock::is_good_initializer (rwlock)) - pthread_rwlock::init (rwlock, NULL); - if (!pthread_rwlock::is_good_object (rwlock)) - return EINVAL; - - return (*rwlock)->rdlock (); -} - -extern "C" int -pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock) -{ - if (pthread_rwlock::is_good_initializer (rwlock)) - pthread_rwlock::init (rwlock, NULL); - if (!pthread_rwlock::is_good_object (rwlock)) - return EINVAL; - - return (*rwlock)->tryrdlock (); -} - -extern "C" int -pthread_rwlock_wrlock (pthread_rwlock_t *rwlock) -{ - pthread_testcancel (); - - if (pthread_rwlock::is_good_initializer (rwlock)) - pthread_rwlock::init (rwlock, NULL); - if (!pthread_rwlock::is_good_object (rwlock)) - return EINVAL; - - return (*rwlock)->wrlock (); -} - -extern "C" int -pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock) -{ - if (pthread_rwlock::is_good_initializer (rwlock)) - pthread_rwlock::init (rwlock, NULL); - if (!pthread_rwlock::is_good_object (rwlock)) - return EINVAL; - - return (*rwlock)->trywrlock (); -} - -extern "C" int -pthread_rwlock_unlock (pthread_rwlock_t *rwlock) -{ - if (pthread_rwlock::is_good_initializer (rwlock)) - return 0; - if (!pthread_rwlock::is_good_object (rwlock)) - return EINVAL; - - return (*rwlock)->unlock (); -} - -extern "C" int -pthread_rwlockattr_init (pthread_rwlockattr_t *rwlockattr) -{ - if (pthread_rwlockattr::is_good_object (rwlockattr)) - return EBUSY; - - *rwlockattr = new pthread_rwlockattr; - if (!pthread_rwlockattr::is_good_object (rwlockattr)) - { - delete (*rwlockattr); - *rwlockattr = NULL; - return ENOMEM; - } - return 0; -} - -extern "C" int -pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr, int *pshared) -{ - if (!pthread_rwlockattr::is_good_object (attr)) - return EINVAL; - *pshared = (*attr)->shared; - return 0; -} - -extern "C" int -pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared) -{ - if (!pthread_rwlockattr::is_good_object (attr)) - return EINVAL; - if ((pshared < 0) || (pshared > 1)) - return EINVAL; - /* shared rwlock vars not currently supported */ - if (pshared != PTHREAD_PROCESS_PRIVATE) - return EINVAL; - (*attr)->shared = pshared; - return 0; -} - -extern "C" int -pthread_rwlockattr_destroy (pthread_rwlockattr_t *rwlockattr) -{ - if (!pthread_rwlockattr::is_good_object (rwlockattr)) - return EINVAL; - delete (*rwlockattr); - *rwlockattr = NULL; - return 0; -} - -/* Thread signal */ -extern "C" int -pthread_kill (pthread_t thread, int sig) -{ - // lock myself, for the use of thread2signal - // two different kills might clash: FIXME - - if (!pthread::is_good_object (&thread)) - return EINVAL; - - siginfo_t si = {0}; - si.si_signo = sig; - si.si_code = SI_USER; - si.si_pid = myself->pid; - si.si_uid = myself->uid; - thread->cygtls->set_threadkill (); - int rval = sig ? sig_send (NULL, si, thread->cygtls) : 0; - - // unlock myself - return rval; -} - -extern "C" int -pthread_sigmask (int operation, const sigset_t *set, sigset_t *old_set) -{ - return handle_sigprocmask (operation, set, old_set, _my_tls.sigmask); -} - -/* ID */ - -extern "C" int -pthread_equal (pthread_t t1, pthread_t t2) -{ - return pthread::equal (t1, t2); -} - -/* Mutexes */ - -int -pthread_mutex::init (pthread_mutex_t *mutex, - const pthread_mutexattr_t *attr, - const pthread_mutex_t initializer) -{ - pthread_mutex_t new_mutex; - - if (attr && !pthread_mutexattr::is_good_object (attr)) - return EINVAL; - - mutex_initialization_lock.lock (); - - if (!is_good_initializer_or_bad_object (mutex)) - { - mutex_initialization_lock.unlock (); - return EBUSY; - } - - new_mutex = new pthread_mutex (attr ? (*attr) : NULL); - if (!is_good_object (&new_mutex)) - { - delete new_mutex; - mutex_initialization_lock.unlock (); - return EAGAIN; - } - - if (!attr && initializer) - { - if (initializer == PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) - new_mutex->type = PTHREAD_MUTEX_RECURSIVE; - else if (initializer == PTHREAD_NORMAL_MUTEX_INITIALIZER_NP) - new_mutex->type = PTHREAD_MUTEX_NORMAL; - else if (initializer == PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP) - new_mutex->type = PTHREAD_MUTEX_ERRORCHECK; - } - - *mutex = new_mutex; - mutex_initialization_lock.unlock (); - - return 0; -} - -extern "C" int -pthread_mutex_getprioceiling (const pthread_mutex_t *mutex, - int *prioceiling) -{ - /* We don't define _POSIX_THREAD_PRIO_PROTECT because we do't currently support - mutex priorities. - - We can support mutex priorities in the future though: - Store a priority with each mutex. - When the mutex is optained, set the thread priority as appropriate - When the mutex is released, reset the thread priority. */ - return ENOSYS; -} - -extern "C" int -pthread_mutex_lock (pthread_mutex_t *mutex) -{ - if (pthread_mutex::is_good_initializer (mutex)) - pthread_mutex::init (mutex, NULL, *mutex); - if (!pthread_mutex::is_good_object (mutex)) - return EINVAL; - return (*mutex)->lock (); -} - -extern "C" int -pthread_mutex_trylock (pthread_mutex_t *mutex) -{ - if (pthread_mutex::is_good_initializer (mutex)) - pthread_mutex::init (mutex, NULL, *mutex); - if (!pthread_mutex::is_good_object (mutex)) - return EINVAL; - return (*mutex)->trylock (); -} - -extern "C" int -pthread_mutex_unlock (pthread_mutex_t *mutex) -{ - if (pthread_mutex::is_good_initializer (mutex)) - return EPERM; - if (!pthread_mutex::is_good_object (mutex)) - return EINVAL; - return (*mutex)->unlock (); -} - -extern "C" int -pthread_mutex_destroy (pthread_mutex_t *mutex) -{ - int rv; - - if (pthread_mutex::is_good_initializer (mutex)) - return 0; - if (!pthread_mutex::is_good_object (mutex)) - return EINVAL; - - rv = (*mutex)->destroy (); - if (rv) - return rv; - - *mutex = NULL; - return 0; -} - -extern "C" int -pthread_mutex_setprioceiling (pthread_mutex_t *mutex, int prioceiling, - int *old_ceiling) -{ - return ENOSYS; -} - -/* Win32 doesn't support mutex priorities - see __pthread_mutex_getprioceiling - for more detail */ -extern "C" int -pthread_mutexattr_getprotocol (const pthread_mutexattr_t *attr, - int *protocol) -{ - if (!pthread_mutexattr::is_good_object (attr)) - return EINVAL; - return ENOSYS; -} - -extern "C" int -pthread_mutexattr_getpshared (const pthread_mutexattr_t *attr, - int *pshared) -{ - if (!pthread_mutexattr::is_good_object (attr)) - return EINVAL; - *pshared = (*attr)->pshared; - return 0; -} - -extern "C" int -pthread_mutexattr_gettype (const pthread_mutexattr_t *attr, int *type) -{ - if (!pthread_mutexattr::is_good_object (attr)) - return EINVAL; - *type = (*attr)->mutextype; - return 0; -} - -/* FIXME: write and test process shared mutex's. */ -extern "C" int -pthread_mutexattr_init (pthread_mutexattr_t *attr) -{ - if (pthread_mutexattr::is_good_object (attr)) - return EBUSY; - - *attr = new pthread_mutexattr (); - if (!pthread_mutexattr::is_good_object (attr)) - { - delete (*attr); - *attr = NULL; - return ENOMEM; - } - return 0; -} - -extern "C" int -pthread_mutexattr_destroy (pthread_mutexattr_t *attr) -{ - if (!pthread_mutexattr::is_good_object (attr)) - return EINVAL; - delete (*attr); - *attr = NULL; - return 0; -} - - -/* Win32 doesn't support mutex priorities */ -extern "C" int -pthread_mutexattr_setprotocol (pthread_mutexattr_t *attr, int protocol) -{ - if (!pthread_mutexattr::is_good_object (attr)) - return EINVAL; - return ENOSYS; -} - -/* Win32 doesn't support mutex priorities */ -extern "C" int -pthread_mutexattr_setprioceiling (pthread_mutexattr_t *attr, - int prioceiling) -{ - if (!pthread_mutexattr::is_good_object (attr)) - return EINVAL; - return ENOSYS; -} - -extern "C" int -pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *attr, - int *prioceiling) -{ - if (!pthread_mutexattr::is_good_object (attr)) - return EINVAL; - return ENOSYS; -} - -extern "C" int -pthread_mutexattr_setpshared (pthread_mutexattr_t *attr, int pshared) -{ - if (!pthread_mutexattr::is_good_object (attr)) - return EINVAL; - /* we don't use pshared for anything as yet. We need to test PROCESS_SHARED - *functionality - */ - if (pshared != PTHREAD_PROCESS_PRIVATE) - return EINVAL; - (*attr)->pshared = pshared; - return 0; -} - -/* see pthread_mutex_gettype */ -extern "C" int -pthread_mutexattr_settype (pthread_mutexattr_t *attr, int type) -{ - if (!pthread_mutexattr::is_good_object (attr)) - return EINVAL; - - switch (type) - { - case PTHREAD_MUTEX_ERRORCHECK: - case PTHREAD_MUTEX_RECURSIVE: - case PTHREAD_MUTEX_NORMAL: - (*attr)->mutextype = type; - break; - default: - return EINVAL; - } - - return 0; -} - -/* Semaphores */ - -/* static members */ - -int -semaphore::init (sem_t *sem, int pshared, unsigned int value) -{ - /* opengroup calls this undefined */ - if (is_good_object (sem)) - return EBUSY; - - if (value > SEM_VALUE_MAX) - return EINVAL; - - *sem = new semaphore (pshared, value); - - if (!is_good_object (sem)) - { - delete (*sem); - *sem = NULL; - return EAGAIN; - } - return 0; -} - -int -semaphore::destroy (sem_t *sem) -{ - if (!is_good_object (sem)) - return EINVAL; - - /* FIXME - new feature - test for busy against threads... */ - - delete (*sem); - *sem = NULL; - return 0; -} - -sem_t * -semaphore::open (const char *name, int oflag, mode_t mode, unsigned int value) -{ - if (value > SEM_VALUE_MAX) - { - set_errno (EINVAL); - return NULL; - } - - sem_t *sem = new sem_t; - if (!sem) - { - set_errno (ENOMEM); - return NULL; - } - - *sem = new semaphore (name, oflag, mode, value); - - if (!is_good_object (sem)) - { - delete *sem; - delete sem; - return NULL; - } - return sem; -} - -int -semaphore::wait (sem_t *sem) -{ - pthread_testcancel (); - - if (!is_good_object (sem)) - { - set_errno (EINVAL); - return -1; - } - - return (*sem)->_wait (); -} - -int -semaphore::trywait (sem_t *sem) -{ - if (!is_good_object (sem)) - { - set_errno (EINVAL); - return -1; - } - - return (*sem)->_trywait (); -} - -int -semaphore::timedwait (sem_t *sem, const struct timespec *abstime) -{ - if (!is_good_object (sem)) - { - set_errno (EINVAL); - return -1; - } - - return (*sem)->_timedwait (abstime); -} - -int -semaphore::post (sem_t *sem) -{ - if (!is_good_object (sem)) - { - set_errno (EINVAL); - return -1; - } - - (*sem)->_post (); - return 0; -} - -int -semaphore::getvalue (sem_t *sem, int *sval) -{ - myfault efault; - if (efault.faulted () || !is_good_object (sem)) - { - set_errno (EINVAL); - return -1; - } - - return (*sem)->_getvalue (sval); -} - -/* pthread_null */ -pthread * -pthread_null::get_null_pthread () -{ - /* because of weird entry points */ - _instance.magic = 0; - return &_instance; -} - -pthread_null::pthread_null () -{ - attr.joinable = PTHREAD_CREATE_DETACHED; - /* Mark ourselves as invalid */ - magic = 0; -} - -pthread_null::~pthread_null () -{ -} - -bool -pthread_null::create (void *(*)(void *), pthread_attr *, void *) -{ - return true; -} - -void -pthread_null::exit (void *value_ptr) -{ - _my_tls.remove (INFINITE); - ExitThread (0); -} - -int -pthread_null::cancel () -{ - return 0; -} - -void -pthread_null::testcancel () -{ -} - -int -pthread_null::setcancelstate (int state, int *oldstate) -{ - return EINVAL; -} - -int -pthread_null::setcanceltype (int type, int *oldtype) -{ - return EINVAL; -} - -void -pthread_null::push_cleanup_handler (__pthread_cleanup_handler *handler) -{ -} - -void -pthread_null::pop_cleanup_handler (int const execute) -{ -} - -unsigned long -pthread_null::getsequence_np () -{ - return 0; -} - -pthread_null pthread_null::_instance; diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h deleted file mode 100644 index c15ded478..000000000 --- a/winsup/cygwin/thread.h +++ /dev/null @@ -1,705 +0,0 @@ -/* thread.h: Locking and threading module definitions - - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - - Written by Marco Fuykschot - Major update 2001 Robert Collins - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _THREAD_H -#define _THREAD_H - -#define LOCK_MMAP_LIST 1 - -#define WRITE_LOCK 1 -#define READ_LOCK 2 - -#include -#include -#include -#include - -enum cw_sig_wait -{ - cw_sig_nosig, - cw_sig_eintr, - cw_sig_resume -}; - -enum cw_cancel_action -{ - cw_cancel_self, - cw_no_cancel_self, - cw_no_cancel -}; - -extern "C" -{ -void SetResourceLock (int, int, const char *) __attribute__ ((regparm (3))); -void ReleaseResourceLock (int, int, const char *) - __attribute__ ((regparm (3))); -} - -DWORD cancelable_wait (HANDLE, DWORD, const cw_cancel_action = cw_cancel_self, const enum cw_sig_wait = cw_sig_nosig) - __attribute__ ((regparm (3))); - -class fast_mutex -{ -public: - fast_mutex () : - lock_counter (0), win32_obj_id (0) - { - } - - ~fast_mutex () - { - if(win32_obj_id) - CloseHandle (win32_obj_id); - } - - bool init () - { - lock_counter = 0; - win32_obj_id = ::CreateSemaphore (&sec_none_nih, 0, LONG_MAX, NULL); - if (!win32_obj_id) - { - debug_printf ("CreateSemaphore failed. %E"); - return false; - } - return true; - } - - void lock () - { - if (InterlockedIncrement ((long *) &lock_counter) != 1) - cancelable_wait (win32_obj_id, INFINITE, cw_no_cancel, cw_sig_resume); - } - - void unlock () - { - if (InterlockedDecrement ((long *) &lock_counter)) - ::ReleaseSemaphore (win32_obj_id, 1, NULL); - } - -private: - unsigned long lock_counter; - HANDLE win32_obj_id; -}; - -class per_process; -class pinfo; - -class ResourceLocks -{ -public: - LPCRITICAL_SECTION Lock (int); - void Init (); - void Delete (); -private: - CRITICAL_SECTION lock; - bool inited; -}; - -#define PTHREAD_MAGIC 0xdf0df045 -#define PTHREAD_MUTEX_MAGIC PTHREAD_MAGIC+1 -#define PTHREAD_KEY_MAGIC PTHREAD_MAGIC+2 -#define PTHREAD_ATTR_MAGIC PTHREAD_MAGIC+3 -#define PTHREAD_MUTEXATTR_MAGIC PTHREAD_MAGIC+4 -#define PTHREAD_COND_MAGIC PTHREAD_MAGIC+5 -#define PTHREAD_CONDATTR_MAGIC PTHREAD_MAGIC+6 -#define SEM_MAGIC PTHREAD_MAGIC+7 -#define PTHREAD_ONCE_MAGIC PTHREAD_MAGIC+8 -#define PTHREAD_RWLOCK_MAGIC PTHREAD_MAGIC+9 -#define PTHREAD_RWLOCKATTR_MAGIC PTHREAD_MAGIC+10 - -#define MUTEX_OWNER_ANONYMOUS ((pthread_t) -1) - -/* verifyable_object should not be defined here - it's a general purpose class */ - -class verifyable_object -{ -public: - long magic; - - verifyable_object (long); - virtual ~verifyable_object (); -}; - -typedef enum -{ - VALID_OBJECT, - INVALID_OBJECT, - VALID_STATIC_OBJECT -} verifyable_object_state; - -template inline void -List_insert (list_node *&head, list_node *node) -{ - if (!node) - return; - do - node->next = head; - while (InterlockedCompareExchangePointer (&head, node, node->next) != node->next); -} - -template inline void -List_remove (fast_mutex &mx, list_node *&head, list_node const *node) -{ - if (!node) - return; - mx.lock (); - if (head) - { - if (InterlockedCompareExchangePointer (&head, node->next, node) != node) - { - list_node *cur = head; - - while (cur->next && node != cur->next) - cur = cur->next; - if (node == cur->next) - cur->next = cur->next->next; - } - } - mx.unlock (); -} - - -template class List -{ - public: - List() : head(NULL) - { - mx_init (); - } - - ~List() - { - } - - void fixup_after_fork () - { - mx_init (); - } - - void insert (list_node *node) - { - List_insert (head, node); - } - - void remove (list_node *node) - { - List_remove (mx, head, node); - } - - void for_each (void (list_node::*callback) ()) - { - mx.lock (); - list_node *cur = head; - while (cur) - { - (cur->*callback) (); - cur = cur->next; - } - mx.unlock (); - } - -protected: - void mx_init () - { - if (!mx.init ()) - api_fatal ("Could not create mutex for list synchronisation."); - } - - fast_mutex mx; - list_node *head; -}; - -class pthread_key: public verifyable_object -{ - DWORD tls_index; -public: - static bool is_good_object (pthread_key_t const *); - - int set (const void *value) {TlsSetValue (tls_index, (void *) value); return 0;} - void *get () const {return TlsGetValue (tls_index);} - - pthread_key (void (*)(void *)); - ~pthread_key (); - static void fixup_before_fork () - { - keys.for_each (&pthread_key::_fixup_before_fork); - } - - static void fixup_after_fork () - { - keys.fixup_after_fork (); - keys.for_each (&pthread_key::_fixup_after_fork); - } - - static void run_all_destructors () - { - keys.for_each (&pthread_key::run_destructor); - } - - /* List support calls */ - class pthread_key *next; -private: - static List keys; - void _fixup_before_fork (); - void _fixup_after_fork (); - void (*destructor) (void *); - void run_destructor (); - void *fork_buf; -}; - -class pthread_attr: public verifyable_object -{ -public: - static bool is_good_object(pthread_attr_t const *); - int joinable; - int contentionscope; - int inheritsched; - struct sched_param schedparam; - size_t stacksize; - - pthread_attr (); - ~pthread_attr (); -}; - -class pthread_mutexattr: public verifyable_object -{ -public: - static bool is_good_object(pthread_mutexattr_t const *); - int pshared; - int mutextype; - pthread_mutexattr (); - ~pthread_mutexattr (); -}; - -class pthread_mutex: public verifyable_object -{ -public: - static bool is_good_object (pthread_mutex_t const *); - static bool is_good_initializer (pthread_mutex_t const *); - static bool is_good_initializer_or_object (pthread_mutex_t const *); - static bool is_good_initializer_or_bad_object (pthread_mutex_t const *mutex); - static bool can_be_unlocked (pthread_mutex_t const *mutex); - static void init_mutex (); - static int init (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr, - const pthread_mutex_t initializer = NULL); - - unsigned long lock_counter; - HANDLE win32_obj_id; - unsigned int recursion_counter; - LONG condwaits; - pthread_t owner; - int type; - int pshared; - - pthread_t get_pthread_self () const - { - return PTHREAD_MUTEX_NORMAL == type ? MUTEX_OWNER_ANONYMOUS : - ::pthread_self (); - } - - int lock () - { - return _lock (get_pthread_self ()); - } - int trylock () - { - return _trylock (get_pthread_self ()); - } - int unlock () - { - return _unlock (get_pthread_self ()); - } - int destroy () - { - return _destroy (get_pthread_self ()); - } - - void set_owner (pthread_t self) - { - recursion_counter = 1; - owner = self; - } - - int lock_recursive () - { - if (UINT_MAX == recursion_counter) - return EAGAIN; - ++recursion_counter; - return 0; - } - - pthread_mutex (pthread_mutexattr * = NULL); - pthread_mutex (pthread_mutex_t *, pthread_mutexattr *); - ~pthread_mutex (); - - class pthread_mutex * next; - static void fixup_after_fork () - { - mutexes.fixup_after_fork (); - mutexes.for_each (&pthread_mutex::_fixup_after_fork); - } - -private: - int _lock (pthread_t self); - int _trylock (pthread_t self); - int _unlock (pthread_t self); - int _destroy (pthread_t self); - - void _fixup_after_fork (); - - static List mutexes; - static fast_mutex mutex_initialization_lock; -}; - -#define WAIT_CANCELED (WAIT_OBJECT_0 + 1) -#define WAIT_SIGNALED (WAIT_OBJECT_0 + 2) - -class _cygtls; -class pthread: public verifyable_object -{ -public: - HANDLE win32_obj_id; - class pthread_attr attr; - void *(*function) (void *); - void *arg; - void *return_ptr; - bool valid; - bool suspended; - int cancelstate, canceltype; - _cygtls *cygtls; - HANDLE cancel_event; - pthread_t joiner; - - virtual bool create (void *(*)(void *), pthread_attr *, void *); - - pthread (); - virtual ~pthread (); - - static void init_mainthread (); - static bool is_good_object(pthread_t const *); - static void atforkprepare(); - static void atforkparent(); - static void atforkchild(); - - /* API calls */ - static int cancel (pthread_t); - static int join (pthread_t * thread, void **return_val); - static int detach (pthread_t * thread); - static int create (pthread_t * thread, const pthread_attr_t * attr, - void *(*start_routine) (void *), void *arg); - static int once (pthread_once_t *, void (*)(void)); - static int atfork(void (*)(void), void (*)(void), void (*)(void)); - static int suspend (pthread_t * thread); - static int resume (pthread_t * thread); - - virtual void exit (void *value_ptr) __attribute__ ((noreturn)); - - virtual int cancel (); - - virtual void testcancel (); - static void static_cancel_self (); - - virtual int setcancelstate (int state, int *oldstate); - virtual int setcanceltype (int type, int *oldtype); - - virtual void push_cleanup_handler (__pthread_cleanup_handler *handler); - virtual void pop_cleanup_handler (int const execute); - - static pthread* self (); - static DWORD WINAPI thread_init_wrapper (void *); - - virtual unsigned long getsequence_np(); - - static int equal (pthread_t t1, pthread_t t2) - { - return t1 == t2; - } - - /* List support calls */ - class pthread *next; - static void fixup_after_fork () - { - threads.fixup_after_fork (); - threads.for_each (&pthread::_fixup_after_fork); - } - - static void suspend_all_except_self () - { - threads.for_each (&pthread::suspend_except_self); - } - - static void resume_all () - { - threads.for_each (&pthread::resume); - } - -private: - static List threads; - DWORD thread_id; - __pthread_cleanup_handler *cleanup_stack; - pthread_mutex mutex; - - void suspend_except_self (); - void resume (); - - void _fixup_after_fork (); - - void pop_all_cleanup_handlers (); - void precreate (pthread_attr *); - void postcreate (); - bool create_cancel_event (); - static pthread *get_tls_self_pointer (); - static void set_tls_self_pointer (pthread *); - void cancel_self (); - DWORD get_thread_id (); -}; - -class pthread_null : public pthread -{ - public: - static pthread *get_null_pthread(); - ~pthread_null(); - - /* From pthread These should never get called - * as the ojbect is not verifyable - */ - bool create (void *(*)(void *), pthread_attr *, void *); - void exit (void *value_ptr) __attribute__ ((noreturn)); - int cancel (); - void testcancel (); - int setcancelstate (int state, int *oldstate); - int setcanceltype (int type, int *oldtype); - void push_cleanup_handler (__pthread_cleanup_handler *handler); - void pop_cleanup_handler (int const execute); - unsigned long getsequence_np(); - - private: - pthread_null (); - static pthread_null _instance; -}; - -class pthread_condattr: public verifyable_object -{ -public: - static bool is_good_object(pthread_condattr_t const *); - int shared; - - pthread_condattr (); - ~pthread_condattr (); -}; - -class pthread_cond: public verifyable_object -{ -public: - static bool is_good_object (pthread_cond_t const *); - static bool is_good_initializer (pthread_cond_t const *); - static bool is_good_initializer_or_object (pthread_cond_t const *); - static bool is_good_initializer_or_bad_object (pthread_cond_t const *); - static void init_mutex (); - static int init (pthread_cond_t *, const pthread_condattr_t *); - - int shared; - - unsigned long waiting; - unsigned long pending; - HANDLE sem_wait; - - pthread_mutex mtx_in; - pthread_mutex mtx_out; - - pthread_mutex_t mtx_cond; - - void unblock (const bool all); - int wait (pthread_mutex_t mutex, DWORD dwMilliseconds = INFINITE); - - pthread_cond (pthread_condattr *); - ~pthread_cond (); - - class pthread_cond * next; - static void fixup_after_fork () - { - conds.fixup_after_fork (); - conds.for_each (&pthread_cond::_fixup_after_fork); - } - -private: - void _fixup_after_fork (); - - static List conds; - static fast_mutex cond_initialization_lock; -}; - -class pthread_rwlockattr: public verifyable_object -{ -public: - static bool is_good_object(pthread_rwlockattr_t const *); - int shared; - - pthread_rwlockattr (); - ~pthread_rwlockattr (); -}; - -class pthread_rwlock: public verifyable_object -{ -public: - static bool is_good_object (pthread_rwlock_t const *); - static bool is_good_initializer (pthread_rwlock_t const *); - static bool is_good_initializer_or_object (pthread_rwlock_t const *); - static bool is_good_initializer_or_bad_object (pthread_rwlock_t const *); - static void init_mutex (); - static int init (pthread_rwlock_t *, const pthread_rwlockattr_t *); - - int shared; - - unsigned long waiting_readers; - unsigned long waiting_writers; - pthread_t writer; - struct RWLOCK_READER - { - struct RWLOCK_READER *next; - pthread_t thread; - } *readers; - fast_mutex readers_mx; - - int rdlock (); - int tryrdlock (); - - int wrlock (); - int trywrlock (); - - int unlock (); - - pthread_mutex mtx; - pthread_cond cond_readers; - pthread_cond cond_writers; - - pthread_rwlock (pthread_rwlockattr *); - ~pthread_rwlock (); - - class pthread_rwlock * next; - static void fixup_after_fork () - { - rwlocks.fixup_after_fork (); - rwlocks.for_each (&pthread_rwlock::_fixup_after_fork); - } - -private: - static List rwlocks; - - void add_reader (struct RWLOCK_READER *rd); - void remove_reader (struct RWLOCK_READER *rd); - struct RWLOCK_READER *lookup_reader (pthread_t thread); - - void release () - { - if (waiting_writers) - { - if (!readers) - cond_writers.unblock (false); - } - else if (waiting_readers) - cond_readers.unblock (true); - } - - - static void rdlock_cleanup (void *arg); - static void wrlock_cleanup (void *arg); - - void _fixup_after_fork (); - - static fast_mutex rwlock_initialization_lock; -}; - -class pthread_once -{ -public: - pthread_mutex_t mutex; - int state; -}; - -/* shouldn't be here */ -class semaphore: public verifyable_object -{ -public: - static bool is_good_object(sem_t const *); - /* API calls */ - static int init (sem_t * sem, int pshared, unsigned int value); - static int destroy (sem_t * sem); - static sem_t *open (const char *name, int oflag, mode_t mode, - unsigned int value); - static int wait (sem_t * sem); - static int post (sem_t * sem); - static int getvalue (sem_t * sem, int *sval); - static int trywait (sem_t * sem); - static int timedwait (sem_t * sem, const struct timespec *abstime); - - HANDLE win32_obj_id; - int shared; - long currentvalue; - char *name; - - semaphore (int, unsigned int); - semaphore (const char *name, int oflag, mode_t mode, unsigned int value); - ~semaphore (); - - class semaphore * next; - static void fixup_after_fork () - { - semaphores.fixup_after_fork (); - semaphores.for_each (&semaphore::_fixup_after_fork); - } - -private: - int _wait (); - void _post (); - int _getvalue (int *sval); - int _trywait (); - int _timedwait (const struct timespec *abstime); - - void _fixup_after_fork (); - - static List semaphores; -}; - -class callback -{ -public: - void (*cb)(void); - class callback * next; -}; - -struct MTinterface -{ - // General - int concurrency; - long int threadcount; - - callback *pthread_prepare; - callback *pthread_child; - callback *pthread_parent; - - void Init (); - void fixup_before_fork (); - void fixup_after_fork (); - -#if 0 // avoid initialization since zero is implied and - MTinterface () : - concurrency (0), threadcount (0), - pthread_prepare (NULL), pthread_child (NULL), pthread_parent (NULL) - { - } -#endif -}; - -#define MT_INTERFACE user_data->threadinterface -#endif // _THREAD_H diff --git a/winsup/cygwin/timer.cc b/winsup/cygwin/timer.cc deleted file mode 100644 index 7dea7ea69..000000000 --- a/winsup/cygwin/timer.cc +++ /dev/null @@ -1,452 +0,0 @@ -/* timer.cc - - Copyright 2004, 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "hires.h" -#include "thread.h" -#include "cygtls.h" -#include "sigproc.h" -#include "sync.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" - -#define TT_MAGIC 0x513e4a1c -struct timer_tracker -{ - unsigned magic; - clockid_t clock_id; - sigevent evp; - timespec it_interval; - HANDLE hcancel; - HANDLE syncthread; - long long interval_us; - long long sleepto_us; - bool cancel (); - struct timer_tracker *next; - int settime (int, const itimerspec *, itimerspec *); - void gettime (itimerspec *); - timer_tracker (clockid_t, const sigevent *); - ~timer_tracker (); - friend void fixup_timers_after_fork (); -}; - -timer_tracker NO_COPY ttstart (CLOCK_REALTIME, NULL); - -class lock_timer_tracker -{ - static muto protect; -public: - lock_timer_tracker (); - ~lock_timer_tracker (); -}; - -muto NO_COPY lock_timer_tracker::protect; - -lock_timer_tracker::lock_timer_tracker () -{ - protect.init ("timer_protect")->acquire (); -} - -lock_timer_tracker::~lock_timer_tracker () -{ - protect.release (); -} - -bool -timer_tracker::cancel () -{ - if (!hcancel) - return false; - - SetEvent (hcancel); - if (WaitForSingleObject (syncthread, INFINITE) != WAIT_OBJECT_0) - api_fatal ("WFSO failed waiting for timer thread, %E"); - return true; -} - -timer_tracker::~timer_tracker () -{ - if (cancel ()) - { - CloseHandle (hcancel); -#ifdef DEBUGGING - hcancel = NULL; -#endif - } - if (syncthread) - CloseHandle (syncthread); - magic = 0; -} - -timer_tracker::timer_tracker (clockid_t c, const sigevent *e) -{ - if (e != NULL) - evp = *e; - else - { - evp.sigev_notify = SIGEV_SIGNAL; - evp.sigev_signo = SIGALRM; - evp.sigev_value.sival_ptr = this; - } - clock_id = c; - magic = TT_MAGIC; - hcancel = NULL; - if (this != &ttstart) - { - lock_timer_tracker here; - next = ttstart.next; - ttstart.next = this; - } -} - -static long long -to_us (const timespec& ts) -{ - long long res = ts.tv_sec; - res *= 1000000; - res += ts.tv_nsec / 1000 + ((ts.tv_nsec % 1000) ? 1 : 0); - return res; -} - -static DWORD WINAPI -timer_thread (VOID *x) -{ - timer_tracker *tt = ((timer_tracker *) x); - long long now; - long long sleepto_us = tt->sleepto_us; - while (1) - { - long long sleep_us; - long sleep_ms; - /* Account for delays in starting thread - and sending the signal */ - now = gtod.usecs (); - sleep_us = sleepto_us - now; - if (sleep_us > 0) - { - tt->sleepto_us = sleepto_us; - sleep_ms = (sleep_us + 999) / 1000; - } - else - { - tt->sleepto_us = now; - sleep_ms = 0; - } - - debug_printf ("%p waiting for %u ms", x, sleep_ms); - switch (WaitForSingleObject (tt->hcancel, sleep_ms)) - { - case WAIT_TIMEOUT: - debug_printf ("timed out"); - break; - case WAIT_OBJECT_0: - debug_printf ("%p cancelled", x); - goto out; - default: - debug_printf ("%p wait failed, %E", x); - goto out; - } - - switch (tt->evp.sigev_notify) - { - case SIGEV_SIGNAL: - { - siginfo_t si = {0}; - si.si_signo = tt->evp.sigev_signo; - si.si_sigval.sival_ptr = tt->evp.sigev_value.sival_ptr; - si.si_code = SI_TIMER; - debug_printf ("%p sending sig %d", x, tt->evp.sigev_signo); - sig_send (myself_nowait, si); - break; - } - case SIGEV_THREAD: - { - pthread_t notify_thread; - debug_printf ("%p starting thread", x); - int rc = pthread_create (¬ify_thread, tt->evp.sigev_notify_attributes, - (void * (*) (void *)) tt->evp.sigev_notify_function, - tt->evp.sigev_value.sival_ptr); - if (rc) - { - debug_printf ("thread creation failed, %E"); - return 0; - } - // FIXME: pthread_join? - break; - } - } - if (!tt->interval_us) - break; - - sleepto_us = tt->sleepto_us + tt->interval_us; - debug_printf ("looping"); - } - -out: - _my_tls._ctinfo->auto_release (); /* automatically return the cygthread to the cygthread pool */ - return 0; -} - -static bool -it_bad (const timespec& t) -{ - if (t.tv_nsec < 0 || t.tv_nsec >= 1000000000 || t.tv_sec < 0) - { - set_errno (EINVAL); - return true; - } - return false; -} - -int -timer_tracker::settime (int in_flags, const itimerspec *value, itimerspec *ovalue) -{ - if (!value) - { - set_errno (EINVAL); - return -1; - } - - myfault efault; - if (efault.faulted (EFAULT) - || it_bad (value->it_value) - || it_bad (value->it_interval)) - return -1; - - long long now = in_flags & TIMER_ABSTIME ? 0 : gtod.usecs (); - - lock_timer_tracker here; - cancel (); - - if (ovalue) - gettime (ovalue); - - if (!value->it_value.tv_sec && !value->it_value.tv_nsec) - interval_us = sleepto_us = 0; - else - { - sleepto_us = now + to_us (value->it_value); - interval_us = to_us (value->it_interval); - it_interval = value->it_interval; - if (!hcancel) - hcancel = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); - else - ResetEvent (hcancel); - if (!syncthread) - syncthread = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL); - else - ResetEvent (syncthread); - new cygthread (timer_thread, 0, this, "itimer", syncthread); - } - - return 0; -} - -void -timer_tracker::gettime (itimerspec *ovalue) -{ - if (!hcancel) - memset (ovalue, 0, sizeof (*ovalue)); - else - { - ovalue->it_interval = it_interval; - long long now = gtod.usecs (); - long long left_us = sleepto_us - now; - if (left_us < 0) - left_us = 0; - ovalue->it_value.tv_sec = left_us / 1000000; - ovalue->it_value.tv_nsec = (left_us % 1000000) * 1000; - } -} - -extern "C" int -timer_gettime (timer_t timerid, struct itimerspec *ovalue) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - timer_tracker *tt = (timer_tracker *) timerid; - if (tt->magic != TT_MAGIC) - { - set_errno (EINVAL); - return -1; - } - - tt->gettime (ovalue); - return 0; -} - -extern "C" int -timer_create (clockid_t clock_id, struct sigevent *evp, timer_t *timerid) -{ - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (clock_id != CLOCK_REALTIME) - { - set_errno (EINVAL); - return -1; - } - - *timerid = (timer_t) new timer_tracker (clock_id, evp); - return 0; -} - -extern "C" int -timer_settime (timer_t timerid, int flags, const struct itimerspec *value, - struct itimerspec *ovalue) -{ - timer_tracker *tt = (timer_tracker *) timerid; - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (tt->magic != TT_MAGIC) - { - set_errno (EINVAL); - return -1; - } - - return tt->settime (flags, value, ovalue); -} - -extern "C" int -timer_delete (timer_t timerid) -{ - timer_tracker *in_tt = (timer_tracker *) timerid; - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - if (in_tt->magic != TT_MAGIC) - { - set_errno (EINVAL); - return -1; - } - - lock_timer_tracker here; - for (timer_tracker *tt = &ttstart; tt->next != NULL; tt = tt->next) - if (tt->next == in_tt) - { - tt->next = in_tt->next; - delete in_tt; - return 0; - } - set_errno (EINVAL); - return 0; -} - -void -fixup_timers_after_fork () -{ - ttstart.hcancel = ttstart.syncthread = NULL; - for (timer_tracker *tt = &ttstart; tt->next != NULL; /* nothing */) - { - timer_tracker *deleteme = tt->next; - tt->next = deleteme->next; - deleteme->hcancel = deleteme->syncthread = NULL; - delete deleteme; - } -} - - -extern "C" int -setitimer (int which, const struct itimerval *value, struct itimerval *ovalue) -{ - if (which != ITIMER_REAL) - { - set_errno (EINVAL); - return -1; - } - struct itimerspec spec_value, spec_ovalue; - int ret; - spec_value.it_interval.tv_sec = value->it_interval.tv_sec; - spec_value.it_interval.tv_nsec = value->it_interval.tv_usec * 1000; - spec_value.it_value.tv_sec = value->it_value.tv_sec; - spec_value.it_value.tv_nsec = value->it_value.tv_usec * 1000; - ret = timer_settime ((timer_t) &ttstart, 0, &spec_value, &spec_ovalue); - if (!ret && ovalue) - { - ovalue->it_interval.tv_sec = spec_ovalue.it_interval.tv_sec; - ovalue->it_interval.tv_usec = spec_ovalue.it_interval.tv_nsec / 1000; - ovalue->it_value.tv_sec = spec_ovalue.it_value.tv_sec; - ovalue->it_value.tv_usec = spec_ovalue.it_value.tv_nsec / 1000; - } - syscall_printf ("%d = setitimer ()", ret); - return ret; -} - - -extern "C" int -getitimer (int which, struct itimerval *ovalue) -{ - if (which != ITIMER_REAL) - { - set_errno (EINVAL); - return -1; - } - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - struct itimerspec spec_ovalue; - int ret = timer_gettime ((timer_t) &ttstart, &spec_ovalue); - if (!ret) - { - ovalue->it_interval.tv_sec = spec_ovalue.it_interval.tv_sec; - ovalue->it_interval.tv_usec = spec_ovalue.it_interval.tv_nsec / 1000; - ovalue->it_value.tv_sec = spec_ovalue.it_value.tv_sec; - ovalue->it_value.tv_usec = spec_ovalue.it_value.tv_nsec / 1000; - } - syscall_printf ("%d = getitimer ()", ret); - return ret; -} - -/* FIXME: POSIX - alarm survives exec */ -extern "C" unsigned int -alarm (unsigned int seconds) -{ - struct itimerspec newt = {}, oldt; - /* alarm cannot fail, but only needs not be - correct for arguments < 64k. Truncate */ - if (seconds > (HIRES_DELAY_MAX / 1000 - 1)) - seconds = (HIRES_DELAY_MAX / 1000 - 1); - newt.it_value.tv_sec = seconds; - timer_settime ((timer_t) &ttstart, 0, &newt, &oldt); - int ret = oldt.it_value.tv_sec + (oldt.it_value.tv_nsec > 0); - syscall_printf ("%d = alarm (%d)", ret, seconds); - return ret; -} - -extern "C" useconds_t -ualarm (useconds_t value, useconds_t interval) -{ - struct itimerspec timer = {}, otimer; - /* ualarm cannot fail. - Interpret negative arguments as zero */ - if (value > 0) - { - timer.it_value.tv_sec = (unsigned int) value / 1000000; - timer.it_value.tv_nsec = ((unsigned int) value % 1000000) * 1000; - } - if (interval > 0) - { - timer.it_interval.tv_sec = (unsigned int) interval / 1000000; - timer.it_interval.tv_nsec = ((unsigned int) interval % 1000000) * 1000; - } - timer_settime ((timer_t) &ttstart, 0, &timer, &otimer); - useconds_t ret = otimer.it_value.tv_sec * 1000000 + (otimer.it_value.tv_nsec + 999) / 1000; - syscall_printf ("%d = ualarm (%d , %d)", ret, value, interval); - return ret; -} diff --git a/winsup/cygwin/times.cc b/winsup/cygwin/times.cc deleted file mode 100644 index 3922caf31..000000000 --- a/winsup/cygwin/times.cc +++ /dev/null @@ -1,748 +0,0 @@ -/* times.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "pinfo.h" -#include "hires.h" -#include "cygtls.h" -#include "sigproc.h" -#include "sync.h" - -#define FACTOR (0x19db1ded53e8000LL) -#define NSPERSEC 10000000LL - -static inline LONGLONG -systime () -{ - LARGE_INTEGER x; - FILETIME ft; - GetSystemTimeAsFileTime (&ft); - x.HighPart = ft.dwHighDateTime; - x.LowPart = ft.dwLowDateTime; - x.QuadPart -= FACTOR; /* Add conversion factor for UNIX vs. Windows base time */ - x.QuadPart /= 10; /* Convert to microseconds */ - return x.QuadPart; -} - -/* Cygwin internal */ -static unsigned long long __stdcall -__to_clock_t (FILETIME *src, int flag) -{ - unsigned long long total = ((unsigned long long) src->dwHighDateTime << 32) + ((unsigned)src->dwLowDateTime); - syscall_printf ("dwHighDateTime %u, dwLowDateTime %u", src->dwHighDateTime, src->dwLowDateTime); - - /* Convert into clock ticks - the total is in 10ths of a usec. */ - if (flag) - total -= FACTOR; - - total /= (unsigned long long) (NSPERSEC / CLOCKS_PER_SEC); - syscall_printf ("total %08x %08x", (unsigned) (total>>32), (unsigned) (total)); - return total; -} - -/* times: POSIX 4.5.2.1 */ -extern "C" clock_t -times (struct tms *buf) -{ - FILETIME creation_time, exit_time, kernel_time, user_time; - - myfault efault; - if (efault.faulted (EFAULT)) - return ((clock_t) -1); - - LONGLONG ticks = gtod.uptime (); - /* Ticks is in milliseconds, convert to our ticks. Use long long to prevent - overflow. */ - clock_t tc = (clock_t) (ticks * CLOCKS_PER_SEC / 1000); - if (wincap.has_get_process_times ()) - { - GetProcessTimes (hMainProc, &creation_time, &exit_time, - &kernel_time, &user_time); - - syscall_printf ("ticks %d, CLOCKS_PER_SEC %d", ticks, CLOCKS_PER_SEC); - syscall_printf ("user_time %d, kernel_time %d, creation_time %d, exit_time %d", - user_time, kernel_time, creation_time, exit_time); - buf->tms_stime = __to_clock_t (&kernel_time, 0); - buf->tms_utime = __to_clock_t (&user_time, 0); - timeval_to_filetime (&myself->rusage_children.ru_stime, &kernel_time); - buf->tms_cstime = __to_clock_t (&kernel_time, 1); - timeval_to_filetime (&myself->rusage_children.ru_utime, &user_time); - buf->tms_cutime = __to_clock_t (&user_time, 1); - } - else - /* GetProcessTimes() does not work for non-NT versions of Windows. The - return values are undefined, so instead just copy the ticks value - into utime so that clock() will work properly on these systems */ - { - buf->tms_utime = tc; - buf->tms_stime = 0; - buf->tms_cstime = 0; - buf->tms_cutime = 0; - } - - return tc; -} - -EXPORT_ALIAS (times, _times) - -/* settimeofday: BSD */ -extern "C" int -settimeofday (const struct timeval *tv, const struct timezone *tz) -{ - SYSTEMTIME st; - struct tm *ptm; - int res; - - tz = tz; /* silence warning about unused variable */ - - ptm = gmtime (&tv->tv_sec); - st.wYear = ptm->tm_year + 1900; - st.wMonth = ptm->tm_mon + 1; - st.wDayOfWeek = ptm->tm_wday; - st.wDay = ptm->tm_mday; - st.wHour = ptm->tm_hour; - st.wMinute = ptm->tm_min; - st.wSecond = ptm->tm_sec; - st.wMilliseconds = tv->tv_usec / 1000; - - res = !SetSystemTime (&st); - - syscall_printf ("%d = settimeofday (%x, %x)", res, tv, tz); - - return res; -} - -/* timezone: standards? */ -extern "C" char * -timezone (void) -{ - char *b = _my_tls.locals.timezone_buf; - - tzset (); - __small_sprintf (b,"GMT%+d:%02d", (int) (-_timezone / 3600), (int) (abs (_timezone / 60) % 60)); - return b; -} - -/* Cygwin internal */ -void __stdcall -totimeval (struct timeval *dst, FILETIME *src, int sub, int flag) -{ - long long x = __to_clock_t (src, flag); - - x *= (int) (1e6) / CLOCKS_PER_SEC; /* Turn x into usecs */ - x -= (long long) sub * (int) (1e6); - - dst->tv_usec = x % (long long) (1e6); /* And split */ - dst->tv_sec = x / (long long) (1e6); -} - -hires_ms NO_COPY gtod; - -/* FIXME: Make thread safe */ -extern "C" int -gettimeofday (struct timeval *tv, struct timezone *tz) -{ - static bool tzflag; - LONGLONG now = gtod.usecs (); - - if (now == (LONGLONG) -1) - return -1; - - tv->tv_sec = now / 1000000; - tv->tv_usec = now % 1000000; - - if (tz != NULL) - { - if (!tzflag) - { - tzset (); - tzflag = true; - } - tz->tz_minuteswest = _timezone / 60; - tz->tz_dsttime = _daylight; - } - - return 0; -} - -EXPORT_ALIAS (gettimeofday, _gettimeofday) - -/* Cygwin internal */ -void -time_t_to_filetime (time_t time_in, FILETIME *out) -{ - long long x = time_in * NSPERSEC + FACTOR; - out->dwHighDateTime = x >> 32; - out->dwLowDateTime = x; -} - -/* Cygwin internal */ -void __stdcall -timeval_to_filetime (const struct timeval *time_in, FILETIME *out) -{ - long long x = time_in->tv_sec * NSPERSEC + - time_in->tv_usec * (NSPERSEC/1000000) + FACTOR; - out->dwHighDateTime = x >> 32; - out->dwLowDateTime = x; -} - -/* Cygwin internal */ -static timeval __stdcall -time_t_to_timeval (time_t in) -{ - timeval res; - res.tv_sec = in; - res.tv_usec = 0; - return res; -} - -/* Cygwin internal */ -/* Convert a Win32 time to "UNIX" format. */ -long __stdcall -to_time_t (FILETIME *ptr) -{ - /* A file time is the number of 100ns since jan 1 1601 - stuffed into two long words. - A time_t is the number of seconds since jan 1 1970. */ - - long long x = ((long long) ptr->dwHighDateTime << 32) + ((unsigned)ptr->dwLowDateTime); - - /* pass "no time" as epoch */ - if (x == 0) - return 0; - - x -= FACTOR; /* number of 100ns between 1601 and 1970 */ - x /= (long long) NSPERSEC; /* number of 100ns in a second */ - return x; -} - -/* Cygwin internal */ -/* Convert a Win32 time to "UNIX" timestruc_t format. */ -void __stdcall -to_timestruc_t (FILETIME *ptr, timestruc_t *out) -{ - /* A file time is the number of 100ns since jan 1 1601 - stuffed into two long words. - A timestruc_t is the number of seconds and microseconds since jan 1 1970 - stuffed into a time_t and a long. */ - - long rem; - long long x = ((long long) ptr->dwHighDateTime << 32) + ((unsigned)ptr->dwLowDateTime); - - /* pass "no time" as epoch */ - if (x == 0) - { - out->tv_sec = 0; - out->tv_nsec = 0; - return; - } - - x -= FACTOR; /* number of 100ns between 1601 and 1970 */ - rem = x % ((long long)NSPERSEC); - x /= (long long) NSPERSEC; /* number of 100ns in a second */ - out->tv_nsec = rem * 100; /* as tv_nsec is in nanoseconds */ - out->tv_sec = x; -} - -/* Cygwin internal */ -/* Get the current time as a "UNIX" timestruc_t format. */ -void __stdcall -time_as_timestruc_t (timestruc_t * out) -{ - FILETIME filetime; - - GetSystemTimeAsFileTime (&filetime); - to_timestruc_t (&filetime, out); -} - -/* time: POSIX 4.5.1.1, C 4.12.2.4 */ -/* Return number of seconds since 00:00 UTC on jan 1, 1970 */ -extern "C" time_t -time (time_t * ptr) -{ - time_t res; - FILETIME filetime; - - GetSystemTimeAsFileTime (&filetime); - res = to_time_t (&filetime); - if (ptr) - *ptr = res; - - syscall_printf ("%d = time (%x)", res, ptr); - - return res; -} - -/* - * localtime_r.c - * Original Author: Adapted from tzcode maintained by Arthur David Olson. - * - * Converts the calendar time pointed to by tim_p into a broken-down time - * expressed as local time. Returns a pointer to a structure containing the - * broken-down time. - */ - -#define SECSPERMIN 60 -#define MINSPERHOUR 60 -#define HOURSPERDAY 24 -#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) -#define SECSPERDAY (SECSPERHOUR * HOURSPERDAY) -#define DAYSPERWEEK 7 -#define MONSPERYEAR 12 - -#define YEAR_BASE 1900 -#define EPOCH_YEAR 1970 -#define EPOCH_WDAY 4 - -#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0) - -#if 0 /* POSIX_LOCALTIME */ - -static _CONST int mon_lengths[2][MONSPERYEAR] = { - {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, - {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} -}; - -static _CONST int year_lengths[2] = { - 365, - 366 -}; - -/* - * Convert a time_t into a struct tm *. - * Does NO timezone conversion. - */ - -/* Cygwin internal */ -static struct tm * __stdcall -corelocaltime (const time_t * tim_p) -{ - long days, rem; - int y; - int yleap; - _CONST int *ip; - struct tm &localtime_buf=_my_tls.locals.localtime_buf; - - time_t tim = *tim_p; - struct tm *res = &localtime_buf; - - days = ((long) tim) / SECSPERDAY; - rem = ((long) tim) % SECSPERDAY; - - while (rem < 0) - { - rem += SECSPERDAY; - --days; - } - while (rem >= SECSPERDAY) - { - rem -= SECSPERDAY; - ++days; - } - - /* compute hour, min, and sec */ - res->tm_hour = (int) (rem / SECSPERHOUR); - rem %= SECSPERHOUR; - res->tm_min = (int) (rem / SECSPERMIN); - res->tm_sec = (int) (rem % SECSPERMIN); - - /* compute day of week */ - if ((res->tm_wday = ((EPOCH_WDAY + days) % DAYSPERWEEK)) < 0) - res->tm_wday += DAYSPERWEEK; - - /* compute year & day of year */ - y = EPOCH_YEAR; - if (days >= 0) - { - for (;;) - { - yleap = isleap (y); - if (days < year_lengths[yleap]) - break; - y++; - days -= year_lengths[yleap]; - } - } - else - { - do - { - --y; - yleap = isleap (y); - days += year_lengths[yleap]; - } while (days < 0); - } - - res->tm_year = y - YEAR_BASE; - res->tm_yday = days; - ip = mon_lengths[yleap]; - for (res->tm_mon = 0; days >= ip[res->tm_mon]; ++res->tm_mon) - days -= ip[res->tm_mon]; - res->tm_mday = days + 1; - - /* set daylight saving time flag */ - res->tm_isdst = -1; - - syscall_printf ("%d = corelocaltime (%x)", res, tim_p); - - return (res); -} - -/* localtime: POSIX 8.1.1, C 4.12.3.4 */ -/* - * localtime takes a time_t (which is in UTC) - * and formats it into a struct tm as a local time. - */ -extern "C" struct tm * -localtime (const time_t *tim_p) -{ - time_t tim = *tim_p; - struct tm *rtm; - - tzset (); - - tim -= _timezone; - - rtm = corelocaltime (&tim); - - rtm->tm_isdst = _daylight; - - syscall_printf ("%x = localtime (%x)", rtm, tim_p); - - return rtm; -} - -/* gmtime: C 4.12.3.3 */ -/* - * gmtime takes a time_t (which is already in UTC) - * and just puts it into a struct tm. - */ -extern "C" struct tm * -gmtime (const time_t *tim_p) -{ - time_t tim = *tim_p; - - struct tm *rtm = corelocaltime (&tim); - /* UTC has no daylight savings time */ - rtm->tm_isdst = 0; - - syscall_printf ("%x = gmtime (%x)", rtm, tim_p); - - return rtm; -} - -#endif /* POSIX_LOCALTIME */ - -static int -utimes_worker (const char *path, const struct timeval *tvp, int nofollow) -{ - int res = -1; - path_conv win32 (path, PC_POSIX | (nofollow ? PC_SYM_NOFOLLOW : PC_SYM_FOLLOW)); - - if (win32.error) - set_errno (win32.error); - else - { - fhandler_base *fh = NULL; - bool fromfd = false; - - cygheap_fdenum cfd (true); - while (cfd.next () >= 0) - if (cfd->get_access () & (FILE_WRITE_ATTRIBUTES | GENERIC_WRITE) - && strcmp (cfd->get_win32_name (), win32) == 0) - { - fh = cfd; - fromfd = true; - break; - } - - if (!fh) - { - if (!(fh = build_fh_pc (win32))) - goto error; - - if (fh->error ()) - { - debug_printf ("got %d error from build_fh_name", fh->error ()); - set_errno (fh->error ()); - } - } - - res = fh->utimes (tvp); - - if (!fromfd) - delete fh; - } - -error: - syscall_printf ("%d = utimes (%s, %p)", res, path, tvp); - return res; -} - -/* utimes: POSIX/SUSv3 */ -extern "C" int -utimes (const char *path, const struct timeval *tvp) -{ - return utimes_worker (path, tvp, 0); -} - -/* BSD */ -extern "C" int -lutimes (const char *path, const struct timeval *tvp) -{ - return utimes_worker (path, tvp, 1); -} - -/* BSD */ -extern "C" int -futimes (int fd, const struct timeval *tvp) -{ - int res; - - cygheap_fdget cfd (fd); - if (cfd < 0) - res = -1; - else if (cfd->get_access () & (FILE_WRITE_ATTRIBUTES | GENERIC_WRITE)) - res = cfd->utimes (tvp); - else - res = utimes_worker (cfd->get_win32_name (), tvp, 1); - syscall_printf ("%d = futimes (%d, %p)", res, fd, tvp); - return res; -} - -/* utime: POSIX 5.6.6.1 */ -extern "C" int -utime (const char *path, const struct utimbuf *buf) -{ - struct timeval tmp[2]; - - if (buf == 0) - return utimes (path, 0); - - debug_printf ("incoming utime act %x", buf->actime); - tmp[0] = time_t_to_timeval (buf->actime); - tmp[1] = time_t_to_timeval (buf->modtime); - - return utimes (path, tmp); -} - -/* ftime: standards? */ -extern "C" int -ftime (struct timeb *tp) -{ - struct timeval tv; - struct timezone tz; - - if (gettimeofday (&tv, &tz) < 0) - return -1; - - tp->time = tv.tv_sec; - tp->millitm = tv.tv_usec / 1000; - tp->timezone = tz.tz_minuteswest; - tp->dstflag = tz.tz_dsttime; - - return 0; -} - -/* obsolete, changed to cygwin_tzset when localtime.c was added - dj */ -extern "C" void -cygwin_tzset () -{ -} - -#define stupid_printf if (cygwin_finished_initializing) debug_printf -void -hires_us::prime () -{ - LARGE_INTEGER ifreq; - if (!QueryPerformanceFrequency (&ifreq)) - { - inited = -1; - return; - } - - int priority = GetThreadPriority (GetCurrentThread ()); - - SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL); - if (!QueryPerformanceCounter (&primed_pc)) - { - SetThreadPriority (GetCurrentThread (), priority); - inited = -1; - return; - } - - primed_ft.QuadPart = systime (); - freq = (double) ((double) 1000000. / (double) ifreq.QuadPart); - inited = true; - SetThreadPriority (GetCurrentThread (), priority); -} - -LONGLONG -hires_us::usecs (bool justdelta) -{ - if (!inited) - prime (); - if (inited < 0) - { - set_errno (ENOSYS); - return (long long) -1; - } - - LARGE_INTEGER now; - if (!QueryPerformanceCounter (&now)) - { - set_errno (ENOSYS); - return -1; - } - - // FIXME: Use round() here? - now.QuadPart = (LONGLONG) (freq * (double) (now.QuadPart - primed_pc.QuadPart)); - LONGLONG res = justdelta ? now.QuadPart : primed_ft.QuadPart + now.QuadPart; - return res; -} - -void -hires_ms::prime () -{ - if (!inited) - { - int priority = GetThreadPriority (GetCurrentThread ()); - SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL); - initime_us = systime () - (((LONGLONG) timeGetTime ()) * 1000LL); - inited = true; - SetThreadPriority (GetCurrentThread (), priority); - } - return; -} - -LONGLONG -hires_ms::usecs () -{ - if (!inited) - prime (); - - LONGLONG t = systime (); - LONGLONG res = initime_us + (((LONGLONG) timeGetTime ()) * 1000LL); - if (res < (t - 40000LL)) - { - inited = false; - prime (); - res = initime_us + (((LONGLONG) timeGetTime ()) * 1000LL); - } - return res; -} - -extern "C" int -clock_gettime (clockid_t clk_id, struct timespec *tp) -{ - if (clk_id != CLOCK_REALTIME) - { - set_errno (ENOSYS); - return -1; - } - - LONGLONG now = gtod.usecs (); - if (now == (LONGLONG) -1) - return -1; - - tp->tv_sec = now / 1000000; - tp->tv_nsec = (now % 1000000) * 1000; - return 0; -} - -static DWORD minperiod; // FIXME: Maintain period after a fork. - -UINT -hires_ms::resolution () -{ - if (!minperiod) - { - /* Try to empirically determine current timer resolution */ - int priority = GetThreadPriority (GetCurrentThread ()); - SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL); - DWORD period = 0; - for (int i = 0; i < 4; i++) - { - DWORD now; - DWORD then = timeGetTime (); - while ((now = timeGetTime ()) == then) - continue; - then = now; - while ((now = timeGetTime ()) == then) - continue; - period += now - then; - } - SetThreadPriority (GetCurrentThread (), priority); - period /= 4; - minperiod = period; - } - return minperiod; -} - -extern "C" int -clock_getres (clockid_t clk_id, struct timespec *tp) -{ - if (clk_id != CLOCK_REALTIME) - { - set_errno (ENOSYS); - return -1; - } - - DWORD period = gtod.resolution (); - - tp->tv_sec = period / 1000; - tp->tv_nsec = (period % 1000) * 1000000; - - return 0; -} - -extern "C" int -clock_setres (clockid_t clk_id, struct timespec *tp) -{ - static NO_COPY bool period_set; - if (clk_id != CLOCK_REALTIME) - { - set_errno (ENOSYS); - return -1; - } - - if (period_set) - timeEndPeriod (minperiod); - - DWORD period = (tp->tv_sec * 1000) + ((tp->tv_nsec) / 1000000); - - if (timeBeginPeriod (period)) - { - minperiod = period; - period_set = true; - } - else - { - __seterrno (); - timeBeginPeriod (minperiod); - return -1; - } - - return 0; -} diff --git a/winsup/cygwin/tlsoffsets.h b/winsup/cygwin/tlsoffsets.h deleted file mode 100644 index 9002abfce..000000000 --- a/winsup/cygwin/tlsoffsets.h +++ /dev/null @@ -1,133 +0,0 @@ -//;# autogenerated: Do not edit. - -//; $tls::sizeof__cygtls = 4212; -//; $tls::func = -4212; -//; $tls::pfunc = 0; -//; $tls::saved_errno = -4208; -//; $tls::psaved_errno = 4; -//; $tls::sa_flags = -4204; -//; $tls::psa_flags = 8; -//; $tls::oldmask = -4200; -//; $tls::poldmask = 12; -//; $tls::deltamask = -4196; -//; $tls::pdeltamask = 16; -//; $tls::event = -4192; -//; $tls::pevent = 20; -//; $tls::errno_addr = -4188; -//; $tls::perrno_addr = 24; -//; $tls::sigmask = -4184; -//; $tls::psigmask = 28; -//; $tls::sigwait_mask = -4180; -//; $tls::psigwait_mask = 32; -//; $tls::sigwait_info = -4176; -//; $tls::psigwait_info = 36; -//; $tls::thread_context = -4172; -//; $tls::pthread_context = 40; -//; $tls::thread_id = -3960; -//; $tls::pthread_id = 252; -//; $tls::threadkill = -3956; -//; $tls::pthreadkill = 256; -//; $tls::infodata = -3952; -//; $tls::pinfodata = 260; -//; $tls::tid = -3804; -//; $tls::ptid = 408; -//; $tls::local_clib = -3800; -//; $tls::plocal_clib = 412; -//; $tls::__dontuse = -3800; -//; $tls::p__dontuse = 412; -//; $tls::locals = -2736; -//; $tls::plocals = 1476; -//; $tls::_ctinfo = -1104; -//; $tls::p_ctinfo = 3108; -//; $tls::el = -1100; -//; $tls::pel = 3112; -//; $tls::andreas = -1092; -//; $tls::pandreas = 3120; -//; $tls::wq = -1084; -//; $tls::pwq = 3128; -//; $tls::prev = -1056; -//; $tls::pprev = 3156; -//; $tls::next = -1052; -//; $tls::pnext = 3160; -//; $tls::sig = -1048; -//; $tls::psig = 3164; -//; $tls::incyg = -1044; -//; $tls::pincyg = 3168; -//; $tls::spinning = -1040; -//; $tls::pspinning = 3172; -//; $tls::stacklock = -1036; -//; $tls::pstacklock = 3176; -//; $tls::stackptr = -1032; -//; $tls::pstackptr = 3180; -//; $tls::stack = -1028; -//; $tls::pstack = 3184; -//; $tls::initialized = -4; -//; $tls::pinitialized = 4208; -//; $tls::padding = 0; -//; $tls::ppadding = 4212; -//; __DATA__ - -#define tls_func (-4212) -#define tls_pfunc (0) -#define tls_saved_errno (-4208) -#define tls_psaved_errno (4) -#define tls_sa_flags (-4204) -#define tls_psa_flags (8) -#define tls_oldmask (-4200) -#define tls_poldmask (12) -#define tls_deltamask (-4196) -#define tls_pdeltamask (16) -#define tls_event (-4192) -#define tls_pevent (20) -#define tls_errno_addr (-4188) -#define tls_perrno_addr (24) -#define tls_sigmask (-4184) -#define tls_psigmask (28) -#define tls_sigwait_mask (-4180) -#define tls_psigwait_mask (32) -#define tls_sigwait_info (-4176) -#define tls_psigwait_info (36) -#define tls_thread_context (-4172) -#define tls_pthread_context (40) -#define tls_thread_id (-3960) -#define tls_pthread_id (252) -#define tls_threadkill (-3956) -#define tls_pthreadkill (256) -#define tls_infodata (-3952) -#define tls_pinfodata (260) -#define tls_tid (-3804) -#define tls_ptid (408) -#define tls_local_clib (-3800) -#define tls_plocal_clib (412) -#define tls___dontuse (-3800) -#define tls_p__dontuse (412) -#define tls_locals (-2736) -#define tls_plocals (1476) -#define tls__ctinfo (-1104) -#define tls_p_ctinfo (3108) -#define tls_el (-1100) -#define tls_pel (3112) -#define tls_andreas (-1092) -#define tls_pandreas (3120) -#define tls_wq (-1084) -#define tls_pwq (3128) -#define tls_prev (-1056) -#define tls_pprev (3156) -#define tls_next (-1052) -#define tls_pnext (3160) -#define tls_sig (-1048) -#define tls_psig (3164) -#define tls_incyg (-1044) -#define tls_pincyg (3168) -#define tls_spinning (-1040) -#define tls_pspinning (3172) -#define tls_stacklock (-1036) -#define tls_pstacklock (3176) -#define tls_stackptr (-1032) -#define tls_pstackptr (3180) -#define tls_stack (-1028) -#define tls_pstack (3184) -#define tls_initialized (-4) -#define tls_pinitialized (4208) -#define tls_padding (0) -#define tls_ppadding (4212) diff --git a/winsup/cygwin/tty.cc b/winsup/cygwin/tty.cc deleted file mode 100644 index bbc6f21e7..000000000 --- a/winsup/cygwin/tty.cc +++ /dev/null @@ -1,500 +0,0 @@ -/* tty.cc - - Copyright 1997, 1998, 2000, 2001, 2002 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "pinfo.h" -#include "cygserver.h" -#include "shared_info.h" -#include "cygthread.h" - -extern fhandler_tty_master *tty_master; - -extern "C" int -grantpt (int fd) -{ - return 0; -} - -extern "C" int -unlockpt (int fd) -{ - return 0; -} - -extern "C" int -revoke (char *ttyname) -{ - set_errno (ENOSYS); - return -1; -} - -extern "C" int -ttyslot (void) -{ - if (NOTSTATE (myself, PID_USETTY)) - return -1; - return myself->ctty; -} - -void __stdcall -tty_init () -{ - if (!myself->cygstarted && NOTSTATE (myself, PID_CYGPARENT)) - cygheap->fdtab.get_debugger_info (); - - if (NOTSTATE (myself, PID_USETTY)) - return; - if (myself->ctty == -1) - if (NOTSTATE (myself, PID_CYGPARENT)) - myself->ctty = attach_tty (myself->ctty); - else - return; - if (myself->ctty == -1) - termios_printf ("Can't attach to tty"); -} - -/* Create session's master tty */ - -void __stdcall -create_tty_master (int ttynum) -{ - device ttym = *ttym_dev; - ttym.setunit (ttynum); /* CGF FIXME device */ - tty_master = (fhandler_tty_master *) build_fh_dev (ttym); - if (tty_master->init ()) - api_fatal ("Can't create master tty"); - else - { - /* Log utmp entry */ - struct utmp our_utmp; - DWORD len = sizeof our_utmp.ut_host; - - bzero ((char *) &our_utmp, sizeof (utmp)); - time (&our_utmp.ut_time); - strncpy (our_utmp.ut_name, getlogin (), sizeof (our_utmp.ut_name)); - GetComputerName (our_utmp.ut_host, &len); - __small_sprintf (our_utmp.ut_line, "tty%d", ttynum); - if ((len = strlen (our_utmp.ut_line)) >= UT_IDLEN) - len -= UT_IDLEN; - else - len = 0; - strncpy (our_utmp.ut_id, our_utmp.ut_line + len, UT_IDLEN); - our_utmp.ut_type = USER_PROCESS; - our_utmp.ut_pid = myself->pid; - myself->ctty = ttynum; - login (&our_utmp); - } -} - -void __stdcall -tty_terminate () -{ - if (NOTSTATE (myself, PID_USETTY)) - return; - cygwin_shared->tty.terminate (); -} - -int __stdcall -attach_tty (int num) -{ - if (num != -1) - { - return cygwin_shared->tty.connect_tty (num); - } - if (NOTSTATE (myself, PID_USETTY)) - return -1; - return cygwin_shared->tty.allocate_tty (true); -} - -void -tty_list::terminate () -{ - int ttynum = myself->ctty; - - /* Keep master running till there are connected clients */ - if (ttynum != -1 && ttys[ttynum].master_pid == GetCurrentProcessId ()) - { - tty *t = ttys + ttynum; - CloseHandle (t->from_master); - CloseHandle (t->to_master); - /* Wait for children which rely on tty handling in this process to - go away */ - for (int i = 0; ; i++) - { - if (!t->slave_alive ()) - break; - if (i >= 100) - { - small_printf ("waiting for children using tty%d to terminate\n", - ttynum); - i = 0; - } - - low_priority_sleep (200); - } - - if (WaitForSingleObject (tty_mutex, INFINITE) == WAIT_FAILED) - termios_printf ("WFSO for tty_mutex %p failed, %E", tty_mutex); - - termios_printf ("tty %d master about to finish", ttynum); - ForceCloseHandle1 (t->to_slave, to_pty); - ForceCloseHandle1 (t->from_slave, from_pty); - CloseHandle (tty_master->inuse); - t->init (); - - char buf[20]; - __small_sprintf (buf, "tty%d", ttynum); - logout (buf); - - ReleaseMutex (tty_mutex); - } -} - -int -tty_list::connect_tty (int ttynum) -{ - if (ttynum < 0 || ttynum >= NTTYS) - { - termios_printf ("ttynum (%d) out of range", ttynum); - return -1; - } - if (!ttys[ttynum].exists ()) - { - termios_printf ("tty %d was not allocated", ttynum); - return -1; - } - - return ttynum; -} - -void -tty_list::init () -{ - for (int i = 0; i < NTTYS; i++) - { - ttys[i].init (); - ttys[i].setntty (i); - } -} - -/* Search for tty class for our console. Allocate new tty if our process is - the only cygwin process in the current console. - Return tty number or -1 if error. - If flag == 0, just find a free tty. - */ -int -tty_list::allocate_tty (bool with_console) -{ - HWND console; - int freetty = -1; - HANDLE hmaster = NULL; - - /* FIXME: This whole function needs a protective mutex. */ - - if (WaitForSingleObject (tty_mutex, INFINITE) == WAIT_FAILED) - termios_printf ("WFSO for tty_mutex %p failed, %E", tty_mutex); - - if (!with_console) - console = NULL; - else if (!(console = GetConsoleWindow ())) - { - char oldtitle[TITLESIZE]; - - if (!GetConsoleTitle (oldtitle, TITLESIZE)) - { - termios_printf ("Can't read console title"); - goto out; - } - - char buf[40]; - - __small_sprintf (buf, "cygwin.find.console.%d", myself->pid); - SetConsoleTitle (buf); - for (int times = 0; times < 25; times++) - { - Sleep (10); - if ((console = FindWindow (NULL, buf))) - break; - } - SetConsoleTitle (oldtitle); - Sleep (40); - if (console == NULL) - { - termios_printf ("Can't find console window"); - goto out; - } - } - - /* Is a tty allocated for console? */ - for (int i = 0; i < NTTYS; i++) - { - if (!ttys[i].exists ()) - { - if (freetty < 0) /* Scanning? */ - freetty = i; /* Yes. */ - if (!with_console) /* Do we want to attach this to a console? */ - break; /* No. We've got one. */ - } - - /* FIXME: Is this right? We can potentially query a "nonexistent" - tty slot after falling through from the above? */ - if (with_console && ttys[i].gethwnd () == console) - { - termios_printf ("console %x already associated with tty%d", - console, i); - /* Is the master alive? */ - hmaster = OpenProcess (PROCESS_DUP_HANDLE, FALSE, ttys[i].master_pid); - if (hmaster) - { - CloseHandle (hmaster); - freetty = i; - goto out; - } - /* Master is dead */ - freetty = i; - break; - } - } - - /* There is no tty allocated to console, allocate the first free found */ - if (freetty == -1) - goto out; - - tty *t; - t = ttys + freetty; - t->init (); - t->setsid (-1); - t->setpgid (myself->pgid); - t->sethwnd (console); - -out: - if (freetty < 0) - { - ReleaseMutex (tty_mutex); - system_printf ("No tty allocated"); - } - else if (!with_console) - { - termios_printf ("tty%d allocated", freetty); - /* exit with tty_mutex still held -- caller has more work to do */ - } - else - { - termios_printf ("console %p associated with tty%d", console, freetty); - if (!hmaster) - create_tty_master (freetty); - ReleaseMutex (tty_mutex); - } - return freetty; -} - -bool -tty::slave_alive () -{ - return alive (TTY_SLAVE_ALIVE); -} - -bool -tty::master_alive () -{ - return alive (TTY_MASTER_ALIVE); -} - -bool -tty::alive (const char *fmt) -{ - HANDLE ev; - char buf[CYG_MAX_PATH]; - - shared_name (buf, fmt, ntty); - if ((ev = OpenEvent (EVENT_ALL_ACCESS, FALSE, buf))) - CloseHandle (ev); - return ev != NULL; -} - -HANDLE -tty::open_output_mutex () -{ - return open_mutex (OUTPUT_MUTEX); -} - -HANDLE -tty::open_input_mutex () -{ - return open_mutex (INPUT_MUTEX); -} - -HANDLE -tty::open_mutex (const char *mutex) -{ - char buf[CYG_MAX_PATH]; - shared_name (buf, mutex, ntty); - return OpenMutex (MUTEX_ALL_ACCESS, TRUE, buf); -} - -HANDLE -tty::create_inuse (const char *fmt) -{ - HANDLE h; - char buf[CYG_MAX_PATH]; - - shared_name (buf, fmt, ntty); - h = CreateEvent (&sec_all, TRUE, FALSE, buf); - termios_printf ("%s %p", buf, h); - if (!h) - termios_printf ("couldn't open inuse event, %E", buf); - return h; -} - -void -tty::init () -{ - output_stopped = 0; - setsid (0); - pgid = 0; - hwnd = NULL; - to_slave = NULL; - from_slave = NULL; - was_opened = 0; - master_pid = 0; -} - -HANDLE -tty::get_event (const char *fmt, BOOL manual_reset) -{ - HANDLE hev; - char buf[CYG_MAX_PATH]; - - shared_name (buf, fmt, ntty); - if (!(hev = CreateEvent (&sec_all, manual_reset, FALSE, buf))) - { - termios_printf ("couldn't create %s", buf); - set_errno (ENOENT); /* FIXME this can't be the right errno */ - return NULL; - } - - termios_printf ("created event %s", buf); - return hev; -} - -bool -tty::make_pipes (fhandler_pty_master *ptym) -{ - /* Create communication pipes */ - - /* FIXME: should this be sec_none_nih? */ - if (!CreatePipe (&from_master, &to_slave, &sec_all, 128 * 1024)) - { - termios_printf ("can't create input pipe"); - set_errno (ENOENT); - return false; - } - - // ProtectHandle1INH (to_slave, to_pty); - if (!CreatePipe (&from_slave, &to_master, &sec_all, 128 * 1024)) - { - termios_printf ("can't create output pipe"); - set_errno (ENOENT); - return false; - } - // ProtectHandle1INH (from_slave, from_pty); - termios_printf ("tty%d from_slave %p, to_slave %p", ntty, from_slave, - to_slave); - - DWORD pipe_mode = PIPE_NOWAIT; - if (!SetNamedPipeHandleState (to_slave, &pipe_mode, NULL, NULL)) - termios_printf ("can't set to_slave to non-blocking mode"); - ptym->set_io_handle (from_slave); - ptym->set_output_handle (to_slave); - return true; -} - -bool -tty::common_init (fhandler_pty_master *ptym) -{ - /* Set termios information. Force initialization. */ - ptym->tcinit (this, true); - - if (!make_pipes (ptym)) - return false; - ptym->need_nl = 0; - - /* Save our pid */ - - master_pid = GetCurrentProcessId (); - - /* We do not open allow the others to open us (for handle duplication) - but rely on cygheap->inherited_ctty for descendant processes. - In the future the cygserver may allow access by others. */ - -#ifdef USE_SERVER - if (wincap.has_security ()) - { - if (cygserver_running == CYGSERVER_UNKNOWN) - cygserver_init (); - } -#endif - - /* Create synchronisation events */ - - if (ptym->get_major () != DEV_TTYM_MAJOR) - { - ptym->output_done_event = ptym->ioctl_done_event = - ptym->ioctl_request_event = NULL; - } - else - { - if (!(ptym->output_done_event = get_event (OUTPUT_DONE_EVENT))) - return false; - if (!(ptym->ioctl_done_event = get_event (IOCTL_DONE_EVENT))) - return false; - if (!(ptym->ioctl_request_event = get_event (IOCTL_REQUEST_EVENT))) - return false; - } - - if (!(ptym->input_available_event = get_event (INPUT_AVAILABLE_EVENT, TRUE))) - return false; - - char buf[CYG_MAX_PATH]; - shared_name (buf, OUTPUT_MUTEX, ntty); - if (!(ptym->output_mutex = CreateMutex (&sec_all, FALSE, buf))) - { - termios_printf ("can't create %s", buf); - set_errno (ENOENT); - return false; - } - - shared_name (buf, INPUT_MUTEX, ntty); - if (!(ptym->input_mutex = CreateMutex (&sec_all, FALSE, buf))) - { - termios_printf ("can't create %s", buf); - set_errno (ENOENT); - return false; - } - - // /* screws up tty master */ ProtectHandle1INH (ptym->output_mutex, output_mutex); - // /* screws up tty master */ ProtectHandle1INH (ptym->input_mutex, input_mutex); - winsize.ws_col = 80; - winsize.ws_row = 25; - - termios_printf ("tty%d opened", ntty); - return true; -} diff --git a/winsup/cygwin/tty.h b/winsup/cygwin/tty.h deleted file mode 100644 index c8a266e91..000000000 --- a/winsup/cygwin/tty.h +++ /dev/null @@ -1,139 +0,0 @@ -/* tty.h: shared tty info for cygwin - - Copyright 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -/* tty tables */ - -#define INP_BUFFER_SIZE 256 -#define OUT_BUFFER_SIZE 256 -#define NTTYS 128 -#define real_tty_attached(p) ((p)->ctty >= 0 && (p)->ctty != TTY_CONSOLE) - -/* Input/Output/ioctl events */ - -#define OUTPUT_DONE_EVENT "cygtty.output.done" -#define IOCTL_REQUEST_EVENT "cygtty.ioctl.request" -#define IOCTL_DONE_EVENT "cygtty.ioctl.done" -#define RESTART_OUTPUT_EVENT "cygtty.output.restart" -#define INPUT_AVAILABLE_EVENT "cygtty.input.avail" -#define OUTPUT_MUTEX "cygtty.output.mutex" -#define INPUT_MUTEX "cygtty.input.mutex" -#define TTY_SLAVE_ALIVE "cygtty.slave_alive" -#define TTY_MASTER_ALIVE "cygtty.master_alive" - -#include - -#ifndef MIN_CTRL_C_SLOP -#define MIN_CTRL_C_SLOP 50 -#endif - -class tty_min -{ - pid_t sid; /* Session ID of tty */ - struct status_flags - { - unsigned initialized : 1; /* Set if tty is initialized */ - unsigned rstcons : 1; /* Set if console needs to be set to "non-cooked" */ - } status; - -public: - pid_t pgid; - int output_stopped; - int ntty; - DWORD last_ctrl_c; // tick count of last ctrl-c - - IMPLEMENT_STATUS_FLAG (bool, initialized) - IMPLEMENT_STATUS_FLAG (bool, rstcons) - - tty_min (int t = -1, pid_t s = -1) : sid (s), ntty (t) {} - void setntty (int n) {ntty = n;} - pid_t getpgid () {return pgid;} - void setpgid (int pid) {pgid = pid;} - int getsid () {return sid;} - void setsid (pid_t tsid) {sid = tsid;} - void kill_pgrp (int sig); - struct termios ti; - struct winsize winsize; - - /* ioctl requests buffer */ - int cmd; - union - { - struct termios termios; - struct winsize winsize; - int value; - pid_t pid; - } arg; - /* XXX_retval variables holds master's completion codes. Error are stored as - * -ERRNO - */ - int ioctl_retval; - - int write_error; -}; - -class fhandler_pty_master; - -class tty: public tty_min -{ - HANDLE get_event (const char *fmt, BOOL manual_reset = FALSE) - __attribute__ ((regparm (3))); -public: - HWND hwnd; /* Console window handle tty belongs to */ - - DWORD master_pid; /* Win32 PID of tty master process */ - - HANDLE from_master, to_slave; - HANDLE from_slave, to_master; - - int read_retval; - bool was_opened; /* True if opened at least once. */ - - void init (); - HANDLE create_inuse (const char *); - bool common_init (fhandler_pty_master *); - bool alive (const char *fmt); - bool slave_alive (); - bool master_alive (); - HWND gethwnd () {return hwnd;} - void sethwnd (HWND wnd) {hwnd = wnd;} - bool make_pipes (fhandler_pty_master *ptym); - HANDLE open_mutex (const char *mutex); - HANDLE open_output_mutex (); - HANDLE open_input_mutex (); - bool exists () - { - HANDLE h = open_output_mutex (); - if (h) - { - CloseHandle (h); - return 1; - } - return slave_alive (); - } -}; - -class tty_list -{ - tty ttys[NTTYS]; - -public: - tty * operator [](int n) {return ttys + n;} - int allocate_tty (bool); /* true if allocate a tty, pty otherwise */ - int connect_tty (int); - void terminate (); - void init (); - tty_min *get_tty (int n); -}; - -void __stdcall tty_init (); -void __stdcall tty_terminate (); -int __stdcall attach_tty (int); -void __stdcall create_tty_master (int); -extern "C" int ttyslot (void); diff --git a/winsup/cygwin/tz_posixrules.h b/winsup/cygwin/tz_posixrules.h deleted file mode 100644 index dea668e2f..000000000 --- a/winsup/cygwin/tz_posixrules.h +++ /dev/null @@ -1,48 +0,0 @@ -/* generated with bin2h from zoneinfo/posixrules */ - -static NO_COPY unsigned char _posixrules_data[] = { -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, -0,1,16,0,0,0,2,0,0,0,8,0,151,254,240,1,135,225,224,2,119,224,240,3,112,254,96,4,96,253,112,5,80, -224,96,6,64,223,112,7,48,194,96,7,141,25,112,9,16,164,96,9,173,148,240,10,240,134,96,11,224,133,112,12,217,162, -224,13,192,103,112,14,185,132,224,15,169,131,240,16,153,102,224,17,137,101,240,18,121,72,224,19,105,71,240,20,89,42,224, -21,73,41,240,22,57,12,224,23,41,11,240,24,34,41,96,25,8,237,240,26,2,11,96,26,242,10,112,27,225,237,96,28, -209,236,112,29,193,207,96,30,177,206,112,31,161,177,96,32,118,0,240,33,129,147,96,34,85,226,240,35,106,175,224,36,53, -196,240,37,74,145,224,38,21,166,240,39,42,115,224,39,254,195,112,41,10,85,224,41,222,165,112,42,234,55,224,43,190,135, -112,44,211,84,96,45,158,105,112,46,179,54,96,47,126,75,112,48,147,24,96,49,103,103,240,50,114,250,96,51,71,73,240, -52,82,220,96,53,39,43,240,54,50,190,96,55,7,13,240,56,27,218,224,56,230,239,240,57,251,188,224,58,198,209,240,59, -219,158,224,60,175,238,112,61,187,128,224,62,143,208,112,63,155,98,224,64,111,178,112,65,132,127,96,66,79,148,112,67,100, -97,96,68,47,118,112,69,68,67,96,70,15,88,112,71,36,37,96,71,248,116,240,73,4,7,96,73,216,86,240,74,227,233, -96,75,184,56,240,76,205,5,224,77,152,26,240,78,172,231,224,79,119,252,240,80,140,201,224,81,97,25,112,82,108,171,224, -83,64,251,112,84,76,141,224,85,32,221,112,86,44,111,224,87,0,191,112,88,21,140,96,88,224,161,112,89,245,110,96,90, -192,131,112,91,213,80,96,92,169,159,240,93,181,50,96,94,137,129,240,95,149,20,96,96,105,99,240,97,126,48,224,98,73, -69,240,99,94,18,224,100,41,39,240,101,61,244,224,102,18,68,112,103,29,214,224,103,242,38,112,104,253,184,224,105,210,8, -112,106,221,154,224,107,177,234,112,108,198,183,96,109,145,204,112,110,166,153,96,111,113,174,112,112,134,123,96,113,90,202,240, -114,102,93,96,115,58,172,240,116,70,63,96,117,26,142,240,118,47,91,224,118,250,112,240,120,15,61,224,120,218,82,240,121, -239,31,224,122,186,52,240,123,207,1,224,124,163,81,112,125,174,227,224,126,131,51,112,127,142,197,224,128,99,21,112,129,119, -226,96,130,66,247,112,131,87,196,96,132,34,217,112,133,55,166,96,134,11,245,240,135,23,136,96,135,235,215,240,136,247,106, -96,137,203,185,240,138,215,76,96,139,171,155,240,140,192,104,224,141,139,125,240,142,160,74,224,143,107,95,240,144,128,44,224, -145,84,124,112,146,96,14,224,147,52,94,112,148,63,240,224,149,20,64,112,150,41,13,96,150,244,34,112,152,8,239,96,152, -212,4,112,153,232,209,96,154,189,32,240,155,200,179,96,156,157,2,240,157,168,149,96,158,124,228,240,159,136,119,96,160,92, -198,240,161,113,147,224,162,60,168,240,163,81,117,224,164,28,138,240,165,49,87,224,166,5,167,112,167,17,57,224,167,229,137, -112,168,241,27,224,169,197,107,112,170,218,56,96,171,165,77,112,172,186,26,96,173,133,47,112,174,153,252,96,175,101,17,112, -176,121,222,96,177,78,45,240,178,89,192,96,179,46,15,240,180,57,162,96,181,13,241,240,182,34,190,224,182,237,211,240,184, -2,160,224,184,205,181,240,185,226,130,224,186,182,210,112,187,194,100,224,188,150,180,112,189,162,70,224,190,118,150,112,191,130, -40,224,192,86,120,112,193,107,69,96,194,54,90,112,195,75,39,96,196,22,60,112,197,43,9,96,197,255,88,240,199,10,235, -96,199,223,58,240,200,234,205,96,201,191,28,240,202,211,233,224,203,158,254,240,204,179,203,224,205,126,224,240,206,147,173,224, -207,103,253,112,208,115,143,224,209,71,223,112,210,83,113,224,211,39,193,112,212,51,83,224,213,7,163,112,214,28,112,96,214, -231,133,112,215,252,82,96,216,199,103,112,217,220,52,96,218,176,131,240,219,188,22,96,220,144,101,240,221,155,248,96,222,112, -71,240,223,133,20,224,224,80,41,240,225,100,246,224,226,48,11,240,227,68,216,224,228,15,237,240,229,36,186,224,229,249,10, -112,231,4,156,224,231,216,236,112,232,228,126,224,233,184,206,112,234,205,155,96,235,152,176,112,236,173,125,96,237,120,146,112, -238,141,95,96,239,97,174,240,240,109,65,96,241,65,144,240,242,77,35,96,243,33,114,240,244,45,5,96,245,1,84,240,246, -22,33,224,246,225,54,240,247,246,3,224,248,193,24,240,249,213,229,224,250,160,250,240,251,181,199,224,252,138,23,112,253,149, -169,224,254,105,249,112,255,117,139,224,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, -1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, -0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, -1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, -0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, -1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, -0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, -1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, -0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,255,255,199,192,1,0,255,255,185,176,0,4,69,68,84, -0,69,83,84,0,0,0 -}; diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc deleted file mode 100644 index d649733b0..000000000 --- a/winsup/cygwin/uinfo.cc +++ /dev/null @@ -1,572 +0,0 @@ -/* uinfo.cc: user info (uid, gid, etc...) - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "cygerrno.h" -#include "pinfo.h" -#include "security.h" -#include "path.h" -#include "fhandler.h" -#include "dtable.h" -#include "cygheap.h" -#include "registry.h" -#include "child_info.h" -#include "environ.h" -#include "pwdgrp.h" - -/* Initialize the part of cygheap_user that does not depend on files. - The information is used in shared.cc for the user shared. - Final initialization occurs in uinfo_init */ -void -cygheap_user::init () -{ - char user_name[UNLEN + 1]; - DWORD user_name_len = UNLEN + 1; - - set_name (GetUserName (user_name, &user_name_len) ? user_name : "unknown"); - - if (!wincap.has_security ()) - return; - - DWORD siz; - PSECURITY_DESCRIPTOR psd; - - if (!GetTokenInformation (hProcToken, TokenPrimaryGroup, - &groups.pgsid, sizeof (cygsid), &siz)) - system_printf ("GetTokenInformation (TokenPrimaryGroup), %E"); - - /* Get the SID from current process and store it in effec_cygsid */ - if (!GetTokenInformation (hProcToken, TokenUser, &effec_cygsid, - sizeof (cygsid), &siz)) - { - system_printf ("GetTokenInformation (TokenUser), %E"); - return; - } - - /* Set token owner to the same value as token user */ - if (!SetTokenInformation (hProcToken, TokenOwner, &effec_cygsid, - sizeof (cygsid))) - debug_printf ("SetTokenInformation(TokenOwner), %E"); - - /* Standard way to build a security descriptor with the usual DACL */ - PSECURITY_ATTRIBUTES sa_buf = (PSECURITY_ATTRIBUTES) alloca (1024); - psd = (PSECURITY_DESCRIPTOR) - (sec_user_nih (sa_buf, sid()))->lpSecurityDescriptor; - - BOOL acl_exists, dummy; - TOKEN_DEFAULT_DACL dacl; - if (GetSecurityDescriptorDacl (psd, &acl_exists, &dacl.DefaultDacl, &dummy) - && acl_exists && dacl.DefaultDacl) - { - /* Set the default DACL and the process DACL */ - if (!SetTokenInformation (hProcToken, TokenDefaultDacl, &dacl, - sizeof (dacl))) - system_printf ("SetTokenInformation (TokenDefaultDacl), %E"); - if (!SetKernelObjectSecurity (hMainProc, DACL_SECURITY_INFORMATION, psd)) - system_printf ("SetKernelObjectSecurity, %E"); - } - else - system_printf("Cannot get dacl, %E"); -} - -void -internal_getlogin (cygheap_user &user) -{ - struct passwd *pw = NULL; - - if (wincap.has_security ()) - { - cygpsid psid = user.sid (); - pw = internal_getpwsid (psid); - } - - if (!pw && !(pw = internal_getpwnam (user.name ())) - && !(pw = internal_getpwuid (DEFAULT_UID))) - debug_printf ("user not found in augmented /etc/passwd"); - else - { - myself->uid = pw->pw_uid; - myself->gid = pw->pw_gid; - user.set_name (pw->pw_name); - if (wincap.has_security ()) - { - cygsid gsid; - if (gsid.getfromgr (internal_getgrgid (pw->pw_gid))) - { - if (gsid != user.groups.pgsid) - { - /* Set primary group to the group in /etc/passwd. */ - if (!SetTokenInformation (hProcToken, TokenPrimaryGroup, - &gsid, sizeof gsid)) - debug_printf ("SetTokenInformation(TokenPrimaryGroup), %E"); - if (!SetTokenInformation (hProcImpToken, TokenPrimaryGroup, - &gsid, sizeof gsid)) - debug_printf ("SetTokenInformation(TokenPrimaryGroup), %E"); - else - user.groups.pgsid = gsid; - } - } - else - debug_printf ("gsid not found in augmented /etc/group"); - } - } - cygheap->user.ontherange (CH_HOME, pw); -} - -void -uinfo_init () -{ - if (child_proc_info && !cygheap->user.has_impersonation_tokens ()) - return; - - if (!child_proc_info) - internal_getlogin (cygheap->user); /* Set the cygheap->user. */ - /* Conditions must match those in spawn to allow starting child - processes with ruid != euid and rgid != egid. */ - else if (cygheap->user.issetuid () - && cygheap->user.saved_uid == cygheap->user.real_uid - && cygheap->user.saved_gid == cygheap->user.real_gid - && !cygheap->user.groups.issetgroups ()) - { - cygheap->user.reimpersonate (); - return; - } - else - cygheap->user.close_impersonation_tokens (); - - cygheap->user.saved_uid = cygheap->user.real_uid = myself->uid; - cygheap->user.saved_gid = cygheap->user.real_gid = myself->gid; - cygheap->user.external_token = NO_IMPERSONATION; - cygheap->user.internal_token = NO_IMPERSONATION; - cygheap->user.curr_primary_token = NO_IMPERSONATION; - cygheap->user.current_token = NO_IMPERSONATION; - cygheap->user.set_saved_sid (); /* Update the original sid */ - cygheap->user.reimpersonate (); -} - -extern "C" int -getlogin_r (char *name, size_t namesize) -{ - char *login = getlogin (); - size_t len = strlen (login) + 1; - if (len > namesize) - return ERANGE; - myfault efault; - if (efault.faulted ()) - return EFAULT; - strncpy (name, login, len); - return 0; -} - -extern "C" char * -getlogin (void) -{ - return strcpy (_my_tls.locals.username, cygheap->user.name ()); -} - -extern "C" __uid32_t -getuid32 (void) -{ - return cygheap->user.real_uid; -} - -extern "C" __uid16_t -getuid (void) -{ - return cygheap->user.real_uid; -} - -extern "C" __gid32_t -getgid32 (void) -{ - return cygheap->user.real_gid; -} - -extern "C" __gid16_t -getgid (void) -{ - return cygheap->user.real_gid; -} - -extern "C" __uid32_t -geteuid32 (void) -{ - return myself->uid; -} - -extern "C" __uid16_t -geteuid (void) -{ - return myself->uid; -} - -extern "C" __gid32_t -getegid32 (void) -{ - return myself->gid; -} - -extern "C" __gid16_t -getegid (void) -{ - return myself->gid; -} - -/* Not quite right - cuserid can change, getlogin can't */ -extern "C" char * -cuserid (char *src) -{ - if (!src) - return getlogin (); - - strcpy (src, getlogin ()); - return src; -} - -const char * -cygheap_user::ontherange (homebodies what, struct passwd *pw) -{ - LPUSER_INFO_3 ui = NULL; - WCHAR wuser[UNLEN + 1]; - NET_API_STATUS ret; - char homepath_env_buf[CYG_MAX_PATH]; - char homedrive_env_buf[3]; - char *newhomedrive = NULL; - char *newhomepath = NULL; - - - debug_printf ("what %d, pw %p", what, pw); - if (what == CH_HOME) - { - char *p; - if (homedrive) - newhomedrive = homedrive; - else if ((p = getenv ("HOMEDRIVE"))) - newhomedrive = p; - - if (homepath) - newhomepath = homepath; - else if ((p = getenv ("HOMEPATH"))) - newhomepath = p; - - if ((p = getenv ("HOME"))) - debug_printf ("HOME is already in the environment %s", p); - else - { - if (pw && pw->pw_dir && *pw->pw_dir) - { - debug_printf ("Set HOME (from /etc/passwd) to %s", pw->pw_dir); - setenv ("HOME", pw->pw_dir, 1); - } - else if (!newhomedrive || !newhomepath) - setenv ("HOME", "/", 1); - else - { - char home[CYG_MAX_PATH]; - char buf[CYG_MAX_PATH]; - strcpy (buf, newhomedrive); - strcat (buf, newhomepath); - cygwin_conv_to_full_posix_path (buf, home); - debug_printf ("Set HOME (from HOMEDRIVE/HOMEPATH) to %s", home); - setenv ("HOME", home, 1); - } - } - } - - if (what != CH_HOME && homepath == NULL && newhomepath == NULL) - { - if (!pw) - pw = internal_getpwnam (name ()); - if (pw && pw->pw_dir && *pw->pw_dir) - cygwin_conv_to_full_win32_path (pw->pw_dir, homepath_env_buf); - else - { - homepath_env_buf[0] = homepath_env_buf[1] = '\0'; - if (logsrv ()) - { - WCHAR wlogsrv[INTERNET_MAX_HOST_NAME_LENGTH + 3]; - sys_mbstowcs (wlogsrv, logsrv (), - sizeof (wlogsrv) / sizeof (*wlogsrv)); - sys_mbstowcs (wuser, winname (), sizeof (wuser) / sizeof (*wuser)); - if (!(ret = NetUserGetInfo (wlogsrv, wuser, 3, (LPBYTE *) &ui))) - { - sys_wcstombs (homepath_env_buf, CYG_MAX_PATH, - ui->usri3_home_dir); - if (!homepath_env_buf[0]) - { - sys_wcstombs (homepath_env_buf, CYG_MAX_PATH, - ui->usri3_home_dir_drive); - if (homepath_env_buf[0]) - strcat (homepath_env_buf, "\\"); - else - cygwin_conv_to_full_win32_path ("/", homepath_env_buf); - } - } - } - if (ui) - NetApiBufferFree (ui); - } - - if (homepath_env_buf[1] != ':') - { - newhomedrive = almost_null; - newhomepath = homepath_env_buf; - } - else - { - homedrive_env_buf[0] = homepath_env_buf[0]; - homedrive_env_buf[1] = homepath_env_buf[1]; - homedrive_env_buf[2] = '\0'; - newhomedrive = homedrive_env_buf; - newhomepath = homepath_env_buf + 2; - } - } - - if (newhomedrive && newhomedrive != homedrive) - cfree_and_set (homedrive, (newhomedrive == almost_null) - ? almost_null : cstrdup (newhomedrive)); - - if (newhomepath && newhomepath != homepath) - cfree_and_set (homepath, cstrdup (newhomepath)); - - switch (what) - { - case CH_HOMEDRIVE: - return homedrive; - case CH_HOMEPATH: - return homepath; - default: - return homepath; - } -} - -const char * -cygheap_user::test_uid (char *&what, const char *name, size_t namelen) -{ - if (!what && !issetuid ()) - what = getwinenveq (name, namelen, HEAP_STR); - return what; -} - -const char * -cygheap_user::env_logsrv (const char *name, size_t namelen) -{ - if (test_uid (plogsrv, name, namelen)) - return plogsrv; - - const char *mydomain = domain (); - const char *myname = winname (); - if (!mydomain || strcasematch (myname, "SYSTEM")) - return almost_null; - - char logsrv[INTERNET_MAX_HOST_NAME_LENGTH + 3]; - cfree_and_set (plogsrv, almost_null); - if (get_logon_server (mydomain, logsrv, NULL)) - plogsrv = cstrdup (logsrv); - return plogsrv; -} - -const char * -cygheap_user::env_domain (const char *name, size_t namelen) -{ - if (pwinname && test_uid (pdomain, name, namelen)) - return pdomain; - - char username[UNLEN + 1]; - DWORD ulen = sizeof (username); - char userdomain[DNLEN + 1]; - DWORD dlen = sizeof (userdomain); - SID_NAME_USE use; - - cfree_and_set (pwinname, almost_null); - cfree_and_set (pdomain, almost_null); - if (!LookupAccountSid (NULL, sid (), username, &ulen, - userdomain, &dlen, &use)) - __seterrno (); - else - { - pwinname = cstrdup (username); - pdomain = cstrdup (userdomain); - } - return pdomain; -} - -const char * -cygheap_user::env_userprofile (const char *name, size_t namelen) -{ - if (test_uid (puserprof, name, namelen)) - return puserprof; - - char userprofile_env_buf[CYG_MAX_PATH]; - char win_id[UNLEN + 1]; /* Large enough for SID */ - - cfree_and_set (puserprof, almost_null); - if (get_registry_hive_path (get_windows_id (win_id), userprofile_env_buf)) - puserprof = cstrdup (userprofile_env_buf); - - return puserprof; -} - -const char * -cygheap_user::env_homepath (const char *name, size_t namelen) -{ - return ontherange (CH_HOMEPATH); -} - -const char * -cygheap_user::env_homedrive (const char *name, size_t namelen) -{ - return ontherange (CH_HOMEDRIVE); -} - -const char * -cygheap_user::env_name (const char *name, size_t namelen) -{ - if (!test_uid (pwinname, name, namelen)) - domain (); - return pwinname; -} - -const char * -cygheap_user::env_systemroot (const char *name, size_t namelen) -{ - if (!psystemroot) - { - int size = GetWindowsDirectory (NULL, 0); - if (size > 0) - { - psystemroot = (char *) cmalloc (HEAP_STR, ++size); - size = GetWindowsDirectory (psystemroot, size); - if (size <= 0) - { - cfree (psystemroot); - psystemroot = NULL; - } - } - if (size <= 0) - debug_printf ("GetWindowsDirectory(), %E"); - } - return psystemroot; -} - -char * -pwdgrp::next_str (char c) -{ - char *res = lptr; - lptr = strechr (lptr, c); - if (*lptr) - *lptr++ = '\0'; - return res; -} - -bool -pwdgrp::next_num (unsigned long& n) -{ - char *p = next_str (':'); - char *cp; - n = strtoul (p, &cp, 10); - return p != cp && !*cp; -} - -char * -pwdgrp::add_line (char *eptr) -{ - if (eptr) - { - lptr = eptr; - eptr = strchr (lptr, '\n'); - if (eptr) - { - if (eptr > lptr && eptr[-1] == '\r') - eptr[-1] = '\0'; - else - *eptr = '\0'; - eptr++; - } - if (curr_lines >= max_lines) - { - max_lines += 10; - *pwdgrp_buf = realloc (*pwdgrp_buf, max_lines * pwdgrp_buf_elem_size); - } - if ((this->*parse) ()) - curr_lines++; - } - return eptr; -} - -void -pwdgrp::load (const char *posix_fname) -{ - const char *res; - static const char failed[] = "failed"; - static const char succeeded[] = "succeeded"; - - if (buf) - free (buf); - buf = NULL; - curr_lines = 0; - - pc.check (posix_fname); - etc_ix = etc::init (etc_ix, pc); - - paranoid_printf ("%s", posix_fname); - - if (pc.error || !pc.exists () || pc.isdir ()) - { - paranoid_printf ("strange path_conv problem"); - res = failed; - } - else - { - HANDLE fh = CreateFile (pc, GENERIC_READ, wincap.shared (), NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - if (fh == INVALID_HANDLE_VALUE) - { - paranoid_printf ("%s CreateFile failed, %E"); - res = failed; - } - else - { - DWORD size = GetFileSize (fh, NULL), read_bytes; - buf = (char *) malloc (size + 1); - if (!ReadFile (fh, buf, size, &read_bytes, NULL)) - { - paranoid_printf ("ReadFile failed, %E"); - CloseHandle (fh); - if (buf) - free (buf); - buf = NULL; - res = failed; - } - else - { - CloseHandle (fh); - buf[read_bytes] = '\0'; - char *eptr = buf; - while ((eptr = add_line (eptr))) - continue; - debug_printf ("%s curr_lines %d", posix_fname, curr_lines); - res = succeeded; - } - } - } - - debug_printf ("%s load %s", posix_fname, res); - initialized = true; -} diff --git a/winsup/cygwin/uname.cc b/winsup/cygwin/uname.cc deleted file mode 100644 index 3797b140d..000000000 --- a/winsup/cygwin/uname.cc +++ /dev/null @@ -1,115 +0,0 @@ -/* uname.cc - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. - Written by Steve Chamberlain of Cygnus Support, sac@cygnus.com - Rewritten by Geoffrey Noer of Cygnus Solutions, noer@cygnus.com - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include "cygwin_version.h" -#include "cygtls.h" - -/* uname: POSIX 4.4.1.1 */ -extern "C" int -uname (struct utsname *name) -{ - SYSTEM_INFO sysinfo; - - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - - char *snp = strstr (cygwin_version.dll_build_date, "SNP"); - - memset (name, 0, sizeof (*name)); - __small_sprintf (name->sysname, "CYGWIN_%s", wincap.osname ()); - -#if 0 - /* Recognition of the real 64 bit CPU inside of a WOW64 system, irritates - build systems which think the native system is a 64 bit system. Since - we're actually running in a 32 bit environment, it looks more correct - just to use the CPU info given by WOW64. */ - if (wincap.is_wow64 ()) - GetNativeSystemInfo (&sysinfo); - else -#else - /* But it seems ok to add a hint to the sysname, that we're running under - WOW64. This might give an early clue if somebody encounters problems. */ - if (wincap.is_wow64 ()) - strncat (name->sysname, "-WOW64", - sizeof name->sysname - strlen (name->sysname) - 1); -#endif - GetSystemInfo (&sysinfo); - - /* Computer name */ - cygwin_gethostname (name->nodename, sizeof (name->nodename) - 1); - - /* Cygwin dll release */ - __small_sprintf (name->release, "%d.%d.%d%s(%d.%d/%d/%d)", - cygwin_version.dll_major / 1000, - cygwin_version.dll_major % 1000, - cygwin_version.dll_minor, - snp ? "s" : "", - cygwin_version.api_major, - cygwin_version.api_minor, - cygwin_version.shared_data, - cygwin_version.mount_registry); - - /* Cygwin "version" aka build date */ - strcpy (name->version, cygwin_version.dll_build_date); - if (snp) - name->version[snp - cygwin_version.dll_build_date] = '\0'; - - /* CPU type */ - switch (sysinfo.wProcessorArchitecture) - { - case PROCESSOR_ARCHITECTURE_INTEL: - unsigned int ptype; - if (wincap.has_valid_processorlevel ()) - { - if (sysinfo.wProcessorLevel < 3) /* Shouldn't happen. */ - ptype = 3; - else if (sysinfo.wProcessorLevel > 9) /* P4 */ - ptype = 6; - else - ptype = sysinfo.wProcessorLevel; - } - else - { - if (sysinfo.dwProcessorType == PROCESSOR_INTEL_386 || - sysinfo.dwProcessorType == PROCESSOR_INTEL_486) - ptype = sysinfo.dwProcessorType / 100; - else - ptype = PROCESSOR_INTEL_PENTIUM / 100; - } - __small_sprintf (name->machine, "i%d86", ptype); - break; - case PROCESSOR_ARCHITECTURE_IA64: - strcpy (name->machine, "ia64"); - break; - case PROCESSOR_ARCHITECTURE_AMD64: - strcpy (name->machine, "x86_64"); - break; - case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64: - strcpy (name->machine, "ia32-win64"); - break; - case PROCESSOR_ARCHITECTURE_ALPHA: - strcpy (name->machine, "alpha"); - break; - case PROCESSOR_ARCHITECTURE_MIPS: - strcpy (name->machine, "mips"); - break; - default: - strcpy (name->machine, "unknown"); - break; - } - - return 0; -} diff --git a/winsup/cygwin/wait.cc b/winsup/cygwin/wait.cc deleted file mode 100644 index 2a7a94d37..000000000 --- a/winsup/cygwin/wait.cc +++ /dev/null @@ -1,121 +0,0 @@ -/* wait.cc: Posix wait routines. - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include "cygerrno.h" -#include "sigproc.h" -#include "thread.h" -#include "cygtls.h" - -/* This is called _wait and not wait because the real wait is defined - in libc/syscalls/syswait.c. It calls us. */ - -extern "C" pid_t -wait (int *status) -{ - return wait4 (-1, status, 0, NULL); -} - -extern "C" pid_t -waitpid (pid_t intpid, int *status, int options) -{ - return wait4 (intpid, status, options, NULL); -} - -extern "C" pid_t -wait3 (int *status, int options, struct rusage *r) -{ - return wait4 (-1, status, options, r); -} - -/* Wait for any child to complete. - * Note: this is not thread safe. Use of wait in multiple threads will - * not work correctly. - */ - -extern "C" pid_t -wait4 (int intpid, int *status, int options, struct rusage *r) -{ - int res; - HANDLE waitfor; - waitq *w = &_my_tls.wq; - - pthread_testcancel (); - - while (1) - { - sig_dispatch_pending (); - if (options & ~(WNOHANG | WUNTRACED)) - { - set_errno (EINVAL); - res = -1; - break; - } - - if (r) - memset (r, 0, sizeof (*r)); - - w->pid = intpid; - w->options = options; - w->rusage = r; - sigproc_printf ("calling proc_subproc, pid %d, options %d", - w->pid, w->options); - if (!proc_subproc (PROC_WAIT, (DWORD) w)) - { - set_errno (ENOSYS); - paranoid_printf ("proc_subproc returned 0"); - res = -1; - break; - } - - if ((waitfor = w->ev) == NULL) - goto nochildren; - - res = cancelable_wait (waitfor, INFINITE); - - sigproc_printf ("%d = WaitForSingleObject (...)", res); - - if (w->ev == NULL) - { - nochildren: - /* found no children */ - set_errno (ECHILD); - res = -1; - break; - } - - if (w->status == -1) - { - if (_my_tls.call_signal_handler ()) - continue; - set_sig_errno (EINTR); - res = -1; - } - else if (res != WAIT_OBJECT_0) - { - /* We shouldn't set errno to any random value if we can help it. - See the Posix manual for a list of valid values for `errno'. */ - set_errno (EINVAL); - res = -1; - } - else if ((res = w->pid) != 0 && status) - *status = w->status; - break; - } - - sigproc_printf ("intpid %d, status %p, w->status %d, options %d, res %d", - intpid, status, w->status, options, res); - w->status = -1; - if (res < 0) - sigproc_printf ("*** errno %d", get_errno ()); - return res; -} diff --git a/winsup/cygwin/winbase.h b/winsup/cygwin/winbase.h deleted file mode 100644 index 8e2ea99d5..000000000 --- a/winsup/cygwin/winbase.h +++ /dev/null @@ -1,67 +0,0 @@ -/* winbase.h - - Copyright 2002, 2003, 2004 Red Hat, Inc. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include_next "winbase.h" - -#ifndef _WINBASE2_H -#define _WINBASE2_H - -extern __inline__ long -ilockincr (long *m) -{ - register int __res; - __asm__ __volatile__ ("\n\ - movl $1,%0\n\ - lock xadd %0,%1\n\ - inc %0\n\ - ": "=&r" (__res), "=m" (*m): "m" (*m): "cc"); - return __res; -} - -extern __inline__ long -ilockdecr (long *m) -{ - register int __res; - __asm__ __volatile__ ("\n\ - movl $0xffffffff,%0\n\ - lock xadd %0,%1\n\ - dec %0\n\ - ": "=&r" (__res), "=m" (*m): "m" (*m): "cc"); - return __res; -} - -extern __inline__ long -ilockexch (long *t, long v) -{ - register int __res; - __asm__ __volatile__ ("\n\ -1: lock cmpxchgl %3,(%1)\n\ - jne 1b\n\ - ": "=a" (__res), "=q" (t): "1" (t), "q" (v), "0" (*t): "cc"); - return __res; -} - -extern __inline__ long -ilockcmpexch (long *t, long v, long c) -{ - register int __res; - __asm__ __volatile__ ("\n\ - lock cmpxchgl %3,(%1)\n\ - ": "=a" (__res), "=q" (t) : "1" (t), "q" (v), "0" (c): "cc"); - return __res; -} - -#undef InterlockedIncrement -#define InterlockedIncrement ilockincr -#undef InterlockedDecrement -#define InterlockedDecrement ilockdecr -#undef InterlockedExchange -#define InterlockedExchange ilockexch -#undef InterlockedCompareExchange -#define InterlockedCompareExchange ilockcmpexch -#endif /*_WINBASE2_H*/ diff --git a/winsup/cygwin/wincap.cc b/winsup/cygwin/wincap.cc deleted file mode 100644 index caef37873..000000000 --- a/winsup/cygwin/wincap.cc +++ /dev/null @@ -1,874 +0,0 @@ -/* wincap.cc -- figure out on which OS we're running. Set the - capability class to the appropriate values. - - Copyright 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" - -static NO_COPY wincaps wincap_unknown = { - lock_file_highword:0x0, - chunksize:0x0, - shared:FILE_SHARE_READ | FILE_SHARE_WRITE, - is_winnt:false, - is_server:false, - access_denied_on_delete:false, - has_delete_on_close:false, - has_page_guard:false, - has_security:false, - has_security_descriptor_control:false, - has_get_process_times:false, - has_lseek_bug:false, - has_lock_file_ex:false, - has_signal_object_and_wait:false, - has_eventlog:false, - has_ip_helper_lib:false, - has_set_handle_information:false, - has_set_handle_information_on_console_handles:false, - supports_smp:false, - map_view_of_file_ex_sucks:false, - altgr_is_ctrl_alt:false, - has_physical_mem_access:false, - has_working_copy_on_write:false, - share_mmaps_only_by_name:false, - virtual_protect_works_on_shared_pages:false, - has_mmap_alignment_bug:false, - has_hard_links:false, - can_open_directories:false, - has_move_file_ex:false, - has_negative_pids:false, - has_unreliable_pipes:false, - has_named_pipes:false, - has_try_enter_critical_section:false, - has_raw_devices:false, - has_valid_processorlevel:false, - has_64bit_file_access:false, - has_process_io_counters:false, - supports_reading_modem_output_lines:false, - needs_memory_protection:false, - pty_needs_alloc_console:false, - has_terminal_services:false, - has_switch_to_thread:false, - cant_debug_dll_entry:false, - has_ioctl_storage_get_media_types_ex:false, - start_proc_suspended:true, - has_extended_priority_class:false, - has_guid_volumes:false, - detect_win16_exe:true, - has_null_console_handler_routine:false, - has_disk_ex_ioctls:false, - has_working_virtual_lock:false, - has_disabled_user_tos_setting:false, - has_fileid_dirinfo:false, - has_exclusiveaddruse:false, -}; - -static NO_COPY wincaps wincap_95 = { - lock_file_highword:0x0, - chunksize:32 * 1024 * 1024, - shared:FILE_SHARE_READ | FILE_SHARE_WRITE, - is_winnt:false, - is_server:false, - access_denied_on_delete:true, - has_delete_on_close:false, - has_page_guard:false, - has_security:false, - has_security_descriptor_control:false, - has_get_process_times:false, - has_lseek_bug:true, - has_lock_file_ex:false, - has_signal_object_and_wait:false, - has_eventlog:false, - has_ip_helper_lib:false, - has_set_handle_information:false, - has_set_handle_information_on_console_handles:false, - supports_smp:false, - map_view_of_file_ex_sucks:true, - altgr_is_ctrl_alt:false, - has_physical_mem_access:false, - has_working_copy_on_write:false, - share_mmaps_only_by_name:true, - virtual_protect_works_on_shared_pages:false, - has_mmap_alignment_bug:false, - has_hard_links:false, - can_open_directories:false, - has_move_file_ex:false, - has_negative_pids:true, - has_unreliable_pipes:true, - has_named_pipes:false, - has_try_enter_critical_section:false, - has_raw_devices:false, - has_valid_processorlevel:false, - has_64bit_file_access:false, - has_process_io_counters:false, - supports_reading_modem_output_lines:false, - needs_memory_protection:false, - pty_needs_alloc_console:false, - has_terminal_services:false, - has_switch_to_thread:false, - cant_debug_dll_entry:true, - has_ioctl_storage_get_media_types_ex:false, - start_proc_suspended:true, - has_extended_priority_class:false, - has_guid_volumes:false, - detect_win16_exe:true, - has_null_console_handler_routine:false, - has_disk_ex_ioctls:false, - has_working_virtual_lock:false, - has_disabled_user_tos_setting:false, - has_fileid_dirinfo:false, - has_exclusiveaddruse:false, -}; - -static NO_COPY wincaps wincap_95osr2 = { - lock_file_highword:0x0, - chunksize:32 * 1024 * 1024, - shared:FILE_SHARE_READ | FILE_SHARE_WRITE, - is_winnt:false, - is_server:false, - access_denied_on_delete:true, - has_delete_on_close:false, - has_page_guard:false, - has_security:false, - has_security_descriptor_control:false, - has_get_process_times:false, - has_lseek_bug:true, - has_lock_file_ex:false, - has_signal_object_and_wait:false, - has_eventlog:false, - has_ip_helper_lib:false, - has_set_handle_information:false, - has_set_handle_information_on_console_handles:false, - supports_smp:false, - map_view_of_file_ex_sucks:true, - altgr_is_ctrl_alt:false, - has_physical_mem_access:false, - has_working_copy_on_write:false, - share_mmaps_only_by_name:true, - virtual_protect_works_on_shared_pages:false, - has_mmap_alignment_bug:false, - has_hard_links:false, - can_open_directories:false, - has_move_file_ex:false, - has_negative_pids:true, - has_unreliable_pipes:true, - has_named_pipes:false, - has_try_enter_critical_section:false, - has_raw_devices:false, - has_valid_processorlevel:false, - has_64bit_file_access:false, - has_process_io_counters:false, - supports_reading_modem_output_lines:false, - needs_memory_protection:false, - pty_needs_alloc_console:false, - has_terminal_services:false, - has_switch_to_thread:false, - cant_debug_dll_entry:true, - has_ioctl_storage_get_media_types_ex:false, - start_proc_suspended:true, - has_extended_priority_class:false, - has_guid_volumes:false, - detect_win16_exe:true, - has_null_console_handler_routine:false, - has_disk_ex_ioctls:false, - has_working_virtual_lock:false, - has_disabled_user_tos_setting:false, - has_fileid_dirinfo:false, - has_exclusiveaddruse:false, -}; - -static NO_COPY wincaps wincap_98 = { - lock_file_highword:0x0, - chunksize:32 * 1024 * 1024, - shared:FILE_SHARE_READ | FILE_SHARE_WRITE, - is_winnt:false, - is_server:false, - access_denied_on_delete:true, - has_delete_on_close:false, - has_page_guard:false, - has_security:false, - has_security_descriptor_control:false, - has_get_process_times:false, - has_lseek_bug:true, - has_lock_file_ex:false, - has_signal_object_and_wait:false, - has_eventlog:false, - has_ip_helper_lib:true, - has_set_handle_information:false, - has_set_handle_information_on_console_handles:false, - supports_smp:false, - map_view_of_file_ex_sucks:true, - altgr_is_ctrl_alt:false, - has_physical_mem_access:false, - has_working_copy_on_write:false, - share_mmaps_only_by_name:true, - virtual_protect_works_on_shared_pages:false, - has_mmap_alignment_bug:true, - has_hard_links:false, - can_open_directories:false, - has_move_file_ex:false, - has_negative_pids:true, - has_unreliable_pipes:true, - has_named_pipes:false, - has_try_enter_critical_section:false, - has_raw_devices:false, - has_valid_processorlevel:true, - has_64bit_file_access:false, - has_process_io_counters:false, - supports_reading_modem_output_lines:false, - needs_memory_protection:false, - pty_needs_alloc_console:false, - has_terminal_services:false, - has_switch_to_thread:false, - cant_debug_dll_entry:true, - has_ioctl_storage_get_media_types_ex:false, - start_proc_suspended:true, - has_extended_priority_class:false, - has_guid_volumes:false, - detect_win16_exe:true, - has_null_console_handler_routine:false, - has_disk_ex_ioctls:false, - has_working_virtual_lock:false, - has_disabled_user_tos_setting:false, - has_fileid_dirinfo:false, - has_exclusiveaddruse:false, -}; - -static NO_COPY wincaps wincap_98se = { - lock_file_highword:0x0, - chunksize:32 * 1024 * 1024, - shared:FILE_SHARE_READ | FILE_SHARE_WRITE, - is_winnt:false, - is_server:false, - access_denied_on_delete:true, - has_delete_on_close:false, - has_page_guard:false, - has_security:false, - has_security_descriptor_control:false, - has_get_process_times:false, - has_lseek_bug:true, - has_lock_file_ex:false, - has_signal_object_and_wait:false, - has_eventlog:false, - has_ip_helper_lib:true, - has_set_handle_information:false, - has_set_handle_information_on_console_handles:false, - supports_smp:false, - map_view_of_file_ex_sucks:true, - altgr_is_ctrl_alt:false, - has_physical_mem_access:false, - has_working_copy_on_write:false, - share_mmaps_only_by_name:true, - virtual_protect_works_on_shared_pages:false, - has_mmap_alignment_bug:true, - has_hard_links:false, - can_open_directories:false, - has_move_file_ex:false, - has_negative_pids:true, - has_unreliable_pipes:true, - has_named_pipes:false, - has_try_enter_critical_section:false, - has_raw_devices:false, - has_valid_processorlevel:true, - has_64bit_file_access:false, - has_process_io_counters:false, - supports_reading_modem_output_lines:false, - needs_memory_protection:false, - pty_needs_alloc_console:false, - has_terminal_services:false, - has_switch_to_thread:false, - cant_debug_dll_entry:true, - has_ioctl_storage_get_media_types_ex:false, - start_proc_suspended:true, - has_extended_priority_class:false, - has_guid_volumes:false, - detect_win16_exe:true, - has_null_console_handler_routine:false, - has_disk_ex_ioctls:false, - has_working_virtual_lock:false, - has_disabled_user_tos_setting:false, - has_fileid_dirinfo:false, - has_exclusiveaddruse:false, -}; - -static NO_COPY wincaps wincap_me = { - lock_file_highword:0x0, - chunksize:32 * 1024 * 1024, - shared:FILE_SHARE_READ | FILE_SHARE_WRITE, - is_winnt:false, - is_server:false, - access_denied_on_delete:true, - has_delete_on_close:false, - has_page_guard:false, - has_security:false, - has_security_descriptor_control:false, - has_get_process_times:false, - has_lseek_bug:true, - has_lock_file_ex:false, - has_signal_object_and_wait:false, - has_eventlog:false, - has_ip_helper_lib:true, - has_set_handle_information:false, - has_set_handle_information_on_console_handles:false, - supports_smp:false, - map_view_of_file_ex_sucks:true, - altgr_is_ctrl_alt:false, - has_physical_mem_access:false, - has_working_copy_on_write:false, - share_mmaps_only_by_name:true, - virtual_protect_works_on_shared_pages:false, - has_mmap_alignment_bug:false, - has_hard_links:false, - can_open_directories:false, - has_move_file_ex:false, - has_negative_pids:true, - has_unreliable_pipes:true, - has_named_pipes:false, - has_try_enter_critical_section:false, - has_raw_devices:false, - has_valid_processorlevel:true, - has_64bit_file_access:false, - has_process_io_counters:false, - supports_reading_modem_output_lines:false, - needs_memory_protection:false, - pty_needs_alloc_console:false, - has_terminal_services:false, - has_switch_to_thread:false, - cant_debug_dll_entry:true, - has_ioctl_storage_get_media_types_ex:false, - start_proc_suspended:true, - has_extended_priority_class:false, - has_guid_volumes:false, - detect_win16_exe:true, - has_null_console_handler_routine:false, - has_disk_ex_ioctls:false, - has_working_virtual_lock:false, - has_disabled_user_tos_setting:false, - has_fileid_dirinfo:false, - has_exclusiveaddruse:false, -}; - -static NO_COPY wincaps wincap_nt3 = { - lock_file_highword:UINT32_MAX, - chunksize:0, - shared:FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - is_winnt:true, - is_server:false, - access_denied_on_delete:false, - has_delete_on_close:true, - has_page_guard:true, - has_security:true, - has_security_descriptor_control:false, - has_get_process_times:true, - has_lseek_bug:false, - has_lock_file_ex:true, - has_signal_object_and_wait:false, - has_eventlog:true, - has_ip_helper_lib:false, - has_set_handle_information:true, - has_set_handle_information_on_console_handles:false, - supports_smp:false, - map_view_of_file_ex_sucks:false, - altgr_is_ctrl_alt:true, - has_physical_mem_access:true, - has_working_copy_on_write:true, - share_mmaps_only_by_name:false, - virtual_protect_works_on_shared_pages:true, - has_mmap_alignment_bug:false, - has_hard_links:true, - can_open_directories:true, - has_move_file_ex:true, - has_negative_pids:false, - has_unreliable_pipes:false, - has_named_pipes:true, - has_try_enter_critical_section:false, - has_raw_devices:true, - has_valid_processorlevel:true, - has_64bit_file_access:true, - has_process_io_counters:false, - supports_reading_modem_output_lines:true, - needs_memory_protection:true, - pty_needs_alloc_console:true, - has_terminal_services:false, - has_switch_to_thread:false, - cant_debug_dll_entry:false, - has_ioctl_storage_get_media_types_ex:false, - start_proc_suspended:false, - has_extended_priority_class:false, - has_guid_volumes:false, - detect_win16_exe:false, - has_null_console_handler_routine:true, - has_disk_ex_ioctls:false, - has_working_virtual_lock:true, - has_disabled_user_tos_setting:false, - has_fileid_dirinfo:false, - has_exclusiveaddruse:false, -}; - -static NO_COPY wincaps wincap_nt4 = { - lock_file_highword:UINT32_MAX, - chunksize:0, - shared:FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - is_winnt:true, - is_server:false, - access_denied_on_delete:false, - has_delete_on_close:true, - has_page_guard:true, - has_security:true, - has_security_descriptor_control:false, - has_get_process_times:true, - has_lseek_bug:false, - has_lock_file_ex:true, - has_signal_object_and_wait:true, - has_eventlog:true, - has_ip_helper_lib:false, - has_set_handle_information:true, - has_set_handle_information_on_console_handles:false, - supports_smp:true, - map_view_of_file_ex_sucks:false, - altgr_is_ctrl_alt:true, - has_physical_mem_access:true, - has_working_copy_on_write:true, - share_mmaps_only_by_name:false, - virtual_protect_works_on_shared_pages:true, - has_mmap_alignment_bug:false, - has_hard_links:true, - can_open_directories:true, - has_move_file_ex:true, - has_negative_pids:false, - has_unreliable_pipes:false, - has_named_pipes:true, - has_try_enter_critical_section:true, - has_raw_devices:true, - has_valid_processorlevel:true, - has_64bit_file_access:true, - has_process_io_counters:false, - supports_reading_modem_output_lines:true, - needs_memory_protection:true, - pty_needs_alloc_console:true, - has_terminal_services:false, - has_switch_to_thread:true, - cant_debug_dll_entry:false, - has_ioctl_storage_get_media_types_ex:false, - start_proc_suspended:false, - has_extended_priority_class:false, - has_guid_volumes:false, - detect_win16_exe:false, - has_null_console_handler_routine:true, - has_disk_ex_ioctls:false, - has_working_virtual_lock:true, - has_disabled_user_tos_setting:false, - has_fileid_dirinfo:false, - has_exclusiveaddruse:false, -}; - -static NO_COPY wincaps wincap_nt4sp4 = { - lock_file_highword:UINT32_MAX, - chunksize:0, - shared:FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - is_winnt:true, - is_server:false, - access_denied_on_delete:false, - has_delete_on_close:true, - has_page_guard:true, - has_security:true, - has_security_descriptor_control:false, - has_get_process_times:true, - has_lseek_bug:false, - has_lock_file_ex:true, - has_signal_object_and_wait:true, - has_eventlog:true, - has_ip_helper_lib:true, - has_set_handle_information:true, - has_set_handle_information_on_console_handles:false, - supports_smp:true, - map_view_of_file_ex_sucks:false, - altgr_is_ctrl_alt:true, - has_physical_mem_access:true, - has_working_copy_on_write:true, - share_mmaps_only_by_name:false, - virtual_protect_works_on_shared_pages:true, - has_mmap_alignment_bug:false, - has_hard_links:true, - can_open_directories:true, - has_move_file_ex:true, - has_negative_pids:false, - has_unreliable_pipes:false, - has_named_pipes:true, - has_try_enter_critical_section:true, - has_raw_devices:true, - has_valid_processorlevel:true, - has_64bit_file_access:true, - has_process_io_counters:false, - supports_reading_modem_output_lines:true, - needs_memory_protection:true, - pty_needs_alloc_console:true, - has_terminal_services:false, - has_switch_to_thread:true, - cant_debug_dll_entry:false, - has_ioctl_storage_get_media_types_ex:false, - start_proc_suspended:false, - has_extended_priority_class:false, - has_guid_volumes:false, - detect_win16_exe:false, - has_null_console_handler_routine:true, - has_disk_ex_ioctls:false, - has_working_virtual_lock:true, - has_disabled_user_tos_setting:false, - has_fileid_dirinfo:false, - has_exclusiveaddruse:true -}; - -static NO_COPY wincaps wincap_2000 = { - lock_file_highword:UINT32_MAX, - chunksize:0, - shared:FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - is_winnt:true, - is_server:false, - access_denied_on_delete:false, - has_delete_on_close:true, - has_page_guard:true, - has_security:true, - has_security_descriptor_control:true, - has_get_process_times:true, - has_lseek_bug:false, - has_lock_file_ex:true, - has_signal_object_and_wait:true, - has_eventlog:true, - has_ip_helper_lib:true, - has_set_handle_information:true, - has_set_handle_information_on_console_handles:true, - supports_smp:true, - map_view_of_file_ex_sucks:false, - altgr_is_ctrl_alt:true, - has_physical_mem_access:true, - has_working_copy_on_write:true, - share_mmaps_only_by_name:false, - virtual_protect_works_on_shared_pages:true, - has_mmap_alignment_bug:false, - has_hard_links:true, - can_open_directories:true, - has_move_file_ex:true, - has_negative_pids:false, - has_unreliable_pipes:false, - has_named_pipes:true, - has_try_enter_critical_section:true, - has_raw_devices:true, - has_valid_processorlevel:true, - has_64bit_file_access:true, - has_process_io_counters:true, - supports_reading_modem_output_lines:true, - needs_memory_protection:true, - pty_needs_alloc_console:true, - has_terminal_services:true, - has_switch_to_thread:true, - cant_debug_dll_entry:false, - has_ioctl_storage_get_media_types_ex:false, - start_proc_suspended:false, - has_extended_priority_class:true, - has_guid_volumes:true, - detect_win16_exe:false, - has_null_console_handler_routine:true, - has_disk_ex_ioctls:false, - has_working_virtual_lock:true, - has_disabled_user_tos_setting:true, - has_fileid_dirinfo:true, - has_exclusiveaddruse:true -}; - -static NO_COPY wincaps wincap_xp = { - lock_file_highword:UINT32_MAX, - chunksize:0, - shared:FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - is_winnt:true, - is_server:false, - access_denied_on_delete:false, - has_delete_on_close:true, - has_page_guard:true, - has_security:true, - has_security_descriptor_control:true, - has_get_process_times:true, - has_lseek_bug:false, - has_lock_file_ex:true, - has_signal_object_and_wait:true, - has_eventlog:true, - has_ip_helper_lib:true, - has_set_handle_information:true, - has_set_handle_information_on_console_handles:true, - supports_smp:true, - map_view_of_file_ex_sucks:false, - altgr_is_ctrl_alt:true, - has_physical_mem_access:true, - has_working_copy_on_write:true, - share_mmaps_only_by_name:false, - virtual_protect_works_on_shared_pages:true, - has_mmap_alignment_bug:false, - has_hard_links:true, - can_open_directories:true, - has_move_file_ex:true, - has_negative_pids:false, - has_unreliable_pipes:false, - has_named_pipes:true, - has_try_enter_critical_section:true, - has_raw_devices:true, - has_valid_processorlevel:true, - has_64bit_file_access:true, - has_process_io_counters:true, - supports_reading_modem_output_lines:true, - needs_memory_protection:true, - pty_needs_alloc_console:true, - has_terminal_services:true, - has_switch_to_thread:true, - cant_debug_dll_entry:false, - has_ioctl_storage_get_media_types_ex:true, - start_proc_suspended:false, - has_extended_priority_class:true, - has_guid_volumes:true, - detect_win16_exe:false, - has_null_console_handler_routine:true, - has_disk_ex_ioctls:true, - has_working_virtual_lock:true, - has_disabled_user_tos_setting:true, - has_fileid_dirinfo:true, - has_exclusiveaddruse:true -}; - -static NO_COPY wincaps wincap_2003 = { - lock_file_highword:UINT32_MAX, - chunksize:0, - shared:FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - is_winnt:true, - is_server:true, - access_denied_on_delete:false, - has_delete_on_close:true, - has_page_guard:true, - has_security:true, - has_security_descriptor_control:true, - has_get_process_times:true, - has_lseek_bug:false, - has_lock_file_ex:true, - has_signal_object_and_wait:true, - has_eventlog:true, - has_ip_helper_lib:true, - has_set_handle_information:true, - has_set_handle_information_on_console_handles:true, - supports_smp:true, - map_view_of_file_ex_sucks:false, - altgr_is_ctrl_alt:true, - has_physical_mem_access:true, - has_working_copy_on_write:true, - share_mmaps_only_by_name:false, - virtual_protect_works_on_shared_pages:true, - has_mmap_alignment_bug:false, - has_hard_links:true, - can_open_directories:true, - has_move_file_ex:true, - has_negative_pids:false, - has_unreliable_pipes:false, - has_named_pipes:true, - has_try_enter_critical_section:true, - has_raw_devices:true, - has_valid_processorlevel:true, - has_64bit_file_access:true, - has_process_io_counters:true, - supports_reading_modem_output_lines:true, - needs_memory_protection:true, - pty_needs_alloc_console:true, - has_terminal_services:true, - has_switch_to_thread:true, - cant_debug_dll_entry:false, - has_ioctl_storage_get_media_types_ex:true, - start_proc_suspended:false, - has_extended_priority_class:true, - has_guid_volumes:true, - detect_win16_exe:false, - has_null_console_handler_routine:true, - has_disk_ex_ioctls:true, - has_working_virtual_lock:true, - has_disabled_user_tos_setting:true, - has_fileid_dirinfo:true, - has_exclusiveaddruse:true -}; - -static NO_COPY wincaps wincap_vista = { - lock_file_highword:UINT32_MAX, - chunksize:0, - shared:FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - is_winnt:true, - is_server:true, - access_denied_on_delete:false, - has_delete_on_close:true, - has_page_guard:true, - has_security:true, - has_security_descriptor_control:true, - has_get_process_times:true, - has_lseek_bug:false, - has_lock_file_ex:true, - has_signal_object_and_wait:true, - has_eventlog:true, - has_ip_helper_lib:true, - has_set_handle_information:true, - has_set_handle_information_on_console_handles:true, - supports_smp:true, - map_view_of_file_ex_sucks:false, - altgr_is_ctrl_alt:true, - has_physical_mem_access:true, - has_working_copy_on_write:true, - share_mmaps_only_by_name:false, - virtual_protect_works_on_shared_pages:true, - has_mmap_alignment_bug:false, - has_hard_links:true, - can_open_directories:true, - has_move_file_ex:true, - has_negative_pids:false, - has_unreliable_pipes:false, - has_named_pipes:true, - has_try_enter_critical_section:true, - has_raw_devices:true, - has_valid_processorlevel:true, - has_64bit_file_access:true, - has_process_io_counters:true, - supports_reading_modem_output_lines:true, - needs_memory_protection:true, - pty_needs_alloc_console:true, - has_terminal_services:true, - has_switch_to_thread:true, - cant_debug_dll_entry:false, - has_ioctl_storage_get_media_types_ex:true, - start_proc_suspended:false, - has_extended_priority_class:true, - has_guid_volumes:true, - detect_win16_exe:false, - has_null_console_handler_routine:true, - has_disk_ex_ioctls:true, - has_working_virtual_lock:true, - has_disabled_user_tos_setting:true, - has_fileid_dirinfo:true, - has_exclusiveaddruse:true -}; - -wincapc wincap __attribute__((section (".cygwin_dll_common"), shared)); - -void -wincapc::init () -{ - const char *os; - bool has_osversioninfoex = false; - - if (caps) - return; // already initialized - - memset (&version, 0, sizeof version); - /* Request simple version info first. */ - version.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); - GetVersionEx (reinterpret_cast(&version)); - - switch (version.dwPlatformId) - { - case VER_PLATFORM_WIN32_NT: - switch (version.dwMajorVersion) - { - case 3: - os = "NT"; - caps = &wincap_nt3; - break; - case 4: - os = "NT"; - if (strcmp (version.szCSDVersion, "Service Pack 4") < 0) - caps = &wincap_nt4; - else - { - caps = &wincap_nt4sp4; - if (strcmp (version.szCSDVersion, "Service Pack 6") >= 0) - has_osversioninfoex = true; - } - break; - case 5: - os = "NT"; - has_osversioninfoex = true; - switch (version.dwMinorVersion) - { - case 0: - caps = &wincap_2000; - break; - - case 1: - caps = &wincap_xp; - break; - - default: - caps = &wincap_2003; - } - break; - case 6: - os = "NT"; - has_osversioninfoex = true; - caps = &wincap_vista; - break; - default: - os = "??"; - caps = &wincap_unknown; - break; - } - break; - case VER_PLATFORM_WIN32_WINDOWS: - switch (version.dwMinorVersion) - { - case 0: - os = "95"; - if (strchr (version.szCSDVersion, 'C')) - caps = &wincap_95osr2; - else - caps = &wincap_95; - break; - case 10: - os = "98"; - if (strchr (version.szCSDVersion, 'A')) - caps = &wincap_98se; - else - caps = &wincap_98; - break; - case 90: - os = "ME"; - caps = &wincap_me; - break; - default: - os = "??"; - caps = &wincap_unknown; - break; - } - break; - default: - os = "??"; - caps = &wincap_unknown; - break; - } - - if (has_osversioninfoex) - { - /* Request extended version to get server info. - Available since NT4 SP6. */ - version.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX); - GetVersionEx (reinterpret_cast(&version)); - if (version.wProductType != VER_NT_WORKSTATION) - ((wincaps *)this->caps)->is_server = true; - } - - BOOL is_wow64_proc = FALSE; - if (IsWow64Process (GetCurrentProcess (), &is_wow64_proc)) - wow64 = is_wow64_proc; - - __small_sprintf (osnam, "%s-%d.%d", os, version.dwMajorVersion, - version.dwMinorVersion); -} - -void -wincapc::set_chunksize (DWORD nchunksize) -{ - ((wincaps *)this->caps)->chunksize = nchunksize; -} diff --git a/winsup/cygwin/wincap.h b/winsup/cygwin/wincap.h deleted file mode 100644 index d4edfd3da..000000000 --- a/winsup/cygwin/wincap.h +++ /dev/null @@ -1,149 +0,0 @@ -/* wincap.h: Header for OS capability class. - - Copyright 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifndef _WINCAP_H -#define _WINCAP_H - -struct wincaps -{ - DWORD lock_file_highword; - DWORD chunksize; - int shared; - unsigned is_winnt : 1; - unsigned is_server : 1; - unsigned access_denied_on_delete : 1; - unsigned has_delete_on_close : 1; - unsigned has_page_guard : 1; - unsigned has_security : 1; - unsigned has_security_descriptor_control : 1; - unsigned has_get_process_times : 1; - unsigned has_lseek_bug : 1; - unsigned has_lock_file_ex : 1; - unsigned has_signal_object_and_wait : 1; - unsigned has_eventlog : 1; - unsigned has_ip_helper_lib : 1; - unsigned has_set_handle_information : 1; - unsigned has_set_handle_information_on_console_handles: 1; - unsigned supports_smp : 1; - unsigned map_view_of_file_ex_sucks : 1; - unsigned altgr_is_ctrl_alt : 1; - unsigned has_physical_mem_access : 1; - unsigned has_working_copy_on_write : 1; - unsigned share_mmaps_only_by_name : 1; - unsigned virtual_protect_works_on_shared_pages : 1; - unsigned has_mmap_alignment_bug : 1; - unsigned has_hard_links : 1; - unsigned can_open_directories : 1; - unsigned has_move_file_ex : 1; - unsigned has_negative_pids : 1; - unsigned has_unreliable_pipes : 1; - unsigned has_named_pipes : 1; - unsigned has_try_enter_critical_section : 1; - unsigned has_raw_devices : 1; - unsigned has_valid_processorlevel : 1; - unsigned has_64bit_file_access : 1; - unsigned has_process_io_counters : 1; - unsigned supports_reading_modem_output_lines : 1; - unsigned needs_memory_protection : 1; - unsigned pty_needs_alloc_console : 1; - unsigned has_terminal_services : 1; - unsigned has_switch_to_thread : 1; - unsigned cant_debug_dll_entry : 1; - unsigned has_ioctl_storage_get_media_types_ex : 1; - unsigned start_proc_suspended : 1; - unsigned has_extended_priority_class : 1; - unsigned has_guid_volumes : 1; - unsigned detect_win16_exe : 1; - unsigned has_null_console_handler_routine : 1; - unsigned has_disk_ex_ioctls : 1; - unsigned has_working_virtual_lock : 1; - unsigned has_disabled_user_tos_setting : 1; - unsigned has_fileid_dirinfo : 1; - unsigned has_exclusiveaddruse : 1; -}; - -class wincapc -{ - OSVERSIONINFOEX version; - char osnam[40]; - bool wow64; - void *caps; - -public: - void init (); - - void set_chunksize (DWORD nchunksize); - - const char *osname () const { return osnam; } - const bool is_wow64 () const { return wow64; } - -#define IMPLEMENT(cap) cap() const { return ((wincaps *) this->caps)->cap; } - - DWORD IMPLEMENT (lock_file_highword) - DWORD IMPLEMENT (chunksize) - int IMPLEMENT (shared) - bool IMPLEMENT (is_winnt) - bool IMPLEMENT (is_server) - bool IMPLEMENT (access_denied_on_delete) - bool IMPLEMENT (has_delete_on_close) - bool IMPLEMENT (has_page_guard) - bool IMPLEMENT (has_security) - bool IMPLEMENT (has_security_descriptor_control) - bool IMPLEMENT (has_get_process_times) - bool IMPLEMENT (has_lseek_bug) - bool IMPLEMENT (has_lock_file_ex) - bool IMPLEMENT (has_signal_object_and_wait) - bool IMPLEMENT (has_eventlog) - bool IMPLEMENT (has_ip_helper_lib) - bool IMPLEMENT (has_set_handle_information) - bool IMPLEMENT (has_set_handle_information_on_console_handles) - bool IMPLEMENT (supports_smp) - bool IMPLEMENT (map_view_of_file_ex_sucks) - bool IMPLEMENT (altgr_is_ctrl_alt) - bool IMPLEMENT (has_physical_mem_access) - bool IMPLEMENT (has_working_copy_on_write) - bool IMPLEMENT (share_mmaps_only_by_name) - bool IMPLEMENT (virtual_protect_works_on_shared_pages) - bool IMPLEMENT (has_mmap_alignment_bug) - bool IMPLEMENT (has_hard_links) - bool IMPLEMENT (can_open_directories) - bool IMPLEMENT (has_move_file_ex) - bool IMPLEMENT (has_negative_pids) - bool IMPLEMENT (has_unreliable_pipes) - bool IMPLEMENT (has_named_pipes) - bool IMPLEMENT (has_try_enter_critical_section) - bool IMPLEMENT (has_raw_devices) - bool IMPLEMENT (has_valid_processorlevel) - bool IMPLEMENT (has_64bit_file_access) - bool IMPLEMENT (has_process_io_counters) - bool IMPLEMENT (supports_reading_modem_output_lines) - bool IMPLEMENT (needs_memory_protection) - bool IMPLEMENT (pty_needs_alloc_console) - bool IMPLEMENT (has_terminal_services) - bool IMPLEMENT (has_switch_to_thread) - bool IMPLEMENT (cant_debug_dll_entry) - bool IMPLEMENT (has_ioctl_storage_get_media_types_ex) - bool IMPLEMENT (start_proc_suspended) - bool IMPLEMENT (has_extended_priority_class) - bool IMPLEMENT (has_guid_volumes) - bool IMPLEMENT (detect_win16_exe) - bool IMPLEMENT (has_null_console_handler_routine) - bool IMPLEMENT (has_disk_ex_ioctls) - bool IMPLEMENT (has_working_virtual_lock) - bool IMPLEMENT (has_disabled_user_tos_setting) - bool IMPLEMENT (has_fileid_dirinfo) - bool IMPLEMENT (has_exclusiveaddruse) - -#undef IMPLEMENT -}; - -extern wincapc wincap; - -#endif /* _WINCAP_H */ diff --git a/winsup/cygwin/window.cc b/winsup/cygwin/window.cc deleted file mode 100644 index 0821c64f8..000000000 --- a/winsup/cygwin/window.cc +++ /dev/null @@ -1,140 +0,0 @@ -/* window.cc: hidden windows for signals/itimer support - - Copyright 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. - - Written by Sergey Okhapkin - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#include "winsup.h" -#include -#include -#include -#include -#include -#include -#define USE_SYS_TYPES_FD_SET -#include -#include -#include "cygerrno.h" -#include "perprocess.h" -#include "security.h" -#include "thread.h" -#include "cygtls.h" -#include "sync.h" -#include "wininfo.h" - -wininfo NO_COPY winmsg; - -muto NO_COPY wininfo::_lock; - -int __stdcall -wininfo::process (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ -#ifndef NOSTRACE - strace.wm (uMsg, wParam, lParam); -#endif - switch (uMsg) - { - case WM_PAINT: - return 0; - case WM_DESTROY: - PostQuitMessage (0); - return 0; - case WM_ASYNCIO: - if (WSAGETSELECTEVENT (lParam) == FD_OOB) - raise (SIGURG); - else - raise (SIGIO); - return 0; - default: - return DefWindowProc (hwnd, uMsg, wParam, lParam); - } -} - -static LRESULT CALLBACK -process_window_events (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - return winmsg.process (hwnd, uMsg, wParam, lParam); -} - -/* Handle windows events. Inherits ownership of the wininfo lock */ -DWORD WINAPI -wininfo::winthread () -{ - MSG msg; - WNDCLASS wc; - static NO_COPY char classname[] = "CygwinWndClass"; - - _lock.grab (); - /* Register the window class for the main window. */ - - wc.style = 0; - wc.lpfnWndProc = (WNDPROC) process_window_events; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = user_data->hmodule; - wc.hIcon = NULL; - wc.hCursor = NULL; - wc.hbrBackground = NULL; - wc.lpszMenuName = NULL; - wc.lpszClassName = classname; - - if (!RegisterClass (&wc)) - api_fatal ("cannot register window class, %E"); - - /* Create hidden window. */ - hwnd = CreateWindow (classname, classname, WS_POPUP, CW_USEDEFAULT, - CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, - (HWND) NULL, (HMENU) NULL, user_data->hmodule, - (LPVOID) NULL); - if (!hwnd) - api_fatal ("couldn't create window, %E"); - release (); - - while (GetMessage (&msg, hwnd, 0, 0) == TRUE) - DispatchMessage (&msg); - - return 0; -} - -static DWORD WINAPI -winthread (VOID *arg) -{ - return ((wininfo *) arg)->winthread (); -} - -wininfo::operator -HWND () -{ - if (hwnd) - return hwnd; - - lock (); - if (!hwnd) - { - _lock.upforgrabs (); - cygthread *h = new cygthread (::winthread, 0, this, "win"); - h->SetThreadPriority (THREAD_PRIORITY_HIGHEST); - h->zap_h (); - lock (); - } - release (); - return hwnd; -} - -void -wininfo::lock () -{ - _lock.init ("wininfo_lock")->acquire (); -} - -void -wininfo::release () -{ - _lock.release (); -} diff --git a/winsup/cygwin/wininfo.h b/winsup/cygwin/wininfo.h deleted file mode 100644 index 0247ae917..000000000 --- a/winsup/cygwin/wininfo.h +++ /dev/null @@ -1,25 +0,0 @@ -/* wininfo.h: main Cygwin header file. - - Copyright 2004 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -class muto; -class wininfo -{ - HWND hwnd; - static muto _lock; -public: - operator HWND (); - int __stdcall wininfo::process (HWND, UINT, WPARAM, LPARAM) - __attribute__ ((regparm (3))); - void lock (); - void release (); - DWORD WINAPI winthread () __attribute__ ((regparm (1))); -}; - -extern wininfo winmsg; diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h deleted file mode 100644 index 73ef0a59f..000000000 --- a/winsup/cygwin/winsup.h +++ /dev/null @@ -1,360 +0,0 @@ -/* winsup.h: main Cygwin header file. - - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006 Red Hat, Inc. - -This file is part of Cygwin. - -This software is a copyrighted work licensed under the terms of the -Cygwin license. Please consult the file "CYGWIN_LICENSE" for -details. */ - -#ifdef DEBUGIT -#define spf(a, b, c) small_printf (a, b, c) -#else -#define spf(a, b, c) do {} while (0) -#endif - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#define __INSIDE_CYGWIN__ - -#define strlen __builtin_strlen -#define strcmp __builtin_strcmp -#define strcpy __builtin_strcpy -#define memcpy __builtin_memcpy -#define memcmp __builtin_memcmp -#ifdef HAVE_BUILTIN_MEMSET -# define memset __builtin_memset -#endif - -#define NO_COPY __attribute__((nocommon)) __attribute__((section(".data_cygwin_nocopy"))) -#define NO_COPY_INIT __attribute__((section(".data_cygwin_nocopy"))) - -#define EXPORT_ALIAS(sym,symalias) extern "C" __typeof (sym) symalias __attribute__ ((alias(#sym))); - -#ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0501 -#endif - -#include -#include - -/* Declarations for functions used in C and C++ code. */ -#ifdef __cplusplus -extern "C" { -#endif -extern __uid32_t getuid32 (void); -extern __uid32_t geteuid32 (void); -extern int seteuid32 (__uid32_t); -extern __gid32_t getegid32 (void); -extern struct passwd *getpwuid32 (__uid32_t); -extern struct passwd *getpwnam (const char *); -extern struct __sFILE64 *fopen64 (const char *, const char *); -extern struct hostent *cygwin_gethostbyname (const char *name); -extern unsigned long cygwin_inet_addr (const char *cp); - -#ifdef __cplusplus -} -#endif - -/* Note that MAX_PATH is defined in the windows headers */ -/* There is also PATH_MAX and MAXPATHLEN. - PATH_MAX is from Posix and does *not* include the trailing NUL. - MAXPATHLEN is from Unix. - - Thou shalt use CYG_MAX_PATH throughout. It avoids the NUL vs no-NUL - issue and is neither of the Unixy ones [so we can punt on which - one is the right one to use]. - - Windows ANSI calls are limited to MAX_PATH in length. Cygwin calls that - thunk through to Windows Wide calls are limited to 32K. We define - CYG_MAX_PATH as a convenient, not to short, not too long 'happy medium'. - - */ - -#define CYG_MAX_PATH (MAX_PATH) - -#ifdef __cplusplus - -extern const char case_folded_lower[]; -#define cyg_tolower(c) (case_folded_lower[(unsigned char)(c)]) -extern const char case_folded_upper[]; -#define cyg_toupper(c) (case_folded_upper[(unsigned char)(c)]) - -#ifndef MALLOC_DEBUG -#define cfree newlib_cfree_dont_use -#endif - -#define WIN32_LEAN_AND_MEAN 1 -#define _WINGDI_H -#define _WINUSER_H -#define _WINNLS_H -#define _WINVER_H -#define _WINNETWK_H -#define _WINSVC_H -#include -#include -#include -#undef _WINGDI_H -#undef _WINUSER_H -#undef _WINNLS_H -#undef _WINVER_H -#undef _WINNETWK_H -#undef _WINSVC_H - -#include "wincap.h" - -/* The one function we use from winuser.h most of the time */ -extern "C" DWORD WINAPI GetLastError (void); - -enum codepage_type {ansi_cp, oem_cp}; -extern codepage_type current_codepage; - -UINT get_cp (); - -int __stdcall sys_wcstombs(char *, int, const WCHAR *, int = -1) - __attribute__ ((regparm(3))); - -int __stdcall sys_mbstowcs(WCHAR *, const char *, int) - __attribute__ ((regparm(3))); - -/* Used to check if Cygwin DLL is dynamically loaded. */ -extern int dynamically_loaded; - -extern int cygserver_running; - -#define _MT_SAFE // DELTEME someday - -#define TITLESIZE 1024 - -#include "debug.h" - -/* Events/mutexes */ -extern HANDLE tty_mutex; - -/**************************** Convenience ******************************/ - -/* Used to define status flag accessor methods */ -#define IMPLEMENT_STATUS_FLAG(type,flag) \ - void flag (type val) { status.flag = (val); } \ - type flag () const { return (type) status.flag; } - -/* Used when treating / and \ as equivalent. */ -#define isdirsep(ch) \ - ({ \ - char __c = (ch); \ - ((__c) == '/' || (__c) == '\\'); \ - }) - -/* Convert a signal to a signal mask */ -#define SIGTOMASK(sig) (1 << ((sig) - signal_shift_subtract)) -extern unsigned int signal_shift_subtract; - -extern int __api_fatal_exit_val; -#define set_api_fatal_return(n) do {extern int __api_fatal_exit_val; __api_fatal_exit_val = (n);} while (0) -#define api_fatal(fmt, args...) __api_fatal ("%P: *** " fmt,## args) - -#undef issep -#define issep(ch) (strchr (" \t\n\r", (ch)) != NULL) - -#define isabspath(p) \ - (isdirsep (*(p)) || (isalpha (*(p)) && (p)[1] == ':' && (!(p)[2] || isdirsep ((p)[2])))) - -/******************** Initialization/Termination **********************/ - -class per_process; -/* cygwin .dll initialization */ -void dll_crt0 (per_process *) __asm__ ("_dll_crt0__FP11per_process"); -extern "C" void __stdcall _dll_crt0 (); - -/* dynamically loaded dll initialization */ -extern "C" int dll_dllcrt0 (HMODULE, per_process *); - -/* dynamically loaded dll initialization for non-cygwin apps */ -extern "C" int dll_noncygwin_dllcrt0 (HMODULE, per_process *); - -/* exit the program */ - -enum exit_states - { - ES_NOT_EXITING = 0, - ES_SET_MUTO, - ES_GLOBAL_DTORS, - ES_EVENTS_TERMINATE, - ES_THREADTERM, - ES_SIGNAL, - ES_CLOSEALL, - ES_HUP_PGRP, - ES_HUP_SID, - ES_EXEC_EXIT, - ES_TITLE, - ES_TTY_TERMINATE, - ES_FINAL - }; - -extern exit_states exit_state; -void __stdcall do_exit (int) __attribute__ ((regparm (1), noreturn)); - -/* UID/GID */ -void uinfo_init (); - -#define ILLEGAL_UID16 ((__uid16_t)-1) -#define ILLEGAL_UID ((__uid32_t)-1) -#define ILLEGAL_GID16 ((__gid16_t)-1) -#define ILLEGAL_GID ((__gid32_t)-1) -#define ILLEGAL_SEEK ((_off64_t)-1) - -#define uid16touid32(u16) ((u16)==ILLEGAL_UID16?ILLEGAL_UID:(__uid32_t)(u16)) -#define gid16togid32(g16) ((g16)==ILLEGAL_GID16?ILLEGAL_GID:(__gid32_t)(g16)) - -/* Convert LARGE_INTEGER into long long */ -#define get_ll(pl) (((long long) (pl).HighPart << 32) | (pl).LowPart) - -/* various events */ -void events_init (); -void events_terminate (); - -void __stdcall close_all_files (bool = false); - -/* debug_on_trap support. see exceptions.cc:try_to_debug() */ -extern "C" void error_start_init (const char*); -extern "C" int try_to_debug (bool waitloop = 1); - -extern void ld_preload (); - -void set_file_api_mode (codepage_type); - -extern bool cygwin_finished_initializing; - -/**************************** Miscellaneous ******************************/ - -void __stdcall set_std_handle (int); -int __stdcall stat_dev (DWORD, int, unsigned long, struct __stat64 *); - -__ino64_t __stdcall hash_path_name (__ino64_t hash, const char *name) __attribute__ ((regparm(2))); -void __stdcall nofinalslash (const char *src, char *dst) __attribute__ ((regparm(2))); -extern "C" char *__stdcall rootdir (const char *full_path, char *root_path) __attribute__ ((regparm(2))); - -/* String manipulation */ -extern "C" char *__stdcall strccpy (char *s1, const char **s2, char c); -extern "C" int __stdcall strcasematch (const char *s1, const char *s2) __attribute__ ((regparm(2))); -extern "C" int __stdcall strncasematch (const char *s1, const char *s2, size_t n) __attribute__ ((regparm(3))); -extern "C" char *__stdcall strcasestr (const char *searchee, const char *lookfor) __attribute__ ((regparm(2))); - -void *hook_or_detect_cygwin (const char *, const void *, WORD&) __attribute__ ((regparm (3))); - -/* Time related */ -void __stdcall totimeval (struct timeval *, FILETIME *, int, int); -long __stdcall to_time_t (FILETIME *); -void __stdcall to_timestruc_t (FILETIME *, timestruc_t *); -void __stdcall time_as_timestruc_t (timestruc_t *); -void __stdcall timeval_to_filetime (const struct timeval *, FILETIME *); - -/* Console related */ -void __stdcall set_console_title (char *); -void init_console_handler (bool); - -void init_global_security (); - -int __stdcall check_invalid_virtual_addr (const void *s, unsigned sz) __attribute__ ((regparm(2))); - -ssize_t check_iovec (const struct iovec *, int, bool) __attribute__ ((regparm(3))); -#define check_iovec_for_read(a, b) check_iovec ((a), (b), false) -#define check_iovec_for_write(a, b) check_iovec ((a), (b), true) - -#define set_winsock_errno() __set_winsock_errno (__FUNCTION__, __LINE__) -void __set_winsock_errno (const char *fn, int ln) __attribute__ ((regparm(2))); - -extern bool wsock_started; - -/* Printf type functions */ -extern "C" void __api_fatal (const char *, ...) __attribute__ ((noreturn)); -extern "C" int __small_sprintf (char *dst, const char *fmt, ...) /*__attribute__ ((regparm (2)))*/; -extern "C" int __small_vsprintf (char *dst, const char *fmt, va_list ap) /*__attribute__ ((regparm (3)))*/; -extern void multiple_cygwin_problem (const char *, unsigned, unsigned); - -extern "C" void vklog (int priority, const char *message, va_list ap); -extern "C" void klog (int priority, const char *message, ...); -bool child_copy (HANDLE, bool, ...); - -int symlink_worker (const char *, const char *, bool, bool) - __attribute__ ((regparm (3))); - -class path_conv; - -int fcntl_worker (int fd, int cmd, void *arg); - -__ino64_t __stdcall readdir_get_ino (struct __DIR *dir, const char *path, bool dot_dot) __attribute__ ((regparm (3))); - -extern "C" int low_priority_sleep (DWORD) __attribute__ ((regparm (1))); -#define SLEEP_0_STAY_LOW INFINITE - -/* Returns the real page size, not the allocation size. */ -size_t getsystempagesize (); - -/* mmap functions. */ -void mmap_init (); -bool mmap_is_attached_page (ULONG_PTR); - -int winprio_to_nice (DWORD) __attribute__ ((regparm (1))); -DWORD nice_to_winprio (int &) __attribute__ ((regparm (1))); - -bool __stdcall create_pipe (PHANDLE, PHANDLE, LPSECURITY_ATTRIBUTES, DWORD) - __attribute__ ((regparm (3))); -#define CreatePipe create_pipe - -inline bool flush_file_buffers (HANDLE h) -{ - return (GetFileType (h) != FILE_TYPE_PIPE) ? FlushFileBuffers (h) : true; -} -#define FlushFileBuffers flush_file_buffers - -/**************************** Exports ******************************/ - -extern "C" { -int cygwin_select (int , fd_set *, fd_set *, fd_set *, - struct timeval *to); -int cygwin_gethostname (char *__name, size_t __len); - -extern DWORD binmode; -extern char _data_start__, _data_end__, _bss_start__, _bss_end__; -extern void (*__CTOR_LIST__) (void); -extern void (*__DTOR_LIST__) (void); -extern SYSTEM_INFO system_info; -}; - -/*************************** Unsorted ******************************/ - -#define WM_ASYNCIO 0x8000 // WM_APP - - -#define STD_RBITS (S_IRUSR | S_IRGRP | S_IROTH) -#define STD_WBITS (S_IWUSR) -#define STD_XBITS (S_IXUSR | S_IXGRP | S_IXOTH) -#define NO_W ~(S_IWUSR | S_IWGRP | S_IWOTH) -#define NO_R ~(S_IRUSR | S_IRGRP | S_IROTH) -#define NO_X ~(S_IXUSR | S_IXGRP | S_IXOTH) - -/* The title on program start. */ -extern char *old_title; -extern bool display_title; -extern bool transparent_exe; - -extern bool in_forkee; -extern bool in_dllentry; - -extern HANDLE hMainThread; -extern HANDLE hMainProc; -extern HANDLE hProcToken; -extern HANDLE hProcImpToken; -extern HANDLE hExeced; -extern HMODULE cygwin_hmodule; - -extern bool cygwin_testing; - -extern char almost_null[]; - -#endif /* defined __cplusplus */ diff --git a/winsup/cygwin/winver.rc b/winsup/cygwin/winver.rc deleted file mode 100644 index 5fc130440..000000000 --- a/winsup/cygwin/winver.rc +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include - -#define STRINGIFY1(x) #x -#define STRINGIFY(x) STRINGIFY1(x) - -#define CYGWIN_DLL_NAME CYGWIN_VERSION_DLL_IDENTIFIER STRINGIFY(.dll) - -#define CYGWIN_REGISTRY_KEY CYGWIN_INFO_CYGNUS_REGISTRY_NAME "\\" \ - CYGWIN_INFO_CYGWIN_REGISTRY_NAME - -#define CYGWIN_API_VERSION STRINGIFY(CYGWIN_VERSION_API_MAJOR) "." \ - STRINGIFY(CYGWIN_VERSION_API_MINOR) - -#define CYGWIN_BUILD_DATE_TIME STRINGIFY(CYGWIN_BUILD_DATE) " " \ - STRINGIFY(CYGWIN_BUILD_TIME) - -VS_VERSION_INFO VERSIONINFO - FILEVERSION CYGWIN_VERSION_DLL_MAJOR,CYGWIN_VERSION_DLL_MINOR,0,0 - PRODUCTVERSION CYGWIN_VERSION_DLL_MAJOR,CYGWIN_VERSION_DLL_MINOR,0,0 - FILEFLAGSMASK 0x3fL -#ifdef DEBUGGING - FILEFLAGS VS_FF_DEBUG -#else - FILEFLAGS 0x0L -#endif - FILEOS VOS__WINDOWS32 - FILETYPE VFT_DLL - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904B0" - BEGIN - VALUE "CompanyName", "Red Hat" - VALUE "FileDescription", "Cygwin\256 POSIX Emulation DLL" - VALUE "FileVersion", STRINGIFY(CYGWIN_VERSION) - VALUE "InternalName", CYGWIN_DLL_NAME - VALUE "LegalCopyright", "Copyright \251 Red Hat, Inc. 1996-2003" - VALUE "OriginalFilename", CYGWIN_DLL_NAME - VALUE "ProductName", "Cygwin" - VALUE "ProductVersion", STRINGIFY(CYGWIN_VERSION) - VALUE "APIVersion", CYGWIN_API_VERSION - VALUE "SharedMemoryVersion", STRINGIFY(CYGWIN_VERSION_SHARED_DATA) - VALUE "RegistryKey", CYGWIN_REGISTRY_KEY - VALUE "BuildDate", CYGWIN_BUILD_DATE_TIME - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END -- cgit v1.2.3