Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/CYGWIN_LICENSE38
-rw-r--r--winsup/cygwin/ChangeLog6759
-rw-r--r--winsup/cygwin/ChangeLog-1995177
-rw-r--r--winsup/cygwin/ChangeLog-19962031
-rw-r--r--winsup/cygwin/ChangeLog-19972800
-rw-r--r--winsup/cygwin/ChangeLog-19984490
-rw-r--r--winsup/cygwin/ChangeLog-19993562
-rw-r--r--winsup/cygwin/ChangeLog-20004150
-rw-r--r--winsup/cygwin/ChangeLog-20015337
-rw-r--r--winsup/cygwin/Makefile.in386
-rw-r--r--winsup/cygwin/ROADMAP129
-rw-r--r--winsup/cygwin/acconfig.h14
-rw-r--r--winsup/cygwin/ansi.sgml59
-rw-r--r--winsup/cygwin/assert.cc55
-rw-r--r--winsup/cygwin/autoload.cc518
-rw-r--r--winsup/cygwin/automode.c26
-rw-r--r--winsup/cygwin/binmode.c21
-rw-r--r--winsup/cygwin/child_info.h114
-rw-r--r--winsup/cygwin/config.h.in41
-rw-r--r--winsup/cygwin/config/i386/longjmp.c51
-rw-r--r--winsup/cygwin/config/i386/makefrag17
-rw-r--r--winsup/cygwin/config/i386/profile.h58
-rw-r--r--winsup/cygwin/config/i386/setjmp.c48
-rwxr-xr-xwinsup/cygwin/configure2416
-rw-r--r--winsup/cygwin/configure.in257
-rw-r--r--winsup/cygwin/cxx.cc49
-rw-r--r--winsup/cygwin/cygerrno.h39
-rw-r--r--winsup/cygwin/cygheap.cc502
-rw-r--r--winsup/cygwin/cygheap.h331
-rwxr-xr-xwinsup/cygwin/cygmagic34
-rw-r--r--winsup/cygwin/cygmalloc.h29
-rw-r--r--winsup/cygwin/cygrun.c67
-rwxr-xr-xwinsup/cygwin/cygserver.cc774
-rwxr-xr-xwinsup/cygwin/cygserver_client.cc529
-rw-r--r--winsup/cygwin/cygserver_ipc.h84
-rwxr-xr-xwinsup/cygwin/cygserver_process.cc432
-rwxr-xr-xwinsup/cygwin/cygserver_shm.cc896
-rw-r--r--winsup/cygwin/cygserver_shm.h147
-rwxr-xr-xwinsup/cygwin/cygserver_transport.cc51
-rwxr-xr-xwinsup/cygwin/cygserver_transport_pipes.cc363
-rwxr-xr-xwinsup/cygwin/cygserver_transport_sockets.cc387
-rw-r--r--winsup/cygwin/cygthread.cc331
-rw-r--r--winsup/cygwin/cygthread.h47
-rw-r--r--winsup/cygwin/cygwin.din1317
-rw-r--r--winsup/cygwin/cygwin.sc111
-rw-r--r--winsup/cygwin/cygwin_version.h31
-rw-r--r--winsup/cygwin/dcrt0.cc1140
-rw-r--r--winsup/cygwin/debug.cc227
-rw-r--r--winsup/cygwin/debug.h94
-rw-r--r--winsup/cygwin/delqueue.cc103
-rw-r--r--winsup/cygwin/dir.cc347
-rw-r--r--winsup/cygwin/dlfcn.cc151
-rw-r--r--winsup/cygwin/dll_init.cc425
-rw-r--r--winsup/cygwin/dll_init.h91
-rw-r--r--winsup/cygwin/dll_init.sgml11
-rw-r--r--winsup/cygwin/dlmalloc.c3906
-rw-r--r--winsup/cygwin/dlmalloc.h96
-rw-r--r--winsup/cygwin/dtable.cc813
-rw-r--r--winsup/cygwin/dtable.h90
-rw-r--r--winsup/cygwin/dtable.sgml20
-rw-r--r--winsup/cygwin/environ.cc1004
-rw-r--r--winsup/cygwin/environ.h46
-rw-r--r--winsup/cygwin/errno.cc697
-rw-r--r--winsup/cygwin/exceptions.cc1275
-rw-r--r--winsup/cygwin/exec.cc103
-rw-r--r--winsup/cygwin/external.cc253
-rw-r--r--winsup/cygwin/external.sgml18
-rw-r--r--winsup/cygwin/fcntl.cc49
-rw-r--r--winsup/cygwin/fhandler.cc1311
-rw-r--r--winsup/cygwin/fhandler.h1250
-rw-r--r--winsup/cygwin/fhandler_clipboard.cc277
-rw-r--r--winsup/cygwin/fhandler_console.cc1754
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc831
-rw-r--r--winsup/cygwin/fhandler_dsp.cc646
-rw-r--r--winsup/cygwin/fhandler_floppy.cc315
-rw-r--r--winsup/cygwin/fhandler_mem.cc442
-rw-r--r--winsup/cygwin/fhandler_proc.cc505
-rw-r--r--winsup/cygwin/fhandler_process.cc751
-rw-r--r--winsup/cygwin/fhandler_random.cc172
-rw-r--r--winsup/cygwin/fhandler_raw.cc569
-rw-r--r--winsup/cygwin/fhandler_registry.cc668
-rw-r--r--winsup/cygwin/fhandler_serial.cc1026
-rw-r--r--winsup/cygwin/fhandler_socket.cc1264
-rw-r--r--winsup/cygwin/fhandler_tape.cc839
-rw-r--r--winsup/cygwin/fhandler_termios.cc364
-rw-r--r--winsup/cygwin/fhandler_tty.cc1259
-rw-r--r--winsup/cygwin/fhandler_virtual.cc235
-rw-r--r--winsup/cygwin/fhandler_windows.cc147
-rw-r--r--winsup/cygwin/fhandler_zero.cc55
-rw-r--r--winsup/cygwin/fork.cc751
-rw-r--r--winsup/cygwin/gcrt0.c41
-rw-r--r--winsup/cygwin/glob.c956
-rw-r--r--winsup/cygwin/gmon.c285
-rw-r--r--winsup/cygwin/gmon.h166
-rw-r--r--winsup/cygwin/grp.cc497
-rw-r--r--winsup/cygwin/heap.cc167
-rw-r--r--winsup/cygwin/heap.h20
-rw-r--r--winsup/cygwin/hires.h46
-rw-r--r--winsup/cygwin/how-autoload-works.txt66
-rw-r--r--winsup/cygwin/how-cygheap-works.txt120
-rw-r--r--winsup/cygwin/how-fhandlers-work.txt75
-rw-r--r--winsup/cygwin/how-signals-work.txt132
-rw-r--r--winsup/cygwin/how-spawn-works.txt32
-rw-r--r--winsup/cygwin/how-to-debug-cygwin.txt128
-rw-r--r--winsup/cygwin/how-vfork-works.txt36
-rw-r--r--winsup/cygwin/include/a.out.h431
-rw-r--r--winsup/cygwin/include/arpa/ftp.h109
-rw-r--r--winsup/cygwin/include/arpa/inet.h35
-rw-r--r--winsup/cygwin/include/arpa/telnet.h322
-rw-r--r--winsup/cygwin/include/asm/byteorder.h103
-rw-r--r--winsup/cygwin/include/asm/socket.h71
-rw-r--r--winsup/cygwin/include/asm/types.h23
-rw-r--r--winsup/cygwin/include/cygwin/acl.h98
-rw-r--r--winsup/cygwin/include/cygwin/core_dump.h73
-rwxr-xr-xwinsup/cygwin/include/cygwin/cygserver.h184
-rwxr-xr-xwinsup/cygwin/include/cygwin/cygserver_process.h164
-rwxr-xr-xwinsup/cygwin/include/cygwin/cygserver_transport.h39
-rwxr-xr-xwinsup/cygwin/include/cygwin/cygserver_transport_pipes.h53
-rwxr-xr-xwinsup/cygwin/include/cygwin/cygserver_transport_sockets.h46
-rw-r--r--winsup/cygwin/include/cygwin/cygwin_dll.h94
-rw-r--r--winsup/cygwin/include/cygwin/fs.h22
-rw-r--r--winsup/cygwin/include/cygwin/grp.h48
-rw-r--r--winsup/cygwin/include/cygwin/hdreg.h24
-rw-r--r--winsup/cygwin/include/cygwin/icmp.h1
-rw-r--r--winsup/cygwin/include/cygwin/if.h90
-rw-r--r--winsup/cygwin/include/cygwin/in.h188
-rw-r--r--winsup/cygwin/include/cygwin/in_systm.h34
-rw-r--r--winsup/cygwin/include/cygwin/ipc.h53
-rw-r--r--winsup/cygwin/include/cygwin/msg.h92
-rw-r--r--winsup/cygwin/include/cygwin/mtio.h205
-rw-r--r--winsup/cygwin/include/cygwin/rdevio.h42
-rw-r--r--winsup/cygwin/include/cygwin/sem.h95
-rw-r--r--winsup/cygwin/include/cygwin/shm.h94
-rw-r--r--winsup/cygwin/include/cygwin/socket.h169
-rw-r--r--winsup/cygwin/include/cygwin/sockios.h1
-rw-r--r--winsup/cygwin/include/cygwin/stat.h88
-rw-r--r--winsup/cygwin/include/cygwin/types.h105
-rw-r--r--winsup/cygwin/include/cygwin/uio.h1
-rw-r--r--winsup/cygwin/include/cygwin/version.h241
-rw-r--r--winsup/cygwin/include/dlfcn.h41
-rw-r--r--winsup/cygwin/include/exceptions.h120
-rw-r--r--winsup/cygwin/include/fcntl.h17
-rw-r--r--winsup/cygwin/include/features.h16
-rw-r--r--winsup/cygwin/include/fnmatch.h63
-rw-r--r--winsup/cygwin/include/getopt.h84
-rw-r--r--winsup/cygwin/include/glob.h112
-rw-r--r--winsup/cygwin/include/icmp.h1
-rw-r--r--winsup/cygwin/include/io.h29
-rw-r--r--winsup/cygwin/include/lastlog.h22
-rw-r--r--winsup/cygwin/include/limits.h169
-rw-r--r--winsup/cygwin/include/mapi.h102
-rw-r--r--winsup/cygwin/include/memory.h17
-rw-r--r--winsup/cygwin/include/mntent.h47
-rw-r--r--winsup/cygwin/include/net/if.h16
-rw-r--r--winsup/cygwin/include/netdb.h168
-rw-r--r--winsup/cygwin/include/netinet/in.h16
-rw-r--r--winsup/cygwin/include/netinet/in_systm.h16
-rw-r--r--winsup/cygwin/include/netinet/ip.h199
-rw-r--r--winsup/cygwin/include/netinet/ip_icmp.h16
-rw-r--r--winsup/cygwin/include/netinet/tcp.h144
-rw-r--r--winsup/cygwin/include/netinet/udp.h51
-rw-r--r--winsup/cygwin/include/paths.h19
-rw-r--r--winsup/cygwin/include/poll.h11
-rw-r--r--winsup/cygwin/include/pthread.h186
-rw-r--r--winsup/cygwin/include/sched.h64
-rw-r--r--winsup/cygwin/include/semaphore.h41
-rw-r--r--winsup/cygwin/include/strings.h6
-rw-r--r--winsup/cygwin/include/sys/acl.h17
-rw-r--r--winsup/cygwin/include/sys/cdefs.h22
-rw-r--r--winsup/cygwin/include/sys/copying.dj41
-rw-r--r--winsup/cygwin/include/sys/cygwin.h259
-rw-r--r--winsup/cygwin/include/sys/file.h30
-rw-r--r--winsup/cygwin/include/sys/ioctl.h30
-rw-r--r--winsup/cygwin/include/sys/mman.h52
-rw-r--r--winsup/cygwin/include/sys/mount.h42
-rw-r--r--winsup/cygwin/include/sys/mtio.h18
-rw-r--r--winsup/cygwin/include/sys/poll.h43
-rw-r--r--winsup/cygwin/include/sys/procfs.h18
-rw-r--r--winsup/cygwin/include/sys/resource.h76
-rw-r--r--winsup/cygwin/include/sys/select.h35
-rw-r--r--winsup/cygwin/include/sys/smallprint.h27
-rw-r--r--winsup/cygwin/include/sys/socket.h56
-rw-r--r--winsup/cygwin/include/sys/soundcard.h1287
-rw-r--r--winsup/cygwin/include/sys/statfs.h11
-rw-r--r--winsup/cygwin/include/sys/strace.h158
-rw-r--r--winsup/cygwin/include/sys/syslog.h83
-rw-r--r--winsup/cygwin/include/sys/sysmacros.h24
-rw-r--r--winsup/cygwin/include/sys/termio.h12
-rw-r--r--winsup/cygwin/include/sys/termios.h334
-rw-r--r--winsup/cygwin/include/sys/ttychars.h1
-rw-r--r--winsup/cygwin/include/sys/uio.h38
-rw-r--r--winsup/cygwin/include/sys/un.h26
-rw-r--r--winsup/cygwin/include/sys/utsname.h33
-rw-r--r--winsup/cygwin/include/sys/vfs.h38
-rw-r--r--winsup/cygwin/include/sys/wait.h73
-rw-r--r--winsup/cygwin/include/sysexits.h118
-rw-r--r--winsup/cygwin/include/syslog.h16
-rw-r--r--winsup/cygwin/include/termio.h16
-rw-r--r--winsup/cygwin/include/tzfile.h19
-rw-r--r--winsup/cygwin/init.cc38
-rw-r--r--winsup/cygwin/ioctl.cc65
-rw-r--r--winsup/cygwin/ipc.cc39
-rw-r--r--winsup/cygwin/lib/_cygwin_crt0_common.cc102
-rw-r--r--winsup/cygwin/lib/crt0.h22
-rw-r--r--winsup/cygwin/lib/cygwin_attach_dll.c25
-rw-r--r--winsup/cygwin/lib/cygwin_crt0.c33
-rw-r--r--winsup/cygwin/lib/dll_entry.c17
-rw-r--r--winsup/cygwin/lib/dll_main.cc41
-rw-r--r--winsup/cygwin/lib/getopt.c501
-rw-r--r--winsup/cygwin/lib/libcmain.c35
-rw-r--r--winsup/cygwin/lib/premain0.c14
-rw-r--r--winsup/cygwin/lib/premain1.c14
-rw-r--r--winsup/cygwin/lib/premain2.c14
-rw-r--r--winsup/cygwin/lib/premain3.c14
-rw-r--r--winsup/cygwin/lib/pseudo-reloc.c46
-rw-r--r--winsup/cygwin/libc/fnmatch.c230
-rw-r--r--winsup/cygwin/localtime.cc2162
-rw-r--r--winsup/cygwin/malloc.cc5582
-rw-r--r--winsup/cygwin/malloc_wrapper.cc316
-rw-r--r--winsup/cygwin/mcount.c173
-rw-r--r--winsup/cygwin/misc-std.sgml74
-rw-r--r--winsup/cygwin/miscfuncs.cc318
-rwxr-xr-xwinsup/cygwin/mkvers.sh177
-rw-r--r--winsup/cygwin/mmap.cc993
-rw-r--r--winsup/cygwin/msg.cc48
-rw-r--r--winsup/cygwin/net.cc2277
-rw-r--r--winsup/cygwin/netdb.cc423
-rwxr-xr-xwinsup/cygwin/newsym24
-rw-r--r--winsup/cygwin/ntdll.h392
-rw-r--r--winsup/cygwin/ntea.cc326
-rw-r--r--winsup/cygwin/passwd.cc415
-rw-r--r--winsup/cygwin/path.cc3750
-rw-r--r--winsup/cygwin/path.h208
-rw-r--r--winsup/cygwin/path.sgml205
-rw-r--r--winsup/cygwin/perprocess.h28
-rw-r--r--winsup/cygwin/perthread.h113
-rw-r--r--winsup/cygwin/pinfo.cc661
-rw-r--r--winsup/cygwin/pinfo.h242
-rw-r--r--winsup/cygwin/pipe.cc271
-rw-r--r--winsup/cygwin/poll.cc139
-rw-r--r--winsup/cygwin/posix.sgml98
-rw-r--r--winsup/cygwin/profil.c173
-rw-r--r--winsup/cygwin/profil.h44
-rw-r--r--winsup/cygwin/pseudo-reloc.cc46
-rw-r--r--winsup/cygwin/pthread.cc492
-rw-r--r--winsup/cygwin/pwdgrp.h137
-rw-r--r--winsup/cygwin/regex/COPYRIGHT20
-rw-r--r--winsup/cygwin/regex/cclass.h31
-rw-r--r--winsup/cygwin/regex/cname.h102
-rw-r--r--winsup/cygwin/regex/engine.c1019
-rw-r--r--winsup/cygwin/regex/engine.ih35
-rwxr-xr-xwinsup/cygwin/regex/mkh76
-rw-r--r--winsup/cygwin/regex/regcomp.c1546
-rw-r--r--winsup/cygwin/regex/regcomp.ih48
-rw-r--r--winsup/cygwin/regex/regerror.c127
-rw-r--r--winsup/cygwin/regex/regerror.ih12
-rw-r--r--winsup/cygwin/regex/regex.3509
-rw-r--r--winsup/cygwin/regex/regex.7235
-rw-r--r--winsup/cygwin/regex/regex.h83
-rw-r--r--winsup/cygwin/regex/regex2.h134
-rw-r--r--winsup/cygwin/regex/regexec.c141
-rw-r--r--winsup/cygwin/regex/regfree.c38
-rw-r--r--winsup/cygwin/regex/tests477
-rw-r--r--winsup/cygwin/regex/utils.h22
-rw-r--r--winsup/cygwin/regexp/COPYRIGHT22
-rw-r--r--winsup/cygwin/regexp/README84
-rw-r--r--winsup/cygwin/regexp/regexp.h34
-rw-r--r--winsup/cygwin/regexp/regmagic.h17
-rw-r--r--winsup/cygwin/regexp/v8_regerror.c28
-rw-r--r--winsup/cygwin/regexp/v8_regexp.c1321
-rw-r--r--winsup/cygwin/regexp/v8_regsub.c88
-rw-r--r--winsup/cygwin/registry.cc252
-rw-r--r--winsup/cygwin/registry.h43
-rw-r--r--winsup/cygwin/resource.cc189
-rwxr-xr-xwinsup/cygwin/rmsym11
-rw-r--r--winsup/cygwin/safe_memory.h53
-rw-r--r--winsup/cygwin/scandir.cc100
-rw-r--r--winsup/cygwin/sched.cc444
-rw-r--r--winsup/cygwin/sec_acl.cc1034
-rw-r--r--winsup/cygwin/sec_helper.cc435
-rw-r--r--winsup/cygwin/security.cc1875
-rw-r--r--winsup/cygwin/security.h266
-rw-r--r--winsup/cygwin/select.cc1505
-rw-r--r--winsup/cygwin/select.h56
-rw-r--r--winsup/cygwin/sem.cc41
-rw-r--r--winsup/cygwin/shared.cc259
-rw-r--r--winsup/cygwin/shared.sgml17
-rw-r--r--winsup/cygwin/shared_info.h190
-rw-r--r--winsup/cygwin/shm.cc693
-rw-r--r--winsup/cygwin/signal.cc430
-rw-r--r--winsup/cygwin/sigproc.cc1310
-rw-r--r--winsup/cygwin/sigproc.h131
-rw-r--r--winsup/cygwin/smallprint.c243
-rw-r--r--winsup/cygwin/spawn.cc1050
-rwxr-xr-xwinsup/cygwin/speclib23
-rw-r--r--winsup/cygwin/stackdump.sgml13
-rw-r--r--winsup/cygwin/strace.cc423
-rw-r--r--winsup/cygwin/string.h108
-rw-r--r--winsup/cygwin/strsep.cc65
-rw-r--r--winsup/cygwin/sync.cc149
-rw-r--r--winsup/cygwin/sync.h49
-rw-r--r--winsup/cygwin/syscalls.cc2594
-rw-r--r--winsup/cygwin/sysconf.cc102
-rw-r--r--winsup/cygwin/syslog.cc412
-rw-r--r--winsup/cygwin/termios.cc269
-rw-r--r--winsup/cygwin/textmode.c21
-rw-r--r--winsup/cygwin/thread.cc2735
-rw-r--r--winsup/cygwin/thread.h630
-rwxr-xr-xwinsup/cygwin/threaded_queue.cc408
-rwxr-xr-xwinsup/cygwin/threaded_queue.h127
-rw-r--r--winsup/cygwin/times.cc665
-rw-r--r--winsup/cygwin/tty.cc462
-rw-r--r--winsup/cygwin/tty.h153
-rw-r--r--winsup/cygwin/tz_posixrules.h48
-rw-r--r--winsup/cygwin/uinfo.cc391
-rw-r--r--winsup/cygwin/uname.cc91
-rw-r--r--winsup/cygwin/wait.cc127
-rw-r--r--winsup/cygwin/winbase.h104
-rw-r--r--winsup/cygwin/wincap.cc526
-rw-r--r--winsup/cygwin/wincap.h111
-rw-r--r--winsup/cygwin/window.cc250
-rw-r--r--winsup/cygwin/winsup.h302
-rw-r--r--winsup/cygwin/winver.rc53
-rw-r--r--winsup/cygwin/woutsup.h110
-rw-r--r--winsup/cygwin/wsock_event.h32
325 files changed, 0 insertions, 127532 deletions
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 8d6890288..000000000
--- a/winsup/cygwin/ChangeLog
+++ /dev/null
@@ -1,6759 +0,0 @@
-2003-01-09 Thomas Pfaff <tpfaff@gmx.net>
-
- * 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 <tpfaff@gmx.net>
-
- * 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 <corinna@vinschen.de>
-
- * fhandler_disk_file.cc (num_entries): Return 2 as link count if
- directory unreadable.
-
-2003-01-09 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- 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 <troyc@usa.net>
-
- * 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 <cgf@redhat.com>
-
- * pinfo.cc (_pinfo::commune_send): Use myself->lock rather than just
- lock when leaving.
-
-2003-01-03 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * passwd.cc (getpwuid_r32): Revert previous change.
-
-2003-01-01 Christopher Faylor <cgf@redhat.com>
-
- * 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.
-
-2002-12-30 Christopher Faylor <cgf@redhat.com>
-
- * exceptions.cc (events_init): Display name of mutex on failure.
-
-2002-12-30 Christopher Faylor <cgf@redhat.com>
-
- * windows.cc (setitimer): Return ENOSYS on invalid argument.
-
-2002-12-28 Christopher Faylor <cgf@redhat.com>
-
- * fhandler_termios.cc (fhandler_termios::line_edit): Perform echo
- before input is accepted or suffer a "race".
-
-2002-12-27 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump DLL minor number.
-
-2002-12-25 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * cygthread.cc (cygthread::detach): Set errno with set_sig_errno so
- that EINTR is properly restored after signal.
-
-2002-12-21 Christopher Faylor <cgf@redhat.com>
-
- * Makefile.in: Default fhandler objects to -fomit-frame-pointer.
- Eliminate redundant CFLAGS settings.
-
-2002-12-20 Christopher Faylor <cgf@redhat.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * localtime.cc (tzsetwall): Set lcl_is_set and lcl_TZname
- in the Cygwin specific part of the routine.
-
-2002-12-19 Pierre Humblet <pierre.humblet@ieee.org>
-
- * fhandler.cc (fhandler_base::open): Use "flags" rather than "mode"
- in Win9X directory code.
-
-2002-12-19 Steve Osborn <bub@io.com>
-
- * 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 <bub@io.com>
- Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * pinfo.cc (_pinfo::cmdline): Allocate sufficient space for myself
- command line args.
-
-2002-12-14 Steve Osborn <bub@io.com>
-
- * 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 <cgf@redhat.com>
-
- * fhandler.cc (fhandler_base::read): Signal event, if necessary, and
- raw_read hasn't done so.
-
-2002-12-14 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <pierre.humblet@ieee.org>
-
- * security.h: Declare well_known_creator_group_sid.
- * sec_helper.cc: Define and initialize well_known_creator_group_sid.
-
-2002-12-14 Corinna Vinschen <corinna@vinschen.de>
-
- * netdb.cc: Remove strtok_r comment.
-
-2002-12-14 Pierre Humblet <pierre.humblet@ieee.org>
-
- * security.cc (get_user_local_groups): Use LookupAccountSid to find the
- local equivalent of BUILTIN.
-
-2002-12-14 Christopher Faylor <cgf@redhat.com>
-
- * pipe.cc (make_pipe): Set fork fixup flag for read pipe.
-
-2002-12-14 Christopher Faylor <cgf@redhat.com>
-
- * winbase.h: Turn on inline versions of Interlocked* by default.
-
-2002-12-14 Gary R. Van Sickle <g.r.vansickle@worldnet.att.net>
-
- * winbase.h: Fixup inline asm functions. Add ilockcmpexch.
-
-2002-12-13 Christopher Faylor <cgf@redhat.com>
-
- 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 <corinna@vinschen.de>
-
- * Makefile.in: Add MINGW_LDFLAGS when linking cygrun.exe.
-
-2002-12-10 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * net.cc (free_protoent_ptr): Add missing free() for base structure.
- (free_servent_pt): Ditto.
- (free_hostent_pt): Ditto.
-
-2002-12-10 Craig McGeachie <slapdau@yahoo.com.au>
-
- * netdb.cc (parse_alias_list): Change strtok calls to strtok_r.
- (parse_services_line): Ditto.
- (parse_protocol_line): Ditto.
-
-2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@redhat.com>
-
- * cygwin.din: Reflect name change from strtodf to strtof. Export
- strtof.
- * include/cygwin/version.h: Bump API minor number.
-
-2002-12-04 Steve Osborn <bub@io.com>
-
- * 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 <slapdau@yahoo.com.au>
-
- * 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 <tpfaff@gmx.net>
-
- * 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 <bub@io.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * sigproc.cc (sig_dispatch_pending): Remove assertion.
-
-2002-11-27 Christopher Faylor <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump DLL minor number.
-
-2002-11-27 Mikael Ylikoski <my@post.utfors.se>
-
- * fhandler_socket.cc (fhandler_socket::sendto): Fix potential
- unitialized value return.
-
-2002-11-27 Christopher Faylor <cgf@redhat.com>
-
- * cygwin.din: Export pthread_getsequence_np.
- * include/cygwin/version.h: Bump API minor version.
-
-2002-11-26 Jason Tishler <jason@tishler.net>
-
- * cygwin.din: Export nl_langinfo().
- * include/cygwin/version.h: Bump API minor version.
-
-2002-11-26 Christopher Faylor <cgf@redhat.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <tpfaff@gmx.net>
-
- * 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 <cgf@redhat.com>
-
- * wait.cc (wait4): Force pending signal delivery before waiting for
- process completion.
-
-2002-11-23 Christopher Faylor <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump DLL minor number.
-
-2002-11-22 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * include/cygwin/version.h: Fix comment.
-
-2002-11-21 Igor Pechtchanski <pechtcha@cs.nyu.edu>
-
- * external.cc (cygwin_internal): Fix va_arg references.
-
-2002-11-21 Christopher Faylor <cgf@redhat.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <steven.obrien2@ntlworld.com>
-
- * poll.cc (poll): ...but set POLLIN instead.
-
-2002-11-20 Pierre Humblet <pierre.humblet@ieee.org>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * net.cc: Sprinkle sigframes throughout.
-
-2002-11-16 Christopher Faylor <cgf@redhat.com>
-
- * tty.cc (tty::make_pipes): Make pipe buffer larger.
-
-2002-11-15 Pierre Humblet <pierre.humblet@ieee.org>
-
- * grp.cc (getgroups32): Protect against closing cygheap->user.token.
-
-2002-11-15 Christopher Faylor <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump API_MINOR to accommodate below
- changes.
-
-002-11-14 Sergey Okhapkin <sos@prospect.com.ru>
-
- * cygwin.din (siginterrupt): New export.
- * signal.cc (siginterrupt): New.
-
-2002-11-15 Sergey Okhapkin <sos@prospect.com.ru>
-
- * select.cc (peek_serial): Don't call PurgeComm() to avoid characters
- loss.
-
-2002-11-14 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * fhandler_serial.cc (fhandler_serial::tcgetattr): Don't take any
- special action when vmin_ == 0.
-
-2002-11-14 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * fhandler_console.cc (fhandler_console::write): Allow characters >=
- 0177 to be displayed in the title bar.
-
-2002-11-14 Corinna Vinschen <corinna@vinschen.de>
-
- * grp.cc (getgroups32): Don't use access token of current user when
- retrieving group info for another user.
-
-2002-11-13 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * ioctl.cc (ioctl): Always print ioctl results, even when it's a tty.
-
-2002-11-13 Christopher Faylor <cgf@redhat.com>
-
- * winsup.h (low_priority_sleep): Declare.
-
-2002-11-13 Christopher Faylor <cgf@redhat.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <corinna@vinschen.de>
-
- * net.cc: Run indent.
-
-2002-11-10 Alexander Gottwald <Alexander.Gottwald@s1999.tu-chemnitz.de>
-
- * 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 <sos@prospect.com.ru>
-
- * fhandler.h (class fhandler_pipe): New ioctl() method.
- * pipe.cc (fhandler_pipe::ioctl): New.
-
-2002-11-07 Christopher Faylor <cgf@redhat.com>
-
- * fhandler_serial.cc (fhandler_serial::ioctl): Fix typo.
-
-2002-11-07 Christopher January <chris@atomice.net>
-
- * 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 <Gilles.Courcoux@col.bsf.alcatel.fr>
-
- * 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 <jason@tishler.net>
-
- * cygwin.din: Export fseeko() and ftello().
- * include/cygwin/version.h: Bump API minor version.
-
-2002-11-06 Christopher Faylor <cgf@redhat.com>
-
- * fhandler_console.cc (keytable[]): Revert previous change. It would
- break too many things.
-
-2002-11-06 Christopher Faylor <cgf@redhat.com>
-
- * fhandler_console.cc (keytable[]): Redefine F1 - F5 to something a
- little more sensical.
-
-2002-11-06 Sergey Okhapkin <sos@prospect.com.ru>
-
- * syscalls.cc (getutid): Use UT_IDLEN where appropriate.
-
-2002-11-06 Christopher Faylor <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump API minor number for below export.
-
-2002-11-06 Sergey Okhapkin <sos@prospect.com.ru>
-
- * 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 <cgf@redhat.com>
-
- * 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 <sos@prospect.com.ru>
-
- * 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 <tpfaff@gmx.net>
-
- * fhandler_socket.cc (fhandler_socket::recvmsg): Call if from == NULL
- WSARecvFrom with fromlen = NULL.
-
-2002-11-04 Christopher Faylor <cgf@redhat.com>
-
- * pinfo.cc (_pinfo::commune_send): Fix thinko in previous checkin.
-
-2002-11-04 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * sigproc.cc (WAIT_SIG_PRIORITY): Bump to THREAD_PRIORITY_TIME_CRITICAL.
-
-2002-11-04 Christopher Faylor <cgf@redhat.com>
-
- * pinfo.cc (_pinfo::commune_send): Initialize buffer or suffer random
- crashes.
-
-2002-11-04 Christopher Faylor <cgf@redhat.com>
-
- * fhandler_process.cc (fhandler_process::fill_filebuf): Deal with error
- condition from cmdline retrieval.
-
-2002-11-04 Christopher Faylor <cgf@redhat.com>
-
- * sigproc.cc (WAIT_SIG_PRIORITY): Bump to highest priority.
-
-2002-11-04 Christopher Faylor <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump DLL minor number.
-
-2002-11-03 Christopher Faylor <cgf@redhat.com>
-
- * 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 <sos@prospect.com.ru>
-
- * 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 <pierre.humblet@ieee.org>
-
- * fhandler.cc (fhandler_base::open): Verify pc isn't NULL.
-
-2002-10-30 Christopher Faylor <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump DLL minor number.
-
-2002-10-30 Christopher Faylor <cgf@redhat.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * pwdgrp.h (pwdgrp_read::open): Compare fh to INVALID_HANDLE_VALUE.
-
-2002-10-22 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Always
- consider .exe files and '#!' shell scripts to be executable.
-
-2002-10-22 Christopher Faylor <cgf@redhat.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- Change _function() to function() throughout.
- * cygwin.din: Remove last vestiges (?) of newlib wrappers.
-
-2002-10-20 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * cygthread.cc (cygthread::stub): Fix typo.
- (cygthread::terminate): Don't zero thread handle prior to using it.
-
-2002-10-20 Christopher Faylor <cgf@redhat.com>
-
- * sigproc.cc (wait_sig): Remove obsolete sigchld logic.
-
-2002-10-20 Christopher Faylor <cgf@redhat.com>
-
- 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 <cgf@redhat.com>
-
- * fork.cc (fork_child): Move pinfo fixup later to attempt some minor
- gains from concurrency with cythread::init.
-
-2002-10-18 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * cygthread.cc: Bump number of cygthreads up to accommodate
- applications which use ttys.
-
-2002-10-18 Christopher Faylor <cgf@redhat.com>
-
- * 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 <tpfaff@gmx.net>
-
- * thread.cc (verifyable_object_isvalid): Test for a valid object
- pointer before testing for static ptr.
-
-2002-10-17 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <tpfaff@gmx.net>
-
- * thread.cc (verifyable_object_isvalid): Test for static object first.
-
-2002-10-16 Christopher Faylor <cgf@redhat.com>
-
- * fhandler_tty.cc (fhandler_tty_slave::read): Attempt #527 to properly
- implement VMIN/VTIME.
-
-2002-10-15 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * spawn.cc (spawn_guts): Fix so that cygthread::terminate is *really*
- called only for exec.
-
-2002-10-13 Christopher Faylor <cgf@redhat.com>
-
- * cygthread.cc (cygthread::stub): Don't zero __name here. That
- introduces a race.
-
-2002-10-13 Christopher Faylor <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump DLL minor number.
-
-2002-10-13 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * window.cc (gethwnd): Use SetThreadPriority method.
-
-2002-10-10 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * cygserver_transport_pipes.cc (transport_layer_pipes::accept):
- Remove trailing \n from debug_printf.
-
-2002-09-30 Christopher Faylor <cgf@redhat.com>
-
- * thread.cc (pthread_mutex::initMutex): Remove \n from api_fatal.
-
-2002-09-30 Christopher Faylor <cgf@redhat.com>
-
- * thread.cc (pthread::precreate): Use explicit "no inherit" option when
- creating mutex.
- (pthread_mutex::nativeMutex::init): Ditto.
-
-2002-09-30 Christopher Faylor <cgf@redhat.com>
-
- * thread.cc (pthread_key::keys): Do not copy on fork.
- (pthread_mutex::mutexInitializationLock): Ditto.
- (pthreadNull::_instance): Ditto.
-
-2002-09-30 Christopher Faylor <cgf@redhat.com>
-
- * exceptions.cc (unused_sig_wrapper): Still need additional level of
- indirection when setting errno.
-
-2002-09-30 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <cgf@redhat.com>
-
- Remove \n from calls to strace class printfs throughout.
-
-2002-09-30 Christopher Faylor <cgf@redhat.com>
-
- * exceptions.cc (unused_sig_wrapper): Accommodate newer compilers.
-
-2002-09-29 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <cgf@redhat.com>
-
- * thread.h (verifyable_object:~verifyable_object): Make virtual.
-
-2002-09-28 Christopher Faylor <cgf@redhat.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <cgf@redhat.com>
-
- * cygrun.c (main): Fix setting of CYGWIN environment variable.
-
- * Makefile.in: Remove linking of unnecessary libraries.
-
-2002-09-24 Christopher January <chris@atomice.net>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * mmap.cc (map_map): Add debug output.
- (mmap64): Evaluate gran_len correctly even if offset isn't 0.
-
-2002-09-22 Christopher Faylor <cgf@redhat.com>
-
- More GNUify non-GNU formatted functions calls throughout.
-
-2002-09-22 Christopher Faylor <cgf@redhat.com>
-
- * Makefile.in (DLL_O_FILES): Restore formatting.
-
-2002-09-22 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- GNUify non-GNU formatted functions calls throughout.
-
-2002-09-22 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * safe_memory.h: Replace #include <new> with an explicit
- definition of the placement new operator.
- (safe_delete): Remove unnecessary ## operator.
-
-2002-09-22 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * cygserver_transport_pipes.cc (transport_layer_pipes::listen):
- Set `_is_listening_endpoint' appropriately.
-
-2002-09-22 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <cgf@redhat.com>
-
- * woutsup.h (system_printf): Remove extraneous semicolon from macro
- definition.
-
-2002-09-22 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <nwourms@netscape.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * cygserver_shm.cc (server_shmmgr::shmdt): Only call
- delete_segment if the segment exists [sic].
-
-2002-09-22 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * safe_memory.h: Include <new> rather than <new.h> for gcc 3.
-
-2002-09-22 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * cygserver_shm.cc (class server_shmmgr::segment_t): Add `_'
- prefix to the names of all fields.
-
-2002-09-22 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * cygserver_transport.cc (create_server_transport): Fix
- cut-and-paste error.
-
-2002-09-22 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * cygserver_transport_sockets.cc
- (transport_layer_sockets::accept): Rename local variable
- `accept_fd' to avoid shadowing the `fd' field.
-
-2002-09-22 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * cygserver_ipc.h: New file.
- * cygserver_shm.h: Re-written from scratch.
- * cygserver_shm.cc: Ditto.
- * shm.cc: Ditto.
-
-2002-09-22 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * cygserver_client (client_request::make_request): Replace my
- inappropriate use of set_errno () with error_code () throughout.
-
-2002-09-22 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * cygserver_shm.h: Replace <sys/shm.h> 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * cygserver_shm.cc: Remove #define __INSIDE_CYGWIN__ from around
- <sys/shm.h> as it no longer contains any internal code.
-
-2002-09-22 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <sys/shm.h>.
- (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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <cgf@redhat.com>
-
- * init.cc (dll_entry): Temporarily disable thread detach code.
-
-2002-09-21 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- GNUify non-GNU formatted functions calls throughout.
-
-2002-09-21 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <cygwin/ipc.h> include.
- * cygserver_shm.cc: Update <cygwin/shm.h> include.
- * shm.cc: Ditto.
-
-2002-09-21 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <cgf@redhat.com>
-
- 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 <cgf@redhat.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <rbtcollins@hotmail.com>
-
- * thread.cc (pthread_key::set): Preserve GetLastError(). Reported
- by Thomas Pffaf.
-
-2002-09-17 Robert Collins <rbtcollins@hotmail.com>
-
- 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 <cgf@redhat.com>
-
- * init.cc: Cleanup slightly and remove obsolete code.
-
-2002-09-11 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <corinna@vinschen.de>
-
- * syscalls.cc (seteuid32): Treat ILLEGAL_UID invalid.
- (setegid32): Treat ILLEGAL_GID invalid.
-
-2002-09-10 Pierre Humblet <pierre.humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * winsup.h (_WIN32_WINNT): Protect.
-
-2002-09-06 Christopher Faylor <cgf@redhat.com>
-
- * winsup.h (_WIN32_WINNT): Define.
-
-2002-09-03 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * cygwin.din: Revert exporting new wchar functions.
- * include/cygwin/version.h: Change comment for API minor 62.
-
-2002-09-02 Christopher Faylor <cgf@redhat.com>
-
- * dcrt0.cc (dll_crt0_1): Remove getpagesize() call.
- * shared.cc (memory_init): Move it here.
-
-2002-08-31 Christopher January <chris@atomice.net>
-
- * fhandler_proc.cc: Add <sys/param.h> 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 <sys/param.h> 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 <cgf@redhat.com>
-
- (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 <deo@logos-m.ru>
-
- * autoload.cc (GetConsoleWindow): Correct parameter count.
-
-2002-08-30 Christopher January <chris@atomice.net>
- Christopher Faylor <cgf@redhat.com>
-
- * tty.cc (tty_list::allocate_tty): Use GetConsoleWindow, if available.
- Call FindWindow in a loop.
- * autoload.cc (GetConsoleWindow): Export
-
-2002-08-30 Christopher Faylor <cgf@redhat.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <corinna@vinschen.de>
-
- * cygwin.din: Add more prototypes for new wchar functions in newlib.
-
-2002-08-30 Corinna Vinschen <corinna@vinschen.de>
-
- * cygwin.din: Add prototypes for new wchar functions in newlib.
- * include/cygwin/version.h: Bump API minor number.
-
-2002-08-29 Boris Schaeling <boriss@web.de>
- Corinna Vinschen <corinna@vinschen.de>
-
- * poll.cc (poll): Peek sockets ready for read to see if there's
- actually data.
-
-2002-08-28 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * malloc.cc: Protect some definitions to avoid a compile time warning.
-
-2002-08-27 Nicholas Wourms <nwourms@netscape.net>
-
- * cygwin.din: Export getc_unlocked, getchar_unlocked,
- putc_unlocked, putchar_unlocked functions.
- * include/cygwin/version.h: Bump api minor.
-
-2002-08-28 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * poll.cc (poll): Eliminate erroneous POLLERR conditional.
-
-2002-08-26 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <Pierre.Humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * cygmalloc.h (MORECORE_CANNOT_TRIM): Define.
-
-2002-08-18 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * winsup.h: Remove malloc_*lock functions.
-
-2002-08-16 Christopher Faylor <cgf@redhat.com>
-
- * 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 <ptsekov@gmx.net>
-
- * exceptions.cc (interrupt_setup): Ensure that the previous signal mask
- is properly saved.
-
-2002-08-15 Thomas Pfaff <tpfaff@gmx.net>
-
- * dcrt0.cc: Modify define for CYGWIN_GUARD.
- (alloc_stack_hard_way): Just use CYGWIN_GUARD in VirtualAlloc call.
-
-2002-08-11 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <cgf@redhat.com>
-
- * cygthread.cc (cygthread::cygthread): Close another race.
-
-2002-08-11 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * environ.cc (parse_options): Remember the "no" part of any options for
- later export.
-
-2002-08-07 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <jbuehler@hekimian.com
-
- * sec_helper.cc (sec_acl): remove extraneous arg to debug_printf.
-
-2002-08-07 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * fhandler_socket.cc (fhandler_socket::accept): Fix FIONBIO call.
-
-2002-08-06 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
- Conrad Scott <conrad.scott@dsl.pipex.com
-
- * cygheap.cc (_csbrk): Allocate some slop initially. Don't erroneously
- add sbrk amount to returned value in initial case.
-
-2002-08-06 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * debug.h (WaitForMultipleObjects): Correct typo.
-
-2002-08-01 Pierre Humblet <Pierre.Humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * syscalls.cc (_link): Revert previous change and just always
- dereference the oldpath.
-
-2002-08-01 Christopher Faylor <cgf@redhat.com>
-
- * syscalls.cc (link): Properly deal with a link to a symlink.
-
-2002-08-01 Christopher Faylor <cgf@redhat.com>
-
- * cygthread.cc: Remove cruft.
-
-2002-08-01 Christopher Faylor <cgf@redhat.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * fhandler.h (fhandler_base::get_r_no_interrupt): Make non-virtual.
- * net.cc (fdsock): Call set_r_no_interrupt.
-
-2002-07-30 Christopher Faylor <cgf@redhat.com>
-
- * syscalls.cc (_read): Clarify debugging output.
-
-2002-07-30 Christopher Faylor <cgf@redhat.com>
-
- * fhandler.h (fhandler_base::get_r_no_interrupt): Make virtual.
-
-2002-07-30 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * security.cc: Change some formatting.
- * include/cygwin/version.h: Bump API minor version.
-
-2002-07-28 Pierre Humblet <Pierre.Humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump API version to indicate that ntsec is
- on by default now.
-
-2002-07-26 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <cgf@redhat.com>
-
- * security.cc (allow_ntsec): Default to on.
- (allow_smbntsec): Default to off.
-
-2002-07-24 David MacMahon <davidm@smartsc.com>
-
- * times.cc (to_time_t): Always round time_t down to nearest second.
-
-2002-07-25 Egor Duda <deo@logos-m.ru>
-
- * Makefile.in: Check if API version is updated when exports are
- changed and stop if not so.
-
-2002-07-24 Egor Duda <deo@logos-m.ru>
-
- * include/cygwin/version.h: Bump minor API version.
-
-2002-07-24 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <nwourms@netscape.net>
-
- * cygwin.din (fcloseall): Add symbol for export.
- (fcloseall_r): Ditto.
-
-2002-07-24 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * security.cc (get_group_sidlist): Create group list from /etc files
- even if DC is available but access fails.
-
-2002-07-22 Christopher Faylor <cgf@redhat.com>
-
- * fhandler_serial.cc: Fix formatting problems introduced by below
- changes.
-
-2002-07-22 Jacek Trzcinski <jacek@certum.pl>
-
- * 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 <cgf@redhat.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * fhandler_serial.cc (fhandler_serial::tcflush): Fix typo.
-
-2002-07-15 Corinna Vinschen <corinna@vinschen.de>
-
- * security.cc (get_group_sidlist): Fix formatting.
-
-2002-07-14 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * debug.cc (clexec): Add missing `hl = hl->next'.
-
-2002-07-14 Christopher Faylor <cgf@redhat.com>
-
- * Makefile.in (cygrun.exe): Add a -lcygwin on the end.
-
-2002-07-14 Christopher Faylor <cgf@redhat.com>
-
- * Makefile.in (cygserver.exe): Add -lstdc++.
- (cygrun.exe): Move -lgcc last.
-
-2002-07-13 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * cygwin.din: Change erroneous entries.
-
-2002-07-11 Pavel Tsekov <ptsekov@gmx.net>
-
- * 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 <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * fhandler_socket.cc (fhandler_socket::set_sun_path): Don't free
- memory here. Allow NULL parameter.
-
-2002-07-04 Corinna Vinschen <corinna@vinschen.de>
-
- * fhandler_socket.cc (fhandler_socket::dup): Add missing copy operation
- on sun_path.
-
-2002-07-03 Christopher Faylor <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump DLL minor number.
-
-2002-07-03 Christopher Faylor <cgf@redhat.com>
-
- * include/sys/statfs.h: New header file.
-
-2002-07-03 Christopher Faylor <cgf@redhat.com>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * tty.cc (tty::common_init): Reverse logic of cygserver check in
- call to SetKernelObjectSecurity.
-
-2002-07-03 Thomas Pfaff <tpfaff@gmx.net>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * net.cc (cygwin_getpeername): Defend against NULL pointer dereference.
-
-2002-07-02 Egor Duda <deo@logos-m.ru>
-
- * include/cygwin/version.h: Bump API minor version.
-
-2002-07-01 Pierre Humblet <pierre.humblet@ieee.org>
-
- * 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 <corinna@vinschen.de>
-
- * cygwin.din (__fpclassifyd): Add symbol.
- (__fpclassifyf): Ditto.
- (__signbitd): Ditto.
- (__signbitf): Ditto.
-
-2002-07-02 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * syscalls.cc (seteuid32): Fix incorrect placement of Pierre's patch
- below.
-
-2002-07-01 Christopher Faylor <cgf@redhat.com>
-
- * syscalls.cc (seteuid32): Fix incorrect use of system_printf.
-
-2002-07-02 Christopher January <chris@atomice.net>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * debug.cc (threads): Avoid initialization.
- * uinfo.cc (cygheap_user::ontherange): (from Corinna Vinschen) Actually
- make below changes work.
-
-2002-07-01 Christopher Faylor <cgf@redhat.com>
-
- * uinfo.cc (cygheap_user::ontherange): Make cygwin root the last resort
- for HOMEPATH/HOMEDRIVE for consistency with HOME.
-
-2002-07-01 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * uinfo.cc (cygheap_user::test_uid): Use standard issetuid test.
-
-2002-06-29 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * environ.cc (spenv::from_cygheap): Still need to take setuid into
- consideration.
-
-2002-06-28 Christopher Faylor <cgf@redhat.com>
-
- * uinfo.cc (cygheap_user::env_logsrv): Return "almost_null" in case
- where no domain or username is "SYSTEM".
-
-2002-06-28 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <tpfaff@gmx.net>
-
- * thread.cc (pthread::create): Add trace printf to get CreateThread
- LastError.
-
-2002-06-27 Corinna Vinschen <corinna@vinschen.de>
-
- * mmap.cc (list::match): Check using pagesize aligned size.
-
-2002-06-26 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * cygheap.cc (cygheap_user::set_name): Correct thinko in below change.
-
-2002-06-26 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * pwdgrp.h (pwdgrp_read::~pwdgrp_read): Avoid compiler warning.
-
-2002-06-26 Christopher Faylor <cgf@redhat.com>
-
- * dcrt0.cc (_dcrt0): Be more defensive when reserved block is used and
- it's not cygwin info.
-
-2002-06-26 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump DLL minor number.
-
-2002-06-25 Thomas Pfaff <tpfaff@gmx.net>
-
- * 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 <cgf@redhat.com>
-
- * dcrt0.cc (sm): Make NO_COPY.
-
-2002-06-25 Corinna Vinschen <corinna@vinschen.de>
-
- * syscalls.cc (chown): Convert uid to 32 bit.
- (lchown): Ditto.
- (fchown): Ditto.
-
-2002-06-24 Christopher Faylor <cgf@redhat.com>
-
- * dtable.cc (dtable::find_unused_handle): Avoid coercion.
-
-2002-06-24 Christopher Faylor <cgf@redhat.com>
-
- * dtable.cc (fhandler_base::dup2): Cleanup. Ensure that lock is turned
- off in error condition.
-
-2002-06-24 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <conrad.scott@dsl.pipex.com>
-
- * 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 <cgf@redhat.com>
-
- * lib/_cygwin_S_IEXEC.cc: Remove obsolete file.
-
-2002-06-23 Christopher Faylor <cgf@redhat.com>
-
- 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 <cgf@redhat.com>
-
- * cygwin.sc: Add recent changes from ld sources.
-
-2002-06-23 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * winsup.h: Move #ifdef EXPCGF code into "winbase.h".
- * winbase.h: #ifdef EXPCGF code moved here from "winsup.h".
-
-2002-06-12 Thomas Pfaff <tpfaff@gmx.net>
-
- * 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 <cgf@redhat.com>
-
- * Makefile.in (cygrun.exe): Move -lgcc where it will do some good.
-
-2002-06-21 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * security.cc (alloc_sd): Carefully check owner_sid again after trying
- SIDs from cygheap.
-
-2002-06-21 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * errno.cc: Change text description for EBADF throughout.
-
-2002-06-20 Pierre Humblet <pierre.humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- 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 <corinna@vinschen.de>
-
- * uinfo.cc (cygheap_user::ontherange): Call NetUserGetInfo() only with
- non-NULL logserver parameter.
-
-2002-06-16 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- 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 <cgf@redhat.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * spawn.cc (spawn_guts): Revert removal of ciresrv.moreinfo->uid =
- ILLEGAL_UID.
-
-2002-06-15 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * uinfo.cc (cygheap_user::ontherange): Don't set HOMEDRIVE or HOMEPATH
- unless one or the other is specified.
-
-2002-06-14 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <corinna@vinschen.de>
-
- * environ.cc (build_env): If realloc moves envblock, move s with it.
-
-2002-06-13 Nicholas S. Wourms <nwourms@netscape.net>
-
- * winver.rc: Add more words to copyright.
-
-2002-06-13 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * security.cc (get_logon_server): Use strcasematch rather than
- strcasecmp.
-
-2002-06-12 Christopher Faylor <cgf@redhat.com>
-
- * path.cc (chdir): Minor cleanup.
-
-2002-06-12 Christopher Faylor <cgf@redhat.com>
-
- * environ.cc (build_env): Correctly fill out windows environment block
- with win32 paths rather than posix paths.
-
-2002-06-12 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * spawn.cc (spawn_guts): More hToken removal cleanup.
-
-2002-06-09 Pierre Humblet <pierre.humblet@ieee.org>
-
- * spawn.cc (spawn_guts): Define sec_attribs and call sec_user_nih()
- only once.
-
-2002-06-10 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * include/sys/strace.h (strace): Avoid use of constructor.
-
-2002-06-10 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Correctly
- set number of links for directory, if appropriate.
-
-2002-06-10 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <tpfaff@gmx.net>
-
- * 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 <tpfaff@gmx.net>
-
- * thread.cc (thread_init_wrapper): Check if thread is already joined.
- (__pthread_join): Set joiner first.
- (__pthread_detach): Ditto.
-
-2002-06-10 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <cgf@redhat.com>
-
- * pinfo.cc (pinfo_dummy): Initialize to correct size.
-
-2002-06-08 Christopher Faylor <cgf@redhat.com>
-
- * path.cc: Change MOUNT_AUTO to MOUNT_CYGDRIVE throughout.
- * shared_info.h (CURR_MOUNT_MAGIC): Update.
-
-2002-06-08 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * include/wchar.h: Define __need_size_t.
-
-2002-06-07 Christopher Faylor <cgf@redhat.com>
-
- * fhandler_socket.cc (fhandler_socket::fstat): Don't assume that socket
- is unix-domain socket.
-
-2002-06-07 Christopher Faylor <cgf@redhat.com>
-
- * times.cc (hires_ms::prime): Set init flag.
-
-2002-06-07 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * times.cc (hires_ms::prime): Adjust epoch of initime_us from 1601 to
- 1970.
-
-2002-06-06 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * autoload.cc (noload): Correctly save argument count register.
-
-2002-06-05 Conrad Scott <conrad.scott@dsl.pipex.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * child_info.h (CHILD_INFO_MAGIC): Oops. Revert previous change. gcc
- 3.1 bug?
-
-2002-06-05 Christopher Faylor <cgf@redhat.com>
-
- * child_info.h (CHILD_INFO_MAGIC): Update.
-
-2002-06-05 Christopher Faylor <cgf@redhat.com>
-
- * strace.cc (strace::hello): Set inited, when appropriate.
-
-2002-06-05 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <tpfaff@gmx.net>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * dtable.cc (handle_to_fn): Correct placement and length of name
- buffer. (Suggested by Pavel Tsekov)
-
-2002-06-04 Christopher Faylor <cgf@redhat.com>
-
- 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * fhandler_dsp.cc (fhandler_dev_dsp::open): Set errno to EACCES if
- requested mode isn't supported.
-
-2002-06-03 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <pierre.humblet@ieee.org>
-
- * syscalls.cc (setegid32): Verify the correctness of the gid
- of the group returned by getgrgid32.
-
-2002-06-03 Pierre Humblet <pierre.humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * dtable.cc (handle_to_fn): Use largest match for device. Correctly
- (?) deal with remote drive weirdness.
-
-2002-06-02 Christopher Faylor <cgf@redhat.com>
-
- * 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 <chris@atomice.net>
-
- * fhandler_process.cc (fhandler_process::open): Set fileid.
-
-2002-06-02 Christopher Faylor <cgf@redhat.com>
-
- 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 <cgf@redhat.com>
-
- * dll_init.cc (dll_list::detach): Don't run destructor on exit.
-
-2002-06-01 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * path.cc (chdir): Don't allow cd'ing to a non-directory virtual path.
-
-2002-05-31 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * dll_init.cc (dll_list::init): Eliminate unneeded debugging statement.
-
-2002-05-31 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * fhandler.cc (binmode): Default to binmode when mode is not known.
-
-2002-05-29 Christopher Faylor <cgf@redhat.com>
-
- * include/sys/cygwin.h (EXTERNAL_PINFO_VERSION): Reinstate.
- * external.cc (fillout_pinfo): Use it.
-
-2002-05-29 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- 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 <corinna@vinschen.de>
-
- * 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 <adah@netstd.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * security.cc (set_security_attribute): Call getegid32() instead of
- getegid().
- * include/cygwin/grp.h: Declare getegid32().
-
-2002-05-28 Corinna Vinschen <corinna@vinschen.de>
-
- 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 <cgf@redhat.com>
-
- * autoload.cc (noload): Properly mask low order word for determining
- number of bytes to pop.
-
-2002-05-27 Christopher Faylor <cgf@redhat.com>
-
- * fhandler_disk_file.cc (fhandler_disk_file::fstat): Minor logic
- cleanup.
-
-2002-05-27 Christopher Faylor <cgf@redhat.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * security.cc (lsa2str): New function.
- (get_priv_list): Call lsa2str instead of sys_wcstombs.
-
-2002-05-22 Pierre Humblet <pierre.humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * winsup.h: Remove duplicate declarations of malloc_lock and
- malloc_unlock.
-
-2002-05-24 Christopher Faylor <cgf@redhat.com>
-
- 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 <pierre.humblet@ieee.org>
-
- * 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 <rbtcollins@hotmail.com>
-
- * gmon.c (fake_sbrk): Correctly return -1 on failed malloc's.
-
-2002-05-24 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * path.cc (path_conv::check): Make sure any trailing path component is
- part of potential normalized posix path.
-
-2002-05-23 Christopher Faylor <cgf@redhat.com>
-
- * smallprint.c (__small_vsprintf): Implement '%o' after all these
- years.
-
-2002-05-22 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * syscalls.cc (dup): Always call dup2 for error handling.
-
-2002-05-22 Corinna Vinschen <corinna@vinschen.de>
-
- * include/cygwin/types.h: Revert previous patch.
-
-2002-05-22 Corinna Vinschen <corinna@vinschen.de>
-
- * include/cygwin/types.h: Define pthread stuff only if _POSIX_THREADS
- is defined.
-
-2002-05-19 Pierre Humblet <pierre.humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * fhandler_disk_file.cc (fhandler_disk_file::fstat): Make handling of
- nlink consistent for remote files.
-
-2002-05-18 Christopher Faylor <cgf@redhat.com>
-
- * path.cc (path_conv::check): Always set executable bit for executable
- extension.
-
-2002-05-17 Christopher Faylor <cgf@redhat.com>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <pierre.humblet@ieee.org>
-
- * 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 <bradshaw@staff.crosswalk.com>
-
- * cygwin.din: Add strlcat and strlcpy.
- * include/cygwin/version.h: Increment API minor version number.
-
-2002-05-09 Pierre Humblet <pierre.humblet@ieee.org>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * syscalls.cc (_read): Change error to EBADF if attempt to read from a
- non-readable fd.
-
-2002-05-11 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * fhandler_virtual.cc (fhandler_virtual::close): Quiet a compiler
- warning.
-
-2002-05-10 Christopher January <chris@atomice.net>
-
- * 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 <cgf@redhat.com>
-
- * syscalls.cc (_write): Change error to EBADF if attempt to write to a
- non-writeable fd.
-
-2002-05-08 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <norbert.schulze@web.de>
-
- * localtime.cc (tzsetwall): Use wildabbr if generated timezone name
- length < 3.
-
-2002-05-05 Pierre Humblet <pierre.humblet@ieee.org>
-
- * 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 <chris@atomice.net>
-
- * path.h (path_conv::path_conv): Initialise normalized_path to NULL.
-
-2002-05-03 Christopher Faylor <cgf@redhat.com>
-
- * net.cc (getdomainname): Change second argument of getdomainname to
- size_t.
-
-2002-05-03 Christopher January <chris@atomice.net>
-
- * 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 <cgf@redhat.com>).
- (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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <ebb9@email.byu.edu>
-
- * path.cc (hash_path_name): Improve hash function strength.
-
-2002-05-02 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <chris@atomice.net>
- Christopher Faylor <cgf@redhat.com> (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 <jason@tishler.net>
-
- * include/cygwin/types.h: Include <sys/sysmacros.h>.
-
-Wed Apr 17 11:27:04 2002 Jason Tishler <jason@tishler.net>
-
- * security.cc (get_lsa_srv_inf): Prevent extraneous backslashes for
- the NT Domain case.
-
-2002-04-12 Corinna Vinschen <corinna@vinschen.de>
-
- * net.cc (cygwin_accept): Set socket type for accepted socket.
- (socketpair): Set socket type for both sockets.
-
-2002-04-12 Egor Duda <deo@logos-m.ru>
-
- * 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 <bradshaw@staff.crosswalk.com>
-
- * cygwin.din: Add strptime.
- * include/cygwin/version.h: Increment API version number.
-
-2002-04-09 Corinna Vinschen <corinna@vinschen.de>
-
- * fork.cc (fork_child): Call fixup_mmaps_after_fork() somewhat earlier.
-
-2002-04-09 Corinna Vinschen <corinna@vinschen.de>
-
- * fhandler.cc (fhandler_base::open): Set read-only bit in
- file_attributes when adequate.
-
-2002-03-28 Christopher Faylor <cgf@redhat.com>
-
- * times.cc (gettimeofday): Fix typo in previous patch.
-
-2002-03-27 Wu Yongwei <adah@netstd.com>
-
- * times.cc (gettimeofday): Revert to setting timezone info if tz !=
- NULL.
-
-2002-03-21 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * spawn.cc (find_exec): Return input if file not found.
-
-2002-03-19 Boris Schaeling <boriss@web.de>
-
- * poll.cc (poll): Add support for invalid descriptors.
-
-2002-03-15 Robert Collins <rbtcollins@hotmail.com>
-
- * fhandler.h (fhandler_termios::lseek): Override lseek.
- * fhandler_termios.cc (fhandler_termios::lseek): Implement this.
-
-2002-03-15 Christopher Faylor <cgf@redhat.com>
-
- * cygserver.cc: Include stdlib.h for exit declaration.
- * threaded_queue.cc: Ditto.
-
-2002-03-15 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * pinfo.cc (pinfo::init): Properly handle execed process stub when
- PID_NOREDIR is specified.
-
-2002-03-13 Boris Schaeling <boriss@web.de>
-
- * poll.cc (poll): Remove variable open_fds. Rearrange and add code to
- fix settings of revents.
-
-2002-03-13 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * sysconf.cc (sysconf): Fix condition.
-
-2002-03-11 Corinna Vinschen <corinna@vinschen.de>
-
- * mmap.cc (msync): Check area given by addr and len for being a
- contigeous mmap'd region.
-
-2002-03-11 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * path.cc (normalize_posix_path): Avoid runs of '.'s > 2.
-
-2002-03-05 Christopher Faylor <cgf@redhat.com>
-
- * errno.cc: Change EPERM associated text to "Operation not permitted"
- throughout.
-
-2002-03-05 Christopher Faylor <cgf@redhat.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <christian.lestrade@free.fr>
-
- * include/sys/termios.h: Define _POSIX_VDISABLE. Define CCEQ macro.
- * fhandler_termios.cc: Include <sys/termios.h>.
- (line_edit): Recognize disabled c_cc[] chars. Ignore VDISCARD when
- not in ICANON mode.
-
-2002-03-04 Dmitry Timoshkov <dmitry@baikal.ru>
-
- * syscalls.cc (truncate64): Use ftruncate64 directly to not lose
- upper 32 bits.
-
-2002-03-04 Robert Collins <rbtcollins@hotmail.com>
-
- * cygserver_shm.cc (delete_shmnode): New function.
- (client_request_shm::serve): Use it.
-
-2002-03-04 Robert Collins <rbtcollins@hotmail.com>
-
- * cygserver_shm.cc (client_request_shm::serve): Implement SHM_DETACH.
- * shm.cc (shmdt): Implement.
-
-2002-03-04 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * Makefile.in (install): Remove install-bin to allow make install to work.
-
-2002-03-03 Robert Collins <rbtcollins@hotmail.com>
-
- * shm.cc (shmat): Prevent a compile error.
- (shmdt): Set errno as this function is incomplete.
-
-2002-02-28 Christopher Faylor <cgf@redhat.com>
-
- * times.cc: Remove if 0'd code. Clean up slightly.
-
-2002-02-28 Robert Collins <rbtcollins@hotmail.com>
-
- * Merge cygwin_daemon into head minus the new shm and ipc exports.
-
-2002-02-28 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * Makefile.in (OBJS): Remove duplicate localtime.o.
-
-2002-01-17 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * shm.cc: Update to handle include changes from HEAD.
-
-Tue Oct 2 16:06:00 2001 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * cygserver.cc (client_request::serve): New function.
- * cygserver_process.cc: Inlude <pthread.h> 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 <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <sys/socket.h> 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 <sys/socket.h> 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 <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * thread.cc (semaphore::TryWait): Set errno as required by posix 1003.1.
- (__sem_wait): Ditto.
- (__sem_trywait): Ditto.
-
-2002-02-27 Christopher Faylor <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump DLL minor number.
-
-2002-02-23 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * smallprint.c (rn): Allow long long values.
- (__small_vsprintf): Add 'D', 'U' and 'X' formats for long long
- parameters.
-
-2002-02-19 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * include/sys/cygwin.h (cygwin_getinfo_types): New CW_STRACE_ACTIVE.
- * external.cc (cygwin_internal): Handle CW_STRACE_ACTIVE.
-
-2002-02-14 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * include/cygwin/acl.h: Fix definition of aclent_t.
-
-2002-02-10 Christopher Faylor <cgf@redhat.com>
-
- * Makefile.in (DLL_OFILES): Consolidate object files.
-
-2002-02-10 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- Patch suggested by Pierre A. Humblet <Pierre.Humblet@ieee.org>:
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <Alexander.Gottwald@s1999.tuchemnitz.de>
-
- * net.cc (get_2k_ifconf): Create interface entries for tokenring cards.
-
-2002-02-08 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * net.cc (cygwin_getsockname): Fix handling of NULL sun_path.
-
-2002-01-29 Corinna Vinschen <corinna@vinschen.de>
-
- * net.cc (getdomainname): Fix registry key for 9x systems, too.
-
-2002-01-29 Corinna Vinschen <corinna@vinschen.de>
-
- * net.cc (getdomainname): Fix registry key for NT systems.
-
-2002-01-28 Christopher Faylor <cgf@redhat.com>
-
- * 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 <earnie@users.sf.net>
-
- * include/sys/strace.h (_STRACE_ON): Define.
- (_STRACE_OFF): Ditto.
-
-2002-01-24 Christopher Faylor <cgf@redhat.com>
-
- * speclib: Ensure that temporary def file is removed.
-
-2002-01-23 Christopher Faylor <cgf@redhat.com>
-
- * speclib: Use rm -f to remove temp file just to quiet any potential
- warnings.
-
-2002-01-23 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * path.cc (symlink): Fix check for already existing file.
-
-2002-01-21 Christopher Faylor <cgf@redhat.com>
-
- * cygmagic: Suppress error output when figuring out if sum takes an
- option.
-
-2002-01-21 Christopher Faylor <cgf@redhat.com>
-
- * cygmagic: Attempt to figure out if sum takes an option.
-
-2002-01-21 DJ Delorie <dj@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump DLL minor number.
-
-2002-01-21 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * speclib: Don't use /dev/null as DLL name. Just default to what's
- already in .def file.
-
-2002-01-21 Christopher Faylor <cgf@redhat.com>
-
- * exceptions.cc (sig_handle): Remove last vestiges of SA_NOCLDSTOP code
- which caused SIGCHLD to be ignored.
-
-2002-01-20 Christopher Faylor <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump DLL minor number.
-
-2002-01-20 Christopher Faylor <cgf@redhat.com>
-
- * syscalls.cc (regfree): Make dll_export.
-
-2002-01-20 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * Makefile.in (new-cygwin1.dll): Revert previous change. libsupc++.a
- is only available in libstdc++-v3.
-
-2002-01-19 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump DLL minor number.
-
-2002-01-19 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * include/cygwin/version.h: Bump API minor version to 51.
-
-2002-01-19 Mark Bradshaw <bradshaw@staff.crosswalk.com>
-
- * 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 <corinna@vinschen.de>
-
- * security.cc (create_token): Close processes token handle as soon
- as it's not used anymore.
-
-2002-01-17 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * path.cc (fchdir): Call chdir with full windows path.
-
-2002-01-14 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * dcrt0.cc (multiple_cygwin_problem): Clarify logic and make
- CYGWIN_MISMATCH_OK more powerful.
-
-2002-01-10 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * syscalls.cc (pathconf): Guard _PC_PATH_MAX branch against invalid
- file parameter.
-
-2002-01-09 Christopher Faylor <cgf@redhat.com>
- Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <corinna@vinschen.de>
-
- * net.cc (cygwin_accept): Set sun_path for newly connected socket.
-
-2002-01-07 Ralf Habacker <Ralf.Habacker@freenet.de>
-
- * Makefile.in: Add uninstall target.
-
-2002-01-07 Christopher Faylor <cgf@redhat.com>
-
- * sigproc.cc (getsem): Clean up debugging output.
-
-2002-01-07 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * dtable.cc (dtable::init_std_file_from_handle): Add some defensive
- code to invalid handle case.
-
-2002-01-06 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * dir.cc (opendir): Guarantee release of alloced fhandler structure on
- error.
-
-2002-01-05 Corinna Vinschen <corinna@vinschen.de>
-
- * exceptions.cc (sig_handle): Set default action for SIGURG to SIG_IGN.
-
-2002-01-05 Corinna Vinschen <corinna@vinschen.de>
-
- * dtable.cc (dtable::init_std_file_from_handle): Don't treat NULL
- handle as errorneous.
-
-2002-01-04 Christopher Faylor <cgf@redhat.com>
-
- * cygmagic: Change logic for equality test.
-
-2002-01-04 Christopher Faylor <cgf@redhat.com>
-
- * dir.cc (opendir): Don't attempt to call sub-opendir if ENOENT.
-
-2002-01-04 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * speclib: Remove temp files automatically.
-
-2002-01-01 Corinna Vinschen <corinna@vinschen.de>
- * 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-1995 b/winsup/cygwin/ChangeLog-1995
deleted file mode 100644
index 462a61336..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 <sac@slash.cygnus.com>
-
- 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 <meissner@tiktok.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- 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<letter> 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 <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * syscalls.cc (_rename): Fix for win95.
-
-Fri Oct 27 20:53:47 1995 steve chamberlain <sac@slash.cygnus.com>
-
- * Everything changed.
-
-Thu Oct 19 10:47:52 1995 steve chamberlain <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * Makefile.in: Cope with target configury.
-
-Wed Oct 18 15:34:49 1995 steve chamberlain <sac@slash.cygnus.com>
-
- * Moved from newlib.
diff --git a/winsup/cygwin/ChangeLog-1996 b/winsup/cygwin/ChangeLog-1996
deleted file mode 100644
index b0c88d97b..000000000
--- a/winsup/cygwin/ChangeLog-1996
+++ /dev/null
@@ -1,2031 +0,0 @@
-Mon Dec 23 13:35:27 1996 Jeremy Allison <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * syscalls.cc (_rename): fix code so we really do
- return -1 if _rename fails.
-
-Tue Dec 17 12:12:29 1996 Jeremy Allison <jra@cygnus.com>
-
- * fhandler.cc: Added Sergeys patch for FakeReadFile.
- * cygwin.din: Re-ordered network calls.
-
-Mon Dec 16 16:47:26 1996 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * path.cc: Added support for UNC paths.
-
-Fri Dec 13 10:56:21 1996 Jeremy Allison <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * version.h: bump CYGWIN_DLL_VERSION_MINOR to 4
-
- patch from Marcus Daniels <marcus@sysc.pdx.edu>:
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * version.h: increment minor dll number in conjunction
- with gnu-win32 beta 17 release
-
-Tue Dec 3 15:05:57 1996 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * include/sys/copying.dj: new file whose presence is
- required by include/sys/file.h
-
-Tue Dec 3 13:37:27 1996 Geoffrey Noer <noer@cygnus.com>
-
- Throughout all Cygnus-developped source files: put all
- code under GPL
-
-Tue Dec 3 10:54:01 1996 Jeremy Allison <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * include/utime.h: add ifdef _UTIME_U wrapper around header
-
-Mon Dec 2 15:45:46 1996 Jeremy Allison <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * Makefile.in: change rules around so new-cygwin.dll is
- only rebuilt when necessary
- * spawn.cc: include <stdlib.h>
-
-Mon Nov 18 21:08:15 1996 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * cygwin.din: Added readv
- * syscalls.cc: Added readv code.
- * syscalls.h: Added readv prototype.
-
-Wed Nov 13 15:55:14 1996 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * dcrt0.cc
- * dirsearch.cc
- * malloc.cc
- * passwd.cc
- * path.cc,
- * pinfo.cc
- * syslog.cc
- * utils/kill.cc
- * utils/cygwin.cc:
- need to #include <stdlib.h> 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 <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * cygwin.din: also export "_execl = execl" and the same
- for _execle and _execlp
-
-Thu Oct 24 01:43:29 1996 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <stdlib.h>
- * 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 <jra@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * hinfo.cc: Removed previous change. This is not the
- correct place to flush input events.
-
-Tue Oct 22 09:25:32 1996 Jeremy Allison <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * Makefile.in: install headers from new Windows32 dir
-
-Sat Oct 19 00:47:58 1996 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * key.cc: remove extra blank lines, change ASCIICHAR to AsciiChar
- * registry.cc: remove #include <winbase.h> since it's already
- included in windows.h
-
-Tue Oct 15 09:51:48 1996 Jeremy Allison <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * dcrt0.cc (dll_crt_1): Moved initialization of _reent to correct
- position.
-
-Fri Sep 27 14:24:05 1996 Jeremy Allison <jra@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * select.cc: change long millisec to unsigned int,
- respaced file
-
- patch from Sergey Okhapkin <sos@prospect.com.ru>:
- * 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 <jra@cygnus.com>
-
- * fhandler.cc (fhandler_base::read): rewrite text mode read
-
-Fri Sep 13 14:58:17 1996 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- patch from Sergey Okhapkin <sos@prospect.com.ru>:
- * 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 <noer@cygnus.com>
-
- * syscalls.cc (system): fix system call
-
-Fri Sep 6 09:33:13 1996 Doug Evans <dje@canuck.cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * fork.cc: Don't include <ctype.h>. Delete find_exec and support.
- * spawn.cc: Include <ctype.h>. 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 <dje@canuck.cygnus.com>
-
- * path.cc (readlink): Make more bulletproof.
-
-Wed Aug 28 16:44:24 1996 Geoffrey Noer <noer@cygnus.com>
-
- * syscalls.cc (system): use execlp
- * public release beta 16 made
-
-Tue Aug 27 09:58:14 1996 Doug Evans <dje@canuck.cygnus.com>
-
- * version.h (CYGWIN_DLL_VERSION_MINOR): Bump up to 2.
-
-Mon Aug 26 15:12:44 1996 Geoffrey Noer <noer@cygnus.com>
-
- * syscalls.cc (system): added basic system() call.
-
-Mon Aug 26 13:46:30 1996 Doug Evans <dje@canuck.cygnus.com>
-
- * 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 <fcntl.h>.
- (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 <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * registry.cc: fix new registry code
- * syscalls.cc: make Windows95 check function extern "C"
-
-Wed Aug 21 16:15:47 1996 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * dirsearch.cc: reformatted, removed a couple of gotos
-
-Thu Aug 15 17:56:08 1996 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <wilson@cygnus.com>
-
- * config/i386/longjmp.c: Increment %eax if it is zero.
-
-Wed Aug 7 15:51:04 1996 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * libccrt0.cc (__version): Deleted, unused.
-
- * uname.c (uname): Print CYGWIN_DLL_VERSION is version field.
-
-Mon Jul 15 16:48:29 1996 Doug Evans <dje@canuck.cygnus.com>
-
- * version.h (CYGWIN_DLL_VERSION_MINOR): Bump up to 1.
-
- Path handling clean up, pass 2 (use //<letter>, not /.<letter>.).
- * 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 //<letter>, not /.<letter>.
- (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 <meissner@tiktok.cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * Makefile.in: also make install in utils subdir so "mount"
- et al gets installed.
-
-Thu Jul 11 17:53:31 1996 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * 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 <eichin@cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * dcrt0.cc (dll_crt0_1): Convert argv[0] to posix style if necessary.
-
-Sun Jun 23 17:21:41 1996 Doug Evans <dje@canuck.cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * 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): /.<letter>. is a drive spec.
- (path_conv::path_conv): Likewise.
- (mount_info::win32_path_to_posix_path): Convert unknown drives to
- /.<letter>. 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 <dje@canuck.cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- 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 <dje@canuck.cygnus.com>
-
- * register.h, registry.cc: Whitespace cleanup.
-
-Thu Jun 13 20:57:28 1996 Doug Evans <dje@canuck.cygnus.com>
-
- * Makefile.in (install): Install cygwin.dll in $(bindir).
-
-Tue Jun 11 13:46:17 1996 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * 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 <onno@stack.urc.tue.nl>.
- (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 <dje@canuck.cygnus.com>
-
- * 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 <krk@cygnus.com>
-
- * dcrt0.cc (dll_crt0_1): Removed reference to reent_data._next.
-
-Tue Jun 4 15:52:29 1996 Geoffrey Noer <noer@cygnus.com>
-
- * include/winkernel.h: fixed typo
-
-Tue May 28 13:08:25 1996 Doug Evans <dje@canuck.cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <dje@canuck.cygnus.com>
-
- * 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 <eichin@cygnus.com>
-
- * 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 <wilson@chestnut.cygnus.com>
-
- * fhandler.h (class fhandler_base): Use MAXPATHLEN not 100 for size
- of array name.
-
-Wed May 15 11:14:46 1996 Doug Evans <dje@canuck.cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * 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 <eichin@cygnus.com>
-
- * 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 <eichin@cygnus.com>
-
- * 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 <eichin@cygnus.com>
-
- * 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 <eichin@cygnus.com>
-
- * 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 <sac>'s changes of 4/20 which were
- accidentally backed out on 4/24.
-
-Tue May 7 05:29:42 1996 Mark Eichin <eichin@cygnus.com>
-
- * 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 <eichin@cygnus.com>
-
- * 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 <eichin@cygnus.com>
-
- * 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 <sac@dilithium.transmeta.com>
-
- * winsup.h (pinfo, pinfo_list): Remove dummy item.
- * fork.cc (*): Revert changes of Apr 2.
-
-Sun Apr 21 17:00:14 1996 Steve Chamberlain <sac@slash.cygnus.com>
-
- * wait.cc (wait_for_any): Fix the wait heuristic.
-
-Sat Apr 20 13:22:03 1996 Steve Chamberlain <sac@slash.cygnus.com>
-
- * 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 <dje@canuck.cygnus.com>
-
- * Makefile.in (glob/libglob.a): Pass -I so glob.c finds right dirent.h.
-
-Wed Apr 10 16:13:30 1996 steve chamberlain <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * 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 <file> and <file.exe>.
- * wait.cc (wait_for_any): Keep waiting if WaitForMultipleObject
- returns invalid result.
-
-Tue Apr 2 12:45:35 1996 steve chamberlain <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * exceptions.cc (__cygwin_exception_handler): re-export.
-
-Fri Mar 22 16:49:29 1996 Michael Meissner <meissner@tiktok.cygnus.com>
-
- * 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 <meissner@tiktok.cygnus.com>
-
- * 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 <dje@charmed.cygnus.com>
-
- * include/winkernel.h (FlushFileBuffers): Declare.
-
-Tue Mar 12 11:16:32 1996 Michael Meissner <meissner@tiktok.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * 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 <meissner@tiktok.cygnus.com>
-
- * 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 <meissner@tiktok.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * 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 <meissner@tiktok.cygnus.com>
-
- * configure.in (ALLOCA for powerpc): Add __allocate_stack.
-
-Wed Feb 7 16:41:18 1996 Steve Chamberlain <sac@slash.cygnus.com>
-
- 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 <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * *.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 <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * 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 <krk@cygnus.com>
-
- * Makefile.in (DLL_OFILES): added ppc-stub.o
-
-Thu Jan 25 09:33:24 1996 Steve Chamberlain <sac@slash.cygnus.com>
-
- * malloc.cc (malloc, free, realloc): Hack for ppc.
-
-Wed Jan 24 20:22:42 1996 Steve Chamberlain <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * 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 <sac@slash.cygnus.com>
-
- * select.cc: New file.
- * Makefile.in: Cope with it.
-
-Tue Jan 2 08:58:58 1996 steve chamberlain <sac@slash.cygnus.com>
-
- * 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 7a5c0b3a4..000000000
--- a/winsup/cygwin/ChangeLog-1997
+++ /dev/null
@@ -1,2800 +0,0 @@
-Wed Dec 31 15:00:32 1997 Geoffrey Noer <noer@cygnus.com>
-
- 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 <ian@cygnus.com>
-
- * regexp/Makefile.in (tooldir): New variable.
- (install): Install regexp.h.
-
-Tue Dec 30 19:52:46 1997 Ian Lance Taylor <ian@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- patch from msnyder@cygnus.com (Michael Snyder):
- * heap.cc (_sbrk): handle situation where newalloc < incr
-
-Mon Dec 15 16:40:07 1997 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <ian@cygnus.com>
-
- * fork.cc: Include <malloc.h>.
- (cygwin_fork_helper1): Call __malloc_copy after copying the stack
- and heap to the child.
-
-Thu Dec 11 15:14:40 1997 Geoffrey Noer <noer@cygnus.com>
-
- 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 <ian@cygnus.com>
-
- * include/sys/termios.h (IXANY): Correct value.
- (PARMRK): Define again.
-
-Wed Dec 10 00:05:23 1997 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * cygwin.din: remove crypt
- * syscalls.cc (crypt): remove crypt stub
-
-Sun Nov 23 17:34:42 1997 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * Makefile.in: Add spaces after colons in rules for make
-
-Mon Nov 17 22:35:25 1997 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@rtl.cygnus.com>
-
- 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 <noer@rtl.cygnus.com>
-
- 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 <noer@rtl.cygnus.com>
-
- 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 <noer@rtl.cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <ian@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * exceptions.cc (__cygwin32_exception_handler): don't
- print "In cygwin32_except_handler" for exceptions Cygwin32
- isn't going to handle. Print "(progname PID) Exception: <type>"
- to console. Redirect all detailed information including the
- stack trace to <progname>.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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <tromey@cygnus.com>
-
- * include/mapi.h: New file.
- * sysdef/i386/mapi32.def (MAPISendMail@20): New export.
-
-Thu Oct 30 15:08:13 1997 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * Makefile.in: change DLL_NAME to cygwin97r2.dll
-
-Mon Oct 20 20:16:47 1997 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * cygwin.din: restore __main as an export
-
-Mon Oct 13 18:41:09 1997 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <tromey@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * include/Windows32/Base.h: Only typedef CHAR, SHORT, and LONG if
- VOID is not defined
-
-Thu Oct 9 00:46:40 1997 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- Oops. ../libio refers to objdir and is not the same
- as $(srcdir)/../libio.
-
-Thu Oct 2 23:12:19 1997 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * spawn.cc: add missing cast to debug printf
-
-Thu Sep 25 16:14:17 1997 Ian Lance Taylor <ian@cygnus.com>
-
- * path.cc (conv_to_win32_path): Call backslashify on a win32
- path.
-
-Tue Sep 23 17:58:17 1997 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- Merge in the following changes:
-
- Thu Aug 21 13:30:12 1997 Ian Lance Taylor <ian@cygnus.com>
- * 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 <sys/types.h>.
- (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 <ian@cygnus.com>
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * cygwin.din: export random, srandom
-
-Wed Aug 20 16:56:39 1997 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * dcrt0.cc: respace, modify some comments slightly
-
-Tue Aug 19 16:17:57 1997 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <rob@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * times.cc: add missing extern "C"s around exported functions
-
-Thu Aug 14 17:00:32 1997 Geoffrey Noer <noer@cygnus.com>
-
- 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 <ian@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <cagney@b1.cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * net.cc (cygwin32_shutdown): New implementation to replace
- stub previously present
-
-Tue Jul 22 14:59:22 1997 Geoffrey Noer <noer@cygnus.com>
-
- * cygwin.din: remove random, srandom
- * Makefile.in: remove random/srandom-related lines
-
-Tue Jul 22 14:10:32 1997 Ian Lance Taylor <ian@cygnus.com>
-
- * path.cc (realpath): New C function.
- * cygwin.din: Export realpath.
-
- * cygwin.din: Export srandom.
-
-Wed Jul 9 12:26:03 1997 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * libcmain.cc (main): Pass wShowWindow field from startup info to
- WinMain.
-
-Mon Jul 7 17:47:48 1997 Geoffrey Noer <noer@cygnus.com>
-
- * path.cc: respace, reword comments
- * times.cc (utimes): add FIXME
-
-Tue Jun 24 18:31:27 1997 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- respaced console.cc, fhandler.cc, syscalls.cc, pinfo.cc,
- fork.cc, spawn.cc
-
-Tue Jun 17 14:57:09 1997 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * include/winsock.h: fix protection wrapper name
-
-Fri Jun 6 12:41:09 1997 Ian Lance Taylor <ian@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * times.cc (gettimeofday): Check return values and set tz_dsttime
- correctly.
-
-Wed Jun 4 00:04:33 1997 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <ian@cygnus.com>
-
- * times.cc (ftime): New function.
- * cygwin.din: Export ftime.
-
-Mon Jun 2 14:34:00 1997 Geoffrey Noer <noer@cygnus.com>
-
- 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 <ian@cygnus.com>
-
- * utils/configure.in: Call AC_PROG_INSTALL.
- * utils/configure: Rebuild.
-
-Mon Jun 2 11:44:14 1997 Geoffrey Noer <noer@cygnus.com>
-
- * grp.cc (getgroups): new
- * cygwin.din: export getgroups
-
-Fri May 30 16:47:38 1997 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <stdlib.h>, 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 <noer@cygnus.com>
-
- * times.cc (gettimeofday): return 0 on success instead of 1
- (utimes): init res to 0
-
-Wed May 21 11:29:24 1997 Geoffrey Noer <noer@cygnus.com>
-
- * include/limits.h: define NGROUPS_MAX
-
-Tue May 20 14:13:59 1997 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- Public gnu-win32 beta 18 release made
-
-Sun May 4 15:34:07 1997 Geoffrey Noer <noer@cygnus.com>
-
- patch from Mikey <jeffdb@netzone.com>:
- * console.cc (FakeReadFile): FlushConsoleInputBuffer if
- flags & ENABLE_LINE_INPUT and then return ReadFile
-
-Fri May 2 10:53:10 1997 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * cygwin.din: remove libgcc2.a internal functions
-
-Mon Apr 28 14:57:04 1997 Michael Meissner <meissner@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- patch from Jeremy Allison <jra@cygnus.com>:
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * utils/Makefile.in (INSTALL): Change install.sh to install-sh.
-
-Mon Apr 14 12:33:22 1997 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * fhandler.h: fix typo
- * fhandler.cc: check_execable_p should only take one arg now
-
-Mon Feb 3 16:16:39 1997 Jeremy Allison <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * mmap.cc: added missing copyright notice
-
-Tue Jan 14 12:51:12 1997 Jeremy Allison <jra@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <jra@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * utils/mkpasswd.c: Include wchar.h.
- * utils/mkgroup.c: Ditto.
-
-Tue Dec 29 12:53:23 1998 Geoffrey Noer <noer@cygnus.com>
-
- * Makefile.in: remove dep for libcerr.o
-
-Mon Dec 28 22:02:15 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * include/Windows32/CommonFunction.h: Added proto for
- NetUserChangePassword().
-
-Thu Dec 24 16:15:40 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * winsup.h: Reorganize include order to allow thread-safe build.
-
-Wed Dec 23 11:45:33 1998 DJ Delorie <dj@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * times.cc (__to_clock_t): Change return value to unsigned long
- long to prevent overflow.
-
-Tue Dec 22 19:37:55 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * pthread.cc: fix copyright header.
- * shared.h: ditto.
-
-Fri Dec 18 19:21:30 1998 Geoffrey Noer <noer@cygnus.com>
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * 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 <noer@cygnus.com>
-
- * include/pthread.h: clean up, remove C++-style comments,
- remove pthread_getsequence_np proto.
-
-Fri Dec 18 15:26:33 1998 Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * Makefile.in: Cleanup pthread usage.
-
-Fri Dec 18 14:35:59 1998 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Remove obsolete header dependency for
- thread-safe build.
-
-Fri Dec 18 14:16:04 1998 Christopher Faylor <cgf@cygnus.com>
-
- * exceptions.cc (sig_handle): Avoid suspending top-level
- processes.
- * trace.cc: Remove unneeded include.
-
-Thu Dec 17 19:19:53 1998 Geoffrey Noer <noer@cygnus.com>
-
- * cygwin.din: remove pthread_getsequence_np, _reent_clib
-
-Thu Dec 17 16:48:15 1998 Geoffrey Noer <noer@cygnus.com>
-
- * include/cygwin/version.h: correct two typos in comments
-
-Thu Dec 17 19:11:31 1998 Christopher Faylor <cgf@cygnus.com>
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * include/Windows32/Defines.h: Add values for using Windows
- function `DeviceIoControl()'.
-
-Thu Dec 17 18:00:34 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- Merge in thread-safe branch changes.
-
-Wed Dec 16 22:54:16 1998 Christopher Faylor <cgf@cygnus.com>
-
- * pthread.cc: Include winsup.h.
-
-Wed Dec 16 22:54:16 1998 Christopher Faylor <cgf@cygnus.com>
-
- * thread.cc: Reformat.
- * pthread.cc: New file.
- * cygwin.din: Add pthread interface functions
-
-Wed Dec 16 22:54:16 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * include/shellapi.h: fix typo in DragQueryPoint proto.
-
-Mon Dec 14 12:37:43 1998 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <corinna.vinschen@cityweb.de>:
- * 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 <noer@cygnus.com>
-
- * fhandler.cc (fhandler_disk_file::open): check for shell scripts
- regardless of Win32 OS type.
-
-Sun Dec 6 19:38:11 1998 Christopher Faylor <cgf@cygnus.com>
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * fhandler_console.cc (fhandler_console::tcgetattr): Fix typo.
- ISIG should be ored with c_lflag.
-
-Tue Dec 1 16:28:56 1998 Geoffrey Noer <noer@cygnus.com>
-
- * include/utmp.h: delete, moved to newlib/libc/sys/cygwin/sys.
-
-Thu Dec 3 15:41:51 1998 Geoffrey Noer <noer@cygnus.com>
-
- Released 20.1 update.
-
-Thu Dec 3 22:24:18 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * mkvers.sh: Accommodate lack of timezone in date output so that
- year shows up correctly.
-
-Mon Nov 30 14:30:51 1998 Jeff Johnston <jjohnstn@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * fhandler_console.cc (fhandler_console::ioctl):
- Added ioctl commands TCGETA, TCSETA, TCSETAW, TCSETAF.
-
-Fri Nov 27 22:30:58 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in: Reinstate libwinspool.a/winspool.drv creation.
-
-Tue Nov 24 18:48:56 1998 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * sigproc.cc (__release_signal_mutex): revert Nov 3d change.
-
-Sun Nov 22 17:04:44 1998 Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in: Use correct libpthread.a target when
- thread-safe is enabled.
-
-Thu Nov 19 10:49:27 1998 Christopher Faylor <cgf@cygnus.com>
-
- * path.cc (path_conv): Correct error reporting.
-
-Wed Nov 18 20:07:50 1998 Geoffrey Noer <noer@cygnus.com>
-
- * utils/Makefile.in: remove termcap file install rule
-
-Wed Nov 18 18:14:18 1998 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * utils/ps.cc: include sys/cygwin.h, make pname buf
- MAXPATH in size.
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * utils/ps.cc (main): converting windows paths to posix
- paths in output.
-
-Wed Nov 18 15:34:46 1998 Geoffrey Noer <noer@cygnus.com>
-
- * include/wchar.h: include stddef.h.
-
-Wed Nov 18 17:39:15 1998 Christopher Faylor <cgf@cygnus.com>
-
- * environ.cc (environ_init): Fix incorrect TERM= detection.
-
-Tue Nov 17 17:28:09 1998 Geoffrey Noer <noer@cygnus.com>
-
- * gcrt0.c: include stdlib.h, add proto for monstartup.
-
-Tue Nov 17 16:47:42 1998 Geoffrey Noer <noer@cygnus.com>
-
- * include/wchar.h: add protos for wcslen and wcscmp.
- * syscalls.cc: minor reformat.
-
-Tue Nov 17 15:38:45 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- patch from Mumit Khan <khan@xraylith.wisc.edu>:
- * 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 <noer@cygnus.com>
-
- * cygwin.din: export dll_noncygwin_dllcrt0.
- * {libccrt0.cc, winsup.h}: minor reformat.
-
-Sat Nov 14 22:14:51 1998 Christopher Faylor <cgf@cygnus.com>
-
- * environ.cc (environ_init): Use sizeof for string lengths
- rather than hard-coded values.
-
- patch from Mumit Khan <khan@xraylith.wisc.edu>:
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * fork.cc (fork): No need for intermediate jmp_buf variable.
-
- patch from Mumit Khan <khan@xraylith.wisc.edu>:
- * 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 <noer@cygnus.com>
-
- 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 <ctype.h> and <stdlib.h>.
- (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 <ctype.h> and <stdlib.h>.
- (enum_groups): return void, not int. Remove unused var rc.
- * gmon.c: include <stdio.h> and <unistd.h>.
- (_mcleanup): remove unused vars buf and profdir.
-
-Fri Nov 13 16:17:28 1998 Geoffrey Noer <noer@cygnus.com>
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * include/sys/sysmacros.h: new file, define major, minor, makedev
-
-Fri Nov 13 17:03:52 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de> and
- Ron Parker <rdparker@butlermfg.org>:
- * path.cc (mount_info::conv_to_win32_path): Refined recognition of
- UNC devices.
-
-Fri Nov 13 12:37:00 1998 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Fix a typo.
-
-Fri Nov 13 10:59:43 1998 DJ Delorie <dj@cygnus.com>
-
- * Makefile.in: "make" uses new "ld -shared" by default internally.
-
-Fri Nov 13 00:58:38 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <khan@xraylith.wisc.edu>:
- * 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 <dj@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * cygwin.din (getpwnam): remove duplicates
-
-Tue Nov 10 18:27:09 1998 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- patch from Gary V. Vaughan <gvaughan@oranda.demon.co.uk>:
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * include/cygwin/version.h: up DLL version, bump API_MINOR to 2
- to mark following change.
-
- patch from Mumit Khan <khan@xraylith.wisc.edu>:
- * cygwin.din: add exports for some of the newlib bessel
- functions (j1, jn, y1, yn).
-
-Mon Nov 9 15:10:06 1998 Geoffrey Noer <noer@cygnus.com>
-
- * syscalls.cc (_link): rewrite FIXME.
-
-Mon Nov 9 14:51:03 1998 Geoffrey Noer <noer@cygnus.com>
-
- * errno.cc (strerror): add string for EDEADLOCK.
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * errno.cc (errmap[]): add END_OF_MEDIA and additional Win32
- error codes.
-
-Sun Nov 8 21:28:01 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- patch from Kazuhiro Fujieda <fujieda@jaist.ac.jp>:
- * environ.cc (environ_init): correct size arg to parse_options
-
-Mon Nov 2 21:40:32 1998 Christopher Faylor <cgf@cygnus.com>
-
- * regexp/regexp.c (regatom): Respond to compiler warning.
-
-Mon Nov 2 21:36:48 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- patch from Mumit Khan <khan@xraylith.wisc.edu>:
- * dll_init.cc (doGlobalCTORS): Fix invocation order.
- (doGlobalDTORS): Likewise.
-
-Wed Oct 28 17:57:53 1998 Geoffrey Noer <noer@cygnus.com>
-
- * Makefile.in: add include/exceptions.h to dll_init.cc deps.
-
- patch from Mumit Khan <khan@xraylith.wisc.edu>:
- * 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 <noer@cygnus.com>
-
- * syslog.cc: drop "32" from CYGWIN32_LOG_NAME
-
-Tue Oct 27 16:09:09 1998 DJ Delorie <dj@cygnus.com>
-
- * utils/cygcheck.cc (usage): cygwhich->cygcheck
-
-Mon Oct 26 17:47:10 1998 Geoffrey Noer <noer@cygnus.com>
-
- * Makefile.in: fix deps for dll_entry.o and dll_main.o,
- add dep for glob.o.
-
- patch from Mumit Khan <khan@xraylith.wisc.edu>:
- * 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 <noer@cygnus.com>
-
- * Makefile.in: add back install of include/net which was
- removed by accident.
-
-Mon Oct 26 15:25:22 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * uname.cc (uname): Remove slash from system name.
-
-Mon Oct 26 02:11:44 1998 Geoffrey Noer <noer@cygnus.com>
-
- * include/asm/byteorder.h: add missing __cplusplus wrapper.
-
-Mon Oct 26 00:46:33 1998 Christopher Faylor <cgf@cygnus.com>
-
- * uname.cc (uname): Remove space from the system name.
-
-Sun Oct 25 23:47:56 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * cygwin.din: remove unnecessary __cygwin32_stack_trace and
- __cygwin_stack_trace exports.
-
-Sat Oct 24 21:18:46 1998 Christopher Faylor <cgf@cygnus.com>
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * utils/cygcheck.cc: reformat, add copyright notice
-
-Fri Oct 23 18:15:28 1998 DJ Delorie <dj@cygnus.com>
-
- * utils/cygcheck.cc: new file
- * utils/Makefile.in: build cygcheck.exe
-
-Fri Oct 23 16:48:41 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * Makefile.in: install include/cygwin headers, losing the "32".
- * include/cygwin32: remove
-
-Fri Oct 23 14:36:31 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * utils/*: remove "32"s from cygwin32_foo function calls
-
-Fri Oct 23 00:24:27 1998 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * utils/Makefile.in: disable building cygwin.exe.
-
-Thu Oct 22 14:16:10 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/sys/strace.h: Minor addition from threadsafe-branch.
-
-Thu Oct 22 09:03:18 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * include/cygwin32/version.h: rewrite versioning comments,
- updating for new scheme but keeping historical information.
-
-Mon Oct 19 23:45:24 1998 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <khan@xraylith.wisc.edu>, Corinna Vinschen
- <corinna.vinschen@cityweb.de>, 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in: Avoid newer GNU make construction when building
- version.cc.
-
-Mon Oct 19 00:09:06 1998 Geoffrey Noer <noer@cygnus.com>
-
- * Makefile.in: invoke mkvers.sh with $(SHELL)
-
-Sun Oct 18 15:19:17 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * Makefile.in: enable building mingw subdir by default
-
-Thu Oct 15 12:01:08 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * hinfo.cc (hinfo::dup2): Avoid a null pointer dereference
- in a debugging printf.
-
-Wed Oct 14 18:06:51 1998 Geoffrey Noer <noer@cygnus.com>
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * utils/ps.cc (main): use const char *pname
-
-Fri Oct 9 12:32:23 1998 Christopher Faylor <cgf@cygnus.com>
-
- * syscalls.cc (getw): Simplify.
-
-Thu Oct 8 23:09:34 1998 Geoffrey Noer <noer@cygnus.com>
-
- * times.cc: add missing syscall_printfs to time functions,
- slight reformatting.
-
-Thu Oct 8 21:56:37 1998 DJ Delorie <dj@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * fhandler_tty.h: up NTTYs from 16 to 128
-
-Wed Oct 7 09:15:55 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * sysdef/kernel32.def: add missing GetDiskFreeSpaceEx lines
-
-Sat Oct 3 23:52:23 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * strace.cc (strace_printf): protect against recursion
-
-Thu Oct 1 17:08:47 1998 Geoffrey Noer <noer@cygnus.com>
-
- * utils/ps.cc (main): add more detailed usage printfs
-
-Thu Oct 1 11:05:16 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * include/io.h: add missing setmode proto
-
-Tue Sep 29 23:33:11 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <spolk@cygnus.com>
-
- * include/{tchar.h, direct.h}: Added so that
- tcl8.1a2 can be compiled with cygwin.
-
-Mon Sep 28 19:36:41 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * doc/doctool.c (main): typo checking for --help
-
-Wed Sep 23 17:46:06 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- patch from DJ Delorie <dj@cygnus.com>:
- * path.cc (symlink_check_one): Don't re-define res or symlinks
- will be undetectable.
-
-Wed Sep 23 12:02:39 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (symlink_check_one): Fix handle leak resulting
- from open of file to check for symlink magic. Suggested
- by Corinna Vinschen <corinna.vinschen@cityweb.de> .
-
-Wed Sep 23 08:33:26 1998 Christopher Faylor <cgf@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * path.cc (mount, umount, setmntent, getmntent, endmntent):
- make extern "C"
-
-Mon Sep 21 20:37:16 1998 DJ Delorie <dj@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * doc/Makefile.in: reference -db2html in case docbook
- tools aren't installed.
-
-Mon Sep 21 14:43:40 1998 Geoffrey Noer <noer@cygnus.com>
-
- patch from DJ Delorie <dj@cygnus.com>:
- * doc/doctool.c (scan_file): correct off by one error in
- malloc
-
-Mon Sep 21 14:28:38 1998 Christopher Faylor <cgf@cygnus.com>
-
- * fhandler.h (select_record): Clear memory in constructor.
-
-Mon Sep 21 08:49:22 1998 Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * doc/Makefile.in: Add dummy install target.
-
-Thu Sep 17 12:30:49 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * winsup.h: Remove side effects from SLASH_P.
-
-Tue Sep 15 18:36:08 1998 Ben Elliston <bje@cygnus.com>
-
- * sysdef/kernel32.def: Add definition for the Win32 API function
- `TryEnterCriticalSection'.
-
-Tue Sep 15 12:26:48 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * added documentation and doctool.c
-
-Tue Sep 15 08:37:26 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * Makefile.in: include ../libio when building
-
-Sun Sep 13 19:30:58 1998 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- Merge in experimental-980602 branch changes.
-
-Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * select.cc (socket_cleanup): Close thread handle or suffer
- handle leak.
-
-Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * select.cc (cygwin32_select): Need to reset signal_arrived before
- testing it or suffer loop.
-
-Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * Makefile.in: build libwinspool.a with the dll name winspool.drv
-
-Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * path.cc (path_conv): bug fix when path ends in slash
-
-Thu Sep 10 21:09:51 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * dcrt0.cc (dll_crt0_1): Remove ill-advised ifdef NEEDOEM.
-
-Thu Sep 3 17:54:18 1998 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Speed up dll links.
- * path.cc (chdir): Fix previous change.
-
-Mon Aug 31 12:23:33 1998 Christopher Faylor <cgf@cygnus.com>
-
- * path.cc (chdir): Protect free from potential signal race.
-
-Fri Aug 28 15:59:27 1998 Geoffrey Noer <noer@cygnus.com>
-
- * dlfcn.h: delete, move it
- * include/dlfcn.h: here
-
-Thu Aug 27 14:20:38 1998 Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * include/cygwin32/version.h: up minor version number
-
-Mon Aug 10 07:04:13 1998 DJ Delorie <dj@cygnus.com>
-
- * 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 <ebachalo@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <ebachalo@loony.cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (chdir): Force chdir to disk device to go to the root
- directory.
-
-Tue Jul 21 09:32:23 1998 Christopher Faylor <cgf@cygnus.com>
-
- * pinfo.cc (pinfo_init): 0 is a very bad value for a default pgid.
-
-Fri Jul 16 15:09:50 1998 Stan Cox <scox@cygnus.com>
-
- * (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 <ebachalo@loony.cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * dcrt0.cc (dll_crt0_1): Avoid redundant strace_printf.
-
-Wed Jul 8 15:05:10 1998 DJ Delorie <dj@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * environ.cc (winenv): Be more paranoid when restoring special
- win32 environment variables beginning with '='.
-
-Thu Jul 2 09:19:32 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/Windows32/Structures.h (MINMAXINFO): Add a missing
- *LP...
-
-Thu Jun 25 10:45:38 1998 Christopher Faylor <cgf@cygnus.com>
-
- * signal.cc (sigpending): Stop from always reporting pending signals
- when no signals are actually pending.
-
-Tue Jun 23 15:38:45 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * include/sys/syslog.h: add missing LOG_LOCALn bits
-
-Tue Jun 9 22:29:26 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * dcrt0.cc: Remove obsolete PPC and OLDWAY defines.
- * exceptions.cc: Remove obsolete PPC defines.
-
-Fri Jun 5 22:18:01 1998 Christopher Faylor <cgf@cygnus.com>
-
- * utils/Makefile.in: install should build products if necessary.
-
-Fri Jun 5 17:47:11 1998 Geoffrey Noer <noer@cygnus.com>
-
- * errno.cc (seterrno): shouldn't & against 0xff since there
- are error codes above 255.
-
-Fri Jun 5 14:35:36 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * exceptions.cc (ctrl_c_handler): return zero when a
- CTRL_LOGOFF_EVENT occurs.
-
-Wed Jun 3 01:01:17 1998 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * hinfo.cc: Include unistd.h, not fcntl.h.
-
-Fri May 29 21:38:10 1998 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- patch from sos@prospect.com.ru (Sergey Okhapkin):
- * Makefile.in: Add fhandler_windows.o target
- * fhandler.h: Include <sys/ioctl.h>. 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 <sys/ioctl.h>.
- * 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 <ian@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * include/sys/ioctl.h: need to include <sys/cdefs.h>
- * syscalls.h: remove ioctl proto
-
-Wed May 27 01:34:06 1998 Geoffrey Noer <noer@cygnus.com>
-
- * cygwin.din: add sethostent/endhostent exports
- * net.cc (sethostent, endhostent): new stubs
-
-Fri May 22 17:31:50 1998 Geoffrey Noer <noer@cygnus.com>
-
- * include/cygwin32/in.h: correct typo in IPPORT_WHOIS define
-
-Fri May 22 17:00:48 1998 Geoffrey Noer <noer@cygnus.com>
-
- * include/sys/ioctl.h: add ioctl proto
-
-Wed May 20 18:52:31 1998 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- patch from Christopher Faylor <cgf@cygnus.com>
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * dcrt0.cc (dll_crt0_1): Clear errno before calling main.
-
-Thu May 14 00:37:01 1998 Geoffrey Noer <noer@cygnus.com>
-
- * dcrt0.cc: add comments, reformatting
-
-Wed May 13 17:47:23 1998 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * syscalls.cc (get_os_type): add FIXME
-
-Tue May 5 14:02:12 1998 Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * passwd.cc (parse, getpass): remove unneeded uses of NO_COPY
- * grp.cc (getgrgid, getgrnam): ditto
-
-Tue Apr 28 16:18:03 1998 Geoffrey Noer <noer@cygnus.com>
-
- * version.h: bump minor version to 2
- * errno.cc: add FIXME
-
-Wed Apr 22 15:43:56 1998 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * cygwin.din: export truncate call
-
-Mon Apr 13 23:15:13 1998 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * include/sys/cygwin.h: add protos for cygwin32 path conversion
- functions.
-
-Wed Apr 1 16:12:58 1998 Geoffrey Noer <noer@cygnus.com>
-
- * {fhandler.cc, fhandler.h, hinfo.cc, console.cc}: Rename
- fhandler_tty class to fhandler_serial
-
-Tue Mar 31 16:27:36 1998 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * environ.cc (parse_options): change struct to union to avoid
- references to uninitialized fields.
-
-Thu Mar 26 19:03:00 1998 Eric Bachalo <ebachalo@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * version.h: up CYGWIN_DLL_VERSION_MINOR
-
-Tue Mar 10 15:41:29 1998 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- Beta 19 release made.
-
-Sun Feb 22 23:46:31 1998 Geoffrey Noer <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * environ.cc (parse_options): comment out -- no longer
- compiles with egcs. Will rewrite/enable later.
-
-Sun Feb 22 13:49:10 1998 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * Makefile.in: rename dll to cygwindevo.dll
-
-Sat Feb 21 01:33:56 1998 Geoffrey Noer <noer@cygnus.com>
-
- * cygwin.din: remove dup definition of endpwent
-
-Thu Feb 19 14:20:21 1998 Geoffrey Noer <noer@cygnus.com>
-
- * include/cygwin32/cygwin_dll.h: Correct protection wrapper
-
-Tue Feb 17 20:21:24 1998 Geoffrey Noer <noer@cygnus.com>
-
- * include/Windows32/Structures.h: tagBITMAPFILEHEADER should
- be packed.
-
-Tue Feb 17 19:34:41 1998 Geoffrey Noer <noer@cygnus.com>
-
- 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 <ian@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * Makefile.in: add registry.h to environ.o deps
-
-Mon Feb 9 14:42:24 1998 Ian Lance Taylor <ian@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * include/a.out.h: new coff header file
-
-Wed Feb 4 01:55:18 1998 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <ian@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <ian@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * sigproc.cc (sig_send): lock_pinfo_for_update during this
- function
-
-Fri Jan 16 18:09:59 1998 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <ian@cygnus.com>
-
- * 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 <ian@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * path.cc (symlink): Don't return error if target is a symlink to a
- nonexistent file.
-
-1999-12-23 DJ Delorie <dj@cygnus.com
-
- * Makefile.in: add support for "make check"
- * shared.cc: if $CYGWIN_TESTING is set, use a private shared area
- * cygrun.c: new, used to isolate dll-in-test
- * testsuite/*: new, rudimentary testsuite framework
-
-Wed Dec 22 01:05:44 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (symlink): Return error if the target exists.
-
-Thu Dec 16 22:36:45 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in: Only build winver.o and version.o when required.
-
-Sat Dec 11 11:06:45 1999 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * environ.cc (parse_options): Properly detect end of known array.
-
-Mon Dec 6 22:32:04 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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
- <khan@xraylith.wisc.edu>).
- * configure.in: Find windres.
- * configure: Regenerate.
- * Makefile.in: Link winver.o into cygwin1.dll.
-
-Mon Dec 6 13:04:47 1999 Mumit Khan <khan@xraylith.wisc.edu>
-
- * 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 <cgf@cygnus.com>
-
- * configure.in: Make threadsafe the default.
- * configure: regenerate.
- * utils/strace.cc: Fix a compiler warning.
-
-Sun Dec 5 15:49:43 1999 Christopher Faylor <cgf@cygnus.com>
-
- * environ.cc (parse_options): Reinstate unions in parse_things, to
- save space.
-
-Fri Dec 3 22:52:05 1999 Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * environ.cc (parse_options): switch to a static initializer;
- templates are sensitive to g++ bugs.
-
-Fri Nov 26 12:04:23 1999 Christopher Faylor <cgf@cygnus.com>
-
- * net.cc (cygwin_bind): Ensure that non-Unix domain socket operations
- return success correctly.
-
-Wed Nov 24 21:37:58 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * signal.cc (kill_worker): Guard against NULL dereference when thread
- safe.
-
-Sat Oct 30 00:59:38 1999 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Some general cleanup.
- * smallprint.c (__small_vsprintf): Accommodate new format for
- __PRETTY_FUNCTION__.
-
-Wed Oct 27 16:13:36 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * environ.cc (environ_init): Turn off ntsec by default.
-
-Wed Oct 27 00:14:11 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
-
- * fhandler.cc (fhandler_base::lseek): Take readahead into account.
-
-Tue Oct 26 16:46:54 1999 Christopher Faylor <cgf@cygnus.com>
-
- * syscalls.cc (_unlink): Return EISDIR when attempting to unlink a
- directory.
-
-Mon Oct 25 18:05:23 1999 Christopher Faylor <cgf@cygnus.com>
-
- * fhandler.cc (fhandler_base::read): Fix previous fix.
-
-Mon Oct 25 13:46:44 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * fhandler.cc (fhandler_base::read): Work around C bug.
-
-Tue Oct 19 22:10:21 1999 Christopher Faylor <cgf@cygnus.com>
-
- * dll_init.cc: Add some external symbols to allow thread-safe
- compilation.
-
-Tue Oct 19 21:09:42 1999 Christopher Faylor <cgf@cygnus.com>
-
- 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 <dj@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (mount_info::cygdrive_posix_path): Properly terminate string
- after Oct 11 change below.
-
-Fri Oct 15 23:02:39 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump some versions.
-
-Oct 5 11:45:00 1999 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- 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 <fujieda@jaist.ac.jp>
-
- * path.cc (readlink): Return errno correctly when it can't find the
- target symlink.
-
-Tue Oct 12 13:02:08 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * select.cc (select): Return error if n > FD_SETSIZE. This is a
- temporary fix.
-
-Sun Oct 10 13:56:14 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * path.cc (symlink_check_one): set errno to EINVAL on socket files
- same as normal files.
-
-1999-10-06 DJ Delorie <dj@cygnus.com>
-
- * include/oaidl.h (IDispatch.GetIDsOfNames): Use DISPID* not DISPID
-
-1999-10-06 DJ Delorie <dj@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * hinfo.cc (hinfo::extend): Eliminate inappropriate test for boundary
- condition.
-
-1999-10-04 DJ Delorie <dj@cygnus.com>
-
- * config/i386/longjmp.c: don't restore %fs (Paul Sokolovsky
- <paul-ml@is.lg.ua>)
-
-1999-10-04 DJ Delorie <dj@cygnus.com>
-
- * localtime.c (tzsetwall): Handle Asian Windows strings correctly
- (from Kazuhiro Fujieda <fujieda@jaist.ac.jp>).
-
-Sat Oct 2 23:00:00 1999 Corinna Vinschen <corinna@vinschen.de>
-
- * include/lm*.h: Correct multiple problems in lan manager
- header files.
-
-Sun Oct 3 14:29:53 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <khan@xraylith.wisc.edu>
-
- * 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 <dj@cygnus.com>
-
- * times.cc: declare _timezone and _daylight properly
-
-Wed Sep 29 23:57:40 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <Norbert.Schulze@rhein-neckar.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * syscalls.cc (chown): never return ENOSYS - just pretend it
- works.
-
-Wed Sep 22 00:47:56 1999 Christopher Faylor <cgf@cygnus.com>
-
- * select.cc (MAKEready): Need to initialize 'fd' or open tests in
- peek fail.
-
-Mon Sep 20 17:07:37 1999 Christopher Faylor <cgf@cygnus.com>
-
- * smallprint.c (__small_vsprintf): Fix '%+' handling.
-
-Thu Sep 16 21:48:13 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * exceptions.cc (ctrl_c_handler): Make WINAPI, as required by
- SetConsoleCtrlHandler.
-
-Thu Sep 16 17:48:05 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * dir.cc (rmdir): return ENOTDIR for regular files on 9x
-
-Tue Sep 14 00:01:59 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * syscalls.cc (pathconf): Make first arg 'const'.
-
-1999-09-10 DJ Delorie <dj@cygnus.com>
-
- * exec.cc (_execve): check for an empty environment
-
-Wed Sep 8 10:24:12 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * fhandler.cc (fhandler_base::fhandler_base): Don't use default binmode
- for console.
-
-Wed Sep 1 20:51:05 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * sigproc.cc (sig_send): One more end-of-process race detection.
-
-Mon Aug 23 21:37:07 1999 Christopher Faylor <cgf@cygnus.com>
-
- 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 <dj@envy.delorie.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * 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 <cgf@cygnus.com>
-
- * sigproc.cc: Add more precise end-of-process detection.
-
-Wed Aug 18 00:03:47 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * localtime.c (tzsetwall): Deduce TZ more accurately.
-
-Tue Aug 17 18:00:03 1999 Christopher Faylor <cgf@cygnus.com>
-
- * select.cc (peek_pipe): Correct detection of process group for
- backgrounded processes.
-
-Tue Aug 17 10:24:49 1999 Christopher Faylor <cgf@cygnus.com>
-
- * include/winnt.h: Fix typo in IMAGE_FIRST_SECTION definition.
-
-Sun Aug 15 19:11:49 1999 Mumit Khan <khan@xraylith.wisc.edu>
-
- * gcrt0.c (__eprol): Avoid namespace pollution.
- (_monstartup): Turn into a constructor function and prevent multiple
- invocations.
-
-Mon Aug 16 10:03:00 Corinna Vinschen <corinna@vinschen.de>
-
- * utils/mkgroup.c: Correct call to LookupAccountSid for retrieval of
- 'None'.
-
-Mon Aug 16 00:24:29 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * select.cc (peek_pipe): Honor ignra argument.
-
-Fri Aug 13 00:45:00 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * sigproc.cc (getsem): Fix typo which prevented sending signals to
- other processes.
-
-Wed Aug 11 22:06:33 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <sos@prospect.com.ru>
-
- * 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 <sys/un.h>
- (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 <corinna@vinschen.de>
-
- * utils/mkgroup.c (main): Generate "None" group when
- invoked via mkgroup -l.
-
-Tue Aug 10 21:30:31 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * psapi.h: New file.
-
-Thu Aug 4 10:28:00 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * a.out.h: Fix cut and paste from mime email typos.
-
-Mon Aug 2 19:08:48 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * dcrt0.cc (do_global_ctors): Remove previous change. It was just
- wrong.
-
-Sun Aug 1 23:21:28 1999 Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * net.cc (get_ifconf): Use alloca for temporary buffer.
-
-Sun Aug 1 01:38:20 1999 Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- Patch from Egor Duda <deo@logos-m.ru>:
- * 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 <bernds@cygnus.co.uk>
-
- * 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 <cgf@cygnus.com>
-
- * 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
- <andrewd@axonet.com.au>.
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * security.cc: Various changes from Corinna.
-
-Sat Jul 17 22:33:45 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * debug.h: Fix ForceCloseHandle1 in non-debug case.
-
-Fri Jul 16 23:47:31 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <deo@logos-m.ru>) 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 <corinna@vinschen.de>
-
- * security.cc (alloc_sd): Delete special handling of uid/gid 513.
-
-Thu Jul 13 15:01:00 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * cygwin.din: Export new snprintf and vnsprintf functions courtesy of
- Egor Duda <deo@logos-m.ru>.
-
-Sun Jul 4 23:54:43 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * autoload.h: New file.
-
-Thu Jul 1 23:16:34 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <noer@cygnus.com>
-
- * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 13.
-
-Wed Jun 23 10:39:07 1999 Mumit Khan <khan@xraylith.wisc.edu>
-
- * 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 <cgf@cygnus.com>
-
- 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
- <deo@logos-m.ru>.
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * utils/Makefile.in: Consolidate and simplify.
-
-Mon Jun 14 12:43:32 1999 Christopher Faylor <cgf@cygnus.com>
-
- 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * mkvers.sh: Issue error if can't find version information.
-
-1999-06-09 DJ Delorie <dj@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * fhandler_tty.cc (fhandler_tty_slave::open): Reorganize
- slightly to avoid a race with get_ttyp()->was_opened.
-
-1999-06-04 DJ Delorie <dj@cygnus.com>
-
- * times.cc (totimeval): scale sub properly.
- (gettimeofday): don't bias by timezone.
-
-Thu Jun 3 13:24:17 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * utils/mkpasswd.c (main): account for long int args to printfs.
-
-Wed Jun 2 16:08:08 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- 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 <keiths@cygnus.com>
-
- * errno.cc (errmap): Map ERROR_NEGATIVE_SEEK to EINVAL.
-
-Fri May 28 21:43:56 1999 Christopher Faylor <cgf@cygnus.com>
-
- * times.cc (to_time_t): Rewrite slightly to avoid compiler
- overoptimization.
-
-Fri May 28 21:10:33 1999 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * security.cc: Special handling for user and/or administrators
- permissions to write (extended) attributes.
-
-Mon May 24 22:10:34 1999 Corinna Vinschen <corinna@vinschen.de>
-
- * security.cc: Don't allow 513(none) as user or group.
-
-Mon May 24 22:10:34 1999 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/rapi.h: Add some more definitions.
-
-Sat May 22 21:45:01 1999 Mumit Khan <khan@xraylith.wisc.edu>
-
- * 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 <khan@xraylith.wisc.edu>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * sysdef/rapi.def: New definition file for RAPI.DLL.
- * include/rapi.h: Preliminary RAPI declarations.
-
-Sun May 16 15:37:15 1999 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Remove more obsolete code.
-
-Fri May 14 19:30:53 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <Norbert.Schulze@rhein-neckar.de>
-
- * times.cc (timezone): Properly adjust for daylight savings time.
- (gettimeofday): Ditto.
- (localtime): Ditto.
- (tzset): Ditto.
-
-Mon May 10 23:31:36 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in: Forgot to remove a reference to the deleted targets
- below.
-
-Fri May 7 17:28:12 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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
- <anorland@hem2.passagen.se>.
-
-Tue May 4 22:20:05 1999 Christopher Faylor <cgf@cygnus.com>
-
- * include/winnt.h: Fix CONTEXT pointer typedefs.
-
-Mon May 3 11:32:32 1999 Mumit Khan <khan@xraylith.wisc.edu>
-
- * 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 <khan@xraylith.wisc.edu>
-
- * utils/Makefile.in (EXE_LDFLAGS): Provide default.
-
-1999-04-30 DJ Delorie <dj@cygnus.com>
-
- * 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 <khan@xraylith.wisc.edu>
-
- * 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 <khan@xraylith.wisc.edu>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * winsup.h: Always clear memory in thread .create method or
- suffer uninitialized pointers, etc.
-
-Wed Apr 21 03:56:54 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 12.
-
-Sat Apr 17 15:35:34 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (mount_info::conv_to_win32_path): Reorganize to
- correctly handle //x syntax.
-
-Tue Mar 30 14:42:05 1999 Christopher Faylor <cgf@cygnus.com>
-
- * strace.cc (strace_vsprintf): Fix incorrect buffer reference.
-
-Mon Mar 29 22:46:16 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna.vinschen@cityweb.de>
-
- * utils/passwd.c (GetPW): Correct cast in call to `NetUserGetInfo'.
-
-Sun Mar 28 16:54:57 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna.vinschen@cityweb.de>
-
- * 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 <corinna.vinschen@cityweb.de>
-
- * 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 <cgf@cygnus.com>
-
- * signal.cc (pause): Make sure that signal has been dispatched
- prior to pause returning.
-
-Wed Mar 24 20:04:21 1999 Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * exceptions.cc (call_handler): Reorder to work around
- gcc bug.
-
-Sun Mar 21 21:26:43 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * include/winbase.h: Fix AllocateAndInitializeSid proto.
-
-Tue Mar 16 21:55:12 1999 Christopher Faylor <cgf@cygnus.com>
-
- * exceptions.cc (handle_exceptions): Always wait for sig_send
- to exit or races can result.
-
-Tue Mar 16 13:04:34 1999 Geoffrey Noer <noer@cygnus.com>
-
- * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 11.
-
-Tue Mar 16 15:44:10 1999 Christopher Faylor <cgf@cygnus.com>
-
- * cygwin.din: Export telldir/seekdir.
-
-Tue Mar 16 13:50:51 1999 Corinna Vinschen <corinna.vinschen@cityweb.de>
-
- * 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 <noer@cygnus.com>
-
- * sysdef/comctl32.def: Add InitCommonControlsEx.
-
-Mon Mar 15 19:45:10 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * 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 <jjohnstn@cygnus.com>
-
- * cygwin.din: Added references to new fast-math routines.
-
-Wed Mar 10 19:22:46 1999 Geoffrey Noer <noer@cygnus.com>
-
- * include/commdlg.h: Add missing PageSetupDlg defines.
-
-Tue Mar 9 14:28:14 1999 Geoffrey Noer <noer@cygnus.com>
-
- * include/*.h: Switch Win32 API header file set to the one written
- by Anders Norlander <anorland@hem2.passagen.se>. 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/Windows32/Functions.h: Correct two #ifndefs that were
- switched.
-
-Mon Feb 15 22:41:54 1999 Christopher Faylor <cgf@cygnus.com>
-
- * spawn.cc (spawn_guts): Fix incorrect arg length when
- constructing new arguments for #!.
-
-Fri Feb 12 13:25:50 1999 Drew Moseley <dmoseley@cygnus.com>
-
- * Makefile.in (install-info): Test for file existence before installing.
-
-Fri Feb 12 13:17:49 1999 Corinna Vinschen <corinna.vinschen@cityweb.de>
-
- * 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 <dj@cygnus.com>
-
- * doc/doctool.c (scan_directory): check for opendir failing,
- add closedir.
-
-Tue Feb 9 13:02:25 1999 Geoffrey Noer <noer@cygnus.com>
-
- * utils/mount.cc: Add fixme.
- * doc/doctool.c: Correct typo in comment.
-
-Mon Feb 8 17:29:58 1999 Christopher Faylor <cgf@cygnus.com>
-
- * include/Windows32/UnicodeFunctions.h: Fix incorrect use of
- BOOL -> WINBOOL.
- * Windows32/ASCIIFunctions.h: Ditto.
-
-Fri Feb 5 09:38:25 1999 Christopher Faylor <cgf@cygnus.com>
-
- * path.cc (mount_info::add_item): Ensure that drive names
- are added using X: notation.
-
-Thu Feb 4 00:28:58 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * cygwin.din: Remove DATA attribute which was erroneously
- added to __errno.
-
-Tue Feb 2 23:10:18 1999 Geoffrey Noer <noer@cygnus.com>
-
- * path.cc: Fix comment regarding UNC paths in mount table.
- (mount_info::conv_to_win32_path): Add back code to handle
- //<drive> 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 //<drive>
- 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 <noer@cygnus.com>
-
- * include/lmaccess.h: Add stub.
- * include/shlobj.h: Add stub.
-
-Tue Feb 2 22:34:06 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <brendan@cygnus.com>
-
- * Makefile.in (readme.txt): Add missing -I$(srcdir)/doc.
-
-Tue Feb 2 01:10:31 1999 Geoffrey Noer <noer@cygnus.com>
-
- * sysdef/*: Replace all files with new ones by Anders
- Norlander <anorland@hem2.passagen.se>. Please read sysdef/README
- for more information.
-
-Mon Feb 1 14:55:11 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <corinna.vinschen@cityweb.de>
-
- * 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 <cgf@cygnus.com>
-
- * dir.cc (rmdir): Correct errno setting when attempting to rmdir
- a non-directory.
-
-Tue Jan 26 17:36:12 1999 Geoffrey Noer <noer@cygnus.com>
-
- * registry.cc (reg_key::build_reg): Add FIXME.
-
-Tue Jan 26 01:30:48 1999 Geoffrey Noer <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <noer@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * spawn.cc (spawn_guts): Arg 2 missing from special case
- command/cmd handling.
-
-Fri Jan 22 22:40:32 1998 Corinna Vinschen <corinna.vinsche@cityweb.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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
- <drive letter>: or if posix path doesn't start with a slash.
-
-Wed Jan 20 19:06:30 1999 Geoffrey Noer <noer@cygnus.com>
-
- * fhandler_raw.cc: Correct copyright date, reformat.
- * fhandler_floppy.cc: Ditto.
- * fhandler_tape.cc: Ditto.
-
-Wed Jan 20 17:54:02 1999 Geoffrey Noer <noer@cygnus.com>
-
- Remove //<drive>/ support. Add support for automounts in
- user registry area.
- * path.cc: Rewrite, reformat docs at top in light of removing
- //<drive>/ 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 //<drive>/ 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 "<letter>:".
- (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 <dj@cygnus.com>
-
- * 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 <corinna.vinschen@cityweb.de>
-
- [applied by DJ Delorie <dj@cygnus.com>]
-
- * 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 <rdparker@butlermfg.org>
- * 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 <noer@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * fhandler.cc (raw_write): check for disk full.
-
-Fri Jan 15 11:18:23 1999 DJ Delorie <dj@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * dll_init.cc: Add missing FIXME in comment.
- * fhandler_console: Ditto.
-
-Thu Jan 14 00:53:25 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * errno.cc (_sys_errlist): Add "extern" to work around new gcc
- restrictions.
-
-Mon Jan 11 14:56:27 1999 Christopher Faylor <cgf@cygnus.com>
-
- * spawn.cc (spawn_guts): Fix problem with #! and relative
- directories.
-
-Mon Jan 11 09:00:29 1999 Christopher Faylor <cgf@cygnus.com>
-
- * fhandler_console.cc (fhandler_console::read1): Handle EOF as a
- specific case.
-
-Sun Jan 10 23:44:22 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- patch from Corinna Vinschen <corinna.vinschen@cityweb.de>:
- * 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 <cgf@cygnus.com>
-
- * fhandler.cc (fhandler_base::set_name): Fix bug which
- disallowed '%' in a file name.
-
-Thu Jan 7 00:21:41 1999 Geoffrey Noer <noer@cygnus.com>
-
- * path.cc: Add comments.
- * path.h: Correct file description comment.
-
-Tue Jan 5 16:07:15 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <noer@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * select.cc (peek_console): Remove #if 0 around NT code workaround.
-
-Sat Jan 2 00:04:01 1999 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump DLL minor version number to 8.
-
-Wed Dec 20 13:37:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * exceptions.cc (reset_signal_arrived): Make global to avoid inlining.
-
-Wed Dec 20 00:57:10 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * syscalls.cc (remove): New function, overriding the newlib
- implementation.
-
-Tue Dec 19 16:26:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <townba@pobox.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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
- <esc>[.
-
-Tue Dec 5 17:06:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * include/sysexits: New file.
-
-2000-12-09 Egor Duda <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <tailbert@yahoo.com>
-
- * cygwin.din: Declare strtok_r for the import lib. Already in the DLL.
-
-Wed Dec 6 15:39:18 2000 Earnie Boyd <earnie_boyd@yahoo.com>
-
- * include/sys/uio.h (readv): Correct prototype.
- (writev): Ditto.
-
-Tue Dec 5 17:06:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * include/sys/uio.h: Include <sys/cdefs.h>. Use __BEGIN_DECL and
- __END_DECL.
- Add declarations for `readv' and `writev'.
-
-Mon Dec 4 20:49:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in: Remove some extra cruft.
-
-Sun Dec 3 00:13:26 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * net.cc (get_inet_addr ): Close AF_UNIX socket file after reading.
-
-Wed Nov 29 18:25:53 2000 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
-
- * cygheap.cc (chgheap_root::operator =): Check root dir properly.
-
-Thu Nov 29 18:11:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <kelley.cook@home.com>
-
- * mmap.cc (munmap): Check that mmap and munmap length match.
-
-Tue Nov 28 18:08:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump DLL minor version number to 7.
-
-Sat Nov 25 11:27:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * include/cygwin/version.h: Bump minor API version due to adding
- inet_aton.
-
-Sat Nov 25 11:07:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in: new-temp.a -> new-templib.a
-
-Mon Nov 20 17:04:43 2000 Christopher Faylor <cgf@cygnus.com>
-
- * spawn.cc (spawn_guts): Quoting was still wrong. Keep trying to
- fix it.
-
-Mon Nov 20 14:26:38 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * syslog.cc (syslog): Add users SID to NT syslog entry.
-
-Thu Nov 16 15:59:58 2000 Bradley A. Town <townba@pobox.com>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in: Make import library creation 'make -j2' friendly.
-
-Thu Nov 16 10:28:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * spawn.cc (spawn_guts): Revert patch to ignore chroot settings
- on creating native Win32 environment.
-
-Wed Nov 15 01:44:37 2000 Christopher Faylor <cgf@cygnus.com>
-
- * fork.cc (slow_pid_reuse): Off-by-one.
-
-Wed Nov 15 01:20:24 2000 Christopher Faylor <cgf@cygnus.com>
-
- 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 <corinna@vinschen.de>
-
- * 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 <efifer@dircon.co.uk>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (get_device_number): Allow /dev/ttySn to designate a com
- port.
-
-Sat Nov 11 23:55:19 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <townba@pobox.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * select.cc (peek_pipe): Deal with pending newline in pty_master.
-
-Wed Nov 8 15:35:32 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <jt@dothill.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <jt@dothill.com>
-
- * 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 <jt@dothill.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * pinfo (wait_subproc): Son of neverending debug tweaking.
-
-Sun Nov 5 11:45:15 2000 Christopher Faylor <cgf@cygnus.com>
-
- * pinfo (wait_subproc): Neverending debug tweaking.
-
-Sun Nov 5 01:34:51 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * exceptions.cc (handle_sigsuspend): Record frame here for signalling.
- (set_process_mask): Ditto.
-
-Sat Nov 4 14:24:10 2000 Christopher Faylor <cgf@cygnus.com>
-
- * sigproc.cc (wait_subproc): Still more debugging cleanup.
-
-Sat Nov 4 00:51:38 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * sigproc.cc (wait_subproc): Refine debug output.
-
-Thu Nov 2 23:01:20 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * ntdll.h: Remove IO_COUNTERS definition since it is now in winnt.h.
-
-Thu Nov 2 00:10:23 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (_readlink): Return ENOENT when file does not exist.
-
-Tue Oct 31 23:35:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * fhandler.h (fhandler_dev_raw): Add method `fixup_after_exec'.
-
-Tue Oct 31 22:39:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * signal.cc (kill_pgrp): Revert 25-Oct change.
- (kill_worker): Ditto.
-
-Sun Oct 29 20:52:31 2000 Christopher Faylor <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump DLL minor version number to 6.
-
-Sat Oct 28 01:39:53 2000 Christopher Faylor <cgf@cygnus.com>
-
- * configure.in: Eliminate subdir stuff.
- * configure: Regenerate.
- * include/getopt.h (option): Make name field 'const'.
-
-Fri Oct 27 20:51:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * sigproc.cc (wait_sig): Add braces to avoid confusion.
-
-Fri Oct 27 11:48:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * dcrt0.cc (do_exit): Remove debugging statement.
-
-Tue Oct 24 23:45:09 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * fhandler.cc (fhandler_base::fcntl): Setting flags in F_SETFL
- branch according to Linux documentation.
-
-Mon Oct 23 21:43:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * sigproc.cc (proc_subproc): Correctly handle flags for WNOHANG case.
-
-Mon Oct 23 10:00:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * security.cc: Eliminate C++ comments throughout.
-
-Sun Oct 22 23:33:00 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * pinfo.cc (pinfo::init): Make PID_EXECED signal creation as well as
- PID_IN_USE.
-
-Sat Oct 21 01:52:54 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@redhat.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@redhat.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@redhat.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@redhat.com>).
-
-Tue Oct 17 14:50:31 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cwilson@ece.gatech.edu>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (cwdstuff::get): Set EINVAL when length is zero.
-
-Mon Oct 9 14:07:04 2000 Christopher Faylor <cgf@cygnus.com>
-
- * path.cc (mount_info::cygdrive_posix_path): Handle e:foo construction
- correctly.
-
-Mon Oct 9 16:44:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * fhandler_mem.cc (fhandler_dev_mem::fhandler_dev_mem):
- Fix debug output.
-
-Mon Oct 9 15:58:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * include/sys/mman.h: Add missing MAP_FAILED macro.
-
-Wed Oct 4 18:48:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * signal.cc (sigaction): Allow new action == oldaction.
-
-Mon Oct 2 11:05:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * fhandler_mem.cc: Load ntdll functions via autoload method.
- (load_ntdll_funcs): Eliminated.
-
-Sun Oct 1 16:36:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * fhandler_mem.cc (load_ntdll_funcs): Add missing __stdcall qualifiers.
-
-Sun Oct 1 22:20:39 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * spawn.cc (spawn_guts): Attempt to accommodate archaic windows quoting
- mechanism when dealing with '\' and '"'.
-
-Mon Sep 25 20:47:04 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * spawn.cc (spawn_guts): Use actual program argument passed in for
- argv[0] as originally suggested by Kazuhiro Fujieda
- <fujieda@jaist.ac.jp>.
-
-Mon Sep 18 23:17:19 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * 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 <cgf@cygnus.com>
-
- * exceptions.cc (interruptible): Return 0 if given an address in
- uncommitted memory.
-
-2000-09-16 Egor Duda <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * spawn.cc (spawn_guts): Ensure that argv[0] is correctly set to the
- full path when a script is detected. Suggested by Kazuhiro Fujieda
- <fujieda@jaist.ac.jp>.
-
-Tue Sep 12 22:33:30 2000 Christopher Faylor <cgf@cygnus.com>
-
- * external.cc (fillout_pinfo): Handle explicit pids correctly.
-
-Tue Sep 12 14:37:32 2000 Christopher Faylor <cgf@cygnus.com>
-
- * path.cc (normalize_posix_path): Fix more slashdot madness.
-
-Tue Sep 12 12:29:29 2000 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Make clean target remove *.d.
-
-Mon Sep 11 13:19:15 2000 Christopher Faylor <cgf@cygnus.com>
-
- * path.cc (normalize_posix_path): Correctly deal with a "." parameter.
-
-Sun Sep 10 20:23:35 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * lib/_cygwin_crt0_common.cc: Add missing header files.
-
-Thu Sep 7 23:07:21 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in (CFLAGS): Ensure that -MD is always added even when
- CFLAGS is overwritten.
-
-Wed Sep 6 02:40:12 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (readlink): 'max' should be a 'min' or we'll suffer
- buffer overflow.
-
-Mon Sep 4 22:53:58 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <deo@logos-m.ru>
-
- * Makefile.in: Remove "make check" support. It is now in
- winsup/Makefile.in.
-
-Fri Sep 1 21:17:03 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * errno.cc (set_errno_from_win_error): Actually use arguments to
- strace_printf.
-
-2000-08-30 DJ Delorie <dj@redhat.com>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * exec.cc (_execve): Change definition according to declaration in
- newlib/libc/include/sys/unistd.h.
-
-Thu Aug 24 22:17:19 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * debug.h: Allow some debug defines for use in header files.
-
-Wed Aug 23 23:00:24 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/sys/cygwin.h: Protect class definitions.
-
-Tue Aug 22 13:57:36 2000 Christopher Faylor <cgf@cygnus.com>
-
- * path.cc (symlink_info::check): Clear error on each iteration of
- extension check.
-
-Tue Aug 22 11:23:59 2000 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Don't include '.d' file if there are none generated yet.
-
-Tue Aug 22 11:08:11 2000 Christopher Faylor <cgf@cygnus.com>
-
- * include/sys/cygwin.h: Declare some thread classes.
- * include/mntent.h: Avoid declaring functions.
-
-Tue Aug 22 01:08:01 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * path.cc (normalize_posix_path): Correct check for trailing /.
-
-2000-08-21 DJ Delorie <dj@redhat.com>
-
- * include/cygwin/cygwin_dll.h (DECLARE_CYGWIN_DLL): hinstance,
- not handle.
-
-Fri Aug 18 11:11:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * dtable.cc (dtable::dup2): Extend fdtab if newfd is out of current
- allocated bounds.
-
-Sat Aug 12 01:47:28 2000 Christopher Faylor <cgf@cygnus.com>
-
- * mkvers.sh: Properly trap exit removal of temp file. Remove debugging
- statement.
-
-Sat Aug 12 01:37:56 2000 Christopher Faylor <cgf@cygnus.com>
-
- * poll.cc: Make winsup.h the first include file, re 2000-08-02 change.
-
-Sat Aug 12 01:33:12 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in: Use dtable.o rather than hinfo.o.
-
-Sat Aug 12 00:47:11 2000 Christopher Faylor <cgf@cygnus.com>
-
- Rename hinfo -> dtable. Name the former dtable array 'fdtab'.
-
-Fri Aug 11 14:47:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * poll.cc: Allow any descriptor and any number of descriptors.
- Allocate fd_set struct sdynamically.
-
-Fri Aug 11 14:47:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <bwilson@tensilica.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/cygwin/cygwin_dll.h: Remove extraneous (and incorrect)
- declarations.
-
-Fri Aug 4 00:00:46 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * regexp/regexp.c: Add winsup.h.
-
-2000-08-02 DJ Delorie <dj@redhat.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/sys/strace.h: Fix strace definition.
-
-Tue Aug 1 23:37:08 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * include/cygwin/version.h: Update minor version for cygdrive changes
- below.
-
-Sat Jul 29 11:59:29 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <jt@dothill.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump DLL minor version number to 4.
-
-2000-07-27 DJ Delorie <dj@redhat.com>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <corinna@vinschen.de>
-
- * security.cc (lookup_name): Search on local machine first if
- myself->domain is not empty.
-
-2000-07-26 DJ Delorie <dj@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * syscalls.cc (statfs): Use path_conv method to convert input path.
-
-Tue Jul 25 21:40:51 2000 Christopher Faylor <cgf@cygnus.com>
-
- * syscalls.cc (_link): Avoid extraneous call to
- cygwin_conv_to_win32_path.
-
-Tue Jul 25 21:11:15 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * syscalls.cc (_link): Corrected previous patch.
-
-Mon Jul 24 13:26:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * fhandler.h: Add comment.
-
-Sun Jul 23 20:00:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- Patch suggested by Kazuhiro Fujieda <fujieda@jaist.ac.jp>.
- * 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 <corinna@vinschen.de>
-
- * spawn.cc (span_guts): Retrieve security attributes before setting
- psid to NULL.
-
-Fri Jul 21 12:03:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * dll_init.cc (dll_list::alloc): Fix debugging output.
-
-Mon Jul 17 14:57:53 2000 Christopher Faylor <cgf@cygnus.com>
-
- 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 <corinna@vinschen.de>
-
- Patch suggested by Eric Fifer <EFifer@sanwaint.com>
- * poll.cc (poll): Fix erroneous negations.
-
-Mon Jul 17 17:56:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * environ.cc (setenv): Use __cygwin_environ instead of
- environ after reallocating environment space.
-
-Sun Jul 16 20:23:21 2000 Christopher Faylor <cgf@cygnus.com>
-
- * _cygwin_crt0_common.cc: Undef 'environ' or suffer compiler error.
-
-Sun Jul 16 16:03:00 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * spawn.cc (spawn_guts): Use \ for quoting '"'.
- * dcrt0.cc (quoted): Understand \ quoting for '"'.
-
-Sun Jul 16 00:32:58 2000 Christopher Faylor <cgf@cygnus.com>
-
- * dcrt0.cc (build_argv): Strip quotes from argv[0] since it should
- never be globified.
-
-Sat Jul 15 00:32:41 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * lib/_cygwin_crt0_common.cc (_cygwin_crt0_common): Don't reset
- environ if already set.
-
-Mon Jul 10 19:07:03 2000 Christopher Faylor <cgf@cygnus.com>
-
- * fhandler_console.cc (fhandler_console::read): Unicode interface
- to ReadConsoleInput only exists on W2K, so use workaround from
- Kazuhiro Fujieda <fujieda@jaist.ac.jp>.
-
-Mon Jul 10 11:30:00 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * include/sys/cygwin.h: Hide internal data types in per_process
- when not __INSIDE_CYGWIN__.
-
-Wed Jul 5 18:56:58 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <egorovv@mailandnews.com>
-
- * 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 <corinna@vinschen.de>
-
- * poll.cc (poll): Zero out `open_fds' as well.
-
-Mon Jul 4 1:22:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * include/cygwin/version.h: Bump API minor version to 24.
-
-2000-07-04 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
-
- * security.cc (read_sd): Eliminate OemToChar.
-
-Mon Jul 4 18:57:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * uinfo.cc (uinfo_init): Eliminate calls to read_etc_group()
- and read_etc_passwd().
-
-2000-06-28 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
-
- * 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 <cgf@cygnus.com>
-
- * binmode.c (cygwin_premain0): Fix erroneous clearing of bit.
- * textmode.c (cygwin_premain0): Ditto.
-
-Sat Jul 1 00:24:04 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * windows.cc (setitimer): Round up when < 1000 usecs.
-
-Mon Jun 26 17:34:54 2000 Christopher Faylor <cgf@cygnus.com>
-
- * hinfo.cc (hinfo::dup2): Eliminate compiler warning.
-
-Mon Jun 26 11:25:29 2000 Christopher Faylor <cgf@cygnus.com>
-
- * hinfo.cc (hinfo::dup2): Guard against out of bounds newfd.
-
-Sat Jun 24 23:43:06 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * shared.cc (shared_info::initialize): Improve error message clarity.
- * mkvers.sh: Eliminate debugging output.
-
-Thu Jun 22 17:50:59 2000 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Autogenerate cygwin.def when appropriate.
- * include/sys/cygwin.h: Correct prototype.
-
-Thu Jun 22 17:05:04 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in: Add new-libcygwin.a back to all_host target.
-
-Wed Jun 21 14:32:42 2000 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Add *.def to clean operation.
-
-Wed Jun 21 13:18:23 2000 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Add *.exe to clean operation.
-
-Wed Jun 21 01:02:38 2000 Christopher Faylor <cgf@cygnus.com>
-
- * mkvers.sh: Fix sed usage for older seds.
-
-Tue Jun 20 20:46:28 2000 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Don't touch winver_stamp if mkvers.sh was unsuccessful.
-
-Tue Jun 20 17:41:30 2000 Christopher Faylor <cgf@cygnus.com>
-
- * mkvers.sh: Fix problem with handling of CVS tags causing .rc syntax
- errors.
-
-Tue Jun 20 13:38:12 2000 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Change to build the DLL during a cross-compiler build.
-
-Mon Jun 19 20:46:33 2000 Christopher Faylor <cgf@cygnus.com>
-
- * select.cc (socket_cleanup): Shutdown I/O on dummy sockets prior to
- closing them.
-
-Mon Jun 19 19:35:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * winsup.h (isabspath): Don't report `C:foo' as an absolute path.
-
-Sat Jun 17 13:51:48 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * pinfo.cc (pinfo_init): Revert previous patch.
-
-Sat Jun 17 13:29:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (normalize_posix_path): Convert path to POSIX if it seems to
- be a Windows path.
-
-2000-06-15 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * fhandler_random.cc (read): Call CryptAquireContext with
- CRYPT_VERIFYCONTEXT.
-
-Thu Jun 8 22:49:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * path.cc (path_conv::check): Erase two lines checked in
- by mistake.
-
-Thu Jun 8 15:53:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * fhandler.cc (fhandler_disk_file::open): Check for directory
- to set O_DIROPEN on directories anyway.
-
-2000-06-07 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
-
- * 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 <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump DLL minor version number to 3.
-
-2000-06-07 DJ Delorie <dj@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * include/netinet/in_systm.h: New file.
- * include/cygwin/in_systm.h: Ditto.
-
-Thu Jun 1 01:55:45 2000 Christopher Faylor <cgf@cygnus.com>
-
- * exceptions.cc: Remove unneeded include.
- * dcrt0.cc: Wrap LoadDLLfunc stuff in dummy function.
- * init.cc: Ditto.
- * uinfo.cc: Ditto.
-
-2000-05-31 DJ Delorie <dj@cygnus.com>
-
- * include/cygwin/version.h: use decimal, NOT octal
-
-Wed May 31 16:40:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * dcrt0.cc: Use LoadDLLfuncEx for loading Crypto API functions
- with parameter `notimp' set to 1.
-
-Tue May 30 16:58:33 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * errno.cc (errmap): Map ERROR_BAD_NET_NAME to errno ENOSHARE.
-
-Fri May 26 02:23:35 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * dir.cc (rmdir): Use file attributes that have already been discovered
- by path_conv.
-
-2000-05-25 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
-
- * dir.cc (rmdir): Correct the manner in checking the target directory.
-
-Wed May 24 21:59:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <dj@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * dir.cc (writable_directory): handle root directories
-
-Tue May 23 10:09:26 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * environ.cc (regopt): Scan HKLM if HKCU scan fails.
-
-Mon May 16 23:39:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * syscalls.cc (setmode): change mode of any matching FILE* also.
-
-Thu May 18 17:28:19 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * sigproc.h (sigframe): Don't set frame info unless tid matches this
- thread id.
-
-Wed May 17 23:13:32 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * testsuite/winsup.api/crlf.c: New
- * testsuite/winsup.api/iospeed.c: New
-
-Wed May 17 01:05:52 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- Patch suggested by John Rowley <wjr@bgs.ac.uk>
- * fhandler_tape.cc (fhandler_dev_tape::ioctl): Check
- for filemark feature on MTWEOF operation.
-
-Tue May 16 11:49:13 2000 Christopher Faylor <cgf@cygnus.com>
-
- * include/cygwin/in.h (AF_INET6): Use correct in6_addr struct.
-
-Mon May 15 00:35:35 2000 Christopher Faylor <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump DLL minor version number to 2.
-
-Sun May 14 23:41:24 2000 Christopher Faylor <cgf@cygnus.com>
-
- * shared.h: Bump PROC_MAGIC.
- * include/cygwin/version.h: Bump API minor to accommodate two recent
- exports.
-
-2000-05-13 Mumit Khan <khan@xraylith.wisc.edu>
-
- * include/cygwin/socket.h (AF_INET6): Use same value as winsock2.
-
-2000-05-12 Mumit Khan <khan@xraylith.wisc.edu>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <khan@xraylith.wisc.edu>
-
- * mmap.cc (list::erase): Increment loop counter.
- (map::erase): Likewise.
-
-Thu May 11 00:54:00 2000 Charles Wilson <cwilson@ece.gatech.edu>
-
- * cygwin.din: insure that regsub() is included in
- cygwin1.dll
-
-Tue May 9 18:59:41 2000 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Use appropriate VARIABLE to refer to cygwin.def in load
- line.
-
-Thu May 9 23:53:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * fhandler.cc (fhandler_base::puts_readahead): Change
- while condition to disallow wild runs.
-
-Thu May 9 15:24:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- Patch suggested by <lha@stacken.kth.se>
- * window.cc (setitimer): Check for overflow condition
- in tv_sec.
-
-Thu May 9 0:47:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- Patch suggested by Eric Fifer <EFifer@sanwaint.com>
- * errno.cc: Change mapping of ERROR_BAD_PATHNAME to ENOENT.
-
-Thu May 9 0:47:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * path.cc (symlink::info): Treat non readable files
- as normal non symlink files.
-
-2000-05-08 Paul K. Fisher <pfisher@plexware.com>
-
- * include/pthread.h (pthread_detach): Add missing prototype.
- (pthread_join): same.
-
-2000-05-08 DJ Delorie <dj@cygnus.com>
-
- * fhandler.cc (lock): use signed math to allow checking ranges
- properly.
-
-Sat May 6 23:22:25 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <khan@xraylith.wisc.edu>
-
- * include/wchar.h (wcscmp, wcslen): Fix prototypes.
- * syscalls.cc (wcslen, wcscmp): Adjust.
-
-Fri May 5 23:32:07 2000 Christopher Faylor <cgf@cygnus.com>
-
- * errno.cc (errmap): Correct DIRECTORY mapping to ENOTDIR.
-
-2000-05-04 Mumit Khan <khan@xraylith.wisc.edu>
-
- * Makefile.in (install): Install profile startup and library.
-
-Wed May 3 21:54:11 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <wincrypt.h>.
-
-2000-05-02 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * Makefile.in (install): install regexp.h
-
-Wed Apr 26 16:20:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * syscalls.cc (stat_worker): Previous patch could succeed
- in stating a non-existant file.
-
-Wed Apr 26 01:07:16 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * syscalls.cc (stat_worker): Previous patch failed to stat
- each drives root dir on 9X.
-
-Thu Apr 25 16:37:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * net.cc: Avoid a warning in declaration inet_network.
-
-Mon Apr 24 17:38:25 2000 Thorsten Otto <t.otto@germanynet.de>
-
- * 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 <egorovv@mailandnews.com>
-
- * net.cc (cygwin_inet_network): new function.
- * cygwin.din (inet_network): new export
-
-Fri Apr 21 10:37:08 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * exceptions.cc (handle_exceptions): Search further for stack info to
- accommodate Windows 95.
-
-Thu Apr 20 16:39:18 2000 Christopher Faylor <cgf@cygnus.com>
-
- * path.cc (normalize_posix_path): Previous change failed to take root
- access into account.
-
-Thu Apr 20 11:26:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * syscalls.cc (_link): Check new link path for trailing dot.
-
-Thu Apr 20 00:32:03 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * uinfo.cc (internal_getlogin): Use NetGetDCName() instead
- of NetGetAnyDCName().
-
-Mon Apr 17 12:08:47 2000 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
-
- * syscalls.cc (_rename): Try MoveFile() at first before
- MoveFileEx(..., MOVEFILE_REPLACE_EXISTING).
-
-Tue Apr 18 19:15:29 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * include/cygwin/version.h: Bump minor api to reflect export change.
-
-Thu Apr 13 8:48:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * syscalls.cc (chown_worker): Use previous uid/gid if
- new uid/gid is -1.
-
-Fry Mar 31 22:55:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * syscalls.cc (stat_worker): Set st_nlink to 1 on remote drives.
-
-Sat Mar 18 23:04:27 2000 Christopher Faylor <cgf@cygnus.com>
-
- * times.cc: Fix extern declarations for variables that are exported but
- used by this modules.
-
-Sat Mar 18 01:32:04 2000 Christopher Faylor <cgf@cygnus.com>
-
- * dcrt0.cc (host_dependent_constants::init): Eliminate DELETE flag
- from shared constant.
-
-Sat Mar 18 01:24:25 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- Patch suggested by Eric Fifer <EFifer@sanwaint.com>
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * errno.cc: Map ERROR_NOACCESS to EFAULT.
-
-Wed Mar 15 14:25:38 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- Pipe changes throughout suggested by Eric Fifer <EFifer@sanwaint.com>
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * sigproc.cc: Set wait_sig priority to normal.
-
-Fri Mar 10 13:03:06 2000 Christopher Faylor <cgf@cygnus.com>
-
- * sigproc.cc (wait_sig): Add addtional debugging output.
-
-Thu Mar 9 15:25:01 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * mcount.c: Remove strace.h include.
-
-Tue Mar 7 00:29:34 2000 Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * sigproc.cc (sig_send): Temporarily set priority to highest while
- sending a signal.
-
-Mon Feb 28 11:23:29 2000 Christopher Faylor <cgf@cygnus.com>
-
- * pinfo.cc (set_myself): Add build date to strace output.
-
-Mon Feb 28 11:17:30 2000 Eric Fifer <EFifer@sanwaint.com>
-
- * sigproc.cc (proc_subproc): Only clear wait event when not attending
- to a signal.
-
-Mon Feb 28 00:08:09 2000 Christopher Faylor <cgf@cygnus.com>
-
- * configure.in: Remove --enable-strace-hhmmss option.
- * configure: Regenerate.
-
-Sun Feb 27 23:11:57 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * Makefile.in: fix "make check" support and cygrun.
-
-Thu Feb 24 15:56:00 2000 Christopher Faylor <cgf@cygnus.com>
-
- * syscalls.c (_read): Clear errno before doing any read operation.
-
-Thu Feb 24 14:45:06 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * hinfo.cc (hinfo::extend): Clean up debugging output.
-
-Wed Feb 23 21:34:58 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- Respond to more g++ warnings relating to initializing structures.
-
-Mon Feb 21 18:36:37 2000 Christopher Faylor <cgf@cygnus.com>
-
- * fhandler.cc (set_inheritance): Revert previous patch which got rid of
- 'name' parameter.
-
-Mon Feb 21 00:19:40 2000 Christopher Faylor <cgf@cygnus.com>
-
- Respond to a multitude of new g++ warnings.
-
-Sun Feb 20 22:10:21 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * environ.cc (environ_init): Cosmetic change.
-
-Mon Feb 7 16:50:44 2000 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: cygrun needs libshell32.a.
-
-Sun Feb 6 22:17:58 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in: Fix install target so that directories will be created
- when necessary.
-
-Sun Feb 6 18:12:17 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * dcrt0.cc (isquote): Convert to inline function.
-
-Sat Feb 5 00:26:01 2000 Christopher Faylor <cgf@cygnus.com>
-
- 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 <salvador@inti.gov.ar>
-
- * include/io.h: add return type to setmode()
-
-2000-01-27 DJ Delorie <dj@cygnus.com>
-
- * include/netdb.h (h_errno): change __imp_ to dllimport
- * cygwin.din (reent_data): add DATA
-
-Thu Jan 27 01:07:14 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * sync.h (new_muto): Workaround change in gcc behavior.
-
-Wed Jan 26 12:57:13 2000 Christopher Faylor <cgf@cygnus.com>
-
- * Makefile.in: Ensure that all required libraries are built prior
- to linking cygrun.exe.
-
-Tue Jan 25 21:26:57 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * ROADMAP: new
-
-2000-01-11 DJ Delorie <dj@cygnus.com>
-
- * 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 <dj@cygnus.com>
-
- * mmap.cc (mmap): MSDN says *one* of FILE_MAP_*, fix flags for
- MAP_PRIVATE.
-
-Mon Jan 10 01:11:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * fhandler.cc (get_file_owner): Use of ReadSD() instead of
- GetFileSecurity().
- (get_file_group): Ditto.
-
-Sun Jan 9 15:43:07 2000 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * mkvers.h: Reorg fix.
-
-Sat Jan 8 20:00:00 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in: Add cygwin DLL specific CFLAGS define.
-
-Fri Jan 7 21:01:57 2000 Christopher Faylor <cgf@cygnus.com>
-
- * exceptions.cc (interrupt_on_return): Properly coerce assignment of
- sigsave.func.
-
-2000-01-07 Mumit Khan <khan@xraylith.wisc.edu>
-
- * 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 <cgf@cygnus.com>
-
- * dcrt0.cc (dll_crt0): Allow signal handling for dynamically loaded
- case.
-
-Thu Jan 6 00:30:12 2000 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * Makefile.in: Strip path when installing library.
-
-2001-12-30 Christopher Faylor <cgf@redhat.com>
-
- * include/getopt.h: Fix define.
-
-2001-12-30 Christopher Faylor <cgf@redhat.com>
- Ralf Habacker <Ralf.Habacker@freenet.de>
-
- * 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 <Ralf.Habacker@freenet.de>
-
- * cygmagic: Eliminate unneeded use of 'tr' and 'bc'.
-
-2001-12-30 Corinna Vinschen <corinna@vinschen.de>
-
- * security.cc (open_local_policy): Use POLICY_EXECUTE instead of
- enumerating user rights.
-
-2001-12-29 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * include/getopt.h: Protect a declaratin.
-
-2001-12-26 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <cgf@redhat.com>
-
- * Makefile.in: Quote arguments to shell scripts.
- (clean): Remove new *_magic.h autogenerated files.
-
-2001-12-25 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump API minor version for below changes.
-
-2001-12-19 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * include/getopt.h: Don't define getopt_long() and friends when
- included through unistd.h.
-
-2001-12-17 Christopher Faylor <cgf@redhat.com>
-
- * dtable.cc (dtable::init_std_file_from_handle): Avoid initializing
- using an invalid handle.
-
-2001-12-16 David Billinghurst <David.Billinghurst@riotinto.com>
-
- * include/limits.h: Define LLONG_MIN, LLONG_MAX, ULLONG_MAX.
-
-2001-12-11 Christopher Faylor <cgf@redhat.com>
-
- * include/getopt.h: Add HAVE_DECL_GETOPT to save pain elsewhere.
-
-2001-12-10 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * path.cc (path_conv::check): Use full path name for determining
- attributes when /cygdrive/x/foo.
-
-2001-12-06 Christopher Faylor <cgf@redhat.com>
-
- * path.cc (path_conv::check): Reset FH_CYGDRIVE if iterating through
- path.
-
-2001-12-06 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * dir.cc (opendir): Detect error return from build_fhandler_from_name.
-
-2001-12-04 David Rothenberger <daveroth@acm.org>
-
- * net.cc (cygwin_getsockopt): Dereference optlen pointer when passing
- to __check_null_invalid_struct_errno.
-
-2001-12-03 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * winsup.h: Reorganize to avoid use of experimental stuff.
- * shortcut.cc: Move winsup.h first in include order.
-
-2001-11-27 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * fhandler_disk_file.cc (fhandler_cygdrive::readdir): Avoid reporting
- inaccessible drives.
-
-2001-11-24 Corinna Vinschen <corinna@vinschen.de>
-
- * net.cc (cygwin_hstrerror): Allow s == NULL.
- (cygwin_rcmd): Add parameter checking.
- (cygwin_rexec): Ditto.
-
-2001-11-24 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * path.cc (path_conv::check): Tighten FH_CYGDRIVE check to avoid
- matching trailing component, like other devices.
-
-2001-11-24 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * net.cc (inet_makeaddr): Revert previous change.
-
-2001-11-23 Christopher Faylor <cgf@redhat.com>
-
- * path.cc (chdir): Allow 'cd /cygdrive'.
-
-2001-11-23 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <nick@duffek.com>
-
- * path.cc (conv_path_list): Copy source paths before modifying them.
-
-2001-11-17 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@redhat.com>
-
- * exceptions.cc: Add stdlib.h include for alloca declaration.
- * poll.cc: Ditto.
- * termios.cc: Ditto.
-
-2001-11-14 Christopher Faylor <cgf@redhat.com>
-
- * syscalls.cc (_write): Only allow zero length when fd is valid.
-
-2001-11-14 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * syscalls.cc (_write): Allow zero length as per SUSv2.
-
-2001-11-13 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * fhandler_console.cc (fhandler_console::read): Revert 2001-10-23
- change to only honor keydown events.
-
-2001-11-11 Christopher Faylor <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump version to 1.3.6.
-
-2001-11-10 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * lib/getopt.c (getopt_internal): Reset optind to 1 only if optreset
- is not set.
-
-2001-11-06 Christopher Faylor <cgf@redhat.com>
-
- * select.cc (fhandler_tty_slave::ready_for_read): Correct inverted
- not_open test.
-
-2001-11-05 Christopher Faylor <cgf@redhat.com>
-
- * include/cygwin/version.h: Bump version to 1.3.5.
-
-2001-11-05 Corinna Vinschen <corinna@vinschen.de>
-
- * mmap.cc (mmap_record::find_empty): Add input parameter check.
-
-2001-11-04 Christopher Faylor <cgf@redhat.com>
-
- * dtable.cc (dtable::build_fhandler): Fix debug_printf to avoid SEGV
- due to incorrect parameter placement.
-
-2001-11-04 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * pipe.cc (fhandler_pipe::read): Narrow eof return to just the "broken
- pipe" test.
-
-2001-11-04 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * environ.cc: Set reset_com to false to mimic linux behavior more
- closely.
-
-2001-10-31 Corinna Vinschen <corinna@vinschen.de>
-
- * dtable.cc (dtable::vfork_child_dup): Revert impersonation
- before duplicating fhandler.
-
-2001-10-30 Christopher Faylor <cgf@redhat.com>
-
- * exceptions.cc (signal_exit): Weight the odds against the main thread
- running when signal thread is exiting.
-
-2001-10-30 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * fhandler.cc (fhandler_base::fork_fixup): Pass old handle to
- setclexec_pid.
-
-2001-10-30 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * fhandler_socket.cc (fhandler_socket::close): Add error handling.
-
-2001-10-30 Corinna Vinschen <corinna@vinschen.de>
-
- * fhandler_socket.cc (fhandler_socket::dup): Revert previous change.
-
-2001-10-30 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * security.cc (is_group_member): Call NetLocalGroupGetMembers() for
- local machine only.
- (get_user_local_groups): Ditto for NetLocalGroupEnum().
-
-2001-10-29 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * select.cc (MAKEready): Remove extraneous select_read.
-
-2001-10-29 Corinna Vinschen <corinna@vinschen.de>
-
- * uinfo.cc (internal_getlogin): Set environment variable $HOME
- from either /etc/passwd or $HOMEDRIVE/$HOMEPATH if necessary.
-
-2001-10-29 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- 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 <corinna@vinschen.de>
-
- Patch suggested by Ian Ray <ian.ray@nokia.com>:
- * 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 <corinna@vinschen.de>
-
- * net.cc (get_2k_ifconf): Change multiple IP address naming scheme
- to Linux style.
-
-Sun Oct 21 19:04:37 2001 Alexander Gottwald <ago@informatik.tu-chemnitz.de>
-
- * net.cc (get_2k_ifconf): Added support for multiple IP addresses on
- one interface.
-
-2001-10-22 Corinna Vinschen <corinna@vinschen.de>
-
- * miscfuncs.cc (__check_invalid_read_ptr_errno): Return error, if any.
-
-2001-10-21 Christopher Faylor <cgf@redhat.com>
-
- * resource.cc (fill_rusage): Perform paranoid zero structure passed to
- GetProcessMemoryInfo.
-
-2001-10-22 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <cgf@redhat.com>
-
- * dll_init.cc (dll_list::alloc): Increase retry count to 1000.
-
-2001-10-20 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * path.cc (getcwd): Allow len == 0 when buf == NULL.
-
-2001-10-18 Christopher Faylor <cgf@redhat.com>
-
- * syscalls.cc (_read): Validate input pointer.
- (_write): Ditto.
- (system): Ditto.
-
-2001-10-16 Frederic Devernay <Frederic.Devernay@sophia.inria.fr>
-
- * poll.cc (poll): Call cygwin_select() if any fd is valid.
-
-2001-10-16 Corinna Vinschen <corinna@vinschen.de>
-
- * 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\<letter>: device name for mount table
- compatibility devices.
-
-2001-10-16 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * fhandler.cc (fhandler_base::fork_fixup): Guard against compiler
- warning.
-
-2001-10-16 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * cygheap.h (cygheap_fdget::cygheap_fdget): Remove debugging operation
- from set_errno.
-
-2001-10-16 Christopher Faylor <cgf@redhat.com>
-
- * mmap.cc (mmap): Assign 'fh' from cygheap_fdget. Use 'fh' everywhere.
-
-2001-10-15 Christopher Faylor <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@redhat.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * 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 <Ralf.Habacker@freenet.de>
-
- * fhandler_dsp.cc (fhandler_dsp::ioctl): Return 0 for successful
- SNDCTL_DSP_GETBLKSIZE operation.
-
-2001-10-13 Christopher Faylor <cgf@redhat.com>
-
- 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 <cgf@redhat.com>
-
- * autoload.cc (wsock_init): Reorganize slightly to accommodate a new
- compiler.
-
-2001-10-11 Egor Duda <deo@logos-m.ru>
-
- * net.cc (cygwin_sendto): Use correct socket address when sending
- data to AF_UNIX socket.
-
-Wed Oct 10 16:10:41 2001 Alexander Gottwald <ago@informatik.tu-chemnitz.de>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * uinfo.cc (internal_getlogin): Reorganize slightly to minimize work in
- default condition.
-
-Tue Oct 9 18:53:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * fhandler.cc (fhandler_disk_file::open): Add missing case clash check.
-
-Mon Oct 8 01:47:27 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * external.cc (fillout_pinfo): Reset counter whenever we initialize the
- pid list.
-
-Sun Oct 7 17:16:05 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (get_raw_device_number): Correct length arguments for
- wdeveqn.
-
-Fri Oct 5 11:05:32 2001 Christopher Faylor <cgf@cygnus.com>
-
- * path.cc (getcwd): Allow NULL first argument.
-
-Fri Oct 5 00:31:35 2001 Christopher Faylor <cgf@cygnus.com>
-
- * heap.h (inheap): Check for NULL.
-
-Thu Oct 4 23:17:49 2001 Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (path_conv::check): Return ENOTDIR when leading device and
- trailing component.
-
-Thu Oct 4 18:49:23 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (path_conv::check): Don't perform file system or rootdir
- checks on devices.
-
-Wed Oct 3 19:40:36 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cwilson@ece.gatech.edu>
-
- * cygwin.din: export strtoll and strtoull
-
-Sun Sep 30 22:51:41 2001 Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * thread.cc (pthread_cond_dowait): Hopefully eliminate a race on multiple thread
- wakeups.
-
-Sat Sep 29 18:26:00 2001 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <rbtcollins@hotmail.com>
-
- * Makefile.in: Only stamp winver_stamp on success.
-
-Wed Sep 26 16:02:35 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <cgf@redhat.com>
-
- * select.cc (fhandler_tty_common::ready_for_read): Rewrite to correctly
- call peek_pipe.
-
-Mon Sep 24 18:46:39 2001 Christopher Faylor <cgf@cygnus.com>
-
- * select.cc (peek_pipe): Only grab mutex when we actually got something
- from the pipe.
-
-Mon Sep 24 17:41:03 2001 Christopher Faylor <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * dtable.cc (dtable::build_fhandler): Initialize unit when using
- optional path_conv argument.
-
-Sat Sep 22 17:33:45 2001 Christopher Faylor <cgf@cygnus.com>
- Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * fhandler_socket.cc (fhandler_socket::fixup_after_exec): Close
- socket only when not using Winsock2.
-
-Thu Sep 20 13:20:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * lib/getopt.c (__progname): Don't declare if not compiling for cygwin.
-
-Wed Sep 19 18:07:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * lib/getopt.c (getopt_long): Avoid compiler warning.
-
-Wed Sep 19 11:52:42 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * fhandler_socket.cc (fhandler_socket::fhandler_socket): Revert
- memory allocation to use cmalloc again.
-
-Tue Sep 18 21:04:26 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * mmap.cc (mmap): Don't reuse anonymous memory in MAP_FIXED case.
-
-Mon Sep 17 17:29:25 2001 Christopher Faylor <cgf@cygnus.com>
-
- * include/io.h: Add access declaration.
-
-Mon Sep 17 14:04:27 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * dtable.h (not_open): Assure inline.
- * fhandler.h (operator []): Make const.
-
-Sun Sep 16 23:02:57 2001 Robert Collins <rbtcollins@hotmail.com>
-
- * sync.cc (muto::~muto): Fix typo which stopped muto event handle from
- ever being closed.
-
-2001-09-16 Egor Duda <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * net.cc (dup_servent_ptr): Detect old Windows 95 misaligned structure
- and realign appropriately.
-
-Sat Sep 15 00:28:40 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * dcrt0.cc (_dll_crt0()): Don't call wincap.init() here.
-
-Fri Sep 14 00:37:54 2001 Christopher Faylor <cgf@cygnus.com>
-
- * fork.cc (vfork): Avoid recursive vforks.
-
-Fri Sep 14 00:18:52 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * cygheap.cc (ccalloc): Pass correct length to creturn so that
- cygheap_max is correctly calculated.
-
-Wed Sep 12 21:06:38 2001 Christopher Faylor <cgf@cygnus.com>
-
- * sync.cc (muto::acquire): Fix while/if typo.
-
-Wed Sep 12 23:06:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * wincap.cc (wincapc::init): Simplify W2K/XP case.
-
-Wed Sep 12 23:02:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * wincap.cc (wincapc::init): Set os name to "NT" on XP, too.
-
-Wed Sep 12 19:00:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <dmitry@baikal.ru>
-
- * dtable.cc (dtable::build_fhandler): Fix incorrect test for socket.
-
-Tue Sep 11 21:22:00 2001 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <cgf@cygnus.com>
-
- * dtable.cc (dtable::fixup_after_fork): Use SetStdHandle appropriately
- on inherited fds.
-
-Sun Sep 9 20:09:11 2001 Christopher Faylor <cgf@cygnus.com>
-
- * sigproc.cc (NZOMBIES): Reduce substantially to minimize memory use.
-
-Mon Sep 10 08:28:00 2001 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <corinna@vinschen.de>
-
- * pwdgrp.h (pwdgrp_check::set_last_modified): Call GetFileTime()
- instead of GetFileInformationByHandle().
-
-Sun Sep 9 15:59:53 2001 Christopher Faylor <cgf@cygnus.com>
-
- * heap.h (inheap): Rewrite macro to accommodate removal of brk macros
- below.
-
-Sun Sep 9 15:02:44 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * child_info.h (PROC_MAGIC): Bump magic number.
-
-Sun Sep 9 18:36:00 2001 Corinna Vinschen <corinna@vinschen.de>
- Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * cygwin.din: Add gamm*_r function exports.
-
-Fri Sep 7 17:11:11 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <jason@tishler.net>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- Move appropriate variables to NO_COPY segment, throughout.
-
-Thu Sep 6 00:40:35 2001 Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <corinna@vinschen.de>
-
- * winver.rc: Change copyright to include 2001.
-
-Wed Sep 5 12:12:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * fhandler_floppy.cc (fhandler_floppy::lseek): Remove iswinnt check.
-
-Wed Sep 5 11:34:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * fhandler_socket.cc (fhandler_socket::close): Change 2MSL value
- according to MSDN.
-
-Wed Sep 5 10:14:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * net.cc (cygwin_connect): Add WSAEALREADY and WSAEINVAL handling
- for non-blocking sockets.
-
-Tue Sep 4 22:42:13 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * thread.cc (InterlockedExchangePointer): Don't define if it already
- exists.
-
-Tue Sep 4 22:14:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * uname.cc (uname): Eliminate os specific retrieving of x86
- processor type.
-
-2001-09-04 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
-
- * 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 <corinna@vinschen.de>
-
- * dir.cc (opendir): Write version information to __d_dirent->d_version.
-
-Mon Sep 3 18:34:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * resource.cc (getrlimit): Return actual values on RLIMIT_STACK.
-
-Tue Aug 28 16:37:17 2001 Christopher Faylor <cgf@cygnus.com>
-
- * dir.cc (rmdir): Report ENOENT when file doesn't exist rather than
- ENOTDIR.
-
-Mon Aug 27 11:58:19 2001 Christopher Faylor <cgf@cygnus.com>
-
- * select.cc (cygwin_select): Ensure that arguments are zeroed on
- timeout.
- (select_stuff::wait): Ditto.
-
-2001-08-24 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <jason@tishler.net>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * cygheap.cc (init_cheap): Allocate cygheap in shared memory for Windows NT.
-
-Thu Aug 16 09:38:59 2001 Jason Tishler <jason@tishler.net>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump API version.
-
-2001-08-14 Egor Duda <deo@logos-m.ru>
-
- * spawn.cc (spawn_guts): Enable appropriate privilege before
- loading user's registry hive.
-
-Mon Aug 13 22:34:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * include/wchar.h: Define __need_wint_t.
-
-Wed Aug 8 11:46:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <deo@logos-m.ru>
-
- * dtable.cc (dtable::release): Avoid messing with console when
- closing socket.
-
-Fri Aug 3 14:02:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * Makefile.in: Add install-lib and install-headers.
-
-Fri Jul 27 12:28:12 2001 Christopher Faylor <cgf@cygnus.com>
-
- * cygwin.din: Export sys_errlist, sys_nerr.
- * include/cygwin/version.h: Bump minor version number.
-
-Fri 27 Jul 2001 10:29:00 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <pieterdv@knoware.nl>
-
- * 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 <cwilson@ece.gatech.edu>
- Christopher Faylor <cgf@cygnus.com>
-
- * cygwin.din: Export __signgam.
- * include/cygwin/version.h: Bump minor version number.
-
-Thu Jul 26 15:19:50 2001 Christopher Faylor <cgf@cygnus.com>
-
- 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 <fujieda@jaist.ac.jp>
-
- * 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 <t4bs@hotmail.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <bradshaw@staff.crosswalk.com>
-
- * dir.cc (readdir): Protect FindNextFileA against INVALID_HANDLE_VALUE.
-
-Wed 18 Jul 2001 01:00:47 PM EDT Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * syscalls.cc (_unlink): Explicitly check for non-existant file.
-
-Tue 17 Jul 2001 10:19:00 Corinna Vinschen <corinna@vinschen.de>
-
- * delqueue.h: Remove obsolete file.
-
-Mon 16 Jul 2001 10:47:17 PM EDT Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * grp.cc: Add missing Copyright date 2001.
-
-Mon 16 Jul 2001 00:11:00 Corinna Vinschen <corinna@vinschen.de>
-
- 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 <cgf@cygnus.com>
-
- * syscalls.cc (stat_worker): Simplify previous change.
-
-Fri Jul 13 13:13:09 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * uinfo.cc (internal_getlogin): Add pointer check.
-
-Mon Jul 9 10:05:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * security.cc (alloc_sd): Don't set inheritance attribute for
- permissions given to directories.
-
-Thu Jun 28 22:19:08 2001 Christopher Faylor <cgf@cygnus.com>
-
- * fhandler_dsp.cc (fhandler_dev_dsp::ioctl): Return 0 for success.
-
-Wed Jun 27 22:19:07 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <rbtcollins@hotmail.com>
- Christopher Faylor <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <mgedmin@delfi.lt>
-
- * fhandler_console.cc (fhandler_console::read): Detect AltGr more
- robustly on WinNT.
-
-2001-06-22 Robert Collins <rbbtcollins@hotmail.com>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (path_conv::check): Deal more robustly with foo/ behavior.
-
-Fri Jun 15 11:15:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * thread.cc (pthread_cond::Signal): Release the condition access
- variable correctly.
-
-2001-06-14 Egor Duda <deo@logos-m.ru>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (path_conv::update_fs_info): Don't consider remote drives to
- be NTFS. Set root_dir before invoking GetDriveType (from Kazuhiro
- Fujieda <fujieda@jaist.ac.jp>). Eliminate extra checks for rootdir.
-
-Sun Jun 10 20:19:47 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@redhat.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * net.cc (wsock_event): Add destructor.
-
-Sun Jun 3 09:49:55 2001 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (chdir): Really make sure that isspace gets only an unsigned
- char.
-
-Fri Jun 1 13:45:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <earnie_boyd@yahoo.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * shortcut.c (check_shortcut): Treat only Cygwin shortcuts as symlinks.
-
-Fri May 25 11:07:07 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * syscalls.cc (chown_worker): Don't check for ENOSYS.
-
-Tue May 22 12:20:07 2001 Christopher Faylor <cgf@cygnus.com>
-
- * signal.cc (sleep): Protect with sigframe.
-
-Tue May 22 17:58:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * security.cc (get_file_attribute): Don't set errno.
-
-Mon May 21 15:08:00 2001 Christopher Faylor <cgf@cygnus.com>
-
- * configure.in: Allow --enable-newvfork to turn NEWVFORK on and off.
- * configure: Regenerate.
-
-Mon May 21 11:46:01 2001 Christopher Faylor <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump minor version number.
-
-Sun May 20 13:26:25 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * fork.cc (fork_parent): Move atforkprepare call here.
- (fork): From here.
-
-Sat May 19 18:35:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * autoload.cc: Add missing load statement for `CancelIo'.
-
-Sat May 19 01:22:43 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <fred@ontosys.com>
-
- * net.cc (errmap): Add missing mapping from WSAEINTR to EINTR.
-
-Wed May 16 09:20:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * sec_helper.cc (legal_sid_type): Fix conditional. Change to
- inline function.
-
-Wed May 16 01:01:48 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * errno.cc (_sys_errlist): Add missing commas.
-
-Mon May 14 16:13:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * security.cc (subauth): Check if Secur32.dll could be loaded.
-
-Sun May 13 22:49:04 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * fhandler_tty.cc (fhandler_tty_common::dup): Preserve O_NOCTTY when
- duping a filehandle.
-
-Sat May 12 18:19:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * exceptions.cc (handle_exceptions): Don't print message when executing
- from a cygwin program.
-
-2001-05-10 Egor Duda <deo@logos-m.ru>
- Christopher Faylor <cgf@redhat.com>
-
- * environ.cc (winenv): Always add SYSTEMDRIVE and SYSYEMROOT to
- win32-style environment if they don't already exist.
-
-2001-05-10 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <fujieda@jaist.ac.jp>).
-
-Wed May 9 10:43:30 2001 Christopher Faylor <cgf@cygnus.com>
-
- * include/pthread.h: Remove C++ comment.
-
-Tue May 8 11:09:59 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/sys/file.h: Revert special X_OK usage. Just make it a
- constant.
-
-Sun May 6 17:05:00 2001 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <cgf@cygnus.com>
-
- * string.h (cygwin_strchr): Make 'static inline' so that things will
- still work when optimized.
-
-Sat May 5 01:04:11 2001 Christopher Faylor <cgf@cygnus.com>
-
- * exceptions.cc (handle_exceptions): Vastly increase test for exception
- loop guard variable.
-
-Fri May 4 22:23:33 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * localtime.c: Revert exclusion of windows.h.
-
-Fri May 4 17:03:16 2001 Christopher Faylor <cgf@cygnus.com>
-
- * string.h: Fix last-minute typo.
-
-Fri May 4 16:49:34 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * exceptions.cc (ctrl_c_handler): Always send signal to process if it
- has no tty.
-
-2001-05-04 Egor Duda <deo@logos-m.ru>
-
- * fhandler_socket.cc (set_connect_secret): Use /dev/urandom to
- generate secret cookie.
-
-Thu May 3 16:37:55 2001 Christopher Faylor <cgf@cygnus.com>
-
- * include/pthread.h (pthread_cleanup_push): Eliminate space preceding
- arguments.
- (pthread_cleanup_pop): Ditto.
-
-Thu May 3 18:16:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * net.cc (wsock_init): Rename `was_in_progress' to `wsock_started'
- for clearness.
-
-Thu May 3 10:44:16 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (mount_info::conv_to_win32_path): More path tweaking.
-
-Tue May 1 00:34:46 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * uinfo.cc (internal_getlogin): Formatting change.
-
-Mon Apr 30 19:58:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <dbaker@direct.ca>)
- * 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 <fujieda@jaist.ac.jp>
-
- * thread.cc (thread_init_wrapper): Use _REENT_INIT to initialize the
- reent structure of newlib.
-
-Fri Apr 27 14:02:24 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * security.cc (alloc_sd): Add unrelated ACCESS_ALLOWED_ACE behind
- the `everyone' ACE.
-
-Wed Apr 25 15:07:37 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump minor version number.
- * childinfo.h: Bump child structure magic number.
-
-2001-04-25 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <andylyounger@hotmail.com>
-
- * 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 <corinna@vinschen.de>
-
- * passwd.cc (getpwnam_r): Add pw_passwd handling as well.
- (getpwuid_r): Ditto.
-
-Tue Apr 24 23:43:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * passwd.cc (getpwnam_r): Use correct offsets into buffer.
- Copy pw_gecos field as well.
- (getpwuid_r): Ditto.
-
-2001-04-24 Egor Duda <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump Cygwin version and API version.
-
-Mon Apr 23 9:27:00 2001 Robert Collins <rbtcollins@hotmail.com>
-
- * thread.cc (MTinterface::Init): Always initialise per process variables.
-
-Sun Apr 22 19:18:18 2001 Christopher Faylor <cgf@cygnus.com>
-
- * features.h: Reinstate as wrapper for sys/features.h.
-
-Mon Apr 23 0:10:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * security.cc (alloc_sd): Reformat comment.
- * shared.cc: Drop function declarations already in security.h.
-
-Sun Apr 22 12:17:57 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * thread.cc (MTinterface::Init): Remove accidentally checked in code.
-
-Sun Apr 22 00:22:00 2001 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <cgf@cygnus.com>
-
- * cygwin.din: Add *scanf and *scan_r functions.
-
-Fri Apr 20 22:25:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <deo@logos-m.ru>
-
- * path.cc (path_conv::check): Always initialize member variables.
-
-Fri Apr 20 12:27:49 2001 Christopher Faylor <cgf@cygnus.com>
-
- * include/sys/file.h: More cleanup for X_OK.
-
-Fri Apr 20 11:48:45 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * grp.cc (getgroups): Change so that SIDs get compared instead
- of strings to SIDs.
-
-Fri Apr 20 14:50:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * passwd.cc: Eliminate passwd_sem throughout.
- * security.cc: Ditto.
-
-Tue Apr 17 12:18:28 2001 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <deo@logos-m.ru>
-
- * grp.cc (getgroups): Avoid crash if passwd field if /etc/group is
- empty.
-
-Tue Apr 17 19:05:44 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * path.cc (windows_device_names): Add missing NULL element.
-
-Tue Apr 17 12:14:54 2001 Christopher Faylor <cgf@cygnus.com>
-
- * path.cc (windows_device_names): Move dsp to proper location.
-
-Tue Apr 17 13:44:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * config.h.in: Turn off VFORK again.
-
-Mon Apr 16 23:45:24 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * features.h: Remove this file as it is now being supplied by newlib.
-
-Sun Apr 15 23:23:29 2001 Christopher Faylor <cgf@cygnus.com>
-
- * autoload.cc: Add winmm functions needed by fhandler_dsp.cc.
-
-Sun Apr 15 22:53:52 2001 Andy Younger <andylyounger@hotmail.com>
-
- * 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 <cgf@cygnus.com>
-
- * uname.c (uname): Default n in in86 to 6 if Windows returns > 6.
-
-Sun Apr 15 15:56:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * config.h.in: Turn on VFORK by default.
-
-Sat Apr 14 18:04:35 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <Pierre.Humblet@ieee.org>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * syscalls.cc (mkfifo): New function stub.
-
-2001-04-12 Robert Collins <rbtcollins@hotmail.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <Benjamin.Riefenstahl@epost.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * child_info.h: Bump magic number for fork/exec/spawn.
-
-Tue Apr 3 20:06:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * errno.cc (errmap): Map ERROR_FILE_INVALID to ENXIO.
-
-Mon Apr 2 22:48:58 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * fhandler.cc (fhandler_disk_file::open): Avoid checking a magic
- number of a directory.
-
-Mon Apr 2 00:24:08 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * exceptions.cc (call_signal_handler_now): Rename from
- call_signal_handler to avoid C++ confusion.
-
-Sun Apr 1 00:08:15 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * fhandler.cc (fhandler_base::read): Remove special handling of CTRL-Z.
-
-Sat Mar 31 11:09:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (chdir): Eat trailing whitespace on input path.
-
-Tue Mar 27 22:38:42 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * mmap.cc (mmap): Fix conditional for previous patch.
-
-Mon Mar 26 18:48:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <deo@logos-m.ru>
-
- * fhandler_console.cc (fhandler_console::set_default_attr): Update
- console color attributes on tty reset.
-
-Wed Mar 21 22:12:36 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <rbtcollins@hotmail.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * path.cc (suffix_scan::next): Avoid searching for foo.lnk twice when
- input is "foo".
-
-Sat Mar 17 18:10:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <brozow@tavve.com>
-
- * net.cc (cygwin_socket): Pass protocol parameter to socket call.
-
-Sat Mar 17 02:05:38 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * syscalls.cc (stat_dev): Give devices full read/write by default.
-
-Saturday Mar 17 3:45 2001 Robert Collins <rbtcollins@hotmail.com>
-
- * thread.cc (MTinterface::CreateCond): Check for null attr pointer.
-
-Fri Mar 16 21:13:23 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * mkvers.sh: Include config.h so that DEBUGGING is correctly defined.
-
-Mon Mar 12 09:47:55 2001 Christopher Faylor <cgf@cygnus.com>
-
- * spawn.cc (spawn_guts): Don't set EXIT_REPARENTING if parent process
- is not a cygwin process (suggested by Jason Gouger
- <cygwin@jason-gouger.com>).
-
-Sun Mar 11 16:00:58 2001 Christopher Faylor <cgf@cygnus.com>
-
- * child_info.h: Bump magic number for fork/exec/spawn.
-
-Sat Mar 10 20:54:47 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * syscalls.cc (_rename): Set errno to ENOENT when an old path doesn't
- exist (from Kazuhiro Fujieda <fujieda@jaist.ac.jp>). Also set EACCES
- when directory is not writable.
-
-Wed Mar 7 15:49:47 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <jtiller@sjm.com>
-
- * 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 <ALT>) unmolested,
- whereas English keyboards now interpret left- and right-<ALT>
- as META.
-
-Mon Mar 5 20:15:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <corinna@vinschen.de>
-
- * dir.cc (readdir): Fix creating path in symlink check.
-
-Fri Mar 2 12:33:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * uinfo.cc: Eliminate `#include <wchar.h>'.
-
-2001-02-28 Egor Duda <deo@logos-m.ru>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <msimons@moria.simons-clan.com>
-
- * times.cc (settimeofday): Replace function stub with working code.
-
-Mon Feb 26 10:42:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * shortcut.c: Remove #include <sys/strace.h>.
-
-Sun Feb 25 10:32:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * path.cc (symlink): Add a ".lnk" suffix regardless. Add a comment.
-
-Sun Feb 25 10:18:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * shortcut.c (check_shortcut): Change symlink condition.
-
-Fri Feb 23 10:42:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <deo@logos-m.ru>
-
- * sigproc.cc (getsem): Make semaphore always non-inheritable.
-
-Mon Feb 19 22:25:53 2001 Christopher Faylor <cgf@cygnus.com>
-
- * dcrt0.cc (locale_init): Remove.
-
-2001-02-15 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
-
- * 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 <deo@logos-m.ru>
-
- * 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 <chrisiasci@aol.com>
-
- * dlfcn.cc (dlopen): Do not call LoadLibrary with a NULL pointer, when
- the library is not found
-
-2001-02-14 Egor Duda <deo@logos-m.ru>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * syscalls.cc (mknod): Add valid parameters.
-
-Thu Feb 8 22:09:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * signal.cc (killpg): Correct first argument.
-
-Wed Feb 7 22:22:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * cygheap.cc (creturn): Correctly calculate cygheap_max.
-
-Wed Jan 31 10:04:58 2001 Christopher Faylor <cgf@cygnus.com>
-
- * shared.cc (shared_info::initialize): Reduce size of heap.
-
-Wed Jan 31 13:22:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * include/sys/resource.h: Fix typo.
-
-Wed Jan 31 13:20:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * include/sys/resource.h: Add RLIMIT_NLIMITS and RLIM_NLIMITS.
-
-Tue Jan 30 18:15:23 2001 Christopher Faylor <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump version to 1.3.0.
-
-Tue Jan 30 8:55:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <bill@troyxcd.com>
-
- * 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 <corinna@vinschen.de>
-
- * mmap.cc (mmap): Remove obsolete check for MAP_SHARED|MAP_ANON as
- being invalid.
-
-Mon Jan 29 10:23:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * mmap.cc (mmap_record::find_empty): Fix loop condition.
-
-Sun Jan 28 19:40:40 2001 Christopher Faylor <cgf@cygnus.com>
-
- * syscalls.cc (_link): Make sure that newpath does not exist. Set
- errno if it does.
-
-Sun Jan 28 19:29:08 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump API version.
-
-Sun Jan 28 01:18:22 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- 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 <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <cgf@cygnus.com>
-
- * path.h: Add a new constant.
- * syscalls.cc (_read): Oscillate errno check.
-
-Mon Jan 22 15:27:12 2001 Christopher Faylor <cgf@cygnus.com>
-
- * include/cygwin/version.h: Bump API to reflect setlogmask.
-
-Sun Jan 21 22:40:25 2001 Jason Tishler <jt@dothill.com>
-
- * cygwin.din: Add export for setlogmask().
- * syslog.cc (setlogmask): New function.
-
-Thu Jan 18 10:27:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * resource.cc (setrlimit): Support RLIMIT_NOFILE.
-
-Wed Jan 17 23:23:12 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * cygheap.cc (cygheap_user::~cygheap_user): Temporarily
- disable free'ing memory.
-
-Tue Jan 16 18:01:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * mmap.cc (mmap): Initialize fh to avoid compiler warnings.
-
-Mon Jan 15 21:07:00 2001 Christopher Faylor <cgf@cygnus.com>
-
- * wait.cc (wait4): Rename variable for consistency. Allow restartable
- signal behavior.
-
-Mon Jan 15 23:15:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * mmap.cc: include <unistd.h>. 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 <corinna@vinschen.de>
-
- * heap.cc (heap_init): Fix extern declaration of getpagesize.
- * syscalls.cc (getpagesize): Fix another typo.
-
-Mon Jan 15 12:48:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- * 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 <corinna@vinschen.de>
-
- * sysconf.cc (sysconf): return `getpagesize ()' on _SC_PAGESIZE
- request to avoid implementing the same twice.
-
-Sun Jan 14 14:07:50 2001 Christopher Faylor <cgf@cygnus.com>
-
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * 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 <fujieda@jaist.ac.jp>
-
- * sigproc.cc (wait_sig): Allow SIGCONT when stopped.
-
-Tue Jan 9 16:55:00 2001 Corinna Vinschen <corinna@vinschen.de>
-
- Patch suggested by René Møller Fonseca <fonseca@mip.sdu.dk>
- * 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 <cgf@cygnus.com>
-
- * 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 <corinna@vinschen.de>
-
- * resource.cc (getrlimit): Set errno on EFAULT instead of returning
- it.
- (setrlimit): Ditto.
-
-Thu Jan 5 3:38:00 2001 David Sainty <David.Sainty@optimation.co.nz>
-
- * 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 <earnie_boyd@yahoo.com>
-
- * thread.cc: Need LONG_MAX definition.
-
-Wed Jan 3 13:47:23 2001 Christopher Faylor <cgf@cygnus.com>
-
- * thread.cc (MTinterface::CreateSemaphore): Correctly set semaphore
- max.
-
-Wed Jan 3 09:44:51 2001 Christopher Faylor <cgf@cygnus.com>
-
- * fhandler_console.cc (fhandler_console::read): Restore missing test
- for code page before doing OemToCharBuff.
-
-Wed Jan 3 09:20:20 2001 Jason Tishler <jt@dothill.com>
-
- * include/cygwin/version.h: Fix typo in CYGWIN_VERSION_DLL_COMBINED
- macro.
diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in
deleted file mode 100644
index ab67daedb..000000000
--- a/winsup/cygwin/Makefile.in
+++ /dev/null
@@ -1,386 +0,0 @@
-# Makefile.in for Cygwin.
-# Copyright 1995, 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.
-
-# 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
-
-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@
-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@
-
-INSTALL:=@INSTALL@
-INSTALL_PROGRAM:=@INSTALL_PROGRAM@
-
-#
-# --enable options from configure
-#
-MT_SAFE:=@MT_SAFE@
-DEFS:=@DEFS@
-
-# cygheap_CFLAGS:=-fomit-frame-pointer
-malloc_CFLAGS:=-fomit-frame-pointer
-shared_CFLAGS:=-fomit-frame-pointer
-cygthread_CFLAGS:=-fomit-frame-pointer
-miscfuncs_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_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_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
-
-CC:=@CC@
-# FIXME: Which is it, CC or CC_FOR_TARGET?
-CC_FOR_TARGET:=$(CC)
-CFLAGS=@CFLAGS@
-override CFLAGS+=-MMD ${$(*F)_CFLAGS}
-CXX:=@CXX@
-CXXFLAGS=@CXXFLAGS@
-
-# For linking mount, etc. crt0.o isn't accessable in a fresh build.
-EXE_LDFLAGS:=@EXE_LDFLAGS@
-
-AR:=@AR@
-AR_FLAGS:=qv
-RANLIB:=@RANLIB@
-LD:=@LD@
-DLLTOOL:=@DLLTOOL@
-WINDRES:=@WINDRES@
-AS:=@AS@
-NM:=@NM@
-LDSCRIPT:=cygwin.sc
-
-#
-# Include common definitions for winsup directory
-#
-include $(srcdir)/../Makefile.common
-
-INSTALL_DATA:=$(SHELL) $(updir1)/install-sh -c
-
-@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 new-cygwin.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
-LIB_NAME:=libcygwin.a
-DEF_FILE:=cygwin.def
-DLL_ENTRY:=@DLL_ENTRY@
-
-LIBGMON_A:=libgmon.a
-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 $(bupdir1)/libiberty/strsignal.o
-
-MALLOC_OFILES=@MALLOC_OFILES@
-
-DLL_IMPORTS:=$(w32api_lib)/libkernel32.a
-
-# Please maintain this list in sorted order, with maximum files per 80 col line
-DLL_OFILES:=assert.o autoload.o cxx.o cygheap.o cygserver_client.o \
- cygserver_transport.o cygserver_transport_pipes.o \
- cygserver_transport_sockets.o cygthread.o dcrt0.o debug.o \
- delqueue.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_floppy.o fhandler_mem.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 fnmatch.o fork.o glob.o grp.o heap.o init.o ioctl.o \
- ipc.o localtime.o malloc.o malloc_wrapper.o miscfuncs.o mmap.o msg.o \
- net.o netdb.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 signal.o sigproc.o smallprint.o spawn.o strace.o \
- strsep.o sync.o syscalls.o sysconf.o syslog.o termios.o thread.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
-NEW_FUNCTIONS:=regcomp posix_regcomp \
- regerror posix_regerror \
- regexec posix_regexec \
- regfree posix_regfree
-
-API_VER:=$(srcdir)/include/cygwin/version.h
-
-PWD:=${shell pwd}
-SUBLIBS:=libpthread.a $(PWD)/libm.a libc.a
-EXTRALIBS:=libautomode.a libbinmode.a libtextmode.a
-INSTOBJS:=automode.o binmode.o textmode.o
-TARGET_LIBS:=$(LIB_NAME) $(SUBLIBS) $(GMON_START) $(LIBGMON_A) $(SUBLIBS) $(INSTOBJS) $(EXTRALIBS)
-.PHONY: all force dll_ofiles install all_target install_target all_host install_host \
- install install-libs install-headers -lgcc
-
-.SUFFIXES:
-.SUFFIXES: .c .cc .def .a .o .d
-
-all_host=@all_host@
-install_host=@install_host@
-
-all: all_target $(all_host)
-
-all_target: $(TARGET_LIBS) cygserver.exe
-
-all_host: new-$(LIB_NAME) cygrun.exe
-
-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)
- $(INSTALL_DATA) new-$(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 \
- 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:
- cd $(srcdir); \
- for i in `find . -type f -name '*.2'`; do \
- $(INSTALL_DATA) $$i $(tooldir)/man/man2/`basename $$i` ; \
- done; \
- for i in `find . -type f -name '*.3'`; do \
- $(INSTALL_DATA) $$i $(tooldir)/man/man3/`basename $$i` ; \
- done; \
- for i in `find . -type f -name '*.5'`; do \
- $(INSTALL_DATA) $$i $(tooldir)/man/man5/`basename $$i` ; \
- done; \
- for i in `find . -type f -name '*.7'`; do \
- $(INSTALL_DATA) $$i $(tooldir)/man/man7/`basename $$i` ; \
- done
-
-install_target: cygserver.exe
- $(INSTALL_PROGRAM) cygserver.exe $(bindir)/cygserver.exe
-
-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
-
-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
-new-$(DLL_NAME): $(LDSCRIPT) $(DLL_OFILES) $(DEF_FILE) $(DLL_IMPORTS) $(LIBC) $(LIBM) $(API_VER) Makefile winver_stamp
- $(CXX) $(CXXFLAGS) -nostdlib -Wl,-T$(firstword $^) -Wl,--out-implib,cygdll.a -shared -o $@ \
- -e $(DLL_ENTRY) $(DEF_FILE) $(DLL_OFILES) version.o winver.o \
- $(MALLOC_OBJ) $(LIBM) $(LIBC) \
- -lgcc $(DLL_IMPORTS)
-
-# Rule to build libcygwin.a
-$(LIB_NAME): rmsym newsym new-$(DLL_NAME) $(LIBCOS)
- /bin/sh ${word 1,$^} ./cygdll.a "$(NM)" "$(AR)" "$(RANLIB)" $(OBSOLETE_FUNCTIONS) || exit 0
- /bin/sh ${word 2,$^} ./cygdll.a "$(AS)" "$(AR)" "$(RANLIB)" $(NEW_FUNCTIONS) || exit 0
- (echo create $(LIB_NAME); echo addmod $(LIBCOS); echo addlib cygdll.a; echo save) | $(AR) -M
-
-# 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)
-new-$(LIB_NAME): $(LIB_NAME)
- $(DLLTOOL) --as=$(AS) --dllname new-$(DLL_NAME) --def $(DEF_FILE) --output-lib new-templib.a
- $(AR) rcv new-templib.a $(LIBCOS)
- mv new-templib.a new-$(LIB_NAME)
- $(RANLIB) $@
-
-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!
- @false
-
-version.cc winver.o: winver_stamp
- @ :
-
-shared_info_magic.h: cygmagic shared_info.h
- /bin/sh ${word 1,$^} $@ "$(CC) -x c" ${word 2,$^} MOUNT_MAGIC 'class mount_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
-
-libpthread.a: speclib cygwin.def pthread.o thread.o
- /bin/sh ${word 1, $^} $@ "${NM}" "${DLLTOOL}" "${AS}" ${wordlist 2, 99, $^}
-
-$(PWD)/libm.a: speclib cygwin.def $(LIBM)
- /bin/sh ${word 1, $^} $@ "${NM}" "${DLLTOOL}" "${AS}" ${wordlist 2, 99, $^}
-
-$(PWD)/libc.a: speclib cygwin.def $(PWD)/libm.a libpthread.a
- /bin/sh ${word 1, $^} -v $@ "${NM}" "${DLLTOOL}" "${AS}" ${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 $@
-
-cygrun.o: cygrun.c
- $(CC) $(MINGW_CFLAGS) -o $@ -c $<
-
-cygrun.exe : cygrun.o -lgcc $(w32api_lib)/libuser32.a \
- $(w32api_lib)/libshell32.a $(w32api_lib)/libkernel32.a
- $(CC) ${MINGW_LDFLAGS} -mno-cygwin -o $@ $^
-
-cygserver_transport_outside.o: cygserver_transport.cc
- $(COMPILE_CXX) -D__OUTSIDE_CYGWIN__ -o $@ $<
-
-cygserver_transport_pipes_outside.o: cygserver_transport_pipes.cc
- $(COMPILE_CXX) -D__OUTSIDE_CYGWIN__ -o $@ $<
-
-cygserver_transport_sockets_outside.o: cygserver_transport_sockets.cc
- $(COMPILE_CXX) -D__OUTSIDE_CYGWIN__ -o $@ $<
-
-cygserver_client_outside.o: cygserver_client.cc
- $(COMPILE_CXX) -D__OUTSIDE_CYGWIN__ -o $@ $<
-
-cygserver.exe: cygserver.o cygserver_shm.o cygserver_transport_outside.o cygserver_transport_pipes_outside.o cygserver_transport_sockets_outside.o cygserver_client_outside.o cygserver_process.o threaded_queue.o wincap.o version.o smallprint.o
- $(CXX) -o $@ $^ -lstdc++
-#ifdef VERBOSE
-# $(CXX) $(MINGW_CXXFLAGS) -o $@ ${wordlist 1,3,$^} -B$(mingw_build)/ $(MINGW_LDFLAGS)
-#else
-# @echo $(CXX) -o $@ ${wordlist 1,3,$^} ${filter-out -B%, $(MINGW_CXXFLAGS) $(MINGW_LDFLAGS)};\
-# $(CXX) $(MINGW_CXXFLAGS) -o $@ ${wordlist 1,3,$^} -B$(mingw_build)/ $(MINGW_LDFLAGS)
-#endif
-
--lgcc:
- :
-
-#
-
-Makefile: cygwin.din
-
-$(DEF_FILE): cygwin.din config.status
- $(SHELL) config.status
-
-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 c187c0be3..000000000
--- a/winsup/cygwin/acconfig.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Define if DEBUGGING support is requested. */
-#undef DEBUGGING
-
-/* Define if building "extra" thread-safe Cygwin DLL. */
-#undef _CYG_THREAD_FAILSAFE
-
-/* Define if GCC supports builtin memset. */
-#undef HAVE_BUILTIN_MEMSET
-
-/* Define if building thread-safe Cygwin DLL. */
-#undef _MT_SAFE
-
-/* Define if using new vfork functionality. */
-#undef NEWVFORK
diff --git a/winsup/cygwin/ansi.sgml b/winsup/cygwin/ansi.sgml
deleted file mode 100644
index d6a41ab31..000000000
--- a/winsup/cygwin/ansi.sgml
+++ /dev/null
@@ -1,59 +0,0 @@
-<sect1 id="std-ansi">
-<title>Compatibility with ANSI</title>
-
-<para>The following functions are compatible with ANSI:</para>
-
-<sect2><title>stdio</title><para>
-
-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,
-
-</para></sect2>
-<sect2><title>string</title><para>
-
-memchr, memcmp, memcpy, memmove, memset, strcat, strchr, strcmp,
-strcoll, strcpy, strcspn, strerror, strlen, strncat, strncmp, strncpy,
-strpbrk, strrchr, strspn, strstr, strtok, strxfrm
-
-</para></sect2>
-<sect2><title>stdlib</title><para>
-
-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
-
-</para></sect2>
-<sect2><title>time</title><para>
-
-asctime, gmtime, localtime, time, clock, ctime, difftime, mktime,
-strftime
-
-</para></sect2>
-<sect2><title>signals</title><para>
-
-raise, signal
-
-</para></sect2>
-<sect2><title>ctype</title><para>
-
-isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint,
-ispunct, isspace, isupper, isxdigit, tolower, toupper
-
-</para></sect2>
-<sect2><title>math</title><para>
-
-acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor, fmod,
-frexp, ldexp, log, log10, modf, pow, sin, sinh, sqrt, tan, tanh
-
-</para></sect2>
-<sect2><title>misc</title><para>
-
-localeconv, setlocale, va_arg, va_end, va_start
-
-</para></sect2>
-
-</sect1> \ No newline at end of file
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 <wingdi.h>
-#include <winuser.h>
-
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-/* 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 5210623a0..000000000
--- a/winsup/cygwin/autoload.cc
+++ /dev/null
@@ -1,518 +0,0 @@
-/* autoload.cc: all dynamic load stuff.
-
- 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. */
-
-#include "winsup.h"
-#define USE_SYS_TYPES_FD_SET
-#include <winsock2.h>
-
-/* 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\
- .section ." #dllname "_info,\"w\" \n\
- .linkonce \n\
- .long std_dll_init \n\
- .long 0 \n\
- .long -1 \n\
- .long " #init_also " \n\
- .asciz \"" #dllname "\" \n\
- .text \n\
-");
-
-/* Create a "decorated" name */
-#define mangle(name, n) #name "@" #n
-
-/* Standard DLL load macro. Invokes a fatal warning 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)
-
-/* Main DLL setup stuff. */
-#define LoadDLLfuncEx2(name, n, dllname, notimp, err) \
- LoadDLLprime (dllname, dll_func_load) \
- __asm__ (" \n\
- .section ." #dllname "_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 "<<16 \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");
-
-/* called by the secondary initialization function to call dll_func_load. */
-extern "C" void dll_chain1 () __asm__ ("dll_chain1");
-
-extern "C" {
-
-/* FIXME: This is not thread-safe? */
-__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\
- shrl $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\
- movl (%eax),%eax # Get address of DLL info block \n\
- movl $dll_func_load,(%eax) # Just load func now \n\
- jmp *%edx # Jump to next init function \n\
- \n\
-dll_chain1: \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. */
-static long long std_dll_init () __asm__ ("std_dll_init") __attribute__ ((unused));
-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)
- {
- if ((h = LoadLibrary (dll->name)) != NULL)
- 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. */
-static long long wsock_init () __asm__ ("wsock_init") __attribute__ ((unused, regparm(1)));
-bool NO_COPY wsock_started = 0;
-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;
-
- __asm__ (" \n\
- .section .ws2_32_info \n\
- .equ _ws2_32_handle,.ws2_32_info + 4 \n\
- .global _ws2_32_handle \n\
- .section .wsock32_info \n\
- .equ _wsock32_handle,.wsock32_info + 4 \n\
- .global _wsock32_handle \n\
- .text \n\
- ");
-
- while (InterlockedIncrement (&here))
- {
- InterlockedDecrement (&here);
- low_priority_sleep (0);
- }
-
- if (!wsock_started && (winsock_active || winsock2_active))
- {
- /* Don't use autoload to load WSAStartup to eliminate recursion. */
- int (*wsastartup) (int, WSADATA *);
-
- 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;
- }
- }
-
- InterlockedDecrement (&here);
-
- /* Kludge alert. Redirects the return address to dll_chain1. */
- __asm__ __volatile__ (" \n\
- movl $dll_chain1,4(%ebp) \n\
- ");
-
- volatile retchain ret;
- /* Set "arguments for dll_chain1. */
- ret.low = (long) dll_func_load;
- ret.high = (long) func;
- return ret.ll;
-}
-
-LoadDLLprime (wsock32, wsock_init)
-LoadDLLprime (ws2_32, wsock_init)
-
-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)
-LoadDLLfuncEx (DuplicateTokenEx, 24, advapi32, 1)
-LoadDLLfunc (EqualSid, 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 (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 (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)
-
-LoadDLLfuncEx (NtCreateToken, 52, ntdll, 1)
-LoadDLLfuncEx (NtMapViewOfSection, 40, ntdll, 1)
-LoadDLLfuncEx (NtOpenFile, 24, ntdll, 1)
-LoadDLLfuncEx (NtOpenSection, 12, ntdll, 1)
-LoadDLLfuncEx (NtQueryInformationFile, 20, ntdll, 1)
-LoadDLLfuncEx (NtQueryInformationProcess, 20, ntdll, 1)
-LoadDLLfuncEx2 (NtQueryObject, 20, ntdll, 1, 1)
-LoadDLLfuncEx (NtQuerySystemInformation, 16, ntdll, 1)
-LoadDLLfuncEx (NtQueryVirtualMemory, 24, ntdll, 1)
-LoadDLLfuncEx (NtUnmapViewOfSection, 8, ntdll, 1)
-LoadDLLfuncEx (RtlInitUnicodeString, 8, ntdll, 1)
-LoadDLLfuncEx (RtlNtStatusToDosError, 4, ntdll, 1)
-
-LoadDLLfuncEx (GetProcessMemoryInfo, 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 (CreateWindowExA, 48, user32)
-LoadDLLfunc (DefWindowProcA, 16, user32)
-LoadDLLfunc (DispatchMessageA, 4, user32)
-LoadDLLfunc (EmptyClipboard, 0, user32)
-LoadDLLfunc (FindWindowA, 8, user32)
-LoadDLLfunc (GetClipboardData, 4, user32)
-LoadDLLfunc (GetKeyboardLayout, 4, user32)
-LoadDLLfunc (GetMessageA, 16, user32)
-LoadDLLfunc (GetPriorityClipboardFormat, 8, user32)
-LoadDLLfunc (GetProcessWindowStation, 0, user32)
-LoadDLLfunc (GetThreadDesktop, 4, user32)
-LoadDLLfunc (GetUserObjectInformationA, 20, user32)
-LoadDLLfunc (KillTimer, 8, 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 (SetTimer, 16, user32)
-LoadDLLfunc (SetUserObjectSecurity, 12, user32)
-
-LoadDLLfuncEx (load_wsock32, 0, wsock32, 1) // non-existent function forces wsock32 load
-LoadDLLfunc (WSAAsyncSelect, 16, wsock32)
-LoadDLLfunc (WSACleanup, 0, wsock32)
-LoadDLLfunc (WSAGetLastError, 0, wsock32)
-LoadDLLfunc (WSASetLastError, 4, wsock32)
-// LoadDLLfunc (WSAStartup, 8, wsock32)
-LoadDLLfunc (__WSAFDIsSet, 8, wsock32)
-LoadDLLfunc (accept, 12, wsock32)
-LoadDLLfunc (bind, 12, wsock32)
-LoadDLLfunc (closesocket, 4, wsock32)
-LoadDLLfunc (connect, 12, wsock32)
-LoadDLLfunc (gethostbyaddr, 12, wsock32)
-LoadDLLfunc (gethostbyname, 4, wsock32)
-LoadDLLfunc (gethostname, 8, wsock32)
-LoadDLLfunc (getpeername, 12, wsock32)
-LoadDLLfunc (getprotobyname, 4, wsock32)
-LoadDLLfunc (getprotobynumber, 4, wsock32)
-LoadDLLfunc (getservbyname, 8, wsock32)
-LoadDLLfunc (getservbyport, 8, wsock32)
-LoadDLLfunc (getsockname, 12, wsock32)
-LoadDLLfunc (getsockopt, 20, wsock32)
-LoadDLLfunc (inet_addr, 4, wsock32)
-LoadDLLfunc (inet_network, 4, wsock32)
-LoadDLLfunc (inet_ntoa, 4, wsock32)
-LoadDLLfunc (ioctlsocket, 12, wsock32)
-LoadDLLfunc (listen, 8, wsock32)
-LoadDLLfunc (rcmd, 24, wsock32)
-LoadDLLfunc (recv, 16, wsock32)
-LoadDLLfunc (recvfrom, 24, wsock32)
-LoadDLLfunc (rexec, 24, wsock32)
-LoadDLLfunc (rresvport, 4, wsock32)
-LoadDLLfunc (select, 20, wsock32)
-LoadDLLfunc (send, 16, wsock32)
-LoadDLLfunc (sendto, 24, wsock32)
-LoadDLLfunc (setsockopt, 20, wsock32)
-LoadDLLfunc (shutdown, 8, wsock32)
-LoadDLLfunc (socket, 12, wsock32)
-
-LoadDLLfuncEx (WSACloseEvent, 4, ws2_32, 1)
-LoadDLLfuncEx (WSACreateEvent, 0, ws2_32, 1)
-LoadDLLfuncEx (WSADuplicateSocketA, 12, ws2_32, 1)
-LoadDLLfuncEx (WSAGetOverlappedResult, 20, ws2_32, 1)
-LoadDLLfuncEx (WSARecv, 28, ws2_32, 1)
-LoadDLLfuncEx (WSARecvFrom, 36, ws2_32, 1)
-LoadDLLfuncEx (WSASend, 28, ws2_32, 1)
-LoadDLLfuncEx (WSASendTo, 36, ws2_32, 1)
-LoadDLLfuncEx (WSASetEvent, 4, ws2_32, 1)
-LoadDLLfuncEx (WSASocketA, 24, ws2_32, 1)
-LoadDLLfuncEx (WSAWaitForMultipleEvents, 20, ws2_32, 1)
-LoadDLLfuncEx (WSAEventSelect, 12, ws2_32, 1)
-LoadDLLfuncEx (WSAEnumNetworkEvents, 12, ws2_32, 1)
-
-LoadDLLfuncEx (GetIfTable, 12, iphlpapi, 1)
-LoadDLLfuncEx (GetIfEntry, 4, iphlpapi, 1)
-LoadDLLfuncEx (GetIpAddrTable, 12, iphlpapi, 1)
-
-LoadDLLfunc (CoInitialize, 4, ole32)
-LoadDLLfunc (CoUninitialize, 0, ole32)
-LoadDLLfunc (CoCreateInstance, 20, ole32)
-
-LoadDLLfuncEx (CancelIo, 4, kernel32, 1)
-LoadDLLfuncEx (CreateHardLinkA, 12, kernel32, 1)
-LoadDLLfuncEx (CreateToolhelp32Snapshot, 8, kernel32, 1)
-LoadDLLfuncEx (GetConsoleWindow, 0, kernel32, 1)
-LoadDLLfuncEx2 (IsDebuggerPresent, 0, kernel32, 1, 1)
-LoadDLLfuncEx (Process32First, 8, kernel32, 1)
-LoadDLLfuncEx (Process32Next, 8, kernel32, 1)
-LoadDLLfuncEx (SignalObjectAndWait, 16, kernel32, 1)
-LoadDLLfunc (TryEnterCriticalSection, 4, kernel32)
-
-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)
-}
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 <windows.h>
-#include <sys/fcntl.h>
-#include <sys/cygwin.h>
-
-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 <windows.h>
-#include <sys/fcntl.h>
-#include <sys/cygwin.h>
-
-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 2ac015222..000000000
--- a/winsup/cygwin/child_info.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/* child_info.h: shared child info for cygwin
-
- 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. */
-
-#include <setjmp.h>
-
-enum
-{
- _PROC_EXEC,
- _PROC_SPAWN,
- _PROC_FORK,
- _PROC_WHOOPS
-};
-
-#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)
-
-#define CURR_CHILD_INFO_MAGIC 0x8e0899faU
-
-/* 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
- int cygpid; // cygwin pid of child process
- HANDLE subproc_ready; // used for synchronization with parent
- HANDLE mount_h;
- HANDLE parent;
- HANDLE pppid_handle;
- init_cygheap *cygheap;
- void *cygheap_max;
- HANDLE cygheap_h;
- unsigned fhandler_union_cb;
-};
-
-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
-};
-
-class fhandler_base;
-
-class cygheap_exec_info
-{
-public:
- __uid32_t uid;
- 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;
- HANDLE hexec_proc;
-
- child_info_spawn (): moreinfo (NULL) {}
- ~child_info_spawn ()
- {
- if (parent)
- CloseHandle (parent);
- 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);
- }
- }
-};
-
-void __stdcall init_child_info (DWORD, child_info *, int, HANDLE);
-
-extern child_info *child_proc_info;
-extern child_info_spawn *spawn_info __attribute__ ((alias ("child_proc_info")));
-extern child_info_fork *fork_info __attribute__ ((alias ("child_proc_info")));
diff --git a/winsup/cygwin/config.h.in b/winsup/cygwin/config.h.in
deleted file mode 100644
index 8a961b33c..000000000
--- a/winsup/cygwin/config.h.in
+++ /dev/null
@@ -1,41 +0,0 @@
-/* config.h.in. Generated automatically from configure.in by autoheader. */
-
-/* Define if using alloca.c. */
-#undef C_ALLOCA
-
-/* 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 if you have alloca, as a function or macro. */
-#undef HAVE_ALLOCA
-
-/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
-#undef HAVE_ALLOCA_H
-
-/* 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
-
-/* Define if DEBUGGING support is requested. */
-#undef DEBUGGING
-
-/* Define if MALLOC_DEBUGGING support is requested. */
-#undef MALLOC_DEBUG
-
-/* Define if building "extra" thread-safe Cygwin DLL. */
-#undef _CYG_THREAD_FAILSAFE
-
-/* Define if GCC supports builtin memset. */
-#undef HAVE_BUILTIN_MEMSET
-
-/* Define if building thread-safe Cygwin DLL. */
-#undef _MT_SAFE
-
-/* Define if using new vfork functionality. */
-#undef NEWVFORK
diff --git a/winsup/cygwin/config/i386/longjmp.c b/winsup/cygwin/config/i386/longjmp.c
deleted file mode 100644
index 62c52aaa0..000000000
--- a/winsup/cygwin/config/i386/longjmp.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* longjmp.c
-
- 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. */
-
-#ifdef __i386__
-#if 1
-asm (" .globl _longjmp \n"
-"_longjmp: \n"
-" pushl %ebp \n"
-" movl %esp,%ebp \n"
-" movl 8(%ebp),%edi \n"
-" movl 12(%ebp),%eax \n"
-" testl %eax,%eax \n"
-" jne 0f \n"
-" incl %eax \n"
-"0: \n"
-" movl %eax,0(%edi) \n"
-" movl 24(%edi),%ebp \n"
-" pushfl \n"
-" popl %ebx \n"
-" movw 42(%edi),%ax \n"
-" movw %ax,%ss \n"
-" movl 28(%edi),%esp \n"
-" pushl 32(%edi) \n"
-" pushl %ebx \n"
-" movw 36(%edi),%ax \n"
-" movw %ax,%es \n"
-#if 0
-/* fs is a system register in windows; don't muck with it */
-" movw 38(%edi),%ax \n"
-" movw %ax,%fs \n"
-#endif
-" movw 40(%edi),%ax \n"
-" movw %ax,%gs \n"
-" movl 0(%edi),%eax \n"
-" movl 4(%edi),%ebx \n"
-" movl 8(%edi),%ecx \n"
-" movl 12(%edi),%edx \n"
-" movl 16(%edi),%esi \n"
-" movl 20(%edi),%edi \n"
-" popfl \n"
-" ret \n");
-#endif
-
-#endif /* __i386__ */
diff --git a/winsup/cygwin/config/i386/makefrag b/winsup/cygwin/config/i386/makefrag
deleted file mode 100644
index c7f6b2d17..000000000
--- a/winsup/cygwin/config/i386/makefrag
+++ /dev/null
@@ -1,17 +0,0 @@
-# makefrag: included by the main Cygwin Makefile.in
-
-# Copyright 1996, 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.
-
-EXTRA_DLL_OFILES=setjmp.o longjmp.o
-
-setjmp.o:config/i386/setjmp.c
- $(CC) -c $(ALL_CFLAGS) $<
-
-longjmp.o:config/i386/longjmp.c
- $(CC) -c $(ALL_CFLAGS) $<
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/config/i386/setjmp.c b/winsup/cygwin/config/i386/setjmp.c
deleted file mode 100644
index 9104c2c83..000000000
--- a/winsup/cygwin/config/i386/setjmp.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/* setjmp.c
-
- 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. */
-
-#ifdef __i386__
-
-#if 1
-asm(" .globl _setjmp \n"
-"_setjmp: \n"
-" pushl %ebp \n"
-" movl %esp,%ebp \n"
-" pushl %edi \n"
-" movl 8(%ebp),%edi \n"
-" movl %eax,0(%edi) \n"
-" movl %ebx,4(%edi) \n"
-" movl %ecx,8(%edi) \n"
-" movl %edx,12(%edi) \n"
-" movl %esi,16(%edi) \n"
-" movl -4(%ebp),%eax \n"
-" movl %eax,20(%edi) \n"
-" movl 0(%ebp),%eax \n"
-" movl %eax,24(%edi) \n"
-" movl %esp,%eax \n"
-" addl $12,%eax \n"
-" movl %eax,28(%edi) \n"
-" movl 4(%ebp),%eax \n"
-" movl %eax,32(%edi) \n"
-" movw %es, %ax \n"
-" movw %ax, 36(%edi) \n"
-" movw %fs, %ax \n"
-" movw %ax, 38(%edi) \n"
-" movw %gs, %ax \n"
-" movw %ax, 40(%edi) \n"
-" movw %ss, %ax \n"
-" movw %ax, 42(%edi) \n"
-" popl %edi \n"
-" movl $0,%eax \n"
-" leave \n"
-" ret \n");
-#endif
-
-#endif /* __i386__ */
diff --git a/winsup/cygwin/configure b/winsup/cygwin/configure
deleted file mode 100755
index 3f41211fb..000000000
--- a/winsup/cygwin/configure
+++ /dev/null
@@ -1,2416 +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-threadsafe=[runtime] Build a cygwin DLL which is thread safe"
-ac_help="$ac_help
- --enable-extra-threadsafe-checking Build a cygwin DLL which is thread safe with extra consistency checking"
-ac_help="$ac_help
- --enable-debugging Build a cygwin DLL which has more consistency checking for debugging"
-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
-
-
-
-
-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 <<EOF
-#ifdef __GNUC__
- yes;
-#endif
-EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:851: \"$ac_try\") 1>&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"
- ;;
- *)
- all_host=
- install_host=
- ;;
-esac
-
-
-
-
-# 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:1013: 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:1045: 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:1080: 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:1112: 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}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:1147: 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:1179: 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}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:1214: 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:1246: 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:1281: 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:1313: 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}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:1348: 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:1380: 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}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:1415: 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:1447: 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:1481: 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 <<EOF
-#line 1496 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1502: \"$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 <<EOF
-#line 1513 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1519: \"$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 <<EOF
-#line 1530 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1536: \"$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:1563: 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 <<EOF
-#line 1568 "configure"
-#include "confdefs.h"
-#include <alloca.h>
-int main() {
-char *p = alloca(2 * sizeof(int));
-; return 0; }
-EOF
-if { (eval echo configure:1575: \"$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:1596: 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 <<EOF
-#line 1601 "configure"
-#include "confdefs.h"
-
-#ifdef __GNUC__
-# define alloca __builtin_alloca
-#else
-# ifdef _MSC_VER
-# include <malloc.h>
-# define alloca _alloca
-# else
-# if HAVE_ALLOCA_H
-# include <alloca.h>
-# 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:1629: \"$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:1661: 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 <<EOF
-#line 1666 "configure"
-#include "confdefs.h"
-#if defined(CRAY) && ! defined(CRAY2)
-webecray
-#else
-wenotbecray
-#endif
-
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&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:1691: 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 <<EOF
-#line 1696 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func(); below. */
-#include <assert.h>
-/* 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:1719: \"$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 <<EOF
-#define CRAY_STACKSEG_END $ac_func
-EOF
-
- break
-else
- echo "$ac_t""no" 1>&6
-fi
-
-done
-fi
-
-echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:1746: 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 <<EOF
-#line 1754 "configure"
-#include "confdefs.h"
-find_stack_direction ()
-{
- static char *addr = 0;
- auto char dummy;
- if (addr == 0)
- {
- addr = &dummy;
- return find_stack_direction ();
- }
- else
- return (&dummy > addr) ? 1 : -1;
-}
-main ()
-{
- exit (find_stack_direction() < 0);
-}
-EOF
-if { (eval echo configure:1773: \"$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 <<EOF
-#define STACK_DIRECTION $ac_cv_c_stack_direction
-EOF
-
-fi
-
-echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:1795: 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 <<EOF
-#line 1832 "configure"
-#include "confdefs.h"
-
-#include <string.h>
-void foo(char *s, int c, size_t n)
-{
- __builtin_memset(s, c, n);
-}
-
-int main() {
-
-; return 0; }
-EOF
-if { (eval echo configure:1845: \"$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
-
-
-mt_safe_val=1
-MT_SAFE=yes
-
-# Check whether --enable-threadsafe or --disable-threadsafe was given.
-if test "${enable_threadsafe+set}" = set; then
- enableval="$enable_threadsafe"
- case "${enableval}" in
-yes)
- ;;
-runtime)
- mt_safe_val=2
- MT_SAFE=yes
- ;;
-no)
- mt_safe_val=0
- MT_SAFE=no
- ;;
-esac
-
-fi
-
-
-# Check whether --enable-extra-threadsafe-checking or --disable-extra-threadsafe-checking was given.
-if test "${enable_extra_threadsafe_checking+set}" = set; then
- enableval="$enable_extra_threadsafe_checking"
- case "${enableval}" in
-yes)
- mt_safe_val=1
- MT_SAFE=yes
- cat >> confdefs.h <<\EOF
-#define _CYG_THREAD_FAILSAFE 1
-EOF
-
- ;;
-no)
- ;;
-esac
-
-fi
-
-
-if test "$MT_SAFE" = "yes"; then
- cat >> confdefs.h <<EOF
-#define _MT_SAFE $mt_safe_val
-EOF
-
-fi
-
-
-
-# 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
-
-
-MALLOC_OFILES=
-# 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 <<EOF
-#define NEWVFORK 1
-EOF
- ;;
-esac
-
-
-
-
-echo $ac_n "checking if newlib is part of the build tree""... $ac_c" 1>&6
-echo "configure:1970: checking if newlib is part of the build tree" >&5
-
-EXE_LDFLAGS=
-if test -d ../newlib
-then
- echo "$ac_t""yes" 1>&6
- EXE_LDFLAGS="-B../../newlib/ -B../"
-else
- echo "$ac_t""no" 1>&6
-fi
-
-
-if test x"$EXE_LDFLAGS" = x
-then
- echo $ac_n "checking if installed newlib needed""... $ac_c" 1>&6
-echo "configure:1985: checking if installed newlib needed" >&5
- cat > conftest.$ac_ext <<EOF
-#line 1987 "configure"
-#include "confdefs.h"
-
-int main() {
-/* main already defined */
-
-; return 0; }
-EOF
-if { (eval echo configure:1995: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- echo "$ac_t""no" 1>&6
-
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- echo "$ac_t""yes" 1>&6
- echo "configure: warning: newlib not found - utility .exe's may not link" 1>&2
-fi
-rm -f conftest*
-fi
-
-
-case "$target_cpu" in
- i386|i486|i586|i686) DLL_ENTRY="_dll_entry@12"
- DEF_DLL_ENTRY="dll_entry@12"
- ALLOCA="_alloca"
- CONFIG_DIR="i386" ;;
- powerpc*) DLL_ENTRY="dll_entry"
- DEF_DLL_ENTRY="dll_entry"
- ALLOCA=" __allocate_stack"
- CONFIG_DIR="ppc" ;;
- *) { echo "configure: error: Invalid target processor \"$target_cpu\"" 1>&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 <<EOF
-#! /bin/sh
-# Generated automatically by configure.
-# Run this file to recreate the current configuration.
-# This directory was configured as follows,
-# on host `(hostname || uname -n) 2>/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 cygwin.def:cygwin.din config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-# Protect against being on the right side of a sed subst in config.status.
-sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
- s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > 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%@RANLIB@%$RANLIB%g
-s%@LD@%$LD%g
-s%@NM@%$NM%g
-s%@DLLTOOL@%$DLLTOOL%g
-s%@WINDRES@%$WINDRES%g
-s%@CPP@%$CPP%g
-s%@ALLOCA@%$ALLOCA%g
-s%@SET_MAKE@%$SET_MAKE%g
-s%@MT_SAFE@%$MT_SAFE%g
-s%@EXE_LDFLAGS@%$EXE_LDFLAGS%g
-s%@MALLOC_OFILES@%$MALLOC_OFILES%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 <<EOF
-
-CONFIG_FILES=\${CONFIG_FILES-"Makefile cygwin.def:cygwin.din"}
-EOF
-cat >> $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 <<EOF
- CONFIG_HEADERS="config.h"
-EOF
-cat >> $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 <<CEOF' >> $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 <<EOF
-
-EOF
-cat >> $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 3934992a7..000000000
--- a/winsup/cygwin/configure.in
+++ /dev/null
@@ -1,257 +0,0 @@
-dnl Autoconf configure script for Cygwin.
-dnl Copyright 1996, 1997, 1998, 2000, 2001 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)
-
-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"
- ;;
- *)
- all_host=
- install_host=
- ;;
-esac
-
-AC_SUBST(all_host)
-AC_SUBST(install_host)
-
-AC_CHECK_TOOL(AR, ar, ar)
-dnl AC_SUBST(AR)
-AC_CHECK_TOOL(AS, as, as)
-dnl C_SUBST(AS)
-AC_CHECK_TOOL(RANLIB, ranlib, ranlib)
-dnl C_SUBST(RANLIB)
-AC_CHECK_TOOL(LD, ld, ld)
-dnl C_SUBST(LD)
-AC_CHECK_TOOL(NM, nm, nm)
-dnl C_SUBST(NM)
-AC_CHECK_TOOL(DLLTOOL, dlltool, dlltool)
-dnl C_SUBST(DLLTOOL)
-AC_CHECK_TOOL(WINDRES, windres, windres)
-dnl C_SUBST(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 <string.h>
-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
-
-dnl set default mt safeness and then process the options.
-mt_safe_val=1
-MT_SAFE=yes
-
-AC_ARG_ENABLE(threadsafe,
-[ --enable-threadsafe=[runtime] Build a cygwin DLL which is thread safe],
-[case "${enableval}" in
-yes)
- dnl default.
- ;;
-runtime)
- mt_safe_val=2
- MT_SAFE=yes
- ;;
-no)
- mt_safe_val=0
- MT_SAFE=no
- ;;
-esac
-])
-
-AC_ARG_ENABLE(extra-threadsafe-checking,
-[ --enable-extra-threadsafe-checking Build a cygwin DLL which is thread safe with extra consistency checking],
-[case "${enableval}" in
-yes)
- mt_safe_val=1
- MT_SAFE=yes
- AC_DEFINE(_CYG_THREAD_FAILSAFE)
- ;;
-no)
- dnl Don't do anything here to avoid overriding --enable-threadsafe.
- ;;
-esac
-])
-
-if test "$MT_SAFE" = "yes"; then
- AC_DEFINE_UNQUOTED(_MT_SAFE,$mt_safe_val)
-fi
-
-dnl Makefile uses MT_SAFE, so we subst as well as defining it.
-AC_SUBST(MT_SAFE)
-
-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
-])
-
-MALLOC_OFILES=
-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
-
-dnl
-dnl If newlib is part of build tree, always set EXE_LDFLAGS to point to
-dnl it; this is important in cases where the installed newlib is perhaps
-dnl not compatible. Check and warn for installed newlib only if it's not
-dnl part of the build tree.
-dnl
-
-AC_MSG_CHECKING([if newlib is part of the build tree])
-
-EXE_LDFLAGS=
-if test -d ../newlib
-then
- AC_MSG_RESULT(yes)
- EXE_LDFLAGS="-B../../newlib/ -B../"
-else
- AC_MSG_RESULT(no)
-fi
- AC_SUBST(EXE_LDFLAGS)
-
-if test x"$EXE_LDFLAGS" = x
-then
- AC_MSG_CHECKING([if installed newlib needed])
- AC_TRY_LINK(,
- [/* main already defined */]
- ,
- AC_MSG_RESULT(no)
- ,
- AC_MSG_RESULT(yes)
- AC_MSG_WARN(newlib not found - utility .exe's may not link))
-fi
-AC_SUBST(EXE_LDFLAGS)
-
-case "$target_cpu" in
- i386|i486|i586|i686) DLL_ENTRY="_dll_entry@12"
- DEF_DLL_ENTRY="dll_entry@12"
- ALLOCA="_alloca"
- CONFIG_DIR="i386" ;;
- powerpc*) DLL_ENTRY="dll_entry"
- DEF_DLL_ENTRY="dll_entry"
- ALLOCA=" __allocate_stack"
- CONFIG_DIR="ppc" ;;
- *) AC_MSG_ERROR(Invalid target processor \"$target_cpu\") ;;
-esac
-
-AC_SUBST(MALLOC_OFILES)
-AC_SUBST(DLL_ENTRY)
-AC_SUBST(DEF_DLL_ENTRY)
-AC_SUBST(ALLOCA)
-AC_SUBST(CONFIG_DIR)
-AC_OUTPUT(Makefile cygwin.def:cygwin.din)
-
diff --git a/winsup/cygwin/cxx.cc b/winsup/cygwin/cxx.cc
deleted file mode 100644
index b52485a20..000000000
--- a/winsup/cygwin/cxx.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/* cxx.cc
-
- 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. */
-
-#if (__GNUC__ >= 3)
-
-#include "winsup.h"
-#include <stdlib.h>
-
-void *
-operator new (size_t s)
-{
- void *p = malloc (s);
- if (p)
- memset (p,0,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");
-}
-
-#endif
diff --git a/winsup/cygwin/cygerrno.h b/winsup/cygwin/cygerrno.h
deleted file mode 100644
index 0c1513f25..000000000
--- a/winsup/cygwin/cygerrno.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* cygerrno.h: main Cygwin header file.
-
- 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 __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, int deferrno) __attribute__ ((regparm(2)));
-
-#define __seterrno() seterrno (__FILE__, __LINE__)
-#define __seterrno_from_win_error(val) seterrno_from_win_error (__FILE__, __LINE__, val)
-
-#ifndef DEBUGGING
-#define set_errno(val) (_impure_ptr->_errno = (val))
-#else
-int __stdcall __set_errno (const char *ln, int ln, int val) __attribute ((regparm(3)));
-#define set_errno(val) __set_errno (__PRETTY_FUNCTION__, __LINE__, (val))
-#endif
-#define get_errno() (_impure_ptr->_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;
diff --git a/winsup/cygwin/cygheap.cc b/winsup/cygwin/cygheap.cc
deleted file mode 100644
index 0bfb06a7e..000000000
--- a/winsup/cygwin/cygheap.cc
+++ /dev/null
@@ -1,502 +0,0 @@
-/* cygheap.cc: Cygwin heap manager.
-
- 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. */
-
-#include "winsup.h"
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <stdlib.h>
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygerrno.h"
-#include "cygheap.h"
-#include "child_info.h"
-#include "heap.h"
-#include "sync.h"
-#include "shared_info.h"
-
-init_cygheap NO_COPY *cygheap;
-void NO_COPY *cygheap_max;
-
-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)) - (int) (N0->data)))
-
-#define CFMAP_OPTIONS (SEC_RESERVE | PAGE_READWRITE)
-#define MVMAP_OPTIONS (FILE_MAP_WRITE)
-
-extern "C" {
-static void __stdcall _cfree (void *ptr) __attribute__((regparm(1)));
-}
-
-inline static void
-init_cheap ()
-{
- cygheap = (init_cygheap *) VirtualAlloc ((void *) &_cygheap_start, CYGHEAPSIZE, MEM_RESERVE, PAGE_NOACCESS);
- if (!cygheap)
- {
- MEMORY_BASIC_INFORMATION m;
- if (!VirtualQuery ((LPCVOID) &_cygheap_start, &m, sizeof m))
- system_printf ("couldn't get memory info, %E");
- system_printf ("Couldn't reserve space for cygwin's heap, %E");
- api_fatal ("AllocationBase %p, BaseAddress %p, RegionSize %p, State %p\n",
- m.AllocationBase, m.BaseAddress, m.RegionSize, m.State);
- }
- cygheap_max = cygheap;
-}
-
-static void dup_now (void *, child_info *, unsigned) __attribute__ ((regparm(3)));
-static void
-dup_now (void *newcygheap, child_info *ci, unsigned n)
-{
- if (!VirtualAlloc (newcygheap, n, MEM_COMMIT, PAGE_READWRITE))
- api_fatal ("couldn't allocate new cygwin heap %p, %d for child, %E",
- newcygheap, n);
- memcpy (newcygheap, cygheap, n);
-}
-
-void *__stdcall
-cygheap_setup_for_child (child_info *ci, bool dup_later)
-{
- void *newcygheap;
- cygheap_protect->acquire ();
- unsigned n = (char *) cygheap_max - (char *) cygheap;
- unsigned size = CYGHEAPSIZE;
- if (size < n)
- size = n + (128 * 1024);
- ci->cygheap_h = CreateFileMapping (INVALID_HANDLE_VALUE, &sec_none,
- CFMAP_OPTIONS, 0, size, NULL);
- if (!ci->cygheap_h)
- api_fatal ("Couldn't create heap for child, size %d, %E", CYGHEAPSIZE);
- newcygheap = MapViewOfFileEx (ci->cygheap_h, MVMAP_OPTIONS, 0, 0, 0, NULL);
- ProtectHandle1INH (ci->cygheap_h, passed_cygheap_h);
- if (!dup_later)
- dup_now (newcygheap, ci, n);
- cygheap_protect->release ();
- ci->cygheap = cygheap;
- ci->cygheap_max = cygheap_max;
- return newcygheap;
-}
-
-void __stdcall
-cygheap_setup_for_child_cleanup (void *newcygheap, child_info *ci,
- bool dup_it_now)
-{
- if (dup_it_now)
- {
- /* NOTE: There is an assumption here that cygheap_max has not changed
- between the time that cygheap_setup_for_child was called and now.
- Make sure that this is a correct assumption. */
- cygheap_protect->acquire ();
- dup_now (newcygheap, ci, (char *) cygheap_max - (char *) cygheap);
- cygheap_protect->release ();
- }
- UnmapViewOfFile (newcygheap);
- ForceCloseHandle1 (ci->cygheap_h, passed_cygheap_h);
-}
-
-/* Called by fork or spawn to reallocate cygwin heap */
-void __stdcall
-cygheap_fixup_in_child (bool execed)
-{
- cygheap = child_proc_info->cygheap;
- cygheap_max = child_proc_info->cygheap_max;
- void *addr = !wincap.map_view_of_file_ex_sucks () ? cygheap : NULL;
- void *newaddr;
-
- newaddr = MapViewOfFileEx (child_proc_info->cygheap_h, MVMAP_OPTIONS, 0, 0, 0, addr);
- if (newaddr != cygheap)
- {
- if (!newaddr)
- newaddr = MapViewOfFileEx (child_proc_info->cygheap_h, MVMAP_OPTIONS, 0, 0, 0, NULL);
- DWORD n = (DWORD) cygheap_max - (DWORD) cygheap;
- /* Reserve cygwin heap in same spot as parent */
- if (!VirtualAlloc (cygheap, CYGHEAPSIZE, MEM_RESERVE, PAGE_NOACCESS))
- {
- MEMORY_BASIC_INFORMATION m;
- memset (&m, 0, sizeof m);
- if (!VirtualQuery ((LPCVOID) cygheap, &m, sizeof m))
- system_printf ("couldn't get memory info, %E");
-
- system_printf ("Couldn't reserve space for cygwin's heap (%p <%p>) in child, %E", cygheap, newaddr);
- api_fatal ("m.AllocationBase %p, m.BaseAddress %p, m.RegionSize %p, m.State %p\n",
- m.AllocationBase, m.BaseAddress, m.RegionSize, m.State);
- }
-
- /* Allocate same amount of memory as parent */
- if (!VirtualAlloc (cygheap, n, MEM_COMMIT, PAGE_READWRITE))
- api_fatal ("Couldn't allocate space for child's heap %p, size %d, %E",
- cygheap, n);
- memcpy (cygheap, newaddr, n);
- UnmapViewOfFile (newaddr);
- }
-
- ForceCloseHandle1 (child_proc_info->cygheap_h, passed_cygheap_h);
-
- cygheap_init ();
- debug_fixup_after_fork_exec ();
-
- if (execed)
- {
- 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 */
- }
- }
-}
-
-#define pagetrunc(x) ((void *) (((DWORD) (x)) & ~(4096 - 1)))
-
-static void *__stdcall
-_csbrk (int sbs)
-{
- void *prebrk = cygheap_max;
- void *prebrka = pagetrunc (prebrk);
- (char *) cygheap_max += sbs;
- if (!sbs || (prebrk != prebrka && prebrka == pagetrunc (cygheap_max)))
- /* nothing to do */;
- else if (!VirtualAlloc (prebrk, (DWORD) sbs, MEM_COMMIT, PAGE_READWRITE))
- {
- malloc_printf ("couldn't commit memory for cygwin heap, %E");
- __seterrno ();
- (char *) cygheap_max -= sbs;
- return NULL;
- }
-
- return prebrk;
-}
-
-extern "C" void __stdcall
-cygheap_init ()
-{
- new_muto (cygheap_protect);
- if (!cygheap)
- {
- init_cheap ();
- (void) _csbrk (sizeof (*cygheap));
- }
- if (!cygheap->fdtab)
- cygheap->fdtab.init ();
-}
-
-/* Copyright (C) 1997, 2000 DJ Delorie */
-
-static void *_cmalloc (int size) __attribute ((regparm(1)));
-static void *__stdcall _crealloc (void *ptr, int size) __attribute ((regparm(2)));
-
-static void *__stdcall
-_cmalloc (int 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 + sizeof (_cmalloc_entry));
- 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
- {
- size = sz + sizeof (_cmalloc_entry);
- rvc = (_cmalloc_entry *) _csbrk (size);
- 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, int size) __attribute__((regparm(2)));
-static void *__stdcall
-_crealloc (void *ptr, int size)
-{
- void *newptr;
- if (ptr == NULL)
- newptr = _cmalloc (size);
- else
- {
- int 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, int len)
-{
- if (!c)
- {
- __seterrno ();
- 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)
- system_printf ("cmalloc returned NULL");
- 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));
- if (!c)
- system_printf ("crealloc returned NULL");
- return creturn (t, c, n);
-}
-
-extern "C" void __stdcall
-cfree (void *s)
-{
- assert (!inheap (s));
- (void) _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);
- if (!c)
- system_printf ("ccalloc returned NULL");
- 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;
-}
-
-bool
-init_cygheap::etc_changed ()
-{
- bool res = 0;
-
- if (!etc_changed_h)
- {
- path_conv pwd ("/etc");
- etc_changed_h = FindFirstChangeNotification (pwd, FALSE,
- FILE_NOTIFY_CHANGE_LAST_WRITE);
- if (etc_changed_h == INVALID_HANDLE_VALUE)
- system_printf ("Can't open /etc for checking, %E", (char *) pwd,
- etc_changed_h);
- else if (!DuplicateHandle (hMainProc, etc_changed_h, hMainProc,
- &etc_changed_h, 0, TRUE,
- DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
- {
- system_printf ("Can't inherit /etc handle, %E", (char *) pwd,
- etc_changed_h);
- etc_changed_h = INVALID_HANDLE_VALUE;
- }
- }
-
- if (etc_changed_h != INVALID_HANDLE_VALUE
- && WaitForSingleObject (etc_changed_h, 0) == WAIT_OBJECT_0)
- {
- (void) FindNextChangeNotification (etc_changed_h);
- res = 1;
- }
-
- return res;
-}
-
-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);
-}
-
-BOOL
-cygheap_user::set_sid (PSID new_sid)
-{
- if (new_sid)
- {
- if (!psid)
- psid = cmalloc (HEAP_STR, MAX_SID_LEN);
- if (psid)
- return CopySid (MAX_SID_LEN, psid, new_sid);
- }
- return FALSE;
-}
-
-BOOL
-cygheap_user::set_orig_sid ()
-{
- if (psid)
- {
- if (!orig_psid) orig_psid = cmalloc (HEAP_STR, MAX_SID_LEN);
- if (orig_psid)
- return CopySid (MAX_SID_LEN, orig_psid, psid);
- }
- return FALSE;
-}
diff --git a/winsup/cygwin/cygheap.h b/winsup/cygwin/cygheap.h
deleted file mode 100644
index 703c1d1dc..000000000
--- a/winsup/cygwin/cygheap.h
+++ /dev/null
@@ -1,331 +0,0 @@
-/* cygheap.h: Cygwin heap manager.
-
- 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. */
-
-#undef cfree
-
-enum cygheap_types
-{
- HEAP_FHANDLER,
- HEAP_STR,
- HEAP_ARGV,
- HEAP_BUF,
- HEAP_MOUNT,
- HEAP_1_START,
- HEAP_1_STR,
- HEAP_1_ARGV,
- HEAP_1_BUF,
- HEAP_1_EXEC,
- HEAP_1_MAX = 100
-};
-
-#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[MAX_PATH];
- unsigned posix_pathlen;
- char native_path[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 *posix, const char *native);
- 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
-};
-
-struct passwd;
-
-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 *pwinname; /* User's name as far as Windows knows it */
- char *puserprof; /* User profile */
- PSID psid; /* buffer for user's SID */
- PSID orig_psid; /* Remains intact even after impersonation */
-public:
- __uid32_t orig_uid; /* Remains intact even after impersonation */
- __gid32_t orig_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 token;
- BOOL impersonated;
-
- /* 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 f this
- situation ever changes.
- cygheap_user () : pname (NULL), plogsrv (NULL), pdomain (NULL),
- homedrive (NULL), homepath (NULL), psid (NULL),
- token (INVALID_HANDLE_VALUE) {}
- */
-
- ~cygheap_user ();
-
- 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 *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);
- BOOL set_orig_sid ();
- PSID sid () const { return psid; }
- PSID orig_sid () const { return orig_psid; }
- const char *ontherange (homebodies what, struct passwd * = NULL);
- bool issetuid () const
- {
- return impersonated && token != INVALID_HANDLE_VALUE;
- }
- 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;
- muto *cwd_lock;
- char *get (char *buf, int need_posix = 1, int with_chroot = 0, unsigned ulen = MAX_PATH);
- DWORD get_hash ();
- void init ();
- void fixup_after_exec (char *win32, char *posix, DWORD hash);
- bool get_initial ();
- void set (const char *win32_cwd, const char *posix_cwd = NULL);
-};
-
-#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;
- unsigned chunk;
-};
-
-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 etc_changed_h;
- char *cygwin_regname;
- cwdstuff cwd;
- dtable fdtab;
-#ifdef DEBUGGING
- cygheap_debug debug;
-#endif
-
- bool etc_changed ();
-};
-
-#define CYGHEAPSIZE (sizeof (init_cygheap) + (16000 * sizeof (fhandler_union)) + (4 * 65536))
-
-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)
- ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygheap_fdmanip");
- }
- void release ()
- {
- cygheap->fdtab.release (fd);
- }
- operator int &() {return fd;}
- operator fhandler_base* &() {return *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)
- SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygheap_fdnew");
- 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)
- ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygheap_fdnew");
- 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)
- SetResourceLock (LOCK_FD_LIST, READ_LOCK, "cygheap_fdget");
- 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)
- ReleaseResourceLock (LOCK_FD_LIST, READ_LOCK, "cygheap_fdget");
- locked = false;
- }
- }
-};
-
-class child_info;
-void *__stdcall cygheap_setup_for_child (child_info *ci, bool dup_later) __attribute__ ((regparm(2)));
-void __stdcall cygheap_setup_for_child_cleanup (void *, child_info *, bool) __attribute__ ((regparm(3)));
-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 DWORD _cygheap_start;
-}
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 <<EOF > $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 2c1bbde42..000000000
--- a/winsup/cygwin/cygmalloc.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* cygmalloc.h: cygwin DLL malloc stuff
-
- 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. */
-
-extern "C" void dlfree (void *p) __attribute__ ((regparm (1)));
-extern "C" void *dlmalloc (unsigned size) __attribute__ ((regparm (1)));
-extern "C" void *dlrealloc (void *p, unsigned size) __attribute__ ((regparm (2)));
-extern "C" void *dlcalloc (size_t nmemb, size_t size) __attribute__ ((regparm (2)));
-extern "C" void *dlmemalign (size_t alignment, size_t bytes) __attribute__ ((regparm (2)));
-extern "C" void *dlvalloc (size_t bytes) __attribute__ ((regparm (1)));
-extern "C" size_t dlmalloc_usable_size (void *p) __attribute__ ((regparm (1)));
-extern "C" int dlmalloc_trim (size_t) __attribute__ ((regparm (1)));
-extern "C" int dlmallopt (int p, int v) __attribute__ ((regparm (2)));
-extern "C" void dlmalloc_stats ();
-
-#ifndef __INSIDE_CYGWIN__
-# define USE_DL_PREFIX 1
-# define MORECORE_CANNOT_TRIM 1
-#else
-# define __malloc_lock() mallock->acquire ()
-# define __malloc_unlock() mallock->release ()
-extern muto *mallock;
-#endif
diff --git a/winsup/cygwin/cygrun.c b/winsup/cygwin/cygrun.c
deleted file mode 100644
index 63d9863f7..000000000
--- a/winsup/cygwin/cygrun.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* cygrun.c: testsuite support program
-
- Copyright 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. */
-
-/* This program is intended to be used only by the testsuite. It runs
- programs without using the cygwin api, so that the just-built dll
- can be tested without interference from the currently installed
- dll. */
-
-#include <stdio.h>
-#include <windows.h>
-#include <stdlib.h>
-
-int
-main (int argc, char **argv)
-{
- STARTUPINFO sa;
- PROCESS_INFORMATION pi;
- DWORD ec = 1;
- char *p;
-
- if (argc < 2)
- {
- fprintf (stderr, "Usage: cygrun [program]\n");
- exit (0);
- }
-
- SetEnvironmentVariable ("CYGWIN_TESTING", "1");
- if ((p = getenv ("CYGWIN")) == NULL || (strstr (p, "ntsec") == NULL))
- {
- char buf[4096];
- if (!p)
- {
- p = buf;
- p[0] = '\0';
- }
- else
- {
- strcpy (buf, p);
- strcat (buf, " ");
- }
- strcat(buf, "ntsec");
- SetEnvironmentVariable ("CYGWIN", buf);
- }
-
- memset (&sa, 0, sizeof (sa));
- memset (&pi, 0, sizeof (pi));
- if (!CreateProcess (0, argv[1], 0, 0, 1, 0, 0, 0, &sa, &pi))
- {
- fprintf (stderr, "CreateProcess %s failed\n", argv[1]);
- exit (1);
- }
-
- WaitForSingleObject (pi.hProcess, INFINITE);
-
- GetExitCodeProcess (pi.hProcess, &ec);
-
- CloseHandle (pi.hProcess);
- CloseHandle (pi.hThread);
- return ec;
-}
diff --git a/winsup/cygwin/cygserver.cc b/winsup/cygwin/cygserver.cc
deleted file mode 100755
index 0c0740379..000000000
--- a/winsup/cygwin/cygserver.cc
+++ /dev/null
@@ -1,774 +0,0 @@
-/* cygserver.cc
-
- Copyright 2001, 2002 Red Hat Inc.
-
- Written by Egor Duda <deo@logos-m.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 "woutsup.h"
-
-#include <sys/types.h>
-
-#include <assert.h>
-#include <ctype.h>
-#include <errno.h>
-#include <getopt.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "cygerrno.h"
-#include "cygwin_version.h"
-
-#include "cygwin/cygserver.h"
-#include "cygwin/cygserver_process.h"
-#include "cygwin/cygserver_transport.h"
-
-// Version string.
-static const char version[] = "$Revision$";
-
-/*
- * Support function for the XXX_printf () macros in "woutsup.h".
- * Copied verbatim from "strace.cc".
- */
-static int
-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;
-}
-
-/*
- * Support function for the XXX_printf () macros in "woutsup.h".
- */
-extern "C" void
-__cygserver__printf (const char *const function, const char *const fmt, ...)
-{
- const DWORD lasterror = GetLastError ();
- const int lasterrno = errno;
-
- va_list ap;
-
- char *const buf = (char *) alloca (BUFSIZ);
-
- assert (buf);
-
- int len = 0;
-
- if (function)
- len += getfunc (buf, function);
-
- va_start (ap, fmt);
- len += vsnprintf (buf + len, BUFSIZ - len, fmt, ap);
- va_end (ap);
-
- len += snprintf (buf + len, BUFSIZ - len, "\n");
-
- const int actual = (len > BUFSIZ ? BUFSIZ : len);
-
- write (2, buf, actual);
-
- errno = lasterrno;
- SetLastError (lasterror);
-
- return;
-}
-
-#ifdef DEBUGGING
-
-int __stdcall
-__set_errno (const char *func, int ln, int val)
-{
- debug_printf ("%s:%d val %d", func, ln, val);
- return _impure_ptr->_errno = val;
-}
-
-#endif /* DEBUGGING */
-
-GENERIC_MAPPING access_mapping;
-
-static BOOL
-setup_privileges ()
-{
- BOOL rc, ret_val;
- HANDLE hToken = NULL;
- TOKEN_PRIVILEGES sPrivileges;
-
- rc = OpenProcessToken (GetCurrentProcess () , TOKEN_ALL_ACCESS , &hToken) ;
- if (!rc)
- {
- system_printf ("error opening process token (%lu)", GetLastError ());
- ret_val = FALSE;
- goto out;
- }
- rc = LookupPrivilegeValue (NULL, SE_DEBUG_NAME, &sPrivileges.Privileges[0].Luid);
- if (!rc)
- {
- system_printf ("error getting privilege luid (%lu)", GetLastError ());
- ret_val = FALSE;
- goto out;
- }
- sPrivileges.PrivilegeCount = 1 ;
- sPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED ;
- rc = AdjustTokenPrivileges (hToken, FALSE, &sPrivileges, 0, NULL, NULL) ;
- if (!rc)
- {
- system_printf ("error adjusting privilege level. (%lu)",
- GetLastError ());
- ret_val = FALSE;
- goto out;
- }
-
- access_mapping.GenericRead = FILE_READ_DATA;
- access_mapping.GenericWrite = FILE_WRITE_DATA;
- access_mapping.GenericExecute = 0;
- access_mapping.GenericAll = FILE_READ_DATA | FILE_WRITE_DATA;
-
- ret_val = TRUE;
-
-out:
- CloseHandle (hToken);
- return ret_val;
-}
-
-int
-check_and_dup_handle (HANDLE from_process, HANDLE to_process,
- HANDLE from_process_token,
- DWORD access,
- HANDLE from_handle,
- HANDLE *to_handle_ptr, BOOL bInheritHandle = FALSE)
-{
- HANDLE local_handle = NULL;
- int ret_val = EACCES;
-
- if (from_process != GetCurrentProcess ())
- {
- if (!DuplicateHandle (from_process, from_handle,
- GetCurrentProcess (), &local_handle,
- 0, bInheritHandle,
- DUPLICATE_SAME_ACCESS))
- {
- system_printf ("error getting handle(%u) to server (%lu)",
- (unsigned int)from_handle, GetLastError ());
- goto out;
- }
- } else
- local_handle = from_handle;
-
- if (!wincap.has_security ())
- assert (!from_process_token);
- else
- {
- char sd_buf [1024];
- PSECURITY_DESCRIPTOR sd = (PSECURITY_DESCRIPTOR) &sd_buf;
- DWORD bytes_needed;
- PRIVILEGE_SET ps;
- DWORD ps_len = sizeof (ps);
- BOOL status;
-
- if (!GetKernelObjectSecurity (local_handle,
- (OWNER_SECURITY_INFORMATION
- | GROUP_SECURITY_INFORMATION
- | DACL_SECURITY_INFORMATION),
- sd, sizeof (sd_buf), &bytes_needed))
- {
- system_printf ("error getting handle SD (%lu)", GetLastError ());
- goto out;
- }
-
- MapGenericMask (&access, &access_mapping);
-
- if (!AccessCheck (sd, from_process_token, access, &access_mapping,
- &ps, &ps_len, &access, &status))
- {
- system_printf ("error checking access rights (%lu)",
- GetLastError ());
- goto out;
- }
-
- if (!status)
- {
- system_printf ("access to object denied");
- goto out;
- }
- }
-
- if (!DuplicateHandle (from_process, from_handle,
- to_process, to_handle_ptr,
- access, bInheritHandle, 0))
- {
- system_printf ("error getting handle to client (%lu)", GetLastError ());
- goto out;
- }
-
- // verbose: debug_printf ("Duplicated %p to %p", from_handle, *to_handle_ptr);
-
- ret_val = 0;
-
- out:
- if (local_handle && from_process != GetCurrentProcess ())
- CloseHandle (local_handle);
-
- return (ret_val);
-}
-
-/*
- * client_request_attach_tty::serve ()
- */
-
-void
-client_request_attach_tty::serve (transport_layer_base *const conn,
- process_cache *)
-{
- assert (conn);
-
- assert (!error_code ());
-
- if (!wincap.has_security ())
- {
- syscall_printf ("operation only supported on systems with security");
- error_code (EINVAL);
- msglen (0);
- return;
- }
-
- if (msglen () != sizeof (req))
- {
- syscall_printf ("bad request body length: expecting %lu bytes, got %lu",
- sizeof (req), msglen ());
- error_code (EINVAL);
- msglen (0);
- return;
- }
-
- msglen (0); // Until we fill in some fields.
-
- // verbose: debug_printf ("pid %ld:(%p,%p) -> pid %ld",
- // req.master_pid, req.from_master, req.to_master,
- // req.pid);
-
- // verbose: debug_printf ("opening process %ld", req.master_pid);
-
- const HANDLE from_process_handle =
- OpenProcess (PROCESS_DUP_HANDLE, FALSE, req.master_pid);
-
- if (!from_process_handle)
- {
- system_printf ("error opening `from' process, error = %lu",
- GetLastError ());
- error_code (EACCES);
- return;
- }
-
- // verbose: debug_printf ("opening process %ld", req.pid);
-
- const HANDLE to_process_handle =
- OpenProcess (PROCESS_DUP_HANDLE, FALSE, req.pid);
-
- if (!to_process_handle)
- {
- system_printf ("error opening `to' process, error = %lu",
- GetLastError ());
- CloseHandle (from_process_handle);
- error_code (EACCES);
- return;
- }
-
- // verbose: debug_printf ("Impersonating client");
- conn->impersonate_client ();
-
- HANDLE token_handle = NULL;
-
- // verbose: debug_printf ("about to open thread token");
- const DWORD rc = OpenThreadToken (GetCurrentThread (),
- TOKEN_QUERY,
- TRUE,
- &token_handle);
-
- // verbose: debug_printf ("opened thread token, rc=%lu", rc);
- conn->revert_to_self ();
-
- if (!rc)
- {
- system_printf ("error opening thread token, error = %lu",
- GetLastError ());
- CloseHandle (from_process_handle);
- CloseHandle (to_process_handle);
- error_code (EACCES);
- return;
- }
-
- // From this point on, a reply body is returned to the client.
-
- const HANDLE from_master = req.from_master;
- const HANDLE to_master = req.to_master;
-
- req.from_master = NULL;
- req.to_master = NULL;
-
- msglen (sizeof (req));
-
- if (from_master)
- if (check_and_dup_handle (from_process_handle, to_process_handle,
- token_handle,
- GENERIC_READ,
- from_master,
- &req.from_master, TRUE) != 0)
- {
- system_printf ("error duplicating from_master handle, error = %lu",
- GetLastError ());
- error_code (EACCES);
- }
-
- if (to_master)
- if (check_and_dup_handle (from_process_handle, to_process_handle,
- token_handle,
- GENERIC_WRITE,
- to_master,
- &req.to_master, TRUE) != 0)
- {
- system_printf ("error duplicating to_master handle, error = %lu",
- GetLastError ());
- error_code (EACCES);
- }
-
- CloseHandle (from_process_handle);
- CloseHandle (to_process_handle);
- CloseHandle (token_handle);
-
- debug_printf ("%lu(%lu, %lu) -> %lu(%lu,%lu)",
- req.master_pid, from_master, to_master,
- req.pid, req.from_master, req.to_master);
-
- return;
-}
-
-void
-client_request_get_version::serve (transport_layer_base *, process_cache *)
-{
- assert (!error_code ());
-
- if (msglen ())
- syscall_printf ("unexpected request body ignored: %lu bytes", msglen ());
-
- msglen (sizeof (version));
-
- version.major = CYGWIN_SERVER_VERSION_MAJOR;
- version.api = CYGWIN_SERVER_VERSION_API;
- version.minor = CYGWIN_SERVER_VERSION_MINOR;
- version.patch = CYGWIN_SERVER_VERSION_PATCH;
-}
-
-class server_request : public queue_request
-{
-public:
- server_request (transport_layer_base *const conn, process_cache *const cache)
- : _conn (conn), _cache (cache)
- {}
-
- virtual ~server_request ()
- {
- safe_delete (_conn);
- }
-
- virtual void process ()
- {
- client_request::handle_request (_conn, _cache);
- }
-
-private:
- transport_layer_base *const _conn;
- process_cache *const _cache;
-};
-
-class server_submission_loop : public queue_submission_loop
-{
-public:
- server_submission_loop (threaded_queue *const queue,
- transport_layer_base *const transport,
- process_cache *const cache)
- : queue_submission_loop (queue, false),
- _transport (transport),
- _cache (cache)
- {
- assert (_transport);
- assert (_cache);
- }
-
-private:
- transport_layer_base *const _transport;
- process_cache *const _cache;
-
- virtual void request_loop ();
-};
-
-/* FIXME: this is a little ugly. What we really want is to wait on
- * two objects: one for the pipe/socket, and one for being told to
- * shutdown. Otherwise this will stay a problem (we won't actually
- * shutdown until the request _AFTER_ the shutdown request. And
- * sending ourselves a request is ugly
- */
-void
-server_submission_loop::request_loop ()
-{
- /* I'd like the accepting thread's priority to be above any "normal"
- * thread in the system to avoid overflowing the listen queue (for
- * sockets; similar issues exist for named pipes); but, for example,
- * a normal priority thread in a foregrounded process is boosted to
- * THREAD_PRIORITY_HIGHEST (AFAICT). Thus try to set the current
- * thread's priority to a level one above that. This fails on
- * win9x/ME so assume any failure in that call is due to that and
- * simply call again at one priority level lower.
- */
- if (!SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_HIGHEST + 1))
- if (!SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_HIGHEST))
- debug_printf ("failed to raise accept thread priority, error = %lu",
- GetLastError ());
-
- while (_running)
- {
- bool recoverable = false;
- transport_layer_base *const conn = _transport->accept (&recoverable);
- if (!conn && !recoverable)
- {
- system_printf ("fatal error on IPC transport: closing down");
- return;
- }
- // EINTR probably implies a shutdown request; so back off for a
- // moment to let the main thread take control, otherwise the
- // server spins here receiving EINTR repeatedly since the signal
- // handler in the main thread doesn't get a chance to be called.
- if (!conn && errno == EINTR)
- {
- if (!SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_NORMAL))
- debug_printf ("failed to reset thread priority, error = %lu",
- GetLastError ());
-
- Sleep (0);
- if (!SetThreadPriority (GetCurrentThread (),
- THREAD_PRIORITY_HIGHEST + 1))
- if (!SetThreadPriority (GetCurrentThread (),
- THREAD_PRIORITY_HIGHEST))
- debug_printf ("failed to raise thread priority, error = %lu",
- GetLastError ());
- }
- if (conn)
- _queue->add (safe_new (server_request, conn, _cache));
- }
-}
-
-client_request_shutdown::client_request_shutdown ()
- : client_request (CYGSERVER_REQUEST_SHUTDOWN)
-{
- // verbose: syscall_printf ("created");
-}
-
-void
-client_request_shutdown::serve (transport_layer_base *, process_cache *)
-{
- assert (!error_code ());
-
- if (msglen ())
- syscall_printf ("unexpected request body ignored: %lu bytes", msglen ());
-
- /* FIXME: link upwards, and then this becomes a trivial method call to
- * only shutdown _this queue_
- */
-
- kill (getpid (), SIGINT);
-
- msglen (0);
-}
-
-static sig_atomic_t shutdown_server = false;
-
-static void
-handle_signal (const int signum)
-{
- /* any signal makes us die :} */
-
- shutdown_server = true;
-}
-
-/*
- * print_usage ()
- */
-
-static void
-print_usage (const char *const pgm)
-{
- printf ("Usage: %s [OPTIONS]\n", pgm);
- printf (" -c, --cleanup-threads number of cleanup threads to use\n");
- printf (" -h, --help output usage information and exit\n");
- printf (" -r, --request-threads number of request threads to use\n");
- printf (" -s, --shutdown shutdown the daemon\n");
- printf (" -v, --version output version information and exit\n");
-}
-
-/*
- * print_version ()
- */
-
-static void
-print_version (const char *const pgm)
-{
- char *vn = NULL;
-
- const char *const colon = strchr (version, ':');
-
- if (!colon)
- {
- vn = strdup ("?");
- }
- else
- {
- vn = strdup (colon + 2); // Skip ": "
-
- char *const spc = strchr (vn, ' ');
-
- if (spc)
- *spc = '\0';
- }
-
- char buf[200];
- snprintf (buf, sizeof (buf), "%d.%d.%d(%d.%d/%d/%d)-(%d.%d.%d.%d) %s",
- cygwin_version.dll_major / 1000,
- cygwin_version.dll_major % 1000,
- cygwin_version.dll_minor,
- cygwin_version.api_major,
- cygwin_version.api_minor,
- cygwin_version.shared_data,
- CYGWIN_SERVER_VERSION_MAJOR,
- CYGWIN_SERVER_VERSION_API,
- CYGWIN_SERVER_VERSION_MINOR,
- CYGWIN_SERVER_VERSION_PATCH,
- cygwin_version.mount_registry,
- cygwin_version.dll_build_date);
-
- printf ("%s (cygwin) %s\n", pgm, vn);
- printf ("API version %s\n", buf);
- printf ("Copyright 2001, 2002 Red Hat, Inc.\n");
- printf ("Compiled on %s\n", __DATE__);
-
- free (vn);
-}
-
-/*
- * main ()
- */
-
-int
-main (const int argc, char *argv[])
-{
- const struct option longopts[] = {
- {"cleanup-threads", required_argument, NULL, 'c'},
- {"help", no_argument, NULL, 'h'},
- {"request-threads", required_argument, NULL, 'r'},
- {"shutdown", no_argument, NULL, 's'},
- {"version", no_argument, NULL, 'v'},
- {0, no_argument, NULL, 0}
- };
-
- const char opts[] = "c:hr:sv";
-
- int cleanup_threads = 2;
- int request_threads = 10;
- bool shutdown = false;
-
- const char *pgm = NULL;
-
- if (!(pgm = strrchr (*argv, '\\')) && !(pgm = strrchr (*argv, '/')))
- pgm = *argv;
- else
- pgm++;
-
- wincap.init ();
- if (wincap.has_security ())
- setup_privileges ();
-
- int opt;
-
- while ((opt = getopt_long (argc, argv, opts, longopts, NULL)) != EOF)
- switch (opt)
- {
- case 'c':
- cleanup_threads = atoi (optarg);
- if (cleanup_threads <= 0)
- {
- fprintf (stderr,
- "%s: number of cleanup threads must be positive\n",
- pgm);
- exit (1);
- }
- break;
-
- case 'h':
- print_usage (pgm);
- return 0;
-
- case 'r':
- request_threads = atoi (optarg);
- if (request_threads <= 0)
- {
- fprintf (stderr,
- "%s: number of request threads must be positive\n",
- pgm);
- exit (1);
- }
- break;
-
- case 's':
- shutdown = true;
- break;
-
- case 'v':
- print_version (pgm);
- return 0;
-
- case '?':
- fprintf (stderr, "Try `%s --help' for more information.\n", pgm);
- exit (1);
- }
-
- if (optind != argc)
- {
- fprintf (stderr, "%s: too many arguments\n", pgm);
- exit (1);
- }
-
- if (shutdown)
- {
- /* Setting `cygserver_running' stops the request code making a
- * version request, which is not much to the point.
- */
- cygserver_running = CYGSERVER_OK;
-
- client_request_shutdown req;
-
- if (req.make_request () == -1 || req.error_code ())
- {
- fprintf (stderr, "%s: shutdown request failed: %s\n",
- pgm, strerror (req.error_code ()));
- exit (1);
- }
-
- // FIXME: It would be nice to wait here for the daemon to exit.
-
- return 0;
- }
-
-#define SIGHANDLE(SIG) \
- do \
- { \
- struct sigaction act; \
- \
- act.sa_handler = &handle_signal; \
- act.sa_mask = 0; \
- act.sa_flags = 0; \
- \
- if (sigaction (SIG, &act, NULL) == -1) \
- { \
- system_printf ("failed to install handler for " #SIG ": %s", \
- strerror (errno)); \
- exit (1); \
- } \
- } while (false)
-
- SIGHANDLE (SIGHUP);
- SIGHANDLE (SIGINT);
- SIGHANDLE (SIGTERM);
-
- print_version (pgm);
- setbuf (stdout, NULL);
- printf ("daemon starting up");
-
- threaded_queue request_queue (request_threads);
- printf (".");
-
- transport_layer_base *const transport = create_server_transport ();
- assert (transport);
- printf (".");
-
- process_cache cache (cleanup_threads);
- printf (".");
-
- server_submission_loop submission_loop (&request_queue, transport, &cache);
- printf (".");
-
- request_queue.add_submission_loop (&submission_loop);
- printf (".");
-
- if (transport->listen () == -1)
- {
- exit (1);
- }
- printf (".");
-
- cache.start ();
- printf (".");
-
- request_queue.start ();
- printf (".");
-
- printf ("complete\n");
-
- /* TODO: wait on multiple objects - the thread handle for each
- * request loop + all the process handles. This should be done by
- * querying the request_queue and the process cache for all their
- * handles, and then waiting for (say) 30 seconds. after that we
- * recreate the list of handles to wait on, and wait again. the
- * point of all this abstraction is that we can trivially server
- * both sockets and pipes simply by making a new transport, and then
- * calling request_queue.process_requests (transport2);
- */
- /* WaitForMultipleObjects abort && request_queue && process_queue && signal
- -- if signal event then retrigger it
- */
- while (!shutdown_server && request_queue.running () && cache.running ())
- pause ();
-
- printf ("\nShutdown request received - new requests will be denied\n");
- request_queue.stop ();
- printf ("All pending requests processed\n");
- safe_delete (transport);
- printf ("No longer accepting requests - cygwin will operate in daemonless mode\n");
- cache.stop ();
- printf ("All outstanding process-cache activities completed\n");
- printf ("daemon shutdown\n");
-
- return 0;
-}
diff --git a/winsup/cygwin/cygserver_client.cc b/winsup/cygwin/cygserver_client.cc
deleted file mode 100755
index 138c9ddc0..000000000
--- a/winsup/cygwin/cygserver_client.cc
+++ /dev/null
@@ -1,529 +0,0 @@
-/* cygserver_client.cc
-
- Copyright 2001, 2002 Red Hat Inc.
-
- Written by Egor Duda <deo@logos-m.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. */
-
-/* to allow this to link into cygwin and the .dll, a little magic is needed. */
-#ifdef __OUTSIDE_CYGWIN__
-#include "woutsup.h"
-#else
-#include "winsup.h"
-#endif
-
-#include <assert.h>
-#include <errno.h>
-#include <stdio.h>
-#include <unistd.h>
-
-#include "cygerrno.h"
-#include "cygserver_shm.h"
-#include "safe_memory.h"
-
-#include "cygwin/cygserver.h"
-#include "cygwin/cygserver_transport.h"
-
-int cygserver_running = CYGSERVER_UNKNOWN; // Nb: inherited by children.
-
-/* On by default during development. For release, we probably want off
- * by default.
- */
-bool allow_daemon = true; // Nb: inherited by children.
-
-client_request_get_version::client_request_get_version ()
- : client_request (CYGSERVER_REQUEST_GET_VERSION, &version, sizeof (version))
-{
- msglen (0); // No parameters for request.
-
- // verbose: syscall_printf ("created");
-}
-
-/*
- * client_request_get_version::check_version ()
- *
- * The major version and API version numbers must match exactly. An
- * older than expected minor version number is accepted (as long as
- * the first numbers match, that is).
- */
-
-bool
-client_request_get_version::check_version () const
-{
- const bool ok = (version.major == CYGWIN_SERVER_VERSION_MAJOR
- && version.api == CYGWIN_SERVER_VERSION_API
- && version.minor <= CYGWIN_SERVER_VERSION_MINOR);
-
- if (!ok)
- syscall_printf (("incompatible version of cygwin server: "
- "client version %d.%d.%d.%d, "
- "server version %ld.%ld.%ld.%ld"),
- CYGWIN_SERVER_VERSION_MAJOR,
- CYGWIN_SERVER_VERSION_API,
- CYGWIN_SERVER_VERSION_MINOR,
- CYGWIN_SERVER_VERSION_PATCH,
- version.major,
- version.api,
- version.minor,
- version.patch);
-
- return ok;
-}
-
-#ifdef __INSIDE_CYGWIN__
-
-client_request_attach_tty::client_request_attach_tty (DWORD nmaster_pid,
- HANDLE nfrom_master,
- HANDLE nto_master)
- : client_request (CYGSERVER_REQUEST_ATTACH_TTY, &req, sizeof (req))
-{
- req.pid = GetCurrentProcessId ();
- req.master_pid = nmaster_pid;
- req.from_master = nfrom_master;
- req.to_master = nto_master;
-
- syscall_printf (("created: pid = %lu, master_pid = %lu, "
- "from_master = %lu, to_master = %lu"),
- req.pid, req.master_pid, req.from_master, req.to_master);
-}
-
-#else /* !__INSIDE_CYGWIN__ */
-
-client_request_attach_tty::client_request_attach_tty ()
- : client_request (CYGSERVER_REQUEST_ATTACH_TTY, &req, sizeof (req))
-{
- // verbose: syscall_printf ("created");
-}
-
-#endif /* __INSIDE_CYGWIN__ */
-
-/*
- * client_request_attach_tty::send ()
- *
- * Wraps the base method to provide error handling support. If the
- * reply contains a body but is flagged as an error, close any handles
- * that have been returned by cygserver and then discard the message
- * body, i.e. the client either sees a successful result with handles
- * or an unsuccessful result with no handles.
- */
-
-void
-client_request_attach_tty::send (transport_layer_base * const conn)
-{
- client_request::send (conn);
-
- if (msglen () && error_code ())
- {
- if (from_master ())
- CloseHandle (from_master ());
- if (to_master ())
- CloseHandle (to_master ());
- msglen (0);
- }
-}
-
-client_request::header_t::header_t (const request_code_t request_code,
- const size_t msglen)
- : msglen (msglen),
- request_code (request_code)
-{
- assert (request_code >= 0 && request_code < CYGSERVER_REQUEST_LAST);
-}
-
-// FIXME: also check write and read result for -1.
-
-void
-client_request::send (transport_layer_base * const conn)
-{
- assert (conn);
- assert (!(msglen () && !_buf)); // i.e., msglen () implies _buf
- assert (msglen () <= _buflen);
-
- {
- const ssize_t count = conn->write (&_header, sizeof (_header));
-
- if (count != sizeof (_header))
- {
- assert (errno);
- error_code (errno);
- syscall_printf (("request header write failure: "
- "only %ld bytes sent of %ld, "
- "error = %d(%lu)"),
- count, sizeof (_header),
- errno, GetLastError ());
- return;
- }
- }
-
- if (msglen ())
- {
- const ssize_t count = conn->write (_buf, msglen ());
-
- if (count == -1 || (size_t) count != msglen ())
- {
- assert (errno);
- error_code (errno);
- syscall_printf (("request body write failure: "
- "only %ld bytes sent of %ld, "
- "error = %d(%lu)"),
- count, msglen (),
- errno, GetLastError ());
- return;
- }
- }
-
- // verbose: syscall_printf ("request sent (%ld + %ld bytes)",
- // sizeof (_header), msglen ());
-
- {
- const ssize_t count = conn->read (&_header, sizeof (_header));
-
- if (count != sizeof (_header))
- {
- assert (errno);
- error_code (errno);
- syscall_printf (("reply header read failure: "
- "only %ld bytes received of %ld, "
- "error = %d(%lu)"),
- count, sizeof (_header),
- errno, GetLastError ());
- return;
- }
- }
-
- if (msglen () && !_buf)
- {
- system_printf ("no client buffer for reply body: %ld bytes needed",
- msglen ());
- error_code (EINVAL);
- return;
- }
-
- if (msglen () > _buflen)
- {
- system_printf (("client buffer too small for reply body: "
- "have %ld bytes and need %ld"),
- _buflen, msglen ());
- error_code (EINVAL);
- return;
- }
-
- if (msglen ())
- {
- const ssize_t count = conn->read (_buf, msglen ());
-
- if (count == -1 || (size_t) count != msglen ())
- {
- assert (errno);
- error_code (errno);
- syscall_printf (("reply body read failure: "
- "only %ld bytes received of %ld, "
- "error = %d(%lu)"),
- count, msglen (),
- errno, GetLastError ());
- return;
- }
- }
-
- // verbose: syscall_printf ("reply received (%ld + %ld bytes)",
- // sizeof (_header), msglen ());
-}
-
-#ifndef __INSIDE_CYGWIN__
-
-/*
- * client_request::handle_request ()
- *
- * A server-side method.
- *
- * This is a factory method for the client_request subclasses. It
- * reads the incoming request header and, based on its request code,
- * creates an instance of the appropriate class.
- *
- * FIXME: If the incoming packet is malformed, the server drops it on
- * the floor. Should it try and generate some sort of reply for the
- * client? As it is, the client will simply get a broken connection.
- *
- * FIXME: also check write and read result for -1.
- */
-
-/* static */ void
-client_request::handle_request (transport_layer_base *const conn,
- process_cache *const cache)
-{
- // verbose: debug_printf ("about to read");
-
- header_t header;
-
- {
- const ssize_t count = conn->read (&header, sizeof (header));
-
- if (count != sizeof (header))
- {
- syscall_printf (("request header read failure: "
- "only %ld bytes received of %ld, "
- "error = %d(%lu)"),
- count, sizeof (header),
- errno, GetLastError ());
- return;
- }
-
- // verbose: debug_printf ("got header (%ld)", count);
- }
-
- client_request *req = NULL;
-
- switch (header.request_code)
- {
- case CYGSERVER_REQUEST_GET_VERSION:
- req = safe_new0 (client_request_get_version);
- break;
- case CYGSERVER_REQUEST_SHUTDOWN:
- req = safe_new0 (client_request_shutdown);
- break;
- case CYGSERVER_REQUEST_ATTACH_TTY:
- req = safe_new0 (client_request_attach_tty);
- break;
- case CYGSERVER_REQUEST_SHM:
- req = safe_new0 (client_request_shm);
- break;
- default:
- syscall_printf ("unknown request code %d received: request ignored",
- header.request_code);
- return;
- }
-
- assert (req);
-
- req->msglen (header.msglen);
- req->handle (conn, cache);
-
- safe_delete (req);
-
-#ifndef DEBUGGING
- printf ("."); // A little noise when we're being quiet.
-#endif
-}
-
-#endif /* !__INSIDE_CYGWIN__ */
-
-client_request::client_request (request_code_t const id,
- void * const buf,
- size_t const buflen)
- : _header (id, buflen),
- _buf (buf),
- _buflen (buflen)
-{
- assert ((!_buf && !_buflen) || (_buf && _buflen));
-}
-
-client_request::~client_request ()
-{}
-
-int
-client_request::make_request ()
-{
- assert (cygserver_running == CYGSERVER_UNKNOWN \
- || cygserver_running == CYGSERVER_OK \
- || cygserver_running == CYGSERVER_UNAVAIL);
-
- if (cygserver_running == CYGSERVER_UNKNOWN)
- cygserver_init ();
-
- assert (cygserver_running == CYGSERVER_OK \
- || cygserver_running == CYGSERVER_UNAVAIL);
-
- /* Don't retry every request if the server's not there */
- if (cygserver_running == CYGSERVER_UNAVAIL)
- {
- syscall_printf ("cygserver un-available");
- error_code (ENOSYS);
- return -1;
- }
-
- transport_layer_base *const transport = create_server_transport ();
-
- assert (transport);
-
- if (transport->connect () == -1)
- {
- if (errno)
- error_code (errno);
- else
- error_code (ENOSYS);
- safe_delete (transport);
- return -1;
- }
-
- // verbose: debug_printf ("connected to server %p", transport);
-
- send (transport);
-
- safe_delete (transport);
-
- return 0;
-}
-
-#ifndef __INSIDE_CYGWIN__
-
-/*
- * client_request::handle ()
- *
- * A server-side method.
- *
- * At this point, the header of an incoming request has been read and
- * an appropriate client_request object constructed. This method has
- * to read the request body into its buffer, if there is such a body,
- * then perform the request and send back the results to the client.
- *
- * FIXME: If the incoming packet is malformed, the server drops it on
- * the floor. Should it try and generate some sort of reply for the
- * client? As it is, the client will simply get a broken connection.
- *
- * FIXME: also check write and read result for -1.
- */
-
-void
-client_request::handle (transport_layer_base *const conn,
- process_cache *const cache)
-{
- if (msglen () && !_buf)
- {
- system_printf ("no buffer for request body: %ld bytes needed",
- msglen ());
- error_code (EINVAL);
- return;
- }
-
- if (msglen () > _buflen)
- {
- system_printf (("buffer too small for request body: "
- "have %ld bytes and need %ld"),
- _buflen, msglen ());
- error_code (EINVAL);
- return;
- }
-
- if (msglen ())
- {
- const ssize_t count = conn->read (_buf, msglen ());
-
- if (count == -1 || (size_t) count != msglen ())
- {
- assert (errno);
- error_code (errno);
- syscall_printf (("request body read failure: "
- "only %ld bytes received of %ld, "
- "error = %d(%lu)"),
- count, msglen (),
- errno, GetLastError ());
- return;
- }
- }
-
- // verbose: syscall_printf ("request received (%ld + %ld bytes)",
- // sizeof (_header), msglen ());
-
- error_code (0); // Overwrites the _header.request_code field.
-
- /*
- * This is not allowed to fail. We must return ENOSYS at a minimum
- * to the client.
- */
- serve (conn, cache);
-
- {
- const ssize_t count = conn->write (&_header, sizeof (_header));
-
- if (count != sizeof (_header))
- {
- assert (errno);
- error_code (errno);
- syscall_printf (("reply header write failure: "
- "only %ld bytes sent of %ld, "
- "error = %d(%lu)"),
- count, sizeof (_header),
- errno, GetLastError ());
- return;
- }
- }
-
- if (msglen ())
- {
- const ssize_t count = conn->write (_buf, msglen ());
-
- if (count == -1 || (size_t) count != msglen ())
- {
- assert (errno);
- error_code (errno);
- syscall_printf (("reply body write failure: "
- "only %ld bytes sent of %ld, "
- "error = %d(%lu)"),
- count, msglen (),
- errno, GetLastError ());
- return;
- }
- }
-
- // verbose: syscall_printf ("reply sent (%ld + %ld bytes)",
- // sizeof (_header), msglen ());
-}
-
-#endif /* !__INSIDE_CYGWIN__ */
-
-bool
-check_cygserver_available ()
-{
- assert (cygserver_running == CYGSERVER_UNKNOWN \
- || cygserver_running == CYGSERVER_UNAVAIL);
-
- cygserver_running = CYGSERVER_OK; // For make_request ().
-
- client_request_get_version req;
-
- /* This indicates that we failed to connect to cygserver at all but
- * that's fine as cygwin doesn't need it to be running.
- */
- if (req.make_request () == -1)
- return false;
-
- /* We connected to the server but something went wrong after that
- * (in sending the message, in cygserver itself, or in receiving the
- * reply).
- */
- if (req.error_code ())
- {
- syscall_printf ("failure in cygserver version request: %d",
- req.error_code ());
- syscall_printf ("process will continue without cygserver support");
- return false;
- }
-
- return req.check_version ();
-}
-
-void
-cygserver_init ()
-{
- if (!allow_daemon)
- {
- syscall_printf ("cygserver use disabled in client");
- cygserver_running = CYGSERVER_UNAVAIL;
- return;
- }
-
- assert (cygserver_running == CYGSERVER_UNKNOWN \
- || cygserver_running == CYGSERVER_OK \
- || cygserver_running == CYGSERVER_UNAVAIL);
-
- if (cygserver_running == CYGSERVER_OK)
- return;
-
- if (!check_cygserver_available ())
- cygserver_running = CYGSERVER_UNAVAIL;
-}
diff --git a/winsup/cygwin/cygserver_ipc.h b/winsup/cygwin/cygserver_ipc.h
deleted file mode 100644
index 0d0ebbc76..000000000
--- a/winsup/cygwin/cygserver_ipc.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* cygserver_ipc.h
-
- Copyright 2002 Red Hat, Inc.
-
- Originally written by Conrad Scott <conrad.scott@dsl.pipex.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. */
-
-#ifndef __CYGSERVER_IPC_H__
-#define __CYGSERVER_IPC_H__
-
-#include <assert.h>
-#include <limits.h> /* For OPEN_MAX. */
-
-/*
- * The sysv ipc id's (msgid, semid, shmid) are integers arranged such
- * that they no subsystem will generate the same id as some other
- * subsystem; nor do these ids overlap file descriptors (the other
- * common integer ids). Since Cygwin can allocate more than OPEN_MAX
- * file descriptors, it can't be guaranteed not to overlap, but it
- * should help catch some errors.
- *
- * msgid's: OPEN_MAX, OPEN_MAX + 3, OPEN_MAX + 6, . . .
- * semid's: OPEN_MAX + 1, OPEN_MAX + 4, OPEN_MAX + 7, . . .
- * shmid's: OPEN_MAX + 2, OPEN_MAX + 5, OPEN_MAX + 8, . . .
- *
- * To further ensure that ids are unique, if ipc objects are created
- * and destroyed and then re-created, they are given new ids by
- * munging the basic id (as above) with a sequence number.
- *
- * Internal ipc id's, which are 0, 1, ... within each subsystem (and
- * not munged with a sequence number), are used solely by the ipcs(8)
- * interface.
- */
-
-enum ipc_subsys_t
- {
- IPC_MSGOP = 0,
- IPC_SEMOP = 1,
- IPC_SHMOP = 2,
- IPC_SUBSYS_COUNT
- };
-
-/*
- * IPCMNI - The absolute maximum number of simultaneous ipc ids for
- * any one subsystem.
- */
-
-enum
- {
- IPCMNI = 0x10000 // Must be a power of two.
- };
-
-inline int
-ipc_int2ext (const int intid, const ipc_subsys_t subsys, long & sequence)
-{
- assert (0 <= intid && intid < IPCMNI);
-
- const long tmp = InterlockedIncrement (&sequence);
-
- return (((tmp & 0x7fff) << 16)
- | (OPEN_MAX + (intid * IPC_SUBSYS_COUNT) + subsys));
-}
-
-inline int
-ipc_ext2int_subsys (const int extid)
-{
- return ((extid & (IPCMNI - 1)) - OPEN_MAX) % IPC_SUBSYS_COUNT;
-}
-
-inline int
-ipc_ext2int (const int extid, const ipc_subsys_t subsys)
-{
- if (ipc_ext2int_subsys (extid) != subsys)
- return -1;
- else
- return ((extid & (IPCMNI - 1)) - OPEN_MAX) / IPC_SUBSYS_COUNT;
-}
-
-#endif /* __CYGSERVER_IPC_H__ */
diff --git a/winsup/cygwin/cygserver_process.cc b/winsup/cygwin/cygserver_process.cc
deleted file mode 100755
index 7118bbcd9..000000000
--- a/winsup/cygwin/cygserver_process.cc
+++ /dev/null
@@ -1,432 +0,0 @@
-/* cygserver_process.cc
-
- Copyright 2001, 2002 Red Hat Inc.
-
- Written by Robert Collins <rbtcollins@hotmail.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 "woutsup.h"
-
-#include <sys/types.h>
-
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-
-#include "cygerrno.h"
-
-#include "cygwin/cygserver_process.h"
-
-/*****************************************************************************/
-
-#define elements(ARRAY) (sizeof (ARRAY) / sizeof (*ARRAY))
-
-/*****************************************************************************/
-
-process_cleanup::~process_cleanup ()
-{
- safe_delete (_process);
-}
-
-void
-process_cleanup::process ()
-{
- _process->cleanup ();
-}
-
-/*****************************************************************************/
-
-/* cleanup_routine */
-cleanup_routine::~cleanup_routine ()
-{
-}
-
-/*****************************************************************************/
-
-process::process (const pid_t cygpid, const DWORD winpid)
- : _cygpid (cygpid),
- _winpid (winpid),
- _hProcess (NULL),
- _cleaning_up (false),
- _exit_status (STILL_ACTIVE),
- _routines_head (NULL),
- _next (NULL)
-{
- _hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, winpid);
- if (!_hProcess)
- {
- system_printf ("unable to obtain handle for new cache process %d(%lu)",
- _cygpid, _winpid);
- _hProcess = INVALID_HANDLE_VALUE;
- _exit_status = 0;
- }
- else
- debug_printf ("got handle %p for new cache process %d(%lu)",
- _hProcess, _cygpid, _winpid);
- InitializeCriticalSection (&_access);
-}
-
-process::~process ()
-{
- DeleteCriticalSection (&_access);
- (void) CloseHandle (_hProcess);
-}
-
-/* No need to be thread-safe as this is only ever called by
- * process_cache::remove_process (). If it has to be made thread-safe
- * later on, it should not use the `access' critical section as that
- * is held by the client request handlers for an arbitrary length of
- * time, i.e. while they do whatever processing is required for a
- * client request.
- */
-DWORD
-process::check_exit_code ()
-{
- if (_hProcess && _hProcess != INVALID_HANDLE_VALUE
- && _exit_status == STILL_ACTIVE
- && !GetExitCodeProcess (_hProcess, &_exit_status))
- {
- system_printf ("failed to retrieve exit code for %d(%lu), error = %lu",
- _cygpid, _winpid, GetLastError ());
- _hProcess = INVALID_HANDLE_VALUE;
- }
- return _exit_status;
-}
-
-bool
-process::add (cleanup_routine *const entry)
-{
- assert (entry);
-
- bool res = false;
- EnterCriticalSection (&_access);
-
- if (!_cleaning_up)
- {
- entry->_next = _routines_head;
- _routines_head = entry;
- res = true;
- }
-
- LeaveCriticalSection (&_access);
- return res;
-}
-
-bool
-process::remove (const cleanup_routine *const entry)
-{
- assert (entry);
-
- bool res = false;
- EnterCriticalSection (&_access);
-
- if (!_cleaning_up)
- {
- cleanup_routine *previous = NULL;
-
- for (cleanup_routine *ptr = _routines_head;
- ptr;
- previous = ptr, ptr = ptr->_next)
- {
- if (*ptr == *entry)
- {
- if (previous)
- previous->_next = ptr->_next;
- else
- _routines_head = ptr->_next;
-
- safe_delete (ptr);
- res = true;
- break;
- }
- }
- }
-
- LeaveCriticalSection (&_access);
- return res;
-}
-
-/* This is single threaded. It's called after the process is removed
- * from the cache, but inserts may be attemped by worker threads that
- * have a pointer to it.
- */
-void
-process::cleanup ()
-{
- EnterCriticalSection (&_access);
- assert (!is_active ());
- assert (!_cleaning_up);
- InterlockedExchange (&_cleaning_up, true);
- cleanup_routine *entry = _routines_head;
- _routines_head = NULL;
- LeaveCriticalSection (&_access);
-
- while (entry)
- {
- cleanup_routine *const ptr = entry;
- entry = entry->_next;
- ptr->cleanup (this);
- safe_delete (ptr);
- }
-}
-
-/*****************************************************************************/
-
-void
-process_cache::submission_loop::request_loop ()
-{
- assert (this);
- assert (_cache);
- assert (_interrupt_event);
-
- while (_running)
- _cache->wait_for_processes (_interrupt_event);
-}
-
-/*****************************************************************************/
-
-process_cache::process_cache (const unsigned int initial_workers)
- : _queue (initial_workers),
- _submitter (this, &_queue), // true == interruptible
- _processes_count (0),
- _processes_head (NULL),
- _cache_add_trigger (NULL)
-{
- /* there can only be one */
- InitializeCriticalSection (&_cache_write_access);
-
- _cache_add_trigger = CreateEvent (NULL, // SECURITY_ATTRIBUTES
- FALSE, // Auto-reset
- FALSE, // Initially non-signalled
- NULL); // Anonymous
-
- if (!_cache_add_trigger)
- {
- system_printf ("failed to create cache add trigger, error = %lu",
- GetLastError ());
- abort ();
- }
-
- _queue.add_submission_loop (&_submitter);
-}
-
-process_cache::~process_cache ()
-{
- (void) CloseHandle (_cache_add_trigger);
- DeleteCriticalSection (&_cache_write_access);
-}
-
-/* This returns the process object to the caller already locked, that
- * is, with the object's `access' critical region entered. Thus the
- * caller must unlock the object when it's finished with it (via
- * process::release ()). It must then not try to access the object
- * afterwards, except by going through this routine again, as it may
- * have been deleted once it has been unlocked.
- */
-class process *
-process_cache::process (const pid_t cygpid, const DWORD winpid)
-{
- /* TODO: make this more granular, so a search doesn't involve the
- * write lock.
- */
- EnterCriticalSection (&_cache_write_access);
- class process *previous = NULL;
- class process *entry = find (winpid, &previous);
-
- if (!entry)
- {
- if (_processes_count + SPECIALS_COUNT >= MAXIMUM_WAIT_OBJECTS)
- {
- LeaveCriticalSection (&_cache_write_access);
- system_printf (("process limit (%d processes) reached; "
- "new connection refused for %d(%lu)"),
- MAXIMUM_WAIT_OBJECTS - SPECIALS_COUNT,
- cygpid, winpid);
- set_errno (EAGAIN);
- return NULL;
- }
-
- entry = safe_new (class process, cygpid, winpid);
- if (!entry->is_active ())
- {
- LeaveCriticalSection (&_cache_write_access);
- safe_delete (entry);
- set_errno (ESRCH);
- return NULL;
- }
-
- if (previous)
- {
- entry->_next = previous->_next;
- previous->_next = entry;
- }
- else
- {
- entry->_next = _processes_head;
- _processes_head = entry;
- }
-
- _processes_count += 1;
- SetEvent (_cache_add_trigger);
- }
-
- EnterCriticalSection (&entry->_access); // To be released by the caller.
- LeaveCriticalSection (&_cache_write_access);
- assert (entry);
- assert (entry->_winpid == winpid);
- return entry;
-}
-
-void
-process_cache::wait_for_processes (const HANDLE interrupt_event)
-{
- // Update `_wait_array' with handles of all current processes.
- const size_t count = sync_wait_array (interrupt_event);
-
- debug_printf ("waiting on %u objects in total (%u processes)",
- count, _processes_count);
-
- const DWORD rc = WaitForMultipleObjects (count, _wait_array,
- FALSE, INFINITE);
-
- if (rc == WAIT_FAILED)
- {
- system_printf ("could not wait on the process handles, error = %lu",
- GetLastError ());
- abort ();
- }
-
- const size_t start = rc - WAIT_OBJECT_0;
-
- if (rc < WAIT_OBJECT_0 || start > count)
- {
- system_printf (("unexpected return code %rc "
- "from WaitForMultipleObjects: "
- "expected [%u .. %u)"),
- rc, WAIT_OBJECT_0, WAIT_OBJECT_0 + count);
- abort ();
- }
-
- // Tell all the processes, from the signalled point up, the bad news.
- for (size_t index = start; index != count; index++)
- if (_process_array[index])
- check_and_remove_process (index);
-}
-
-/*
- * process_cache::sync_wait_array ()
- *
- * Fill-in the wait array with the handles that the cache needs to wait on.
- * These handles are:
- * - the process_process_param's interrupt event
- * - the process_cache's cache_add_trigger event
- * - the handle for each live process in the cache.
- *
- * Return value: the number of live handles in the array.
- */
-
-size_t
-process_cache::sync_wait_array (const HANDLE interrupt_event)
-{
- assert (this);
- assert (_cache_add_trigger && _cache_add_trigger != INVALID_HANDLE_VALUE);
- assert (interrupt_event && interrupt_event != INVALID_HANDLE_VALUE);
-
- EnterCriticalSection (&_cache_write_access);
-
- assert (_processes_count + SPECIALS_COUNT <= elements (_wait_array));
-
- size_t index = 0;
-
- for (class process *ptr = _processes_head; ptr; ptr = ptr->_next)
- {
- assert (ptr->_hProcess && ptr->_hProcess != INVALID_HANDLE_VALUE);
- assert (ptr->is_active ());
-
- _wait_array[index] = ptr->handle ();
- _process_array[index++] = ptr;
-
- assert (index <= elements (_wait_array));
- }
-
- /* Sorry for shouting, but THESE MUST BE ADDED AT THE END! */
- /* Well, not strictly `must', but it's more efficient if they are :-) */
-
- _wait_array[index] = interrupt_event;
- _process_array[index++] = NULL;
-
- _wait_array[index] = _cache_add_trigger;
- _process_array[index++] = NULL;
-
- /* Phew, back to normal volume now. */
-
- assert (index <= elements (_wait_array));
-
- LeaveCriticalSection (&_cache_write_access);
-
- return index;
-}
-
-void
-process_cache::check_and_remove_process (const size_t index)
-{
- assert (this);
- assert (index < elements (_wait_array) - SPECIALS_COUNT);
-
- class process *const process = _process_array[index];
-
- assert (process);
- assert (process->handle () == _wait_array[index]);
-
- if (process->check_exit_code () == STILL_ACTIVE)
- return;
-
- debug_printf ("process %d(%lu) has left the building ($? = %lu)",
- process->_cygpid, process->_winpid, process->_exit_status);
-
- /* Unlink the process object from the process list. */
-
- EnterCriticalSection (&_cache_write_access);
-
- class process *previous = NULL;
-
- const class process *const tmp = find (process->_winpid, &previous);
-
- assert (tmp == process);
- assert (previous ? previous->_next == process : _processes_head == process);
-
- if (previous)
- previous->_next = process->_next;
- else
- _processes_head = process->_next;
-
- _processes_count -= 1;
- LeaveCriticalSection (&_cache_write_access);
-
- /* Schedule any cleanup tasks for this process. */
- _queue.add (safe_new (process_cleanup, process));
-}
-
-class process *
-process_cache::find (const DWORD winpid, class process **previous)
-{
- if (previous)
- *previous = NULL;
-
- for (class process *ptr = _processes_head; ptr; ptr = ptr->_next)
- if (ptr->_winpid == winpid)
- return ptr;
- else if (ptr->_winpid > winpid) // The list is sorted by winpid.
- return NULL;
- else if (previous)
- *previous = ptr;
-
- return NULL;
-}
-
-/*****************************************************************************/
diff --git a/winsup/cygwin/cygserver_shm.cc b/winsup/cygwin/cygserver_shm.cc
deleted file mode 100755
index 90053eec2..000000000
--- a/winsup/cygwin/cygserver_shm.cc
+++ /dev/null
@@ -1,896 +0,0 @@
-/* cygserver_shm.cc: Single unix specification IPC interface for Cygwin.
-
- Copyright 2002 Red Hat, Inc.
-
- Written by Conrad Scott <conrad.scott@dsl.pipex.com>.
- Based on code by Robert Collins <robert.collins@hotmail.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 "woutsup.h"
-
-#include <errno.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
-
-#include "cygserver_ipc.h"
-#include "cygserver_shm.h"
-#include "security.h"
-
-#include "cygwin/cygserver.h"
-#include "cygwin/cygserver_process.h"
-#include "cygwin/cygserver_transport.h"
-
-/*---------------------------------------------------------------------------*
- * class server_shmmgr
- *
- * A singleton class.
- *---------------------------------------------------------------------------*/
-
-#define shmmgr (server_shmmgr::instance ())
-
-class server_shmmgr
-{
-private:
- class attach_t
- {
- public:
- class process *const _client;
- unsigned int _refcnt;
-
- attach_t *_next;
-
- attach_t (class process *const client)
- : _client (client),
- _refcnt (0),
- _next (NULL)
- {}
- };
-
- class segment_t
- {
- private:
- // Bits for the _flg field.
- enum { IS_DELETED = 0x01 };
-
- public:
- const int _intid;
- const int _shmid;
- struct shmid_ds _ds;
-
- segment_t *_next;
-
- segment_t (const key_t key, const int intid, const HANDLE hFileMap);
- ~segment_t ();
-
- bool is_deleted () const
- {
- return _flg & IS_DELETED;
- }
-
- bool is_pending_delete () const
- {
- return !_ds.shm_nattch && is_deleted ();
- }
-
- void mark_deleted ()
- {
- assert (!is_deleted ());
-
- _flg |= IS_DELETED;
- }
-
- int attach (class process *, HANDLE & hFileMap);
- int detach (class process *);
-
- private:
- static long _sequence;
-
- int _flg;
- const HANDLE _hFileMap;
- attach_t *_attach_head; // A list sorted by winpid;
-
- attach_t *find (const class process *, attach_t **previous = NULL);
- };
-
- class cleanup_t : public cleanup_routine
- {
- public:
- cleanup_t (const segment_t *const segptr)
- : cleanup_routine (reinterpret_cast<void *> (segptr->_shmid))
- {
- assert (key ());
- }
-
- int shmid () const { return reinterpret_cast<int> (key ()); }
-
- virtual void cleanup (class process *const client)
- {
- const int res = shmmgr.shmdt (shmid (), client);
-
- if (res != 0)
- debug_printf ("process cleanup failed [shmid = %d]: %s",
- shmid (), strerror (-res));
- }
- };
-
-public:
- static server_shmmgr & instance ();
-
- int shmat (HANDLE & hFileMap,
- int shmid, int shmflg, class process *);
- int shmctl (int & out_shmid, struct shmid_ds & out_ds,
- struct shminfo & out_shminfo, struct shm_info & out_shm_info,
- const int shmid, int cmd, const struct shmid_ds &,
- class process *);
- int shmdt (int shmid, class process *);
- int shmget (int & out_shmid, key_t, size_t, int shmflg, uid_t, gid_t,
- class process *);
-
-private:
- static server_shmmgr *_instance;
- static pthread_once_t _instance_once;
-
- static void initialise_instance ();
-
- CRITICAL_SECTION _segments_lock;
- segment_t *_segments_head; // A list sorted by int_id.
-
- int _shm_ids; // Number of shm segments (for ipcs(8)).
- int _shm_tot; // Total bytes of shm segments (for ipcs(8)).
- int _shm_atts; // Number of attached segments (for ipcs(8)).
- int _intid_max; // Highest intid yet allocated (for ipcs(8)).
-
- server_shmmgr ();
- ~server_shmmgr ();
-
- // Undefined (as this class is a singleton):
- server_shmmgr (const server_shmmgr &);
- server_shmmgr & operator= (const server_shmmgr &);
-
- segment_t *find_by_key (key_t);
- segment_t *find (int intid, segment_t **previous = NULL);
-
- int new_segment (key_t, size_t, int shmflg, pid_t, uid_t, gid_t);
-
- segment_t *new_segment (key_t, size_t, HANDLE);
- void delete_segment (segment_t *);
-};
-
-/* static */ long server_shmmgr::segment_t::_sequence = 0;
-
-/* static */ server_shmmgr *server_shmmgr::_instance = NULL;
-/* static */ pthread_once_t server_shmmgr::_instance_once = PTHREAD_ONCE_INIT;
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::segment_t::segment_t ()
- *---------------------------------------------------------------------------*/
-
-server_shmmgr::segment_t::segment_t (const key_t key,
- const int intid,
- const HANDLE hFileMap)
- : _intid (intid),
- _shmid (ipc_int2ext (intid, IPC_SHMOP, _sequence)),
- _next (NULL),
- _flg (0),
- _hFileMap (hFileMap),
- _attach_head (NULL)
-{
- assert (0 <= _intid && _intid < SHMMNI);
-
- memset (&_ds, '\0', sizeof (_ds));
- _ds.shm_perm.key = key;
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::segment_t::~segment_t ()
- *---------------------------------------------------------------------------*/
-
-server_shmmgr::segment_t::~segment_t ()
-{
- assert (!_attach_head);
-
- if (!CloseHandle (_hFileMap))
- syscall_printf ("failed to close file map [handle = 0x%x]: %E", _hFileMap);
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::segment_t::attach ()
- *---------------------------------------------------------------------------*/
-
-int
-server_shmmgr::segment_t::attach (class process *const client,
- HANDLE & hFileMap)
-{
- assert (client);
-
- if (!DuplicateHandle (GetCurrentProcess (),
- _hFileMap,
- client->handle (),
- &hFileMap,
- 0,
- FALSE, // bInheritHandle
- DUPLICATE_SAME_ACCESS))
- {
- syscall_printf (("failed to duplicate handle for client "
- "[key = 0x%016llx, shmid = %d, handle = 0x%x]: %E"),
- _ds.shm_perm.key, _shmid, _hFileMap);
-
- return -EACCES; // FIXME: Case analysis?
- }
-
- _ds.shm_lpid = client->cygpid ();
- _ds.shm_nattch += 1;
- _ds.shm_atime = time (NULL); // FIXME: sub-second times.
-
- attach_t *previous = NULL;
- attach_t *attptr = find (client, &previous);
-
- if (!attptr)
- {
- attptr = safe_new (attach_t, client);
-
- if (previous)
- {
- attptr->_next = previous->_next;
- previous->_next = attptr;
- }
- else
- {
- attptr->_next = _attach_head;
- _attach_head = attptr;
- }
- }
-
- attptr->_refcnt += 1;
-
- cleanup_t *const cleanup = safe_new (cleanup_t, this);
-
- // FIXME: ::add should only fail if the process object is already
- // cleaning up; but it can't be doing that since this thread has it
- // locked.
-
- const bool result = client->add (cleanup);
-
- assert (result);
-
- return 0;
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::segment_t::detach ()
- *---------------------------------------------------------------------------*/
-
-int
-server_shmmgr::segment_t::detach (class process *const client)
-{
- attach_t *previous = NULL;
- attach_t *const attptr = find (client, &previous);
-
- if (!attptr)
- return -EINVAL;
-
- if (client->is_active ())
- {
- const cleanup_t key (this);
-
- if (!client->remove (&key))
- syscall_printf (("failed to remove cleanup routine for %d(%lu) "
- "[shmid = %d]"),
- client->cygpid (), client->winpid (),
- _shmid);
- }
-
- attptr->_refcnt -= 1;
-
- if (!attptr->_refcnt)
- {
- assert (previous ? previous->_next == attptr : _attach_head == attptr);
-
- if (previous)
- previous->_next = attptr->_next;
- else
- _attach_head = attptr->_next;
-
- safe_delete (attptr);
- }
-
- assert (_ds.shm_nattch > 0);
-
- _ds.shm_lpid = client->cygpid ();
- _ds.shm_nattch -= 1;
- _ds.shm_dtime = time (NULL); // FIXME: sub-second times.
-
- return 0;
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::segment_t::find ()
- *---------------------------------------------------------------------------*/
-
-server_shmmgr::attach_t *
-server_shmmgr::segment_t::find (const class process *const client,
- attach_t **previous)
-{
- if (previous)
- *previous = NULL;
-
- // Nb. The _attach_head list is sorted by winpid.
-
- for (attach_t *attptr = _attach_head; attptr; attptr = attptr->_next)
- if (attptr->_client == client)
- return attptr;
- else if (attptr->_client->winpid () > client->winpid ())
- return NULL;
- else if (previous)
- *previous = attptr;
-
- return NULL;
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::instance ()
- *---------------------------------------------------------------------------*/
-
-/* static */ server_shmmgr &
-server_shmmgr::instance ()
-{
- pthread_once (&_instance_once, &initialise_instance);
-
- assert (_instance);
-
- return *_instance;
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::shmat ()
- *---------------------------------------------------------------------------*/
-
-int
-server_shmmgr::shmat (HANDLE & hFileMap,
- const int shmid, const int shmflg,
- class process *const client)
-{
- syscall_printf ("shmat (shmid = %d, shmflg = 0%o) for %d(%lu)",
- shmid, shmflg, client->cygpid (), client->winpid ());
-
- int result = 0;
- EnterCriticalSection (&_segments_lock);
-
- segment_t *const segptr = find (ipc_ext2int (shmid, IPC_SHMOP));
-
- if (!segptr)
- result = -EINVAL;
- else
- result = segptr->attach (client, hFileMap);
-
- if (!result)
- _shm_atts += 1;
-
- LeaveCriticalSection (&_segments_lock);
-
- if (result < 0)
- syscall_printf (("-1 [%d] = shmat (shmid = %d, shmflg = 0%o) "
- "for %d(%lu)"),
- -result, shmid, shmflg,
- client->cygpid (), client->winpid ());
- else
- syscall_printf (("0x%x = shmat (shmid = %d, shmflg = 0%o) "
- "for %d(%lu)"),
- hFileMap, shmid, shmflg,
- client->cygpid (), client->winpid ());
-
- return result;
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::shmctl ()
- *---------------------------------------------------------------------------*/
-
-int
-server_shmmgr::shmctl (int & out_shmid,
- struct shmid_ds & out_ds,
- struct shminfo & out_shminfo,
- struct shm_info & out_shm_info,
- const int shmid, const int cmd,
- const struct shmid_ds & ds,
- class process *const client)
-{
- syscall_printf ("shmctl (shmid = %d, cmd = 0x%x) for %d(%lu)",
- shmid, cmd, client->cygpid (), client->winpid ());
-
- int result = 0;
- EnterCriticalSection (&_segments_lock);
-
- switch (cmd)
- {
- case IPC_STAT:
- case SHM_STAT: // Uses intids rather than shmids.
- case IPC_SET:
- case IPC_RMID:
- {
- int intid;
-
- if (cmd == SHM_STAT)
- intid = shmid;
- else
- intid = ipc_ext2int (shmid, IPC_SHMOP);
-
- segment_t *const segptr = find (intid);
-
- if (!segptr)
- result = -EINVAL;
- else
- switch (cmd)
- {
- case IPC_STAT:
- out_ds = segptr->_ds;
- break;
-
- case IPC_SET:
- segptr->_ds.shm_perm.uid = ds.shm_perm.uid;
- segptr->_ds.shm_perm.gid = ds.shm_perm.gid;
- segptr->_ds.shm_perm.mode = ds.shm_perm.mode & 0777;
- segptr->_ds.shm_lpid = client->cygpid ();
- segptr->_ds.shm_ctime = time (NULL); // FIXME: sub-second times.
- break;
-
- case IPC_RMID:
- if (segptr->is_deleted ())
- result = -EIDRM;
- else
- {
- segptr->mark_deleted ();
- if (segptr->is_pending_delete ())
- delete_segment (segptr);
- }
- break;
-
- case SHM_STAT: // ipcs(8) i'face.
- out_ds = segptr->_ds;
- out_shmid = segptr->_shmid;
- break;
- }
- }
- break;
-
- case IPC_INFO:
- out_shminfo.shmmax = SHMMAX;
- out_shminfo.shmmin = SHMMIN;
- out_shminfo.shmmni = SHMMNI;
- out_shminfo.shmseg = SHMSEG;
- out_shminfo.shmall = SHMALL;
- break;
-
- case SHM_INFO: // ipcs(8) i'face.
- out_shmid = _intid_max;
- out_shm_info.shm_ids = _shm_ids;
- out_shm_info.shm_tot = _shm_tot;
- out_shm_info.shm_atts = _shm_atts;
- break;
-
- default:
- result = -EINVAL;
- break;
- }
-
- LeaveCriticalSection (&_segments_lock);
-
- if (result < 0)
- syscall_printf (("-1 [%d] = "
- "shmctl (shmid = %d, cmd = 0x%x) for %d(%lu)"),
- -result,
- shmid, cmd, client->cygpid (), client->winpid ());
- else
- syscall_printf (("%d = "
- "shmctl (shmid = %d, cmd = 0x%x) for %d(%lu)"),
- ((cmd == SHM_STAT || cmd == SHM_INFO)
- ? out_shmid
- : result),
- shmid, cmd, client->cygpid (), client->winpid ());
-
- return result;
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::shmdt ()
- *---------------------------------------------------------------------------*/
-
-int
-server_shmmgr::shmdt (const int shmid, class process *const client)
-{
- syscall_printf ("shmdt (shmid = %d) for %d(%lu)",
- shmid, client->cygpid (), client->winpid ());
-
- int result = 0;
- EnterCriticalSection (&_segments_lock);
-
- segment_t *const segptr = find (ipc_ext2int (shmid, IPC_SHMOP));
-
- if (!segptr)
- result = -EINVAL;
- else
- result = segptr->detach (client);
-
- if (!result)
- _shm_atts -= 1;
-
- if (!result && segptr->is_pending_delete ())
- delete_segment (segptr);
-
- LeaveCriticalSection (&_segments_lock);
-
- if (result < 0)
- syscall_printf ("-1 [%d] = shmdt (shmid = %d) for %d(%lu)",
- -result, shmid, client->cygpid (), client->winpid ());
- else
- syscall_printf ("%d = shmdt (shmid = %d) for %d(%lu)",
- result, shmid, client->cygpid (), client->winpid ());
-
- return result;
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::shmget ()
- *---------------------------------------------------------------------------*/
-
-int
-server_shmmgr::shmget (int & out_shmid,
- const key_t key, const size_t size, const int shmflg,
- const uid_t uid, const gid_t gid,
- class process *const client)
-{
- syscall_printf (("shmget (key = 0x%016llx, size = %u, shmflg = 0%o) "
- "for %d(%lu)"),
- key, size, shmflg,
- client->cygpid (), client->winpid ());
-
- int result = 0;
- EnterCriticalSection (&_segments_lock);
-
- if (key == IPC_PRIVATE)
- result = new_segment (key, size, shmflg,
- client->cygpid (), uid, gid);
- else
- {
- segment_t *const segptr = find_by_key (key);
-
- if (!segptr)
- if (shmflg & IPC_CREAT)
- result = new_segment (key, size, shmflg,
- client->cygpid (), uid, gid);
- else
- result = -ENOENT;
- else if (segptr->is_deleted ())
- result = -EIDRM;
- else if ((shmflg & IPC_CREAT) && (shmflg & IPC_EXCL))
- result = -EEXIST;
- else if ((shmflg & ~(segptr->_ds.shm_perm.mode)) & 0777)
- result = -EACCES;
- else if (size && segptr->_ds.shm_segsz < size)
- result = -EINVAL;
- else
- result = segptr->_shmid;
- }
-
- LeaveCriticalSection (&_segments_lock);
-
- if (result >= 0)
- {
- out_shmid = result;
- result = 0;
- }
-
- if (result < 0)
- syscall_printf (("-1 [%d] = "
- "shmget (key = 0x%016llx, size = %u, shmflg = 0%o) "
- "for %d(%lu)"),
- -result,
- key, size, shmflg,
- client->cygpid (), client->winpid ());
- else
- syscall_printf (("%d = "
- "shmget (key = 0x%016llx, size = %u, shmflg = 0%o) "
- "for %d(%lu)"),
- out_shmid,
- key, size, shmflg,
- client->cygpid (), client->winpid ());
-
- return result;
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::initialise_instance ()
- *---------------------------------------------------------------------------*/
-
-/* static */ void
-server_shmmgr::initialise_instance ()
-{
- assert (!_instance);
-
- _instance = safe_new0 (server_shmmgr);
-
- assert (_instance);
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::server_shmmgr ()
- *---------------------------------------------------------------------------*/
-
-server_shmmgr::server_shmmgr ()
- : _segments_head (NULL),
- _shm_ids (0),
- _shm_tot (0),
- _shm_atts (0),
- _intid_max (0)
-{
- InitializeCriticalSection (&_segments_lock);
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::~server_shmmgr ()
- *---------------------------------------------------------------------------*/
-
-server_shmmgr::~server_shmmgr ()
-{
- DeleteCriticalSection (&_segments_lock);
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::find_by_key ()
- *---------------------------------------------------------------------------*/
-
-server_shmmgr::segment_t *
-server_shmmgr::find_by_key (const key_t key)
-{
- for (segment_t *segptr = _segments_head; segptr; segptr = segptr->_next)
- if (segptr->_ds.shm_perm.key == key)
- return segptr;
-
- return NULL;
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::find ()
- *---------------------------------------------------------------------------*/
-
-server_shmmgr::segment_t *
-server_shmmgr::find (const int intid, segment_t **previous)
-{
- if (previous)
- *previous = NULL;
-
- for (segment_t *segptr = _segments_head; segptr; segptr = segptr->_next)
- if (segptr->_intid == intid)
- return segptr;
- else if (segptr->_intid > intid) // The list is sorted by intid.
- return NULL;
- else if (previous)
- *previous = segptr;
-
- return NULL;
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::new_segment ()
- *---------------------------------------------------------------------------*/
-
-int
-server_shmmgr::new_segment (const key_t key,
- const size_t size,
- const int shmflg,
- const pid_t cygpid,
- const uid_t uid,
- const gid_t gid)
-{
- if (size < SHMMIN || size > SHMMAX)
- return -EINVAL;
-
- const HANDLE hFileMap = CreateFileMapping (INVALID_HANDLE_VALUE,
- NULL, PAGE_READWRITE,
- 0, size,
- NULL);
-
- if (!hFileMap)
- {
- syscall_printf ("failed to create file mapping [size = %lu]: %E", size);
- return -ENOMEM; // FIXME
- }
-
- segment_t *const segptr = new_segment (key, size, hFileMap);
-
- if (!segptr)
- {
- (void) CloseHandle (hFileMap);
- return -ENOSPC;
- }
-
- segptr->_ds.shm_perm.cuid = segptr->_ds.shm_perm.uid = uid;
- segptr->_ds.shm_perm.cgid = segptr->_ds.shm_perm.gid = gid;
- segptr->_ds.shm_perm.mode = shmflg & 0777;
- segptr->_ds.shm_segsz = size;
- segptr->_ds.shm_cpid = cygpid;
- segptr->_ds.shm_ctime = time (NULL); // FIXME: sub-second times.
-
- return segptr->_shmid;
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::new_segment ()
- *
- * Allocate a new segment for the given key and file map with the
- * lowest available intid and insert into the segment map.
- *---------------------------------------------------------------------------*/
-
-server_shmmgr::segment_t *
-server_shmmgr::new_segment (const key_t key, const size_t size,
- const HANDLE hFileMap)
-{
- // FIXME: Overflow risk.
- if (_shm_tot + size > SHMALL)
- return NULL;
-
- int intid = 0; // Next expected intid value.
- segment_t *previous = NULL; // Insert pointer.
-
- // Find first unallocated intid.
- for (segment_t *segptr = _segments_head;
- segptr && segptr->_intid == intid;
- segptr = segptr->_next, intid++)
- {
- previous = segptr;
- }
-
- /* By the time this condition is reached (given the default value of
- * SHMMNI), the linear searches should all replaced by something
- * just a *little* cleverer . . .
- */
- if (intid >= SHMMNI)
- return NULL;
-
- segment_t *const segptr = safe_new (segment_t, key, intid, hFileMap);
-
- assert (segptr);
-
- if (previous)
- {
- segptr->_next = previous->_next;
- previous->_next = segptr;
- }
- else
- {
- segptr->_next = _segments_head;
- _segments_head = segptr;
- }
-
- _shm_ids += 1;
- _shm_tot += size;
- if (intid > _intid_max)
- _intid_max = intid;
-
- return segptr;
-}
-
-/*---------------------------------------------------------------------------*
- * server_shmmgr::delete_segment ()
- *---------------------------------------------------------------------------*/
-
-void
-server_shmmgr::delete_segment (segment_t *const segptr)
-{
- assert (segptr);
- assert (segptr->is_pending_delete ());
-
- segment_t *previous = NULL;
-
- const segment_t *const tmp = find (segptr->_intid, &previous);
-
- assert (tmp == segptr);
- assert (previous ? previous->_next == segptr : _segments_head == segptr);
-
- if (previous)
- previous->_next = segptr->_next;
- else
- _segments_head = segptr->_next;
-
- assert (_shm_ids > 0);
- _shm_ids -= 1;
- _shm_tot -= segptr->_ds.shm_segsz;
-
- safe_delete (segptr);
-}
-
-/*---------------------------------------------------------------------------*
- * client_request_shm::client_request_shm ()
- *---------------------------------------------------------------------------*/
-
-client_request_shm::client_request_shm ()
- : client_request (CYGSERVER_REQUEST_SHM,
- &_parameters, sizeof (_parameters))
-{
- // verbose: syscall_printf ("created");
-}
-
-/*---------------------------------------------------------------------------*
- * client_request_shm::serve ()
- *---------------------------------------------------------------------------*/
-
-void
-client_request_shm::serve (transport_layer_base *const conn,
- process_cache *const cache)
-{
- assert (conn);
-
- assert (!error_code ());
-
- if (msglen () != sizeof (_parameters.in))
- {
- syscall_printf ("bad request body length: expecting %lu bytes, got %lu",
- sizeof (_parameters), msglen ());
- error_code (EINVAL);
- msglen (0);
- return;
- }
-
- // FIXME: Get a return code out of this and don't continue on error.
- conn->impersonate_client ();
-
- class process *const client = cache->process (_parameters.in.cygpid,
- _parameters.in.winpid);
-
- if (!client)
- {
- error_code (EAGAIN);
- msglen (0);
- return;
- }
-
- int result = -EINVAL;
-
- switch (_parameters.in.shmop)
- {
- case SHMOP_shmget:
- result = shmmgr.shmget (_parameters.out.shmid,
- _parameters.in.key, _parameters.in.size,
- _parameters.in.shmflg,
- _parameters.in.uid, _parameters.in.gid,
- client);
- break;
-
- case SHMOP_shmat:
- result = shmmgr.shmat (_parameters.out.hFileMap,
- _parameters.in.shmid, _parameters.in.shmflg,
- client);
- break;
-
- case SHMOP_shmdt:
- result = shmmgr.shmdt (_parameters.in.shmid, client);
- break;
-
- case SHMOP_shmctl:
- result = shmmgr.shmctl (_parameters.out.shmid,
- _parameters.out.ds, _parameters.out.shminfo,
- _parameters.out.shm_info,
- _parameters.in.shmid, _parameters.in.cmd,
- _parameters.in.ds,
- client);
- break;
- }
-
- client->release ();
- conn->revert_to_self ();
-
- if (result < 0)
- {
- error_code (-result);
- msglen (0);
- }
- else
- msglen (sizeof (_parameters.out));
-}
diff --git a/winsup/cygwin/cygserver_shm.h b/winsup/cygwin/cygserver_shm.h
deleted file mode 100644
index b1ff353da..000000000
--- a/winsup/cygwin/cygserver_shm.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/* cygserver_shm.h: Single unix specification IPC interface for Cygwin.
-
- Copyright 2002 Red Hat, Inc.
-
- Written by Conrad Scott <conrad.scott@dsl.pipex.com>.
- Based on code by Robert Collins <robert.collins@hotmail.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. */
-
-#ifndef __CYGSERVER_SHM_H__
-#define __CYGSERVER_SHM_H__
-
-#include <sys/types.h>
-#include <cygwin/shm.h>
-
-#include <assert.h>
-#include <limits.h>
-
-#include "cygserver_ipc.h"
-
-#include "cygwin/cygserver.h"
-
-/*---------------------------------------------------------------------------*
- * Values for the shminfo entries.
- *
- * Nb. The values are segregated between two enums so that the `small'
- * values aren't promoted to `unsigned long' equivalents.
- *---------------------------------------------------------------------------*/
-
-enum
- {
- SHMMAX = ULONG_MAX,
- SHMSEG = ULONG_MAX,
- SHMALL = ULONG_MAX
- };
-
-enum
- {
- SHMMIN = 1,
- SHMMNI = IPCMNI // Must be <= IPCMNI.
- };
-
-/*---------------------------------------------------------------------------*
- * class client_request_shm
- *---------------------------------------------------------------------------*/
-
-#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
- };
-
-#ifdef __INSIDE_CYGWIN__
- client_request_shm (int shmid, int shmflg); // shmat
- client_request_shm (int shmid, int cmd, const struct shmid_ds *); // shmctl
- client_request_shm (int shmid); // shmdt
- client_request_shm (key_t, size_t, int shmflg); // shmget
-#endif
-
- // Accessors for out parameters.
-
- int shmid () const
- {
- assert (!error_code ());
- return _parameters.out.shmid;
- }
-
- HANDLE hFileMap () const
- {
- assert (!error_code ());
- return _parameters.out.hFileMap;
- }
-
- const struct shmid_ds & ds () const
- {
- assert (!error_code ());
- return _parameters.out.ds;
- }
-
- const struct shminfo & shminfo () const
- {
- assert (!error_code ());
- return _parameters.out.shminfo;
- }
-
- const struct shm_info & shm_info () const
- {
- assert (!error_code ());
- return _parameters.out.shm_info;
- }
-
-private:
- union
- {
- struct
- {
- shmop_t shmop;
- key_t key;
- size_t size;
- int shmflg;
- int shmid;
- int cmd;
- pid_t cygpid;
- DWORD winpid;
- uid_t uid;
- gid_t gid;
- struct shmid_ds ds;
- } in;
-
- struct {
- int shmid;
- union
- {
- HANDLE hFileMap;
- struct shmid_ds ds;
- struct shminfo shminfo;
- struct shm_info shm_info;
- };
- } out;
- } _parameters;
-
-#ifndef __INSIDE_CYGWIN__
- client_request_shm ();
-#endif
-
-#ifndef __INSIDE_CYGWIN__
- virtual void serve (transport_layer_base *, process_cache *);
-#endif
-};
-
-#endif /* __CYGSERVER_SHM_H__ */
diff --git a/winsup/cygwin/cygserver_transport.cc b/winsup/cygwin/cygserver_transport.cc
deleted file mode 100755
index 8684a6148..000000000
--- a/winsup/cygwin/cygserver_transport.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/* cygserver_transport.cc
-
- Copyright 2001, 2002 Red Hat Inc.
-
- Written by Robert Collins <rbtcollins@hotmail.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. */
-
-/* to allow this to link into cygwin and the .dll, a little magic is needed. */
-#ifdef __OUTSIDE_CYGWIN__
-#include "woutsup.h"
-#else
-#include "winsup.h"
-#endif
-
-#include <sys/socket.h>
-
-#include "safe_memory.h"
-
-#include "cygwin/cygserver_transport.h"
-#include "cygwin/cygserver_transport_pipes.h"
-#include "cygwin/cygserver_transport_sockets.h"
-
-/* The factory */
-transport_layer_base *
-create_server_transport ()
-{
- if (wincap.is_winnt ())
- return safe_new0 (transport_layer_pipes);
- else
- return safe_new0 (transport_layer_sockets);
-}
-
-#ifndef __INSIDE_CYGWIN__
-
-void
-transport_layer_base::impersonate_client ()
-{}
-
-void
-transport_layer_base::revert_to_self ()
-{}
-
-#endif /* !__INSIDE_CYGWIN__ */
-
-transport_layer_base::~transport_layer_base ()
-{}
diff --git a/winsup/cygwin/cygserver_transport_pipes.cc b/winsup/cygwin/cygserver_transport_pipes.cc
deleted file mode 100755
index 495d804b0..000000000
--- a/winsup/cygwin/cygserver_transport_pipes.cc
+++ /dev/null
@@ -1,363 +0,0 @@
-/* cygserver_transport_pipes.cc
-
- Copyright 2001, 2002 Red Hat Inc.
-
- Written by Robert Collins <rbtcollins@hotmail.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. */
-
-/* to allow this to link into cygwin and the .dll, a little magic is needed. */
-#ifdef __OUTSIDE_CYGWIN__
-#include "woutsup.h"
-#else
-#include "winsup.h"
-#endif
-
-#include <sys/types.h>
-
-#include <assert.h>
-#include <errno.h>
-#include <netdb.h>
-#include <pthread.h>
-#include <unistd.h>
-
-#include "cygerrno.h"
-#include "cygwin/cygserver_transport.h"
-#include "cygwin/cygserver_transport_pipes.h"
-
-#ifndef __INSIDE_CYGWIN__
-#include "cygwin/cygserver.h"
-#endif
-
-enum
- {
- MAX_WAIT_NAMED_PIPE_RETRY = 64,
- WAIT_NAMED_PIPE_TIMEOUT = 10 // milliseconds
- };
-
-#ifndef __INSIDE_CYGWIN__
-
-static pthread_once_t pipe_instance_lock_once = PTHREAD_ONCE_INIT;
-static CRITICAL_SECTION pipe_instance_lock;
-static long pipe_instance = 0;
-
-static void
-initialise_pipe_instance_lock ()
-{
- assert (pipe_instance == 0);
- InitializeCriticalSection (&pipe_instance_lock);
-}
-
-#endif /* !__INSIDE_CYGWIN__ */
-
-#ifndef __INSIDE_CYGWIN__
-
-transport_layer_pipes::transport_layer_pipes (const HANDLE hPipe)
- : _pipe_name (""),
- _hPipe (hPipe),
- _is_accepted_endpoint (true),
- _is_listening_endpoint (false)
-{
- assert (_hPipe);
- assert (_hPipe != INVALID_HANDLE_VALUE);
-
- init_security ();
-}
-
-#endif /* !__INSIDE_CYGWIN__ */
-
-transport_layer_pipes::transport_layer_pipes ()
- : _pipe_name ("\\\\.\\pipe\\cygwin_lpc"),
- _hPipe (NULL),
- _is_accepted_endpoint (false),
- _is_listening_endpoint (false)
-{
- init_security ();
-}
-
-void
-transport_layer_pipes::init_security ()
-{
- assert (wincap.has_security ());
-
- /* FIXME: pthread_once or equivalent needed */
-
- InitializeSecurityDescriptor (&_sd, SECURITY_DESCRIPTOR_REVISION);
- SetSecurityDescriptorDacl (&_sd, TRUE, NULL, FALSE);
-
- _sec_all_nih.nLength = sizeof (SECURITY_ATTRIBUTES);
- _sec_all_nih.lpSecurityDescriptor = &_sd;
- _sec_all_nih.bInheritHandle = FALSE;
-}
-
-transport_layer_pipes::~transport_layer_pipes ()
-{
- close ();
-}
-
-#ifndef __INSIDE_CYGWIN__
-
-int
-transport_layer_pipes::listen ()
-{
- assert (!_hPipe);
- assert (!_is_accepted_endpoint);
- assert (!_is_listening_endpoint);
-
- _is_listening_endpoint = true;
-
- /* no-op */
- return 0;
-}
-
-class transport_layer_pipes *
-transport_layer_pipes::accept (bool *const recoverable)
-{
- assert (!_hPipe);
- assert (!_is_accepted_endpoint);
- assert (_is_listening_endpoint);
-
- pthread_once (&pipe_instance_lock_once, &initialise_pipe_instance_lock);
-
- EnterCriticalSection (&pipe_instance_lock);
-
- // Read: http://www.securityinternals.com/research/papers/namedpipe.php
- // See also the Microsoft security bulletins MS00-053 and MS01-031.
-
- // FIXME: Remove FILE_CREATE_PIPE_INSTANCE.
-
- const bool first_instance = (pipe_instance == 0);
-
- const HANDLE accept_pipe =
- CreateNamedPipe (_pipe_name,
- (PIPE_ACCESS_DUPLEX
- | (first_instance ? FILE_FLAG_FIRST_PIPE_INSTANCE : 0)),
- (PIPE_TYPE_BYTE | PIPE_WAIT),
- PIPE_UNLIMITED_INSTANCES,
- 0, 0, 1000,
- &_sec_all_nih);
-
- const bool duplicate = (accept_pipe == INVALID_HANDLE_VALUE
- && pipe_instance == 0
- && GetLastError () == ERROR_ACCESS_DENIED);
-
- if (accept_pipe != INVALID_HANDLE_VALUE)
- InterlockedIncrement (&pipe_instance);
-
- LeaveCriticalSection (&pipe_instance_lock);
-
- if (duplicate)
- {
- *recoverable = false;
- system_printf ("failed to create named pipe: "
- "is the daemon already running?");
- return NULL;
- }
-
- if (accept_pipe == INVALID_HANDLE_VALUE)
- {
- debug_printf ("error creating pipe (%lu).", GetLastError ());
- *recoverable = true; // FIXME: case analysis?
- return NULL;
- }
-
- assert (accept_pipe);
-
- if (!ConnectNamedPipe (accept_pipe, NULL)
- && GetLastError () != ERROR_PIPE_CONNECTED)
- {
- debug_printf ("error connecting to pipe (%lu)", GetLastError ());
- (void) CloseHandle (accept_pipe);
- *recoverable = true; // FIXME: case analysis?
- return NULL;
- }
-
- return safe_new (transport_layer_pipes, accept_pipe);
-}
-
-#endif /* !__INSIDE_CYGWIN__ */
-
-void
-transport_layer_pipes::close ()
-{
- // verbose: debug_printf ("closing pipe %p", _hPipe);
-
- if (_hPipe)
- {
- assert (_hPipe != INVALID_HANDLE_VALUE);
-
-#ifndef __INSIDE_CYGWIN__
-
- if (_is_accepted_endpoint)
- {
- (void) FlushFileBuffers (_hPipe); // Blocks until client reads.
- (void) DisconnectNamedPipe (_hPipe);
- EnterCriticalSection (&pipe_instance_lock);
- (void) CloseHandle (_hPipe);
- assert (pipe_instance > 0);
- InterlockedDecrement (&pipe_instance);
- LeaveCriticalSection (&pipe_instance_lock);
- }
- else
- (void) CloseHandle (_hPipe);
-
-#else /* __INSIDE_CYGWIN__ */
-
- assert (!_is_accepted_endpoint);
- (void) ForceCloseHandle (_hPipe);
-
-#endif /* __INSIDE_CYGWIN__ */
-
- _hPipe = NULL;
- }
-}
-
-ssize_t
-transport_layer_pipes::read (void *const buf, const size_t len)
-{
- // verbose: debug_printf ("reading from pipe %p", _hPipe);
-
- assert (_hPipe);
- assert (_hPipe != INVALID_HANDLE_VALUE);
- assert (!_is_listening_endpoint);
-
- DWORD count;
- if (!ReadFile (_hPipe, buf, len, &count, NULL))
- {
- debug_printf ("error reading from pipe (%lu)", GetLastError ());
- set_errno (EINVAL); // FIXME?
- return -1;
- }
-
- return count;
-}
-
-ssize_t
-transport_layer_pipes::write (void *const buf, const size_t len)
-{
- // verbose: debug_printf ("writing to pipe %p", _hPipe);
-
- assert (_hPipe);
- assert (_hPipe != INVALID_HANDLE_VALUE);
- assert (!_is_listening_endpoint);
-
- DWORD count;
- if (!WriteFile (_hPipe, buf, len, &count, NULL))
- {
- debug_printf ("error writing to pipe, error = %lu", GetLastError ());
- set_errno (EINVAL); // FIXME?
- return -1;
- }
-
- return count;
-}
-
-/*
- * This routine holds a static variable, assume_cygserver, that is set
- * if the transport has good reason to think that cygserver is
- * running, i.e. if if successfully connected to it with the previous
- * attempt. If this is set, the code tries a lot harder to get a
- * connection, making the assumption that any failures are just
- * congestion and overloading problems.
- */
-
-int
-transport_layer_pipes::connect ()
-{
- assert (!_hPipe);
- assert (!_is_accepted_endpoint);
- assert (!_is_listening_endpoint);
-
- static bool assume_cygserver = false;
-
- BOOL rc = TRUE;
- int retries = 0;
-
- while (rc)
- {
- _hPipe = CreateFile (_pipe_name,
- GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- &_sec_all_nih,
- OPEN_EXISTING,
- SECURITY_IMPERSONATION,
- NULL);
-
- if (_hPipe != INVALID_HANDLE_VALUE)
- {
- assert (_hPipe);
-#ifdef __INSIDE_CYGWIN__
- ProtectHandle (_hPipe);
-#endif
- assume_cygserver = true;
- return 0;
- }
-
- _hPipe = NULL;
-
- if (!assume_cygserver && GetLastError () != ERROR_PIPE_BUSY)
- {
- debug_printf ("Error opening the pipe (%lu)", GetLastError ());
- return -1;
- }
-
- /* Note: `If no instances of the specified named pipe exist, the
- * WaitNamedPipe function returns immediately, regardless of the
- * time-out value.' Thus the explicit Sleep if the call fails
- * with ERROR_FILE_NOT_FOUND.
- */
- while (retries != MAX_WAIT_NAMED_PIPE_RETRY
- && !(rc = WaitNamedPipe (_pipe_name, WAIT_NAMED_PIPE_TIMEOUT)))
- {
- if (GetLastError () == ERROR_FILE_NOT_FOUND)
- Sleep (0); // Give the server a chance.
-
- retries += 1;
- }
- }
-
- assert (retries == MAX_WAIT_NAMED_PIPE_RETRY);
-
- system_printf ("lost connection to cygserver, error = %lu",
- GetLastError ());
-
- assume_cygserver = false;
-
- return -1;
-}
-
-#ifndef __INSIDE_CYGWIN__
-
-void
-transport_layer_pipes::impersonate_client ()
-{
- assert (_hPipe);
- assert (_hPipe != INVALID_HANDLE_VALUE);
- assert (_is_accepted_endpoint);
-
- // verbose: debug_printf ("impersonating pipe %p", _hPipe);
- if (_hPipe)
- {
- assert (_hPipe != INVALID_HANDLE_VALUE);
-
- if (!ImpersonateNamedPipeClient (_hPipe))
- debug_printf ("Failed to Impersonate the client, (%lu)",
- GetLastError ());
- }
- // verbose: debug_printf ("I am who you are");
-}
-
-void
-transport_layer_pipes::revert_to_self ()
-{
- assert (_is_accepted_endpoint);
-
- RevertToSelf ();
- // verbose: debug_printf ("I am who I yam");
-}
-
-#endif /* !__INSIDE_CYGWIN__ */
diff --git a/winsup/cygwin/cygserver_transport_sockets.cc b/winsup/cygwin/cygserver_transport_sockets.cc
deleted file mode 100755
index 6ade14bff..000000000
--- a/winsup/cygwin/cygserver_transport_sockets.cc
+++ /dev/null
@@ -1,387 +0,0 @@
-/* cygserver_transport_sockets.cc
-
- Copyright 2001, 2002 Red Hat Inc.
-
- Written by Robert Collins <rbtcollins@hotmail.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. */
-
-/* to allow this to link into cygwin and the .dll, a little magic is needed. */
-#ifdef __OUTSIDE_CYGWIN__
-#include "woutsup.h"
-#else
-#include "winsup.h"
-#endif
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-
-#include <assert.h>
-#include <errno.h>
-#include <stdio.h>
-#include <unistd.h>
-
-#include "cygwin/cygserver_transport.h"
-#include "cygwin/cygserver_transport_sockets.h"
-
-/* to allow this to link into cygwin and the .dll, a little magic is needed. */
-#ifndef __OUTSIDE_CYGWIN__
-
-extern "C" int cygwin_accept (int fd, struct sockaddr *, int *len);
-extern "C" int cygwin_bind (int fd, const struct sockaddr *, int len);
-extern "C" int cygwin_connect (int fd, const struct sockaddr *, int len);
-extern "C" int cygwin_listen (int fd, int backlog);
-extern "C" int cygwin_shutdown (int fd, int how);
-extern "C" int cygwin_socket (int af, int type, int protocol);
-
-#else /* __OUTSIDE_CYGWIN__ */
-
-#define cygwin_accept(A,B,C) ::accept (A,B,C)
-#define cygwin_bind(A,B,C) ::bind (A,B,C)
-#define cygwin_connect(A,B,C) ::connect (A,B,C)
-#define cygwin_listen(A,B) ::listen (A,B)
-#define cygwin_shutdown(A,B) ::shutdown (A,B)
-#define cygwin_socket(A,B,C) ::socket (A,B,C)
-
-#endif /* __OUTSIDE_CYGWIN__ */
-
-enum
- {
- MAX_CONNECT_RETRY = 64
- };
-
-transport_layer_sockets::transport_layer_sockets (const int fd)
- : _fd (fd),
- _addr_len (0),
- _is_accepted_endpoint (true),
- _is_listening_endpoint (false)
-{
- assert (_fd != -1);
-
- memset (&_addr, '\0', sizeof (_addr));
-}
-
-transport_layer_sockets::transport_layer_sockets ()
- : _fd (-1),
- _addr_len (0),
- _is_accepted_endpoint (false),
- _is_listening_endpoint (false)
-{
- memset (&_addr, '\0', sizeof (_addr));
-
- _addr.sun_family = AF_UNIX;
- strcpy (_addr.sun_path, "/tmp/cygdaemo"); // FIXME: $TMP?
- _addr_len = SUN_LEN (&_addr);
-}
-
-transport_layer_sockets::~transport_layer_sockets ()
-{
- close ();
-}
-
-#ifndef __INSIDE_CYGWIN__
-
-int
-transport_layer_sockets::listen ()
-{
- assert (_fd == -1);
- assert (!_is_accepted_endpoint);
- assert (!_is_listening_endpoint);
-
- debug_printf ("listen () [this = %p]", this);
-
- struct stat sbuf;
-
- if (stat (_addr.sun_path, &sbuf) == -1)
- {
- if (errno != ENOENT)
- {
- system_printf ("cannot access socket file `%s': %s",
- _addr.sun_path, strerror (errno));
- return -1;
- }
- }
- else if (S_ISSOCK (sbuf.st_mode))
- {
- // The socket already exists: is a duplicate cygserver running?
-
- const int newfd = cygwin_socket (AF_UNIX, SOCK_STREAM, 0);
-
- if (newfd == -1)
- {
- system_printf ("failed to create UNIX domain socket: %s",
- strerror (errno));
- return -1;
- }
-
- if (cygwin_connect (newfd, (struct sockaddr *) &_addr, _addr_len) == 0)
- {
- system_printf ("the daemon is already running");
- (void) cygwin_shutdown (newfd, SHUT_WR);
- char buf[BUFSIZ];
- while (::read (newfd, buf, sizeof (buf)) > 0)
- {}
- (void) ::close (newfd);
- return -1;
- }
-
- if (unlink (_addr.sun_path) == -1)
- {
- system_printf ("failed to remove `%s': %s",
- _addr.sun_path, strerror (errno));
- (void) ::close (newfd);
- return -1;
- }
- }
- else
- {
- system_printf ("cannot create socket `%s': File already exists",
- _addr.sun_path);
- return -1;
- }
-
- _fd = cygwin_socket (AF_UNIX, SOCK_STREAM, 0);
-
- if (_fd == -1)
- {
- system_printf ("failed to create UNIX domain socket: %s",
- strerror (errno));
- return -1;
- }
-
- if (cygwin_bind (_fd, (struct sockaddr *) &_addr, _addr_len) == -1)
- {
- const int saved_errno = errno;
- close ();
- errno = saved_errno;
- system_printf ("failed to bind UNIX domain socket `%s': %s",
- _addr.sun_path, strerror (errno));
- return -1;
- }
-
- _is_listening_endpoint = true; // i.e. this really means "have bound".
-
- if (cygwin_listen (_fd, SOMAXCONN) == -1)
- {
- const int saved_errno = errno;
- close ();
- errno = saved_errno;
- system_printf ("failed to listen on UNIX domain socket `%s': %s",
- _addr.sun_path, strerror (errno));
- return -1;
- }
-
- debug_printf ("0 = listen () [this = %p, fd = %d]", this, _fd);
-
- return 0;
-}
-
-class transport_layer_sockets *
-transport_layer_sockets::accept (bool *const recoverable)
-{
- assert (_fd != -1);
- assert (!_is_accepted_endpoint);
- assert (_is_listening_endpoint);
-
- debug_printf ("accept () [this = %p, fd = %d]", this, _fd);
-
- struct sockaddr_un client_addr;
- socklen_t client_addr_len = sizeof (client_addr);
-
- const int accept_fd =
- cygwin_accept (_fd, (struct sockaddr *) &client_addr, &client_addr_len);
-
- if (accept_fd == -1)
- {
- system_printf ("failed to accept connection: %s", strerror (errno));
- switch (errno)
- {
- case ECONNABORTED:
- case EINTR:
- case EMFILE:
- case ENFILE:
- case ENOBUFS:
- case ENOMEM:
- *recoverable = true;
- break;
-
- default:
- *recoverable = false;
- break;
- }
- return NULL;
- }
-
- debug_printf ("%d = accept () [this = %p, fd = %d]", accept_fd, this, _fd);
-
- return safe_new (transport_layer_sockets, accept_fd);
-}
-
-#endif /* !__INSIDE_CYGWIN__ */
-
-void
-transport_layer_sockets::close ()
-{
- debug_printf ("close () [this = %p, fd = %d]", this, _fd);
-
- if (_is_listening_endpoint)
- (void) unlink (_addr.sun_path);
-
- if (_fd != -1)
- {
- (void) cygwin_shutdown (_fd, SHUT_WR);
- if (!_is_listening_endpoint)
- {
- char buf[BUFSIZ];
- while (::read (_fd, buf, sizeof (buf)) > 0)
- {}
- }
- (void) ::close (_fd);
- _fd = -1;
- }
-
- _is_listening_endpoint = false;
-}
-
-ssize_t
-transport_layer_sockets::read (void *const buf, const size_t buf_len)
-{
- assert (_fd != -1);
- assert (!_is_listening_endpoint);
-
- assert (buf);
- assert (buf_len > 0);
-
- // verbose: debug_printf ("read (buf = %p, len = %u) [this = %p, fd = %d]",
- // buf, buf_len, this, _fd);
-
- char *read_buf = static_cast<char *> (buf);
- size_t read_buf_len = buf_len;
- ssize_t res = 0;
-
- while (read_buf_len != 0
- && (res = ::read (_fd, read_buf, read_buf_len)) > 0)
- {
- read_buf += res;
- read_buf_len -= res;
-
- assert (read_buf_len >= 0);
- }
-
- if (res != -1)
- {
- if (res == 0)
- errno = EIO; // FIXME?
-
- res = buf_len - read_buf_len;
- }
-
- if (res != static_cast<ssize_t> (buf_len))
- debug_printf ("%d = read (buf = %p, len = %u) [this = %p, fd = %d]: %s",
- res, buf, buf_len, this, _fd,
- (res == -1 ? strerror (errno) : "EOF"));
- else
- {
- // verbose: debug_printf ("%d = read (buf = %p, len = %u) [this = %p, fd = %d]",
- // res, buf, buf_len, this, _fd);
- }
-
- return res;
-}
-
-ssize_t
-transport_layer_sockets::write (void *const buf, const size_t buf_len)
-{
- assert (_fd != -1);
- assert (!_is_listening_endpoint);
-
- assert (buf);
- assert (buf_len > 0);
-
- // verbose: debug_printf ("write (buf = %p, len = %u) [this = %p, fd = %d]",
- // buf, buf_len, this, _fd);
-
- char *write_buf = static_cast<char *> (buf);
- size_t write_buf_len = buf_len;
- ssize_t res = 0;
-
- while (write_buf_len != 0
- && (res = ::write (_fd, write_buf, write_buf_len)) > 0)
- {
- write_buf += res;
- write_buf_len -= res;
-
- assert (write_buf_len >= 0);
- }
-
- if (res != -1)
- {
- if (res == 0)
- errno = EIO; // FIXME?
-
- res = buf_len - write_buf_len;
- }
-
- if (res != static_cast<ssize_t> (buf_len))
- debug_printf ("%d = write (buf = %p, len = %u) [this = %p, fd = %d]: %s",
- res, buf, buf_len, this, _fd,
- (res == -1 ? strerror (errno) : "EOF"));
- else
- {
- // verbose: debug_printf ("%d = write (buf = %p, len = %u) [this = %p, fd = %d]",
- // res, buf, buf_len, this, _fd);
- }
-
- return res;
-}
-
-int
-transport_layer_sockets::connect ()
-{
- assert (_fd == -1);
- assert (!_is_accepted_endpoint);
- assert (!_is_listening_endpoint);
-
- static bool assume_cygserver = false;
-
- debug_printf ("connect () [this = %p]", this);
-
- for (int retries = 0; retries != MAX_CONNECT_RETRY; retries++)
- {
- _fd = cygwin_socket (AF_UNIX, SOCK_STREAM, 0);
-
- if (_fd == -1)
- {
- system_printf ("failed to create UNIX domain socket: %s",
- strerror (errno));
- return -1;
- }
-
- if (cygwin_connect (_fd, (struct sockaddr *) &_addr, _addr_len) == 0)
- {
- assume_cygserver = true;
- debug_printf ("0 = connect () [this = %p, fd = %d]", this, _fd);
- return 0;
- }
-
- if (!assume_cygserver || errno != ECONNREFUSED)
- {
- debug_printf ("failed to connect to server: %s", strerror (errno));
- (void) ::close (_fd);
- _fd = -1;
- return -1;
- }
-
- (void) ::close (_fd);
- _fd = -1;
- Sleep (0); // Give the server a chance.
- }
-
- debug_printf ("failed to connect to server: %s", strerror (errno));
- return -1;
-}
diff --git a/winsup/cygwin/cygthread.cc b/winsup/cygwin/cygthread.cc
deleted file mode 100644
index 5328a39bd..000000000
--- a/winsup/cygwin/cygthread.cc
+++ /dev/null
@@ -1,331 +0,0 @@
-/* cygthread.cc
-
- Copyright 1998, 1999, 2000, 2001, 2002 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 <windows.h>
-#include <stdlib.h>
-#include <errno.h>
-#include "exceptions.h"
-#include "security.h"
-#include "cygthread.h"
-#include "sync.h"
-#include "cygerrno.h"
-#include "sigproc.h"
-
-#undef CloseHandle
-
-static cygthread NO_COPY threads[18];
-#define NTHREADS (sizeof (threads) / sizeof (threads[0]))
-
-DWORD NO_COPY cygthread::main_thread_id;
-bool NO_COPY cygthread::exiting;
-
-/* Initial stub called by cygthread constructor. Performs initial
- per-thread initialization and loops waiting for new thread functions
- to execute. */
-DWORD WINAPI
-cygthread::stub (VOID *arg)
-{
- DECLARE_TLS_STORAGE;
- exception_list except_entry;
-
- /* Initialize this thread's ability to respond to things like
- SIGSEGV or SIGFPE. */
- init_exceptions (&except_entry);
-
- cygthread *info = (cygthread *) arg;
- if (info->arg == cygself)
- info->ev = info->thread_sync = info->stack_ptr = NULL;
- else
- {
- info->ev = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
- info->thread_sync = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
- info->stack_ptr = &arg;
- }
- while (1)
- {
- if (!info->__name)
- system_printf ("erroneous thread activation");
- else
- {
- if (!info->func || exiting)
- ExitThread (0);
-
- /* Cygwin threads should not call ExitThread directly */
- info->func (info->arg == cygself ? info : info->arg);
- /* ...so the above should always return */
-
-#ifdef DEBUGGING
- info->func = NULL; // catch erroneous activation
-#endif
- info->__name = NULL;
- SetEvent (info->ev);
- }
- 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)
-{
- DECLARE_TLS_STORAGE;
- exception_list except_entry;
-
- /* Initialize this thread's ability to respond to things like
- SIGSEGV or SIGFPE. */
- init_exceptions (&except_entry);
-
- cygthread *info = (cygthread *) arg;
- info->func (info->arg == cygself ? info : info->arg);
- ExitThread (0);
-}
-
-static NO_COPY muto *cygthread_protect;
-/* Start things going. Called from dll_crt0_1. */
-void
-cygthread::init ()
-{
- new_muto (cygthread_protect);
- main_thread_id = GetCurrentThreadId ();
-}
-
-bool
-cygthread::is ()
-{
- DWORD tid = GetCurrentThreadId ();
-
- for (DWORD i = 0; i < NTHREADS; i++)
- if (threads[i].id == tid)
- return 1;
-
- return 0;
-}
-
-cygthread *
-cygthread::freerange ()
-{
- cygthread *self = (cygthread *) calloc (1, sizeof (*self));
- self->is_freerange = true;
- self->h = CreateThread (&sec_none_nih, 0, cygthread::simplestub, self,
- CREATE_SUSPENDED, &self->id);
- self->ev = self->h;
- return self;
-}
-
-void * cygthread::operator
-new (size_t)
-{
- DWORD id;
- cygthread *info;
-
- cygthread_protect->acquire ();
-
- /* Search the threads array for an empty slot to use */
- for (info = threads; info < threads + NTHREADS; info++)
- if ((id = (DWORD) InterlockedExchange ((LPLONG) &info->avail, 0)))
- {
-#ifdef DEBUGGING
- if (info->__name)
- api_fatal ("name not NULL? id %p, i %d", id, info - threads);
-#endif
- goto out;
- }
- else if (!info->id)
- {
- info->h = CreateThread (&sec_none_nih, 0, cygthread::stub, info,
- CREATE_SUSPENDED, &info->id);
- goto out;
- }
-
-#ifdef DEBUGGING
- char buf[1024];
- if (!GetEnvironmentVariable ("CYGWIN_NOFREERANGE_NOCHECK", buf, sizeof (buf)))
- api_fatal ("Overflowed cygwin thread pool");
-#endif
-
- info = freerange (); /* exhausted thread pool */
-
-out:
- cygthread_protect->release ();
- return info;
-}
-
-cygthread::cygthread (LPTHREAD_START_ROUTINE start, LPVOID param,
- const char *name): func (start), arg (param)
-{
-#ifdef DEBUGGGING
- if (!__name)
- api_fatal ("name should never be NULL");
-#endif
- thread_printf ("name %s, id %p", name, id);
- while (!h)
-#ifndef DEBUGGING
- low_priority_sleep (0);
-#else
- {
- thread_printf ("waiting for %s<%p> to become active", __name, h);
- low_priority_sleep (0);
- }
-#endif
- __name = name;
- if (!thread_sync)
- ResumeThread (h);
- else
- SetEvent (thread_sync);
-}
-
-/* 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)
- {
- static char buf[30] NO_COPY = {0};
- __small_sprintf (buf, "unknown (%p)", tid);
- res = buf;
- }
-
- return res;
-}
-
-cygthread::operator
-HANDLE ()
-{
- while (!ev)
- low_priority_sleep (0);
- return ev;
-}
-
-/* Should only be called when the process is exiting since it
- leaves an open thread slot. */
-void
-cygthread::exit_thread ()
-{
- if (!is_freerange)
- SetEvent (*this);
- ExitThread (0);
-}
-
-/* Forcibly terminate a thread. */
-void
-cygthread::terminate_thread ()
-{
- if (!is_freerange)
- SetEvent (*this);
- (void) TerminateThread (h, 0);
- (void) WaitForSingleObject (h, INFINITE);
-
- MEMORY_BASIC_INFORMATION m;
- memset (&m, 0, sizeof (m));
- (void) VirtualQuery (stack_ptr, &m, sizeof m);
-
- if (m.RegionSize)
- (void) VirtualFree (m.AllocationBase, m.RegionSize, MEM_DECOMMIT);
-
- if (is_freerange)
- is_freerange = false;
- else
- {
- CloseHandle (ev);
- CloseHandle (thread_sync);
- }
- CloseHandle (h);
- thread_sync = ev = h = NULL;
- __name = NULL;
- id = 0;
-}
-
-/* Detach the cygthread from the current thread. Note that the
- theory is that cygthreads are only associated with one thread.
- So, there should be no problems with multiple threads doing waits
- on the one cygthread. */
-bool
-cygthread::detach (HANDLE sigwait)
-{
- bool signalled = false;
- if (avail)
- system_printf ("called detach on available thread %d?", avail);
- else
- {
- DWORD avail = id;
- DWORD res;
-
- if (!sigwait)
- res = WaitForSingleObject (*this, INFINITE);
- else
- {
- HANDLE w4[2];
- w4[0] = signal_arrived;
- w4[1] = *this;
- res = WaitForSingleObject (sigwait, INFINITE);
- if (res != WAIT_OBJECT_0)
- system_printf ("WFSO sigwait failed, res %u", res);
- res = WaitForMultipleObjects (2, w4, FALSE, INFINITE);
- if (res != WAIT_OBJECT_0)
- /* nothing */;
- else if (WaitForSingleObject (sigwait, 5) == WAIT_OBJECT_0)
- res = WaitForSingleObject (*this, INFINITE);
- else
- {
- terminate_thread ();
- set_sig_errno (EINTR); /* caller should be dealing with return
- values. */
- avail = 0;
- signalled = true;
- }
- }
-
- thread_printf ("%s returns %d, id %p", sigwait ? "WFMO" : "WFSO",
- res, id);
-
- if (!avail)
- /* already handled */;
- else if (is_freerange)
- {
- CloseHandle (h);
- free (this);
- }
- else
- {
- ResetEvent (*this);
- /* Mark the thread as available by setting avail to non-zero */
- (void) InterlockedExchange ((LPLONG) &this->avail, avail);
- }
- }
- return signalled;
-}
-
-void
-cygthread::terminate ()
-{
- exiting = 1;
-}
diff --git a/winsup/cygwin/cygthread.h b/winsup/cygwin/cygthread.h
deleted file mode 100644
index b0c07af0a..000000000
--- a/winsup/cygwin/cygthread.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* cygthread.h
-
- Copyright 1998, 1999, 2000, 2001, 2002 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. */
-
-class cygthread
-{
- DWORD avail;
- DWORD id;
- HANDLE h;
- HANDLE ev;
- HANDLE thread_sync;
- void *stack_ptr;
- const char *__name;
- LPTHREAD_START_ROUTINE func;
- VOID *arg;
- bool is_freerange;
- static DWORD main_thread_id;
- static bool exiting;
- static DWORD WINAPI stub (VOID *);
- static DWORD WINAPI simplestub (VOID *);
- public:
- static const char * name (DWORD = 0);
- cygthread (LPTHREAD_START_ROUTINE, LPVOID, const char *);
- cygthread () {};
- static void init ();
- bool detach (HANDLE = NULL);
- operator HANDLE ();
- static bool is ();
- void * operator new (size_t);
- static cygthread *freerange ();
- void exit_thread ();
- void terminate_thread ();
- static void terminate ();
- bool SetThreadPriority (int nPriority) {return ::SetThreadPriority (h, nPriority);}
- void zap_h ()
- {
- (void) CloseHandle (h);
- h = NULL;
- }
-
-};
-
-#define cygself NULL
diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din
deleted file mode 100644
index 5142f1ea3..000000000
--- a/winsup/cygwin/cygwin.din
+++ /dev/null
@@ -1,1317 +0,0 @@
-LIBRARY "cygwin1.dll" BASE=0x61000000
-
-EXPORTS
-__assert
-__eprintf
-__errno
-__fpclassifyd
-__fpclassifyf
-__infinity
-__main
-__signbitd
-__signbitf
-__signgam
-__srget
-__swbuf
-__argv DATA
-__argc DATA
-__progname DATA
-_check_for_executable DATA
-; __vc__10pinfo_listi
-@ALLOCA@
-cygwin_stackdump
-abort
-_abort = abort
-abs
-_abs = abs
-access
-_access = access
-acos
-_acos = acos
-acosf
-_acosf = acosf
-acosh
-_acosh = acosh
-acoshf
-_acoshf = acoshf
-alarm
-_alarm = alarm
-alphasort
-_alphasort = alphasort
-asctime
-_asctime = asctime
-asctime_r
-_asctime_r = asctime_r
-asin
-_asin = asin
-asinf
-_asinf = asinf
-asinh
-_asinh = asinh
-asinhf
-_asinhf = asinhf
-atan
-_atan = atan
-atan2
-_atan2 = atan2
-atan2f
-_atan2f = atan2f
-atanf
-_atanf = atanf
-atanh
-_atanh = atanh
-atanhf
-_atanhf = atanhf
-atexit
-_atexit = atexit
-atof
-_atof = atof
-atoff
-_atoff = atoff
-atoi
-_atoi = atoi
-atol
-_atol = atol
-bcmp
-_bcmp = bcmp
-bcopy
-_bcopy = bcopy
-bsearch
-_bsearch = bsearch
-bzero
-_bzero = bzero
-cabs
-_cabs = cabs
-cabsf
-_cabsf = cabsf
-calloc
-_calloc = calloc
-cbrt
-_cbrt = cbrt
-cbrtf
-_cbrtf = cbrtf
-ceil
-_ceil = ceil
-ceilf
-_ceilf = ceilf
-cfgetospeed
-cfgetispeed
-cfsetospeed
-cfsetispeed
-chdir
-_chdir = chdir
-chmod
-_chmod = chmod
-chown
-_chown = chown
-chown32
-cleanup_glue
-clearerr
-_clearerr = clearerr
-clock
-_clock = clock
-close
-_close = close
-closedir
-_closedir = closedir
-copysign
-_copysign = copysign
-copysignf
-_copysignf = copysignf
-cos
-_cos = cos
-cosf
-_cosf = cosf
-cosh
-_cosh = cosh
-coshf
-_coshf = coshf
-creat
-_creat = creat
-ctime
-_ctime = ctime
-ctime_r
-_ctime_r = ctime_r
-cwait
-_cwait = cwait
-difftime
-_difftime = difftime
-div
-_div = div
-dirfd
-_dirfd = dirfd
-_dll_crt0@0
-dll_crt0__FP11per_process
-cygwin_dll_init
-dll_dllcrt0
-dll_noncygwin_dllcrt0
-cygwin_detach_dll
-cygwin32_detach_dll = cygwin_detach_dll
-@DEF_DLL_ENTRY@
-drem
-_drem = drem
-dremf
-_dremf = dremf
-dup
-_dup = dup
-dup2
-_dup2 = dup2
-ecvt
-_ecvt = ecvt
-ecvtbuf
-_ecvtbuf = ecvtbuf
-ecvtf
-_ecvtf = ecvtf
-endgrent
-_endgrent = endgrent
-endutent
-_endutent = endutent
-erf
-_erf = erf
-erfc
-_erfc = erfc
-erfcf
-_erfcf = erfcf
-erff
-_erff = erff
-execl
-_execl = execl
-execle
-_execle = execle
-execlp
-_execlp = execlp
-execv
-_execv = execv
-execve
-_execve = execve
-execvp
-_execvp = execvp
-exit
-_exit
-exp
-_exp = exp
-expf
-_expf = expf
-expm1
-_expm1 = expm1
-expm1f
-_expm1f = expm1f
-fabs
-_fabs = fabs
-fabsf
-_fabsf = fabsf
-_f_atan2
-__f_atan2 = _f_atan2
-_f_atan2f
-__f_atan2f = _f_atan2f
-fchdir
-_fchdir = fchdir
-fchmod
-_fchmod = fchmod
-fchown
-_fchown = fchown
-fchown32
-fclose
-_fclose = fclose
-fcloseall
-_fcloseall = fcloseall
-_fcloseall_r
-fcloseall_r = _fcloseall_r
-fcntl
-_fcntl = fcntl
-fcvt
-_fcvt = fcvt
-fcvtbuf
-_fcvtbuf = fcvtbuf
-fcvtf
-_fcvtf = fcvtf
-fdopen
-_fdopen = fdopen
-feof
-_feof = feof
-ferror
-_ferror = ferror
-_f_exp
-__f_exp = _f_exp
-_f_expf
-__f_expf = _f_expf
-fflush
-_fflush = fflush
-_f_frexp
-__f_frexp = _f_frexp
-_f_frexpf
-__f_frexpf = _f_frexpf
-fgetc
-_fgetc = fgetc
-fgetpos
-_fgetpos = fgetpos
-fgets
-_fgets = fgets
-ffs
-_ffs = ffs
-fileno
-_fileno = fileno
-finite
-_finite = finite
-finitef
-_finitef = finitef
-fiprintf
-_fiprintf = fiprintf
-_f_ldexp
-__f_ldexp = _f_ldexp
-_f_ldexpf
-__f_ldexpf = _f_ldexpf
-_f_log
-__f_log = _f_log
-_f_logf
-__f_logf = _f_logf
-_f_log10
-__f_log10 = _f_log10
-_f_log10f
-__f_log10f = _f_log10f
-floor
-_floor = floor
-floorf
-_floorf = floorf
-fnmatch
-_fnmatch = fnmatch
-fmod
-_fmod = fmod
-fmodf
-_fmodf = fmodf
-fopen
-_fopen = fopen
-fork
-_fork = fork
-fpathconf
-_f_pow
-__f_pow = _f_pow
-_f_powf
-__f_powf = _f_powf
-fprintf
-_fprintf = fprintf
-fputc
-_fputc = fputc
-fputs
-_fputs = fputs
-fread
-_fread = fread
-free
-_free = free
-freopen
-_freopen = freopen
-frexp
-_frexp = frexp
-frexpf
-_frexpf = frexpf
-fscanf
-_fscanf = fscanf
-_fscanf_r
-fscanf_r = _fscanf_r
-fseek
-_fseek = fseek
-fseeko
-_fseeko = fseeko
-fsetpos
-_fsetpos = fsetpos
-_fstat
-fstat = _fstat
-fstat64
-fstatfs
-_fstatfs = fstatfs
-fsync
-_fsync = fsync
-_f_tan
-__f_tan = _f_tan
-_f_tanf
-__f_tanf = _f_tanf
-ftell
-_ftell = ftell
-ftello
-_ftello = ftello
-ftime
-_ftime = ftime
-ftruncate
-_ftruncate = ftruncate
-ftruncate64
-fwrite
-_fwrite = fwrite
-gamma
-_gamma = gamma
-gamma_r
-_gamma_r = gamma_r
-gammaf
-_gammaf = gammaf
-gammaf_r
-_gammaf_r = gammaf_r
-gcvt
-_gcvt = gcvt
-gcvtf
-_gcvtf = gcvtf
-getc
-_getc = getc
-getc_unlocked
-_getc_unlocked = getc_unlocked
-getchar
-_getchar = getchar
-getchar_unlocked
-_getchar_unlocked = getchar_unlocked
-getcwd
-_getcwd = getcwd
-getdtablesize
-_getdtablesize = getdtablesize
-getegid
-_getegid = getegid
-getegid32
-geteuid
-_geteuid = geteuid
-geteuid32
-getgid
-_getgid = getgid
-getgid32
-getgrgid
-_getgrgid = getgrgid
-getgrgid32
-getgrnam
-_getgrnam = getgrnam
-getgrnam32
-getgroups
-_getgroups = getgroups
-getgroups32
-gethostname = cygwin_gethostname
-_gethostname = cygwin_gethostname
-getlogin
-_getlogin = getlogin
-getmntent
-_getmntent = getmntent
-getmode
-_getmode = getmode
-get_osfhandle
-_get_osfhandle = get_osfhandle
-getpagesize
-_getpagesize = getpagesize
-getpass
-_getpass = getpass
-getpid
-_getpid = getpid
-getppid
-_getppid = getppid
-getrlimit
-_getrlimit = getrlimit
-getrusage
-_getrusage = getrusage
-gets
-_gets = gets
-getsid
-gettimeofday
-_gettimeofday = gettimeofday
-getuid
-_getuid = getuid
-getuid32
-getutent
-_getutent = getutent
-getutid
-_getutid = getutid
-getutline
-_getutline = getutline
-glob
-_glob = glob
-globfree
-_globfree = globfree
-gmtime
-_gmtime = gmtime
-gmtime_r
-_gmtime_r = gmtime_r
-h_errno DATA
-hypot
-_hypot = hypot
-hypotf
-_hypotf = hypotf
-ilogb
-_ilogb = ilogb
-ilogbf
-_ilogbf = ilogbf
-index
-_index = index
-infinity
-_infinity = infinity
-infinityf
-_infinityf = infinityf
-initgroups
-initgroups32
-ioctl
-_ioctl = ioctl
-iprintf
-_iprintf = iprintf
-isalnum
-_isalnum = isalnum
-isalpha
-_isalpha = isalpha
-isascii
-_isascii = isascii
-isatty
-_isatty = isatty
-iscntrl
-_iscntrl = iscntrl
-isdigit
-_isdigit = isdigit
-isgraph
-_isgraph = isgraph
-isinf
-_isinf = isinf
-isinff
-_isinff = isinff
-islower
-_islower = islower
-isnan
-_isnan = isnan
-isnanf
-_isnanf = isnanf
-isprint
-_isprint = isprint
-ispunct
-_ispunct = ispunct
-isspace
-_isspace = isspace
-isupper
-_isupper = isupper
-isxdigit
-_isxdigit = isxdigit
-j0
-_j0 = j0
-j0f
-_j0f = j0f
-j1
-_j1 = j1
-j1f
-_j1f = j1f
-jn
-_jn = jn
-jnf
-_jnf = jnf
-kill
-_kill = kill
-labs
-_labs = labs
-lchown
-_lchown = lchown
-lchown32
-ldexp
-_ldexp = ldexp
-ldexpf
-_ldexpf = ldexpf
-ldiv
-_ldiv = ldiv
-lgamma
-_lgamma = lgamma
-lgamma_r
-_lgamma_r = lgamma_r
-lgammaf
-_lgammaf = lgammaf
-lgammaf_r
-_lgammaf_r = lgammaf_r
-link
-_link = link
-localeconv
-_localeconv = localeconv
-localtime
-_localtime = localtime
-localtime_r
-_localtime_r = localtime_r
-log
-_log = log
-log10
-_log10 = log10
-log10f
-_log10f = log10f
-log1p
-_log1p = log1p
-log1pf
-_log1pf = log1pf
-logb
-_logb = logb
-logbf
-_logbf = logbf
-logf
-_logf = logf
-login
-logout
-longjmp
-_longjmp = longjmp
-lseek
-_lseek = lseek
-lseek64
-lstat = cygwin_lstat
-_lstat = cygwin_lstat
-lstat64
-malloc
-_malloc = malloc
-malloc_stats
-malloc_trim
-malloc_usable_size
-mallopt
-matherr
-_matherr = matherr
-mblen
-_mblen = mblen
-mbstowcs
-_mbstowcs = mbstowcs
-mbtowc
-_mbtowc = mbtowc
-memalign
-memchr
-_memchr = memchr
-memcmp
-_memcmp = memcmp
-memcpy
-_memcpy = memcpy
-memmove
-_memmove = memmove
-memset
-_memset = memset
-mkdir
-_mkdir = mkdir
-mkfifo
-mknod
-_mknod = mknod
-mkstemp
-_mkstemp = mkstemp
-mktemp
-_mktemp = mktemp
-mktime
-_mktime = mktime
-mmap
-mmap64
-mprotect
-msync
-munmap
-modf
-_modf = modf
-modff
-_modff = modff
-nan
-_nan = nan
-nanf
-_nanf = nanf
-nextafter
-_nextafter = nextafter
-nextafterf
-_nextafterf = nextafterf
-nl_langinfo
-_nl_langinfo = nl_langinfo
-open
-_open = open
-opendir
-_opendir = opendir
-pathconf
-_pathconf = pathconf
-perror
-_perror = perror
-pipe
-_pipe
-poll
-_poll = poll
-pow
-_pow = pow
-powf
-_powf = powf
-printf
-_printf = printf
-putc
-_putc = putc
-putc_unlocked
-_putc_unlocked = putc_unlocked
-putchar
-_putchar = putchar
-putchar_unlocked
-_putchar_unlocked = putchar_unlocked
-puts
-_puts = puts
-pututline
-_pututline = pututline
-putw
-_putw = putw
-qsort
-_qsort = qsort
-raise
-_raise = raise
-rand
-_rand = rand
-random
-initstate
-setstate
-read
-_read = read
-readdir
-_readdir = readdir
-readlink
-_readlink = readlink
-readv
-_readv = readv
-realloc
-_realloc = realloc
-posix_regcomp
-posix_regerror
-posix_regexec
-posix_regfree
-remainder
-_remainder = remainder
-remainderf
-_remainderf = remainderf
-remove
-_remove = remove
-rename
-_rename = rename
-rewind
-_rewind = rewind
-rewinddir
-_rewinddir = rewinddir
-rindex
-_rindex = rindex
-rint
-_rint = rint
-rintf
-_rintf = rintf
-rmdir
-_rmdir = rmdir
-sbrk
-_sbrk = sbrk
-scalb
-_scalb = scalb
-scalbf
-_scalbf = scalbf
-scalbn
-_scalbn = scalbn
-scalbnf
-_scalbnf = scalbnf
-scandir
-_scandir = scandir
-scanf
-_scanf = scanf
-_scanf_r
-scanf_r = _scanf_r
-seekdir
-_seekdir = seekdir
-seekdir64
-setbuf
-_setbuf = setbuf
-setdtablesize
-_setdtablesize = setdtablesize
-setgid
-_setgid = setgid
-setgid32
-setgroups
-_setgroups = setgroups
-setgroups32
-setjmp
-_setjmp = setjmp
-setlocale
-_setlocale = setlocale
-setpgid
-_setpgid = setpgid
-setrlimit
-_setrlimit = setrlimit
-setsid
-_setsid = setsid
-settimeofday
-_settimeofday = settimeofday
-seteuid
-_seteuid = seteuid
-seteuid32
-setegid
-_setegid = setegid
-setegid32
-setuid
-_setuid = setuid
-setuid32
-setutent
-_setutent = setutent
-chroot
-_chroot = chroot
-setvbuf
-_setvbuf = setvbuf
-sigaction
-_sigaction = sigaction
-sigaddset
-_sigaddset = sigaddset
-sigdelset
-_sigdelset = sigdelset
-sigismember
-_sigismember = sigismember
-sigemptyset
-_sigemptyset = sigemptyset
-sigfillset
-_sigfillset = sigfillset
-siginterrupt
-_siginterrupt = siginterrupt
-signal
-_signal = signal
-significand
-_significand = significand
-significandf
-_significandf = significandf
-sigpending
-_sigpending = sigpending
-sigprocmask
-_sigprocmask = sigprocmask
-sigsuspend
-_sigsuspend = sigsuspend
-sin
-_sin = sin
-sinf
-_sinf = sinf
-sinh
-_sinh = sinh
-sinhf
-_sinhf = sinhf
-siprintf
-_siprintf = siprintf
-sleep
-_sleep = sleep
-spawnl
-_spawnl = spawnl
-spawnle
-_spawnle = spawnle
-spawnlp
-_spawnlp = spawnlp
-spawnlpe
-_spawnlpe = spawnlpe
-spawnv
-_spawnv = spawnv
-spawnve
-_spawnve = spawnve
-spawnvp
-_spawnvp = spawnvp
-spawnvpe
-_spawnvpe = spawnvpe
-sprintf
-_sprintf = sprintf
-snprintf
-_snprintf = snprintf
-sqrt
-_sqrt = sqrt
-sqrtf
-_sqrtf = sqrtf
-srand
-_srand = srand
-srandom
-sscanf
-_sscanf = sscanf
-_sscanf_r
-sscanf_r = _sscanf_r
-_stat
-stat = _stat
-stat64
-statfs
-_statfs = statfs
-strcasecmp
-_strcasecmp = strcasecmp
-strcat
-_strcat = strcat
-strchr
-_strchr = strchr
-strcmp
-_strcmp = strcmp
-strcoll
-_strcoll = strcoll
-strcpy
-_strcpy = strcpy
-strcspn
-_strcspn = strcspn
-strdup
-_strdup = strdup
-strerror
-_strerror = strerror
-strlen
-_strlen = strlen
-strlwr
-_strlwr = strlwr
-strncasecmp
-_strncasecmp = strncasecmp
-strncat
-_strncat = strncat
-strncmp
-_strncmp = strncmp
-strncpy
-_strncpy = strncpy
-strpbrk
-_strpbrk = strpbrk
-strrchr
-_strrchr = strrchr
-strspn
-_strspn = strspn
-strstr
-_strstr = strstr
-strtod
-_strtod = strtod
-strtof
-strtodf = strtof
-_strtodf = strtof
-strtok
-_strtok = strtok
-strtok_r
-_strtok_r = strtok_r
-strtol
-_strtol = strtol
-strtoll
-_strtoll = strtoll
-strtoul
-_strtoul = strtoul
-strtoull
-_strtoull = strtoull
-strupr
-_strupr = strupr
-strxfrm
-_strxfrm = strxfrm
-swab
-_swab = swab
-symlink
-_symlink = symlink
-sync
-_sync = sync
-sysconf
-_sysconf = sysconf
-system
-_system = system
-tan
-_tan = tan
-tanf
-_tanf = tanf
-tanh
-_tanh = tanh
-tanhf
-_tanhf = tanhf
-tcdrain
-_tcdrain = tcdrain
-tcflow
-_tcflow = tcflow
-tcflush
-_tcflush = tcflush
-tcgetattr
-_tcgetattr = tcgetattr
-tcgetpgrp
-_tcgetpgrp = tcgetpgrp
-tcsendbreak
-_tcsendbreak = tcsendbreak
-tcsetattr
-_tcsetattr = tcsetattr
-tcsetpgrp
-_tcsetpgrp = tcsetpgrp
-telldir
-_telldir = telldir
-telldir64
-tempnam
-_tempnam = tempnam
-time
-_time = time
-times
-_times = times
-timezone
-tmpfile
-_tmpfile = tmpfile
-tmpnam
-_tmpnam = tmpnam
-toascii
-_toascii = toascii
-tolower
-_tolower = tolower
-toupper
-_toupper = toupper
-truncate
-_truncate = truncate
-truncate64
-ttyname
-_ttyname = ttyname
-tzset
-_tzset = tzset
-ualarm
-_ualarm = ualarm
-umask
-_umask = umask
-uname
-_uname = uname
-ungetc
-_ungetc = ungetc
-unlink
-_unlink = unlink
-usleep
-_usleep = usleep
-utime
-_utime = utime
-utimes
-_utimes = utimes
-utmpname
-_utmpname = utmpname
-valloc
-vfiprintf
-_vfiprintf = vfiprintf
-vfork
-_vfork = vfork
-vfprintf
-_vfprintf = vfprintf
-vfscanf
-_vfscanf = vfscanf
-_vfscanf_r
-vfscanf_r = _vfscanf_r
-vprintf
-_vprintf = vprintf
-vscanf
-_vscanf = vscanf
-_vscanf_r
-vscanf_r = _vscanf_r
-vsprintf
-_vsprintf = vsprintf
-vsnprintf
-_vsnprintf = vsnprintf
-vsscanf
-_vsscanf = vsscanf
-_vsscanf_r
-vsscanf_r = _vsscanf_r
-wait
-_wait = wait
-waitpid
-_waitpid = waitpid
-wait3
-wait4
-wcstombs
-_wcstombs = wcstombs
-wctomb
-_wctomb = wctomb
-write
-_write = write
-writev
-_writev = writev
-y0
-y0f
-y1
-y1f
-yn
-ynf
-drand48
-_drand48 = drand48
-erand48
-_erand48 = erand48
-jrand48
-_jrand48 = jrand48
-lcong48
-_lcong48 = lcong48
-lrand48
-_lrand48 = lrand48
-mrand48
-_lrand48 = lrand48
-nrand48
-_nrand48 = nrand48
-seed48
-_seed48 = seed48
-srand48
-_srand48 = srand48
-setmode
-_setmode = setmode
-__assertfail
-getw
-_getw = getw
-getwd
-_getwd = getwd
-popen
-_popen = popen
-pclose
-_pclose = pclose
-strftime
-_strftime = strftime
-strlcat
-_strlcat = strlcat
-strlcpy
-_strlcpy = strlcpy
-strptime
-_strptime = strptime
-setgrent
-_setgrent = setgrent
-cuserid
-_cuserid = cuserid
-setpgrp
-_setpgrp = setpgrp
-mount
-_mount = mount
-setmntent
-_setmntent = setmntent
-endmntent
-_endmntent = endmntent
-umount
-_umount = umount
-wcscmp
-_wcscmp = wcscmp
-wcslen
-_wcslen = wcslen
-wprintf
-_wprintf = wprintf
-memccpy
-_memccpy = memccpy
-getpwent
-_getpwent = getpwent
-endpwent
-_endpwent = endpwent
-setpwent
-_setpwent = setpwent
-getpwduid
-_getpwduid = getpwduid
-getpwnam
-_getpwnam = getpwnam
-getpwnam_r
-getpwuid
-_getpwuid = getpwuid
-getpwuid32
-getpwuid_r
-getpwuid_r32
-getpgrp
-_getpgrp = getpgrp
-getgrent
-_getgrent = getgrent
-getgrent32
-ntohl
-_ntohl = ntohl
-htonl
-_htonl = htonl
-htons
-_htons = htons
-ntohs
-_ntohs = ntohs
-accept = cygwin_accept
-bind = cygwin_bind
-connect = cygwin_connect
-hstrerror = cygwin_hstrerror
-herror = cygwin_herror
-inet_addr = cygwin_inet_addr
-inet_network = cygwin_inet_network
-inet_netof
-inet_makeaddr
-listen = cygwin_listen
-getdomainname
-_getdomainname = getdomainname
-gethostbyaddr = cygwin_gethostbyaddr
-gethostbyname = cygwin_gethostbyname
-getpeername = cygwin_getpeername
-getprotobyname = cygwin_getprotobyname
-getprotobynumber = cygwin_getprotobynumber
-getservbyname = cygwin_getservbyname
-getservbyport = cygwin_getservbyport
-getsockname = cygwin_getsockname
-getsockopt = cygwin_getsockopt
-recv = cygwin_recv
-select = cygwin_select
-_select = cygwin_select
-send = cygwin_send
-socket = cygwin_socket
-setsockopt = cygwin_setsockopt
-inet_aton = cygwin_inet_aton
-inet_ntoa = cygwin_inet_ntoa
-recvfrom = cygwin_recvfrom
-recvmsg = cygwin_recvmsg
-sendmsg = cygwin_sendmsg
-sendto = cygwin_sendto
-shutdown = cygwin_shutdown
-sethostent
-endhostent
-setpassent
-_setpassent = setpassent
-strsep
-_strsep = strsep
-syslog
-_syslog = syslog
-closelog
-_closelog = closelog
-openlog
-_openlog = openlog
-setlogmask
-vhangup
-_vhangup = vhangup
-nice
-_nice = nice
-cygwin_conv_to_win32_path
-cygwin_conv_to_full_win32_path
-cygwin_conv_to_posix_path
-cygwin_conv_to_full_posix_path
-cygwin_posix_path_list_p
-cygwin_win32_to_posix_path_list_buf_size
-cygwin_posix_to_win32_path_list_buf_size
-cygwin_win32_to_posix_path_list
-cygwin_posix_to_win32_path_list
-cygwin_split_path
-cygwin_umount
-cygwin32_conv_to_win32_path = cygwin_conv_to_win32_path
-cygwin32_conv_to_full_win32_path = cygwin_conv_to_full_win32_path
-cygwin32_conv_to_posix_path = cygwin_conv_to_posix_path
-cygwin32_conv_to_full_posix_path = cygwin_conv_to_full_posix_path
-cygwin32_posix_path_list_p = cygwin_posix_path_list_p
-cygwin32_win32_to_posix_path_list_buf_size = cygwin_win32_to_posix_path_list_buf_size
-cygwin32_posix_to_win32_path_list_buf_size = cygwin_posix_to_win32_path_list_buf_size
-cygwin32_win32_to_posix_path_list = cygwin_win32_to_posix_path_list
-cygwin32_posix_to_win32_path_list = cygwin_posix_to_win32_path_list
-cygwin32_split_path = cygwin_split_path
-cygwin_winpid_to_pid
-cygwin32_winpid_to_pid = cygwin_winpid_to_pid
-cygwin_logon_user
-cygwin_set_impersonation_token
-realpath
-reent_data DATA
-getenv
-_getenv = getenv
-putenv
-_putenv = putenv
-setenv
-_setenv = setenv
-unsetenv
-_unsetenv = unsetenv
-setitimer
-getitimer
-getpgid
-killpg
-pause
-__cygwin_environ DATA
-__cygwin_user_data DATA
-_ctype_ DATA
-_sys_errlist DATA
-sys_errlist = _sys_errlist DATA
-_sys_nerr DATA
-sys_nerr = _sys_nerr DATA
-__mb_cur_max DATA
-_timezone DATA
-_daylight DATA
-_tzname DATA
-ptsname
-grantpt
-unlockpt
-sexecve = sexecve_is_bad
-sexecl = sexecve_is_bad
-sexecle = sexecve_is_bad
-sexeclp = sexecve_is_bad
-sexeclpe = sexecve_is_bad
-sexecv = sexecve_is_bad
-sexecp = sexecve_is_bad
-sexecvpe = sexecve_is_bad
-ttyslot
-rcmd = cygwin_rcmd
-rresvport = cygwin_rresvport
-rexec = cygwin_rexec
-socketpair
-strsignal
-strtosigno
-ctermid
-dlopen
-dlclose
-dlsym
-dlerror
-dlfork
-sigpause
-cygwin_attach_handle_to_fd
-cygwin32_attach_handle_to_fd = cygwin_attach_handle_to_fd
-cygwin_internal
-cygwin32_internal = cygwin_internal
-pthread_atfork
-pthread_attr_destroy
-pthread_attr_getdetachstate
-pthread_attr_getinheritsched
-pthread_attr_getschedparam
-pthread_attr_getschedpolicy
-pthread_attr_getscope
-pthread_attr_getstacksize
-pthread_attr_init
-pthread_attr_setdetachstate
-pthread_attr_setinheritsched
-pthread_attr_setschedparam
-pthread_attr_setschedpolicy
-pthread_attr_setscope
-pthread_attr_setstacksize
-pthread_cancel
-_pthread_cleanup_push
-_pthread_cleanup_pop
-pthread_cond_broadcast
-pthread_cond_destroy
-pthread_cond_init
-pthread_cond_signal
-pthread_cond_timedwait
-pthread_cond_wait
-pthread_condattr_destroy
-pthread_condattr_getpshared
-pthread_condattr_init
-pthread_condattr_setpshared
-pthread_create
-pthread_detach
-pthread_equal
-pthread_exit
-pthread_getconcurrency
-pthread_getschedparam
-pthread_getsequence_np
-pthread_getspecific
-pthread_join
-pthread_key_create
-pthread_key_delete
-pthread_mutex_destroy
-pthread_mutex_getprioceiling
-pthread_mutex_init
-pthread_mutex_lock
-pthread_mutex_setprioceiling
-pthread_mutex_trylock
-pthread_mutex_unlock
-pthread_mutexattr_destroy
-pthread_mutexattr_getprioceiling
-pthread_mutexattr_getprotocol
-pthread_mutexattr_getpshared
-pthread_mutexattr_gettype
-pthread_mutexattr_init
-pthread_mutexattr_setprioceiling
-pthread_mutexattr_setprotocol
-pthread_mutexattr_setpshared
-pthread_mutexattr_settype
-pthread_once
-pthread_self
-pthread_setcancelstate
-pthread_setcanceltype
-pthread_setconcurrency
-pthread_setschedparam
-pthread_setspecific
-pthread_testcancel
-pthread_suspend
-pthread_continue
-pthread_kill
-pthread_sigmask
-sem_init
-sem_destroy
-sem_wait
-sem_trywait
-sem_post
-sched_get_priority_max
-sched_get_priority_min
-sched_getparam
-sched_getscheduler
-sched_rr_get_interval
-sched_setparam
-sched_setscheduler
-sched_yield
-acl
-_acl = acl
-facl
-_facl = facl
-lacl
-_lacl = lacl
-aclcheck
-_aclcheck = aclcheck
-aclsort
-_aclsort = aclsort
-acltomode
-_acltomode = acltomode
-aclfrommode
-_aclfrommode = aclfrommode
-acltopbits
-_acltopbits = acltopbits
-aclfrompbits
-_aclfrompbits = aclfrompbits
-acltotext
-_acltotext = acltotext
-aclfromtext
-_aclfromtext = aclfromtext
-setprotoent = cygwin_setprotoent
-setservent = cygwin_setservent
-getservent = cygwin_getservent
-getprotoent = cygwin_getprotoent
-endprotoent = cygwin_endprotoent
-endservent = cygwin_endservent
diff --git a/winsup/cygwin/cygwin.sc b/winsup/cygwin/cygwin.sc
deleted file mode 100644
index fe00e2bd4..000000000
--- a/winsup/cygwin/cygwin.sc
+++ /dev/null
@@ -1,111 +0,0 @@
-OUTPUT_FORMAT(pei-i386)
-SEARCH_DIR(/cygnus/i686-pc-cygwin/lib/w32api); SEARCH_DIR(/cygnus/i686-pc-cygwin/lib);
-ENTRY(_mainCRTStartup)
-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)
- }
- /* 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 BLOCK(__section_alignment__) :
- {
- __data_start__ = . ;
- *(.data)
- *(.data2)
- *(SORT(.data$*))
- __data_end__ = . ;
- *(.data_cygwin_nocopy)
- }
- .rdata BLOCK(__section_alignment__) :
- {
- *(.rdata)
- *(SORT(.rdata$*))
- *(.eh_frame)
- }
- .pdata BLOCK(__section_alignment__) :
- {
- *(.pdata)
- }
- .bss BLOCK(__section_alignment__) :
- {
- __bss_start__ = . ;
- *(.bss)
- *(COMMON)
- __bss_end__ = . ;
- }
- .edata BLOCK(__section_alignment__) :
- {
- *(.edata)
- }
- /DISCARD/ :
- {
- *(.debug$S)
- *(.debug$T)
- *(.debug$F)
- *(.drectve)
- }
- .idata BLOCK(__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)
- }
- .CRT BLOCK(__section_alignment__) :
- {
- *(SORT(.CRT$*))
- }
- .endjunk BLOCK(__section_alignment__) :
- {
- /* end is deprecated, don't use it */
- end = .;
- _end = .;
- __end__ = .;
- }
- .rsrc BLOCK(__section_alignment__) :
- {
- *(.rsrc)
- *(SORT(.rsrc$*))
- }
- .reloc BLOCK(__section_alignment__) :
- {
- *(.reloc)
- }
- .stab BLOCK(__section_alignment__) (NOLOAD) :
- {
- [ .stab ]
- }
- .stabstr BLOCK(__section_alignment__) (NOLOAD) :
- {
- [ .stabstr ]
- }
- .cygheap BLOCK(64 * 1024) :
- {
- __system_dlls__ = ABSOLUTE(.) ;
- __cygheap_start = ABSOLUTE(.) ;
- }
-}
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 <cygwin/version.h>
-
-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 da39f07a1..000000000
--- a/winsup/cygwin/dcrt0.cc
+++ /dev/null
@@ -1,1140 +0,0 @@
-/* dcrt0.cc -- essentially the main() for the Cygwin dll
-
- 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 <unistd.h>
-#include <stdlib.h>
-#include "glob.h"
-#include "exceptions.h"
-#include <ctype.h>
-#include <limits.h>
-#include <wingdi.h>
-#include <winuser.h>
-#include <errno.h>
-#include "sigproc.h"
-#include "pinfo.h"
-#include "cygerrno.h"
-#define NEED_VFORK
-#include "perprocess.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "child_info_magic.h"
-#include "perthread.h"
-#include "shared_info.h"
-#include "cygwin_version.h"
-#include "dll_init.h"
-#include "cygthread.h"
-
-#define MAX_AT_FILE_LEVEL 10
-
-#define PREMAIN_LEN (sizeof (user_data->premain) / sizeof (user_data->premain[0]))
-
-HANDLE NO_COPY hMainProc;
-HANDLE NO_COPY hMainThread;
-
-sigthread NO_COPY mainthread; // ID of the main thread
-
-per_thread_waitq NO_COPY waitq_storage;
-per_thread_vfork NO_COPY vfork_storage;
-per_thread_signal_dispatch NO_COPY signal_dispatch_storage;
-
-per_thread NO_COPY *threadstuff[] = {&waitq_storage,
- &vfork_storage,
- &signal_dispatch_storage,
- NULL};
-
-BOOL display_title;
-BOOL strip_title_path;
-BOOL allow_glob = TRUE;
-codepage_type current_codepage = ansi_cp;
-
-int 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;
-unsigned NO_COPY _cygwin_testing_magic;
-
-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;
- /* __progname used in getopt error message */
- char *__progname;
- struct _reent reent_data = _REENT_INIT(reent_data);
- 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},
- /* 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 */ &reent_data,
- };
- bool ignore_case_with_glob;
- int __declspec (dllexport) _check_for_executable = TRUE;
-#ifdef DEBUGGING
- int pinger;
-#endif
-};
-
-char *old_title;
-char title_buf[TITLESIZE + 1];
-
-static void
-do_global_dtors (void)
-{
- if (user_data->dtors)
- {
- void (**pfunc)() = user_data->dtors;
- while (*++pfunc)
- (*pfunc) ();
- }
-}
-
-static void __stdcall
-do_global_ctors (void (**in_pfunc)(), int force)
-{
- if (!force)
- {
- if (user_data->forkee || user_data->run_ctors_p)
- return; // inherit constructed stuff from parent pid
- user_data->run_ctors_p = 1;
- }
-
- /* 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) ();
-
- if (user_data->magic_biscuit == SIZEOF_PER_PROCESS)
- atexit (do_global_dtors);
-}
-
-/*
- * 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 int __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 = strchr (cmd, quote)) != NULL)
- strcpy (p, p + 1);
- else
- p = strchr (cmd, '\0');
- 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)
-
-// __inline__ void
-extern 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;
-}
-
-/* extend the stack prior to fork longjmp */
-
-static void
-alloc_stack (child_info_fork *ci)
-{
- /* FIXME: adding 16384 seems to avoid a stack copy problem during
- fork on Win95, but I don't know exactly why yet. DJ */
- volatile char b[ci->stacksize + 16384];
-
- if (!VirtualQuery ((LPCVOID) &b, &sm, sizeof sm))
- api_fatal ("fork: couldn't get stack info, %E");
-
- if (sm.AllocationBase != ci->stacktop)
- alloc_stack_hard_way (ci, b + sizeof (b) - 1);
- else
- ci->stacksize = 0;
-
- return;
-}
-
-static NO_COPY int mypid = 0;
-int _declspec(dllexport) __argc;
-char _declspec(dllexport) **__argv;
-vfork_save NO_COPY *main_vfork = NULL;
-
-void
-sigthread::init (const char *s)
-{
- InitializeCriticalSection (&lock);
- id = GetCurrentThreadId ();
-}
-
-/* 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 ()
-{
- /* According to onno@stack.urc.tue.nl, the exception handler record must
- be on the stack. */
- /* FIXME: Verify forked children get their exception handler set up ok. */
- exception_list cygwin_except_entry;
-
- /* Initialize SIGSEGV handling, etc. */
- init_exceptions (&cygwin_except_entry);
-
- /* Set the os_being_run global. */
- wincap.init ();
- check_sanity_and_sync (user_data);
-
- do_global_ctors (&__CTOR_LIST__, 1);
-
- /* Nasty static stuff needed by newlib -- point to a local copy of
- the reent stuff.
- Note: this MUST be done here (before the forkee code) as the
- fork copy code doesn't copy the data in libccrt0.cc (that's why we
- pass in the per_process struct into the .dll from libccrt0). */
-
- _impure_ptr = &reent_data;
-
- user_data->resourcelocks->Init ();
- user_data->threadinterface->Init (user_data->forkee);
-
- mainthread.init ("mainthread"); // For use in determining if signals
- // should be blocked.
-
- winpids::init ();
-
- int envc = 0;
- char **envp = NULL;
-
- if (!child_proc_info)
- memory_init ();
- else
- {
- bool close_ppid_handle = false;
- bool close_hexec_proc = false;
- switch (child_proc_info->type)
- {
- case _PROC_FORK:
- alloc_stack (fork_info);
- cygheap_fixup_in_child (0);
- memory_init ();
- set_myself (mypid);
- close_ppid_handle = !!child_proc_info->pppid_handle;
- break;
- case _PROC_SPAWN:
- /* Have to delay closes until after cygheap is setup */
- close_hexec_proc = !!spawn_info->hexec_proc;
- close_ppid_handle = !!child_proc_info->pppid_handle;
- goto around;
- case _PROC_EXEC:
- hexec_proc = spawn_info->hexec_proc;
- around:
- HANDLE h;
- cygheap_fixup_in_child (1);
- memory_init ();
- if (!spawn_info->moreinfo->myself_pinfo ||
- !DuplicateHandle (hMainProc, spawn_info->moreinfo->myself_pinfo,
- hMainProc, &h, 0, 0,
- DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
- h = NULL;
- set_myself (mypid, h);
- __argc = spawn_info->moreinfo->argc;
- __argv = spawn_info->moreinfo->argv;
- envp = spawn_info->moreinfo->envp;
- envc = spawn_info->moreinfo->envc;
- cygheap->fdtab.fixup_after_exec (spawn_info->parent);
- signal_fixup_after_exec (child_proc_info->type == PROC_SPAWN);
- CloseHandle (spawn_info->parent);
- if (spawn_info->moreinfo->old_title)
- {
- old_title = strcpy (title_buf, spawn_info->moreinfo->old_title);
- cfree (spawn_info->moreinfo->old_title);
- }
- break;
- }
- if (close_hexec_proc)
- CloseHandle (spawn_info->hexec_proc);
- if (close_ppid_handle)
- CloseHandle (child_proc_info->pppid_handle);
- }
-
- ProtectHandle (hMainProc);
- ProtectHandle (hMainThread);
- cygthread::init ();
-
- pthread::initMainThread (!user_data->forkee);
-
- /* Initialize debug muto, if DLL is built with --enable-debugging.
- Need to do this before any helper threads start. */
- debug_init ();
-
- cygheap->fdtab.vfork_child_fixup ();
-
- (void) SetErrorMode (SEM_FAILCRITICALERRORS);
-
- /* Initialize events. */
- events_init ();
-
- cygheap->cwd.init ();
- main_vfork = vfork_storage.create ();
-
- cygbench ("pre-forkee");
- if (user_data->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)
- {
- asm ("movl %0,%%fs:4" : : "r" (fork_info->stackbottom));
- asm ("movl %0,%%fs:8" : : "r" (fork_info->stacktop));
- }
-
- longjmp (fork_info->jmp, fork_info->cygpid);
- }
-
-#ifdef DEBUGGING
- {
- extern void fork_init ();
- fork_init ();
- }
-#endif
-
- /* Initialize our process table entry. */
- pinfo_init (envp, envc);
-
- if (!old_title && GetConsoleTitle (title_buf, TITLESIZE))
- old_title = title_buf;
-
- /* Allocate cygheap->fdtab */
- dtable_init ();
-
- /* Init global well known SID objects */
- cygsid::init ();
-
- /* Initialize uid, gid if necessary. */
- if (child_proc_info == NULL || spawn_info->moreinfo->uid == ILLEGAL_UID)
- uinfo_init ();
-
- /* Initialize signal/subprocess handling. */
- sigproc_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 *) alloca (MAX_PATH);
- cygwin_conv_to_posix_path (__argv[0], new_argv0);
- __argv[0] = new_argv0;
- }
- }
-
- 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 = 1;
- /* 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;
-
- /* 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. */
- wait_for_sigthread ();
-
- set_errno (0);
-
- MALLOC_CHECK;
- cygbench (__progname);
- if (user_data->main)
- exit (user_data->main (__argc, __argv, *user_data->envptr));
-}
-
-#ifdef DEBUGGING
-void
-break_here ()
-{
- debug_printf ("break here");
-}
-#endif
-
-void
-initial_env ()
-{
- DWORD len;
- char buf[MAX_PATH + 1];
-#ifdef DEBUGGING
- if (GetEnvironmentVariable ("CYGWIN_SLEEP", buf, sizeof (buf) - 1))
- {
- DWORD ms = atoi (buf);
- buf[0] = '\0';
- len = GetModuleFileName (NULL, buf, MAX_PATH);
- console_printf ("Sleeping %d, pid %u %s\n", ms, GetCurrentProcessId (), buf);
- Sleep (ms);
- }
- if (GetEnvironmentVariable ("CYGWIN_DEBUG", buf, sizeof (buf) - 1))
- {
- char buf1[MAX_PATH + 1];
- len = GetModuleFileName (NULL, buf1, MAX_PATH);
- strlwr (buf1);
- strlwr (buf);
- char *p = strchr (buf, '=');
- if (!p)
- p = (char *) "gdb.exe -nw";
- else
- *p++ = '\0';
- if (strstr (buf1, buf))
- {
- error_start_init (p);
- try_to_debug ();
- break_here ();
- }
- }
-#endif
-
- if (GetEnvironmentVariable ("CYGWIN_TESTING", buf, sizeof (buf) - 1))
- {
- _cygwin_testing = 1;
- if ((len = GetModuleFileName (cygwin_hmodule, buf, MAX_PATH))
- && len > sizeof ("new-cygwin1.dll")
- && strcasematch (buf + len - sizeof ("new-cygwin1.dll"),
- "\\new-cygwin1.dll"))
- _cygwin_testing_magic = 0x10;
- }
-}
-
-/* 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 ()
-{
- DECLARE_TLS_STORAGE;
- initial_env ();
- char zeros[sizeof (fork_info->zero)] = {0};
- static NO_COPY STARTUPINFO si;
-#ifdef DEBUGGING
- strace.microseconds ();
-#endif
-
- main_environ = user_data->envptr;
- *main_environ = NULL;
-
- early_stuff_init ();
- if (!DuplicateHandle (GetCurrentProcess (), GetCurrentProcess (),
- GetCurrentProcess (), &hMainProc, 0, FALSE,
- DUPLICATE_SAME_ACCESS))
- hMainProc = GetCurrentProcess ();
-
- DuplicateHandle (hMainProc, GetCurrentThread (), hMainProc,
- &hMainThread, 0, false, DUPLICATE_SAME_ACCESS);
-
- GetStartupInfo (&si);
- child_proc_info = (child_info *) si.lpReserved2;
- if (si.cbReserved2 < EXEC_MAGIC_SIZE || !child_proc_info
- || memcmp (child_proc_info->zero, zeros, sizeof (zeros)) != 0)
- child_proc_info = NULL;
- else
- {
- if ((child_proc_info->intro & OPROC_MAGIC_MASK) == OPROC_MAGIC_GENERIC)
- multiple_cygwin_problem ("proc", child_proc_info->intro, 0);
- else if (child_proc_info->intro == PROC_MAGIC_GENERIC
- && child_proc_info->magic != CHILD_INFO_MAGIC)
- multiple_cygwin_problem ("proc", child_proc_info->magic,
- CHILD_INFO_MAGIC);
- else if (child_proc_info->cygheap != (void *) &_cygheap_start)
- multiple_cygwin_problem ("cygheap", (DWORD) child_proc_info->cygheap,
- (DWORD) &_cygheap_start);
- unsigned should_be_cb = 0;
- switch (child_proc_info->type)
- {
- case _PROC_FORK:
- user_data->forkee = child_proc_info->cygpid;
- 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);
- if (should_be_cb != child_proc_info->cb)
- multiple_cygwin_problem ("proc size", child_proc_info->cb, should_be_cb);
- else if (sizeof (fhandler_union) != child_proc_info->fhandler_union_cb)
- multiple_cygwin_problem ("fhandler size", child_proc_info->fhandler_union_cb, sizeof (fhandler_union));
- else
- {
- cygwin_mount_h = child_proc_info->mount_h;
- mypid = child_proc_info->cygpid;
- break;
- }
- default:
- system_printf ("unknown exec type %d", child_proc_info->type);
- /* intentionally fall through */
- case _PROC_WHOOPS:
- child_proc_info = NULL;
- break;
- }
- }
- dll_crt0_1 ();
-}
-
-void
-dll_crt0 (per_process *uptr)
-{
- DECLARE_TLS_STORAGE;
- /* Set the local copy of the pointer into the user space. */
- if (uptr && uptr != user_data)
- {
- memcpy (user_data, uptr, per_process_overwrite);
- *(user_data->impure_ptr_ptr) = &reent_data;
- }
- _dll_crt0 ();
-}
-
-/* This must be called by anyone who uses LoadLibrary to load cygwin1.dll */
-extern "C" void
-cygwin_dll_init ()
-{
- static char **envp;
- static int _fmode;
-
- if (!DuplicateHandle (GetCurrentProcess (), GetCurrentProcess (),
- GetCurrentProcess (), &hMainProc, 0, FALSE,
- DUPLICATE_SAME_ACCESS))
- hMainProc = GetCurrentProcess ();
-
- DuplicateHandle (hMainProc, GetCurrentThread (), hMainProc,
- &hMainThread, 0, FALSE, DUPLICATE_SAME_ACCESS);
- user_data->magic_biscuit = sizeof (per_process);
-
- user_data->envptr = &envp;
- user_data->fmode_ptr = &_fmode;
-
- dll_crt0_1 ();
-}
-
-extern "C" void
-__main (void)
-{
- do_global_ctors (user_data->ctors, FALSE);
-}
-
-enum exit_states
- {
- ES_NOT_EXITING = 0,
- ES_THREADTERM,
- ES_SIGNAL,
- ES_CLOSEALL,
- ES_SIGPROCTERMINATE,
- ES_TITLE,
- ES_HUP_PGRP,
- ES_HUP_SID,
- ES_TTY_TERMINATE,
- ES_EVENTS_TERMINATE
- };
-
-exit_states NO_COPY exit_state;
-extern CRITICAL_SECTION exit_lock;
-
-extern "C" void __stdcall
-do_exit (int status)
-{
- EnterCriticalSection (&exit_lock);
- UINT n = (UINT) status;
-
- syscall_printf ("do_exit (%d)", n);
-
- vfork_save *vf = vfork_storage.val ();
- if (vf != NULL && vf->pid < 0)
- vf->restore_exit (status);
-
- if (exit_state < ES_THREADTERM)
- {
- exit_state = ES_THREADTERM;
- cygthread::terminate ();
- }
-
- if (exit_state < ES_SIGNAL)
- {
- exit_state = ES_SIGNAL;
- if (!(n & EXIT_REPARENTING))
- {
- 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 ();
- }
-
- if (exit_state < ES_SIGPROCTERMINATE)
- {
- exit_state = ES_SIGPROCTERMINATE;
- sigproc_terminate ();
- }
-
- myself->stopsig = 0;
- 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_HUP_PGRP)
- {
- exit_state = ES_HUP_PGRP;
- /* Kill orphaned children on group leader exit */
- if (myself->has_pgid_children && myself->pid == myself->pgid)
- {
- sigproc_printf ("%d == pgrp %d, send SIG{HUP,CONT} to stopped children",
- myself->pid, myself->pgid);
- kill_pgrp (myself->pgid, -SIGHUP);
- }
- }
-
- 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_TTY_TERMINATE)
- {
- exit_state = ES_TTY_TERMINATE;
- tty_terminate ();
- }
-
- if (exit_state < ES_EVENTS_TERMINATE)
- {
- exit_state = ES_EVENTS_TERMINATE;
- events_terminate ();
- }
-
- minimal_printf ("winpid %d, exit %d", GetCurrentProcessId (), n);
- myself->exit (n);
-}
-
-extern "C" void
-_exit (int n)
-{
- do_exit ((DWORD) n & 0xffff);
-}
-
-extern "C" void
-__api_fatal (const char *fmt, ...)
-{
- char buf[4096];
- va_list ap;
-
- va_start (ap, fmt);
- __small_vsprintf (buf, fmt, ap);
- va_end (ap);
- strcat (buf, "\n");
- int len = strlen (buf);
- DWORD done;
- (void) WriteFile (GetStdHandle (STD_ERROR_HANDLE), buf, len, &done, 0);
-
- /* 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)
- (void) WriteFile (h, buf, len, &done, 0);
- }
-
- /* We are going down without mercy. Make sure we reset
- our process_state. */
- sigproc_terminate ();
-#ifdef DEBUGGING
- (void) try_to_debug ();
-#endif
- myself->exit (1);
-}
-
-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 version mismatch detected - %p/%p.\n\
-You have multiple copies of cygwin1.dll on your system.\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.", 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 3513a6734..000000000
--- a/winsup/cygwin/debug.cc
+++ /dev/null
@@ -1,227 +0,0 @@
-/* debug.cc
-
- Copyright 1998, 1999, 2000, 2001, 2002 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 "sync.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include "perthread.h"
-#include "perprocess.h"
-#include "security.h"
-#include "cygerrno.h"
-#ifdef DEBUGGING
-#include <errno.h>
-#include "fhandler.h"
-#include "path.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 <stdlib.h>
-#define NFREEH (sizeof (cygheap->debug.freeh) / sizeof (cygheap->debug.freeh[0]))
-
-class lock_debug
-{
- static muto *locker;
- bool acquired;
- public:
- lock_debug () : acquired (0)
- {
- extern int exit_state;
- if (locker && !exit_state)
- acquired = !!locker->acquire (INFINITE);
- }
- void unlock ()
- {
- if (locker && acquired)
- {
- locker->release ();
- acquired = false;
- }
- }
- ~lock_debug () {unlock ();}
- friend void debug_init ();
-};
-
-muto NO_COPY *lock_debug::locker = NULL;
-
-static bool __stdcall mark_closed (const char *, int, HANDLE, const char *, BOOL);
-
-void
-debug_init ()
-{
- muto *debug_lock_muto;
- lock_debug::locker = new_muto (debug_lock_muto);
-}
-
-/* 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;
-}
-
-#ifdef DEBUGGING_AND_FDS_PROTECTED
-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;
- }
-}
-#endif
-
-/* 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 ((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);
-
- return;
-}
-
-static void __stdcall
-delete_handle (handle_list *hl)
-{
- handle_list *hnuke = hl->next;
- debug_printf ("nuking handle '%s'", hnuke->name);
- 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 ((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;
-}
-
-int __stdcall
-__set_errno (const char *func, int ln, int val)
-{
- debug_printf ("%s:%d val %d", func, ln, val);
- return _impure_ptr->_errno = val;
-}
-#endif /*DEBUGGING*/
diff --git a/winsup/cygwin/debug.h b/winsup/cygwin/debug.h
deleted file mode 100644
index 09a74e917..000000000
--- a/winsup/cygwin/debug.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* debug.h
-
- Copyright 1998, 1999, 2000, 2001, 2002 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 <stdlib.h>
-#include "dlmalloc.h"
-#define MALLOC_CHECK ({\
- debug_printf ("checking malloc pool");\
- (void)mallinfo ();\
-})
-#endif
-
-extern "C" {
-DWORD __stdcall WFSO (HANDLE, DWORD) __attribute__ ((regparm(2)));
-DWORD __stdcall WFMO (DWORD, CONST HANDLE *, BOOL, DWORD) __attribute__ ((regparm(3)));
-}
-
-#define WaitForSingleObject WFSO
-#define WaitForMultipleObjects WFMO
-
-#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)
-
-#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)
-
-void debug_init ();
-void __stdcall add_handle (const char *, int, HANDLE, const char *, bool = false)
- __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 11c8c503b..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[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/dir.cc b/winsup/cygwin/dir.cc
deleted file mode 100644
index a2024233d..000000000
--- a/winsup/cygwin/dir.cc
+++ /dev/null
@@ -1,347 +0,0 @@
-/* dir.cc: Posix directory-related routines
-
- 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 <unistd.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <errno.h>
-
-#define _COMPILING_NEWLIB
-#include <dirent.h>
-
-#include "pinfo.h"
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-
-/* Cygwin internal */
-/* Return whether the directory of a file is writable. Return 1 if it
- is. Otherwise, return 0, and set errno appropriately. */
-int __stdcall
-writable_directory (const char *file)
-{
-#if 0
- char dir[strlen (file) + 1];
-
- strcpy (dir, file);
-
- const char *usedir;
- char *slash = strrchr (dir, '\\');
- if (slash == NULL)
- usedir = ".";
- else if (slash == dir)
- {
- usedir = "\\";
- }
- else
- {
- *slash = '\0';
- usedir = dir;
- }
-
- int acc = access (usedir, W_OK);
-
- return acc == 0;
-#else
- return 1;
-#endif
-}
-
-extern "C" int
-dirfd (DIR *dir)
-{
- if (check_null_invalid_struct_errno (dir))
- return -1;
- if (dir->__d_cookie != __DIRENT_COOKIE)
- {
- set_errno (EBADF);
- syscall_printf ("-1 = dirfd (%p)", dir);
- return -1;
- }
- return dir->__d_dirent->d_fd;
-}
-
-/* opendir: POSIX 5.1.2.1 */
-extern "C" DIR *
-opendir (const char *name)
-{
- fhandler_base *fh;
- path_conv pc;
- DIR *res;
-
- fh = cygheap->fdtab.build_fhandler_from_name (-1, name, NULL, pc,
- PC_SYM_FOLLOW | PC_FULL, NULL);
- if (!fh)
- res = NULL;
- else if (pc.exists ())
- res = fh->opendir (pc);
- else
- {
- set_errno (ENOENT);
- res = NULL;
- }
-
- if (!res && fh)
- delete fh;
- return res;
-}
-
-/* readdir: POSIX 5.1.2.1 */
-extern "C" struct dirent *
-readdir (DIR *dir)
-{
- if (check_null_invalid_struct_errno (dir))
- return NULL;
-
- if (dir->__d_cookie != __DIRENT_COOKIE)
- {
- set_errno (EBADF);
- syscall_printf ("%p = readdir (%p)", NULL, dir);
- return NULL;
- }
-
- dirent *res = ((fhandler_base *) dir->__d_u.__d_data.__fh)->readdir (dir);
-
- if (res)
- {
- /* Compute d_ino by combining filename hash with the directory hash
- (which was stored in dir->__d_dirhash when opendir was called). */
- if (res->d_name[0] == '.')
- {
- if (res->d_name[1] == '\0')
- dir->__d_dirent->d_ino = dir->__d_dirhash;
- else if (res->d_name[1] != '.' || res->d_name[2] != '\0')
- goto hashit;
- else
- {
- char *p, up[strlen (dir->__d_dirname) + 1];
- strcpy (up, dir->__d_dirname);
- if (!(p = strrchr (up, '\\')))
- goto hashit;
- *p = '\0';
- if (!(p = strrchr (up, '\\')))
- dir->__d_dirent->d_ino = hash_path_name (0, ".");
- else
- {
- *p = '\0';
- dir->__d_dirent->d_ino = hash_path_name (0, up);
- }
- }
- }
- else
- {
- hashit:
- ino_t dino = hash_path_name (dir->__d_dirhash, "\\");
- dir->__d_dirent->d_ino = hash_path_name (dino, res->d_name);
- }
- }
- return res;
-}
-
-extern "C" __off64_t
-telldir64 (DIR *dir)
-{
- if (check_null_invalid_struct_errno (dir))
- return -1;
-
- if (dir->__d_cookie != __DIRENT_COOKIE)
- return 0;
- return ((fhandler_base *) dir->__d_u.__d_data.__fh)->telldir (dir);
-}
-
-/* telldir */
-extern "C" __off32_t
-telldir (DIR *dir)
-{
- return telldir64 (dir);
-}
-
-extern "C" void
-seekdir64 (DIR *dir, __off64_t loc)
-{
- if (check_null_invalid_struct_errno (dir))
- return;
-
- if (dir->__d_cookie != __DIRENT_COOKIE)
- return;
- return ((fhandler_base *) dir->__d_u.__d_data.__fh)->seekdir (dir, loc);
-}
-
-/* seekdir */
-extern "C" void
-seekdir (DIR *dir, __off32_t loc)
-{
- seekdir64 (dir, (__off64_t)loc);
-}
-
-/* rewinddir: POSIX 5.1.2.1 */
-extern "C" void
-rewinddir (DIR *dir)
-{
- if (check_null_invalid_struct_errno (dir))
- return;
-
- if (dir->__d_cookie != __DIRENT_COOKIE)
- return;
- return ((fhandler_base *) dir->__d_u.__d_data.__fh)->rewinddir (dir);
-}
-
-/* closedir: POSIX 5.1.2.1 */
-extern "C" int
-closedir (DIR *dir)
-{
- if (check_null_invalid_struct_errno (dir))
- 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->__d_u.__d_data.__fh)->closedir (dir);
-
- cygheap->fdtab.release (dir->__d_dirent->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;
- SECURITY_ATTRIBUTES sa = sec_none_nih;
-
- path_conv real_dir (dir, PC_SYM_NOFOLLOW);
-
- if (real_dir.error)
- {
- set_errno (real_dir.case_clash ? ECASECLASH : real_dir.error);
- goto done;
- }
-
- nofinalslash (real_dir.get_win32 (), real_dir.get_win32 ());
- if (! writable_directory (real_dir.get_win32 ()))
- goto done;
-
- if (allow_ntsec && real_dir.has_acls ())
- set_security_attribute (S_IFDIR | ((mode & 07777) & ~cygheap->umask),
- &sa, alloca (4096), 4096);
-
- if (CreateDirectoryA (real_dir.get_win32 (), &sa))
- {
- if (!allow_ntsec && allow_ntea)
- set_file_attribute (real_dir.has_acls (), real_dir.get_win32 (),
- S_IFDIR | ((mode & 07777) & ~cygheap->umask));
-#ifdef HIDDEN_DOT_FILES
- char *c = strrchr (real_dir.get_win32 (), '\\');
- if ((c && c[1] == '.') || *real_dir.get_win32 () == '.')
- SetFileAttributes (real_dir.get_win32 (), FILE_ATTRIBUTE_HIDDEN);
-#endif
- res = 0;
- }
- else
- __seterrno ();
-
-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;
- DWORD devn;
-
- path_conv real_dir (dir, PC_SYM_NOFOLLOW);
-
- if (real_dir.error)
- set_errno (real_dir.error);
- else if ((devn = real_dir.get_devn ()) == FH_PROC || devn == FH_REGISTRY
- || devn == FH_PROCESS)
- set_errno (EROFS);
- else if (!real_dir.exists ())
- set_errno (ENOENT);
- else if (!real_dir.isdir ())
- set_errno (ENOTDIR);
- else
- {
- /* Even own directories can't be removed if R/O attribute is set. */
- if (real_dir.has_attribute (FILE_ATTRIBUTE_READONLY))
- SetFileAttributes (real_dir,
- (DWORD) real_dir & ~FILE_ATTRIBUTE_READONLY);
-
- if (RemoveDirectory (real_dir))
- {
- /* 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 (GetFileAttributes (real_dir) != INVALID_FILE_ATTRIBUTES)
- set_errno (ENOTEMPTY);
- else
- res = 0;
- }
- else
- {
- /* 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.
- FIXME: A potential workaround for this is for cygwin apps to *never* call
- SetCurrentDirectory. */
- if (strcasematch (real_dir, cygheap->cwd.win32)
- && !strcasematch ("c:\\", cygheap->cwd.win32))
- {
- DWORD err = GetLastError ();
- if (!SetCurrentDirectory ("c:\\"))
- SetLastError (err);
- else if ((res = rmdir (dir)))
- SetCurrentDirectory (cygheap->cwd.win32);
- }
- if (res)
- {
- if (GetLastError () != ERROR_ACCESS_DENIED
- || !wincap.access_denied_on_delete ())
- __seterrno ();
- else
- set_errno (ENOTEMPTY); /* On 9X ERROR_ACCESS_DENIED is
- returned if you try to remove a
- non-empty directory. */
-
- /* If directory still exists, restore R/O attribute. */
- if (real_dir.has_attribute (FILE_ATTRIBUTE_READONLY))
- SetFileAttributes (real_dir, real_dir);
- }
- }
- }
-
- 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 b6babe66b..000000000
--- a/winsup/cygwin/dlfcn.cc
+++ /dev/null
@@ -1,151 +0,0 @@
-/* dlfcn.cc
-
- 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. */
-
-#include "winsup.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <ctype.h>
-#include "security.h"
-#include "fhandler.h"
-#include "perprocess.h"
-#include "path.h"
-#include "thread.h"
-#include "dlfcn.h"
-#include "dll_init.h"
-#include "cygerrno.h"
-
-#define _dl_error _reent_winsup ()->_dl_error
-#define _dl_buffer _reent_winsup ()->_dl_buffer
-
-static void __stdcall
-set_dl_error (const char *str)
-{
- __small_sprintf (_dl_buffer, "%s: %E", str);
- _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);
-}
-
-/* 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 >= MAX_PATH - 1)
- 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)) == NULL)
- real_filename.check (name); /* 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)
-{
- SetResourceLock (LOCK_DLL_LIST, READ_LOCK | WRITE_LOCK, "dlopen");
-
- void *ret;
-
- if (name == NULL)
- ret = (void *) GetModuleHandle (NULL); /* handle for the current module */
- else
- {
- char buf[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);
-
- ReleaseResourceLock (LOCK_DLL_LIST, READ_LOCK | WRITE_LOCK, "dlopen");
- return ret;
-}
-
-void *
-dlsym (void *handle, const char *name)
-{
- void *ret = (void *) GetProcAddress ((HMODULE) handle, name);
- if (!ret)
- set_dl_error ("dlsym");
- debug_printf ("ret %p", ret);
- return ret;
-}
-
-int
-dlclose (void *handle)
-{
- SetResourceLock (LOCK_DLL_LIST, READ_LOCK | WRITE_LOCK, "dlclose");
-
- 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);
-
- ReleaseResourceLock (LOCK_DLL_LIST, READ_LOCK | WRITE_LOCK, "dlclose");
- return ret;
-}
-
-char *
-dlerror ()
-{
- char *ret = 0;
- if (_dl_error)
- ret = _dl_buffer;
- return ret;
-}
diff --git a/winsup/cygwin/dll_init.cc b/winsup/cygwin/dll_init.cc
deleted file mode 100644
index ebb9edbdb..000000000
--- a/winsup/cygwin/dll_init.cc
+++ /dev/null
@@ -1,425 +0,0 @@
-/* dll_init.cc
-
- Copyright 1998, 1999, 2000, 2001, 2002 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 <stdlib.h>
-#include <errno.h>
-#include "cygerrno.h"
-#include "perprocess.h"
-#include "dll_init.h"
-#include "environ.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "pinfo.h"
-
-extern void __stdcall check_sanity_and_sync (per_process *);
-
-dll_list NO_COPY dlls;
-
-static NO_COPY int in_forkee = 0;
-static int dll_global_dtors_recorded;
-
-/* Run destructors for all DLLs on exit. */
-static void
-dll_global_dtors ()
-{
- 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[MAX_PATH + 1];
- 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 || myself->process_state == PID_EXITED)
- 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: try 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 ()
-{
- /* Make sure that destructors are called on exit. */
- if (!dll_global_dtors_recorded)
- {
- atexit (dll_global_dtors);
- dll_global_dtors_recorded = 1;
- }
-
- /* 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)
-{
- in_forkee = 1;
- 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)
- {
- HMODULE h = LoadLibraryEx (d.name, NULL, DONT_RESOLVE_DLL_REFERENCES);
-
- /* 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. */
- if (h == d.handle)
- {
- 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 = 0;
-}
-
-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;
-
- /* 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 (!cygwin_finished_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 || (cygwin_finished_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 *)
-{
- dlls.detach (__builtin_return_address (0));
-}
-
-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 ()
-{
- extern char ***main_environ;
- 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 24cd79bf2..000000000
--- a/winsup/cygwin/dll_init.h
+++ /dev/null
@@ -1,91 +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[MAX_PATH + 1];
- 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;
diff --git a/winsup/cygwin/dll_init.sgml b/winsup/cygwin/dll_init.sgml
deleted file mode 100644
index 38070390c..000000000
--- a/winsup/cygwin/dll_init.sgml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-<sect1 id="func-cygwin-detach-dll">
-<title>cygwin_detach_dll</title>
-
-<funcsynopsis>
-<funcdef>extern "C" void
-<function>cygwin_detach_dll</function></funcdef>
-<paramdef>int <parameter>dll_index</parameter></paramdef>
-</funcsynopsis>
-
-</sect1>
diff --git a/winsup/cygwin/dlmalloc.c b/winsup/cygwin/dlmalloc.c
deleted file mode 100644
index de14fcb6a..000000000
--- a/winsup/cygwin/dlmalloc.c
+++ /dev/null
@@ -1,3906 +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.5 2001/10/03 03:49:25 cgf
- * * 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.
- *
- * Revision 1.4 2001/09/07 21:32:04 cgf
- * * 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.
- *
- * Revision 1.3 2001/06/26 14:47:48 cgf
- * * mmap.cc: Clean up *ResourceLock calls throughout.
- * * 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.
- *
- * Revision 1.2 2001/06/24 22:26:49 cgf
- * forced commit
- *
- * Revision 1.1 2001/04/24 15:25:30 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.
- *
- * 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 <unistd.h>.
- 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 */
-
-#include "winsup.h"
-
-#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 <stddef.h> /* for size_t */
-#else
-#include <sys/types.h>
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdio.h> /* needed for malloc_stats */
-
-
-/*
- 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 <assert.h>
-#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 <unistd.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-
-#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 <unistd.h>
-#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 <sys/param.h>
-# 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 calloc
-#endif
-#ifndef fREe
-#define fREe free
-#endif
-#ifndef mALLOc
-#define mALLOc malloc
-#endif
-#ifndef mEMALIGn
-#define mEMALIGn memalign
-#endif
-#ifndef rEALLOc
-#define rEALLOc realloc
-#endif
-#ifndef vALLOc
-#define vALLOc valloc
-#endif
-#ifndef pvALLOc
-#define pvALLOc pvalloc
-#endif
-#ifndef mALLINFo
-#define mALLINFo mallinfo
-#endif
-#ifndef mALLOPt
-#define mALLOPt mallopt
-#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 cfree(p) cfree_dbg(p, __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);
-void cfree_dbg(Void_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();
-void cfree_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);
-void cfree(Void_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();
-void cfree();
-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 cfree
-#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);
-void cfree(Void_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();
-void cfree();
-int malloc_trim();
-size_t malloc_usable_size();
-void malloc_stats();
-int mALLOPt();
-struct mallinfo mALLINFo();
-#endif
-
-#include <ctype.h> /* isprint() */
-#ifdef DEBUG3
-#include <stdlib.h> /* 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 &&
- /* try to avoid garbage file names */
- isprint(*p->file))
- 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 cfree
-#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*, memalign(alignment, bytes));
-}
-Void_t* valloc_dbg(size_t bytes, dbgargs) {
- skelr(Void_t*, valloc(bytes));
-}
-Void_t* pvalloc_dbg(size_t bytes, dbgargs) {
- skelr(Void_t*, pvalloc(bytes));
-}
-Void_t* calloc_dbg(size_t n, size_t elem_size, dbgargs) {
- skelr(Void_t*, calloc(n, elem_size));
-}
-void cfree_dbg(Void_t *mem, dbgargs) {
- skelv(cfree(mem));
-}
-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, mallopt(flag, value));
-}
-struct mallinfo mallinfo_dbg(dbgargs) {
- skelr(struct mallinfo, mallinfo());
-}
-
-#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;
- }
-}
-
-/*
-
- cfree just calls free. It is needed/defined on some systems
- that pair it with calloc, presumably for odd historical reasons.
-
-*/
-
-#if !defined(INTERNAL_LINUX_C_LIB) || !defined(__ELF__)
-#if __STD_C
-void cfree(Void_t *mem)
-#else
-void cfree(mem) Void_t *mem;
-#endif
-{
- free(mem);
-}
-#endif
-
-
-
-/*
-
- 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 malloc_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 malloc_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 malloc_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 15b25db7b..000000000
--- a/winsup/cygwin/dlmalloc.h
+++ /dev/null
@@ -1,96 +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
- */
-
-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 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 cfree(p) cfree_dbg(p, __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() malloc_stats_dbg(__FILE__, __LINE__)
-#define mallopt(flag, val) mallopt_dbg(flag, val, __FILE__, __LINE__)
-#define mallinfo() 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);
-void cfree_dbg(void*, 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);
-void cfree(void*);
-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 7b8e8272d..000000000
--- a/winsup/cygwin/dtable.cc
+++ /dev/null
@@ -1,813 +0,0 @@
-/* dtable.cc: file descriptor support.
-
- 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. */
-
-#define __INSIDE_CYGWIN_NET__
-
-#include "winsup.h"
-#include <errno.h>
-#include <sys/socket.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/cygwin.h>
-#include <assert.h>
-#include <ntdef.h>
-#include <winnls.h>
-
-#define USE_SYS_TYPES_FD_SET
-#include <winsock.h>
-#include "pinfo.h"
-#include "cygerrno.h"
-#include "perprocess.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "ntdll.h"
-
-static const NO_COPY DWORD std_consts[] = {STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
- STD_ERROR_HANDLE};
-
-static const char *handle_to_fn (HANDLE, char *);
-
-static const char NO_COPY unknown_file[] = "some disk file";
-
-/* Set aside space for the table of fds */
-void
-dtable_init (void)
-{
- 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 ());
-}
-
-void
-dtable::dec_console_fds ()
-{
- if (console_fds > 0 && !--console_fds &&
- myself->ctty != TTY_CONSOLE && !check_pty_fds())
- FreeConsole ();
-}
-
-int
-dtable::extend (int howmuch)
-{
- int new_size = size + howmuch;
- fhandler_base **newfds;
-
- if (howmuch <= 0)
- 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");
- 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])
- {
- path_conv pc;
- HANDLE h = GetStdHandle (std_consts[i]);
- fhandler_base *fh = build_fhandler_from_name (i, std[i], NULL, pc);
- if (!fh)
- continue;
- if (!fh->open (&pc, (i ? 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->ppid_handle || 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 (myself->ctty < 0 && GetConsoleCP () > 0)
- set_console_ctty ();
-}
-
-int
-dtable::find_unused_handle (int start)
-{
- AssertResourceOwner (LOCK_FD_LIST, READ_LOCK);
- 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))
- {
- switch (fds[fd]->get_device ())
- {
- case FH_SOCKET:
- dec_need_fixup_before ();
- break;
- case FH_CONSOLE:
- dec_console_fds ();
- break;
- }
- delete fds[fd];
- 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 ();
- path_conv pc;
- fhandler_base *res = cygheap->fdtab.build_fhandler_from_name (fd, name, handle,
- pc);
- res->init (handle, myaccess, bin ?: pc.binmode ());
- return fd;
-}
-
-void
-dtable::init_std_file_from_handle (int fd, HANDLE handle)
-{
- const char *name;
- CONSOLE_SCREEN_BUFFER_INFO buf;
- struct sockaddr sa;
- int sal = sizeof (sa);
- DCB dcb;
- unsigned bin = O_BINARY;
-
- 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)
- name = NULL;
- else
- {
- /* See if we can consoleify it */
- if (GetConsoleScreenBufferInfo (handle, &buf))
- {
- if (ISSTATE (myself, PID_USETTY))
- name = "/dev/tty";
- else
- name = "/dev/conout";
- }
- else if (GetNumberOfConsoleInputEvents (handle, (DWORD *) &buf))
- {
- if (ISSTATE (myself, PID_USETTY))
- name = "/dev/tty";
- else
- name = "/dev/conin";
- }
- else if (ft == FILE_TYPE_PIPE)
- {
- if (fd == 0)
- name = "/dev/piper";
- else
- name = "/dev/pipew";
- }
- else if (wsock_started && getpeername ((SOCKET) handle, &sa, &sal) == 0)
- name = "/dev/socket";
- else if (GetCommState (handle, &dcb))
- name = "/dev/ttyS0"; // FIXME - determine correct device
- else
- {
- name = handle_to_fn (handle, (char *) alloca (MAX_PATH + 100));
- bin = 0;
- }
- }
-
- if (!name)
- fds[fd] = NULL;
- else
- {
- path_conv pc;
- fhandler_base *fh = build_fhandler_from_name (fd, name, handle, pc);
- if (!bin)
- {
- bin = fh->get_default_fmode (O_RDWR);
- if (!bin && name != unknown_file)
- bin = pc.binmode ();
- }
-
- fh->init (handle, GENERIC_READ | GENERIC_WRITE, bin);
- set_std_handle (fd);
- paranoid_printf ("fd %d, handle %p", fd, handle);
- }
-}
-
-fhandler_base *
-dtable::build_fhandler_from_name (int fd, const char *name, HANDLE handle,
- path_conv& pc, unsigned opt, suffix_info *si)
-{
- pc.check (name, opt | PC_NULLEMPTY | PC_FULL | PC_POSIX, si);
- if (pc.error)
- {
- set_errno (pc.error);
- return NULL;
- }
-
- if (!pc.exists () && handle)
- pc.fillin (handle);
-
- fhandler_base *fh = build_fhandler (fd, pc.get_devn (),
- pc.return_and_clear_normalized_path (),
- pc, pc.get_unitn ());
- return fh;
-}
-
-fhandler_base *
-dtable::build_fhandler (int fd, DWORD dev, const char *unix_name,
- const char *win32_name, int unit)
-{
- return build_fhandler (fd, dev, cstrdup (unix_name), win32_name, unit);
-}
-
-#define cnew(name) new ((void *) ccalloc (HEAP_FHANDLER, 1, sizeof (name))) name
-fhandler_base *
-dtable::build_fhandler (int fd, DWORD dev, char *unix_name,
- const char *win32_name, int unit)
-{
- fhandler_base *fh;
-
- dev &= FH_DEVMASK;
- switch (dev)
- {
- case FH_TTYM:
- fh = cnew (fhandler_tty_master) (unit);
- break;
- case FH_CONSOLE:
- case FH_CONIN:
- case FH_CONOUT:
- if ((fh = cnew (fhandler_console) ()))
- inc_console_fds ();
- break;
- case FH_PTYM:
- fh = cnew (fhandler_pty_master) ();
- break;
- case FH_TTYS:
- if (unit < 0)
- fh = cnew (fhandler_tty_slave) ();
- else
- fh = cnew (fhandler_tty_slave) (unit);
- break;
- case FH_WINDOWS:
- fh = cnew (fhandler_windows) ();
- break;
- case FH_SERIAL:
- fh = cnew (fhandler_serial) (unit);
- break;
- case FH_PIPE:
- case FH_PIPER:
- case FH_PIPEW:
- fh = cnew (fhandler_pipe) (dev);
- break;
- case FH_SOCKET:
- if ((fh = cnew (fhandler_socket) ()))
- inc_need_fixup_before ();
- break;
- case FH_DISK:
- fh = cnew (fhandler_disk_file) ();
- break;
- case FH_CYGDRIVE:
- fh = cnew (fhandler_cygdrive) (unit);
- break;
- case FH_FLOPPY:
- fh = cnew (fhandler_dev_floppy) (unit);
- break;
- case FH_TAPE:
- fh = cnew (fhandler_dev_tape) (unit);
- break;
- case FH_NULL:
- fh = cnew (fhandler_dev_null) ();
- break;
- case FH_ZERO:
- fh = cnew (fhandler_dev_zero) ();
- break;
- case FH_RANDOM:
- fh = cnew (fhandler_dev_random) (unit);
- break;
- case FH_MEM:
- fh = cnew (fhandler_dev_mem) (unit);
- 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;
- default:
- system_printf ("internal error -- unknown device - %p", dev);
- fh = NULL;
- }
-
- if (unix_name)
- {
- char new_win32_name[strlen (unix_name) + 1];
- if (!win32_name)
- {
- char *p;
- /* FIXME: ? Should we call win32_device_name here?
- It seems like overkill, but... */
- win32_name = strcpy (new_win32_name, unix_name);
- for (p = (char *) win32_name; (p = strchr (p, '/')); p++)
- *p = '\\';
- }
- fh->set_name (unix_name, win32_name, fh->get_unit ());
- }
- debug_printf ("fd %d, fh %p", fd, fh);
- return fd >= 0 ? (fds[fd] = fh) : fh;
-}
-
-fhandler_base *
-dtable::dup_worker (fhandler_base *oldfh)
-{
- fhandler_base *newfh = build_fhandler (-1, oldfh->get_device ());
- *newfh = *oldfh;
- newfh->set_io_handle (NULL);
- if (oldfh->dup (newfh))
- {
- cfree (newfh);
- newfh = NULL;
- return NULL;
- }
-
- newfh->set_close_on_exec_flag (0);
- MALLOC_CHECK;
- 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);
- SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "dup");
-
- 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;
- ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "dup");
- syscall_printf ("%d = dup2 (%d, %d)", res, oldfd, newfd);
-
- return 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->saw_error = 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->saw_error = 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->saw_error = 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)
-{
- SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "fixup_before_fork");
- 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);
- }
- ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "fixup_before_fork");
-}
-
-void
-dtable::fixup_before_exec (DWORD target_proc_id)
-{
- SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "fixup_before_exec");
- fhandler_base *fh;
- for (size_t i = 0; i < size; i++)
- if ((fh = fds[i]) != NULL && !fh->get_close_on_exec ())
- {
- debug_printf ("fd %d (%s)", i, fh->get_name ());
- fh->fixup_before_fork_exec (target_proc_id);
- }
- ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "fixup_before_exec");
-}
-
-void
-dtable::set_file_pointers_for_exec ()
-{
- SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "set_file_pointers_for_exec");
- 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);
- ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "fixup_before_exec");
-}
-
-void
-dtable::fixup_after_exec (HANDLE parent)
-{
- first_fd_for_open = 0;
- fhandler_base *fh;
- for (size_t i = 0; i < size; i++)
- if ((fh = fds[i]) != NULL)
- {
- fh->clear_readahead ();
- if (fh->get_close_on_exec ())
- release (i);
- else
- {
- fh->fixup_after_exec (parent);
- 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->get_close_on_exec () || fh->get_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 ());
- }
-}
-
-int
-dtable::vfork_child_dup ()
-{
- fhandler_base **newtable;
- SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "dup");
- newtable = (fhandler_base **) ccalloc (HEAP_ARGV, size, sizeof (fds[0]));
- int res = 1;
-
- /* Remove impersonation */
- if (cygheap->user.issetuid ())
- RevertToSelf ();
-
- 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]->get_close_on_exec ());
- else
- {
- res = 0;
- set_errno (EBADF);
- goto out;
- }
-
- fds_on_hold = fds;
- fds = newtable;
-
-out:
- /* Restore impersonation */
- if (cygheap->user.issetuid ())
- ImpersonateLoggedOnUser (cygheap->user.token);
-
- ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "dup");
- return 1;
-}
-
-void
-dtable::vfork_parent_restore ()
-{
- SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "restore");
-
- close_all_files ();
- fhandler_base **deleteme = fds;
- fds = fds_on_hold;
- fds_on_hold = NULL;
- cfree (deleteme);
-
- ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "restore");
- return;
-}
-
-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) cygheap->fdtab.size; i++)
- if ((fh = cygheap->fdtab[i]) != NULL)
- {
- fh->clear_readahead ();
- if (fh->get_close_on_exec ())
- release (i);
- else
- {
- fh->close ();
- cygheap->fdtab.release (i);
- }
- }
-
- fds = saveme;
- cfree (fds_on_hold);
- fds_on_hold = NULL;
-
- return;
-}
-
-#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);
-
- DWORD res = NtQueryObject (h, ObjectNameInformation, ntfn, sizeof (fnbuf), NULL);
-
- if (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[MAX_PATH + 100];
- sys_wcstombs (win32_fn, ntfn->Name.Buffer, ntfn->Name.Length);
- 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 = strchr (win32_fn + DEVICE_PREFIX_LEN, '\\');
- if (!p)
- p = strchr (win32_fn + DEVICE_PREFIX_LEN, '\0');
-
- int n = p - win32_fn;
- int maxmatchlen = 0;
- char *maxmatchdos = NULL;
- for (char *s = fnbuf; *s; s = strchr (s, '\0') + 1)
- {
- char device[MAX_PATH + 10];
- device[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 589a27a0d..000000000
--- a/winsup/cygwin/dtable.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/* dtable.h: fd table definition.
-
- 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. */
-
-/* Initial and increment values for cygwin's fd table */
-#define NOFILE_INCR 32
-
-#include "thread.h"
-
-class suffix_info;
-class dtable
-{
- fhandler_base **fds;
- fhandler_base **fds_on_hold;
- int first_fd_for_open;
- int cnt_need_fixup_before;
- int console_fds;
-public:
- size_t size;
-
- dtable () : first_fd_for_open(3), cnt_need_fixup_before(0), console_fds(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; }
-
- void dec_console_fds ();
- void inc_console_fds ()
- { console_fds++; }
- BOOL has_console_fds ()
- { return console_fds > 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);
- fhandler_base *build_fhandler (int fd, DWORD dev, const char *unix_name,
- const char *win32_name = NULL, int unit = -1);
- fhandler_base *build_fhandler (int fd, DWORD dev, char *unix_name = NULL,
- const char *win32_name = NULL, int unit = -1);
- fhandler_base *build_fhandler_from_name (int fd, const char *name, HANDLE h,
- path_conv& pc,
- unsigned opts = PC_SYM_FOLLOW,
- suffix_info *si = NULL);
- inline int not_open (int fd)
- {
- SetResourceLock (LOCK_FD_LIST, READ_LOCK, "not_open");
-
- int res = fd < 0 || fd >= (int) size || fds[fd] == NULL;
-
- ReleaseResourceLock (LOCK_FD_LIST, READ_LOCK, "not open");
- 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 (HANDLE);
- 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 ();
- bool in_vfork_cleanup () {return fds_on_hold == fds;}
-};
-
-void dtable_init (void);
-void stdio_init (void);
-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 9f292ee73..000000000
--- a/winsup/cygwin/dtable.sgml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-<sect1 id="func-cygwin-attach-handle-to-fd">
-<title>cygwin_attach_handle_to_fd</title>
-
-<funcsynopsis>
-<funcdef>extern "C" int
-<function>cygwin_attach_handle_to_fd</function></funcdef>
-<paramdef>char *<parameter>name</parameter></paramdef>
-<paramdef>int <parameter>fd</parameter></paramdef>
-<paramdef>HANDLE <parameter>handle</parameter></paramdef>
-<paramdef>int <parameter>bin</parameter></paramdef>
-<paramdef>int <parameter>access</parameter></paramdef>
-</funcsynopsis>
-
-<para>This function can be used to turn a Win32 "handle" into a
-posix-style file handle. <parameter>fd</parameter> may be -1 to
-make cygwin allocate a handle; the actual handle is returned
-in all cases.</para>
-
-</sect1>
diff --git a/winsup/cygwin/environ.cc b/winsup/cygwin/environ.cc
deleted file mode 100644
index 2b109e226..000000000
--- a/winsup/cygwin/environ.cc
+++ /dev/null
@@ -1,1004 +0,0 @@
-/* environ.cc: Cygwin-adopted functions from newlib to manipulate
- process's environment.
-
- Copyright 1997, 1998, 1999, 2000, 2001, 2002 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 <errno.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <ctype.h>
-#include <assert.h>
-#include <sys/cygwin.h>
-#include <cygwin/version.h>
-#include "pinfo.h"
-#include "perprocess.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "cygerrno.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "registry.h"
-#include "environ.h"
-#include "child_info.h"
-
-extern BOOL allow_daemon;
-extern BOOL allow_glob;
-extern bool ignore_case_with_glob;
-extern BOOL allow_ntea;
-extern BOOL allow_smbntsec;
-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;
-
-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 MAX_PATH;}
-static NO_COPY 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},
- {NL ("HOME="), NULL, NULL, cygwin_conv_to_full_posix_path,
- cygwin_conv_to_full_win32_path, return_MAX_PATH, return_MAX_PATH},
- {NL ("LD_LIBRARY_PATH="), NULL, NULL, cygwin_conv_to_full_posix_path,
- cygwin_conv_to_full_win32_path, return_MAX_PATH, return_MAX_PATH},
- {NL ("TMPDIR="), NULL, NULL, cygwin_conv_to_full_posix_path,
- cygwin_conv_to_full_win32_path, return_MAX_PATH, return_MAX_PATH},
- {NL ("TMP="), NULL, NULL, cygwin_conv_to_full_posix_path,
- cygwin_conv_to_full_win32_path, return_MAX_PATH, return_MAX_PATH},
- {NL ("TEMP="), NULL, NULL, cygwin_conv_to_full_posix_path,
- cygwin_conv_to_full_win32_path, return_MAX_PATH, return_MAX_PATH},
- {NULL, 0, NULL, NULL, NULL, NULL, 0, 0}
- };
-
-static unsigned char conv_start_chars[256] = {0};
-
-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));
- (void) strcpy (native, name);
- (void) strcpy (native + namelen, in_native);
- }
- else
- {
- native = (char *) realloc (native, namelen + 1 + win32_len (in_posix));
- (void) strcpy (native, name);
- towin32 (in_posix, native + namelen);
- }
- MALLOC_CHECK;
- 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)
-{
- 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 * const 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)
- 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:<foo>;<bar> 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 (const char *str)
-{
- int res;
- if ((res = check_null_empty_str (str)))
- {
- if (res == ENOENT)
- return 0;
- set_errno (res);
- return -1;
- }
- 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)
-{
- int res;
- if ((res = check_null_empty_str (value)) == EFAULT)
- {
- set_errno (res);
- return -1;
- }
- if ((res = check_null_empty_str (name)))
- {
- if (res == ENOENT)
- return 0;
- set_errno (res);
- return -1;
- }
- if (*value == '=')
- value++;
- return _addenv (name, value, !!overwrite);
-}
-
-/* unsetenv(name) -- Delete environment variable "name". */
-extern "C" void
-unsetenv (const char *name)
-{
- register char **e;
- int offset;
-
- 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;
-}
-
-/* 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 (strncmp (buf, "relax", 5)== 0)
- {
- 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 (strtol (buf, NULL, 0));
-}
-
-/* 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}}},
- {"daemon", {&allow_daemon}, justset, NULL, {{FALSE}, {TRUE}}},
- {"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", {&allow_ntea}, justset, NULL, {{FALSE}, {TRUE}}},
- {"ntsec", {&allow_ntsec}, justset, NULL, {{FALSE}, {TRUE}}},
- {"smbntsec", {&allow_smbntsec}, justset, NULL, {{FALSE}, {TRUE}}},
- {"reset_com", {&reset_com}, justset, NULL, {{FALSE}, {TRUE}}},
- {"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}}},
- {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[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");
- return;
-}
-
-/* Set options from the registry. */
-static bool __stdcall
-regopt (const char *name)
-{
- bool parsed_something = false;
- /* FIXME: should not be under mount */
- reg_key r (KEY_READ, CYGWIN_INFO_PROGRAM_OPTIONS_NAME, NULL);
- char buf[MAX_PATH];
- char lname[strlen (name) + 1];
- strlwr (strcpy (lname, name));
-
- if (r.get_string (lname, buf, sizeof (buf) - 1, "") == ERROR_SUCCESS)
- {
- parse_options (buf);
- parsed_something = true;
- }
- else
- {
- reg_key r1 (HKEY_LOCAL_MACHINE, KEY_READ, "SOFTWARE",
- CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
- CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
- CYGWIN_INFO_PROGRAM_OPTIONS_NAME, NULL);
- if (r1.get_string (lname, buf, sizeof (buf) - 1, "") == ERROR_SUCCESS)
- {
- parse_options (buf);
- parsed_something = true;
- }
- }
- 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";
-
- static int initted;
- if (!initted)
- {
- 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;
- }
- initted = 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 ();
-
- /* 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;
- if ((eq = strchr (newp, '=')) == NULL)
- eq = strchr (newp, '\0');
- 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++] = cygterm;
- envp[i] = NULL;
- FreeEnvironmentStrings (rawenv);
-
-out:
- __cygwin_environ = envp;
- update_envptrs ();
- 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;
- 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[] =
-{
- {NL ("HOMEDRIVE="), &cygheap_user::env_homedrive},
- {NL ("HOMEPATH="), &cygheap_user::env_homepath},
- {NL ("LOGONSERVER="), &cygheap_user::env_logsrv},
- {NL ("SYSTEMDRIVE="), NULL},
- {NL ("SYSTEMROOT="), NULL},
- {NL ("USERDOMAIN="), &cygheap_user::env_domain},
- {NL ("USERNAME="), &cygheap_user::env_name},
- {NL ("USERPROFILE="), &cygheap_user::env_userprofile},
-};
-
-char *
-spenv::retrieve (bool no_envblock, const char *const envname)
-{
- if (envname && !strncasematch (envname, name, namelen))
- return NULL;
-
- debug_printf ("no_envblock %d", no_envblock);
-
- if (from_cygheap)
- {
- const char *p;
- if (envname && !cygheap->user.issetuid ())
- {
- debug_printf ("duping existing value for '%s'", name);
- return cstrdup1 (envname); /* Don't really care what it's set to
- if we're calling a cygwin program */
- }
-
- /* Calculate (potentially) value for given environment variable. */
- p = (cygheap->user.*from_cygheap) (name, namelen);
- if (!p || (no_envblock && !envname) || (p == env_dontadd))
- return env_dontadd;
- char *s = (char *) cmalloc (HEAP_1_STR, namelen + strlen (p) + 1);
- strcpy (s, name);
- (void) strcpy (s + namelen, p);
- debug_printf ("using computed value for '%s'", name);
- return s;
- }
-
- if (envname)
- return cstrdup1 (envname);
-
- 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;
- /* Iterate over input list, generating a new environment list and refreshing
- "special" entries, if necessary. */
- for (srcp = envp, dstp = newenv; *srcp; srcp++)
- {
- /* 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;
- goto next0;
- }
-
- /* Add entry to new environment */
- *dstp = cstrdup1 (*srcp);
-
- next0:
- /* If necessary, calculate rough running total for envblock size */
- if (!no_envblock)
- 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])
- {
- *dstp = spenvs[i].retrieve (no_envblock);
- if (*dstp && !no_envblock && *dstp != env_dontadd)
- {
- tl += strlen (*dstp) + 1;
- dstp++;
- }
- }
-
- envc = dstp - newenv; /* Number of entries in newenv */
- assert ((size_t) envc <= (n + SPENVS_SIZE));
- *dstp = NULL; /* Terminate */
-
- if (no_envblock)
- envblock = NULL;
- else
- {
- debug_printf ("env count %d, bytes %d", envc, tl);
-
- /* Windows programs expect the environment block to be sorted. */
- qsort (newenv, 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 = newenv, s = envblock; *srcp; srcp++)
- {
- const char *p;
- win_env *conv;
- len = strcspn (*srcp, "=") + 1;
-
- /* See if this entry requires posix->win32 conversion. */
- conv = getwinenv (*srcp, *srcp + len);
- if (conv)
- p = conv->native; /* Use win32 path */
- else
- p = *srcp; /* Don't worry about it */
-
- len = strlen (p);
- 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 */
- }
-
- 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 1a616b214..000000000
--- a/winsup/cygwin/environ.h
+++ /dev/null
@@ -1,46 +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 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 *);
- 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;}
- };
-
-win_env * __stdcall getwinenv (const char *name, const char *posix = 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 d37f7c337..000000000
--- a/winsup/cygwin/errno.cc
+++ /dev/null
@@ -1,697 +0,0 @@
-/* errno.cc: errno-related functions
-
- 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. */
-
-#define _sys_nerr FOO_sys_nerr
-#define sys_nerr FOOsys_nerr
-#include "winsup.h"
-#define _REENT_ONLY
-#include <stdio.h>
-#include <errno.h>
-#include "cygerrno.h"
-#include "thread.h"
-#undef _sys_nerr
-#undef sys_nerr
-
-/* 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 const 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 (INVALID_FUNCTION, EBADRQC),
- X (FILE_NOT_FOUND, ENOENT),
- X (PATH_NOT_FOUND, ENOENT),
- X (TOO_MANY_OPEN_FILES, EMFILE),
- X (ACCESS_DENIED, EACCES),
- X (INVALID_HANDLE, EBADF),
- X (NOT_ENOUGH_MEMORY, ENOMEM),
- X (INVALID_DATA, EINVAL),
- X (OUTOFMEMORY, ENOMEM),
- X (INVALID_DRIVE, ENODEV),
- X (NOT_SAME_DEVICE, EXDEV),
- X (NO_MORE_FILES, ENMFILE),
- X (WRITE_PROTECT, EROFS),
- X (BAD_UNIT, ENODEV),
- X (SHARING_VIOLATION, EACCES),
- X (LOCK_VIOLATION, EACCES),
- X (SHARING_BUFFER_EXCEEDED, ENOLCK),
- X (HANDLE_EOF, ENODATA),
- X (HANDLE_DISK_FULL, ENOSPC),
- X (NOT_SUPPORTED, ENOSYS),
- X (REM_NOT_LIST, ENONET),
- X (DUP_NAME, ENOTUNIQ),
- X (BAD_NETPATH, ENOSHARE),
- X (BAD_NET_NAME, ENOSHARE),
- X (FILE_EXISTS, EEXIST),
- X (CANNOT_MAKE, EPERM),
- X (INVALID_PARAMETER, EINVAL),
- X (NO_PROC_SLOTS, EAGAIN),
- X (BROKEN_PIPE, EPIPE),
- X (OPEN_FAILED, EIO),
- X (NO_MORE_SEARCH_HANDLES, ENFILE),
- X (CALL_NOT_IMPLEMENTED, ENOSYS),
- X (INVALID_NAME, ENOENT),
- X (WAIT_NO_CHILDREN, ECHILD),
- X (CHILD_NOT_COMPLETE, EBUSY),
- X (DIR_NOT_EMPTY, ENOTEMPTY),
- X (SIGNAL_REFUSED, EIO),
- X (BAD_PATHNAME, ENOENT),
- X (SIGNAL_PENDING, EBUSY),
- X (MAX_THRDS_REACHED, EAGAIN),
- X (BUSY, EBUSY),
- X (ALREADY_EXISTS, EEXIST),
- X (NO_SIGNAL_SENT, EIO),
- X (FILENAME_EXCED_RANGE, EINVAL),
- X (META_EXPANSION_TOO_LONG, EINVAL),
- X (INVALID_SIGNAL_NUMBER, EINVAL),
- X (THREAD_1_INACTIVE, EINVAL),
- X (BAD_PIPE, EINVAL),
- X (PIPE_BUSY, EBUSY),
- X (NO_DATA, EPIPE),
- X (PIPE_NOT_CONNECTED, ECOMM),
- X (MORE_DATA, EAGAIN),
- X (DIRECTORY, ENOTDIR),
- X (PIPE_CONNECTED, EBUSY),
- X (PIPE_LISTENING, ECOMM),
- X (NO_TOKEN, EINVAL),
- X (PROCESS_ABORTED, EFAULT),
- X (BAD_DEVICE, ENODEV),
- X (BAD_USERNAME, EINVAL),
- X (NOT_CONNECTED, ENOLINK),
- X (OPEN_FILES, EAGAIN),
- X (ACTIVE_CONNECTIONS, EAGAIN),
- X (DEVICE_IN_USE, EAGAIN),
- X (INVALID_AT_INTERRUPT_TIME, EINTR),
- X (IO_DEVICE, EIO),
- X (NOT_OWNER, EPERM),
- X (END_OF_MEDIA, ENOSPC),
- X (EOM_OVERFLOW, ENOSPC),
- X (BEGINNING_OF_MEDIA, ESPIPE),
- X (SETMARK_DETECTED, ESPIPE),
- X (NO_DATA_DETECTED, ENOSPC),
- X (POSSIBLE_DEADLOCK, EDEADLOCK),
- X (CRC, EIO),
- X (NEGATIVE_SEEK, EINVAL),
- X (NOT_READY, ENOMEDIUM),
- X (DISK_FULL, ENOSPC),
- X (NOACCESS, EFAULT),
- X (FILE_INVALID, ENXIO),
- X (INVALID_ADDRESS, EOVERFLOW),
- { 0, NULL, 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));
- return;
-}
-
-/* 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));
-
-extern "C" {
-const NO_COPY char __declspec(dllexport) * const _sys_errlist[]=
-{
-/* 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 */ "I/O error",
-/* ENXIO 6 */ "No such device or address",
-/* E2BIG 7 */ "Arg list too long",
-/* ENOEXEC 8 */ "Exec format error",
-/* EBADF 9 */ "Bad file descriptor",
-/* ECHILD 10 */ "No children",
-/* EAGAIN 11 */ "Resource temporarily unavailable",
-/* ENOMEM 12 */ "Not enough core",
-/* EACCES 13 */ "Permission denied",
-/* EFAULT 14 */ "Bad address",
-/* ENOTBLK 15 */ "Block device required",
-/* EBUSY 16 */ "Mount device busy",
-/* EEXIST 17 */ "File exists",
-/* EXDEV 18 */ "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 */ "Not a typewriter",
-/* 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 */ "Math arg out of domain of func",
-/* ERANGE 34 */ "Math result not representable",
-/* 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 */ "Deadlock condition",
-/* ENOLCK 46 */ "No record locks available",
- "47",
- "48",
- "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 fmt",
- "58",
- "59",
-/* ENOSTR 60 */ "Device not a stream",
-/* ENODATA 61 */ "No data (for no delay io)",
-/* 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 */ "The object is remote",
-/* ENOLINK 67 */ "The link has been severed",
-/* EADV 68 */ "Advertise error",
-/* ESRMNT 69 */ "Srmount error",
-/* ECOMM 70 */ "Communication error on send",
-/* EPROTO 71 */ "Protocol error",
- "72",
- "73",
-/* EMULTIHOP 74 */ "Multihop attempted",
-/* ELBIN 75 */ "Inode is remote (not really error)",
-/* EDOTDOT 76 */ "Cross mount point (not really error)",
-/* EBADMSG 77 */ "Trying to read unreadable message",
- "78",
- "79",
-/* ENOTUNIQ 80 */ "Given log. name not unique",
-/* EBADFD 81 */ "f.d. invalid for this operation",
-/* EREMCHG 82 */ "Remote address changed",
-/* ELIBACC 83 */ "Can't access a needed shared lib",
-/* ELIBBAD 84 */ "Accessing a corrupted shared lib",
-/* ELIBSCN 85 */ ".lib section in a.out corrupted",
-/* ELIBMAX 86 */ "Attempting to link in too many libs",
-/* ELIBEXEC 87 */ "Attempting to exec a shared library",
-/* ENOSYS 88 */ "Function not implemented",
-/* ENMFILE 89 */ "No more files",
-/* ENOTEMPTY 90 */ "Directory not empty",
-/* ENAMETOOLONG 91 */ "File or path name too long",
-/* ELOOP 92 */ "Too many symbolic links",
- "93",
- "94",
-/* EOPNOTSUPP 95 */ "Operation not supported on transport endpoint",
-/* EPFNOSUPPORT 96 */ "Protocol family not supported",
- "97",
- "98",
- "99",
- "100",
- "101",
- "102",
- "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 transport endpoint",
-/* 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 */ "Connection aborted",
-/* 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 because of reset",
-/* EISCONN 127 */ "Transport endpoint is already connected",
-/* ENOTCONN 128 */ "Transport endpoint is not connected",
-/* ETOOMANYREFS 129 */ "Too many references: cannot splice",
-/* EPROCLIM 130 */ "Process limit exceeded",
-/* EUSERS 131 */ "Too many users",
-/* EDQUOT 132 */ "Quota exceeded",
-/* ESTALE 133 */ "Stale NFS file handle",
-/* ENOTSUP 134 */ "134",
-/* ENOMEDIUM 135 */ "no medium",
-/* ENOSHARE 136 */ "No such host or network path",
-/* ECASECLASH 137 */ "Filename exists with different case"
-/* EILSEQ 138 */ "Illegal byte sequence"
-/* EOVERFLOW 139 */ "Value too large for defined data type"
-};
-
-extern int const NO_COPY __declspec(dllexport) _sys_nerr = sizeof (_sys_errlist) / sizeof (_sys_errlist[0]);
-};
-
-/* FIXME: Why is strerror() a long switch and not just:
- return sys_errlist[errnum];
- (or moral equivalent).
- Some entries in sys_errlist[] don't match the corresponding
- entries in strerror(). This seems odd.
-*/
-
-/* CYGWIN internal */
-/* strerror: convert from errno values to error strings */
-extern "C" char *
-strerror (int errnum)
-{
- const char *error;
- if (errnum < _sys_nerr)
- error = _sys_errlist [errnum];
- else
- switch (errnum)
- {
- case EPERM:
- error = "Operation not permitted";
- break;
- case ENOENT:
- error = "No such file or directory";
- break;
- case ESRCH:
- error = "No such process";
- break;
- case EINTR:
- error = "Interrupted system call";
- break;
- case EIO:
- error = "I/O error";
- break;
- case ENXIO:
- error = "No such device or address";
- break;
- case E2BIG:
- error = "Arg list too long";
- break;
- case ENOEXEC:
- error = "Exec format error";
- break;
- case EBADF:
- error = "Bad file descriptor";
- break;
- case ECHILD:
- error = "No children";
- break;
- case EAGAIN:
- error = "Resource temporarily unavailable";
- break;
- case ENOMEM:
- error = "Not enough memory";
- break;
- case EACCES:
- error = "Permission denied";
- break;
- case EFAULT:
- error = "Bad address";
- break;
- case ENOTBLK:
- error = "Block device required";
- break;
- case EBUSY:
- error = "Device or resource busy";
- break;
- case EEXIST:
- error = "File exists";
- break;
- case EXDEV:
- error = "Cross-device link";
- break;
- case ENODEV:
- error = "No such device";
- break;
- case ENOTDIR:
- error = "Not a directory";
- break;
- case EISDIR:
- error = "Is a directory";
- break;
- case EINVAL:
- error = "Invalid argument";
- break;
- case ENFILE:
- error = "Too many open files in system";
- break;
- case EMFILE:
- error = "Too many open files";
- break;
- case ENOTTY:
- error = "Not a character device";
- break;
- case ETXTBSY:
- error = "Text file busy";
- break;
- case EFBIG:
- error = "File too large";
- break;
- case ENOSPC:
- error = "No space left on device";
- break;
- case ESPIPE:
- error = "Illegal seek";
- break;
- case EROFS:
- error = "Read-only file system";
- break;
- case EMLINK:
- error = "Too many links";
- break;
- case EPIPE:
- error = "Broken pipe";
- break;
- case EDOM:
- error = "Math arg out of domain of func";
- break;
- case ERANGE:
- error = "Math result out of range";
- break;
- case ENOMSG:
- error = "No message of desired type";
- break;
- case EIDRM:
- error = "Identifier removed";
- break;
- case ECHRNG:
- error = "Channel number out of range";
- break;
- case EL2NSYNC:
- error = "Level 2 not synchronized";
- break;
- case EL3HLT:
- error = "Level 3 halted";
- break;
- case EL3RST:
- error = "Level 3 reset";
- break;
- case ELNRNG:
- error = "Link number out of range";
- break;
- case EUNATCH:
- error = "Protocol driver not attached";
- break;
- case ENOCSI:
- error = "No CSI structure available";
- break;
- case EL2HLT:
- error = "Level 2 halted";
- break;
- case EDEADLK:
- error = "Deadlock condition";
- break;
- case ENOLCK:
- error = "No lock";
- break;
- case EBADE:
- error = "Invalid exchange";
- break;
- case EBADR:
- error = "Invalid request descriptor";
- break;
- case EXFULL:
- error = "Exchange full";
- break;
- case ENOANO:
- error = "No anode";
- break;
- case EBADRQC:
- error = "Invalid request code";
- break;
- case EBADSLT:
- error = "Invalid slot";
- break;
- case EDEADLOCK:
- error = "File locking deadlock error";
- break;
- case EBFONT:
- error = "Bad font file fmt";
- break;
- case ENOSTR:
- error = "Not a stream";
- break;
- case ENODATA:
- error = "No data (for no delay io)";
- break;
- case ETIME:
- error = "Stream ioctl timeout";
- break;
- case ENOSR:
- error = "No stream resources";
- break;
- case ENONET:
- error = "Machine is not on the network";
- break;
- case ENOPKG:
- error = "No package";
- break;
- case EREMOTE:
- error = "Resource is remote";
- break;
- case ENOLINK:
- error = "Virtual circuit is gone";
- break;
- case EADV:
- error = "Advertise error";
- break;
- case ESRMNT:
- error = "Srmount error";
- break;
- case ECOMM:
- error = "Communication error";
- break;
- case EPROTO:
- error = "Protocol error";
- break;
- case EMULTIHOP:
- error = "Multihop attempted";
- break;
- case ELBIN:
- error = "Inode is remote (not really error)";
- break;
- case EDOTDOT:
- error = "Cross mount point (not really error)";
- break;
- case EBADMSG:
- error = "Bad message";
- break;
- case ENOTUNIQ:
- error = "Given log. name not unique";
- break;
- case EBADFD:
- error = "f.d. invalid for this operation";
- break;
- case EREMCHG:
- error = "Remote address changed";
- break;
- case ELIBACC:
- error = "Cannot access a needed shared library";
- break;
- case ELIBBAD:
- error = "Accessing a corrupted shared library";
- break;
- case ELIBSCN:
- error = ".lib section in a.out corrupted";
- break;
- case ELIBMAX:
- error = "Attempting to link in more shared libraries than system limit";
- break;
- case ELIBEXEC:
- error = "Cannot exec a shared library directly";
- break;
- case ENOSYS:
- error = "Function not implemented";
- break;
- case ENMFILE:
- error = "No more files";
- break;
- case ENOTEMPTY:
- error = "Directory not empty";
- break;
- case ENAMETOOLONG:
- error = "File or path name too long";
- break;
- case ELOOP:
- error = "Too many symbolic links";
- break;
- case EOPNOTSUPP:
- error = "Operation not supported on transport endpoint";
- break;
- case EPFNOSUPPORT:
- error = "Protocol family not supported";
- break;
- case ECONNRESET:
- error = "Connection reset by peer";
- break;
- case ENOBUFS:
- error = "No buffer space available; the socket cannot be connected";
- break;
- case EAFNOSUPPORT:
- error = "Addresses in the specified family cannot be used with this socket";
- break;
- case EPROTOTYPE:
- error = "errno EPROTOTYPE triggered";
- break;
- case ENOTSOCK:
- error = "The descriptor is a file, not a socket";
- break;
- case ENOPROTOOPT:
- error = "This option is unsupported";
- break;
- case ESHUTDOWN:
- error = "errno ESHUTDOWN triggered";
- break;
- case ECONNREFUSED:
- error = "Connection refused";
- break;
- case EADDRINUSE:
- error = "Address already in use";
- break;
- case ECONNABORTED:
- error = "The connection was aborted";
- break;
- case ENETUNREACH:
- error ="The network can't be reached from this host at this time";
- break;
- case ENETDOWN:
- error = "Network failed.";
- break;
- case ETIMEDOUT:
- error = "Attempt to connect timed out without establishing a connection";
- break;
- case EHOSTDOWN:
- error = "errno EHOSTDOWN triggered";
- break;
- case EHOSTUNREACH:
- error = "errno EHOSTUNREACH triggered";
- break;
- case EINPROGRESS:
- error = "errno EINPROGRESS triggered";
- break;
- case EALREADY:
- error = "errno EALREADY triggered";
- break;
- case EDESTADDRREQ:
- error = "errno EDESTADDRREQ triggered";
- break;
- case EMSGSIZE:
- error = "errno EMSGSIZE triggered";
- break;
-
- case EPROTONOSUPPORT:
- error = "errno EPROTONOSUPPORT triggered";
- break;
- case ESOCKTNOSUPPORT:
- error = "errno ESOCKTNOSUPPORT triggered";
- break;
- case EADDRNOTAVAIL:
- error = "errno EADDRNOTAVAIL triggered";
- break;
- case ENETRESET:
- error = "errno ENETRESET triggered";
- break;
- case EISCONN:
- error = "The socket is already connected";
- break;
- case ENOTCONN:
- error = "The socket is not connected";
- break;
- case ETOOMANYREFS:
- error = "errno ETOOMANYREFS triggered";
- break;
- case EPROCLIM:
- error = "errno EPROCLIM triggered";
- break;
- case EUSERS:
- error = "errno EUSERS triggered";
- break;
- case EDQUOT:
- error = "errno EDQUOT triggered";
- break;
- case ESTALE:
- error = "errno ESTALE triggered";
- break;
- case ENOTSUP:
- error = "errno ENOTSUP triggered";
- break;
- case ENOMEDIUM:
- error = "no medium";
- break;
- case ENOSHARE:
- error = "No such host or network path";
- break;
- case ECASECLASH:
- error = "Filename exists with different case";
- break;
- case EILSEQ:
- error = "Illegal byte sequence";
- break;
- case EOVERFLOW:
- error = "Value too large for defined data type";
- break;
- default:
-#ifdef _MT_SAFE
- char *buf= _reent_winsup ()->_strerror_buf;
-#else
- static NO_COPY char buf[20];
-#endif
- __small_sprintf (buf, "error %d", errnum);
- error = buf;
- break;
- }
-
- /* FIXME: strerror should really be const in the appropriate newlib
- include files. */
- return (char *) error;
-}
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
deleted file mode 100644
index 716846f89..000000000
--- a/winsup/cygwin/exceptions.cc
+++ /dev/null
@@ -1,1275 +0,0 @@
-/* exceptions.cc
-
- 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 <imagehlp.h>
-#include <errno.h>
-#include <stdlib.h>
-
-#include "exceptions.h"
-#include "sync.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include "cygerrno.h"
-#include "perthread.h"
-#include "shared_info.h"
-#include "perprocess.h"
-#include "security.h"
-
-#define CALL_HANDLER_RETRY 20
-
-char debugger_command[2 * MAX_PATH + 20];
-
-extern "C" {
-static int handle_exceptions (EXCEPTION_RECORD *, void *, CONTEXT *, void *);
-extern void sigreturn ();
-extern void sigdelayed ();
-extern void sigdelayed0 ();
-extern void siglast ();
-extern DWORD __no_sig_start, __no_sig_end;
-};
-
-extern DWORD sigtid;
-
-extern HANDLE hExeced;
-extern DWORD dwExeced;
-
-static BOOL WINAPI ctrl_c_handler (DWORD);
-static void signal_exit (int) __attribute__ ((noreturn));
-static 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 NO_COPY muto *mask_sync = NULL;
-
-HMODULE NO_COPY cygwin_hmodule;
-
-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. */
-
-#ifdef __i386__
-
-// 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.
-
-asm (".equ __except_list,0");
-
-extern exception_list *_except_list asm ("%fs:__except_list");
-
-static void
-init_exception_handler (exception_list *el)
-{
- el->handler = handle_exceptions;
- el->prev = _except_list;
- _except_list = el;
-}
-#endif
-
-void
-early_stuff_init ()
-{
- (void) SetConsoleCtrlHandler (ctrl_c_handler, FALSE);
- if (!SetConsoleCtrlHandler (ctrl_c_handler, TRUE))
- system_printf ("SetConsoleCtrlHandler failed, %E");
-
- /* Initialize global security attribute stuff */
-
- 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 ();
-}
-
-extern "C" void
-init_exceptions (exception_list *el)
-{
- init_exception_handler (el);
-}
-
-extern "C" void
-error_start_init (const char *buf)
-{
- if (!buf || !*buf)
- {
- debugger_command[0] = '\0';
- return;
- }
-
- char pgm[MAX_PATH + 1];
- if (!GetModuleFileName (NULL, pgm, 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->ppid_handle)
- 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;
- }
- }
- }
-
-#ifdef __i386__
-#define HAVE_STATUS
- if (exception_name)
- small_printf ("Exception: %s at eip=%08x\r\n", exception_name, in->Eip);
- else
- small_printf ("Exception %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\r\n",
- in->Ebp, in->Esp, myself->progname);
- 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);
-#endif
-
-#ifndef HAVE_STATUS
- system_printf ("Had an exception");
-#endif
-}
-
-#ifdef __i386__
-/* Print a stack backtrace. */
-
-#define HAVE_STACK_TRACE
-
-/* 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 this->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;
-static signal_dispatch sigsave;
-
-/* 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;
-
- if (rlim_core == 0UL)
- return;
-
- if (open_file)
- open_stackdumpfile ();
-
- 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",
- i == 16 ? " (more stack frames may be present)" : "");
-}
-
-/* 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' || being_debugged ())
- return 0;
-
- __small_sprintf (strchr (debugger_command, '\0'), " %u", GetCurrentProcessId ());
-
- SetThreadPriority (hMainThread, 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 (title_mutex);
-
- /* prevent recursive exception handling */
- char* rawenv = GetEnvironmentStrings () ;
- for (char* p = rawenv; *p != '\0'; p = strchr (p, '\0') + 1)
- {
- if (strncmp (p, "CYGWIN=", sizeof ("CYGWIN=") - 1) == 0)
- {
- char* q = strstr (p, "error_start") ;
- /* replace 'error_start=...' with '_rror_start=...' */
- if (q) *q = '_' ;
- SetEnvironmentVariable ("CYGWIN", p + sizeof ("CYGWIN=")) ;
- break ;
- }
- }
-
- 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
- {
- SetThreadPriority (hMainThread, THREAD_PRIORITY_IDLE);
- if (!waitloop)
- return 1;
- while (!being_debugged ())
- /* spin */;
- Sleep (4000);
- small_printf ("*** continuing from debugger call\n");
- }
-
- /* FIXME: need to know handles of all running threads to
- resume_all_threads_except (current_thread_id);
- */
- return 0;
-}
-
-/* Main exception handler. */
-
-static int
-handle_exceptions (EXCEPTION_RECORD *e, void *, CONTEXT *in, void *)
-{
- int sig;
- static int NO_COPY debugging = 0;
- static int NO_COPY recursed = 0;
-
- 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)
- return 1;
-
- /* Coerce win32 value to posix value. */
- switch (e->ExceptionCode)
- {
- case STATUS_FLOAT_DENORMAL_OPERAND:
- case STATUS_FLOAT_DIVIDE_BY_ZERO:
- case STATUS_FLOAT_INEXACT_RESULT:
- case STATUS_FLOAT_INVALID_OPERATION:
- case STATUS_FLOAT_OVERFLOW:
- case STATUS_FLOAT_STACK_CHECK:
- case STATUS_FLOAT_UNDERFLOW:
- case STATUS_INTEGER_DIVIDE_BY_ZERO:
- case STATUS_INTEGER_OVERFLOW:
- sig = SIGFPE;
- break;
-
- case STATUS_ILLEGAL_INSTRUCTION:
- case STATUS_PRIVILEGED_INSTRUCTION:
- case STATUS_NONCONTINUABLE_EXCEPTION:
- sig = SIGILL;
- break;
-
- case STATUS_TIMEOUT:
- sig = SIGALRM;
- break;
-
- case STATUS_ACCESS_VIOLATION:
- case STATUS_DATATYPE_MISALIGNMENT:
- case STATUS_ARRAY_BOUNDS_EXCEEDED:
- case STATUS_GUARD_PAGE_VIOLATION:
- case STATUS_IN_PAGE_ERROR:
- case STATUS_NO_MEMORY:
- case STATUS_INVALID_DISPOSITION:
- case STATUS_STACK_OVERFLOW:
- sig = SIGSEGV;
- break;
-
- case STATUS_CONTROL_C_EXIT:
- sig = 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;
- }
-
- 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", sig, in->Eip);
-
- if (myself->getsig (sig).sa_mask & SIGTOMASK (sig))
- syscall_printf ("signal %d, masked %p", sig, myself->getsig (sig).sa_mask);
-
- debug_printf ("In cygwin_except_handler calling %p",
- myself->getsig (sig).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 (!myself->progname[0]
- || GetCurrentThreadId () == sigtid
- || (void *) myself->getsig (sig).sa_handler == (void *) SIG_DFL
- || (void *) myself->getsig (sig).sa_handler == (void *) SIG_IGN
- || (void *) myself->getsig (sig).sa_handler == (void *) SIG_ERR)
- {
- /* Print the exception to the console */
- if (e)
- {
- for (int i = 0; status_info[i].name; i++)
- {
- if (status_info[i].code == e->ExceptionCode)
- {
- if (!myself->ppid_handle)
- 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 = 1;
- return 0;
- }
-
- open_stackdumpfile ();
- exception (e, in);
- stackdump ((DWORD) ebp, 0, 1);
- }
-
- signal_exit (0x80 | sig); // Flag signal + core dump
- }
-
- sig_send (NULL, sig, (DWORD) ebp, 1); // Signal myself
- return 0;
-}
-#endif /* __i386__ */
-
-#ifndef HAVE_STACK_TRACE
-void
-stack (void)
-{
- system_printf ("Stack trace not yet supported on this machine.");
-}
-#endif
-
-/* Utilities to call a user supplied exception handler. */
-
-#define SIG_NONMASKABLE (SIGTOMASK (SIGKILL) | SIGTOMASK (SIGSTOP))
-
-#ifdef __i386__
-#define HAVE_CALL_HANDLER
-
-/* 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)
-{
- sig_dispatch_pending (0);
- sigframe thisframe (mainthread);
- sigset_t oldmask = myself->getsigmask (); // Remember for restoration
-
- set_process_mask (tempmask & ~SIG_NONMASKABLE);// Let signals we're
- // interested in through.
- sigproc_printf ("old mask %x, new mask %x", oldmask, tempmask);
-
- WaitForSingleObject (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. */
-
- sigsave.oldmask = oldmask; // Will be restored by signal handler
- return -1;
-}
-
-extern DWORD exec_exit; // Possible exit value for exec
-extern int pending_signals;
-
-extern "C" {
-static void
-sig_handle_tty_stop (int sig)
-{
- /* Silently ignore attempts to suspend if there is no accomodating
- cygwin parent to deal with this behavior. */
- if (!myself->ppid_handle)
- {
- myself->process_state &= ~PID_STOPPED;
- return;
- }
-
- myself->stopsig = sig;
- /* See if we have a living parent. If so, send it a special signal.
- * It will figure out exactly which pid has stopped by scanning
- * its list of subprocesses.
- */
- if (my_parent_is_alive ())
- {
- pinfo parent (myself->ppid);
- if (!(parent->getsig (SIGCHLD).sa_flags & SA_NOCLDSTOP))
- sig_send (parent, SIGCHLD);
- }
- sigproc_printf ("process %d stopped by signal %d, myself->ppid_handle %p",
- myself->pid, sig, myself->ppid_handle);
- if (WaitForSingleObject (sigCONT, INFINITE) != WAIT_OBJECT_0)
- api_fatal ("WaitSingleObject failed, %E");
- (void) ResetEvent (sigCONT);
- return;
-}
-}
-
-int
-interruptible (DWORD pc, int testvalid = 0)
-{
- int res;
- MEMORY_BASIC_INFORMATION m;
-
- memset (&m, 0, sizeof m);
- if (!VirtualQuery ((LPCVOID) pc, &m, sizeof m))
- sigproc_printf ("couldn't get memory info, pc %p, %E", pc);
-
- 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 = 0;
- else if (testvalid)
- res = 1; /* All we wanted to know was if this was a valid module. */
- else if (h == user_data->hmodule)
- res = 1;
- else if (h == cygwin_hmodule)
- res = 0;
- else if (!GetModuleFileName (h, checkdir, windows_system_directory_length + 2))
- res = 0;
- else
- res = !strncasematch (windows_system_directory, checkdir,
- windows_system_directory_length);
- sigproc_printf ("pc %p, h %p, interruptible %d, testvalid %d", pc, h, res, testvalid);
-# undef h
- return res;
-}
-
-bool
-sigthread::get_winapi_lock (int test)
-{
- if (test)
- return !InterlockedExchange (&winapi_lock, 1);
-
- /* Need to do a busy loop because we can't block or a potential SuspendThread
- will hang. */
- while (InterlockedExchange (&winapi_lock, 1))
- low_priority_sleep (0);
- return 1;
-}
-
-void
-sigthread::release_winapi_lock ()
-{
- /* Assumes that we have the lock. */
- InterlockedExchange (&winapi_lock, 0);
-}
-
-static void __stdcall interrupt_setup (int sig, void *handler, DWORD retaddr,
- DWORD *retaddr_on_stack,
- struct sigaction& siga)
- __attribute__((regparm(3)));
-static void __stdcall
-interrupt_setup (int sig, void *handler, DWORD retaddr, DWORD *retaddr_on_stack,
- struct sigaction& siga)
-{
- sigsave.retaddr = retaddr;
- sigsave.retaddr_on_stack = retaddr_on_stack;
- /* FIXME: Not multi-thread aware */
- sigsave.oldmask = myself->getsigmask ();
- sigsave.newmask = sigsave.oldmask | siga.sa_mask | SIGTOMASK (sig);
- sigsave.sa_flags = siga.sa_flags;
- sigsave.func = (void (*)(int)) handler;
- sigsave.sig = sig;
- sigsave.saved_errno = -1; // Flag: no errno to save
- if (handler == sig_handle_tty_stop)
- {
- myself->stopsig = 0;
- myself->process_state |= PID_STOPPED;
- }
- /* Clear any waiting threads prior to dispatching to handler function */
- proc_subproc (PROC_CLEARWAIT, 1);
- int res = SetEvent (signal_arrived); // For an EINTR case
- sigproc_printf ("armed signal_arrived %p, res %d", signal_arrived, res);
-}
-
-static bool interrupt_now (CONTEXT *, int, void *, struct sigaction&) __attribute__((regparm(3)));
-static bool
-interrupt_now (CONTEXT *ctx, int sig, void *handler, struct sigaction& siga)
-{
- interrupt_setup (sig, handler, ctx->Eip, 0, siga);
- ctx->Eip = (DWORD) sigdelayed;
- SetThreadContext (myself->getthread2signal (), ctx); /* Restart the thread in a new location */
- return 1;
-}
-
-void __stdcall
-signal_fixup_after_fork ()
-{
- if (sigsave.sig)
- {
- sigsave.sig = 0;
- if (sigsave.retaddr_on_stack)
- {
- *sigsave.retaddr_on_stack = sigsave.retaddr;
- set_process_mask (sigsave.oldmask);
- }
- }
- sigproc_init ();
-}
-
-void __stdcall
-signal_fixup_after_exec (bool isspawn)
-{
- /* Set up child's signal handlers */
- for (int i = 0; i < NSIG; i++)
- {
- myself->getsig (i).sa_mask = 0;
- if (myself->getsig (i).sa_handler != SIG_IGN || isspawn)
- myself->getsig (i).sa_handler = SIG_DFL;
- }
-}
-
-static int interrupt_on_return (sigthread *, int, void *, struct sigaction&) __attribute__((regparm(3)));
-static int
-interrupt_on_return (sigthread *th, int sig, void *handler, struct sigaction& siga)
-{
- int i;
- DWORD ebp = th->frame;
-
- if (!ebp)
- return 0;
-
- thestack.init (ebp, 0, 1); /* Initialize from the input CONTEXT */
- for (i = 0; i < 32 && thestack++ ; i++)
- if (th->exception || interruptible (thestack.sf.AddrReturn.Offset))
- {
- DWORD *addr_retaddr = ((DWORD *)thestack.sf.AddrFrame.Offset) + 1;
- if (*addr_retaddr == thestack.sf.AddrReturn.Offset)
- {
- interrupt_setup (sig, handler, *addr_retaddr, addr_retaddr, siga);
- *addr_retaddr = (DWORD) sigdelayed;
- }
- return 1;
- }
-
- sigproc_printf ("couldn't find a stack frame, i %d", i);
- return 0;
-}
-
-extern "C" void __stdcall
-set_sig_errno (int e)
-{
- set_errno (e);
- sigsave.saved_errno = e;
- // sigproc_printf ("errno %d", e);
-}
-
-static int setup_handler (int, void *, struct sigaction&) __attribute__((regparm(3)));
-static int
-setup_handler (int sig, void *handler, struct sigaction& siga)
-{
- CONTEXT cx;
- bool interrupted = false;
- sigthread *th = NULL; // Initialization needed to shut up gcc
- int prio = INFINITE;
-
- if (sigsave.sig)
- goto set_pending;
-
- for (int i = 0; i < CALL_HANDLER_RETRY; i++)
- {
- DWORD res;
- HANDLE hth;
-
- EnterCriticalSection (&mainthread.lock);
- if (mainthread.frame)
- {
- hth = NULL;
- th = &mainthread;
- }
- else
- {
- LeaveCriticalSection (&mainthread.lock);
-
- if (!mainthread.get_winapi_lock (1))
- continue;
-
- hth = myself->getthread2signal ();
- th = NULL;
-
- /* Suspend the thread which will receive the signal. But first ensure that
- this thread doesn't have any mutos. (FIXME: Someday we should just grab
- all of the mutos rather than checking for them)
- 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. */
-
- EnterCriticalSection (&mainthread.lock);
- sigproc_printf ("suspending mainthread");
- res = SuspendThread (hth);
- /* Just release the lock now since we hav suspended the main thread and it
- definitely can't be grabbing it now. This will have to change, of course,
- if/when we can send signals to other than the main thread. */
- LeaveCriticalSection (&mainthread.lock);
-
- /* Just set pending if thread is already suspended */
- if (res)
- {
- (void) ResumeThread (hth);
- break;
- }
-
- mainthread.release_winapi_lock ();
- if (mainthread.frame)
- goto resume_thread; /* We just got the frame. What are the odds?
- Just loop and we'll hopefully pick it up on
- the next pass through. */
-
- muto *m;
- /* FIXME: Make multi-thread aware */
- for (m = muto_start.next; m != NULL; m = m->next)
- if (m->unstable () || m->owner () == mainthread.id)
- {
- sigproc_printf ("suspended thread owns a muto (%s)", m->name);
- goto resume_thread;
- }
-
- if (mainthread.frame)
- th = &mainthread;
- else
- {
- cx.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
- if (!GetThreadContext (hth, &cx))
- {
- system_printf ("couldn't get context of main thread, %E");
- goto resume_thread;
- }
- }
- }
-
- if ((DWORD) prio != INFINITE)
- {
- /* Reset the priority so we can finish this off quickly. */
- SetThreadPriority (GetCurrentThread (), WAIT_SIG_PRIORITY);
- prio = INFINITE;
- }
-
- if (th)
- {
- interrupted = interrupt_on_return (th, sig, handler, siga);
- LeaveCriticalSection (&th->lock);
- }
- else if (interruptible (cx.Eip))
- interrupted = interrupt_now (&cx, sig, handler, siga);
-
- resume_thread:
- if (hth)
- res = ResumeThread (hth);
-
- if (interrupted)
- break;
-
- if ((DWORD) prio != INFINITE && !mainthread.frame)
- prio = low_priority_sleep (SLEEP_0_STAY_LOW);
- sigproc_printf ("couldn't interrupt. trying again.");
- }
-
- set_pending:
- if (interrupted)
- {
- if ((DWORD) prio != INFINITE)
- SetThreadPriority (GetCurrentThread (), WAIT_SIG_PRIORITY);
- sigproc_printf ("signal successfully delivered");
- }
- else
- {
- pending_signals = 1; /* FIXME: Probably need to be more tricky here */
- sig_set_pending (sig);
- sig_dispatch_pending (1);
- low_priority_sleep (SLEEP_0_STAY_LOW); /* Hopefully, other process will be waking up soon. */
- sigproc_printf ("couldn't send signal %d", sig);
- }
-
- sigproc_printf ("returning %d", interrupted);
- return interrupted;
-}
-#endif /* i386 */
-
-#ifndef HAVE_CALL_HANDLER
-#error "Need to supply machine dependent setup_handler"
-#endif
-
-/* Keyboard interrupt handler. */
-static BOOL WINAPI
-ctrl_c_handler (DWORD type)
-{
- if (type == CTRL_LOGOFF_EVENT)
- return TRUE;
-
- /* 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)
- {
- sig_send (NULL, SIGTERM);
- return FALSE;
- }
- if (type == CTRL_CLOSE_EVENT)
- {
- sig_send (NULL, SIGHUP);
- return FALSE;
- }
-
- /* 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. */
- {
- t->last_ctrl_c = GetTickCount ();
- kill (-myself->pid, SIGINT);
- t->last_ctrl_c = GetTickCount ();
- return TRUE;
- }
-
- return TRUE;
-}
-
-/* Set the signal mask for this process.
- Note that some signals are unmaskable, as in UNIX. */
-extern "C" void __stdcall
-set_process_mask (sigset_t newmask)
-{
- sigframe thisframe (mainthread);
- mask_sync->acquire (INFINITE);
- sigset_t oldmask = myself->getsigmask ();
- newmask &= ~SIG_NONMASKABLE;
- sigproc_printf ("old mask = %x, new mask = %x", myself->getsigmask (), newmask);
- myself->setsigmask (newmask); // Set a new mask
- mask_sync->release ();
- if (oldmask != newmask && GetCurrentThreadId () != sigtid)
- sig_dispatch_pending ();
- else
- sigproc_printf ("not calling sig_dispatch_pending. sigtid %p current %p",
- sigtid, GetCurrentThreadId ());
- return;
-}
-
-int __stdcall
-sig_handle (int sig, bool thisproc)
-{
- int rc = 0;
-
- sigproc_printf ("signal %d", sig);
-
- struct sigaction thissig = myself->getsig (sig);
- void *handler = (void *) thissig.sa_handler;
-
- myself->rusage_self.ru_nsignals++;
-
- /* Clear pending SIGCONT on stop signals */
- if (sig == SIGSTOP || sig == SIGTSTP || sig == SIGTTIN || sig == SIGTTOU)
- sig_clear (SIGCONT);
-
- if (sig == SIGKILL)
- goto exit_sig;
-
- if (sig == SIGSTOP)
- goto stop;
-
- /* FIXME: Should we still do this if SIGCONT has a handler? */
- if (sig == SIGCONT)
- {
- DWORD stopped = 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);
- if (stopped)
- SetEvent (sigCONT);
- /* process pending signals */
- sig_dispatch_pending (1);
- }
-
-#if 0
- char sigmsg[24];
- __small_sprintf (sigmsg, "cygwin: signal %d\n", sig);
- OutputDebugString (sigmsg);
-#endif
-
- if (handler == (void *) SIG_DFL)
- {
- if (sig == SIGCHLD || sig == SIGIO || sig == SIGCONT || sig == SIGWINCH
- || sig == SIGURG || (thisproc && hExeced && sig == SIGINT))
- {
- sigproc_printf ("default signal %d ignored", sig);
- goto done;
- }
-
- if (sig == SIGTSTP || sig == SIGTTIN || sig == SIGTTOU)
- goto stop;
-
- goto exit_sig;
- }
-
- if (handler == (void *) SIG_IGN)
- {
- sigproc_printf ("signal %d ignored", sig);
- goto done;
- }
-
- if (handler == (void *) SIG_ERR)
- goto exit_sig;
-
- goto dosig;
-
- stop:
- /* Eat multiple attempts to STOP */
- if (ISSTATE (myself, PID_STOPPED))
- goto done;
- handler = (void *) sig_handle_tty_stop;
- thissig = myself->getsig (SIGSTOP);
-
- dosig:
- /* Dispatch to the appropriate function. */
- sigproc_printf ("signal %d, about to call %p", sig, handler);
- rc = setup_handler (sig, handler, thissig);
-
- done:
- sigproc_printf ("returning %d", rc);
- return rc;
-
- exit_sig:
- if (sig == SIGQUIT || sig == SIGABRT)
- {
- CONTEXT c;
- c.ContextFlags = CONTEXT_FULL;
- GetThreadContext (hMainThread, &c);
- if (!try_to_debug ())
- stackdump (c.Ebp, 1, 1);
- sig |= 0x80;
- }
- sigproc_printf ("signal %d, about to call do_exit", sig);
- signal_exit (sig);
- /* Never returns */
-}
-
-CRITICAL_SECTION NO_COPY exit_lock;
-
-/* 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. */
-static void
-signal_exit (int rc)
-{
- EnterCriticalSection (&exit_lock);
- rc = EXIT_SIGNAL | (rc << 8);
- if (exit_already++)
- myself->exit (rc);
-
- /* We'd like to stop the main thread from executing but when we do that it
- causes random, inexplicable hangs. So, instead, we set up the priority
- of this thread really high so that it should do its thing and then exit. */
- (void) SetThreadPriority (hMainThread, THREAD_PRIORITY_IDLE);
- (void) SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
-
- /* Unlock any main thread mutos since we're executing with prejudice. */
- muto *m;
- for (m = muto_start.next; m != NULL; m = m->next)
- if (m->unstable () || m->owner () == mainthread.id)
- m->reset ();
-
- user_data->resourcelocks->Delete ();
- user_data->resourcelocks->Init ();
-
- if (hExeced)
- TerminateProcess (hExeced, rc);
-
- sigproc_printf ("about to call do_exit (%x)", rc);
- (void) SetEvent (signal_arrived);
- do_exit (rc);
-}
-
-HANDLE NO_COPY title_mutex = NULL;
-
-void
-events_init (void)
-{
- char *name;
- /* title_mutex protects modification of console title. It's necessary
- while finding console window handle */
-
- if (!(title_mutex = CreateMutex (&sec_all_nih, FALSE,
- name = shared_name ("title_mutex", 0))))
- api_fatal ("can't create title mutex '%s', %E", name);
-
- ProtectHandle (title_mutex);
- new_muto (mask_sync);
- windows_system_directory[0] = '\0';
- (void) 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);
- debug_printf ("cygwin_hmodule %p", cygwin_hmodule);
- InitializeCriticalSection (&exit_lock);
-}
-
-void
-events_terminate (void)
-{
- exit_already = 1;
-}
-
-extern "C" {
-static int __stdcall
-call_signal_handler_now ()
-{
- if (!sigsave.sig)
- {
- sigproc_printf ("call_signal_handler_now called when no signal active");
- return 0;
- }
-
- int sa_flags = sigsave.sa_flags;
- sigproc_printf ("sa_flags %p", sa_flags);
- *sigsave.retaddr_on_stack = sigsave.retaddr;
- sigdelayed0 ();
- return sa_flags & SA_RESTART;
-}
-/* This kludge seems to keep a copy of call_signal_handler_now around
- even when compiling with -finline-functions. */
-static int __stdcall call_signal_handler_now_dummy ()
- __attribute__((alias ("call_signal_handler_now")));
-};
-
-int
-sigframe::call_signal_handler ()
-{
- return unregister () ? call_signal_handler_now () : 0;
-}
-
-#define pid_offset (unsigned)(((_pinfo *)NULL)->pid)
-extern "C" {
-void __stdcall
-reset_signal_arrived ()
-{
- (void) ResetEvent (signal_arrived);
- sigproc_printf ("reset signal_arrived");
-}
-
-static void unused_sig_wrapper () __attribute__((const, unused));
-
-#undef errno
-#define errno ((DWORD volatile) _impure_ptr) + (((char *) &_impure_ptr->_errno) - ((char *) _impure_ptr))
-
-static void
-unused_sig_wrapper ()
-{
-/* Signal cleanup stuff. Cleans up stack (too bad that we didn't
- prototype signal handlers as __stdcall), calls _set_process_mask
- to restore any mask, restores any potentially clobbered registers
- and returns to original caller. */
-__asm__ volatile ("\n\
- .text \n\
-_sigreturn: \n\
- addl $4,%%esp # Remove argument \n\
- movl %%esp,%%ebp \n\
- addl $36,%%ebp \n\
- call _set_process_mask@4 \n\
- \n\
- cmpl $0,%4 # Did a signal come in? \n\
- jz 1f # No, if zero \n\
- call _call_signal_handler_now@0 # yes handle the signal \n\
- \n\
-1: popl %%eax # saved errno \n\
- testl %%eax,%%eax # Is it < 0 \n\
- jl 2f # yup. ignore it \n\
- movl %1,%%ebx \n\
- movl %%eax,(%%ebx) \n\
-2: popl %%eax \n\
- popl %%ebx \n\
- popl %%ecx \n\
- popl %%edx \n\
- popl %%edi \n\
- popl %%esi \n\
- popf \n\
- popl %%ebp \n\
- ret \n\
- \n\
-__no_sig_start: \n\
-_sigdelayed: \n\
- pushl %2 # original return address \n\
-_sigdelayed0: \n\
- pushl %%ebp \n\
- movl %%esp,%%ebp \n\
- pushf \n\
- pushl %%esi \n\
- pushl %%edi \n\
- pushl %%edx \n\
- pushl %%ecx \n\
- pushl %%ebx \n\
- pushl %%eax \n\
- pushl %6 # saved errno \n\
- pushl %3 # oldmask \n\
- pushl %4 # signal argument \n\
- pushl $_sigreturn \n\
- \n\
- call _reset_signal_arrived@0 \n\
- pushl %5 # signal number \n\
- pushl %7 # newmask \n\
- movl $0,%0 # zero the signal number as a \n\
- # flag to the signal handler thread\n\
- # that it is ok to set up sigsave\n\
- \n\
- call _set_process_mask@4 \n\
- popl %%eax \n\
- jmp *%%eax \n\
-__no_sig_end: \n\
-" : "=m" (sigsave.sig): "X" ((char *) &_impure_ptr->_errno),
- "g" (sigsave.retaddr), "g" (sigsave.oldmask), "g" (sigsave.sig),
- "g" (sigsave.func), "g" (sigsave.saved_errno), "g" (sigsave.newmask)
-);
-}
-}
diff --git a/winsup/cygwin/exec.cc b/winsup/cygwin/exec.cc
deleted file mode 100644
index f0288dc93..000000000
--- a/winsup/cygwin/exec.cc
+++ /dev/null
@@ -1,103 +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 <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <process.h>
-#include "perprocess.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "pinfo.h"
-#include "environ.h"
-#include "cygerrno.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);
-}
-
-extern "C" int _execve (const char *, char *const [], char *const [])
- __attribute__ ((alias ("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 <nul> 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 582bb2add..000000000
--- a/winsup/cygwin/external.cc
+++ /dev/null
@@ -1,253 +0,0 @@
-/* external.cc: Interface to Cygwin internals from external programs.
-
- Copyright 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
-
- Written by Christopher Faylor <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. */
-
-#include "winsup.h"
-#include <errno.h>
-#include "security.h"
-#include "fhandler.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include <exceptions.h>
-#include "shared_info.h"
-#include "cygwin_version.h"
-#include "perprocess.h"
-#include "cygerrno.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "wincap.h"
-#include "heap.h"
-#include "cygthread.h"
-
-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 winpids pids (0);
-
- 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.hProcess = p->hProcess;
- 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[MAX_PATH];
- char system_flags[MAX_PATH];
- DWORD res = get_cygdrive_info (user, system, user_flags, system_flags);
- return res;
-}
-
-extern "C" DWORD
-cygwin_internal (cygwin_getinfo_types t, ...)
-{
- va_list arg;
- va_start (arg, t);
- if (t != CW_USER_DATA)
- {
- wincap.init ();
- if (!myself)
- {
- memory_init ();
- malloc_init ();
- set_myself (1);
- }
- }
-
- 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:
- 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:
- {
- const char *cr = va_arg (arg, char *);
- if (check_null_empty_str_errno (cr))
- return (DWORD) NULL;
- cygheap->cygwin_regname = (char *) crealloc (cygheap->cygwin_regname,
- strlen (cr) + 1);
- strcpy (cygheap->cygwin_regname, cr);
- }
- case CW_GET_CYGWIN_REGISTRY_NAME:
- return (DWORD) cygheap->cygwin_regname;
-
- 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);
- }
- default:
- return (DWORD) -1;
- }
-}
diff --git a/winsup/cygwin/external.sgml b/winsup/cygwin/external.sgml
deleted file mode 100644
index 270eede4d..000000000
--- a/winsup/cygwin/external.sgml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-<sect1 id="func-cygwin-internal">
-<title>cygwin_internal</title>
-
-<funcsynopsis>
-<funcdef>extern "C" DWORD
-<function>cygwin_internal</function></funcdef>
-<paramdef>cygwin_getinfo_types <parameter>t</parameter></paramdef>
-<paramdef><parameter>...</parameter></paramdef>
-</funcsynopsis>
-
-<para>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.</para>
-<para>Stay away unless you know what you're doing.</para>
-
-</sect1>
-
diff --git a/winsup/cygwin/fcntl.cc b/winsup/cygwin/fcntl.cc
deleted file mode 100644
index 0ba704991..000000000
--- a/winsup/cygwin/fcntl.cc
+++ /dev/null
@@ -1,49 +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 <stdarg.h>
-#include <errno.h>
-#include <unistd.h>
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygerrno.h"
-#include "cygheap.h"
-#include "thread.h"
-
-extern "C"
-int
-_fcntl (int fd, int cmd,...)
-{
- void *arg = NULL;
- va_list args;
- int res;
-
- cygheap_fdget cfd (fd, true);
- if (cfd < 0)
- {
- res = -1;
- goto done;
- }
-
- va_start (args, cmd);
- arg = va_arg (args, void *);
- if (cmd != F_DUPFD)
- res = cfd->fcntl(cmd, arg);
- else
- res = dup2 (fd, cygheap_fdnew (((int) arg) - 1));
- va_end (args);
-
-done:
- syscall_printf ("%d = fcntl (%d, %d, %p)", res, fd, cmd, arg);
- return res;
-}
diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc
deleted file mode 100644
index b9d6a1236..000000000
--- a/winsup/cygwin/fhandler.cc
+++ /dev/null
@@ -1,1311 +0,0 @@
-/* fhandler.cc. See console.cc for fhandler_console functions.
-
- 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 <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/cygwin.h>
-#include <sys/uio.h>
-#include <signal.h>
-#include "cygerrno.h"
-#include "perprocess.h"
-#include "security.h"
-#include "cygwin/version.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "shared_info.h"
-#include "pinfo.h"
-#include <assert.h>
-#include <limits.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);
- unix_path_name = x.unix_path_name ? cstrdup (x.unix_path_name) : NULL;
- win32_path_name = x.win32_path_name ? cstrdup (x.win32_path_name) : NULL;
- 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 ((*s || (len != (size_t) -1 && 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.
- Filenames are used mostly for debugging messages, and it's hoped that
- in cases where the name is really required, the filename wouldn't ever
- be too long (e.g. devices or some such).
- The unix_path_name is also used by virtual fhandlers. */
-void
-fhandler_base::set_name (const char *unix_path, const char *win32_path, int unit)
-{
- if (unix_path == NULL || !*unix_path)
- return;
-
- if (win32_path)
- win32_path_name = cstrdup (win32_path);
- else
- {
- const char *fmt = get_native_name ();
- char *w = (char *) cmalloc (HEAP_STR, strlen (fmt) + 16);
- __small_sprintf (w, fmt, unit);
- win32_path_name = w;
- }
-
- if (win32_path_name == NULL)
- {
- system_printf ("fatal error. strdup failed");
- exit (ENOMEM);
- }
-
- assert (unix_path_name == NULL);
- /* FIXME: This isn't really right. It ignores the first argument if we're
- building names for a device and just converts the device name from the
- win32 name since it has theoretically been previously detected by
- path_conv. Ideally, we should pass in a format string and build the
- unix_path, too. */
- if (!is_device () || *win32_path_name != '\\')
- unix_path_name = unix_path;
- else
- {
- char *p = cstrdup (win32_path_name);
- unix_path_name = p;
- while ((p = strchr (p, '\\')) != NULL)
- *p++ = '/';
- if (unix_path)
- cfree ((void *) unix_path);
- }
-
- if (unix_path_name == NULL)
- {
- system_printf ("fatal error. strdup failed");
- exit (ENOMEM);
- }
- namehash = hash_path_name (0, win32_path_name);
-}
-
-/* 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 (upper1 != 0xffffffff || 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 (get_r_binset () && get_w_binset ())
- bin = get_r_binary () ? 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 = get_w_binary () || get_r_binary () || (binmode != O_TEXT)
- ? O_BINARY : O_TEXT;
-
- openflags = flags | bin;
-
- bin &= O_BINARY;
- set_r_binary (bin);
- set_w_binary (bin);
- 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 ((ssize_t) ulen)
-
- HANDLE h = NULL; /* grumble */
- int prio = 0; /* ditto */
- DWORD len = ulen;
-
- (ssize_t) ulen = -1;
- if (read_state)
- {
- h = GetCurrentThread ();
- prio = GetThreadPriority (h);
- (void) SetThreadPriority (h, THREAD_PRIORITY_TIME_CRITICAL);
- SetEvent (read_state);
- }
- BOOL res = ReadFile (get_handle (), ptr, len, (DWORD *) &ulen, 0);
- if (read_state)
- {
- SetEvent (read_state);
- (void) 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 = -1;
- break;
- }
- default:
- syscall_printf ("ReadFile %s failed, %E", unix_path_name);
- __seterrno_from_win_error (errcode);
- bytes_read = -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_handle (), ptr, len, &bytes_written, 0))
- {
- if (GetLastError () == ERROR_DISK_FULL && bytes_written > 0)
- return bytes_written;
- __seterrno ();
- if (get_errno () == EPIPE)
- raise (SIGPIPE);
- return -1;
- }
- return bytes_written;
-}
-
-#define ACCFLAGS(x) (x & (O_RDONLY | O_WRONLY | O_RDWR))
-int
-fhandler_base::get_default_fmode (int flags)
-{
- int fmode = __fmode;
- if (perfile_table)
- {
- size_t nlen = strlen (get_name ());
- unsigned accflags = ACCFLAGS (flags);
- for (__cygwin_perfile *pf = perfile_table; pf->name; pf++)
- if (!*pf->name && ACCFLAGS (pf->flags) == accflags)
- {
- fmode = pf->flags & ~(O_RDONLY | O_WRONLY | O_RDWR);
- 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 (ACCFLAGS (pf->flags) == accflags && strcasematch (stem, pf->name))
- {
- fmode = pf->flags & ~(O_RDONLY | O_WRONLY | O_RDWR);
- break;
- }
- }
- }
- return fmode;
-}
-
-/* Open system call handler function. */
-int
-fhandler_base::open (path_conv *pc, 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) query_open %d", get_win32_name (), flags, get_query_open ());
-
- if (get_win32_name () == NULL)
- {
- set_errno (ENOENT);
- goto done;
- }
-
- if (get_query_open ())
- access = 0;
- else if (get_device () == FH_TAPE)
- access = GENERIC_READ | GENERIC_WRITE;
- else if ((flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_RDONLY)
- access = GENERIC_READ;
- else if ((flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_WRONLY)
- access = GENERIC_WRITE;
- else
- access = GENERIC_READ | GENERIC_WRITE;
-
- /* Allow reliable lseek on disk devices. */
- if (get_device () == FH_FLOPPY)
- access |= GENERIC_READ;
-
- /* FIXME: O_EXCL handling? */
-
- 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)
- set_append_p ();
-
- /* These flags are host dependent. */
- shared = wincap.shared ();
-
- file_attributes = FILE_ATTRIBUTE_NORMAL;
- if (flags & O_DIROPEN)
- file_attributes |= FILE_FLAG_BACKUP_SEMANTICS;
- if (get_device () == FH_SERIAL)
- file_attributes |= FILE_FLAG_OVERLAPPED;
-
-#ifdef HIDDEN_DOT_FILES
- if (flags & O_CREAT && get_device () == FH_DISK)
- {
- char *c = strrchr (get_win32_name (), '\\');
- if ((c && c[1] == '.') || *get_win32_name () == '.')
- file_attributes |= FILE_ATTRIBUTE_HIDDEN;
- }
-#endif
-
- /* CreateFile() with dwDesiredAccess == 0 when called on remote
- share returns some handle, even if file doesn't exist. This code
- works around this bug. */
- if (get_query_open () && isremote () &&
- creation_distribution == OPEN_EXISTING && pc && !pc->exists ())
- {
- set_errno (ENOENT);
- goto done;
- }
-
- /* 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;
-
- /* If the file should actually be created and ntsec is on,
- set files attributes. */
- if (flags & O_CREAT && get_device () == FH_DISK && allow_ntsec && has_acls ())
- set_security_attribute (mode, &sa, alloca (4096), 4096);
-
- x = CreateFile (get_win32_name (), access, shared, &sa, creation_distribution,
- file_attributes, 0);
-
- syscall_printf ("%p = CreateFile (%s, %p, %p, %p, %p, %p, 0)",
- x, get_win32_name (), access, shared, &sa,
- creation_distribution, file_attributes);
-
- if (x == INVALID_HANDLE_VALUE)
- {
- if (!wincap.can_open_directories () && pc && pc->isdir ())
- {
- if (flags & (O_CREAT | O_EXCL) == (O_CREAT | O_EXCL))
- set_errno (EEXIST);
- else if (flags & (O_WRONLY | O_RDWR))
- set_errno (EISDIR);
- else
- set_nohandle (true);
- }
- else if (GetLastError () == ERROR_INVALID_HANDLE)
- set_errno (ENOENT);
- else
- __seterrno ();
- if (!get_nohandle ())
- goto done;
- }
-
- /* 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 && get_device () == FH_DISK
- && GetLastError () != ERROR_ALREADY_EXISTS
- && !allow_ntsec && allow_ntea)
- set_file_attribute (has_acls (), get_win32_name (), mode);
-
- set_io_handle (x);
- set_flags (flags, pc ? pc->binmode () : 0);
-
- res = 1;
- set_open_status ();
-done:
- 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;
- bool need_signal = !!read_state;
- 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);
- need_signal = false;
- if (!copied_chars)
- /* nothing */;
- else if ((ssize_t) len > 0)
- len += copied_chars;
- else
- len = copied_chars;
-
- if (get_r_binary () || 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];
- /* >= 33 so space prints in hex */
- __small_sprintf (p, c >= 33 && c <= 127 ? " %c" : " %p", c);
- p += strlen (p);
- }
- debug_printf ("read %d bytes (%s%s)", copied_chars, buf,
- copied_chars > 16 ? " ..." : "");
- }
-#endif
-
-out:
- if (need_signal)
- SetEvent (read_state);
-
- debug_printf ("returning %d, %s mode", len,
- get_r_binary () ? "binary" : "text");
- return;
-}
-
-int
-fhandler_base::write (const void *ptr, size_t len)
-{
- int res;
-
- if (get_append_p ())
- SetFilePointer (get_handle (), 0, 0, FILE_END);
- else if (wincap.has_lseek_bug () && get_check_win95_lseek_bug ())
- {
- /* Note: this bug doesn't happen on NT4, even though the documentation
- for WriteFile() says that it *may* happen on any OS. */
- int actual_length, current_position;
- set_check_win95_lseek_bug (0); /* don't do it again */
- actual_length = GetFileSize (get_handle (), NULL);
- current_position = SetFilePointer (get_handle (), 0, 0, FILE_CURRENT);
- if (current_position > actual_length)
- {
- /* 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 */
- char zeros[512];
- int number_of_zeros_to_write = current_position - actual_length;
- memset (zeros, 0, 512);
- SetFilePointer (get_handle (), 0, 0, FILE_END);
- 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;
- if (!WriteFile (get_handle (), zeros, zeros_this_time, &written,
- NULL))
- {
- __seterrno ();
- if (get_errno () == EPIPE)
- raise (SIGPIPE);
- /* This might fail, but it's the best we can hope for */
- SetFilePointer (get_handle (), current_position, 0, FILE_BEGIN);
- return -1;
-
- }
- if (written < zeros_this_time) /* just in case */
- {
- set_errno (ENOSPC);
- /* This might fail, but it's the best we can hope for */
- SetFilePointer (get_handle (), current_position, 0, FILE_BEGIN);
- return -1;
- }
- number_of_zeros_to_write -= written;
- }
- }
- }
-
- if (get_w_binary ())
- {
- 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 */
- }
- }
-
- debug_printf ("%d = write (%p, %d)", res, ptr, len);
- return res;
-}
-
-ssize_t
-fhandler_base::readv (const struct iovec *const iov, const int iovcnt,
- ssize_t tot)
-{
- assert (iov);
- assert (iovcnt >= 1);
-
- if (iovcnt == 1)
- {
- size_t len = iov->iov_len;
- read (iov->iov_base, len);
- return 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 *buf = (char *) alloca (tot);
-
- if (!buf)
- {
- set_errno (ENOMEM);
- return -1;
- }
-
- read (buf, (size_t) tot);
-
- const struct iovec *iovptr = iov;
- int nbytes = tot;
-
- while (nbytes > 0)
- {
- const int frag = min (nbytes, (ssize_t) iovptr->iov_len);
- memcpy (iovptr->iov_base, buf, frag);
- buf += frag;
- iovptr += 1;
- nbytes -= frag;
- }
-
- return tot;
-}
-
-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 *) alloca (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;
- }
-
- return write (buf, tot);
-}
-
-__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)", unix_path_name, offset, whence);
-
- DWORD win32_whence = whence == SEEK_SET ? FILE_BEGIN
- : (whence == SEEK_CUR ? FILE_CURRENT : FILE_END);
-
- LONG off_low = offset & 0xffffffff;
- LONG *poff_high, off_high;
- if (!wincap.has_64bit_file_access ())
- poff_high = NULL;
- else
- {
- off_high = offset >> 32;
- 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 ();
- }
- else
- {
- /* 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 */
- set_check_win95_lseek_bug ();
-
- /* 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;
-}
-
-int
-fhandler_base::close ()
-{
- int res = -1;
-
- syscall_printf ("closing '%s' handle %p", get_name (), get_handle ());
- if (get_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)
-{
- if (cmd == FIONBIO)
- syscall_printf ("ioctl (FIONBIO, %p)", buf);
- else
- syscall_printf ("ioctl (%x, %p)", cmd, buf);
-
- set_errno (EINVAL);
- return -1;
-}
-
-int
-fhandler_base::lock (int, struct flock *)
-{
- set_errno (EINVAL);
- return -1;
-}
-
-extern "C" char * __stdcall
-rootdir (char *full_path)
-{
- /* Possible choices:
- * d:... -> d:/
- * \\server\share... -> \\server\share\
- * else current drive.
- */
- char *root = full_path;
-
- if (full_path[1] == ':')
- strcpy (full_path + 2, "\\");
- else if (full_path[0] == '\\' && full_path[1] == '\\')
- {
- char *cp = full_path + 2;
- while (*cp && *cp != '\\')
- cp++;
- if (!*cp)
- {
- set_errno (ENOTDIR);
- return NULL;
- }
- cp++;
- while (*cp && *cp != '\\')
- cp++;
- strcpy (cp, "\\");
- }
- else
- root = NULL;
-
- return root;
-}
-
-int __stdcall
-fhandler_base::fstat (struct __stat64 *buf, path_conv *)
-{
- debug_printf ("here");
- 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_FLOPPY:
- buf->st_mode = S_IFBLK | STD_RBITS | STD_WBITS | S_IWGRP | S_IWOTH;
- break;
- default:
- buf->st_mode = S_IFCHR | STD_RBITS | STD_WBITS | S_IWGRP | S_IWOTH;
- break;
- }
-
- 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, get_r_binary ());
-}
-
-void
-fhandler_base::dump (void)
-{
- paranoid_printf ("here");
-}
-
-int
-fhandler_base::dup (fhandler_base *child)
-{
- debug_printf ("in fhandler_base dup");
-
- HANDLE nh;
- if (!get_nohandle ())
- {
- if (!DuplicateHandle (hMainProc, get_handle (), hMainProc, &nh, 0, TRUE,
- DUPLICATE_SAME_ACCESS))
- {
- system_printf ("dup(%s) failed, handle %x, %E",
- get_name (), get_handle ());
- __seterrno ();
- return -1;
- }
-
- child->set_io_handle (nh);
- }
- return 0;
-}
-
-int fhandler_base::fcntl (int cmd, void *arg)
-{
- int res;
-
- switch (cmd)
- {
- case F_GETFD:
- res = get_close_on_exec () ? FD_CLOEXEC : 0;
- break;
- case F_SETFD:
- set_close_on_exec ((int) arg);
- 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 = O_NONBLOCK;
- set_flags ((get_flags () & ~allowed_flags) | new_flags);
- }
- res = 0;
- break;
- case F_GETLK:
- case F_SETLK:
- case F_SETLKW:
- res = lock (cmd, (struct flock *) 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 (void)
-{
- 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 (void)
-{
- set_errno (ENOTTY);
- return -1;
-}
-
-void
-fhandler_base::operator delete (void *p)
-{
- cfree (p);
- return;
-}
-
-/* Normal I/O constructor */
-fhandler_base::fhandler_base (DWORD devtype, int unit):
- status (devtype),
- access (0),
- io_handle (NULL),
- namehash (0),
- openflags (0),
- rabuf (NULL),
- ralen (0),
- raixget (0),
- raixput (0),
- rabuflen (0),
- unix_path_name (NULL),
- win32_path_name (NULL),
- open_status (0),
- read_state (NULL)
-{
-}
-
-/* Normal I/O destructor */
-fhandler_base::~fhandler_base (void)
-{
- if (unix_path_name != NULL)
- cfree ((void *) unix_path_name);
- if (win32_path_name != NULL)
- cfree ((void *) win32_path_name);
- if (rabuf)
- free (rabuf);
- unix_path_name = win32_path_name = NULL;
-}
-
-/**********************************************************************/
-/* /dev/null */
-
-fhandler_dev_null::fhandler_dev_null () :
- fhandler_base (FH_NULL)
-{
-}
-
-void
-fhandler_dev_null::dump (void)
-{
- paranoid_printf ("here");
-}
-
-void
-fhandler_base::set_inheritance (HANDLE &h, int not_inheriting)
-{
-#ifdef DEBUGGING_AND_FDS_PROTECTED
- HANDLE oh = h;
-#endif
- /* 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, h, hMainProc, &h, 0, !not_inheriting,
- DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
- debug_printf ("DuplicateHandle failed, %E");
-#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)
-{
- if (/* !is_socket () && */ !get_close_on_exec ())
- debug_printf ("handle %p already opened", h);
- else if (!DuplicateHandle (parent, h, hMainProc, &h, 0, !get_close_on_exec (),
- DUPLICATE_SAME_ACCESS))
- system_printf ("%s - %E, handle %s<%p>", get_name (), name, h);
-#ifdef DEBUGGING_AND_FDS_PROTECTED
- else if (get_close_on_exec ())
- ProtectHandle (h); /* would have to be fancier than this */
- else
- /* ProtectHandleINH (h) */; /* Should already be protected */
-#endif
-}
-
-void
-fhandler_base::set_close_on_exec (int val)
-{
- if (!get_nohandle ())
- set_inheritance (io_handle, val);
- set_close_on_exec_flag (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 (!get_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;
-}
-
-DIR *
-fhandler_base::opendir (path_conv&)
-{
- set_errno (ENOTDIR);
- return NULL;
-}
-
-struct dirent *
-fhandler_base::readdir (DIR *)
-{
- set_errno (ENOTDIR);
- return NULL;
-}
-
-__off64_t
-fhandler_base::telldir (DIR *)
-{
- set_errno (ENOTDIR);
- return -1;
-}
-
-void
-fhandler_base::seekdir (DIR *, __off64_t)
-{
- set_errno (ENOTDIR);
- return;
-}
-
-void
-fhandler_base::rewinddir (DIR *)
-{
- set_errno (ENOTDIR);
- return;
-}
-
-int
-fhandler_base::closedir (DIR *)
-{
- set_errno (ENOTDIR);
- return -1;
-}
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
deleted file mode 100644
index f0dde3722..000000000
--- a/winsup/cygwin/fhandler.h
+++ /dev/null
@@ -1,1250 +0,0 @@
-/* fhandler.h
-
- 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. */
-
-#ifndef _FHANDLER_H_
-#define _FHANDLER_H_
-
-#include <sys/ioctl.h>
-#include <fcntl.h>
-
-enum
-{
- FH_RBINARY = 0x00001000, /* binary read mode */
- FH_WBINARY = 0x00002000, /* binary write mode */
- FH_CLOEXEC = 0x00004000, /* close-on-exec */
- FH_RBINSET = 0x00008000, /* binary read mode has been explicitly set */
- FH_WBINSET = 0x00010000, /* binary write mode has been explicitly set */
- FH_APPEND = 0x00020000, /* always append */
- FH_ASYNC = 0x00040000, /* async I/O */
- FH_SIGCLOSE = 0x00080000, /* signal handler should close fd on interrupt */
-
- FH_SYMLINK = 0x00100000, /* is a symlink */
- FH_EXECABL = 0x00200000, /* file looked like it would run:
- * ends in .exe or .bat or begins with #! */
- FH_W95LSBUG = 0x00400000, /* set when lseek is called as a flag that
- * _write should check if we've moved beyond
- * EOF, zero filling if so. */
- FH_NOHANDLE = 0x00800000, /* No handle associated with fhandler. */
- FH_NOEINTR = 0x01000000, /* Set if I/O should be uninterruptible. */
- FH_FFIXUP = 0x02000000, /* Set if need to fixup after fork. */
- FH_LOCAL = 0x04000000, /* File is unix domain socket */
- FH_SHUTRD = 0x08000000, /* Socket saw a SHUT_RD */
- FH_SHUTWR = 0x10000000, /* Socket saw a SHUT_WR */
- FH_ISREMOTE = 0x10000000, /* File is on a remote drive */
- FH_DCEXEC = 0x20000000, /* Don't care if this is executable */
- FH_HASACLS = 0x40000000, /* True if fs of file has ACLS */
- FH_QUERYOPEN = 0x80000000, /* open file without requesting either read
- or write access */
-
- /* Device flags */
-
- /* Slow devices */
- FH_CONSOLE = 0x00000001, /* is a console */
- FH_CONIN = 0x00000002, /* console input */
- FH_CONOUT = 0x00000003, /* console output */
- FH_TTYM = 0x00000004, /* is a tty master */
- FH_TTYS = 0x00000005, /* is a tty slave */
- FH_PTYM = 0x00000006, /* is a pty master */
- FH_SERIAL = 0x00000007, /* is a serial port */
- FH_PIPE = 0x00000008, /* is a pipe */
- FH_PIPER = 0x00000009, /* read end of a pipe */
- FH_PIPEW = 0x0000000a, /* write end of a pipe */
- FH_SOCKET = 0x0000000b, /* is a socket */
- FH_WINDOWS = 0x0000000c, /* is a window */
- FH_SLOW = 0x00000010, /* "slow" device if below this */
-
- /* Fast devices */
- FH_DISK = 0x00000010, /* is a disk */
- FH_FLOPPY = 0x00000011, /* is a floppy */
- FH_TAPE = 0x00000012, /* is a tape */
- FH_NULL = 0x00000013, /* is the null device */
- FH_ZERO = 0x00000014, /* is the zero device */
- FH_RANDOM = 0x00000015, /* is a random device */
- FH_MEM = 0x00000016, /* is a mem device */
- FH_CLIPBOARD = 0x00000017, /* is a clipboard device */
- FH_OSS_DSP = 0x00000018, /* is a dsp audio device */
- FH_CYGDRIVE= 0x00000019, /* /cygdrive/x */
- FH_PROC = 0x0000001a, /* /proc */
- FH_REGISTRY =0x0000001b, /* /proc/registry */
- FH_PROCESS = 0x0000001c, /* /proc/<n> */
-
- FH_NDEV = 0x0000001d, /* Maximum number of devices */
- FH_DEVMASK = 0x00000fff, /* devices live here */
- FH_BAD = 0xffffffff
-};
-
-#define FHDEVN(n) ((n) & FH_DEVMASK)
-#define FHISSETF(x) __ISSETF (this, x, FH)
-#define FHSETF(x) __SETF (this, x, FH)
-#define FHCLEARF(x) __CLEARF (this, x, FH)
-#define FHCONDSETF(n, x) __CONDSETF(n, this, x, FH)
-
-#define FHSTATOFF 0
-
-/* 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)
-
-#define UNCONNECTED 0
-#define CONNECT_PENDING 1
-#define CONNECTED 2
-
-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 path_conv;
-class fhandler_disk_file;
-typedef struct __DIR DIR;
-struct dirent;
-struct iovec;
-
-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 executable_states
-{
- is_executable,
- dont_care_if_executable,
- not_executable = dont_care_if_executable,
- dont_know_if_executable
-};
-
-class fhandler_base
-{
- protected:
- DWORD status;
- private:
- int access;
- HANDLE io_handle;
-
- unsigned long namehash; /* hashed filename, used as inode num */
-
- protected:
- /* Full unix path name of this file */
- /* 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;
-
- const char *unix_path_name;
- const char *win32_path_name;
- DWORD open_status;
- HANDLE read_state;
-
- public:
- void set_name (const char * unix_path, const char *win32_path = NULL, int unit = 0);
-
- virtual fhandler_base& operator =(fhandler_base &x);
- fhandler_base (DWORD dev, int unit = 0);
- virtual ~fhandler_base ();
-
- /* Non-virtual simple accessor functions. */
- void set_io_handle (HANDLE x) { io_handle = x; }
-
- DWORD get_device () { return status & FH_DEVMASK; }
- virtual int get_unit () { return 0; }
- virtual BOOL is_slow () { return get_device () < FH_SLOW; }
-
- int get_access () { return access; }
- void set_access (int x) { access = x; }
-
- bool get_async () { return FHISSETF (ASYNC); }
- void set_async (int x) { FHCONDSETF (x, ASYNC); }
-
- int get_flags () { return openflags; }
- void set_flags (int x, int supplied_bin = 0);
-
- bool is_nonblocking ();
- void set_nonblocking (int yes);
-
- bool get_w_binary () { return FHISSETF (WBINSET) ? FHISSETF (WBINARY) : 1; }
- bool get_r_binary () { return FHISSETF (RBINSET) ? FHISSETF (RBINARY) : 1; }
-
- bool get_w_binset () { return FHISSETF (WBINSET); }
- bool get_r_binset () { return FHISSETF (RBINSET); }
-
- void set_w_binary (int b) { FHCONDSETF (b, WBINARY); FHSETF (WBINSET); }
- void set_r_binary (int b) { FHCONDSETF (b, RBINARY); FHSETF (RBINSET); }
- void clear_w_binary () {FHCLEARF (WBINARY); FHCLEARF (WBINSET); }
- void clear_r_binary () {FHCLEARF (RBINARY); FHCLEARF (RBINSET); }
-
- bool get_nohandle () { return FHISSETF (NOHANDLE); }
- void set_nohandle (int x) { FHCONDSETF (x, NOHANDLE); }
-
- void set_open_status () {open_status = status;}
- DWORD get_open_status () {return open_status;}
- void reset_to_open_binmode ()
- {
- set_flags ((get_flags () & ~(O_TEXT | O_BINARY))
- | ((open_status & (FH_WBINARY | FH_RBINARY)
- ? O_BINARY : O_TEXT)));
- }
-
- int get_default_fmode (int flags);
-
- bool get_r_no_interrupt () { return FHISSETF (NOEINTR); }
- void set_r_no_interrupt (bool b) { FHCONDSETF (b, NOEINTR); }
-
- bool get_close_on_exec () { return FHISSETF (CLOEXEC); }
- int set_close_on_exec_flag (int b) { return FHCONDSETF (b, CLOEXEC); }
-
- LPSECURITY_ATTRIBUTES get_inheritance (bool all = 0)
- {
- if (all)
- return get_close_on_exec () ? &sec_all_nih : &sec_all;
- else
- return get_close_on_exec () ? &sec_none_nih : &sec_none;
- }
-
- void set_check_win95_lseek_bug (int b = 1) { FHCONDSETF (b, W95LSBUG); }
- bool get_check_win95_lseek_bug () { return FHISSETF (W95LSBUG); }
-
- bool get_need_fork_fixup () { return FHISSETF (FFIXUP); }
- void set_need_fork_fixup () { FHSETF (FFIXUP); }
-
- virtual void set_close_on_exec (int val);
-
- virtual void fixup_before_fork_exec (DWORD) {}
- virtual void fixup_after_fork (HANDLE);
- virtual void fixup_after_exec (HANDLE) {}
-
- bool get_symlink_p () { return FHISSETF (SYMLINK); }
- void set_symlink_p (int val) { FHCONDSETF (val, SYMLINK); }
- void set_symlink_p () { FHSETF (SYMLINK); }
-
- bool get_socket_p () { return FHISSETF (LOCAL); }
- void set_socket_p (int val) { FHCONDSETF (val, LOCAL); }
- void set_socket_p () { FHSETF (LOCAL); }
-
- bool get_execable_p () { return FHISSETF (EXECABL); }
- void set_execable_p (executable_states val)
- {
- FHCONDSETF (val == is_executable, EXECABL);
- FHCONDSETF (val == dont_care_if_executable, DCEXEC);
- }
- void set_execable_p () { FHSETF (EXECABL); }
- bool dont_care_if_execable () { return FHISSETF (DCEXEC); }
- bool exec_state_isknown () { return FHISSETF (DCEXEC) || FHISSETF (EXECABL); }
-
- bool get_append_p () { return FHISSETF (APPEND); }
- void set_append_p (int val) { FHCONDSETF (val, APPEND); }
- void set_append_p () { FHSETF (APPEND); }
-
- bool get_query_open () { return FHISSETF (QUERYOPEN); }
- void set_query_open (bool val) { FHCONDSETF (val, QUERYOPEN); }
-
- 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 () { return FHISSETF (HASACLS); }
- void set_has_acls (int val) { FHCONDSETF (val, HASACLS); }
-
- bool isremote () { return FHISSETF (ISREMOTE); }
- void set_isremote (int val) { FHCONDSETF (val, ISREMOTE); }
-
- const char *get_name () { return unix_path_name; }
- const char *get_win32_name () { return win32_path_name; }
- unsigned long get_namehash () { return namehash; }
-
- virtual void hclose (HANDLE h) {CloseHandle (h);}
- virtual void set_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 int open (path_conv *real_path, int flags, mode_t mode = 0);
- virtual int close ();
- virtual int __stdcall fstat (struct __stat64 *buf, path_conv *) __attribute__ ((regparm (3)));
- 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 __off64_t lseek (__off64_t offset, int whence);
- virtual int lock (int, struct flock *);
- virtual void dump ();
- virtual int dup (fhandler_base *child);
-
- virtual HANDLE mmap (caddr_t *addr, size_t len, DWORD access,
- 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, DWORD access, DWORD offset,
- DWORD size, void *address);
-
- void *operator new (size_t, void *p) {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 is_device () { return TRUE; }
- virtual char *ptsname () { return NULL;}
- virtual class fhandler_socket *is_socket () { return 0; }
- 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 windows_device_names[FHDEVN (status)];
- }
- 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 DIR *opendir (path_conv& pc);
- virtual dirent *readdir (DIR *);
- virtual __off64_t telldir (DIR *);
- virtual void seekdir (DIR *, __off64_t);
- virtual void rewinddir (DIR *);
- virtual int closedir (DIR *);
-};
-
-class fhandler_socket: public fhandler_base
-{
- private:
- int addr_family;
- int type;
- int connect_secret [4];
- HANDLE secret_event;
- struct _WSAPROTOCOL_INFOA *prot_info_ptr;
- char *sun_path;
- int had_connect_or_listen;
-
- public:
- fhandler_socket ();
- ~fhandler_socket ();
- int get_socket () { return (int) get_handle(); }
- fhandler_socket * is_socket () { return this; }
-
- bool saw_shutdown_read () const {return FHISSETF (SHUTRD);}
- bool saw_shutdown_write () const {return FHISSETF (SHUTWR);}
-
- void set_shutdown_read () {FHSETF (SHUTRD);}
- void set_shutdown_write () {FHSETF (SHUTWR);}
-
- bool is_unconnected () const {return had_connect_or_listen == UNCONNECTED;}
- bool is_connect_pending () const {return had_connect_or_listen == CONNECT_PENDING;}
- bool is_connected () const {return had_connect_or_listen == CONNECTED;}
- void set_connect_state (int newstate) { had_connect_or_listen = newstate; }
-
- 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);
-
- 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 (int val);
- virtual void fixup_before_fork_exec (DWORD);
- void fixup_after_fork (HANDLE);
- void fixup_after_exec (HANDLE);
-
- 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;}
- void set_connect_secret ();
- void get_connect_secret (char*);
- HANDLE create_secret_event (int *secret = NULL);
- int check_peer_secret_event (struct sockaddr_in *peer, int *secret = NULL);
- void signal_secret_event ();
- void close_secret_event ();
- int __stdcall fstat (struct __stat64 *buf, path_conv *) __attribute__ ((regparm (3)));
-};
-
-class fhandler_pipe: public fhandler_base
-{
- HANDLE guard;
- bool broken_pipe;
- HANDLE writepipe_exists;
- DWORD orig_pid;
- unsigned id;
- public:
- fhandler_pipe (DWORD devtype);
- __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);
- void set_close_on_exec (int val);
- void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3)));
- 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_after_fork (HANDLE);
- void fixup_after_exec (HANDLE);
- bool hit_eof ();
- void set_eof () {broken_pipe = true;}
- friend int make_pipe (int fildes[2], unsigned int psize, int mode);
- HANDLE get_guard () const {return guard;}
- int ready_for_read (int fd, DWORD howlong);
-};
-
-class fhandler_dev_raw: public fhandler_base
-{
- protected:
- char *devbuf;
- size_t devbufsiz;
- size_t devbufstart;
- size_t devbufend;
- int eom_detected : 1;
- int eof_detected : 1;
- int lastblk_to_read : 1;
- int is_writing : 1;
- int has_written : 1;
- int varblkop : 1;
- int unit;
-
- virtual void clear (void);
- virtual int writebuf (void);
-
- /* returns not null, if `win_error' determines an end of media condition */
- virtual int is_eom(int win_error) = 0;
- /* returns not null, if `win_error' determines an end of file condition */
- virtual int is_eof(int win_error) = 0;
-
- fhandler_dev_raw (DWORD dev, int unit);
-
- public:
- ~fhandler_dev_raw (void);
-
- int get_unit () { return unit; }
-
- int open (path_conv *, int flags, mode_t mode = 0);
- int close (void);
-
- void raw_read (void *ptr, size_t& ulen);
- int raw_write (const void *ptr, size_t ulen);
-
- int dup (fhandler_base *child);
-
- int ioctl (unsigned int cmd, void *buf);
-
- void fixup_after_fork (HANDLE);
- void fixup_after_exec (HANDLE);
-};
-
-class fhandler_dev_floppy: public fhandler_dev_raw
-{
- protected:
- virtual int is_eom (int win_error);
- virtual int is_eof (int win_error);
-
- public:
- fhandler_dev_floppy (int unit);
-
- virtual int open (path_conv *, int flags, mode_t mode = 0);
- virtual int close (void);
-
- virtual __off64_t lseek (__off64_t offset, int whence);
-
- virtual int ioctl (unsigned int cmd, void *buf);
-};
-
-class fhandler_dev_tape: public fhandler_dev_raw
-{
- int lasterr;
-
- bool is_rewind_device () { return get_unit () < 128; }
-
- protected:
- virtual void clear (void);
-
- virtual int is_eom (int win_error);
- virtual int is_eof (int win_error);
-
- public:
- fhandler_dev_tape (int unit);
-
- virtual int open (path_conv *, int flags, mode_t mode = 0);
- virtual int close (void);
-
- virtual __off64_t lseek (__off64_t offset, int whence);
-
- virtual int __stdcall fstat (struct __stat64 *buf, path_conv *) __attribute__ ((regparm (3)));
-
- virtual int dup (fhandler_base *child);
-
- virtual int ioctl (unsigned int cmd, void *buf);
-
- private:
- int tape_write_marks (int marktype, DWORD len);
- int tape_get_pos (unsigned long *ret);
- int tape_set_pos (int mode, long count, BOOLEAN sfm_func = FALSE);
- int tape_erase (int mode);
- int tape_prepare (int action);
- BOOLEAN tape_get_feature (DWORD parm);
- int tape_get_blocksize (long *min, long *def, long *max, long *cur);
- int tape_set_blocksize (long count);
- int tape_status (struct mtget *get);
- int tape_compression (long count);
-};
-
-/* Standard disk file */
-
-class fhandler_disk_file: public fhandler_base
-{
- public:
- fhandler_disk_file ();
- fhandler_disk_file (DWORD devtype);
-
- int open (path_conv * real_path, int flags, mode_t mode);
- int close ();
- int lock (int, struct flock *);
- BOOL is_device () { return FALSE; }
- int __stdcall fstat (struct __stat64 *buf, path_conv *pc) __attribute__ ((regparm (3)));
- int __stdcall fstat_helper (struct __stat64 *buf, path_conv *pc,
- FILETIME ftCreateionTime,
- FILETIME ftLastAccessTime,
- FILETIME ftLastWriteTime,
- DWORD nFileSizeHigh,
- DWORD nFileSizeLow,
- DWORD nFileIndexHigh = 0,
- DWORD nFileIndexLow = 0,
- DWORD nNumberOfLinks = 1)
- __attribute__ ((regparm (3)));
- int __stdcall fstat_by_handle (struct __stat64 *buf, path_conv *pc) __attribute__ ((regparm (3)));
- int __stdcall fstat_by_name (struct __stat64 *buf, path_conv *pc) __attribute__ ((regparm (3)));
-
- HANDLE mmap (caddr_t *addr, size_t len, DWORD access, 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, DWORD access, DWORD offset,
- DWORD size, void *address);
- DIR *opendir (path_conv& pc);
- struct dirent *readdir (DIR *);
- __off64_t telldir (DIR *);
- void seekdir (DIR *, __off64_t);
- void rewinddir (DIR *);
- int closedir (DIR *);
-};
-
-class fhandler_cygdrive: public fhandler_disk_file
-{
- int unit;
- int ndrives;
- const char *pdrive;
- void set_drives ();
- public:
- bool iscygdrive_root () const { return !unit; }
- fhandler_cygdrive (int unit);
- DIR *opendir (path_conv& pc);
- struct dirent *readdir (DIR *);
- __off64_t telldir (DIR *);
- void seekdir (DIR *, __off64_t);
- void rewinddir (DIR *);
- int closedir (DIR *);
- int __stdcall fstat (struct __stat64 *buf, path_conv *pc) __attribute__ ((regparm (3)));
-};
-
-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 unit);
-
- int open (path_conv *, 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 tcsetattr (int a, const struct termios *t);
- int tcgetattr (struct termios *t);
- __off64_t lseek (__off64_t, int) { return 0; }
- int tcflush (int);
- void dump ();
- int is_tty () { return 1; }
- void fixup_after_fork (HANDLE parent);
- void fixup_after_exec (HANDLE);
-
- /* 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);
-};
-
-#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 (DWORD dev, int unit = 0) :
- fhandler_base (dev, unit)
- {
- set_need_fork_fixup ();
- }
- 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, int 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 (HANDLE parent) { fixup_after_fork (parent); }
- 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;
-
- 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;
- friend class fhandler_console;
-};
-
-/* This is a input and output console handle */
-class fhandler_console: public fhandler_termios
-{
- private:
- static dev_console *dev_state;
-
-/* Output calls */
- void set_default_attr ();
- WORD get_win32_attr ();
-
- BOOL fillin_info ();
- 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 (path_conv *, 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_exec (HANDLE);
- void set_close_on_exec (int val);
- void fixup_after_fork (HANDLE parent);
- void set_input_state ();
- void send_winch_maybe ();
- static tty_min *get_tty_stuff (int);
-};
-
-class fhandler_tty_common: public fhandler_termios
-{
- public:
- fhandler_tty_common (DWORD dev, int unit = 0)
- : fhandler_termios (dev, unit), output_done_event (NULL),
- ioctl_request_event (NULL), ioctl_done_event (NULL), output_mutex (NULL),
- input_mutex (NULL), input_available_event (NULL), inuse (NULL), ttynum (unit)
- {
- // 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
- int ttynum; // Master tty num.
-
- 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 get_unit () { return ttynum; }
-
- int close ();
- void set_close_on_exec (int 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);
-};
-
-class fhandler_tty_slave: public fhandler_tty_common
-{
- public:
- /* Constructor */
- fhandler_tty_slave ();
- fhandler_tty_slave (int);
-
- int open (path_conv *, 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 *);
-
- __off64_t lseek (__off64_t, int) { return 0; }
- select_record *select_read (select_record *s);
- int cygserver_attach_tty (HANDLE*, HANDLE*);
-};
-
-class fhandler_pty_master: public fhandler_tty_common
-{
- int pktmode; // non-zero if pty in a packet mode.
- public:
- int need_nl; // Next read should start with \n
-
- /* Constructor */
- fhandler_pty_master (DWORD devtype = FH_PTYM, int unit = -1);
-
- int process_slave_output (char *buf, size_t len, int pktmode_on);
- void doecho (const void *str, DWORD len);
- int accept_input ();
- int open (path_conv *, 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 *);
-
- __off64_t lseek (__off64_t, int) { return 0; }
- char *ptsname ();
-
- void set_close_on_exec (int val);
- bool hit_eof ();
-};
-
-class fhandler_tty_master: public fhandler_pty_master
-{
- public:
- /* Constructor */
- fhandler_console *console; // device handler to perform real i/o.
-
- fhandler_tty_master (int unit);
- int init (int);
- int init_console ();
- void set_winsize (bool);
- void fixup_after_fork (HANDLE parent);
- void fixup_after_exec (HANDLE);
-};
-
-class fhandler_dev_null: public fhandler_base
-{
- public:
- fhandler_dev_null ();
-
- void dump ();
- 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 (path_conv *, 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);
-
- void dump ();
-};
-
-class fhandler_dev_random: public fhandler_base
-{
- protected:
- int unit;
- 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 unit);
- int get_unit () { return unit; }
- int open (path_conv *, 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 (void);
- int dup (fhandler_base *child);
-
- void dump ();
-};
-
-class fhandler_dev_mem: public fhandler_base
-{
- protected:
- int unit;
- DWORD mem_size;
- __off64_t pos;
-
- public:
- fhandler_dev_mem (int unit);
- ~fhandler_dev_mem (void);
-
- int open (path_conv *, 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 close (void);
- int __stdcall fstat (struct __stat64 *buf, path_conv *) __attribute__ ((regparm (3)));
- int dup (fhandler_base *child);
-
- HANDLE mmap (caddr_t *addr, size_t len, DWORD access, 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, DWORD access, DWORD offset,
- DWORD size, void *address);
-
- void dump ();
-} ;
-
-class fhandler_dev_clipboard: public fhandler_base
-{
- public:
- fhandler_dev_clipboard ();
- int is_windows (void) { return 1; }
- int open (path_conv *, 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 (void);
-
- int dup (fhandler_base *child);
-
- void dump ();
-
- private:
- __off64_t pos;
- void *membuffer;
- size_t msize;
- bool eof;
-};
-
-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 (void) { return 1; }
- int open (path_conv *, 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 (void) { return 0; }
-
- void set_close_on_exec (int 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);
-};
-
-class fhandler_dev_dsp : public fhandler_base
-{
- private:
- int audioformat_;
- int audiofreq_;
- int audiobits_;
- int audiochannels_;
- bool setupwav(const char *pData, int nBytes);
- public:
- fhandler_dev_dsp ();
- ~fhandler_dev_dsp();
-
- int open (path_conv *, 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 (void);
- int dup (fhandler_base * child);
- void dump (void);
- void fixup_after_exec (HANDLE);
-};
-
-class fhandler_virtual : public fhandler_base
-{
- protected:
- char *filebuf;
- size_t bufalloc, filesize;
- __off64_t position;
- int fileid; // unique within each class
- public:
-
- fhandler_virtual (DWORD devtype);
- virtual ~fhandler_virtual();
-
- virtual int exists();
- DIR *opendir (path_conv& pc);
- __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 (path_conv *, int flags, mode_t mode = 0);
- int close (void);
- int __stdcall fstat (struct stat *buf, path_conv *pc) __attribute__ ((regparm (3)));
- virtual bool fill_filebuf ();
- void fixup_after_exec (HANDLE);
-};
-
-class fhandler_proc: public fhandler_virtual
-{
- public:
- fhandler_proc ();
- fhandler_proc (DWORD devtype);
- int exists();
- struct dirent *readdir (DIR *);
- static DWORD get_proc_fhandler(const char *path);
-
- int open (path_conv *real_path, int flags, mode_t mode = 0);
- int __stdcall fstat (struct __stat64 *buf, path_conv *) __attribute__ ((regparm (3)));
- bool fill_filebuf ();
-};
-
-class fhandler_registry: public fhandler_proc
-{
- private:
- char *value_name;
- public:
- fhandler_registry ();
- int exists();
- struct dirent *readdir (DIR *);
- __off64_t telldir (DIR *);
- void seekdir (DIR *, __off64_t);
- void rewinddir (DIR *);
- int closedir (DIR *);
-
- int open (path_conv *real_path, int flags, mode_t mode = 0);
- int __stdcall fstat (struct __stat64 *buf, path_conv *) __attribute__ ((regparm (3)));
- bool fill_filebuf ();
- int close (void);
-};
-
-class pinfo;
-class fhandler_process: public fhandler_proc
-{
- pid_t pid;
- public:
- fhandler_process ();
- int exists();
- struct dirent *readdir (DIR *);
- int open (path_conv *real_path, int flags, mode_t mode = 0);
- int __stdcall fstat (struct __stat64 *buf, path_conv *) __attribute__ ((regparm (3)));
- bool fill_filebuf ();
-};
-
-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 __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;
- bool saw_error;
- 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;
-
- select_record (fhandler_base *in_fh = NULL) : fd (0), h (NULL),
- fh (in_fh), saw_error (false), 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 ();
- select_stuff (): always_ready (0), windows_used (0), start (0)
- {
- memset (device_specific, 0, sizeof (device_specific));
- }
- bool always_ready, windows_used;
- select_record start;
- void *device_specific[FH_NDEV];
-
- 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 ();
-};
-
-int __stdcall set_console_state_for_spawn ();
-
-#endif /* _FHANDLER_H_ */
diff --git a/winsup/cygwin/fhandler_clipboard.cc b/winsup/cygwin/fhandler_clipboard.cc
deleted file mode 100644
index 9cf1b287d..000000000
--- a/winsup/cygwin/fhandler_clipboard.cc
+++ /dev/null
@@ -1,277 +0,0 @@
-/* fhandler_dev_clipboard: code to access /dev/clipboard
-
- Copyright 2000, 2001, 2002 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 <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <unistd.h>
-#include <windows.h>
-#include <wingdi.h>
-#include <winuser.h>
-#include "cygerrno.h"
-#include "security.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 UINT cygnativeformat;
-
-fhandler_dev_clipboard::fhandler_dev_clipboard ()
- : fhandler_base (FH_CLIPBOARD), 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 (NULL, 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 (path_conv *, 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);
- set_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;
-
- set_errno (0);
- 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];
- UINT 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
- set_errno (0);
- 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 ();
- set_errno (0);
- 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 (void)
-{
- eof = true;
- pos = 0;
- if (membuffer)
- free (membuffer);
- msize = 0;
- return 0;
-}
-
-void
-fhandler_dev_clipboard::dump ()
-{
- paranoid_printf ("here, fhandler_dev_clipboard");
-}
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
deleted file mode 100644
index 22dc69e1e..000000000
--- a/winsup/cygwin/fhandler_console.cc
+++ /dev/null
@@ -1,1754 +0,0 @@
-/* fhandler_console.cc
-
- 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 <sys/termios.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <unistd.h>
-#include <wingdi.h>
-#include <winuser.h>
-#include <wincon.h>
-#include <winnls.h>
-#include <ctype.h>
-#include <sys/cygwin.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include "shared_info.h"
-#include "cygthread.h"
-
-#define CONVERT_LIMIT 4096
-
-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;
-}
-
-/* The results of GetConsoleCP() and GetConsoleOutputCP() cannot be
- cached, because a program or the user can change these values at
- any time. */
-inline BOOL
-con_to_str (char *d, const char *s, DWORD sz)
-{
- return cp_convert (get_cp (), d, GetConsoleCP (), s, sz);
-}
-
-inline BOOL
-str_to_con (char *d, const char *s, DWORD sz)
-{
- return cp_convert (GetConsoleOutputCP (), d, get_cp (), s, sz);
-}
-
-/*
- * 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_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);
- shared_console_info->tty_min_state.set_ctty (TTY_CONSOLE, flags);
-
- dev_state->scroll_region.Bottom = -1;
- dev_state->dwLastCursorPosition.X = -1;
- dev_state->dwLastCursorPosition.Y = -1;
- dev_state->default_color = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
- 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 <ALT> key always generates
- META, but the right <ALT> 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 <ALT> (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;
- }
-
- return &shared_console_info->tty_min_state;
-}
-
-void
-set_console_ctty ()
-{
- (void) 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 we'll return 1. If the console has been initialized, then
- set it into a more friendly state for non-cygwin apps. */
-int __stdcall
-set_console_state_for_spawn ()
-{
- HANDLE h = CreateFile ("CONIN$", GENERIC_READ, FILE_SHARE_WRITE,
- &sec_none_nih, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
- NULL);
-
- if (h == INVALID_HANDLE_VALUE)
- return 0;
-
- if (shared_console_info != NULL)
- {
- /* ACK. Temporarily define for use in TTYSETF macro */
-# define tc &shared_console_info->tty_min_state
- SetConsoleMode (h, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT);
- TTYSETF (RSTCONS);
-# undef tc
- }
-
- CloseHandle (h);
- return 1;
-}
-
-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;
- fillin_info ();
-
- if (y != dev_state->info.dwWinSize.Y || x != dev_state->info.dwWinSize.X)
- {
- extern fhandler_tty_master *tty_master;
- 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 (cygthread::is ())
- 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)
-
-#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;
- }
-
- if (!input_rec.Event.KeyEvent.bKeyDown)
- continue;
-
-#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)
-
- if (wch == 0 ||
- /* arrow/function keys */
- (input_rec.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY))
- {
- toadd = get_nonascii_key (input_rec, tmp);
- if (!toadd)
- 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)
- 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
- || (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++;
- }
- }
-#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;
-
- /* If the mouse event occurred out of the area we can handle,
- ignore it. */
- int x = mouse_event.dwMousePosition.X;
- int y = mouse_event.dwMousePosition.Y;
- 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 ();
- (ssize_t) buflen = -1;
- return;
-
- sig_exit:
- set_sig_errno (EINTR);
- (ssize_t) buflen = -1;
- return;
-}
-
-void
-fhandler_console::set_input_state ()
-{
- if (TTYISSETF (RSTCONS))
- input_tcsetattr (0, &tc->ti);
-}
-
-BOOL
-fhandler_console::fillin_info (void)
-{
- BOOL ret;
- CONSOLE_SCREEN_BUFFER_INFO linfo;
-
- if ((ret = GetConsoleScreenBufferInfo (get_output_handle (), &linfo)))
- {
- dev_state->info.winTop = linfo.srWindow.Top;
- dev_state->info.winBottom = linfo.srWindow.Bottom;
- dev_state->info.dwWinSize.Y = 1 + linfo.srWindow.Bottom - linfo.srWindow.Top;
- dev_state->info.dwWinSize.X = 1 + linfo.srWindow.Right - linfo.srWindow.Left;
- dev_state->info.dwBufferSize = linfo.dwSize;
- dev_state->info.dwCursorPosition = linfo.dwCursorPosition;
- dev_state->info.wAttributes = linfo.wAttributes;
- }
- else
- {
- memset (&dev_state->info, 0, sizeof dev_state->info);
- dev_state->info.dwWinSize.Y = 25;
- dev_state->info.dwWinSize.X = 80;
- dev_state->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;
-
- (void) fillin_info ();
- 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 (path_conv *, 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);
- set_r_no_interrupt (1); // 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 (fillin_info ())
- dev_state->default_color = dev_state->info.wAttributes;
-
- 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);
- }
-
- TTYCLEARF (RSTCONS);
- set_open_status ();
- debug_printf ("opened conin$ %p, conout$ %p",
- get_io_handle (), get_output_handle ());
-
- return 1;
-}
-
-int
-fhandler_console::close (void)
-{
- CloseHandle (get_io_handle ());
- CloseHandle (get_output_handle ());
- set_io_handle (NULL);
- set_output_handle (NULL);
- 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 (NULL, 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 = fillin_info ();
- 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:
- (void) bg_check (SIGTTOU);
- return 0;
- }
-
- 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 */
- set_r_binary ((t->c_iflag & INLCR) ? 0 : 1);
-#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);
- }
-
- TTYCLEARF (RSTCONS);
- 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 (FH_CONSOLE, -1)
-{
-}
-
-#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
-fhandler_console::set_default_attr ()
-{
- dev_state->blink = dev_state->underline = dev_state->reverse = FALSE;
- dev_state->intensity = INTENSITY_NORMAL;
- dev_state->fg = dev_state->default_color & FOREGROUND_ATTR_MASK;
- dev_state->bg = dev_state->default_color & BACKGROUND_ATTR_MASK;
- dev_state->current_win32_attr = get_win32_attr ();
- SetConsoleTextAttribute (get_output_handle (), dev_state->current_win32_attr);
-}
-
-WORD
-fhandler_console::get_win32_attr ()
-{
- WORD win_fg = dev_state->fg;
- WORD win_bg = dev_state->bg;
- if (dev_state->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_fg & FOREGROUND_INTENSITY);
- win_bg = (save_fg & FOREGROUND_RED ? BACKGROUND_RED : 0) |
- (save_fg & FOREGROUND_GREEN ? BACKGROUND_GREEN : 0) |
- (save_fg & FOREGROUND_BLUE ? BACKGROUND_BLUE : 0) |
- (win_bg & BACKGROUND_INTENSITY);
- }
- if (dev_state->underline)
- win_fg = dev_state->underline_color;
- /* emulate blink with bright background */
- if (dev_state->blink)
- win_bg |= BACKGROUND_INTENSITY;
- if (dev_state->intensity == INTENSITY_INVISIBLE)
- win_fg = win_bg;
- else if (dev_state->intensity == INTENSITY_BOLD)
- win_fg |= FOREGROUND_INTENSITY;
- return (win_fg | win_bg);
-}
-
-/*
- * 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;
-
- (void)fillin_info ();
-
- 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;
-
- (void) fillin_info ();
- 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)
-{
- fillin_info ();
- 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)
-{
- fillin_info ();
- *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 */
- int i;
-
- for (i = 0; i <= dev_state->nargs_; i++)
- switch (dev_state->args_[i])
- {
- case 0: /* normal color */
- 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 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->current_win32_attr = get_win32_attr ();
- SetConsoleTextAttribute (get_output_handle (), dev_state->current_win32_attr);
- 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 */
- fillin_info ();
- 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;
- }
-}
-
-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)
- {
- if (base_chars[*found] != 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 (!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 (412, 100);
- 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 */
- {
- fillin_info ();
- scroll_screen (0, 0, -1, -1, 0, dev_state->info.winTop + 1);
- dev_state->state_ = normal;
- }
- else if (*src == 'c') /* Reset Linux terminal */
- {
- 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 ((path_conv *) NULL, flags | O_BINARY);
- if (f != INVALID_HANDLE_VALUE)
- CloseHandle (f); /* Reopened by open */
-
- this->tcsetattr (0, &tc->ti);
-}
-
-int
-fhandler_console::igncr_enabled (void)
-{
- return tc->ti.c_iflag & IGNCR;
-}
-
-void
-fhandler_console::set_close_on_exec (int val)
-{
- this->fhandler_base::set_close_on_exec (val);
- set_inheritance (output_handle, val);
-}
-
-void
-fhandler_console::fixup_after_fork (HANDLE)
-{
- HANDLE h = get_handle ();
- HANDLE oh = get_output_handle ();
-
- /* Windows does not allow duplication of console handles between processes
- so open the console explicitly. */
-
- if (!open (NULL, O_NOCTTY | get_flags (), 0))
- system_printf ("error opening console after fork, %E");
-
- if (!get_close_on_exec ())
- {
- CloseHandle (h);
- CloseHandle (oh);
- }
-}
-
-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 (title_mutex, 15000)) != WAIT_OBJECT_0)
- sigproc_printf ("wait for title mutex failed rc %d, %E", rc);
- SetConsoleTitle (buf);
- ReleaseMutex (title_mutex);
- debug_printf ("title '%s'", buf);
-}
-
-void
-fhandler_console::fixup_after_exec (HANDLE)
-{
- HANDLE h = get_handle ();
- HANDLE oh = get_output_handle ();
-
- if (!open (NULL, O_NOCTTY | get_flags (), 0))
- {
- int sawerr = 0;
- if (!get_io_handle ())
- {
- system_printf ("error opening input console handle after exec, errno %d, %E", get_errno ());
- sawerr = 1;
- }
- if (!get_output_handle ())
- {
- system_printf ("error opening input console handle after exec, errno %d, %E", get_errno ());
- sawerr = 1;
- }
-
- if (!sawerr)
- system_printf ("error opening console after exec, errno %d, %E", get_errno ());
- }
-
- CloseHandle (h);
- CloseHandle (oh);
- return;
-}
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc
deleted file mode 100644
index ea338ffc6..000000000
--- a/winsup/cygwin/fhandler_disk_file.cc
+++ /dev/null
@@ -1,831 +0,0 @@
-/* fhandler_disk_file.cc
-
- 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 <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/cygwin.h>
-#include <signal.h>
-#include "cygerrno.h"
-#include "perprocess.h"
-#include "security.h"
-#include "cygwin/version.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "shared_info.h"
-#include "pinfo.h"
-#include <assert.h>
-#include <ctype.h>
-
-#define _COMPILING_NEWLIB
-#include <dirent.h>
-
-static int __stdcall
-num_entries (const char *win32_name)
-{
- WIN32_FIND_DATA buf;
- HANDLE handle;
- char buf1[MAX_PATH];
- int count = 0;
-
- strcpy (buf1, win32_name);
- int len = strlen (buf1);
- if (len == 0 || isdirsep (buf1[len - 1]))
- strcat (buf1, "*");
- else
- strcat (buf1, "/*"); /* */
-
- handle = FindFirstFileA (buf1, &buf);
-
- if (handle == INVALID_HANDLE_VALUE)
- return 2; /* 2 is the minimum number of links to a dir, so... */
- count ++;
- while (FindNextFileA (handle, &buf))
- {
- if ((buf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
- count ++;
- }
- FindClose (handle);
- return count;
-}
-
-int __stdcall
-fhandler_disk_file::fstat_by_handle (struct __stat64 *buf, path_conv *pc)
-{
- int res = 0;
- BY_HANDLE_FILE_INFORMATION local;
-
- /* NT 3.51 seems to have a bug when attempting to get vol serial
- numbers. This loop gets around this. */
- for (int i = 0; i < 2; i++)
- {
- if (!(res = GetFileInformationByHandle (get_handle (), &local)))
- break;
- if (local.dwVolumeSerialNumber && (long) local.dwVolumeSerialNumber != -1)
- break;
- }
- debug_printf ("%d = GetFileInformationByHandle (%s, %d)",
- res, get_win32_name (), get_handle ());
- if (res == 0)
- /* GetFileInformationByHandle will fail if it's given stdin/out/err
- or a pipe*/
- {
- memset (&local, 0, sizeof (local));
- local.nFileSizeLow = GetFileSize (get_handle (), &local.nFileSizeHigh);
- }
-
- return fstat_helper (buf, pc,
- local.ftCreationTime,
- local.ftLastAccessTime,
- local.ftLastWriteTime,
- local.nFileSizeHigh,
- local.nFileSizeLow,
- local.nFileIndexHigh,
- local.nFileIndexLow,
- local.nNumberOfLinks);
-}
-
-int __stdcall
-fhandler_disk_file::fstat_by_name (struct __stat64 *buf, path_conv *pc)
-{
- 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
- {
- char drivebuf[5];
- char *name;
- if ((*pc)[3] != '\0' || !isalpha ((*pc)[0]) || (*pc)[1] != ':' || (*pc)[2] != '\\')
- name = *pc;
- else
- {
- /* FIXME: Does this work on empty disks? */
- drivebuf[0] = (*pc)[0];
- drivebuf[1] = (*pc)[1];
- drivebuf[2] = (*pc)[2];
- drivebuf[3] = '*';
- drivebuf[4] = '\0';
- name = drivebuf;
- }
-
- if ((handle = FindFirstFile (name, &local)) == INVALID_HANDLE_VALUE)
- {
- debug_printf ("FindFirstFile failed for '%s', %E", name);
- __seterrno ();
- res = -1;
- }
- else
- {
- FindClose (handle);
- res = fstat_helper (buf, pc,
- local.ftCreationTime,
- local.ftLastAccessTime,
- local.ftLastWriteTime,
- local.nFileSizeHigh,
- local.nFileSizeLow);
- }
- }
- return res;
-}
-
-int __stdcall
-fhandler_disk_file::fstat (struct __stat64 *buf, path_conv *pc)
-{
- int res = -1;
- int oret;
- __uid32_t uid;
- __gid32_t gid;
- int open_flags = O_RDONLY | O_BINARY | O_DIROPEN;
- bool query_open_already;
-
- if (get_io_handle ())
- {
- if (get_nohandle ())
- return fstat_by_name (buf, pc);
- else
- return fstat_by_handle (buf, pc);
- }
- /* 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)
- set_query_open (query_open_already = true);
- else
- query_open_already = false;
-
- if (query_open_already && strncasematch (pc->volname (), "FAT", 3)
- && !strpbrk (get_win32_name (), "?*|<>"))
- oret = 0;
- else if (!(oret = open (pc, open_flags, 0)))
- {
- int ntsec_atts = 0;
- /* If we couldn't open the file, try a "query open" with no permissions.
- This will allow us to determine *some* things about the file, at least. */
- set_query_open (true);
- if (!query_open_already && (oret = open (pc, open_flags, 0)))
- /* ok */;
- else if (allow_ntsec && pc->has_acls () && get_errno () == EACCES
- && !get_file_attribute (TRUE, get_win32_name (), &ntsec_atts, &uid, &gid)
- && !ntsec_atts && uid == myself->uid && gid == myself->gid)
- {
- /* Check a special case here. If ntsec is ON it happens
- that a process creates a file using mode 000 to disallow
- other processes access. In contrast to UNIX, this results
- in a failing open call in the same process. Check that
- case. */
- set_file_attribute (TRUE, get_win32_name (), 0400);
- oret = open (pc, open_flags, 0);
- set_file_attribute (TRUE, get_win32_name (), ntsec_atts);
- }
- }
-
- if (!oret || get_nohandle ())
- res = fstat_by_name (buf, pc);
- else
- {
- res = fstat_by_handle (buf, pc);
- close ();
- }
-
- return res;
-}
-
-int __stdcall
-fhandler_disk_file::fstat_helper (struct __stat64 *buf, path_conv *pc,
- FILETIME ftCreationTime,
- FILETIME ftLastAccessTime,
- FILETIME ftLastWriteTime,
- DWORD nFileSizeHigh,
- DWORD nFileSizeLow,
- DWORD nFileIndexHigh,
- DWORD nFileIndexLow,
- DWORD nNumberOfLinks)
-{
- /* This is for FAT filesystems, which don't support atime/ctime */
- if (ftLastAccessTime.dwLowDateTime == 0
- && ftLastAccessTime.dwHighDateTime == 0)
- ftLastAccessTime = ftLastWriteTime;
- if (ftCreationTime.dwLowDateTime == 0
- && ftCreationTime.dwHighDateTime == 0)
- ftCreationTime = ftLastWriteTime;
-
- to_timestruc_t (&ftLastAccessTime, &buf->st_atim);
- to_timestruc_t (&ftLastWriteTime, &buf->st_mtim);
- to_timestruc_t (&ftCreationTime, &buf->st_ctim);
- buf->st_dev = pc->volser ();
- buf->st_size = ((__off64_t)nFileSizeHigh << 32) + nFileSizeLow;
- /* Unfortunately the count of 2 confuses `find (1)' command. So
- let's try it with `1' as link count. */
- if (pc->isdir () && !pc->isremote () && nNumberOfLinks == 1)
- buf->st_nlink = num_entries (pc->get_win32 ());
- else
- buf->st_nlink = nNumberOfLinks;
-
- /* 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. */
- switch (pc->has_acls () && (nFileIndexHigh || nFileIndexLow)
- ? pc->drive_type () : DRIVE_UNKNOWN)
- {
- case DRIVE_FIXED:
- case DRIVE_REMOVABLE:
- case DRIVE_CDROM:
- case DRIVE_RAMDISK:
- /* Although the documentation indicates otherwise, it seems like
- "inodes" on these devices are persistent, at least across reboots. */
- buf->st_ino = nFileIndexHigh | nFileIndexLow;
- break;
- default:
- /* Either the nFileIndex* fields are unreliable or unavailable. Use the
- next best alternative. */
- buf->st_ino = get_namehash ();
- break;
- }
-
- buf->st_blksize = S_BLKSIZE;
- 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_mode = S_IFLNK;
- else if (pc->issocket ())
- buf->st_mode = S_IFSOCK;
-
- __uid32_t uid;
- __gid32_t gid;
- if (get_file_attribute (pc->has_acls (), get_win32_name (), &buf->st_mode,
- &uid, &gid) == 0)
- {
- /* If read-only attribute is set, modify ntsec return value */
- if (pc->has_attribute (FILE_ATTRIBUTE_READONLY) && !get_symlink_p ())
- buf->st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH);
-
- if (!(buf->st_mode & S_IFMT))
- buf->st_mode |= S_IFREG;
- }
- else
- {
- buf->st_mode |= STD_RBITS;
-
- if (!pc->has_attribute (FILE_ATTRIBUTE_READONLY))
- buf->st_mode |= STD_WBITS;
- /* | S_IWGRP | S_IWOTH; we don't give write to group etc */
-
- if (buf->st_mode & S_IFDIR)
- buf->st_mode |= S_IFDIR | STD_XBITS;
- else if (buf->st_mode & S_IFMT)
- /* nothing */;
- else if (pc->issocket ())
- buf->st_mode |= S_IFSOCK;
- 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))
- {
- set_execable_p ();
- pc->set_exec ();
- buf->st_mode |= STD_XBITS;
- }
- (void) SetFilePointer (get_handle (), cur, NULL, FILE_BEGIN);
- }
- }
- }
-
- if (pc->exec_state () == is_executable)
- buf->st_mode |= STD_XBITS;
- }
-
- buf->st_uid = uid;
- buf->st_gid = gid;
-
- /* 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 and
- set the number of links to 2. */
-
- 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,
- (int) buf->st_ino, sizeof (*buf));
- return 0;
-}
-
-fhandler_disk_file::fhandler_disk_file (DWORD devtype) :
- fhandler_base (devtype)
-{
-}
-
-fhandler_disk_file::fhandler_disk_file () :
- fhandler_base (FH_DISK)
-{
-}
-
-int
-fhandler_disk_file::open (path_conv *real_path, int flags, mode_t mode)
-{
- if (real_path->case_clash && flags & O_CREAT)
- {
- debug_printf ("case clash detected");
- set_errno (ECASECLASH);
- return 0;
- }
-
- set_has_acls (real_path->has_acls ());
- set_isremote (real_path->isremote ());
-
- int res = this->fhandler_base::open (real_path, 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 (real_path->has_buggy_open () && !real_path->exists ())
- {
- debug_printf ("Buggy open detected.");
- close ();
- set_errno (ENOENT);
- return 0;
- }
-
- set_symlink_p (real_path->issymlink ());
- set_execable_p (real_path->exec_state ());
- set_socket_p (real_path->issocket ());
-
-out:
- syscall_printf ("%d = fhandler_disk_file::open (%s, %p)", res,
- get_win32_name (), flags);
- return res;
-}
-
-int
-fhandler_disk_file::close ()
-{
- int res = this->fhandler_base::close ();
- if (!res)
- cygwin_shared->delqueue.process_queue ();
- 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. The 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 flock *fl)
-{
- __off64_t win32_start;
- int win32_len;
- DWORD win32_upper;
- __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;
- }
-
- /*
- * Special case if len == 0 for POSIX means lock
- * to the end of the entire file (and all future extensions).
- */
- if (win32_len == 0)
- {
- win32_len = 0xffffffff;
- win32_upper = wincap.lock_file_highword ();
- }
- else
- win32_upper = 0;
-
- 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 = (DWORD)win32_start;
- ov.OffsetHigh = 0;
- ov.hEvent = (HANDLE) 0;
-
- if (fl->l_type == F_UNLCK)
- {
- res = UnlockFileEx (get_handle (), 0, (DWORD)win32_len, win32_upper, &ov);
- }
- else
- {
- res = LockFileEx (get_handle (), lock_flags, 0, (DWORD)win32_len,
- win32_upper, &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 (), (DWORD)win32_start, 0, (DWORD)win32_len,
- win32_upper);
- else
- res = LockFile (get_handle (), (DWORD)win32_start, 0, (DWORD)win32_len, win32_upper);
- }
-
- if (res == 0)
- {
- __seterrno ();
- return -1;
- }
-
- return 0;
-}
-
-DIR *
-fhandler_disk_file::opendir (path_conv& real_name)
-{
- DIR *dir;
- DIR *res = NULL;
- size_t len;
-
- if (!real_name.isdir ())
- set_errno (ENOTDIR);
- else if ((len = strlen (real_name))> 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->__d_dirname);
- free (dir);
- set_errno (ENOMEM);
- }
- else
- {
- strcpy (dir->__d_dirname, real_name.get_win32 ());
- dir->__d_dirent->d_version = __DIRENT_VERSION;
- cygheap_fdnew fd;
- fd = this;
- fd->set_nohandle (true);
- dir->__d_dirent->d_fd = fd;
- dir->__d_u.__d_data.__fh = this;
- /* FindFirstFile doesn't seem to like duplicate /'s. */
- len = strlen (dir->__d_dirname);
- if (len == 0 || isdirsep (dir->__d_dirname[len - 1]))
- strcat (dir->__d_dirname, "*");
- else
- strcat (dir->__d_dirname, "\\*"); /**/
- dir->__d_cookie = __DIRENT_COOKIE;
- dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE;
- dir->__d_position = 0;
- dir->__d_dirhash = get_namehash ();
-
- res = dir;
- }
-
- syscall_printf ("%p = opendir (%s)", res, get_name ());
- return res;
-}
-
-struct dirent *
-fhandler_disk_file::readdir (DIR *dir)
-{
- WIN32_FIND_DATA buf;
- HANDLE handle;
- struct dirent *res = NULL;
-
- if (dir->__d_u.__d_data.__handle == INVALID_HANDLE_VALUE
- && dir->__d_position == 0)
- {
- handle = FindFirstFileA (dir->__d_dirname, &buf);
- DWORD lasterr = GetLastError ();
- dir->__d_u.__d_data.__handle = handle;
- if (handle == INVALID_HANDLE_VALUE && (lasterr != ERROR_NO_MORE_FILES))
- {
- seterrno_from_win_error (__FILE__, __LINE__, lasterr);
- return res;
- }
- }
- else if (dir->__d_u.__d_data.__handle == INVALID_HANDLE_VALUE)
- {
- return res;
- }
- else if (!FindNextFileA (dir->__d_u.__d_data.__handle, &buf))
- {
- DWORD lasterr = GetLastError ();
- (void) FindClose (dir->__d_u.__d_data.__handle);
- dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE;
- /* POSIX says you shouldn't set errno when readdir can't
- find any more files; so, if another error we leave it set. */
- if (lasterr != ERROR_NO_MORE_FILES)
- seterrno_from_win_error (__FILE__, __LINE__, lasterr);
- syscall_printf ("%p = readdir (%p)", res, dir);
- return res;
- }
-
- /* We get here if `buf' contains valid data. */
- strcpy (dir->__d_dirent->d_name, buf.cFileName);
-
- /* Check for Windows shortcut. If it's a Cygwin or U/WIN
- symlink, drop the .lnk suffix. */
- if (buf.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
- {
- char *c = dir->__d_dirent->d_name;
- int len = strlen (c);
- if (strcasematch (c + len - 4, ".lnk"))
- {
- char fbuf[MAX_PATH + 1];
- strcpy (fbuf, dir->__d_dirname);
- strcpy (fbuf + strlen (fbuf) - 1, dir->__d_dirent->d_name);
- path_conv fpath (fbuf, PC_SYM_NOFOLLOW);
- if (fpath.issymlink ())
- c[len - 4] = '\0';
- }
- }
-
- dir->__d_position++;
- res = dir->__d_dirent;
- syscall_printf ("%p = readdir (%p) (%s)",
- &dir->__d_dirent, dir, buf.cFileName);
- 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 (dir->__d_u.__d_data.__handle != INVALID_HANDLE_VALUE)
- {
- (void) FindClose (dir->__d_u.__d_data.__handle);
- dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE;
- }
- dir->__d_position = 0;
-}
-
-int
-fhandler_disk_file::closedir (DIR *dir)
-{
- int res = 0;
- if (dir->__d_u.__d_data.__handle != INVALID_HANDLE_VALUE &&
- FindClose (dir->__d_u.__d_data.__handle) == 0)
- {
- __seterrno ();
- res = -1;
- }
- syscall_printf ("%d = closedir (%p)", res, dir);
- return 0;
-}
-
-fhandler_cygdrive::fhandler_cygdrive (int unit) :
- fhandler_disk_file (FH_CYGDRIVE), unit (unit), ndrives (0), pdrive (NULL)
-{
-}
-
-#define DRVSZ sizeof ("x:\\")
-void
-fhandler_cygdrive::set_drives ()
-{
- const int len = 1 + 26 * DRVSZ;
- char *p = (char *) crealloc ((void *) win32_path_name,
- sizeof (".") + sizeof ("..") + len);
-
- win32_path_name = pdrive = p;
- strcpy (p, ".");
- strcpy (p + sizeof ("."), "..");
- p += sizeof (".") + sizeof ("..");
- ndrives = GetLogicalDriveStrings (len, p) / DRVSZ;
-}
-
-int
-fhandler_cygdrive::fstat (struct __stat64 *buf, path_conv *pc)
-{
- if (!iscygdrive_root ())
- return fhandler_disk_file::fstat (buf, pc);
- buf->st_mode = S_IFDIR | 0555;
- if (!ndrives)
- set_drives ();
- buf->st_nlink = ndrives;
- return 0;
-}
-
-DIR *
-fhandler_cygdrive::opendir (path_conv& real_name)
-{
- DIR *dir;
-
- dir = fhandler_disk_file::opendir (real_name);
- if (dir && iscygdrive_root () && !ndrives)
- set_drives ();
-
- return dir;
-}
-
-struct dirent *
-fhandler_cygdrive::readdir (DIR *dir)
-{
- if (!iscygdrive_root ())
- return fhandler_disk_file::readdir (dir);
- if (!pdrive || !*pdrive)
- {
- set_errno (ENMFILE);
- return NULL;
- }
- else if (dir->__d_position > 1
- && GetFileAttributes (pdrive) == INVALID_FILE_ATTRIBUTES)
- {
- pdrive = strchr (pdrive, '\0') + 1;
- return readdir (dir);
- }
- else if (*pdrive == '.')
- strcpy (dir->__d_dirent->d_name, pdrive);
- else
- {
- *dir->__d_dirent->d_name = cyg_tolower (*pdrive);
- dir->__d_dirent->d_name[1] = '\0';
- }
- dir->__d_position++;
- pdrive = strchr (pdrive, '\0') + 1;
- syscall_printf ("%p = readdir (%p) (%s)", &dir->__d_dirent, dir,
- dir->__d_dirent->d_name);
- return dir->__d_dirent;
-}
-
-__off64_t
-fhandler_cygdrive::telldir (DIR *dir)
-{
- return fhandler_disk_file::telldir (dir);
-}
-
-void
-fhandler_cygdrive::seekdir (DIR *dir, __off64_t loc)
-{
- if (!iscygdrive_root ())
- return fhandler_disk_file::seekdir (dir, loc);
-
- for (pdrive = win32_path_name, dir->__d_position = -1; *pdrive;
- pdrive = strchr (pdrive, '\0') + 1)
- if (++dir->__d_position >= loc)
- break;
-
- return;
-}
-
-void
-fhandler_cygdrive::rewinddir (DIR *dir)
-{
- if (!iscygdrive_root ())
- return fhandler_disk_file::rewinddir (dir);
- pdrive = win32_path_name;
- dir->__d_position = 0;
- return;
-}
-
-int
-fhandler_cygdrive::closedir (DIR *dir)
-{
- if (!iscygdrive_root ())
- return fhandler_disk_file::closedir (dir);
- pdrive = win32_path_name;
- return -1;
-}
diff --git a/winsup/cygwin/fhandler_dsp.cc b/winsup/cygwin/fhandler_dsp.cc
deleted file mode 100644
index 5c7f42a0e..000000000
--- a/winsup/cygwin/fhandler_dsp.cc
+++ /dev/null
@@ -1,646 +0,0 @@
-/* fhandler_dev_dsp: code to emulate OSS sound model /dev/dsp
-
- Copyright 2001, 2002 Red Hat, Inc
-
- Written by Andy Younger (andy@snoogie.demon.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 <stdio.h>
-#include <errno.h>
-#include <windows.h>
-#include <sys/soundcard.h>
-#include <mmsystem.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-
-//------------------------------------------------------------------------
-// Simple encapsulation of the win32 audio device.
-//
-static void CALLBACK wave_callback (HWAVE hWave, UINT msg, DWORD instance,
- DWORD param1, DWORD param2);
-class Audio
-{
-public:
- enum
- {
- MAX_BLOCKS = 12,
- BLOCK_SIZE = 16384,
- TOT_BLOCK_SIZE = BLOCK_SIZE + sizeof (WAVEHDR)
- };
-
- Audio ();
- ~Audio ();
-
- bool open (int rate, int bits, int channels, bool bCallback = false);
- void close ();
- int getvolume ();
- void setvolume (int newVolume);
- bool write (const void *pSampleData, int nBytes);
- int blocks ();
- void callback_sampledone (void *pData);
- void setformat (int format) {formattype_ = format;}
- int numbytesoutput ();
-
- void *operator new (size_t, void *p) {return p;}
-
-private:
- char *initialisebuffer ();
- void waitforcallback ();
- bool flush ();
-
- HWAVEOUT dev_;
- volatile int nBlocksInQue_;
- int nBytesWritten_;
- char *buffer_;
- int bufferIndex_;
- CRITICAL_SECTION lock_;
- char *freeblocks_[MAX_BLOCKS];
- int formattype_;
-
- char bigwavebuffer_[MAX_BLOCKS * TOT_BLOCK_SIZE];
-};
-
-static char audio_buf[sizeof (class Audio)];
-
-Audio::Audio ()
-{
- InitializeCriticalSection (&lock_);
- memset (bigwavebuffer_, 0, sizeof (bigwavebuffer_));
- for (int i = 0; i < MAX_BLOCKS; i++)
- freeblocks_[i] = &bigwavebuffer_[i * TOT_BLOCK_SIZE];
-}
-
-Audio::~Audio ()
-{
- if (dev_)
- close ();
- DeleteCriticalSection (&lock_);
-}
-
-bool
-Audio::open (int rate, int bits, int channels, bool bCallback)
-{
- WAVEFORMATEX format;
- int nDevices = waveOutGetNumDevs ();
-
- nBytesWritten_ = 0L;
- bufferIndex_ = 0;
- buffer_ = 0L;
- debug_printf ("number devices %d", nDevices);
- if (nDevices <= 0)
- return false;
-
- debug_printf ("trying to map device freq %d, bits %d, "
- "channels %d, callback %d", rate, bits, channels,
- bCallback);
-
- int bytesperSample = bits / 8;
-
- 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 *
- bytesperSample;
- format.nBlockAlign = format.nChannels * bytesperSample;
-
- nBlocksInQue_ = 0;
- HRESULT res = waveOutOpen (&dev_, WAVE_MAPPER, &format, (DWORD) wave_callback,
- (DWORD) this, bCallback ? CALLBACK_FUNCTION : 0);
- if (res == S_OK)
- {
- debug_printf ("Sucessfully opened!");
- return true;
- }
- else
- {
- debug_printf ("failed to open");
- return false;
- }
-}
-
-void
-Audio::close ()
-{
- if (dev_)
- {
- flush (); // force out last block whatever size..
-
- while (blocks ()) // block till finished..
- waitforcallback ();
-
- waveOutReset (dev_);
- waveOutClose (dev_);
- dev_ = 0L;
- }
- nBytesWritten_ = 0L;
-}
-
-int
-Audio::numbytesoutput ()
-{
- return nBytesWritten_;
-}
-
-int
-Audio::getvolume ()
-{
- DWORD volume;
-
- waveOutGetVolume (dev_, &volume);
- return ((volume >> 16) + (volume & 0xffff)) >> 1;
-}
-
-void
-Audio::setvolume (int newVolume)
-{
- waveOutSetVolume (dev_, (newVolume << 16) | newVolume);
-}
-
-char *
-Audio::initialisebuffer ()
-{
- EnterCriticalSection (&lock_);
- WAVEHDR *pHeader = 0L;
- for (int i = 0; i < MAX_BLOCKS; i++)
- {
- char *pData = freeblocks_[i];
- if (pData)
- {
- pHeader = (WAVEHDR *) pData;
- if (pHeader->dwFlags & WHDR_DONE)
- {
- waveOutUnprepareHeader (dev_, pHeader, sizeof (WAVEHDR));
- }
- freeblocks_[i] = 0L;
- break;
- }
- }
- LeaveCriticalSection (&lock_);
-
- if (pHeader)
- {
- memset (pHeader, 0, sizeof (WAVEHDR));
- pHeader->dwBufferLength = BLOCK_SIZE;
- pHeader->lpData = (LPSTR) (&pHeader[1]);
- return (char *) pHeader->lpData;
- }
- return 0L;
-}
-
-bool
-Audio::write (const void *pSampleData, int nBytes)
-{
- // split up big blocks into smaller BLOCK_SIZE chunks
- while (nBytes > BLOCK_SIZE)
- {
- write (pSampleData, BLOCK_SIZE);
- nBytes -= BLOCK_SIZE;
- pSampleData = (void *) ((char *) pSampleData + BLOCK_SIZE);
- }
-
- // Block till next sound is flushed
- if (blocks () == MAX_BLOCKS)
- waitforcallback ();
-
- // Allocate new wave buffer if necessary
- if (buffer_ == 0L)
- {
- buffer_ = initialisebuffer ();
- if (buffer_ == 0L)
- return false;
- }
-
-
- // Handle gathering blocks into larger buffer
- int sizeleft = BLOCK_SIZE - bufferIndex_;
- if (nBytes < sizeleft)
- {
- memcpy (&buffer_[bufferIndex_], pSampleData, nBytes);
- bufferIndex_ += nBytes;
- nBytesWritten_ += nBytes;
- return true;
- }
-
- // flushing when we reach our limit of BLOCK_SIZE
- memcpy (&buffer_[bufferIndex_], pSampleData, sizeleft);
- bufferIndex_ += sizeleft;
- nBytesWritten_ += sizeleft;
- flush ();
-
- // change pointer to rest of sample, and size accordingly
- pSampleData = (void *) ((char *) pSampleData + sizeleft);
- nBytes -= sizeleft;
-
- // if we still have some sample left over write it out
- if (nBytes)
- return write (pSampleData, nBytes);
-
- return true;
-}
-
-// return number of blocks back.
-int
-Audio::blocks ()
-{
- EnterCriticalSection (&lock_);
- int ret = nBlocksInQue_;
- LeaveCriticalSection (&lock_);
- return ret;
-}
-
-// This is called on an interupt so use locking.. Note nBlocksInQue_ is
-// modified by it so we should wrap all references to it in locks.
-void
-Audio::callback_sampledone (void *pData)
-{
- EnterCriticalSection (&lock_);
-
- nBlocksInQue_--;
- for (int i = 0; i < MAX_BLOCKS; i++)
- if (!freeblocks_[i])
- {
- freeblocks_[i] = (char *) pData;
- break;
- }
-
- LeaveCriticalSection (&lock_);
-}
-
-void
-Audio::waitforcallback ()
-{
- int n = blocks ();
- if (!n)
- return;
- do
- {
- Sleep (250);
- }
- while (n == blocks ());
-}
-
-bool
-Audio::flush ()
-{
- if (!buffer_)
- return false;
-
- // Send internal buffer out to the soundcard
- WAVEHDR *pHeader = ((WAVEHDR *) buffer_) - 1;
- pHeader->dwBufferLength = bufferIndex_;
-
- // Quick bit of sample buffer conversion
- if (formattype_ == AFMT_S8)
- {
- unsigned char *p = ((unsigned char *) buffer_);
- for (int i = 0; i < bufferIndex_; i++)
- {
- p[i] -= 0x7f;
- }
- }
-
- if (waveOutPrepareHeader (dev_, pHeader, sizeof (WAVEHDR)) == S_OK &&
- waveOutWrite (dev_, pHeader, sizeof (WAVEHDR)) == S_OK)
- {
- EnterCriticalSection (&lock_);
- nBlocksInQue_++;
- LeaveCriticalSection (&lock_);
- bufferIndex_ = 0;
- buffer_ = 0L;
- return true;
- }
- else
- {
- EnterCriticalSection (&lock_);
- for (int i = 0; i < MAX_BLOCKS; i++)
- if (!freeblocks_[i])
- {
- freeblocks_[i] = (char *) pHeader;
- break;
- }
- LeaveCriticalSection (&lock_);
- }
- return false;
-}
-
-//------------------------------------------------------------------------
-// Call back routine
-static void CALLBACK
-wave_callback (HWAVE hWave, UINT msg, DWORD instance, DWORD param1,
- DWORD param2)
-{
- if (msg == WOM_DONE)
- {
- Audio *ptr = (Audio *) instance;
- ptr->callback_sampledone ((void *) param1);
- }
-}
-
-//------------------------------------------------------------------------
-// /dev/dsp handler
-static Audio *s_audio; // static instance of the Audio handler
-
-//------------------------------------------------------------------------
-// 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::setupwav (const char *pData, int nBytes)
-{
- int len;
- const char *end = pData + nBytes;
-
- 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];
- pData += 12;
- while (len && pData < end)
- {
- wavchunk * pChunk = (wavchunk *) pData;
- 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;
-
- // Open up audio device with correct frequency for wav file
- //
- // FIXME: should through away all the header & not output
- // it to the soundcard.
- s_audio->close ();
- if (s_audio->open (format->dwSamplesPerSec, format->wBitsPerSample,
- format->wChannels) == false)
- {
- s_audio->open (audiofreq_, audiobits_, audiochannels_);
- }
- else
- {
- audiofreq_ = format->dwSamplesPerSec;
- audiobits_ = format->wBitsPerSample;
- audiochannels_ = format->wChannels;
- }
- return true;
- }
-
- pData += blklen + sizeof (wavchunk);
- }
- return false;
-}
-
-//------------------------------------------------------------------------
-fhandler_dev_dsp::fhandler_dev_dsp ():
- fhandler_base (FH_OSS_DSP)
-{
-}
-
-fhandler_dev_dsp::~fhandler_dev_dsp ()
-{
-}
-
-int
-fhandler_dev_dsp::open (path_conv *, int flags, mode_t mode)
-{
- // currently we only support writing
- if ((flags & (O_WRONLY | O_RDONLY | O_RDWR)) != O_WRONLY)
- {
- set_errno (EACCES);
- return 0;
- }
-
- set_flags ((flags & ~O_TEXT) | O_BINARY);
-
- if (!s_audio)
- s_audio = new (audio_buf) Audio;
-
- // Work out initial sample format & frequency
- // dev/dsp defaults
- audioformat_ = AFMT_S8;
- audiofreq_ = 8000;
- audiobits_ = 8;
- audiochannels_ = 1;
-
- int res;
- if (!s_audio->open (audiofreq_, audiobits_, audiochannels_))
- res = 0;
- else
- {
- set_open_status ();
- res = 1;
- }
-
- debug_printf ("returns %d", res);
- return res;
-}
-
-int
-fhandler_dev_dsp::write (const void *ptr, size_t len)
-{
- if (s_audio->numbytesoutput () == 0)
- {
- // check for wave file & setup frequencys properly if possible.
- setupwav ((const char *) ptr, len);
-
- // Open audio device properly with callbacks.
- s_audio->close ();
- if (!s_audio->open (audiofreq_, audiobits_, audiochannels_, true))
- return 0;
- }
-
- s_audio->write (ptr, len);
- return len;
-}
-
-void __stdcall
-fhandler_dev_dsp::read (void *ptr, size_t& len)
-{
- return;
-}
-
-__off64_t
-fhandler_dev_dsp::lseek (__off64_t offset, int whence)
-{
- return 0;
-}
-
-int
-fhandler_dev_dsp::close (void)
-{
- s_audio->close ();
- return 0;
-}
-
-int
-fhandler_dev_dsp::dup (fhandler_base * child)
-{
- fhandler_dev_dsp *fhc = (fhandler_dev_dsp *) child;
-
- fhc->set_flags (get_flags ());
- fhc->audiochannels_ = audiochannels_;
- fhc->audiobits_ = audiobits_;
- fhc->audiofreq_ = audiofreq_;
- fhc->audioformat_ = audioformat_;
- return 0;
-}
-
-int
-fhandler_dev_dsp::ioctl (unsigned int cmd, void *ptr)
-{
- int *intptr = (int *) ptr;
- switch (cmd)
- {
-#define CASE(a) case a : debug_printf("/dev/dsp: ioctl %s", #a);
-
- CASE (SNDCTL_DSP_RESET)
- audioformat_ = AFMT_S8;
- audiofreq_ = 8000;
- audiobits_ = 8;
- audiochannels_ = 1;
- return 0;
-
- CASE (SNDCTL_DSP_GETBLKSIZE)
- *intptr = Audio::BLOCK_SIZE;
- return 0;
-
- CASE (SNDCTL_DSP_SETFMT)
- {
- int nBits = 0;
- if (*intptr == AFMT_S16_LE)
- nBits = 16;
- else if (*intptr == AFMT_U8)
- nBits = 8;
- else if (*intptr == AFMT_S8)
- nBits = 8;
- if (nBits)
- {
- s_audio->setformat (*intptr);
- s_audio->close ();
- if (s_audio->open (audiofreq_, nBits, audiochannels_) == true)
- {
- audiobits_ = nBits;
- return 0;
- }
- else
- {
- s_audio->open (audiofreq_, audiobits_, audiochannels_);
- return -1;
- }
- }
- }
- break;
-
- CASE (SNDCTL_DSP_SPEED)
- s_audio->close ();
- if (s_audio->open (*intptr, audiobits_, audiochannels_) == true)
- {
- audiofreq_ = *intptr;
- return 0;
- }
- else
- {
- s_audio->open (audiofreq_, audiobits_, audiochannels_);
- return -1;
- }
- break;
-
- CASE (SNDCTL_DSP_STEREO)
- {
- int nChannels = *intptr + 1;
-
- s_audio->close ();
- if (s_audio->open (audiofreq_, audiobits_, nChannels) == true)
- {
- audiochannels_ = nChannels;
- return 0;
- }
- else
- {
- s_audio->open (audiofreq_, audiobits_, audiochannels_);
- return -1;
- }
- }
- break;
-
- CASE (SNDCTL_DSP_GETOSPACE)
- {
- audio_buf_info *p = (audio_buf_info *) ptr;
-
- int nBlocks = s_audio->blocks ();
- int leftblocks = ((Audio::MAX_BLOCKS - nBlocks) - 1);
- if (leftblocks < 0)
- leftblocks = 0;
- if (leftblocks > 1)
- leftblocks = 1;
- int left = leftblocks * Audio::BLOCK_SIZE;
-
- p->fragments = leftblocks;
- p->fragstotal = Audio::MAX_BLOCKS;
- p->fragsize = Audio::BLOCK_SIZE;
- p->bytes = left;
-
- debug_printf ("ptr %p nblocks %d leftblocks %d left bytes %d ",
- ptr, nBlocks, leftblocks, left);
-
- return 0;
- }
- break;
-
- CASE (SNDCTL_DSP_SETFRAGMENT)
- {
- // Fake!! esound & mikmod require this on non PowerPC platforms.
- //
- return 0;
- }
- break;
-
- default:
- debug_printf ("/dev/dsp: ioctl not handled yet! FIXME:");
- break;
-
-#undef CASE
- };
- return -1;
-}
-
-void
-fhandler_dev_dsp::dump ()
-{
- paranoid_printf ("here, fhandler_dev_dsp");
-}
-
-void
-fhandler_dev_dsp::fixup_after_exec (HANDLE)
-{
- /* FIXME: Is there a better way to do this? */
- s_audio = new (audio_buf) Audio;
-}
diff --git a/winsup/cygwin/fhandler_floppy.cc b/winsup/cygwin/fhandler_floppy.cc
deleted file mode 100644
index fe338317b..000000000
--- a/winsup/cygwin/fhandler_floppy.cc
+++ /dev/null
@@ -1,315 +0,0 @@
-/* fhandler_floppy.cc. See fhandler.h for a description of the
- fhandler classes.
-
- Copyright 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 <sys/termios.h>
-#include <errno.h>
-#include <unistd.h>
-#include <winioctl.h>
-#include <asm/socket.h>
-#include <cygwin/hdreg.h>
-#include <cygwin/fs.h>
-#include "security.h"
-#include "fhandler.h"
-#include "cygerrno.h"
-
-/**********************************************************************/
-/* fhandler_dev_floppy */
-
-int
-fhandler_dev_floppy::is_eom (int win_error)
-{
- int ret = (win_error == ERROR_INVALID_PARAMETER);
- if (ret)
- debug_printf ("end of medium");
- return ret;
-}
-
-int
-fhandler_dev_floppy::is_eof (int)
-{
- int ret = 0;
- if (ret)
- debug_printf ("end of file");
- return ret;
-}
-
-fhandler_dev_floppy::fhandler_dev_floppy (int unit) : fhandler_dev_raw (FH_FLOPPY, unit)
-{
-}
-
-int
-fhandler_dev_floppy::open (path_conv *real_path, 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.
- *
- * Let's be smart: Let's take a multiplier of typical tar
- * and cpio buffer sizes by default!
- */
- devbufsiz = 61440L; /* 512L; */
- return fhandler_dev_raw::open (real_path, flags);
-}
-
-int
-fhandler_dev_floppy::close (void)
-{
- int ret;
-
- ret = writebuf ();
- if (ret)
- {
- fhandler_dev_raw::close ();
- return ret;
- }
- return fhandler_dev_raw::close ();
-}
-
-__off64_t
-fhandler_dev_floppy::lseek (__off64_t offset, int whence)
-{
- int ret;
- char buf[512];
- __off64_t drive_size = 0;
- __off64_t lloffset = offset;
- __off64_t current_position;
- __off64_t sector_aligned_offset;
- __off64_t bytes_left;
- DWORD low;
- LONG high = 0;
-
- DISK_GEOMETRY di;
- PARTITION_INFORMATION pi;
- DWORD bytes_read;
-
- if (!DeviceIoControl (get_handle (),
- IOCTL_DISK_GET_DRIVE_GEOMETRY,
- NULL, 0,
- &di, sizeof (di),
- &bytes_read, NULL))
- {
- __seterrno ();
- return -1;
- }
- debug_printf ("disk geometry: (%ld cyl)*(%ld trk)*(%ld sec)*(%ld bps)",
- di.Cylinders.LowPart,
- di.TracksPerCylinder,
- di.SectorsPerTrack,
- di.BytesPerSector);
- if (DeviceIoControl (get_handle (),
- IOCTL_DISK_GET_PARTITION_INFO,
- NULL, 0,
- &pi, sizeof (pi),
- &bytes_read, NULL))
- {
- debug_printf ("partition info: %ld (%ld)",
- pi.StartingOffset.LowPart,
- pi.PartitionLength.LowPart);
- drive_size = pi.PartitionLength.QuadPart;
- }
- else
- {
- drive_size = di.Cylinders.QuadPart * di.TracksPerCylinder *
- di.SectorsPerTrack * di.BytesPerSector;
- }
- debug_printf ("drive size: %ld", drive_size);
-
- if (whence == SEEK_END && drive_size > 0)
- {
- lloffset = offset + drive_size;
- whence = SEEK_SET;
- }
-
- if (whence == SEEK_CUR)
- {
- low = SetFilePointer (get_handle (), 0, &high, FILE_CURRENT);
- if (low == INVALID_SET_FILE_POINTER && GetLastError ())
- {
- __seterrno ();
- return -1;
- }
- current_position = low + ((__off64_t) high << 32);
- if (is_writing)
- current_position += devbufend - devbufstart;
- else
- current_position -= devbufend - devbufstart;
-
- lloffset += current_position;
- whence = SEEK_SET;
- }
-
- if (lloffset < 0 ||
- drive_size > 0 && lloffset > drive_size)
- {
- set_errno (EINVAL);
- return -1;
- }
-
- /* FIXME: sector can possibly be not 512 bytes long */
- sector_aligned_offset = (lloffset / 512) * 512;
- bytes_left = lloffset - sector_aligned_offset;
-
- if (whence == SEEK_SET)
- {
- /* Invalidate buffer. */
- ret = writebuf ();
- if (ret)
- return ret;
- devbufstart = devbufend = 0;
-
- low = sector_aligned_offset & 0xffffffff;
- high = sector_aligned_offset >> 32;
- if (SetFilePointer (get_handle (), low, &high, FILE_BEGIN)
- == INVALID_SET_FILE_POINTER && GetLastError ())
- {
- __seterrno ();
- return -1;
- }
-
- size_t len = bytes_left;
- raw_read (buf, len);
- return sector_aligned_offset + bytes_left;
- }
-
- set_errno (EINVAL);
- return -1;
-}
-
-int
-fhandler_dev_floppy::ioctl (unsigned int cmd, void *buf)
-{
- DISK_GEOMETRY di;
- PARTITION_INFORMATION pi;
- DWORD bytes_read;
- __off64_t drive_size = 0;
- __off64_t start = 0;
- switch (cmd)
- {
- case HDIO_GETGEO:
- {
- debug_printf ("HDIO_GETGEO");
- if (!DeviceIoControl (get_handle (),
- IOCTL_DISK_GET_DRIVE_GEOMETRY,
- NULL, 0,
- &di, sizeof (di),
- &bytes_read, NULL))
- {
- __seterrno ();
- return -1;
- }
- debug_printf ("disk geometry: (%ld cyl)*(%ld trk)*(%ld sec)*(%ld bps)",
- di.Cylinders.LowPart,
- di.TracksPerCylinder,
- di.SectorsPerTrack,
- di.BytesPerSector);
- if (DeviceIoControl (get_handle (),
- IOCTL_DISK_GET_PARTITION_INFO,
- NULL, 0,
- &pi, sizeof (pi),
- &bytes_read, NULL))
- {
- debug_printf ("partition info: %ld (%ld)",
- pi.StartingOffset.LowPart,
- pi.PartitionLength.LowPart);
- start = pi.StartingOffset.QuadPart >> 9ULL;
- }
- struct hd_geometry *geo = (struct hd_geometry *) buf;
- geo->heads = di.TracksPerCylinder;
- geo->sectors = di.SectorsPerTrack;
- geo->cylinders = di.Cylinders.LowPart;
- geo->start = start;
- return 0;
- }
- case BLKGETSIZE:
- case BLKGETSIZE64:
- {
- debug_printf ("BLKGETSIZE");
- if (!DeviceIoControl (get_handle (),
- IOCTL_DISK_GET_DRIVE_GEOMETRY,
- NULL, 0,
- &di, sizeof (di),
- &bytes_read, NULL))
- {
- __seterrno ();
- return -1;
- }
- debug_printf ("disk geometry: (%ld cyl)*(%ld trk)*(%ld sec)*(%ld bps)",
- di.Cylinders.LowPart,
- di.TracksPerCylinder,
- di.SectorsPerTrack,
- di.BytesPerSector);
- if (DeviceIoControl (get_handle (),
- IOCTL_DISK_GET_PARTITION_INFO,
- NULL, 0,
- &pi, sizeof (pi),
- &bytes_read, NULL))
- {
- debug_printf ("partition info: %ld (%ld)",
- pi.StartingOffset.LowPart,
- pi.PartitionLength.LowPart);
- drive_size = pi.PartitionLength.QuadPart;
- }
- else
- {
- drive_size = di.Cylinders.QuadPart * di.TracksPerCylinder *
- di.SectorsPerTrack * di.BytesPerSector;
- }
- 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;
- }
- return 0;
- }
- case BLKSSZGET:
- {
- debug_printf ("BLKSSZGET");
- if (!DeviceIoControl (get_handle (),
- IOCTL_DISK_GET_DRIVE_GEOMETRY,
- NULL, 0,
- &di, sizeof (di),
- &bytes_read, NULL))
- {
- __seterrno ();
- return -1;
- }
- debug_printf ("disk geometry: (%ld cyl)*(%ld trk)*(%ld sec)*(%ld bps)",
- di.Cylinders.LowPart,
- di.TracksPerCylinder,
- di.SectorsPerTrack,
- di.BytesPerSector);
- *(int *)buf = di.BytesPerSector;
- return 0;
- }
- default:
- return fhandler_dev_raw::ioctl (cmd, buf);
- }
-}
-
diff --git a/winsup/cygwin/fhandler_mem.cc b/winsup/cygwin/fhandler_mem.cc
deleted file mode 100644
index 089b56b4b..000000000
--- a/winsup/cygwin/fhandler_mem.cc
+++ /dev/null
@@ -1,442 +0,0 @@
-/* fhandler_mem.cc. See fhandler.h for a description of the fhandler classes.
-
- 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. */
-
-#include "winsup.h"
-#include <errno.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <ntdef.h>
-
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "ntdll.h"
-
-/**********************************************************************/
-/* fhandler_dev_mem */
-
-fhandler_dev_mem::fhandler_dev_mem (int nunit)
- : fhandler_base (FH_MEM), unit (nunit)
-{
- /* Reading physical memory only supported on NT/W2K. */
- if (!wincap.has_physical_mem_access ())
- {
- mem_size = 0;
- return;
- }
-
- if (unit == 1) /* /dev/mem */
- {
- NTSTATUS ret;
- SYSTEM_BASIC_INFORMATION sbi;
- if ((ret = NtQuerySystemInformation (SystemBasicInformation, (PVOID) &sbi,
- sizeof sbi, NULL)) != STATUS_SUCCESS)
- {
- __seterrno_from_win_error (RtlNtStatusToDosError (ret));
- debug_printf("NtQuerySystemInformation: ret = %d, Dos(ret) = %d",
- ret, RtlNtStatusToDosError (ret));
- mem_size = 0;
- }
- else
- mem_size = sbi.PhysicalPageSize * sbi.NumberOfPhysicalPages;
- debug_printf ("MemSize: %d MB", mem_size >> 20);
- }
- else if (unit == 2) /* /dev/kmem - Not yet supported */
- {
- mem_size = 0;
- debug_printf ("KMemSize: %d MB", mem_size >> 20);
- }
- else if (unit == 4) /* /dev/port == First 64K of /dev/mem */
- {
- mem_size = 65536;
- debug_printf ("PortSize: 64 KB");
- }
- else
- {
- mem_size = 0;
- debug_printf ("Illegal minor number!!!");
- }
-}
-
-fhandler_dev_mem::~fhandler_dev_mem (void)
-{
-}
-
-int
-fhandler_dev_mem::open (path_conv *, int flags, mode_t)
-{
- if (!wincap.has_physical_mem_access ())
- {
- set_errno (ENOENT);
- debug_printf ("%s is accessible under NT/W2K only",
- unit == 1 ? "/dev/mem" :
- unit == 2 ? "/dev/kmem" :
- "/dev/port");
- return 0;
- }
-
- /* 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_RDONLY | O_WRONLY | O_RDWR)) == O_RDONLY)
- {
- set_access (GENERIC_READ);
- section_access = SECTION_MAP_READ;
- }
- else if ((flags & (O_RDONLY | O_WRONLY | O_RDWR)) == 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_win_error (RtlNtStatusToDosError (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 + getpagesize () - 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_win_error (RtlNtStatusToDosError (ret));
- return -1;
- }
-
- memcpy ((char *) viewmem + (pos - phys.QuadPart), ptr, ulen);
-
- if (!NT_SUCCESS (ret = NtUnmapViewOfSection (INVALID_HANDLE_VALUE, viewmem)))
- {
- __seterrno_from_win_error (RtlNtStatusToDosError (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);
- (ssize_t) ulen = -1;
- return;
- }
-
- if (pos + ulen > mem_size)
- ulen = mem_size - pos;
-
- PHYSICAL_ADDRESS phys;
- NTSTATUS ret;
- void *viewmem = NULL;
- DWORD len = ulen + getpagesize () - 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_win_error (RtlNtStatusToDosError (ret));
- (ssize_t) ulen = -1;
- return;
- }
-
- memcpy (ptr, (char *) viewmem + (pos - phys.QuadPart), ulen);
-
- if (!NT_SUCCESS (ret = NtUnmapViewOfSection (INVALID_HANDLE_VALUE, viewmem)))
- {
- __seterrno_from_win_error (RtlNtStatusToDosError (ret));
- (ssize_t) ulen = -1;
- return;
- }
-
- pos += ulen;
- return;
-}
-
-int
-fhandler_dev_mem::close (void)
-{
- return fhandler_base::close ();
-}
-
-__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;
-}
-
-HANDLE
-fhandler_dev_mem::mmap (caddr_t *addr, size_t len, DWORD access,
- int flags, __off64_t off)
-{
- if (off >= mem_size
- || (DWORD) len >= mem_size
- || off + len >= mem_size)
- {
- set_errno (EINVAL);
- syscall_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);
-
- ACCESS_MASK section_access;
- ULONG protect;
-
- if (access & FILE_MAP_COPY)
- {
- section_access = SECTION_MAP_READ | SECTION_MAP_WRITE;
- protect = PAGE_WRITECOPY;
- }
- else if (access & FILE_MAP_WRITE)
- {
- section_access = SECTION_MAP_READ | SECTION_MAP_WRITE;
- protect = PAGE_READWRITE;
- }
- else
- {
- section_access = SECTION_MAP_READ;
- protect = PAGE_READONLY;
- }
-
- HANDLE h;
- NTSTATUS ret = NtOpenSection (&h, section_access, &attr);
- if (!NT_SUCCESS (ret))
- {
- __seterrno_from_win_error (RtlNtStatusToDosError (ret));
- syscall_printf ("-1 = mmap(): NtOpenSection failed with %E");
- return INVALID_HANDLE_VALUE;
- }
-
- PHYSICAL_ADDRESS phys;
- void *base = *addr;
- DWORD dlen = len;
-
- phys.QuadPart = (ULONGLONG) off;
-
- if ((ret = NtMapViewOfSection (h,
- INVALID_HANDLE_VALUE,
- &base,
- 0L,
- dlen,
- &phys,
- &dlen,
- ViewShare /*??*/,
- 0,
- protect)) != STATUS_SUCCESS)
- {
- __seterrno_from_win_error (RtlNtStatusToDosError (ret));
- syscall_printf ("-1 = mmap(): NtMapViewOfSection failed with %E");
- return INVALID_HANDLE_VALUE;
- }
- if ((flags & MAP_FIXED) && base != *addr)
- {
- set_errno (EINVAL);
- syscall_printf ("-1 = mmap(): address shift with MAP_FIXED given");
- NtUnmapViewOfSection (INVALID_HANDLE_VALUE, base);
- 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_win_error (RtlNtStatusToDosError (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, DWORD access, DWORD offset,
- DWORD size, void *address)
-{
- DWORD ret;
- PHYSICAL_ADDRESS phys;
- void *base = address;
- DWORD dlen = size;
- ULONG protect;
-
- if (access & FILE_MAP_COPY)
- protect = PAGE_WRITECOPY;
- else if (access & FILE_MAP_WRITE)
- protect = PAGE_READWRITE;
- else
- protect = PAGE_READONLY;
-
- phys.QuadPart = (ULONGLONG) offset;
-
- if ((ret = NtMapViewOfSection (h,
- INVALID_HANDLE_VALUE,
- &base,
- 0L,
- dlen,
- &phys,
- &dlen,
- ViewShare /*??*/,
- 0,
- protect)) != STATUS_SUCCESS)
- {
- __seterrno_from_win_error (RtlNtStatusToDosError (ret));
- syscall_printf ("-1 = fixup_mmap_after_fork(): NtMapViewOfSection failed with %E");
- return FALSE;
- }
- return base == address;
-}
-
-int
-fhandler_dev_mem::fstat (struct __stat64 *buf, path_conv *pc)
-{
- this->fhandler_base::fstat (buf, pc);
- 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;
- buf->st_blksize = getpagesize ();
-
- 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;
-}
-
-void
-fhandler_dev_mem::dump ()
-{
- paranoid_printf ("here, fhandler_dev_mem");
-}
diff --git a/winsup/cygwin/fhandler_proc.cc b/winsup/cygwin/fhandler_proc.cc
deleted file mode 100644
index 2bfe48a94..000000000
--- a/winsup/cygwin/fhandler_proc.cc
+++ /dev/null
@@ -1,505 +0,0 @@
-/* fhandler_proc.cc: fhandler for /proc virtual filesystem
-
- 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 <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/cygwin.h>
-#include <ntdef.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "pinfo.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include <assert.h>
-#include <sys/utsname.h>
-#include <sys/param.h>
-#include "ntdll.h"
-
-#define _COMPILING_NEWLIB
-#include <dirent.h>
-
-/* 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
-
-/* names of objects in /proc */
-static const char *proc_listing[] = {
- ".",
- "..",
- "loadavg",
- "meminfo",
- "registry",
- "stat",
- "version",
- "uptime",
- 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
-};
-
-/* name of the /proc filesystem */
-const char proc[] = "/proc";
-const int proc_len = sizeof (proc) - 1;
-
-static off_t format_proc_meminfo (char *destbuf, size_t maxsize);
-static off_t format_proc_stat (char *destbuf, size_t maxsize);
-static off_t format_proc_uptime (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,
- * <0 if path is a file.
- */
-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]))
- return (proc_fhandlers[i] == FH_PROC) ? -1 : 1;
- return 0;
-}
-
-fhandler_proc::fhandler_proc ():
- fhandler_virtual (FH_PROC)
-{
-}
-
-fhandler_proc::fhandler_proc (DWORD devtype):
- fhandler_virtual (devtype)
-{
-}
-
-int
-fhandler_proc::fstat (struct __stat64 *buf, path_conv *pc)
-{
- const char *path = get_name ();
- debug_printf ("fstat (%s)", path);
-
- path += proc_len;
- (void) fhandler_base::fstat (buf, pc);
-
- buf->st_mode &= ~_IFMT & NO_W;
-
- if (!*path)
- {
- buf->st_nlink = PROC_LINK_COUNT;
- 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
- {
- buf->st_mode &= NO_X;
- buf->st_mode |= S_IFREG;
- }
- return 0;
- }
- }
- set_errno (ENOENT);
- return -1;
-}
-
-struct dirent *
-fhandler_proc::readdir (DIR * dir)
-{
- if (dir->__d_position >= PROC_LINK_COUNT)
- {
- winpids pids;
- int found = 0;
- for (unsigned i = 0; i < pids.npids; i++)
- if (found++ == dir->__d_position - PROC_LINK_COUNT)
- {
- __small_sprintf (dir->__d_dirent->d_name, "%d", pids[i]->pid);
- dir->__d_position++;
- return dir->__d_dirent;
- }
- set_errno (ENMFILE);
- return NULL;
- }
-
- strcpy (dir->__d_dirent->d_name, proc_listing[dir->__d_position++]);
- syscall_printf ("%p = readdir (%p) (%s)", &dir->__d_dirent, dir,
- dir->__d_dirent->d_name);
- return dir->__d_dirent;
-}
-
-int
-fhandler_proc::open (path_conv *pc, int flags, mode_t mode)
-{
- int proc_file_no = -1;
-
- int res = fhandler_virtual::open (pc, flags, mode);
- if (!res)
- goto out;
-
- set_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 *) realloc (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 *) realloc (filebuf, bufalloc = 80);
- filesize = format_proc_uptime (filebuf, bufalloc);
- break;
- }
- case PROC_STAT:
- {
- filebuf = (char *) realloc (filebuf, bufalloc = 2048);
- 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 *) realloc (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 *) realloc (filebuf, bufalloc = 2048);
- filesize = format_proc_meminfo (filebuf, bufalloc);
- break;
- }
- }
- return true;
-}
-
-static
-off_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;
- swap_total = memory_status.dwTotalPageFile;
- swap_free = memory_status.dwAvailPageFile;
- 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
-off_t
-format_proc_uptime (char *destbuf, size_t maxsize)
-{
- unsigned long long uptime = 0ULL, idle_time = 0ULL;
- SYSTEM_PROCESSOR_TIMES spt;
-
- NTSTATUS ret = NtQuerySystemInformation (SystemProcessorTimes, (PVOID) &spt,
- sizeof spt, NULL);
- if (!ret && GetLastError () == ERROR_PROC_NOT_FOUND)
- uptime = GetTickCount () / 10;
- else if (ret != STATUS_SUCCESS)
- {
- __seterrno_from_win_error (RtlNtStatusToDosError (ret));
- debug_printf("NtQuerySystemInformation: ret = %d, "
- "Dos(ret) = %d",
- ret, RtlNtStatusToDosError (ret));
- return 0;
- }
- else
- {
- idle_time = spt.IdleTime.QuadPart / 100000ULL;
- uptime = (spt.KernelTime.QuadPart +
- spt.UserTime.QuadPart) / 100000ULL;
- }
-
- return __small_sprintf (destbuf, "%U.%02u %U.%02u\n",
- uptime / 100, long (uptime % 100),
- idle_time / 100, long (idle_time % 100));
-}
-
-static
-off_t
-format_proc_stat (char *destbuf, size_t maxsize)
-{
- unsigned long long user_time = 0ULL, kernel_time = 0ULL, idle_time = 0ULL;
- 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;
-
- if (wincap.is_winnt ())
- {
- NTSTATUS ret;
- SYSTEM_PROCESSOR_TIMES spt;
- SYSTEM_PERFORMANCE_INFORMATION spi;
- SYSTEM_TIME_OF_DAY_INFORMATION stodi;
- ret = NtQuerySystemInformation (SystemProcessorTimes,
- (PVOID) &spt,
- sizeof spt, NULL);
- if (ret == STATUS_SUCCESS)
- 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_win_error (RtlNtStatusToDosError (ret));
- debug_printf("NtQuerySystemInformation: ret = %d, "
- "Dos(ret) = %d",
- ret, RtlNtStatusToDosError (ret));
- return 0;
- }
- kernel_time = (spt.KernelTime.QuadPart - spt.IdleTime.QuadPart) * HZ / 10000000ULL;
- user_time = spt.UserTime.QuadPart * HZ / 10000000ULL;
- idle_time = spt.IdleTime.QuadPart * HZ / 10000000ULL;
- interrupt_count = spt.InterruptCount;
- 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.
- * }
- */
- return __small_sprintf (destbuf, "cpu %U %U %U %U\n"
- "page %u %u\n"
- "swap %u %u\n"
- "intr %u\n"
- "ctxt %u\n"
- "btime %u\n",
- user_time, 0ULL,
- kernel_time, idle_time,
- pages_in, pages_out,
- swap_in, swap_out,
- interrupt_count,
- context_switches,
- boot_time);
-}
diff --git a/winsup/cygwin/fhandler_process.cc b/winsup/cygwin/fhandler_process.cc
deleted file mode 100644
index 7cadcb40d..000000000
--- a/winsup/cygwin/fhandler_process.cc
+++ /dev/null
@@ -1,751 +0,0 @@
-/* fhandler_process.cc: fhandler for /proc/<pid> virtual filesystem
-
- 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 <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/cygwin.h>
-#include <ntdef.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "pinfo.h"
-#include "path.h"
-#include "shared_info.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "ntdll.h"
-#include <sys/param.h>
-#include <assert.h>
-#include <sys/sysmacros.h>
-
-#define _COMPILING_NEWLIB
-#include <dirent.h>
-
-static const int PROCESS_PPID = 2;
-static const int PROCESS_EXENAME = 3;
-static const int PROCESS_WINPID = 4;
-static const int PROCESS_WINEXENAME = 5;
-static const int PROCESS_STATUS = 6;
-static const int PROCESS_UID = 7;
-static const int PROCESS_GID = 8;
-static const int PROCESS_PGID = 9;
-static const int PROCESS_SID = 10;
-static const int PROCESS_CTTY = 11;
-static const int PROCESS_STAT = 12;
-static const int PROCESS_STATM = 13;
-static const int PROCESS_CMDLINE = 14;
-
-static const char * const process_listing[] =
-{
- ".",
- "..",
- "ppid",
- "exename",
- "winpid",
- "winexename",
- "status",
- "uid",
- "gid",
- "pgid",
- "sid",
- "ctty",
- "stat",
- "statm",
- "cmdline",
- NULL
-};
-
-static const int PROCESS_LINK_COUNT =
- (sizeof (process_listing) / sizeof (const char *)) - 1;
-
-static off_t format_process_stat (_pinfo *p, char *destbuf, size_t maxsize);
-static off_t format_process_status (_pinfo *p, char *destbuf, size_t maxsize);
-static off_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,
- * <0 if path is a file.
- */
-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]))
- return -1;
- return 0;
-}
-
-fhandler_process::fhandler_process ():
- fhandler_proc (FH_PROCESS)
-{
-}
-
-int
-fhandler_process::fstat (struct __stat64 *buf, path_conv *pc)
-{
- const char *path = get_name ();
- int file_type = exists ();
- (void) fhandler_base::fstat (buf, pc);
- 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:
- buf->st_mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH;
- return 0;
- 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;
- buf->st_nlink = PROCESS_LINK_COUNT;
- return 0;
- default:
- case -1:
- buf->st_uid = p->uid;
- buf->st_gid = p->gid;
- buf->st_mode |= S_IFREG | S_IRUSR | S_IRGRP | S_IROTH;
- return 0;
- }
-}
-
-struct dirent *
-fhandler_process::readdir (DIR * dir)
-{
- if (dir->__d_position >= PROCESS_LINK_COUNT)
- {
- set_errno (ENMFILE);
- return NULL;
- }
- strcpy (dir->__d_dirent->d_name, process_listing[dir->__d_position++]);
- syscall_printf ("%p = readdir (%p) (%s)", &dir->__d_dirent, dir,
- dir->__d_dirent->d_name);
- return dir->__d_dirent;
-}
-
-int
-fhandler_process::open (path_conv *pc, int flags, mode_t mode)
-{
- int process_file_no = -1;
-
- int res = fhandler_virtual::open (pc, flags, mode);
- if (!res)
- goto out;
-
- set_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 (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 ()
-{
- pinfo p (pid);
-
- if (!p)
- {
- set_errno (ENOENT);
- return false;
- }
-
- switch (fileid)
- {
- case PROCESS_UID:
- case PROCESS_GID:
- case PROCESS_PGID:
- case PROCESS_SID:
- case PROCESS_CTTY:
- case PROCESS_PPID:
- {
- filebuf = (char *) realloc (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_CMDLINE:
- {
- if (filebuf)
- free (filebuf);
- filebuf = p->cmdline (filesize);
- if (!filebuf || !*filebuf)
- filebuf = strdup ("<defunct>");
- break;
- }
- case PROCESS_EXENAME:
- {
- filebuf = (char *) realloc (filebuf, bufalloc = MAX_PATH);
- if (p->process_state & (PID_ZOMBIE | PID_EXITED))
- strcpy (filebuf, "<defunct>");
- else
- {
- mount_table->conv_to_posix_path (p->progname, filebuf, 1);
- int len = strlen (filebuf);
- if (len > 4)
- {
- char *s = filebuf + len - 4;
- if (strcasecmp (s, ".exe") == 0)
- *s = 0;
- }
- }
- filesize = strlen (filebuf);
- break;
- }
- case PROCESS_WINPID:
- {
- filebuf = (char *) realloc (filebuf, bufalloc = 40);
- __small_sprintf (filebuf, "%d\n", p->dwProcessId);
- filesize = strlen (filebuf);
- break;
- }
- case PROCESS_WINEXENAME:
- {
- int len = strlen (p->progname);
- filebuf = (char *) realloc (filebuf, bufalloc = (len + 2));
- strcpy (filebuf, p->progname);
- filebuf[len] = '\n';
- filesize = len + 1;
- break;
- }
- case PROCESS_STATUS:
- {
- filebuf = (char *) realloc (filebuf, bufalloc = 2048);
- filesize = format_process_status (*p, filebuf, bufalloc);
- break;
- }
- case PROCESS_STAT:
- {
- filebuf = (char *) realloc (filebuf, bufalloc = 2048);
- filesize = format_process_stat (*p, filebuf, bufalloc);
- break;
- }
- case PROCESS_STATM:
- {
- filebuf = (char *) realloc (filebuf, bufalloc = 2048);
- filesize = format_process_statm (*p, filebuf, bufalloc);
- break;
- }
- }
-
- return true;
-}
-
-static
-off_t
-format_process_stat (_pinfo *p, char *destbuf, size_t maxsize)
-{
- char cmd[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_ZOMBIE | PID_EXITED))
- strcpy (cmd, "<defunct>");
- 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 (strcasecmp (s, ".exe") == 0)
- *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_ZOMBIE)
- state = 'Z';
- else if (p->process_state & PID_STOPPED)
- state = 'T';
- else if (wincap.is_winnt ())
- state = get_process_state (p->dwProcessId);
- 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_win_error (RtlNtStatusToDosError (ret));
- debug_printf ("NtQueryInformationProcess: ret = %d, "
- "Dos(ret) = %d",
- ret, RtlNtStatusToDosError (ret));
- return 0;
- }
- fault_count = vmc.PageFaultCount;
- utime = put.UserTime.QuadPart * HZ / 10000000ULL;
- stime = put.KernelTime.QuadPart * HZ / 10000000ULL;
- 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.KernelTime.QuadPart + spt.UserTime.QuadPart) * HZ / 10000000ULL;
- priority = pbi.BasePriority;
- unsigned page_size = getpagesize ();
- vmsize = vmc.VirtualSize;
- vmrss = vmc.WorkingSetSize / page_size;
- vmmaxrss = ql.MaximumWorkingSetSize / page_size;
- }
- else
- {
- start_time = (GetTickCount () / 1000 - time (NULL) + p->start_time) * HZ;
- }
- 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
-off_t
-format_process_status (_pinfo *p, char *destbuf, size_t maxsize)
-{
- char cmd[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_ZOMBIE | PID_EXITED))
- strcpy (cmd, "<defunct>");
- 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 (strcasecmp (s, ".exe") == 0)
- *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_ZOMBIE)
- 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 = getpagesize ();
- 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: %s\n"
- "State: %c (%s)\n"
- "Tgid: %d\n"
- "Pid: %d\n"
- "PPid: %d\n"
- "Uid: %d %d %d %d\n"
- "Gid: %d %d %d %d\n"
- "VmSize: %8d kB\n"
- "VmLck: %8d kB\n"
- "VmRSS: %8d kB\n"
- "VmData: %8d kB\n"
- "VmStk: %8d kB\n"
- "VmExe: %8d kB\n"
- "VmLib: %8d kB\n"
- "SigPnd: %016x\n"
- "SigBlk: %016x\n"
- "SigIgn: %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
-off_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 = new ULONG[n];
- unsigned page_size = getpagesize ();
- 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)
- delete [] p, p = new ULONG[n *= 2];
- 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.VirtualSize / page_size;
-out:
- delete [] p;
- CloseHandle (hProcess);
- return res;
-}
diff --git a/winsup/cygwin/fhandler_random.cc b/winsup/cygwin/fhandler_random.cc
deleted file mode 100644
index 6d02db587..000000000
--- a/winsup/cygwin/fhandler_random.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-/* fhandler_random.cc: code to access /dev/random and /dev/urandom
-
- Copyright 2000, 2001, 2002 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 <errno.h>
-#include <limits.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-
-#define RANDOM 8
-#define URANDOM 9
-
-#define PSEUDO_MULTIPLIER (6364136223846793005LL)
-#define PSEUDO_SHIFTVAL (21)
-
-fhandler_dev_random::fhandler_dev_random (int nunit)
- : fhandler_base (FH_RANDOM), unit (nunit), crypt_prov ((HCRYPTPROV) NULL)
-{
-}
-
-int
-fhandler_dev_random::open (path_conv *, int flags, mode_t)
-{
- set_flags ((flags & ~O_TEXT) | O_BINARY);
- set_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) && unit == 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);
- (ssize_t) len = -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 (unit == URANDOM)
- {
- len = pseudo_read (ptr, len);
- return;
- }
-
- __seterrno ();
- (ssize_t) len = -1;
-}
-
-__off64_t
-fhandler_dev_random::lseek (__off64_t, int)
-{
- return 0;
-}
-
-int
-fhandler_dev_random::close (void)
-{
- if (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->unit = unit;
- fhr->crypt_prov = (HCRYPTPROV)NULL;
- return 0;
-}
-
-void
-fhandler_dev_random::dump ()
-{
- paranoid_printf ("here, fhandler_dev_random");
-}
-
diff --git a/winsup/cygwin/fhandler_raw.cc b/winsup/cygwin/fhandler_raw.cc
deleted file mode 100644
index 45ce414dc..000000000
--- a/winsup/cygwin/fhandler_raw.cc
+++ /dev/null
@@ -1,569 +0,0 @@
-/* fhandler_raw.cc. See fhandler.h for a description of the fhandler classes.
-
- Copyright 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 <sys/termios.h>
-#include <errno.h>
-#include <unistd.h>
-
-#include <cygwin/rdevio.h>
-#include <sys/mtio.h>
-#include <ntdef.h>
-#include "cygerrno.h"
-#include "perprocess.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "ntdll.h"
-
-/* static wrapper functions to hide the effect of media changes and
- bus resets which occurs after a new media is inserted. This is
- also related to the used tape device. */
-
-static BOOL write_file (HANDLE fh, const void *buf, DWORD to_write,
- DWORD *written, int *err)
-{
- BOOL ret;
-
- *err = 0;
- if (!(ret = WriteFile (fh, buf, to_write, written, 0)))
- {
- if ((*err = GetLastError ()) == ERROR_MEDIA_CHANGED
- || *err == ERROR_BUS_RESET)
- {
- *err = 0;
- if (!(ret = WriteFile (fh, buf, to_write, written, 0)))
- *err = GetLastError ();
- }
- }
- syscall_printf ("%d (err %d) = WriteFile (%d, %d, write %d, written %d, 0)",
- ret, *err, fh, buf, to_write, *written);
- return ret;
-}
-
-static BOOL read_file (HANDLE fh, void *buf, DWORD to_read,
- DWORD *read, int *err)
-{
- BOOL ret;
-
- *err = 0;
- if (!(ret = ReadFile (fh, buf, to_read, read, 0)))
- {
- if ((*err = GetLastError ()) == ERROR_MEDIA_CHANGED
- || *err == ERROR_BUS_RESET)
- {
- *err = 0;
- if (!(ret = ReadFile (fh, buf, to_read, read, 0)))
- *err = GetLastError ();
- }
- }
- syscall_printf ("%d (err %d) = ReadFile (%d, %d, to_read %d, read %d, 0)",
- ret, *err, fh, buf, to_read, *read);
- return ret;
-}
-
-/**********************************************************************/
-/* fhandler_dev_raw */
-
-void
-fhandler_dev_raw::clear (void)
-{
- devbuf = NULL;
- devbufsiz = 0;
- devbufstart = 0;
- devbufend = 0;
- eom_detected = 0;
- eof_detected = 0;
- lastblk_to_read = 0;
- varblkop = 0;
-}
-
-int
-fhandler_dev_raw::writebuf (void)
-{
- DWORD written;
- int ret = 0;
-
- if (is_writing && devbuf && devbufend)
- {
- DWORD to_write;
- int ret = 0;
-
- memset (devbuf + devbufend, 0, devbufsiz - devbufend);
- if (get_device () != FH_TAPE)
- to_write = ((devbufend - 1) / 512 + 1) * 512;
- else if (varblkop)
- to_write = devbufend;
- else
- to_write = devbufsiz;
- if (!write_file (get_handle (), devbuf, to_write, &written, &ret)
- && is_eom (ret))
- eom_detected = 1;
- if (written)
- has_written = 1;
- devbufstart = devbufend = 0;
- }
- is_writing = 0;
- return ret;
-}
-
-fhandler_dev_raw::fhandler_dev_raw (DWORD devtype, int nunit)
- : fhandler_base (devtype), unit (nunit)
-{
- clear ();
- set_need_fork_fixup ();
-}
-
-fhandler_dev_raw::~fhandler_dev_raw (void)
-{
- if (devbufsiz > 1L)
- delete [] devbuf;
- clear ();
-}
-
-int
-fhandler_dev_raw::open (path_conv *real_path, int flags, mode_t)
-{
- if (!wincap.has_raw_devices ())
- {
- set_errno (ENOENT);
- debug_printf ("%s is accessible under NT/W2K only",real_path->get_win32());
- return 0;
- }
-
- /* Check for illegal flags. */
- if (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;
-
- DWORD access = GENERIC_READ | SYNCHRONIZE;
- if (get_device () == FH_TAPE
- || (flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_WRONLY
- || (flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_RDWR)
- access |= GENERIC_WRITE;
-
- extern void str2buf2uni (UNICODE_STRING &, WCHAR *, const char *);
- UNICODE_STRING dev;
- WCHAR devname[MAX_PATH + 1];
- str2buf2uni (dev, devname, real_path->get_win32 ());
- OBJECT_ATTRIBUTES attr;
- InitializeObjectAttributes (&attr, &dev, OBJ_CASE_INSENSITIVE, NULL, NULL);
-
- HANDLE h;
- IO_STATUS_BLOCK io;
- NTSTATUS status = NtOpenFile (&h, access, &attr, &io, wincap.shared (),
- FILE_SYNCHRONOUS_IO_NONALERT);
- if (!NT_SUCCESS (status))
- {
- __seterrno_from_win_error (RtlNtStatusToDosError (status));
- return 0;
- }
-
- set_io_handle (h);
- set_flags ((flags & ~O_TEXT) | O_BINARY);
-
- if (devbufsiz > 1L)
- devbuf = new char [devbufsiz];
-
- return 1;
-}
-
-int
-fhandler_dev_raw::close (void)
-{
- return fhandler_base::close ();
-}
-
-void
-fhandler_dev_raw::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;
-
- /* In mode O_RDWR the buffer has to be written to device first */
- ret = writebuf ();
- if (ret)
- {
- set_errno (is_eom (ret) ? ENOSPC : EACCES);
- goto err;
- }
-
- /* Checking a previous end of file */
- if (eof_detected && !lastblk_to_read)
- {
- eof_detected = 0;
- ulen = 0;
- return;
- }
-
- /* 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, devbufstart - devbufend);
- memcpy (ptr, devbuf + devbufstart, bytes_to_read);
- len -= bytes_to_read;
- ptr = (void *) ((char *) ptr + bytes_to_read);
- bytes_read += bytes_to_read;
- devbufstart += bytes_to_read;
-
- if (lastblk_to_read)
- {
- lastblk_to_read = 0;
- break;
- }
- }
- if (len > 0)
- {
- if (!varblkop && len >= devbufsiz)
- {
- if (get_device () == FH_TAPE)
- bytes_to_read = (len / devbufsiz) * devbufsiz;
- else
- bytes_to_read = (len / 512) * 512;
- tgt = (char *) ptr;
- debug_printf ("read %d bytes direct from file",bytes_to_read);
- }
- else
- {
- bytes_to_read = devbufsiz;
- tgt = devbuf;
- if (varblkop)
- debug_printf ("read variable bytes from file into buffer");
- else
- debug_printf ("read %d bytes from file into buffer",
- bytes_to_read);
- }
- if (!read_file (get_handle (), tgt, bytes_to_read, &read2, &ret))
- {
- if (!is_eof (ret) && !is_eom (ret))
- {
- debug_printf ("return -1, set errno to EACCES");
- set_errno (EACCES);
- goto err;
- }
-
- if (is_eof (ret))
- eof_detected = 1;
- else
- eom_detected = 1;
-
- if (!read2)
- {
- if (!bytes_read && is_eom (ret))
- {
- debug_printf ("return -1, set errno to ENOSPC");
- set_errno (ENOSPC);
- goto err;
- }
- break;
- }
- lastblk_to_read = 1;
- }
- if (! read2)
- break;
- if (tgt == devbuf)
- {
- devbufstart = 0;
- devbufend = read2;
- }
- else
- {
- len -= bytes_to_read;
- ptr = (void *) ((char *) ptr + bytes_to_read);
- bytes_read += bytes_to_read;
- }
- }
- }
- }
- else if (!read_file (get_handle (), ptr, len, &bytes_read, &ret))
- {
- if (!is_eof (ret) && !is_eom (ret))
- {
- debug_printf ("return -1, set errno to EACCES");
- set_errno (EACCES);
- goto err;
- }
- if (bytes_read)
- {
- if (is_eof (ret))
- eof_detected = 1;
- else
- eom_detected = 1;
- }
- else if (is_eom (ret))
- {
- debug_printf ("return -1, set errno to ENOSPC");
- set_errno (ENOSPC);
- goto err;
- }
- }
-
- (ssize_t) ulen = bytes_read;
- return;
-
-err:
- (ssize_t) ulen = -1;
- return;
-}
-
-int
-fhandler_dev_raw::raw_write (const void *ptr, size_t len)
-{
- DWORD bytes_written = 0;
- DWORD bytes_to_write;
- DWORD written;
- char *p = (char *) ptr;
- char *tgt;
- int ret;
-
- /* Checking a previous end of media on tape */
- if (eom_detected)
- {
- set_errno (ENOSPC);
- return -1;
- }
-
- if (!is_writing)
- {
- devbufend = devbufstart;
- devbufstart = 0;
- }
- is_writing = 1;
-
- if (devbuf)
- {
- while (len > 0)
- {
- if (!varblkop &&
- (len < devbufsiz || devbufend > 0) && devbufend < devbufsiz)
- {
- bytes_to_write = min (len, devbufsiz - devbufend);
- memcpy (devbuf + devbufend, p, bytes_to_write);
- bytes_written += bytes_to_write;
- devbufend += bytes_to_write;
- p += bytes_to_write;
- len -= bytes_to_write;
- }
- else
- {
- if (varblkop)
- {
- bytes_to_write = len;
- tgt = p;
- }
- else if (devbufend == devbufsiz)
- {
- bytes_to_write = devbufsiz;
- tgt = devbuf;
- }
- else
- {
- bytes_to_write = (len / devbufsiz) * devbufsiz;
- tgt = p;
- }
-
- ret = 0;
- write_file (get_handle (), tgt, bytes_to_write, &written, &ret);
- if (written)
- has_written = 1;
-
- if (ret)
- {
- if (!is_eom (ret))
- {
- __seterrno ();
- return -1;
- }
-
- eom_detected = 1;
-
- if (!written && !bytes_written)
- {
- set_errno (ENOSPC);
- return -1;
- }
-
- if (tgt == p)
- bytes_written += written;
-
- break; // from while (len > 0)
- }
-
- if (tgt == devbuf)
- {
- if (written != devbufsiz)
- memmove (devbuf, devbuf + written, devbufsiz - written);
- devbufend = devbufsiz - written;
- }
- else
- {
- len -= written;
- p += written;
- bytes_written += written;
- }
- }
- }
- }
- else if (len > 0)
- {
- if (!write_file (get_handle (), ptr, len, &bytes_written, &ret))
- {
- if (bytes_written)
- has_written = 1;
- if (!is_eom (ret))
- {
- set_errno (EACCES);
- return -1;
- }
- eom_detected = 1;
- if (!bytes_written)
- {
- set_errno (ENOSPC);
- return -1;
- }
- }
- has_written = 1;
- }
- return bytes_written;
-}
-
-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->eom_detected = eom_detected;
- fhc->eof_detected = eof_detected;
- fhc->lastblk_to_read = 0;
- fhc->varblkop = varblkop;
- fhc->unit = unit;
- }
- return ret;
-}
-
-void
-fhandler_dev_raw::fixup_after_fork (HANDLE)
-{
- devbufstart = 0;
- devbufend = 0;
- lastblk_to_read = 0;
-}
-
-void
-fhandler_dev_raw::fixup_after_exec (HANDLE)
-{
- if (devbufsiz > 1L)
- devbuf = new char [devbufsiz];
- devbufstart = 0;
- devbufend = 0;
- lastblk_to_read = 0;
-}
-
-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_device () == FH_TAPE)
- {
- struct mtop mop;
-
- mop.mt_op = MTSETBLK;
- mop.mt_count = op->rd_parm;
- ret = ioctl (MTIOCTOP, &mop);
- }
- else if (op->rd_parm % 512)
- ret = ERROR_INVALID_PARAMETER;
- else if (devbuf && op->rd_parm < devbufend - devbufstart)
- ret = ERROR_INVALID_PARAMETER;
- else if (!devbuf || op->rd_parm != devbufsiz)
- {
- char *buf = new char [op->rd_parm];
- if (devbufsiz > 1L)
- {
- memcpy (buf, devbuf + devbufstart, devbufend - devbufstart);
- devbufend -= devbufstart;
- delete [] devbuf;
- }
- else
- devbufend = 0;
-
- devbufstart = 0;
- devbuf = buf;
- devbufsiz = op->rd_parm;
- }
- break;
- default:
- break;
- }
- }
- else if (cmd == RDIOCGET)
- {
- struct rdget *get = (struct rdget *) buf;
-
- if (!get)
- ret = ERROR_INVALID_PARAMETER;
- else
- get->bufsiz = devbufsiz ? devbufsiz : 1L;
- }
- 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 f1427dc6d..000000000
--- a/winsup/cygwin/fhandler_registry.cc
+++ /dev/null
@@ -1,668 +0,0 @@
-/* fhandler_registry.cc: fhandler for /proc/registry virtual filesystem
-
- 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. */
-
-/* FIXME: Access permissions are ignored at the moment. */
-
-#include "winsup.h"
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/cygwin.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include <assert.h>
-
-#define _COMPILING_NEWLIB
-#include <dirent.h>
-
-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 __off32_t REG_ENUM_VALUES_MASK = 0x8000000;
-static const __off32_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_PERFOMANCE_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 = 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 + 2;
- if (*path == 0)
- {
- 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 = MAX_PATH;
- }
- if (error != ERROR_NO_MORE_ITEMS)
- {
- seterrno_from_win_error (__FILE__, __LINE__, error);
- goto out;
- }
- index = 0;
- buf_size = 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 = 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 (FH_REGISTRY)
-{
-}
-
-int
-fhandler_registry::fstat (struct __stat64 *buf, path_conv *pc)
-{
- this->fhandler_base::fstat (buf, pc);
- 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;
- 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;
-}
-
-struct dirent *
-fhandler_registry::readdir (DIR * dir)
-{
- DWORD buf_size = MAX_PATH;
- char buf[buf_size];
- HANDLE handle;
- struct dirent *res = NULL;
- const char *path = dir->__d_dirname + proc_len + 1 + registry_len;
- LONG error;
-
- if (*path == 0)
- {
- if (dir->__d_position >= ROOT_KEY_COUNT)
- goto out;
- strcpy (dir->__d_dirent->d_name, registry_listing[dir->__d_position++]);
- res = dir->__d_dirent;
- goto out;
- }
- if (dir->__d_u.__d_data.__handle == INVALID_HANDLE_VALUE
- && dir->__d_position == 0)
- {
- handle = open_key (path + 1, KEY_READ, false);
- dir->__d_u.__d_data.__handle = handle;
- }
- if (dir->__d_u.__d_data.__handle == INVALID_HANDLE_VALUE)
- goto out;
- if (dir->__d_position < SPECIAL_DOT_FILE_COUNT)
- {
- strcpy (dir->__d_dirent->d_name,
- special_dot_files[dir->__d_position++]);
- res = dir->__d_dirent;
- 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->__d_u.__d_data.__handle,
- (dir->__d_position & ~REG_ENUM_VALUES_MASK) >> 16,
- buf, &buf_size, NULL, NULL, NULL, NULL);
- else
- error =
- RegEnumKeyEx ((HKEY) dir->__d_u.__d_data.__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 = MAX_PATH;
- goto retry;
- }
- if (error != ERROR_SUCCESS && error != ERROR_MORE_DATA)
- {
- RegCloseKey ((HKEY) dir->__d_u.__d_data.__handle);
- dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE;
- seterrno_from_win_error (__FILE__, __LINE__, error);
- goto out;
- }
-
- /* We get here if `buf' contains valid data. */
- if (*buf == 0)
- strcpy (dir->__d_dirent->d_name, DEFAULT_VALUE_NAME);
- else
- strcpy (dir->__d_dirent->d_name, buf);
-
- dir->__d_position++;
- if (dir->__d_position & REG_ENUM_VALUES_MASK)
- dir->__d_position += 0x10000;
- res = dir->__d_dirent;
-out:
- syscall_printf ("%p = readdir (%p)", &dir->__d_dirent, dir);
- 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))
- break;
-}
-
-void
-fhandler_registry::rewinddir (DIR * dir)
-{
- if (dir->__d_u.__d_data.__handle != INVALID_HANDLE_VALUE)
- {
- (void) RegCloseKey ((HKEY) dir->__d_u.__d_data.__handle);
- dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE;
- }
- dir->__d_position = 0;
- return;
-}
-
-int
-fhandler_registry::closedir (DIR * dir)
-{
- int res = 0;
- if (dir->__d_u.__d_data.__handle != INVALID_HANDLE_VALUE &&
- RegCloseKey ((HKEY) dir->__d_u.__d_data.__handle) != ERROR_SUCCESS)
- {
- __seterrno ();
- res = -1;
- }
- syscall_printf ("%d = closedir (%p)", res, dir);
- return 0;
-}
-
-int
-fhandler_registry::open (path_conv * pc, int flags, mode_t mode)
-{
- int pathlen;
- const char *file;
- HKEY handle;
-
- int res = fhandler_virtual::open (pc, 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, true);
- if (handle == (HKEY) INVALID_HANDLE_VALUE)
- {
- res = 0;
- goto out;
- }
-
- set_io_handle (handle);
-
- if (pathmatch (file, DEFAULT_VALUE_NAME))
- value_name = cstrdup ("");
- else
- value_name = cstrdup (file);
-
- if (!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 (value_name)
- cfree (value_name);
- 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 *) malloc (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 *) realloc (filebuf, 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 = 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 = 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[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 2f41eb9c7..000000000
--- a/winsup/cygwin/fhandler_serial.cc
+++ /dev/null
@@ -1,1026 +0,0 @@
-/* fhandler_serial.cc
-
- 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 <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include <sys/termios.h>
-#include <ddk/ntddser.h>
-
-/**********************************************************************/
-/* fhandler_serial */
-
-fhandler_serial::fhandler_serial (int unit)
- : fhandler_base (FH_SERIAL, unit), vmin_ (0), vtime_ (0), pgrp_ (myself->pgid)
-{
- set_need_fork_fixup ();
-}
-
-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)
- {
- (void) 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:
- PurgeComm (get_handle (), PURGE_RXABORT);
- debug_printf ("err %E");
- if (GetLastError () == ERROR_OPERATION_ABORTED)
- n = 0;
- else
- {
- tot = -1;
- __seterrno ();
- break;
- }
- }
-
-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:
- 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::dump (void)
-{
- paranoid_printf ("here");
-}
-
-void
-fhandler_serial::init (HANDLE f, DWORD flags, mode_t bin)
-{
- (void) open (NULL, flags, bin & (O_BINARY | O_TEXT));
-}
-
-int
-fhandler_serial::open (path_conv *, 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 (!(res = this->fhandler_base::open (NULL, flags, mode)))
- return 0;
-
- res = 1;
-
- (void) SetCommMask (get_handle (), EV_RXCHAR);
-
- set_r_no_interrupt (1); // Handled explicitly in read code
-
- overlapped_setup ();
-
- memset (&to, 0, sizeof (to));
- (void) 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 ()
-{
- (void) 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 (void)
-{
- 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;
-}
-
-
-/* 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 (ipbuffer & TIOCM_RTS)
- {
- if (EscapeCommFunction (get_handle (), SETRTS))
- rts = TIOCM_RTS;
- else
- {
- __seterrno ();
- res = -1;
- }
- }
- else
- {
- if (EscapeCommFunction (get_handle (), CLRRTS))
- rts = 0;
- else
- {
- __seterrno ();
- res = -1;
- }
- }
- if (ipbuffer & TIOCM_DTR)
- {
- if (EscapeCommFunction (get_handle (), SETDTR))
- dtr = TIOCM_DTR;
- else
- {
- __seterrno ();
- res = -1;
- }
- }
- else if (EscapeCommFunction (get_handle (), CLRDTR))
- dtr = 0;
- else
- {
- __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;
- 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)
-{
- if (queue == TCOFLUSH || queue == TCIOFLUSH)
- PurgeComm (get_handle (), PURGE_TXABORT | PURGE_TXCLEAR);
-
- if (queue == TCIFLUSH || queue == TCIOFLUSH)
- /* Input flushing by polling until nothing turns up
- (we stop after 1000 chars anyway) */
- for (int max = 1000; max > 0; max--)
- {
- COMSTAT st;
- if (!PurgeComm (get_handle (), PURGE_RXABORT | PURGE_RXCLEAR))
- break;
- low_priority_sleep (100);
- if (!ClearCommError (get_handle (), &ev, &st) || !st.cbInQue)
- break;
- }
-
- 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;
- 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 */
- dropDTR = TRUE;
- state.BaudRate = 0;
- 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);
-
- set_r_binary ((t->c_iflag & IGNCR) ? 0 : 1);
- set_w_binary ((t->c_oflag & ONLCR) ? 0 : 1);
-
- if (dropDTR == TRUE)
- {
- 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_)
- return 0;
-
- 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);
- int res = SetCommTimeouts (get_handle (), &to);
- if (!res)
- {
- system_printf ("SetCommTimeout failed, %E");
- __seterrno ();
- return -1;
- }
-
- return 0;
-}
-
-/* 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));
-
- /* -------------- Baud rate ------------------ */
-
- switch (state.BaudRate)
- {
- case 0:
- /* FIXME: need to drop DTR */
- t->c_cflag = t->c_ospeed = t->c_ispeed = B0;
- break;
- case CBR_110:
- t->c_cflag = t->c_ospeed = t->c_ispeed = B110;
- break;
- case CBR_300:
- t->c_cflag = t->c_ospeed = t->c_ispeed = B300;
- break;
- case CBR_600:
- t->c_cflag = t->c_ospeed = t->c_ispeed = B600;
- break;
- case CBR_1200:
- t->c_cflag = t->c_ospeed = t->c_ispeed = B1200;
- break;
- case CBR_2400:
- t->c_cflag = t->c_ospeed = t->c_ispeed = B2400;
- break;
- case CBR_4800:
- t->c_cflag = t->c_ospeed = t->c_ispeed = B4800;
- break;
- case CBR_9600:
- t->c_cflag = t->c_ospeed = t->c_ispeed = B9600;
- break;
- case CBR_19200:
- t->c_cflag = t->c_ospeed = t->c_ispeed = B19200;
- break;
- case CBR_38400:
- t->c_cflag = t->c_ospeed = t->c_ispeed = B38400;
- break;
- case CBR_57600:
- t->c_cflag = t->c_ospeed = t->c_ispeed = B57600;
- break;
- case CBR_115200:
- t->c_cflag = t->c_ospeed = t->c_ispeed = B115200;
- break;
- case 230400: /* CBR_230400 - not defined */
- t->c_cflag = 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 == TRUE)
- 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 == TRUE))
- 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 == FALSE)
- t->c_cflag |= CLOCAL;
-
- /* FIXME: need to handle IGNCR */
-#if 0
- if (!get_r_binary ())
- t->c_iflag |= IGNCR;
-#endif
-
- if (!get_w_binary ())
- 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 (get_close_on_exec ())
- this->fhandler_base::fixup_after_fork (parent);
- overlapped_setup ();
- debug_printf ("io_status.hEvent %p", io_status.hEvent);
-}
-
-void
-fhandler_serial::fixup_after_exec (HANDLE)
-{
- overlapped_setup ();
- debug_printf ("io_status.hEvent %p", io_status.hEvent);
- return;
-}
-
-int
-fhandler_serial::dup (fhandler_base *child)
-{
- fhandler_serial *fhc = (fhandler_serial *) child;
- 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 33e795458..000000000
--- a/winsup/cygwin/fhandler_socket.cc
+++ /dev/null
@@ -1,1264 +0,0 @@
-/* fhandler_socket.cc. See fhandler.h for a description of the fhandler classes.
-
- 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. */
-
-/* #define DEBUG_NEST_ON 1 */
-
-#define __INSIDE_CYGWIN_NET__
-
-#include "winsup.h"
-#include <errno.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/uio.h>
-#include <asm/byteorder.h>
-
-#include <stdlib.h>
-#define USE_SYS_TYPES_FD_SET
-#include <winsock2.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "cygwin/version.h"
-#include "perprocess.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "sigproc.h"
-#include "wsock_event.h"
-#include <unistd.h>
-
-#define SECRET_EVENT_NAME "cygwin.local_socket.secret.%d.%08x-%08x-%08x-%08x"
-#define ENTROPY_SOURCE_NAME "/dev/urandom"
-#define ENTROPY_SOURCE_DEV_UNIT 9
-
-extern fhandler_socket *fdsock (int& fd, const char *name, 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* secret = 0)
-{
- int secret_buf [4];
- int* secret_ptr = (secret ? : secret_buf);
-
- if (in->sa_family == AF_INET)
- {
- *out = * (sockaddr_in *)in;
- *outlen = inlen;
- return 1;
- }
- else if (in->sa_family == AF_LOCAL)
- {
- int fd = open (in->sa_data, O_RDONLY);
- if (fd == -1)
- return 0;
-
- int ret = 0;
- char buf[128];
- memset (buf, 0, sizeof buf);
- if (read (fd, buf, sizeof buf) != -1)
- {
- sockaddr_in sin;
- sin.sin_family = AF_INET;
- sscanf (buf + strlen (SOCKET_COOKIE), "%hu %08x-%08x-%08x-%08x",
- &sin.sin_port,
- 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;
- ret = 1;
- }
- close (fd);
- return ret;
- }
- else
- {
- set_errno (EAFNOSUPPORT);
- return 0;
- }
-}
-
-/**********************************************************************/
-/* fhandler_socket */
-
-fhandler_socket::fhandler_socket ()
- : fhandler_base (FH_SOCKET), sun_path (NULL)
-{
- set_need_fork_fixup ();
- prot_info_ptr = (LPWSAPROTOCOL_INFOA) cmalloc (HEAP_BUF,
- sizeof (WSAPROTOCOL_INFOA));
-}
-
-fhandler_socket::~fhandler_socket ()
-{
- if (prot_info_ptr)
- cfree (prot_info_ptr);
- if (sun_path)
- cfree (sun_path);
-}
-
-void
-fhandler_socket::set_connect_secret ()
-{
- if (!entropy_source)
- {
- void *buf = malloc (sizeof (fhandler_dev_random));
- entropy_source = new (buf) fhandler_dev_random (ENTROPY_SOURCE_DEV_UNIT);
- }
- if (entropy_source &&
- !entropy_source->open (NULL, 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));
- }
-}
-
-void
-fhandler_socket::get_connect_secret (char* buf)
-{
- __small_sprintf (buf, "%08x-%08x-%08x-%08x",
- connect_secret [0], connect_secret [1],
- connect_secret [2], connect_secret [3]);
-}
-
-HANDLE
-fhandler_socket::create_secret_event (int* secret)
-{
- char buf [128];
- int* secret_ptr = (secret ? : connect_secret);
- struct sockaddr_in sin;
- int sin_len = sizeof (sin);
-
- if (::getsockname (get_socket (), (struct sockaddr*) &sin, &sin_len))
- {
- debug_printf ("error getting local socket name (%d)", WSAGetLastError ());
- return NULL;
- }
-
- __small_sprintf (buf, SECRET_EVENT_NAME, sin.sin_port,
- secret_ptr [0], secret_ptr [1],
- secret_ptr [2], secret_ptr [3]);
- LPSECURITY_ATTRIBUTES sec = get_inheritance (true);
- secret_event = CreateEvent (sec, FALSE, FALSE, buf);
- if (!secret_event && GetLastError () == ERROR_ALREADY_EXISTS)
- secret_event = OpenEvent (EVENT_ALL_ACCESS, FALSE, buf);
-
- if (!secret_event)
- /* nothing to do */;
- else if (sec == &sec_all_nih || sec == &sec_none_nih)
- ProtectHandle (secret_event);
- else
- ProtectHandleINH (secret_event);
-
- return secret_event;
-}
-
-void
-fhandler_socket::signal_secret_event ()
-{
- if (!secret_event)
- debug_printf ("no secret event?");
- else
- {
- SetEvent (secret_event);
- debug_printf ("signaled secret_event");
- }
-}
-
-void
-fhandler_socket::close_secret_event ()
-{
- if (secret_event)
- ForceCloseHandle (secret_event);
- secret_event = NULL;
-}
-
-int
-fhandler_socket::check_peer_secret_event (struct sockaddr_in* peer, int* secret)
-{
- char buf [128];
- HANDLE ev;
- int* secret_ptr = (secret ? : connect_secret);
-
- __small_sprintf (buf, SECRET_EVENT_NAME, peer->sin_port,
- secret_ptr [0], secret_ptr [1],
- secret_ptr [2], secret_ptr [3]);
- ev = CreateEvent (&sec_all_nih, FALSE, FALSE, buf);
- if (!ev && GetLastError () == ERROR_ALREADY_EXISTS)
- {
- debug_printf ("event \"%s\" already exists", buf);
- ev = OpenEvent (EVENT_ALL_ACCESS, FALSE, buf);
- }
-
- signal_secret_event ();
-
- if (ev)
- {
- DWORD rc = WaitForSingleObject (ev, 10000);
- debug_printf ("WFSO rc=%d", rc);
- CloseHandle (ev);
- return (rc == WAIT_OBJECT_0 ? 1 : 0 );
- }
- else
- return 0;
-}
-
-void
-fhandler_socket::fixup_before_fork_exec (DWORD win_proc_id)
-{
- if (!winsock2_active)
- {
- fhandler_base::fixup_before_fork_exec (win_proc_id);
- debug_printf ("Without Winsock 2.0");
- }
- else 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 ();
- }
-}
-
-extern "C" void __stdcall load_wsock32 ();
-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_winsock_errno ();
- }
- else if (!new_sock && !winsock2_active)
- {
- load_wsock32 ();
- fhandler_base::fixup_after_fork (parent);
- debug_printf ("Without Winsock 2.0");
- }
- else
- {
- debug_printf ("WSASocket went fine new_sock %p, old_sock %p", new_sock, get_io_handle ());
- set_io_handle ((HANDLE) new_sock);
- }
-
- if (secret_event)
- fork_fixup (parent, secret_event, "secret_event");
-}
-
-void
-fhandler_socket::fixup_after_exec (HANDLE parent)
-{
- debug_printf ("here");
- if (!get_close_on_exec ())
- fixup_after_fork (parent);
-#if 0
- else if (!winsock2_active)
- closesocket (get_socket ());
-#endif
-}
-
-int
-fhandler_socket::dup (fhandler_base *child)
-{
- debug_printf ("here");
- fhandler_socket *fhs = (fhandler_socket *) child;
- fhs->addr_family = addr_family;
- fhs->set_io_handle (get_io_handle ());
- if (get_addr_family () == AF_LOCAL)
- fhs->set_sun_path (get_sun_path ());
-
- fhs->fixup_before_fork_exec (GetCurrentProcessId ());
- if (winsock2_active)
- {
- fhs->fixup_after_fork (hMainProc);
- return 0;
- }
- return fhandler_base::dup (child);
-}
-
-int __stdcall
-fhandler_socket::fstat (struct __stat64 *buf, path_conv *pc)
-{
- int res = fhandler_base::fstat (buf, pc);
- if (!res)
- {
- buf->st_mode &= ~_IFMT;
- buf->st_mode |= _IFSOCK;
- buf->st_ino = (ino_t) get_handle ();
- }
- return res;
-}
-
-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;
- int fd;
-
- 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);
-
- /* bind must fail if file system socket object already exists
- so _open () is called with O_EXCL flag. */
- fd = ::open (un_addr->sun_path, O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0);
- if (fd < 0)
- {
- if (get_errno () == EEXIST)
- set_errno (EADDRINUSE);
- goto out;
- }
-
- set_connect_secret ();
-
- char buf[sizeof (SOCKET_COOKIE) + 80];
- __small_sprintf (buf, "%s%u ", SOCKET_COOKIE, sin.sin_port);
- get_connect_secret (strchr (buf, '\0'));
- len = strlen (buf) + 1;
-
- /* Note that the terminating nul is written. */
- if (::write (fd, buf, len) != len)
- {
- save_errno here;
- ::close (fd);
- unlink (un_addr->sun_path);
- }
- else
- {
- ::close (fd);
- chmod (un_addr->sun_path,
- (S_IFSOCK | S_IRWXU | S_IRWXG | S_IRWXO) & ~cygheap->umask);
- set_sun_path (un_addr->sun_path);
- res = 0;
- }
-#undef un_addr
- }
- else 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 secret_check_failed = FALSE;
- BOOL in_progress = FALSE;
- sockaddr_in sin;
- int secret [4];
-
- if (!get_inet_addr (name, namelen, &sin, &namelen, secret))
- return -1;
-
- res = ::connect (get_socket (), (sockaddr *) &sin, namelen);
- if (res)
- {
- /* Special handling for connect to return the correct error code
- when called on a non-blocking socket. */
- if (is_nonblocking ())
- {
- DWORD err = WSAGetLastError ();
- if (err == WSAEWOULDBLOCK || err == WSAEALREADY)
- {
- WSASetLastError (WSAEINPROGRESS);
- in_progress = TRUE;
- }
- else if (err == WSAEINVAL)
- WSASetLastError (WSAEISCONN);
- }
- set_winsock_errno ();
- }
- if (get_addr_family () == AF_LOCAL && get_socket_type () == SOCK_STREAM)
- {
- if (!res || in_progress)
- {
- if (!create_secret_event (secret))
- {
- secret_check_failed = TRUE;
- }
- else if (in_progress)
- signal_secret_event ();
- }
-
- if (!secret_check_failed && !res)
- {
- if (!check_peer_secret_event (&sin, secret))
- {
- debug_printf ( "accept from unauthorized server" );
- secret_check_failed = TRUE;
- }
- }
-
- if (secret_check_failed)
- {
- close_secret_event ();
- if (res)
- closesocket (res);
- set_errno (ECONNREFUSED);
- res = -1;
- }
- }
-
- if (WSAGetLastError () == WSAEINPROGRESS)
- set_connect_state (CONNECT_PENDING);
- else
- set_connect_state (CONNECTED);
- return res;
-}
-
-int
-fhandler_socket::listen (int backlog)
-{
- int res = ::listen (get_socket (), backlog);
- if (res)
- set_winsock_errno ();
- else
- set_connect_state (CONNECTED);
- return res;
-}
-
-int
-fhandler_socket::accept (struct sockaddr *peer, int *len)
-{
- int res = -1;
- WSAEVENT ev[2] = { WSA_INVALID_EVENT, signal_arrived };
- BOOL secret_check_failed = FALSE;
- BOOL in_progress = FALSE;
-
- /* 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 ())
- {
- ev[0] = WSACreateEvent ();
-
- if (ev[0] != WSA_INVALID_EVENT &&
- !WSAEventSelect (get_socket (), ev[0], FD_ACCEPT))
- {
- WSANETWORKEVENTS sock_event;
- int wait_result;
-
- wait_result = WSAWaitForMultipleEvents (2, ev, FALSE, WSA_INFINITE,
- FALSE);
- if (wait_result == WSA_WAIT_EVENT_0)
- WSAEnumNetworkEvents (get_socket (), ev[0], &sock_event);
-
- /* Unset events for listening socket and
- switch back to blocking mode */
- WSAEventSelect (get_socket (), ev[0], 0);
- unsigned long nonblocking = 0;
- ioctlsocket (get_socket (), FIONBIO, &nonblocking);
-
- switch (wait_result)
- {
- case WSA_WAIT_EVENT_0:
- if (sock_event.lNetworkEvents & FD_ACCEPT)
- {
- if (sock_event.iErrorCode[FD_ACCEPT_BIT])
- {
- WSASetLastError (sock_event.iErrorCode[FD_ACCEPT_BIT]);
- set_winsock_errno ();
- res = -1;
- goto done;
- }
- }
- /* else; : Should never happen since FD_ACCEPT is the only event
- that has been selected */
- break;
- case WSA_WAIT_EVENT_0 + 1:
- debug_printf ("signal received during accept");
- set_errno (EINTR);
- res = -1;
- goto done;
- case WSA_WAIT_FAILED:
- default: /* Should never happen */
- WSASetLastError (WSAEFAULT);
- set_winsock_errno ();
- res = -1;
- goto done;
- }
- }
- }
-
- res = ::accept (get_socket (), peer, len);
-
- if ((SOCKET) res == (SOCKET) INVALID_SOCKET &&
- WSAGetLastError () == WSAEWOULDBLOCK)
- in_progress = TRUE;
-
- if (get_addr_family () == AF_LOCAL && get_socket_type () == SOCK_STREAM)
- {
- if ((SOCKET) res != (SOCKET) INVALID_SOCKET || in_progress)
- {
- if (!create_secret_event ())
- secret_check_failed = TRUE;
- else if (in_progress)
- signal_secret_event ();
- }
-
- if (!secret_check_failed &&
- (SOCKET) res != (SOCKET) INVALID_SOCKET)
- {
- if (!check_peer_secret_event ((struct sockaddr_in*) peer))
- {
- debug_printf ("connect from unauthorized client");
- secret_check_failed = TRUE;
- }
- }
-
- if (secret_check_failed)
- {
- close_secret_event ();
- if ((SOCKET) res != (SOCKET) INVALID_SOCKET)
- closesocket (res);
- set_errno (ECONNABORTED);
- res = -1;
- goto done;
- }
- }
-
- {
- cygheap_fdnew res_fd;
- if (res_fd < 0)
- /* FIXME: what is correct errno? */;
- else if ((SOCKET) res == (SOCKET) INVALID_SOCKET)
- set_winsock_errno ();
- else
- {
- fhandler_socket* res_fh = fdsock (res_fd, get_name (), res);
- if (get_addr_family () == AF_LOCAL)
- res_fh->set_sun_path (get_sun_path ());
- res_fh->set_addr_family (get_addr_family ());
- res_fh->set_socket_type (get_socket_type ());
- res = res_fd;
- }
- }
-
-done:
- if (ev[0] != WSA_INVALID_EVENT)
- WSACloseEvent (ev[0]);
-
- 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;
-}
-
-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_accrights: NULL,
- msg_accrightslen: 0
- };
-
- return recvmsg (&msg, 0, tot);
-}
-
-int
-fhandler_socket::recvfrom (void *ptr, size_t len, int flags,
- struct sockaddr *from, int *fromlen)
-{
- int res;
- DWORD ret;
-
- flags &= MSG_WINMASK;
- if (!winsock2_active)
- ret = res = ::recvfrom (get_socket (),
- (char *) ptr, len, flags,
- from, fromlen);
- else
- {
- WSABUF wsabuf = { len, (char *) ptr };
-
- if (is_nonblocking ())
- res = WSARecvFrom (get_socket (), &wsabuf, 1, &ret, (DWORD *) &flags,
- from, fromlen,
- NULL, NULL);
- else
- {
- wsock_event wsock_evt;
- res = WSARecvFrom (get_socket (), &wsabuf, 1, &ret, (DWORD *) &flags,
- from, fromlen,
- wsock_evt.prepare (), NULL);
-
- if (res == SOCKET_ERROR && WSAGetLastError () == WSA_IO_PENDING)
- ret = res = wsock_evt.wait (get_socket (), (DWORD *) &flags);
- }
- }
-
- if (res == SOCKET_ERROR)
- {
- res = -1;
- set_winsock_errno ();
- }
- else
- res = ret;
-
- return res;
-}
-
-int
-fhandler_socket::recvmsg (struct msghdr *msg, int flags, ssize_t tot)
-{
- 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;
-
- if (!winsock2_active)
- {
- if (iovcnt == 1)
- res = recvfrom (iov->iov_base, iov->iov_len, flags,
- from, fromlen);
- else
- {
- 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);
- }
-
- char *buf = (char *) alloca (tot);
-
- if (!buf)
- {
- set_errno (ENOMEM);
- res = -1;
- }
- else
- {
- res = recvfrom (buf, tot, flags,
- from, fromlen);
-
- const struct iovec *iovptr = iov;
- int nbytes = res;
-
- while (nbytes > 0)
- {
- const int frag = min (nbytes, (ssize_t) iovptr->iov_len);
- memcpy (iovptr->iov_base, buf, frag);
- buf += frag;
- iovptr += 1;
- nbytes -= frag;
- }
- }
- }
- }
- else
- {
- 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;
-
- if (is_nonblocking ())
- res = WSARecvFrom (get_socket (),
- wsabuf, iovcnt, &ret, (DWORD *) &flags,
- from, fromlen,
- NULL, NULL);
- else
- {
- wsock_event wsock_evt;
- res = WSARecvFrom (get_socket (),
- wsabuf, iovcnt, &ret, (DWORD *) &flags,
- from, fromlen,
- wsock_evt.prepare (), NULL);
-
- if (res == SOCKET_ERROR && WSAGetLastError () == WSA_IO_PENDING)
- ret = res = wsock_evt.wait (get_socket (), (DWORD *) &flags);
- }
-
- if (res == SOCKET_ERROR)
- {
- res = -1;
- 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_accrights: NULL,
- msg_accrightslen: 0
- };
-
- return sendmsg (&msg, 0, tot);
-}
-
-int
-fhandler_socket::sendto (const void *ptr, size_t len, int flags,
- const struct sockaddr *to, int tolen)
-{
- sockaddr_in sin;
-
- if (to && !get_inet_addr (to, tolen, &sin, &tolen))
- return -1;
-
- int res;
- DWORD ret;
-
- if (!winsock2_active)
- ret = res = ::sendto (get_socket (), (const char *) ptr, len,
- flags & MSG_WINMASK,
- (to ? (const struct sockaddr *) &sin : NULL), tolen);
- else
- {
- WSABUF wsabuf = { len, (char *) ptr };
-
- if (is_nonblocking ())
- res = WSASendTo (get_socket (), &wsabuf, 1, &ret,
- flags & MSG_WINMASK,
- (to ? (const struct sockaddr *) &sin : NULL), tolen,
- NULL, NULL);
- else
- {
- wsock_event wsock_evt;
- res = WSASendTo (get_socket (), &wsabuf, 1, &ret,
- flags & MSG_WINMASK,
- (to ? (const struct sockaddr *) &sin : NULL), tolen,
- wsock_evt.prepare (), NULL);
-
- if (res == SOCKET_ERROR && WSAGetLastError () == WSA_IO_PENDING)
- ret = res = wsock_evt.wait (get_socket (), (DWORD *) &flags);
- }
- }
-
- if (res == SOCKET_ERROR)
- {
- res = -1;
- set_winsock_errno ();
- }
- else
- res = ret;
-
- /* Special handling for SIGPIPE */
- if (res == -1 && get_errno () == ESHUTDOWN)
- {
- 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;
-
- if (!winsock2_active)
- {
- if (iovcnt == 1)
- res = sendto (iov->iov_base, iov->iov_len, flags,
- (struct sockaddr *) msg->msg_name,
- msg->msg_namelen);
- else
- {
- 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);
- }
-
- char *const buf = (char *) alloca (tot);
-
- if (!buf)
- {
- set_errno (ENOMEM);
- res = -1;
- }
- else
- {
- 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;
- }
-
- res = sendto (buf, tot, flags,
- (struct sockaddr *) msg->msg_name,
- msg->msg_namelen);
- }
- }
- }
- else
- {
- 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;
-
- if (is_nonblocking ())
- res = WSASendTo (get_socket (), wsabuf, iovcnt, &ret, flags,
- (struct sockaddr *) msg->msg_name,
- msg->msg_namelen,
- NULL, NULL);
- else
- {
- wsock_event wsock_evt;
- res = WSASendTo (get_socket (), wsabuf, iovcnt, &ret, flags,
- (struct sockaddr *) msg->msg_name,
- msg->msg_namelen,
- wsock_evt.prepare (), NULL);
-
- if (res == SOCKET_ERROR && WSAGetLastError () == WSA_IO_PENDING)
- ret = res = wsock_evt.wait (get_socket (), (DWORD *) &flags);
- }
-
- if (res == SOCKET_ERROR)
- {
- res = -1;
- set_winsock_errno ();
- }
- else
- res = ret;
- }
-
- 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:
- set_shutdown_read ();
- break;
- case SHUT_WR:
- set_shutdown_write ();
- break;
- case SHUT_RDWR:
- set_shutdown_read ();
- set_shutdown_write ();
- 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; /* seconds. 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);
- }
-
- close_secret_event ();
-
- debug_printf ("%d = fhandler_socket::close()", res);
- return res;
-}
-
-#define ASYNC_MASK (FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT)
-
-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 (), gethwnd (), WM_ASYNCIO,
- *(int *) p ? ASYNC_MASK : 0);
- syscall_printf ("Async I/O on socket %s",
- *(int *) p ? "started" : "cancelled");
- set_async (*(int *) p);
- break;
- default:
- /* We must cancel WSAAsyncSelect (if any) before setting socket to
- * blocking mode
- */
- if (cmd == FIONBIO && *(int *) p == 0)
- WSAAsyncSelect (get_socket (), gethwnd (), 0, 0);
- res = ioctlsocket (get_socket (), cmd, (unsigned long *) p);
- if (res == SOCKET_ERROR)
- set_winsock_errno ();
- if (cmd == FIONBIO)
- {
- syscall_printf ("socket is now %sblocking",
- *(int *) p ? "non" : "");
- /* Start AsyncSelect if async socket unblocked */
- if (*(int *) p && get_async ())
- WSAAsyncSelect (get_socket (), gethwnd (), WM_ASYNCIO, ASYNC_MASK);
-
- set_nonblocking (*(int *) p);
- }
- 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_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 (int val)
-{
- if (!winsock2_active) /* < Winsock 2.0 */
- set_inheritance (get_handle (), val);
- set_close_on_exec_flag (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;
-}
diff --git a/winsup/cygwin/fhandler_tape.cc b/winsup/cygwin/fhandler_tape.cc
deleted file mode 100644
index c99a0190a..000000000
--- a/winsup/cygwin/fhandler_tape.cc
+++ /dev/null
@@ -1,839 +0,0 @@
-/* fhandler_tape.cc. See fhandler.h for a description of the fhandler
- classes.
-
- Copyright 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 <sys/termios.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/mtio.h>
-#include "cygerrno.h"
-#include "perprocess.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-
-/**********************************************************************/
-/* fhandler_dev_tape */
-
-void
-fhandler_dev_tape::clear (void)
-{
- lasterr = 0;
- fhandler_dev_raw::clear ();
-}
-
-int
-fhandler_dev_tape::is_eom (int win_error)
-{
- int ret = ((win_error == ERROR_END_OF_MEDIA)
- || (win_error == ERROR_EOM_OVERFLOW)
- || (win_error == ERROR_NO_DATA_DETECTED));
- if (ret)
- debug_printf ("end of medium");
- return ret;
-}
-
-int
-fhandler_dev_tape::is_eof (int win_error)
-{
- int ret = ((win_error == ERROR_FILEMARK_DETECTED)
- || (win_error == ERROR_SETMARK_DETECTED));
- if (ret)
- debug_printf ("end of file");
- return ret;
-}
-
-fhandler_dev_tape::fhandler_dev_tape (int unit)
- : fhandler_dev_raw (FH_TAPE, unit)
-{
- debug_printf ("unit: %d", unit);
-}
-
-int
-fhandler_dev_tape::open (path_conv *real_path, int flags, mode_t)
-{
- int ret;
-
- devbufsiz = 1L;
-
- ret = fhandler_dev_raw::open (real_path, flags);
- if (ret)
- {
- struct mtget get;
- struct mtop op;
- struct mtpos pos;
-
- if (!ioctl (MTIOCGET, &get))
- /* Tape drive supports and is set to variable block size. */
- if (get.mt_dsreg == 0)
- devbufsiz = get.mt_maxblksize;
- else
- devbufsiz = get.mt_dsreg;
- varblkop = get.mt_dsreg == 0;
-
- if (devbufsiz > 1L)
- devbuf = new char [devbufsiz];
-
- /* The following rewind in position 0 solves a problem which appears
- * in case of multi volume archives: The last ReadFile on first medium
- * returns ERROR_NO_DATA_DETECTED. After media change, all subsequent
- * ReadFile calls return ERROR_NO_DATA_DETECTED, too.
- * The call to tape_set_pos seems to reset some internal flags. */
- if ((! ioctl (MTIOCPOS, &pos)) && (! pos.mt_blkno))
- {
- op.mt_op = MTREW;
- ioctl (MTIOCTOP, &op);
- }
-
- if (flags & O_APPEND)
- {
- /* In append mode, seek to beginning of next filemark */
- op.mt_op = MTFSFM;
- op.mt_count = 1;
- ioctl (MTIOCTOP, &op);
- }
- }
-
- return ret;
-}
-
-int
-fhandler_dev_tape::close (void)
-{
- struct mtop op;
- int ret = 0;
-
- if (is_writing)
- {
- ret = writebuf ();
- if ((has_written) && (! eom_detected))
- {
- /* if last operation was writing, write a filemark */
- debug_printf ("writing filemark");
- op.mt_op = MTWEOF;
- op.mt_count = 1;
- ioctl (MTIOCTOP, &op);
- }
- }
-
- // To protected reads on signaling (e.g. Ctrl-C)
- eof_detected = 1;
-
- if (is_rewind_device ())
- {
- debug_printf ("rewinding");
- op.mt_op = MTREW;
- ioctl (MTIOCTOP, &op);
- }
-
- if (ret)
- {
- fhandler_dev_raw::close ();
- return ret;
- }
-
- return fhandler_dev_raw::close ();
-}
-
-int
-fhandler_dev_tape::fstat (struct __stat64 *buf, path_conv *pc)
-{
- int ret;
-
- if (!(ret = fhandler_base::fstat (buf, pc)))
- {
- struct mtget get;
-
- if (!ioctl (MTIOCGET, &get))
- buf->st_blocks = get.mt_capacity / buf->st_blksize;
- }
-
- return ret;
-}
-
-__off64_t
-fhandler_dev_tape::lseek (__off64_t offset, int whence)
-{
- struct mtop op;
- struct mtpos pos;
-
- debug_printf ("lseek (%s, %d, %d)", get_name (), offset, whence);
-
- writebuf ();
- eom_detected = eof_detected = 0;
- lastblk_to_read = 0;
- devbufstart = devbufend = 0;
-
- if (ioctl (MTIOCPOS, &pos))
- {
- return ILLEGAL_SEEK;
- }
-
- switch (whence)
- {
- case SEEK_END:
- op.mt_op = MTFSF;
- op.mt_count = 1;
- if (ioctl (MTIOCTOP, &op))
- return -1;
- break;
- case SEEK_SET:
- if (whence == SEEK_SET && offset < 0)
- {
- set_errno (EINVAL);
- return -1;
- }
- break;
- case SEEK_CUR:
- break;
- default:
- set_errno (EINVAL);
- return -1;
- }
-
- op.mt_op = MTFSR;
- op.mt_count = offset / devbufsiz
- - (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))
- return -1;
-
- return (pos.mt_blkno * devbufsiz);
-}
-
-int
-fhandler_dev_tape::dup (fhandler_base *child)
-{
- fhandler_dev_tape *fhc = (fhandler_dev_tape *) child;
-
- fhc->lasterr = lasterr;
- return fhandler_dev_raw::dup (child);
-}
-
-int
-fhandler_dev_tape::ioctl (unsigned int cmd, void *buf)
-{
- int ret = NO_ERROR;
- unsigned long block;
-
- if (cmd == MTIOCTOP)
- {
- struct mtop *op = (struct mtop *) buf;
-
- if (! op)
- ret = ERROR_INVALID_PARAMETER;
- else
- switch (op->mt_op)
- {
- case MTRESET:
- break;
- case MTFSF:
- ret = tape_set_pos (TAPE_SPACE_FILEMARKS, op->mt_count);
- break;
- case MTBSF:
- ret = tape_set_pos (TAPE_SPACE_FILEMARKS, -op->mt_count);
- break;
- case MTFSR:
- ret = tape_set_pos (TAPE_SPACE_RELATIVE_BLOCKS, op->mt_count);
- break;
- case MTBSR:
- ret = tape_set_pos (TAPE_SPACE_RELATIVE_BLOCKS, -op->mt_count);
- break;
- case MTWEOF:
- if (tape_get_feature (TAPE_DRIVE_WRITE_FILEMARKS))
- ret = tape_write_marks (TAPE_FILEMARKS, op->mt_count);
- else if (tape_get_feature (TAPE_DRIVE_WRITE_LONG_FMKS))
- ret = tape_write_marks (TAPE_LONG_FILEMARKS, op->mt_count);
- else
- ret = tape_write_marks (TAPE_SHORT_FILEMARKS, op->mt_count);
- break;
- case MTREW:
- ret = tape_set_pos (TAPE_REWIND, 0);
- break;
- case MTOFFL:
- ret = tape_prepare (TAPE_UNLOAD);
- break;
- case MTNOP:
- break;
- case MTRETEN:
- if (! tape_get_feature (TAPE_DRIVE_END_OF_DATA))
- ret = ERROR_INVALID_PARAMETER;
- else if (! (ret = tape_set_pos (TAPE_REWIND, 0, FALSE)))
- ret = tape_prepare (TAPE_TENSION);
- break;
- case MTBSFM:
- ret = tape_set_pos (TAPE_SPACE_FILEMARKS, -op->mt_count, TRUE);
- break;
- case MTFSFM:
- ret = tape_set_pos (TAPE_SPACE_FILEMARKS, op->mt_count, TRUE);
- break;
- case MTEOM:
- if (tape_get_feature (TAPE_DRIVE_END_OF_DATA))
- ret = tape_set_pos (TAPE_SPACE_END_OF_DATA, 0);
- else
- ret = tape_set_pos (TAPE_SPACE_FILEMARKS, 32767);
- break;
- case MTERASE:
- ret = tape_erase (TAPE_ERASE_SHORT);
- break;
- case MTRAS1:
- case MTRAS2:
- case MTRAS3:
- ret = ERROR_INVALID_PARAMETER;
- break;
- case MTSETBLK:
- {
- long min, max;
-
- if (! tape_get_feature (TAPE_DRIVE_SET_BLOCK_SIZE))
- {
- ret = ERROR_INVALID_PARAMETER;
- break;
- }
- ret = tape_get_blocksize (&min, NULL, &max, NULL);
- if (ret)
- break;
- if (devbuf && (size_t) op->mt_count == devbufsiz && !varblkop)
- {
- ret = 0;
- break;
- }
- if ((op->mt_count == 0
- && !tape_get_feature (TAPE_DRIVE_VARIABLE_BLOCK))
- || (op->mt_count > 0
- && (op->mt_count < min || op->mt_count > max)))
- {
- ret = ERROR_INVALID_PARAMETER;
- break;
- }
- if (devbuf && op->mt_count > 0
- && (size_t) op->mt_count < devbufend - devbufstart)
- {
- ret = ERROR_MORE_DATA;
- break;
- }
- if (! (ret = tape_set_blocksize (op->mt_count)))
- {
- size_t size = 0;
- if (op->mt_count == 0)
- {
- struct mtget get;
- if ((ret = tape_status (&get)) != NO_ERROR)
- break;
- size = get.mt_maxblksize;
- ret = NO_ERROR;
- }
- char *buf = NULL;
- if (size > 1L && !(buf = new char [size]))
- {
- ret = ERROR_OUTOFMEMORY;
- break;
- }
- if (devbufsiz > 1L && size > 1L)
- {
- memcpy (buf, devbuf + devbufstart,
- devbufend - devbufstart);
- devbufend -= devbufstart;
- }
- else
- devbufend = 0;
- if (devbufsiz > 1L)
- delete [] devbuf;
- devbufstart = 0;
- devbuf = buf;
- devbufsiz = size;
- varblkop = op->mt_count == 0;
- }
- }
- break;
- case MTSETDENSITY:
- ret = ERROR_INVALID_PARAMETER;
- break;
- case MTSEEK:
- if (tape_get_feature (TAPE_DRIVE_ABSOLUTE_BLK))
- {
- ret = tape_set_pos (TAPE_ABSOLUTE_BLOCK, op->mt_count);
- break;
- }
- if (! (ret = tape_get_pos (&block)))
- {
- ret = tape_set_pos (TAPE_SPACE_RELATIVE_BLOCKS,
- op->mt_count - block);
- }
- break;
- case MTTELL:
- if (! (ret = tape_get_pos (&block)))
- op->mt_count = block;
- break;
- case MTSETDRVBUFFER:
- ret = ERROR_INVALID_PARAMETER;
- break;
- case MTFSS:
- ret = tape_set_pos (TAPE_SPACE_SETMARKS, op->mt_count);
- break;
- case MTBSS:
- ret = tape_set_pos (TAPE_SPACE_SETMARKS, -op->mt_count);
- break;
- case MTWSM:
- ret = tape_write_marks (TAPE_SETMARKS, op->mt_count);
- break;
- case MTLOCK:
- ret = tape_prepare (TAPE_LOCK);
- break;
- case MTUNLOCK:
- ret = tape_prepare (TAPE_UNLOCK);
- break;
- case MTLOAD:
- ret = tape_prepare (TAPE_LOAD);
- break;
- case MTUNLOAD:
- ret = tape_prepare (TAPE_UNLOAD);
- break;
- case MTCOMPRESSION:
- ret = tape_compression (op->mt_count);
- break;
- case MTSETPART:
- case MTMKPART:
- default:
- ret = ERROR_INVALID_PARAMETER;
- break;
- }
- }
- else if (cmd == MTIOCGET)
- ret = tape_status ((struct mtget *) buf);
- else if (cmd == MTIOCPOS)
- {
- ret = ERROR_INVALID_PARAMETER;
- if (buf && (ret = tape_get_pos (&block)))
- ((struct mtpos *) buf)->mt_blkno = block;
- }
- else
- return fhandler_dev_raw::ioctl (cmd, buf);
-
- if (ret != NO_ERROR)
- {
- SetLastError (ret);
- __seterrno ();
- return -1;
- }
-
- return 0;
-}
-
-/* ------------------------------------------------------------------ */
-/* Private functions used by `ioctl' */
-/* ------------------------------------------------------------------ */
-
-static int
-tape_error (DWORD lasterr, const char *txt)
-{
- if (lasterr)
- debug_printf ("%s: error: %d", txt, lasterr);
-
- return lasterr;
-}
-
-int
-fhandler_dev_tape::tape_write_marks (int marktype, DWORD len)
-{
- syscall_printf ("write_tapemark");
- while (((lasterr = WriteTapemark (get_handle (),
- marktype,
- len,
- FALSE)) == ERROR_MEDIA_CHANGED)
- || (lasterr == ERROR_BUS_RESET))
- ;
-
- return tape_error (lasterr, "tape_write_marks");
-}
-
-int
-fhandler_dev_tape::tape_get_pos (unsigned long *ret)
-{
- DWORD part, low, high;
-
- while (((lasterr = GetTapePosition (get_handle (),
- TAPE_ABSOLUTE_POSITION,
- &part,
- &low,
- &high)) == ERROR_MEDIA_CHANGED)
- || (lasterr == ERROR_BUS_RESET))
- ;
- if (! tape_error (lasterr, "tape_get_pos") && ret)
- *ret = low;
-
- return lasterr;
-}
-
-static int _tape_set_pos (HANDLE hTape, int mode, long count)
-{
- int err;
-
- while (((err = SetTapePosition (hTape,
- mode,
- 1,
- count,
- count < 0 ? -1 : 0,
- FALSE)) == ERROR_MEDIA_CHANGED)
- || (err == ERROR_BUS_RESET))
- ;
-
- return err;
-}
-
-int
-fhandler_dev_tape::tape_set_pos (int mode, long count, BOOLEAN sfm_func)
-{
- unsigned long pos, tgtpos;
-
- switch (mode)
- {
- case TAPE_SPACE_RELATIVE_BLOCKS:
- lasterr = tape_get_pos (&pos);
-
- if (lasterr)
- return lasterr;
-
- tgtpos = pos + count;
-
- while (((lasterr = _tape_set_pos (get_handle (),
- mode,
- count)) == ERROR_FILEMARK_DETECTED)
- || (lasterr == ERROR_SETMARK_DETECTED))
- {
- lasterr = tape_get_pos (&pos);
- if (lasterr)
- return lasterr;
- count = tgtpos - pos;
- }
-
- if (lasterr == ERROR_BEGINNING_OF_MEDIA && ! tgtpos)
- lasterr = NO_ERROR;
-
- break;
- case TAPE_SPACE_FILEMARKS:
- if (count < 0)
- {
- if (pos > 0)
- {
- if ((! _tape_set_pos (get_handle (),
- TAPE_SPACE_RELATIVE_BLOCKS,
- -1))
- || (sfm_func))
- ++count;
- _tape_set_pos (get_handle (), TAPE_SPACE_RELATIVE_BLOCKS, 1);
- }
-
- while (! (lasterr = _tape_set_pos (get_handle (), mode, -1))
- && count++ < 0)
- ;
-
- if (lasterr == ERROR_BEGINNING_OF_MEDIA)
- {
- if (! count)
- lasterr = NO_ERROR;
- }
- else if (! sfm_func)
- lasterr = _tape_set_pos (get_handle (), mode, 1);
- }
- else
- {
- if (sfm_func)
- {
- if (_tape_set_pos (get_handle (),
- TAPE_SPACE_RELATIVE_BLOCKS,
- 1) == ERROR_FILEMARK_DETECTED)
- ++count;
- _tape_set_pos (get_handle (), TAPE_SPACE_RELATIVE_BLOCKS, -1);
- }
-
- if (! (lasterr = _tape_set_pos (get_handle (), mode, count))
- && sfm_func)
- lasterr = _tape_set_pos (get_handle (), mode, -1);
- }
- break;
- case TAPE_SPACE_SETMARKS:
- case TAPE_ABSOLUTE_BLOCK:
- case TAPE_SPACE_END_OF_DATA:
- case TAPE_REWIND:
- lasterr = _tape_set_pos (get_handle (), mode, count);
- break;
- }
-
- return tape_error (lasterr, "tape_set_pos");
-}
-
-int
-fhandler_dev_tape::tape_erase (int mode)
-{
- DWORD varlen;
- TAPE_GET_DRIVE_PARAMETERS dp;
-
- while (((lasterr = GetTapeParameters (get_handle (),
- GET_TAPE_DRIVE_INFORMATION,
- (varlen = sizeof dp, &varlen),
- &dp)) == ERROR_MEDIA_CHANGED)
- || (lasterr == ERROR_BUS_RESET))
- ;
-
- switch (mode)
- {
- case TAPE_ERASE_SHORT:
- if (! lasterr && ! (dp.FeaturesLow & TAPE_DRIVE_ERASE_SHORT))
- mode = TAPE_ERASE_LONG;
- break;
- case TAPE_ERASE_LONG:
- if (! lasterr && ! (dp.FeaturesLow & TAPE_DRIVE_ERASE_LONG))
- mode = TAPE_ERASE_SHORT;
- break;
- }
-
- return tape_error (EraseTape (get_handle (), mode, FALSE), "tape_erase");
-}
-
-int
-fhandler_dev_tape::tape_prepare (int action)
-{
- while (((lasterr = PrepareTape (get_handle (),
- action,
- FALSE)) == ERROR_MEDIA_CHANGED)
- || (lasterr == ERROR_BUS_RESET))
- ;
- return tape_error (lasterr, "tape_prepare");
-}
-
-BOOLEAN
-fhandler_dev_tape::tape_get_feature (DWORD parm)
-{
- DWORD varlen;
- TAPE_GET_DRIVE_PARAMETERS dp;
-
- while (((lasterr = GetTapeParameters (get_handle (),
- GET_TAPE_DRIVE_INFORMATION,
- (varlen = sizeof dp, &varlen),
- &dp)) == ERROR_MEDIA_CHANGED)
- || (lasterr == ERROR_BUS_RESET))
- ;
-
- if (lasterr)
- return FALSE;
-
- return ((parm & TAPE_DRIVE_HIGH_FEATURES)
- ? ((dp.FeaturesHigh & parm) != 0)
- : ((dp.FeaturesLow & parm) != 0));
-}
-
-int
-fhandler_dev_tape::tape_get_blocksize (long *min, long *def, long *max, long *cur)
-{
- DWORD varlen;
- TAPE_GET_DRIVE_PARAMETERS dp;
- TAPE_GET_MEDIA_PARAMETERS mp;
-
- while (((lasterr = GetTapeParameters (get_handle (),
- GET_TAPE_DRIVE_INFORMATION,
- (varlen = sizeof dp, &varlen),
- &dp)) == ERROR_MEDIA_CHANGED)
- || (lasterr == ERROR_BUS_RESET))
- ;
-
- if (lasterr)
- return tape_error (lasterr, "tape_get_blocksize");
-
- while (((lasterr = GetTapeParameters (get_handle (),
- GET_TAPE_MEDIA_INFORMATION,
- (varlen = sizeof dp, &varlen),
- &mp)) == ERROR_MEDIA_CHANGED)
- || (lasterr == ERROR_BUS_RESET))
- ;
-
- if (lasterr)
- return tape_error (lasterr, "tape_get_blocksize");
-
- if (min)
- *min = (long) dp.MinimumBlockSize;
- if (def)
- *def = (long) dp.DefaultBlockSize;
- if (max)
- *max = (long) dp.MaximumBlockSize;
- if (cur)
- *cur = (long) mp.BlockSize;
-
- return tape_error (lasterr, "tape_get_blocksize");
-}
-
-int
-fhandler_dev_tape::tape_set_blocksize (long count)
-{
- long min, max;
- TAPE_SET_MEDIA_PARAMETERS mp;
-
- lasterr = tape_get_blocksize (&min, NULL, &max, NULL);
-
- if (lasterr)
- return lasterr;
-
- if (count != 0 && (count < min || count > max))
- return tape_error (ERROR_INVALID_PARAMETER, "tape_set_blocksize");
-
- mp.BlockSize = count;
-
- return tape_error (SetTapeParameters (get_handle (),
- SET_TAPE_MEDIA_INFORMATION,
- &mp),
- "tape_set_blocksize");
-}
-
-static long long
-get_ll (PLARGE_INTEGER i)
-{
- long long l = 0;
-
- l = i->HighPart;
- l <<= 32;
- l |= i->LowPart;
- return l;
-}
-
-int
-fhandler_dev_tape::tape_status (struct mtget *get)
-{
- DWORD varlen;
- TAPE_GET_DRIVE_PARAMETERS dp;
- TAPE_GET_MEDIA_PARAMETERS mp;
- int notape = 0;
-
- if (! get)
- return ERROR_INVALID_PARAMETER;
-
- while (((lasterr = GetTapeParameters (get_handle (),
- GET_TAPE_DRIVE_INFORMATION,
- (varlen = sizeof dp, &varlen),
- &dp)) == ERROR_MEDIA_CHANGED)
- || (lasterr == ERROR_BUS_RESET))
- ;
-
- /* Setting varlen to sizeof DP is by intention, actually! Never set
- it to sizeof MP which seems to be more correct but results in a
- ERROR_MORE_DATA error at least on W2K. */
- if ((lasterr) || (lasterr = GetTapeParameters (get_handle (),
- GET_TAPE_MEDIA_INFORMATION,
- (varlen = sizeof dp, &varlen),
- &mp)))
- notape = 1;
-
- memset (get, 0, sizeof *get);
-
- get->mt_type = MT_ISUNKNOWN;
-
- if (! notape && (dp.FeaturesLow & TAPE_DRIVE_TAPE_REMAINING))
- {
- get->mt_remaining = get_ll (&mp.Remaining);
- get->mt_resid = get->mt_remaining >> 10;
- }
-
- if ((dp.FeaturesHigh & TAPE_DRIVE_SET_BLOCK_SIZE) && ! notape)
- get->mt_dsreg = mp.BlockSize;
- else
- get->mt_dsreg = dp.DefaultBlockSize;
-
- if (notape)
- get->mt_gstat |= GMT_DR_OPEN (-1);
-
- if (! notape)
- {
- if (dp.FeaturesLow & TAPE_DRIVE_GET_ABSOLUTE_BLK)
- tape_get_pos ((unsigned long *) &get->mt_blkno);
-
- if (! get->mt_blkno)
- get->mt_gstat |= GMT_BOT (-1);
-
- get->mt_gstat |= GMT_ONLINE (-1);
-
- if ((dp.FeaturesLow & TAPE_DRIVE_WRITE_PROTECT) && mp.WriteProtected)
- get->mt_gstat |= GMT_WR_PROT (-1);
-
- if (dp.FeaturesLow & TAPE_DRIVE_TAPE_CAPACITY)
- get->mt_capacity = get_ll (&mp.Capacity);
- }
-
- if ((dp.FeaturesLow & TAPE_DRIVE_COMPRESSION) && dp.Compression)
- get->mt_gstat |= GMT_HW_COMP (-1);
-
- if ((dp.FeaturesLow & TAPE_DRIVE_ECC) && dp.ECC)
- get->mt_gstat |= GMT_HW_ECC (-1);
-
- if ((dp.FeaturesLow & TAPE_DRIVE_PADDING) && dp.DataPadding)
- get->mt_gstat |= GMT_PADDING (-1);
-
- if ((dp.FeaturesLow & TAPE_DRIVE_REPORT_SMKS) && dp.ReportSetmarks)
- get->mt_gstat |= GMT_IM_REP_EN (-1);
-
- get->mt_erreg = lasterr;
-
- 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
-fhandler_dev_tape::tape_compression (long count)
-{
- DWORD varlen;
- TAPE_GET_DRIVE_PARAMETERS dpg;
- TAPE_SET_DRIVE_PARAMETERS dps;
-
- while (((lasterr = GetTapeParameters (get_handle (),
- GET_TAPE_DRIVE_INFORMATION,
- (varlen = sizeof dpg, &varlen),
- &dpg)) == ERROR_MEDIA_CHANGED)
- || (lasterr == ERROR_BUS_RESET))
- ;
-
- if (lasterr)
- return tape_error (lasterr, "tape_compression");
-
- if (! (dpg.FeaturesLow & TAPE_DRIVE_COMPRESSION))
- return ERROR_INVALID_PARAMETER;
-
- if (count)
- {
- dps.ECC = dpg.ECC;
- dps.Compression = count ? TRUE : FALSE;
- dps.DataPadding = dpg.DataPadding;
- dps.ReportSetmarks = dpg.ReportSetmarks;
- dps.EOTWarningZoneSize = dpg.EOTWarningZoneSize;
- lasterr = SetTapeParameters (get_handle (),
- SET_TAPE_DRIVE_INFORMATION,
- &dps);
-
- if (lasterr)
- return tape_error (lasterr, "tape_compression");
-
- dpg.Compression = dps.Compression;
- }
-
- return 0;
-}
-
diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc
deleted file mode 100644
index b9fd9e709..000000000
--- a/winsup/cygwin/fhandler_termios.cc
+++ /dev/null
@@ -1,364 +0,0 @@
-/* fhandler_termios.cc
-
- Copyright 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 <sys/termios.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <ctype.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include "tty.h"
-
-/* Common functions shared by tty/console */
-
-void
-fhandler_termios::tcinit (tty_min *this_tc, int force)
-{
- /* Initial termios values */
-
- tc = this_tc;
-
- if (force || !TTYISSETF (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;
- TTYSETF (INITIALIZED);
- }
-}
-
-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;
- }
- tc->setpgid (pgid);
- return 0;
-}
-
-int
-fhandler_termios::tcgetpgrp ()
-{
- return tc->pgid;
-}
-
-void
-tty_min::kill_pgrp (int sig)
-{
- int killself = 0;
- winpids pids;
- for (unsigned i = 0; i < pids.npids; i++)
- {
- _pinfo *p = pids[i];
- if (!proc_exists (p) || p->ctty != ntty || p->pgid != pgid)
- continue;
- if (p == myself)
- killself++;
- else
- (void) sig_send (p, sig);
- }
- if (killself)
- sig_send (myself, sig);
-}
-
-void
-tty_min::set_ctty (int ttynum, int flags)
-{
- if ((myself->ctty < 0 || myself->ctty == ttynum) && !(flags & O_NOCTTY))
- {
- myself->ctty = ttynum;
- syscall_printf ("attached tty%d sid %d, pid %d, tty->pgid %d, tty->sid %d",
- ttynum, myself->sid, myself->pid, pgid, getsid ());
-
- pinfo p (getsid ());
- if (myself->sid == myself->pid &&
- (p == myself || !proc_exists (p)))
- {
- paranoid_printf ("resetting tty%d sid. Was %d, now %d. pgid was %d, now %d.",
- ttynum, getsid (), myself->sid, getpgid (), myself->pgid);
- /* We are the session leader */
- setsid (myself->sid);
- setpgid (myself->pgid);
- }
- else
- myself->sid = getsid ();
- if (getpgid () == 0)
- setpgid (myself->pgid);
- }
-}
-
-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, ctty %d",
- myself->pgid, tc->getpgid (), myself->ctty);
-
- 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 *) myself->getsig (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)
- kill_pgrp (myself->pgid, sig);
- 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");
- (void) 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_fork (HANDLE parent)
-{
- this->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 1f552ceaf..000000000
--- a/winsup/cygwin/fhandler_tty.cc
+++ /dev/null
@@ -1,1259 +0,0 @@
-/* fhandler_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 <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <ctype.h>
-#include <limits.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include "cygheap.h"
-#include "shared_info.h"
-#include "cygwin/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 (int unit)
- : fhandler_pty_master (FH_TTYM, unit), console (NULL)
-{
-}
-
-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 (int ntty)
-{
- termios_printf ("Creating master for tty%d", ntty);
-
- if (init_console ())
- {
- termios_printf ("can't create fhandler");
- return -1;
- }
-
- termios ti;
- memset (&ti, 0, sizeof (ti));
- console->tcsetattr (0, &ti);
-
- ttynum = ntty;
-
- cygwin_shared->tty[ttynum]->common_init (this);
-
- set_winsize (false);
-
- inuse = get_ttyp ()->create_inuse (TTY_MASTER_ALIVE);
-
- cygthread *h;
- h = new cygthread (process_input, cygself, "ttyin");
- h->SetThreadPriority (THREAD_PRIORITY_HIGHEST);
- h->zap_h ();
-
- h = new cygthread (process_ioctl, cygself, "ttyioctl");
- h->SetThreadPriority (THREAD_PRIORITY_HIGHEST);
- h->zap_h ();
-
- h = new cygthread (process_output, 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;
-
- (void) 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);
- (void) tty_master->line_edit (rawbuf, nraw, tty_master->get_ttyp ()->ti);
- }
-}
-
-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. */
- 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;
- 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)
- 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 (int num)
- : fhandler_tty_common (FH_TTYS, num)
-{
- set_r_no_interrupt (1);
-}
-
-fhandler_tty_slave::fhandler_tty_slave ()
- : fhandler_tty_common (FH_TTYS, 0)
-{
- set_r_no_interrupt (1);
-}
-
-/* FIXME: This function needs to close handles when it has
- a failing condition. */
-int
-fhandler_tty_slave::open (path_conv *, int flags, mode_t)
-{
- tcinit (cygwin_shared->tty[ttynum]);
-
- attach_tty (ttynum);
- tc->set_ctty (ttynum, flags);
-
- set_flags ((flags & ~O_TEXT) | O_BINARY);
- /* Create synchronisation events */
- char buf[40];
-
- /* 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. */
- __small_sprintf (buf, OUTPUT_DONE_EVENT, ttynum);
- 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;
- }
- __small_sprintf (buf, INPUT_AVAILABLE_EVENT, ttynum);
- 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. */
- __small_sprintf (buf, IOCTL_REQUEST_EVENT, ttynum);
- ioctl_request_event = OpenEvent (EVENT_ALL_ACCESS, TRUE, buf);
- __small_sprintf (buf, IOCTL_DONE_EVENT, ttynum);
- 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, to_master_local;
-
- if (!wincap.has_security () ||
- cygserver_running == CYGSERVER_UNAVAIL ||
- !cygserver_attach_tty (&from_master_local, &to_master_local))
- {
- termios_printf ("cannot dup handles via server. using old method.");
-
- 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",
- ttynum, 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;
- }
-
- 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;
- }
- 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 ();
- termios_printf ("tty%d opened", ttynum);
-
- return 1;
-}
-
-int
-fhandler_tty_slave::cygserver_attach_tty (LPHANDLE from_master_ptr,
- LPHANDLE to_master_ptr)
-{
- 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;
-}
-
-void
-fhandler_tty_slave::init (HANDLE, DWORD a, mode_t)
-{
- int mode = 0;
-
- a &= GENERIC_READ | GENERIC_WRITE;
- if (a == GENERIC_READ)
- mode = O_RDONLY;
- if (a == GENERIC_WRITE)
- mode = O_WRONLY;
- if (a == (GENERIC_READ | GENERIC_WRITE))
- mode = O_RDWR;
-
- open (0, mode);
-}
-
-int
-fhandler_tty_slave::write (const void *ptr, size_t len)
-{
- DWORD n, towrite = len;
-
- termios_printf ("tty%d, write(%x, %d)", ttynum, 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 ((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 = INFINITE;
- while (len)
- {
- rc = WaitForMultipleObjects (2, w4, FALSE, waiter);
-
- if (rc == WAIT_TIMEOUT)
- 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);
- (ssize_t) len = -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;
- }
-
- if (!vmin && !time_to_wait)
- {
- ReleaseMutex (input_mutex);
- (ssize_t) len = bytes_in_pipe;
- return;
- }
-
- readlen = min (bytes_in_pipe, min (len, sizeof (buf)));
-
- if (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;
- memcpy (ptr, buf, n);
- ptr = (char *) ptr + n;
- }
- }
-
- if (!bytes_in_pipe)
- ResetEvent (input_available_event);
-
- ReleaseMutex (input_mutex);
-
- 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);
- (ssize_t) len = totalread;
- return;
-}
-
-int
-fhandler_tty_common::dup (fhandler_base *child)
-{
- fhandler_tty_slave *fts = (fhandler_tty_slave *) child;
- int errind;
-
- fts->ttynum = ttynum;
- fts->tcinit (get_ttyp ());
-
- attach_tty (ttynum);
- tc->set_ctty (ttynum, openflags);
-
- 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)
-{
- return 0;
-}
-
-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 == ttynum && (get_ttyp ()->ti.c_lflag & TOSTOP))
- {
- /* background process */
- termios_printf ("bg ioctl pgid %d, tpgid %d, ctty %d",
- myself->pgid, get_ttyp ()->getpgid (), myself->ctty);
- raise (SIGTTOU);
- }
-
- switch (cmd)
- {
- case TIOCGWINSZ:
- case TIOCSWINSZ:
- break;
- case FIONBIO:
- set_nonblocking (*(int *) arg);
- 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 = -1;
- SetEvent (ioctl_request_event);
- }
- else
- {
- get_ttyp ()->winsize = *(struct winsize *) arg;
- kill (-get_ttyp ()->getpgid (), SIGWINCH);
- }
- if (ioctl_done_event)
- WaitForSingleObject (ioctl_done_event, INFINITE);
- }
- break;
- }
-
- release_output_mutex ();
-
-out:
- termios_printf ("%d = ioctl (%x)", get_ttyp ()->ioctl_retval, cmd);
- return get_ttyp ()->ioctl_retval;
-}
-
-/*******************************************************
- fhandler_pty_master
-*/
-fhandler_pty_master::fhandler_pty_master (DWORD devtype, int unit)
- : fhandler_tty_common (devtype, unit)
-{
-}
-
-int
-fhandler_pty_master::open (path_conv *, int flags, mode_t)
-{
- ttynum = cygwin_shared->tty.allocate_tty (0);
- if (ttynum < 0)
- return 0;
-
- cygwin_shared->tty[ttynum]->common_init (this);
- 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<%p>", ttynum, this);
- return 1;
-}
-
-int
-fhandler_tty_common::close ()
-{
- 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);
-
- /* 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 (!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 ());
-
- inuse = NULL;
- termios_printf ("tty%d <%p,%p> closed", ttynum, get_handle (), get_output_handle ());
- return 0;
-}
-
-int
-fhandler_pty_master::close ()
-{
-#if 0
- while (accept_input () > 0)
- continue;
-#endif
- this->fhandler_tty_common::close ();
-
- if (!get_ttyp ()->master_alive ())
- {
- termios_printf ("freeing tty%d (%d)", ttynum, 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);
- 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)
-{
- (ssize_t) len = process_slave_output ((char *) ptr, len, pktmode);
- return;
-}
-
-int
-fhandler_pty_master::tcgetattr (struct termios *t)
-{
- *t = cygwin_shared->tty[ttynum]->ti;
- return 0;
-}
-
-int
-fhandler_pty_master::tcsetattr (int, const struct termios *t)
-{
- cygwin_shared->tty[ttynum]->ti = *t;
- return 0;
-}
-
-int
-fhandler_pty_master::tcflush (int)
-{
- return 0;
-}
-
-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;
- kill (-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 (void)
-{
- static char buf[32];
-
- __small_sprintf (buf, "/dev/tty%d", ttynum);
- return buf;
-}
-
-void
-fhandler_tty_common::set_close_on_exec (int val)
-{
-#ifndef DEBUGGING
- this->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_inheritance (get_io_handle (), val);
- set_close_on_exec_flag (val);
-#endif
- if (output_done_event)
- set_inheritance (output_done_event, val);
- if (ioctl_request_event)
- set_inheritance (ioctl_request_event, val);
- if (ioctl_done_event)
- set_inheritance (ioctl_done_event, val);
- if (inuse)
- set_inheritance (inuse, val);
- set_inheritance (output_mutex, val);
- set_inheritance (input_mutex, val);
- set_inheritance (input_available_event, val);
- set_inheritance (output_handle, val);
-}
-
-void
-fhandler_tty_common::fixup_after_fork (HANDLE parent)
-{
- this->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 (int val)
-{
- this->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 ());
- }
-}
-
-void
-fhandler_tty_master::fixup_after_fork (HANDLE child)
-{
- this->fhandler_pty_master::fixup_after_fork (child);
- console->fixup_after_fork (child);
-}
-
-void
-fhandler_tty_master::fixup_after_exec (HANDLE)
-{
- console->close ();
- init_console ();
-}
-
-int
-fhandler_tty_master::init_console ()
-{
- console = (fhandler_console *) cygheap->fdtab.build_fhandler (-1, FH_CONSOLE, "/dev/ttym");
- if (console == NULL)
- return -1;
-
- console->init (INVALID_HANDLE_VALUE, GENERIC_READ | GENERIC_WRITE, O_BINARY);
- console->set_r_no_interrupt (1);
- return 0;
-}
diff --git a/winsup/cygwin/fhandler_virtual.cc b/winsup/cygwin/fhandler_virtual.cc
deleted file mode 100644
index 4316efa69..000000000
--- a/winsup/cygwin/fhandler_virtual.cc
+++ /dev/null
@@ -1,235 +0,0 @@
-/* fhandler_virtual.cc: base fhandler class for virtual filesystems
-
- 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 <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/cygwin.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "shared_info.h"
-#include "cygheap.h"
-#include <assert.h>
-
-#define _COMPILING_NEWLIB
-#include <dirent.h>
-
-fhandler_virtual::fhandler_virtual (DWORD devtype):
- fhandler_base (devtype), filebuf (NULL), bufalloc ((size_t) -1),
- fileid (-1)
-{
-}
-
-fhandler_virtual::~fhandler_virtual ()
-{
- if (filebuf)
- free (filebuf);
- filebuf = NULL;
-}
-
-void
-fhandler_virtual::fixup_after_exec (HANDLE)
-{
- if (filebuf)
- filebuf = NULL;
-}
-
-DIR *
-fhandler_virtual::opendir (path_conv& pc)
-{
- DIR *dir;
- DIR *res = NULL;
- size_t len;
-
- if (exists () <= 0)
- set_errno (ENOTDIR);
- else if ((len = strlen (get_name ())) > 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;
- fd = this;
- fd->set_nohandle (true);
- dir->__d_dirent->d_fd = fd;
- dir->__d_u.__d_data.__fh = this;
- dir->__d_cookie = __DIRENT_COOKIE;
- dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE;
- dir->__d_position = 0;
- dir->__d_dirhash = get_namehash ();
-
- res = dir;
- }
-
- 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->__d_position = loc;
- return;
-}
-
-void
-fhandler_virtual::rewinddir (DIR * dir)
-{
- dir->__d_position = 0;
- return;
-}
-
-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 *) malloc (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 (filebuf)
- free (filebuf);
- filebuf = NULL;
- bufalloc = (size_t) -1;
- cygwin_shared->delqueue.process_queue ();
- return 0;
-}
-
-void
-fhandler_virtual::read (void *ptr, size_t& len)
-{
- if (len == 0)
- return;
- if (openflags & O_DIROPEN)
- {
- set_errno (EISDIR);
- (ssize_t) len = -1;
- return;
- }
- if (!filebuf)
- {
- (ssize_t) len = 0;
- return;
- }
- if ((ssize_t) len > filesize - position)
- (ssize_t) len = filesize - position;
- if ((ssize_t) len < 0)
- (ssize_t) 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 (path_conv *, int flags, mode_t mode)
-{
- set_r_binary (1);
- set_w_binary (1);
-
- set_has_acls (false);
- set_isremote (false);
-
- /* what to do about symlinks? */
- set_symlink_p (false);
- set_execable_p (not_executable);
- set_socket_p (false);
-
- set_flags ((flags & ~O_TEXT) | O_BINARY);
-
- return 1;
-}
-
-int
-fhandler_virtual::exists ()
-{
- return 0;
-}
-
-bool
-fhandler_virtual::fill_filebuf ()
-{
- return true;
-}
diff --git a/winsup/cygwin/fhandler_windows.cc b/winsup/cygwin/fhandler_windows.cc
deleted file mode 100644
index d6b3059e6..000000000
--- a/winsup/cygwin/fhandler_windows.cc
+++ /dev/null
@@ -1,147 +0,0 @@
-/* fhandler_windows.cc: code to access windows message queues.
-
- Copyright 1998, 1999, 2000, 2001, 2002 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 <errno.h>
-#include <wingdi.h>
-#include <winuser.h>
-#include "cygerrno.h"
-#include "security.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 (FH_WINDOWS), hWnd_ (NULL), method_ (WINDOWS_POST)
-{
-}
-
-int
-fhandler_windows::open (path_conv *, int flags, mode_t)
-{
- set_flags ((flags & ~O_TEXT) | O_BINARY);
- set_close_on_exec_flag (1);
- 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);
- (ssize_t) len = -1;
- return;
- }
-
- (ssize_t) len = GetMessage (ptr, hWnd_, 0, 0);
-
- if ((ssize_t) len == -1)
- __seterrno ();
- else
- set_errno (0);
- return;
-}
-
-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 (int val)
-{
- if (get_handle ())
- this->fhandler_base::set_close_on_exec (val);
- else
- this->fhandler_base::set_close_on_exec_flag (val);
- void *h = hWnd_;
- if (h)
- set_inheritance (h, val);
-}
-
-void
-fhandler_windows::fixup_after_fork (HANDLE parent)
-{
- if (get_handle ())
- this->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 997abf764..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 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 <errno.h>
-#include "security.h"
-#include "fhandler.h"
-
-fhandler_dev_zero::fhandler_dev_zero ()
- : fhandler_base (FH_ZERO)
-{
-}
-
-int
-fhandler_dev_zero::open (path_conv *, int flags, mode_t)
-{
- set_flags ((flags & ~O_TEXT) | O_BINARY);
- set_nohandle (true);
- set_open_status ();
- return 1;
-}
-
-int
-fhandler_dev_zero::write (const void *, size_t len)
-{
- return len;
-}
-
-void __stdcall
-fhandler_dev_zero::read (void *ptr, size_t& len)
-{
- memset (ptr, 0, len);
- return;
-}
-
-__off64_t
-fhandler_dev_zero::lseek (__off64_t, int)
-{
- return 0;
-}
-
-void
-fhandler_dev_zero::dump ()
-{
- paranoid_printf ("here, fhandler_dev_zero");
-}
diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc
deleted file mode 100644
index a547c7721..000000000
--- a/winsup/cygwin/fork.cc
+++ /dev/null
@@ -1,751 +0,0 @@
-/* fork.cc
-
- 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 <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <errno.h>
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygerrno.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include "cygheap.h"
-#include "child_info.h"
-#define NEED_VFORK
-#include "perthread.h"
-#include "perprocess.h"
-#include "dll_init.h"
-#include "sync.h"
-#include "shared_info.h"
-#include "cygmalloc.h"
-#include "cygthread.h"
-
-#ifdef DEBUGGING
-static int npid;
-static int npid_max;
-static pid_t fork_pids[100];
-#endif
-
-/* 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 */
-
-#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
-per_thread::set (void *s)
-{
- if (s == PER_THREAD_FORK_CLEAR)
- {
- tls = TlsAlloc ();
- s = NULL;
- }
- TlsSetValue (get_tls (), s);
-}
-
-static void
-stack_base (child_info_fork &ch)
-{
- MEMORY_BASIC_INFORMATION m;
- memset (&m, 0, sizeof m);
- if (!VirtualQuery ((LPCVOID) &m, &m, sizeof m))
- system_printf ("couldn't get memory info, %E");
-
- ch.stacktop = m.AllocationBase;
- ch.stackbottom = (LPBYTE) m.BaseAddress + m.RegionSize;
- ch.stacksize = (DWORD) ch.stackbottom - (DWORD) &m;
- debug_printf ("bottom %p, top %p, stack %p, size %d, reserve %d",
- ch.stackbottom, ch.stacktop, &m, ch.stacksize,
- (DWORD) ch.stackbottom - (DWORD) ch.stacktop);
-}
-
-/* Copy memory from parent to child.
- The result is a boolean indicating success. */
-
-static int
-fork_copy (PROCESS_INFORMATION &pi, const char *what, ...)
-{
- va_list args;
- char *low;
- int pass = 0;
-
- va_start (args, what);
-
- while ((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 = WriteProcessMemory (pi.hProcess, here, here, todo, &done);
- debug_printf ("child handle %p, low %p, high %p, res %d", pi.hProcess,
- 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 pass %d failed, %p..%p, done %d, windows pid %u, %E",
- what, pass, low, high, done, pi.dwProcessId);
- goto err;
- }
- }
-
- pass++;
- }
-
- debug_printf ("done");
- return 1;
-
- err:
- TerminateProcess (pi.hProcess, 1);
- set_errno (EAGAIN);
- return 0;
-}
-
-/* Wait for child to finish what it's doing and signal us.
- We don't want to wait forever here.If there's a problem somewhere
- it'll hang the entire system (since all forks are mutex'd). If we
- time out, set errno = EAGAIN and hope the app tries again. */
-static int
-sync_with_child (PROCESS_INFORMATION &pi, HANDLE subproc_ready,
- BOOL hang_child, const char *s)
-{
- /* We also add the child process handle to the wait. If the child fails
- to initialize (eg. because of a missing dll). Then this
- handle will become signalled. This stops a *looong* timeout wait.
- */
- HANDLE w4[2];
-
- debug_printf ("waiting for child. reason: %s, hang_child %d", s,
- hang_child);
- w4[1] = pi.hProcess;
- w4[0] = subproc_ready;
- DWORD rc = WaitForMultipleObjects (2, w4, FALSE, FORK_WAIT_TIMEOUT);
-
- if (rc == WAIT_OBJECT_0 ||
- WaitForSingleObject (subproc_ready, 0) == WAIT_OBJECT_0)
- /* That's ok */;
- else if (rc == WAIT_FAILED || rc == WAIT_TIMEOUT)
- {
- if (rc != WAIT_FAILED)
- system_printf ("WaitForMultipleObjects timed out");
- else
- system_printf ("WaitForMultipleObjects failed, %E");
- set_errno (EAGAIN);
- syscall_printf ("-1 = fork(), WaitForMultipleObjects failed");
- TerminateProcess (pi.hProcess, 1);
- return 0;
- }
- else
- {
- /* Child died. Clean up and exit. */
- DWORD errcode;
- GetExitCodeProcess (pi.hProcess, &errcode);
- /* Fix me. This is not enough. The fork should not be considered
- * to have failed if the process was essentially killed by a signal.
- */
- if (errcode != STATUS_CONTROL_C_EXIT)
- {
- system_printf ("child %d(%p) died before initialization with status code %p",
- pi.dwProcessId, pi.hProcess, errcode);
- system_printf ("*** child state %s", s);
-#ifdef DEBUGGING
- abort ();
-#endif
- }
- set_errno (EAGAIN);
- syscall_printf ("Child died before subproc_ready signalled");
- return 0;
- }
-
- debug_printf ("child signalled me");
- return 1;
-}
-
-static int
-resume_child (PROCESS_INFORMATION &pi, HANDLE forker_finished)
-{
- SetEvent (forker_finished);
- debug_printf ("signalled child");
- return 1;
-}
-
-/* Notify parent that it is time for the next step.
- Note that this has to be a macro since the parent may be messing with
- our stack. */
-static void __stdcall
-sync_with_parent (const char *s, bool hang_self)
-{
- debug_printf ("signalling parent: %s", s);
- /* Tell our parent we're waiting. */
- if (!SetEvent (fork_info->subproc_ready))
- api_fatal ("fork child - SetEvent for %s failed, %E", s);
- 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 for %s", s);
- break;
- case WAIT_FAILED:
- if (GetLastError () == ERROR_INVALID_HANDLE &&
- WaitForSingleObject (fork_info->forker_finished, 1) != WAIT_FAILED)
- break;
- api_fatal ("WFSO failed for %s, fork_finished %p, %E", s,
- fork_info->forker_finished);
- break;
- default:
- debug_printf ("no problems");
- break;
- }
- }
-}
-
-static int __stdcall
-fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls)
-{
- debug_printf ("child is running. pid %d, ppid %d, stack here %p",
- myself->pid, myself->ppid, __builtin_frame_address (0));
-
- /* Restore the inheritance state as in parent
- Don't call setuid here! The flags are already set. */
- if (cygheap->user.impersonated)
- {
- debug_printf ("Impersonation of child, token: %d", cygheap->user.token);
- if (cygheap->user.token == INVALID_HANDLE_VALUE)
- RevertToSelf (); // probably not needed
- else if (!ImpersonateLoggedOnUser (cygheap->user.token))
- system_printf ("Impersonate for forked child failed: %E");
- }
-
- sync_with_parent ("after longjmp.", TRUE);
- sigproc_printf ("hParent %p, child 1 first_dll %p, load_dlls %d", hParent,
- first_dll, load_dlls);
-
-#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
-
- /* If we've played with the stack, stacksize != 0. That means that
- fork() was invoked from other than the main thread. Make sure that
- when the "main" thread exits it calls do_exit, like a normal process.
- Exit with a status code of 0. */
- if (fork_info->stacksize)
- {
- ((DWORD *)fork_info->stackbottom)[-17] = (DWORD)do_exit;
- ((DWORD *)fork_info->stackbottom)[-15] = (DWORD)0;
- }
-
- set_file_api_mode (current_codepage);
-
- MALLOC_CHECK;
-
- if (fixup_mmaps_after_fork (hParent))
- api_fatal ("recreate_mmaps_after_fork_failed");
-
-
- 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);
- ProtectHandleINH (hParent);
- sync_with_parent ("performed fork fixup.", FALSE);
- }
- else
- {
- dlls.load_after_fork (hParent, first_dll);
- cygheap->fdtab.fixup_after_fork (hParent);
- ProtectHandleINH (hParent);
- sync_with_parent ("loaded dlls", TRUE);
- }
-
- ForceCloseHandle (hParent);
- (void) ForceCloseHandle1 (fork_info->subproc_ready, subproc_ready);
- (void) ForceCloseHandle1 (fork_info->forker_finished, forker_finished);
-
- if (fixup_shms_after_fork ())
- api_fatal ("recreate_shm areas after fork failed");
-
- pinfo_fixup_after_fork ();
- signal_fixup_after_fork ();
-
- /* Set thread local stuff to zero. Under Windows 95/98 this is sometimes
- non-zero, for some reason.
- FIXME: There is a memory leak here after a fork. */
- for (per_thread **t = threadstuff; *t; t++)
- if ((*t)->clear_on_fork ())
- (*t)->set ();
-
- pthread::atforkchild ();
- wait_for_sigthread ();
- cygbench ("fork-child");
- return 0;
-}
-
-static void
-slow_pid_reuse (HANDLE h)
-{
- static NO_COPY HANDLE last_fork_procs[8] = {0};
- static NO_COPY unsigned nfork_procs = 0;
-
- if (nfork_procs >= (sizeof (last_fork_procs) / sizeof (last_fork_procs [0])))
- nfork_procs = 0;
- /* Keep a list of handles to forked 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++;
-}
-
-static int __stdcall
-fork_parent (HANDLE& hParent, dll *&first_dll,
- bool& load_dlls, void *stack_here, child_info_fork &ch)
-{
- HANDLE subproc_ready, forker_finished;
- DWORD rc;
- PROCESS_INFORMATION pi = {0, NULL, 0, 0};
-
- pthread::atforkprepare ();
-
- subproc_init ();
-
- int c_flags = GetPriorityClass (hMainProc) /*|
- CREATE_NEW_PROCESS_GROUP*/;
- STARTUPINFO si = {0, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL};
-
- /* 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;
-
- /* Create an inheritable handle to pass to the child process. This will
- allow the child to duplicate handles from the parent to itself. */
- hParent = NULL;
- if (!DuplicateHandle (hMainProc, hMainProc, hMainProc, &hParent, 0, 1,
- DUPLICATE_SAME_ACCESS))
- {
- system_printf ("couldn't create handle to myself for child, %E");
- return -1;
- }
-
- /* 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);
-
- subproc_ready = CreateEvent (&sec_all, FALSE, FALSE, NULL);
- if (subproc_ready == NULL)
- {
- CloseHandle (hParent);
- system_printf ("unable to allocate subproc_ready event, %E");
- return -1;
- }
- forker_finished = CreateEvent (&sec_all, FALSE, FALSE, NULL);
- if (forker_finished == NULL)
- {
- CloseHandle (hParent);
- CloseHandle (subproc_ready);
- system_printf ("unable to allocate forker_finished event, %E");
- return -1;
- }
-
- ProtectHandleINH (subproc_ready);
- ProtectHandleINH (forker_finished);
-
- init_child_info (PROC_FORK, &ch, 1, subproc_ready);
-
- ch.forker_finished = forker_finished;
-
- stack_base (ch);
-
- si.cb = sizeof (STARTUPINFO);
- si.lpReserved2 = (LPBYTE)&ch;
- si.cbReserved2 = sizeof (ch);
-
- /* Remove impersonation */
- if (cygheap->user.issetuid ())
- RevertToSelf ();
-
- ch.parent = hParent;
-#ifdef DEBUGGING
- if (npid_max)
- {
- for (int pass = 0; pass < 2; pass++)
- {
- pid_t pid;
- while ((pid = fork_pids[npid++]))
- if (!pinfo (pid))
- {
- ch.cygpid = pid;
- goto out;
- }
- npid = 0;
- }
- }
- out:
-#endif
-
- char sa_buf[1024];
- PSECURITY_ATTRIBUTES sec_attribs = sec_user_nih (sa_buf);
- syscall_printf ("CreateProcess (%s, %s, 0, 0, 1, %x, 0, 0, %p, %p)",
- myself->progname, myself->progname, c_flags, &si, &pi);
- __malloc_lock ();
- void *newheap;
- newheap = cygheap_setup_for_child (&ch, cygheap->fdtab.need_fixup_before ());
- rc = CreateProcess (myself->progname, /* image to run */
- myself->progname, /* what we send in arg0 */
- sec_attribs,
- sec_attribs,
- TRUE, /* inherit handles from parent */
- c_flags,
- NULL, /* environment filled in later */
- 0, /* use current drive/directory */
- &si,
- &pi);
-
- CloseHandle (hParent);
-
- if (!rc)
- {
- __seterrno ();
- syscall_printf ("CreateProcessA failed, %E");
- ForceCloseHandle (subproc_ready);
- ForceCloseHandle (forker_finished);
- /* Restore impersonation */
- if (cygheap->user.issetuid ())
- ImpersonateLoggedOnUser (cygheap->user.token);
- cygheap_setup_for_child_cleanup (newheap, &ch, 0);
- return -1;
- }
-
- /* Fixup the parent datastructure if needed and resume the child's
- main thread. */
- if (!cygheap->fdtab.need_fixup_before ())
- cygheap_setup_for_child_cleanup (newheap, &ch, 0);
- else
- {
- cygheap->fdtab.fixup_before_fork (pi.dwProcessId);
- cygheap_setup_for_child_cleanup (newheap, &ch, 1);
- ResumeThread (pi.hThread);
- }
-
-#ifdef DEBUGGING
- pinfo forked ((ch.cygpid != 1 ? ch.cygpid : cygwin_pid (pi.dwProcessId)), 1);
-#else
- pinfo forked (cygwin_pid (pi.dwProcessId), 1);
-#endif
-
- /* Initialize things that are done later in dll_crt0_1 that aren't done
- for the forkee. */
- strcpy (forked->progname, myself->progname);
-
- /* Restore impersonation */
- if (cygheap->user.issetuid ())
- ImpersonateLoggedOnUser (cygheap->user.token);
-
- ProtectHandle (pi.hThread);
- /* Protect the handle but name it similarly to the way it will
- be called in subproc handling. */
- ProtectHandle1 (pi.hProcess, childhProc);
-
- /* Fill in fields in the child's process table entry. */
- forked->hProcess = pi.hProcess;
- forked->dwProcessId = pi.dwProcessId;
- forked->copysigs (myself);
-
- /* 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 (!forked.remember ())
- {
- TerminateProcess (pi.hProcess, 1);
- set_errno (EAGAIN);
- goto cleanup;
- }
-
- slow_pid_reuse (pi.hProcess);
-
- /* Wait for subproc to initialize itself. */
- if (!sync_with_child (pi, subproc_ready, TRUE, "waiting for longjmp"))
- goto cleanup;
-
- /* 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;
- rc = fork_copy (pi, "user/cygwin data",
- user_data->data_start, user_data->data_end,
- user_data->bss_start, user_data->bss_end,
- cygheap->user_heap.base, cygheap->user_heap.ptr,
- stack_here, ch.stackbottom,
- dll_data_start, dll_data_end,
- dll_bss_start, dll_bss_end, NULL);
-
- __malloc_unlock ();
- MALLOC_CHECK;
- if (!rc)
- 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 (!fork_copy (pi, "linked dll data/bss", d->p.data_start, d->p.data_end,
- d->p.bss_start, d->p.bss_end,
- NULL))
- goto cleanup;
- }
-
- /* Start thread, and wait for it to reload dlls. */
- if (!resume_child (pi, forker_finished) ||
- !sync_with_child (pi, subproc_ready, load_dlls, "child loading dlls"))
- 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 (!fork_copy (pi, "loaded dll data/bss", d->p.data_start, d->p.data_end,
- d->p.bss_start, d->p.bss_end,
- NULL))
- goto cleanup;
- }
- /* Start the child up again. */
- (void) resume_child (pi, forker_finished);
- }
-
- ForceCloseHandle (subproc_ready);
- ForceCloseHandle (pi.hThread);
- ForceCloseHandle (forker_finished);
- forker_finished = NULL;
- pi.hThread = NULL;
- pthread::atforkparent ();
-
- return forked->pid;
-
-/* Common cleanup code for failure cases */
- cleanup:
- /* Remember to de-allocate the fd table. */
- if (pi.hProcess)
- ForceCloseHandle1 (pi.hProcess, childhProc);
- if (pi.hThread)
- ForceCloseHandle (pi.hThread);
- if (subproc_ready)
- ForceCloseHandle (subproc_ready);
- if (forker_finished)
- ForceCloseHandle (forker_finished);
- return -1;
-}
-
-extern "C" int
-fork ()
-{
- struct
- {
- HANDLE hParent;
- dll *first_dll;
- bool load_dlls;
- } grouped;
-
- MALLOC_CHECK;
- sigframe thisframe (mainthread);
-
- debug_printf ("entering");
- grouped.hParent = grouped.first_dll = NULL;
- grouped.load_dlls = 0;
-
- if (ISSTATE(myself, PID_SPLIT_HEAP))
- {
- system_printf ("The heap has been split, CYGWIN can't fork this process.");
- system_printf ("Increase the heap_chunk_size in the registry and try again.");
- set_errno (ENOMEM);
- syscall_printf ("-1 = fork (), split heap");
- return -1;
- }
-
- void *esp;
- __asm__ volatile ("movl %%esp,%0": "=r" (esp));
-
- myself->set_has_pgid_children ();
-
- child_info_fork ch;
-
- int res = setjmp (ch.jmp);
-
- if (res)
- res = fork_child (grouped.hParent, grouped.first_dll, grouped.load_dlls);
- else
- res = fork_parent (grouped.hParent, grouped.first_dll, grouped.load_dlls, esp, ch);
-
- MALLOC_CHECK;
- syscall_printf ("%d = fork()", res);
- return res;
-}
-#ifdef DEBUGGING
-void
-fork_init ()
-{
- char buf[1024];
- if (!GetEnvironmentVariable ("CYGWIN_FORK_PIDS", buf, 1024))
- return;
- pid_t pid;
- char *p, *pe;
- for (p = buf; (pid = strtol (p, &pe, 10)); p = pe)
- fork_pids[npid_max++] = pid;
-}
-#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
- return fork ();
-#else
- sigframe thisframe;
- vfork_save *vf = get_vfork_val ();
- char **esp, **pp;
-
- if (vf == NULL)
- vf = vfork_storage.create ();
- else if (vf->pid)
- return fork ();
-
- 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;
- int res = cygheap->fdtab.vfork_child_dup () ? 0 : -1;
- debug_printf ("%d = vfork()", res);
- return res;
- }
-
- vf = get_vfork_val ();
-
- for (pp = (char **)vf->frame, esp = vf->vfork_esp;
- esp <= vf->vfork_ebp + 2; pp++, esp++)
- *esp = *pp;
-
- thisframe.init (mainthread);
- cygheap->fdtab.vfork_parent_restore ();
-
- myself->ctty = vf->ctty;
- myself->sid = vf->sid;
- myself->pgid = vf->pgid;
-
- 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 ();
- return pid;
-#endif
-}
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 <sys/types.h>
-#include <stdlib.h>
-
-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/glob.c b/winsup/cygwin/glob.c
deleted file mode 100644
index 32e4e60d6..000000000
--- a/winsup/cygwin/glob.c
+++ /dev/null
@@ -1,956 +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 <sys/cdefs.h>
-
-/*
- * 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 <sys/param.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <dirent.h>
-#include <errno.h>
-#include <glob.h>
-
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <windows.h>
-
-#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
-#if defined (__INSIDE_CYGWIN__)
-#define STAT __stat64
-#else
-#define STAT stat
-#endif
-#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 *));
-static int glob2 __P((Char *, Char *, Char *, glob_t *));
-static int glob3 __P((Char *, Char *, Char *, Char *, glob_t *));
-static int globextend __P((const Char *, glob_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 = getpwuid(getuid())) == 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];
-
- 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)) != 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));
- 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)
- Char *pattern;
- glob_t *pglob;
-{
- 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));
-}
-
-/*
- * 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)
- Char *pathbuf, *pathend, *pattern;
- glob_t *pglob;
-{
- 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));
- }
-
- /* 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));
- }
- /* NOTREACHED */
-}
-
-static int
-glob3(pathbuf, pathend, pattern, restpattern, pglob)
- Char *pathbuf, *pathend, *pattern, *restpattern;
- glob_t *pglob;
-{
- 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);
- 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)
- const Char *path;
- glob_t *pglob;
-{
- register char **pathv;
- register int i;
- u_int newsize;
- 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;
- if ((copy = malloc(p - path)) != NULL) {
- g_Ctoc(path, copy);
- pathv[pglob->gl_offs + pglob->gl_pathc++] = copy;
- }
- pathv[pglob->gl_offs + pglob->gl_pathc] = NULL;
- 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;
-{
- /* FIXME: This only works as long as the application uses the old
- struct stat with 32 bit off_t types!!!
-
- As soon as we switch over to 64 bit, we have to decide by
- the applications API minor version number, whether to use
- a pointer to a __stat64 or a _stat32 struct to the
- pglob->gl_lstat function. */
-#ifdef __CYGWIN_USE_BIG_TYPES__
-#error FIXME check apps API minor and use correct struct stat
-#endif
- char buf[MAXPATHLEN];
-
- g_Ctoc(fn, buf);
- if (pglob->gl_flags & GLOB_ALTDIRFUNC) {
- struct __stat32 lsb;
- int ret;
-
- if (!(ret = (*pglob->gl_lstat)(buf, &lsb)))
- stat32_to_STAT (&lsb, sb);
- return ret;
- }
-#ifdef __INSIDE_CYGWIN__
- return(lstat64(buf, sb));
-#else
- return(lstat(buf, sb));
-#endif
-}
-
-static int
-g_stat(fn, sb, pglob)
- register Char *fn;
- struct STAT *sb;
- glob_t *pglob;
-{
- /* FIXME: This only works as long as the application uses the old
- struct stat with 32 bit off_t types!!!
-
- As soon as we switch over to 64 bit, we have to decide by
- the applications API minor version number, whether to use
- a pointer to a __stat64 or a _stat32 struct to the
- pglob->gl_stat function. */
-#ifdef __CYGWIN_USE_BIG_TYPES__
-#error FIXME check apps API minor and use correct struct stat
-#endif
- char buf[MAXPATHLEN];
-
- g_Ctoc(fn, buf);
- if (pglob->gl_flags & GLOB_ALTDIRFUNC) {
- struct __stat32 lsb;
- int ret;
-
- if (!(ret = (*pglob->gl_stat)(buf, &lsb)))
- stat32_to_STAT (&lsb, sb);
- return ret;
- }
-#ifdef __INSIDE_CYGWIN__
- return(stat64(buf, sb));
-#else
- return(stat(buf, sb));
-#endif
-}
-
-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 <fcntl.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <gmon.h>
-
-#include <profil.h>
-#include <windows.h>
-
-/* 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 <profile.h>
-
-/*
- * 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 51ccd066c..000000000
--- a/winsup/cygwin/grp.cc
+++ /dev/null
@@ -1,497 +0,0 @@
-/* grp.cc
-
- Copyright 1996, 1997, 1998, 2000, 2001, 2002 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 <grp.h>
-#include <wininet.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include "pinfo.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygerrno.h"
-#include "cygheap.h"
-#include "pwdgrp.h"
-
-/* Read /etc/group only once for better performance. This is done
- on the first call that needs information from it. */
-
-static struct __group32 *group_buf; /* group contents in memory */
-static int curr_lines;
-static int max_lines;
-
-/* Position in the group cache */
-#ifdef _MT_SAFE
-#define grp_pos _reent_winsup ()->_grp_pos
-#else
-static int grp_pos = 0;
-#endif
-
-static pwdgrp_check group_state;
-static char * NO_COPY null_ptr = NULL;
-
-static int
-parse_grp (struct __group32 &grp, char *line)
-{
- char *dp = strchr (line, ':');
-
- if (!dp)
- return 0;
-
- *dp++ = '\0';
- grp.gr_name = line;
-
- grp.gr_passwd = dp;
- dp = strchr (grp.gr_passwd, ':');
- if (dp)
- {
- *dp++ = '\0';
- grp.gr_gid = strtoul (line = dp, &dp, 10);
- if (dp != line && *dp == ':')
- {
- grp.gr_mem = &null_ptr;
- if (*++dp)
- {
- int i = 0;
- char *cp;
-
- for (cp = dp; (cp = strchr (cp, ',')) != NULL; ++cp)
- ++i;
- char **namearray = (char **) calloc (i + 2, sizeof (char *));
- if (namearray)
- {
- i = 0;
- for (cp = dp; (cp = strchr (dp, ',')) != NULL; dp = cp + 1)
- {
- *cp = '\0';
- namearray[i++] = dp;
- }
- namearray[i++] = dp;
- namearray[i] = NULL;
- grp.gr_mem = namearray;
- }
- }
- return 1;
- }
- }
- return 0;
-}
-
-/* Read one line from /etc/group into the group cache */
-static void
-add_grp_line (char *line)
-{
- if (curr_lines == max_lines)
- {
- max_lines += 10;
- group_buf = (struct __group32 *) realloc (group_buf, max_lines * sizeof (struct __group32));
- }
- if (parse_grp (group_buf[curr_lines], line))
- curr_lines++;
-}
-
-class group_lock
-{
- bool armed;
- static NO_COPY pthread_mutex_t mutex;
- public:
- group_lock (bool doit)
- {
- if (armed = doit)
- pthread_mutex_lock (&mutex);
- }
- ~group_lock ()
- {
- if (armed)
- pthread_mutex_unlock (&mutex);
- }
-};
-
-pthread_mutex_t NO_COPY group_lock::mutex = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER;
-
-/* 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 */
-static void
-read_etc_group ()
-{
- static pwdgrp_read gr;
-
- group_lock here (cygwin_finished_initializing);
-
- /* if we got blocked by the mutex, then etc_group may have been processed */
- if (group_state.isinitializing ())
- {
- for (int i = 0; i < curr_lines; i++)
- if ((group_buf + i)->gr_mem != &null_ptr)
- free ((group_buf + i)->gr_mem);
-
- curr_lines = 0;
- if (gr.open ("/etc/group"))
- {
- char *line;
- while ((line = gr.gets ()) != NULL)
- add_grp_line (line);
-
- group_state.set_last_modified (gr.get_fhandle (), gr.get_fname ());
- gr.close ();
- debug_printf ("Read /etc/group, %d lines", curr_lines);
- }
- group_state = loaded;
-
- /* Complete /etc/group in memory if needed */
- if (!internal_getgrgid (myself->gid))
- {
- static char linebuf [200];
- char group_name [UNLEN + 1] = "unknown";
- 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));
- }
- snprintf (linebuf, sizeof (linebuf), "%s:%s:%lu:%s",
- group_name, strbuf, myself->gid, cygheap->user.name ());
- debug_printf ("Completing /etc/group: %s", linebuf);
- add_grp_line (linebuf);
- }
- }
- return;
-}
-
-struct __group32 *
-internal_getgrsid (cygsid &sid)
-{
- char sid_string[128];
-
- if (group_state.isuninitialized ())
- read_etc_group ();
-
- if (sid.string (sid_string))
- for (int i = 0; i < 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)
-{
- struct __group32 * default_grp = NULL;
-
- if (group_state.isuninitialized ()
- || (check && group_state.isinitializing ()))
- read_etc_group ();
-
- for (int i = 0; i < curr_lines; i++)
- {
- if (group_buf[i].gr_gid == myself->gid)
- default_grp = group_buf + i;
- if (group_buf[i].gr_gid == gid)
- return group_buf + i;
- }
- return allow_ntsec || gid != ILLEGAL_GID ? NULL : default_grp;
-}
-
-struct __group32 *
-internal_getgrnam (const char *name, BOOL check)
-{
- if (group_state.isuninitialized ()
- || (check && group_state.isinitializing ()))
- read_etc_group ();
-
- for (int i = 0; i < 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" struct __group32 *
-getgrgid32 (__gid32_t gid)
-{
- return internal_getgrgid (gid, TRUE);
-}
-
-extern "C" struct __group16 *
-getgrgid (__gid16_t gid)
-{
- static struct __group16 g16;
-
- return grp32togrp16 (&g16, getgrgid32 ((__gid32_t) gid));
-}
-
-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;
-
- return grp32togrp16 (&g16, getgrnam32 (name));
-}
-
-extern "C" void
-endgrent ()
-{
- grp_pos = 0;
-}
-
-extern "C" struct __group32 *
-getgrent32 ()
-{
- if (group_state.isinitializing ())
- read_etc_group ();
-
- if (grp_pos < curr_lines)
- return group_buf + grp_pos++;
-
- return NULL;
-}
-
-extern "C" struct __group16 *
-getgrent ()
-{
- static struct __group16 g16;
-
- return grp32togrp16 (&g16, getgrent32 ());
-}
-
-extern "C" void
-setgrent ()
-{
- grp_pos = 0;
-}
-
-/* Internal function. ONLY USE THIS INTERNALLY, NEVER `getgrent'!!! */
-struct __group32 *
-internal_getgrent (int pos)
-{
- if (group_state.isuninitialized ())
- read_etc_group ();
-
- if (pos < curr_lines)
- return group_buf + pos;
- return NULL;
-}
-
-int
-internal_getgroups (int gidsetsize, __gid32_t *grouplist)
-{
- HANDLE hToken = NULL;
- DWORD size;
- int cnt = 0;
- struct __group32 *gr;
- __gid32_t gid;
- const char *username;
-
- if (allow_ntsec)
- {
- /* If impersonated, use impersonation token. */
- if (cygheap->user.issetuid ())
- hToken = cygheap->user.token;
- else if (!OpenProcessToken (hMainProc, TOKEN_QUERY, &hToken))
- hToken = NULL;
- }
- 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;
-
- 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)
- {
- if (hToken != cygheap->user.token)
- CloseHandle (hToken);
- goto error;
- }
- break;
- }
- }
- }
- else
- debug_printf ("%d = GetTokenInformation(NULL) %E", size);
- if (hToken != cygheap->user.token)
- CloseHandle (hToken);
- if (cnt)
- 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 *, __gid32_t)
-{
- if (wincap.has_security ())
- cygheap->user.groups.clear_supp ();
- return 0;
-}
-
-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)
-{
- 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)
- {
- for (int gidy = 0; gidy < gidx; gidy++)
- if (grouplist[gidy] == grouplist[gidx])
- goto found; /* Duplicate */
- if ((gr = internal_getgrgid (grouplist[gidx])) &&
- gsids.addfromgr (gr))
- goto found;
- debug_printf ("No sid found for gid %d", grouplist[gidx]);
- gsids.free_sids ();
- set_errno (EINVAL);
- return -1;
- found:
- continue;
- }
- 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 19ce3f875..000000000
--- a/winsup/cygwin/heap.cc
+++ /dev/null
@@ -1,167 +0,0 @@
-/* heap.cc: Cygwin heap manager.
-
- 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 <errno.h>
-#include "cygerrno.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include "heap.h"
-#include "shared_info.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "registry.h"
-#include "cygwin_version.h"
-
-#define assert(x)
-
-static unsigned page_const;
-
-extern "C" size_t getpagesize ();
-
-#define MINHEAP_SIZE (4 * 1024 * 1024)
-
-/* Initialize the heap at process start up. */
-
-void
-heap_init ()
-{
- /* 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, MEM_RESERVE, 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);
- }
- 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;
- /* round up by chunk size */
- DWORD reserve_size = chunk * ((allocsize + (chunk - 1)) / chunk);
-
- /* Loop until we've managed to reserve an adequate amount of memory. */
- char *p;
-MEMORY_BASIC_INFORMATION m;
-(void) VirtualQuery (cygheap->user_heap.base, &m, sizeof (m));
- for (;;)
- {
- p = (char *) VirtualAlloc (cygheap->user_heap.base, reserve_size,
- MEM_RESERVE, PAGE_READWRITE);
- if (p)
- break;
- if ((reserve_size -= page_const) <= allocsize)
- break;
- }
- if (p == NULL)
-{
-system_printf ("unable to allocate heap %p, chunk %u, reserve %u, alloc %u, %E",
-cygheap->user_heap.base, cygheap->user_heap.chunk,
-reserve_size, allocsize);
-system_printf ("base %p mem alloc base %p, state %p, size %d, %E",
-cygheap->user_heap.base, m.AllocationBase, m.State, m.RegionSize);
-error_start_init ("h:/gdbtest/gdb.exe < con > con"); try_to_debug ();
- api_fatal ("unable to allocate heap %p, chunk %u, reserve %u, alloc %u, %E",
- cygheap->user_heap.base, cygheap->user_heap.chunk,
- reserve_size, allocsize);
-}
- if (p != cygheap->user_heap.base)
- api_fatal ("heap allocated but not at %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)
-{
- sigframe thisframe (mainthread);
- 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);
-
- /* 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. */
- commitbytes = pround (newtop - (char *) cygheap->user_heap.top);
- 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) != NULL) &&
- (VirtualAlloc (cygheap->user_heap.top, commitbytes, MEM_COMMIT, PAGE_READWRITE) != NULL))
- 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 31394a0df..000000000
--- a/winsup/cygwin/hires.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* hires.h: Definitions for hires clock calculations
-
- 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. */
-
-#ifndef __HIRES_H__
-#define __HIRES_H__
-
-#include <mmsystem.h>
-
-class hires_base
-{
- protected:
- int inited;
- virtual void prime () {}
- public:
- virtual LONGLONG usecs (bool justdelta) {return 0LL;}
- virtual ~hires_base () {}
-};
-
-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
-{
- DWORD initime_ms;
- LARGE_INTEGER initime_us;
- UINT minperiod;
- void prime ();
- public:
- LONGLONG usecs (bool justdelta);
- ~hires_ms ();
-};
-#endif /*__HIRES_H__*/
diff --git a/winsup/cygwin/how-autoload-works.txt b/winsup/cygwin/how-autoload-works.txt
deleted file mode 100644
index 4f96d8beb..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-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 3b36badc8..000000000
--- a/winsup/cygwin/how-signals-work.txt
+++ /dev/null
@@ -1,132 +0,0 @@
-Copyright 2001 Red Hat Inc., Christopher Faylor
-
-How do signals work?
-
-On process startup, cygwin starts a secondary thread that deals with signals.
-This thread contains a loop which blocks waiting for one of three events:
-
-1) sigcatch_main - a semaphore which, when incremented, indicates that a
- signal may be available for the main thread. The caller waits for the
- signal to be delivered before returning.
-
-2) sigcatch_nonmain - a semaphore which , when incremented, indicates that
- a signal is available for a non-main thread (currently this is not truly
- implemented). The caller waits for the signal to be delivered before
- returning.
-
-3) sigcatch_nosync - a semaphore which, when incremented, indicates that
- a signal may be available for the main thread. The caller does not wait
- for the delivery of the signal before returning.
-
-So, the signal handler blocks waiting for one of these three semaphores.
-
-If one of these is activated, then the the signal handler inspects an
-array of integers looking for a non-zero value. The array corresponds
-to the normal UNIX signals + two extra locations for internal usage.
-This array is located in the 'sigtodo' array in the procinfo class.
-
-The signal thread uses the InterlockedDecrement function to atomically
-inspect elements of the array. If one one of the elements of the array
-is non-zero, then cygwin checks to see if the user has blocked the
-signal by inspecting the process signal mask. If the signal is blocked,
-then the current array element is reincremented and the next element is
-checked.
-
-If the signal is not blocked, then the function "sig_handle" is called
-with the signal number as an argument. This is a fairly straightforward
-function. It first checks to see if the signal is special in any way.
-
-A special signal is something like SIGKILL or SIGSTOP. The user has no
-control over how those signals affect a UNIX process. If a SIGKILL is
-received then sig_handle calls exit_sig to exit the process. If SIGSTOP
-is called then sig_handle calls the regular signal dispatch function
-with a special function argument "sig_handle_tty_stop". The signal
-dispatch function is described below.
-
-An uncaught signal like SIGTERM or SIGHUP will cause the process to exit
-with the standard UNIX exit values. Uncaught signals like SIGUSR1 are
-ignored, 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, and a standard UNIX sigaction structure. The meat of
-signal processing is in setup_handler.
-
-setup_handler has a "simple" task. It tries to stop the appropriate
-thread and redirect its execution to the signal handler function.
-Currently, the "appropriate thread" is only the main thread. Someday
-we'll have to change this to allow cygwin to interrupt other user
-threads.
-
-To accomplish its task, setup_handler first inspects the static sigsave
-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 main thread. If the sigsave structure
-seems to be "active", then a "pending" flag is set (see below) and the
-function returns. Otherwise processing continues.
-
-After determining that sigsave is available, setup_handler will take one
-of two routes, depending on whether the main thread is executing in the
-cygwin DLL or is currently in "user" code. We'll discuss the cygwin DLL
-case first.
-
-If sigsave seems to be available, then the frame information for the
-main thread is inspected. This information is set by any cygwin
-function that is known to block (such as _read()), usually by calling
-'sigframe thisframe (mainthread)' in the cygwin function. This call
-sets up information about the current stack frame of an executing cygwin
-process. Any function which uses 'sigframe thisframe' should be signal
-aware. It should detect when a signal has arrived and return
-immediately. This method is also used throughout the DLL to ensure
-accurate frame info for the executing function. So, you'll see it
-sprinkled liberally throughout the DLL, usually at places where
-empirical tests have indicated problems finding this address via the
-brute force method stack walking method employed in setup_handler.
-
-So, if mainframe is active, that means that we have good information
-about the state of the main thread. Cygwin uses the stack frame info
-from this structure to insert a call to the assembly language function
-'sigdelayed' in place of the main thread's normal return address. So,
-when a call to (e.g.) _read returns after detecting a signal, it does
-not return to its caller. Rather, it returns to sigdelayed.
-
-The sigdelayed function saves a lot of state on the stack and sets the
-signal mask as appropriate for POSIX. It uses information from the
-sigsave structure which has been filled in by interrupt_on_return, as
-called by setup_handler. sigdelayed pushes a "call" to the function
-"sigreturn" on the stack. This will be the return address 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
-sigsave 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 any new signals have come in and
-calls the handler for them now, ensuring that the order of signal
-arrival is more or less maintained. 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. Finally, it restores all
-of the register values that were in effect when sigdelayed was called.
-
-Ok, you thought I had forgotten about the 'pending' stuff didn't you?
-Well, if you can rewind up to the discussion of sig_handle, we'll return
-to the situation where sigsave was currently active. In this case,
-setup_handler will set a "pending" flag, will reincrement the appropriate
-element of the above signal array, and will return 0 to indicate that
-the interrupt did not occur. Otherwise setup_handler returns 1.
-
-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" to it. This causes the signal
-handler to rescan the signal array looking for pending signals.
-
-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(). You would use sig_send
-to send a __SIGFLUSH to the signal thread.
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 cf10bafe7..000000000
--- a/winsup/cygwin/how-to-debug-cygwin.txt
+++ /dev/null
@@ -1,128 +0,0 @@
-Copyright 2001, 2002 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 <pid>
-
- where <pid> 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) bp <<first line in the function>>
- (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 7148366db..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 dc144d6b8..000000000
--- a/winsup/cygwin/include/arpa/inet.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* arpa/inet.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 _ARPA_INET_H
-#define _ARPA_INET_H
-
-#include <netinet/in.h>
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#ifndef __INSIDE_CYGWIN_NET__
-unsigned long inet_addr (const char *);
-int inet_aton (const char *, struct in_addr *);
-unsigned long inet_lnaof (struct in_addr);
-struct in_addr inet_makeaddr (unsigned long , unsigned long);
-unsigned int inet_netof (struct in_addr);
-unsigned int inet_network (const char *);
-char *inet_ntoa (struct in_addr);
-#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 b1392ce22..000000000
--- a/winsup/cygwin/include/asm/socket.h
+++ /dev/null
@@ -1,71 +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 <cygwin/if.h>
-
-#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)
-
-/*
- * 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/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 <sys/types.h>
-#include <sys/stat.h>
-
-/* 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/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 <deo@logos-m.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. */
-
-#ifndef _CYGWIN_CORE_DUMP_H
-#define _CYGWIN_CORE_DUMP_H
-
-#include <windows.h>
-
-#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/cygserver.h b/winsup/cygwin/include/cygwin/cygserver.h
deleted file mode 100755
index d4ea70fbb..000000000
--- a/winsup/cygwin/include/cygwin/cygserver.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/* cygserver.h
-
- Copyright 2001, 2002 Red Hat Inc.
-
- Written by Egor Duda <deo@logos-m.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. */
-
-#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 1
-#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_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
-};
-
-extern bool check_cygserver_available ();
-extern void cygserver_init ();
-
-#endif /* _CYGSERVER_H_ */
diff --git a/winsup/cygwin/include/cygwin/cygserver_process.h b/winsup/cygwin/include/cygwin/cygserver_process.h
deleted file mode 100755
index 25c634e9e..000000000
--- a/winsup/cygwin/include/cygwin/cygserver_process.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/* cygserver_process.h
-
- Copyright 2001, 2002 Red Hat Inc.
-
- Written by Robert Collins <rbtcollins@hotmail.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. */
-
-#ifndef _CYGSERVER_PROCESS_
-#define _CYGSERVER_PROCESS_
-
-#include <assert.h>
-
-#include "threaded_queue.h"
-
-class process_cleanup : public queue_request
-{
-public:
- process_cleanup (class process *const theprocess)
- : _process (theprocess)
- {
- assert (_process);
- }
-
- virtual ~process_cleanup ();
-
- virtual void process ();
-
-private:
- class process *const _process;
-};
-
-class process;
-
-class cleanup_routine
-{
- friend class process;
-
-public:
- cleanup_routine (void *const key)
- : _key (key),
- _next (NULL)
- {}
-
- virtual ~cleanup_routine ();
-
- bool operator== (const cleanup_routine &rhs) const
- {
- return _key == rhs._key;
- }
-
- void *key () const { return _key; }
-
- /* MUST BE SYNCHRONOUS */
- virtual void cleanup (class process *) = 0;
-
-private:
- void *const _key;
- cleanup_routine *_next;
-};
-
-class process_cache;
-
-class process
-{
- friend class process_cache;
- friend class process_cleanup;
-
-public:
- process (pid_t cygpid, DWORD winpid);
- ~process ();
-
- pid_t cygpid () const { return _cygpid; }
- DWORD winpid () const { return _winpid; }
- HANDLE handle () const { return _hProcess; }
-
- bool is_active () const { return _exit_status == STILL_ACTIVE; }
-
- void hold () { EnterCriticalSection (&_access); }
- void release () { LeaveCriticalSection (&_access); }
-
- bool add (cleanup_routine *);
- bool remove (const cleanup_routine *);
-
-private:
- const pid_t _cygpid;
- const DWORD _winpid;
- HANDLE _hProcess;
- long _cleaning_up;
- DWORD _exit_status; // Set in the constructor and in exit_code ().
- cleanup_routine *_routines_head;
- /* used to prevent races-on-delete */
- CRITICAL_SECTION _access;
- class process *_next;
-
- DWORD check_exit_code ();
- void cleanup ();
-};
-
-class process_cache
-{
- // Number of special (i.e., non-process) handles in _wait_array.
- // See wait_for_processes () and sync_wait_array () for details.
- enum {
- SPECIALS_COUNT = 2
- };
-
- class submission_loop : public queue_submission_loop
- {
- public:
- submission_loop (process_cache *const cache, threaded_queue *const queue)
- : queue_submission_loop (queue, true),
- _cache (cache)
- {
- assert (_cache);
- }
-
- private:
- process_cache *const _cache;
-
- virtual void request_loop ();
- };
-
- friend class submission_loop;
-
-public:
- process_cache (unsigned int initial_workers);
- ~process_cache ();
-
- class process *process (pid_t cygpid, DWORD winpid);
-
- bool running () const { return _queue.running (); }
-
- bool start () { return _queue.start (); }
- bool stop () { return _queue.stop (); }
-
-private:
- threaded_queue _queue;
- submission_loop _submitter;
-
- size_t _processes_count;
- class process *_processes_head; // A list sorted by winpid.
-
- // Access to the _wait_array and related fields is not thread-safe,
- // since they are used solely by wait_for_processes () and its callees.
-
- HANDLE _wait_array[MAXIMUM_WAIT_OBJECTS];
- class process *_process_array[MAXIMUM_WAIT_OBJECTS];
-
- HANDLE _cache_add_trigger; // Actually both add and remove.
- CRITICAL_SECTION _cache_write_access; // Actually both read and write access.
-
- void wait_for_processes (HANDLE interrupt);
- size_t sync_wait_array (HANDLE interrupt);
- void check_and_remove_process (const size_t index);
-
- class process *find (DWORD winpid, class process **previous = NULL);
-};
-
-#endif /* _CYGSERVER_PROCESS_ */
diff --git a/winsup/cygwin/include/cygwin/cygserver_transport.h b/winsup/cygwin/include/cygwin/cygserver_transport.h
deleted file mode 100755
index 915f35e66..000000000
--- a/winsup/cygwin/include/cygwin/cygserver_transport.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* cygserver_transport.h
-
- Copyright 2001, 2002 Red Hat Inc.
-
- Written by Robert Collins <rbtcollins@hotmail.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. */
-
-#ifndef _CYGSERVER_TRANSPORT_
-#define _CYGSERVER_TRANSPORT_
-
-class transport_layer_base *create_server_transport ();
-
-class transport_layer_base
-{
-public:
-#ifndef __INSIDE_CYGWIN__
- virtual int listen () = 0;
- virtual class transport_layer_base *accept (bool *recoverable) = 0;
-#endif
-
- virtual void close () = 0;
- virtual ssize_t read (void *buf, size_t len) = 0;
- virtual ssize_t write (void *buf, size_t len) = 0;
- virtual int connect () = 0;
-
-#ifndef __INSIDE_CYGWIN__
- virtual void impersonate_client ();
- virtual void revert_to_self ();
-#endif
-
- virtual ~transport_layer_base ();
-};
-
-#endif /* _CYGSERVER_TRANSPORT_ */
diff --git a/winsup/cygwin/include/cygwin/cygserver_transport_pipes.h b/winsup/cygwin/include/cygwin/cygserver_transport_pipes.h
deleted file mode 100755
index 4bea2eb13..000000000
--- a/winsup/cygwin/include/cygwin/cygserver_transport_pipes.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* cygserver_transport_pipes.h
-
- Copyright 2001, 2002 Red Hat Inc.
-
- Written by Robert Collins <rbtcollins@hotmail.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. */
-
-#ifndef _CYGSERVER_TRANSPORT_PIPES_
-#define _CYGSERVER_TRANSPORT_PIPES_
-
-/* Named pipes based transport, for security on NT */
-class transport_layer_pipes : public transport_layer_base
-{
-public:
-#ifndef __INSIDE_CYGWIN__
- virtual int listen ();
- virtual class transport_layer_pipes *accept (bool *recoverable);
-#endif
-
- virtual void close ();
- virtual ssize_t read (void *buf, size_t len);
- virtual ssize_t write (void *buf, size_t len);
- virtual int connect ();
-
-#ifndef __INSIDE_CYGWIN__
- virtual void impersonate_client ();
- virtual void revert_to_self ();
-#endif
-
- transport_layer_pipes ();
- virtual ~transport_layer_pipes ();
-
-private:
- /* for pipe based communications */
- void init_security ();
-
- //FIXME: allow inited, sd, all_nih_.. to be static members
- SECURITY_DESCRIPTOR _sd;
- SECURITY_ATTRIBUTES _sec_all_nih;
- const char *const _pipe_name;
- HANDLE _hPipe;
- const bool _is_accepted_endpoint;
- bool _is_listening_endpoint;
-
- transport_layer_pipes (HANDLE hPipe);
-};
-
-#endif /* _CYGSERVER_TRANSPORT_PIPES_ */
diff --git a/winsup/cygwin/include/cygwin/cygserver_transport_sockets.h b/winsup/cygwin/include/cygwin/cygserver_transport_sockets.h
deleted file mode 100755
index d960f9c2c..000000000
--- a/winsup/cygwin/include/cygwin/cygserver_transport_sockets.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* cygserver_transport_sockets.h
-
- Copyright 2001, 2002 Red Hat Inc.
-
- Written by Robert Collins <rbtcollins@hotmail.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. */
-
-#ifndef _CYGSERVER_TRANSPORT_SOCKETS_
-#define _CYGSERVER_TRANSPORT_SOCKETS_
-
-#include <sys/socket.h>
-#include <sys/un.h>
-
-class transport_layer_sockets : public transport_layer_base
-{
-public:
-#ifndef __INSIDE_CYGWIN__
- virtual int listen ();
- virtual class transport_layer_sockets *accept (bool *recoverable);
-#endif
-
- virtual void close ();
- virtual ssize_t read (void *buf, size_t len);
- virtual ssize_t write (void *buf, size_t len);
- virtual int connect ();
-
- transport_layer_sockets ();
- virtual ~transport_layer_sockets ();
-
-private:
- /* for socket based communications */
- int _fd;
- struct sockaddr_un _addr;
- socklen_t _addr_len;
- const bool _is_accepted_endpoint;
- bool _is_listening_endpoint;
-
- transport_layer_sockets (int fd);
-};
-
-#endif /* _CYGSERVER_TRANSPORT_SOCKETS_ */
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 <windows.h>
-
-#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 5909c21b6..000000000
--- a/winsup/cygwin/include/cygwin/fs.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* cygwin/fs.h
-
- Copyright 2002 Red Hat Inc.
- Written by Chris January <chris@atomice.net>
-
-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_
-
-#include <cygwin/types.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 <corinna@vinschen.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. */
-
-#ifndef _CYGWIN_GRP_H_
-#define _CYGWIN_GRP_H_
-
-#include <sys/types.h>
-
-#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 <chris@atomice.net>
-
-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 <sys/types.h>
-#include <sys/socket.h>
-
-/* 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 ff6952743..000000000
--- a/winsup/cygwin/include/cygwin/in.h
+++ /dev/null
@@ -1,188 +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 <netinet/in.h> file.
- * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
- *
- * 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 <cygwin/types.h>
-
-/* Standard well-defined IP protocols. */
-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
-};
-
-/* 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 {
- unsigned int 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 {
- short int sin_family; /* Address family */
- unsigned short int 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 */
-
-/* <asm/byteorder.h> contains the htonl type stuff.. */
-
-#include <asm/byteorder.h>
-
-/* 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
-
-/*
- * IPv6 definitions as we start to include them. This is just
- * a beginning dont get excited 8)
- */
-
-struct in6_addr
-{
- unsigned char s6_addr[16];
-};
-
-struct sockaddr_in6
-{
- unsigned short sin6_family;
- unsigned short sin6_port;
- unsigned long sin6_flowinfo;
- struct in6_addr sin6_addr;
-};
-
-#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 <netinet/in_systm.h> file.
- * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
- *
- * 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 <sys/cdefs.h>
-#include <sys/types.h>
-
-__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 8a88a1085..000000000
--- a/winsup/cygwin/include/cygwin/ipc.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* sys/ipc.h
-
- Copyright 2001, 2002 Red Hat Inc.
- Written by Robert Collins <rbtcollins@hotmail.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. */
-
-#ifndef _SYS_IPC_H
-#define _SYS_IPC_H
-
-#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;
-};
-
-/* 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. */
-
-/* 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. */
-#define IPC_INFO 0x1003 /* For ipcs(8). */
-
-key_t ftok (const char *path, int id);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_IPC_H */
diff --git a/winsup/cygwin/include/cygwin/msg.h b/winsup/cygwin/include/cygwin/msg.h
deleted file mode 100644
index 14e89f556..000000000
--- a/winsup/cygwin/include/cygwin/msg.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* sys/msg.h
-
- Copyright 2002 Red Hat Inc.
- Written by Conrad Scott <conrad.scott@dsl.pipex.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. */
-
-#ifndef _SYS_MSG_H
-#define _SYS_MSG_H
-
-#include <cygwin/ipc.h>
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/* Message operation flags:
- */
-#define MSG_NOERROR 0x01 /* No error if big message. */
-
-/* Command definitions for the semctl () function:
- */
-#define MSG_STAT 0x2000 /* For ipcs(8) */
-#define MSG_INFO 0x2001 /* For ipcs(8) */
-
-/* Used for the number of messages in the message queue.
- */
-typedef long int msgqnum_t;
-
-/* Used for the number of bytes allowed in a message queue.
- */
-typedef long int 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. */
- long msg_spare4[2];
-};
-
-#define msg_stime msg_stim.tv_sec
-#define msg_rtime msg_rtim.tv_sec
-#define msg_ctime msg_ctim.tv_sec
-
-/* Buffer type for msgctl (IPC_INFO, ...) as used by ipcs(8).
- */
-struct msginfo
-{
- unsigned long msgpool; /* Maximum number of message bytes,
- system wide. */
- unsigned long msgmax; /* Maximum number of bytes per
- message. */
- unsigned long msgmnb; /* Maximum number of bytes on any one
- message queue. */
- unsigned long msgmni; /* Maximum number of message queues,
- system wide. */
- unsigned long msgtql; /* Maximum number of messages, system
- wide. */
- unsigned long msg_spare[4];
-};
-
-/* Buffer type for msgctl (MSG_INFO, ...) as used by ipcs(8).
- */
-struct msg_info
-{
- unsigned long msg_ids; /* Number of allocated queues. */
- unsigned long msg_num; /* Number of messages, system wide. */
- unsigned long msg_tot; /* Size in bytes of messages, system wide. */
-};
-
-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 /* _SYS_MSG_H */
diff --git a/winsup/cygwin/include/cygwin/mtio.h b/winsup/cygwin/include/cygwin/mtio.h
deleted file mode 100644
index 04e65234c..000000000
--- a/winsup/cygwin/include/cygwin/mtio.h
+++ /dev/null
@@ -1,205 +0,0 @@
-/* cygwin/mtio.h
-
- Copyright 1999, 2001 Red Hat, Inc.
-
- Written by Corinna Vinschen <corinna@vinschen.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. */
-
-/* cygwin/mtio.h header file for Cygwin.
-
- by C. Vinschen. */
-
-#ifndef _CYGWIN_MTIO_H
-#define _CYGWIN_MTIO_H
-
-#include <sys/ioctl.h>
-#include <asm/socket.h>
-
-#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
- * Cygwin: MT_ISUNKNOWN */
- 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.
- */
- /* the following registers are device dependent */
- long mt_dsreg; /* status register, Cygwin returns current
- blocksize here. */
- 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_ ? ((x) & 0x02000000) */
-#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) /* data padding */
-#define GMT_HW_ECC(x) ((x) & 0x00080000) /* HW error correction */
-#define GMT_DR_OPEN(x) ((x) & 0x00040000) /* door open (no tape) */
-#define GMT_HW_COMP(x) ((x) & 0x00020000) /* HW compression */
-#define GMT_IM_REP_EN(x) ((x) & 0x00010000) /* immediate report mode */
-/* 16 generic status bits unused */
-
-
-/* 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
-
-/*
- * Constants for mt_type. Not all of these are supported,
- * and these are not all of the ones that are supported.
- */
-#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 */
-
-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_ISEVEREX_FT40A, "Everex FT40A, QIC-40"}, \
- {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 <corinna@vinschen.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. */
-
-/*
- * 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 a3ece9f8a..000000000
--- a/winsup/cygwin/include/cygwin/sem.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* sys/sem.h
-
- Copyright 2002 Red Hat Inc.
- Written by Conrad Scott <conrad.scott@dsl.pipex.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. */
-
-#ifndef _SYS_SEM_H
-#define _SYS_SEM_H
-
-#include <cygwin/ipc.h>
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/* Semaphore operation flags:
- */
-#define SEM_UNDO /* 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. */
-
-#define SEM_STAT 0x3010 /* For ipcs(8). */
-#define SEM_INFO 0x3011 /* For ipcs(8). */
-
-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 (). */
- long sem_spare4[2];
-};
-
-#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. */
-};
-
-/* Buffer type for semctl (IPC_INFO, ...) as used by ipcs(8).
- */
-struct seminfo
-{
- unsigned long semmni; /* Maximum number of unique semaphore
- sets, system wide. */
- unsigned long semmns; /* Maximum number of semaphores,
- system wide. */
- unsigned long semmsl; /* Maximum number of semaphores per
- semaphore set. */
- unsigned long semopm; /* Maximum number of operations per
- semop call. */
- unsigned long semmnu; /* Maximum number of undo structures,
- system wide. */
- unsigned long semume; /* Maximum number of undo entries per
- undo structure. */
- unsigned long semvmx; /* Maximum semaphore value. */
- unsigned long semaem; /* Maximum adjust-on-exit value. */
- unsigned long sem_spare[4];
-};
-
-/* Buffer type for semctl (SEM_INFO, ...) as used by ipcs(8).
- */
-struct sem_info
-{
- unsigned long sem_ids; /* Number of allocated semaphore sets. */
- unsigned long sem_num; /* Number of allocated semaphores. */
-};
-
-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 /* _SYS_SEM_H */
diff --git a/winsup/cygwin/include/cygwin/shm.h b/winsup/cygwin/include/cygwin/shm.h
deleted file mode 100644
index b6b2d447c..000000000
--- a/winsup/cygwin/include/cygwin/shm.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* sys/shm.h
-
- Copyright 2001, 2002 Red Hat Inc.
- Written by Robert Collins <rbtcollins@hotmail.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. */
-
-#ifndef _SYS_SHM_H
-#define _SYS_SHM_H
-
-#include <cygwin/ipc.h>
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/* 64 Kb was hardcoded for x86. MS states this may change, but we need
- * it in the header file.
- */
-#define SHMLBA 65536 /* Segment low boundary address multiple. */
-
-/* Shared memory operation flags:
- */
-#define SHM_RDONLY 0x01 /* Attach read-only (else read-write). */
-#define SHM_RND 0x02 /* Round attach address to SHMLBA. */
-
-/* Command definitions for the semctl () function:
- */
-#define SHM_STAT 0x4000 /* For ipcs(8) */
-#define SHM_INFO 0x4001 /* For ipcs(8) */
-
-/* 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 (). */
- long shm_spare4[2];
-};
-
-#define shm_atime shm_atim.tv_sec
-#define shm_dtime shm_dtim.tv_sec
-#define shm_ctime shm_ctim.tv_sec
-
-/* Buffer type for shmctl (IPC_INFO, ...) as used by ipcs(8).
- */
-struct shminfo
-{
- unsigned long shmmax; /* Maximum size in bytes of a shared
- memory segment. */
- unsigned long shmmin; /* Minimum size in bytes of a shared
- memory segment. */
- unsigned long shmmni; /* Maximum number of shared memory
- segments, system wide. */
- unsigned long shmseg; /* Maximum number of shared memory
- segments attached per process. */
- unsigned long shmall; /* Maximum number of bytes of shared
- memory, system wide. */
- unsigned long shm_spare[4];
-};
-
-/* Buffer type for shmctl (SHM_INFO, ...) as used by ipcs(8).
- */
-struct shm_info
-{
- unsigned long shm_ids; /* Number of allocated segments. */
- unsigned long shm_tot; /* Size in bytes of allocated segments. */
- unsigned long shm_atts; /* Number of attached segments, system
- wide. */
-};
-
-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 /* _SYS_SHM_H */
diff --git a/winsup/cygwin/include/cygwin/socket.h b/winsup/cygwin/include/cygwin/socket.h
deleted file mode 100644
index 3a40c12a3..000000000
--- a/winsup/cygwin/include/cygwin/socket.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/* cygwin/socket.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 _CYGWIN_SOCKET_H
-#define _CYGWIN_SOCKET_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-struct sockaddr {
- unsigned short sa_family; /* address family, AF_xxx */
- char sa_data[14]; /* 14 bytes of protocol address */
-};
-
-#include <asm/socket.h> /* arch-dependent defines */
-#include <cygwin/sockios.h> /* the SIOCxxx I/O controls */
-#include <cygwin/uio.h> /* iovec support */
-#include <sys/types.h>
-
-struct linger {
- unsigned short l_onoff; /* Linger active */
- unsigned short l_linger; /* How long to linger for */
-};
-
-struct 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 file descriptor passing) */
- int msg_accrightslen; /* Length of rights list */
-};
-
-#ifndef socklen_t
-#define socklen_t int
-#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 */
-#define AF_INET6 23 /* IP version 6 */
-
-#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
-#define PF_INET6 AF_INET6
-
-#define PF_MAX AF_MAX
-
-/* Maximum queue length specificable by listen. */
-#define SOMAXCONN 5
-
-/* 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 */
-
-/* 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 WinSock */
-
-#define IP_OPTIONS 1
-#define IP_MULTICAST_IF 2
-#define IP_MULTICAST_TTL 3
-#define IP_MULTICAST_LOOP 4
-#define IP_ADD_MEMBERSHIP 5
-#define IP_DROP_MEMBERSHIP 6
-#define IP_TTL 7
-#define IP_TOS 8
-#define IP_DONTFRAGMENT 9
-
-/* 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 1c1a5cd1f..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 <corinna@vinschen.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. */
-
-#ifndef _CYGWIN_STAT_H
-#define _CYGWIN_STAT_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef __INSIDE_CYGWIN__
-struct __stat32
-{
- __dev16_t st_dev;
- ino_t st_ino;
- mode_t st_mode;
- nlink_t st_nlink;
- __uid16_t st_uid;
- __gid16_t st_gid;
- __dev16_t st_rdev;
- __off32_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;
- ino_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/types.h b/winsup/cygwin/include/cygwin/types.h
deleted file mode 100644
index 69bfa2056..000000000
--- a/winsup/cygwin/include/cygwin/types.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/* types.h
-
- Copyright 2001, 2002 Red Hat Inc.
- Written by Robert Collins <rbtcollins@hotmail.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. */
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#ifndef _CYGWIN_TYPES_H
-#define _CYGWIN_TYPES_H
-
-#include <sys/sysmacros.h>
-
-typedef struct timespec timespec_t, timestruc_t;
-
-typedef long __off32_t;
-typedef long long __off64_t;
-#ifdef __CYGWIN_USE_BIG_TYPES__
-typedef __off64_t off_t;
-#else
-typedef __off32_t off_t;
-#endif
-
-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
-
-typedef long blksize_t;
-
-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
-
-typedef unsigned short __uid16_t;
-typedef unsigned short __gid16_t;
-typedef unsigned long __uid32_t;
-typedef unsigned long __gid32_t;
-#ifdef __CYGWIN_USE_BIG_TYPES__
-typedef __uid32_t uid_t;
-typedef __gid32_t gid_t;
-#else
-typedef __uid16_t uid_t;
-typedef __gid16_t gid_t;
-#endif
-
-#if !defined(__INSIDE_CYGWIN__) || !defined(__cplusplus)
-
-typedef void *pthread_t;
-typedef void *pthread_mutex_t;
-
-typedef void *pthread_key_t;
-typedef void *pthread_attr_t;
-typedef void *pthread_mutexattr_t;
-typedef void *pthread_condattr_t;
-typedef void *pthread_cond_t;
-
- /* These variables are not user alterable. This means you!. */
-typedef struct
-{
- pthread_mutex_t mutex;
- int state;
-}
-pthread_once_t;
-typedef void *pthread_rwlock_t;
-typedef void *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/version.h b/winsup/cygwin/include/cygwin/version.h
deleted file mode 100644
index 690da3ff1..000000000
--- a/winsup/cygwin/include/cygwin/version.h
+++ /dev/null
@@ -1,241 +0,0 @@
-/* version.h -- Cygwin version numbers and accompanying documentation.
-
- 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. */
-
-/* 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
- means of Cygwin versioning: */
-
- /* The DLL major and minor numbers correspond to the "version of
- the Cygwin library". This version is used to track important
- changes to the DLL and is mainly informative in nature. */
-
-#define CYGWIN_VERSION_DLL_MAJOR 1003
-#define CYGWIN_VERSION_DLL_MINOR 19
-
- /* 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
-
- /* 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_DLL_MAKE_COMBINED (user_data->api_major, user_data->api_minor) <= \
- 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_DLL_MAKE_COMBINED (user_data->api_major, user_data->api_minor) <= \
- 20)
-
-#define CYGWIN_VERSION_CHECK_FOR_S_IEXEC \
- (CYGWIN_VERSION_DLL_MAKE_COMBINED (user_data->api_major, user_data->api_minor) >= \
- 36)
-
-#define CYGWIN_VERSION_CHECK_FOR_OLD_O_NONBLOCK \
- (CYGWIN_VERSION_DLL_MAKE_COMBINED (user_data->api_major, user_data->api_minor) <= \
- 28)
- /* We used to use the DLL major/minor to track
- non-backward-compatible interface changes to the API. Now we
- use an API major/minor number for this purpose. */
-
- /* 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
- */
-
- /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
-
-#define CYGWIN_VERSION_API_MAJOR 0
-#define CYGWIN_VERSION_API_MINOR 69
-
- /* 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). */
-
-#define CYGWIN_VERSION_SHARED_DATA 3
-
- /* 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 5eaa7061e..000000000
--- a/winsup/cygwin/include/dlfcn.h
+++ /dev/null
@@ -1,41 +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 .... */
-
-/* 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/exceptions.h b/winsup/cygwin/include/exceptions.h
deleted file mode 100644
index 462000d61..000000000
--- a/winsup/cygwin/include/exceptions.h
+++ /dev/null
@@ -1,120 +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 <onno@stack.urc.tue.nl>
-
-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 *, void *, CONTEXT *, void *);
-
-typedef struct _exception_list
-{
- struct _exception_list *prev;
- exception_handler *handler;
-
- /* We're apparently free to add more stuff here.
- At present we don't need any. */
-} exception_list;
-
-void init_exceptions (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 774966e9a..000000000
--- a/winsup/cygwin/include/fcntl.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* fcntl.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 _FCNTL_H
-#define _FCNTL_H
-
-#include <sys/fcntl.h>
-#define O_NDELAY _FNDELAY
-
-#endif /* _FCNTL_H */
diff --git a/winsup/cygwin/include/features.h b/winsup/cygwin/include/features.h
deleted file mode 100644
index 1161909f0..000000000
--- a/winsup/cygwin/include/features.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/* features.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 _FEATURES_H
-#define _FEATURES_H
-
-#include <sys/features.h>
-
-#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 /<tail> after Imatch. */
-#define FNM_CASEFOLD 0x10 /* Case insensitive search. */
-#define FNM_IGNORECASE FNM_CASEFOLD
-#define FNM_FILE_NAME FNM_PATHNAME
-#endif
-
-#include <sys/cdefs.h>
-
-__BEGIN_DECLS
-int fnmatch __P((const char *, const char *, int));
-__END_DECLS
-
-#endif /* !_FNMATCH_H_ */
-
-
diff --git a/winsup/cygwin/include/getopt.h b/winsup/cygwin/include/getopt.h
deleted file mode 100644
index 6b6f643b7..000000000
--- a/winsup/cygwin/include/getopt.h
+++ /dev/null
@@ -1,84 +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.
- */
-
-#ifndef __GETOPT_H__
-#define __GETOPT_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern int opterr; /* if error message should be printed */
-extern int optind; /* index into parent argv vector */
-extern int optopt; /* character checked for validity */
-extern int optreset; /* reset getopt */
-extern char *optarg; /* argument associated with option */
-
-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 *);
-#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__ */
diff --git a/winsup/cygwin/include/glob.h b/winsup/cygwin/include/glob.h
deleted file mode 100644
index 6a393f004..000000000
--- a/winsup/cygwin/include/glob.h
+++ /dev/null
@@ -1,112 +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 <sys/cdefs.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-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. */
-#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/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 <utmp.h>
-
-struct lastlog {
- long ll_time;
- char ll_line[UT_LINESIZE];
- char ll_host[UT_HOSTSIZE];
-};
-
-#endif
diff --git a/winsup/cygwin/include/limits.h b/winsup/cygwin/include/limits.h
deleted file mode 100644
index 78c475170..000000000
--- a/winsup/cygwin/include/limits.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/* limits.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 _LIMITS_H___
-#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
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-/* 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)
-#endif
-
-/* Maximum number of iovcnt in a writev */
-#undef IOV_MAX
-#define IOV_MAX (__INT_MAX__-1)
-
-/* Maximum size of ssize_t */
-#undef SSIZE_MAX
-#define SSIZE_MAX (__LONG_MAX__)
-
-/* Maximum length of a path */
-#define PATH_MAX (260 - 1 /*NUL*/)
-
-/* Max num groups for a user, value taken from NT documentation */
-/* Must match <sys/param.h> 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
-
-/* 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
-
-#endif /* _MACH_MACHLIMITS_H_ */
-#endif /* _LIMITS_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 <string.h>
-
-#endif /* _MEMORY_H */
diff --git a/winsup/cygwin/include/mntent.h b/winsup/cygwin/include/mntent.h
deleted file mode 100644
index fde1680a0..000000000
--- a/winsup/cygwin/include/mntent.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* mntent.h
-
- 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. */
-
-#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
-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 <cygwin/if.h>
-
-#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 <cygwin/in.h>
-
-#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 <cygwin/in_systm.h>
-
-#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 a8dac5b67..000000000
--- a/winsup/cygwin/include/netinet/ip.h
+++ /dev/null
@@ -1,199 +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
-
-/* 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 <cygwin/icmp.h>
-
-#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 9fcee6c71..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 e5ff51e96..000000000
--- a/winsup/cygwin/include/paths.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* paths.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 _PATHS_H_
-#define _PATHS_H_
-
-#define _PATH_DEV "/dev/"
-#define _PATH_BSHELL "/bin/sh"
-#define _PATH_LASTLOG "/var/log/lastlog"
-#define _PATH_UTMP "/var/run/utmp"
-#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 <sys/poll.h>
diff --git a/winsup/cygwin/include/pthread.h b/winsup/cygwin/include/pthread.h
deleted file mode 100644
index 0dff00053..000000000
--- a/winsup/cygwin/include/pthread.h
+++ /dev/null
@@ -1,186 +0,0 @@
-/* pthread.h: POSIX pthread interface
-
- Copyright 1996, 1997, 1998, 1999, 20000, 2001 Red Hat, Inc.
-
- Written by Marco Fuykschot <marco@ddi.nl>
-
- 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 <sys/types.h>
-#include <signal.h>
-#include <sched.h>
-
-#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 (void *)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_ERRORCHECK 0
-#define PTHREAD_MUTEX_RECURSIVE 1
-#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_ERRORCHECK
-/* this should be too low to ever be a valid address */
-#define PTHREAD_MUTEX_INITIALIZER (void *)20
-#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
-/* 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);
-
-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/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 <rbtcollins@hotmail.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. */
-
-/* Written from the opengroup specifications */
-
-#ifndef _SCHED_H
-#define _SCHED_H
-#include <time.h>
-
-/* 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/semaphore.h b/winsup/cygwin/include/semaphore.h
deleted file mode 100644
index 6dbfa09ac..000000000
--- a/winsup/cygwin/include/semaphore.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* semaphore.h: POSIX semaphore interface
-
- Copyright 2001 Red Hat, Inc.
-
- Written by Robert Collins <rbtcollins@hotmail.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 <sys/types.h>
-
-#ifndef _SEMAPHORE_H
-#define _SEMAPHORE_H
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#ifndef __INSIDE_CYGWIN__
- typedef void *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);
- int sem_wait (sem_t * sem);
- int sem_trywait (sem_t * sem);
- int sem_post (sem_t * sem);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SEMAPHORE_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 <string.h>
-
-#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 <cygwin/acl.h>
-
-#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 57bf89bef..000000000
--- a/winsup/cygwin/include/sys/cdefs.h
+++ /dev/null
@@ -1,22 +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 */
-#endif
-
diff --git a/winsup/cygwin/include/sys/copying.dj b/winsup/cygwin/include/sys/copying.dj
deleted file mode 100644
index b6d105976..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 54a6d0d5c..000000000
--- a/winsup/cygwin/include/sys/cygwin.h
+++ /dev/null
@@ -1,259 +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 <sys/types.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-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 */
-
-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
- } cygwin_getinfo_types;
-
-#define CW_NEXTPID 0x80000000 // or with pid to get next one
-
-/* Flags associated with process_state */
-enum
-{
- PID_IN_USE = 0x0001, // Entry in use.
- PID_ZOMBIE = 0x0002, // Child exited: no parent wait.
- PID_STOPPED = 0x0004, // Waiting for SIGCONT.
- PID_TTYIN = 0x0008, // Waiting for terminal input.
- PID_TTYOU = 0x0010, // Waiting for terminal output.
- PID_ORPHANED = 0x0020, // Member of an orphaned process group.
- PID_ACTIVE = 0x0040, // Pid accepts signals.
- PID_CYGPARENT = 0x0080, // Set if parent was a cygwin app.
- PID_SPLIT_HEAP = 0x0100, // Set if the heap has been split,
- // which means we can't fork again.
- PID_MYSELF = 0x0200, // Flag that pid is me.
- PID_UNUSED1 = 0x0400, // Set if process uses Winsock.
- PID_INITIALIZING = 0x0800, // Set until ready to receive signals.
- PID_USETTY = 0x1000, // Setting this enables or disables cygwin's
- // tty support. This is inherited by
- // all execed or forked processes.
- PID_ALLPIDS = 0x2000, // child has execed
- PID_EXECED = 0x4000, // redirect to original pid info block
- PID_NOREDIR = 0x8000, // 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];
-
-#ifdef __INSIDE_CYGWIN__
- 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 <windows.h> 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);
-
-#include <sys/resource.h>
-
-#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;
- HANDLE hProcess;
- 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;
-};
-
-DWORD cygwin_internal (cygwin_getinfo_types, ...);
-#endif /*WINVER*/
-
-#ifdef __cplusplus
-};
-#endif
-
-#endif /* _SYS_CYGWIN_H */
diff --git a/winsup/cygwin/include/sys/file.h b/winsup/cygwin/include/sys/file.h
deleted file mode 100644
index dbf2ea88a..000000000
--- a/winsup/cygwin/include/sys/file.h
+++ /dev/null
@@ -1,30 +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.
-*/
-
-#ifndef _FILE_H_
-#define _FILE_H_
-
-#include <fcntl.h>
-
-#define L_SET 0
-#define L_CURR 1
-#define L_INCR 1
-#define L_XTND 2
-
-#define F_OK 0 /* does file exist */
-#define X_OK 1 /* is it executable by caller */
-#define W_OK 2 /* is it writable by caller */
-#define R_OK 4 /* is it readable by caller */
-
-#endif
diff --git a/winsup/cygwin/include/sys/ioctl.h b/winsup/cygwin/include/sys/ioctl.h
deleted file mode 100644
index fd9515fb1..000000000
--- a/winsup/cygwin/include/sys/ioctl.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* sys/ioctl.h
-
- Copyright 1998, 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. */
-
-/* sys/ioctl.h */
-
-#ifndef _SYS_IOCTL_H
-#define _SYS_IOCTL_H
-
-#include <sys/cdefs.h>
-
-/* /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 */
-
-__BEGIN_DECLS
-
-int ioctl (int __fd, int __cmd, ...);
-
-__END_DECLS
-
-#endif
diff --git a/winsup/cygwin/include/sys/mman.h b/winsup/cygwin/include/sys/mman.h
deleted file mode 100644
index 70c003589..000000000
--- a/winsup/cygwin/include/sys/mman.h
+++ /dev/null
@@ -1,52 +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 <stddef.h>
-#include <sys/types.h>
-
-#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
-
-#define MAP_FAILED ((caddr_t)-1)
-
-/*
- * Flags for msync.
- */
-#define MS_ASYNC 1
-#define MS_SYNC 2
-#define MS_INVALIDATE 4
-
-extern caddr_t mmap (caddr_t __addr, size_t __len, int __prot, int __flags, int __fd, off_t __off);
-extern int munmap (caddr_t __addr, size_t __len);
-extern int mprotect (caddr_t __addr, size_t __len, int __prot);
-extern int msync (caddr_t __addr, size_t __len, int __flags);
-
-#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 57413740f..000000000
--- a/winsup/cygwin/include/sys/mount.h
+++ /dev/null
@@ -1,42 +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 = 0x001, /* "mount point" is a symlink */
- MOUNT_BINARY = 0x002, /* "binary" format read/writes */
- MOUNT_SYSTEM = 0x008, /* mount point came from system table */
- MOUNT_EXEC = 0x010, /* Any file in the mounted directory gets 'x' bit */
- MOUNT_CYGDRIVE = 0x020, /* mount point refers to cygdrive device mount */
- MOUNT_CYGWIN_EXEC = 0x040, /* file or directory is or contains a cygwin
- executable */
- MOUNT_MIXED = 0x080, /* reads are text, writes are binary
- not yet implemented */
- MOUNT_NOTEXEC = 0x100, /* don't check files for executable magic */
- MOUNT_DEVFS = 0x200, /* /device "filesystem" */
- MOUNT_PROC = 0x400 /* /proc "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/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 <cygwin/mtio.h>
-
-#endif /* _SYS_MTIO_H */
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 <sys/cdefs.h>
-
-__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 <cygwin/core_dump.h>
-
-#endif /* _SYS_PROCFS_H */
diff --git a/winsup/cygwin/include/sys/resource.h b/winsup/cygwin/include/sys/resource.h
deleted file mode 100644
index c1fe544a9..000000000
--- a/winsup/cygwin/include/sys/resource.h
+++ /dev/null
@@ -1,76 +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 <sys/time.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#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);
-
-#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 666a151eb..000000000
--- a/winsup/cygwin/include/sys/select.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* select.h
- Copyright 1998, 1999, 2000, 2001 Red Hat, Inc.
-
- Written by Geoffrey Noer <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. */
-
-#ifndef _SYS_SELECT_H
-#define _SYS_SELECT_H
-
-#if !defined (_POSIX_SOURCE) && !defined (__INSIDE_CYGWIN_NET__)
-
-#include <sys/cdefs.h>
-
-/* Get fd_set, and macros like FD_SET */
-#include <sys/types.h>
-
-/* Get definition of timeval. */
-#include <sys/time.h>
-#include <time.h>
-
-__BEGIN_DECLS
-
-int select __P ((int __n, fd_set *__readfds, fd_set *__writefds,
- fd_set *__exceptfds, struct timeval *__timeout));
-
-__END_DECLS
-
-#endif /* !_POSIX_SOURCE, !__INSIDE_CYGWIN_NET__ */
-
-#endif /* sys/select.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 <stdarg.h>
-
-#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 <features.h>
-#include <cygwin/socket.h>
-#include <sys/time.h>
-
-#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 <linux/ioctl.h>
-
-/*
- * 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<ll;ii++)\
- _seqbuf[_seqbufptr+ii+2] = bufp[ii];\
- for(ii=ll;ii<6;ii++)\
- _seqbuf[_seqbufptr+ii+2] = 0xff;\
- _SEQ_ADVBUF(8);}
-
-#define SEQ_CHN_PRESSURE(dev, chn, pressure) \
- _CHN_COMMON(dev, MIDI_CHN_PRESSURE, chn, pressure, 0, 0)
-
-#define SEQ_SET_PATCH SEQ_PGM_CHANGE
-#ifdef OSSLIB
-# define SEQ_PGM_CHANGE(dev, chn, patch) \
- {OSS_patch_caching(dev, chn, patch, seqfd, _seqbuf, _seqbuflen); \
- _CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0);}
-#else
-# define SEQ_PGM_CHANGE(dev, chn, patch) \
- _CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0)
-#endif
-
-#define SEQ_CONTROL(dev, chn, controller, value) \
- _CHN_COMMON(dev, MIDI_CTL_CHANGE, chn, controller, 0, value)
-
-#define SEQ_BENDER(dev, chn, value) \
- _CHN_COMMON(dev, MIDI_PITCH_BEND, chn, 0, 0, value)
-
-
-#define SEQ_V2_X_CONTROL(dev, voice, controller, value) {_SEQ_NEEDBUF(8);\
- _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
- _seqbuf[_seqbufptr+1] = SEQ_CONTROLLER;\
- _seqbuf[_seqbufptr+2] = (dev);\
- _seqbuf[_seqbufptr+3] = (voice);\
- _seqbuf[_seqbufptr+4] = (controller);\
- _seqbuf[_seqbufptr+5] = ((value)&0xff);\
- _seqbuf[_seqbufptr+6] = ((value>>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 <sys/vfs.h>
diff --git a/winsup/cygwin/include/sys/strace.h b/winsup/cygwin/include/sys/strace.h
deleted file mode 100644
index b43ab886f..000000000
--- a/winsup/cygwin/include/sys/strace.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/* sys/strace.h
-
- Copyright 1996, 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. */
-
-/* sys/strace.h */
-
-/* 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 <stdarg.h>
-
-#ifdef __cplusplus
-
-class strace
-{
- int vsprntf (char *buf, const char *func, const char *infmt, va_list ap);
- void write (unsigned category, const char *buf, int count);
-public:
- int microseconds ();
- int version;
- int active;
- int lmicrosec;
- int execing;
- int inited;
- void hello ();
- 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)));
-};
-
-extern strace strace;
-
-#endif /* __cplusplus */
-
-#define _STRACE_INTERFACE_ACTIVATE_ADDR -1
-#define _STRACE_INTERFACE_ACTIVATE_ADDR1 -2
-
-/* 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
-#if defined (DEBUGGING)
-# define _STRACE_ON strace.active = 1;
-# define _STRACE_OFF strace.active = 0;
-#else
-# define _STRACE_ON
-# define _STRACE_OFF
-#endif
-
-#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_strace (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_wrap(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 f3195175e..000000000
--- a/winsup/cygwin/include/sys/syslog.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* sys/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 _SYS_LOG_H
-#define _SYS_LOG_H
-
-#include <sys/cdefs.h>
-#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)
-
-#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 *, ...);
-
-__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/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 <sys/termios.h>
-
diff --git a/winsup/cygwin/include/sys/termios.h b/winsup/cygwin/include/sys/termios.h
deleted file mode 100644
index f7f88be61..000000000
--- a/winsup/cygwin/include/sys/termios.h
+++ /dev/null
@@ -1,334 +0,0 @@
-/* sys/termios.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. */
-
-/* sys/termios.h */
-
-#ifndef _SYS_TERMIOS_H
-#define _SYS_TERMIOS_H
-
-#define TIOCMGET 0x5415
-#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 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)
-#define cfsetospeed(tp,s) (((tp)->c_ospeed = (s)), 0)
-#define cfsetispeed(tp,s) (((tp)->c_ispeed = (s)), 0)
-
-#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);
-
-#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)
-
-#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 <stddef.h>
-/* For ssize_t */
-#include <sys/types.h>
-
-#include <sys/cdefs.h>
-
-__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 4e3eee82b..000000000
--- a/winsup/cygwin/include/sys/un.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* sys/un.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. */
-
-#ifndef _SYS_UN_H
-#define _SYS_UN_H
-
-/* POSIX requires only at least 100 bytes */
-#define UNIX_PATH_LEN 108
-
-struct sockaddr_un {
- unsigned short 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/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 9dd8bf7dc..000000000
--- a/winsup/cygwin/include/sys/wait.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* sys/wait.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_WAIT_H
-#define _SYS_WAIT_H
-
-#include <sys/types.h>
-#include <sys/resource.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define WNOHANG 1
-#define WUNTRACED 2
-
-/* A status looks like:
- <2 bytes info> <2 bytes code>
-
- <code> == 0, child has exited, info is the exit value
- <code> == 1..7e, child has exited, info is the signal number.
- <code> == 7f, child has stopped, info was the signal number.
- <code> == 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
-
-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 <sys/syslog.h>
-
-#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 <sys/termio.h>
-
-#endif
diff --git a/winsup/cygwin/include/tzfile.h b/winsup/cygwin/include/tzfile.h
deleted file mode 100644
index 4d3e11cb9..000000000
--- a/winsup/cygwin/include/tzfile.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* tzfile.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 _TZFILE_H
-#define _TZFILE_H
-
-#define SECSPERDAY (60*60*24)
-#define DAYSPERNYEAR 365
-#define DAYSPERLYEAR 366
-
-#define isleap(y) (((y) % 4) == 0 && ((y) % 100) != 0 || ((y) % 400) == 0)
-#endif
diff --git a/winsup/cygwin/init.cc b/winsup/cygwin/init.cc
deleted file mode 100644
index f740dcefe..000000000
--- a/winsup/cygwin/init.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-/* init.cc
-
- 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 <stdlib.h>
-#include "thread.h"
-#include "perprocess.h"
-
-int NO_COPY dynamically_loaded;
-
-extern "C" int
-WINAPI dll_entry (HANDLE h, DWORD reason, void *static_load)
-{
- switch (reason)
- {
- case DLL_PROCESS_ATTACH:
- cygwin_hmodule = (HMODULE) h;
- dynamically_loaded = (static_load == NULL);
- break;
- case DLL_PROCESS_DETACH:
- break;
- case DLL_THREAD_ATTACH:
- if (MT_INTERFACE->reent_key.set (&MT_INTERFACE->reents))
- api_fatal ("thread initialization failed");
- break;
- case DLL_THREAD_DETACH:
- /* not invoked */;
- break;
- }
- return 1;
-}
diff --git a/winsup/cygwin/ioctl.cc b/winsup/cygwin/ioctl.cc
deleted file mode 100644
index 9f219ecd6..000000000
--- a/winsup/cygwin/ioctl.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/* ioctl.cc: ioctl routines.
-
- Copyright 1996, 1998, 1999, 2000, 2001, 2002 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 <sys/ioctl.h>
-#include <errno.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "sigproc.h"
-#include <sys/termios.h>
-
-extern "C" int
-ioctl (int fd, int cmd, ...)
-{
- sigframe thisframe (mainthread);
-
- 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 538791553..000000000
--- a/winsup/cygwin/ipc.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-/* ipc.cc: Single unix specification IPC interface for Cygwin
-
- Copyright 2001, 2002 Red Hat, Inc.
-
- Originally written by Robert Collins <robert.collins@hotmail.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 <cygwin/ipc.h>
-#include <sys/stat.h>
-
-extern "C"
-{
-
-/* Notes: we return a valid key even if id's low order 8 bits are 0. */
-key_t
-ftok (const char *path, int id)
-{
- struct stat statbuf;
- if (stat (path, &statbuf))
- {
- /* stat set the appropriate errno for us */
- return (key_t) -1;
- }
-
- /* dev_t is short for cygwin
- * ino_t is long for cygwin
- * and we need 8 bits for the id.
- * thus key_t is long long.
- */
- return ((long long) statbuf.st_dev << (5*8)) | (statbuf.st_ino << (8) ) | (id & 0x00ff);
-}
-
-}
diff --git a/winsup/cygwin/lib/_cygwin_crt0_common.cc b/winsup/cygwin/lib/_cygwin_crt0_common.cc
deleted file mode 100644
index 565ba2571..000000000
--- a/winsup/cygwin/lib/_cygwin_crt0_common.cc
+++ /dev/null
@@ -1,102 +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 <reent.h>
-#include <stdlib.h>
-
-#undef environ
-
-extern "C"
-{
-char **environ;
-void cygwin_crt0 (MainFunc);
-int cygwin_attach_dll (HMODULE, MainFunc);
-int cygwin_attach_noncygwin_dll (HMODULE, MainFunc);
-int main (int, char **, char **);
-struct _reent *_impure_ptr;
-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 <windows.h>
-#include <sys/cygwin.h>
-#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 <windows.h>
-#include <sys/cygwin.h>
-#include <stdlib.h>
-#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 <windows.h>
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#undef WIN32_LEAN_AND_MEAN
-#include <stdio.h>
-
-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/getopt.c b/winsup/cygwin/lib/getopt.c
deleted file mode 100644
index effa5d774..000000000
--- a/winsup/cygwin/lib/getopt.c
+++ /dev/null
@@ -1,501 +0,0 @@
-/* $NetBSD: getopt_long.c,v 1.12 2001/04/24 09:07:43 joda Exp $ */
-
-/*-
- * 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.
- */
-
-#include <sys/cdefs.h>
-
-/*#include "namespace.h"*/
-
-#include <assert.h>
-#include <errno.h>
-/*#include <err.h>*/
-#include <stdlib.h>
-#include <string.h>
-#include <getopt.h>
-#include <stdarg.h>
-#include <stdio.h>
-
-#define REPLACE_GETOPT
-
-#define _DIAGASSERT(x) do {} while (0)
-
-#ifdef REPLACE_GETOPT
-#ifdef __weak_alias
-__weak_alias(getopt,_getopt)
-#endif
-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
-
-#ifdef __weak_alias
-__weak_alias(getopt_long,_getopt_long)
-#endif
-
-#ifndef __CYGWIN__
-#define __progname __argv[0]
-#else
-extern char __declspec(dllimport) *__progname;
-#endif
-
-#define IGNORE_FIRST (*options == '-' || *options == '+')
-#define PRINT_ERROR ((opterr) && ((*options != ':') \
- || (IGNORE_FIRST && options[1] != ':')))
-#if defined(__CYGWIN__) || defined(__MINGW32__)
-# define IS_POSIXLY_CORRECT (1)
-#else
-# define IS_POSIXLY_CORRECT (getenv("POSIXLY_CORRECT") != NULL)
-#endif
-
-#define PERMUTE (!IS_POSIXLY_CORRECT && !IGNORE_FIRST)
-/* XXX: GNU ignores PC if *options == '-' */
-#define IN_ORDER (!IS_POSIXLY_CORRECT && *options == '-')
-
-/* return values */
-#define BADCH (int)'?'
-#define BADARG ((IGNORE_FIRST && options[1] == ':') \
- || (*options == ':') ? (int)':' : (int)'?')
-#define INORDER (int)1
-
-#define EMSG ""
-
-static int getopt_internal __P((int, char * const *, const char *));
-static int gcd __P((int, int));
-static void permute_args __P((int, int, int, char * const *));
-
-static const 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";
-
-static void
-_vwarnx(const char *fmt, va_list ap)
-{
- (void)fprintf(stderr, "%s: ", __progname);
- if (fmt != NULL)
- (void)vfprintf(stderr, fmt, ap);
- (void)fprintf(stderr, "\n");
-}
-
-static void
-warnx(const char *fmt, ...)
-{
- va_list ap;
- va_start(ap, fmt);
- _vwarnx(fmt, ap);
- va_end(ap);
-}
-
-/*
- * Compute the greatest common divisor of a and b.
- */
-static int
-gcd(a, b)
- 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(nonopt_start, nonopt_end, opt_end, nargv)
- int nonopt_start;
- int nonopt_end;
- int opt_end;
- char * const *nargv;
-{
- int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;
- char *swap;
-
- _DIAGASSERT(nargv != NULL);
-
- /*
- * compute lengths of blocks and number and size of cycles
- */
- nnonopts = nonopt_end - nonopt_start;
- nopts = opt_end - nonopt_end;
- ncycle = gcd(nnonopts, nopts);
- cyclelen = (opt_end - nonopt_start) / ncycle;
-
- for (i = 0; i < ncycle; i++) {
- cstart = nonopt_end+i;
- pos = cstart;
- for (j = 0; j < cyclelen; j++) {
- if (pos >= nonopt_end)
- pos -= nnonopts;
- else
- pos += nopts;
- swap = nargv[pos];
- /* LINTED const cast */
- ((char **) nargv)[pos] = nargv[cstart];
- /* LINTED const cast */
- ((char **)nargv)[cstart] = swap;
- }
- }
-}
-
-/*
- * getopt_internal --
- * Parse argc/argv argument vector. Called by user level routines.
- * Returns -2 if -- is found (can be long option or end of options marker).
- */
-static int
-getopt_internal(int nargc, char *const * nargv, const char *options)
-{
- char *oli; /* option letter list index */
- int optchar;
-
- _DIAGASSERT(nargv != NULL);
- _DIAGASSERT(options != NULL);
-
- optarg = NULL;
-
- /*
- * XXX Some programs (like rsyncd) expect to be able to
- * XXX re-initialize optind to 0 and have getopt_long(3)
- * XXX properly function again. Work around this braindamage.
- */
- if (optind == 0 && optreset == 0)
- optind = 1;
-
- 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')) { /* found non-option */
- place = EMSG;
- if (IN_ORDER) {
- /*
- * GNU extension:
- * return non-option as argument to option 1
- */
- optarg = nargv[optind++];
- return INORDER;
- }
- if (!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 (place[1] && *++place == '-') { /* found "--" */
- place++;
- return -2;
- }
- }
- if ((optchar = (int)*place++) == (int)':' ||
- (oli = strchr(options + (IGNORE_FIRST ? 1 : 0), optchar)) == NULL) {
- /* option letter unknown or ':' */
- if (!*place)
- ++optind;
- if (PRINT_ERROR)
- warnx(illoptchar, optchar);
- optopt = optchar;
- return BADCH;
- }
- if (optchar == 'W' && oli[1] == ';') { /* -W long-option */
- /* XXX: what if no long options provided (called by getopt)? */
- if (*place)
- return -2;
-
- if (++optind >= nargc) { /* no arg */
- place = EMSG;
- if (PRINT_ERROR)
- warnx(recargchar, optchar);
- optopt = optchar;
- return BADARG;
- } else /* white space */
- place = nargv[optind];
- /*
- * Handle -W arg the same as --arg (which causes getopt to
- * stop parsing).
- */
- return -2;
- }
- if (*++oli != ':') { /* doesn't take argument */
- if (!*place)
- ++optind;
- } else { /* takes (optional) argument */
- optarg = NULL;
- if (*place) /* no white space */
- optarg = (char *) 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];
- }
- place = EMSG;
- ++optind;
- }
- /* dump back option letter */
- return optchar;
-}
-
-#ifdef REPLACE_GETOPT
-/*
- * getopt --
- * Parse argc/argv argument vector.
- *
- * [eventually this will replace the real getopt]
- */
-int
-getopt(int nargc, char * const *nargv, const char *options)
-{
- int retval;
-
- _DIAGASSERT(nargv != NULL);
- _DIAGASSERT(options != NULL);
-
- if ((retval = getopt_internal(nargc, nargv, options)) == -2) {
- ++optind;
- /*
- * 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;
- retval = -1;
- }
- return retval;
-}
-#endif
-
-/*
- * getopt_long --
- * Parse argc/argv argument vector.
- */
-int
-getopt_long(int nargc, char * const *nargv, const char *options,
- const struct option *long_options, int *idx)
-{
- int retval;
-
- _DIAGASSERT(nargv != NULL);
- _DIAGASSERT(options != NULL);
- _DIAGASSERT(long_options != NULL);
- /* idx may be NULL */
-
- if ((retval = getopt_internal(nargc, nargv, options)) == -2) {
- char *current_argv, *has_equal;
- size_t current_argv_len;
- int i, match;
-
- current_argv = (char *) place;
- match = -1;
-
- optind++;
- place = EMSG;
-
- if (*current_argv == '\0') { /* found "--" */
- /*
- * 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;
- }
- 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) ==
- (unsigned)current_argv_len) {
- /* exact match */
- match = i;
- break;
- }
- 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 (PRINT_ERROR)
- warnx(illoptstring, current_argv);
- optopt = 0;
- return BADCH;
- }
- if (long_options[match].flag) {
- *long_options[match].flag = long_options[match].val;
- retval = 0;
- } else
- retval = long_options[match].val;
- if (idx)
- *idx = match;
- }
- return retval;
-}
diff --git a/winsup/cygwin/lib/libcmain.c b/winsup/cygwin/lib/libcmain.c
deleted file mode 100644
index 13cc34cd9..000000000
--- a/winsup/cygwin/lib/libcmain.c
+++ /dev/null
@@ -1,35 +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 <windows.h>
-
-/* Allow apps which don't have a main work, as long as they define WinMain */
-int
-main ()
-{
- HMODULE x = GetModuleHandleA(0);
- char *s = GetCommandLineA ();
- STARTUPINFO si;
-
- /* GetCommandLineA returns the entire command line including the
- program name, but WinMain is defined to accept the command
- line without the program name. */
- while (*s != ' ' && *s != '\0')
- ++s;
- while (*s == ' ')
- ++s;
-
- GetStartupInfo (&si);
-
- return WinMain (x, 0, s,
- ((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 <deo@logos-m.ru>
- 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 <windows.h>
-
-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/fnmatch.c b/winsup/cygwin/libc/fnmatch.c
deleted file mode 100644
index 709bc78c8..000000000
--- a/winsup/cygwin/libc/fnmatch.c
+++ /dev/null
@@ -1,230 +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 <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <fnmatch.h>
-
-#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(pattern, string, flags)
- const char *pattern, *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
-#ifdef __STDC__
-rangematch(const char *pattern, char test, int flags, char **newp)
-#else
-rangematch(pattern, test, flags, newp)
- char *pattern;
- char test;
- int flags;
- char **newp;
-#endif
-{
- 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/localtime.cc b/winsup/cygwin/localtime.cc
deleted file mode 100644
index 3e74667fe..000000000
--- a/winsup/cygwin/localtime.cc
+++ /dev/null
@@ -1,2162 +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 <windows.h>
-#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 <ctype.h>'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 TRUE
-#define TRUE 1
-#endif /* !defined TRUE */
-
-#ifndef FALSE
-#define FALSE 0
-#endif /* !defined FALSE */
-
-#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/local/etc/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 <earl@hpato.aus.hp.com>.
-*/
-#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
-time_t timezone;
-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;
- (void) strcpy(fullname, p);
- (void) strcat(fullname, "/");
- (void) 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;
- }
- } 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;
- }
- } 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;
- }
- sp->charcnt = stdlen + 1;
- if (dstlen != 0)
- sp->charcnt += dstlen + 1;
- if ((size_t) sp->charcnt > sizeof sp->chars)
- return -1;
- cp = sp->chars;
- (void) strncpy(cp, stdname, stdlen);
- cp += stdlen;
- *cp++ = '\0';
- if (dstlen != 0) {
- (void) strncpy(cp, dstname, dstlen);
- *(cp + dstlen) = '\0';
- }
- return 0;
-}
-
-static void
-gmtload(struct state *sp)
-{
- if (tzload(gmt, sp) != 0)
- (void) 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)
- (void) 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;
- (void) strcpy(lclptr->chars, gmt);
- } else if (tzload(name, lclptr) != 0) {
- if (name[0] == ':' || tzparse(name, lclptr, FALSE) != 0)
- (void) 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)
-{
- 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/malloc.cc b/winsup/cygwin/malloc.cc
deleted file mode 100644
index 2e0a5cce0..000000000
--- a/winsup/cygwin/malloc.cc
+++ /dev/null
@@ -1,5582 +0,0 @@
-/*
- This is a version (aka dlmalloc) of malloc/free/realloc written by
- Doug Lea and released to the public domain. Use, modify, and
- redistribute this code without permission or acknowledgement in any
- way you wish. Send questions, comments, complaints, performance
- data, etc to dl@cs.oswego.edu
-
-* VERSION 2.7.2 Sat Aug 17 09:07:30 2002 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 (-O), and link it into another program. All
- of the compile-time options default to reasonable values for use on
- most unix platforms. Compile -DWIN32 for reasonable defaults on windows.
- 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.7.1.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.
-
-* 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 malloc-intensive programs.
-
- The main properties of the algorithms are:
- * For large (>= 512 bytes) requests, it is a pure best-fit allocator,
- with ties normally decided via FIFO (i.e. least recently used).
- * For small (<= 64 bytes by default) requests, it is a caching
- allocator, that maintains pools of quickly recycled chunks.
- * In between, and for combinations of large and small requests, it does
- the best it can trying to meet both goals at once.
- * For very large requests (>= 128KB by default), it relies on system
- memory mapping facilities, if supported.
-
- For a longer but slightly out of date high-level description, see
- http://gee.cs.oswego.edu/dl/html/malloc.html
-
- 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 in order to
- customize settings or to avoid overheads associated with library
- versions.
-
-* Contents, described in more detail in "description of public routines" below.
-
- Standard (ANSI/SVID/...) functions:
- malloc(size_t n);
- calloc(size_t n_elements, size_t element_size);
- free(Void_t* p);
- realloc(Void_t* p, size_t n);
- memalign(size_t alignment, size_t n);
- valloc(size_t n);
- mallinfo()
- mallopt(int parameter_number, int parameter_value)
-
- Additional functions:
- independent_calloc(size_t n_elements, size_t size, Void_t* chunks[]);
- independent_comalloc(size_t n_elements, size_t sizes[], Void_t* chunks[]);
- pvalloc(size_t n);
- cfree(Void_t* p);
- malloc_trim(size_t pad);
- malloc_usable_size(Void_t* p);
- malloc_stats();
-
-* Vital statistics:
-
- Supported pointer representation: 4 or 8 bytes
- Supported size_t representation: 4 or 8 bytes
- Note that size_t is allowed to be 4 bytes even if pointers are 8.
- You can adjust this by defining INTERNAL_SIZE_T
-
- Alignment: 2 * sizeof(size_t) (default)
- (i.e., 8 byte alignment with 4byte size_t). This suffices for
- nearly all current machines and C compilers. However, you can
- define MALLOC_ALIGNMENT to be wider than this if necessary.
-
- Minimum overhead per allocated chunk: 4 or 8 bytes
- Each malloced chunk has a hidden word of overhead 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.
-
- 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 2 *
- sizeof(size_t) bytes plus the remainder from a system page (the
- minimal mmap unit); typically 4096 or 8192 bytes.
-
- Maximum allocated size: 4-byte size_t: 2^32 minus about two pages
- 8-byte size_t: 2^64 minus about two pages
-
- It is assumed that (possibly signed) size_t 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. The ISO C standard says that it must be
- unsigned, but a few systems are known not to adhere to this.
- Additionally, even when size_t is unsigned, sbrk (which is by
- default used to obtain memory from system) accepts signed
- arguments, and may not be able to handle size_t-wide arguments
- with negative sign bit. Generally, values that would
- appear as negative after accounting for overhead and alignment
- are supported only via mmap(), which does not have this
- limitation.
-
- Requests for sizes outside the allowed range will perform an optional
- failure action and then return null. (Requests may also
- also fail because a system is out of memory.)
-
- Thread-safety: NOT thread-safe unless USE_MALLOC_LOCK defined
-
- When USE_MALLOC_LOCK is defined, wrappers are created to
- surround every public call 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,
- you would be far better off obtaining ptmalloc, which is
- derived from a version of this malloc, and is well-tuned for
- concurrent programs. (See http://www.malloc.de) Note that
- even when USE_MALLOC_LOCK is defined, you can can guarantee
- full thread-safety only if no threads acquire memory through
- direct calls to MORECORE or other system-level allocators.
-
- Compliance: I believe it is compliant with the 1997 Single Unix Specification
- (See http://www.opennc.org). Also SVID/XPG, ANSI C, and probably
- others as well.
-
-* 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 also report using it in stand-alone embedded systems.
-
- The implementation is in straight, hand-tuned ANSI C. It is not
- at all modular. (Sorry!) It uses a lot of macros. To be at all
- usable, this code should be compiled using an optimizing compiler
- (for example gcc -O3) that can simplify expressions and control
- paths. (FAQ: some macros import variables as arguments rather than
- declare locals because people reported that some debuggers
- otherwise get confused.)
-
- OPTION DEFAULT VALUE
-
- Compilation Environment options:
-
- __STD_C derived from C compiler defines
- WIN32 NOT defined
- HAVE_MEMCPY defined
- USE_MEMCPY 1 if HAVE_MEMCPY is defined
- HAVE_MMAP defined as 1
- MMAP_CLEARS 1
- HAVE_MREMAP 0 unless linux defined
- malloc_getpagesize derived from system #includes, or 4096 if not
- HAVE_USR_INCLUDE_MALLOC_H NOT defined
- LACKS_UNISTD_H NOT defined unless WIN32
- LACKS_SYS_PARAM_H NOT defined unless WIN32
- LACKS_SYS_MMAN_H NOT defined unless WIN32
- LACKS_FCNTL_H NOT defined
-
- Changing default word sizes:
-
- INTERNAL_SIZE_T size_t
- MALLOC_ALIGNMENT 2 * sizeof(INTERNAL_SIZE_T)
- PTR_UINT unsigned long
- CHUNK_SIZE_T unsigned long
-
- Configuration and functionality options:
-
- USE_DL_PREFIX NOT defined
- USE_PUBLIC_MALLOC_WRAPPERS NOT defined
- USE_MALLOC_LOCK NOT defined
- DEBUG NOT defined
- REALLOC_ZERO_BYTES_FREES NOT defined
- MALLOC_FAILURE_ACTION errno = ENOMEM, if __STD_C defined, else no-op
- TRIM_FASTBINS 0
- FIRST_SORTED_BIN_SIZE 512
-
- Options for customizing MORECORE:
-
- MORECORE sbrk
- MORECORE_CONTIGUOUS 1
- MORECORE_CANNOT_TRIM NOT defined
- MMAP_AS_MORECORE_SIZE (1024 * 1024)
-
- Tuning options that are also dynamically changeable via mallopt:
-
- DEFAULT_MXFAST 64
- DEFAULT_TRIM_THRESHOLD 256 * 1024
- DEFAULT_TOP_PAD 0
- DEFAULT_MMAP_THRESHOLD 256 * 1024
- DEFAULT_MMAP_MAX 65536
-
- There are several other #defined constants and macros that you
- probably don't want to touch unless you are extending or adapting malloc.
-*/
-
-/*
- WIN32 sets up defaults for MS environment and compilers.
- Otherwise defaults are for unix.
-*/
-
-/* #define WIN32 */
-
-#ifdef WIN32
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-
-/* Win32 doesn't supply or need the following headers */
-#define LACKS_UNISTD_H
-#define LACKS_SYS_PARAM_H
-#define LACKS_SYS_MMAN_H
-
-/* Use the supplied emulation of sbrk */
-#define MORECORE sbrk
-#define MORECORE_CONTIGUOUS 1
-#define MORECORE_FAILURE ((void*)(-1))
-
-/* Use the supplied emulation of mmap and munmap */
-#define HAVE_MMAP 1
-#define MUNMAP_FAILURE (-1)
-#define MMAP_CLEARS 1
-
-/* These values don't really matter in windows mmap emulation */
-#define MAP_PRIVATE 1
-#define MAP_ANONYMOUS 2
-#define PROT_READ 1
-#define PROT_WRITE 2
-
-/* Emulation functions defined at the end of this file */
-
-/* If USE_MALLOC_LOCK, use supplied critical-section-based lock functions */
-#ifdef USE_MALLOC_LOCK
-static int slwait(int *sl);
-static int slrelease(int *sl);
-#endif
-
-static long getpagesize(void);
-static long getregionsize(void);
-static void *sbrk(long size);
-static void *mmap(void *ptr, long size, long prot, long type, long handle, long arg);
-static long munmap(void *ptr, long size);
-
-static void vminfo (unsigned long*free, unsigned long*reserved, unsigned long*committed);
-static int cpuinfo (int whole, unsigned long*kernel, unsigned long*user);
-
-#endif
-
-/*
- __STD_C should be nonzero if using ANSI-standard C compiler, a C++
- compiler, or a C compiler sufficiently close to ANSI to get away
- with it.
-*/
-
-#ifndef __STD_C
-#if defined(__STDC__) || defined(_cplusplus)
-#define __STD_C 1
-#else
-#define __STD_C 0
-#endif
-#endif /*__STD_C*/
-
-
-/*
- Void_t* is the pointer type that malloc should say it returns
-*/
-
-#ifndef Void_t
-#if (__STD_C || defined(WIN32))
-#define Void_t void
-#else
-#define Void_t char
-#endif
-#endif /*Void_t*/
-
-#if __STD_C
-#include <stddef.h> /* for size_t */
-#else
-#include <sys/types.h>
-#endif
-
-#include "cygmalloc.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* define LACKS_UNISTD_H if your system does not have a <unistd.h>. */
-
-/* #define LACKS_UNISTD_H */
-
-#ifndef LACKS_UNISTD_H
-#include <unistd.h>
-#endif
-
-/* define LACKS_SYS_PARAM_H if your system does not have a <sys/param.h>. */
-
-/* #define LACKS_SYS_PARAM_H */
-
-
-#include <stdio.h> /* needed for malloc_stats */
-#include <errno.h> /* needed for optional MALLOC_FAILURE_ACTION */
-
-
-/*
- Debugging:
-
- Because freed chunks may be overwritten with bookkeeping 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.
-
- Setting DEBUG does NOT provide an automated mechanism for checking
- that all accesses to malloced memory stay within their
- bounds. However, there are several add-ons and adaptations of this
- or other mallocs available that do this.
-*/
-
-#if DEBUG
-#include <assert.h>
-#else
-#define assert(x) ((void)0)
-#endif
-
-/*
- The unsigned integer type used for comparing any two chunk sizes.
- This should be at least as wide as size_t, but should not be signed.
-*/
-
-#ifndef CHUNK_SIZE_T
-#define CHUNK_SIZE_T unsigned long
-#endif
-
-/*
- The unsigned integer type used to hold addresses when they are are
- manipulated as integers. Except that it is not defined on all
- systems, intptr_t would suffice.
-*/
-#ifndef PTR_UINT
-#define PTR_UINT unsigned long
-#endif
-
-
-/*
- INTERNAL_SIZE_T is the word-size used for internal bookkeeping
- of chunk sizes.
-
- The default version is the same as size_t.
-
- While not strictly necessary, it is best to define this as an
- unsigned type, even if size_t is a signed type. This may avoid some
- artificial size limitations on some systems.
-
- On a 64-bit machine, you may be able to reduce malloc overhead by
- defining INTERNAL_SIZE_T to be a 32 bit `unsigned int' at the
- expense of not being able to handle more than 2^32 of malloced
- space. If this limitation is acceptable, you are encouraged to set
- this unless you are on a platform requiring 16byte alignments. In
- this case the alignment requirements turn out to negate any
- potential advantages of decreasing size_t word size.
-
- Implementors: Beware of the possible combinations of:
- - INTERNAL_SIZE_T might be signed or unsigned, might be 32 or 64 bits,
- and might be the same width as int or as long
- - size_t might have different width and signedness as INTERNAL_SIZE_T
- - int and long might be 32 or 64 bits, and might be the same width
- To deal with this, most comparisons and difference computations
- among INTERNAL_SIZE_Ts should cast them to CHUNK_SIZE_T, being
- aware of the fact that casting an unsigned int to a wider long does
- not sign-extend. (This also makes checking for negative numbers
- awkward.) Some of these casts result in harmless compiler warnings
- on some systems.
-*/
-
-#ifndef INTERNAL_SIZE_T
-#define INTERNAL_SIZE_T size_t
-#endif
-
-/* The corresponding word size */
-#define SIZE_SZ (sizeof(INTERNAL_SIZE_T))
-
-
-
-/*
- MALLOC_ALIGNMENT is the minimum alignment for malloc'ed chunks.
- It must be a power of two at least 2 * SIZE_SZ, 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.
-*/
-
-
-#ifndef MALLOC_ALIGNMENT
-#define MALLOC_ALIGNMENT (2 * SIZE_SZ)
-#endif
-
-/* The corresponding bit mask value */
-#define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1)
-
-
-
-/*
- 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 */
-
-/*
- TRIM_FASTBINS controls whether free() of a very small chunk can
- immediately lead to trimming. Setting to true (1) can reduce memory
- footprint, but will almost always slow down programs that use a lot
- of small chunks.
-
- Define this only if you are willing to give up some speed to more
- aggressively reduce system-level memory footprint when releasing
- memory in programs that use many small chunks. You can get
- essentially the same effect by setting MXFAST to 0, but this can
- lead to even greater slowdowns in programs using many small chunks.
- TRIM_FASTBINS is an in-between compile-time option, that disables
- only those chunks bordering topmost memory from being placed in
- fastbins.
-*/
-
-#ifndef TRIM_FASTBINS
-#define TRIM_FASTBINS 0
-#endif
-
-
-/*
- USE_DL_PREFIX will prefix all public routines with the string 'dl'.
- This is necessary when you only want to use this malloc in one part
- of a program, using your regular system malloc elsewhere.
-*/
-
-/* #define USE_DL_PREFIX */
-
-
-/*
- USE_MALLOC_LOCK causes wrapper functions to surround each
- callable routine with pthread mutex lock/unlock.
-
- USE_MALLOC_LOCK forces USE_PUBLIC_MALLOC_WRAPPERS to be defined
-*/
-
-
-/* #define USE_MALLOC_LOCK */
-
-
-/*
- If USE_PUBLIC_MALLOC_WRAPPERS is defined, every public routine is
- actually a wrapper function that first calls MALLOC_PREACTION, then
- calls the internal routine, and follows it with
- MALLOC_POSTACTION. This is needed for locking, but you can also use
- this, without USE_MALLOC_LOCK, for purposes of interception,
- instrumentation, etc. It is a sad fact that using wrappers often
- noticeably degrades performance of malloc-intensive programs.
-*/
-
-#ifdef USE_MALLOC_LOCK
-#define USE_PUBLIC_MALLOC_WRAPPERS
-#else
-/* #define USE_PUBLIC_MALLOC_WRAPPERS */
-#endif
-
-
-/*
- Two-phase name translation.
- All of the actual routines are given mangled names.
- When wrappers are used, they become the public callable versions.
- When DL_PREFIX is used, the callable names are prefixed.
-*/
-
-#ifndef USE_PUBLIC_MALLOC_WRAPPERS
-#define cALLOc public_cALLOc
-#define fREe public_fREe
-#define cFREe public_cFREe
-#define mALLOc public_mALLOc
-#define mEMALIGn public_mEMALIGn
-#define rEALLOc public_rEALLOc
-#define vALLOc public_vALLOc
-#define pVALLOc public_pVALLOc
-#define mALLINFo public_mALLINFo
-#define mALLOPt public_mALLOPt
-#define mTRIm public_mTRIm
-#define mSTATs public_mSTATs
-#define mUSABLe public_mUSABLe
-#define iCALLOc public_iCALLOc
-#define iCOMALLOc public_iCOMALLOc
-#endif
-
-#ifdef USE_DL_PREFIX
-#define public_cALLOc dlcalloc
-#define public_fREe dlfree
-#define public_cFREe dlcfree
-#define public_mALLOc dlmalloc
-#define public_mEMALIGn dlmemalign
-#define public_rEALLOc dlrealloc
-#define public_vALLOc dlvalloc
-#define public_pVALLOc dlpvalloc
-#define public_mALLINFo dlmallinfo
-#define public_mALLOPt dlmallopt
-#define public_mTRIm dlmalloc_trim
-#define public_mSTATs dlmalloc_stats
-#define public_mUSABLe dlmalloc_usable_size
-#define public_iCALLOc dlindependent_calloc
-#define public_iCOMALLOc dlindependent_comalloc
-#else /* USE_DL_PREFIX */
-#define public_cALLOc calloc
-#define public_fREe free
-#define public_cFREe cfree
-#define public_mALLOc malloc
-#define public_mEMALIGn memalign
-#define public_rEALLOc realloc
-#define public_vALLOc valloc
-#define public_pVALLOc pvalloc
-#define public_mALLINFo mallinfo
-#define public_mALLOPt mallopt
-#define public_mTRIm malloc_trim
-#define public_mSTATs malloc_stats
-#define public_mUSABLe malloc_usable_size
-#define public_iCALLOc independent_calloc
-#define public_iCOMALLOc independent_comalloc
-#endif /* USE_DL_PREFIX */
-
-
-/*
- 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 below.
-
- USE_MEMCPY should be defined as 1 if you actually want to
- have memset and memcpy called. People report that the macro
- versions are faster than libc versions on some systems.
-
- Even if USE_MEMCPY is set to 1, loops to copy/clear small chunks
- (of <= 36 bytes) are manually unrolled in realloc and calloc.
-*/
-
-#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))
-
-#ifdef WIN32
-/* On Win32 memset and memcpy are already declared in windows.h */
-#else
-#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
-#endif
-
-/*
- MALLOC_FAILURE_ACTION is the action to take before "return 0" when
- malloc fails to be able to return memory, either because memory is
- exhausted or because of illegal arguments.
-
- By default, sets errno if running on STD_C platform, else does nothing.
-*/
-
-#ifndef MALLOC_FAILURE_ACTION
-#if __STD_C
-#define MALLOC_FAILURE_ACTION \
- errno = ENOMEM;
-
-#else
-#define MALLOC_FAILURE_ACTION
-#endif
-#endif
-
-/*
- MORECORE-related declarations. By default, rely on sbrk
-*/
-
-
-#ifdef LACKS_UNISTD_H
-#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
-#if __STD_C
-extern Void_t* sbrk(ptrdiff_t);
-#else
-extern Void_t* sbrk();
-#endif
-#endif
-#endif
-
-/*
- MORECORE is the name of the routine to call to obtain more memory
- from the system. See below for general guidance on writing
- alternative MORECORE functions, as well as a version for WIN32 and a
- sample version for pre-OSX macos.
-*/
-
-#ifndef MORECORE
-#define MORECORE sbrk
-#endif
-
-/*
- MORECORE_FAILURE is the value returned upon failure of MORECORE
- as well as mmap. Since it cannot be an otherwise valid memory address,
- and must reflect values of standard sys calls, you probably ought not
- try to redefine it.
-*/
-
-#ifndef MORECORE_FAILURE
-#define MORECORE_FAILURE (-1)
-#endif
-
-/*
- If MORECORE_CONTIGUOUS is true, take advantage of fact that
- consecutive calls to MORECORE with positive arguments always return
- contiguous increasing addresses. This is true of unix sbrk. Even
- if not defined, when regions happen to be contiguous, malloc will
- permit allocations spanning regions obtained from different
- calls. But defining this when applicable enables some stronger
- consistency checks and space efficiencies.
-*/
-
-#ifndef MORECORE_CONTIGUOUS
-#define MORECORE_CONTIGUOUS 1
-#endif
-
-/*
- Define MORECORE_CANNOT_TRIM if your version of 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.
-*/
-
-/* #define MORECORE_CANNOT_TRIM */
-
-
-/*
- Define HAVE_MMAP as true to optionally make malloc() use mmap() to
- allocate very large blocks. These will be returned to the
- operating system immediately after a free(). Also, if mmap
- is available, it is used as a backup strategy in cases where
- MORECORE fails to provide space from system.
-
- This malloc is best tuned to work with mmap for large requests.
- If you do not have mmap, operations involving very large chunks (1MB
- or so) may be slower than you'd like.
-*/
-
-#ifndef HAVE_MMAP
-#define HAVE_MMAP 1
-#endif
-
-#if HAVE_MMAP
-/*
- Standard unix mmap using /dev/zero clears memory so calloc doesn't
- need to.
-*/
-
-#ifndef MMAP_CLEARS
-#define MMAP_CLEARS 1
-#endif
-
-#else /* no mmap */
-#ifndef MMAP_CLEARS
-#define MMAP_CLEARS 0
-#endif
-#endif
-
-
-/*
- MMAP_AS_MORECORE_SIZE is the minimum mmap size argument to use if
- sbrk fails, and mmap is used as a backup (which is done only if
- HAVE_MMAP). The value must be a multiple of page size. This
- backup strategy generally applies only when systems have "holes" in
- address space, so sbrk cannot perform contiguous expansion, but
- there is still space available on system. On systems for which
- this is known to be useful (i.e. most linux kernels), this occurs
- only when programs allocate huge amounts of memory. Between this,
- and the fact that mmap regions tend to be limited, the size should
- be large, to avoid too many mmap calls and thus avoid running out
- of kernel resources.
-*/
-
-#ifndef MMAP_AS_MORECORE_SIZE
-#define MMAP_AS_MORECORE_SIZE (1024 * 1024)
-#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 linux
-#define HAVE_MREMAP 1
-#else
-#define HAVE_MREMAP 0
-#endif
-
-#endif /* HAVE_MMAP */
-
-
-/*
- The system page size. To the extent possible, this malloc manages
- memory from the system in page-size units. Note that this value is
- cached during initialization into a field of malloc_state. So even
- if malloc_getpagesize is a function, it is only called once.
-
- The following mechanics for getpagesize were adapted from bsd/gnu
- getpagesize.h. If none of the system-probes here apply, a value of
- 4096 is used, which should be OK: If they don't apply, then using
- the actual value probably doesn't impact performance.
-*/
-
-
-#ifndef malloc_getpagesize
-
-#ifndef LACKS_UNISTD_H
-# include <unistd.h>
-#endif
-
-# 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 <sys/param.h>
-# 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 (4096)
-# endif
-# endif
-# endif
-# endif
-# endif
-# endif
-# endif
-#endif
-
-/*
- 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 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 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 an SVID2/XPG2 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
-
-/* SVID2/XPG mallinfo structure */
-
-struct mallinfo {
- int arena; /* non-mmapped space allocated from system */
- int ordblks; /* number of free chunks */
- int smblks; /* number of fastbin blocks */
- int hblks; /* number of mmapped regions */
- int hblkhd; /* space in mmapped regions */
- int usmblks; /* maximum total allocated space */
- int fsmblks; /* space available in freed fastbin blocks */
- int uordblks; /* total allocated space */
- int fordblks; /* total free space */
- int keepcost; /* top-most, releasable (via malloc_trim) space */
-};
-
-/*
- SVID/XPG defines four standard parameter numbers for mallopt,
- normally defined in malloc.h. Only one of these (M_MXFAST) is used
- in this malloc. The others (M_NLBLKS, M_GRAIN, M_KEEP) don't apply,
- so setting them has no effect. But this malloc also supports other
- options in mallopt described below.
-*/
-#endif
-
-
-/* ---------- description of public routines ------------ */
-
-/*
- malloc(size_t n)
- Returns a pointer to a newly allocated chunk of at least n bytes, or null
- if no space is available. Additionally, on failure, errno is
- set to ENOMEM on ANSI C systems.
-
- If n is zero, malloc returns a minumum-sized chunk. (The minimum
- size is 16 bytes on most 32bit systems, and 24 or 32 bytes on 64bit
- systems.) On most systems, size_t is an unsigned type, so calls
- with negative arguments 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.
-*/
-#if __STD_C
-Void_t* public_mALLOc(size_t);
-#else
-Void_t* public_mALLOc();
-#endif
-
-/*
- free(Void_t* 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. It can have arbitrary (i.e., bad!)
- effects if p has already been freed.
-
- Unless disabled (using mallopt), freeing very large spaces will
- when possible, automatically trigger operations that give
- back unused memory to the system, thus reducing program footprint.
-*/
-#if __STD_C
-void public_fREe(Void_t*);
-#else
-void public_fREe();
-#endif
-
-/*
- calloc(size_t n_elements, size_t element_size);
- Returns a pointer to n_elements * element_size bytes, with all locations
- set to zero.
-*/
-#if __STD_C
-Void_t* public_cALLOc(size_t, size_t);
-#else
-Void_t* public_cALLOc();
-#endif
-
-/*
- realloc(Void_t* 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 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. Unless the #define
- REALLOC_ZERO_BYTES_FREES is set, realloc with a size argument of
- zero (re)allocates a minimum-sized chunk.
-
- Large chunks that were internally obtained via mmap will always
- be reallocated using malloc-copy-free sequences unless
- the system supports MREMAP (currently only linux).
-
- The old unix realloc convention of allowing the last-free'd chunk
- to be used as an argument to realloc is not supported.
-*/
-#if __STD_C
-Void_t* public_rEALLOc(Void_t*, size_t);
-#else
-Void_t* public_rEALLOc();
-#endif
-
-/*
- 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.
-*/
-#if __STD_C
-Void_t* public_mEMALIGn(size_t, size_t);
-#else
-Void_t* public_mEMALIGn();
-#endif
-
-/*
- 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.
-*/
-#if __STD_C
-Void_t* public_vALLOc(size_t);
-#else
-Void_t* public_vALLOc();
-#endif
-
-
-
-/*
- 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. Only one of these (M_MXFAST) is used
- in this malloc. The others (M_NLBLKS, M_GRAIN, M_KEEP) don't apply,
- so setting them has no effect. But this malloc also supports four
- 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_MXFAST 1 64 0-80 (0 disables fastbins)
- M_TRIM_THRESHOLD -1 256*1024 any (-1U disables trimming)
- M_TOP_PAD -2 0 any
- M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support)
- M_MMAP_MAX -4 65536 any (0 disables use of mmap)
-*/
-#if __STD_C
-int public_mALLOPt(int, int);
-#else
-int public_mALLOPt();
-#endif
-
-
-/*
- 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: the number of fastbin blocks (i.e., small chunks that
- have been freed but not use resused or consolidated)
- 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: total bytes held in fastbin blocks
- 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.
-*/
-#if __STD_C
-struct mallinfo public_mALLINFo(void);
-#else
-struct mallinfo public_mALLINFo();
-#endif
-
-/*
- independent_calloc(size_t n_elements, size_t element_size, Void_t* 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;
- }
-*/
-#if __STD_C
-Void_t** public_iCALLOc(size_t, size_t, Void_t**);
-#else
-Void_t** public_iCALLOc();
-#endif
-
-/*
- independent_comalloc(size_t n_elements, size_t sizes[], Void_t* 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.
-*/
-#if __STD_C
-Void_t** public_iCOMALLOc(size_t, size_t*, Void_t**);
-#else
-Void_t** public_iCOMALLOc();
-#endif
-
-
-/*
- pvalloc(size_t n);
- Equivalent to valloc(minimum-page-that-holds(n)), that is,
- round up n to nearest pagesize.
- */
-#if __STD_C
-Void_t* public_pVALLOc(size_t);
-#else
-Void_t* public_pVALLOc();
-#endif
-
-/*
- cfree(Void_t* p);
- Equivalent to free(p).
-
- cfree is needed/defined on some systems that pair it with calloc,
- for odd historical reasons (such as: cfree is used in example
- code in the first edition of K&R).
-*/
-#if __STD_C
-void public_cFREe(Void_t*);
-#else
-void public_cFREe();
-#endif
-
-/*
- 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. 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.
- On systems that do not support "negative sbrks", it will always
- rreturn 0.
-*/
-#if __STD_C
-int public_mTRIm(size_t);
-#else
-int public_mTRIm();
-#endif
-
-/*
- malloc_usable_size(Void_t* 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);
-
-*/
-#if __STD_C
-size_t public_mUSABLe(Void_t*);
-#else
-size_t public_mUSABLe();
-#endif
-
-/*
- 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.
-
-*/
-#if __STD_C
-void public_mSTATs();
-#else
-void public_mSTATs();
-#endif
-
-/* mallopt tuning options */
-
-/*
- M_MXFAST is the maximum request size used for "fastbins", special bins
- that hold returned chunks without consolidating their spaces. This
- enables future requests for chunks of the same size to be handled
- very quickly, but can increase fragmentation, and thus increase the
- overall memory footprint of a program.
-
- This malloc manages fastbins very conservatively yet still
- efficiently, so fragmentation is rarely a problem for values less
- than or equal to the default. The maximum supported value of MXFAST
- is 80. You wouldn't want it any higher than this anyway. Fastbins
- are designed especially for use with many small structs, objects or
- strings -- the default handles structs/objects/arrays with sizes up
- to 16 4byte fields, or small strings representing words, tokens,
- etc. Using fastbins for larger objects normally worsens
- fragmentation without improving speed.
-
- M_MXFAST is set in REQUEST size units. It is internally used in
- chunksize units, which adds padding and alignment. You can reduce
- M_MXFAST to 0 to disable all use of fastbins. This causes the malloc
- algorithm to be a closer approximation of fifo-best-fit in all cases,
- not just for larger requests, but will generally cause it to be
- slower.
-*/
-
-
-/* M_MXFAST is a standard SVID/XPG tuning option, usually listed in malloc.h */
-#ifndef M_MXFAST
-#define M_MXFAST 1
-#endif
-
-#ifndef DEFAULT_MXFAST
-#define DEFAULT_MXFAST 64
-#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 this much memory.
-
- 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 trim value must be greater than page size to have any useful
- effect. To disable trimming completely, you can set to
- (unsigned long)(-1)
-
- Trim settings interact with fastbin (MXFAST) settings: Unless
- TRIM_FASTBINS is defined, automatic trimming never takes place upon
- freeing a chunk with size less than or equal to MXFAST. Trimming is
- instead delayed until subsequent freeing of larger chunks. However,
- you can still force an attempted trim by calling malloc_trim.
-
- Also, trimming is not generally possible in cases where
- the main arena is obtained via mmap.
-
- 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.
-*/
-
-#define M_TRIM_THRESHOLD -1
-
-#ifndef DEFAULT_TRIM_THRESHOLD
-#define DEFAULT_TRIM_THRESHOLD (256 * 1024)
-#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.
-*/
-
-#define M_TOP_PAD -2
-
-#ifndef DEFAULT_TOP_PAD
-#define DEFAULT_TOP_PAD (0)
-#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 benefits that:
-
- 1. 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.
- 2. Mapped memory can never become `locked' between
- other chunks, as can happen with normally allocated chunks, which
- means that even trimming via malloc_trim would not release them.
- 3. On some systems with "holes" in address spaces, mmap can obtain
- memory that sbrk cannot.
-
- 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.
-
- The advantages of mmap nearly always outweigh disadvantages for
- "large" chunks, but the value of "large" varies across systems. The
- default is an empirically derived value that works well in most
- systems.
-*/
-
-#define M_MMAP_THRESHOLD -3
-
-#ifndef DEFAULT_MMAP_THRESHOLD
-#define DEFAULT_MMAP_THRESHOLD (256 * 1024)
-#endif
-
-/*
- M_MMAP_MAX is the maximum number of requests to simultaneously
- service using mmap. This parameter exists because
-. Some systems have a limited number of internal tables for
- use by mmap, and using more than a few of them may degrade
- performance.
-
- The default is set to a value that serves only as a safeguard.
- Setting to 0 disables use of mmap for servicing large requests. If
- HAVE_MMAP is not set, the default value is 0, and attempts to set it
- to non-zero values in mallopt will fail.
-*/
-
-#define M_MMAP_MAX -4
-
-#ifndef DEFAULT_MMAP_MAX
-#if HAVE_MMAP
-#define DEFAULT_MMAP_MAX (65536)
-#else
-#define DEFAULT_MMAP_MAX (0)
-#endif
-#endif
-
-#ifdef __cplusplus
-}; /* end of extern "C" */
-#endif
-
-/*
- ========================================================================
- 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" */
-
-/* --------------------- public wrappers ---------------------- */
-
-#ifdef USE_PUBLIC_MALLOC_WRAPPERS
-
-/* Declare all routines as internal */
-#if __STD_C
-static Void_t* mALLOc(size_t);
-static void fREe(Void_t*);
-static Void_t* rEALLOc(Void_t*, size_t);
-static Void_t* mEMALIGn(size_t, size_t);
-static Void_t* vALLOc(size_t);
-static Void_t* pVALLOc(size_t);
-static Void_t* cALLOc(size_t, size_t);
-static Void_t** iCALLOc(size_t, size_t, Void_t**);
-static Void_t** iCOMALLOc(size_t, size_t*, Void_t**);
-static void cFREe(Void_t*);
-static int mTRIm(size_t);
-static size_t mUSABLe(Void_t*);
-static void mSTATs();
-static int mALLOPt(int, int);
-static struct mallinfo mALLINFo(void);
-#else
-static Void_t* mALLOc();
-static void fREe();
-static Void_t* rEALLOc();
-static Void_t* mEMALIGn();
-static Void_t* vALLOc();
-static Void_t* pVALLOc();
-static Void_t* cALLOc();
-static Void_t** iCALLOc();
-static Void_t** iCOMALLOc();
-static void cFREe();
-static int mTRIm();
-static size_t mUSABLe();
-static void mSTATs();
-static int mALLOPt();
-static struct mallinfo mALLINFo();
-#endif
-
-/*
- MALLOC_PREACTION and MALLOC_POSTACTION should be
- defined to return 0 on success, and nonzero on failure.
- The return value of MALLOC_POSTACTION is currently ignored
- in wrapper functions since there is no reasonable default
- action to take on failure.
-*/
-
-
-#ifdef USE_MALLOC_LOCK
-
-#ifdef WIN32
-
-static int mALLOC_MUTEx;
-#define MALLOC_PREACTION slwait(&mALLOC_MUTEx)
-#define MALLOC_POSTACTION slrelease(&mALLOC_MUTEx)
-
-#else
-
-#include <pthread.h>
-
-static pthread_mutex_t mALLOC_MUTEx = PTHREAD_MUTEX_INITIALIZER;
-
-#define MALLOC_PREACTION pthread_mutex_lock(&mALLOC_MUTEx)
-#define MALLOC_POSTACTION pthread_mutex_unlock(&mALLOC_MUTEx)
-
-#endif /* USE_MALLOC_LOCK */
-
-#else
-
-/* Substitute anything you like for these */
-
-#define MALLOC_PREACTION (0)
-#define MALLOC_POSTACTION (0)
-
-#endif
-
-Void_t* public_mALLOc(size_t bytes) {
- Void_t* m;
- if (MALLOC_PREACTION != 0) {
- return 0;
- }
- m = mALLOc(bytes);
- if (MALLOC_POSTACTION != 0) {
- }
- return m;
-}
-
-void public_fREe(Void_t* m) {
- if (MALLOC_PREACTION != 0) {
- return;
- }
- fREe(m);
- if (MALLOC_POSTACTION != 0) {
- }
-}
-
-Void_t* public_rEALLOc(Void_t* m, size_t bytes) {
- if (MALLOC_PREACTION != 0) {
- return 0;
- }
- m = rEALLOc(m, bytes);
- if (MALLOC_POSTACTION != 0) {
- }
- return m;
-}
-
-Void_t* public_mEMALIGn(size_t alignment, size_t bytes) {
- Void_t* m;
- if (MALLOC_PREACTION != 0) {
- return 0;
- }
- m = mEMALIGn(alignment, bytes);
- if (MALLOC_POSTACTION != 0) {
- }
- return m;
-}
-
-Void_t* public_vALLOc(size_t bytes) {
- Void_t* m;
- if (MALLOC_PREACTION != 0) {
- return 0;
- }
- m = vALLOc(bytes);
- if (MALLOC_POSTACTION != 0) {
- }
- return m;
-}
-
-#ifdef NEED_PVALLOC
-Void_t* public_pVALLOc(size_t bytes) {
- Void_t* m;
- if (MALLOC_PREACTION != 0) {
- return 0;
- }
- m = pVALLOc(bytes);
- if (MALLOC_POSTACTION != 0) {
- }
- return m;
-}
-#endif
-
-Void_t* public_cALLOc(size_t n, size_t elem_size) {
- Void_t* m;
- if (MALLOC_PREACTION != 0) {
- return 0;
- }
- m = cALLOc(n, elem_size);
- if (MALLOC_POSTACTION != 0) {
- }
- return m;
-}
-
-
-Void_t** public_iCALLOc(size_t n, size_t elem_size, Void_t** chunks) {
- Void_t** m;
- if (MALLOC_PREACTION != 0) {
- return 0;
- }
- m = iCALLOc(n, elem_size, chunks);
- if (MALLOC_POSTACTION != 0) {
- }
- return m;
-}
-
-Void_t** public_iCOMALLOc(size_t n, size_t sizes[], Void_t** chunks) {
- Void_t** m;
- if (MALLOC_PREACTION != 0) {
- return 0;
- }
- m = iCOMALLOc(n, sizes, chunks);
- if (MALLOC_POSTACTION != 0) {
- }
- return m;
-}
-
-void public_cFREe(Void_t* m) {
- if (MALLOC_PREACTION != 0) {
- return;
- }
- cFREe(m);
- if (MALLOC_POSTACTION != 0) {
- }
-}
-
-int public_mTRIm(size_t s) {
- int result;
- if (MALLOC_PREACTION != 0) {
- return 0;
- }
- result = mTRIm(s);
- if (MALLOC_POSTACTION != 0) {
- }
- return result;
-}
-
-size_t public_mUSABLe(Void_t* m) {
- size_t result;
- if (MALLOC_PREACTION != 0) {
- return 0;
- }
- result = mUSABLe(m);
- if (MALLOC_POSTACTION != 0) {
- }
- return result;
-}
-
-void public_mSTATs() {
- if (MALLOC_PREACTION != 0) {
- return;
- }
- mSTATs();
- if (MALLOC_POSTACTION != 0) {
- }
-}
-
-struct mallinfo public_mALLINFo() {
- struct mallinfo m;
- if (MALLOC_PREACTION != 0) {
- struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- return nm;
- }
- m = mALLINFo();
- if (MALLOC_POSTACTION != 0) {
- }
- return m;
-}
-
-int public_mALLOPt(int p, int v) {
- int result;
- if (MALLOC_PREACTION != 0) {
- return 0;
- }
- result = mALLOPt(p, v);
- if (MALLOC_POSTACTION != 0) {
- }
- return result;
-}
-
-#endif
-
-
-
-/* ------------- Optional versions of memcopy ---------------- */
-
-
-#if USE_MEMCPY
-
-/*
- Note: memcpy is ONLY invoked with non-overlapping regions,
- so the (usually slower) memmove is not needed.
-*/
-
-#define MALLOC_COPY(dest, src, nbytes) memcpy(dest, src, nbytes)
-#define MALLOC_ZERO(dest, nbytes) memset(dest, 0, nbytes)
-
-#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); \
- CHUNK_SIZE_T mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T); \
- long 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; \
- CHUNK_SIZE_T mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T); \
- long 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
-
-/* ------------------ MMAP support ------------------ */
-
-
-#if HAVE_MMAP
-
-#ifndef LACKS_FCNTL_H
-#include <fcntl.h>
-#endif
-
-#ifndef LACKS_SYS_MMAN_H
-#include <sys/mman.h>
-#endif
-
-#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
-#define MAP_ANONYMOUS MAP_ANON
-#endif
-
-/*
- Nearly all versions of mmap support MAP_ANONYMOUS,
- so the following is unlikely to be needed, but is
- supplied just in case.
-*/
-
-#ifndef MAP_ANONYMOUS
-
-static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
-
-#define MMAP(addr, size, prot, flags) ((dev_zero_fd < 0) ? \
- (dev_zero_fd = open("/dev/zero", O_RDWR), \
- mmap((addr), (size), (prot), (flags), dev_zero_fd, 0)) : \
- mmap((addr), (size), (prot), (flags), dev_zero_fd, 0))
-
-#else
-
-#define MMAP(addr, size, prot, flags) \
- (mmap((addr), (size), (prot), (flags)|MAP_ANONYMOUS, -1, 0))
-
-#endif
-
-
-#endif /* HAVE_MMAP */
-
-
-/*
- ----------------------- Chunk representations -----------------------
-*/
-
-
-/*
- This struct declaration is misleading (but accurate and necessary).
- It declares a "view" into memory allowing access to necessary
- fields at known offsets from a given base. See explanation below.
-*/
-
-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;
-};
-
-
-typedef struct malloc_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 at least 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. If
- prev_inuse 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.
-
- 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 but can be very confusing when trying
- to extend or adapt this code.
-
- The two exceptions to all this are
-
- 1. The special chunk `top' 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.
-
- 2. Chunks allocated via mmap, which have the second-lowest-order
- bit (IS_MMAPPED) set in their size fields. Because they are
- allocated one-by-one, each must contain its own trailing size field.
-
-*/
-
-/*
- ---------- Size and alignment checks and conversions ----------
-*/
-
-/* conversion from malloc headers to user pointers, and back */
-
-#define chunk2mem(p) ((Void_t*)((char*)(p) + 2*SIZE_SZ))
-#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - 2*SIZE_SZ))
-
-/* The smallest possible chunk */
-#define MIN_CHUNK_SIZE (sizeof(struct malloc_chunk))
-
-/* The smallest size we can malloc is an aligned minimal chunk */
-
-#define MINSIZE \
- (CHUNK_SIZE_T)(((MIN_CHUNK_SIZE+MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK))
-
-/* Check if m has acceptable alignment */
-
-#define aligned_OK(m) (((PTR_UINT)((m)) & (MALLOC_ALIGN_MASK)) == 0)
-
-
-/*
- Check if a request is so large that it would wrap around zero when
- padded and aligned. To simplify some other code, the bound is made
- low enough so that adding MINSIZE will also not wrap around sero.
-*/
-
-#define REQUEST_OUT_OF_RANGE(req) \
- ((CHUNK_SIZE_T)(req) >= \
- (CHUNK_SIZE_T)(INTERNAL_SIZE_T)(-2 * MINSIZE))
-
-/* pad request bytes into a usable size -- internal version */
-
-#define request2size(req) \
- (((req) + SIZE_SZ + MALLOC_ALIGN_MASK < MINSIZE) ? \
- MINSIZE : \
- ((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)
-
-/* Same, except also perform argument check */
-
-#define checked_request2size(req, sz) \
- if (REQUEST_OUT_OF_RANGE(req)) { \
- MALLOC_FAILURE_ACTION; \
- return 0; \
- } \
- (sz) = request2size(req);
-
-/*
- --------------- Physical chunk operations ---------------
-*/
-
-
-/* size field is or'ed with PREV_INUSE when previous adjacent chunk in use */
-#define PREV_INUSE 0x1
-
-/* extract inuse bit of previous chunk */
-#define prev_inuse(p) ((p)->size & PREV_INUSE)
-
-
-/* size field is or'ed with IS_MMAPPED if the chunk was obtained with mmap() */
-#define IS_MMAPPED 0x2
-
-/* check for mmap()'ed chunk */
-#define chunk_is_mmapped(p) ((p)->size & IS_MMAPPED)
-
-/*
- Bits to mask off when extracting size
-
- Note: IS_MMAPPED is intentionally not masked off from size field in
- macros for which mmapped chunks should never be seen. This should
- cause helpful core dumps to occur if it is tried by accident by
- people extending or adapting this malloc.
-*/
-#define SIZE_BITS (PREV_INUSE|IS_MMAPPED)
-
-/* Get size, ignoring use bits */
-#define chunksize(p) ((p)->size & ~(SIZE_BITS))
-
-
-/* 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)))
-
-/* extract p's inuse bit */
-#define inuse(p)\
-((((mchunkptr)(((char*)(p))+((p)->size & ~PREV_INUSE)))->size) & PREV_INUSE)
-
-/* set/clear chunk as being inuse 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))
-
-
-/* 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 field */
-#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))
-
-
-/*
- -------------------- Internal data structures --------------------
-
- All internal state is held in an instance of malloc_state defined
- below. There are no other static variables, except in two optional
- cases:
- * If USE_MALLOC_LOCK is defined, the mALLOC_MUTEx declared above.
- * If HAVE_MMAP is true, but mmap doesn't support
- MAP_ANONYMOUS, a dummy file descriptor for mmap.
-
- Beware of lots of tricks that minimize the total bookkeeping space
- requirements. The result is a little over 1K bytes (for 4byte
- pointers and size_t.)
-*/
-
-/*
- Bins
-
- An array of bin headers for free 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. Most bins hold sizes that are
- unusual as malloc request sizes, but are more usual for fragments
- and consolidated sets of chunks, which is what these bins hold, so
- they can be found quickly. All procedures maintain the invariant
- that no consolidated chunk physically borders another one, so each
- chunk in a list is known to be preceeded and followed by either
- inuse chunks or the ends of memory.
-
- Chunks in bins are kept in size order, with ties going to the
- approximately least recently used chunk. Ordering isn't needed
- 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 (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.
-
- To simplify use in double-linked lists, each bin header acts
- as a malloc_chunk. This avoids special-casing for headers.
- But to conserve space and improve locality, we allocate
- only the fd/bk pointers of bins, and then use repositioning tricks
- to treat these as the fields of a malloc_chunk*.
-*/
-
-typedef struct malloc_chunk* mbinptr;
-
-/* addressing -- note that bin_at(0) does not exist */
-#define bin_at(m, i) ((mbinptr)((char*)&((m)->bins[(i)<<1]) - (SIZE_SZ<<1)))
-
-/* analog of ++bin */
-#define next_bin(b) ((mbinptr)((char*)(b) + (sizeof(mchunkptr)<<1)))
-
-/* Reminders about list directionality within bins */
-#define first(b) ((b)->fd)
-#define last(b) ((b)->bk)
-
-/* Take a chunk off a bin list */
-#define unlink(P, BK, FD) { \
- FD = P->fd; \
- BK = P->bk; \
- FD->bk = BK; \
- BK->fd = FD; \
-}
-
-/*
- Indexing
-
- Bins for sizes < 512 bytes contain chunks of all the same size, spaced
- 8 bytes apart. Larger bins are approximately logarithmically spaced:
-
- 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
-
- The bins top out around 1MB because we expect to service large
- requests via mmap.
-*/
-
-#define NBINS 96
-#define NSMALLBINS 32
-#define SMALLBIN_WIDTH 8
-#define MIN_LARGE_SIZE 256
-
-#define in_smallbin_range(sz) \
- ((CHUNK_SIZE_T)(sz) < (CHUNK_SIZE_T)MIN_LARGE_SIZE)
-
-#define smallbin_index(sz) (((unsigned)(sz)) >> 3)
-
-/*
- Compute index for size. We expect this to be inlined when
- compiled with optimization, else not, which works out well.
-*/
-static int largebin_index(unsigned int sz) {
- unsigned int x = sz >> SMALLBIN_WIDTH;
- unsigned int m; /* bit position of highest set bit of m */
-
- if (x >= 0x10000) return NBINS-1;
-
- /* On intel, use BSRL instruction to find highest bit */
-#if defined(__GNUC__) && defined(i386)
-
- __asm__("bsrl %1,%0\n\t"
- : "=r" (m)
- : "g" (x));
-
-#else
- {
- /*
- Based on branch-free nlz algorithm in chapter 5 of Henry
- S. Warren Jr's book "Hacker's Delight".
- */
-
- unsigned int n = ((x - 0x100) >> 16) & 8;
- x <<= n;
- m = ((x - 0x1000) >> 16) & 4;
- n += m;
- x <<= m;
- m = ((x - 0x4000) >> 16) & 2;
- n += m;
- x = (x << m) >> 14;
- m = 13 - n + (x & ~(x>>1));
- }
-#endif
-
- /* Use next 2 bits to create finer-granularity bins */
- return NSMALLBINS + (m << 2) + ((sz >> (m + 6)) & 3);
-}
-
-#define bin_index(sz) \
- ((in_smallbin_range(sz)) ? smallbin_index(sz) : largebin_index(sz))
-
-/*
- FIRST_SORTED_BIN_SIZE is the chunk size corresponding to the
- first bin that is maintained in sorted order. This must
- be the smallest size corresponding to a given bin.
-
- Normally, this should be MIN_LARGE_SIZE. But you can weaken
- best fit guarantees to sometimes speed up malloc by increasing value.
- Doing this means that malloc may choose a chunk that is
- non-best-fitting by up to the width of the bin.
-
- Some useful cutoff values:
- 512 - all bins sorted
- 2560 - leaves bins <= 64 bytes wide unsorted
- 12288 - leaves bins <= 512 bytes wide unsorted
- 65536 - leaves bins <= 4096 bytes wide unsorted
- 262144 - leaves bins <= 32768 bytes wide unsorted
- -1 - no bins sorted (not recommended!)
-*/
-
-#define FIRST_SORTED_BIN_SIZE MIN_LARGE_SIZE
-/* #define FIRST_SORTED_BIN_SIZE 65536 */
-
-/*
- Unsorted chunks
-
- All remainders from chunk splits, as well as all returned chunks,
- are first placed in the "unsorted" bin. They are then placed
- in regular bins after malloc gives them ONE chance to be used before
- binning. So, basically, the unsorted_chunks list acts as a queue,
- with chunks being placed on it in free (and malloc_consolidate),
- and taken off (to be either used or placed in bins) in malloc.
-*/
-
-/* The otherwise unindexable 1-bin is used to hold unsorted chunks. */
-#define unsorted_chunks(M) (bin_at(M, 1))
-
-/*
- 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). 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 do so when getting memory from system, so we make
- initial_top treat the bin as a legal but unusable chunk during the
- interval between initialization and the first call to
- sYSMALLOc. (This is somewhat delicate, since it relies on
- the 2 preceding words to be zero during this interval as well.)
-*/
-
-/* Conveniently, the unsorted bin can be used as dummy top on first call */
-#define initial_top(M) (unsorted_chunks(M))
-
-/*
- Binmap
-
- To help compensate for the large number of bins, a one-level index
- structure is used for bin-by-bin searching. `binmap' is a
- bitvector recording whether bins are definitely empty so they can
- be skipped over during during traversals. The bits are NOT always
- cleared as soon as bins are empty, but instead only
- when they are noticed to be empty during traversal in malloc.
-*/
-
-/* Conservatively use 32 bits per map word, even if on 64bit system */
-#define BINMAPSHIFT 5
-#define BITSPERMAP (1U << BINMAPSHIFT)
-#define BINMAPSIZE (NBINS / BITSPERMAP)
-
-#define idx2block(i) ((i) >> BINMAPSHIFT)
-#define idx2bit(i) ((1U << ((i) & ((1U << BINMAPSHIFT)-1))))
-
-#define mark_bin(m,i) ((m)->binmap[idx2block(i)] |= idx2bit(i))
-#define unmark_bin(m,i) ((m)->binmap[idx2block(i)] &= ~(idx2bit(i)))
-#define get_binmap(m,i) ((m)->binmap[idx2block(i)] & idx2bit(i))
-
-/*
- Fastbins
-
- An array of lists holding recently freed small chunks. Fastbins
- are not doubly linked. It is faster to single-link them, and
- since chunks are never removed from the middles of these lists,
- double linking is not necessary. Also, unlike regular bins, they
- are not even processed in FIFO order (they use faster LIFO) since
- ordering doesn't much matter in the transient contexts in which
- fastbins are normally used.
-
- Chunks in fastbins keep their inuse bit set, so they cannot
- be consolidated with other free chunks. malloc_consolidate
- releases all chunks in fastbins and consolidates them with
- other free chunks.
-*/
-
-typedef struct malloc_chunk* mfastbinptr;
-
-/* offset 2 to use otherwise unindexable first 2 bins */
-#define fastbin_index(sz) ((((unsigned int)(sz)) >> 3) - 2)
-
-/* The maximum fastbin request size we support */
-#define MAX_FAST_SIZE 80
-
-#define NFASTBINS (fastbin_index(request2size(MAX_FAST_SIZE))+1)
-
-/*
- FASTBIN_CONSOLIDATION_THRESHOLD is the size of a chunk in free()
- that triggers automatic consolidation of possibly-surrounding
- fastbin chunks. This is a heuristic, so the exact value should not
- matter too much. It is defined at half the default trim threshold as a
- compromise heuristic to only attempt consolidation if it is likely
- to lead to trimming. However, it is not dynamically tunable, since
- consolidation reduces fragmentation surrounding loarge chunks even
- if trimming is not used.
-*/
-
-#define FASTBIN_CONSOLIDATION_THRESHOLD \
- ((unsigned long)(DEFAULT_TRIM_THRESHOLD) >> 1)
-
-/*
- Since the lowest 2 bits in max_fast don't matter in size comparisons,
- they are used as flags.
-*/
-
-/*
- ANYCHUNKS_BIT held in max_fast indicates that there may be any
- freed chunks at all. It is set true when entering a chunk into any
- bin.
-*/
-
-#define ANYCHUNKS_BIT (1U)
-
-#define have_anychunks(M) (((M)->max_fast & ANYCHUNKS_BIT))
-#define set_anychunks(M) ((M)->max_fast |= ANYCHUNKS_BIT)
-#define clear_anychunks(M) ((M)->max_fast &= ~ANYCHUNKS_BIT)
-
-/*
- FASTCHUNKS_BIT held in max_fast indicates that there are probably
- some fastbin chunks. It is set true on entering a chunk into any
- fastbin, and cleared only in malloc_consolidate.
-*/
-
-#define FASTCHUNKS_BIT (2U)
-
-#define have_fastchunks(M) (((M)->max_fast & FASTCHUNKS_BIT))
-#define set_fastchunks(M) ((M)->max_fast |= (FASTCHUNKS_BIT|ANYCHUNKS_BIT))
-#define clear_fastchunks(M) ((M)->max_fast &= ~(FASTCHUNKS_BIT))
-
-/*
- Set value of max_fast.
- Use impossibly small value if 0.
-*/
-
-#define set_max_fast(M, s) \
- (M)->max_fast = (((s) == 0)? SMALLBIN_WIDTH: request2size(s)) | \
- ((M)->max_fast & (FASTCHUNKS_BIT|ANYCHUNKS_BIT))
-
-#define get_max_fast(M) \
- ((M)->max_fast & ~(FASTCHUNKS_BIT | ANYCHUNKS_BIT))
-
-
-/*
- morecore_properties is a status word holding dynamically discovered
- or controlled properties of the morecore function
-*/
-
-#define MORECORE_CONTIGUOUS_BIT (1U)
-
-#define contiguous(M) \
- (((M)->morecore_properties & MORECORE_CONTIGUOUS_BIT))
-#define noncontiguous(M) \
- (((M)->morecore_properties & MORECORE_CONTIGUOUS_BIT) == 0)
-#define set_contiguous(M) \
- ((M)->morecore_properties |= MORECORE_CONTIGUOUS_BIT)
-#define set_noncontiguous(M) \
- ((M)->morecore_properties &= ~MORECORE_CONTIGUOUS_BIT)
-
-
-/*
- ----------- Internal state representation and initialization -----------
-*/
-
-struct malloc_state {
-
- /* The maximum chunk size to be eligible for fastbin */
- INTERNAL_SIZE_T max_fast; /* low 2 bits used as flags */
-
- /* Fastbins */
- mfastbinptr fastbins[NFASTBINS];
-
- /* Base of the topmost chunk -- not otherwise kept in a bin */
- mchunkptr top;
-
- /* The remainder from the most recent split of a small request */
- mchunkptr last_remainder;
-
- /* Normal bins packed as described above */
- mchunkptr bins[NBINS * 2];
-
- /* Bitmap of bins. Trailing zero map handles cases of largest binned size */
- unsigned int binmap[BINMAPSIZE+1];
-
- /* Tunable parameters */
- CHUNK_SIZE_T trim_threshold;
- INTERNAL_SIZE_T top_pad;
- INTERNAL_SIZE_T mmap_threshold;
-
- /* Memory map support */
- int n_mmaps;
- int n_mmaps_max;
- int max_n_mmaps;
-
- /* Cache malloc_getpagesize */
- unsigned int pagesize;
-
- /* Track properties of MORECORE */
- unsigned int morecore_properties;
-
- /* Statistics */
- INTERNAL_SIZE_T mmapped_mem;
- INTERNAL_SIZE_T sbrked_mem;
- INTERNAL_SIZE_T max_sbrked_mem;
- INTERNAL_SIZE_T max_mmapped_mem;
- INTERNAL_SIZE_T max_total_mem;
-};
-
-typedef struct malloc_state *mstate;
-
-/*
- There is exactly one instance of this struct in this malloc.
- If you are adapting this malloc in a way that does NOT use a static
- malloc_state, you MUST explicitly zero-fill it before using. This
- malloc relies on the property that malloc_state is initialized to
- all zeroes (as is true of C statics).
-*/
-
-static struct malloc_state av_; /* never directly referenced */
-
-/*
- All uses of av_ are via get_malloc_state().
- At most one "call" to get_malloc_state is made per invocation of
- the public versions of malloc and free, but other routines
- that in turn invoke malloc and/or free may call more then once.
- Also, it is called in check* routines if DEBUG is set.
-*/
-
-#define get_malloc_state() (&(av_))
-
-/*
- Initialize a malloc_state struct.
-
- This is called only from within malloc_consolidate, which needs
- be called in the same contexts anyway. It is never called directly
- outside of malloc_consolidate because some optimizing compilers try
- to inline it at all call points, which turns out not to be an
- optimization at all. (Inlining it in malloc_consolidate is fine though.)
-*/
-
-#if __STD_C
-static void malloc_init_state(mstate av)
-#else
-static void malloc_init_state(av) mstate av;
-#endif
-{
- int i;
- mbinptr bin;
-
- /* Establish circular links for normal bins */
- for (i = 1; i < NBINS; ++i) {
- bin = bin_at(av,i);
- bin->fd = bin->bk = bin;
- }
-
- av->top_pad = DEFAULT_TOP_PAD;
- av->n_mmaps_max = DEFAULT_MMAP_MAX;
- av->mmap_threshold = DEFAULT_MMAP_THRESHOLD;
- av->trim_threshold = DEFAULT_TRIM_THRESHOLD;
-
-#if MORECORE_CONTIGUOUS
- set_contiguous(av);
-#else
- set_noncontiguous(av);
-#endif
-
-
- set_max_fast(av, DEFAULT_MXFAST);
-
- av->top = initial_top(av);
- av->pagesize = malloc_getpagesize;
-}
-
-/*
- Other internal utilities operating on mstates
-*/
-
-#if __STD_C
-static Void_t* sYSMALLOc(INTERNAL_SIZE_T, mstate);
-#ifndef MORECORE_CANNOT_TRIM
-static int sYSTRIm(size_t, mstate);
-#endif
-static void malloc_consolidate(mstate);
-#ifdef NEED_INDEPENDENT
-static Void_t** iALLOc(size_t, size_t*, int, Void_t**);
-#endif
-#else
-static Void_t* sYSMALLOc();
-#ifndef MORECORE_CANNOT_TRIM
-static int sYSTRIm();
-#endif
-static void malloc_consolidate();
-#ifdef NEED_INDEPENDENT
-static Void_t** iALLOc();
-#endif
-#endif
-
-/*
- Debugging support
-
- 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!)
-*/
-
-#if ! DEBUG
-
-#define check_chunk(P)
-#define check_free_chunk(P)
-#define check_inuse_chunk(P)
-#define check_remalloced_chunk(P,N)
-#define check_malloced_chunk(P,N)
-#define check_malloc_state()
-
-#else
-#define check_chunk(P) do_check_chunk(P)
-#define check_free_chunk(P) do_check_free_chunk(P)
-#define check_inuse_chunk(P) do_check_inuse_chunk(P)
-#define check_remalloced_chunk(P,N) do_check_remalloced_chunk(P,N)
-#define check_malloced_chunk(P,N) do_check_malloced_chunk(P,N)
-#define check_malloc_state() do_check_malloc_state()
-
-/*
- Properties of all chunks
-*/
-
-#if __STD_C
-static void do_check_chunk(mchunkptr p)
-#else
-static void do_check_chunk(p) mchunkptr p;
-#endif
-{
- mstate av = get_malloc_state();
- CHUNK_SIZE_T sz = chunksize(p);
- /* min and max possible addresses assuming contiguous allocation */
- char* max_address = (char*)(av->top) + chunksize(av->top);
- char* min_address = max_address - av->sbrked_mem;
-
- if (!chunk_is_mmapped(p)) {
-
- /* Has legal address ... */
- if (p != av->top) {
- if (contiguous(av)) {
- assert(((char*)p) >= min_address);
- assert(((char*)p + sz) <= ((char*)(av->top)));
- }
- }
- else {
- /* top size is always at least MINSIZE */
- assert((CHUNK_SIZE_T)(sz) >= MINSIZE);
- /* top predecessor always marked inuse */
- assert(prev_inuse(p));
- }
-
- }
- else {
-#if HAVE_MMAP
- /* address is outside main heap */
- if (contiguous(av) && av->top != initial_top(av)) {
- assert(((char*)p) < min_address || ((char*)p) > max_address);
- }
- /* chunk is page-aligned */
- assert(((p->prev_size + sz) & (av->pagesize-1)) == 0);
- /* mem is aligned */
- assert(aligned_OK(chunk2mem(p)));
-#else
- /* force an appropriate assert violation if debug set */
- assert(!chunk_is_mmapped(p));
-#endif
- }
-}
-
-/*
- Properties of free chunks
-*/
-
-#if __STD_C
-static void do_check_free_chunk(mchunkptr p)
-#else
-static void do_check_free_chunk(p) mchunkptr p;
-#endif
-{
- mstate av = get_malloc_state();
-
- INTERNAL_SIZE_T sz = p->size & ~PREV_INUSE;
- mchunkptr next = chunk_at_offset(p, sz);
-
- do_check_chunk(p);
-
- /* Chunk must claim to be free ... */
- assert(!inuse(p));
- assert (!chunk_is_mmapped(p));
-
- /* Unless a special marker, must have OK fields */
- if ((CHUNK_SIZE_T)(sz) >= MINSIZE)
- {
- assert((sz & MALLOC_ALIGN_MASK) == 0);
- assert(aligned_OK(chunk2mem(p)));
- /* ... matching footer field */
- assert(next->prev_size == sz);
- /* ... and is fully consolidated */
- assert(prev_inuse(p));
- assert (next == av->top || inuse(next));
-
- /* ... and has minimally sane links */
- assert(p->fd->bk == p);
- assert(p->bk->fd == p);
- }
- else /* markers are always of size SIZE_SZ */
- assert(sz == SIZE_SZ);
-}
-
-/*
- Properties of inuse chunks
-*/
-
-#if __STD_C
-static void do_check_inuse_chunk(mchunkptr p)
-#else
-static void do_check_inuse_chunk(p) mchunkptr p;
-#endif
-{
- mstate av = get_malloc_state();
- mchunkptr next;
- do_check_chunk(p);
-
- if (chunk_is_mmapped(p))
- return; /* mmapped chunks have no next/prev */
-
- /* Check whether it claims to be in use ... */
- assert(inuse(p));
-
- next = next_chunk(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)) {
- /* Note that we cannot even look at prev unless it is not inuse */
- mchunkptr prv = prev_chunk(p);
- assert(next_chunk(prv) == p);
- do_check_free_chunk(prv);
- }
-
- if (next == av->top) {
- assert(prev_inuse(next));
- assert(chunksize(next) >= MINSIZE);
- }
- else if (!inuse(next))
- do_check_free_chunk(next);
-}
-
-/*
- Properties of chunks recycled from fastbins
-*/
-
-#if __STD_C
-static void do_check_remalloced_chunk(mchunkptr p, INTERNAL_SIZE_T s)
-#else
-static void do_check_remalloced_chunk(p, s) mchunkptr p; INTERNAL_SIZE_T s;
-#endif
-{
- INTERNAL_SIZE_T sz = p->size & ~PREV_INUSE;
-
- do_check_inuse_chunk(p);
-
- /* Legal size ... */
- assert((sz & MALLOC_ALIGN_MASK) == 0);
- assert((CHUNK_SIZE_T)(sz) >= MINSIZE);
- /* ... and alignment */
- assert(aligned_OK(chunk2mem(p)));
- /* chunk is less than MINSIZE more than request */
- assert((long)(sz) - (long)(s) >= 0);
- assert((long)(sz) - (long)(s + MINSIZE) < 0);
-}
-
-/*
- Properties of nonrecycled chunks at the point they are malloced
-*/
-
-#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
-{
- /* same as recycled case ... */
- do_check_remalloced_chunk(p, s);
-
- /*
- ... plus, must obey implementation invariant 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. This is ensured
- by making all allocations from the the `lowest' part of any found
- chunk. This does not necessarily hold however for chunks
- recycled via fastbins.
- */
-
- assert(prev_inuse(p));
-}
-
-
-/*
- Properties of malloc_state.
-
- This may be useful for debugging malloc, as well as detecting user
- programmer errors that somehow write into malloc_state.
-
- If you are extending or experimenting with this malloc, you can
- probably figure out how to hack this routine to print out or
- display chunk addresses, sizes, bins, and other instrumentation.
-*/
-
-static void do_check_malloc_state()
-{
- mstate av = get_malloc_state();
- int i;
- mchunkptr p;
- mchunkptr q;
- mbinptr b;
- unsigned int binbit;
- int empty;
- unsigned int idx;
- INTERNAL_SIZE_T size;
- CHUNK_SIZE_T total = 0;
- int max_fast_bin;
-
- /* internal size_t must be no wider than pointer type */
- assert(sizeof(INTERNAL_SIZE_T) <= sizeof(char*));
-
- /* alignment is a power of 2 */
- assert((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-1)) == 0);
-
- /* cannot run remaining checks until fully initialized */
- if (av->top == 0 || av->top == initial_top(av))
- return;
-
- /* pagesize is a power of 2 */
- assert((av->pagesize & (av->pagesize-1)) == 0);
-
- /* properties of fastbins */
-
- /* max_fast is in allowed range */
- assert(get_max_fast(av) <= request2size(MAX_FAST_SIZE));
-
- max_fast_bin = fastbin_index(av->max_fast);
-
- for (i = 0; i < NFASTBINS; ++i) {
- p = av->fastbins[i];
-
- /* all bins past max_fast are empty */
- if (i > max_fast_bin)
- assert(p == 0);
-
- while (p != 0) {
- /* each chunk claims to be inuse */
- do_check_inuse_chunk(p);
- total += chunksize(p);
- /* chunk belongs in this bin */
- assert(fastbin_index(chunksize(p)) == i);
- p = p->fd;
- }
- }
-
- if (total != 0)
- assert(have_fastchunks(av));
- else if (!have_fastchunks(av))
- assert(total == 0);
-
- /* check normal bins */
- for (i = 1; i < NBINS; ++i) {
- b = bin_at(av,i);
-
- /* binmap is accurate (except for bin 1 == unsorted_chunks) */
- if (i >= 2) {
- binbit = get_binmap(av,i);
- empty = last(b) == b;
- if (!binbit)
- assert(empty);
- else if (!empty)
- assert(binbit);
- }
-
- for (p = last(b); p != b; p = p->bk) {
- /* each chunk claims to be free */
- do_check_free_chunk(p);
- size = chunksize(p);
- total += size;
- if (i >= 2) {
- /* chunk belongs in bin */
- idx = bin_index(size);
- assert(idx == i);
- /* lists are sorted */
- if ((CHUNK_SIZE_T) size >= (CHUNK_SIZE_T)(FIRST_SORTED_BIN_SIZE)) {
- assert(p->bk == b ||
- (CHUNK_SIZE_T)chunksize(p->bk) >=
- (CHUNK_SIZE_T)chunksize(p));
- }
- }
- /* chunk is followed by a legal chain of inuse chunks */
- for (q = next_chunk(p);
- (q != av->top && inuse(q) &&
- (CHUNK_SIZE_T)(chunksize(q)) >= MINSIZE);
- q = next_chunk(q))
- do_check_inuse_chunk(q);
- }
- }
-
- /* top chunk is OK */
- check_chunk(av->top);
-
- /* sanity checks for statistics */
-
- assert(total <= (CHUNK_SIZE_T)(av->max_total_mem));
- assert(av->n_mmaps >= 0);
- assert(av->n_mmaps <= av->max_n_mmaps);
-
- assert((CHUNK_SIZE_T)(av->sbrked_mem) <=
- (CHUNK_SIZE_T)(av->max_sbrked_mem));
-
- assert((CHUNK_SIZE_T)(av->mmapped_mem) <=
- (CHUNK_SIZE_T)(av->max_mmapped_mem));
-
- assert((CHUNK_SIZE_T)(av->max_total_mem) >=
- (CHUNK_SIZE_T)(av->mmapped_mem) + (CHUNK_SIZE_T)(av->sbrked_mem));
-}
-#endif
-
-
-/* ----------- Routines dealing with system allocation -------------- */
-
-/*
- sysmalloc handles malloc cases requiring more memory from the system.
- On entry, it is assumed that av->top does not have enough
- space to service request for nb bytes, thus requiring that av->top
- be extended or replaced.
-*/
-
-#if __STD_C
-static Void_t* sYSMALLOc(INTERNAL_SIZE_T nb, mstate av)
-#else
-static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
-#endif
-{
- mchunkptr old_top; /* incoming value of av->top */
- INTERNAL_SIZE_T old_size; /* its size */
- char* old_end; /* its end address */
-
- long size; /* arg to first MORECORE or mmap call */
- char* brk; /* return value from MORECORE */
-
- long correction; /* arg to 2nd MORECORE call */
- char* snd_brk; /* 2nd return val */
-
- INTERNAL_SIZE_T front_misalign; /* unusable bytes at front of new space */
- INTERNAL_SIZE_T end_misalign; /* partial page left at end of new space */
- char* aligned_brk; /* aligned offset into brk */
-
- mchunkptr p; /* the allocated/returned chunk */
- mchunkptr remainder; /* remainder from allocation */
- CHUNK_SIZE_T remainder_size; /* its size */
-
- CHUNK_SIZE_T sum; /* for updating stats */
-
- size_t pagemask = av->pagesize - 1;
-
- /*
- If there is space available in fastbins, consolidate and retry
- malloc from scratch rather than getting memory from system. This
- can occur only if nb is in smallbin range so we didn't consolidate
- upon entry to malloc. It is much easier to handle this case here
- than in malloc proper.
- */
-
- if (have_fastchunks(av)) {
- assert(in_smallbin_range(nb));
- malloc_consolidate(av);
- return mALLOc(nb - MALLOC_ALIGN_MASK);
- }
-
-
-#if HAVE_MMAP
-
- /*
- If have mmap, and the request size meets the mmap threshold, and
- the system supports mmap, and there are few enough currently
- allocated mmapped regions, try to directly map this request
- rather than expanding top.
- */
-
- if ((CHUNK_SIZE_T)(nb) >= (CHUNK_SIZE_T)(av->mmap_threshold) &&
- (av->n_mmaps < av->n_mmaps_max)) {
-
- char* mm; /* return value from mmap call*/
-
- /*
- Round up size to nearest page. For mmapped chunks, the overhead
- is one SIZE_SZ unit larger than for normal chunks, because there
- is no following chunk whose prev_size field could be used.
- */
- size = (nb + SIZE_SZ + MALLOC_ALIGN_MASK + pagemask) & ~pagemask;
-
- /* Don't try if size wraps around 0 */
- if ((CHUNK_SIZE_T)(size) > (CHUNK_SIZE_T)(nb)) {
-
- mm = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
-
- if (mm != (char*)(MORECORE_FAILURE)) {
-
- /*
- The offset to the start of the mmapped region is stored
- in the prev_size field of the chunk. This allows us to adjust
- returned start address to meet alignment requirements here
- and in memalign(), and still be able to compute proper
- address argument for later munmap in free() and realloc().
- */
-
- front_misalign = (INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK;
- if (front_misalign > 0) {
- correction = MALLOC_ALIGNMENT - front_misalign;
- p = (mchunkptr)(mm + correction);
- p->prev_size = correction;
- set_head(p, (size - correction) |IS_MMAPPED);
- }
- else {
- p = (mchunkptr)mm;
- p->prev_size = 0;
- set_head(p, size|IS_MMAPPED);
- }
-
- /* update statistics */
-
- if (++av->n_mmaps > av->max_n_mmaps)
- av->max_n_mmaps = av->n_mmaps;
-
- sum = av->mmapped_mem += size;
- if (sum > (CHUNK_SIZE_T)(av->max_mmapped_mem))
- av->max_mmapped_mem = sum;
- sum += av->sbrked_mem;
- if (sum > (CHUNK_SIZE_T)(av->max_total_mem))
- av->max_total_mem = sum;
-
- check_chunk(p);
-
- return chunk2mem(p);
- }
- }
- }
-#endif
-
- /* Record incoming configuration of top */
-
- old_top = av->top;
- old_size = chunksize(old_top);
- old_end = (char*)(chunk_at_offset(old_top, old_size));
-
- brk = snd_brk = (char*)(MORECORE_FAILURE);
-
- /*
- If not the first time through, we require old_size to be
- at least MINSIZE and to have prev_inuse set.
- */
-
- assert((old_top == initial_top(av) && old_size == 0) ||
- ((CHUNK_SIZE_T) (old_size) >= MINSIZE &&
- prev_inuse(old_top)));
-
- /* Precondition: not enough current space to satisfy nb request */
- assert((CHUNK_SIZE_T)(old_size) < (CHUNK_SIZE_T)(nb + MINSIZE));
-
- /* Precondition: all fastbins are consolidated */
- assert(!have_fastchunks(av));
-
-
- /* Request enough space for nb + pad + overhead */
-
- size = nb + av->top_pad + MINSIZE;
-
- /*
- If contiguous, we can subtract out existing space that we hope to
- combine with new space. We add it back later only if
- we don't actually get contiguous space.
- */
-
- if (contiguous(av))
- size -= old_size;
-
- /*
- Round to a multiple of page size.
- If MORECORE is not contiguous, this ensures that we only call it
- with whole-page arguments. And if MORECORE is contiguous and
- this is not first time through, this preserves page-alignment of
- previous calls. Otherwise, we correct to page-align below.
- */
-
- size = (size + pagemask) & ~pagemask;
-
- /*
- Don't try to call MORECORE if argument is so big as to appear
- negative. Note that since mmap takes size_t arg, it may succeed
- below even if we cannot call MORECORE.
- */
-
- if (size > 0)
- brk = (char*)(MORECORE(size));
-
- /*
- If have mmap, try using it as a backup when MORECORE fails or
- cannot be used. This is worth doing on systems that have "holes" in
- address space, so sbrk cannot extend to give contiguous space, but
- space is available elsewhere. Note that we ignore mmap max count
- and threshold limits, since the space will not be used as a
- segregated mmap region.
- */
-
-#if HAVE_MMAP
- if (brk == (char*)(MORECORE_FAILURE)) {
-
- /* Cannot merge with old top, so add its size back in */
- if (contiguous(av))
- size = (size + old_size + pagemask) & ~pagemask;
-
- /* If we are relying on mmap as backup, then use larger units */
- if ((CHUNK_SIZE_T)(size) < (CHUNK_SIZE_T)(MMAP_AS_MORECORE_SIZE))
- size = MMAP_AS_MORECORE_SIZE;
-
- /* Don't try if size wraps around 0 */
- if ((CHUNK_SIZE_T)(size) > (CHUNK_SIZE_T)(nb)) {
-
- brk = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
-
- if (brk != (char*)(MORECORE_FAILURE)) {
-
- /* We do not need, and cannot use, another sbrk call to find end */
- snd_brk = brk + size;
-
- /*
- Record that we no longer have a contiguous sbrk region.
- After the first time mmap is used as backup, we do not
- ever rely on contiguous space since this could incorrectly
- bridge regions.
- */
- set_noncontiguous(av);
- }
- }
- }
-#endif
-
- if (brk != (char*)(MORECORE_FAILURE)) {
- av->sbrked_mem += size;
-
- /*
- If MORECORE extends previous space, we can likewise extend top size.
- */
-
- if (brk == old_end && snd_brk == (char*)(MORECORE_FAILURE)) {
- set_head(old_top, (size + old_size) | PREV_INUSE);
- }
-
- /*
- Otherwise, make adjustments:
-
- * If the first time through or noncontiguous, we need to call sbrk
- just to find out where the end of memory lies.
-
- * We need to ensure that all returned chunks from malloc will meet
- MALLOC_ALIGNMENT
-
- * If there was an intervening foreign sbrk, we need to adjust sbrk
- request size to account for fact that we will not be able to
- combine new space with existing space in old_top.
-
- * Almost all systems internally allocate whole pages at a time, in
- which case we might as well use the whole last page of request.
- So we allocate enough more memory to hit a page boundary now,
- which in turn causes future contiguous calls to page-align.
- */
-
- else {
- front_misalign = 0;
- end_misalign = 0;
- correction = 0;
- aligned_brk = brk;
-
- /*
- If MORECORE returns an address lower than we have seen before,
- we know it isn't really contiguous. This and some subsequent
- checks help cope with non-conforming MORECORE functions and
- the presence of "foreign" calls to MORECORE from outside of
- malloc or by other threads. We cannot guarantee to detect
- these in all cases, but cope with the ones we do detect.
- */
- if (contiguous(av) && old_size != 0 && brk < old_end) {
- set_noncontiguous(av);
- }
-
- /* handle contiguous cases */
- if (contiguous(av)) {
-
- /*
- We can tolerate forward non-contiguities here (usually due
- to foreign calls) but treat them as part of our space for
- stats reporting.
- */
- if (old_size != 0)
- av->sbrked_mem += brk - old_end;
-
- /* Guarantee alignment of first new chunk made from this space */
-
- front_misalign = (INTERNAL_SIZE_T)chunk2mem(brk) & MALLOC_ALIGN_MASK;
- if (front_misalign > 0) {
-
- /*
- Skip over some bytes to arrive at an aligned position.
- We don't need to specially mark these wasted front bytes.
- They will never be accessed anyway because
- prev_inuse of av->top (and any chunk created from its start)
- is always true after initialization.
- */
-
- correction = MALLOC_ALIGNMENT - front_misalign;
- aligned_brk += correction;
- }
-
- /*
- If this isn't adjacent to existing space, then we will not
- be able to merge with old_top space, so must add to 2nd request.
- */
-
- correction += old_size;
-
- /* Extend the end address to hit a page boundary */
- end_misalign = (INTERNAL_SIZE_T)(brk + size + correction);
- correction += ((end_misalign + pagemask) & ~pagemask) - end_misalign;
-
- assert(correction >= 0);
- snd_brk = (char*)(MORECORE(correction));
-
- if (snd_brk == (char*)(MORECORE_FAILURE)) {
- /*
- If can't allocate correction, try to at least find out current
- brk. It might be enough to proceed without failing.
- */
- correction = 0;
- snd_brk = (char*)(MORECORE(0));
- }
- else if (snd_brk < brk) {
- /*
- If the second call gives noncontiguous space even though
- it says it won't, the only course of action is to ignore
- results of second call, and conservatively estimate where
- the first call left us. Also set noncontiguous, so this
- won't happen again, leaving at most one hole.
-
- Note that this check is intrinsically incomplete. Because
- MORECORE is allowed to give more space than we ask for,
- there is no reliable way to detect a noncontiguity
- producing a forward gap for the second call.
- */
- snd_brk = brk + size;
- correction = 0;
- set_noncontiguous(av);
- }
-
- }
-
- /* handle non-contiguous cases */
- else {
- /* MORECORE/mmap must correctly align */
- assert(aligned_OK(chunk2mem(brk)));
-
- /* Find out current end of memory */
- if (snd_brk == (char*)(MORECORE_FAILURE)) {
- snd_brk = (char*)(MORECORE(0));
- av->sbrked_mem += snd_brk - brk - size;
- }
- }
-
- /* Adjust top based on results of second sbrk */
- if (snd_brk != (char*)(MORECORE_FAILURE)) {
- av->top = (mchunkptr)aligned_brk;
- set_head(av->top, (snd_brk - aligned_brk + correction) | PREV_INUSE);
- av->sbrked_mem += correction;
-
- /*
- If not the first time through, we either have a
- gap due to foreign sbrk or a non-contiguous region. Insert a
- double fencepost at old_top to prevent consolidation with space
- we don't own. These fenceposts are artificial chunks that are
- marked as inuse and are in any case too small to use. We need
- two to make sizes and alignments work out.
- */
-
- if (old_size != 0) {
- /*
- Shrink old_top to insert fenceposts, keeping size a
- multiple of MALLOC_ALIGNMENT. We know there is at least
- enough space in old_top to do this.
- */
- old_size = (old_size - 3*SIZE_SZ) & ~MALLOC_ALIGN_MASK;
- set_head(old_top, old_size | PREV_INUSE);
-
- /*
- Note that the following assignments completely overwrite
- old_top when old_size was previously MINSIZE. This is
- intentional. We need the fencepost, even if old_top otherwise gets
- lost.
- */
- chunk_at_offset(old_top, old_size )->size =
- SIZE_SZ|PREV_INUSE;
-
- chunk_at_offset(old_top, old_size + SIZE_SZ)->size =
- SIZE_SZ|PREV_INUSE;
-
- /*
- If possible, release the rest, suppressing trimming.
- */
- if (old_size >= MINSIZE) {
- INTERNAL_SIZE_T tt = av->trim_threshold;
- av->trim_threshold = (INTERNAL_SIZE_T)(-1);
- fREe(chunk2mem(old_top));
- av->trim_threshold = tt;
- }
- }
- }
- }
-
- /* Update statistics */
- sum = av->sbrked_mem;
- if (sum > (CHUNK_SIZE_T)(av->max_sbrked_mem))
- av->max_sbrked_mem = sum;
-
- sum += av->mmapped_mem;
- if (sum > (CHUNK_SIZE_T)(av->max_total_mem))
- av->max_total_mem = sum;
-
- check_malloc_state();
-
- /* finally, do the allocation */
-
- p = av->top;
- size = chunksize(p);
-
- /* check that one of the above allocation paths succeeded */
- if ((CHUNK_SIZE_T)(size) >= (CHUNK_SIZE_T)(nb + MINSIZE)) {
- remainder_size = size - nb;
- remainder = chunk_at_offset(p, nb);
- av->top = remainder;
- set_head(p, nb | PREV_INUSE);
- set_head(remainder, remainder_size | PREV_INUSE);
- check_malloced_chunk(p, nb);
- return chunk2mem(p);
- }
-
- }
-
- /* catch all failure paths */
- MALLOC_FAILURE_ACTION;
- return 0;
-}
-
-
-
-#ifndef MORECORE_CANNOT_TRIM
-/*
- sYSTRIm is an inverse of sorts to sYSMALLOc. It gives memory back
- to the system (via negative arguments to sbrk) if there is unused
- memory at the `high' end of the malloc pool. It is called
- automatically by free() when top space exceeds the trim
- threshold. It is also called by the public malloc_trim routine. It
- returns 1 if it actually released any memory, else 0.
-*/
-
-#if __STD_C
-static int sYSTRIm(size_t pad, mstate av)
-#else
-static int sYSTRIm(pad, av) size_t pad; mstate av;
-#endif
-{
- long top_size; /* Amount of top-most memory */
- long extra; /* Amount to release */
- long released; /* Amount actually released */
- char* current_brk; /* address returned by pre-check sbrk call */
- char* new_brk; /* address returned by post-check sbrk call */
- size_t pagesz;
-
- pagesz = av->pagesize;
- top_size = chunksize(av->top);
-
- /* Release in pagesize units, keeping at least one page */
- extra = ((top_size - pad - MINSIZE + (pagesz-1)) / pagesz - 1) * pagesz;
-
- if (extra > 0) {
-
- /*
- Only proceed if end of memory is where we last set it.
- This avoids problems if there were foreign sbrk calls.
- */
- current_brk = (char*)(MORECORE(0));
- if (current_brk == (char*)(av->top) + top_size) {
-
- /*
- Attempt to release memory. We ignore MORECORE return value,
- and instead call again to find out where new end of memory is.
- This avoids problems if first call releases less than we asked,
- of if failure somehow altered brk value. (We could still
- encounter problems if it altered brk in some very bad way,
- but the only thing we can do is adjust anyway, which will cause
- some downstream failure.)
- */
-
- MORECORE(-extra);
- new_brk = (char*)(MORECORE(0));
-
- if (new_brk != (char*)MORECORE_FAILURE) {
- released = (long)(current_brk - new_brk);
-
- if (released != 0) {
- /* Success. Adjust top. */
- av->sbrked_mem -= released;
- set_head(av->top, (top_size - released) | PREV_INUSE);
- check_malloc_state();
- return 1;
- }
- }
- }
- }
- return 0;
-}
-#endif /*MORECORE_CANNOT_TRIM*/
-
-/*
- ------------------------------ malloc ------------------------------
-*/
-
-
-#if __STD_C
-Void_t* mALLOc(size_t bytes)
-#else
- Void_t* mALLOc(bytes) size_t bytes;
-#endif
-{
- mstate av = get_malloc_state();
-
- INTERNAL_SIZE_T nb; /* normalized request size */
- unsigned int idx; /* associated bin index */
- mbinptr bin; /* associated bin */
- mfastbinptr* fb; /* associated fastbin */
-
- mchunkptr victim; /* inspected/selected chunk */
- INTERNAL_SIZE_T size; /* its size */
- int victim_index; /* its bin index */
-
- mchunkptr remainder; /* remainder from a split */
- CHUNK_SIZE_T remainder_size; /* its size */
-
- unsigned int block; /* bit map traverser */
- unsigned int bit; /* bit map traverser */
- unsigned int map; /* current word of binmap */
-
- mchunkptr fwd; /* misc temp for linking */
- mchunkptr bck; /* misc temp for linking */
-
- /*
- Convert request size to internal form by adding SIZE_SZ bytes
- overhead plus possibly more to obtain necessary alignment and/or
- to obtain a size of at least MINSIZE, the smallest allocatable
- size. Also, checked_request2size traps (returning 0) request sizes
- that are so large that they wrap around zero when padded and
- aligned.
- */
-
- checked_request2size(bytes, nb);
-
- /*
- Bypass search if no frees yet
- */
- if (!have_anychunks(av)) {
- if (av->max_fast == 0) /* initialization check */
- malloc_consolidate(av);
- goto use_top;
- }
-
- /*
- If the size qualifies as a fastbin, first check corresponding bin.
- */
-
- if ((CHUNK_SIZE_T)(nb) <= (CHUNK_SIZE_T)(av->max_fast)) {
- fb = &(av->fastbins[(fastbin_index(nb))]);
- if ( (victim = *fb) != 0) {
- *fb = victim->fd;
- check_remalloced_chunk(victim, nb);
- return chunk2mem(victim);
- }
- }
-
- /*
- If a small request, check regular bin. Since these "smallbins"
- hold one size each, no searching within bins is necessary.
- (For a large request, we need to wait until unsorted chunks are
- processed to find best fit. But for small ones, fits are exact
- anyway, so we can check now, which is faster.)
- */
-
- if (in_smallbin_range(nb)) {
- idx = smallbin_index(nb);
- bin = bin_at(av,idx);
-
- if ( (victim = last(bin)) != bin) {
- bck = victim->bk;
- set_inuse_bit_at_offset(victim, nb);
- bin->bk = bck;
- bck->fd = bin;
-
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
- }
- }
-
- /*
- If this is a large request, consolidate fastbins before continuing.
- While it might look excessive to kill all fastbins before
- even seeing if there is space available, this avoids
- fragmentation problems normally associated with fastbins.
- Also, in practice, programs tend to have runs of either small or
- large requests, but less often mixtures, so consolidation is not
- invoked all that often in most programs. And the programs that
- it is called frequently in otherwise tend to fragment.
- */
-
- else {
- idx = largebin_index(nb);
- if (have_fastchunks(av))
- malloc_consolidate(av);
- }
-
- /*
- Process recently freed or remaindered chunks, taking one only if
- it is exact fit, or, if this a small request, the chunk is remainder from
- the most recent non-exact fit. Place other traversed chunks in
- bins. Note that this step is the only place in any routine where
- chunks are placed in bins.
- */
-
- while ( (victim = unsorted_chunks(av)->bk) != unsorted_chunks(av)) {
- bck = victim->bk;
- size = chunksize(victim);
-
- /*
- If a small request, try to use last remainder if it is the
- only chunk in unsorted bin. This helps promote locality for
- runs of consecutive small requests. This is the only
- exception to best-fit, and applies only when there is
- no exact fit for a small chunk.
- */
-
- if (in_smallbin_range(nb) &&
- bck == unsorted_chunks(av) &&
- victim == av->last_remainder &&
- (CHUNK_SIZE_T)(size) > (CHUNK_SIZE_T)(nb + MINSIZE)) {
-
- /* split and reattach remainder */
- remainder_size = size - nb;
- remainder = chunk_at_offset(victim, nb);
- unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
- av->last_remainder = remainder;
- remainder->bk = remainder->fd = unsorted_chunks(av);
-
- set_head(victim, nb | PREV_INUSE);
- set_head(remainder, remainder_size | PREV_INUSE);
- set_foot(remainder, remainder_size);
-
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
- }
-
- /* remove from unsorted list */
- unsorted_chunks(av)->bk = bck;
- bck->fd = unsorted_chunks(av);
-
- /* Take now instead of binning if exact fit */
-
- if (size == nb) {
- set_inuse_bit_at_offset(victim, size);
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
- }
-
- /* place chunk in bin */
-
- if (in_smallbin_range(size)) {
- victim_index = smallbin_index(size);
- bck = bin_at(av, victim_index);
- fwd = bck->fd;
- }
- else {
- victim_index = largebin_index(size);
- bck = bin_at(av, victim_index);
- fwd = bck->fd;
-
- if (fwd != bck) {
- /* if smaller than smallest, place first */
- if ((CHUNK_SIZE_T)(size) < (CHUNK_SIZE_T)(bck->bk->size)) {
- fwd = bck;
- bck = bck->bk;
- }
- else if ((CHUNK_SIZE_T)(size) >=
- (CHUNK_SIZE_T)(FIRST_SORTED_BIN_SIZE)) {
-
- /* maintain large bins in sorted order */
- size |= PREV_INUSE; /* Or with inuse bit to speed comparisons */
- while ((CHUNK_SIZE_T)(size) < (CHUNK_SIZE_T)(fwd->size))
- fwd = fwd->fd;
- bck = fwd->bk;
- }
- }
- }
-
- mark_bin(av, victim_index);
- victim->bk = bck;
- victim->fd = fwd;
- fwd->bk = victim;
- bck->fd = victim;
- }
-
- /*
- If a large request, scan through the chunks of current bin to
- find one that fits. (This will be the smallest that fits unless
- FIRST_SORTED_BIN_SIZE has been changed from default.) This is
- the only step where an unbounded number of chunks might be
- scanned without doing anything useful with them. However the
- lists tend to be short.
- */
-
- if (!in_smallbin_range(nb)) {
- bin = bin_at(av, idx);
-
- for (victim = last(bin); victim != bin; victim = victim->bk) {
- size = chunksize(victim);
-
- if ((CHUNK_SIZE_T)(size) >= (CHUNK_SIZE_T)(nb)) {
- remainder_size = size - nb;
- unlink(victim, bck, fwd);
-
- /* Exhaust */
- if (remainder_size < MINSIZE) {
- set_inuse_bit_at_offset(victim, size);
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
- }
- /* Split */
- else {
- remainder = chunk_at_offset(victim, nb);
- unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
- remainder->bk = remainder->fd = unsorted_chunks(av);
- set_head(victim, nb | PREV_INUSE);
- set_head(remainder, remainder_size | PREV_INUSE);
- set_foot(remainder, remainder_size);
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
- }
- }
- }
- }
-
- /*
- Search for a chunk by scanning bins, starting with next largest
- bin. 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.
-
- The bitmap avoids needing to check that most blocks are nonempty.
- */
-
- ++idx;
- bin = bin_at(av,idx);
- block = idx2block(idx);
- map = av->binmap[block];
- bit = idx2bit(idx);
-
- for (;;) {
-
- /* Skip rest of block if there are no more set bits in this block. */
- if (bit > map || bit == 0) {
- do {
- if (++block >= BINMAPSIZE) /* out of bins */
- goto use_top;
- } while ( (map = av->binmap[block]) == 0);
-
- bin = bin_at(av, (block << BINMAPSHIFT));
- bit = 1;
- }
-
- /* Advance to bin with set bit. There must be one. */
- while ((bit & map) == 0) {
- bin = next_bin(bin);
- bit <<= 1;
- assert(bit != 0);
- }
-
- /* Inspect the bin. It is likely to be non-empty */
- victim = last(bin);
-
- /* If a false alarm (empty bin), clear the bit. */
- if (victim == bin) {
- av->binmap[block] = map &= ~bit; /* Write through */
- bin = next_bin(bin);
- bit <<= 1;
- }
-
- else {
- size = chunksize(victim);
-
- /* We know the first chunk in this bin is big enough to use. */
- assert((CHUNK_SIZE_T)(size) >= (CHUNK_SIZE_T)(nb));
-
- remainder_size = size - nb;
-
- /* unlink */
- bck = victim->bk;
- bin->bk = bck;
- bck->fd = bin;
-
- /* Exhaust */
- if (remainder_size < MINSIZE) {
- set_inuse_bit_at_offset(victim, size);
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
- }
-
- /* Split */
- else {
- remainder = chunk_at_offset(victim, nb);
-
- unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
- remainder->bk = remainder->fd = unsorted_chunks(av);
- /* advertise as last remainder */
- if (in_smallbin_range(nb))
- av->last_remainder = remainder;
-
- set_head(victim, nb | PREV_INUSE);
- set_head(remainder, remainder_size | PREV_INUSE);
- set_foot(remainder, remainder_size);
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
- }
- }
- }
-
- use_top:
- /*
- If large enough, split off the chunk bordering the end of memory
- (held in av->top). Note that this is in accord with the best-fit
- search rule. In effect, av->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).
-
- We require that av->top always exists (i.e., has size >=
- MINSIZE) after initialization, so if it would otherwise be
- exhuasted by current request, it is replenished. (The main
- reason for ensuring it exists is that we may need MINSIZE space
- to put in fenceposts in sysmalloc.)
- */
-
- victim = av->top;
- size = chunksize(victim);
-
- if ((CHUNK_SIZE_T)(size) >= (CHUNK_SIZE_T)(nb + MINSIZE)) {
- remainder_size = size - nb;
- remainder = chunk_at_offset(victim, nb);
- av->top = remainder;
- set_head(victim, nb | PREV_INUSE);
- set_head(remainder, remainder_size | PREV_INUSE);
-
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
- }
-
- /*
- If no space in top, relay to handle system-dependent cases
- */
- return sYSMALLOc(nb, av);
-}
-
-/*
- ------------------------------ free ------------------------------
-*/
-
-#if __STD_C
-void fREe(Void_t* mem)
-#else
-void fREe(mem) Void_t* mem;
-#endif
-{
- mstate av = get_malloc_state();
-
- mchunkptr p; /* chunk corresponding to mem */
- INTERNAL_SIZE_T size; /* its size */
- mfastbinptr* fb; /* associated fastbin */
- mchunkptr nextchunk; /* next contiguous chunk */
- INTERNAL_SIZE_T nextsize; /* its size */
- int nextinuse; /* true if nextchunk is used */
- INTERNAL_SIZE_T prevsize; /* size of previous contiguous chunk */
- mchunkptr bck; /* misc temp for linking */
- mchunkptr fwd; /* misc temp for linking */
-
- /* free(0) has no effect */
- if (mem != 0) {
- p = mem2chunk(mem);
- size = chunksize(p);
-
- check_inuse_chunk(p);
-
- /*
- If eligible, place chunk on a fastbin so it can be found
- and used quickly in malloc.
- */
-
- if ((CHUNK_SIZE_T)(size) <= (CHUNK_SIZE_T)(av->max_fast)
-
-#if TRIM_FASTBINS
- /*
- If TRIM_FASTBINS set, don't place chunks
- bordering top into fastbins
- */
- && (chunk_at_offset(p, size) != av->top)
-#endif
- ) {
-
- set_fastchunks(av);
- fb = &(av->fastbins[fastbin_index(size)]);
- p->fd = *fb;
- *fb = p;
- }
-
- /*
- Consolidate other non-mmapped chunks as they arrive.
- */
-
- else if (!chunk_is_mmapped(p)) {
- set_anychunks(av);
-
- nextchunk = chunk_at_offset(p, size);
- nextsize = chunksize(nextchunk);
-
- /* consolidate backward */
- if (!prev_inuse(p)) {
- prevsize = p->prev_size;
- size += prevsize;
- p = chunk_at_offset(p, -((long) prevsize));
- unlink(p, bck, fwd);
- }
-
- if (nextchunk != av->top) {
- /* get and clear inuse bit */
- nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
- set_head(nextchunk, nextsize);
-
- /* consolidate forward */
- if (!nextinuse) {
- unlink(nextchunk, bck, fwd);
- size += nextsize;
- }
-
- /*
- Place the chunk in unsorted chunk list. Chunks are
- not placed into regular bins until after they have
- been given one chance to be used in malloc.
- */
-
- bck = unsorted_chunks(av);
- fwd = bck->fd;
- p->bk = bck;
- p->fd = fwd;
- bck->fd = p;
- fwd->bk = p;
-
- set_head(p, size | PREV_INUSE);
- set_foot(p, size);
-
- check_free_chunk(p);
- }
-
- /*
- If the chunk borders the current high end of memory,
- consolidate into top
- */
-
- else {
- size += nextsize;
- set_head(p, size | PREV_INUSE);
- av->top = p;
- check_chunk(p);
- }
-
- /*
- If freeing a large space, consolidate possibly-surrounding
- chunks. Then, if the total unused topmost memory exceeds trim
- threshold, ask malloc_trim to reduce top.
-
- Unless max_fast is 0, we don't know if there are fastbins
- bordering top, so we cannot tell for sure whether threshold
- has been reached unless fastbins are consolidated. But we
- don't want to consolidate on each free. As a compromise,
- consolidation is performed if FASTBIN_CONSOLIDATION_THRESHOLD
- is reached.
- */
-
- if ((CHUNK_SIZE_T)(size) >= FASTBIN_CONSOLIDATION_THRESHOLD) {
- if (have_fastchunks(av))
- malloc_consolidate(av);
-
-#ifndef MORECORE_CANNOT_TRIM
- if ((CHUNK_SIZE_T)(chunksize(av->top)) >=
- (CHUNK_SIZE_T)(av->trim_threshold))
- sYSTRIm(av->top_pad, av);
-#endif
- }
-
- }
- /*
- If the chunk was allocated via mmap, release via munmap()
- Note that if HAVE_MMAP is false but chunk_is_mmapped is
- true, then user must have overwritten memory. There's nothing
- we can do to catch this error unless DEBUG is set, in which case
- check_inuse_chunk (above) will have triggered error.
- */
-
- else {
-#if HAVE_MMAP
- int ret;
- INTERNAL_SIZE_T offset = p->prev_size;
- av->n_mmaps--;
- av->mmapped_mem -= (size + offset);
- ret = munmap((char*)p - offset, size + offset);
- /* munmap returns non-zero on failure */
- assert(ret == 0);
-#endif
- }
- }
-}
-
-/*
- ------------------------- malloc_consolidate -------------------------
-
- malloc_consolidate is a specialized version of free() that tears
- down chunks held in fastbins. Free itself cannot be used for this
- purpose since, among other things, it might place chunks back onto
- fastbins. So, instead, we need to use a minor variant of the same
- code.
-
- Also, because this routine needs to be called the first time through
- malloc anyway, it turns out to be the perfect place to trigger
- initialization code.
-*/
-
-#if __STD_C
-static void malloc_consolidate(mstate av)
-#else
-static void malloc_consolidate(av) mstate av;
-#endif
-{
- mfastbinptr* fb; /* current fastbin being consolidated */
- mfastbinptr* maxfb; /* last fastbin (for loop control) */
- mchunkptr p; /* current chunk being consolidated */
- mchunkptr nextp; /* next chunk to consolidate */
- mchunkptr unsorted_bin; /* bin header */
- mchunkptr first_unsorted; /* chunk to link to */
-
- /* These have same use as in free() */
- mchunkptr nextchunk;
- INTERNAL_SIZE_T size;
- INTERNAL_SIZE_T nextsize;
- INTERNAL_SIZE_T prevsize;
- int nextinuse;
- mchunkptr bck;
- mchunkptr fwd;
-
- /*
- If max_fast is 0, we know that av hasn't
- yet been initialized, in which case do so below
- */
-
- if (av->max_fast != 0) {
- clear_fastchunks(av);
-
- unsorted_bin = unsorted_chunks(av);
-
- /*
- Remove each chunk from fast bin and consolidate it, placing it
- then in unsorted bin. Among other reasons for doing this,
- placing in unsorted bin avoids needing to calculate actual bins
- until malloc is sure that chunks aren't immediately going to be
- reused anyway.
- */
-
- maxfb = &(av->fastbins[fastbin_index(av->max_fast)]);
- fb = &(av->fastbins[0]);
- do {
- if ( (p = *fb) != 0) {
- *fb = 0;
-
- do {
- check_inuse_chunk(p);
- nextp = p->fd;
-
- /* Slightly streamlined version of consolidation code in free() */
- size = p->size & ~PREV_INUSE;
- nextchunk = chunk_at_offset(p, size);
- nextsize = chunksize(nextchunk);
-
- if (!prev_inuse(p)) {
- prevsize = p->prev_size;
- size += prevsize;
- p = chunk_at_offset(p, -((long) prevsize));
- unlink(p, bck, fwd);
- }
-
- if (nextchunk != av->top) {
- nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
- set_head(nextchunk, nextsize);
-
- if (!nextinuse) {
- size += nextsize;
- unlink(nextchunk, bck, fwd);
- }
-
- first_unsorted = unsorted_bin->fd;
- unsorted_bin->fd = p;
- first_unsorted->bk = p;
-
- set_head(p, size | PREV_INUSE);
- p->bk = unsorted_bin;
- p->fd = first_unsorted;
- set_foot(p, size);
- }
-
- else {
- size += nextsize;
- set_head(p, size | PREV_INUSE);
- av->top = p;
- }
-
- } while ( (p = nextp) != 0);
-
- }
- } while (fb++ != maxfb);
- }
- else {
- malloc_init_state(av);
- check_malloc_state();
- }
-}
-
-/*
- ------------------------------ realloc ------------------------------
-*/
-
-
-#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
-{
- mstate av = get_malloc_state();
-
- 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 */
-
- mchunkptr remainder; /* extra space at end of newp */
- CHUNK_SIZE_T remainder_size; /* its size */
-
- mchunkptr bck; /* misc temp for linking */
- mchunkptr fwd; /* misc temp for linking */
-
- CHUNK_SIZE_T copysize; /* bytes to copy */
- unsigned int ncopies; /* INTERNAL_SIZE_T words to copy */
- INTERNAL_SIZE_T* s; /* copy source */
- INTERNAL_SIZE_T* d; /* copy destination */
-
-
-#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);
-
- checked_request2size(bytes, nb);
-
- oldp = mem2chunk(oldmem);
- oldsize = chunksize(oldp);
-
- check_inuse_chunk(oldp);
-
- if (!chunk_is_mmapped(oldp)) {
-
- if ((CHUNK_SIZE_T)(oldsize) >= (CHUNK_SIZE_T)(nb)) {
- /* already big enough; split below */
- newp = oldp;
- newsize = oldsize;
- }
-
- else {
- next = chunk_at_offset(oldp, oldsize);
-
- /* Try to expand forward into top */
- if (next == av->top &&
- (CHUNK_SIZE_T)(newsize = oldsize + chunksize(next)) >=
- (CHUNK_SIZE_T)(nb + MINSIZE)) {
- set_head_size(oldp, nb);
- av->top = chunk_at_offset(oldp, nb);
- set_head(av->top, (newsize - nb) | PREV_INUSE);
- return chunk2mem(oldp);
- }
-
- /* Try to expand forward into next chunk; split off remainder below */
- else if (next != av->top &&
- !inuse(next) &&
- (CHUNK_SIZE_T)(newsize = oldsize + chunksize(next)) >=
- (CHUNK_SIZE_T)(nb)) {
- newp = oldp;
- unlink(next, bck, fwd);
- }
-
- /* allocate, copy, free */
- else {
- newmem = mALLOc(nb - MALLOC_ALIGN_MASK);
- if (newmem == 0)
- return 0; /* propagate failure */
-
- newp = mem2chunk(newmem);
- newsize = chunksize(newp);
-
- /*
- Avoid copy if newp is next chunk after oldp.
- */
- if (newp == next) {
- newsize += oldsize;
- newp = oldp;
- }
- else {
- /*
- Unroll copy of <= 36 bytes (72 if 8byte sizes)
- We know that contents have an odd number of
- INTERNAL_SIZE_T-sized words; minimally 3.
- */
-
- copysize = oldsize - SIZE_SZ;
- s = (INTERNAL_SIZE_T*)(oldmem);
- d = (INTERNAL_SIZE_T*)(newmem);
- ncopies = copysize / sizeof(INTERNAL_SIZE_T);
- assert(ncopies >= 3);
-
- if (ncopies > 9)
- MALLOC_COPY(d, s, copysize);
-
- else {
- *(d+0) = *(s+0);
- *(d+1) = *(s+1);
- *(d+2) = *(s+2);
- if (ncopies > 4) {
- *(d+3) = *(s+3);
- *(d+4) = *(s+4);
- if (ncopies > 6) {
- *(d+5) = *(s+5);
- *(d+6) = *(s+6);
- if (ncopies > 8) {
- *(d+7) = *(s+7);
- *(d+8) = *(s+8);
- }
- }
- }
- }
-
- fREe(oldmem);
- check_inuse_chunk(newp);
- return chunk2mem(newp);
- }
- }
- }
-
- /* If possible, free extra space in old or extended chunk */
-
- assert((CHUNK_SIZE_T)(newsize) >= (CHUNK_SIZE_T)(nb));
-
- remainder_size = newsize - nb;
-
- if (remainder_size < MINSIZE) { /* not enough extra to split off */
- set_head_size(newp, newsize);
- set_inuse_bit_at_offset(newp, newsize);
- }
- else { /* split remainder */
- remainder = chunk_at_offset(newp, nb);
- set_head_size(newp, nb);
- set_head(remainder, remainder_size | PREV_INUSE);
- /* Mark remainder as inuse so free() won't complain */
- set_inuse_bit_at_offset(remainder, remainder_size);
- fREe(chunk2mem(remainder));
- }
-
- check_inuse_chunk(newp);
- return chunk2mem(newp);
- }
-
- /*
- Handle mmap cases
- */
-
- else {
-#if HAVE_MMAP
-
-#if HAVE_MREMAP
- INTERNAL_SIZE_T offset = oldp->prev_size;
- size_t pagemask = av->pagesize - 1;
- char *cp;
- CHUNK_SIZE_T sum;
-
- /* Note the extra SIZE_SZ overhead */
- newsize = (nb + offset + SIZE_SZ + pagemask) & ~pagemask;
-
- /* don't need to remap if still within same page */
- if (oldsize == newsize - offset)
- return oldmem;
-
- cp = (char*)mremap((char*)oldp - offset, oldsize + offset, newsize, 1);
-
- if (cp != (char*)MORECORE_FAILURE) {
-
- newp = (mchunkptr)(cp + offset);
- set_head(newp, (newsize - offset)|IS_MMAPPED);
-
- assert(aligned_OK(chunk2mem(newp)));
- assert((newp->prev_size == offset));
-
- /* update statistics */
- sum = av->mmapped_mem += newsize - oldsize;
- if (sum > (CHUNK_SIZE_T)(av->max_mmapped_mem))
- av->max_mmapped_mem = sum;
- sum += av->sbrked_mem;
- if (sum > (CHUNK_SIZE_T)(av->max_total_mem))
- av->max_total_mem = sum;
-
- return chunk2mem(newp);
- }
-#endif
-
- /* Note the extra SIZE_SZ overhead. */
- if ((CHUNK_SIZE_T)(oldsize) >= (CHUNK_SIZE_T)(nb + SIZE_SZ))
- newmem = oldmem; /* do nothing */
- else {
- /* Must alloc, copy, free. */
- newmem = mALLOc(nb - MALLOC_ALIGN_MASK);
- if (newmem != 0) {
- MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ);
- fREe(oldmem);
- }
- }
- return newmem;
-
-#else
- /* If !HAVE_MMAP, but chunk_is_mmapped, user must have overwritten mem */
- check_malloc_state();
- MALLOC_FAILURE_ACTION;
- return 0;
-#endif
- }
-}
-
-/*
- ------------------------------ memalign ------------------------------
-*/
-
-#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* brk; /* alignment point within p */
- mchunkptr newp; /* chunk to return */
- INTERNAL_SIZE_T newsize; /* its size */
- INTERNAL_SIZE_T leadsize; /* leading space before alignment point */
- mchunkptr remainder; /* spare room at end to split off */
- CHUNK_SIZE_T remainder_size; /* its size */
- INTERNAL_SIZE_T size;
-
- /* If need less alignment than we give anyway, just relay to malloc */
-
- if (alignment <= MALLOC_ALIGNMENT) return mALLOc(bytes);
-
- /* Otherwise, ensure that it is at least a minimum chunk size */
-
- if (alignment < MINSIZE) alignment = MINSIZE;
-
- /* Make sure alignment is power of 2 (in case MINSIZE is not). */
- if ((alignment & (alignment - 1)) != 0) {
- size_t a = MALLOC_ALIGNMENT * 2;
- while ((CHUNK_SIZE_T)a < (CHUNK_SIZE_T)alignment) a <<= 1;
- alignment = a;
- }
-
- checked_request2size(bytes, nb);
-
- /*
- Strategy: find a spot within that chunk that meets the alignment
- request, and then possibly free the leading and trailing space.
- */
-
-
- /* Call malloc with worst case padding to hit alignment. */
-
- m = (char*)(mALLOc(nb + alignment + MINSIZE));
-
- if (m == 0) return 0; /* propagate failure */
-
- p = mem2chunk(m);
-
- if ((((PTR_UINT)(m)) % alignment) != 0) { /* 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.
- */
-
- brk = (char*)mem2chunk((PTR_UINT)(((PTR_UINT)(m + alignment - 1)) &
- -((signed long) alignment)));
- if ((CHUNK_SIZE_T)(brk - (char*)(p)) < MINSIZE)
- brk += alignment;
-
- newp = (mchunkptr)brk;
- leadsize = brk - (char*)(p);
- newsize = chunksize(p) - leadsize;
-
- /* For mmapped chunks, just adjust offset */
- if (chunk_is_mmapped(p)) {
- newp->prev_size = p->prev_size + leadsize;
- set_head(newp, newsize|IS_MMAPPED);
- return chunk2mem(newp);
- }
-
- /* Otherwise, give back leader, use the rest */
- set_head(newp, newsize | PREV_INUSE);
- set_inuse_bit_at_offset(newp, newsize);
- set_head_size(p, leadsize);
- fREe(chunk2mem(p));
- p = newp;
-
- assert (newsize >= nb &&
- (((PTR_UINT)(chunk2mem(p))) % alignment) == 0);
- }
-
- /* Also give back spare room at the end */
- if (!chunk_is_mmapped(p)) {
- size = chunksize(p);
- if ((CHUNK_SIZE_T)(size) > (CHUNK_SIZE_T)(nb + MINSIZE)) {
- remainder_size = size - nb;
- remainder = chunk_at_offset(p, nb);
- set_head(remainder, remainder_size | PREV_INUSE);
- set_head_size(p, nb);
- fREe(chunk2mem(remainder));
- }
- }
-
- check_inuse_chunk(p);
- return chunk2mem(p);
-}
-
-/*
- ------------------------------ calloc ------------------------------
-*/
-
-#if __STD_C
-Void_t* cALLOc(size_t n_elements, size_t elem_size)
-#else
-Void_t* cALLOc(n_elements, elem_size) size_t n_elements; size_t elem_size;
-#endif
-{
- mchunkptr p;
- CHUNK_SIZE_T clearsize;
- CHUNK_SIZE_T nclears;
- INTERNAL_SIZE_T* d;
-
- Void_t* mem = mALLOc(n_elements * elem_size);
-
- if (mem != 0) {
- p = mem2chunk(mem);
-
- if (!chunk_is_mmapped(p))
- {
- /*
- Unroll clear of <= 36 bytes (72 if 8byte sizes)
- We know that contents have an odd number of
- INTERNAL_SIZE_T-sized words; minimally 3.
- */
-
- d = (INTERNAL_SIZE_T*)mem;
- clearsize = chunksize(p) - SIZE_SZ;
- nclears = clearsize / sizeof(INTERNAL_SIZE_T);
- assert(nclears >= 3);
-
- if (nclears > 9)
- MALLOC_ZERO(d, clearsize);
-
- else {
- *(d+0) = 0;
- *(d+1) = 0;
- *(d+2) = 0;
- if (nclears > 4) {
- *(d+3) = 0;
- *(d+4) = 0;
- if (nclears > 6) {
- *(d+5) = 0;
- *(d+6) = 0;
- if (nclears > 8) {
- *(d+7) = 0;
- *(d+8) = 0;
- }
- }
- }
- }
- }
-#if ! MMAP_CLEARS
- else
- {
- d = (INTERNAL_SIZE_T*)mem;
- /*
- Note the additional SIZE_SZ
- */
- clearsize = chunksize(p) - 2*SIZE_SZ;
- MALLOC_ZERO(d, clearsize);
- }
-#endif
- }
- return mem;
-}
-
-/*
- ------------------------------ cfree ------------------------------
-*/
-
-#if __STD_C
-void cFREe(Void_t *mem)
-#else
-void cFREe(mem) Void_t *mem;
-#endif
-{
- fREe(mem);
-}
-
-#ifdef NEED_INDEPENDENT
-/*
- ------------------------- independent_calloc -------------------------
-*/
-
-#if __STD_C
-Void_t** iCALLOc(size_t n_elements, size_t elem_size, Void_t* chunks[])
-#else
-Void_t** iCALLOc(n_elements, elem_size, chunks) size_t n_elements; size_t elem_size; Void_t* chunks[];
-#endif
-{
- size_t sz = elem_size; /* serves as 1-element array */
- /* opts arg of 3 means all elements are same size, and should be cleared */
- return iALLOc(n_elements, &sz, 3, chunks);
-}
-
-/*
- ------------------------- independent_comalloc -------------------------
-*/
-
-#if __STD_C
-Void_t** iCOMALLOc(size_t n_elements, size_t sizes[], Void_t* chunks[])
-#else
-Void_t** iCOMALLOc(n_elements, sizes, chunks) size_t n_elements; size_t sizes[]; Void_t* chunks[];
-#endif
-{
- return iALLOc(n_elements, sizes, 0, chunks);
-}
-
-/*
- ------------------------------ ialloc ------------------------------
- ialloc 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
-*/
-
-
-#if __STD_C
-static Void_t** iALLOc(size_t n_elements,
- size_t* sizes,
- int opts,
- Void_t* chunks[])
-#else
-static Void_t** iALLOc(n_elements, sizes, opts, chunks) size_t n_elements; size_t* sizes; int opts; Void_t* chunks[];
-#endif
-{
- mstate av = get_malloc_state();
- INTERNAL_SIZE_T element_size; /* chunksize of each element, if all same */
- INTERNAL_SIZE_T contents_size; /* total size of elements */
- INTERNAL_SIZE_T array_size; /* request size of pointer array */
- Void_t* mem; /* malloced aggregate space */
- mchunkptr p; /* corresponding chunk */
- INTERNAL_SIZE_T remainder_size; /* remaining bytes while splitting */
- Void_t** marray; /* either "chunks" or malloced ptr array */
- mchunkptr array_chunk; /* chunk for malloced ptr array */
- int mmx; /* to disable mmap */
- INTERNAL_SIZE_T size;
- size_t i;
-
- /* Ensure initialization */
- if (av->max_fast == 0) malloc_consolidate(av);
-
- /* 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_t**) mALLOc(0);
- marray = 0;
- array_size = request2size(n_elements * (sizeof(Void_t*)));
- }
-
- /* 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]);
- }
-
- /* subtract out alignment bytes from total to minimize overallocation */
- size = contents_size + array_size - MALLOC_ALIGN_MASK;
-
- /*
- Allocate the aggregate chunk.
- But first disable mmap so malloc won't use it, since
- we would not be able to later free/realloc space internal
- to a segregated mmap region.
- */
- mmx = av->n_mmaps_max; /* disable mmap */
- av->n_mmaps_max = 0;
- mem = mALLOc(size);
- av->n_mmaps_max = mmx; /* reset mmap */
- if (mem == 0)
- return 0;
-
- p = mem2chunk(mem);
- assert(!chunk_is_mmapped(p));
- remainder_size = chunksize(p);
-
- if (opts & 0x2) { /* optionally clear the elements */
- MALLOC_ZERO(mem, remainder_size - SIZE_SZ - array_size);
- }
-
- /* If not provided, allocate the pointer array as final part of chunk */
- if (marray == 0) {
- array_chunk = chunk_at_offset(p, contents_size);
- marray = (Void_t**) (chunk2mem(array_chunk));
- set_head(array_chunk, (remainder_size - contents_size) | PREV_INUSE);
- 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_head(p, size | PREV_INUSE);
- p = chunk_at_offset(p, size);
- }
- else { /* the final element absorbs any overallocation slop */
- set_head(p, remainder_size | PREV_INUSE);
- 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(mem2chunk(marray));
- }
-
- for (i = 0; i != n_elements; ++i)
- check_inuse_chunk(mem2chunk(marray[i]));
-#endif
-
- return marray;
-}
-#endif /* NEED_INDEPENDENT */
-
-
-/*
- ------------------------------ valloc ------------------------------
-*/
-
-#if __STD_C
-Void_t* vALLOc(size_t bytes)
-#else
-Void_t* vALLOc(bytes) size_t bytes;
-#endif
-{
- /* Ensure initialization */
- mstate av = get_malloc_state();
- if (av->max_fast == 0) malloc_consolidate(av);
- return mEMALIGn(av->pagesize, bytes);
-}
-
-#ifdef NEED_PVALLOC
-/*
- ------------------------------ pvalloc ------------------------------
-*/
-
-
-#if __STD_C
-Void_t* pVALLOc(size_t bytes)
-#else
-Void_t* pVALLOc(bytes) size_t bytes;
-#endif
-{
- mstate av = get_malloc_state();
- size_t pagesz;
-
- /* Ensure initialization */
- if (av->max_fast == 0) malloc_consolidate(av);
- pagesz = av->pagesize;
- return mEMALIGn(pagesz, (bytes + pagesz - 1) & ~(pagesz - 1));
-}
-#endif /*NEED_PVALLOC*/
-
-
-/*
- ------------------------------ malloc_trim ------------------------------
-*/
-
-#if __STD_C
-int mTRIm(size_t pad)
-#else
-int mTRIm(pad) size_t pad;
-#endif
-{
- mstate av = get_malloc_state();
- /* Ensure initialization/consolidation */
- malloc_consolidate(av);
-
-#ifndef MORECORE_CANNOT_TRIM
- return sYSTRIm(pad, av);
-#else
- return 0;
-#endif
-}
-
-
-/*
- ------------------------- malloc_usable_size -------------------------
-*/
-
-#if __STD_C
-size_t mUSABLe(Void_t* mem)
-#else
-size_t mUSABLe(mem) Void_t* mem;
-#endif
-{
- mchunkptr p;
- if (mem != 0) {
- p = mem2chunk(mem);
- if (chunk_is_mmapped(p))
- return chunksize(p) - 2*SIZE_SZ;
- else if (inuse(p))
- return chunksize(p) - SIZE_SZ;
- }
- return 0;
-}
-
-/*
- ------------------------------ mallinfo ------------------------------
-*/
-
-struct mallinfo mALLINFo()
-{
- mstate av = get_malloc_state();
- struct mallinfo mi;
- unsigned i;
- mbinptr b;
- mchunkptr p;
- INTERNAL_SIZE_T avail;
- INTERNAL_SIZE_T fastavail;
- int nblocks;
- int nfastblocks;
-
- /* Ensure initialization */
- if (av->top == 0) malloc_consolidate(av);
-
- check_malloc_state();
-
- /* Account for top */
- avail = chunksize(av->top);
- nblocks = 1; /* top always exists */
-
- /* traverse fastbins */
- nfastblocks = 0;
- fastavail = 0;
-
- for (i = 0; i < NFASTBINS; ++i) {
- for (p = av->fastbins[i]; p != 0; p = p->fd) {
- ++nfastblocks;
- fastavail += chunksize(p);
- }
- }
-
- avail += fastavail;
-
- /* traverse regular bins */
- for (i = 1; i < NBINS; ++i) {
- b = bin_at(av, i);
- for (p = last(b); p != b; p = p->bk) {
- ++nblocks;
- avail += chunksize(p);
- }
- }
-
- mi.smblks = nfastblocks;
- mi.ordblks = nblocks;
- mi.fordblks = avail;
- mi.uordblks = av->sbrked_mem - avail;
- mi.arena = av->sbrked_mem;
- mi.hblks = av->n_mmaps;
- mi.hblkhd = av->mmapped_mem;
- mi.fsmblks = fastavail;
- mi.keepcost = chunksize(av->top);
- mi.usmblks = av->max_total_mem;
- return mi;
-}
-
-/*
- ------------------------------ malloc_stats ------------------------------
-*/
-
-void mSTATs()
-{
- struct mallinfo mi = mALLINFo();
-
-#ifdef WIN32
- {
- CHUNK_SIZE_T free, reserved, committed;
- vminfo (&free, &reserved, &committed);
- fprintf(stderr, "free bytes = %10lu\n",
- free);
- fprintf(stderr, "reserved bytes = %10lu\n",
- reserved);
- fprintf(stderr, "committed bytes = %10lu\n",
- committed);
- }
-#endif
-
-
- fprintf(stderr, "max system bytes = %10lu\n",
- (CHUNK_SIZE_T)(mi.usmblks));
- fprintf(stderr, "system bytes = %10lu\n",
- (CHUNK_SIZE_T)(mi.arena + mi.hblkhd));
- fprintf(stderr, "in use bytes = %10lu\n",
- (CHUNK_SIZE_T)(mi.uordblks + mi.hblkhd));
-
-#ifdef WIN32
- {
- CHUNK_SIZE_T kernel, user;
- if (cpuinfo (TRUE, &kernel, &user)) {
- fprintf(stderr, "kernel ms = %10lu\n",
- kernel);
- fprintf(stderr, "user ms = %10lu\n",
- user);
- }
- }
-#endif
-}
-
-
-/*
- ------------------------------ mallopt ------------------------------
-*/
-
-#if __STD_C
-int mALLOPt(int param_number, int value)
-#else
-int mALLOPt(param_number, value) int param_number; int value;
-#endif
-{
- mstate av = get_malloc_state();
- /* Ensure initialization/consolidation */
- malloc_consolidate(av);
-
- switch(param_number) {
- case M_MXFAST:
- if (value >= 0 && value <= MAX_FAST_SIZE) {
- set_max_fast(av, value);
- return 1;
- }
- else
- return 0;
-
- case M_TRIM_THRESHOLD:
- av->trim_threshold = value;
- return 1;
-
- case M_TOP_PAD:
- av->top_pad = value;
- return 1;
-
- case M_MMAP_THRESHOLD:
- av->mmap_threshold = value;
- return 1;
-
- case M_MMAP_MAX:
-#if !HAVE_MMAP
- if (value != 0)
- return 0;
-#endif
- av->n_mmaps_max = value;
- return 1;
-
- default:
- return 0;
- }
-}
-
-/*
- -------------------- Alternative MORECORE functions --------------------
-*/
-
-
-/*
- General Requirements for MORECORE.
-
- The MORECORE function must have the following properties:
-
- If MORECORE_CONTIGUOUS is false:
-
- * MORECORE must allocate in multiples of pagesize. It will
- only be called with arguments that are multiples of pagesize.
-
- * MORECORE(0) must return an address that is at least
- MALLOC_ALIGNMENT aligned. (Page-aligning always suffices.)
-
- else (i.e. If MORECORE_CONTIGUOUS is true):
-
- * Consecutive calls to MORECORE with positive arguments
- return increasing addresses, indicating that space has been
- contiguously extended.
-
- * MORECORE need not allocate in multiples of pagesize.
- Calls to MORECORE need not have args of multiples of pagesize.
-
- * MORECORE need not page-align.
-
- In either case:
-
- * MORECORE may allocate more memory than requested. (Or even less,
- but this will generally 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. This malloc does NOT call MORECORE(0)
- until at least one call with positive arguments is made, so
- the initial value returned is not important.
-
- * 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 MORECORE_FAILURE 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,
-
- There is some variation across systems about the type of the
- argument to sbrk/MORECORE. If size_t is unsigned, then it cannot
- actually be size_t, because sbrk supports negative args, so it is
- normally the signed type of the same width as size_t (sometimes
- declared as "intptr_t", and sometimes "ptrdiff_t"). It doesn't much
- matter though. Internally, we use "long" as arguments, which should
- work across all reasonable possibilities.
-
- Additionally, if MORECORE ever returns failure for a positive
- 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 map noncontiguous space.
-
- If you'd like mmap to ALWAYS be used, you can define MORECORE to be
- a function that always returns MORECORE_FAILURE.
-
- Malloc only has limited ability to detect failures of MORECORE
- to supply contiguous space when it says it can. In particular,
- multithreaded programs that do not use locks may result in
- rece conditions across calls to MORECORE that result in gaps
- that cannot be detected as such, and subsequent corruption.
-
- If you are using this malloc with something other than sbrk (or its
- emulation) to supply memory regions, you probably want to set
- MORECORE_CONTIGUOUS as false. As an example, 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
- #define MORECORE_CONTIGUOUS 0
-
- 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 * 1024)
- 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 *) MORECORE_FAILURE;
- }
- // save ptrs so they can be freed during cleanup
- our_os_pools[next_os_pool] = ptr;
- next_os_pool++;
- ptr = (void *) ((((CHUNK_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 *) MORECORE_FAILURE;
- }
- 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;
- }
- }
-
-*/
-
-
-/*
- --------------------------------------------------------------
-
- Emulation of sbrk for win32.
- Donated by J. Walter <Walter@GeNeSys-e.de>.
- For additional information about this code, and malloc on Win32, see
- http://www.genesys-e.de/jwalter/
-*/
-
-
-#ifdef WIN32
-
-#ifdef _DEBUG
-/* #define TRACE */
-#endif
-
-/* Support for USE_MALLOC_LOCK */
-#ifdef USE_MALLOC_LOCK
-
-/* Wait for spin lock */
-static int slwait (int *sl) {
- while (InterlockedCompareExchange ((void **) sl, (void *) 1, (void *) 0) != 0)
- Sleep (0);
- return 0;
-}
-
-/* Release spin lock */
-static int slrelease (int *sl) {
- InterlockedExchange (sl, 0);
- return 0;
-}
-
-#ifdef NEEDED
-/* Spin lock for emulation code */
-static int g_sl;
-#endif
-
-#endif /* USE_MALLOC_LOCK */
-
-/* getpagesize for windows */
-static long getpagesize (void) {
- static long g_pagesize = 0;
- if (! g_pagesize) {
- SYSTEM_INFO system_info;
- GetSystemInfo (&system_info);
- g_pagesize = system_info.dwPageSize;
- }
- return g_pagesize;
-}
-static long getregionsize (void) {
- static long g_regionsize = 0;
- if (! g_regionsize) {
- SYSTEM_INFO system_info;
- GetSystemInfo (&system_info);
- g_regionsize = system_info.dwAllocationGranularity;
- }
- return g_regionsize;
-}
-
-/* A region list entry */
-typedef struct _region_list_entry {
- void *top_allocated;
- void *top_committed;
- void *top_reserved;
- long reserve_size;
- struct _region_list_entry *previous;
-} region_list_entry;
-
-/* Allocate and link a region entry in the region list */
-static int region_list_append (region_list_entry **last, void *base_reserved, long reserve_size) {
- region_list_entry *next = HeapAlloc (GetProcessHeap (), 0, sizeof (region_list_entry));
- if (! next)
- return FALSE;
- next->top_allocated = (char *) base_reserved;
- next->top_committed = (char *) base_reserved;
- next->top_reserved = (char *) base_reserved + reserve_size;
- next->reserve_size = reserve_size;
- next->previous = *last;
- *last = next;
- return TRUE;
-}
-/* Free and unlink the last region entry from the region list */
-static int region_list_remove (region_list_entry **last) {
- region_list_entry *previous = (*last)->previous;
- if (! HeapFree (GetProcessHeap (), sizeof (region_list_entry), *last))
- return FALSE;
- *last = previous;
- return TRUE;
-}
-
-#define CEIL(size,to) (((size)+(to)-1)&~((to)-1))
-#define FLOOR(size,to) ((size)&~((to)-1))
-
-#define SBRK_SCALE 0
-/* #define SBRK_SCALE 1 */
-/* #define SBRK_SCALE 2 */
-/* #define SBRK_SCALE 4 */
-
-/* sbrk for windows */
-static void *sbrk (long size) {
- static long g_pagesize, g_my_pagesize;
- static long g_regionsize, g_my_regionsize;
- static region_list_entry *g_last;
- void *result = (void *) MORECORE_FAILURE;
-#ifdef TRACE
- printf ("sbrk %d\n", size);
-#endif
-#if defined (USE_MALLOC_LOCK) && defined (NEEDED)
- /* Wait for spin lock */
- slwait (&g_sl);
-#endif
- /* First time initialization */
- if (! g_pagesize) {
- g_pagesize = getpagesize ();
- g_my_pagesize = g_pagesize << SBRK_SCALE;
- }
- if (! g_regionsize) {
- g_regionsize = getregionsize ();
- g_my_regionsize = g_regionsize << SBRK_SCALE;
- }
- if (! g_last) {
- if (! region_list_append (&g_last, 0, 0))
- goto sbrk_exit;
- }
- /* Assert invariants */
- assert (g_last);
- assert ((char *) g_last->top_reserved - g_last->reserve_size <= (char *) g_last->top_allocated &&
- g_last->top_allocated <= g_last->top_committed);
- assert ((char *) g_last->top_reserved - g_last->reserve_size <= (char *) g_last->top_committed &&
- g_last->top_committed <= g_last->top_reserved &&
- (unsigned) g_last->top_committed % g_pagesize == 0);
- assert ((unsigned) g_last->top_reserved % g_regionsize == 0);
- assert ((unsigned) g_last->reserve_size % g_regionsize == 0);
- /* Allocation requested? */
- if (size >= 0) {
- /* Allocation size is the requested size */
- long allocate_size = size;
- /* Compute the size to commit */
- long to_commit = (char *) g_last->top_allocated + allocate_size - (char *) g_last->top_committed;
- /* Do we reach the commit limit? */
- if (to_commit > 0) {
- /* Round size to commit */
- long commit_size = CEIL (to_commit, g_my_pagesize);
- /* Compute the size to reserve */
- long to_reserve = (char *) g_last->top_committed + commit_size - (char *) g_last->top_reserved;
- /* Do we reach the reserve limit? */
- if (to_reserve > 0) {
- /* Compute the remaining size to commit in the current region */
- long remaining_commit_size = (char *) g_last->top_reserved - (char *) g_last->top_committed;
- if (remaining_commit_size > 0) {
- /* Assert preconditions */
- assert ((unsigned) g_last->top_committed % g_pagesize == 0);
- assert (0 < remaining_commit_size && remaining_commit_size % g_pagesize == 0); {
- /* Commit this */
- void *base_committed = VirtualAlloc (g_last->top_committed, remaining_commit_size,
- MEM_COMMIT, PAGE_READWRITE);
- /* Check returned pointer for consistency */
- if (base_committed != g_last->top_committed)
- goto sbrk_exit;
- /* Assert postconditions */
- assert ((unsigned) base_committed % g_pagesize == 0);
-#ifdef TRACE
- printf ("Commit %p %d\n", base_committed, remaining_commit_size);
-#endif
- /* Adjust the regions commit top */
- g_last->top_committed = (char *) base_committed + remaining_commit_size;
- }
- } {
- /* Now we are going to search and reserve. */
- int contiguous = -1;
- int found = FALSE;
- MEMORY_BASIC_INFORMATION memory_info;
- void *base_reserved;
- long reserve_size;
- do {
- /* Assume contiguous memory */
- contiguous = TRUE;
- /* Round size to reserve */
- reserve_size = CEIL (to_reserve, g_my_regionsize);
- /* Start with the current region's top */
- memory_info.BaseAddress = g_last->top_reserved;
- /* Assert preconditions */
- assert ((unsigned) memory_info.BaseAddress % g_pagesize == 0);
- assert (0 < reserve_size && reserve_size % g_regionsize == 0);
- while (VirtualQuery (memory_info.BaseAddress, &memory_info, sizeof (memory_info))) {
- /* Assert postconditions */
- assert ((unsigned) memory_info.BaseAddress % g_pagesize == 0);
-#ifdef TRACE
- printf ("Query %p %d %s\n", memory_info.BaseAddress, memory_info.RegionSize,
- memory_info.State == MEM_FREE ? "FREE":
- (memory_info.State == MEM_RESERVE ? "RESERVED":
- (memory_info.State == MEM_COMMIT ? "COMMITTED": "?")));
-#endif
- /* Region is free, well aligned and big enough: we are done */
- if (memory_info.State == MEM_FREE &&
- (unsigned) memory_info.BaseAddress % g_regionsize == 0 &&
- memory_info.RegionSize >= (unsigned) reserve_size) {
- found = TRUE;
- break;
- }
- /* From now on we can't get contiguous memory! */
- contiguous = FALSE;
- /* Recompute size to reserve */
- reserve_size = CEIL (allocate_size, g_my_regionsize);
- memory_info.BaseAddress = (char *) memory_info.BaseAddress + memory_info.RegionSize;
- /* Assert preconditions */
- assert ((unsigned) memory_info.BaseAddress % g_pagesize == 0);
- assert (0 < reserve_size && reserve_size % g_regionsize == 0);
- }
- /* Search failed? */
- if (! found)
- goto sbrk_exit;
- /* Assert preconditions */
- assert ((unsigned) memory_info.BaseAddress % g_regionsize == 0);
- assert (0 < reserve_size && reserve_size % g_regionsize == 0);
- /* Try to reserve this */
- base_reserved = VirtualAlloc (memory_info.BaseAddress, reserve_size,
- MEM_RESERVE, PAGE_NOACCESS);
- if (! base_reserved) {
- int rc = GetLastError ();
- if (rc != ERROR_INVALID_ADDRESS)
- goto sbrk_exit;
- }
- /* A null pointer signals (hopefully) a race condition with another thread. */
- /* In this case, we try again. */
- } while (! base_reserved);
- /* Check returned pointer for consistency */
- if (memory_info.BaseAddress && base_reserved != memory_info.BaseAddress)
- goto sbrk_exit;
- /* Assert postconditions */
- assert ((unsigned) base_reserved % g_regionsize == 0);
-#ifdef TRACE
- printf ("Reserve %p %d\n", base_reserved, reserve_size);
-#endif
- /* Did we get contiguous memory? */
- if (contiguous) {
- long start_size = (char *) g_last->top_committed - (char *) g_last->top_allocated;
- /* Adjust allocation size */
- allocate_size -= start_size;
- /* Adjust the regions allocation top */
- g_last->top_allocated = g_last->top_committed;
- /* Recompute the size to commit */
- to_commit = (char *) g_last->top_allocated + allocate_size - (char *) g_last->top_committed;
- /* Round size to commit */
- commit_size = CEIL (to_commit, g_my_pagesize);
- }
- /* Append the new region to the list */
- if (! region_list_append (&g_last, base_reserved, reserve_size))
- goto sbrk_exit;
- /* Didn't we get contiguous memory? */
- if (! contiguous) {
- /* Recompute the size to commit */
- to_commit = (char *) g_last->top_allocated + allocate_size - (char *) g_last->top_committed;
- /* Round size to commit */
- commit_size = CEIL (to_commit, g_my_pagesize);
- }
- }
- }
- /* Assert preconditions */
- assert ((unsigned) g_last->top_committed % g_pagesize == 0);
- assert (0 < commit_size && commit_size % g_pagesize == 0); {
- /* Commit this */
- void *base_committed = VirtualAlloc (g_last->top_committed, commit_size,
- MEM_COMMIT, PAGE_READWRITE);
- /* Check returned pointer for consistency */
- if (base_committed != g_last->top_committed)
- goto sbrk_exit;
- /* Assert postconditions */
- assert ((unsigned) base_committed % g_pagesize == 0);
-#ifdef TRACE
- printf ("Commit %p %d\n", base_committed, commit_size);
-#endif
- /* Adjust the regions commit top */
- g_last->top_committed = (char *) base_committed + commit_size;
- }
- }
- /* Adjust the regions allocation top */
- g_last->top_allocated = (char *) g_last->top_allocated + allocate_size;
- result = (char *) g_last->top_allocated - size;
- /* Deallocation requested? */
- } else if (size < 0) {
- long deallocate_size = - size;
- /* As long as we have a region to release */
- while ((char *) g_last->top_allocated - deallocate_size < (char *) g_last->top_reserved - g_last->reserve_size) {
- /* Get the size to release */
- long release_size = g_last->reserve_size;
- /* Get the base address */
- void *base_reserved = (char *) g_last->top_reserved - release_size;
- /* Assert preconditions */
- assert ((unsigned) base_reserved % g_regionsize == 0);
- assert (0 < release_size && release_size % g_regionsize == 0); {
- /* Release this */
- int rc = VirtualFree (base_reserved, 0,
- MEM_RELEASE);
- /* Check returned code for consistency */
- if (! rc)
- goto sbrk_exit;
-#ifdef TRACE
- printf ("Release %p %d\n", base_reserved, release_size);
-#endif
- }
- /* Adjust deallocation size */
- deallocate_size -= (char *) g_last->top_allocated - (char *) base_reserved;
- /* Remove the old region from the list */
- if (! region_list_remove (&g_last))
- goto sbrk_exit;
- } {
- /* Compute the size to decommit */
- long to_decommit = (char *) g_last->top_committed - ((char *) g_last->top_allocated - deallocate_size);
- if (to_decommit >= g_my_pagesize) {
- /* Compute the size to decommit */
- long decommit_size = FLOOR (to_decommit, g_my_pagesize);
- /* Compute the base address */
- void *base_committed = (char *) g_last->top_committed - decommit_size;
- /* Assert preconditions */
- assert ((unsigned) base_committed % g_pagesize == 0);
- assert (0 < decommit_size && decommit_size % g_pagesize == 0); {
- /* Decommit this */
- int rc = VirtualFree ((char *) base_committed, decommit_size,
- MEM_DECOMMIT);
- /* Check returned code for consistency */
- if (! rc)
- goto sbrk_exit;
-#ifdef TRACE
- printf ("Decommit %p %d\n", base_committed, decommit_size);
-#endif
- }
- /* Adjust deallocation size and regions commit and allocate top */
- deallocate_size -= (char *) g_last->top_allocated - (char *) base_committed;
- g_last->top_committed = base_committed;
- g_last->top_allocated = base_committed;
- }
- }
- /* Adjust regions allocate top */
- g_last->top_allocated = (char *) g_last->top_allocated - deallocate_size;
- /* Check for underflow */
- if ((char *) g_last->top_reserved - g_last->reserve_size > (char *) g_last->top_allocated ||
- g_last->top_allocated > g_last->top_committed) {
- /* Adjust regions allocate top */
- g_last->top_allocated = (char *) g_last->top_reserved - g_last->reserve_size;
- goto sbrk_exit;
- }
- result = g_last->top_allocated;
- }
- /* Assert invariants */
- assert (g_last);
- assert ((char *) g_last->top_reserved - g_last->reserve_size <= (char *) g_last->top_allocated &&
- g_last->top_allocated <= g_last->top_committed);
- assert ((char *) g_last->top_reserved - g_last->reserve_size <= (char *) g_last->top_committed &&
- g_last->top_committed <= g_last->top_reserved &&
- (unsigned) g_last->top_committed % g_pagesize == 0);
- assert ((unsigned) g_last->top_reserved % g_regionsize == 0);
- assert ((unsigned) g_last->reserve_size % g_regionsize == 0);
-
-sbrk_exit:
-#if defined (USE_MALLOC_LOCK) && defined (NEEDED)
- /* Release spin lock */
- slrelease (&g_sl);
-#endif
- return result;
-}
-
-/* mmap for windows */
-static void *mmap (void *ptr, long size, long prot, long type, long handle, long arg) {
- static long g_pagesize;
- static long g_regionsize;
-#ifdef TRACE
- printf ("mmap %d\n", size);
-#endif
-#if defined (USE_MALLOC_LOCK) && defined (NEEDED)
- /* Wait for spin lock */
- slwait (&g_sl);
-#endif
- /* First time initialization */
- if (! g_pagesize)
- g_pagesize = getpagesize ();
- if (! g_regionsize)
- g_regionsize = getregionsize ();
- /* Assert preconditions */
- assert ((unsigned) ptr % g_regionsize == 0);
- assert (size % g_pagesize == 0);
- /* Allocate this */
- ptr = VirtualAlloc (ptr, size,
- MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE);
- if (! ptr) {
- ptr = (void *) MORECORE_FAILURE;
- goto mmap_exit;
- }
- /* Assert postconditions */
- assert ((unsigned) ptr % g_regionsize == 0);
-#ifdef TRACE
- printf ("Commit %p %d\n", ptr, size);
-#endif
-mmap_exit:
-#if defined (USE_MALLOC_LOCK) && defined (NEEDED)
- /* Release spin lock */
- slrelease (&g_sl);
-#endif
- return ptr;
-}
-
-/* munmap for windows */
-static long munmap (void *ptr, long size) {
- static long g_pagesize;
- static long g_regionsize;
- int rc = MUNMAP_FAILURE;
-#ifdef TRACE
- printf ("munmap %p %d\n", ptr, size);
-#endif
-#if defined (USE_MALLOC_LOCK) && defined (NEEDED)
- /* Wait for spin lock */
- slwait (&g_sl);
-#endif
- /* First time initialization */
- if (! g_pagesize)
- g_pagesize = getpagesize ();
- if (! g_regionsize)
- g_regionsize = getregionsize ();
- /* Assert preconditions */
- assert ((unsigned) ptr % g_regionsize == 0);
- assert (size % g_pagesize == 0);
- /* Free this */
- if (! VirtualFree (ptr, 0,
- MEM_RELEASE))
- goto munmap_exit;
- rc = 0;
-#ifdef TRACE
- printf ("Release %p %d\n", ptr, size);
-#endif
-munmap_exit:
-#if defined (USE_MALLOC_LOCK) && defined (NEEDED)
- /* Release spin lock */
- slrelease (&g_sl);
-#endif
- return rc;
-}
-
-static void vminfo (CHUNK_SIZE_T *free, CHUNK_SIZE_T *reserved, CHUNK_SIZE_T *committed) {
- MEMORY_BASIC_INFORMATION memory_info;
- memory_info.BaseAddress = 0;
- *free = *reserved = *committed = 0;
- while (VirtualQuery (memory_info.BaseAddress, &memory_info, sizeof (memory_info))) {
- switch (memory_info.State) {
- case MEM_FREE:
- *free += memory_info.RegionSize;
- break;
- case MEM_RESERVE:
- *reserved += memory_info.RegionSize;
- break;
- case MEM_COMMIT:
- *committed += memory_info.RegionSize;
- break;
- }
- memory_info.BaseAddress = (char *) memory_info.BaseAddress + memory_info.RegionSize;
- }
-}
-
-static int cpuinfo (int whole, CHUNK_SIZE_T *kernel, CHUNK_SIZE_T *user) {
- if (whole) {
- __int64 creation64, exit64, kernel64, user64;
- int rc = GetProcessTimes (GetCurrentProcess (),
- (FILETIME *) &creation64,
- (FILETIME *) &exit64,
- (FILETIME *) &kernel64,
- (FILETIME *) &user64);
- if (! rc) {
- *kernel = 0;
- *user = 0;
- return FALSE;
- }
- *kernel = (CHUNK_SIZE_T) (kernel64 / 10000);
- *user = (CHUNK_SIZE_T) (user64 / 10000);
- return TRUE;
- } else {
- __int64 creation64, exit64, kernel64, user64;
- int rc = GetThreadTimes (GetCurrentThread (),
- (FILETIME *) &creation64,
- (FILETIME *) &exit64,
- (FILETIME *) &kernel64,
- (FILETIME *) &user64);
- if (! rc) {
- *kernel = 0;
- *user = 0;
- return FALSE;
- }
- *kernel = (CHUNK_SIZE_T) (kernel64 / 10000);
- *user = (CHUNK_SIZE_T) (user64 / 10000);
- return TRUE;
- }
-}
-
-#endif /* WIN32 */
-
-/* ------------------------------------------------------------
-History:
- 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 <Walter@GeNeSys-e.de>.
- Thanks also to Andreas Mueller <a.mueller at paradatec.de>,
- 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 <tbennett@nvidia.com> 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 <mcfong at yahoo.com>
- * 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 bd671a6fc..000000000
--- a/winsup/cygwin/malloc_wrapper.cc
+++ /dev/null
@@ -1,316 +0,0 @@
-/* malloc_wrapper.cc
-
- Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 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 <stdlib.h>
-#include <assert.h>
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include <errno.h>
-#include "cygerrno.h"
-#include "cygheap.h"
-#include "heap.h"
-#include "sync.h"
-#include "perprocess.h"
-#include "cygmalloc.h"
-
-/* 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;
-
-#ifdef MALLOC_DEBUG
-extern "C" void * _sbrk (size_t incr_arg);
-
-#if 0
-extern "C" void *
-_sbrk_r (struct _reent *, size_t incr_arg)
-{
- return _sbrk (incr_arg);
-}
-#endif
-
-extern "C" void *
-_malloc_r (struct _reent *, size_t size)
-{
- export_malloc_called = 1;
- return malloc (size);
-}
-#undef malloc
-
-extern "C" void *
-_calloc_r (struct _reent *, size_t nmemb, size_t size)
-{
- export_malloc_called = 1;
- return calloc (nmemb, size);
-}
-#undef calloc
-
-extern "C" void
-_free_r (struct _reent *, void *p)
-{
- export_malloc_called = 1;
- assert (!incygheap (p));
- assert (inheap (p));
- free (p);
-}
-#undef free
-
-extern "C" void *
-_realloc_r (struct _reent *, void *p, size_t size)
-{
- export_malloc_called = 1;
- assert (!incygheap (p));
- assert (inheap (p));
- return realloc (p, size);
-}
-#undef realloc
-
-extern "C" char *
-strdup_dbg (const char *s, const char *file, int line)
-{
- char *p;
- export_malloc_called = 1;
- if ((p = (char *) malloc_dbg (strlen (s) + 1, file, line)) != NULL)
- strcpy (p, s);
- return p;
-}
-
-#undef strdup
-extern "C" char *
-strdup (const char *s)
-{
- return strdup_dbg (s, __FILE__, __LINE__);
-}
-#else
-#endif
-/* 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 ();
- }
-
- return;
-}
-
-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. */
-
-NO_COPY muto *mallock = NULL;
-
-void
-malloc_init ()
-{
- new_muto (mallock);
- /* Check if mallock 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 (!user_data->forkee)
- {
-#ifdef MALLOC_DEBUG
- _free_r (NULL, _malloc_r (NULL, 16));
-#else
- user_data->free (user_data->malloc (16));
-#endif
- if (!export_malloc_called)
- use_internal_malloc = 0;
- }
-}
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 <sys/param.h>
-#include <sys/types.h>
-#include <gmon.h>
-
-/*
- * 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 <machine/profile.h>.
- *
- * _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 <machine/profile.h>,
- * which is included by <sys/gmon.h>
- */
-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 @@
-<sect1 id="std-misc">
-<title>Compatibility with Miscellaneous Other Standards</title>
-
-<para>The following functions are compatible with miscellaneous other
-standards:</para>
-
-
-<sect2><title>Networking</title>
-
-<para>(Standardized by POSIX 1.g, which is probably still in draft?)</para>
-
-<para>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</para>
-
-<para>Of these networking calls, rexec, rcmd and rresvport are
-implemented in MS IP stack but may not be implemented in other
-vendors' stacks. </para>
-
-</sect2>
-
-<sect2><title>Other</title><para>
-
-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
-
-</para></sect2>
-<sect2><title>Implementation Notes</title>
-
-<para> <function>initgroups</function> does nothing</para>
-
-<para> <function>chroot</function>, <function>mknod</function>,
-<function>settimeofday</function>, and <function>vhangup</function>
-always return -1 and sets errno to ENOSYS.</para>
-
-<para> <function>nice</function> 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
-<function>nice</function> 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 <function>nice</function>.</para>
-
-<para> <function>seteuid</function> and <function>setegid</function>
-always return 0 and set errno to
-ENOSYS.</para>
-
-<para><function>vfork</function> just calls
-<function>fork</function></para>
-
-</sect2>
-
-</sect1>
diff --git a/winsup/cygwin/miscfuncs.cc b/winsup/cygwin/miscfuncs.cc
deleted file mode 100644
index e58565942..000000000
--- a/winsup/cygwin/miscfuncs.cc
+++ /dev/null
@@ -1,318 +0,0 @@
-/* miscfuncs.cc: misc funcs that don't belong anywhere else
-
- 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 "cygerrno.h"
-#include <sys/errno.h>
-#include <sys/uio.h>
-#include <assert.h>
-#include <limits.h>
-#include <winbase.h>
-#include <winnls.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_null_str (const char *name)
-{
- if (name && !IsBadStringPtr (name, MAX_PATH))
- return 0;
-
- return EFAULT;
-}
-
-int __stdcall
-check_null_empty_str (const char *name)
-{
- if (name && !IsBadStringPtr (name, MAX_PATH))
- return !*name ? ENOENT : 0;
-
- return EFAULT;
-}
-
-int __stdcall
-check_null_empty_str_errno (const char *name)
-{
- int __err;
- if ((__err = check_null_empty_str (name)))
- set_errno (__err);
- return __err;
-}
-
-int __stdcall
-check_null_str_errno (const char *name)
-{
- int __err;
- if ((__err = check_null_str (name)))
- set_errno (__err);
- return __err;
-}
-
-int __stdcall
-__check_null_invalid_struct (void *s, unsigned sz)
-{
- if (s && !IsBadWritePtr (s, sz))
- return 0;
-
- return EFAULT;
-}
-
-int __stdcall
-__check_null_invalid_struct_errno (void *s, unsigned sz)
-{
- int err;
- if ((err = __check_null_invalid_struct (s, sz)))
- set_errno (err);
- return err;
-}
-
-int __stdcall
-__check_invalid_read_ptr_errno (const void *s, unsigned sz)
-{
- if (s && !IsBadReadPtr (s, sz))
- return 0;
- return set_errno (EFAULT);
-}
-
-ssize_t
-check_iovec_for_read (const struct iovec *iov, int iovcnt)
-{
- if (iovcnt <= 0 || iovcnt > IOV_MAX)
- {
- set_errno (EINVAL);
- return -1;
- }
-
- if (__check_invalid_read_ptr_errno (iov, iovcnt * sizeof (*iov)))
- 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;
- }
-
- if (iov->iov_len
- && __check_null_invalid_struct_errno (iov->iov_base, iov->iov_len))
- return -1;
-
- iov += 1;
- iovcnt -= 1;
- }
-
- assert (tot <= SSIZE_MAX);
-
- return (ssize_t) tot;
-}
-
-ssize_t
-check_iovec_for_write (const struct iovec *iov, int iovcnt)
-{
- if (iovcnt <= 0 || iovcnt > IOV_MAX)
- {
- set_errno (EINVAL);
- return -1;
- }
-
- if (__check_invalid_read_ptr_errno (iov, iovcnt * sizeof (*iov)))
- 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;
- }
-
- if (iov->iov_len
- && __check_invalid_read_ptr_errno (iov->iov_base, iov->iov_len))
- return -1;
-
- iov += 1;
- iovcnt -= 1;
- }
-
- assert (tot <= SSIZE_MAX);
-
- return (ssize_t) tot;
-}
-
-UINT
-get_cp ()
-{
- return current_codepage == ansi_cp ? GetACP() : GetOEMCP();
-}
-
-int __stdcall
-sys_wcstombs (char *tgt, const WCHAR *src, int len)
-{
- return WideCharToMultiByte (get_cp (), 0, src, -1, tgt, len, NULL, NULL);
-}
-
-int __stdcall
-sys_mbstowcs (WCHAR *tgt, const char *src, int len)
-{
- return MultiByteToWideChar (get_cp (), 0, src, -1, tgt, len);
-}
-
-int __stdcall
-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;
- }
-
- /* Force any threads in normal priority to be scheduled */
- SetThreadPriority (thisthread, THREAD_PRIORITY_NORMAL);
- Sleep (0);
-
- SetThreadPriority (thisthread, THREAD_PRIORITY_IDLE);
- Sleep (secs);
- if (!staylow)
- SetThreadPriority (thisthread, curr_prio);
- return curr_prio;
-}
diff --git a/winsup/cygwin/mkvers.sh b/winsup/cygwin/mkvers.sh
deleted file mode 100755
index 3296b569a..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 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" -le 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 <<EOF 1>&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 '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 <<EOF
- "%%% Cygwin $var: $val\n"
-EOF
-done | tee /tmp/mkvers.$$ 1>&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 <<EOF 1>&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 19c8e087d..000000000
--- a/winsup/cygwin/mmap.cc
+++ /dev/null
@@ -1,993 +0,0 @@
-/* mmap.cc
-
- 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. */
-
-#include "winsup.h"
-#include <unistd.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <sys/mman.h>
-#include <errno.h>
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygerrno.h"
-#include "cygheap.h"
-#include "pinfo.h"
-#include "sys/cygwin.h"
-
-#define PAGE_CNT(bytes) howmany((bytes),getpagesize())
-
-#define PGBITS (sizeof (DWORD)*8)
-#define MAPSIZE(pages) howmany ((pages), PGBITS)
-
-#define MAP_SET(n) (map_map_[(n)/PGBITS] |= (1L << ((n) % PGBITS)))
-#define MAP_CLR(n) (map_map_[(n)/PGBITS] &= ~(1L << ((n) % PGBITS)))
-#define MAP_ISSET(n) (map_map_[(n)/PGBITS] & (1L << ((n) % PGBITS)))
-
-/*
- * Simple class used to keep a record of all current
- * mmap areas in a process. Needed so that
- * they can be duplicated after a fork().
- */
-
-class mmap_record
-{
- private:
- int fdesc_;
- HANDLE mapping_handle_;
- int devtype_;
- DWORD access_mode_;
- __off64_t offset_;
- DWORD size_to_map_;
- caddr_t base_address_;
- DWORD *map_map_;
-
- public:
- mmap_record (int fd, HANDLE h, DWORD ac, __off64_t o, DWORD s, caddr_t b) :
- fdesc_ (fd),
- mapping_handle_ (h),
- devtype_ (0),
- access_mode_ (ac),
- offset_ (o),
- size_to_map_ (s),
- base_address_ (b),
- map_map_ (NULL)
- {
- if (fd >= 0 && !cygheap->fdtab.not_open (fd))
- devtype_ = cygheap->fdtab[fd]->get_device ();
- }
-
- /* Default Copy constructor/operator=/destructor are ok */
-
- /* Simple accessors */
- int get_fd () const { return fdesc_; }
- HANDLE get_handle () const { return mapping_handle_; }
- DWORD get_device () const { return devtype_; }
- DWORD get_access () const { return access_mode_; }
- DWORD get_offset () const { return offset_; }
- DWORD get_size () const { return size_to_map_; }
- caddr_t get_address () const { return base_address_; }
- DWORD *get_map () const { return map_map_; }
-
- void alloc_map ()
- {
- /* Allocate one bit per page */
- map_map_ = (DWORD *) calloc (MAPSIZE (PAGE_CNT (size_to_map_)),
- sizeof (DWORD));
- if (wincap.virtual_protect_works_on_shared_pages ())
- {
- DWORD old_prot;
- if (!VirtualProtect (base_address_, size_to_map_,
- PAGE_NOACCESS, &old_prot))
- syscall_printf ("-1 = alloc_map (): %E");
- }
- }
- void free_map () { if (map_map_) free (map_map_); }
-
- DWORD find_empty (DWORD pages);
- __off64_t map_map (__off64_t off, DWORD len);
- BOOL unmap_map (caddr_t addr, DWORD len);
- void fixup_map (void);
- int access (char *address);
-
- fhandler_base *alloc_fh ();
- void free_fh (fhandler_base *fh);
-};
-
-DWORD
-mmap_record::find_empty (DWORD pages)
-{
- DWORD mapped_pages = PAGE_CNT (size_to_map_);
- 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;
-}
-
-__off64_t
-mmap_record::map_map (__off64_t off, DWORD len)
-{
- DWORD prot, old_prot;
- switch (access_mode_)
- {
- case FILE_MAP_WRITE:
- prot = PAGE_READWRITE;
- break;
- case FILE_MAP_READ:
- prot = PAGE_READONLY;
- break;
- default:
- prot = PAGE_WRITECOPY;
- break;
- }
-
- debug_printf ("map_map (fd=%d, off=%D, len=%d)", fdesc_, off, len);
- len = PAGE_CNT (len);
- if (fdesc_ == -1 && !off)
- {
- off = find_empty (len);
- if (off != (DWORD)-1)
- {
- if (wincap.virtual_protect_works_on_shared_pages ()
- && !VirtualProtect (base_address_ + off * getpagesize (),
- len * getpagesize (), prot, &old_prot))
- {
- __seterrno ();
- return (__off64_t)-1;
- }
-
- while (len-- > 0)
- MAP_SET (off + len);
- return off * getpagesize ();
- }
- return 0L;
- }
- off -= offset_;
- DWORD start = off / getpagesize ();
- if (wincap.virtual_protect_works_on_shared_pages ()
- && !VirtualProtect (base_address_ + start * getpagesize (),
- len * getpagesize (), prot, &old_prot))
- {
- __seterrno ();
- return (__off64_t)-1;
- }
-
- for (; len-- > 0; ++start)
- MAP_SET (start);
- return off;
-}
-
-BOOL
-mmap_record::unmap_map (caddr_t addr, DWORD len)
-{
- DWORD old_prot;
- DWORD off = addr - base_address_;
- off /= getpagesize ();
- len = PAGE_CNT (len);
- if (wincap.virtual_protect_works_on_shared_pages ()
- && !VirtualProtect (base_address_ + off * getpagesize (),
- len * getpagesize (), PAGE_NOACCESS, &old_prot))
- syscall_printf ("-1 = unmap_map (): %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 (size_to_map_)); len > 0; )
- if (map_map_[--len])
- return FALSE;
- return TRUE;
-}
-
-void
-mmap_record::fixup_map ()
-{
- if (!wincap.virtual_protect_works_on_shared_pages ())
- return;
-
- DWORD prot, old_prot;
- switch (access_mode_)
- {
- case FILE_MAP_WRITE:
- prot = PAGE_READWRITE;
- break;
- case FILE_MAP_READ:
- prot = PAGE_READONLY;
- break;
- default:
- prot = PAGE_WRITECOPY;
- break;
- }
-
- for (DWORD off = PAGE_CNT (size_to_map_); off > 0; --off)
- VirtualProtect (base_address_ + off * getpagesize (),
- getpagesize (),
- MAP_ISSET (off - 1) ? prot : PAGE_NOACCESS,
- &old_prot);
-}
-
-int
-mmap_record::access (char *address)
-{
- if (address < base_address_ || address >= base_address_ + size_to_map_)
- return 0;
- DWORD off = (address - base_address_) / getpagesize ();
- return MAP_ISSET (off);
-}
-
-static fhandler_disk_file fh_paging_file;
-
-fhandler_base *
-mmap_record::alloc_fh ()
-{
- if (get_fd () == -1)
- {
- fh_paging_file.set_io_handle (INVALID_HANDLE_VALUE);
- return &fh_paging_file;
- }
-
- /* 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. */
- return cygheap->fdtab.build_fhandler (-1, get_device ());
-}
-
-void
-mmap_record::free_fh (fhandler_base *fh)
-{
- if (get_fd () != -1)
- cfree (fh);
-}
-
-class list {
-public:
- mmap_record *recs;
- int nrecs, maxrecs;
- int fd;
- DWORD hash;
- list ();
- ~list ();
- mmap_record *add_record (mmap_record r);
- void erase (int i);
- void erase ();
- mmap_record *match (__off64_t off, DWORD len);
- long match (caddr_t addr, DWORD len, long start);
-};
-
-list::list ()
-: nrecs (0), maxrecs (10), fd (0), hash (0)
-{
- recs = (mmap_record *) malloc (10 * sizeof (mmap_record));
-}
-
-list::~list ()
-{
- for (mmap_record *rec = recs; nrecs-- > 0; ++rec)
- rec->free_map ();
- free (recs);
-}
-
-mmap_record *
-list::add_record (mmap_record r)
-{
- if (nrecs == maxrecs)
- {
- maxrecs += 5;
- recs = (mmap_record *) realloc (recs, maxrecs * sizeof (mmap_record));
- }
- recs[nrecs] = r;
- recs[nrecs].alloc_map ();
- return recs + nrecs++;
-}
-
-/* Used in mmap() */
-mmap_record *
-list::match (__off64_t off, DWORD len)
-{
- if (fd == -1 && !off)
- {
- len = PAGE_CNT (len);
- for (int i = 0; i < nrecs; ++i)
- if (recs[i].find_empty (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_size ()) * getpagesize ()))
- return recs + i;
- }
- return NULL;
-}
-
-/* Used in munmap() */
-long
-list::match (caddr_t addr, DWORD len, __off32_t start)
-{
- for (int i = start + 1; i < nrecs; ++i)
- if (addr >= recs[i].get_address ()
- && addr + len <= recs[i].get_address ()
- + (PAGE_CNT (recs[i].get_size ()) * getpagesize ()))
- return i;
- return -1;
-}
-
-void
-list::erase (int i)
-{
- recs[i].free_map ();
- for (; i < nrecs-1; i++)
- recs[i] = recs[i+1];
- nrecs--;
-}
-
-void
-list::erase ()
-{
- erase (nrecs-1);
-}
-
-class map {
-public:
- list **lists;
- int nlists, maxlists;
- map ();
- ~map ();
- list *get_list_by_fd (int fd);
- list *add_list (list *l, int fd);
- void erase (int i);
-};
-
-map::map ()
-{
- lists = (list **) malloc (10 * sizeof (list *));
- nlists = 0;
- maxlists = 10;
-}
-
-map::~map ()
-{
- free (lists);
-}
-
-list *
-map::get_list_by_fd (int fd)
-{
- int i;
- for (i=0; i<nlists; i++)
-#if 0 /* The fd isn't sufficient since it could already be another file. */
- if (lists[i]->fd == fd
-#else /* so we use the name hash value to identify the file unless
- it's not an anonymous mapping. */
- if ((fd == -1 && lists[i]->fd == -1)
- || (fd != -1 && lists[i]->hash == cygheap->fdtab[fd]->get_namehash ()))
-#endif
- return lists[i];
- return 0;
-}
-
-list *
-map::add_list (list *l, int fd)
-{
- l->fd = fd;
- if (fd != -1)
- l->hash = cygheap->fdtab[fd]->get_namehash ();
- if (nlists == maxlists)
- {
- maxlists += 5;
- lists = (list **) realloc (lists, maxlists * sizeof (list *));
- }
- lists[nlists++] = l;
- return lists[nlists-1];
-}
-
-void
-map::erase (int i)
-{
- for (; i < nlists-1; i++)
- lists[i] = lists[i+1];
- nlists--;
-}
-
-/*
- * Code to keep a record of all mmap'ed areas in a process.
- * Needed to duplicate tham in a child of fork().
- * mmap_record classes are kept in an STL list in an STL map, keyed
- * by file descriptor. This is *NOT* duplicated accross a fork(), it
- * needs to be specially handled by the fork code.
- */
-
-static map *mmapped_areas;
-
-extern "C"
-caddr_t
-mmap64 (caddr_t addr, size_t len, int prot, int flags, int fd, __off64_t off)
-{
- syscall_printf ("addr %x, len %d, prot %x, flags %x, fd %d, off %D",
- addr, len, prot, flags, fd, off);
-
- static DWORD granularity;
- if (!granularity)
- {
- SYSTEM_INFO si;
- GetSystemInfo (&si);
- granularity = si.dwAllocationGranularity;
- }
-
- /* Error conditions according to SUSv2 */
- if (off % getpagesize ()
- || (!(flags & MAP_SHARED) && !(flags & MAP_PRIVATE))
- || ((flags & MAP_SHARED) && (flags & MAP_PRIVATE))
- || ((flags & MAP_FIXED) && ((DWORD)addr % granularity))
- || !len)
- {
- set_errno (EINVAL);
- syscall_printf ("-1 = mmap(): EINVAL");
- return MAP_FAILED;
- }
-
- SetResourceLock (LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
-
- if (mmapped_areas == NULL)
- {
- /* First mmap call, create STL map */
- mmapped_areas = new map;
- if (mmapped_areas == NULL)
- {
- set_errno (ENOMEM);
- syscall_printf ("-1 = mmap(): ENOMEM");
- ReleaseResourceLock (LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
- return MAP_FAILED;
- }
- }
-
- if (flags & MAP_ANONYMOUS)
- fd = -1;
-
- /* Map always in multipliers of `granularity'-sized chunks. */
- __off64_t gran_off = off & ~(granularity - 1);
- DWORD gran_len = howmany (off + len, granularity) * granularity - gran_off;
-
- fhandler_base *fh;
- caddr_t base = addr;
- HANDLE h;
-
- if (fd != -1)
- {
- /* Ensure that fd is open */
- cygheap_fdget cfd (fd);
- if (cfd < 0)
- {
- syscall_printf ("-1 = mmap(): EBADF");
- ReleaseResourceLock (LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
- return MAP_FAILED;
- }
- fh = cfd;
- if (fh->get_device () == FH_DISK)
- {
- DWORD high;
- DWORD low = GetFileSize (fh->get_handle (), &high);
- __off64_t fsiz = ((__off64_t)high << 32) + low;
- fsiz -= gran_off;
- if (gran_len > fsiz)
- gran_len = fsiz;
- }
- else if (fh->get_device () == FH_ZERO)
- /* mmap /dev/zero is like MAP_ANONYMOUS. */
- fd = -1;
- }
- if (fd == -1)
- {
- fh_paging_file.set_io_handle (INVALID_HANDLE_VALUE);
- fh = &fh_paging_file;
- }
-
- list *l = mmapped_areas->get_list_by_fd (fd);
-
- /* First check if this mapping matches into the chunk of another
- already performed mapping. Only valid for MAP_ANON in a special
- case of MAP_PRIVATE. */
- if (l && fd == -1 && off == 0 && !(flags & MAP_FIXED))
- {
- mmap_record *rec;
- if ((rec = l->match (off, len)) != NULL)
- {
- if ((off = rec->map_map (off, len)) == (__off64_t)-1)
- {
- syscall_printf ("-1 = mmap()");
- ReleaseResourceLock (LOCK_MMAP_LIST, READ_LOCK|WRITE_LOCK, "mmap");
- return MAP_FAILED;
- }
- caddr_t ret = rec->get_address () + off;
- syscall_printf ("%x = mmap() succeeded", ret);
- ReleaseResourceLock (LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
- return ret;
- }
- }
-
- DWORD access = (prot & PROT_WRITE) ? FILE_MAP_WRITE : FILE_MAP_READ;
- /* copy-on-write doesn't work at all on 9x using anonymous maps.
- Workaround: Anonymous mappings always use normal READ or WRITE
- access and don't use named file mapping.
- copy-on-write doesn't also 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.
- */
- if ((flags & MAP_PRIVATE)
- && (wincap.has_working_copy_on_write () || fd != -1))
- access = FILE_MAP_COPY;
-
- h = fh->mmap (&base, gran_len, access, flags, gran_off);
-
- if (h == INVALID_HANDLE_VALUE)
- {
- ReleaseResourceLock (LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
- return MAP_FAILED;
- }
-
- /* Now we should have a successfully mmapped area.
- Need to save it so forked children can reproduce it.
- */
- if (fd == -1)
- gran_len = PAGE_CNT (gran_len) * getpagesize ();
- mmap_record mmap_rec (fd, h, access, gran_off, gran_len, base);
-
- /* Get list of mmapped areas for this fd, create a new one if
- one does not exist yet.
- */
- if (l == 0)
- {
- /* Create a new one */
- l = new list;
- if (l == 0)
- {
- fh->munmap (h, base, gran_len);
- set_errno (ENOMEM);
- syscall_printf ("-1 = mmap(): ENOMEM");
- ReleaseResourceLock (LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
- return MAP_FAILED;
- }
- l = mmapped_areas->add_list (l, fd);
- }
-
- /* Insert into the list */
- mmap_record *rec = l->add_record (mmap_rec);
- if ((off = rec->map_map (off, len)) == (__off64_t)-1)
- {
- fh->munmap (h, base, gran_len);
- l->erase ();
- syscall_printf ("-1 = mmap()");
- ReleaseResourceLock (LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
- return MAP_FAILED;
- }
- caddr_t ret = rec->get_address () + off;
- syscall_printf ("%x = mmap() succeeded", ret);
- ReleaseResourceLock (LOCK_MMAP_LIST, READ_LOCK | WRITE_LOCK, "mmap");
- return ret;
-}
-
-extern "C"
-caddr_t
-mmap (caddr_t addr, size_t len, int prot, int flags, int fd, __off32_t off)
-{
- return mmap64 (addr, len, prot, flags, fd, (__off64_t)off);
-}
-
-/* munmap () removes an mmapped area. It insists that base area
- requested is the same as that mmapped, error if not. */
-
-extern "C"
-int
-munmap (caddr_t addr, size_t len)
-{
- syscall_printf ("munmap (addr %x, len %d)", addr, len);
-
- /* Error conditions according to SUSv2 */
- if (((DWORD)addr % getpagesize ()) || !len)
- {
- set_errno (EINVAL);
- syscall_printf ("-1 = munmap(): Invalid parameters");
- return -1;
- }
-
- SetResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "munmap");
- /* Check if a mmap'ed area was ever created */
- if (mmapped_areas == NULL)
- {
- syscall_printf ("-1 = munmap(): mmapped_areas == NULL");
- set_errno (EINVAL);
- ReleaseResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "munmap");
- return -1;
- }
-
- /* Iterate through the map, looking for the mmapped area.
- Error if not found. */
-
- for (int it = 0; it < mmapped_areas->nlists; ++it)
- {
- list *l = mmapped_areas->lists[it];
- if (l)
- {
- long li = -1;
- if ((li = l->match(addr, len, li)) >= 0)
- {
- mmap_record *rec = l->recs + li;
- if (rec->unmap_map (addr, len))
- {
- fhandler_base *fh = rec->alloc_fh ();
- fh->munmap (rec->get_handle (), addr, len);
- rec->free_fh (fh);
-
- /* Delete the entry. */
- l->erase (li);
- }
- syscall_printf ("0 = munmap(): %x", addr);
- ReleaseResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "munmap");
- return 0;
- }
- }
- }
-
- set_errno (EINVAL);
- syscall_printf ("-1 = munmap(): EINVAL");
-
- ReleaseResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "munmap");
- return -1;
-}
-
-/* Sync file with memory. Ignore flags for now. */
-
-extern "C"
-int
-msync (caddr_t addr, size_t len, int flags)
-{
- syscall_printf ("addr = %x, len = %d, flags = %x",
- addr, len, flags);
-
- /* However, check flags for validity. */
- if ((flags & ~(MS_ASYNC | MS_SYNC | MS_INVALIDATE))
- || ((flags & MS_ASYNC) && (flags & MS_SYNC)))
- {
- syscall_printf ("-1 = msync(): Invalid flags");
- set_errno (EINVAL);
- return -1;
- }
-
- SetResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "msync");
- /* Check if a mmap'ed area was ever created */
- if (mmapped_areas == NULL)
- {
- syscall_printf ("-1 = msync(): mmapped_areas == NULL");
- set_errno (EINVAL);
- ReleaseResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "msync");
- return -1;
- }
-
- /* Iterate through the map, looking for the mmapped area.
- Error if not found. */
-
- for (int it = 0; it < mmapped_areas->nlists; ++it)
- {
- list *l = mmapped_areas->lists[it];
- if (l != 0)
- {
- for (int li = 0; li < l->nrecs; ++li)
- {
- mmap_record *rec = l->recs + li;
- if (rec->access (addr))
- {
- /* Check whole area given by len. */
- for (DWORD i = getpagesize (); i < len; ++i)
- if (!rec->access (addr + i))
- goto invalid_address_range;
- fhandler_base *fh = rec->alloc_fh ();
- int ret = fh->msync (rec->get_handle (), addr, len, flags);
- rec->free_fh (fh);
-
- if (ret)
- syscall_printf ("%d = msync(): %E", ret);
- else
- syscall_printf ("0 = msync()");
-
- ReleaseResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "msync");
- return 0;
- }
- }
- }
- }
-
-invalid_address_range:
- /* SUSv2: Return code if indicated memory was not mapped is ENOMEM. */
- set_errno (ENOMEM);
- syscall_printf ("-1 = msync(): ENOMEM");
-
- ReleaseResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "msync");
- return -1;
-}
-
-/*
- * 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, DWORD access,
- 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, DWORD access, DWORD offset,
- DWORD size, void *address)
-{
- set_errno (ENODEV);
- return -1;
-}
-
-/* Implementation for disk files. */
-HANDLE
-fhandler_disk_file::mmap (caddr_t *addr, size_t len, DWORD access,
- int flags, __off64_t off)
-{
- DWORD protect;
-
- if (access & FILE_MAP_COPY)
- protect = PAGE_WRITECOPY;
- else if (access & FILE_MAP_WRITE)
- protect = PAGE_READWRITE;
- else
- protect = PAGE_READONLY;
-
- HANDLE h;
-
- /* 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 (wincap.share_mmaps_only_by_name ()
- && get_handle () != INVALID_HANDLE_VALUE
- && !(access & FILE_MAP_COPY))
- {
- /* 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[MAX_PATH];
- cygwin_conv_to_full_posix_path (get_name (), namebuf);
- for (int i = strlen (namebuf) - 1; i >= 0; --i)
- namebuf[i] = cyg_tolower (namebuf [i]);
-
- debug_printf ("named sharing");
- if (!(h = OpenFileMapping (access, TRUE, namebuf)))
- h = CreateFileMapping (get_handle (), &sec_none, protect, 0, 0, namebuf);
- }
- else
- h = CreateFileMapping (get_handle (), &sec_none, protect, 0,
- get_handle () == INVALID_HANDLE_VALUE ? len : 0,
- NULL);
- if (!h)
- {
- __seterrno ();
- syscall_printf ("-1 = mmap(): CreateFileMapping failed with %E");
- return INVALID_HANDLE_VALUE;
- }
-
- DWORD high = off >> 32, low = off & 0xffffffff;
- void *base = MapViewOfFileEx (h, access, high, low, len,
- (flags & MAP_FIXED) ? *addr : NULL);
- debug_printf ("%x = MapViewOfFileEx (h:%x, access:%x, 0, off:%D, len:%d, addr:%x)", base, h, access, off, len, (flags & MAP_FIXED) ? *addr : NULL);
- if (!base || ((flags & MAP_FIXED) && base != *addr))
- {
- if (!base)
- {
- __seterrno ();
- syscall_printf ("-1 = mmap(): MapViewOfFileEx failed with %E");
- }
- else
- {
- set_errno (EINVAL);
- syscall_printf ("-1 = mmap(): 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, DWORD access, DWORD offset,
- DWORD size, void *address)
-{
- /* Re-create the MapViewOfFileEx call */
- void *base = MapViewOfFileEx (h, access, 0, offset, size, address);
- if (base != address)
- {
- MEMORY_BASIC_INFORMATION m;
- (void) 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;
-}
-
-/* Set memory protection */
-
-extern "C"
-int
-mprotect (caddr_t addr, size_t len, int prot)
-{
- DWORD old_prot;
- DWORD new_prot = 0;
-
- syscall_printf ("mprotect (addr %x, len %d, prot %x)", addr, len, prot);
-
- if (prot == PROT_NONE)
- new_prot = PAGE_NOACCESS;
- else
- {
- switch (prot)
- {
- case PROT_READ | PROT_WRITE | PROT_EXEC:
- new_prot = PAGE_EXECUTE_READWRITE;
- break;
- case PROT_READ | PROT_WRITE:
- new_prot = PAGE_READWRITE;
- break;
- case PROT_READ | PROT_EXEC:
- new_prot = PAGE_EXECUTE_READ;
- break;
- case PROT_READ:
- new_prot = PAGE_READONLY;
- break;
- default:
- syscall_printf ("-1 = mprotect (): invalid prot value");
- set_errno (EINVAL);
- return -1;
- }
- }
-
- if (VirtualProtect (addr, len, new_prot, &old_prot) == 0)
- {
- __seterrno ();
- syscall_printf ("-1 = mprotect (): %E");
- return -1;
- }
-
- syscall_printf ("0 = mprotect ()");
- return 0;
-}
-
-/*
- * 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)
-{
-
- debug_printf ("recreate_mmaps_after_fork, mmapped_areas %p", mmapped_areas);
-
- /* Check if a mmapped area was ever created */
- if (mmapped_areas == NULL)
- return 0;
-
- /* Iterate through the map */
- for (int it = 0; it < mmapped_areas->nlists; ++it)
- {
- list *l = mmapped_areas->lists[it];
- if (l != 0)
- {
- int li;
- for (li = 0; li < l->nrecs; ++li)
- {
- mmap_record *rec = l->recs + li;
-
- debug_printf ("fd %d, h %x, access %x, offset %d, size %d, address %p",
- rec->get_fd (), rec->get_handle (), rec->get_access (),
- rec->get_offset (), rec->get_size (), rec->get_address ());
-
- fhandler_base *fh = rec->alloc_fh ();
- BOOL ret = fh->fixup_mmap_after_fork (rec->get_handle (),
- rec->get_access (),
- rec->get_offset (),
- rec->get_size (),
- rec->get_address ());
- rec->free_fh (fh);
-
- if (!ret)
- return -1;
- if (rec->get_access () == FILE_MAP_COPY)
- {
- for (char *address = rec->get_address ();
- address < rec->get_address () + rec->get_size ();
- address += getpagesize ())
- if (rec->access (address)
- && !ReadProcessMemory (parent, address, address,
- getpagesize (), NULL))
- {
- system_printf ("ReadProcessMemory failed for MAP_PRIVATE address %p, %E",
- rec->get_address ());
- return -1;
- }
- }
- rec->fixup_map ();
- }
- }
- }
-
- debug_printf ("succeeded");
- return 0;
-}
diff --git a/winsup/cygwin/msg.cc b/winsup/cygwin/msg.cc
deleted file mode 100644
index c76fd8ee7..000000000
--- a/winsup/cygwin/msg.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-/* msg.cc: Single unix specification IPC interface for Cygwin.
-
- Copyright 2002 Red Hat, Inc.
-
- Written by Conrad Scott <conrad.scott@dsl.pipex.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 <sys/types.h>
-#include <cygwin/msg.h>
-
-#include <errno.h>
-
-#include "cygerrno.h"
-
-extern "C" int
-msgctl (int msqid, int cmd, struct msqid_ds *buf)
-{
- set_errno (ENOSYS);
- return -1;
-}
-
-extern "C" int
-msgget (key_t key, int msgflg)
-{
- set_errno (ENOSYS);
- return -1;
-}
-
-extern "C" ssize_t
-msgrcv (int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)
-{
- set_errno (ENOSYS);
- return -1;
-}
-
-extern "C" int
-msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg)
-{
- set_errno (ENOSYS);
- return -1;
-}
diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc
deleted file mode 100644
index b775fb9a7..000000000
--- a/winsup/cygwin/net.cc
+++ /dev/null
@@ -1,2277 +0,0 @@
-/* net.cc: network-related routines.
-
- 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. */
-
-/* #define DEBUG_NEST_ON 1 */
-
-#define __INSIDE_CYGWIN_NET__
-
-#include "winsup.h"
-#include <errno.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <iphlpapi.h>
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <netdb.h>
-#define USE_SYS_TYPES_FD_SET
-#include <winsock2.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include "registry.h"
-#include "wsock_event.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 __stdcall rresvport (int *);
- int sscanf (const char *, const char *, ...);
-} /* End of "C" section */
-
-LPWSAOVERLAPPED
-wsock_event::prepare ()
-{
- LPWSAOVERLAPPED ret = NULL;
-
- SetLastError (0);
- if ((event = WSACreateEvent ()) != WSA_INVALID_EVENT)
- {
- memset (&ovr, 0, sizeof ovr);
- ovr.hEvent = event;
- ret = &ovr;
- }
- else if (GetLastError () == ERROR_PROC_NOT_FOUND) /* winsock2 not available */
- WSASetLastError (0);
-
- debug_printf ("%d = wsock_event::prepare ()", ret);
- return ret;
-}
-
-int
-wsock_event::wait (int socket, LPDWORD flags)
-{
- int ret = -1;
- WSAEVENT ev[2] = { event, signal_arrived };
-
- switch (WSAWaitForMultipleEvents (2, ev, FALSE, WSA_INFINITE, FALSE))
- {
- case WSA_WAIT_EVENT_0:
- DWORD len;
- if (WSAGetOverlappedResult (socket, &ovr, &len, FALSE, flags))
- ret = (int) len;
- break;
- case WSA_WAIT_EVENT_0 + 1:
- if (!CancelIo ((HANDLE) socket))
- {
- debug_printf ("CancelIo() %E, fallback to blocking io");
- WSAGetOverlappedResult (socket, &ovr, &len, TRUE, flags);
- }
- else
- WSASetLastError (WSAEINTR);
- break;
- case WSA_WAIT_FAILED:
- break;
- default: /* Should be impossible. *LOL* */
- WSASetLastError (WSAEFAULT);
- break;
- }
- WSACloseEvent (event);
- event = NULL;
- return ret;
-}
-
-WSADATA wsadata;
-
-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;
-}
-
-static SOCKET __stdcall
-set_socket_inheritance (SOCKET sock)
-{
- SOCKET osock = sock;
-
- if (!DuplicateHandle (hMainProc, (HANDLE) sock, hMainProc, (HANDLE *) &sock,
- 0, TRUE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
- system_printf ("DuplicateHandle failed %E");
- else
- debug_printf ("DuplicateHandle succeeded osock %p, sock %p", osock, sock);
- return sock;
-}
-
-/* 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);
-}
-
-static void
-dump_protoent (struct protoent *p)
-{
- if (p)
- debug_printf ("protoent %s %x %x", p->p_name, p->p_aliases, p->p_proto);
-}
-
-/* exported as inet_ntoa: BSD 4.3 */
-extern "C" char *
-cygwin_inet_ntoa (struct in_addr in)
-{
-#ifdef _MT_SAFE
-#define ntoa_buf _reent_winsup ()->_ntoa_buf
-#else
- static char *ntoa_buf = NULL;
-#endif
-
- char *res = inet_ntoa (in);
-
- if (ntoa_buf)
- {
- free (ntoa_buf);
- ntoa_buf = NULL;
- }
- if (res)
- ntoa_buf = strdup (res);
- return ntoa_buf;
-}
-
-/* exported as inet_addr: BSD 4.3 */
-extern "C" unsigned long
-cygwin_inet_addr (const char *cp)
-{
- if (check_null_str_errno (cp))
- 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)
-{
- if (check_null_str_errno (cp) || check_null_invalid_struct_errno (inp))
- 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)
-{
- if (check_null_str_errno (cp))
- 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;
-}
-
-static void
-free_char_list (char **clist)
-{
- if (clist)
- {
- for (char **cl = clist; *cl; ++cl)
- free (*cl);
- free (clist);
- }
-}
-
-static char **
-dup_char_list (char **src)
-{
- char **dst;
- int cnt = 0;
-
- for (char **cl = src; *cl; ++cl)
- ++cnt;
- if (!(dst = (char **) calloc (cnt + 1, sizeof *dst)))
- return NULL;
- while (cnt-- > 0)
- if (!(dst[cnt] = strdup (src[cnt])))
- return NULL;
- return dst;
-}
-
-#define free_addr_list(addr_list) free_char_list (addr_list)
-
-static char **
-dup_addr_list (char **src, unsigned int size)
-{
- char **dst;
- int cnt = 0;
-
- for (char **cl = src; *cl; ++cl)
- ++cnt;
- if (!(dst = (char **) calloc (cnt + 1, sizeof *dst)))
- return NULL;
- while (cnt-- > 0)
- {
- if (!(dst[cnt] = (char *) malloc (size)))
- return NULL;
- memcpy (dst[cnt], src[cnt], size);
- }
- return dst;
-}
-
-static void
-free_protoent_ptr (struct protoent *&p)
-{
- if (p)
- {
- debug_printf ("protoent: %s", p->p_name);
-
- if (p->p_name)
- free (p->p_name);
- free_char_list (p->p_aliases);
- free ((void *) p);
- p = NULL;
- }
-}
-
-static struct protoent *
-dup_protoent_ptr (struct protoent *src)
-{
- if (!src)
- return NULL;
-
- struct protoent *dst = (struct protoent *) calloc (1, sizeof *dst);
-
- if (!dst)
- return NULL;
-
- debug_printf ("protoent: %s", src->p_name);
-
- dst->p_proto = src->p_proto;
- if (src->p_name && !(dst->p_name = strdup (src->p_name)))
- goto out;
- if (src->p_aliases && !(dst->p_aliases = dup_char_list (src->p_aliases)))
- goto out;
-
- debug_printf ("protoent: copied %s", dst->p_name);
-
- return dst;
-
-out:
- free_protoent_ptr (dst);
- return NULL;
-}
-
-#ifdef _MT_SAFE
-#define protoent_buf _reent_winsup ()->_protoent_buf
-#else
-static struct protoent *protoent_buf = NULL;
-#endif
-
-/* exported as getprotobyname: standards? */
-extern "C" struct protoent *
-cygwin_getprotobyname (const char *p)
-{
- if (check_null_str_errno (p))
- return NULL;
- free_protoent_ptr (protoent_buf);
- protoent_buf = dup_protoent_ptr (getprotobyname (p));
- if (!protoent_buf)
- set_winsock_errno ();
-
- dump_protoent (protoent_buf);
- return protoent_buf;
-}
-
-/* exported as getprotobynumber: standards? */
-extern "C" struct protoent *
-cygwin_getprotobynumber (int number)
-{
- free_protoent_ptr (protoent_buf);
- protoent_buf = dup_protoent_ptr (getprotobynumber (number));
- if (!protoent_buf)
- set_winsock_errno ();
-
- dump_protoent (protoent_buf);
- return protoent_buf;
-}
-
-fhandler_socket *
-fdsock (int &fd, const char *name, SOCKET soc)
-{
- if (!winsock2_active)
- soc = set_socket_inheritance (soc);
- else 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 since winsock2_active %d",
- winsock2_active);
- }
- else
- debug_printf ("not setting socket inheritance since winsock2_active %d",
- winsock2_active);
- fhandler_socket *fh =
- (fhandler_socket *) cygheap->fdtab.build_fhandler (fd, FH_SOCKET, name);
- if (!fh)
- return NULL;
- fh->set_io_handle ((HANDLE) soc);
- fh->set_flags (O_RDWR | O_BINARY);
- fh->set_r_no_interrupt (winsock2_active);
- debug_printf ("fd %d, name '%s', soc %p", fd, name, soc);
- return fh;
-}
-
-/* exported as socket: standards? */
-extern "C" int
-cygwin_socket (int af, int type, int protocol)
-{
- int res = -1;
- SOCKET soc = 0;
- fhandler_socket *fh = NULL;
-
- cygheap_fdnew fd;
-
- if (fd >= 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 char *name;
-
- if (af == AF_INET)
- name = (type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp");
- else
- name = (type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket");
-
- fh = fdsock (fd, name, soc);
- if (!fh)
- {
- closesocket (soc);
- res = -1;
- }
- else
- {
- fh->set_addr_family (af);
- fh->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 (0);
- sigframe thisframe (mainthread);
-
- fhandler_socket *fh = get (fd);
-
- if ((len && __check_invalid_read_ptr_errno (buf, (unsigned) len))
- || (to && __check_invalid_read_ptr_errno (to, tolen))
- || !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 (0);
- sigframe thisframe (mainthread);
-
- fhandler_socket *fh = get (fd);
-
- if ((len && __check_null_invalid_struct_errno (buf, (unsigned) len))
- || (from
- && (check_null_invalid_struct_errno (fromlen)
- || __check_null_invalid_struct_errno (from, (unsigned) *fromlen)))
- || !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;
-}
-
-/* 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);
- const char *name = "error";
-
- /* For the following debug_printf */
- switch (optname)
- {
- case SO_DEBUG:
- name = "SO_DEBUG";
- break;
- case SO_ACCEPTCONN:
- name = "SO_ACCEPTCONN";
- break;
- case SO_REUSEADDR:
- name = "SO_REUSEADDR";
- break;
- case SO_KEEPALIVE:
- name = "SO_KEEPALIVE";
- break;
- case SO_DONTROUTE:
- name = "SO_DONTROUTE";
- break;
- case SO_BROADCAST:
- name = "SO_BROADCAST";
- break;
- case SO_USELOOPBACK:
- name = "SO_USELOOPBACK";
- break;
- case SO_LINGER:
- name = "SO_LINGER";
- break;
- case SO_OOBINLINE:
- name = "SO_OOBINLINE";
- break;
- case SO_ERROR:
- name = "SO_ERROR";
- break;
- }
-
- if ((optval && __check_invalid_read_ptr_errno (optval, optlen)) || !fh)
- res = -1;
- else
- {
- res = setsockopt (fh->get_socket (), level, optname,
- (const char *) optval, optlen);
-
- if (optlen == 4)
- syscall_printf ("setsockopt optval=%x", *(long *) optval);
-
- if (res)
- set_winsock_errno ();
- }
-
- syscall_printf ("%d = setsockopt (%d, %d, %x (%s), %p, %d)",
- res, fd, level, optname, name, 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);
- const char *name = "error";
-
- /* For the following debug_printf */
- switch (optname)
- {
- case SO_DEBUG:
- name = "SO_DEBUG";
- break;
- case SO_ACCEPTCONN:
- name = "SO_ACCEPTCONN";
- break;
- case SO_REUSEADDR:
- name = "SO_REUSEADDR";
- break;
- case SO_KEEPALIVE:
- name = "SO_KEEPALIVE";
- break;
- case SO_DONTROUTE:
- name = "SO_DONTROUTE";
- break;
- case SO_BROADCAST:
- name = "SO_BROADCAST";
- break;
- case SO_USELOOPBACK:
- name = "SO_USELOOPBACK";
- break;
- case SO_LINGER:
- name = "SO_LINGER";
- break;
- case SO_OOBINLINE:
- name = "SO_OOBINLINE";
- break;
- case SO_ERROR:
- name = "SO_ERROR";
- break;
- }
-
- if ((optval
- && (check_null_invalid_struct_errno (optlen)
- || __check_null_invalid_struct_errno (optval, (unsigned) *optlen)))
- || !fh)
- res = -1;
- else
- {
- res = getsockopt (fh->get_socket (), level, optname, (char *) optval,
- (int *) optlen);
-
- if (optname == SO_ERROR)
- {
- int *e = (int *) optval;
-
- *e = find_winsock_errno (*e);
- }
-
- if (res)
- set_winsock_errno ();
- }
-
- syscall_printf ("%d = getsockopt (%d, %d, %x (%s), %p, %p)",
- res, fd, level, optname, name, optval, optlen);
- return res;
-}
-
-/* exported as connect: standards? */
-extern "C" int
-cygwin_connect (int fd, const struct sockaddr *name, int namelen)
-{
- int res;
- sig_dispatch_pending (0);
- sigframe thisframe (mainthread);
-
- fhandler_socket *fh = get (fd);
-
- if (__check_invalid_read_ptr_errno (name, namelen) || !fh)
- res = -1;
- else
- res = fh->connect (name, namelen);
-
- syscall_printf ("%d = connect (%d, %p, %d)", res, fd, name, namelen);
-
- return res;
-}
-
-static void
-free_servent_ptr (struct servent *&p)
-{
- if (p)
- {
- debug_printf ("servent: %s", p->s_name);
-
- if (p->s_name)
- free (p->s_name);
- if (p->s_proto)
- free (p->s_proto);
- free_char_list (p->s_aliases);
- free ((void *) p);
- p = NULL;
- }
-}
-
-#pragma pack(push,2)
-struct pservent
-{
- char *s_name;
- char **s_aliases;
- short s_port;
- char *s_proto;
-};
-
-#pragma pack(pop)
-static struct servent *
-dup_servent_ptr (struct servent *src)
-{
- if (!src)
- return NULL;
-
- struct servent *dst = (struct servent *) calloc (1, sizeof *dst);
-
- if (!dst)
- return NULL;
-
- debug_printf ("servent: %s", src->s_name);
-
- dst->s_port = src->s_port;
- if (src->s_name && !(dst->s_name = strdup (src->s_name)))
- goto out;
- if (src->s_aliases && !(dst->s_aliases = dup_char_list (src->s_aliases)))
- goto out;
- char *s_proto;
-
- if (IsBadReadPtr (src->s_proto, sizeof (src->s_proto))
- && !IsBadReadPtr (((pservent *) src)->s_proto, sizeof (src->s_proto)))
- s_proto = ((pservent *) src)->s_proto;
- else
- s_proto = src->s_proto;
-
- if (s_proto && !(dst->s_proto = strdup (s_proto)))
- goto out;
-
- debug_printf ("servent: copied %s", dst->s_name);
-
- return dst;
-
-out:
- free_servent_ptr (dst);
- return NULL;
-}
-
-#ifdef _MT_SAFE
-#define servent_buf _reent_winsup ()->_servent_buf
-#else
-static struct servent *servent_buf = NULL;
-#endif
-
-/* exported as getservbyname: standards? */
-extern "C" struct servent *
-cygwin_getservbyname (const char *name, const char *proto)
-{
- sig_dispatch_pending (0);
- sigframe thisframe (mainthread);
- if (check_null_str_errno (name)
- || (proto != NULL && check_null_str_errno (proto)))
- return NULL;
-
- free_servent_ptr (servent_buf);
- servent_buf = dup_servent_ptr (getservbyname (name, proto));
- if (!servent_buf)
- set_winsock_errno ();
-
- syscall_printf ("%x = getservbyname (%s, %s)", servent_buf, name, proto);
- return servent_buf;
-}
-
-/* exported as getservbyport: standards? */
-extern "C" struct servent *
-cygwin_getservbyport (int port, const char *proto)
-{
- sig_dispatch_pending (0);
- sigframe thisframe (mainthread);
- if (proto != NULL && check_null_str_errno (proto))
- return NULL;
-
- free_servent_ptr (servent_buf);
- servent_buf = dup_servent_ptr (getservbyport (port, proto));
- if (!servent_buf)
- set_winsock_errno ();
-
- syscall_printf ("%x = getservbyport (%d, %s)", servent_buf, port, proto);
- return servent_buf;
-}
-
-extern "C" int
-cygwin_gethostname (char *name, size_t len)
-{
- int PASCAL win32_gethostname (char *, int);
-
- sig_dispatch_pending (0);
- sigframe thisframe (mainthread);
- if (__check_null_invalid_struct_errno (name, len))
- return -1;
-
- if (wsock32_handle == NULL || win32_gethostname (name, len) == SOCKET_ERROR)
- {
- DWORD local_len = len;
-
- if (!GetComputerNameA (name, &local_len))
- {
- set_winsock_errno ();
- return -1;
- }
- }
- debug_printf ("name %s", name);
- h_errno = 0;
- return 0;
-}
-
-static void
-free_hostent_ptr (struct hostent *&p)
-{
- if (p)
- {
- debug_printf ("hostent: %s", p->h_name);
-
- if (p->h_name)
- free ((void *) p->h_name);
- free_char_list (p->h_aliases);
- free_addr_list (p->h_addr_list);
- free ((void *) p);
- p = NULL;
- }
-}
-
-static struct hostent *
-dup_hostent_ptr (struct hostent *src)
-{
- if (!src)
- return NULL;
-
- struct hostent *dst = (struct hostent *) calloc (1, sizeof *dst);
-
- if (!dst)
- return NULL;
-
- debug_printf ("hostent: %s", src->h_name);
-
- dst->h_addrtype = src->h_addrtype;
- dst->h_length = src->h_length;
- if (src->h_name && !(dst->h_name = strdup (src->h_name)))
- goto out;
- if (src->h_aliases && !(dst->h_aliases = dup_char_list (src->h_aliases)))
- goto out;
- if (src->h_addr_list
- && !(dst->h_addr_list = dup_addr_list (src->h_addr_list, src->h_length)))
- goto out;
-
- debug_printf ("hostent: copied %s", dst->h_name);
-
- return dst;
-
-out:
- free_hostent_ptr (dst);
- return NULL;
-}
-
-#ifdef _MT_SAFE
-#define hostent_buf _reent_winsup ()->_hostent_buf
-#else
-static struct hostent *hostent_buf = NULL;
-#endif
-
-/* exported as gethostbyname: standards? */
-extern "C" struct hostent *
-cygwin_gethostbyname (const char *name)
-{
- static unsigned char tmp_addr[4];
- static struct hostent tmp;
- static char *tmp_aliases[1];
- static char *tmp_addr_list[2];
- static int a, b, c, d;
-
- sig_dispatch_pending (0);
- sigframe thisframe (mainthread);
- if (check_null_str_errno (name))
- return NULL;
-
- if (sscanf (name, "%d.%d.%d.%d", &a, &b, &c, &d) == 4)
- {
- /* 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;
- return &tmp;
- }
-
- free_hostent_ptr (hostent_buf);
- hostent_buf = dup_hostent_ptr (gethostbyname (name));
- if (!hostent_buf)
- {
- set_winsock_errno ();
- set_host_errno ();
- }
- else
- {
- debug_printf ("h_name %s", hostent_buf->h_name);
- h_errno = 0;
- }
- return hostent_buf;
-}
-
-/* exported as gethostbyaddr: standards? */
-extern "C" struct hostent *
-cygwin_gethostbyaddr (const char *addr, int len, int type)
-{
- sig_dispatch_pending (0);
- sigframe thisframe (mainthread);
- if (__check_invalid_read_ptr_errno (addr, len))
- return NULL;
-
- free_hostent_ptr (hostent_buf);
- hostent_buf = dup_hostent_ptr (gethostbyaddr (addr, len, type));
- if (!hostent_buf)
- {
- set_winsock_errno ();
- set_host_errno ();
- }
- else
- {
- debug_printf ("h_name %s", hostent_buf->h_name);
- h_errno = 0;
- }
- return hostent_buf;
-}
-
-/* exported as accept: standards? */
-extern "C" int
-cygwin_accept (int fd, struct sockaddr *peer, int *len)
-{
- int res;
- sig_dispatch_pending (0);
- sigframe thisframe (mainthread);
-
- fhandler_socket *fh = get (fd);
-
- if ((peer && (check_null_invalid_struct_errno (len)
- || __check_null_invalid_struct_errno (peer, (unsigned) *len)))
- || !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 (0);
- sigframe thisframe (mainthread);
- fhandler_socket *fh = get (fd);
-
- if (__check_invalid_read_ptr_errno (my_addr, addrlen) || !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 (0);
- sigframe thisframe (mainthread);
-
- fhandler_socket *fh = get (fd);
-
- if (check_null_invalid_struct_errno (namelen)
- || __check_null_invalid_struct_errno (addr, (unsigned) *namelen)
- || !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 (0);
- sigframe thisframe (mainthread);
- 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 (0);
- sigframe thisframe (mainthread);
-
- 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)
-{
- if (s && check_null_str (s))
- 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 (0);
- sigframe thisframe (mainthread);
-
- fhandler_socket *fh = get (fd);
-
- if (check_null_invalid_struct_errno (len)
- || __check_null_invalid_struct_errno (name, (unsigned) *len)
- || !fh)
- res = -1;
- else
- res = fh->getpeername (name, len);
-
- syscall_printf ("%d = getpeername %d", res, (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 (0);
- sigframe thisframe (mainthread);
- if (__check_null_invalid_struct_errno (domain, len))
- return -1;
-
- 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);
-
- /* FIXME: Are registry keys case sensitive? */
- if (r.error () || r.get_string ("Domain", domain, len, "") != ERROR_SUCCESS)
- {
- __seterrno ();
- return -1;
- }
-
- return 0;
-}
-
-/* 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\<Netcard>, where netcard is the name of the net device.
- * Then look under:
- * HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<NetCard>\
- * 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 (0);
- sigframe thisframe (mainthread);
- if (check_null_invalid_struct_errno (ifc))
- 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;
- }
-
- OSVERSIONINFO os_version_info;
-
- memset (&os_version_info, 0, sizeof os_version_info);
- os_version_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
- GetVersionEx (&os_version_info);
- 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 (0);
- sigframe thisframe (mainthread);
-
- if (check_null_invalid_struct_errno (ahost) ||
- check_null_empty_str_errno (*ahost) ||
- (locuser && check_null_empty_str_errno (locuser)) ||
- (remuser && check_null_str_errno (remuser)))
- return (int) INVALID_SOCKET;
-
- cygheap_fdnew res_fd;
-
- if (res_fd < 0)
- goto done;
-
- if (fd2p)
- {
- cygheap_fdnew newfd (res_fd, false);
-
- if (*fd2p < 0)
- goto done;
- *fd2p = newfd;
- }
-
- res = rcmd (ahost, inport, locuser, remuser, cmd, fd2p ? &fd2s : NULL);
- if (res == (int) INVALID_SOCKET)
- goto done;
- else
- {
- fdsock (res_fd, "/dev/tcp", res);
- res = res_fd;
- }
-
- if (fd2p)
- fdsock (*fd2p, "/dev/tcp", fd2s);
-
-done:
- syscall_printf ("%d = rcmd (...)", res);
- return res;
-}
-
-/* exported as rresvport: standards? */
-extern "C" int
-cygwin_rresvport (int *port)
-{
- int res;
- sig_dispatch_pending (0);
- sigframe thisframe (mainthread);
-
- if (check_null_invalid_struct_errno (port))
- return -1;
-
- cygheap_fdnew res_fd;
-
- if (res_fd < 0)
- res = -1;
- else
- {
- res = rresvport (port);
-
- if (res != (int) INVALID_SOCKET)
- {
- fdsock (res_fd, "/dev/tcp", res);
- res = res_fd;
- }
- }
-
- 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 (0);
- sigframe thisframe (mainthread);
-
- if (check_null_invalid_struct_errno (ahost) ||
- check_null_empty_str_errno (*ahost) ||
- (locuser && check_null_empty_str_errno (locuser)) ||
- (password && check_null_str_errno (password)))
- return (int) INVALID_SOCKET;
-
- cygheap_fdnew res_fd;
-
- if (res_fd < 0)
- goto done;
- if (fd2p)
- {
- cygheap_fdnew newfd (res_fd);
-
- if (newfd < 0)
- goto done;
- *fd2p = newfd;
- }
- res = rexec (ahost, inport, locuser, password, cmd, fd2p ? &fd2s : NULL);
- if (res == (int) INVALID_SOCKET)
- goto done;
- else
- {
- fdsock (res_fd, "/dev/tcp", res);
- res = res_fd;
- }
- if (fd2p)
- fdsock (*fd2p, "/dev/tcp", fd2s);
-
-done:
- 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;
- cygheap_fdnew sb0;
- fhandler_socket *fh;
-
- sig_dispatch_pending (0);
- sigframe thisframe (mainthread);
- if (__check_null_invalid_struct_errno (sb, 2 * sizeof (int)))
- 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;
- }
-
- if (sb0 < 0)
- goto done;
- else
- {
- sb[0] = sb0;
- cygheap_fdnew sb1 (sb0, false);
-
- if (sb1 < 0)
- goto done;
-
- sb[1] = sb1;
- }
-
- /* 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;
- }
-
- res = 0;
-
- if (family == AF_LOCAL)
- {
-
- fh = fdsock (sb[0],
- type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket",
- insock);
- fh->set_sun_path ("");
- fh->set_addr_family (AF_LOCAL);
- fh->set_socket_type (type);
- fh = fdsock (sb[1],
- type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket",
- outsock);
- fh->set_sun_path ("");
- fh->set_addr_family (AF_LOCAL);
- fh->set_socket_type (type);
- }
- else
- {
- fh = fdsock (sb[0], type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp",
- insock);
- fh->set_addr_family (AF_INET);
- fh->set_socket_type (type);
- fh = fdsock (sb[1], type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp",
- outsock);
- fh->set_addr_family (AF_INET);
- fh->set_socket_type (type);
- }
-
-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 (0);
- sigframe thisframe (mainthread);
-
- fhandler_socket *fh = get (fd);
-
- if (check_null_invalid_struct_errno (msg)
- || (msg->msg_name
- && __check_null_invalid_struct_errno (msg->msg_name,
- (unsigned) msg->msg_namelen))
- || !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 (0);
- sigframe thisframe (mainthread);
-
- fhandler_socket *fh = get (fd);
-
- if (__check_invalid_read_ptr_errno (msg, sizeof msg)
- || (msg->msg_name
- && __check_invalid_read_ptr_errno (msg->msg_name,
- (unsigned) msg->msg_namelen))
- || !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;
-}
diff --git a/winsup/cygwin/netdb.cc b/winsup/cygwin/netdb.cc
deleted file mode 100644
index 689fb3e03..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 <windows.h>
-#include <sys/cygwin.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <netdb.h>
-
-/* 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[MAX_PATH];
- char posix_name[MAX_PATH];
- if (wincap.is_winnt ())
- {
- if (!GetSystemDirectory (win32_name, MAX_PATH))
- return NULL;
- strcat (win32_name, "\\drivers\\etc\\");
- }
- else
- {
- if (!GetWindowsDirectory (win32_name, 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 (&current_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 (&current_servent);
- bool found = parse_services_line (fd, &current_servent);
- if (!svc_file)
- {
- svc_read_pos = ftell (fd);
- fclose (fd);
- }
- struct servent *result;
- if (found)
- result = &current_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 (&current_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 (&current_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 (&current_protoent);
-
- bool found = parse_protocol_line (fd, &current_protoent);
- if (!proto_file)
- {
- proto_read_pos = ftell (fd);
- fclose (fd);
- }
-
- struct protoent *result;
- if (found)
- result = &current_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 (&current_protoent);
- proto_read_pos = 0;
- syscall_printf ("endprotoent ()");
-}
diff --git a/winsup/cygwin/newsym b/winsup/cygwin/newsym
deleted file mode 100755
index 688a8c6f8..000000000
--- a/winsup/cygwin/newsym
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh -x
-lib=$1; shift
-as=$1; shift
-ar=$1; shift
-ranlib=$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 <<EOF > newsym.dir/$newsym.s
- .section .idata$6
- .extern __imp__$oldsym
- .extern __head_cygwin1_dll
- .section .text
- .global _$newsym
-_$newsym:
- jmp *__imp__$oldsym
-EOF
- $as -o newsym.dir/$newsym.o newsym.dir/$newsym.s
-done
-$ar cru $lib newsym.dir/*.o
-$ranlib $lib
diff --git a/winsup/cygwin/ntdll.h b/winsup/cygwin/ntdll.h
deleted file mode 100644
index 00a0ac717..000000000
--- a/winsup/cygwin/ntdll.h
+++ /dev/null
@@ -1,392 +0,0 @@
-/* ntdll.h. Contains ntdll specific stuff not defined elsewhere.
-
- 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. */
-
-#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xc0000004)
-#define FILE_SYNCHRONOUS_IO_NONALERT 32
-#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 ULONG KAFFINITY;
-
-typedef enum _SYSTEM_INFORMATION_CLASS
-{
- SystemBasicInformation = 0,
- SystemPerformanceInformation = 2,
- SystemTimeOfDayInformation = 3,
- SystemProcessesAndThreadsInformation = 5,
- SystemProcessorTimes = 8,
- /* 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 __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,
- MemoryBaiscVlmInformation
-} 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_NAME_INFORMATION
-{
- DWORD FileNameLength;
- WCHAR FileName[MAX_PATH + 100];
-} FILE_NAME_INFORMATION;
-
-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;
-
-/* Function declarations for ntdll.dll. These don't appear in any
- standard Win32 header. */
-extern "C"
-{
- 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 NtMapViewOfSection (HANDLE, HANDLE, PVOID *, ULONG, ULONG,
- PLARGE_INTEGER, PULONG, SECTION_INHERIT,
- ULONG, ULONG);
- NTSTATUS NTAPI NtOpenFile (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
- PIO_STATUS_BLOCK, ULONG, ULONG);
- NTSTATUS NTAPI NtOpenSection (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
- NTSTATUS NTAPI NtQueryInformationFile (HANDLE, IO_STATUS_BLOCK *, VOID *,
- DWORD, DWORD);
- 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 NtQueryVirtualMemory (HANDLE, PVOID, MEMORY_INFORMATION_CLASS,
- PVOID, ULONG, PULONG);
- NTSTATUS NTAPI NtUnmapViewOfSection (HANDLE, PVOID);
- VOID NTAPI RtlInitUnicodeString (PUNICODE_STRING, PCWSTR);
- ULONG NTAPI RtlNtStatusToDosError (NTSTATUS);
-}
diff --git a/winsup/cygwin/ntea.cc b/winsup/cygwin/ntea.cc
deleted file mode 100644
index 95b5444a3..000000000
--- a/winsup/cygwin/ntea.cc
+++ /dev/null
@@ -1,326 +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 <stdio.h>
-#include <stdlib.h>
-#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;
-
- 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 c3bb7a115..000000000
--- a/winsup/cygwin/passwd.cc
+++ /dev/null
@@ -1,415 +0,0 @@
-/* passwd.cc: getpwnam () and friends
-
- Copyright 1996, 1997, 1998, 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 <stdlib.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <errno.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "pinfo.h"
-#include "cygheap.h"
-#include <sys/termios.h>
-#include "pwdgrp.h"
-
-/* Read /etc/passwd only once for better performance. This is done
- on the first call that needs information from it. */
-
-static struct passwd *passwd_buf; /* passwd contents in memory */
-static int curr_lines;
-static int max_lines;
-
-static pwdgrp_check passwd_state;
-
-
-/* Position in the passwd cache */
-#ifdef _MT_SAFE
-#define pw_pos _reent_winsup ()->_pw_pos
-#else
-static int pw_pos = 0;
-#endif
-
-/* Remove a : teminated string from the buffer, and increment the pointer */
-static char *
-grab_string (char **p)
-{
- char *src = *p;
- char *res = src;
-
- while (*src && *src != ':')
- src++;
-
- if (*src == ':')
- {
- *src = 0;
- src++;
- }
- *p = src;
- return res;
-}
-
-/* same, for ints */
-static unsigned int
-grab_int (char **p)
-{
- char *src = *p;
- unsigned int val = strtoul (src, p, 10);
- *p = (*p == src || **p != ':') ? almost_null : *p + 1;
- return val;
-}
-
-/* Parse /etc/passwd line into passwd structure. */
-static int
-parse_pwd (struct passwd &res, char *buf)
-{
- /* Allocate enough room for the passwd struct and all the strings
- in it in one go */
- res.pw_name = grab_string (&buf);
- res.pw_passwd = grab_string (&buf);
- res.pw_uid = grab_int (&buf);
- res.pw_gid = grab_int (&buf);
- if (!*buf)
- return 0;
- res.pw_comment = 0;
- res.pw_gecos = grab_string (&buf);
- res.pw_dir = grab_string (&buf);
- res.pw_shell = grab_string (&buf);
- return 1;
-}
-
-/* Add one line from /etc/passwd into the password cache */
-static void
-add_pwd_line (char *line)
-{
- if (curr_lines >= max_lines)
- {
- max_lines += 10;
- passwd_buf = (struct passwd *) realloc (passwd_buf, max_lines * sizeof (struct passwd));
- }
- if (parse_pwd (passwd_buf[curr_lines], line))
- curr_lines++;
-}
-
-class passwd_lock
-{
- bool armed;
- static NO_COPY pthread_mutex_t mutex;
- public:
- passwd_lock (bool doit)
- {
- if (doit)
- pthread_mutex_lock (&mutex);
- armed = doit;
- }
- ~passwd_lock ()
- {
- if (armed)
- pthread_mutex_unlock (&mutex);
- }
-};
-
-pthread_mutex_t NO_COPY passwd_lock::mutex = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER;
-
-/* Read in /etc/passwd and save contents in the password cache.
- This sets passwd_state to loaded or emulated so functions in this file can
- tell that /etc/passwd has been read in or will be emulated. */
-static void
-read_etc_passwd ()
-{
- static pwdgrp_read pr;
-
- /* A mutex is ok for speed here - pthreads will use critical sections not
- * mutexes for non-shared mutexes in the future. Also, this function will
- * at most be called once from each thread, after that the passwd_state
- * test will succeed */
- passwd_lock here (cygwin_finished_initializing);
-
- /* if we got blocked by the mutex, then etc_passwd may have been processed */
- if (passwd_state.isinitializing ())
- {
- curr_lines = 0;
- if (pr.open ("/etc/passwd"))
- {
- char *line;
- while ((line = pr.gets ()) != NULL)
- add_pwd_line (line);
-
- passwd_state.set_last_modified (pr.get_fhandle (), pr.get_fname ());
- pr.close ();
- debug_printf ("Read /etc/passwd, %d lines", curr_lines);
- }
- passwd_state = loaded;
-
- static char linebuf[1024];
- char strbuf[128] = "";
- BOOL searchentry = TRUE;
- __uid32_t default_uid = DEFAULT_UID;
- struct passwd *pw;
-
- if (wincap.has_security ())
- {
- cygsid tu = cygheap->user.sid ();
- tu.string (strbuf);
- if (myself->uid == ILLEGAL_UID
- && (searchentry = !internal_getpwsid (tu)))
- default_uid = DEFAULT_UID_NT;
- }
- 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))))
- {
- snprintf (linebuf, sizeof (linebuf), "%s:*:%lu:%lu:,%s:%s:/bin/sh",
- cygheap->user.name (),
- myself->uid == ILLEGAL_UID ? default_uid : myself->uid,
- myself->gid,
- strbuf, getenv ("HOME") ?: "/");
- debug_printf ("Completing /etc/passwd: %s", linebuf);
- add_pwd_line (linebuf);
- }
- }
- return;
-}
-
-struct passwd *
-internal_getpwsid (cygsid &sid)
-{
- struct passwd *pw;
- char *ptr1, *ptr2, *endptr;
- char sid_string[128] = {0,','};
-
- if (passwd_state.isuninitialized ())
- read_etc_passwd ();
-
- if (sid.string (sid_string + 2))
- {
- endptr = strchr (sid_string + 2, 0) - 1;
- for (int i = 0; i < 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)
-{
- if (passwd_state.isuninitialized ()
- || (check && passwd_state.isinitializing ()))
- read_etc_passwd ();
-
- for (int i = 0; i < 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)
-{
- if (passwd_state.isuninitialized ()
- || (check && passwd_state.isinitializing ()))
- read_etc_passwd ();
-
- for (int i = 0; i < 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_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_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 (passwd_state.isinitializing ())
- read_etc_passwd ();
-
- if (pw_pos < curr_lines)
- return passwd_buf + pw_pos++;
-
- return NULL;
-}
-
-extern "C" struct passwd *
-getpwduid (__uid16_t)
-{
- return NULL;
-}
-
-extern "C" void
-setpwent (void)
-{
- pw_pos = 0;
-}
-
-extern "C" void
-endpwent (void)
-{
- pw_pos = 0;
-}
-
-extern "C" int
-setpassent ()
-{
- return 0;
-}
-
-extern "C" char *
-getpass (const char * prompt)
-{
-#ifdef _MT_SAFE
- char *pass=_reent_winsup ()->_pass;
-#else
- static char pass[_PASSWORD_LEN];
-#endif
- struct termios ti, newti;
-
- if (passwd_state.isinitializing ())
- read_etc_passwd ();
-
- 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 5ff147c68..000000000
--- a/winsup/cygwin/path.cc
+++ /dev/null
@@ -1,3750 +0,0 @@
-/* path.cc: path support.
-
- 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. */
-
-/* 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 <drive-letter>:
-
- 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:\. FIXME: Is this still true?
-*/
-
-#include "winsup.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/mount.h>
-#include <mntent.h>
-#include <unistd.h>
-#include <errno.h>
-#include <ctype.h>
-#include <winioctl.h>
-#include <wingdi.h>
-#include <winuser.h>
-#include <winnls.h>
-#include <winnetwk.h>
-#include <sys/cygwin.h>
-#include <cygwin/version.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "sync.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "shared_info.h"
-#include "registry.h"
-#include <assert.h>
-
-#ifdef _MT_SAFE
-#define iteration _reent_winsup ()->_iteration
-#define available_drives _reent_winsup ()->available_drives
-#else
-static int iteration;
-static DWORD available_drives;
-#endif
-
-static int normalize_win32_path (const char *src, char *dst);
-static void slashify (const char *src, char *dst, int trailing_slash_p);
-static void backslashify (const char *src, char *dst, int trailing_slash_p);
-
-struct symlink_info
-{
- char contents[MAX_PATH + 4];
- char *ext_here;
- int extn;
- unsigned pflags;
- DWORD fileattr;
- int is_symlink;
- bool ext_tacked_on;
- int error;
- bool case_clash;
- int check (char *path, const suffix_info *suffixes, unsigned opt);
- BOOL case_check (char *path);
-};
-
-int pcheck_case = PCHECK_RELAXED; /* Determines the case check behaviour. */
-
-static char shortcut_header[SHORTCUT_HDR_SIZE];
-static BOOL shortcut_initalized;
-
-static void
-create_shortcut_header (void)
-{
- if (!shortcut_initalized)
- {
- shortcut_header[0] = 'L';
- shortcut_header[4] = '\001';
- shortcut_header[5] = '\024';
- shortcut_header[6] = '\002';
- shortcut_header[12] = '\300';
- shortcut_header[19] = 'F';
- shortcut_header[20] = '\f';
- shortcut_header[60] = '\001';
- shortcut_initalized = TRUE;
- }
-}
-
-#define CYGWIN_REGNAME (cygheap->cygwin_regname ?: CYGWIN_INFO_CYGWIN_REGISTRY_NAME)
-
-/* 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)
-
-/* 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 (!pathnmatch (path1, path2, len1))
- return 0;
-
- return isdirsep (path2[len1]) || path2[len1] == 0 || path1[len1 - 1] == ':';
-}
-
-/* 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);
-}
-
-/* Normalize a POSIX 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. */
-
-#define isslash(c) ((c) == '/')
-
-static int
-normalize_posix_path (const char *src, char *dst)
-{
- const char *src_start = src;
- char *dst_start = dst;
-
- syscall_printf ("src %s", src);
-
- if (isdrive (src) || strpbrk (src, "\\:"))
- return normalize_win32_path (src, dst);
-
- if (!isslash (src[0]))
- {
- if (!cygheap->cwd.get (dst))
- return get_errno ();
- dst = strchr (dst, '\0');
- if (*src == '.')
- {
- if (dst == dst_start + 1 && *dst_start == '/')
- --dst;
- goto sawdot;
- }
- if (dst > dst_start && !isslash (dst[-1]))
- *dst++ = '/';
- }
- /* Two leading /'s? If so, preserve them. */
- else if (isslash (src[1]))
- {
- *dst++ = '/';
- *dst++ = '/';
- src += 2;
- if (isslash (*src))
- { /* Starts with three or more slashes - reset. */
- dst = dst_start;
- *dst++ = '/';
- src = src_start + 1;
- }
- else if (src[0] == '.' && isslash (src[1]))
- {
- *dst++ = '.';
- *dst++ = '/';
- src += 2;
- }
- }
- else
- *dst = '\0';
-
- while (*src)
- {
- /* Strip runs of /'s. */
- if (!isslash (*src))
- *dst++ = *src++;
- else
- {
- while (*++src)
- {
- if (isslash (*src))
- continue;
-
- if (*src != '.')
- break;
-
- sawdot:
- if (src[1] != '.')
- {
- if (!src[1])
- {
- if (dst == dst_start)
- *dst++ = '/';
- goto done;
- }
- if (!isslash (src[1]))
- break;
- }
- else if (src[2] && !isslash (src[2]))
- {
- if (src[2] == '.')
- return ENOENT;
- break;
- }
- else
- {
- while (dst > dst_start && !isslash (*--dst))
- continue;
- src++;
- }
- }
-
- *dst++ = '/';
- }
- if ((dst - dst_start) >= MAX_PATH)
- {
- debug_printf ("ENAMETOOLONG = normalize_posix_path (%s)", src);
- return ENAMETOOLONG;
- }
- }
-
-done:
- *dst = '\0';
- if (--dst > dst_start && isslash (*dst))
- *dst = '\0';
-
- debug_printf ("%s = normalize_posix_path (%s)", dst_start, src_start);
- return 0;
-}
-
-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[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, ".");
-}
-
-bool
-fs_info::update (const char *win32_path)
-{
- char tmp_buf [MAX_PATH];
- strncpy (tmp_buf, win32_path, MAX_PATH);
-
- if (!rootdir (tmp_buf))
- {
- debug_printf ("Cannot get root component of path %s", win32_path);
- name [0] = '\0';
- sym_opt = flags = serial = 0;
- return false;
- }
-
- if (strcmp (tmp_buf, root_dir) == 0)
- return 1;
-
- strncpy (root_dir, tmp_buf, MAX_PATH);
- drive_type = GetDriveType (root_dir);
- if (drive_type == DRIVE_REMOTE || (drive_type == DRIVE_UNKNOWN && (root_dir[0] == '\\' && root_dir[1] == '\\')))
- is_remote_drive = 1;
- else
- is_remote_drive = 0;
-
- if (!GetVolumeInformation (root_dir, NULL, 0, &serial, NULL, &flags,
- name, sizeof (name)))
- {
- debug_printf ("Cannot get volume information (%s), %E", root_dir);
- name [0] = '\0';
- sym_opt = 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.
- */
- sym_opt = (!is_remote_drive && strcmp (name, "NTFS") == 0) ? PC_CHECK_EA : 0;
-
- return true;
-}
-
-char *
-path_conv::return_and_clear_normalized_path ()
-{
- char *s = normalized_path;
- normalized_path = NULL;
- return s;
-}
-
-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;
-}
-
-/* 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 MAX_PATH * 2
- in length so that we can hold the expanded symlink plus a
- trailer. */
- char path_copy[MAX_PATH + 3];
- char tmp_buf[2 * MAX_PATH + 3];
- symlink_info sym;
- bool need_directory = 0;
- bool saw_symlinks = 0;
- int is_relpath;
- char *tail;
- sigframe thisframe (mainthread);
-
-#if 0
- static path_conv last_path_conv;
- static char last_src[MAX_PATH + 1];
-
- if (*last_src && strcmp (last_src, src) == 0)
- {
- *this = last_path_conv;
- return;
- }
-#endif
-
- int loop = 0;
- path_flags = 0;
- known_suffix = NULL;
- fileattr = INVALID_FILE_ATTRIBUTES;
- case_clash = false;
- devn = unit = 0;
- fs.root_dir[0] = '\0';
- fs.name[0] = '\0';
- fs.flags = fs.serial = 0;
- fs.sym_opt = 0;
- fs.drive_type = 0;
- fs.is_remote_drive = 0;
- normalized_path = NULL;
-
- if (!(opt & PC_NULLEMPTY))
- error = 0;
- else if ((error = check_null_empty_str (src)))
- return;
- /* This loop handles symlink expansion. */
- for (;;)
- {
- MALLOC_CHECK;
- assert (src);
-
- char *p = strrchr (src, '\0');
- /* Detect if the user was looking for a directory. We have to strip the
- trailing slash initially and add it back on at the end due to Windows
- brain damage. */
- if (--p > src)
- {
- if (isdirsep (*p))
- need_directory = 1;
- else if (--p > src && p[1] == '.' && isdirsep (*p))
- need_directory = 1;
- }
-
- is_relpath = !isabspath (src);
- error = normalize_posix_path (src, path_copy);
- if (error)
- return;
-
- tail = strchr (path_copy, '\0'); // Point to end of copy
- char *path_end = tail;
- tail[1] = '\0';
-
- /* 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? */
- int component = 0; // Number of translated components
- sym.contents[0] = '\0';
-
- for (;;)
- {
- const suffix_info *suff;
- char pathbuf[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, devn,
- unit, &sym.pflags, 1);
-
- if (error)
- return;
-
- if (devn == FH_CYGDRIVE)
- {
- if (!component)
- fileattr = FILE_ATTRIBUTE_DIRECTORY;
- else
- {
- devn = FH_BAD;
- fileattr = GetFileAttributes (this->path);
- }
- goto out;
- }
- else if (isvirtual_dev (devn))
- {
- /* FIXME: Calling build_fhandler here is not the right way to handle this. */
- fhandler_virtual *fh =
- (fhandler_virtual *) cygheap->fdtab.build_fhandler (-1, devn, (const char *) path_copy, NULL, unit);
- int file_type = fh->exists ();
- switch (file_type)
- {
- case 1:
- case 2:
- fileattr = FILE_ATTRIBUTE_DIRECTORY;
- break;
- case -1:
- fileattr = 0;
- break;
- default:
- fileattr = INVALID_FILE_ATTRIBUTES;
- break;
- }
- delete fh;
- goto out;
- }
- /* devn should not be a device. If it is, then stop parsing now. */
- else if (devn != FH_BAD)
- {
- fileattr = 0;
- path_flags = sym.pflags;
- if (component)
- {
- error = ENOTDIR;
- return;
- }
- goto out; /* Found a device. Stop parsing. */
- }
-
- if (!fs.update (full_path))
- fs.root_dir[0] = '\0';
-
- /* Eat trailing slashes */
- char *dostail = strchr (full_path, '\0');
-
- /* 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. */
- while (dostail > full_path + 3 && (*--dostail == '\\'))
- *tail = '\0';
-
- if (full_path[0] && full_path[1] == ':' && full_path[2] == '\0')
- {
- full_path[2] = '\\';
- full_path[3] = '\0';
- }
-
- if ((opt & PC_SYM_IGNORE) && pcheck_case == PCHECK_RELAXED)
- {
- fileattr = GetFileAttributes (this->path);
- goto out;
- }
-
- int len = sym.check (full_path, suff, opt | fs.sym_opt);
-
- 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.is_symlink && sym.fileattr != INVALID_FILE_ATTRIBUTES)
- {
- error = sym.error;
- if (component == 0)
- add_ext_from_sym (sym);
- 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 len > 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 (len > 0)
- {
- saw_symlinks = 1;
- if (component == 0 && !need_directory && !(opt & PC_SYM_FOLLOW))
- {
- set_symlink (); // 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;
- }
- /* No existing file found. */
- }
-
- /* Find the "tail" of the path, e.g. in '/for/bar/baz',
- /baz is the tail. */
- char *newtail = strrchr (path_copy, '/');
- if (tail != path_end)
- *tail = '/';
-
- /* Exit loop if there is no tail or we are at the
- beginning of a UNC path */
- if (!newtail || newtail == path_copy || (newtail == path_copy + 1 && newtail[-1] == '/'))
- goto out; // all done
-
- tail = newtail;
-
- /* 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;
-
- /* The tail is pointing at a null pointer. Increment it and get the length.
- If the tail was empty then this increment will end up pointing to the extra
- \0 added to path_copy above. */
- int taillen = strlen (++tail);
- int buflen = strlen (sym.contents);
- if (buflen + taillen > MAX_PATH)
- {
- error = ENAMETOOLONG;
- strcpy (path, "::ENAMETOOLONG::");
- return;
- }
-
- /* Strip off current directory component since this is the part that refers
- to the symbolic link. */
- if ((p = strrchr (path_copy, '/')) == NULL)
- p = path_copy;
- else if (p == path_copy)
- p++;
- *p = '\0';
-
- char *headptr;
- if (isabspath (sym.contents))
- headptr = tmp_buf; /* absolute path */
- else
- {
- /* Copy the first part of the path and point to the end. */
- strcpy (tmp_buf, path_copy);
- headptr = strchr (tmp_buf, '\0');
- }
-
- /* See if we need to separate first part + symlink contents with a / */
- if (headptr > tmp_buf && headptr[-1] != '/')
- *headptr++ = '/';
-
- /* Copy the symlink contents to the end of tmp_buf.
- Convert slashes. FIXME? */
- for (p = sym.contents; *p; p++)
- *headptr++ = *p == '\\' ? '/' : *p;
-
- /* Copy any tail component */
- if (tail >= path_end)
- *headptr = '\0';
- else
- {
- *headptr++ = '/';
- strcpy (headptr, tail);
- }
-
- /* Now evaluate everything all over again. */
- src = tmp_buf;
- }
-
- if (!(opt & PC_SYM_CONTENTS))
- add_ext_from_sym (sym);
-
-out:
- if (opt & PC_POSIX)
- {
- if (tail[1] != '\0')
- *tail = '/';
- normalized_path = cstrdup (path_copy);
- }
- /* Deal with Windows stupidity which considers filename\. to be valid
- even when "filename" is not a directory. */
- 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 (devn == FH_BAD)
- {
- if (!fs.update (path))
- {
- fs.root_dir[0] = '\0';
- set_has_acls (false);
- set_has_buggy_open (false);
- }
- else
- {
- set_isdisk ();
- debug_printf ("root_dir(%s), this->path(%s), set_has_acls(%d)",
- fs.root_dir, this->path, fs.flags & FS_PERSISTENT_ACLS);
- if (!allow_smbntsec && fs.is_remote_drive)
- set_has_acls (false);
- else
- set_has_acls (fs.flags & FS_PERSISTENT_ACLS);
- /* Known file systems with buggy open calls. Further explanation
- in fhandler.cc (fhandler_disk_file::open). */
- set_has_buggy_open (strcmp (fs.name, "SUNWNFS") == 0);
- }
- }
-#if 0
- if (issocket ())
- devn = FH_SOCKET;
-#endif
-
- if (!(opt & PC_FULL))
- {
- 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 ||
- !strncasematch (this->path + 4, "unc\\", 4)))
- {
- 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 0
- if (!error)
- {
- last_path_conv = *this;
- strcpy (last_src, src);
- }
-#endif
-}
-
-static __inline int
-digits (const char *name)
-{
- char *p;
- int n = strtol (name, &p, 10);
-
- return p > name && !*p ? n : -1;
-}
-
-const char *windows_device_names[] NO_COPY =
-{
- NULL,
- "\\dev\\console",
- "conin",
- "conout",
- "\\dev\\ttym",
- "\\dev\\tty%d",
- "\\dev\\ptym",
- "\\\\.\\com%d",
- "\\dev\\pipe",
- "\\dev\\piper",
- "\\dev\\pipew",
- "\\dev\\socket",
- "\\dev\\windows",
-
- NULL, NULL, NULL,
-
- "\\dev\\disk",
- "\\dev\\fd%d",
- "\\dev\\st%d",
- "nul",
- "\\dev\\zero",
- "\\dev\\%srandom",
- "\\dev\\mem",
- "\\dev\\clipboard",
- "\\dev\\dsp"
-};
-
-#define deveq(s) (strcasematch (name, (s)))
-#define deveqn(s, n) (strncasematch (name, (s), (n)))
-#define wdeveq(s) (strcasematch (w32_path, (s)))
-#define wdeveqn(s, n) (strncasematch (w32_path, (s), (n)))
-#define udeveq(s) (strcasematch (unix_path, (s)))
-#define udeveqn(s, n) (strncasematch (unix_path, (s), (n)))
-
-static int __stdcall
-get_devn (const char *name, int &unit)
-{
- int devn = FH_BAD;
- name += 5;
- if (deveq ("tty"))
- {
- if (real_tty_attached (myself))
- {
- unit = myself->ctty;
- devn = FH_TTYS;
- }
- else if (myself->ctty > 0)
- devn = FH_CONSOLE;
- }
- else if (deveqn ("tty", 3) && (unit = digits (name + 3)) >= 0)
- devn = FH_TTYS;
- else if (deveq ("ttym"))
- devn = FH_TTYM;
- else if (deveq ("ptmx"))
- devn = FH_PTYM;
- else if (deveq ("windows"))
- devn = FH_WINDOWS;
- else if (deveq ("dsp"))
- devn = FH_OSS_DSP;
- else if (deveq ("conin"))
- devn = FH_CONIN;
- else if (deveq ("conout"))
- devn = FH_CONOUT;
- else if (deveq ("null"))
- devn = FH_NULL;
- else if (deveq ("zero"))
- devn = FH_ZERO;
- else if (deveq ("random") || deveq ("urandom"))
- {
- devn = FH_RANDOM;
- unit = 8 + (deveqn ("u", 1) ? 1 : 0); /* Keep unit Linux conformant */
- }
- else if (deveq ("mem"))
- {
- devn = FH_MEM;
- unit = 1;
- }
- else if (deveq ("clipboard"))
- devn = FH_CLIPBOARD;
- else if (deveq ("port"))
- {
- devn = FH_MEM;
- unit = 4;
- }
- else if (deveqn ("com", 3) && (unit = digits (name + 3)) >= 0 && unit < 100)
- devn = FH_SERIAL;
- else if (deveqn ("ttyS", 4) && (unit = digits (name + 4)) >= 0)
- {
- devn = FH_SERIAL;
- unit++;
- }
- else if (deveq ("pipe"))
- devn = FH_PIPE;
- else if (deveq ("piper"))
- devn = FH_PIPER;
- else if (deveq ("pipew"))
- devn = FH_PIPEW;
- else if (deveq ("tcp") || deveq ("udp") || deveq ("streamsocket")
- || deveq ("dgsocket"))
- devn = FH_SOCKET;
-
- return devn;
-}
-
-/*
- major minor POSIX filename NT filename
- ----- ----- -------------- -------------------------
- FH_TAPE 0 /dev/st0 \device\tape0
- FH_TAPE 1 /dev/st1 \device\tape1
- ...
- FH_TAPE 128 /dev/nst0 \device\tape0
- FH_TAPE 129 /dev/nst1 \device\tape1
- ...
-
- FH_FLOPPY 0 /dev/fd0 \device\floppy0
- FH_FLOPPY 1 /dev/fd1 \device\floppy1
- ...
-
- FH_FLOPPY 16 /dev/scd0 \device\cdrom0
- FH_FLOPPY 17 /dev/scd0 \device\cdrom1
- ...
-
- FH_FLOPPY 32 /dev/sda \device\harddisk0\partition0
- FH_FLOPPY 33 /dev/sda1 \device\harddisk0\partition1
- ...
- FH_FLOPPY 47 /dev/sda15 \device\harddisk0\partition15
-
- FH_FLOPPY 48 /dev/sdb \device\harddisk1\partition0
- FH_FLOPPY 33 /dev/sdb1 \device\harddisk1\partition1
- ...
- FH_FLOPPY 208 /dev/sdl \device\harddisk11\partition0
- ...
- FH_FLOPPY 223 /dev/sdl15 \device\harddisk11\partition15
-
- The following are needed to maintain backward compatibility with
- the old Win32 partitioning scheme on W2K/XP.
-
- FH_FLOPPY 224 from mount tab \\.\A:
- ...
- FH_FLOPPY 250 from mount tab \\.\Z:
-*/
-static int
-get_raw_device_number (const char *name, const char *w32_path, int &unit)
-{
- DWORD devn = FH_BAD;
-
- if (!w32_path) /* New approach using fixed device names. */
- {
- if (deveqn ("st", 2))
- {
- unit = digits (name + 2);
- if (unit >= 0 && unit < 128)
- devn = FH_TAPE;
- }
- else if (deveqn ("nst", 3))
- {
- unit = digits (name + 3) + 128;
- if (unit >= 128 && unit < 256)
- devn = FH_TAPE;
- }
- else if (deveqn ("fd", 2))
- {
- unit = digits (name + 2);
- if (unit >= 0 && unit < 16)
- devn = FH_FLOPPY;
- }
- else if (deveqn ("scd", 3))
- {
- unit = digits (name + 3) + 16;
- if (unit >= 16 && unit < 32)
- devn = FH_FLOPPY;
- }
- else if (deveqn ("sd", 2) && isalpha (name[2]))
- {
- unit = (cyg_tolower (name[2]) - 'a') * 16 + 32;
- if (unit >= 32 && unit < 224)
- if (!name[3])
- devn = FH_FLOPPY;
- else
- {
- int d = digits (name + 3);
- if (d >= 1 && d < 16)
- {
- unit += d;
- devn = FH_FLOPPY;
- }
- }
- }
- }
- else /* Backward compatible checking of mount table device mapping. */
- {
- if (wdeveqn ("tape", 4))
- {
- unit = digits (w32_path + 4);
- /* Norewind tape devices have leading n in name. */
- if (deveqn ("n", 1))
- unit += 128;
- devn = FH_TAPE;
- }
- else if (wdeveqn ("physicaldrive", 13))
- {
- unit = digits (w32_path + 13) * 16 + 32;
- devn = FH_FLOPPY;
- }
- else if (isdrive (w32_path))
- {
- unit = cyg_tolower (w32_path[0]) - 'a' + 224;
- devn = FH_FLOPPY;
- }
- }
- return devn;
-}
-
-static int __stdcall get_device_number (const char *unix_path,
- const char *w32_path, int &unit)
- __attribute__ ((regparm(3)));
-static int __stdcall
-get_device_number (const char *unix_path, const char *w32_path, int &unit)
-{
- DWORD devn = FH_BAD;
- unit = 0;
-
- if (*unix_path == '/' && udeveqn ("/dev/", 5))
- {
- devn = get_devn (unix_path, unit);
- if (devn == FH_BAD && *w32_path == '\\' && wdeveqn ("\\dev\\", 5))
- devn = get_devn (w32_path, unit);
- if (devn == FH_BAD && wdeveqn ("\\\\.\\", 4))
- devn = get_raw_device_number (unix_path + 5, w32_path + 4, unit);
- if (devn == FH_BAD)
- devn = get_raw_device_number (unix_path + 5, NULL, unit);
- }
- else
- {
- char *p = strrchr (unix_path, '/');
- if (p)
- unix_path = p + 1;
- if (udeveqn ("com", 3)
- && (unit = digits (unix_path + 3)) >= 0 && unit < 100)
- devn = FH_SERIAL;
- }
-
- return devn;
-}
-
-/* Return TRUE if src_path is a Win32 device name, filling out the device
- name in win32_path */
-
-static BOOL
-win32_device_name (const char *src_path, char *win32_path,
- DWORD &devn, int &unit)
-{
- const char *devfmt;
-
- devn = get_device_number (src_path, win32_path, unit);
-
- if (devn == FH_BAD)
- return false;
-
- if ((devfmt = windows_device_names[FHDEVN (devn)]) == NULL)
- return false;
- switch (devn)
- {
- case FH_RANDOM:
- __small_sprintf (win32_path, devfmt, unit == 8 ? "" : "u");
- break;
- case FH_TAPE:
- __small_sprintf (win32_path, "\\Device\\Tape%d", unit % 128);
- break;
- case FH_FLOPPY:
- if (unit < 16)
- __small_sprintf (win32_path, "\\Device\\Floppy%d", unit);
- else if (unit < 32)
- __small_sprintf (win32_path, "\\Device\\CdRom%d", unit - 16);
- else if (unit < 224)
- __small_sprintf (win32_path, "\\Device\\Harddisk%d\\Partition%d",
- (unit - 32) / 16, unit % 16);
- else
- __small_sprintf (win32_path, "\\DosDevices\\%c:", unit - 224 + 'A');
- break;
- default:
- __small_sprintf (win32_path, devfmt, unit);
- break;
- }
- return TRUE;
-}
-
-/* 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)
-{
- const char *src_start = src;
- char *dst_start = dst;
- char *dst_root_start = dst;
- bool beg_src_slash = isdirsep (src[0]);
-
- if (beg_src_slash && isdirsep (src[1]))
- {
- *dst++ = '\\';
- src++;
- if (src[1] == '.' && isdirsep (src[2]))
- {
- *dst++ = '\\';
- *dst++ = '.';
- src += 2;
- }
- }
- else if (strchr (src, ':') == NULL && *src != '/')
- {
- if (!cygheap->cwd.get (dst, 0))
- return get_errno ();
- if (beg_src_slash)
- {
- if (dst[1] == ':')
- dst[2] = '\0';
- else if (slash_unc_prefix_p (dst))
- {
- char *p = strpbrk (dst + 2, "\\/");
- if (p && (p = strpbrk (p + 1, "\\/")))
- *p = '\0';
- }
- }
- if (strlen (dst) + 1 + strlen (src) >= MAX_PATH)
- {
- debug_printf ("ENAMETOOLONG = normalize_win32_path (%s)", src);
- return ENAMETOOLONG;
- }
- dst += strlen (dst);
- if (!beg_src_slash)
- *dst++ = '\\';
- }
-
- 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 */
- && dst[-1] == '\\'
- && (isdirsep (src[2]) || src[2] == 0))
- {
- /* Back up over /, but not if it's the first one. */
- if (dst > dst_root_start + 1)
- dst--;
- /* Now back up to the next /. */
- while (dst > dst_root_start + 1 && dst[-1] != '\\' && dst[-2] != ':')
- dst--;
- src += 2;
- if (isdirsep (*src))
- src++;
- }
- /* Otherwise, add char to result. */
- else
- {
- if (*src == '/')
- *dst++ = '\\';
- else
- *dst++ = *src;
- ++src;
- }
- if ((dst - dst_start) >= MAX_PATH)
- return ENAMETOOLONG;
- }
- *dst = 0;
- debug_printf ("%s = normalize_win32_path (%s)", dst_start, 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';
-}
-
-/* slash_unc_prefix_p: Return non-zero if PATH begins with //UNC/SHARE */
-
-int __stdcall
-slash_unc_prefix_p (const char *path)
-{
- char *p = NULL;
- int ret = (isdirsep (path[0])
- && isdirsep (path[1])
- && isalpha (path[2])
- && path[3] != 0
- && !isdirsep (path[3])
- && ((p = strpbrk (path + 3, "\\/")) != NULL));
- if (!ret || p == NULL)
- return ret;
- return ret && isalnum (p[1]);
-}
-
-/* conv_path_list: Convert a list of path names to/from Win32/POSIX. */
-
-static void
-conv_path_list (const char *src, char *dst, int to_posix_p)
-{
- char *s;
- char *d = dst;
- char src_delim = to_posix_p ? ';' : ':';
- char dst_delim = to_posix_p ? ':' : ';';
- int (*conv_fn) (const char *, char *) = (to_posix_p
- ? cygwin_conv_to_posix_path
- : cygwin_conv_to_win32_path);
-
- char *srcbuf = (char *) alloca (strlen (src) + 1);
-
- for (;;)
- {
- s = strccpy (srcbuf, &src, src_delim);
- int len = s - srcbuf;
- if (len >= MAX_PATH)
- srcbuf[MAX_PATH - 1] = '\0';
- (*conv_fn) (len ? srcbuf : ".", d);
- if (!*src++)
- break;
- d = strchr (d, '\0');
- *d++ = dst_delim;
- }
-}
-
-/* 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));
- }
-}
-
-/* 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. MAX_PATH bytes). */
-
-int
-mount_info::conv_to_win32_path (const char *src_path, char *dst,
- DWORD &devn, int &unit, unsigned *flags,
- bool no_normalize)
-{
- while (sys_mount_table_counter < cygwin_shared->sys_mount_table_counter)
- {
- init ();
- sys_mount_table_counter++;
- }
- int src_path_len = strlen (src_path);
- MALLOC_CHECK;
- unsigned dummy_flags;
- int chroot_ok = !cygheap->root.exists ();
-
- devn = FH_BAD;
- unit = 0;
-
- if (!flags)
- flags = &dummy_flags;
-
- *flags = 0;
- debug_printf ("conv_to_win32_path (%s)", src_path);
-
- if (src_path_len >= MAX_PATH)
- {
- debug_printf ("ENAMETOOLONG = conv_to_win32_path (%s)", src_path);
- return ENAMETOOLONG;
- }
-
- int i, rc;
- mount_item *mi = NULL; /* initialized to avoid compiler warning */
- char pathbuf[MAX_PATH];
-
- if (dst == NULL)
- goto out; /* Sanity check. */
-
- /* An MS-DOS spec has either a : or a \. If this is found, short
- circuit most of the rest of this function. */
- if (strpbrk (src_path, ":\\") != NULL || slash_unc_prefix_p (src_path))
- {
- debug_printf ("%s already win32", src_path);
- rc = normalize_win32_path (src_path, dst);
- if (rc)
- {
- debug_printf ("normalize_win32_path failed, rc %d", rc);
- return rc;
- }
-
- set_flags (flags, (unsigned) set_flags_from_win32_path (dst));
- goto out;
- }
-
- /* Normalize the path, taking out ../../ stuff, we need to do 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.
-
- We do this by first getting an absolute UNIX-style path and then
- converting it to a DOS-style path, looking up the appropriate drive
- in the mount table. */
-
- if (no_normalize)
- strcpy (pathbuf, src_path);
- else
- {
- rc = normalize_posix_path (src_path, pathbuf);
-
- if (rc)
- {
- debug_printf ("%d = conv_to_win32_path (%s)", rc, src_path);
- return rc;
- }
- }
-
- /* See if this is a cygwin "device" */
- if (win32_device_name (pathbuf, dst, devn, unit))
- {
- *flags = MOUNT_BINARY; /* FIXME: Is this a sensible default for devices? */
- rc = 0;
- goto out_no_chroot_check;
- }
-
- /* Check if the cygdrive prefix was specified. If so, just strip
- off the prefix and transform it into an MS-DOS path. */
- MALLOC_CHECK;
- if (isproc (pathbuf))
- {
- devn = fhandler_proc::get_proc_fhandler (pathbuf);
- if (devn == FH_BAD)
- return ENOENT;
- }
- else if (iscygdrive (pathbuf))
- {
- int n = mount_table->cygdrive_len - 1;
- if (!pathbuf[n] ||
- (pathbuf[n] == '/' && pathbuf[n + 1] == '.' && !pathbuf[n + 2]))
- {
- unit = 0;
- dst[0] = '\0';
- if (mount_table->cygdrive_len > 1)
- devn = FH_CYGDRIVE;
- }
- else if (cygdrive_win32_path (pathbuf, dst, unit))
- {
- set_flags (flags, (unsigned) cygdrive_flags);
- goto out;
- }
- else if (mount_table->cygdrive_len > 1)
- return ENOENT;
- }
-
- int chrooted_path_len;
- chrooted_path_len = 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);
- chrooted_path_len = len = strlen (path);
- }
- else
- {
- chrooted_path_len = 0;
- continue;
- }
-
- if (path_prefix_p (path, pathbuf, len))
- break;
- }
-
- if (i >= nmounts)
- {
- backslashify (pathbuf, dst, 0); /* just convert */
- set_flags (flags, PATH_BINARY);
- }
- else
- {
- int n;
- const char *native_path;
- int posix_pathlen;
- if (chroot_ok || chrooted_path_len || mi->posix_pathlen != 1
- || mi->posix_path[0] != '/')
- {
- n = mi->native_pathlen;
- native_path = mi->native_path;
- posix_pathlen = chrooted_path_len ?: mi->posix_pathlen;
- chroot_ok = 1;
- }
- else
- {
- n = cygheap->root.native_length ();
- native_path = cygheap->root.native_path ();
- posix_pathlen = mi->posix_pathlen;
- chroot_ok = 1;
- }
- memcpy (dst, native_path, n + 1);
- const char *p = pathbuf + posix_pathlen;
- if (*p == '/')
- /* nothing */;
- else if ((isdrive (dst) && !dst[2]) || *p)
- dst[n++] = '\\';
- strcpy (dst + n, p);
- backslashify (dst, dst, 0);
- set_flags (flags, (unsigned) mi->flags);
- }
-
- if (!isvirtual_dev (devn))
- win32_device_name (src_path, dst, devn, unit);
-
- 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;
-}
-
-/* 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;
- 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. 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 >= 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[MAX_PATH];
- int rc = normalize_win32_path (src_path, pathbuf);
- if (rc != 0)
- {
- debug_printf ("%d = conv_to_posix_path (%s)", rc, src_path);
- return rc;
- }
-
- int pathbuflen = strlen (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 (*p == '/')
- nextchar = -1;
- else
- nextchar = 1;
-
- int addslash = nextchar > 0 ? 1 : 0;
- if ((mi.posix_pathlen + (pathbuflen - mi.native_pathlen) + addslash) >= 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);
- }
- goto out;
- }
-
- if (!cygheap->root.exists ())
- /* nothing */;
- else if (cygheap->root.ischroot_native (pathbuf))
- {
- 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';
- }
- }
- else
- return ENOENT;
-
- /* 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. */
- strcpy (posix_path, src_path);
- // 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[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[MAX_PATH];
- int mount_flags;
-
- posix_path_size = MAX_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 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 ()
-{
- /* Use current mount areas if either user or system mount areas
- already exist. Otherwise, import old mounts. */
-
- reg_key r;
-
- /* Retrieve cygdrive-related information. */
- read_cygdrive_info_from_registry ();
-
- nmounts = 0;
-
- /* First read mounts from user's table. */
- read_mounts (r);
-
- /* Then read mounts from system-wide mount table. */
- reg_key r1 (HKEY_LOCAL_MACHINE, KEY_READ, "SOFTWARE",
- CYGWIN_INFO_CYGNUS_REGISTRY_NAME, CYGWIN_REGNAME,
- CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
- NULL);
- read_mounts (r1);
-}
-
-/* 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 = 0;
-
- /* Add the mount to the right registry location, depending on
- whether MOUNT_SYSTEM is set in the mount flags. */
- if (!(mountflags & MOUNT_SYSTEM)) /* current_user mount */
- {
- /* reg_key for user mounts in HKEY_CURRENT_USER. */
- reg_key reg_user;
-
- /* Start by deleting existing mount if one exists. */
- res = reg_user.kill (posix_path);
- if (res != ERROR_SUCCESS && res != ERROR_FILE_NOT_FOUND)
- goto err;
-
- /* Create the new mount. */
- reg_key subkey = reg_key (reg_user.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);
- }
- else /* local_machine mount */
- {
- /* reg_key for system mounts in HKEY_LOCAL_MACHINE. */
- reg_key reg_sys (HKEY_LOCAL_MACHINE, KEY_ALL_ACCESS, "SOFTWARE",
- CYGWIN_INFO_CYGNUS_REGISTRY_NAME, CYGWIN_REGNAME,
- CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
- NULL);
-
- /* Start by deleting existing mount if one exists. */
- res = reg_sys.kill (posix_path);
- if (res != ERROR_SUCCESS && res != ERROR_FILE_NOT_FOUND)
- goto err;
-
- /* Create the new mount. */
- reg_key subkey = reg_key (reg_sys.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);
-
- sys_mount_table_counter++;
- cygwin_shared->sys_mount_table_counter++;
- }
-
- return 0; /* Success */
- err:
- __seterrno_from_win_error (res);
- return -1;
-}
-
-/* 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;
-
- if (!(flags & MOUNT_SYSTEM)) /* Delete from user registry */
- {
- reg_key reg_user (KEY_ALL_ACCESS,
- CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL);
- res = reg_user.kill (posix_path);
- }
- else /* Delete from system registry */
- {
- sys_mount_table_counter++;
- cygwin_shared->sys_mount_table_counter++;
- reg_key reg_sys (HKEY_LOCAL_MACHINE, KEY_ALL_ACCESS, "SOFTWARE",
- CYGWIN_INFO_CYGNUS_REGISTRY_NAME, CYGWIN_REGNAME,
- CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
- NULL);
- res = reg_sys.kill (posix_path);
- }
-
- if (res != ERROR_SUCCESS)
- {
- __seterrno_from_win_error (res);
- return -1;
- }
-
- 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 ()
-{
- /* reg_key for user path prefix in HKEY_CURRENT_USER. */
- reg_key r;
-
- if (r.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, cygdrive, sizeof (cygdrive), "") != 0)
- {
- /* Didn't find the user path prefix so check the system path prefix. */
-
- /* reg_key for system path prefix in HKEY_LOCAL_MACHINE. */
- reg_key r2 (HKEY_LOCAL_MACHINE, KEY_READ, "SOFTWARE",
- CYGWIN_INFO_CYGNUS_REGISTRY_NAME, CYGWIN_REGNAME,
- CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
- NULL);
-
- if (r2.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, cygdrive,
- sizeof (cygdrive), ""))
- strcpy (cygdrive, CYGWIN_INFO_CYGDRIVE_DEFAULT_PREFIX);
- cygdrive_flags = r2.get_int (CYGWIN_INFO_CYGDRIVE_FLAGS, MOUNT_CYGDRIVE);
- slashify (cygdrive, cygdrive, 1);
- cygdrive_len = strlen (cygdrive);
- }
- else
- {
- /* Fetch user cygdrive_flags from registry; returns MOUNT_CYGDRIVE on
- error. */
- cygdrive_flags = r.get_int (CYGWIN_INFO_CYGDRIVE_FLAGS, MOUNT_CYGDRIVE);
- slashify (cygdrive, cygdrive, 1);
- cygdrive_len = strlen (cygdrive);
- }
-}
-
-/* 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)
-{
- /* Determine whether to modify user or system cygdrive path prefix. */
- HKEY top = (flags & MOUNT_SYSTEM) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
-
- if (flags & MOUNT_SYSTEM)
- {
- sys_mount_table_counter++;
- cygwin_shared->sys_mount_table_counter++;
- }
-
- /* reg_key for user path prefix in HKEY_CURRENT_USER or system path prefix in
- HKEY_LOCAL_MACHINE. */
- reg_key r (top, KEY_ALL_ACCESS, "SOFTWARE",
- CYGWIN_INFO_CYGNUS_REGISTRY_NAME, CYGWIN_REGNAME,
- CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
- NULL);
-
- /* 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);
-
- 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);
-
- /* 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, mount_table->cygdrive, 1);
- mount_table->cygdrive_flags = flags;
- mount_table->cygdrive_len = strlen (mount_table->cygdrive);
- }
-
- return 0;
-}
-
-int
-mount_info::remove_cygdrive_info_from_registry (const char *cygdrive_prefix, unsigned flags)
-{
- /* Determine whether to modify user or system cygdrive path prefix. */
- HKEY top = (flags & MOUNT_SYSTEM) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
-
- if (flags & MOUNT_SYSTEM)
- {
- sys_mount_table_counter++;
- cygwin_shared->sys_mount_table_counter++;
- }
-
- /* reg_key for user path prefix in HKEY_CURRENT_USER or system path prefix in
- HKEY_LOCAL_MACHINE. */
- reg_key r (top, KEY_ALL_ACCESS, "SOFTWARE",
- CYGWIN_INFO_CYGNUS_REGISTRY_NAME, CYGWIN_REGNAME,
- 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);
-
- /* Reinitialize the cygdrive path prefix to reflect to removal from the
- registry. */
- read_cygdrive_info_from_registry ();
-
- return (res != ERROR_SUCCESS) ? res : res2;
-}
-
-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;
- int res = r.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, user, MAX_PATH, "");
-
- /* Get the user flags, if appropriate */
- if (res == ERROR_SUCCESS)
- {
- int flags = r.get_int (CYGWIN_INFO_CYGDRIVE_FLAGS, MOUNT_CYGDRIVE);
- strcpy (user_flags, (flags & MOUNT_BINARY) ? "binmode" : "textmode");
- }
-
- /* Get the system path prefix from HKEY_LOCAL_MACHINE. */
- reg_key r2 (HKEY_LOCAL_MACHINE, KEY_READ, "SOFTWARE",
- CYGWIN_INFO_CYGNUS_REGISTRY_NAME, CYGWIN_REGNAME,
- CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
- NULL);
- int res2 = r2.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, system, MAX_PATH, "");
-
- /* Get the system flags, if appropriate */
- if (res2 == ERROR_SUCCESS)
- {
- int flags = r2.get_int (CYGWIN_INFO_CYGDRIVE_FLAGS, MOUNT_CYGDRIVE);
- 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)
-{
- /* Something's wrong if either path is NULL or empty, or if it's
- not a UNC or absolute path. */
-
- if ((native == NULL) || (*native == 0) ||
- (posix == NULL) || (*posix == 0) ||
- !isabspath (native) || !isabspath (posix) ||
- slash_unc_prefix_p (posix) || isdrive (posix))
- {
- set_errno (EINVAL);
- return -1;
- }
-
- /* Make sure both paths do not end in /. */
- char nativetmp[MAX_PATH];
- char posixtmp[MAX_PATH];
-
- backslashify (native, nativetmp, 0);
- nofinalslash (nativetmp, nativetmp);
-
- slashify (posix, posixtmp, 0);
- nofinalslash (posixtmp, posixtmp);
-
- debug_printf ("%s[%s], %s[%s], %p",
- native, nativetmp, posix, posixtmp, mountflags);
-
- /* Duplicate /'s in path are an error. */
- for (char *p = posixtmp + 1; *p; ++p)
- {
- if (p[-1] == '/' && p[0] == '/')
- {
- set_errno (EINVAL);
- return -1;
- }
- }
-
- /* 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[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 (slash_unc_prefix_p (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)
-{
-#ifdef _MT_SAFE
- struct mntent &ret=_reent_winsup ()->mntbuf;
-#else
- static NO_COPY struct mntent ret;
-#endif
-
- /* 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)
- 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 (_reent_winsup ()->mnt_fsname, native_path);
- ret.mnt_fsname = _reent_winsup ()->mnt_fsname;
- strcpy (_reent_winsup ()->mnt_dir, posix_path);
- ret.mnt_dir = _reent_winsup ()->mnt_dir;
-
- if (!(flags & MOUNT_SYSTEM)) /* user mount */
- strcpy (_reent_winsup ()->mnt_type, (char *) "user");
- else /* system mount */
- strcpy (_reent_winsup ()->mnt_type, (char *) "system");
-
- ret.mnt_type = _reent_winsup ()->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 (_reent_winsup ()->mnt_opts, (char *) "textmode");
- else
- strcpy (_reent_winsup ()->mnt_opts, (char *) "binmode");
-
- if (flags & MOUNT_CYGWIN_EXEC)
- strcat (_reent_winsup ()->mnt_opts, (char *) ",cygexec");
- else if (flags & MOUNT_EXEC)
- strcat (_reent_winsup ()->mnt_opts, (char *) ",exec");
- else if (flags & MOUNT_NOTEXEC)
- strcat (_reent_winsup ()->mnt_opts, (char *) ",noexec");
-
- if ((flags & MOUNT_CYGDRIVE)) /* cygdrive */
- strcat (_reent_winsup ()->mnt_opts, (char *) ",noumount");
-
- ret.mnt_opts = _reent_winsup ()->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[MAX_PATH];
- DWORD mask = 1, drive = 'a';
- struct mntent *ret = NULL;
-
- while (available_drives)
- {
- for (/* nothing */; drive <= 'z'; mask <<= 1, drive++)
- if (available_drives & mask)
- break;
-
- __small_sprintf (native_path, "%c:\\", drive);
- if (GetDriveType (native_path) == DRIVE_REMOVABLE ||
- GetFileAttributes (native_path) == INVALID_FILE_ATTRIBUTES)
- {
- 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;
-
- 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
- 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)
-{
- 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;
-}
-
-extern "C" FILE *
-setmntent (const char *filep, const char *)
-{
- iteration = 0;
- available_drives = GetLogicalDrives ();
- return (FILE *) filep;
-}
-
-extern "C" struct mntent *
-getmntent (FILE *)
-{
- return mount_table->getmntent (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. */
-int allow_winsymlinks = TRUE;
-
-extern "C" int
-symlink (const char *topath, const char *frompath)
-{
- HANDLE h;
- int res = -1;
- path_conv win32_path, win32_topath;
- char from[MAX_PATH + 5];
- char cwd[MAX_PATH + 1], *cp = NULL, c = 0;
- char w32topath[MAX_PATH + 1];
- DWORD written;
- SECURITY_ATTRIBUTES sa = sec_none_nih;
-
- /* POSIX says that empty 'frompath' is invalid input whlie empty
- 'topath' is valid -- it's symlink resolver job to verify if
- symlink contents point to existing filesystem object */
- if (check_null_empty_str_errno (topath) == EFAULT ||
- check_null_empty_str_errno (frompath))
- goto done;
-
- if (strlen (topath) >= MAX_PATH)
- {
- set_errno (ENAMETOOLONG);
- goto done;
- }
-
- win32_path.check (frompath, PC_SYM_NOFOLLOW);
- if (allow_winsymlinks && !win32_path.exists ())
- {
- strcpy (from, frompath);
- 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)", topath, win32_path.get_win32 ());
-
- if (win32_path.is_device () || win32_path.exists ())
- {
- set_errno (EEXIST);
- goto done;
- }
-
- if (allow_winsymlinks)
- {
- if (!isabspath (topath))
- {
- getcwd (cwd, MAX_PATH + 1);
- if ((cp = strrchr (from, '/')) || (cp = strrchr (from, '\\')))
- {
- c = *cp;
- *cp = '\0';
- chdir (from);
- }
- backslashify (topath, w32topath, 0);
- }
- if (!cp || GetFileAttributes (w32topath) == INVALID_FILE_ATTRIBUTES)
- {
- win32_topath.check (topath, PC_SYM_NOFOLLOW);
- if (!cp || win32_topath.error != ENOENT)
- strcpy (w32topath, win32_topath);
- }
- if (cp)
- {
- *cp = c;
- chdir (cwd);
- }
- }
-
- if (allow_ntsec && win32_path.has_acls ())
- set_security_attribute (S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO,
- &sa, alloca (4096), 4096);
-
- h = CreateFile (win32_path, GENERIC_WRITE, 0, &sa,
- CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
- if (h == INVALID_HANDLE_VALUE)
- __seterrno ();
- else
- {
- BOOL success;
-
- if (allow_winsymlinks)
- {
- create_shortcut_header ();
- /* Don't change the datatypes of `len' and `win_len' since
- their sizeof is used when writing. */
- unsigned short len = strlen (topath);
- unsigned short win_len = strlen (w32topath);
- success = WriteFile (h, shortcut_header, SHORTCUT_HDR_SIZE,
- &written, NULL)
- && written == SHORTCUT_HDR_SIZE
- && WriteFile (h, &len, sizeof len, &written, NULL)
- && written == sizeof len
- && WriteFile (h, topath, len, &written, NULL)
- && written == len
- && WriteFile (h, &win_len, sizeof win_len, &written, NULL)
- && written == sizeof win_len
- && WriteFile (h, w32topath, win_len, &written, NULL)
- && written == win_len;
- }
- else
- {
- /* This is the old technique creating a symlink. */
- char buf[sizeof (SYMLINK_COOKIE) + MAX_PATH + 10];
-
- __small_sprintf (buf, "%s%s", SYMLINK_COOKIE, topath);
- 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 (win32_path.has_acls (),
- win32_path.get_win32 (),
- S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO);
-
- DWORD attr = allow_winsymlinks ? 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.get_win32 (), attr);
-
- if (win32_path.fs_fast_ea ())
- set_symlink_ea (win32_path, topath);
- res = 0;
- }
- else
- {
- __seterrno ();
- CloseHandle (h);
- DeleteFileA (win32_path.get_win32 ());
- }
- }
-
-done:
- syscall_printf ("%d = symlink (%s, %s)", res, topath, frompath);
- return res;
-}
-
-static BOOL
-cmp_shortcut_header (const char *file_header)
-{
- create_shortcut_header ();
- return memcmp (shortcut_header, file_header, SHORTCUT_HDR_SIZE);
-}
-
-static int
-check_shortcut (const char *path, DWORD fileattr, HANDLE h,
- char *contents, int *error, unsigned *pflags)
-{
- char file_header[SHORTCUT_HDR_SIZE];
- unsigned short len;
- int res = 0;
- DWORD got = 0;
-
- /* Valid Cygwin & U/WIN shortcuts are R/O. */
- if (!(fileattr & FILE_ATTRIBUTE_READONLY))
- goto file_not_symlink;
- /* Read the files header information. This is used to check for a
- Cygwin or U/WIN shortcut or later to check for executable files. */
- if (!ReadFile (h, file_header, SHORTCUT_HDR_SIZE, &got, 0))
- {
- *error = EIO;
- goto close_it;
- }
- /* Check header if the shortcut is really created by Cygwin or U/WIN. */
- if (got != SHORTCUT_HDR_SIZE || cmp_shortcut_header (file_header))
- goto file_not_symlink;
- /* Next 2 byte are USHORT, containing length of description entry. */
- if (!ReadFile (h, &len, sizeof len, &got, 0))
- {
- *error = EIO;
- goto close_it;
- }
- if (got != sizeof len || len == 0 || len > MAX_PATH)
- goto file_not_symlink;
- /* Now read description entry. */
- if (!ReadFile (h, contents, len, &got, 0))
- {
- *error = EIO;
- goto close_it;
- }
- if (got != len)
- goto file_not_symlink;
- contents[len] = '\0';
- res = len;
- if (res) /* It's a symlink. */
- *pflags = PATH_SYMLINK;
- goto close_it;
-
-file_not_symlink:
- /* Not a symlink, see if executable. */
- if (!(*pflags & PATH_ALL_EXEC) && has_exec_chars (file_header, got))
- *pflags |= PATH_EXEC;
-
-close_it:
- CloseHandle (h);
- return res;
-}
-
-
-static int
-check_sysfile (const char *path, DWORD fileattr, HANDLE h,
- char *contents, int *error, unsigned *pflags)
-{
- 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");
- *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, MAX_PATH + 1, &got, 0);
- if (!res)
- {
- debug_printf ("ReadFile2 failed");
- *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. */
- if (memchr (contents, 0, got) != NULL)
- res = strlen (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_EXTRALNK;}
-};
-
-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;
- }
- if (!*suffixes->name)
- suffixes++;
- nextstate = SCAN_EXTRALNK;
- /* fall through to suffix checking below */
- break;
- case SCAN_HASLNK:
- nextstate = SCAN_EXTRALNK; /* Skip SCAN_BEG */
- return 1;
- case SCAN_LNK:
- case SCAN_EXTRALNK:
- strcpy (eopath, ".lnk");
- nextstate = SCAN_DONE;
- return 1;
- case SCAN_JUSTCHECK:
- nextstate = SCAN_APPENDLNK;
- return 1;
- case SCAN_APPENDLNK:
- strcat (eopath, ".lnk");
- nextstate = SCAN_DONE;
- return 1;
- default:
- *eopath = '\0';
- return 0;
- }
-
- while (suffixes && suffixes->name)
- if (!suffixes->addon)
- suffixes++;
- else
- {
- strcpy (eopath, suffixes->name);
- if (nextstate == SCAN_EXTRALNK)
- strcat (eopath, ".lnk");
- suffixes++;
- return 1;
- }
- suffixes = NULL;
- }
-}
-
-/* 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';
-
- is_symlink = TRUE;
- ext_here = suffix.has (path, suffixes);
- extn = ext_here - path;
-
- pflags &= ~PATH_SYMLINK;
-
- 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);
- error = geterrno_from_win_error (GetLastError (), 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;
- 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, fileattr, h, contents, &error, &pflags);
- if (res)
- 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, fileattr, h, contents, &error, &pflags);
- if (!res)
- goto file_not_symlink;
- break;
- }
- break;
-
- file_not_symlink:
- is_symlink = false;
- syscall_printf ("not a symlink");
- res = 0;
- break;
- }
-
- syscall_printf ("%d = symlink.check (%s, %p) (%p)",
- res, suffix.path, contents, pflags);
- return res;
-}
-
-/* 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 (strcmp (c, 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 */
-
-unsigned long __stdcall
-hash_path_name (unsigned long 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 << 5) - hash + '\\';
- }
- }
-
-hashit:
- /* Build up hash. Ignore single trailing slash or \a\b\ != \a\b or
- \a\b\. but allow a single \ if that's all there is. */
- do
- {
- int ch = cyg_tolower (*name);
- hash = (hash << 5) - hash + ch;
- }
- while (*++name != '\0' &&
- !(*name == '\\' && (!name[1] || (name[1] == '.' && !name[2]))));
- return hash;
-}
-
-char *
-getcwd (char *buf, size_t ulen)
-{
- char* res = NULL;
- if (ulen == 0 && buf)
- set_errno (EINVAL);
- else if (buf == NULL || !__check_null_invalid_struct_errno (buf, ulen))
- res = cygheap->cwd.get (buf, 1, 1, ulen);
- return res;
-}
-
-/* getwd: standards? */
-extern "C" char *
-getwd (char *buf)
-{
- return getcwd (buf, MAX_PATH);
-}
-
-/* chdir: POSIX 5.2.1.1 */
-extern "C" int
-chdir (const char *in_dir)
-{
- if (check_null_empty_str_errno (in_dir))
- return -1;
-
- syscall_printf ("dir '%s'", in_dir);
-
- char *s;
- char dir[strlen (in_dir) + 1];
- strcpy (dir, in_dir);
- /* Incredibly. Windows allows you to specify a path with trailing
- whitespace to SetCurrentDirectory. This doesn't work too well
- with other parts of the API, though, apparently. So nuke trailing
- white space. */
- for (s = strchr (dir, '\0'); --s >= dir && isspace ((unsigned int) (*s & 0xff)); )
- *s = '\0';
-
- if (!*s)
- {
- set_errno (ENOENT);
- return -1;
- }
-
- /* Convert path. First argument ensures that we don't check for NULL/empty/invalid
- again. */
- path_conv path (PC_NONULLEMPTY, dir, PC_FULL | PC_SYM_FOLLOW);
- if (path.error)
- {
- set_errno (path.error);
- syscall_printf ("-1 = chdir (%s)", dir);
- return -1;
- }
-
-
- /* Look for trailing path component consisting entirely of dots. This
- is needed only in case of chdir since Windows simply ignores count
- of dots > 2 here instead of returning an error code. Counts of dots
- <= 2 are already eliminated by normalize_posix_path. */
- const char *p = strrchr (dir, '/');
- if (!p)
- p = dir;
- else
- p++;
-
- size_t len = strlen (p);
- if (len > 2 && strspn (p, ".") == len)
- {
- set_errno (ENOENT);
- return -1;
- }
-
- const char *native_dir = path.get_win32 ();
-
- /* 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';
- }
- int res;
- int devn = path.get_devn ();
- if (!isvirtual_dev (devn))
- res = SetCurrentDirectory (native_dir) ? 0 : -1;
- else if (!path.exists ())
- {
- set_errno (ENOENT);
- return -1;
- }
- else if (!path.isdir ())
- {
- set_errno (ENOTDIR);
- return -1;
- }
- else
- {
- native_dir = "c:\\";
- res = 0;
- }
-
- /* If res != 0, we didn't change to a new directory.
- Otherwise, set the current windows and posix directory cache from input.
- If the specified directory is a MS-DOS style directory or if the directory
- was symlinked, convert the MS-DOS path back to posix style. Otherwise just
- store the given directory. This allows things like "find", which traverse
- directory trees, to work correctly with Cygwin mounted directories.
- FIXME: Is just storing the posixized windows directory the correct thing to
- do when we detect a symlink? Should we instead rebuild the posix path from
- the input by traversing links? This would be an expensive operation but
- we'll see if Cygwin mailing list users whine about the current behavior. */
- if (res)
- __seterrno ();
- else if ((!path.has_symlinks () && strpbrk (dir, ":\\") == NULL
- && pcheck_case == PCHECK_RELAXED) || isvirtual_dev (devn))
- cygheap->cwd.set (native_dir, dir);
- else
- cygheap->cwd.set (native_dir, NULL);
-
- /* 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;
- sigframe thisframe (mainthread);
-
- cygheap_fdget cfd (fd);
- if (cfd >= 0)
- res = chdir (cfd->get_win32_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. */
-
-extern "C" int
-cygwin_conv_to_win32_path (const char *path, char *win32_path)
-{
- path_conv p (path, PC_SYM_FOLLOW);
- if (p.error)
- {
- win32_path[0] = '\0';
- set_errno (p.error);
- return -1;
- }
-
- strcpy (win32_path, 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_FULL);
- 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)
-{
- if (check_null_empty_str_errno (path))
- return -1;
- mount_table->conv_to_posix_path (path, posix_path, 1);
- return 0;
-}
-
-extern "C" int
-cygwin_conv_to_full_posix_path (const char *path, char *posix_path)
-{
- if (check_null_empty_str_errno (path))
- return -1;
- mount_table->conv_to_posix_path (path, posix_path, 0);
- return 0;
-}
-
-/* The realpath function is supported on some UNIX systems. */
-
-extern "C" char *
-realpath (const char *path, char *resolved)
-{
- int err;
-
- path_conv real_path (path, PC_SYM_FOLLOW | PC_FULL);
-
- if (real_path.error)
- err = real_path.error;
- else
- {
- err = mount_table->conv_to_posix_path (real_path.get_win32 (), resolved, 0);
- if (err == 0)
- return resolved;
- }
-
- /* FIXME: on error, we are supposed to put the name of the path
- component which could not be resolved into RESOLVED. */
- resolved[0] = '\0';
-
- set_errno (err);
- 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
-<sect1 id="add-func-cygwin-posix-path-list-p">
- <para>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.</para>
-</sect1>
-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, int to_posix_p)
-{
- int i, num_elms, max_mount_path_len, size;
- const char *p;
-
- /* The theory is that an upper bound is
- current_size + (num_elms * max_mount_path_len) */
-
- char delim = to_posix_p ? ';' : ':';
- p = path_list;
- for (num_elms = 1; (p = strchr (p, delim)) != NULL; ++num_elms)
- ++p;
-
- /* 7: strlen ("//c") + slop, a conservative initial value */
- for (max_mount_path_len = 7, i = 0; i < mount_table->nmounts; ++i)
- {
- int mount_len = (to_posix_p
- ? 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) + 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, 1);
-}
-
-extern "C" int
-cygwin_posix_to_win32_path_list_buf_size (const char *path_list)
-{
- return conv_path_list_buf_size (path_list, 0);
-}
-
-extern "C" int
-cygwin_win32_to_posix_path_list (const char *win32, char *posix)
-{
- conv_path_list (win32, posix, 1);
- return 0;
-}
-
-extern "C" int
-cygwin_posix_to_win32_path_list (const char *posix, char *win32)
-{
- conv_path_list (posix, win32, 0);
- return 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 ()
-{
- new_muto (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;
-
- int i;
- DWORD len, dlen;
- for (i = 0, dlen = MAX_PATH, len = 0; i < 3; dlen *= 2, i++)
- {
- win32 = (char *) crealloc (win32, dlen + 2);
- if ((len = GetCurrentDirectoryA (dlen, win32)) < dlen)
- break;
- }
-
- if (len == 0)
- {
- __seterrno ();
- cwd_lock->release ();
- debug_printf ("get_initial_cwd failed, %E");
- cwd_lock->release ();
- return 0;
- }
- set (NULL);
- return 1; /* Leaves cwd lock unreleased */
-}
-
-/* Fill out the elements of a cwdstuff struct.
- It is assumed that the lock for the cwd is acquired if
- win32_cwd == NULL. */
-void
-cwdstuff::set (const char *win32_cwd, const char *posix_cwd)
-{
- char pathbuf[MAX_PATH];
-
- if (win32_cwd)
- {
- cwd_lock->acquire ();
- win32 = (char *) crealloc (win32, strlen (win32_cwd) + 1);
- strcpy (win32, win32_cwd);
- }
-
- if (!posix_cwd)
- mount_table->conv_to_posix_path (win32, pathbuf, 0);
- else
- (void) normalize_posix_path (posix_cwd, pathbuf);
-
- posix = (char *) crealloc (posix, strlen (pathbuf) + 1);
- strcpy (posix, pathbuf);
-
- hash = hash_path_name (0, win32);
-
- if (win32_cwd)
- cwd_lock->release ();
-
- return;
-}
-
-/* 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;
-}
diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h
deleted file mode 100644
index 9d8291a59..000000000
--- a/winsup/cygwin/path.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/* path.h: path data structures
-
- 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. */
-
-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_FULL = 0x0010,
- PC_NULLEMPTY = 0x0020,
- PC_CHECK_EA = 0x0040,
- PC_POSIX = 0x0080
-};
-
-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_ALL_EXEC = (PATH_CYGWIN_EXEC | PATH_EXEC),
- PATH_TEXT = 0x02000000,
- PATH_ISDISK = 0x04000000,
- PATH_HAS_SYMLINKS = 0x10000000,
- PATH_HASBUGGYOPEN = 0x20000000,
- PATH_SOCKET = 0x40000000,
- PATH_HASACLS = 0x80000000
-};
-
-class symlink_info;
-struct fs_info
-{
- char name[MAX_PATH];
- char root_dir[MAX_PATH];
- DWORD flags;
- DWORD serial;
- DWORD sym_opt; /* additional options to pass to symlink_info resolver */
- DWORD is_remote_drive;
- DWORD drive_type;
- bool update (const char *);
-};
-class path_conv
-{
- char path[MAX_PATH];
- DWORD fileattr;
- fs_info fs;
- void add_ext_from_sym (symlink_info&);
- public:
-
- unsigned path_flags;
- char *known_suffix;
- int error;
- DWORD devn;
- int unit;
- BOOL case_clash;
- char *normalized_path;
-
- int isdisk () const { return path_flags & PATH_ISDISK;}
- int isremote () const {return fs.is_remote_drive;}
- int has_acls () const {return path_flags & PATH_HASACLS;}
- int has_symlinks () const {return path_flags & PATH_HAS_SYMLINKS;}
- int hasgood_inode () const {return path_flags & PATH_HASACLS;} // Not strictly correct
- int has_buggy_open () const {return path_flags & PATH_HASBUGGYOPEN;}
- 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 issocket () const {return path_flags & PATH_SOCKET;}
- int iscygexec () const {return path_flags & PATH_CYGWIN_EXEC;}
- 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 () {path_flags |= PATH_SYMLINK;}
- void set_has_symlinks () {path_flags |= PATH_HAS_SYMLINKS;}
- void set_isdisk () {path_flags |= PATH_ISDISK; devn = FH_DISK;}
- void set_exec (int x = 1) {path_flags |= x ? PATH_EXEC : PATH_NOTEXEC;}
- void set_has_acls (int x = 1) {path_flags |= x ? PATH_HASACLS : PATH_NOTHING;}
- void set_has_buggy_open (int x = 1) {path_flags |= x ? PATH_HASBUGGYOPEN : PATH_NOTHING;}
-
- void check (const char *src, unsigned opt = PC_SYM_FOLLOW,
- const suffix_info *suffixes = NULL) __attribute__ ((regparm(3)));
-
- 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), devn (0), unit (0),
- normalized_path (NULL) {path[0] = '\0';}
-
- inline char *get_win32 () { return path; }
- 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];}
- BOOL is_device () {return devn != FH_BAD && devn != FH_DISK;}
- DWORD get_devn () {return devn == FH_BAD ? (DWORD) FH_DISK : devn;}
- short get_unitn () {return devn == FH_BAD ? 0 : unit;}
- DWORD file_attributes () {return fileattr;}
- DWORD drive_type () {return fs.drive_type;}
- BOOL fs_fast_ea () {return fs.sym_opt & PC_CHECK_EA;}
- void set_path (const char *p) {strcpy (path, p);}
- char *return_and_clear_normalized_path ();
- const char * root_dir () { return fs.root_dir; }
- DWORD volser () { return fs.serial; }
- const char *volname () {return fs.name; }
- void fillin (HANDLE h);
-};
-
-/* Symlink marker */
-#define SYMLINK_COOKIE "!<symlink>"
-
-#define SYMLINK_EA_NAME ".CYGSYMLINK"
-
-/* Socket marker */
-#define SOCKET_COOKIE "!<socket >"
-
-/* 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 */
-};
-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)));
-
-int path_prefix_p (const char *path1, const char *path2, int len1) __attribute__ ((regparm (3)));
diff --git a/winsup/cygwin/path.sgml b/winsup/cygwin/path.sgml
deleted file mode 100644
index 6030c8f78..000000000
--- a/winsup/cygwin/path.sgml
+++ /dev/null
@@ -1,205 +0,0 @@
-<sect1 id="func-cygwin-posix-to-win32-path-list">
-<title>cygwin_posix_to_win32_path_list</title>
-
-<funcsynopsis>
-<funcdef>extern "C" void
-<function>cygwin_posix_to_win32_path_list</function></funcdef>
-<paramdef>const char *<parameter>posix</parameter></paramdef>
-<paramdef>char *<parameter>win32</parameter></paramdef>
-</funcsynopsis>
-
-<para>Given a POSIX path-style string (i.e. /foo:/bar) convert it to
-the equivalent Win32 path-style string (i.e. d:\;e:\bar).
-<parameter>win32</parameter> must point to a sufficiently large
-buffer.</para>
-
-<example>
-<title>Example use of cygwin_posix_to_win32_path_list</title>
-<programlisting>
-char *_epath;
-char *_win32epath;
-_epath = _win32epath = getenv (NAME);
-/* If we have a POSIX path list, convert to win32 path list */
-if (_epath != NULL && *_epath != 0
- && cygwin_posix_path_list_p (_epath))
- {
- _win32epath = (char *) xmalloc
- (cygwin_posix_to_win32_path_list_buf_size (_epath));
- cygwin_posix_to_win32_path_list (_epath, _win32epath);
- }
-</programlisting>
-</example>
-
-<para>See also <link linkend="func-cygwin-posix-to-win32-path-list-buf-size">
-cygwin_posix_to_win32_path_list_buf_size</link></para>
-
-</sect1>
-
-<sect1 id="func-cygwin-win32-to-posix-path-list">
-<title>cygwin_win32_to_posix_path_list</title>
-
-<funcsynopsis>
-<funcdef>extern "C" void
-<function>cygwin_win32_to_posix_path_list</function></funcdef>
-<paramdef>const char *<parameter>win32</parameter></paramdef>
-<paramdef>char *<parameter>posix</parameter></paramdef>
-</funcsynopsis>
-
-<para>Given a Win32 path-style string (i.e. d:\;e:\bar) convert it to
-the equivalent POSIX path-style string (i.e. /foo:/bar).
-<parameter>posix</parameter> must point to a sufficiently large
-buffer. See also <link
-linkend="func-cygwin-win32-to-posix-path-list-buf-size">
-cygwin_win32_to_posix_path_list_buf_size</link></para>
-
-</sect1>
-
-<sect1 id="func-cygwin-posix-to-win32-path-list-buf-size">
-<title>cygwin_posix_to_win32_path_list_buf_size</title>
-
-<funcsynopsis>
-<funcdef>extern "C" int
-<function>cygwin_posix_to_win32_path_list_buf_size</function></funcdef>
-<paramdef>const char *<parameter>path_list</parameter></paramdef>
-</funcsynopsis>
-
-<para>Returns the number of bytes needed to hold the result of calling
-<link linkend="func-cygwin-posix-to-win32-path-list">
-cygwin_posix_to_win32_path_list</link>.</para>
-
-</sect1>
-
-<sect1 id="func-cygwin-win32-to-posix-path-list-buf-size">
-<title>cygwin_win32_to_posix_path_list_buf_size</title>
-
-<funcsynopsis>
-<funcdef>extern "C" int
-<function>cygwin_win32_to_posix_path_list_buf_size</function></funcdef>
-<paramdef>const char *<parameter>path_list</parameter></paramdef>
-</funcsynopsis>
-
-<para>Tells you how many bytes are needed for the results of <link
-linkend="func-cygwin-win32-to-posix-path-list">
-cygwin_win32_to_posix_path_list</link>.</para>
-
-</sect1>
-
-<sect1 id="func-cygwin-conv-to-posix-path">
-<title>cygwin_conv_to_posix_path</title>
-
-<funcsynopsis>
-<funcdef>extern "C" void
-<function>cygwin_conv_to_posix_path</function></funcdef>
-<paramdef>const char *<parameter>path</parameter></paramdef>
-<paramdef>char *<parameter>posix_path</parameter></paramdef>
-</funcsynopsis>
-
-<para>Converts a Win32 path to a POSIX path. If
-<parameter>path</parameter> is already a POSIX path, leaves it alone.
-If <parameter>path</parameter> is relative, then
-<parameter>posix_path</parameter> will also be relative. Note that
-<parameter>posix_path</parameter> must point to a buffer of sufficient
-size; use MAX_PATH if needed.</para>
-
-</sect1>
-
-<sect1 id="func-cygwin-conv-to-win32-path">
-<title>cygwin_conv_to_win32_path</title>
-
-<funcsynopsis>
-<funcdef>extern "C" void
-<function>cygwin_conv_to_win32_path</function></funcdef>
-<paramdef>const char *<parameter>path</parameter></paramdef>
-<paramdef>char *<parameter>win32_path</parameter></paramdef>
-</funcsynopsis>
-
-<para>Converts a POSIX path to a Win32 path. If
-<parameter>path</parameter> is already a Win32 path, leaves it alone.
-If <parameter>path</parameter> is relative, then
-<parameter>win32_path</parameter> will also be relative. Note that
-<parameter>win32_path</parameter> must point to a buffer of sufficient
-size; use MAX_PATH if needed.</para>
-
-</sect1>
-<sect1 id="func-cygwin-conv-to-full-posix-path">
-<title>cygwin_conv_to_full_posix_path</title>
-
-<funcsynopsis>
-<funcdef>extern "C" void
-<function>cygwin_conv_to_full_posix_path</function></funcdef>
-<paramdef>const char *<parameter>path</parameter></paramdef>
-<paramdef>char *<parameter>posix_path</parameter></paramdef>
-</funcsynopsis>
-
-<para>Converts a Win32 path to a POSIX path. If
-<parameter>path</parameter> is already a POSIX path, leaves it alone.
-If <parameter>path</parameter> is relative, then
-<parameter>posix_path</parameter> will be converted to an absolute
-path. Note that <parameter>posix_path</parameter> must point to a
-buffer of sufficient size; use MAX_PATH if needed.</para>
-
-</sect1>
-
-<sect1 id="func-cygwin-conv-to-full-win32-path">
-<title>cygwin_conv_to_full_win32_path</title>
-
-<funcsynopsis>
-<funcdef>extern "C" void
-<function>cygwin_conv_to_full_win32_path</function></funcdef>
-<paramdef>const char *<parameter>path</parameter></paramdef>
-<paramdef>char *<parameter>win32_path</parameter></paramdef>
-</funcsynopsis>
-
-<para>Converts a POSIX path to a Win32 path. If
-<parameter>path</parameter> is already a Win32 path, leaves it alone.
-If <parameter>path</parameter> is relative, then
-<parameter>win32_path</parameter> will be converted to an absolute
-path. Note that <parameter>win32_path</parameter> must point to a
-buffer of sufficient size; use MAX_PATH if needed.</para>
-
-</sect1>
-
-<sect1 id="func-cygwin-posix-path-list-p">
-<title>cygwin_posix_path_list_p</title>
-
-<funcsynopsis>
-<funcdef>extern "C" int
-<function>posix_path_list_p</function></funcdef>
-<paramdef>const char *<parameter>path</parameter></paramdef>
-</funcsynopsis>
-
-<para>This function tells you if the supplied
-<parameter>path</parameter> 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.</para>
-
-</sect1>
-
-<sect1 id="func-cygwin-split-path">
-<title>cygwin_split_path</title>
-
-<funcsynopsis>
-<funcdef>extern "C" void
-<function>cygwin_split_path</function>
-</funcdef>
-<paramdef>const char * <parameter>path</parameter></paramdef>
-<paramdef>char * <parameter>dir</parameter></paramdef>
-<paramdef>char * <parameter>file</parameter></paramdef>
-</funcsynopsis>
-
-<para>Split a path into the directory and the file portions. Both
-<parameter>dir</parameter> and <parameter>file</parameter> are
-expected to point to buffers of sufficient size. </para>
-
-<example>
-<title>Example use of cygwin_split_path</title>
-<programlisting>
-char dir[200], file[100];
-cygwin_split_path("c:/foo/bar.c", dir, file);
-printf("dir=%s, file=%s\n", dir, file);
-</programlisting>
-</example>
-</sect1>
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 <sys/cygwin.h>
-
-#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/perthread.h b/winsup/cygwin/perthread.h
deleted file mode 100644
index 60c78f3ea..000000000
--- a/winsup/cygwin/perthread.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/* perthread.h: Header file for cygwin thread-local storage.
-
- Copyright 2000, 2001, 2002 Red Hat, Inc.
-
- Written by Christopher Faylor <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. */
-
-#define PTMAGIC 0x77366377
-
-struct _reent;
-extern struct _reent reent_data;
-
-#define PER_THREAD_FORK_CLEAR ((void *)0xffffffff)
-class per_thread
-{
- DWORD tls;
- int clear_on_fork_p;
-public:
- per_thread (int forkval = 1) {tls = TlsAlloc (); clear_on_fork_p = forkval;}
- DWORD get_tls () {return tls;}
- int clear_on_fork () {return clear_on_fork_p;}
-
- virtual void *get () {return TlsGetValue (get_tls ());}
- virtual size_t size () {return 0;}
- virtual void set (void *s = NULL);
- virtual void set (int n) {TlsSetValue (get_tls (), (void *)n);}
- virtual void *create ()
- {
- void *s = new char [size ()];
- memset (s, 0, size ());
- set (s);
- return s;
- }
-};
-
-class per_thread_waitq : public per_thread
-{
-public:
- per_thread_waitq () : per_thread (0) {}
- void *get () {return (waitq *) this->per_thread::get ();}
- void *create () {return (waitq *) this->per_thread::create ();}
- size_t size () {return sizeof (waitq);}
-};
-
-#if defined (NEED_VFORK)
-class vfork_save
-{
- jmp_buf j;
- int exitval;
- public:
- int pid;
- DWORD frame[100];
- char **vfork_ebp;
- char **vfork_esp;
- int ctty;
- pid_t sid;
- pid_t pgid;
- int is_active () { return pid < 0; }
- void restore_pid (int val)
- {
- pid = val;
- longjmp (j, 1);
- }
- void restore_exit (int val)
- {
- exitval = val;
- longjmp (j, 1);
- }
- friend int vfork ();
-};
-
-class per_thread_vfork : public per_thread
-{
-public:
- vfork_save *val () { return (vfork_save *) this->per_thread::get (); }
- vfork_save *create () {return (vfork_save *) this->per_thread::create ();}
- size_t size () {return sizeof (vfork_save);}
-};
-extern per_thread_vfork vfork_storage;
-extern vfork_save *main_vfork;
-#endif
-
-extern "C" {
-struct signal_dispatch
-{
- int arg;
- void (*func) (int);
- int sig;
- int saved_errno;
- int sa_flags;
- DWORD oldmask;
- DWORD newmask;
- DWORD retaddr;
- DWORD *retaddr_on_stack;
-};
-};
-
-struct per_thread_signal_dispatch : public per_thread
-{
- signal_dispatch *get () { return (signal_dispatch *) this->per_thread::get (); }
- signal_dispatch *create () {return (signal_dispatch *) this->per_thread::create ();}
- size_t size () {return sizeof (signal_dispatch);}
-};
-
-extern per_thread_waitq waitq_storage;
-extern per_thread_signal_dispatch signal_dispatch_storage;
-
-extern per_thread *threadstuff[];
diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc
deleted file mode 100644
index 336405fde..000000000
--- a/winsup/cygwin/pinfo.cc
+++ /dev/null
@@ -1,661 +0,0 @@
-/* pinfo.cc: process table 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. */
-
-#include "winsup.h"
-#include <stdlib.h>
-#include <time.h>
-#include <errno.h>
-#include <limits.h>
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygerrno.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include "cygwin_version.h"
-#include "perprocess.h"
-#include "environ.h"
-#include <assert.h>
-#include <ntdef.h>
-#include "ntdll.h"
-#include "cygthread.h"
-#include "shared_info.h"
-
-static char NO_COPY pinfo_dummy[sizeof (_pinfo)] = {0};
-
-pinfo NO_COPY myself ((_pinfo *)&pinfo_dummy); // Avoid myself != NULL checks
-
-HANDLE hexec_proc;
-
-void __stdcall
-pinfo_fixup_after_fork ()
-{
- if (hexec_proc)
- CloseHandle (hexec_proc);
-
- if (!DuplicateHandle (hMainProc, hMainProc, hMainProc, &hexec_proc, 0,
- TRUE, DUPLICATE_SAME_ACCESS))
- {
- system_printf ("couldn't save current process handle %p, %E", hMainProc);
- hexec_proc = NULL;
- }
-}
-
-/* Initialize the process table.
- This is done once when the dll is first loaded. */
-
-void __stdcall
-set_myself (pid_t pid, HANDLE h)
-{
- DWORD winpid = GetCurrentProcessId ();
- if (pid == 1)
- pid = cygwin_pid (winpid);
- myself.init (pid, PID_IN_USE | PID_MYSELF, h);
- myself->dwProcessId = winpid;
- myself->process_state |= PID_IN_USE;
- myself->start_time = time (NULL); /* Register our starting time. */
-
- (void) GetModuleFileName (NULL, myself->progname, sizeof (myself->progname));
- if (!strace.active)
- strace.hello ();
- InitializeCriticalSection (&myself->lock);
- return;
-}
-
-/* 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 (1);
- myself->ppid = 1;
- myself->pgid = myself->sid = myself->pid;
- myself->ctty = -1;
- myself->uid = ILLEGAL_UID;
-
- environ_init (NULL, 0); /* call after myself has been set up */
- }
-
- debug_printf ("pid %d, pgid %d", myself->pid, myself->pgid);
-}
-
-void
-_pinfo::exit (UINT n, bool norecord)
-{
- if (this)
- {
- if (!norecord)
- process_state = PID_EXITED;
-
- /* FIXME: There is a potential race between an execed process and its
- parent here. I hated to add a mutex just for this, though. */
- struct rusage r;
- fill_rusage (&r, hMainProc);
- add_rusage (&rusage_self, &r);
- }
-
- cygthread::terminate ();
- sigproc_printf ("Calling ExitProcess %d", n);
- ExitProcess (n);
-}
-
-void
-pinfo::init (pid_t n, DWORD flag, HANDLE in_h)
-{
- if (myself && n == myself->pid)
- {
- procinfo = myself;
- destroy = 0;
- h = NULL;
- return;
- }
-
- void *mapaddr;
- if (!(flag & PID_MYSELF))
- mapaddr = NULL;
- else
- {
- flag &= ~PID_MYSELF;
- HANDLE hdummy;
- mapaddr = open_shared (NULL, 0, hdummy, 0, SH_MYSELF);
- }
-
- int createit = flag & (PID_IN_USE | PID_EXECED);
- for (int i = 0; i < 10; i++)
- {
- int created;
- char mapname[MAX_PATH];
- __small_sprintf (mapname, "cygpid.%x", n);
-
- int mapsize;
- if (flag & PID_EXECED)
- mapsize = PINFO_REDIR_SIZE;
- else
- mapsize = sizeof (_pinfo);
-
- if (in_h)
- {
- h = in_h;
- created = 0;
- }
- else if (!createit)
- {
- h = OpenFileMappingA (FILE_MAP_READ | FILE_MAP_WRITE, FALSE, mapname);
- created = 0;
- }
- else
- {
- h = CreateFileMapping (INVALID_HANDLE_VALUE, &sec_all_nih,
- PAGE_READWRITE, 0, mapsize, mapname);
- created = h && GetLastError () != ERROR_ALREADY_EXISTS;
- }
-
- if (!h)
- {
- if (createit)
- __seterrno ();
- procinfo = NULL;
- return;
- }
-
- procinfo = (_pinfo *) MapViewOfFileEx (h, FILE_MAP_READ | FILE_MAP_WRITE,
- 0, 0, 0, mapaddr);
- ProtectHandle1 (h, pinfo_shared_handle);
-
- if ((procinfo->process_state & PID_INITIALIZING) && (flag & PID_NOREDIR)
- && cygwin_pid (procinfo->dwProcessId) != procinfo->pid)
- {
- release ();
- set_errno (ENOENT);
- return;
- }
-
- if (procinfo->process_state & PID_EXECED)
- {
- assert (!i);
- 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;
- release ();
- if (flag & PID_ALLPIDS)
- {
- set_errno (ENOENT);
- break;
- }
- continue;
- }
-
- /* In certain rare, 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. FIXME: I'm sure I'll regret doing it
- this way at some point. */
- if (i < 9 && !created && createit && (procinfo->process_state & PID_EXITED))
- {
- low_priority_sleep (5);
- release ();
- continue;
- }
-
- if (!created)
- /* nothing */;
- else if (!(flag & PID_EXECED))
- procinfo->pid = n;
- else
- {
- procinfo->process_state |= PID_IN_USE | PID_EXECED;
- procinfo->pid = myself->pid;
- }
- break;
- }
- destroy = 1;
-}
-
-bool
-_pinfo::alive ()
-{
- HANDLE h = OpenProcess (PROCESS_QUERY_INFORMATION, false, dwProcessId);
- if (h)
- CloseHandle (h);
- return !!h;
-}
-
-extern char **__argv;
-
-void
-_pinfo::commune_recv ()
-{
- DWORD nr;
- DWORD code;
- HANDLE hp;
- HANDLE __fromthem = NULL;
- HANDLE __tothem = NULL;
-
- hp = OpenProcess (PROCESS_DUP_HANDLE, false, dwProcessId);
- if (!hp)
- {
- sigproc_printf ("couldn't open handle for pid %d(%u)", pid, dwProcessId);
- hello_pid = -1;
- return;
- }
- if (!DuplicateHandle (hp, fromthem, hMainProc, &__fromthem, 0, false, DUPLICATE_SAME_ACCESS))
- {
- sigproc_printf ("couldn't duplicate fromthem, %E");
- CloseHandle (hp);
- hello_pid = -1;
- return;
- }
-
- if (!DuplicateHandle (hp, tothem, hMainProc, &__tothem, 0, false, DUPLICATE_SAME_ACCESS))
- {
- sigproc_printf ("couldn't duplicate tothem, %E");
- CloseHandle (__fromthem);
- CloseHandle (hp);
- hello_pid = -1;
- return;
- }
-
- CloseHandle (hp);
- hello_pid = 0;
-
- if (!ReadFile (__fromthem, &code, sizeof code, &nr, NULL) || nr != sizeof code)
- {
- /* __seterrno ();*/ // this is run from the signal thread, so don't set errno
- goto out;
- }
-
- switch (code)
- {
- case PICOM_CMDLINE:
- {
- unsigned n = 1;
- CloseHandle (__fromthem); __fromthem = NULL;
- for (char **a = __argv; *a; a++)
- n += strlen (*a) + 1;
- 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 (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;
- }
- }
- }
-
-out:
- if (__fromthem)
- CloseHandle (__fromthem);
- if (__tothem)
- CloseHandle (__tothem);
-}
-
-#define PIPEBUFSIZE (16 * sizeof (DWORD))
-
-commune_result
-_pinfo::commune_send (DWORD code)
-{
- HANDLE fromthem = NULL, tome = NULL;
- HANDLE fromme = NULL, tothem = NULL;
- DWORD nr;
- commune_result res;
-
- res.s = NULL;
- res.n = 0;
-
- if (!pid || !this)
- {
- set_errno (ESRCH);
- goto err;
- }
- if (!CreatePipe (&fromthem, &tome, &sec_all_nih, PIPEBUFSIZE))
- {
- sigproc_printf ("first CreatePipe failed, %E");
- __seterrno ();
- goto err;
- }
- if (!CreatePipe (&fromme, &tothem, &sec_all_nih, PIPEBUFSIZE))
- {
- sigproc_printf ("first CreatePipe failed, %E");
- __seterrno ();
- goto err;
- }
- EnterCriticalSection (&myself->lock);
- myself->tothem = tome;
- myself->fromthem = fromme;
- myself->hello_pid = pid;
- if (!WriteFile (tothem, &code, sizeof code, &nr, NULL) || nr != sizeof code)
- {
- __seterrno ();
- goto err;
- }
-
- if (sig_send (this, __SIGCOMMUNE))
- goto err;
-
- /* FIXME: Need something better than an busy loop here */
- bool isalive;
- while ((isalive = alive ()))
- if (myself->hello_pid <= 0)
- break;
- else
- low_priority_sleep (0);
-
- CloseHandle (tome);
- tome = NULL;
- CloseHandle (fromme);
- fromme = NULL;
-
- if (!isalive)
- {
- set_errno (ESRCH);
- goto err;
- }
-
- if (myself->hello_pid < 0)
- {
- set_errno (ENOSYS);
- goto err;
- }
-
- size_t n;
- if (!ReadFile (fromthem, &n, sizeof n, &nr, NULL) || nr != sizeof n)
- {
- __seterrno ();
- goto err;
- }
- switch (code)
- {
- case PICOM_CMDLINE:
- res.s = (char *) malloc (n);
- char *p;
- for (p = res.s; ReadFile (fromthem, p, n, &nr, NULL); p += nr)
- continue;
- if ((unsigned) (p - res.s) != n)
- {
- __seterrno ();
- goto err;
- }
- res.n = n;
- break;
- }
- CloseHandle (tothem);
- CloseHandle (fromthem);
- goto out;
-
-err:
- if (tome)
- CloseHandle (tome);
- if (fromthem)
- CloseHandle (fromthem);
- if (tothem)
- CloseHandle (tothem);
- if (fromme)
- CloseHandle (fromme);
- res.n = 0;
-out:
- myself->hello_pid = 0;
- LeaveCriticalSection (&myself->lock);
- return res;
-}
-
-char *
-_pinfo::cmdline (size_t& n)
-{
- char *s;
- if (!this || !pid)
- return NULL;
- if (pid != myself->pid)
- {
- commune_result cr = commune_send (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 *) malloc (n);
- for (char **a = __argv; *a; a++)
- {
- strcpy (p, *a);
- p = strchr (p, '\0') + 1;
- }
- *p = '\0';
- }
- return s;
-}
-
-void
-pinfo::release ()
-{
- if (h)
- {
-#ifdef DEBUGGING
- if (((DWORD) procinfo & 0x77000000) == 0x61000000) try_to_debug ();
-#endif
- UnmapViewOfFile (procinfo);
- procinfo = NULL;
- ForceCloseHandle1 (h, pinfo_shared_handle);
- h = NULL;
- }
-}
-
-/* DOCTOOL-START
-
-<sect1 id="func-cygwin-winpid-to-pid">
- <title>cygwin_winpid_to_pid</title>
-
- <funcsynopsis>
- <funcdef>extern "C" pid_t
- <function>cygwin_winpid_to_pid</function>
- </funcdef>
- <paramdef>int <parameter>winpid</parameter></paramdef>
- </funcsynopsis>
-
- <para>Given a windows pid, converts to the corresponding Cygwin
-pid, if any. Returns -1 if windows pid does not correspond to
-a cygwin pid.</para>
- <example>
- <title>Example use of cygwin_winpid_to_pid</title>
- <programlisting>
- extern "C" cygwin_winpid_to_pid (int winpid);
- pid_t mypid;
- mypid = cygwin_winpid_to_pid (windows_pid);
- </programlisting>
- </example>
-</sect1>
-
- 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 <tlhelp32.h>
-
-#define slop_pidlist 200
-#define size_pidlist(i) (sizeof (pidlist[0]) * ((i) + 1))
-#define size_pinfolist(i) (sizeof (pinfolist[0]) * ((i) + 1))
-
-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));
- }
-
- pinfolist[nelem].init (cygpid, PID_NOREDIR | (winpid ? PID_ALLPIDS : 0));
- if (winpid)
- /* nothing to do */;
- else if (!pinfolist[nelem])
- return;
- else
- /* 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 == pinfolist[nelem]->pid)
- {
- if ((_pinfo *) pinfolist[nelem] != (_pinfo *) myself)
- pinfolist[nelem].release ();
- return;
- }
-
- 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;
-}
-
-NO_COPY CRITICAL_SECTION winpids::cs;
-
-void
-winpids::set (bool winpid)
-{
- EnterCriticalSection (&cs);
- npids = (this->*enum_processes) (winpid);
- if (pidlist)
- pidlist[npids] = 0;
- LeaveCriticalSection (&cs);
-}
-
-void
-winpids::init ()
-{
- InitializeCriticalSection (&cs);
-}
-
-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 ()
-{
- for (unsigned i = 0; i < npids; i++)
- if (pinfolist[i] && (_pinfo *) pinfolist[i] != (_pinfo *) myself)
- pinfolist[i].release ();
-}
-
-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 89b683f94..000000000
--- a/winsup/cygwin/pinfo.h
+++ /dev/null
@@ -1,242 +0,0 @@
-/* pinfo.h: process table info
-
- 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. */
-
-#ifndef _PINFO_H
-#define _PINFO_H
-/* Signal constants (have to define them here, unfortunately) */
-
-enum
-{
- __SIGFLUSH = -2,
- __SIGSTRACE = -1,
- __SIGCOMMUNE = 0,
- __SIGOFFSET = 2
-};
-
-#define PSIZE 63
-
-#include <sys/resource.h>
-#include "thread.h"
-
-struct commune_result
-{
- char *s;
- int n;
-};
-
-enum picom
-{
- PICOM_CMDLINE = 1
-};
-
-class _pinfo
-{
-public:
- /* Cygwin pid */
- pid_t pid;
-
- /* Various flags indicating the state of the process. See PID_
- constants below. */
- DWORD process_state;
-
- /* If hProcess is set, it's because it came from a
- CreateProcess call. This means it's process relative
- to the thing which created the process. That's ok because
- we only use this handle from the parent. */
- HANDLE hProcess;
-
-#define PINFO_REDIR_SIZE ((char *) &myself.procinfo->hProcess - (char *) myself.procinfo)
-
- /* Handle associated with initial Windows pid which started it all. */
- HANDLE pid_handle;
-
- /* Handle to the logical parent of this pid. */
- HANDLE ppid_handle;
-
- /* 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[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;
-
- /* Non-zero if process was stopped by a signal. */
- char stopsig;
-
- /* commune */
- pid_t hello_pid;
- HANDLE tothem;
- HANDLE fromthem;
-
- void exit (UINT n, bool norecord = 0) __attribute__ ((noreturn, regparm(2)));
-
- 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 struct sigaction& getsig (int sig)
- {
- return thread2signal ? thread2signal->sigs[sig] : sigs[sig];
- }
-
- inline void copysigs (_pinfo *p) {memcpy (sigs, p->sigs, sizeof (sigs));}
-
- inline sigset_t& getsigmask ()
- {
- return thread2signal ? *thread2signal->sigmask : sig_mask;
- }
-
- inline void setsigmask (sigset_t mask)
- {
- if (thread2signal)
- *(thread2signal->sigmask) = mask;
- sig_mask = mask;
- }
-
- inline LONG* getsigtodo (int sig) {return _sigtodo + __SIGOFFSET + sig;}
-
- inline HANDLE getthread2signal ()
- {
- return thread2signal ? thread2signal->win32_obj_id : hMainThread;
- }
-
- inline void setthread2signal (void *thr) {thread2signal = (pthread *) thr;}
- void commune_recv ();
- commune_result commune_send (DWORD);
- bool alive ();
- char *cmdline (size_t &);
-
- friend void __stdcall set_myself (pid_t, HANDLE);
-
-private:
- struct sigaction sigs[NSIG];
- sigset_t sig_mask; /* one set for everything to ignore. */
- LONG _sigtodo[NSIG + __SIGOFFSET];
- pthread *thread2signal; // NULL means thread any other means a pthread
- CRITICAL_SECTION lock;
-};
-
-class pinfo
-{
- HANDLE h;
- _pinfo *procinfo;
- bool destroy;
-public:
- void init (pid_t n, DWORD create = 0, HANDLE h = NULL) __attribute__ ((regparm(3)));
- pinfo () {}
- pinfo (_pinfo *x): procinfo (x) {}
- pinfo (pid_t n) {init (n);}
- pinfo (pid_t n, int create) {init (n, create);}
- void release ();
- ~pinfo ()
- {
- if (destroy && procinfo)
- release ();
- }
-
- _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 == (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;}
-#ifndef _SIGPROC_H
- int remember () {system_printf ("remember is not here"); return 0;}
-#else
- int remember ()
- {
- int res = proc_subproc (PROC_ADDCHILD, (DWORD) this);
- destroy = res ? false : true;
- return res;
- }
-#endif
- HANDLE shared_handle () {return h;}
-};
-
-#define ISSTATE(p, f) (!!((p)->process_state & f))
-#define NOTSTATE(p, f) (!((p)->process_state & f))
-
-class winpids
-{
- DWORD *pidlist;
- DWORD npidlist;
- pinfo *pinfolist;
- 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);
- static CRITICAL_SECTION cs;
-public:
- DWORD npids;
- inline void reset () { npids = 0; release (); }
- void set (bool winpid);
- winpids (int): enum_processes (&winpids::enum_init) { reset (); }
- winpids (): pidlist (NULL), npidlist (0), pinfolist (NULL),
- 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 ();
- static void init ();
-};
-
-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 (pid_t pid, HANDLE h = NULL);
-extern pinfo myself;
-
-#define _P_VFORK 0
-extern void __stdcall pinfo_fixup_after_fork ();
-extern HANDLE hexec_proc;
-
-/* 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 ee3c72575..000000000
--- a/winsup/cygwin/pipe.cc
+++ /dev/null
@@ -1,271 +0,0 @@
-/* pipe.cc: pipe for Cygwin.
-
- Copyright 1996, 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. */
-
-/* FIXME: Should this really be fhandler_pipe.cc? */
-
-#include "winsup.h"
-#include <unistd.h>
-#include <errno.h>
-#include <sys/socket.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "thread.h"
-#include "pinfo.h"
-#include "cygthread.h"
-
-static unsigned pipecount;
-static const NO_COPY char pipeid_fmt[] = "stupid_pipe.%u.%u";
-
-fhandler_pipe::fhandler_pipe (DWORD devtype)
- : fhandler_base (devtype), guard (NULL), broken_pipe (false), writepipe_exists(0),
- orig_pid (0), id (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 (int val)
-{
- this->fhandler_base::set_close_on_exec (val);
- if (guard)
- set_inheritance (guard, val);
- if (writepipe_exists)
- set_inheritance (writepipe_exists, val);
-}
-
-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 = {this, in_ptr, &in_len};
- ResetEvent (read_state);
- cygthread *th = new cygthread (read_pipe, &pi, "read_pipe");
- if (th->detach (read_state) && !in_len)
- (ssize_t) in_len = -1; /* received a signal */
- }
- (void) ReleaseMutex (guard);
- return;
-}
-
-int fhandler_pipe::close ()
-{
- int res = this->fhandler_base::close ();
- if (guard)
- CloseHandle (guard);
- if (writepipe_exists)
- CloseHandle (writepipe_exists);
- if (read_state && !cygheap->fdtab.in_vfork_cleanup ())
- CloseHandle (read_state);
- return res;
-}
-
-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_after_exec (HANDLE parent)
-{
- if (read_state)
- read_state = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
-}
-
-void
-fhandler_pipe::fixup_after_fork (HANDLE parent)
-{
- this->fhandler_base::fixup_after_fork (parent);
- if (guard)
- fork_fixup (parent, guard, "guard");
- if (writepipe_exists)
- fork_fixup (parent, writepipe_exists, "guard");
- fixup_after_exec (parent);
-}
-
-int
-fhandler_pipe::dup (fhandler_base *child)
-{
- int res = this->fhandler_base::dup (child);
- if (res)
- return res;
-
- fhandler_pipe *ftp = (fhandler_pipe *) child;
-
- /* FIXME: This leaks handles in the failing condition */
- 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);
- return -1;
- }
-
- 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);
- return -1;
- }
-
- if (read_state == NULL)
- ftp->read_state = NULL;
- else if (!DuplicateHandle (hMainProc, read_state, hMainProc,
- &ftp->read_state, 0, 1,
- DUPLICATE_SAME_ACCESS))
- {
- debug_printf ("couldn't duplicate read_state %p, %E", writepipe_exists);
- return -1;
- }
-
- ftp->id = id;
- ftp->orig_pid = orig_pid;
- return 0;
-}
-
-int
-make_pipe (int fildes[2], unsigned int psize, int mode)
-{
- HANDLE r, w;
- SECURITY_ATTRIBUTES *sa = (mode & O_NOINHERIT) ? &sec_none_nih : &sec_none;
- int res = -1;
-
- cygheap_fdnew fdr;
- if (fdr >= 0)
- {
- cygheap_fdnew fdw (fdr, false);
- if (fdw < 0)
- /* out of fds? */;
- else if (!CreatePipe (&r, &w, sa, psize))
- __seterrno ();
- else
- {
- fhandler_pipe *fhr = (fhandler_pipe *) cygheap->fdtab.build_fhandler (fdr, FH_PIPER, "/dev/piper");
- fhandler_pipe *fhw = (fhandler_pipe *) cygheap->fdtab.build_fhandler (fdw, FH_PIPEW, "/dev/pipew");
-
- int binmode = mode & O_TEXT ?: O_BINARY;
- fhr->init (r, GENERIC_READ, binmode);
- fhw->init (w, GENERIC_WRITE, binmode);
- if (mode & O_NOINHERIT)
- {
- fhr->set_close_on_exec_flag (1);
- fhw->set_close_on_exec_flag (1);
- }
-
- fildes[0] = fdr;
- fildes[1] = fdw;
- fhr->read_state = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
- fhr->set_need_fork_fixup ();
-
- res = 0;
- fhr->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);
- fhw->writepipe_exists = CreateEvent (sa, TRUE, FALSE, buf);
- fhr->orig_pid = myself->pid;
- fhr->id = count;
- }
- }
- }
-
- syscall_printf ("%d = make_pipe ([%d, %d], %d, %p)", res, fildes[0],
- fildes[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;
-}
-
-extern "C" int
-pipe (int filedes[2])
-{
- extern DWORD binmode;
- return make_pipe (filedes, 16384, (!binmode || binmode == O_BINARY) ? O_BINARY : O_TEXT);
-}
-
-extern "C" int
-_pipe (int filedes[2], unsigned int psize, int mode)
-{
- int res = make_pipe (filedes, psize, mode);
- /* This type of pipe is not interruptible so set the appropriate flag. */
- if (!res)
- cygheap->fdtab[filedes[0]]->set_r_no_interrupt (1);
- return res;
-}
diff --git a/winsup/cygwin/poll.cc b/winsup/cygwin/poll.cc
deleted file mode 100644
index 4e3028fff..000000000
--- a/winsup/cygwin/poll.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-/* poll.cc. Implements poll(2) via usage of select(2) call.
-
- 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. */
-
-#define __INSIDE_CYGWIN_NET__
-
-#include "winsup.h"
-#include <sys/time.h>
-#include <sys/poll.h>
-#include <sys/socket.h>
-#include <errno.h>
-#include <stdlib.h>
-#define USE_SYS_TYPES_FD_SET
-#include <winsock2.h>
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygerrno.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 };
- sigframe thisframe (mainthread);
-
- 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 (ENOMEM);
- 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);
- if (fds[i].events & POLLPRI)
- 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
- {
- if (FD_ISSET(fds[i].fd, read_fds))
- {
- char peek[1];
- fhandler_socket *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. */
- fds[i].revents |= POLLHUP;
- break;
- default:
- fds[i].revents |= POLLIN;
- break;
- }
- set_errno (old_errno);
- }
- }
- 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 @@
-<sect1 id="std-posix">
-<title>Compatibility with POSIX.1</title>
-
-<para>The following functions are compatible with POSIX.1:</para>
-
-<sect2><title>Process Primitives (Section 3) </title><para>
-
-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
-
-</para></sect2>
-<sect2><title>Process Environment (Section 4) </title><para>
-
-getpid, getppid, getuid, geteuid, getgid, getegid, setuid, setgid,
-getgroups, getlogin, getpgrp, setsid, setpgid, uname, time, times,
-getenv, ctermid, ttyname, isatty, sysconf
-
-</para></sect2>
-<sect2><title>Files and Directories (Section 5) </title><para>
-
-opendir, readdir, rewinddir, closedir, chdir, getcwd, open, creat,
-umask, link, mkdir, unlink, rmdir, rename, stat, fstat, access, chmod,
-fchmod, chown, utime, ftruncate, pathconf, fpathconf
-
-</para></sect2>
-<sect2><title>Input and Output Primitives (Section 6) </title><para>
-
-pipe, dup, dup2, close, read, write, fcntl, lseek, fsync
-
-</para></sect2>
-<sect2><title>Device- and Class-Specific Functions (Section 7) </title><para>
-
-cfgetispeed, cfgetospeed, cfsetispeed, cfsetospeed, tcdrain, tcflow,
-tcflush, tcgetattr, tcgetpgrp, tcsendbreak, tcsetattr, tcsetpgrp
-
-</para></sect2>
-<sect2><title>Language-Specific Services for the C Programming Language (Section 8) </title><para>
-
-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
-
-</para></sect2>
-<sect2><title>System Databases (Section 9) </title><para>
-
-getgrgid, getgrnam, getpwnam, getpwuid
-
-</para></sect2>
-<sect2><title>Synchronization (Section 11) </title><para>
-
-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
-
-</para></sect2>
-<sect2><title>Memory Management (Section 12) </title><para>
-
-mmap, mprotect, msync, munmap
-
-</para></sect2>
-<sect2><title>Thread Management (Section 16) </title><para>
-
-pthread_attr_init, pthread_attr_destroy, pthread_attr_setstacksize,
-pthread_attr_getstacksize, pthread_create, pthread_exit, pthread_self,
-pthread_equal
-
-</para></sect2>
-<sect2><title>Thread-Specific Data Functions (Section 17) </title><para>
-
-pthread_key_create, pthread_setspecific, pthread_getspecific,
-pthread_key_delete
-
-</para></sect2>
-
-<sect2><title>Implementation Details</title>
-
-<para><function>setuid</function> and <function>setgid</function>
-always return ENOSYS.</para>
-
-<para><function>link</function> will copy the file if it can't
-implement a true symbolic link. Currently, symbolic links work, if at
-all, only under Windows NT.</para>
-
-<para><function>chown</function> always returns zero.</para>
-
-<para><function>fcntl</function> doesn't support F_GETLK - it returns
--1 and sets errno to ENOSYS.</para>
-
-<para><function>lseek</function> only works properly on binary
-files.</para>
-
-</sect2>
-
-</sect1>
diff --git a/winsup/cygwin/profil.c b/winsup/cygwin/profil.c
deleted file mode 100644
index 7be0839b2..000000000
--- a/winsup/cygwin/profil.c
+++ /dev/null
@@ -1,173 +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 <windows.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <errno.h>
-#include <math.h>
-
-#include <profil.h>
-
-#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;
-
- 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 582b2a7cb..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) + ((((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 <deo@logos-m.ru>
- 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 <windows.h>
-
-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 09a494d2a..000000000
--- a/winsup/cygwin/pthread.cc
+++ /dev/null
@@ -1,492 +0,0 @@
-/* pthread.cc: posix pthread interface for Cygwin
-
- Copyright 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
-
- Originally written by Marco Fuykschot <marco@ddi.nl>
-
- 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 "errno.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);
-}
-
-int
-pthread_attr_init (pthread_attr_t * attr)
-{
- return __pthread_attr_init (attr);
-}
-
-int
-pthread_attr_destroy (pthread_attr_t * attr)
-{
- return __pthread_attr_destroy (attr);
-}
-
-int
-pthread_attr_setdetachstate (pthread_attr_t * attr, int detachstate)
-{
- return __pthread_attr_setdetachstate (attr, detachstate);
-}
-
-int
-pthread_attr_getdetachstate (const pthread_attr_t * attr, int *detachstate)
-{
- return __pthread_attr_getdetachstate (attr, detachstate);
-}
-
-
-int
-pthread_attr_setstacksize (pthread_attr_t * attr, size_t size)
-{
- return __pthread_attr_setstacksize (attr, size);
-}
-
-int
-pthread_attr_getstacksize (const pthread_attr_t * attr, size_t * size)
-{
- return __pthread_attr_getstacksize (attr, size);
-}
-
-int
-pthread_attr_setinheritsched (pthread_attr_t * attr, int inheritsched)
-{
- return __pthread_attr_setinheritsched (attr, inheritsched);
-}
-
-int
-pthread_attr_getinheritsched (const pthread_attr_t * attr, int *inheritsched)
-{
- return __pthread_attr_getinheritsched (attr, inheritsched);
-}
-
-int
-pthread_attr_setschedparam (pthread_attr_t * attr,
- const struct sched_param *param)
-{
- return __pthread_attr_setschedparam (attr, param);
-}
-
-int
-pthread_attr_getschedparam (const pthread_attr_t * attr,
- struct sched_param *param)
-{
- return __pthread_attr_getschedparam (attr, param);
-}
-
-int
-pthread_attr_setschedpolicy (pthread_attr_t * attr, int policy)
-{
- return __pthread_attr_setschedpolicy (attr, policy);
-}
-
-int
-pthread_attr_getschedpolicy (const pthread_attr_t * attr, int *policy)
-{
- return __pthread_attr_getschedpolicy (attr, policy);
-}
-
-int
-pthread_attr_setscope (pthread_attr_t * attr, int contentionscope)
-{
- return __pthread_attr_setscope (attr, contentionscope);
-}
-
-int
-pthread_attr_getscope (const pthread_attr_t * attr, int *contentionscope)
-{
- return __pthread_attr_getscope (attr, contentionscope);
-}
-
-#ifdef _POSIX_THREAD_ATTR_STACKADDR
-int
-pthread_attr_setstackaddr (pthread_attr_t * attr, void *stackaddr)
-{
- return __pthread_attr_setstackaddr (attr, stackaddr);
-}
-
-int
-pthread_attr_getstackaddr (const pthread_attr_t * attr, void **stackaddr)
-{
- return __pthread_attr_getstackaddr (attr, stackaddr);
-}
-#endif
-
-/* 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::isGoodObject (thread))
- return EINVAL;
- return (*thread)->getsequence_np ();
-}
-
-/* Thread SpecificData */
-int
-pthread_key_create (pthread_key_t * key, void (*destructor) (void *))
-{
- return __pthread_key_create (key, destructor);
-}
-
-int
-pthread_key_delete (pthread_key_t key)
-{
- return __pthread_key_delete (key);
-}
-
-int
-pthread_setspecific (pthread_key_t key, const void *value)
-{
- return __pthread_setspecific (key, value);
-}
-
-void *
-pthread_getspecific (pthread_key_t key)
-{
- return (void *) __pthread_getspecific (key);
-}
-
-/* Thread signal */
-int
-pthread_kill (pthread_t thread, int sig)
-{
- return __pthread_kill (thread, sig);
-}
-
-int
-pthread_sigmask (int operation, const sigset_t * set, sigset_t * old_set)
-{
- return __pthread_sigmask (operation, set, old_set);
-}
-
-/* ID */
-
-pthread_t pthread_self ()
-{
- return pthread::self ();
-}
-
-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)
-{
- return pthread_mutex::init (mutex, attr);
-}
-
-int
-pthread_mutex_lock (pthread_mutex_t * mutex)
-{
- return __pthread_mutex_lock (mutex);
-}
-
-int
-pthread_mutex_trylock (pthread_mutex_t * mutex)
-{
- return __pthread_mutex_trylock (mutex);
-}
-
-int
-pthread_mutex_unlock (pthread_mutex_t * mutex)
-{
- return __pthread_mutex_unlock (mutex);
-}
-
-int
-pthread_mutex_destroy (pthread_mutex_t * mutex)
-{
- return __pthread_mutex_destroy (mutex);
-}
-
-int
-pthread_mutex_setprioceiling (pthread_mutex_t * mutex,
- int prioceiling, int *old_ceiling)
-{
- return __pthread_mutex_setprioceiling (mutex, prioceiling, old_ceiling);
-}
-
-int
-pthread_mutex_getprioceiling (const pthread_mutex_t * mutex, int *prioceiling)
-{
- return __pthread_mutex_getprioceiling (mutex, prioceiling);
-}
-
-
-
-int
-pthread_mutexattr_destroy (pthread_mutexattr_t * attr)
-{
- return __pthread_mutexattr_destroy (attr);
-}
-
-int
-pthread_mutexattr_getprioceiling (const pthread_mutexattr_t * attr,
- int *prioceiling)
-{
- return __pthread_mutexattr_getprioceiling (attr, prioceiling);
-}
-
-int
-pthread_mutexattr_getprotocol (const pthread_mutexattr_t * attr,
- int *protocol)
-{
- return __pthread_mutexattr_getprotocol (attr, protocol);
-}
-
-int
-pthread_mutexattr_getpshared (const pthread_mutexattr_t * attr, int *pshared)
-{
- return __pthread_mutexattr_getpshared (attr, pshared);
-}
-
-int
-pthread_mutexattr_gettype (const pthread_mutexattr_t * attr, int *type)
-{
- return __pthread_mutexattr_gettype (attr, type);
-}
-
-int
-pthread_mutexattr_init (pthread_mutexattr_t * attr)
-{
- return __pthread_mutexattr_init (attr);
-}
-
-int
-pthread_mutexattr_setprioceiling (pthread_mutexattr_t * attr, int prioceiling)
-{
- return __pthread_mutexattr_setprioceiling (attr, prioceiling);
-}
-
-int
-pthread_mutexattr_setprotocol (pthread_mutexattr_t * attr, int protocol)
-{
- return __pthread_mutexattr_setprotocol (attr, protocol);
-}
-
-int
-pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, int pshared)
-{
- return __pthread_mutexattr_setpshared (attr, pshared);
-}
-
-int
-pthread_mutexattr_settype (pthread_mutexattr_t * attr, int type)
-{
- return __pthread_mutexattr_settype (attr, type);
-}
-
-/* Synchronisation */
-
-int
-pthread_cond_destroy (pthread_cond_t * cond)
-{
- return __pthread_cond_destroy (cond);
-}
-
-int
-pthread_cond_init (pthread_cond_t * cond, const pthread_condattr_t * attr)
-{
- return pthread_cond::init (cond, attr);
-}
-
-int
-pthread_cond_signal (pthread_cond_t * cond)
-{
- return __pthread_cond_signal (cond);
-}
-
-int
-pthread_cond_broadcast (pthread_cond_t * cond)
-{
- return __pthread_cond_broadcast (cond);
-}
-
-int
-pthread_condattr_init (pthread_condattr_t * condattr)
-{
- return __pthread_condattr_init (condattr);
-}
-
-int
-pthread_condattr_destroy (pthread_condattr_t * condattr)
-{
- return __pthread_condattr_destroy (condattr);
-}
-
-int
-pthread_condattr_getpshared (const pthread_condattr_t * attr, int *pshared)
-{
- return __pthread_condattr_getpshared (attr, pshared);
-}
-
-int
-pthread_condattr_setpshared (pthread_condattr_t * attr, int pshared)
-{
- return __pthread_condattr_setpshared (attr, pshared);
-}
-
-/* Scheduling */
-
-int
-pthread_getconcurrency (void)
-{
- return __pthread_getconcurrency ();
-}
-
-int
-pthread_setconcurrency (int new_level)
-{
- return __pthread_setconcurrency (new_level);
-}
-
-
-
-
-int
-pthread_getschedparam (pthread_t thread, int *policy,
- struct sched_param *param)
-{
- return __pthread_getschedparam (thread, policy, param);
-}
-
-int
-pthread_setschedparam (pthread_t thread, int policy,
- const struct sched_param *param)
-{
- return __pthread_setschedparam (thread, policy, param);
-}
-
-
-/* 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 (void)
-{
- 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);
-}
-
-int
-sem_wait (sem_t * sem)
-{
- return semaphore::wait (sem);
-}
-
-int
-sem_trywait (sem_t * sem)
-{
- return semaphore::trywait (sem);
-}
-
-int
-sem_post (sem_t * sem)
-{
- return semaphore::post (sem);
-}
-
-}
diff --git a/winsup/cygwin/pwdgrp.h b/winsup/cygwin/pwdgrp.h
deleted file mode 100644
index 6be1b32f7..000000000
--- a/winsup/cygwin/pwdgrp.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/* pwdgrp.h
-
- Copyright 2001 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 (cygsid &);
-extern struct passwd *internal_getpwnam (const char *, BOOL = FALSE);
-extern struct passwd *internal_getpwuid (__uid32_t, BOOL = FALSE);
-extern struct __group32 *internal_getgrsid (cygsid &);
-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 *);
-
-enum pwdgrp_state {
- uninitialized = 0,
- initializing,
- loaded
-};
-
-class pwdgrp_check {
- pwdgrp_state state;
- FILETIME last_modified;
- char file_w32[MAX_PATH];
-
-public:
- pwdgrp_check () : state (uninitialized) {}
- BOOL isinitializing ()
- {
- if (state <= initializing)
- state = initializing;
- else if (cygheap->etc_changed ())
- {
- if (!file_w32[0])
- state = initializing;
- else
- {
- HANDLE h;
- WIN32_FIND_DATA data;
-
- if ((h = FindFirstFile (file_w32, &data)) != INVALID_HANDLE_VALUE)
- {
- if (CompareFileTime (&data.ftLastWriteTime, &last_modified) > 0)
- state = initializing;
- FindClose (h);
- }
- }
- }
- return state == initializing;
- }
- void operator = (pwdgrp_state nstate)
- {
- state = nstate;
- }
- BOOL isuninitialized () const { return state == uninitialized; }
- void set_last_modified (HANDLE fh, const char *name)
- {
- if (!file_w32[0])
- strcpy (file_w32, name);
- GetFileTime (fh, NULL, NULL, &last_modified);
- }
-};
-
-class pwdgrp_read {
- path_conv pc;
- HANDLE fh;
- char *buf;
- char *lptr, *eptr;
-
-public:
- bool open (const char *posix_fname)
- {
- if (buf)
- free (buf);
- buf = lptr = eptr = NULL;
-
- pc.check (posix_fname);
- if (pc.error || !pc.exists () || !pc.isdisk () || pc.isdir ())
- return false;
-
- fh = CreateFile (pc, GENERIC_READ, wincap.shared (), NULL, OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL, 0);
- if (fh != INVALID_HANDLE_VALUE)
- {
- DWORD size = GetFileSize (fh, NULL), read_bytes;
- buf = (char *) malloc (size + 1);
- if (!ReadFile (fh, buf, size, &read_bytes, NULL))
- {
- if (buf)
- free (buf);
- buf = NULL;
- CloseHandle (fh);
- fh = NULL;
- return false;
- }
- buf[read_bytes] = '\0';
- return true;
- }
- return false;
- }
- char *gets ()
- {
- if (!buf)
- return NULL;
- if (!lptr)
- lptr = buf;
- else if (!eptr)
- return lptr = NULL;
- else
- lptr = eptr;
- eptr = strchr (lptr, '\n');
- if (eptr)
- {
- if (eptr > lptr && *(eptr - 1) == '\r')
- *(eptr - 1) = 0;
- *eptr++ = '\0';
- }
- return lptr;
- }
- inline HANDLE get_fhandle () { return fh; }
- inline const char *get_fname () { return pc; }
- void close ()
- {
- if (fh)
- CloseHandle (fh);
- fh = NULL;
- }
-};
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 0b88dcf1e..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&REG_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&REG_NOSUB)
- nmatch = 0;
- if (eflags&REG_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&REG_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&REG_NOTBOL)) ||
- (sp < m->endp && *(sp-1) == '\n' &&
- (m->g->cflags&REG_NEWLINE)) )
- { /* yes */ }
- else
- return(NULL);
- break;
- case OEOL:
- if ( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||
- (sp < m->endp && *sp == '\n' &&
- (m->g->cflags&REG_NEWLINE)) )
- { /* yes */ }
- else
- return(NULL);
- break;
- case OBOW:
- if (( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
- (sp < m->endp && *(sp-1) == '\n' &&
- (m->g->cflags&REG_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&REG_NOTEOL)) ||
- (sp < m->endp && *sp == '\n' &&
- (m->g->cflags&REG_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&REG_NEWLINE) ||
- (lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
- flagch = BOL;
- i = m->g->nbol;
- }
- if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
- (c == OUT && !(m->eflags&REG_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&REG_NEWLINE) ||
- (lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
- flagch = BOL;
- i = m->g->nbol;
- }
- if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
- (c == OUT && !(m->eflags&REG_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&REG_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&REG_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 <sys/types.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <limits.h>
-#include <stdlib.h>
-#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 <assert.h>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&REG_EXTENDED) && (cflags&REG_NOSPEC))
- return(REG_INVARG);
-
- if (cflags&REG_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&REG_EXTENDED)
- p_ere(p, OUT);
- else if (cflags&REG_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&REG_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<<CHAR_BIT)
-
- pos = HERE(); /* repetion op, if any, covers from here */
-
- assert(MORE()); /* caller should have ensured this */
- c = GETNEXT();
- if (c == '\\') {
- REQUIRE(MORE(), REG_EESCAPE);
- c = BACKSL | (unsigned char)GETNEXT();
- }
- switch (c) {
- case '.':
- if (p->g->cflags&REG_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&REG_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&REG_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&REG_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<<OPSHIFT);
-
- /* deal with undersized strip */
- if (p->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<<OPSHIFT);
- p->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 4d14ab231..000000000
--- a/winsup/cygwin/regex/regerror.c
+++ /dev/null
@@ -1,127 +0,0 @@
-#include "winsup.h"
-#include <sys/types.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <limits.h>
-#include <stdlib.h>
-#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&REG_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 <sys/types.h>
-.br
-#include <regex.h>
-.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 <regex.h>
-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 0fa180269..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 0ef0ace36..000000000
--- a/winsup/cygwin/regex/regex.h
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef _REGEX_H_
-#define _REGEX_H_ /* never again */
-#include <sys/types.h>
-/* ========= 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 58fd8d8a4..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<<OPSHIFT) /* endmarker - */
-#define OCHAR (2<<OPSHIFT) /* character unsigned char */
-#define OBOL (3<<OPSHIFT) /* left anchor - */
-#define OEOL (4<<OPSHIFT) /* right anchor - */
-#define OANY (5<<OPSHIFT) /* . - */
-#define OANYOF (6<<OPSHIFT) /* [...] set number */
-#define OBACK_ (7<<OPSHIFT) /* begin \d paren number */
-#define O_BACK (8<<OPSHIFT) /* end \d paren number */
-#define OPLUS_ (9<<OPSHIFT) /* + prefix fwd to suffix */
-#define O_PLUS (10<<OPSHIFT) /* + suffix back to prefix */
-#define OQUEST_ (11<<OPSHIFT) /* ? prefix fwd to suffix */
-#define O_QUEST (12<<OPSHIFT) /* ? suffix back to prefix */
-#define OLPAREN (13<<OPSHIFT) /* ( fwd to ) */
-#define ORPAREN (14<<OPSHIFT) /* ) back to ( */
-#define OCH_ (15<<OPSHIFT) /* begin choice fwd to OOR2 */
-#define OOR1 (16<<OPSHIFT) /* | pt. 1 back to OOR1 or OCH_ */
-#define OOR2 (17<<OPSHIFT) /* | pt. 2 fwd to OOR2 or O_CH */
-#define O_CH (18<<OPSHIFT) /* end choice back to OOR1 */
-#define OBOW (19<<OPSHIFT) /* begin word - */
-#define OEOW (20<<OPSHIFT) /* end word - */
-
-/*
- * Structure for [] character-set representation. Character sets are
- * done as bit vectors, grouped 8 to a byte vector for compactness.
- * The individual set therefore has both a pointer to the byte vector
- * and a mask to pick out the relevant bit of each byte. A hash code
- * simplifies testing whether two sets could be identical.
- *
- * This will get trickier for multicharacter collating elements. As
- * preliminary hooks for dealing with such things, we also carry along
- * a string of multi-character elements, and decide the size of the
- * vectors at run time.
- */
-typedef struct {
- uch *ptr; /* -> 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 <sys/types.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <ctype.h>
-#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&REG_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 <sys/types.h>
-#include <stdio.h>
-#include <stdlib.h>
-#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 <assert.h>
-
-/* 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 <stdio.h>
-
-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 <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <stdlib.h>
-#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; &regdummy = 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 = &regdummy;
- 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 == &regdummy) {
- 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 != &regdummy)
- *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 == &regdummy) {
- 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 == &regdummy)
- 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 == &regdummy || 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 == &regdummy)
- 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 <stdio.h>
-#include <string.h>
-#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 22fa511a7..000000000
--- a/winsup/cygwin/registry.cc
+++ /dev/null
@@ -1,252 +0,0 @@
-/* registry.cc: registry interface
-
- 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 "shared_info.h"
-#include "registry.h"
-#include "security.h"
-#include <cygwin/version.h>
-
-static char NO_COPY cygnus_class[] = "cygnus";
-
-reg_key::reg_key (HKEY top, REGSAM access, ...)
-{
- va_list av;
- va_start (av, access);
- build_reg (top, access, av);
- va_end (av);
-}
-
-reg_key::reg_key (REGSAM access, ...)
-{
- va_list av;
-
- new (this) reg_key (HKEY_CURRENT_USER, access, "SOFTWARE",
- CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
- CYGWIN_INFO_CYGWIN_REGISTRY_NAME, NULL);
-
- HKEY top = key;
- va_start (av, access);
- build_reg (top, KEY_READ, av);
- va_end (av);
- if (top != key)
- RegCloseKey (top);
-}
-
-reg_key::reg_key (REGSAM access)
-{
- new (this) reg_key (HKEY_CURRENT_USER, access, "SOFTWARE",
- CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
- CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
- CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL);
-}
-
-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)
- {
- DWORD disp;
- int res = RegCreateKeyExA (r,
- name,
- 0,
- cygnus_class,
- REG_OPTION_NON_VOLATILE,
- access,
- &sec_none_nih,
- &key,
- &disp);
- 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;
- }
-
- /* If we're considering the mounts key, check if it had to
- be created and set had_to_create appropriately. */
- if (strcmp (name, CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME) == 0)
- if (disp == REG_CREATED_NEW_KEY)
- mount_table->had_to_create_mount_areas++;
- }
-}
-
-/* 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 PSID psid, char *path)
-{
- char sid[256];
- char key[256];
- HKEY hkey;
-
- if (!psid || !path)
- return NULL;
- cygsid csid (psid);
- csid.string (sid);
- strcpy (key,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\");
- strcat (key, sid);
- if (!RegOpenKeyExA (HKEY_LOCAL_MACHINE, key, 0, KEY_READ, &hkey))
- {
- char buf[256];
- DWORD type, siz;
-
- key[0] = '\0';
- if (!RegQueryValueExA (hkey, "ProfileImagePath", 0, &type,
- (BYTE *)buf, (siz = 256, &siz)))
- ExpandEnvironmentStringsA (buf, key, 256);
- RegCloseKey (hkey);
- if (key[0])
- return strcpy (path, key);
- }
- return NULL;
-}
-
-void
-load_registry_hive (PSID psid)
-{
- char sid[256];
- char path[MAX_PATH + 1];
- HKEY hkey;
- LONG ret;
-
- if (!psid)
- return;
- /* Check if user hive is already loaded. */
- cygsid csid (psid);
- csid.string (sid);
- if (!RegOpenKeyExA (HKEY_USERS, sid, 0, KEY_READ, &hkey))
- {
- debug_printf ("User registry hive for %s already exists", sid);
- RegCloseKey (hkey);
- return;
- }
- set_process_privilege (SE_RESTORE_NAME);
- if (get_registry_hive_path (psid, path))
- {
- strcat (path, "\\NTUSER.DAT");
- if ((ret = RegLoadKeyA (HKEY_USERS, sid, path)) != ERROR_SUCCESS)
- debug_printf ("Loading user registry hive for %s failed: %d", sid, ret);
- }
-}
-
diff --git a/winsup/cygwin/registry.h b/winsup/cygwin/registry.h
deleted file mode 100644
index f0c807941..000000000
--- a/winsup/cygwin/registry.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* registry.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. */
-
-class reg_key
-{
-private:
-
- HKEY key;
- LONG key_is_invalid;
-
-public:
-
- reg_key (HKEY toplev, REGSAM access, ...);
- reg_key (REGSAM access, ...);
- reg_key (REGSAM access = KEY_ALL_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);
-
- ~reg_key ();
-};
-
-/* Evaluates path to the directory of the local user registry hive */
-char *__stdcall get_registry_hive_path (const PSID psid, char *path);
-void __stdcall load_registry_hive (PSID psid);
diff --git a/winsup/cygwin/resource.cc b/winsup/cygwin/resource.cc
deleted file mode 100644
index 01e065bb5..000000000
--- a/winsup/cygwin/resource.cc
+++ /dev/null
@@ -1,189 +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 <errno.h>
-#include <unistd.h>
-#include <limits.h>
-#include "cygerrno.h"
-#include "pinfo.h"
-#include "psapi.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;
-
- if (check_null_invalid_struct_errno (rlp))
- 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 ();
- 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)
-{
- if (__check_invalid_read_ptr_errno (rlp, sizeof (*rlp)))
- 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 685802684..000000000
--- a/winsup/cygwin/rmsym
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-lib=$1; shift
-nm=$1; shift
-ar=$1; shift
-ranlib=$1; shift
-grepit=`echo $* | sed 's/ /|__imp__/g'`
-[ -n "$grepit" ] && grepit="__imp__$grepit"
-objs=`$nm $lib | awk -F: '/^d[0-9]*.o:/ {obj=$1} '"/$grepit/"'{print obj}'`
-[ -n "$objs" ] || exit 1
-$ar d $lib $objs
-$ranlib $lib
diff --git a/winsup/cygwin/safe_memory.h b/winsup/cygwin/safe_memory.h
deleted file mode 100644
index b5f3d95d6..000000000
--- a/winsup/cygwin/safe_memory.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* safe_memory.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. */
-
-#ifndef __SAFE_MEMORY_H__
-#define __SAFE_MEMORY_H__
-
-/*****************************************************************************/
-
-/* Temporary hack to get around the thread-unsafe new/delete in cygwin
- * gcc 2.95.3. This should all be binned at the first opportunity,
- * e.g. gcc 3.1 or sooner.
- *
- * The trick here is to do contruction via malloc(3) and then the
- * placement new operator, and destruction via an explicit call to the
- * destructor and then free(3).
- */
-
-#include <stdlib.h>
-
-inline void *operator new (size_t, void *__p) throw () { return __p; }
-
-#define safe_new0(T) (new (malloc (sizeof (T))) T)
-
-#ifdef NEW_MACRO_VARARGS
-
-#define safe_new(T, ...) \
- (new (malloc (sizeof (T))) T (__VA_ARGS__))
-
-#else /* !NEW_MACRO_VARARGS */
-
-#define safe_new(T, args...) \
- (new (malloc (sizeof (T))) T (## args))
-
-#endif /* !NEW_MACRO_VARARGS */
-
-template <typename T> void
-safe_delete (T *const object)
-{
- if (object)
- {
- object->~T ();
- free (object);
- }
-}
-
-#endif /* __SAFE_MEMORY_H__ */
diff --git a/winsup/cygwin/scandir.cc b/winsup/cygwin/scandir.cc
deleted file mode 100644
index 52a36eab6..000000000
--- a/winsup/cygwin/scandir.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-/* scandir.cc
-
- Copyright 1998, 1999, 2000, 2001 Red Hat, Inc.
-
- Written by Corinna Vinschen <corinna.vinschen@cityweb.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 <dirent.h>
-#include <stdlib.h>
-#include <errno.h>
-#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;
-
- if (!(dirp = opendir (dir)))
- return -1;
-
- int prior_errno = get_errno ();
- set_errno (0);
- if (!compar)
- compar = alphasort;
-
- while ((ent = readdir (dirp)))
- {
- if (!select || select (ent))
- {
-
- /* Ignore error from readdir/select. See POSIX specs. */
- set_errno (0);
-
- if (count == allocated)
- {
-
- if (allocated == 0)
- allocated = 10;
- else
- allocated *= 2;
-
- ntmp = (struct dirent **) realloc (nl, allocated * sizeof *nl);
- if (!ntmp)
- {
- set_errno (ENOMEM);
- break;
- }
- nl = ntmp;
- }
-
- if (!(etmp = (struct dirent *) malloc (sizeof *ent)))
- {
- set_errno (ENOMEM);
- break;
- }
- *etmp = *ent;
- nl[count++] = etmp;
- }
- }
-
- if ((prior_errno = get_errno ()) != 0)
- {
- closedir (dirp);
- if (nl)
- {
- while (count > 0)
- free (nl[--count]);
- free (nl);
- }
- /* Ignore errors from closedir() and what not else. */
- set_errno (prior_errno);
- return -1;
- }
-
- closedir (dirp);
- set_errno (prior_errno);
-
- 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 99c73914d..000000000
--- a/winsup/cygwin/sched.cc
+++ /dev/null
@@ -1,444 +0,0 @@
-/* sched.cc: scheduler interface for Cygwin
-
- Copyright 2001, 2002 Red Hat, Inc.
-
- Written by Robert Collins <rbtcollins@hotmail.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. */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "winsup.h"
-#include <limits.h>
-#include <errno.h>
-#include "cygerrno.h"
-#include <assert.h>
-#include <stdlib.h>
-#include <syslog.h>
-#include <sched.h>
-#include "pinfo.h"
-/* for getpid */
-#include <unistd.h>
-
-/* 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
-
- We can't return -11, errno ENOSYS, because that implies that
- sched_get_priority_max & min are also not supported (according to the spec)
- so some spec-driven autoconf tests will likely assume they aren't present either
-
- returning ESRCH might confuse some applications (if they assumed that when
- rr_get_interval is called on pid 0 it always works).
-
- If someone knows the time quanta for the various win32 platforms, then a
- simple check for the os we're running on will finish this function
-*/
-int
-sched_rr_get_interval (pid_t pid, struct timespec *interval)
-{
- set_errno (ESRCH);
- return -1;
-}
-
-/* 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 (void)
-{
- 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 3766128fb..000000000
--- a/winsup/cygwin/sec_acl.cc
+++ /dev/null
@@ -1,1034 +0,0 @@
-/* secacl.cc: Sun compatible ACL functions.
-
- Copyright 2000, 2001, 2002 Red Hat, Inc.
-
- Written by Corinna Vinschen <corinna@vinschen.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 <grp.h>
-#include <pwd.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <limits.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/acl.h>
-#include <ctype.h>
-#include <wingdi.h>
-#include <winuser.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "pinfo.h"
-#include "cygheap.h"
-#include "pwdgrp.h"
-
-extern "C" int aclsort (int nentries, int, __aclent16_t *aclbufp);
-extern "C" int acl (const char *path, int cmd, int nentries, __aclent16_t *aclbufp);
-
-static int
-searchace (__aclent16_t *aclp, int nentries, int type, int id = -1)
-{
- int i;
-
- for (i = 0; i < nentries; ++i)
- if ((aclp[i].a_type == type && (id < 0 || aclp[i].a_id == id))
- || !aclp[i].a_type)
- return i;
- return -1;
-}
-
-static int
-setacl (const char *file, int nentries, __aclent16_t *aclbufp)
-{
- DWORD sd_size = 4096;
- char sd_buf[4096];
- PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) sd_buf;
-
- if (read_sd (file, psd, &sd_size) <= 0)
- {
- debug_printf ("read_sd %E");
- return -1;
- }
-
- BOOL dummy;
-
- /* Get owner SID. */
- PSID owner_sid = NULL;
- if (!GetSecurityDescriptorOwner (psd, &owner_sid, &dummy))
- {
- __seterrno ();
- return -1;
- }
- cygsid owner (owner_sid);
-
- /* Get group SID. */
- PSID group_sid = NULL;
- if (!GetSecurityDescriptorGroup (psd, &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 (group
- && !SetSecurityDescriptorGroup (&sd, group, FALSE))
- {
- __seterrno ();
- return -1;
- }
-
- /* Fill access control list. */
- char acl_buf[3072];
- PACL acl = (PACL) acl_buf;
- 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 = 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_ALL | 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)
- && (pos = searchace (aclbufp, nentries,
- aclbufp[i].a_type | ACL_DEFAULT,
- (aclbufp[i].a_type & (USER|GROUP))
- ? aclbufp[i].a_id : -1)) >= 0
- && aclbufp[pos].a_type
- && aclbufp[i].a_perm == aclbufp[pos].a_perm)
- {
- inheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
- /* This eliminates the corresponding default entry. */
- aclbufp[pos].a_type = 0;
- }
- switch (aclbufp[i].a_type)
- {
- case USER_OBJ:
- case DEF_USER_OBJ:
- allow |= STANDARD_RIGHTS_ALL & ~DELETE;
- if (!add_access_allowed_ace (acl, ace_off++, allow,
- owner, 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:
- case DEF_GROUP_OBJ:
- if (!add_access_allowed_ace (acl, ace_off++, allow,
- group, 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 psd. */
- sd_size = 0;
- MakeSelfRelativeSD (&sd, psd, &sd_size);
- if (sd_size <= 0)
- {
- __seterrno ();
- return -1;
- }
- if (!MakeSelfRelativeSD (&sd, psd, &sd_size))
- {
- __seterrno ();
- return -1;
- }
- debug_printf ("Created SD-Size: %d", sd_size);
- return write_sd (file, psd, sd_size);
-}
-
-/* Temporary access denied bits */
-#define DENY_R 040000
-#define DENY_W 020000
-#define DENY_X 010000
-
-static void
-getace (__aclent16_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_DATA) && !(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_DATA) && !(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_EXECUTE) && !(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;
-}
-
-static int
-getacl (const char *file, DWORD attr, int nentries, __aclent16_t *aclbufp)
-{
- DWORD sd_size = 4096;
- char sd_buf[4096];
- PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) sd_buf;
-
- int ret;
- if ((ret = read_sd (file, psd, &sd_size)) <= 0)
- {
- debug_printf ("read_sd %E");
- return ret;
- }
-
- PSID owner_sid;
- PSID group_sid;
- BOOL dummy;
- __uid32_t uid;
- __gid32_t gid;
-
- if (!GetSecurityDescriptorOwner (psd, &owner_sid, &dummy))
- {
- debug_printf ("GetSecurityDescriptorOwner %E");
- __seterrno ();
- return -1;
- }
- uid = cygsid (owner_sid).get_uid ();
-
- if (!GetSecurityDescriptorGroup (psd, &group_sid, &dummy))
- {
- debug_printf ("GetSecurityDescriptorGroup %E");
- __seterrno ();
- return -1;
- }
- gid = cygsid (group_sid).get_gid ();
-
- __aclent16_t lacl[MAX_ACL_ENTRIES];
- memset (&lacl, 0, MAX_ACL_ENTRIES * sizeof (__aclent16_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 (psd, &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;
-
- cygsid 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
- {
- id = ace_sid.get_id (FALSE, &type);
- if (type != GROUP)
- {
- int type2 = 0;
- int id2 = ace_sid.get_id (TRUE, &type2);
- if (type2 == GROUP)
- {
- id = id2;
- type = GROUP;
- }
- }
- }
- if (!type)
- continue;
- if (!(ace->Header.AceFlags & INHERIT_ONLY))
- {
- 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))
- {
- 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 (EqualSid (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 (__aclent16_t));
- for (i = 0; i < pos; ++i)
- aclbufp[i].a_perm &= ~(DENY_R | DENY_W | DENY_X);
- aclsort (pos, 0, aclbufp);
- }
- syscall_printf ("%d = getacl (%s)", pos, file);
- return pos;
-}
-
-int
-acl_access (const char *path, int flags)
-{
- __aclent16_t acls[MAX_ACL_ENTRIES];
- int cnt;
-
- if ((cnt = acl (path, GETACL, MAX_ACL_ENTRIES, acls)) < 1)
- return -1;
-
- /* Only check existance. */
- if (!(flags & (R_OK | W_OK | X_OK)))
- return 0;
-
- for (int i = 0; i < cnt; ++i)
- {
- switch (acls[i].a_type)
- {
- case USER_OBJ:
- case USER:
- if (acls[i].a_id != myself->uid)
- {
- /*
- * Check if user is a NT group:
- * Take SID from passwd, search SID in group, check is_grp_member.
- */
- cygsid owner;
- struct passwd *pw;
- struct __group32 *gr = NULL;
-
- if ((pw = internal_getpwuid (acls[i].a_id)) != NULL
- && owner.getfrompw (pw)
- && (gr = internal_getgrsid (owner))
- && is_grp_member (myself->uid, gr->gr_gid))
- break;
- continue;
- }
- break;
- case GROUP_OBJ:
- case GROUP:
- if (acls[i].a_id != myself->gid &&
- !is_grp_member (myself->uid, acls[i].a_id))
- continue;
- break;
- case OTHER_OBJ:
- break;
- default:
- continue;
- }
- if ((!(flags & R_OK) || (acls[i].a_perm & S_IROTH))
- && (!(flags & W_OK) || (acls[i].a_perm & S_IWOTH))
- && (!(flags & X_OK) || (acls[i].a_perm & S_IXOTH)))
- return 0;
- }
- set_errno (EACCES);
- return -1;
-}
-
-static
-int
-acl_worker (const char *path, int cmd, int nentries, __aclent16_t *aclbufp,
- int nofollow)
-{
- extern suffix_info stat_suffixes[];
- path_conv real_path (path, (nofollow ? PC_SYM_NOFOLLOW : PC_SYM_FOLLOW) | PC_FULL, stat_suffixes);
- if (real_path.error)
- {
- set_errno (real_path.error);
- syscall_printf ("-1 = acl (%s)", path);
- return -1;
- }
- if (!real_path.has_acls () || !allow_ntsec)
- {
- struct __stat64 st;
- int ret = -1;
-
- switch (cmd)
- {
- case SETACL:
- set_errno (ENOSYS);
- break;
- case GETACL:
- if (nentries < 1)
- set_errno (EINVAL);
- else if ((nofollow && !lstat64 (path, &st))
- || (!nofollow && !stat64 (path, &st)))
- {
- __aclent16_t lacl[4];
- if (nentries > 0)
- {
- lacl[0].a_type = USER_OBJ;
- lacl[0].a_id = st.st_uid;
- lacl[0].a_perm = (st.st_mode & S_IRWXU) >> 6;
- }
- if (nentries > 1)
- {
- lacl[1].a_type = GROUP_OBJ;
- lacl[1].a_id = st.st_gid;
- lacl[1].a_perm = (st.st_mode & S_IRWXG) >> 3;
- }
- if (nentries > 2)
- {
- lacl[2].a_type = OTHER_OBJ;
- lacl[2].a_id = ILLEGAL_GID;
- lacl[2].a_perm = st.st_mode & S_IRWXO;
- }
- if (nentries > 3)
- {
- lacl[3].a_type = CLASS_OBJ;
- lacl[3].a_id = ILLEGAL_GID;
- lacl[3].a_perm = S_IRWXU | S_IRWXG | S_IRWXO;
- }
- if (nentries > 4)
- nentries = 4;
- if (aclbufp)
- memcpy (aclbufp, lacl, nentries * sizeof (__aclent16_t));
- ret = nentries;
- }
- break;
- case GETACLCNT:
- ret = 4;
- break;
- }
- syscall_printf ("%d = acl (%s)", ret, path);
- return ret;
- }
- switch (cmd)
- {
- case SETACL:
- if (!aclsort (nentries, 0, aclbufp))
- return setacl (real_path.get_win32 (),
- nentries, aclbufp);
- break;
- case GETACL:
- if (nentries < 1)
- break;
- return getacl (real_path.get_win32 (),
- real_path.file_attributes (),
- nentries, aclbufp);
- case GETACLCNT:
- return getacl (real_path.get_win32 (),
- real_path.file_attributes (),
- 0, NULL);
- default:
- break;
- }
- set_errno (EINVAL);
- syscall_printf ("-1 = acl (%s)", path);
- return -1;
-}
-
-extern "C"
-int
-acl (const char *path, int cmd, int nentries, __aclent16_t *aclbufp)
-{
- return acl_worker (path, cmd, nentries, aclbufp, 0);
-}
-
-extern "C"
-int
-lacl (const char *path, int cmd, int nentries, __aclent16_t *aclbufp)
-{
- return acl_worker (path, cmd, nentries, aclbufp, 1);
-}
-
-extern "C"
-int
-facl (int fd, int cmd, int nentries, __aclent16_t *aclbufp)
-{
- cygheap_fdget cfd (fd);
- if (cfd < 0)
- {
- syscall_printf ("-1 = facl (%d)", fd);
- return -1;
- }
- const char *path = cfd->get_name ();
- if (path == NULL)
- {
- syscall_printf ("-1 = facl (%d) (no name)", fd);
- set_errno (ENOSYS);
- return -1;
- }
- syscall_printf ("facl (%d): calling acl (%s)", fd, path);
- return acl_worker (path, cmd, nentries, aclbufp, 0);
-}
-
-extern "C"
-int
-aclcheck (__aclent16_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;
-}
-
-extern "C"
-int acecmp (const void *a1, const void *a2)
-{
-#define ace(i) ((const __aclent16_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
-aclsort (int nentries, int, __aclent16_t *aclbufp)
-{
- if (aclcheck (aclbufp, nentries, NULL))
- return -1;
- if (!aclbufp || nentries < 1)
- {
- set_errno (EINVAL);
- return -1;
- }
- qsort ((void *) aclbufp, nentries, sizeof (__aclent16_t), acecmp);
- return 0;
-}
-
-extern "C"
-int
-acltomode (__aclent16_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
-aclfrommode (__aclent16_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
-acltopbits (__aclent16_t *aclbufp, int nentries, mode_t *pbitsp)
-{
- return acltomode (aclbufp, nentries, pbitsp);
-}
-
-extern "C"
-int
-aclfrompbits (__aclent16_t *aclbufp, int nentries, mode_t *pbitsp)
-{
- return aclfrommode (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 *
-acltotext (__aclent16_t *aclbufp, int aclcnt)
-{
- if (!aclbufp || aclcnt < 1 || aclcnt > MAX_ACL_ENTRIES
- || aclcheck (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"
-__aclent16_t *
-aclfromtext (char *acltextp, int *)
-{
- if (!acltextp)
- {
- set_errno (EINVAL);
- return NULL;
- }
- char buf[strlen (acltextp) + 1];
- __aclent16_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 = strchr (c, ':');
- }
- else if (isdigit (*c))
- lacl[pos].a_id = strtol (c, &c, 10);
- if (!c || *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 = strchr (c, ':');
- }
- else if (isdigit (*c))
- lacl[pos].a_id = strtol (c, &c, 10);
- if (!c || *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;
- }
- __aclent16_t *aclp = (__aclent16_t *) malloc (pos * sizeof (__aclent16_t));
- if (aclp)
- memcpy (aclp, lacl, pos * sizeof (__aclent16_t));
- return aclp;
-}
-
diff --git a/winsup/cygwin/sec_helper.cc b/winsup/cygwin/sec_helper.cc
deleted file mode 100644
index f300398c7..000000000
--- a/winsup/cygwin/sec_helper.cc
+++ /dev/null
@@ -1,435 +0,0 @@
-/* sec_helper.cc: NT security helper functions
-
- Copyright 2000, 2001, 2002 Red Hat, Inc.
-
- Written by Corinna Vinschen <corinna@vinschen.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 <grp.h>
-#include <pwd.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <limits.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/acl.h>
-#include <ctype.h>
-#include <wingdi.h>
-#include <winuser.h>
-#include <wininet.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "pinfo.h"
-#include "cygheap.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 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}
-};
-
-cygsid well_known_null_sid;
-cygsid well_known_world_sid;
-cygsid well_known_local_sid;
-cygsid well_known_creator_owner_sid;
-cygsid well_known_creator_group_sid;
-cygsid well_known_dialup_sid;
-cygsid well_known_network_sid;
-cygsid well_known_batch_sid;
-cygsid well_known_interactive_sid;
-cygsid well_known_service_sid;
-cygsid well_known_authenticated_users_sid;
-cygsid well_known_system_sid;
-cygsid well_known_admins_sid;
-
-void
-cygsid::init ()
-{
- well_known_null_sid = "S-1-0-0";
- well_known_world_sid = "S-1-1-0";
- well_known_local_sid = "S-1-2-0";
- well_known_creator_owner_sid = "S-1-3-0";
- well_known_creator_group_sid = "S-1-3-1";
- well_known_dialup_sid = "S-1-5-1";
- well_known_network_sid = "S-1-5-2";
- well_known_batch_sid = "S-1-5-3";
- well_known_interactive_sid = "S-1-5-4";
- well_known_service_sid = "S-1-5-6";
- well_known_authenticated_users_sid = "S-1-5-11";
- well_known_system_sid = "S-1-5-18";
- well_known_admins_sid = "S-1-5-32-544";
-}
-
-char *
-cygsid::string (char *nsidstr) const
-{
- char t[32];
- DWORD i;
-
- if (!psid || !nsidstr)
- return NULL;
- strcpy (nsidstr, "S-1-");
- __small_sprintf (t, "%u", GetSidIdentifierAuthority (psid)->Value[5]);
- strcat (nsidstr, t);
- for (i = 0; i < *GetSidSubAuthorityCount (psid); ++i)
- {
- __small_sprintf (t, "-%lu", *GetSidSubAuthority (psid, i));
- strcat (nsidstr, t);
- }
- 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;
-}
-
-__uid32_t
-cygsid::get_id (BOOL search_grp, int *type)
-{
- /* First try to get SID from passwd or group entry */
- __uid32_t id = ILLEGAL_UID;
-
- if (!search_grp)
- {
- 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)
- {
- if (type)
- *type = USER;
- return id;
- }
- }
- if (search_grp || type)
- {
- 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 && type)
- *type = GROUP;
- }
- return id;
-}
-
-BOOL
-is_grp_member (__uid32_t uid, __gid32_t gid)
-{
- struct passwd *pw;
- struct __group32 *gr;
- int idx;
-
- /* Evaluate current user info by examining the info given in cygheap and
- the current access token if ntsec is on. */
- if (uid == myself->uid)
- {
- /* If gid == primary group of current user, return immediately. */
- if (gid == myself->gid)
- return TRUE;
- /* Calling getgroups only makes sense when reading the access token. */
- if (allow_ntsec)
- {
- __gid32_t grps[NGROUPS_MAX];
- int cnt = internal_getgroups (NGROUPS_MAX, grps);
- for (idx = 0; idx < cnt; ++idx)
- if (grps[idx] == gid)
- return TRUE;
- return FALSE;
- }
- }
-
- /* Otherwise try getting info from examining passwd and group files. */
- if ((pw = internal_getpwuid (uid)))
- {
- /* If gid == primary group of uid, return immediately. */
- if ((__gid32_t) pw->pw_gid == gid)
- return TRUE;
- /* Otherwise search for supplementary user list of this group. */
- if ((gr = internal_getgrgid (gid)))
- for (idx = 0; gr->gr_mem[idx]; ++idx)
- if (strcasematch (cygheap->user.name (), gr->gr_mem[idx]))
- return TRUE;
- }
- return FALSE;
-}
-
-#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
-
-int
-set_process_privilege (const char *privilege, BOOL enable)
-{
- HANDLE hToken = NULL;
- LUID restore_priv;
- TOKEN_PRIVILEGES new_priv, orig_priv;
- int ret = -1;
- DWORD size;
-
- if (!OpenProcessToken (hMainProc, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
- &hToken))
- {
- __seterrno ();
- goto out;
- }
-
- if (!LookupPrivilegeValue (NULL, privilege, &restore_priv))
- {
- __seterrno ();
- goto out;
- }
-
- new_priv.PrivilegeCount = 1;
- new_priv.Privileges[0].Luid = restore_priv;
- new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
-
- if (!AdjustTokenPrivileges (hToken, 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)
- {
- debug_printf ("Privilege %s couldn't be assigned", privilege);
- __seterrno ();
- goto out;
- }
-
- ret = orig_priv.Privileges[0].Attributes == SE_PRIVILEGE_ENABLED ? 1 : 0;
-
-out:
- if (hToken)
- CloseHandle (hToken);
-
- syscall_printf ("%d = set_process_privilege (%s, %d)", ret, privilege, enable);
- return ret;
-}
-
-/*
- * 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;
-}
-
-BOOL
-sec_acl (PACL acl, BOOL admins, PSID sid1, PSID sid2)
-{
- size_t acl_len = MAX_DACL_LEN(5);
-
- if (!InitializeAcl (acl, acl_len, ACL_REVISION))
- {
- debug_printf ("InitializeAcl %E");
- return FALSE;
- }
- if (sid2)
- if (!AddAccessAllowedAce (acl, ACL_REVISION,
- GENERIC_ALL, sid2))
- debug_printf ("AddAccessAllowedAce(sid2) %E");
- if (sid1)
- if (!AddAccessAllowedAce (acl, ACL_REVISION,
- GENERIC_ALL, sid1))
- debug_printf ("AddAccessAllowedAce(sid1) %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");
-#if 0 /* Does not seem to help */
- if (!AddAccessAllowedAce (acl, ACL_REVISION,
- GENERIC_ALL, well_known_creator_owner_sid))
- debug_printf ("AddAccessAllowedAce(creator_owner) %E");
-#endif
- return TRUE;
-}
-
-PSECURITY_ATTRIBUTES __stdcall
-__sec_user (PVOID sa_buf, PSID sid2, 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));
-
- cygsid sid;
-
- if (!(sid = cygheap->user.orig_sid ()) ||
- (!sec_acl (acl, TRUE, sid, sid2)))
- 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 777f4082c..000000000
--- a/winsup/cygwin/security.cc
+++ /dev/null
@@ -1,1875 +0,0 @@
-/* security.cc: NT security functions
-
- Copyright 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
-
- Originaly written by Gunther Ebert, gunther.ebert@ixos-leipzig.de
- Completely rewritten by Corinna Vinschen <corinna@vinschen.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 <grp.h>
-#include <pwd.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <limits.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/acl.h>
-#include <ctype.h>
-#include <winnls.h>
-#include <wingdi.h>
-#include <winuser.h>
-#include <wininet.h>
-#include <ntsecapi.h>
-#include <subauth.h>
-#include <aclapi.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "pinfo.h"
-#include "cygheap.h"
-#include <ntdef.h>
-#include "ntdll.h"
-#include "lm.h"
-#include "pwdgrp.h"
-
-extern BOOL allow_ntea;
-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.
- The default is TRUE to reflect the old behaviour. */
-BOOL allow_smbntsec;
-
-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);
- if (cygheap->user.token != hToken)
- {
- cygheap->user.token = hToken;
- cygheap->user.impersonated = FALSE;
- }
-}
-
-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 = strchr (d + 2, ',');
- if ((u = strchr (d + 2, '\\')) == NULL || (c != NULL && u > c))
- u = d + 1;
- else if (u - d <= INTERNET_MAX_HOST_NAME_LENGTH + 2)
- strlcpy (domain, d + 2, u - d - 1);
- if (c == NULL)
- c = u + UNLEN + 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);
- if (!LogonUserA (nt_user, *nt_domain ? nt_domain : NULL, (char *) password,
- LOGON32_LOGON_INTERACTIVE,
- LOGON32_PROVIDER_DEFAULT,
- &hToken)
- || !SetHandleInformation (hToken,
- HANDLE_FLAG_INHERIT,
- HANDLE_FLAG_INHERIT))
- {
- __seterrno ();
- return INVALID_HANDLE_VALUE;
- }
- 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);
-}
-
-void
-str2buf2uni (UNICODE_STRING &tgt, WCHAR *buf, const char *srcstr)
-{
- tgt.Length = strlen (srcstr) * sizeof (WCHAR);
- tgt.MaximumLength = tgt.Length + sizeof (WCHAR);
- tgt.Buffer = (PWCHAR) buf;
- sys_mbstowcs (buf, srcstr, tgt.MaximumLength);
-}
-
-#if 0 /* unused */
-static void
-lsa2wchar (WCHAR *tgt, LSA_UNICODE_STRING &src, int size)
-{
- size = (size - 1) * sizeof (WCHAR);
- if (src.Length < size)
- size = src.Length;
- memcpy (tgt, src.Buffer, size);
- size >>= 1;
- tgt[size] = 0;
-}
-#endif
-
-static void
-lsa2str (char *tgt, LSA_UNICODE_STRING &src, int size)
-{
- if (src.Length / 2 < size)
- size = src.Length / 2;
- sys_wcstombs (tgt, src.Buffer, size);
- tgt[size] = 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;
-}
-
-#if 0 /* unused */
-static BOOL
-get_lsa_srv_inf (LSA_HANDLE lsa, char *logonserver, char *domain)
-{
- NET_API_STATUS ret;
- WCHAR *buf;
- char name[INTERNET_MAX_HOST_NAME_LENGTH + 1];
- WCHAR account[INTERNET_MAX_HOST_NAME_LENGTH + 1];
- WCHAR primary[INTERNET_MAX_HOST_NAME_LENGTH + 1];
- PPOLICY_ACCOUNT_DOMAIN_INFO adi;
- PPOLICY_PRIMARY_DOMAIN_INFO pdi;
-
- if ((ret = LsaQueryInformationPolicy (lsa, PolicyAccountDomainInformation,
- (PVOID *) &adi)) != STATUS_SUCCESS)
- {
- __seterrno_from_win_error (LsaNtStatusToWinError (ret));
- return FALSE;
- }
- lsa2wchar (account, adi->DomainName, INTERNET_MAX_HOST_NAME_LENGTH + 1);
- LsaFreeMemory (adi);
- if ((ret = LsaQueryInformationPolicy (lsa, PolicyPrimaryDomainInformation,
- (PVOID *) &pdi)) != STATUS_SUCCESS)
- {
- __seterrno_from_win_error (LsaNtStatusToWinError (ret));
- return FALSE;
- }
- lsa2wchar (primary, pdi->Name, INTERNET_MAX_HOST_NAME_LENGTH + 1);
- LsaFreeMemory (pdi);
- /* If the SID given in the primary domain info is NULL, the machine is
- not member of a domain. The name in the primary domain info is the
- name of the workgroup then. */
- if (pdi->Sid &&
- (ret =
- NetGetDCName (NULL, primary, (LPBYTE *) &buf)) == STATUS_SUCCESS)
- {
- sys_wcstombs (name, buf, INTERNET_MAX_HOST_NAME_LENGTH + 1);
- strcpy (logonserver, name);
- if (domain)
- sys_wcstombs (domain, primary, INTERNET_MAX_HOST_NAME_LENGTH + 1);
- }
- else
- {
- sys_wcstombs (name, account, INTERNET_MAX_HOST_NAME_LENGTH + 1);
- strcpy (logonserver, "\\\\");
- strcat (logonserver, name);
- if (domain)
- sys_wcstombs (domain, account, INTERNET_MAX_HOST_NAME_LENGTH + 1);
- }
- if (ret == STATUS_SUCCESS)
- NetApiBufferFree (buf);
- return TRUE;
-}
-#endif
-
-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, buf, INTERNET_MAX_HOST_NAME_LENGTH + 1);
- 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 = sizeof (gsid);
- char domain[INTERNET_MAX_HOST_NAME_LENGTH + 1];
- DWORD dlen = sizeof (domain);
- SID_NAME_USE use = SidTypeInvalid;
-
- sys_wcstombs (dgroup + len, buf[i].grui0_name, GNLEN + 1);
- 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_0 buf;
- DWORD cnt, tot;
- NET_API_STATUS ret;
- BOOL retval = FALSE;
-
- /* Members can be users or global groups */
- ret = NetLocalGroupGetMembers (NULL, wgroup, 0, (LPBYTE *) &buf,
- MAX_PREFERRED_LENGTH, &cnt, &tot, NULL);
- if (ret)
- return FALSE;
-
- for (DWORD bidx = 0; !retval && bidx < cnt; ++bidx)
- if (EqualSid (pusersid, buf[bidx].lgrmi0_sid))
- retval = TRUE;
- else
- for (int glidx = 0; !retval && glidx < grp_list.count; ++glidx)
- if (EqualSid (grp_list.sids[glidx], buf[bidx].lgrmi0_sid))
- retval = TRUE;
-
- 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 = sizeof (gsid);
- char domain[INTERNET_MAX_HOST_NAME_LENGTH + 1];
- DWORD dlen = sizeof (domain);
-
- use = SidTypeInvalid;
- sys_wcstombs (bgroup + blen, buf[i].lgrpi0_name, GNLEN + 1);
- 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, cygsid &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 (auth_luid.QuadPart != 999) /* != 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;
- }
-}
-
-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,
- BOOL &special_pgrp)
-{
- grp_list += well_known_world_sid;
- grp_list += well_known_authenticated_users_sid;
- if (well_known_system_sid == usersid)
- {
- auth_pos = -1;
- grp_list += well_known_admins_sid;
- get_unix_group_sidlist (pw, grp_list);
- }
- else
- {
- 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];
-
- get_token_group_sidlist (grp_list, my_grps, auth_luid, auth_pos);
- 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);
- if (!get_user_local_groups (grp_list, usersid))
- return FALSE;
- }
- /* special_pgrp true if pgrpsid is not in normal groups */
- if ((special_pgrp = !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++)
- tmp_list += groups.sgsids.sids[gidx];
- if (!groups.sgsids.contains (pgpsid))
- tmp_list += pgpsid;
-}
-
-static const char *sys_privs[] = {
- SE_TCB_NAME,
- SE_ASSIGNPRIMARYTOKEN_NAME,
- SE_CREATE_TOKEN_NAME,
- SE_CHANGE_NOTIFY_NAME,
- SE_SECURITY_NAME,
- SE_BACKUP_NAME,
- SE_RESTORE_NAME,
- SE_SYSTEMTIME_NAME,
- SE_SHUTDOWN_NAME,
- SE_REMOTE_SHUTDOWN_NAME,
- SE_TAKE_OWNERSHIP_NAME,
- SE_DEBUG_NAME,
- SE_SYSTEM_ENVIRONMENT_NAME,
- SE_SYSTEM_PROFILE_NAME,
- SE_PROF_SINGLE_PROCESS_NAME,
- SE_INC_BASE_PRIORITY_NAME,
- SE_LOAD_DRIVER_NAME,
- SE_CREATE_PAGEFILE_NAME,
- SE_INCREASE_QUOTA_NAME
-};
-
-#define SYSTEM_PERMISSION_COUNT (sizeof sys_privs / sizeof (const char *))
-
-PTOKEN_PRIVILEGES
-get_system_priv_list (cygsidlist &grp_list)
-{
- LUID priv;
- PTOKEN_PRIVILEGES privs = (PTOKEN_PRIVILEGES)
- malloc (sizeof (ULONG) + 20 * sizeof (LUID_AND_ATTRIBUTES));
- if (!privs)
- {
- debug_printf ("malloc (system_privs) failed.");
- return NULL;
- }
- privs->PrivilegeCount = 0;
-
- for (DWORD i = 0; i < SYSTEM_PERMISSION_COUNT; ++i)
- if (LookupPrivilegeValue (NULL, sys_privs[i], &priv))
- {
- 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)
- {
- LUID priv;
- PTOKEN_PRIVILEGES tmp;
- DWORD tmp_count;
-
- lsa2str (buf, privstrs[i], sizeof (buf) - 1);
- if (!LookupPrivilegeValue (NULL, buf, &priv))
- continue;
-
- for (DWORD p = 0; privs && p < privs->PrivilegeCount; ++p)
- if (!memcmp (&priv, &privs->Privileges[p].Luid, sizeof (LUID)))
- 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 (cygheap->user.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 ())
- {
- char sd_buf[MAX_SID_LEN + sizeof (SECURITY_DESCRIPTOR)];
- PSID gsid = NO_SID;
- if (!GetKernelObjectSecurity (token, GROUP_SECURITY_INFORMATION,
- (PSECURITY_DESCRIPTOR) sd_buf,
- sizeof sd_buf, &size))
- debug_printf ("GetKernelObjectSecurity(): %E");
- else if (!GetSecurityDescriptorGroup ((PSECURITY_DESCRIPTOR) sd_buf,
- &gsid, (BOOL *) &size))
- debug_printf ("GetSecurityDescriptorGroup(): %E");
- if (well_known_null_sid != gsid)
- return gsid == groups.pgsid;
- }
-
- PTOKEN_GROUPS my_grps = NULL;
- BOOL ret = FALSE;
- char saw_buf[NGROUPS_MAX] = {};
- char *saw = saw_buf, sawpg = FALSE;
-
- if (!GetTokenInformation (token, TokenGroups, NULL, 0, &size) &&
- GetLastError () != ERROR_INSUFFICIENT_BUFFER)
- debug_printf ("GetTokenInformation(token, TokenGroups): %E");
- else if (!(my_grps = (PTOKEN_GROUPS) malloc (size)))
- debug_printf ("malloc (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 never called */
- {
- ret = sid_in_token_groups (my_grps, groups.pgsid);
- if (ret == FALSE)
- ret = (groups.pgsid == tok_usersid);
- }
- else /* setgroups was called */
- {
- struct __group32 *gr;
- cygsid gsid;
- if (groups.sgsids.count > (int) sizeof (saw_buf) &&
- !(saw = (char *) calloc (groups.sgsids.count, sizeof (char))))
- goto done;
-
- /* 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;
- }
- for (int gidx = 0; gidx < groups.sgsids.count; gidx++)
- if (!saw[gidx])
- goto done;
- if (sawpg ||
- groups.sgsids.contains (groups.pgsid) ||
- groups.pgsid == usersid)
- ret = TRUE;
- }
-done:
- if (my_grps)
- free (my_grps);
- if (saw != saw_buf)
- free (saw);
- return ret;
-}
-
-HANDLE
-create_token (cygsid &usersid, user_groups &new_groups, struct passwd *pw)
-{
- NTSTATUS ret;
- LSA_HANDLE lsa = INVALID_HANDLE_VALUE;
- int old_priv_state;
-
- 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 };
- PSECURITY_ATTRIBUTES psa;
- BOOL special_pgrp = FALSE;
- char sa_buf[1024];
- LUID auth_luid = SYSTEM_LUID;
- LARGE_INTEGER exp = { QuadPart:0x7fffffffffffffffLL };
-
- TOKEN_USER user;
- PTOKEN_GROUPS new_tok_gsids = NULL;
- PTOKEN_PRIVILEGES privs = NULL;
- TOKEN_OWNER owner;
- TOKEN_PRIMARY_GROUP pgrp;
- char acl_buf[MAX_DACL_LEN (5)];
- 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;
-
- HANDLE my_token = INVALID_HANDLE_VALUE;
- PTOKEN_GROUPS my_tok_gsids = NULL;
- DWORD size;
-
- /* SE_CREATE_TOKEN_NAME privilege needed to call NtCreateToken. */
- if ((old_priv_state = set_process_privilege (SE_CREATE_TOKEN_NAME)) < 0)
- goto out;
-
- /* 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 (!OpenProcessToken (hMainProc, TOKEN_QUERY, &my_token))
- debug_printf ("OpenProcessToken(my_token): %E");
- else
- {
- /* 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 (my_token, TokenStatistics,
- &stats, sizeof stats, &size))
- debug_printf
- ("GetTokenInformation(my_token, 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 (my_token, TokenGroups, NULL, 0, &size) &&
- GetLastError () != ERROR_INSUFFICIENT_BUFFER)
- debug_printf ("GetTokenInformation(my_token, TokenGroups): %E");
- else if (!(my_tok_gsids = (PTOKEN_GROUPS) malloc (size)))
- debug_printf ("malloc (my_tok_gsids) failed.");
- else if (!GetTokenInformation (my_token, TokenGroups, my_tok_gsids,
- size, &size))
- {
- debug_printf ("GetTokenInformation(my_token, TokenGroups): %E");
- free (my_tok_gsids);
- my_tok_gsids = NULL;
- }
- CloseHandle (my_token);
- }
-
- /* 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,
- special_pgrp))
- 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;
-
- /* Create default dacl. */
- if (!sec_acl ((PACL) acl_buf, FALSE,
- tmp_gsids.contains (well_known_admins_sid) ?
- well_known_admins_sid : usersid))
- goto out;
- dacl.DefaultDacl = (PACL) acl_buf;
-
- /* 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_win_error (RtlNtStatusToDosError (ret));
- else if (GetLastError () == ERROR_PROC_NOT_FOUND)
- {
- __seterrno ();
- debug_printf ("Loading NtCreateToken failed.");
- }
- else
- {
- /* Set security descriptor and primary group */
- psa = __sec_user (sa_buf, usersid, TRUE);
- if (psa->lpSecurityDescriptor &&
- !SetSecurityDescriptorGroup ((PSECURITY_DESCRIPTOR)
- psa->lpSecurityDescriptor,
- special_pgrp ? new_groups.pgsid
- : well_known_null_sid,
- FALSE))
- debug_printf ("SetSecurityDescriptorGroup %E");
- /* Convert to primary token. */
- if (!DuplicateTokenEx (token, MAXIMUM_ALLOWED, psa, SecurityImpersonation,
- TokenPrimary, &primary_token))
- {
- __seterrno ();
- debug_printf ("DuplicateTokenEx %E");
- }
- }
-
-out:
- if (old_priv_state >= 0)
- set_process_privilege (SE_CREATE_TOKEN_NAME, old_priv_state);
- 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];
- SECURITY_ATTRIBUTES sa = { sizeof sa, NULL, TRUE };
- HANDLE user_token = INVALID_HANDLE_VALUE;
- HANDLE primary_token = INVALID_HANDLE_VALUE;
- int old_tcb_state;
-
- if ((old_tcb_state = set_process_privilege (SE_TCB_NAME)) < 0)
- return INVALID_HANDLE_VALUE;
-
- /* 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, &quota, &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, &sa,
- SecurityImpersonation, TokenPrimary, &primary_token))
- __seterrno ();
-
-out:
- set_process_privilege (SE_TCB_NAME, old_tcb_state);
- 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!
-*/
-
-LONG
-read_sd (const char *file, PSECURITY_DESCRIPTOR sd_buf, LPDWORD sd_size)
-{
- /* Check parameters */
- if (!sd_size)
- {
- set_errno (EINVAL);
- return -1;
- }
-
- debug_printf ("file = %s", file);
-
- DWORD len = 0;
- const char *pfile = file;
- char fbuf[PATH_MAX];
- 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,
- sd_buf, *sd_size, &len))
- {
- __seterrno ();
- return -1;
- }
- debug_printf ("file = %s: len=%d", file, len);
- if (len > *sd_size)
- {
- *sd_size = len;
- return 0;
- }
- return 1;
-}
-
-LONG
-write_sd (const char *file, PSECURITY_DESCRIPTOR sd_buf, DWORD sd_size)
-{
- /* Check parameters */
- if (!sd_buf || !sd_size)
- {
- set_errno (EINVAL);
- return -1;
- }
-
- /* No need to be thread save. */
- static BOOL first_time = TRUE;
- if (first_time)
- {
- set_process_privilege (SE_RESTORE_NAME);
- first_time = FALSE;
- }
-
- HANDLE fh;
- 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);
-
- if (fh == INVALID_HANDLE_VALUE)
- {
- __seterrno ();
- return -1;
- }
-
- LPVOID context = NULL;
- DWORD bytes_written = 0;
- WIN32_STREAM_ID header;
-
- memset (&header, 0, sizeof (header));
- /* write new security info header */
- header.dwStreamId = BACKUP_SECURITY_DATA;
- header.dwStreamAttributes = STREAM_CONTAINS_SECURITY;
- header.Size.HighPart = 0;
- header.Size.LowPart = sd_size;
- header.dwStreamNameSize = 0;
- if (!BackupWrite (fh, (LPBYTE) &header,
- 3 * sizeof (DWORD) + sizeof (LARGE_INTEGER),
- &bytes_written, FALSE, TRUE, &context))
- {
- __seterrno ();
- CloseHandle (fh);
- return -1;
- }
-
- /* write new security descriptor */
- if (!BackupWrite (fh, (LPBYTE) sd_buf,
- header.Size.LowPart + header.dwStreamNameSize,
- &bytes_written, FALSE, TRUE, &context))
- {
- /* Samba returns ERROR_NOT_SUPPORTED.
- FAT returns ERROR_INVALID_SECURITY_DESCR.
- This shouldn't return as error, but better be ignored. */
- DWORD ret = GetLastError ();
- if (ret != ERROR_NOT_SUPPORTED && ret != ERROR_INVALID_SECURITY_DESCR)
- {
- __seterrno ();
- BackupWrite (fh, NULL, 0, &bytes_written, TRUE, TRUE, &context);
- CloseHandle (fh);
- return -1;
- }
- }
-
- /* terminate the restore process */
- BackupWrite (fh, NULL, 0, &bytes_written, TRUE, TRUE, &context);
- CloseHandle (fh);
- return 0;
-}
-
-static void
-get_attribute_from_acl (int * 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;
- }
-
- cygsid ace_sid ((PSID) &ace->SidStart);
- if (ace_sid == well_known_world_sid)
- {
- if (ace->Mask & FILE_READ_DATA)
- *flags |= ((!(*anti & S_IROTH)) ? S_IROTH : 0)
- | ((!(*anti & S_IRGRP)) ? S_IRGRP : 0)
- | ((!(*anti & S_IRUSR)) ? S_IRUSR : 0);
- if (ace->Mask & FILE_WRITE_DATA)
- *flags |= ((!(*anti & S_IWOTH)) ? S_IWOTH : 0)
- | ((!(*anti & S_IWGRP)) ? S_IWGRP : 0)
- | ((!(*anti & S_IWUSR)) ? S_IWUSR : 0);
- if (ace->Mask & FILE_EXECUTE)
- *flags |= ((!(*anti & S_IXOTH)) ? S_IXOTH : 0)
- | ((!(*anti & S_IXGRP)) ? S_IXGRP : 0)
- | ((!(*anti & S_IXUSR)) ? S_IXUSR : 0);
- if ((*attribute & S_IFDIR) &&
- (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_DATA)
- *flags |= ((!(*anti & S_IRUSR)) ? S_IRUSR : 0);
- if (ace->Mask & FILE_WRITE_DATA)
- *flags |= ((!(*anti & S_IWUSR)) ? S_IWUSR : 0);
- if (ace->Mask & FILE_EXECUTE)
- *flags |= ((!(*anti & S_IXUSR)) ? S_IXUSR : 0);
- }
- else if (ace_sid == group_sid)
- {
- if (ace->Mask & FILE_READ_DATA)
- *flags |= ((!(*anti & S_IRGRP)) ? S_IRGRP : 0)
- | ((grp_member && !(*anti & S_IRUSR)) ? S_IRUSR : 0);
- if (ace->Mask & FILE_WRITE_DATA)
- *flags |= ((!(*anti & S_IWGRP)) ? S_IWGRP : 0)
- | ((grp_member && !(*anti & S_IWUSR)) ? S_IWUSR : 0);
- if (ace->Mask & FILE_EXECUTE)
- *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;
- return;
-}
-
-static int
-get_nt_attribute (const char *file, int *attribute,
- __uid32_t *uidret, __gid32_t *gidret)
-{
- if (!wincap.has_security ())
- return 0;
-
- syscall_printf ("file: %s", file);
-
- /* Yeah, sounds too much, but I've seen SDs of 2100 bytes! */
- DWORD sd_size = 4096;
- char sd_buf[4096];
- PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) sd_buf;
-
- int ret;
- if ((ret = read_sd (file, psd, &sd_size)) <= 0)
- {
- debug_printf ("read_sd %E");
- return -1;
- }
-
- PSID owner_sid;
- PSID group_sid;
- BOOL dummy;
-
- if (!GetSecurityDescriptorOwner (psd, &owner_sid, &dummy))
- debug_printf ("GetSecurityDescriptorOwner %E");
- if (!GetSecurityDescriptorGroup (psd, &group_sid, &dummy))
- debug_printf ("GetSecurityDescriptorGroup %E");
-
- PACL acl;
- BOOL acl_exists;
-
- if (!GetSecurityDescriptorDacl (psd, &acl_exists, &acl, &dummy))
- {
- __seterrno ();
- debug_printf ("GetSecurityDescriptorDacl %E");
- return -1;
- }
-
- __uid32_t uid = cygsid (owner_sid).get_uid ();
- __gid32_t gid = cygsid (group_sid).get_gid ();
- if (uidret)
- *uidret = uid;
- if (gidret)
- *gidret = gid;
-
- if (!attribute)
- {
- syscall_printf ("file: %s uid %d, gid %d", file, uid, gid);
- return 0;
- }
-
- BOOL grp_member = is_grp_member (uid, gid);
-
- if (!acl_exists || !acl)
- {
- *attribute |= S_IRWXU | S_IRWXG | S_IRWXO;
- syscall_printf ("file: %s No ACL = %x, uid %d, gid %d",
- file, *attribute, uid, gid);
- return 0;
- }
- get_attribute_from_acl (attribute, acl, owner_sid, group_sid, grp_member);
-
- syscall_printf ("file: %s %x, uid %d, gid %d", file, *attribute, uid, gid);
- return 0;
-}
-
-int
-get_file_attribute (int use_ntsec, const char *file,
- int *attribute, __uid32_t *uidret, __gid32_t *gidret)
-{
- int res;
-
- if (use_ntsec && allow_ntsec)
- {
- res = get_nt_attribute (file, attribute, uidret, gidret);
- if (res)
- {
- /* If reading the security descriptor failed, treat the file
- as unreadable. */
- *attribute &= ~(S_IRWXU | S_IRWXG | S_IRWXO);
- if (uidret)
- *uidret = ILLEGAL_UID;
- if (gidret)
- *gidret = ILLEGAL_GID;
- }
- else if (attribute && (*attribute & S_IFLNK) == S_IFLNK)
- *attribute |= S_IRWXU | S_IRWXG | S_IRWXO;
- return 0;
- }
-
- if (uidret)
- *uidret = getuid32 ();
- if (gidret)
- *gidret = getgid32 ();
-
- if (!attribute)
- return 0;
-
- if (allow_ntea)
- {
- int oatt = *attribute;
- res = NTReadEA (file, ".UNIXATTR", (char *)attribute, sizeof (*attribute));
- *attribute |= oatt;
- }
- else
- res = 0;
-
- /* symlinks are everything for everyone! */
- if ((*attribute & S_IFLNK) == S_IFLNK)
- *attribute |= S_IRWXU | S_IRWXG | S_IRWXO;
-
- return res > 0 ? 0 : -1;
-}
-
-static int
-get_nt_object_attribute (HANDLE handle, SE_OBJECT_TYPE object_type,
- int *attribute, __uid32_t *uidret, __gid32_t *gidret)
-{
- if (!wincap.has_security ())
- return 0;
-
- PSECURITY_DESCRIPTOR psd = NULL;
- PSID owner_sid;
- PSID group_sid;
- PACL acl;
-
- if (ERROR_SUCCESS != GetSecurityInfo (handle, object_type,
- DACL_SECURITY_INFORMATION |
- GROUP_SECURITY_INFORMATION |
- OWNER_SECURITY_INFORMATION,
- &owner_sid, &group_sid,
- &acl, NULL, &psd))
- {
- __seterrno ();
- debug_printf ("GetSecurityInfo %E");
- return -1;
- }
-
- __uid32_t uid = cygsid (owner_sid).get_uid ();
- __gid32_t gid = cygsid (group_sid).get_gid ();
- if (uidret)
- *uidret = uid;
- if (gidret)
- *gidret = gid;
-
- if (!attribute)
- {
- syscall_printf ("uid %d, gid %d", uid, gid);
- LocalFree (psd);
- return 0;
- }
-
- BOOL grp_member = is_grp_member (uid, gid);
-
- if (!acl)
- {
- *attribute |= S_IRWXU | S_IRWXG | S_IRWXO;
- syscall_printf ("No ACL = %x, uid %d, gid %d", *attribute, uid, gid);
- LocalFree (psd);
- return 0;
- }
-
- get_attribute_from_acl (attribute, acl, owner_sid, group_sid, grp_member);
-
- LocalFree (psd);
-
- syscall_printf ("%x, uid %d, gid %d", *attribute, uid, gid);
- return 0;
-}
-
-int
-get_object_attribute (HANDLE handle, SE_OBJECT_TYPE object_type,
- int *attribute, __uid32_t *uidret, __gid32_t *gidret)
-{
- if (allow_ntsec)
- {
- int res = get_nt_object_attribute (handle, object_type, attribute,
- uidret, gidret);
- if (attribute && (*attribute & S_IFLNK) == S_IFLNK)
- *attribute |= S_IRWXU | S_IRWXG | S_IRWXO;
- return res;
- }
-
- if (uidret)
- *uidret = getuid32 ();
- if (gidret)
- *gidret = getgid32 ();
-
- if (!attribute)
- return 0;
-
- /* symlinks are everything for everyone! */
- if ((*attribute & S_IFLNK) == S_IFLNK)
- *attribute |= S_IRWXU | S_IRWXG | S_IRWXO;
-
- return 0;
-}
-
-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;
-}
-
-PSECURITY_DESCRIPTOR
-alloc_sd (__uid32_t uid, __gid32_t gid, int attribute,
- PSECURITY_DESCRIPTOR sd_ret, DWORD *sd_size_ret)
-{
- BOOL dummy;
-
- debug_printf("uid %d, gid %d, attribute %x", uid, gid, attribute);
- if (!sd_ret || !sd_size_ret)
- {
- set_errno (EINVAL);
- return NULL;
- }
-
- /* 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 (NO_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 (NO_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;
- PSECURITY_DESCRIPTOR psd = NULL;
- 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. */
- char acl_buf[3072];
- PACL acl = (PACL) acl_buf;
- 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 & ~DELETE)
- | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA;
- if (attribute & S_IRUSR)
- owner_allow |= FILE_GENERIC_READ;
- if (attribute & S_IWUSR)
- owner_allow |= FILE_GENERIC_WRITE | DELETE;
- if (attribute & S_IXUSR)
- owner_allow |= FILE_GENERIC_EXECUTE;
- if ((attribute & (S_IFDIR | S_IWUSR | S_IXUSR))
- == (S_IFDIR | 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 ((attribute & (S_IFDIR | S_IWGRP | S_IXGRP))
- == (S_IFDIR | 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 ((attribute & (S_IFDIR | S_IWOTH | S_IXOTH))
- == (S_IFDIR | 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. */
- DWORD group_deny;
- if (owner_sid == group_sid)
- {
- owner_allow |= group_allow;
- group_allow = group_deny = 0L;
- }
- else
- {
- group_deny = ~group_allow & other_allow;
- group_deny &= ~(STANDARD_RIGHTS_READ
- | FILE_READ_ATTRIBUTES | FILE_READ_EA);
- }
- 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);
-
- /* Construct appropriate inherit attribute. */
- DWORD inherit = (attribute & S_IFDIR) ? SUB_CONTAINERS_AND_OBJECTS_INHERIT
- : NO_INHERITANCE;
-
- /* Set deny ACE for owner. */
- if (owner_deny
- && !add_access_denied_ace (acl, ace_off++, owner_deny,
- 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 && !(owner_allow & group_deny))
- {
- if (!add_access_denied_ace (acl, ace_off++, group_deny,
- group_sid, acl_len, inherit))
- return NULL;
- group_deny = 0;
- }
- /* Set allow ACE for owner. */
- if (!add_access_allowed_ace (acl, ace_off++, owner_allow,
- owner_sid, acl_len, inherit))
- return NULL;
- /* Set deny ACE for group, if still needed. */
- if (group_deny
- && !add_access_denied_ace (acl, ace_off++, group_deny,
- group_sid, acl_len, inherit))
- return NULL;
- /* Set allow ACE for group. */
- if (group_allow
- && !add_access_allowed_ace (acl, ace_off++, group_allow,
- 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 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;
- 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))
- {
- cygsid ace_sid ((PSID) &ace->SidStart);
- /* Check for related ACEs. */
- 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)
- || (ace_sid == well_known_null_sid))
- continue;
- /*
- * Add unrelated ACCESS_DENIED_ACE to the beginning but
- * behind the owner_deny, ACCESS_ALLOWED_ACE to the end.
- */
- 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;
- }
-
- /* 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. */
- *sd_size_ret = 0;
- MakeSelfRelativeSD (&sd, sd_ret, sd_size_ret);
- if (*sd_size_ret <= 0)
- {
- __seterrno ();
- return NULL;
- }
- if (!MakeSelfRelativeSD (&sd, sd_ret, sd_size_ret))
- {
- __seterrno ();
- return NULL;
- }
- psd = sd_ret;
- debug_printf ("Created SD-Size: %d", *sd_size_ret);
-
- return psd;
-}
-
-void
-set_security_attribute (int attribute, PSECURITY_ATTRIBUTES psa,
- void *sd_buf, DWORD sd_buf_size)
-{
- /* symlinks are anything for everyone! */
- if ((attribute & S_IFLNK) == S_IFLNK)
- attribute |= S_IRWXU | S_IRWXG | S_IRWXO;
-
- psa->lpSecurityDescriptor = sd_buf;
- InitializeSecurityDescriptor ((PSECURITY_DESCRIPTOR) sd_buf,
- SECURITY_DESCRIPTOR_REVISION);
- psa->lpSecurityDescriptor = alloc_sd (geteuid32 (), getegid32 (), attribute,
- (PSECURITY_DESCRIPTOR) sd_buf,
- &sd_buf_size);
-}
-
-static int
-set_nt_attribute (const char *file, __uid32_t uid, __gid32_t gid,
- int attribute)
-{
- if (!wincap.has_security ())
- return 0;
-
- DWORD sd_size = 4096;
- char sd_buf[4096];
- PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) sd_buf;
-
- int ret;
- if ((ret = read_sd (file, psd, &sd_size)) <= 0)
- {
- debug_printf ("read_sd %E");
- return -1;
- }
-
- sd_size = 4096;
- if (!(psd = alloc_sd (uid, gid, attribute, psd, &sd_size)))
- return -1;
-
- return write_sd (file, psd, sd_size);
-}
-
-int
-set_file_attribute (int use_ntsec, const char *file,
- __uid32_t uid, __gid32_t gid, int attribute)
-{
- int ret = 0;
-
- if (use_ntsec && allow_ntsec)
- ret = set_nt_attribute (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 (int use_ntsec, const char *file, int attribute)
-{
- return set_file_attribute (use_ntsec, file,
- myself->uid, myself->gid, attribute);
-}
diff --git a/winsup/cygwin/security.h b/winsup/cygwin/security.h
deleted file mode 100644
index 7ed0307ce..000000000
--- a/winsup/cygwin/security.h
+++ /dev/null
@@ -1,266 +0,0 @@
-/* security.h: security declarations
-
- 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. */
-
-#include <accctrl.h>
-
-#define DEFAULT_UID DOMAIN_USER_RID_ADMIN
-#define DEFAULT_UID_NT 400 /* Non conflicting number */
-#define DEFAULT_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 NO_SID ((PSID)NULL)
-
-class cygsid {
- PSID psid;
- 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:
- static void init();
- 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 () : psid ((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);
-
- __uid32_t get_id (BOOL search_grp, int *type = NULL);
- inline int get_uid () { return get_id (FALSE); }
- inline int get_gid () { return get_id (TRUE); }
-
- char *string (char *nsidstr) const;
-
- inline BOOL operator== (const PSID nsid) const
- {
- if (!psid || !nsid)
- return nsid == psid;
- return EqualSid (psid, nsid);
- }
- inline BOOL operator== (const char *nsidstr) const
- {
- cygsid nsid (nsidstr);
- return *this == nsid;
- }
- inline BOOL operator!= (const PSID nsid) const
- { return !(*this == nsid); }
- inline BOOL operator!= (const char *nsidstr) const
- { return !(*this == nsidstr); }
-
- void debug_print (const char *prefix = NULL) const
- {
- char buf[256];
- debug_printf ("%s %s", prefix ?: "", string (buf) ?: "NULL");
- }
-};
-
-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); }
-
- 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 ---");
- }
-};
-
-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 ()
- {
- sgsids.free_sids ();
- ischanged = TRUE;
- }
- void update_pgrp (const PSID sid)
- {
- pgsid = sid;
- ischanged = TRUE;
- }
-};
-
-extern cygsid well_known_null_sid;
-extern cygsid well_known_world_sid;
-extern cygsid well_known_local_sid;
-extern cygsid well_known_creator_owner_sid;
-extern cygsid well_known_creator_group_sid;
-extern cygsid well_known_dialup_sid;
-extern cygsid well_known_network_sid;
-extern cygsid well_known_batch_sid;
-extern cygsid well_known_interactive_sid;
-extern cygsid well_known_service_sid;
-extern cygsid well_known_authenticated_users_sid;
-extern cygsid well_known_system_sid;
-extern cygsid well_known_admins_sid;
-
-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;
-
-/* File manipulation */
-int __stdcall set_process_privileges ();
-int __stdcall get_file_attribute (int, const char *, int *,
- __uid32_t * = NULL, __gid32_t * = NULL);
-int __stdcall set_file_attribute (int, const char *, int);
-int __stdcall set_file_attribute (int, const char *, __uid32_t, __gid32_t, int);
-int __stdcall get_object_attribute (HANDLE handle, SE_OBJECT_TYPE object_type, int *,
- __uid32_t * = NULL, __gid32_t * = NULL);
-LONG __stdcall read_sd(const char *file, PSECURITY_DESCRIPTOR sd_buf, LPDWORD sd_size);
-LONG __stdcall write_sd(const char *file, PSECURITY_DESCRIPTOR sd_buf, DWORD sd_size);
-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);
-
-void set_security_attribute (int attribute, PSECURITY_ATTRIBUTES psa,
- void *sd_buf, DWORD sd_buf_size);
-
-/* 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);
-
-/* 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. */
-BOOL __stdcall is_grp_member (__uid32_t uid, __gid32_t gid);
-int set_process_privilege (const char *privilege, BOOL enable = TRUE);
-
-/* shared.cc: */
-/* Retrieve a security descriptor that allows all access */
-SECURITY_DESCRIPTOR *__stdcall get_null_sd (void);
-
-/* 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 sid2, BOOL inherit)
- __attribute__ ((regparm (3)));
-extern BOOL sec_acl (PACL acl, BOOL admins, PSID sid1 = NO_SID, PSID sid2 = NO_SID);
-
-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);
-PSECURITY_DESCRIPTOR alloc_sd (__uid32_t uid, __gid32_t gid, int attribute,
- PSECURITY_DESCRIPTOR sd_ret, DWORD *sd_size_ret);
-
-extern inline SECURITY_ATTRIBUTES *
-sec_user_nih (char sa_buf[], PSID sid = NULL)
-{
- return allow_ntsec ? __sec_user (sa_buf, sid, FALSE) : &sec_none_nih;
-}
-
-extern inline SECURITY_ATTRIBUTES *
-sec_user (char sa_buf[], PSID sid = NULL)
-{
- return allow_ntsec ? __sec_user (sa_buf, sid, TRUE) : &sec_none_nih;
-}
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc
deleted file mode 100644
index d8d89999c..000000000
--- a/winsup/cygwin/select.cc
+++ /dev/null
@@ -1,1505 +0,0 @@
-/* select.cc
-
- Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 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 <errno.h>
-#include <sys/socket.h>
-#include <stdlib.h>
-#include <sys/time.h>
-
-#include <wingdi.h>
-#include <winuser.h>
-#include <netdb.h>
-#include <unistd.h>
-#include <stdio.h>
-#define USE_SYS_TYPES_FD_SET
-#include <winsock.h>
-#include "select.h"
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "sigproc.h"
-#include "perthread.h"
-#include "tty.h"
-#include "cygthread.h"
-
-/*
- * 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)->saw_error = true; \
- set_sig_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);
- sigframe thisframe (mainthread);
-
- 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);
-}
-
-/* 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 || s->windows_handle || 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))
- {
- __seterrno ();
- 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;
- }
-
- DWORD start_time = GetTickCount (); /* 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");
- __seterrno ();
- 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;
- int 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)
- 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");
-
- DWORD now = GetTickCount ();
- 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;
- 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 && me->fh->get_device () == FH_SOCKET)
- ((fhandler_socket *) me->fh)->set_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 (me->fh->get_device () == FH_SOCKET)
- ((fhandler_socket *) me->fh)->set_connect_state (CONNECTED);
- }
- 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 ("already ready");
- 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)
- /* nothing */;
- 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", fh->get_name ());
- 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;
- select_printf ("saw eof on '%s'", fh->get_name ());
- }
-
-out:
- return gotone || s->write_ready;
-}
-
-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[FHDEVN (FH_PIPE)])
- {
- me->h = *((pipeinf *) stuff->device_specific[FHDEVN (FH_PIPE)])->thread;
- return 1;
- }
- pipeinf *pi = new pipeinf;
- pi->start = &stuff->start;
- pi->stop_thread_pipe = FALSE;
- pi->thread = new cygthread (thread_pipe, (LPVOID) pi, "select_pipe");
- me->h = *pi->thread;
- if (!me->h)
- return 0;
- stuff->device_specific[FHDEVN (FH_PIPE)] = (void *) pi;
- return 1;
-}
-
-static void
-pipe_cleanup (select_record *, select_stuff *stuff)
-{
- pipeinf *pi = (pipeinf *) stuff->device_specific[FHDEVN (FH_PIPE)];
- if (pi && pi->thread)
- {
- pi->stop_thread_pipe = true;
- pi->thread->detach ();
- delete pi;
- stuff->device_specific[FHDEVN (FH_PIPE)] = NULL;
- }
-}
-
-int
-fhandler_pipe::ready_for_read (int fd, DWORD howlong)
-{
- if (!howlong)
- return this->fhandler_base::ready_for_read (fd, howlong);
-
- get_guard ();
- return true;
-}
-
-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->read_selected = true;
- s->read_ready = false;
- s->cleanup = pipe_cleanup;
- return s;
-}
-
-select_record *
-fhandler_pipe::select_write (select_record *s)
-{
- if (!s)
- {
- s = new select_record;
- s->startup = no_startup;
- s->verify = no_verify;
- }
- s->peek = peek_pipe;
- s->write_selected = true;
- s->write_ready = true;
- 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 = true;
- 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;
- }
-
- (void) 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;
- }
-
- __seterrno ();
- s->saw_error = true;
- 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[FHDEVN (FH_SERIAL)])
- {
- me->h = *((serialinf *) stuff->device_specific[FHDEVN (FH_SERIAL)])->thread;
- return 1;
- }
- serialinf *si = new serialinf;
- si->start = &stuff->start;
- si->stop_thread_serial = FALSE;
- si->thread = new cygthread (thread_serial, (LPVOID) si, "select_serial");
- me->h = *si->thread;
- stuff->device_specific[FHDEVN (FH_SERIAL)] = (void *) si;
- return 1;
-}
-
-static void
-serial_cleanup (select_record *, select_stuff *stuff)
-{
- serialinf *si = (serialinf *) stuff->device_specific[FHDEVN (FH_SERIAL)];
- if (si && si->thread)
- {
- si->stop_thread_serial = true;
- si->thread->detach ();
- delete si;
- stuff->device_specific[FHDEVN (FH_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)
- {
- (void) 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)
- {
- 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;
- struct sockaddr_in sin;
- 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_selected && me->read_ready))
- me->read_ready = true;
- if (WINSOCK_FD_ISSET (h, &ws_writefds) || (me->write_selected && me->write_ready))
- me->write_ready = true;
- if (WINSOCK_FD_ISSET (h, &ws_exceptfds) || ((me->except_selected || me->except_on_write) && me->except_ready))
- 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;
-}
-
-extern "C" unsigned long htonl (unsigned long);
-
-static int
-start_thread_socket (select_record *me, select_stuff *stuff)
-{
- socketinf *si;
-
- if ((si = (socketinf *) stuff->device_specific[FHDEVN (FH_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 ((si->exitsock = socket (PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
- {
- set_winsock_errno ();
- select_printf ("cannot create socket, %E");
- return -1;
- }
- /* Allow rapid reuse of the port. */
- int tmp = 1;
- (void) setsockopt (si->exitsock, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, sizeof (tmp));
-
- int sin_len = sizeof (si->sin);
- memset (&si->sin, 0, sizeof (si->sin));
- si->sin.sin_family = AF_INET;
- si->sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
- if (bind (si->exitsock, (struct sockaddr *) &si->sin, sizeof (si->sin)) < 0)
- {
- select_printf ("cannot bind socket, %E");
- goto err;
- }
-
- if (getsockname (si->exitsock, (struct sockaddr *) &si->sin, &sin_len) < 0)
- {
- select_printf ("getsockname error");
- goto err;
- }
-
- if (listen (si->exitsock, 1))
- {
- select_printf ("listen failed, %E");
- goto err;
- }
-
- select_printf ("exitsock %p", si->exitsock);
- WINSOCK_FD_SET ((HANDLE) si->exitsock, &si->readfds);
- WINSOCK_FD_SET ((HANDLE) si->exitsock, &si->exceptfds);
- stuff->device_specific[FHDEVN (FH_SOCKET)] = (void *) si;
- si->start = &stuff->start;
- select_printf ("stuff_start %p", &stuff->start);
- si->thread = new cygthread (thread_socket, (LPVOID) 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[FHDEVN (FH_SOCKET)];
- select_printf ("si %p si->thread %p", si, si ? si->thread : NULL);
- if (si && si->thread)
- {
- select_printf ("connection to si->exitsock %p", si->exitsock);
- SOCKET s = socket (AF_INET, SOCK_STREAM, 0);
-
- /* Set LINGER with 0 timeout for hard close */
- struct linger tmp = {1, 0}; /* On, 0 delay */
- (void) setsockopt (s, SOL_SOCKET, SO_LINGER, (char *)&tmp, sizeof (tmp));
- (void) setsockopt (si->exitsock, SOL_SOCKET, SO_LINGER, (char *)&tmp, sizeof (tmp));
-
- /* Connecting to si->exitsock will cause any executing select to wake
- up. When this happens then the exitsock condition will cause the
- thread to terminate. */
- if (connect (s, (struct sockaddr *) &si->sin, sizeof (si->sin)) < 0)
- {
- set_winsock_errno ();
- select_printf ("connect failed");
- /* FIXME: now what? */
- }
- shutdown (s, SD_BOTH);
- closesocket (s);
-
- /* Wait for thread to go away */
- si->thread->detach ();
- shutdown (si->exitsock, SD_BOTH);
- closesocket (si->exitsock);
- stuff->device_specific[FHDEVN (FH_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 () || is_unconnected ();
- s->write_selected = true;
- if (is_connect_pending ())
- {
- 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 = true;
- s->windows_handle = true;
- return s;
-}
diff --git a/winsup/cygwin/select.h b/winsup/cygwin/select.h
deleted file mode 100644
index 30b59964f..000000000
--- a/winsup/cygwin/select.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* select.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. */
-
-/* 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 63aba8e80..000000000
--- a/winsup/cygwin/sem.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-/* sem.cc: Single unix specification IPC interface for Cygwin.
-
- Copyright 2002 Red Hat, Inc.
-
- Written by Conrad Scott <conrad.scott@dsl.pipex.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 <sys/types.h>
-#include <cygwin/sem.h>
-
-#include <errno.h>
-
-#include "cygerrno.h"
-
-extern "C" int
-semctl (int semid, int semnum, int cmd, ...)
-{
- set_errno (ENOSYS);
- return -1;
-}
-
-extern "C" int
-semget (key_t key, int nsems, int semflg)
-{
- set_errno (ENOSYS);
- return -1;
-}
-
-extern "C" int
-semop (int semid, struct sembuf *sops, size_t nsops)
-{
- set_errno (ENOSYS);
- return -1;
-}
diff --git a/winsup/cygwin/shared.cc b/winsup/cygwin/shared.cc
deleted file mode 100644
index a21aebbe3..000000000
--- a/winsup/cygwin/shared.cc
+++ /dev/null
@@ -1,259 +0,0 @@
-/* shared.cc: shared data area support.
-
- 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 <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <grp.h>
-#include <pwd.h>
-#include <errno.h>
-#include "pinfo.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygerrno.h"
-#include "cygheap.h"
-#include "heap.h"
-#include "shared_info_magic.h"
-#include "registry.h"
-#include "cygwin_version.h"
-#include "child_info.h"
-
-shared_info NO_COPY *cygwin_shared;
-mount_info NO_COPY *mount_table;
-HANDLE NO_COPY cygwin_mount_h;
-
-char * __stdcall
-shared_name (const char *str, int num)
-{
- static NO_COPY char buf[MAX_PATH] = {0};
- extern bool _cygwin_testing;
-
- __small_sprintf (buf, "%s.%s.%d", cygwin_version.shared_id, str, num);
- if (_cygwin_testing)
- strcat (buf, cygwin_version.dll_build_date);
- return 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 (mount_info)),
- (char *) cygwin_shared_address
- + pround (sizeof (shared_info))
- + pround (sizeof (mount_info))
- + pround (sizeof (console_state)),
- (char *) cygwin_shared_address
- + pround (sizeof (shared_info))
- + pround (sizeof (mount_info))
- + pround (sizeof (console_state))
- + pround (sizeof (_pinfo))
-};
-
-void * __stdcall
-open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locations m)
-{
- void *shared;
-
- void *addr;
- if (!wincap.needs_memory_protection ())
- addr = NULL;
- else
- {
- addr = offsets[m];
- (void) VirtualFree (addr, 0, MEM_RELEASE);
- }
-
- if (!size)
- return addr;
-
- if (!shared_h)
- {
- char *mapname;
- if (!name)
- mapname = NULL;
- else
- {
- mapname = shared_name (name, n);
- shared_h = OpenFileMappingA (FILE_MAP_READ | FILE_MAP_WRITE,
- TRUE, mapname);
- }
- if (!shared_h &&
- !(shared_h = CreateFileMapping (INVALID_HANDLE_VALUE, &sec_all,
- PAGE_READWRITE, 0, size, mapname)))
- api_fatal ("CreateFileMapping, %E. Terminating.");
- }
-
- shared = (shared_info *)
- MapViewOfFileEx (shared_h, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0, addr);
-
- if (!shared)
- {
- /* Probably win95, so try without specifying the address. */
- shared = (shared_info *) MapViewOfFileEx (shared_h,
- FILE_MAP_READ|FILE_MAP_WRITE,
- 0, 0, 0, 0);
-#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
- }
-
- if (!shared)
- api_fatal ("MapViewOfFileEx '%s'(%p), %E. Terminating.", name, shared_h);
-
- if (m == SH_CYGWIN_SHARED && 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, shared %p (wanted %p), h %p", name, shared, addr, shared_h);
-
- return shared;
-}
-
-void
-shared_info::initialize ()
-{
- if (version)
- {
- if (version != SHARED_VERSION_MAGIC)
- multiple_cygwin_problem ("shared", version, SHARED_VERSION_MAGIC);
- else if (cb != SHARED_INFO_CB)
- multiple_cygwin_problem ("shared size", cb, SHARED_INFO_CB);
- return;
- }
-
- /* Initialize the queue of deleted files. */
- delqueue.init ();
-
- /* Initialize tty table. */
- tty.init ();
- version = SHARED_VERSION_MAGIC;
- cb = sizeof (*this);
- 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 general shared memory */
- HANDLE shared_h = cygheap ? cygheap->shared_h : NULL;
- cygwin_shared = (shared_info *) open_shared ("shared",
- CYGWIN_VERSION_SHARED_DATA,
- shared_h,
- sizeof (*cygwin_shared),
- SH_CYGWIN_SHARED);
-
- cygwin_shared->initialize ();
-
- /* Allocate memory for the per-user mount table */
- char user_name[UNLEN + 1];
- DWORD user_name_len = UNLEN + 1;
-
- if (!GetUserName (user_name, &user_name_len))
- strcpy (user_name, "unknown");
-
- /* Initialize the Cygwin heap, if necessary */
- if (!cygheap)
- {
- cygheap_init ();
- cygheap->user.set_name (user_name);
- }
-
- cygheap->shared_h = shared_h;
- ProtectHandleINH (cygheap->shared_h);
-
- heap_init ();
-
- mount_table = (mount_info *) open_shared (user_name, MOUNT_VERSION,
- cygwin_mount_h, sizeof (mount_info),
- SH_MOUNT_TABLE);
- debug_printf ("opening mount table for '%s' at %p", cygheap->user.name (),
- mount_table);
- ProtectHandleINH (cygwin_mount_h);
- debug_printf ("mount table version %x at %p", mount_table->version, mount_table);
-
- /* Initialize the Cygwin per-user mount table, if necessary */
- if (!mount_table->version)
- {
- mount_table->version = MOUNT_VERSION_MAGIC;
- debug_printf ("initializing mount table");
- mount_table->cb = sizeof (*mount_table);
- if (mount_table->cb != MOUNT_INFO_CB)
- system_printf ("size of mount table region changed from %u to %u",
- MOUNT_INFO_CB, mount_table->cb);
- mount_table->init (); /* Initialize the mount table. */
- }
- else if (mount_table->version != MOUNT_VERSION_MAGIC)
- multiple_cygwin_problem ("mount", mount_table->version, MOUNT_VERSION);
- else if (mount_table->cb != MOUNT_INFO_CB)
- multiple_cygwin_problem ("mount table size", mount_table->cb, MOUNT_INFO_CB);
-
-}
-
-unsigned
-shared_info::heap_chunk_size ()
-{
- if (!heap_chunk)
- {
- /* Fetch misc. registry entries. */
-
- reg_key reg (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. */
-
- heap_chunk = reg.get_int ("heap_chunk_in_mb", 0);
- if (!heap_chunk) {
- reg_key r1 (HKEY_LOCAL_MACHINE, KEY_READ, "SOFTWARE",
- CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
- CYGWIN_INFO_CYGWIN_REGISTRY_NAME, NULL);
- heap_chunk = reg.get_int ("heap_chunk_in_mb", 384);
- }
-
- if (heap_chunk < 4)
- heap_chunk = 4 * 1024 * 1024;
- else
- heap_chunk <<= 20;
- 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 f43d654e2..000000000
--- a/winsup/cygwin/shared.sgml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-<sect1 id="func-cygwin-getshared">
-<title>cygwin_getshared</title>
-
-<funcsynopsis>
-<funcdef>shared_info *
-<function>cygwin_getshared</function></funcdef>
-<void>
-</funcsynopsis>
-
-<para>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
-<filename>mount</filename> and <filename>ps</filename>.
-</para>
-
-</sect1>
diff --git a/winsup/cygwin/shared_info.h b/winsup/cygwin/shared_info.h
deleted file mode 100644
index 0156763e6..000000000
--- a/winsup/cygwin/shared_info.h
+++ /dev/null
@@ -1,190 +0,0 @@
-/* shared_info.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 "tty.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[MAX_PATH];
- int native_pathlen;
-
- /* POSIX-style mount point ("/foo/bar") */
- char posix_path[MAX_PATH];
- int posix_pathlen;
-
- unsigned flags;
-
- void init (const char *dev, const char *path, unsigned flags);
-
- struct mntent *getmntent ();
-};
-
-/* 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 MOUNT_VERSION 27 // increment when mount table changes and
-#define MOUNT_VERSION_MAGIC CYGWIN_VERSION_MAGIC (MOUNT_MAGIC, MOUNT_VERSION)
-#define CURR_MOUNT_MAGIC 0x4fe431cdU
-#define MOUNT_INFO_CB 16488
-
-class reg_key;
-
-/* 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 version;
- unsigned cb;
- 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[MAX_PATH];
- size_t cygdrive_len;
- unsigned cygdrive_flags;
- private:
- int posix_sorted[MAX_MOUNTS];
- int native_sorted[MAX_MOUNTS];
-
- public:
- /* Increment when setting up a reg_key if mounts area had to be
- created so we know when we need to import old mount tables. */
- int had_to_create_mount_areas;
-
- 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, DWORD &devn,
- int &unit, unsigned *flags = NULL, bool no_normalize = 0);
- 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);
-
- 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 cygdrive_posix_path (const char *src, char *dst, int trailing_slash_p);
- 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][MAX_PATH];
- char inuse[MAX_DELQUEUES_PENDING];
- int empty;
-
-public:
- void init ();
- void queue_file (const char *dosname);
- void process_queue ();
-};
-
-/******** 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 47112
-
-#define CURR_SHARED_MAGIC 0x359218a2U
-
-/* 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;
- delqueue_list delqueue;
- void initialize ();
- unsigned heap_chunk_size ();
-};
-
-extern shared_info *cygwin_shared;
-extern mount_info *mount_table;
-extern HANDLE cygwin_mount_h;
-
-enum shared_locations
-{
- SH_CYGWIN_SHARED,
- SH_MOUNT_TABLE,
- SH_SHARED_CONSOLE,
- SH_MYSELF,
- SH_TOTAL_SIZE
-};
-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 *) 0xa000000)
-
-#ifdef FHDEVN
-struct console_state
-{
- tty_min tty_min_state;
- dev_console dev_state;
-};
-#endif
-
-char *__stdcall shared_name (const char *, int);
-void *__stdcall open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locations);
diff --git a/winsup/cygwin/shm.cc b/winsup/cygwin/shm.cc
deleted file mode 100644
index 94a86e2a8..000000000
--- a/winsup/cygwin/shm.cc
+++ /dev/null
@@ -1,693 +0,0 @@
-/* shm.cc: Single unix specification IPC interface for Cygwin.
-
- Copyright 2002 Red Hat, Inc.
-
- Written by Conrad Scott <conrad.scott@dsl.pipex.com>.
- Based on code by Robert Collins <robert.collins@hotmail.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 <sys/types.h>
-
-#include <assert.h>
-#include <errno.h>
-#include <stdio.h>
-#include <unistd.h>
-
-#include "cygerrno.h"
-#include "safe_memory.h"
-#include "sigproc.h"
-
-#include "cygserver_ipc.h"
-#include "cygserver_shm.h"
-
-/*---------------------------------------------------------------------------*
- * class client_shmmgr
- *
- * A singleton class.
- *---------------------------------------------------------------------------*/
-
-#define shmmgr (client_shmmgr::instance ())
-
-class client_shmmgr
-{
-private:
- class segment_t
- {
- public:
- const int shmid;
- const void *const shmaddr;
- const int shmflg;
- HANDLE hFileMap; // Updated by fixup_shms_after_fork ().
-
- segment_t *next;
-
- segment_t (const int shmid, const void *const shmaddr, const int shmflg,
- const HANDLE hFileMap)
- : shmid (shmid), shmaddr (shmaddr), shmflg (shmflg), hFileMap (hFileMap),
- next (NULL)
- {}
- };
-
-public:
- static client_shmmgr & instance ();
-
- void *shmat (int shmid, const void *, int shmflg);
- int shmctl (int shmid, int cmd, struct shmid_ds *);
- int shmdt (const void *);
- int shmget (key_t, size_t, int shmflg);
-
- int fixup_shms_after_fork ();
-
-private:
- static NO_COPY client_shmmgr *_instance;
-
- CRITICAL_SECTION _segments_lock;
- static segment_t *_segments_head; // List of attached segs by shmaddr.
-
- static long _shmat_cnt; // No. of attached segs; for info. only.
-
- client_shmmgr ();
- ~client_shmmgr ();
-
- // Undefined (as this class is a singleton):
- client_shmmgr (const client_shmmgr &);
- client_shmmgr & operator= (const client_shmmgr &);
-
- segment_t *find (const void *, segment_t **previous = NULL);
-
- void *attach (int shmid, const void *, int shmflg, HANDLE & hFileMap);
-
- segment_t *new_segment (int shmid, const void *, int shmflg, HANDLE);
-};
-
-/* static */ NO_COPY client_shmmgr *client_shmmgr::_instance;
-
-/* The following two variables must be inherited by child processes
- * since they are used by fixup_shms_after_fork () to re-attach to the
- * parent's shm segments.
- */
-/* static */ client_shmmgr::segment_t *client_shmmgr::_segments_head;
-/* static */ long client_shmmgr::_shmat_cnt;
-
-/*---------------------------------------------------------------------------*
- * client_shmmgr::instance ()
- *---------------------------------------------------------------------------*/
-
-client_shmmgr &
-client_shmmgr::instance ()
-{
- if (!_instance)
- _instance = safe_new0 (client_shmmgr);
-
- assert (_instance);
-
- return *_instance;
-}
-
-/*---------------------------------------------------------------------------*
- * client_shmmgr::shmat ()
- *---------------------------------------------------------------------------*/
-
-void *
-client_shmmgr::shmat (const int shmid,
- const void *const shmaddr,
- const int shmflg)
-{
- syscall_printf ("shmat (shmid = %d, shmaddr = %p, shmflg = 0%o)",
- shmid, shmaddr, shmflg);
-
- EnterCriticalSection (&_segments_lock);
-
- HANDLE hFileMap = NULL;
-
- void *const ptr = attach (shmid, shmaddr, shmflg, hFileMap);
-
- if (ptr)
- new_segment (shmid, ptr, shmflg, hFileMap);
-
- LeaveCriticalSection (&_segments_lock);
-
- if (ptr)
- syscall_printf ("%p = shmat (shmid = %d, shmaddr = %p, shmflg = 0%o)",
- ptr, shmid, shmaddr, shmflg);
- // else
- // See the syscall_printf in client_shmmgr::attach ().
-
- return (ptr ? ptr : (void *) -1);
-}
-
-/*---------------------------------------------------------------------------*
- * client_shmmgr::shmctl ()
- *---------------------------------------------------------------------------*/
-
-int
-client_shmmgr::shmctl (const int shmid,
- const int cmd,
- struct shmid_ds *const buf)
-{
- syscall_printf ("shmctl (shmid = %d, cmd = 0x%x, buf = %p)",
- shmid, cmd, buf);
-
- // Check parameters and set up in parameters as required.
-
- const struct shmid_ds *in_buf = NULL;
-
- switch (cmd)
- {
- case IPC_SET:
- if (__check_invalid_read_ptr_errno (buf, sizeof (struct shmid_ds)))
- {
- syscall_printf (("-1 [EFAULT] = "
- "shmctl (shmid = %d, cmd = 0x%x, buf = %p)"),
- shmid, cmd, buf);
- set_errno (EFAULT);
- return -1;
- }
- in_buf = buf;
- break;
-
- case IPC_STAT:
- case SHM_STAT:
- if (__check_null_invalid_struct_errno (buf, sizeof (struct shmid_ds)))
- {
- syscall_printf (("-1 [EFAULT] = "
- "shmctl (shmid = %d, cmd = 0x%x, buf = %p)"),
- shmid, cmd, buf);
- set_errno (EFAULT);
- return -1;
- }
- break;
-
- case IPC_INFO:
- if (__check_null_invalid_struct_errno (buf, sizeof (struct shminfo)))
- {
- syscall_printf (("-1 [EFAULT] = "
- "shmctl (shmid = %d, cmd = 0x%x, buf = %p)"),
- shmid, cmd, buf);
- set_errno (EFAULT);
- return -1;
- }
- break;
-
- case SHM_INFO:
- if (__check_null_invalid_struct_errno (buf, sizeof (struct shm_info)))
- {
- syscall_printf (("-1 [EFAULT] = "
- "shmctl (shmid = %d, cmd = 0x%x, buf = %p)"),
- shmid, cmd, buf);
- set_errno (EFAULT);
- return -1;
- }
- break;
- }
-
- // Create and issue the command.
-
- client_request_shm request (shmid, cmd, in_buf);
-
- if (request.make_request () == -1 || request.error_code ())
- {
- syscall_printf (("-1 [%d] = "
- "shmctl (shmid = %d, cmd = 0x%x, buf = %p)"),
- request.error_code (), shmid, cmd, buf);
- set_errno (request.error_code ());
- return -1;
- }
-
- // Some commands require special processing for their out parameters.
-
- int result = 0;
-
- switch (cmd)
- {
- case IPC_STAT:
- *buf = request.ds ();
- break;
-
- case IPC_INFO:
- *(struct shminfo *) buf = request.shminfo ();
- break;
-
- case SHM_STAT: // ipcs(8) i'face.
- result = request.shmid ();
- *buf = request.ds ();
- break;
-
- case SHM_INFO: // ipcs(8) i'face.
- result = request.shmid ();
- *(struct shm_info *) buf = request.shm_info ();
- break;
- }
-
- syscall_printf ("%d = shmctl (shmid = %d, cmd = 0x%x, buf = %p)",
- result, shmid, cmd, buf);
-
- return result;
-}
-
-/*---------------------------------------------------------------------------*
- * client_shmmgr::shmdt ()
- *
- * According to Posix, the only error condition for this system call
- * is EINVAL if shmaddr is not the address of the start of an attached
- * shared memory segment. Given that, all other errors just generate
- * tracing noise.
- *---------------------------------------------------------------------------*/
-
-int
-client_shmmgr::shmdt (const void *const shmaddr)
-{
- syscall_printf ("shmdt (shmaddr = %p)", shmaddr);
-
- EnterCriticalSection (&_segments_lock);
-
- segment_t *previous = NULL;
-
- segment_t *const segptr = find (shmaddr, &previous);
-
- if (!segptr)
- {
- LeaveCriticalSection (&_segments_lock);
- syscall_printf ("-1 [EINVAL] = shmdt (shmaddr = %p)", shmaddr);
- set_errno (EINVAL);
- return -1;
- }
-
- assert (previous ? previous->next == segptr : _segments_head == segptr);
-
- if (previous)
- previous->next = segptr->next;
- else
- _segments_head = segptr->next;
-
- LeaveCriticalSection (&_segments_lock);
-
- const long cnt = InterlockedDecrement (&_shmat_cnt);
- assert (cnt >= 0);
-
- if (!UnmapViewOfFile ((void *) shmaddr))
- syscall_printf (("failed to unmap view "
- "[shmid = %d, handle = %p, shmaddr = %p]:"
- "%E"),
- segptr->shmid, segptr->hFileMap, shmaddr);
-
- assert (segptr->hFileMap);
-
- if (!CloseHandle (segptr->hFileMap))
- syscall_printf (("failed to close file map handle "
- "[shmid = %d, handle = %p]: %E"),
- segptr->shmid, segptr->hFileMap);
-
- client_request_shm request (segptr->shmid);
-
- if (request.make_request () == -1 || request.error_code ())
- syscall_printf ("shmdt request failed [shmid = %d, handle = %p]: %s",
- segptr->shmid, segptr->hFileMap,
- strerror (request.error_code ()));
-
- safe_delete (segptr);
-
- syscall_printf ("0 = shmdt (shmaddr = %p)", shmaddr);
-
- return 0;
-}
-
-/*---------------------------------------------------------------------------*
- * client_shmmgr::shmget ()
- *---------------------------------------------------------------------------*/
-
-int
-client_shmmgr::shmget (const key_t key, const size_t size, const int shmflg)
-{
- syscall_printf ("shmget (key = 0x%016X, size = %u, shmflg = 0%o)",
- key, size, shmflg);
-
- client_request_shm request (key, size, shmflg);
-
- if (request.make_request () == -1 || request.error_code ())
- {
- syscall_printf (("-1 [%d] = "
- "shmget (key = 0x%016X, size = %u, shmflg = 0%o)"),
- request.error_code (),
- key, size, shmflg);
- set_errno (request.error_code ());
- return -1;
- }
-
- syscall_printf (("%d = shmget (key = 0x%016X, size = %u, shmflg = 0%o)"),
- request.shmid (),
- key, size, shmflg);
-
- return request.shmid ();
-}
-
-/*---------------------------------------------------------------------------*
- * client_shmmgr::fixup_shms_after_fork ()
- *
- * The hFileMap handles are non-inheritable: so they have to be
- * re-acquired from cygserver.
- *
- * Nb. This routine need not be thread-safe as it is only called at startup.
- *---------------------------------------------------------------------------*/
-
-int
-client_shmmgr::fixup_shms_after_fork ()
-{
- debug_printf ("re-attaching to shm segments: %d attached", _shmat_cnt);
-
- {
- int length = 0;
- for (segment_t *segptr = _segments_head; segptr; segptr = segptr->next)
- length += 1;
-
- if (_shmat_cnt != length)
- {
- system_printf (("state inconsistent: "
- "_shmat_cnt = %d, length of segments list = %d"),
- _shmat_cnt, length);
- return 1;
- }
- }
-
- for (segment_t *segptr = _segments_head; segptr; segptr = segptr->next)
- if (!attach (segptr->shmid,
- segptr->shmaddr,
- segptr->shmflg & ~SHM_RND,
- segptr->hFileMap))
- {
- system_printf ("fatal error re-attaching to shm segment %d",
- segptr->shmid);
- return 1;
- }
-
- if (_shmat_cnt)
- debug_printf ("re-attached all %d shm segments", _shmat_cnt);
-
- return 0;
-}
-
-/*---------------------------------------------------------------------------*
- * client_shmmgr::client_shmmgr ()
- *---------------------------------------------------------------------------*/
-
-client_shmmgr::client_shmmgr ()
-{
- InitializeCriticalSection (&_segments_lock);
-}
-
-/*---------------------------------------------------------------------------*
- * client_shmmgr::~client_shmmgr ()
- *---------------------------------------------------------------------------*/
-
-client_shmmgr::~client_shmmgr ()
-{
- DeleteCriticalSection (&_segments_lock);
-}
-
-/*---------------------------------------------------------------------------*
- * client_shmmgr::find ()
- *---------------------------------------------------------------------------*/
-
-client_shmmgr::segment_t *
-client_shmmgr::find (const void *const shmaddr, segment_t **previous)
-{
- if (previous)
- *previous = NULL;
-
- for (segment_t *segptr = _segments_head; segptr; segptr = segptr->next)
- if (segptr->shmaddr == shmaddr)
- return segptr;
- else if (segptr->shmaddr > shmaddr) // The list is sorted by shmaddr.
- return NULL;
- else if (previous)
- *previous = segptr;
-
- return NULL;
-}
-
-/*---------------------------------------------------------------------------*
- * client_shmmgr::attach ()
- *
- * The body of shmat (), also used by fixup_shms_after_fork ().
- *---------------------------------------------------------------------------*/
-
-void *
-client_shmmgr::attach (const int shmid,
- const void *shmaddr,
- const int shmflg,
- HANDLE & hFileMap)
-{
- client_request_shm request (shmid, shmflg);
-
- if (request.make_request () == -1 || request.error_code ())
- {
- syscall_printf (("-1 [%d] = "
- "shmat (shmid = %d, shmaddr = %p, shmflg = 0%o)"),
- request.error_code (), shmid, shmaddr, shmflg);
- set_errno (request.error_code ());
- return NULL;
- }
-
- int result = 0;
-
- const DWORD access = (shmflg & SHM_RDONLY) ? FILE_MAP_READ : FILE_MAP_WRITE;
-
- if (shmaddr && (shmflg & SHM_RND))
- shmaddr = (char *) shmaddr - ((ssize_t) shmaddr % SHMLBA);
-
- void *const ptr =
- MapViewOfFileEx (request.hFileMap (), access, 0, 0, 0, (void *) shmaddr);
-
- if (!ptr)
- {
- syscall_printf (("failed to map view "
- "[shmid = %d, handle = %p, shmaddr = %p]: %E"),
- shmid, request.hFileMap (), shmaddr);
- result = EINVAL; // FIXME
- }
- else if (shmaddr && ptr != shmaddr)
- {
- syscall_printf (("failed to map view at requested address "
- "[shmid = %d, handle = %p]: "
- "requested address = %p, mapped address = %p"),
- shmid, request.hFileMap (),
- shmaddr, ptr);
- result = EINVAL; // FIXME
- }
-
- if (result != 0)
- {
- if (!CloseHandle (request.hFileMap ()))
- syscall_printf (("failed to close file map handle "
- "[shmid = %d, handle = %p]: %E"),
- shmid, request.hFileMap ());
-
- client_request_shm dt_req (shmid);
-
- if (dt_req.make_request () == -1 || dt_req.error_code ())
- syscall_printf ("shmdt request failed [shmid = %d, handle = %p]: %s",
- shmid, request.hFileMap (),
- strerror (dt_req.error_code ()));
-
- set_errno (result);
- return NULL;
- }
-
- hFileMap = request.hFileMap ();
- return ptr;
-}
-
-/*---------------------------------------------------------------------------*
- * client_shmmgr::new_segment ()
- *
- * Allocate a new segment for the given shmid, file map and address
- * and insert into the segment map.
- *---------------------------------------------------------------------------*/
-
-client_shmmgr::segment_t *
-client_shmmgr::new_segment (const int shmid,
- const void *const shmaddr,
- const int shmflg,
- const HANDLE hFileMap)
-{
- assert (ipc_ext2int_subsys (shmid) == IPC_SHMOP);
- assert (hFileMap);
- assert (shmaddr);
-
- segment_t *previous = NULL; // Insert pointer.
-
- const segment_t *const tmp = find (shmaddr, &previous);
-
- assert (!tmp);
- assert (previous \
- ? (!previous->next || previous->next->shmaddr > shmaddr) \
- : (!_segments_head || _segments_head->shmaddr > shmaddr));
-
- segment_t *const segptr =
- safe_new (segment_t, shmid, shmaddr, shmflg, hFileMap);
-
- assert (segptr);
-
- if (previous)
- {
- segptr->next = previous->next;
- previous->next = segptr;
- }
- else
- {
- segptr->next = _segments_head;
- _segments_head = segptr;
- }
-
- const long cnt = InterlockedIncrement (&_shmat_cnt);
- assert (cnt > 0);
-
- return segptr;
-}
-
-/*---------------------------------------------------------------------------*
- * shmat ()
- *---------------------------------------------------------------------------*/
-
-extern "C" void *
-shmat (const int shmid, const void *const shmaddr, const int shmflg)
-{
- sigframe thisframe (mainthread);
- return shmmgr.shmat (shmid, shmaddr, shmflg);
-}
-
-/*---------------------------------------------------------------------------*
- * shmctl ()
- *---------------------------------------------------------------------------*/
-
-extern "C" int
-shmctl (const int shmid, const int cmd, struct shmid_ds *const buf)
-{
- sigframe thisframe (mainthread);
- return shmmgr.shmctl (shmid, cmd, buf);
-}
-
-/*---------------------------------------------------------------------------*
- * shmdt ()
- *---------------------------------------------------------------------------*/
-
-extern "C" int
-shmdt (const void *const shmaddr)
-{
- sigframe thisframe (mainthread);
- return shmmgr.shmdt (shmaddr);
-}
-
-/*---------------------------------------------------------------------------*
- * shmget ()
- *---------------------------------------------------------------------------*/
-
-extern "C" int
-shmget (const key_t key, const size_t size, const int shmflg)
-{
- sigframe thisframe (mainthread);
- return shmmgr.shmget (key, size, shmflg);
-}
-
-/*---------------------------------------------------------------------------*
- * fixup_shms_after_fork ()
- *---------------------------------------------------------------------------*/
-
-int __stdcall
-fixup_shms_after_fork ()
-{
- return shmmgr.fixup_shms_after_fork ();
-}
-
-/*---------------------------------------------------------------------------*
- * client_request_shm::client_request_shm ()
- *---------------------------------------------------------------------------*/
-
-client_request_shm::client_request_shm (const int shmid, const int shmflg)
- : client_request (CYGSERVER_REQUEST_SHM, &_parameters, sizeof (_parameters))
-{
- _parameters.in.shmop = SHMOP_shmat;
-
- _parameters.in.shmid = shmid;
- _parameters.in.shmflg = shmflg;
-
- _parameters.in.cygpid = getpid ();
- _parameters.in.winpid = GetCurrentProcessId ();
- _parameters.in.uid = geteuid ();
- _parameters.in.gid = getegid ();
-
- msglen (sizeof (_parameters.in));
-}
-
-/*---------------------------------------------------------------------------*
- * client_request_shm::client_request_shm ()
- *---------------------------------------------------------------------------*/
-
-client_request_shm::client_request_shm (const int shmid,
- const int cmd,
- const struct shmid_ds *const buf)
- : client_request (CYGSERVER_REQUEST_SHM, &_parameters, sizeof (_parameters))
-{
- _parameters.in.shmop = SHMOP_shmctl;
-
- _parameters.in.shmid = shmid;
- _parameters.in.cmd = cmd;
- if (buf)
- _parameters.in.ds = *buf;
-
- _parameters.in.cygpid = getpid ();
- _parameters.in.winpid = GetCurrentProcessId ();
- _parameters.in.uid = geteuid ();
- _parameters.in.gid = getegid ();
-
- msglen (sizeof (_parameters.in));
-}
-
-/*---------------------------------------------------------------------------*
- * client_request_shm::client_request_shm ()
- *---------------------------------------------------------------------------*/
-
-client_request_shm::client_request_shm (const int shmid)
- : client_request (CYGSERVER_REQUEST_SHM, &_parameters, sizeof (_parameters))
-{
- _parameters.in.shmop = SHMOP_shmdt;
-
- _parameters.in.shmid = shmid;
-
- _parameters.in.cygpid = getpid ();
- _parameters.in.winpid = GetCurrentProcessId ();
- _parameters.in.uid = geteuid ();
- _parameters.in.gid = getegid ();
-
- msglen (sizeof (_parameters.in));
-}
-
-/*---------------------------------------------------------------------------*
- * client_request_shm::client_request_shm ()
- *---------------------------------------------------------------------------*/
-
-client_request_shm::client_request_shm (const key_t key,
- const size_t size,
- const int shmflg)
- : client_request (CYGSERVER_REQUEST_SHM, &_parameters, sizeof (_parameters))
-{
- _parameters.in.shmop = SHMOP_shmget;
-
- _parameters.in.key = key;
- _parameters.in.size = size;
- _parameters.in.shmflg = shmflg;
-
- _parameters.in.cygpid = getpid ();
- _parameters.in.winpid = GetCurrentProcessId ();
- _parameters.in.uid = geteuid ();
- _parameters.in.gid = getegid ();
-
- msglen (sizeof (_parameters.in));
-}
diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc
deleted file mode 100644
index a23487fc3..000000000
--- a/winsup/cygwin/signal.cc
+++ /dev/null
@@ -1,430 +0,0 @@
-/* signal.cc
-
- Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
-
- Written by Steve Chamberlain of Cygnus Support, sac@cygnus.com
- Significant changes by Sergey 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 <errno.h>
-#include <stdlib.h>
-#include "cygerrno.h"
-#include <sys/cygwin.h>
-#include "sigproc.h"
-#include "pinfo.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 (0);
- _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 = myself->getsig (sig).sa_handler;
- myself->getsig (sig).sa_handler = func;
- myself->getsig (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. */
- myself->getsig (sig).sa_flags |= SA_RESTART;
- set_sigcatchers (prev, func);
-
- syscall_printf ("%p = signal (%d, %p)", prev, sig, func);
- return prev;
-}
-
-extern "C" unsigned int
-sleep (unsigned int seconds)
-{
- int rc;
- sig_dispatch_pending (0);
- sigframe thisframe (mainthread);
- DWORD ms, start_time, end_time;
-
- ms = seconds * 1000;
- start_time = GetTickCount ();
- end_time = start_time + (seconds * 1000);
- syscall_printf ("sleep (%d)", seconds);
-
- rc = WaitForSingleObject (signal_arrived, ms);
- DWORD now = GetTickCount ();
- if (rc == WAIT_TIMEOUT || now >= end_time)
- ms = 0;
- else
- ms = end_time - now;
- if (WaitForSingleObject (signal_arrived, 0) == WAIT_OBJECT_0)
- (void) thisframe.call_signal_handler ();
-
- DWORD res = (ms + 500) / 1000;
- syscall_printf ("%d = sleep (%d)", res, seconds);
-
- return res;
-}
-
-extern "C" unsigned int
-usleep (unsigned int useconds)
-{
- sig_dispatch_pending (0);
- syscall_printf ("usleep (%d)", useconds);
- WaitForSingleObject (signal_arrived, (useconds + 500) / 1000);
- syscall_printf ("0 = usleep (%d)", useconds);
- return 0;
-}
-
-extern "C" int
-sigprocmask (int sig, const sigset_t *set, sigset_t *oldset)
-{
- sig_dispatch_pending (0);
- /* check that sig is in right range */
- if (sig < 0 || sig >= NSIG)
- {
- set_errno (EINVAL);
- syscall_printf ("SIG_ERR = sigprocmask signal %d out of range", sig);
- return -1;
- }
-
- if (oldset)
- *oldset = myself->getsigmask ();
- if (set)
- {
- sigset_t newmask = myself->getsigmask ();
- switch (sig)
- {
- 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;
- default:
- set_errno (EINVAL);
- return -1;
- }
- (void) set_process_mask (newmask);
- }
- return 0;
-}
-
-static int
-kill_worker (pid_t pid, int sig)
-{
- sig_dispatch_pending (0);
-
- int res = 0;
- pinfo dest (pid);
- BOOL sendSIGCONT;
-
- if (!dest)
- {
- set_errno (ESRCH);
- return -1;
- }
-
- dest->setthread2signal (NULL);
-
- if ((sendSIGCONT = (sig < 0)))
- sig = -sig;
-
-#if 0
- if (dest == myself && !sendSIGCONT)
- dest = myself_nowait_nonmain;
-#endif
- if (sig == 0)
- {
- res = proc_exists (dest) ? 0 : -1;
- if (res < 0)
- set_errno (ESRCH);
- }
- else if ((res = sig_send (dest, sig)))
- {
- sigproc_printf ("%d = sig_send, %E ", res);
- res = -1;
- }
- else if (sendSIGCONT)
- (void) sig_send (dest, SIGCONT);
-
- syscall_printf ("%d = kill_worker (%d, %d)", res, pid, sig);
- return res;
-}
-
-int
-raise (int sig)
-{
- return kill (myself->pid, sig);
-}
-
-int
-kill (pid_t pid, int sig)
-{
- sigframe thisframe (mainthread);
- syscall_printf ("kill (%d, %d)", pid, 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;
- }
-
- /* Silently ignore stop signals from a member of orphaned process group.
- FIXME: Why??? */
- if (ISSTATE (myself, PID_ORPHANED) &&
- (sig == SIGTSTP || sig == SIGTTIN || sig == SIGTTOU))
- sig = 0;
-
- return (pid > 0) ? kill_worker (pid, sig) : kill_pgrp (-pid, sig);
-}
-
-int
-kill_pgrp (pid_t pid, int sig)
-{
- int res = 0;
- int found = 0;
- int killself = 0;
- sigframe thisframe (mainthread);
-
- sigproc_printf ("pid %d, signal %d", pid, sig);
-
- winpids pids;
- for (unsigned i = 0; i < pids.npids; i++)
- {
- _pinfo *p = pids[i];
-
- if (!proc_exists (p))
- 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) ||
- (sig < 0 && NOTSTATE (p, PID_STOPPED)))
- continue;
- sigproc_printf ("killing pid %d, pgrp %d, p->ctty %d, myself->ctty %d",
- p->pid, p->pgid, p->ctty, myself->ctty);
- if (p == myself)
- killself++;
- else if (kill_worker (p->pid, sig))
- res = -1;
- found++;
- }
-
- if (killself && kill_worker (myself->pid, sig))
- res = -1;
-
- if (!found)
- {
- set_errno (ESRCH);
- res = -1;
- }
- syscall_printf ("%d = kill (%d, %d)", res, pid, sig);
- return res;
-}
-
-extern "C" int
-killpg (pid_t pgrp, int sig)
-{
- return kill (-pgrp, sig);
-}
-
-extern "C" void
-abort (void)
-{
- sig_dispatch_pending (0);
- sigframe thisframe (mainthread);
- /* 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 (_reent_clib ()->__cleanup)
- _reent_clib ()->__cleanup (_reent_clib ());
-
- /* Ensure that SIGABRT can be caught regardless of blockage. */
- sigset_t sig_mask;
- sigfillset (&sig_mask);
- sigdelset (&sig_mask, SIGABRT);
- set_process_mask (sig_mask);
-
- raise (SIGABRT);
- (void) thisframe.call_signal_handler (); /* Call any signal handler */
- do_exit (1); /* signal handler didn't exit. Goodbye. */
-}
-
-extern "C" int
-sigaction (int sig, const struct sigaction *newact, struct sigaction *oldact)
-{
- sig_dispatch_pending (0);
- sigproc_printf ("signal %d, newact %p, oldact %p", sig, newact, oldact);
- /* check that sig is in right range */
- if (sig < 0 || sig >= NSIG)
- {
- set_errno (EINVAL);
- syscall_printf ("SIG_ERR = sigaction signal %d out of range", sig);
- return -1;
- }
-
- struct sigaction oa = myself->getsig (sig);
-
- if (newact)
- {
- if (sig == SIGKILL || sig == SIGSTOP)
- {
- set_errno (EINVAL);
- return -1;
- }
- myself->getsig (sig) = *newact;
- if (newact->sa_handler == SIG_IGN)
- sig_clear (sig);
- if (newact->sa_handler == SIG_DFL && sig == SIGCHLD)
- sig_clear (sig);
- set_sigcatchers (oa.sa_handler, newact->sa_handler);
- }
-
- 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
-sigpending (sigset_t *set)
-{
- unsigned bit;
- *set = 0;
- for (int sig = 1; sig < NSIG; sig++)
- if (*myself->getsigtodo (sig) && myself->getsigmask () & (bit = SIGTOMASK (sig)))
- *set |= bit;
- 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;
- (void)sigaction(sig, NULL, &act);
- if (flag)
- act.sa_flags &= ~SA_RESTART;
- else
- act.sa_flags |= SA_RESTART;
- return sigaction(sig, &act, NULL);
-}
-
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
deleted file mode 100644
index b453e8f03..000000000
--- a/winsup/cygwin/sigproc.cc
+++ /dev/null
@@ -1,1310 +0,0 @@
-/* sigproc.cc: inter/intra signal and sub process handler
-
- Copyright 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
-
- Written by Christopher Faylor <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. */
-
-#include "winsup.h"
-#include <stdlib.h>
-#include <time.h>
-#include <sys/wait.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <sys/cygwin.h>
-#include <assert.h>
-#include "cygerrno.h"
-#include "sync.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "child_info_magic.h"
-#define NEED_VFORK
-#include "perthread.h"
-#include "shared_info.h"
-#include "cygthread.h"
-
-/*
- * Convenience defines
- */
-#define WSSC 60000 // Wait for signal completion
-#define WPSP 40000 // Wait for proc_subproc mutex
-#define WSPX 20000 // Wait for wait_sig to terminate
-#define WWSP 20000 // Wait for wait_subproc to terminate
-
-#define TOTSIGS (NSIG + __SIGOFFSET)
-
-#define wake_wait_subproc() SetEvent (events[0])
-
-#define no_signals_available() (!hwait_sig || !sig_loop_wait)
-
-#define NZOMBIES 256
-
-/*
- * Global variables
- */
-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
-char NO_COPY myself_nowait_nonmain_dummy[1] = {'1'};// Flag to sig_send that signal goes to
- // current process but no wait is required
- // if this is not the main thread.
-
-HANDLE NO_COPY signal_arrived; // Event signaled when a signal has
- // resulted in a user-specified
- // function call
-/*
- * Common variables
- */
-
-
-/* How long to wait for message/signals. Normally this is infinite.
- * On termination, however, these are set to zero as a flag to exit.
- */
-
-#define Static static NO_COPY
-
-Static DWORD proc_loop_wait = 1000; // Wait for subprocesses to exit
-Static DWORD sig_loop_wait = INFINITE; // Wait for signals to arrive
-
-Static HANDLE sigcatch_nonmain; // The semaphore signaled when
- // signals are available for
- // processing from non-main thread
-Static HANDLE sigcatch_main; // Signalled when main thread sends a
- // signal
-Static HANDLE sigcatch_nosync; // Signal wait_sig to scan sigtodo
- // but not to bother with any
- // synchronization
-Static HANDLE sigcomplete_main; // Event signaled when a signal has
- // finished processing for the main
- // thread
-Static HANDLE sigcomplete_nonmain; // Semaphore raised for non-main
- // threads when a signal has finished
- // processing
-HANDLE NO_COPY sigCONT; // Used to "STOP" a process
-Static cygthread *hwait_sig; // Handle of wait_sig thread
-Static cygthread *hwait_subproc; // Handle of sig_subproc thread
-
-Static HANDLE wait_sig_inited; // Control synchronization of
- // message queue startup
-
-/* Used by WaitForMultipleObjects. These are handles to child processes.
- */
-Static HANDLE events[PSIZE + 1]; // All my children's handles++
-#define hchildren (events + 1) // Where the children handles begin
-Static char cpchildren[PSIZE * sizeof (pinfo)]; // All my children info
-Static int nchildren; // Number of active children
-Static char czombies[(NZOMBIES + 1) * sizeof (pinfo)]; // All my deceased children info
-Static int nzombies; // Number of deceased children
-
-#define pchildren ((pinfo *) cpchildren)
-#define zombies ((pinfo *) czombies)
-
-Static waitq waitq_head = {0, 0, 0, 0, 0, 0, 0};// Start of queue for wait'ing threads
-Static waitq waitq_main; // Storage for main thread
-
-muto NO_COPY *sync_proc_subproc = NULL; // Control access to subproc stuff
-
-DWORD NO_COPY sigtid = 0; // ID of the signal thread
-
-int NO_COPY pending_signals = 0; // TRUE if signals pending
-
-/* Functions
- */
-static int __stdcall checkstate (waitq *);
-static __inline__ BOOL get_proc_lock (DWORD, DWORD);
-static HANDLE __stdcall getsem (_pinfo *, const char *, int, int);
-static void __stdcall remove_zombie (int);
-static DWORD WINAPI wait_sig (VOID *arg);
-static int __stdcall stopped_or_terminated (waitq *, _pinfo *);
-static DWORD WINAPI wait_subproc (VOID *);
-
-/* Determine if the parent process is alive.
- */
-
-BOOL __stdcall
-my_parent_is_alive ()
-{
- DWORD res;
- if (!myself->ppid_handle)
- {
- debug_printf ("No myself->ppid_handle");
- res = FALSE;
- }
- else
- for (int i = 0; i < 2; i++)
- switch (res = WaitForSingleObject (myself->ppid_handle, 0))
- {
- case WAIT_OBJECT_0:
- debug_printf ("parent dead.");
- res = FALSE;
- goto out;
- case WAIT_TIMEOUT:
- debug_printf ("parent still alive");
- res = TRUE;
- goto out;
- case WAIT_FAILED:
- DWORD werr = GetLastError ();
- if (werr == ERROR_INVALID_HANDLE && i == 0)
- continue;
- system_printf ("WFSO for myself->ppid_handle(%p) failed, error %d",
- myself->ppid_handle, werr);
- res = FALSE;
- goto out;
- }
-out:
- return res;
-}
-
-void __stdcall
-wait_for_sigthread ()
-{
- assert (wait_sig_inited);
- (void) WaitForSingleObject (wait_sig_inited, INFINITE);
- (void) ForceCloseHandle (wait_sig_inited);
- wait_sig_inited = NULL;
-}
-
-/* Get the sync_proc_subproc muto to control access to
- * children, zombie 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)
- return FALSE;
- if (sync_proc_subproc->acquire (WPSP))
- {
- lastwhat = what;
- return TRUE;
- }
- if (!sync_proc_subproc)
- return FALSE;
- system_printf ("Couldn't aquire sync_proc_subproc for(%d,%d), %E, last %d",
- what, val, lastwhat);
- return TRUE;
-}
-
-static BOOL __stdcall
-proc_can_be_signalled (_pinfo *p)
-{
- if (p == myself_nowait || p == myself_nowait_nonmain || p == myself)
- {
- assert (!wait_sig_inited);
- return 1;
- }
-
- return ISSTATE (p, PID_INITIALIZING) ||
- (((p)->process_state & (PID_ACTIVE | PID_IN_USE)) ==
- (PID_ACTIVE | PID_IN_USE));
-}
-
-BOOL __stdcall
-pid_exists (pid_t pid)
-{
- pinfo p (pid);
- return proc_exists (p);
-}
-
-/* Test to determine if a process really exists and is processing signals.
- */
-BOOL __stdcall
-proc_exists (_pinfo *p)
-{
- return p && !(p->process_state & PID_EXITED);
-}
-
-/* Return 1 if this is one of our children, zero otherwise.
- FIXME: This really should be integrated with the rest of the proc_subproc
- testing. Scanning these lists twice is inefficient. */
-int __stdcall
-mychild (int pid)
-{
- for (int i = 0; i < nchildren; i++)
- if (pchildren[i]->pid == pid)
- return 1;
- for (int i = 0; i < nzombies; i++)
- if (zombies[i]->pid == pid)
- return 1;
- return 0;
-}
-
-/* Handle all subprocess requests
- */
-#define vchild (*((pinfo *) val))
-int __stdcall
-proc_subproc (DWORD what, DWORD val)
-{
- int rc = 1;
- int potential_match;
- _pinfo *child;
- int clearing;
- waitq *w;
-
-#define wval ((waitq *) 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. Something is wrong.");
- goto out1;
- }
-
- switch (what)
- {
- /* Add a new subprocess to the children arrays.
- * (usually called from the main thread)
- */
- case PROC_ADDCHILD:
- if (nchildren >= PSIZE - 1)
- {
- rc = 0;
- break;
- }
- pchildren[nchildren] = vchild;
- hchildren[nchildren] = vchild->hProcess;
- if (!DuplicateHandle (hMainProc, vchild->hProcess, hMainProc, &vchild->pid_handle,
- 0, 0, DUPLICATE_SAME_ACCESS))
- system_printf ("Couldn't duplicate child handle for pid %d, %E", vchild->pid);
- ProtectHandle1 (vchild->pid_handle, pid_handle);
-
- if (!DuplicateHandle (hMainProc, hMainProc, vchild->hProcess, &vchild->ppid_handle,
- 0, TRUE, DUPLICATE_SAME_ACCESS))
- system_printf ("Couldn't duplicate my handle<%p> for pid %d, %E", hMainProc, vchild->pid);
- vchild->ppid = myself->pid;
- vchild->uid = myself->uid;
- vchild->gid = myself->gid;
- vchild->pgid = myself->pgid;
- vchild->sid = myself->sid;
- vchild->ctty = myself->ctty;
- vchild->process_state |= PID_INITIALIZING | (myself->process_state & PID_USETTY);
-
- sigproc_printf ("added pid %d to wait list, slot %d, winpid %p, handle %p",
- vchild->pid, nchildren, vchild->dwProcessId,
- vchild->hProcess);
- nchildren++;
-
- wake_wait_subproc ();
- break;
-
- /* A child process had terminated.
- Possibly this is just due to an exec(). Cygwin implements an exec()
- as a "handoff" from one windows process to another. If child->hProcess
- is different from what is recorded in hchildren, then this is an exec().
- Otherwise this is a normal child termination event.
- (called from wait_subproc thread) */
- case PROC_CHILDTERMINATED:
- if (hchildren[val] != pchildren[val]->hProcess)
- {
- sigproc_printf ("pid %d[%d], reparented old hProcess %p, new %p",
- pchildren[val]->pid, val, hchildren[val], pchildren[val]->hProcess);
- HANDLE h = hchildren[val];
- hchildren[val] = pchildren[val]->hProcess; /* Filled out by child */
- sync_proc_subproc->release (); // Release the lock ASAP
- ForceCloseHandle1 (h, childhProc);
- ProtectHandle1 (pchildren[val]->hProcess, childhProc);
- rc = 0;
- goto out; // This was an exec()
- }
-
- sigproc_printf ("pid %d[%d] terminated, handle %p, nchildren %d, nzombies %d",
- pchildren[val]->pid, val, hchildren[val], nchildren, nzombies);
-
- int thiszombie;
- thiszombie = nzombies;
- zombies[nzombies] = pchildren[val]; // Add to zombie array
- zombies[nzombies++]->process_state = PID_ZOMBIE;// Walking dead
-
- sigproc_printf ("zombifying [%d], pid %d, handle %p, nchildren %d",
- val, pchildren[val]->pid, hchildren[val], nchildren);
- if ((int) val < --nchildren)
- {
- hchildren[val] = hchildren[nchildren];
- pchildren[val] = pchildren[nchildren];
- }
-
- /* See if we should care about the this terminated process. If we've
- filled up our table or if we're ignoring SIGCHLD, then we immediately
- remove the process and move on. Otherwise, this process becomes a zombie
- which must be reaped by a wait() call. */
- if (nzombies >= NZOMBIES
- || myself->getsig (SIGCHLD).sa_handler == (void *) SIG_IGN)
- {
- sigproc_printf ("automatically removing zombie %d", thiszombie);
- remove_zombie (thiszombie);
- }
-
- /* Don't scan the wait queue yet. Caller will send SIGCHLD to this process.
- This will cause an eventual scan of waiters. */
- 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 <= 0)
- 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);
- ProtectHandle (wval->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");
- 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");
- }
- break;
- }
-
-out:
- sync_proc_subproc->release (); // Release the lock
-out1:
- sigproc_printf ("returning %d", rc);
- return rc;
-}
-
-/* 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 zombies.
- */
-void __stdcall
-proc_terminate (void)
-{
- sigproc_printf ("nchildren %d, nzombies %d", nchildren, nzombies);
- /* Signal processing is assumed to be blocked in this routine. */
- if (hwait_subproc)
- {
- proc_loop_wait = 0; // Tell wait_subproc thread to exit
- sync_proc_subproc->acquire (WPSP);
- wake_wait_subproc (); // Wake wait_subproc loop
- hwait_subproc = NULL;
-
- (void) proc_subproc (PROC_CLEARWAIT, 1);
-
- /* Clean out zombie processes from the pid list. */
- int i;
- for (i = 0; i < nzombies; i++)
- {
- if (zombies[i]->hProcess)
- {
- ForceCloseHandle1 (zombies[i]->hProcess, childhProc);
- ForceCloseHandle1 (zombies[i]->pid_handle, pid_handle);
- }
- zombies[i]->ppid = 1;
- zombies[i]->process_state = PID_EXITED; /* CGF FIXME - still needed? */
- zombies[i].release (); // FIXME: this breaks older gccs for some reason
- }
-
- /* Disassociate my subprocesses */
- for (i = 0; i < nchildren; i++)
- {
- if (!pchildren[i]->hProcess)
- sigproc_printf ("%d(%d) hProcess cleared already?", pchildren[i]->pid,
- pchildren[i]->dwProcessId);
- else
- {
- ForceCloseHandle1 (pchildren[i]->hProcess, childhProc);
- sigproc_printf ("%d(%d) closed child handle", pchildren[i]->pid,
- pchildren[i]->dwProcessId);
- pchildren[i]->ppid = 1;
- if (pchildren[i]->pgid == myself->pid)
- pchildren[i]->process_state |= PID_ORPHANED;
- }
- pchildren[i].release ();
- }
- nchildren = nzombies = 0;
- /* Just zero sync_proc_subproc as the delete below seems to cause
- problems for older gccs. */
- sync_proc_subproc = NULL;
- }
- sigproc_printf ("leaving");
-}
-
-/* Clear pending signal from the sigtodo array
- */
-void __stdcall
-sig_clear (int sig)
-{
- (void) InterlockedExchange (myself->getsigtodo (sig), 0L);
- return;
-}
-
-/* Force the wait_sig thread to wake up and scan the sigtodo array.
- */
-extern "C" int __stdcall
-sig_dispatch_pending (int justwake)
-{
- if (!hwait_sig)
- return 0;
- DWORD tid = GetCurrentThreadId ();
-
- sigframe thisframe (mainthread);
-
- if (tid == sigtid && !justwake)
- justwake = 1;
-
- int was_pending = pending_signals;
-#ifdef DEBUGGING
- sigproc_printf ("pending_signals %d", was_pending);
-#endif
- if (!was_pending && !justwake)
-#ifdef DEBUGGING
- sigproc_printf ("no need to wake anything up");
-#else
- ;
-#endif
- else
- {
- if (!justwake)
- (void) sig_send (myself, __SIGFLUSH);
- else if (ReleaseSemaphore (sigcatch_nosync, 1, NULL))
-#ifdef DEBUGGING
- sigproc_printf ("woke up wait_sig");
-#else
- ;
-#endif
- else if (no_signals_available ())
- /*sigproc_printf ("I'm going away now")*/;
- else
- system_printf ("%E releasing sigcatch_nosync(%p)", sigcatch_nosync);
-
- }
- if (was_pending && !justwake)
- thisframe.call_signal_handler ();
-
- return was_pending;
-}
-
-/* Message 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 zombie arrays.
- */
- new_muto (sync_proc_subproc);
-
- /* 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);
-
- hwait_sig = new cygthread (wait_sig, cygself, "sig");
- hwait_sig->zap_h ();
-
- /* Initialize waitq structure for main thread. A waitq structure is
- * allocated for each thread that executes a wait to allow multiple threads
- * to perform waits. Pre-allocate a waitq structure for the main thread.
- */
- waitq *w;
- if ((w = (waitq *)waitq_storage.get ()) == NULL)
- {
- w = &waitq_main;
- waitq_storage.set (w);
- }
- memset (w, 0, sizeof *w); // Just to be safe
-
- myself->getsig (SIGSTOP).sa_flags = SA_RESTART | SA_NODEFER;
- sigproc_printf ("process/signal handling enabled(%x)", myself->process_state);
- return;
-}
-
-/* Called on process termination to terminate signal and process threads.
- */
-void __stdcall
-sigproc_terminate (void)
-{
- hwait_sig = NULL;
-
- if (!sig_loop_wait)
- sigproc_printf ("sigproc_terminate: sigproc handling not active");
- else
- {
- sigproc_printf ("entering");
- sig_loop_wait = 0; // Tell wait_sig to exit when it is
- // finished with anything it is doing
- sig_dispatch_pending (1);
- }
-
- if (GetCurrentThreadId () == sigtid)
- {
- ForceCloseHandle (sigcomplete_main);
- for (int i = 0; i < 20; i++)
- (void) ReleaseSemaphore (sigcomplete_nonmain, 1, NULL);
- // ForceCloseHandle (sigcomplete_nonmain);
- // ForceCloseHandle (sigcatch_main);
- // ForceCloseHandle (sigcatch_nonmain);
- // ForceCloseHandle (sigcatch_nosync);
- }
- proc_terminate (); // Terminate process handling thread
-
- return;
-}
-
-/* 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, int sig, DWORD ebp, bool exception)
-{
- int rc = 1;
- DWORD tid = GetCurrentThreadId ();
- BOOL its_me;
- HANDLE thiscatch = NULL;
- HANDLE thiscomplete = NULL;
- BOOL wait_for_completion;
- sigframe thisframe;
-
- if (p == myself_nowait_nonmain)
- p = (tid == mainthread.id) ? (_pinfo *) myself : myself_nowait;
- if (!(its_me = (p == NULL || p == myself || p == myself_nowait)))
- wait_for_completion = FALSE;
- else
- {
- if (no_signals_available ())
- goto out; // Either exiting or not yet initializing
- assert (!wait_sig_inited);
- wait_for_completion = p != myself_nowait;
- p = myself;
- }
-
- /* 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, sig);
- set_errno (ESRCH);
- goto out;
- }
-
- sigproc_printf ("pid %d, signal %d, its_me %d", p->pid, sig, its_me);
-
- if (its_me)
- {
- if (!wait_for_completion)
- thiscatch = sigcatch_nosync;
- else if (tid != mainthread.id)
- {
- thiscatch = sigcatch_nonmain;
- thiscomplete = sigcomplete_nonmain;
- }
- else
- {
- thiscatch = sigcatch_main;
- thiscomplete = sigcomplete_main;
- thisframe.set (mainthread, ebp, exception);
- }
- }
- else if (!(thiscatch = getsem (p, "sigcatch", 0, 0)))
- goto out; // Couldn't get the semaphore. getsem issued
- // an error, if appropriate.
-
-#if WHEN_MULTI_THREAD_SIGNALS_WORK
- signal_dispatch *sd;
- sd = signal_dispatch_storage.get ();
- if (sd == NULL)
- sd = signal_dispatch_storage.create ();
-#endif
-
- /* Increment the sigtodo array to signify which signal to assert.
- */
- (void) InterlockedIncrement (p->getsigtodo (sig));
-
- /* Notify the process that a signal has arrived.
- */
- SetLastError (0);
-
-#if 0
- int prio;
- prio = GetThreadPriority (GetCurrentThread ());
- (void) SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
-#endif
-
- if (!ReleaseSemaphore (thiscatch, 1, NULL) && (int) GetLastError () > 0)
- {
- /* Couldn't signal the semaphore. This probably means that the
- * process is exiting.
- */
- if (!its_me)
- ForceCloseHandle (thiscatch);
- else
- {
- if (no_signals_available ())
- sigproc_printf ("I'm going away now");
- else if ((int) GetLastError () == -1)
- rc = WaitForSingleObject (thiscomplete, 500);
- else
- system_printf ("error sending signal %d to pid %d, semaphore %p, %E",
- sig, p->pid, thiscatch);
- }
- 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)
- {
- rc = WAIT_OBJECT_0;
- sigproc_printf ("Not waiting for sigcomplete. its_me %d signal %d", its_me, sig);
- if (!its_me)
- ForceCloseHandle (thiscatch);
- }
- else
- {
- sigproc_printf ("Waiting for thiscomplete %p", thiscomplete);
-
- SetLastError (0);
- rc = WaitForSingleObject (thiscomplete, WSSC);
- /* Check for strangeness due to this thread being redirected by the
- signal handler. Sometimes a WAIT_TIMEOUT will occur when the
- thread hasn't really timed out. So, check again.
- FIXME: This isn't foolproof. */
- if (rc != WAIT_OBJECT_0 &&
- WaitForSingleObject (thiscomplete, 0) == WAIT_OBJECT_0)
- rc = WAIT_OBJECT_0;
- }
-
-#if 0
- SetThreadPriority (GetCurrentThread (), prio);
-#endif
-
- if (rc == WAIT_OBJECT_0)
- rc = 0; // Successful exit
- else
- {
- /* It's an error unless sig_loop_wait == 0 (the process is exiting). */
- if (!no_signals_available ())
- system_printf ("wait for sig_complete event failed, signal %d, rc %d, %E",
- sig, rc);
- set_errno (ENOSYS);
- rc = -1;
- }
-
-out:
- sigproc_printf ("returning %d from sending signal %d", rc, sig);
- return rc;
-}
-
-/* Set pending signal from the sigtodo array
- */
-void __stdcall
-sig_set_pending (int sig)
-{
- (void) InterlockedIncrement (myself->getsigtodo (sig));
- return;
-}
-
-/* Initialize the wait_subproc thread.
- * Called from fork() or spawn() to initialize the handling of subprocesses.
- */
-void __stdcall
-subproc_init (void)
-{
- if (hwait_subproc)
- return;
-
- /* A "wakeup" handle which can be toggled to make wait_subproc reexamine
- * the hchildren array.
- */
- events[0] = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
- hwait_subproc = new cygthread (wait_subproc, NULL, "proc");
- hwait_subproc->zap_h ();
- ProtectHandle (events[0]);
- sigproc_printf ("started wait_subproc thread");
-}
-
-/* Initialize some of the memory block passed to child processes
- by fork/spawn/exec. */
-
-void __stdcall
-init_child_info (DWORD chtype, child_info *ch, pid_t pid, HANDLE subproc_ready)
-{
- memset (ch, 0, sizeof *ch);
- ch->cb = chtype == PROC_FORK ? sizeof (child_info_fork) : sizeof (child_info);
- ch->intro = PROC_MAGIC_GENERIC;
- ch->magic = CHILD_INFO_MAGIC;
- ch->type = chtype;
- ch->cygpid = pid;
- ch->subproc_ready = subproc_ready;
- ch->pppid_handle = myself->ppid_handle;
- ch->fhandler_union_cb = sizeof (fhandler_union);
- ch->mount_h = cygwin_mount_h;
-}
-
-/* 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 ("nchildren %d, nzombies %d", nchildren, nzombies);
-
- /* Check already dead processes first to see if they match the criteria
- * given in w->next.
- */
- for (int i = 0; i < nzombies; i++)
- switch (stopped_or_terminated (parent_w, zombies[i]))
- {
- case -1:
- potential_match = -1;
- break;
- case 1:
- remove_zombie (i);
- potential_match = 1;
- goto out;
- }
-
- sigproc_printf ("checking alive children");
-
- /* No dead terminated children matched. Check for stopped children. */
- for (int i = 0; i < nchildren; i++)
- switch (stopped_or_terminated (parent_w, pchildren[i]))
- {
- case -1:
- potential_match = -1;
- break;
- case 1:
- potential_match = 1;
- goto out;
- }
-
-out:
- sigproc_printf ("returning %d", potential_match);
- return potential_match;
-}
-
-/* Get or create a process specific semaphore used in message passing.
- */
-static HANDLE __stdcall
-getsem (_pinfo *p, const char *str, int init, int max)
-{
- HANDLE h;
-
- if (p != NULL)
- {
- if (!proc_can_be_signalled (p))
- {
- set_errno (ESRCH);
- return NULL;
- }
- int wait = 1000;
- /* Wait for new process to generate its semaphores. */
- sigproc_printf ("pid %d, ppid %d, wait %d, initializing %x", p->pid, p->ppid, wait,
- ISSTATE (p, PID_INITIALIZING));
- for (int i = 0; ISSTATE (p, PID_INITIALIZING) && i < wait; i++)
- low_priority_sleep (1);
- }
-
- SetLastError (0);
- if (p == NULL)
- {
- char sa_buf[1024];
-
- DWORD winpid = GetCurrentProcessId ();
- h = CreateSemaphore (sec_user_nih (sa_buf), init, max,
- str = shared_name (str, winpid));
- p = myself;
- if (!h)
- {
- system_printf ("can't create semaphore %s, %E", str);
- __seterrno ();
- }
- }
- else
- {
- h = OpenSemaphore (SEMAPHORE_ALL_ACCESS, FALSE,
- shared_name (str, p->dwProcessId));
-
- if (!h)
- {
- if (GetLastError () == ERROR_FILE_NOT_FOUND && !proc_exists (p))
- set_errno (ESRCH); /* No such process */
- else
- set_errno (EPERM); /* Couldn't access the semaphore --
- different cygwin DLL maybe? */
- }
- }
-
- return h;
-}
-
-/* Remove a zombie from zombies by swapping it with the last child in the list.
- */
-static void __stdcall
-remove_zombie (int ci)
-{
- sigproc_printf ("removing %d, pid %d, nzombies %d", ci, zombies[ci]->pid,
- nzombies);
-
- if (zombies[ci])
- {
- ForceCloseHandle1 (zombies[ci]->hProcess, childhProc);
- ForceCloseHandle1 (zombies[ci]->pid_handle, pid_handle);
- zombies[ci].release ();
- }
-
- if (ci < --nzombies)
- zombies[ci] = zombies[nzombies];
-
- return;
-}
-
-/* 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
- * 1 if stopped or terminated child matches parent_w->next criteria
- * -1 if a non-stopped/terminated child matches parent_w->next criteria
- * 0 if child does not match parent_w->next criteria
- */
-static int __stdcall
-stopped_or_terminated (waitq *parent_w, _pinfo *child)
-{
- int potential_match;
- waitq *w = parent_w->next;
-
- sigproc_printf ("considering pid %d", child->pid);
- if (w->pid == -1)
- potential_match = 1;
- else if (w->pid == 0)
- potential_match = child->pgid == myself->pgid;
- else if (w->pid < 0)
- potential_match = child->pgid == -w->pid;
- else
- potential_match = (w->pid == child->pid);
-
- if (!potential_match)
- return 0;
-
- BOOL terminated;
-
- if ((terminated = child->process_state == PID_ZOMBIE) ||
- ((w->options & WUNTRACED) && child->stopsig))
- {
- 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 /* Should only get here when child has been moved to the zombies array */
- {
- DWORD status;
- if (!GetExitCodeProcess (child->hProcess, &status))
- status = 0xffff;
- if (status & EXIT_SIGNAL)
- w->status = (status >> 8) & 0xff; /* exited due to signal */
- else
- w->status = (status & 0xff) << 8; /* exited via "exit ()" */
-
- 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 1;
- }
-
- return -potential_match;
-}
-
-static void
-talktome ()
-{
- winpids pids;
- for (unsigned i = 0; i < pids.npids; i++)
- if (pids[i]->hello_pid == myself->pid)
- pids[i]->commune_recv ();
-}
-
-/* Process signals by waiting for a semaphore to become signaled.
- * Then scan an in-memory array representing queued signals.
- * Executes in a separate thread.
- *
- * Signals sent from this process are sent a completion signal so
- * that returns from kill/raise do not occur until the signal has
- * has been handled, as per POSIX.
- */
-static DWORD WINAPI
-wait_sig (VOID *self)
-{
- /* Initialization */
- (void) SetThreadPriority (GetCurrentThread (), WAIT_SIG_PRIORITY);
-
- /* sigcatch_nosync - semaphore incremented by sig_dispatch_pending and
- * by foreign processes to force an examination of
- * the sigtodo array.
- * sigcatch_main - ditto for local main thread.
- * sigcatch_nonmain - ditto for local non-main threads.
- *
- * sigcomplete_main - event used to signal main thread on signal
- * completion
- * sigcomplete_nonmain - semaphore signaled for non-main thread on signal
- * completion
- */
- sigcatch_nosync = getsem (NULL, "sigcatch", 0, MAXLONG);
- sigcatch_nonmain = CreateSemaphore (&sec_none_nih, 0, MAXLONG, NULL);
- sigcatch_main = CreateSemaphore (&sec_none_nih, 0, MAXLONG, NULL);
- sigcomplete_nonmain = CreateSemaphore (&sec_none_nih, 0, MAXLONG, NULL);
- sigcomplete_main = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
- sigproc_printf ("sigcatch_nonmain %p, sigcatch_main %p", sigcatch_nonmain, sigcatch_main);
- sigCONT = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
-
- /* 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->dwProcessId = GetCurrentProcessId ();
- myself->process_state |= PID_ACTIVE;
- myself->process_state &= ~PID_INITIALIZING;
-
- ProtectHandle (sigcatch_nosync);
- ProtectHandle (sigcatch_nonmain);
- ProtectHandle (sigcatch_main);
- ProtectHandle (sigcomplete_nonmain);
- ProtectHandle (sigcomplete_main);
-
- /* If we've been execed, then there is still a stub left in the previous
- * windows process waiting to see if it's started a cygwin process or not.
- * Signalling subproc_ready indicates that we are a cygwin process.
- */
- if (child_proc_info && child_proc_info->type == PROC_EXEC)
- {
- debug_printf ("subproc_ready %p", child_proc_info->subproc_ready);
- if (!SetEvent (child_proc_info->subproc_ready))
- system_printf ("SetEvent (subproc_ready) failed, %E");
- ForceCloseHandle1 (child_proc_info->subproc_ready, subproc_ready);
- /* Initialize an "indirect" pid block so that if someone looks up this
- process via its Windows PID it will be redirected to the appropriate
- Cygwin PID shared memory block. */
- static pinfo NO_COPY myself_identity;
- myself_identity.init (cygwin_pid (myself->dwProcessId), PID_EXECED);
- }
-
- SetEvent (wait_sig_inited);
- sigtid = GetCurrentThreadId ();
-
- HANDLE catchem[] = {sigcatch_main, sigcatch_nonmain, sigcatch_nosync};
- sigproc_printf ("Ready. dwProcessid %d", myself->dwProcessId);
- for (;;)
- {
- DWORD rc = WaitForMultipleObjects (3, catchem, FALSE, sig_loop_wait);
- (void) SetThreadPriority (GetCurrentThread (), WAIT_SIG_PRIORITY);
-
- /* sigproc_terminate sets sig_loop_wait to zero to indicate that
- * this thread should terminate.
- */
- if (rc == WAIT_TIMEOUT)
- {
- if (!sig_loop_wait)
- break; // Exiting
- else
- continue;
- }
-
- if (rc == WAIT_FAILED)
- {
- if (sig_loop_wait != 0)
- system_printf ("WFMO failed, %E");
- break;
- }
-
- rc -= WAIT_OBJECT_0;
- sigproc_printf ("awake");
- /* A sigcatch semaphore has been signaled. Scan the sigtodo
- * array looking for any unprocessed signals.
- */
- pending_signals = -1;
- int saw_pending_signals = 0;
- int saw_sigchld = 0;
- for (int sig = -__SIGOFFSET; sig < NSIG; sig++)
- {
- while (InterlockedDecrement (myself->getsigtodo (sig)) >= 0)
- {
- if (sig == SIGCHLD)
- saw_sigchld = 1;
-
- if (sig > 0 && sig != SIGKILL && sig != SIGSTOP &&
- (sigismember (&myself->getsigmask (), sig) ||
- main_vfork->pid ||
- (sig != SIGCONT && ISSTATE (myself, PID_STOPPED))))
- {
- sigproc_printf ("signal %d blocked", sig);
- break;
- }
-
- /* Found a signal to process */
- sigproc_printf ("processing signal %d", sig);
- switch (sig)
- {
- case __SIGFLUSH:
- /* just forcing the loop */
- break;
-
- /* Internal signal to turn on stracing. */
- case __SIGSTRACE:
- strace.hello ();
- break;
-
- case __SIGCOMMUNE:
- talktome ();
- break;
-
- /* A normal UNIX signal */
- default:
- sigproc_printf ("Got signal %d", sig);
- sig_handle (sig, rc != 2);
- /* Need to decrement again to offset increment below since
- we really do want to decrement in this case. */
- InterlockedDecrement (myself->getsigtodo (sig));
- goto nextsig; /* FIXME: shouldn't this allow the loop to continue? */
- }
- }
-
- nextsig:
- /* Decremented too far. */
- if (InterlockedIncrement (myself->getsigtodo (sig)) > 0)
- saw_pending_signals = 1;
- }
-
- if (pending_signals < 0 && !saw_pending_signals)
- pending_signals = 0;
-
- if (saw_sigchld)
- proc_subproc (PROC_CLEARWAIT, 0);
-
- /* Signal completion of signal handling depending on which semaphore
- * woke up the WaitForMultipleObjects above.
- */
- switch (rc)
- {
- case 0:
- SetEvent (sigcomplete_main);
- sigproc_printf ("set main thread completion event");
- break;
- case 1:
- ReleaseSemaphore (sigcomplete_nonmain, 1, NULL);
- break;
- default:
- /* Signal from another process. No need to synchronize. */
- break;
- }
- sigproc_printf ("looping");
- }
-
- sigproc_printf ("done");
- ExitThread (0);
-}
-
-/* Wait for subprocesses to terminate. Executes in a separate thread. */
-static DWORD WINAPI
-wait_subproc (VOID *)
-{
- sigproc_printf ("starting");
- int errloop = 0;
-
- for (;;)
- {
- DWORD rc = WaitForMultipleObjects (nchildren + 1, events, FALSE,
- proc_loop_wait);
- if (rc == WAIT_TIMEOUT)
- if (!proc_loop_wait)
- break; // Exiting
- else
- continue;
-
- if (rc == WAIT_FAILED)
- {
- if (!proc_loop_wait)
- break;
-
- /* It's ok to get an ERROR_INVALID_HANDLE since another thread may have
- closed a handle in the children[] array. So, we try looping a couple
- of times to stabilize. FIXME - this is not foolproof. Probably, this
- thread should be responsible for closing the children. */
- if (!errloop++)
- proc_subproc (PROC_NOTHING, 0); // Just synchronize and continue
- if (errloop < 10)
- continue;
-
- system_printf ("wait failed. nchildren %d, wait %d, %E",
- nchildren, proc_loop_wait);
-
- for (int i = 0; i <= nchildren; i++)
- if ((rc = WaitForSingleObject (events[i], 0)) == WAIT_OBJECT_0 ||
- rc == WAIT_TIMEOUT)
- continue;
- else if (i == 0)
- system_printf ("nchildren %d, event[%d] %p, %E", nchildren, i, events[i]);
- else
- {
- system_printf ("nchildren %d, event[%d] %p, pchildren[%d] %p, events[0] %p, %E",
- nchildren, i, events[i], i - 1, (_pinfo *) pchildren[i - 1], events[0]);
- system_printf ("pid %d, dwProcessId %u, hProcess %p, progname '%s'",
- pchildren[i - 1]->pid, pchildren[i - 1]->dwProcessId,
- pchildren[i - 1]->hProcess, pchildren[i - 1]->progname);
- }
- break;
- }
-
- errloop = 0;
- rc -= WAIT_OBJECT_0;
- if (rc-- != 0)
- {
- rc = proc_subproc (PROC_CHILDTERMINATED, rc);
- if (!proc_loop_wait) // Don't bother if wait_subproc is
- break; // exiting
-
- /* 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. */
- if (rc)
- sig_send (myself_nowait, SIGCHLD);
- }
- sigproc_printf ("looping");
- }
-
- ForceCloseHandle (events[0]);
- events[0] = NULL;
- sigproc_printf ("done");
- ExitThread (0);
-}
-
-extern "C" {
-/* Provide a stack frame when calling WaitFor* functions */
-
-#undef WaitForSingleObject
-
-DWORD __stdcall
-WFSO (HANDLE hHandle, DWORD dwMilliseconds)
-{
- DWORD ret;
- sigframe thisframe (mainthread);
- ret = WaitForSingleObject (hHandle, dwMilliseconds);
- return ret;
-}
-
-#undef WaitForMultipleObjects
-
-DWORD __stdcall
-WFMO (DWORD nCount, CONST HANDLE *lpHandles, BOOL fWaitAll, DWORD dwMilliseconds)
-{
- DWORD ret;
- sigframe thisframe (mainthread);
- ret = WaitForMultipleObjects (nCount, lpHandles, fWaitAll, dwMilliseconds);
- return ret;
-}
-}
diff --git a/winsup/cygwin/sigproc.h b/winsup/cygwin/sigproc.h
deleted file mode 100644
index c8c208e13..000000000
--- a/winsup/cygwin/sigproc.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/* sigproc.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 _SIGPROC_H
-#define _SIGPROC_H
-#include <signal.h>
-
-#define EXIT_SIGNAL 0x010000
-#define EXIT_REPARENTING 0x020000
-#define EXIT_NOCLOSEALL 0x040000
-
-enum procstuff
-{
- PROC_ADDCHILD = 1, // add a new subprocess to list
- PROC_CHILDTERMINATED = 2, // a child died
- PROC_CLEARWAIT = 3, // clear all waits - signal arrived
- PROC_WAIT = 4, // setup for wait() for subproc
- PROC_NOTHING = 5 // nothing, really
-};
-
-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;
-
-struct sigthread
-{
- DWORD id;
- DWORD frame;
- CRITICAL_SECTION lock;
- LONG winapi_lock;
- BOOL exception;
- bool get_winapi_lock (int test = 0);
- void release_winapi_lock ();
- void init (const char *s);
-};
-
-class sigframe
-{
-private:
- sigthread *st;
- inline bool unregister ()
- {
- if (!st)
- return 0;
- EnterCriticalSection (&st->lock);
- st->frame = 0;
- st->exception = 0;
- st->release_winapi_lock ();
- LeaveCriticalSection (&st->lock);
- st = NULL;
- return 1;
- }
-
-public:
- inline void set (sigthread &t, DWORD ebp, bool is_exception = 0)
- {
- DWORD oframe = t.frame;
- st = &t;
- t.frame = ebp;
- t.exception = is_exception;
- if (!oframe)
- t.get_winapi_lock ();
- }
- inline void init (sigthread &t, DWORD ebp = (DWORD) __builtin_frame_address (0))
- {
- if (!t.frame && t.id == GetCurrentThreadId ())
- set (t, ebp);
- else
- st = NULL;
- }
-
- sigframe (): st (NULL) {}
- sigframe (sigthread &t, DWORD ebp = (DWORD) __builtin_frame_address (0)) {init (t, ebp);}
- ~sigframe ()
- {
- unregister ();
- }
-
- int call_signal_handler ();
-};
-
-extern sigthread mainthread;
-extern HANDLE signal_arrived;
-extern HANDLE sigCONT;
-
-BOOL __stdcall my_parent_is_alive ();
-extern "C" int __stdcall sig_dispatch_pending (int force = FALSE);
-extern "C" void __stdcall set_process_mask (sigset_t newmask);
-extern "C" void __stdcall reset_signal_arrived ();
-int __stdcall sig_handle (int, bool);
-void __stdcall sig_clear (int);
-void __stdcall sig_set_pending (int);
-int __stdcall handle_sigsuspend (sigset_t);
-
-int __stdcall proc_subproc (DWORD, DWORD);
-
-class _pinfo;
-void __stdcall proc_terminate ();
-void __stdcall sigproc_init ();
-void __stdcall subproc_init ();
-void __stdcall sigproc_terminate ();
-BOOL __stdcall proc_exists (_pinfo *) __attribute__ ((regparm(1)));
-BOOL __stdcall pid_exists (pid_t) __attribute__ ((regparm(1)));
-int __stdcall sig_send (_pinfo *, int, DWORD ebp = (DWORD) __builtin_frame_address (0),
- bool exception = 0) __attribute__ ((regparm(3)));
-void __stdcall signal_fixup_after_fork ();
-void __stdcall signal_fixup_after_exec (bool);
-void __stdcall wait_for_sigthread ();
-
-extern char myself_nowait_dummy[];
-extern char myself_nowait_nonmain_dummy[];
-
-#define WAIT_SIG_PRIORITY THREAD_PRIORITY_TIME_CRITICAL
-
-#define myself_nowait ((_pinfo *)myself_nowait_dummy)
-#define myself_nowait_nonmain ((_pinfo *)myself_nowait_nonmain_dummy)
-#endif /*_SIGPROC_H*/
diff --git a/winsup/cygwin/smallprint.c b/winsup/cygwin/smallprint.c
deleted file mode 100644
index 247fcf942..000000000
--- a/winsup/cygwin/smallprint.c
+++ /dev/null
@@ -1,243 +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 <stdarg.h>
-#include <stdlib.h>
-#include <ctype.h>
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-
-int __small_sprintf (char *dst, const char *fmt,...);
-int __small_vsprintf (char *dst, const char *fmt, va_list ap);
-
-static char *
-rn (char *dst, int base, int dosign, long long val, int len, int pad)
-{
- /* longest number is ULLONG_MAX, 18446744073709551615, 20 digits */
- unsigned uval;
- 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;
- }
-
- 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[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);
- }
- }
- break;
- case 'E':
- strcpy (dst, "Win32 error ");
- dst = rn (dst + sizeof ("Win32 error"), 10, 0, GetLastError (), len, pad);
- break;
- case 'd':
- dst = rn (dst, 10, addsign, va_arg (ap, int), len, pad);
- break;
- case 'D':
- dst = rn (dst, 10, addsign, va_arg (ap, long long), len, pad);
- break;
- case 'u':
- dst = rn (dst, 10, 0, va_arg (ap, int), len, pad);
- break;
- case 'U':
- dst = rn (dst, 10, 0, va_arg (ap, long long), len, pad);
- break;
- case 'o':
- dst = rn (dst, 8, 0, va_arg (ap, unsigned), len, pad);
- break;
- case 'p':
- *dst++ = '0';
- *dst++ = 'x';
- /* fall through */
- case 'x':
- dst = rn (dst, 16, 0, va_arg (ap, int), len, pad);
- break;
- case 'X':
- dst = rn (dst, 16, 0, va_arg (ap, long long), len, pad);
- break;
- case 'P':
- if (!GetModuleFileName (NULL, tmp, 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 9c055c819..000000000
--- a/winsup/cygwin/spawn.cc
+++ /dev/null
@@ -1,1050 +0,0 @@
-/* spawn.cc
-
- 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 <stdlib.h>
-#include <stdarg.h>
-#include <unistd.h>
-#include <process.h>
-#include <sys/wait.h>
-#include <errno.h>
-#include <limits.h>
-#include <wingdi.h>
-#include <winuser.h>
-#include <ctype.h>
-#include "cygerrno.h"
-#include <sys/cygwin.h>
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "sigproc.h"
-#include "cygheap.h"
-#include "child_info.h"
-#include "shared_info.h"
-#include "pinfo.h"
-#define NEED_VFORK
-#include "perthread.h"
-#include "registry.h"
-#include "environ.h"
-#include "cygthread.h"
-
-#define LINE_BUF_CHUNK (MAX_PATH * 2)
-
-static suffix_info std_suffixes[] =
-{
- suffix_info (".exe", 1), suffix_info ("", 1),
- suffix_info (".com"), suffix_info (".cmd"),
- suffix_info (".bat"), suffix_info (".dll"),
- 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)
-{
- char *ext;
-
- debug_printf ("prog '%s'", prog);
- buf.check (prog, PC_SYM_FOLLOW | PC_FULL, std_suffixes);
-
- if (!buf.exists () || buf.isdir ())
- 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[MAX_PATH];
- const char *posix = (opt & FE_NATIVE) ? NULL : name;
- bool has_slash = strchr (name, '/');
-
- /* 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)) != 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;
-
- /* Return the error condition if this is an absolute path or if there
- is no PATH to search. */
- if (strchr (name, '/') || strchr (name, '\\') ||
- isdrive (name) ||
- !(winpath = getwinenv (mywinenv)) ||
- !(path = winpath->get_native ()) ||
- *path == '\0')
- goto errout;
-
- debug_printf ("%s%s", mywinenv, path);
-
- posix = (opt & FE_NATIVE) ? NULL : tmp;
- posix_path = winpath->get_posix () - 1;
- /* 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)) != NULL)
- {
- 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');
- return retval;
-}
-
-/* Utility for spawn_guts. */
-
-static HANDLE
-handle (int n, int direction)
-{
- fhandler_base *fh = cygheap->fdtab[n];
-
- if (!fh)
- return INVALID_HANDLE_VALUE;
- if (fh->get_close_on_exec ())
- return INVALID_HANDLE_VALUE;
- if (direction == 0)
- return fh->get_handle ();
- return fh->get_output_handle ();
-}
-
-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);
- void add (const char *what) {add (what, strlen (what));}
- void prepend (const char *what, int len);
-};
-
-void
-linebuf::add (const char *what, int len)
-{
- size_t newix;
- if ((newix = ix + len) >= 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 error;
- int argc;
- av (int ac, const char * const *av) : calloced (0), error (false), argc (ac)
- {
- argv = (char **) cmalloc (HEAP_1_ARGV, (argc + 5) * sizeof (char *));
- memcpy (argv, av, (argc + 1) * sizeof (char *));
- }
- ~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;
- else
- error = errno;
- }
- void dup_maybe (int i)
- {
- if (i >= calloced
- && !(argv[i] = cstrdup1 (argv[i])))
- error = errno;
- }
- void dup_all ()
- {
- for (int i = calloced; i < argc; i++)
- if (!(argv[i] = cstrdup1 (argv[i])))
- error = errno;
- }
-};
-
-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[MAX_PATH + 1];
- 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;
- }
- if (!(*argv = cstrdup1 (what)))
- error = errno;
- argc++;
- calloced++;
- return 1;
-}
-
-static int __stdcall
-spawn_guts (const char * prog_arg, const char *const *argv,
- const char *const envp[], int mode)
-{
- BOOL rc;
- pid_t cygpid;
- sigframe thisframe (mainthread);
-
- MALLOC_CHECK;
-
- if (prog_arg == NULL)
- {
- syscall_printf ("prog_arg is NULL");
- set_errno (EINVAL);
- return -1;
- }
-
- syscall_printf ("spawn_guts (%d, %.132s)", mode, prog_arg);
-
- if (argv == NULL)
- {
- syscall_printf ("argv is NULL");
- set_errno (EINVAL);
- return -1;
- }
-
- path_conv real_path;
-
- linebuf one_line;
-
- STARTUPINFO si = {0, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL};
-
- child_info_spawn ciresrv;
- si.lpReserved2 = (LPBYTE) &ciresrv;
- si.cbReserved2 = sizeof (ciresrv);
-
- DWORD chtype;
- if (mode != _P_OVERLAY)
- chtype = PROC_SPAWN;
- else
- chtype = PROC_EXEC;
-
- HANDLE subproc_ready;
- if (chtype != PROC_EXEC)
- subproc_ready = NULL;
- else
- {
- subproc_ready = CreateEvent (&sec_all, TRUE, FALSE, NULL);
- ProtectHandleINH (subproc_ready);
- }
-
- init_child_info (chtype, &ciresrv, (mode == _P_OVERLAY) ? myself->pid : 1,
- subproc_ready);
- if (!DuplicateHandle (hMainProc, hMainProc, hMainProc, &ciresrv.parent, 0, 1,
- DUPLICATE_SAME_ACCESS))
- {
- system_printf ("couldn't create handle to myself for child, %E");
- return -1;
- }
-
- ciresrv.moreinfo = (cygheap_exec_info *) ccalloc (HEAP_1_EXEC, 1, sizeof (cygheap_exec_info));
- ciresrv.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 */;
-
- av newargv (ac, argv);
-
- int null_app_name = 0;
- 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 = 1;
- goto skip_arg_parsing;
- }
-
- const char *ext;
- if ((ext = perhaps_suffix (prog_arg, real_path)) == NULL)
- {
- set_errno (ENOENT);
- return -1;
- }
-
- MALLOC_CHECK;
-
- /* If the file name ends in either .exe, .com, .bat, or .cmd we assume
- that it is NOT a script file */
- while (*ext == '\0')
- {
- HANDLE hnd = CreateFile (real_path, GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- &sec_none_nih, OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL, 0);
- if (hnd == INVALID_HANDLE_VALUE)
- {
- __seterrno ();
- return -1;
- }
-
- DWORD done;
-
- char buf[2 * MAX_PATH + 1];
- buf[0] = buf[1] = buf[2] = buf[sizeof (buf) - 1] = '\0';
- if (!ReadFile (hnd, buf, sizeof (buf) - 1, &done, 0))
- {
- CloseHandle (hnd);
- __seterrno ();
- return -1;
- }
-
- CloseHandle (hnd);
-
- if (buf[0] == 'M' && buf[1] == 'Z')
- break;
-
- debug_printf ("%s is a script", (char *) real_path);
-
- char *pgm, *arg1;
-
- if (buf[0] != '#' || buf[1] != '!')
- {
- pgm = (char *) "/bin/sh";
- arg1 = NULL;
- }
- else
- {
- char *ptr;
- pgm = buf + 2;
- pgm += strspn (pgm, " \t");
- for (ptr = pgm, arg1 = NULL;
- *ptr && *ptr != '\r' && *ptr != '\n';
- 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 || *newptr == '\r' || *newptr == '\n')
- break;
- arg1 = newptr;
- ptr = newptr - 1;
- }
-
- *ptr = '\0';
- }
-
- /* Replace argv[0] with the full path to the script if this is the
- first time through the loop. */
- newargv.replace0_maybe (prog_arg);
-
- /* pointers:
- * pgm interpreter name
- * arg1 optional string
- */
- if (arg1)
- newargv.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);
- newargv.unshift (real_path, 1);
- }
-
- if (real_path.iscygexec ())
- 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);
- }
- MALLOC_CHECK;
- one_line.add (" ", 1);
- MALLOC_CHECK;
- }
-
- MALLOC_CHECK;
- if (one_line.ix)
- one_line.buf[one_line.ix - 1] = '\0';
- else
- one_line.add ("", 1);
- MALLOC_CHECK;
- }
-
- char *envblock;
- newargv.all_calloced ();
- if (newargv.error)
- {
- set_errno (newargv.error);
- return -1;
- }
-
- ciresrv.moreinfo->argc = newargv.argc;
- ciresrv.moreinfo->argv = newargv;
- ciresrv.hexec_proc = hexec_proc;
-
- if (mode != _P_OVERLAY ||
- !DuplicateHandle (hMainProc, myself.shared_handle (), hMainProc,
- &ciresrv.moreinfo->myself_pinfo, 0,
- TRUE, DUPLICATE_SAME_ACCESS))
- ciresrv.moreinfo->myself_pinfo = NULL;
-
- skip_arg_parsing:
- PROCESS_INFORMATION pi = {NULL, 0, 0, 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);
-
- int flags = CREATE_DEFAULT_ERROR_MODE | GetPriorityClass (hMainProc);
-
- if (mode == _P_DETACH || !set_console_state_for_spawn ())
- flags |= DETACHED_PROCESS;
- if (mode != _P_OVERLAY)
- flags |= CREATE_SUSPENDED;
-
- /* 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 ())
- flags |= CREATE_SUSPENDED;
-
-
- const char *runpath = null_app_name ? NULL : (const char *) real_path;
-
- syscall_printf ("null_app_name %d (%s, %.132s)", null_app_name, runpath, one_line.buf);
-
- void *newheap;
- /* Preallocated buffer for `sec_user' call */
- char sa_buf[1024];
-
- cygbench ("spawn-guts");
-
- cygheap->fdtab.set_file_pointers_for_exec ();
- if (!cygheap->user.issetuid ())
- {
- PSECURITY_ATTRIBUTES sec_attribs = sec_user_nih (sa_buf);
- ciresrv.moreinfo->envp = build_env (envp, envblock, ciresrv.moreinfo->envc,
- real_path.iscygexec ());
- newheap = cygheap_setup_for_child (&ciresrv, cygheap->fdtab.need_fixup_before ());
- rc = CreateProcess (runpath, /* image name - with full path */
- one_line.buf, /* what was passed to exec */
- sec_attribs, /* process security attrs */
- sec_attribs, /* thread security attrs */
- TRUE, /* inherit handles from parent */
- flags,
- envblock, /* environment */
- 0, /* use current drive/directory */
- &si,
- &pi);
- }
- else
- {
- PSID sid = cygheap->user.sid ();
-
- /* Set security attributes with sid */
- PSECURITY_ATTRIBUTES sec_attribs = sec_user_nih (sa_buf, sid);
-
- RevertToSelf ();
-
- /* Load users registry hive. */
- load_registry_hive (sid);
-
- /* 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];
-
- ciresrv.moreinfo->uid = ILLEGAL_UID;
- 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;
-
- ciresrv.moreinfo->envp = build_env (envp, envblock, ciresrv.moreinfo->envc,
- real_path.iscygexec ());
- newheap = cygheap_setup_for_child (&ciresrv, cygheap->fdtab.need_fixup_before ());
- rc = CreateProcessAsUser (cygheap->user.token,
- runpath, /* image name - with full path */
- one_line.buf, /* what was passed to exec */
- sec_attribs, /* process security attrs */
- sec_attribs, /* 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)
- ImpersonateLoggedOnUser (cygheap->user.token);
- }
-
- MALLOC_CHECK;
- if (envblock)
- free (envblock);
- MALLOC_CHECK;
-
- /* 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 (subproc_ready)
- ForceCloseHandle (subproc_ready);
- cygheap_setup_for_child_cleanup (newheap, &ciresrv, 0);
- return -1;
- }
-
- /* Fixup the parent datastructure if needed and resume the child's
- main thread. */
- if (!cygheap->fdtab.need_fixup_before ())
- cygheap_setup_for_child_cleanup (newheap, &ciresrv, 0);
- else
- {
- cygheap->fdtab.fixup_before_exec (pi.dwProcessId);
- cygheap_setup_for_child_cleanup (newheap, &ciresrv, 1);
- if (mode == _P_OVERLAY)
- {
- ResumeThread (pi.hThread);
- cygthread::terminate ();
- }
- }
-
- 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, %.132s)",
- rc ? cygpid : (unsigned int) -1, prog_arg, one_line.buf);
-
- /* Name the handle similarly to proc_subproc. */
- ProtectHandle1 (pi.hProcess, childhProc);
-
- if (mode == _P_OVERLAY)
- {
- /* These are both duplicated in the child code. We do this here,
- primarily for strace. */
- strace.execing = 1;
- hExeced = pi.hProcess;
- dwExeced = pi.dwProcessId;
- strcpy (myself->progname, real_path);
- close_all_files ();
- }
- else
- {
- myself->set_has_pgid_children ();
- ProtectHandle (pi.hThread);
- pinfo child (cygpid, 1);
- if (!child)
- {
- set_errno (EAGAIN);
- syscall_printf ("-1 = spawnve (), process table full");
- return -1;
- }
- child->dwProcessId = pi.dwProcessId;
- child->hProcess = pi.hProcess;
- child.remember ();
- 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. */
- (void) DuplicateHandle (hMainProc, child.shared_handle (), pi.hProcess,
- NULL, 0, 0, DUPLICATE_SAME_ACCESS);
- /* Start the child running */
- ResumeThread (pi.hThread);
- }
-
- ForceCloseHandle (pi.hThread);
-
- sigproc_printf ("spawned windows pid %d", pi.dwProcessId);
-
- DWORD res;
- BOOL exited;
-
- res = 0;
- exited = FALSE;
- MALLOC_CHECK;
- if (mode == _P_OVERLAY)
- {
- int nwait = 3;
- HANDLE waitbuf[3] = {pi.hProcess, signal_arrived, subproc_ready};
- for (int i = 0; i < 100; i++)
- {
- switch (WaitForMultipleObjects (nwait, waitbuf, FALSE, INFINITE))
- {
- case WAIT_OBJECT_0:
- sigproc_printf ("subprocess exited");
- DWORD exitcode;
- if (!GetExitCodeProcess (pi.hProcess, &exitcode))
- exitcode = 1;
- res |= exitcode;
- exited = TRUE;
- break;
- case WAIT_OBJECT_0 + 1:
- sigproc_printf ("signal arrived");
- reset_signal_arrived ();
- continue;
- case WAIT_OBJECT_0 + 2:
- if (myself->ppid_handle)
- res |= EXIT_REPARENTING;
- if (!my_parent_is_alive ())
- {
- nwait = 2;
- sigproc_terminate ();
- continue;
- }
- break;
- case WAIT_FAILED:
- system_printf ("wait failed: nwait %d, pid %d, winpid %d, %E",
- nwait, myself->pid, myself->dwProcessId);
- system_printf ("waitbuf[0] %p %d", waitbuf[0],
- WaitForSingleObject (waitbuf[0], 0));
- system_printf ("waitbuf[1] %p = %d", waitbuf[1],
- WaitForSingleObject (waitbuf[1], 0));
- system_printf ("waitbuf[w] %p = %d", waitbuf[2],
- WaitForSingleObject (waitbuf[2], 0));
- set_errno (ECHILD);
- try_to_debug ();
- return -1;
- }
- break;
- }
-
- ForceCloseHandle (subproc_ready);
-
- sigproc_printf ("res = %x", res);
-
- if (res & EXIT_REPARENTING)
- {
- /* Try to reparent child process.
- * Make handles to child available to parent process and exit with
- * EXIT_REPARENTING status. Wait() syscall in parent will then wait
- * for newly created child.
- */
- HANDLE oldh = myself->hProcess;
- HANDLE h = myself->ppid_handle;
- sigproc_printf ("parent handle %p", h);
- int rc = DuplicateHandle (hMainProc, pi.hProcess, h, &myself->hProcess,
- 0, FALSE, DUPLICATE_SAME_ACCESS);
- sigproc_printf ("%d = DuplicateHandle, oldh %p, newh %p",
- rc, oldh, myself->hProcess);
- if (!rc && my_parent_is_alive ())
- {
- system_printf ("Reparent failed, parent handle %p, %E", h);
- system_printf ("my dwProcessId %d, myself->dwProcessId %d",
- GetCurrentProcessId (), myself->dwProcessId);
- system_printf ("old hProcess %p, hProcess %p", oldh, myself->hProcess);
- }
- }
-
- }
-
- MALLOC_CHECK;
-
- switch (mode)
- {
- case _P_OVERLAY:
- ForceCloseHandle1 (pi.hProcess, childhProc);
- proc_terminate ();
- myself->exit (res, 1);
- break;
- case _P_WAIT:
- waitpid (cygpid, (int *) &res, 0);
- break;
- case _P_DETACH:
- res = 0; /* Lose all memory of this child. */
- break;
- case _P_NOWAIT:
- case _P_NOWAITO:
- case _P_VFORK:
- res = cygpid;
- break;
- default:
- break;
- }
-
- 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;
- vfork_save *vf = vfork_storage.val ();
-
- if (vf != NULL && (vf->pid < 0) && mode == _P_OVERLAY)
- mode = _P_NOWAIT;
- else
- vf = NULL;
-
- 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:
- subproc_init ();
- ret = spawn_guts (path, argv, envp, mode);
- if (vf)
- {
- debug_printf ("longjmping due to vfork");
- if (ret < 0)
- vf->restore_exit (ret);
- else
- vf->restore_pid (ret);
- }
- 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);
-}
diff --git a/winsup/cygwin/speclib b/winsup/cygwin/speclib
deleted file mode 100755
index 6f8e0cd73..000000000
--- a/winsup/cygwin/speclib
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-# 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) v="-v"; shift
-esac
-lib=$1; shift
-nm=$1; shift
-dlltool=$1; shift
-as=$1; shift
-def=$1; shift
-trap "rm -f /tmp/$$.def" 0 1 2 15
-(echo "LIBRARY cygwin1.dll
-EXPORTS"; $nm --extern-only --defined-only $* | sed -e '/^[ ]*$/d' -e '/:$/d' -e 's/^.* _\(.*\)/\1/' | grep $v -f - -w $def |egrep -vi '^library|exports|^$' | sort) > /tmp/$$.def
-$dlltool --as=$as -d /tmp/$$.def -l "$lib"
diff --git a/winsup/cygwin/stackdump.sgml b/winsup/cygwin/stackdump.sgml
deleted file mode 100644
index bff76bffd..000000000
--- a/winsup/cygwin/stackdump.sgml
+++ /dev/null
@@ -1,13 +0,0 @@
-<sect1 id="func-cygwin-stackdump">
-<title>cygwin_stackdump</title>
-
-<funcsynopsis>
-<funcdef>extern "C" void
-<function>cygwin_stackdump</function></funcdef>
-<void>
-</funcsynopsis>
-
-<para> Outputs a stackdump to stderr from the called location.
-</para>
-
-</sect1>
diff --git a/winsup/cygwin/strace.cc b/winsup/cygwin/strace.cc
deleted file mode 100644
index 26f155aaa..000000000
--- a/winsup/cygwin/strace.cc
+++ /dev/null
@@ -1,423 +0,0 @@
-/* strace.cc: system/windows tracing
-
- 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 <stdlib.h>
-#include <time.h>
-#include <wingdi.h>
-#include <winuser.h>
-#include <ctype.h>
-#include <errno.h>
-#include "pinfo.h"
-#include "perprocess.h"
-#include "cygwin_version.h"
-#include "hires.h"
-#include "security.h"
-#include "cygthread.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygerrno.h"
-#include "cygheap.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 ()
-{
- char buf[30];
-
- if (inited)
- {
- active ^= 1;
- return;
- }
-
- inited = 1;
- if (!being_debugged ())
- return;
-
- __small_sprintf (buf, "cYg%8x %x", _STRACE_INTERFACE_ACTIVATE_ADDR, &active);
- OutputDebugString (buf);
-
- if (active)
- {
- prntf (1, NULL, "**********************************************");
- prntf (1, NULL, "Program name: %s (%d)", myself->progname, myself->pid ?: GetCurrentProcessId ());
- 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 ());
- 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;
-}
-
-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 int nonewline = FALSE;
- DWORD err = GetLastError ();
- const char *tn = cygthread::name ();
- char *pn = __progname ?: (myself ? myself->progname : NULL);
-
- int microsec = microseconds ();
- lmicrosec = microsec;
-
- __small_sprintf (fmt, "%7d [%s] %s ", microsec, tn, "%s %d%s");
-
- SetLastError (err);
-
- if (nonewline)
- count = 0;
- else
- {
- char *p, progname[MAX_PATH + 1];
- if (!pn)
- p = (char *) "*** unknown ***";
- else if ((p = strrchr (pn, '\\')) != NULL)
- p++;
- else if ((p = strrchr (pn, '/')) != NULL)
- p++;
- else
- p = pn;
- strcpy (progname, p);
- if ((p = strrchr (progname, '.')) != NULL && strcasematch (p, ".exe"))
- *p = '\000';
- p = progname;
- count = __small_sprintf (buf, fmt, p && *p ? p : "?",
- myself->pid ?: GetCurrentProcessId (),
- 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
-}
-
-/* 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 count;
- char buf[10000];
-
- PROTECT (buf);
- SetLastError (err);
-
- count = this->vsprntf (buf, func, fmt, ap);
- CHECK (buf);
- if (category & _STRACE_SYSTEM)
- {
- DWORD done;
- WriteFile (GetStdHandle (STD_ERROR_HANDLE), buf, count, &done, 0);
- FlushFileBuffers (GetStdHandle (STD_ERROR_HANDLE));
- }
-
-#ifndef NOSTRACE
- if (active)
- this->write (category, buf, count);
-#endif
- SetLastError (err);
-}
-
-void
-strace::prntf (unsigned category, const char *func, const char *fmt, ...)
-{
- va_list ap;
-
- va_start (ap, fmt);
- this->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)
- {
- this->prntf (_STRACE_WM, NULL, "wndproc %d %s %d %d", message, ta[i].n, word, lon);
- return;
- }
- }
- this->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 6e410249b..000000000
--- a/winsup/cygwin/string.h
+++ /dev/null
@@ -1,108 +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 <string.h>
-
-#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;
-}
-
-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 0a421f6e1..000000000
--- a/winsup/cygwin/strsep.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/* strsep.cc: strsep call */
-
-#include <stdio.h>
-
-/*-
- * 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/sync.cc b/winsup/cygwin/sync.cc
deleted file mode 100644
index b6dec83fa..000000000
--- a/winsup/cygwin/sync.cc
+++ /dev/null
@@ -1,149 +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 Red Hat, Inc.
-
- Written by Christopher Faylor <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. */
-
-#include "winsup.h"
-#include <stdlib.h>
-#include <time.h>
-#include <sys/wait.h>
-#include <errno.h>
-#include <stdlib.h>
-#include "sync.h"
-#include "security.h"
-
-muto NO_COPY muto_start;
-
-#undef WaitForSingleObject
-
-/* Constructor */
-muto *
-muto::init (const char *s)
-{
- waiters = -1;
- /* Create event which is used in the fallback case when blocking is necessary */
- if (!(bruteforce = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL)))
- {
- DWORD oerr = GetLastError ();
- SetLastError (oerr);
- return NULL;
- }
- name = s;
- next = muto_start.next;
- muto_start.next = this;
- 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. */
-int
-muto::acquire (DWORD ms)
-{
- DWORD this_tid = GetCurrentThreadId ();
-
- if (tid != this_tid)
- {
- /* Increment the waiters part of the class. Need to do this first to
- avoid potential races. */
- LONG was_waiting = InterlockedIncrement (&waiters);
-
- /* This is deceptively simple. Basically, it allows multiple attempts to
- lock the same muto to succeed without attempting to manipulate sync.
- If the muto is already locked then this thread will wait for ms until
- it is signalled by muto::release. Then it will attempt to grab the
- sync field. If it succeeds, then this thread owns the muto.
-
- There is a pathological condition where a thread times out waiting for
- bruteforce but the release code triggers the bruteforce event. In this
- case, it is possible for a thread which is going to wait for bruteforce
- to wake up immediately. It will then attempt to grab sync but will fail
- and go back to waiting. */
- if (tid != this_tid && (was_waiting || InterlockedExchange (&sync, 1) != 0))
- {
- switch (WaitForSingleObject (bruteforce, ms))
- {
- case WAIT_OBJECT_0:
- goto gotit;
- break;
- default:
- InterlockedDecrement (&waiters);
- return 0; /* failed. */
- }
- }
- }
-
-gotit:
- tid = this_tid; /* register this thread. */
- return ++visits; /* Increment visit count. */
-}
-
-/* Return the muto lock. Needs to be called once per every acquire. */
-int
-muto::release ()
-{
- DWORD this_tid = GetCurrentThreadId ();
-
- if (tid != this_tid || !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)
- {
- tid = 0; /* We were the last unlocker. */
- (void) 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)
- (void) SetEvent (bruteforce); /* Wake up one of the waiting threads */
- }
-
- return 1; /* success. */
-}
-
-/* Call only when we're exiting. This is not thread safe. */
-void
-muto::reset ()
-{
- visits = sync = tid = 0;
- InterlockedExchange (&waiters, -1);
- if (bruteforce)
- {
- CloseHandle (bruteforce);
- bruteforce = CreateEvent (&sec_none_nih, FALSE, FALSE, name);
- }
-}
diff --git a/winsup/cygwin/sync.h b/winsup/cygwin/sync.h
deleted file mode 100644
index 9cd50c3ac..000000000
--- a/winsup/cygwin/sync.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* sync.h: Header file for cygwin synchronization primitives.
-
- Copyright 1999, 2000, 2001, 2002 Red Hat, Inc.
-
- Written by Christopher Faylor <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. */
-
-/* FIXME: Note that currently this class cannot be allocated via `new' since
- there are issues with malloc and fork. */
-class muto
-{
- LONG sync; /* Used to serialize access to this class. */
- LONG visits; /* Count of number of times a thread has called acquire. */
- LONG waiters; /* Number of threads waiting for lock. */
- HANDLE bruteforce; /* event handle used to control waiting for lock. */
- DWORD tid; /* Thread Id of lock owner. */
-public:
- class muto *next;
- const char *name;
-
- /* The real constructor. */
- muto *init(const char *name) __attribute__ ((regparm (3)));
-
-#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. */
-
- /* Return true if caller thread owns the lock. */
- int ismine () {return tid == GetCurrentThreadId ();}
- DWORD owner () {return tid;}
- int unstable () {return !tid && (sync || waiters >= 0);}
- void reset () __attribute__ ((regparm (1)));
-};
-
-extern muto muto_start;
-
-/* Use a statically allocated buffer as the storage for a muto */
-#define new_muto(__name) \
-({ \
- static muto __name##_storage __attribute__((nocommon)) __attribute__((section(".data_cygwin_nocopy"))); \
- __name = __name##_storage.init (#__name); \
-})
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
deleted file mode 100644
index 8c0561e79..000000000
--- a/winsup/cygwin/syscalls.cc
+++ /dev/null
@@ -1,2594 +0,0 @@
-/* syscalls.cc: syscalls
-
- 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. */
-
-#define _close __FOO_close__
-#define _lseek __FOO_lseek__
-#define _open __FOO_open__
-#define _read __FOO_read__
-#define _write __FOO_write__
-
-#include "winsup.h"
-#include <sys/stat.h>
-#include <sys/vfs.h> /* needed for statfs */
-#include <pwd.h>
-#include <grp.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <process.h>
-#include <utmp.h>
-#include <sys/uio.h>
-#include <errno.h>
-#include <limits.h>
-#include <winnls.h>
-#include <wininet.h>
-#include <lmcons.h> /* for UNLEN */
-#include <cygwin/version.h>
-#include <sys/cygwin.h>
-#include "cygerrno.h"
-#include "perprocess.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "sigproc.h"
-#include "pinfo.h"
-#include <unistd.h>
-#include "shared_info.h"
-#include "cygheap.h"
-#define NEED_VFORK
-#include <setjmp.h>
-#include "perthread.h"
-#include "pwdgrp.h"
-
-#undef _close
-#undef _lseek
-#undef _open
-#undef _read
-#undef _write
-
-SYSTEM_INFO system_info;
-
-/* 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 (void)
-{
- SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "close_all_files");
-
- fhandler_base *fh;
- for (int i = 0; i < (int) cygheap->fdtab.size; i++)
- if ((fh = cygheap->fdtab[i]) != NULL)
- {
- fh->close ();
- cygheap->fdtab.release (i);
- }
-
- ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "close_all_files");
- cygwin_shared->delqueue.process_queue ();
-}
-
-BOOL __stdcall
-check_pty_fds (void)
-{
- int res = FALSE;
- SetResourceLock (LOCK_FD_LIST, WRITE_LOCK, "check_pty_fds");
- fhandler_base *fh;
- for (int i = 0; i < (int) cygheap->fdtab.size; i++)
- if ((fh = cygheap->fdtab[i]) != NULL &&
- (fh->get_device () == FH_TTYS || fh->get_device () == FH_PTYM))
- {
- res = TRUE;
- break;
- }
- ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK, "check_pty_fds");
- return res;
-}
-
-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;
- sigframe thisframe (mainthread);
-
- path_conv win32_name (ourname, PC_SYM_NOFOLLOW | PC_FULL);
-
- 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;
- }
-
- /* Windows won't check the directory mode, so we do that ourselves. */
- if (!writable_directory (win32_name))
- {
- syscall_printf ("non-writable directory");
- goto done;
- }
-
- /* Check for shortcut as symlink condition. */
- if (win32_name.has_attribute (FILE_ATTRIBUTE_READONLY))
- {
- int len = strlen (win32_name);
- if (len > 4 && strcasematch ((char *) win32_name + len - 4, ".lnk"))
- SetFileAttributes (win32_name, (DWORD) win32_name & ~FILE_ATTRIBUTE_READONLY);
- }
-
- DWORD lasterr;
- lasterr = 0;
- for (int i = 0; i < 2; i++)
- {
- if (DeleteFile (win32_name))
- {
- syscall_printf ("DeleteFile succeeded");
- goto ok;
- }
-
- lasterr = GetLastError ();
- if (i || lasterr != ERROR_ACCESS_DENIED || win32_name.issymlink ())
- break; /* Couldn't delete it. */
-
- /* if access denied, chmod to be writable, in case it is not,
- and try again */
- (void) chmod (win32_name, 0777);
- }
-
- /* 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;
-
- /* Tried to delete file by normal DeleteFile and by resetting protection
- and then deleting. That didn't work.
-
- There are two possible reasons for this: 1) The file may be opened and
- Windows is not allowing it to be deleted, or 2) We may not have permissions
- to delete the file.
-
- So, first assume that it may be 1) and try to remove the file using the
- Windows FILE_FLAG_DELETE_ON_CLOSE semantics. This seems to work only
- spottily on Windows 9x/Me but it does seem to work reliably on NT as
- long as the file doesn't exist on a remote drive. */
-
- bool delete_on_close_ok;
-
- delete_on_close_ok = !win32_name.isremote ()
- && wincap.has_delete_on_close ();
-
- /* Attempt to use "delete on close" semantics to handle removing
- a file which may be open. */
- HANDLE h;
- h = CreateFile (win32_name, GENERIC_READ, FILE_SHARE_READ, &sec_none_nih,
- OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0);
- if (h == INVALID_HANDLE_VALUE)
- {
- if (GetLastError () == ERROR_FILE_NOT_FOUND)
- goto ok;
- }
- else
- {
- CloseHandle (h);
- syscall_printf ("CreateFile/CloseHandle succeeded");
- /* Everything is fine if the file has disappeared or if we know that the
- FILE_FLAG_DELETE_ON_CLOSE will eventually work. */
- if (GetFileAttributes (win32_name) == INVALID_FILE_ATTRIBUTES
- || delete_on_close_ok)
- goto ok; /* The file is either gone already or will eventually be
- deleted by the OS. */
- }
-
- /* 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. */
- cygwin_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 (const char *ourname)
-{
- path_conv win32_name (ourname, PC_SYM_NOFOLLOW | PC_FULL);
-
- 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)
-{
- 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 */
- }
-
- if (myself->pgid != myself->pid)
- {
- if (myself->ctty == TTY_CONSOLE
- && !cygheap->fdtab.has_console_fds ()
- && !check_pty_fds ())
- FreeConsole ();
- myself->ctty = -1;
- myself->sid = getpid ();
- myself->pgid = getpid ();
- syscall_printf ("sid %d, pgid %d, ctty %d", myself->sid, myself->pgid, myself->ctty);
- 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 _read (int, void *, size_t)
- __attribute__ ((alias ("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);
-}
-
-extern "C" ssize_t _write (int fd, const void *ptr, size_t len)
- __attribute__ ((alias ("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 (0);
- sigframe thisframe (mainthread);
-
- 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->get_r_no_interrupt ()))
- 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 || !thisframe.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 (0);
- const ssize_t tot = check_iovec_for_write (iov, iovcnt);
-
- sigframe thisframe (mainthread);
- 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 > 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 (0);
- sigframe thisframe (mainthread);
-
- syscall_printf ("open (%s, %p)", unix_path, flags);
- if (!check_null_empty_str_errno (unix_path))
- {
- /* 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)
- {
- path_conv pc;
- if (!(fh = cygheap->fdtab.build_fhandler_from_name (fd, unix_path,
- NULL, pc)))
- res = -1; // errno already set
- else if (!fh->open (&pc, flags, (mode & 07777) & ~cygheap->umask))
- {
- fd.release ();
- res = -1;
- }
- else if ((res = fd) <= 2)
- set_std_handle (res);
- }
- }
-
- syscall_printf ("%d = open (%s, %p)", res, unix_path, flags);
- return res;
-}
-
-extern "C" int _open (const char *, int flags, ...)
- __attribute__ ((alias ("open")));
-
-extern "C" __off64_t
-lseek64 (int fd, __off64_t pos, int dir)
-{
- __off64_t res;
- sigframe thisframe (mainthread);
-
- 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;
-}
-
-extern "C" __off32_t
-lseek (int fd, __off32_t pos, int dir)
-{
- return lseek64 (fd, (__off64_t) pos, dir);
-}
-
-extern "C" __off32_t _lseek (int, __off32_t, int)
- __attribute__ ((alias ("lseek")));
-
-extern "C" int
-close (int fd)
-{
- int res;
- sigframe thisframe (mainthread);
-
- 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;
-}
-
-extern "C" int _close (int) __attribute__ ((alias ("close")));
-
-extern "C" int
-isatty (int fd)
-{
- int res;
- sigframe thisframe (mainthread);
-
- 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 *a, const char *b)
-{
- int res = -1;
- sigframe thisframe (mainthread);
- path_conv real_a (a, PC_SYM_FOLLOW | PC_FULL);
- path_conv real_b (b, PC_SYM_NOFOLLOW | PC_FULL);
-
- if (real_a.error)
- {
- set_errno (real_a.error);
- goto done;
- }
-
- if (real_b.error)
- {
- set_errno (real_b.case_clash ? ECASECLASH : real_b.error);
- goto done;
- }
-
- if (real_b.exists ())
- {
- syscall_printf ("file '%s' exists?", (char *) real_b);
- set_errno (EEXIST);
- goto done;
- }
-
- if (real_b[strlen (real_b) - 1] == '.')
- {
- syscall_printf ("trailing dot, bailing out");
- set_errno (EINVAL);
- goto done;
- }
-
- /* Try to make hard link first on Windows NT */
- if (wincap.has_hard_links ())
- {
- if (CreateHardLinkA (real_b, real_a, NULL))
- {
- res = 0;
- goto done;
- }
-
- HANDLE hFileSource;
-
- WIN32_STREAM_ID StreamId;
- DWORD dwBytesWritten;
- LPVOID lpContext;
- DWORD cbPathLen;
- DWORD StreamSize;
- WCHAR wbuf[MAX_PATH];
-
- BOOL bSuccess;
-
- hFileSource = CreateFile (real_a, FILE_WRITE_ATTRIBUTES,
- FILE_SHARE_READ | FILE_SHARE_WRITE /*| FILE_SHARE_DELETE*/,
- &sec_none_nih, // sa
- OPEN_EXISTING, 0, NULL);
-
- if (hFileSource == INVALID_HANDLE_VALUE)
- {
- syscall_printf ("cannot open source, %E");
- goto docopy;
- }
-
- cbPathLen = sys_mbstowcs (wbuf, real_b, MAX_PATH) * sizeof (WCHAR);
-
- StreamId.dwStreamId = BACKUP_LINK;
- StreamId.dwStreamAttributes = 0;
- StreamId.dwStreamNameSize = 0;
- StreamId.Size.HighPart = 0;
- StreamId.Size.LowPart = cbPathLen;
-
- StreamSize = sizeof (WIN32_STREAM_ID) - sizeof (WCHAR**) +
- StreamId.dwStreamNameSize;
-
- lpContext = NULL;
- /* Write the WIN32_STREAM_ID */
- bSuccess = BackupWrite (
- hFileSource,
- (LPBYTE) &StreamId, // buffer to write
- StreamSize, // number of bytes to write
- &dwBytesWritten,
- FALSE, // don't abort yet
- FALSE, // don't process security
- &lpContext);
-
- if (bSuccess)
- {
- /* write the buffer containing the path */
- /* FIXME: BackupWrite sometimes traps if linkname is invalid.
- Need to handle. */
- bSuccess = BackupWrite (
- hFileSource,
- (LPBYTE) wbuf, // buffer to write
- cbPathLen, // number of bytes to write
- &dwBytesWritten,
- FALSE, // don't abort yet
- FALSE, // don't process security
- &lpContext
- );
-
- if (!bSuccess)
- syscall_printf ("cannot write linkname, %E");
-
- /* Free context */
- BackupWrite (
- hFileSource,
- NULL, // buffer to write
- 0, // number of bytes to write
- &dwBytesWritten,
- TRUE, // abort
- FALSE, // don't process security
- &lpContext);
- }
- else
- syscall_printf ("cannot write streamId, %E");
-
- CloseHandle (hFileSource);
-
- if (!bSuccess)
- goto docopy;
-
- res = 0;
- goto done;
- }
-docopy:
- /* do this with a copy */
- if (CopyFileA (real_a, real_b, 1))
- res = 0;
- else
- __seterrno ();
-
-done:
- syscall_printf ("%d = link (%s, %s)", res, a, b);
- 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)
-{
- int res;
-
- if (check_null_empty_str_errno (name))
- return -1;
-
- if (!wincap.has_security ()) // real chown only works on NT
- res = 0; // return zero (and do nothing) under Windows 9x
- else
- {
- /* we need Win32 path names because of usage of Win32 API functions */
- path_conv win32_path (PC_NONULLEMPTY, name, fmode);
-
- if (win32_path.error)
- {
- set_errno (win32_path.error);
- res = -1;
- goto done;
- }
-
- /* FIXME: This makes chown on a device succeed always. Someday we'll want
- to actually allow chown to work properly on devices. */
- if (win32_path.is_device ())
- {
- res = 0;
- goto done;
- }
-
- DWORD attrib = 0;
- if (win32_path.isdir ())
- attrib |= S_IFDIR;
- res = get_file_attribute (win32_path.has_acls (),
- win32_path.get_win32 (),
- (int *) &attrib);
- if (!res)
- res = set_file_attribute (win32_path.has_acls (), win32_path, uid,
- gid, attrib);
- if (res != 0 && (!win32_path.has_acls () || !allow_ntsec))
- {
- /* fake - if not supported, pretend we're like win95
- where it just works */
- res = 0;
- }
- }
-
-done:
- 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)
-{
- sigframe thisframe (mainthread);
- return chown_worker (name, PC_SYM_FOLLOW, uid, gid);
-}
-
-extern "C" int
-chown (const char * name, __uid16_t uid, __gid16_t gid)
-{
- sigframe thisframe (mainthread);
- return chown_worker (name, PC_SYM_FOLLOW,
- uid16touid32 (uid), gid16togid32 (gid));
-}
-
-extern "C" int
-lchown32 (const char * name, __uid32_t uid, __gid32_t gid)
-{
- sigframe thisframe (mainthread);
- return chown_worker (name, PC_SYM_NOFOLLOW, uid, gid);
-}
-
-extern "C" int
-lchown (const char * name, __uid16_t uid, __gid16_t gid)
-{
- sigframe thisframe (mainthread);
- return chown_worker (name, PC_SYM_NOFOLLOW,
- uid16touid32 (uid), gid16togid32 (gid));
-}
-
-extern "C" int
-fchown32 (int fd, __uid32_t uid, __gid32_t gid)
-{
- sigframe thisframe (mainthread);
- cygheap_fdget cfd (fd);
- if (cfd < 0)
- {
- syscall_printf ("-1 = fchown (%d,...)", fd);
- return -1;
- }
-
- const char *path = cfd->get_name ();
-
- if (path == NULL)
- {
- syscall_printf ("-1 = fchown (%d,...) (no name)", fd);
- set_errno (ENOSYS);
- return -1;
- }
-
- syscall_printf ("fchown (%d,...): calling chown_worker (%s,FOLLOW,...)",
- fd, path);
- return chown_worker (path, PC_SYM_FOLLOW, uid, gid);
-}
-
-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;
-}
-
-/* chmod: POSIX 5.6.4.1 */
-extern "C" int
-chmod (const char *path, mode_t mode)
-{
- int res = -1;
- sigframe thisframe (mainthread);
-
- path_conv win32_path (path);
-
- if (win32_path.error)
- {
- set_errno (win32_path.error);
- goto done;
- }
-
- /* FIXME: This makes chmod on a device succeed always. Someday we'll want
- to actually allow chmod to work properly on devices. */
- if (win32_path.is_device ())
- {
- res = 0;
- goto done;
- }
-
- if (!win32_path.exists ())
- __seterrno ();
- else
- {
- /* temporary erase read only bit, to be able to set file security */
- SetFileAttributes (win32_path, (DWORD) win32_path & ~FILE_ATTRIBUTE_READONLY);
-
- if (win32_path.isdir ())
- mode |= S_IFDIR;
- if (!set_file_attribute (win32_path.has_acls (), win32_path,
- 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))
- (DWORD) win32_path &= ~FILE_ATTRIBUTE_READONLY;
- else
- (DWORD) win32_path |= FILE_ATTRIBUTE_READONLY;
-
- if (S_ISLNK (mode) || S_ISSOCK (mode))
- (DWORD) win32_path |= FILE_ATTRIBUTE_SYSTEM;
-
- if (!SetFileAttributes (win32_path, win32_path))
- __seterrno ();
- else if (!allow_ntsec)
- /* Correct NTFS security attributes have higher priority */
- res = 0;
- }
-
-done:
- 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)
-{
- sigframe thisframe (mainthread);
- cygheap_fdget cfd (fd);
- if (cfd < 0)
- {
- syscall_printf ("-1 = fchmod (%d, 0%o)", fd, mode);
- return -1;
- }
-
- const char *path = cfd->get_name ();
-
- if (path == NULL)
- {
- syscall_printf ("-1 = fchmod (%d, 0%o) (no name)", fd, mode);
- set_errno (ENOSYS);
- return -1;
- }
-
- syscall_printf ("fchmod (%d, 0%o): calling chmod (%s, 0%o)",
- fd, mode, path, mode);
- return chmod (path, 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 = 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;
- sigframe thisframe (mainthread);
-
- cygheap_fdget cfd (fd);
- if (cfd < 0)
- res = -1;
- else
- {
- path_conv pc (cfd->get_win32_name (), PC_SYM_NOFOLLOW);
- memset (buf, 0, sizeof (struct __stat64));
- res = cfd->fstat (buf, &pc);
- if (!res)
- {
- if (!buf->st_ino)
- buf->st_ino = hash_path_name (0, cfd->get_win32_name ());
- if (!buf->st_dev)
- buf->st_dev = (cfd->get_device () << 16) | cfd->get_unit ();
- if (!buf->st_rdev)
- buf->st_rdev = buf->st_dev;
- }
- }
-
- syscall_printf ("%d = fstat (%d, %p)", res, fd, buf);
- return res;
-}
-
-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;
-}
-
-/* fsync: P96 6.6.1.1 */
-extern "C" int
-fsync (int fd)
-{
- sigframe thisframe (mainthread);
- cygheap_fdget cfd (fd);
- if (cfd < 0)
- {
- syscall_printf ("-1 = fsync (%d)", fd);
- return -1;
- }
-
- if (FlushFileBuffers (cfd->get_handle ()) == 0)
- {
- __seterrno ();
- return -1;
- }
- return 0;
-}
-
-/* sync: standards? */
-extern "C" int
-sync ()
-{
- return 0;
-}
-
-suffix_info stat_suffixes[] =
-{
- suffix_info ("", 1),
- suffix_info (".exe", 1),
- suffix_info (NULL)
-};
-
-/* Cygwin internal */
-int __stdcall
-stat_worker (const char *name, struct __stat64 *buf, int nofollow,
- path_conv *pc)
-{
- int res = -1;
- path_conv real_path;
- fhandler_base *fh = NULL;
-
- if (check_null_invalid_struct_errno (buf))
- goto done;
-
- if (!pc)
- pc = &real_path;
-
- fh = cygheap->fdtab.build_fhandler_from_name (-1, name, NULL, *pc,
- (nofollow ? PC_SYM_NOFOLLOW
- : PC_SYM_FOLLOW)
- | PC_FULL, stat_suffixes);
-
- if (pc->error)
- {
- debug_printf ("got %d error from build_fhandler_from_name", pc->error);
- set_errno (pc->error);
- }
- else
- {
- debug_printf ("(%s, %p, %d, %p), file_attributes %d", name, buf, nofollow,
- pc, (DWORD) real_path);
- memset (buf, 0, sizeof (*buf));
- res = fh->fstat (buf, pc);
- if (!res)
- {
- if (!buf->st_ino)
- buf->st_ino = hash_path_name (0, fh->get_win32_name ());
- if (!buf->st_dev)
- buf->st_dev = (fh->get_device () << 16) | fh->get_unit ();
- if (!buf->st_rdev)
- buf->st_rdev = buf->st_dev;
- }
- }
-
- done:
- if (fh)
- delete fh;
- MALLOC_CHECK;
- syscall_printf ("%d = (%s, %p)", res, name, buf);
- return res;
-}
-
-extern "C" int
-stat64 (const char *name, struct __stat64 *buf)
-{
- sigframe thisframe (mainthread);
- syscall_printf ("entering");
- return stat_worker (name, buf, 0);
-}
-
-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;
-}
-
-/* lstat: Provided by SVR4 and 4.3+BSD, POSIX? */
-extern "C" int
-lstat64 (const char *name, struct __stat64 *buf)
-{
- sigframe thisframe (mainthread);
- syscall_printf ("entering");
- return stat_worker (name, buf, 1);
-}
-
-/* lstat: Provided by SVR4 and 4.3+BSD, POSIX? */
-extern "C" int
-cygwin_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 int acl_access (const char *, int);
-
-extern "C" int
-access (const char *fn, int flags)
-{
- sigframe thisframe (mainthread);
- // flags were incorrectly specified
- if (flags & ~(F_OK|R_OK|W_OK|X_OK))
- {
- set_errno (EINVAL);
- return -1;
- }
-
- if (allow_ntsec)
- return acl_access (fn, flags);
-
- struct __stat64 st;
- int r = stat_worker (fn, &st, 0);
- if (r)
- return -1;
- r = -1;
- if (flags & R_OK)
- {
- if (st.st_uid == myself->uid)
- {
- if (!(st.st_mode & S_IRUSR))
- goto done;
- }
- else if (st.st_gid == myself->gid)
- {
- if (!(st.st_mode & S_IRGRP))
- goto done;
- }
- else if (!(st.st_mode & S_IROTH))
- goto done;
- }
- if (flags & W_OK)
- {
- if (st.st_uid == myself->uid)
- {
- if (!(st.st_mode & S_IWUSR))
- goto done;
- }
- else if (st.st_gid == myself->gid)
- {
- if (!(st.st_mode & S_IWGRP))
- goto done;
- }
- else if (!(st.st_mode & S_IWOTH))
- goto done;
- }
- if (flags & X_OK)
- {
- if (st.st_uid == myself->uid)
- {
- if (!(st.st_mode & S_IXUSR))
- goto done;
- }
- else if (st.st_gid == myself->gid)
- {
- if (!(st.st_mode & S_IXGRP))
- goto done;
- }
- else if (!(st.st_mode & S_IXOTH))
- goto done;
- }
- r = 0;
-done:
- if (r)
- set_errno (EACCES);
- return r;
-}
-
-extern "C" int
-rename (const char *oldpath, const char *newpath)
-{
- sigframe thisframe (mainthread);
- int res = 0;
- char *lnk_suffix = NULL;
-
- path_conv real_old (oldpath, PC_SYM_NOFOLLOW);
-
- if (real_old.error)
- {
- syscall_printf ("-1 = rename (%s, %s)", oldpath, newpath);
- set_errno (real_old.error);
- return -1;
- }
-
- path_conv real_new (newpath, PC_SYM_NOFOLLOW);
-
- /* Shortcut hack. */
- char new_lnk_buf[MAX_PATH + 5];
- if (real_old.issymlink () && !real_new.error && !real_new.case_clash)
- {
- int len_old = strlen (real_old.get_win32 ());
- if (strcasematch (real_old.get_win32 () + len_old - 4, ".lnk"))
- {
- strcpy (new_lnk_buf, newpath);
- strcat (new_lnk_buf, ".lnk");
- newpath = new_lnk_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 (!writable_directory (real_old) || !writable_directory (real_new))
- {
- syscall_printf ("-1 = rename (%s, %s)", oldpath, newpath);
- set_errno (EACCES);
- 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);
- }
-
- /* 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.issymlink () &&
- real_new.known_suffix && strcasematch (real_new.known_suffix, ".lnk") &&
- (lnk_suffix = strrchr (real_new.get_win32 (), '.')))
- *lnk_suffix = '\0';
-
- if (!MoveFile (real_old, real_new))
- res = -1;
-
- if (res == 0 || (GetLastError () != ERROR_ALREADY_EXISTS
- && GetLastError () != ERROR_FILE_EXISTS))
- goto done;
-
- if (wincap.has_move_file_ex ())
- {
- if (MoveFileEx (real_old.get_win32 (), real_new.get_win32 (),
- MOVEFILE_REPLACE_EXISTING))
- res = 0;
- }
- else
- {
- syscall_printf ("try win95 hack");
- for (int i = 0; i < 2; i++)
- {
- if (!DeleteFileA (real_new.get_win32 ()) &&
- GetLastError () != ERROR_FILE_NOT_FOUND)
- {
- syscall_printf ("deleting %s to be paranoid",
- real_new.get_win32 ());
- break;
- }
- else if (MoveFile (real_old.get_win32 (), real_new.get_win32 ()))
- {
- 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);
- }
- }
-
- syscall_printf ("%d = rename (%s, %s)", res, (char *) real_old,
- (char *) real_new);
-
- return res;
-}
-
-extern "C" int
-system (const char *cmdstring)
-{
- if (check_null_empty_str_errno (cmdstring))
- return -1;
-
- sigframe thisframe (mainthread);
- int res;
- const char* command[4];
- _sig_func_ptr oldint, oldquit;
- sigset_t child_block, old_mask;
-
- if (cmdstring == (const char *) NULL)
- return 1;
-
- oldint = signal (SIGINT, SIG_IGN);
- oldquit = signal (SIGQUIT, SIG_IGN);
- sigemptyset (&child_block);
- sigaddset (&child_block, SIGCHLD);
- (void) sigprocmask (SIG_BLOCK, &child_block, &old_mask);
-
- command[0] = "sh";
- command[1] = "-c";
- command[2] = cmdstring;
- command[3] = (const char *) NULL;
-
- if ((res = spawnvp (_P_WAIT, "sh", command)) == -1)
- {
- // when exec fails, return value should be as if shell
- // executed exit (127)
- res = 127;
- }
-
- signal (SIGINT, oldint);
- signal (SIGQUIT, oldquit);
- (void) sigprocmask (SIG_SETMASK, &old_mask, 0);
- 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 (int) system_info.dwPageSize;
-}
-
-static int
-check_posix_perm (const char *fname, int v)
-{
- extern int allow_ntea, allow_ntsec, allow_smbntsec;
-
- /* 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 (strcpy ((char *)alloca (strlen (fname)), 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_DISK)
- 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)
-{
- switch (v)
- {
- case _PC_PATH_MAX:
- if (check_null_empty_str_errno (file))
- return -1;
- 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 | PC_FULL);
- if (full_path.error)
- {
- set_errno (full_path.error);
- return -1;
- }
- if (full_path.is_device ())
- {
- set_errno (EINVAL);
- return -1;
- }
- return check_posix_perm (full_path, v);
- }
- default:
- set_errno (EINVAL);
- return -1;
- }
-}
-
-extern "C" char *
-ttyname (int fd)
-{
- cygheap_fdget cfd (fd);
- if (cfd < 0 || !cfd->is_tty ())
- {
- return 0;
- }
- return (char *) (cfd->ttyname ());
-}
-
-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)
-{
- syscall_printf ("_cygwin_istext_for_stdio (%d)", fd);
- if (CYGWIN_VERSION_OLD_STDIO_CRLF_HANDLING)
- {
- syscall_printf (" _cifs: old API");
- return 0; /* we do it for old apps, due to getc/putc macros */
- }
-
- cygheap_fdget cfd (fd, false, false);
- if (cfd < 0)
- {
- syscall_printf (" _cifs: fd not open");
- return 0;
- }
-
- if (cfd->get_device () != FH_DISK)
- {
- syscall_printf (" _cifs: fd not disk file");
- return 0;
- }
-
- if (cfd->get_w_binary () || cfd->get_r_binary ())
- {
- syscall_printf (" _cifs: get_*_binary");
- return 0;
- }
-
- syscall_printf ("_cygwin_istext_for_stdio says yes");
- return 1;
-}
-
-/* internal newlib function */
-extern "C" int _fwalk (struct _reent *ptr, int (*function) (FILE *));
-
-static int setmode_mode;
-static int setmode_file;
-
-static int
-setmode_helper (FILE *f)
-{
- if (fileno (f) != setmode_file)
- return 0;
- syscall_printf ("setmode: file was %s now %s",
- f->_flags & __SCLE ? "text" : "raw",
- setmode_mode & O_TEXT ? "text" : "raw");
- if (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->get_w_binary () && cfd->get_r_binary ())
- res = O_BINARY;
- else if (cfd->get_w_binset () && cfd->get_r_binset ())
- 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);
-
- if (_cygwin_istext_for_stdio (fd))
- setmode_mode = O_TEXT;
- else
- setmode_mode = O_BINARY;
- setmode_file = fd;
- _fwalk (_REENT, setmode_helper);
-
- syscall_printf ("setmode (%d<%s>, %p) returns %s", fd, cfd->get_name (),
- mode, res & O_TEXT ? "text" : "binary");
- return res;
-}
-
-extern "C" int
-ftruncate64 (int fd, __off64_t length)
-{
- sigframe thisframe (mainthread);
- int res = -1;
-
- if (length < 0)
- set_errno (EINVAL);
- else
- {
- cygheap_fdget cfd (fd);
- if (cfd >= 0)
- {
- HANDLE h = cygheap->fdtab[fd]->get_handle ();
-
- if (cfd->get_handle ())
- {
- /* remember curr file pointer location */
- __off64_t prev_loc = cfd->lseek (0, SEEK_CUR);
-
- cfd->lseek (length, SEEK_SET);
- if (!SetEndOfFile (h))
- __seterrno ();
- else
- res = 0;
-
- /* restore original file pointer location */
- cfd->lseek (prev_loc, SEEK_SET);
- }
- }
- }
-
- syscall_printf ("%d = ftruncate (%d, %d)", res, fd, length);
- return res;
-}
-
-/* ftruncate: P96 5.6.7.1 */
-extern "C" int
-ftruncate (int fd, __off32_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)
-{
- sigframe thisframe (mainthread);
- int fd;
- int res = -1;
-
- fd = open (pathname, O_RDWR);
-
- if (fd == -1)
- set_errno (EBADF);
- else
- {
- 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, __off32_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
-statfs (const char *fname, struct statfs *sfs)
-{
- sigframe thisframe (mainthread);
- if (!sfs)
- {
- set_errno (EFAULT);
- return -1;
- }
-
- path_conv full_path (fname, PC_SYM_FOLLOW | PC_FULL);
- char *root = rootdir (full_path);
-
- syscall_printf ("statfs %s", root);
-
- DWORD spc, bps, freec, totalc;
-
- if (!GetDiskFreeSpace (root, &spc, &bps, &freec, &totalc))
- {
- __seterrno ();
- return -1;
- }
-
- DWORD vsn, maxlen, flags;
-
- if (!GetVolumeInformation (root, NULL, 0, &vsn, &maxlen, &flags, NULL, 0))
- {
- __seterrno ();
- return -1;
- }
- sfs->f_type = flags;
- sfs->f_bsize = spc*bps;
- sfs->f_blocks = totalc;
- sfs->f_bfree = sfs->f_bavail = freec;
- sfs->f_files = -1;
- sfs->f_ffree = -1;
- sfs->f_fsid = vsn;
- sfs->f_namelen = maxlen;
- return 0;
-}
-
-extern "C" int
-fstatfs (int fd, struct statfs *sfs)
-{
- sigframe thisframe (mainthread);
- 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)
-{
- sigframe thisframe (mainthread);
- int res = -1;
- if (pid == 0)
- pid = getpid ();
- if (pgid == 0)
- pgid = pid;
-
- if (pgid < 0)
- {
- set_errno (EINVAL);
- goto out;
- }
- else
- {
- pinfo p (pid);
- if (!p)
- {
- set_errno (ESRCH);
- goto out;
- }
- /* A process may only change the process group of itself and its children */
- if (p == myself || p->ppid == myself->pid)
- {
- p->pgid = pgid;
- if (p->pid != p->pgid)
- p->set_has_pgid_children (0);
- res = 0;
- }
- else
- {
- set_errno (EPERM);
- goto out;
- }
- }
-out:
- syscall_printf ("pid %d, pgid %d, res %d", pid, pgid, res);
- return res;
-}
-
-extern "C" pid_t
-getpgid (pid_t pid)
-{
- sigframe thisframe (mainthread);
- if (pid == 0)
- pid = getpid ();
-
- pinfo p (pid);
- if (p == 0)
- {
- set_errno (ESRCH);
- return -1;
- }
- return p->pgid;
-}
-
-extern "C" int
-setpgrp (void)
-{
- sigframe thisframe (mainthread);
- return setpgid (0, 0);
-}
-
-extern "C" pid_t
-getpgrp (void)
-{
- sigframe thisframe (mainthread);
- return getpgid (0);
-}
-
-extern "C" char *
-ptsname (int fd)
-{
- sigframe thisframe (mainthread);
- 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;
-}
-
-/* mknod was the call to create directories before the introduction
- of mkdir in 4.2BSD and SVR3. Use of mknod required superuser privs
- so the mkdir command had to be setuid root.
- Although mknod hasn't been implemented yet, some GNU tools (e.g. the
- fileutils) assume its existence so we must provide a stub that always
- fails. */
-extern "C" int
-mknod (const char *_path, mode_t mode, dev_t dev)
-{
- set_errno (ENOSYS);
- return -1;
-}
-
-extern "C" int
-mkfifo (const char *_path, mode_t mode)
-{
- set_errno (ENOSYS);
- return -1;
-}
-
-/* seteuid: standards? */
-extern "C" int
-seteuid32 (__uid32_t uid)
-{
-
- debug_printf ("uid: %d myself->gid: %d", uid, myself->gid);
-
- if (!wincap.has_security ()
- || (uid == myself->uid && !cygheap->user.groups.ischanged))
- {
- debug_printf ("Nothing happens");
- return 0;
- }
-
- if (uid == ILLEGAL_UID)
- {
- set_errno (EINVAL);
- return -1;
- }
-
- sigframe thisframe (mainthread);
- cygsid usersid;
- user_groups &groups = cygheap->user.groups;
- HANDLE ptok, sav_token;
- BOOL sav_impersonated, sav_token_is_internal_token;
- BOOL process_ok, explicitly_created_token = FALSE;
- struct passwd * pw_new;
- PSID origpsid, psid2 = NO_SID;
-
- pw_new = internal_getpwuid (uid);
- if (!usersid.getfrompw (pw_new))
- {
- set_errno (EINVAL);
- return -1;
- }
- /* Save current information */
- sav_token = cygheap->user.token;
- sav_impersonated = cygheap->user.impersonated;
-
- RevertToSelf ();
- if (!OpenProcessToken (hMainProc, TOKEN_QUERY | TOKEN_ADJUST_DEFAULT, &ptok))
- {
- __seterrno ();
- goto failed;
- }
- /* Verify if the process token is suitable.
- Currently we do not try to differentiate between
- internal tokens and others */
- process_ok = verify_token (ptok, usersid, groups);
- debug_printf ("Process token %sverified", process_ok ? "" : "not ");
- if (process_ok)
- {
- if (cygheap->user.issetuid ())
- cygheap->user.impersonated = FALSE;
- else
- {
- CloseHandle (ptok);
- goto success; /* No change */
- }
- }
-
- if (!process_ok && cygheap->user.token != INVALID_HANDLE_VALUE)
- {
- /* Verify if the current tokem is suitable */
- BOOL token_ok = verify_token (cygheap->user.token, usersid, groups,
- &sav_token_is_internal_token);
- debug_printf ("Thread token %d %sverified",
- cygheap->user.token, token_ok?"":"not ");
- if (!token_ok)
- cygheap->user.token = INVALID_HANDLE_VALUE;
- else
- {
- /* Return if current token is valid */
- if (cygheap->user.impersonated)
- {
- CloseHandle (ptok);
- if (!ImpersonateLoggedOnUser (cygheap->user.token))
- system_printf ("Impersonating in seteuid failed: %E");
- goto success; /* No change */
- }
- }
- }
-
- /* Set process def dacl to allow access to impersonated token */
- char dacl_buf[MAX_DACL_LEN (5)];
- if (usersid != (origpsid = cygheap->user.orig_sid ())) psid2 = usersid;
- if (sec_acl ((PACL) dacl_buf, FALSE, origpsid, psid2))
- {
- TOKEN_DEFAULT_DACL tdacl;
- tdacl.DefaultDacl = (PACL) dacl_buf;
- if (!SetTokenInformation (ptok, TokenDefaultDacl,
- &tdacl, sizeof dacl_buf))
- debug_printf ("SetTokenInformation"
- "(TokenDefaultDacl): %E");
- }
- CloseHandle (ptok);
-
- if (!process_ok && cygheap->user.token == INVALID_HANDLE_VALUE)
- {
- /* If no impersonation token is available, try to
- authenticate using NtCreateToken () or subauthentication. */
- cygheap->user.token = create_token (usersid, groups, pw_new);
- if (cygheap->user.token != INVALID_HANDLE_VALUE)
- explicitly_created_token = TRUE;
- else
- {
- /* create_token failed. Try subauthentication. */
- debug_printf ("create token failed, try subauthentication.");
- cygheap->user.token = subauth (pw_new);
- if (cygheap->user.token == INVALID_HANDLE_VALUE)
- goto failed;
- }
- }
-
- /* If using the token, set info and impersonate */
- if (!process_ok)
- {
- /* If the token was explicitly created, all information has
- already been set correctly. */
- if (!explicitly_created_token)
- {
- /* Try setting owner to same value as user. */
- if (!SetTokenInformation (cygheap->user.token, TokenOwner,
- &usersid, sizeof usersid))
- debug_printf ("SetTokenInformation(user.token, "
- "TokenOwner): %E");
- /* Try setting primary group in token to current group */
- if (!SetTokenInformation (cygheap->user.token,
- TokenPrimaryGroup,
- &groups.pgsid, sizeof (cygsid)))
- debug_printf ("SetTokenInformation(user.token, "
- "TokenPrimaryGroup): %E");
- }
- /* Now try to impersonate. */
- if (!ImpersonateLoggedOnUser (cygheap->user.token))
- {
- debug_printf ("ImpersonateLoggedOnUser %E");
- __seterrno ();
- goto failed;
- }
- cygheap->user.impersonated = TRUE;
- }
-
- /* If sav_token was internally created and is replaced, destroy it. */
- if (sav_token != INVALID_HANDLE_VALUE &&
- sav_token != cygheap->user.token &&
- sav_token_is_internal_token)
- CloseHandle (sav_token);
- cygheap->user.set_name (pw_new->pw_name);
- cygheap->user.set_sid (usersid);
-success:
- myself->uid = uid;
- groups.ischanged = FALSE;
- return 0;
-
- failed:
- cygheap->user.token = sav_token;
- cygheap->user.impersonated = sav_impersonated;
- if (cygheap->user.issetuid ()
- && !ImpersonateLoggedOnUser (cygheap->user.token))
- system_printf ("Impersonating in seteuid failed: %E");
- return -1;
-}
-
-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));
-}
-
-/* setegid: from System V. */
-extern "C" int
-setegid32 (__gid32_t gid)
-{
- if (!wincap.has_security () || gid == myself->gid)
- return 0;
-
- if (gid == ILLEGAL_GID)
- {
- set_errno (EINVAL);
- return -1;
- }
-
- sigframe thisframe (mainthread);
- user_groups * groups = &cygheap->user.groups;
- cygsid gsid;
- HANDLE ptok;
-
- struct __group32 * gr = internal_getgrgid (gid);
- if (!gr || gr->gr_gid != gid || !gsid.getfromgr (gr))
- {
- set_errno (EINVAL);
- return -1;
- }
- myself->gid = gid;
-
- groups->update_pgrp (gsid);
- /* If impersonated, update primary group and revert */
- if (cygheap->user.issetuid ())
- {
- if (!SetTokenInformation (cygheap->user.token,
- TokenPrimaryGroup,
- &gsid, sizeof gsid))
- debug_printf ("SetTokenInformation(thread, "
- "TokenPrimaryGroup): %E");
- RevertToSelf ();
- }
- if (!OpenProcessToken (hMainProc, TOKEN_ADJUST_DEFAULT, &ptok))
- debug_printf ("OpenProcessToken(): %E");
- else
- {
- if (!SetTokenInformation (ptok, TokenPrimaryGroup,
- &gsid, sizeof gsid))
- debug_printf ("SetTokenInformation(process, "
- "TokenPrimaryGroup): %E");
- CloseHandle (ptok);
- }
- if (cygheap->user.issetuid ()
- && !ImpersonateLoggedOnUser (cygheap->user.token))
- system_printf ("Impersonating in setegid failed: %E");
- 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;
-}
-
-/* chroot: privileged Unix system call. */
-/* FIXME: Not privileged here. How should this be done? */
-extern "C" int
-chroot (const char *newroot)
-{
- sigframe thisframe (mainthread);
- path_conv path (newroot, PC_SYM_FOLLOW | PC_FULL | PC_POSIX);
-
- int ret;
- if (path.error)
- ret = -1;
- else if (!path.exists ())
- {
- set_errno (ENOENT);
- ret = -1;
- }
- else if (!path.isdir ())
- {
- set_errno (ENOTDIR);
- ret = -1;
- }
- else
- {
- 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)
-{
- sigframe thisframe (mainthread);
- return open (path, O_WRONLY | O_CREAT | O_TRUNC, mode);
-}
-
-extern "C" void
-__assertfail ()
-{
- exit (99);
-}
-
-extern "C" int
-getw (FILE *fp)
-{
- sigframe thisframe (mainthread);
- int w, ret;
- ret = fread (&w, sizeof (int), 1, fp);
- return ret != 1 ? EOF : w;
-}
-
-extern "C" int
-putw (int w, FILE *fp)
-{
- sigframe thisframe (mainthread);
- 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
-nice (int incr)
-{
- sigframe thisframe (mainthread);
- DWORD priority[] =
- {
- IDLE_PRIORITY_CLASS,
- IDLE_PRIORITY_CLASS,
- NORMAL_PRIORITY_CLASS,
- HIGH_PRIORITY_CLASS,
- REALTIME_PRIORITY_CLASS,
- REALTIME_PRIORITY_CLASS
- };
- int curr = 2;
-
- switch (GetPriorityClass (hMainProc))
- {
- case IDLE_PRIORITY_CLASS:
- curr = 1;
- break;
- case NORMAL_PRIORITY_CLASS:
- curr = 2;
- break;
- case HIGH_PRIORITY_CLASS:
- curr = 3;
- break;
- case REALTIME_PRIORITY_CLASS:
- curr = 4;
- break;
- }
- if (incr > 0)
- incr = -1;
- else if (incr < 0)
- incr = 1;
-
- if (SetPriorityClass (hMainProc, priority[curr + incr]) == FALSE)
- {
- __seterrno ();
- return -1;
- }
-
- return 0;
-}
-
-/*
- * 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;
-}
-
-extern "C" void
-login (struct utmp *ut)
-{
- sigframe thisframe (mainthread);
- register int fd;
-
- pututline (ut);
- if ((fd = open (_PATH_WTMP, O_WRONLY | O_APPEND | O_BINARY, 0)) >= 0)
- {
- (void) write (fd, (char *) ut, sizeof (struct utmp));
- (void) close (fd);
- }
-}
-
-/* It isn't possible to use unix-style I/O function in logout code because
-cygwin's I/O subsystem may be inaccessible at logout () call time.
-FIXME (cgf): huh?
-*/
-extern "C" int
-logout (char *line)
-{
- sigframe thisframe (mainthread);
- int res = 0;
- HANDLE ut_fd;
- static const char path_utmp[] = _PATH_UTMP;
-
- path_conv win32_path (path_utmp);
- if (win32_path.error)
- return 0;
-
- ut_fd = CreateFile (win32_path.get_win32 (),
- GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- &sec_none_nih, OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL, NULL);
- if (ut_fd != INVALID_HANDLE_VALUE)
- {
- struct utmp *ut;
- struct utmp ut_buf[100];
- /* FIXME: utmp file access is not 64 bit clean for now. */
- __off32_t pos = 0; /* Position in file */
- DWORD rd;
-
- while (!res && ReadFile (ut_fd, ut_buf, sizeof ut_buf, &rd, NULL)
- && rd != 0)
- {
- struct utmp *ut_end = (struct utmp *) ((char *) ut_buf + rd);
-
- for (ut = ut_buf; ut < ut_end; ut++, pos += sizeof (*ut))
- if (ut->ut_name[0]
- && strncmp (ut->ut_line, line, sizeof (ut->ut_line)) == 0)
- /* Found the entry for LINE; mark it as logged out. */
- {
- /* Zero out entries describing who's logged in. */
- bzero (ut->ut_name, sizeof (ut->ut_name));
- bzero (ut->ut_host, sizeof (ut->ut_host));
- time (&ut->ut_time);
-
- /* Now seek back to the position in utmp at which UT occured,
- and write the new version of UT there. */
- if ((SetFilePointer (ut_fd, pos, 0, FILE_BEGIN) != 0xFFFFFFFF)
- && (WriteFile (ut_fd, (char *) ut, sizeof (*ut),
- &rd, NULL)))
- {
- res = 1;
- break;
- }
- }
- }
-
- CloseHandle (ut_fd);
- }
-
- return res;
-}
-
-static int utmp_fd = -2;
-static char *utmp_file = (char *) _PATH_UTMP;
-
-static struct utmp utmp_data;
-
-extern "C" void
-setutent ()
-{
- sigframe thisframe (mainthread);
- if (utmp_fd == -2)
- {
- utmp_fd = open (utmp_file, O_RDWR);
- }
- lseek (utmp_fd, 0, SEEK_SET);
-}
-
-extern "C" void
-endutent ()
-{
- sigframe thisframe (mainthread);
- if (utmp_fd != -2)
- {
- close (utmp_fd);
- utmp_fd = -2;
- }
-}
-
-extern "C" void
-utmpname (_CONST char *file)
-{
- sigframe thisframe (mainthread);
- if (check_null_empty_str (file))
- {
- debug_printf ("Invalid file");
- return;
- }
- endutent ();
- utmp_file = strdup (file);
- debug_printf ("New UTMP file: %s", utmp_file);
-}
-
-extern "C" struct utmp *
-getutent ()
-{
- sigframe thisframe (mainthread);
- if (utmp_fd == -2)
- setutent ();
- if (read (utmp_fd, &utmp_data, sizeof (utmp_data)) != sizeof (utmp_data))
- return NULL;
- return &utmp_data;
-}
-
-extern "C" struct utmp *
-getutid (struct utmp *id)
-{
- sigframe thisframe (mainthread);
- if (check_null_invalid_struct_errno (id))
- return NULL;
- while (read (utmp_fd, &utmp_data, sizeof (utmp_data)) == sizeof (utmp_data))
- {
- switch (id->ut_type)
- {
- case RUN_LVL:
- case BOOT_TIME:
- case OLD_TIME:
- case NEW_TIME:
- if (id->ut_type == utmp_data.ut_type)
- return &utmp_data;
- break;
- case INIT_PROCESS:
- case LOGIN_PROCESS:
- case USER_PROCESS:
- case DEAD_PROCESS:
- if (strncmp (id->ut_id, utmp_data.ut_id, UT_IDLEN) == 0)
- return &utmp_data;
- break;
- default:
- return NULL;
- }
- }
- return NULL;
-}
-
-extern "C" struct utmp *
-getutline (struct utmp *line)
-{
- sigframe thisframe (mainthread);
- if (check_null_invalid_struct_errno (line))
- return NULL;
- while (read (utmp_fd, &utmp_data, sizeof (utmp_data)) == sizeof (utmp_data))
- {
- if ((utmp_data.ut_type == LOGIN_PROCESS ||
- utmp_data.ut_type == USER_PROCESS) &&
- !strncmp (utmp_data.ut_line, line->ut_line,
- sizeof (utmp_data.ut_line)))
- return &utmp_data;
- }
- return NULL;
-}
-
-extern "C" void
-pututline (struct utmp *ut)
-{
- sigframe thisframe (mainthread);
- if (check_null_invalid_struct (ut))
- return;
- setutent ();
- struct utmp *u;
- if ((u = getutid (ut)))
- lseek (utmp_fd, -sizeof(struct utmp), SEEK_CUR);
- else
- lseek (utmp_fd, 0, SEEK_END);
- (void) write (utmp_fd, (char *) ut, sizeof (struct utmp));
-}
diff --git a/winsup/cygwin/sysconf.cc b/winsup/cygwin/sysconf.cc
deleted file mode 100644
index f0f49778d..000000000
--- a/winsup/cygwin/sysconf.cc
+++ /dev/null
@@ -1,102 +0,0 @@
-/* sysconf.cc
-
- 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 <unistd.h>
-#include <errno.h>
-#include <time.h>
-#include <limits.h>
-#include <ntdef.h>
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygerrno.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:
- return getdtablesize ();
- 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:
- 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:
- case _SC_AVPHYS_PAGES:
- if (wincap.supports_smp ())
- {
- NTSTATUS ret;
- SYSTEM_BASIC_INFORMATION sbi;
- if ((ret = NtQuerySystemInformation (SystemBasicInformation,
- (PVOID) &sbi,
- sizeof sbi, NULL))
- != STATUS_SUCCESS)
- {
- __seterrno_from_win_error (RtlNtStatusToDosError (ret));
- debug_printf ("NtQuerySystemInformation: ret = %d, "
- "Dos(ret) = %d",
- ret, RtlNtStatusToDosError (ret));
- return -1;
- }
- switch (in)
- {
- case _SC_NPROCESSORS_CONF:
- return sbi.NumberProcessors;
- case _SC_NPROCESSORS_ONLN:
- return sbi.ActiveProcessors;
- case _SC_PHYS_PAGES:
- return sbi.NumberOfPhysicalPages;
- case _SC_AVPHYS_PAGES:
- return sbi.HighestPhysicalPage - sbi.LowestPhysicalPage + 1;
- }
- }
- break;
- }
-
- /* 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 f424a4f4e..000000000
--- a/winsup/cygwin/syslog.cc
+++ /dev/null
@@ -1,412 +0,0 @@
-/* syslog.cc
-
- Copyright 1996, 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. */
-
-#include "winsup.h"
-#include <stdlib.h>
-#include <stdio.h>
-#include <syslog.h>
-#include <stdarg.h>
-#include <unistd.h>
-#include <errno.h>
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygerrno.h"
-#include "cygheap.h"
-#include "thread.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;
-}
-
-/* FIXME: For MT safe code these will need to be replaced */
-
-#ifdef _MT_SAFE
-#define process_ident _reent_winsup ()->_process_ident
-#define process_logopt _reent_winsup ()->_process_logopt
-#define process_facility _reent_winsup ()->_process_facility
- /* Default priority logmask */
-#define process_logmask _reent_winsup ()->_process_logmask
-#else
-static char *process_ident = 0;
-static int process_logopt = 0;
-static int process_facility = 0;
-
-/* Default priority logmask */
-static int process_logmask = LOG_UPTO (LOG_DEBUG);
-#endif
-
-/*
- * 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 : "<NULL>", logopt, facility);
-
- if (process_ident != NULL)
- {
- free (process_ident);
- process_ident = 0;
- }
- if (ident)
- {
- process_ident = (char *) malloc (strlen (ident) + 1);
- if (process_ident == NULL)
- {
- debug_printf ("failed to allocate memory for process_ident");
- return;
- }
- strcpy (process_ident, ident);
- }
- process_logopt = logopt;
- 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 process_logmask;
-
- int old_mask = process_logmask;
- process_logmask = maskpri & LOG_PRIMASK;
-
- 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");
- 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;
-}
-
-/*
- * 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
-syslog (int priority, const char *message, ...)
-{
- debug_printf ("%x %s", priority, message);
- /* If the priority fails the current mask, reject */
- if (((priority & LOG_PRIMASK) & process_logmask) == 0)
- {
- debug_printf ("failing message %x due to priority mask %x",
- priority, process_logmask);
- return;
- }
-
- /* 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 :-).
- */
- va_list ap;
-
- 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 (process_ident != NULL)
- {
- if (pass.print ("%s : ", process_ident) == -1)
- return;
- }
- if (process_logopt & LOG_PID)
- {
- if (pass.print ("Win32 Process Id = 0x%X : Cygwin Process Id = 0x%X : ",
- GetCurrentProcessId (), 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 */
- va_start (ap, message);
- if (pass.print_va (message, ap) == -1)
- return;
- va_end (ap);
-
- }
- 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 - 1] = '\0';
-
- msg_strings[0] = total_msg;
-
- if (wincap.has_eventlog ())
- {
- /* For NT, open the event log and send the message */
- HANDLE hEventSrc = RegisterEventSourceA (NULL, (process_ident != NULL) ?
- process_ident : CYGWIN_LOG_NAME);
- if (hEventSrc == NULL)
- {
- debug_printf ("RegisterEventSourceA failed with %E");
- return;
- }
- ReportEventA (hEventSrc, eventType, 0, 0,
- cygheap->user.sid (), 1, 0, msg_strings, NULL);
- DeregisterEventSource (hEventSrc);
- }
- else
- {
- /* Under Windows 95, append the message to the log file */
- 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;
- }
- /* 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 ();
- if (LockFile (fHandle, 0, 0, 1, 0) == FALSE)
- {
- debug_printf ("failed to lock file %s", get_win95_event_log_path ());
- fclose (fp);
- return;
- }
- fputs (msg_strings[0], fp);
- fputc ('\n', fp);
- UnlockFile (fHandle, 0, 0, 1, 0);
- if (ferror (fp))
- {
- debug_printf ("error in writing syslog");
- }
- fclose (fp);
- }
-}
-
-extern "C"
-void
-closelog (void)
-{
- ;
-}
diff --git a/winsup/cygwin/termios.cc b/winsup/cygwin/termios.cc
deleted file mode 100644
index 13b5e5251..000000000
--- a/winsup/cygwin/termios.cc
+++ /dev/null
@@ -1,269 +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 <errno.h>
-#include <signal.h>
-#include <stdlib.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "cygwin/version.h"
-#include "perprocess.h"
-#include "sigproc.h"
-#include <sys/termios.h>
-
-/* 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 ((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)
- {
- sigframe thisframe (mainthread);
-
- 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);
- else
- e = get_errno ();
- break;
- case bg_signalled:
- if (thisframe.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)
- (void) __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;
-}
-
-/* cfsetospeed: POSIX96 7.1.3.1 */
-extern "C" int
-cfsetospeed (struct termios *in_tp, speed_t speed)
-{
- struct termios *tp = __tonew_termios (in_tp);
- tp->c_ospeed = speed;
- (void) __toapp_termios (in_tp, tp);
- return 0;
-}
-
-/* cfsetispeed: POSIX96 7.1.3.1 */
-extern "C" int
-cfsetispeed (struct termios *in_tp, speed_t speed)
-{
- struct termios *tp = __tonew_termios (in_tp);
- tp->c_ispeed = speed;
- (void) __toapp_termios (in_tp, tp);
- return 0;
-}
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 <windows.h>
-#include <sys/fcntl.h>
-#include <sys/cygwin.h>
-
-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/thread.cc b/winsup/cygwin/thread.cc
deleted file mode 100644
index 2aac4b3b3..000000000
--- a/winsup/cygwin/thread.cc
+++ /dev/null
@@ -1,2735 +0,0 @@
-/* thread.cc: Locking and threading module functions
-
- Copyright 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
-
- Originally written by Marco Fuykschot <marco@ddi.nl>
- Substantialy enhanced by Robert Collins <rbtcollins@hotmail.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. */
-
-/* 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
-
-#ifdef _MT_SAFE
-#include "winsup.h"
-#include <limits.h>
-#include <errno.h>
-#include "cygerrno.h"
-#include <assert.h>
-#include <stdlib.h>
-#include <syslog.h>
-#include "pinfo.h"
-#include "perprocess.h"
-#include "security.h"
-#include <semaphore.h>
-#include <stdio.h>
-#include <sys/timeb.h>
-
-extern int threadsafe;
-
-struct _reent *
-_reent_clib ()
-{
- struct __reent_t *_r =
- (struct __reent_t *) MT_INTERFACE->reent_key.get ();
-
-#ifdef _CYG_THREAD_FAILSAFE
- if (_r == 0)
- system_printf ("local thread storage not inited");
-#endif
- return _r->_clib;
-}
-
-struct _winsup_t *
-_reent_winsup ()
-{
- struct __reent_t *_r =
- (struct __reent_t *) MT_INTERFACE->reent_key.get ();
-
-#ifdef _CYG_THREAD_FAILSAFE
- if (_r == 0)
- system_printf ("local thread storage not inited");
-#endif
- return _r->_winsup;
-}
-
-bool
-nativeMutex::init ()
-{
- theHandle = CreateMutex (&sec_none_nih, FALSE, NULL);
- if (!theHandle)
- {
- debug_printf ("CreateMutex failed. %E");
- return false;
- }
- return true;
-}
-
-bool
-nativeMutex::lock ()
-{
- DWORD waitResult = WaitForSingleObject (theHandle, INFINITE);
- if (waitResult != WAIT_OBJECT_0)
- {
- system_printf ("Received unexpected wait result %d on handle %p, %E", waitResult, theHandle);
- return false;
- }
- return true;
-}
-
-void
-nativeMutex::unlock ()
-{
- if (!ReleaseMutex (theHandle))
- system_printf ("Received a unexpected result releasing mutex. %E");
-}
-
-inline LPCRITICAL_SECTION
-ResourceLocks::Lock (int _resid)
-{
-#ifdef _CYG_THREAD_FAILSAFE
- if (!inited)
- system_printf ("lock called before initialization");
-
- thread_printf
- ("Get Resource lock %d ==> %p for %p , real : %d , threadid %d ", _resid,
- &lock, user_data, myself->pid, GetCurrentThreadId ());
-#endif
- return &lock;
-}
-
-void
-SetResourceLock (int _res_id, int _mode, const char *_function)
-{
-#ifdef _CYG_THREAD_FAILSAFE
- thread_printf ("Set resource lock %d mode %d for %s start",
- _res_id, _mode, _function);
-#endif
- EnterCriticalSection (user_data->resourcelocks->Lock (_res_id));
-
-#ifdef _CYG_THREAD_FAILSAFE
- user_data->resourcelocks->owner = GetCurrentThreadId ();
- user_data->resourcelocks->count++;
-#endif
-}
-
-void
-ReleaseResourceLock (int _res_id, int _mode, const char *_function)
-{
-#ifdef _CYG_THREAD_FAILSAFE
- thread_printf ("Release resource lock %d mode %d for %s done", _res_id,
- _mode, _function);
-
- AssertResourceOwner (_res_id, _mode);
- user_data->resourcelocks->count--;
- if (user_data->resourcelocks->count == 0)
- user_data->resourcelocks->owner = 0;
-#endif
-
- LeaveCriticalSection (user_data->resourcelocks->Lock (_res_id));
-}
-
-#ifdef _CYG_THREAD_FAILSAFE
-void
-AssertResourceOwner (int _res_id, int _mode)
-{
-
- thread_printf
- ("Assert Resource lock %d ==> for %p , real : %d , threadid %d count %d owner %d",
- _res_id, user_data, myself->pid, GetCurrentThreadId (),
- user_data->resourcelocks->count, user_data->resourcelocks->owner);
- if (user_data && (user_data->resourcelocks->owner != GetCurrentThreadId ()))
- system_printf ("assertion failed, not the resource owner");
-}
-
-#endif
-
-void
-ResourceLocks::Init ()
-{
- InitializeCriticalSection (&lock);
- inited = true;
-
-#ifdef _CYG_THREAD_FAILSAFE
- owner = 0;
- count = 0;
-#endif
-
- 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 (int forked)
-{
- reents._clib = _impure_ptr;
- reents._winsup = &winsup_reent;
- winsup_reent._process_logmask = LOG_UPTO (LOG_DEBUG);
-
- if (!forked)
- reent_key.set (&reents);
-
- pthread_mutex::initMutex ();
- pthread_cond::initMutex ();
-}
-
-void
-MTinterface::fixup_before_fork (void)
-{
- pthread_key::fixup_before_fork ();
-}
-
-/* This function is called from a single threaded process */
-void
-MTinterface::fixup_after_fork (void)
-{
- pthread_key::fixup_after_fork ();
- pthread_mutex *mutex = mutexs;
- debug_printf ("mutexs is %x",mutexs);
- while (mutex)
- {
- mutex->fixup_after_fork ();
- mutex = mutex->next;
- }
- pthread_cond *cond = conds;
- debug_printf ("conds is %x",conds);
- while (cond)
- {
- cond->fixup_after_fork ();
- cond = cond->next;
- }
- semaphore *sem = semaphores;
- debug_printf ("semaphores is %x",semaphores);
- while (sem)
- {
- sem->fixup_after_fork ();
- sem = sem->next;
- }
-
- pthread::initMainThread (true);
-
- threadcount = 1;
-}
-
-/* pthread calls */
-
-/* static methods */
-void
-pthread::initMainThread (bool do_init)
-{
- if (!do_init)
- return;
-
- pthread *thread = getTlsSelfPointer ();
- if (!thread)
- {
- thread = new pthread ();
- if (!thread)
- api_fatal ("failed to create mainthread object");
- }
-
- thread->initCurrentThread ();
-}
-
-pthread *
-pthread::self ()
-{
- pthread *thread = getTlsSelfPointer ();
- if (thread)
- return thread;
- return pthreadNull::getNullpthread ();
-}
-
-void
-pthread::setTlsSelfPointer (pthread *thisThread)
-{
- MT_INTERFACE->thread_self_key.set (thisThread);
-}
-
-pthread *
-pthread::getTlsSelfPointer ()
-{
- return (pthread *) MT_INTERFACE->thread_self_key.get ();
-}
-
-
-
-/* member methods */
-pthread::pthread ():verifyable_object (PTHREAD_MAGIC), win32_obj_id (0),
- cancelstate (0), canceltype (0), cancel_event (0),
- joiner (NULL), cleanup_stack (NULL)
-{
-}
-
-pthread::~pthread ()
-{
- if (win32_obj_id)
- CloseHandle (win32_obj_id);
- if (cancel_event)
- CloseHandle (cancel_event);
-}
-
-void
-pthread::setThreadIdtoCurrent ()
-{
- thread_id = GetCurrentThreadId ();
-}
-
-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::isGoodObject (&verifyable_mutex_obj))
- {
- thread_printf ("New thread object access mutex is not valid. this %p",
- this);
- magic = 0;
- return;
- }
-
- cancel_event = ::CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
- if (!cancel_event)
- {
- system_printf ("couldn't create cancel event, this %p LastError %E", this);
- /* we need the event for correct behaviour */
- magic = 0;
- return;
- }
-}
-
-void
-pthread::create (void *(*func) (void *), pthread_attr *newattr,
- void *threadarg)
-{
- precreate (newattr);
- if (!magic)
- return;
- function = func;
- arg = threadarg;
-
- win32_obj_id = ::CreateThread (&sec_none_nih, attr.stacksize,
- (LPTHREAD_START_ROUTINE) thread_init_wrapper,
- this, CREATE_SUSPENDED, &thread_id);
-
- if (!win32_obj_id)
- {
- thread_printf ("CreateThread failed: this %p LastError %E", this);
- magic = 0;
- }
- else {
- postcreate ();
- ResumeThread (win32_obj_id);
- }
-}
-
-void
-pthread::postcreate ()
-{
- 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::runAllDestructors ();
-
- mutex.Lock ();
- // cleanup if thread is in detached state and not joined
- if (__pthread_equal (&joiner, &thread))
- delete this;
- else
- {
- return_ptr = value_ptr;
- mutex.UnLock ();
- }
-
- if (InterlockedDecrement (&MT_INTERFACE->threadcount) == 0)
- ::exit (0);
- else
- ExitThread (0);
-}
-
-int
-pthread::cancel (void)
-{
- class pthread *thread = this;
- class pthread *self = pthread::self ();
-
- mutex.Lock ();
-
- if (canceltype == PTHREAD_CANCEL_DEFERRED ||
- cancelstate == PTHREAD_CANCEL_DISABLE)
- {
- // cancel deferred
- mutex.UnLock ();
- SetEvent (cancel_event);
- return 0;
- }
-
- else if (__pthread_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 (void)
-{
- if (cancelstate == PTHREAD_CANCEL_DISABLE)
- return;
-
- if (WAIT_OBJECT_0 == WaitForSingleObject (cancel_event, 0))
- cancel_self ();
-}
-
-void
-pthread::static_cancel_self (void)
-{
- pthread::self ()->cancel_self ();
-}
-
-
-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;
- InterlockedExchangePointer (&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::getThreadId ()
-{
- return thread_id;
-}
-
-void
-pthread::initCurrentThread ()
-{
- cancel_event = ::CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
- if (!DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
- GetCurrentProcess (), &win32_obj_id,
- 0, FALSE, DUPLICATE_SAME_ACCESS))
- win32_obj_id = NULL;
- setThreadIdtoCurrent ();
- setTlsSelfPointer (this);
-}
-
-/* static members */
-bool
-pthread_attr::isGoodObject (pthread_attr_t const *attr)
-{
- if (verifyable_object_isvalid (attr, PTHREAD_ATTR_MAGIC) != VALID_OBJECT)
- return false;
- return true;
-}
-
-/* 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 ()
-{
-}
-
-bool
-pthread_condattr::isGoodObject (pthread_condattr_t const *attr)
-{
- if (verifyable_object_isvalid (attr, PTHREAD_CONDATTR_MAGIC) != VALID_OBJECT)
- return false;
- return true;
-}
-
-pthread_condattr::pthread_condattr ():verifyable_object
- (PTHREAD_CONDATTR_MAGIC), shared (PTHREAD_PROCESS_PRIVATE)
-{
-}
-
-pthread_condattr::~pthread_condattr ()
-{
-}
-
-/* This is used for cond creation protection within a single process only */
-nativeMutex NO_COPY pthread_cond::condInitializationLock;
-
-/* We can only be called once.
- TODO: (no rush) use a non copied memory section to
- hold an initialization flag. */
-void
-pthread_cond::initMutex ()
-{
- if (!condInitializationLock.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)
-{
- int temperr;
- this->shared = attr ? attr->shared : PTHREAD_PROCESS_PRIVATE;
- this->mutex = NULL;
- this->waiting = 0;
-
- this->win32_obj_id = ::CreateEvent (&sec_none_nih, false, /* auto signal reset - which I think is pthreads like ? */
- false, /* start non signaled */
- NULL /* no name */);
- /* TODO: make a shared mem mutex if out attributes request shared mem cond */
- cond_access = NULL;
- if ((temperr = pthread_mutex_init (&this->cond_access, NULL)))
- {
- system_printf ("couldn't init mutex, this %p errno %d", this, temperr);
- /* we need the mutex for correct behaviour */
- magic = 0;
- }
-
- if (!this->win32_obj_id)
- magic = 0;
- /* threadsafe addition is easy */
- next = (pthread_cond *) InterlockedExchangePointer (&MT_INTERFACE->conds, this);
-}
-
-pthread_cond::~pthread_cond ()
-{
- if (win32_obj_id)
- CloseHandle (win32_obj_id);
- pthread_mutex_destroy (&cond_access);
- /* I'm not 100% sure the next bit is threadsafe. I think it is... */
- if (MT_INTERFACE->conds == this)
- InterlockedExchangePointer (&MT_INTERFACE->conds, this->next);
- else
- {
- pthread_cond *tempcond = MT_INTERFACE->conds;
- while (tempcond->next && tempcond->next != this)
- tempcond = tempcond->next;
- /* but there may be a race between the loop above and this statement */
- InterlockedExchangePointer (&tempcond->next, this->next);
- }
-}
-
-void
-pthread_cond::BroadCast ()
-{
- /* TODO: implement the same race fix as Signal has */
- if (pthread_mutex_lock (&cond_access))
- system_printf ("Failed to lock condition variable access mutex, this %p", this);
- int count = waiting;
- if (!pthread_mutex::isGoodObject (&mutex))
- {
- if (pthread_mutex_unlock (&cond_access))
- system_printf ("Failed to unlock condition variable access mutex, this %p", this);
- /* This isn't and API error - users are allowed to call this when no threads
- are waiting
- system_printf ("Broadcast called with invalid mutex");
- */
- return;
- }
- while (count--)
- PulseEvent (win32_obj_id);
- if (pthread_mutex_unlock (&cond_access))
- system_printf ("Failed to unlock condition variable access mutex, this %p", this);
-}
-
-void
-pthread_cond::Signal ()
-{
- if (pthread_mutex_lock (&cond_access))
- system_printf ("Failed to lock condition variable access mutex, this %p", this);
- if (!pthread_mutex::isGoodObject (&mutex))
- {
- if (pthread_mutex_unlock (&cond_access))
- system_printf ("Failed to unlock condition variable access mutex, this %p",
- this);
- return;
- }
- int temp = waiting;
- if (!temp)
- /* nothing to signal */
- {
- if (pthread_mutex_unlock (&cond_access))
- system_printf ("Failed to unlock condition variable access mutex, this %p", this);
- return;
- }
- /* Prime the detection flag */
- ExitingWait = 1;
- /* Signal any waiting thread */
- PulseEvent (win32_obj_id);
- /* No one can start waiting until we release the condition access mutex */
- /* The released thread will decrement waiting when it gets a time slice...
- without waiting for the access mutex
- * InterLockedIncrement on 98 +, NT4 + returns the incremented value.
- * On 95, nt 3.51 < it returns a sign correct number - 0=0, + for greater than 0, -
- * for less than 0.
- * Because of this we cannot spin on the waiting count, but rather we need a
- * dedicated flag for a thread exiting the Wait function.
- * Also not that Interlocked* sync CPU caches with memory.
- */
- int spins = 10;
- /* When ExitingWait is nonzero after a decrement, the leaving thread has
- * done it's thing
- */
- while (InterlockedDecrement (&ExitingWait) == 0 && spins)
- {
- InterlockedIncrement (&ExitingWait);
- /* give up the cpu to force a context switch. */
- low_priority_sleep (0);
- if (spins == 5)
- /* we've had 5 timeslices, and the woken thread still hasn't done it's
- * thing - maybe we raced it with the event? */
- PulseEvent (win32_obj_id);
- spins--;
- }
- if (waiting + 1 != temp)
- system_printf ("Released too many threads - %d now %d originally", waiting, temp);
- if (pthread_mutex_unlock (&cond_access))
- system_printf ("Failed to unlock condition variable access mutex, this %p", this);
-}
-
-int
-pthread_cond::TimedWait (DWORD dwMilliseconds)
-{
- DWORD rv;
-
- // FIXME: race condition (potentially drop events
- // Possible solution (single process only) - place this in a critical section.
- mutex->UnLock ();
- rv = WaitForSingleObject (win32_obj_id, dwMilliseconds);
-#if 0
- /* we need to use native win32 mutex's here, because the cygwin ones now use
- * critical sections, which are faster, but introduce a race _here_. Until then
- * The NT variant of the code is redundant.
- */
-
- rv = SignalObjectAndWait (mutex->win32_obj_id, win32_obj_id, dwMilliseconds,
- false);
-#endif
- switch (rv)
- {
- case WAIT_FAILED:
- return 0; /* POSIX doesn't allow errors after we modify the mutex state */
- case WAIT_ABANDONED:
- case WAIT_TIMEOUT:
- return ETIMEDOUT;
- case WAIT_OBJECT_0:
- return 0; /* we have been signaled */
- default:
- return 0;
- }
-}
-
-void
-pthread_cond::fixup_after_fork ()
-{
- debug_printf ("cond %x in fixup_after_fork", this);
- if (shared != PTHREAD_PROCESS_PRIVATE)
- api_fatal ("doesn't understand PROCESS_SHARED condition variables");
- /* FIXME: duplicate code here and in the constructor. */
- this->win32_obj_id = ::CreateEvent (&sec_none_nih, false, false, NULL);
- if (!win32_obj_id)
- api_fatal ("failed to create new win32 mutex");
-#if DETECT_BAD_APPS
- if (waiting)
- api_fatal ("Forked () while a condition variable has waiting threads.\nReport to cygwin@cygwin.com");
-#else
- waiting = 0;
- mutex = NULL;
-#endif
-}
-
-/* pthread_key */
-/* static members */
-/* This stores pthread_key information across fork() boundaries */
-List<pthread_key> pthread_key::keys;
-
-void
-pthread_key::saveAKey (pthread_key *key)
-{
- key->saveKeyToBuffer ();
-}
-
-void
-pthread_key::fixup_before_fork ()
-{
- keys.forEach (saveAKey);
-}
-
-void
-pthread_key::restoreAKey (pthread_key *key)
-{
- key->recreateKeyFromBuffer ();
-}
-
-void
-pthread_key::fixup_after_fork ()
-{
- keys.forEach (restoreAKey);
-}
-
-void
-pthread_key::destroyAKey (pthread_key *key)
-{
- key->run_destructor ();
-}
-
-void
-pthread_key::runAllDestructors ()
-{
- keys.forEach (destroyAKey);
-}
-
-bool
-pthread_key::isGoodObject (pthread_key_t const *key)
-{
- if (verifyable_object_isvalid (key, PTHREAD_KEY_MAGIC) != VALID_OBJECT)
- return false;
- return true;
-}
-
-/* non-static members */
-
-pthread_key::pthread_key (void (*aDestructor) (void *)):verifyable_object (PTHREAD_KEY_MAGIC), destructor (aDestructor)
-{
- dwTlsIndex = TlsAlloc ();
- if (dwTlsIndex == 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 (dwTlsIndex);
- }
-}
-
-int
-pthread_key::set (const void *value)
-{
- /* the OS function doesn't perform error checking */
- TlsSetValue (dwTlsIndex, (void *) value);
- return 0;
-}
-
-void *
-pthread_key::get () const
-{
- int savedError = ::GetLastError ();
- void *result = TlsGetValue (dwTlsIndex);
- ::SetLastError (savedError);
- return result;
-}
-
-void
-pthread_key::saveKeyToBuffer ()
-{
- fork_buf = get ();
-}
-
-void
-pthread_key::recreateKeyFromBuffer ()
-{
- dwTlsIndex = TlsAlloc ();
- if (dwTlsIndex == TLS_OUT_OF_INDEXES)
- api_fatal ("pthread_key::recreateKeyFromBuffer () 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 */
-bool
-pthread_mutex::isGoodObject (pthread_mutex_t const *mutex)
-{
- if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC) != VALID_OBJECT)
- return false;
- return true;
-}
-
-bool
-pthread_mutex::isGoodInitializer (pthread_mutex_t const *mutex)
-{
- if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC, PTHREAD_MUTEX_INITIALIZER) != VALID_STATIC_OBJECT)
- return false;
- return true;
-}
-
-bool
-pthread_mutex::isGoodInitializerOrObject (pthread_mutex_t const *mutex)
-{
- if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC, PTHREAD_MUTEX_INITIALIZER) == INVALID_OBJECT)
- return false;
- return true;
-}
-
-bool
-pthread_mutex::isGoodInitializerOrBadObject (pthread_mutex_t const *mutex)
-{
- verifyable_object_state objectState = verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC, PTHREAD_MUTEX_INITIALIZER);
- if (objectState == VALID_OBJECT)
- return false;
- return true;
-}
-
-/* This is used for mutex creation protection within a single process only */
-nativeMutex NO_COPY pthread_mutex::mutexInitializationLock;
-
-/* We can only be called once.
- TODO: (no rush) use a non copied memory section to
- hold an initialization flag. */
-void
-pthread_mutex::initMutex ()
-{
- if (!mutexInitializationLock.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 (MUTEX_LOCK_COUNTER_INITIAL),
- win32_obj_id (NULL), recursion_counter (0),
- condwaits (0), owner (NULL), type (PTHREAD_MUTEX_DEFAULT),
- 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;
- }
-
- /* threadsafe addition is easy */
- next = (pthread_mutex *) InterlockedExchangePointer (&MT_INTERFACE->mutexs, this);
-}
-
-pthread_mutex::~pthread_mutex ()
-{
- if (win32_obj_id)
- CloseHandle (win32_obj_id);
-
- /* I'm not 100% sure the next bit is threadsafe. I think it is... */
- if (MT_INTERFACE->mutexs == this)
- /* TODO: printf an error if the return value != this */
- InterlockedExchangePointer (&MT_INTERFACE->mutexs, next);
- else
- {
- pthread_mutex *tempmutex = MT_INTERFACE->mutexs;
- while (tempmutex->next && tempmutex->next != this)
- tempmutex = tempmutex->next;
- /* but there may be a race between the loop above and this statement */
- /* TODO: printf an error if the return value != this */
- InterlockedExchangePointer (&tempmutex->next, this->next);
- }
-}
-
-int
-pthread_mutex::Lock ()
-{
- int result = 0;
- pthread_t self = pthread::self ();
-
- if (0 == InterlockedIncrement (&lock_counter))
- SetOwner ();
- else if (__pthread_equal (&owner, &self))
- {
- InterlockedDecrement (&lock_counter);
- if (PTHREAD_MUTEX_RECURSIVE == type)
- result = LockRecursive ();
- else
- result = EDEADLK;
- }
- else
- {
- WaitForSingleObject (win32_obj_id, INFINITE);
- SetOwner ();
- }
-
- return result;
-}
-
-/* returns non-zero on failure */
-int
-pthread_mutex::TryLock ()
-{
- int result = 0;
- pthread_t self = pthread::self ();
-
- if (MUTEX_LOCK_COUNTER_INITIAL ==
- InterlockedCompareExchange (&lock_counter, 0, MUTEX_LOCK_COUNTER_INITIAL ))
- SetOwner ();
- else if (__pthread_equal (&owner, &self) && PTHREAD_MUTEX_RECURSIVE == type)
- result = LockRecursive ();
- else
- result = EBUSY;
-
- return result;
-}
-
-int
-pthread_mutex::UnLock ()
-{
- pthread_t self = pthread::self ();
-
- if (!__pthread_equal (&owner, &self))
- return EPERM;
-
- if (0 == --recursion_counter)
- {
- owner = NULL;
- if (MUTEX_LOCK_COUNTER_INITIAL != InterlockedDecrement (&lock_counter))
- // Another thread is waiting
- ::ReleaseSemaphore (win32_obj_id, 1, NULL);
- }
-
- return 0;
-}
-
-int
-pthread_mutex::Destroy ()
-{
- if (condwaits || TryLock ())
- // 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::SetOwner ()
-{
- recursion_counter = 1;
- owner = pthread::self ();
-}
-
-int
-pthread_mutex::LockRecursive ()
-{
- if (UINT_MAX == recursion_counter)
- return EAGAIN;
- ++recursion_counter;
- 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 (NULL == owner)
- /* mutex has no owner, reset to initial */
- lock_counter = MUTEX_LOCK_COUNTER_INITIAL;
- else if (lock_counter != MUTEX_LOCK_COUNTER_INITIAL)
- /* All waiting threads are gone after a fork */
- lock_counter = 0;
-
- 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");
-
-#if DETECT_BAD_APPS
- if (condwaits)
- api_fatal ("Forked () while a mutex has condition variables waiting on it.\nReport to cygwin@cygwin.com");
-#else
- condwaits = 0;
-#endif
-}
-
-bool
-pthread_mutexattr::isGoodObject (pthread_mutexattr_t const * attr)
-{
- if (verifyable_object_isvalid (attr, PTHREAD_MUTEXATTR_MAGIC) != VALID_OBJECT)
- return false;
- return true;
-}
-
-pthread_mutexattr::pthread_mutexattr ():verifyable_object (PTHREAD_MUTEXATTR_MAGIC),
-pshared (PTHREAD_PROCESS_PRIVATE), mutextype (PTHREAD_MUTEX_DEFAULT)
-{
-}
-
-pthread_mutexattr::~pthread_mutexattr ()
-{
-}
-
-semaphore::semaphore (int pshared, unsigned int value):verifyable_object (SEM_MAGIC)
-{
- this->win32_obj_id = ::CreateSemaphore (&sec_none_nih, value, LONG_MAX,
- NULL);
- if (!this->win32_obj_id)
- magic = 0;
- this->shared = pshared;
- currentvalue = value;
- /* threadsafe addition is easy */
- next = (semaphore *) InterlockedExchangePointer (&MT_INTERFACE->semaphores, this);
-}
-
-semaphore::~semaphore ()
-{
- if (win32_obj_id)
- CloseHandle (win32_obj_id);
- /* I'm not 100% sure the next bit is threadsafe. I think it is... */
- if (MT_INTERFACE->semaphores == this)
- InterlockedExchangePointer (&MT_INTERFACE->semaphores, this->next);
- else
- {
- semaphore *tempsem = MT_INTERFACE->semaphores;
- while (tempsem->next && tempsem->next != this)
- tempsem = tempsem->next;
- /* but there may be a race between the loop above and this statement */
- InterlockedExchangePointer (&tempsem->next, this->next);
- }
-}
-
-void
-semaphore::Post ()
-{
- /* we can't use the currentvalue, because the wait functions don't let us access it */
- ReleaseSemaphore (win32_obj_id, 1, NULL);
- currentvalue++;
-}
-
-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;
-}
-
-void
-semaphore::Wait ()
-{
- WaitForSingleObject (win32_obj_id, INFINITE);
- currentvalue--;
-}
-
-void
-semaphore::fixup_after_fork ()
-{
- debug_printf ("sem %x in fixup_after_fork", this);
- if (shared != PTHREAD_PROCESS_PRIVATE)
- api_fatal ("doesn't understand PROCESS_SHARED semaphores variables");
- /* 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");
-}
-
-verifyable_object::verifyable_object (long verifyer):
-magic (verifyer)
-{
-}
-
-verifyable_object::~verifyable_object ()
-{
- magic = 0;
-}
-
-/* Generic memory acccess routine - where should it live ? */
-int __stdcall
-check_valid_pointer (void const *pointer)
-{
- if (!pointer || IsBadWritePtr ((void *) pointer, sizeof (verifyable_object)))
- return EFAULT;
- return 0;
-}
-
-verifyable_object_state
-verifyable_object_isvalid (void const * objectptr, long magic, void *static_ptr)
-{
- verifyable_object **object = (verifyable_object **)objectptr;
- if (check_valid_pointer (object))
- return INVALID_OBJECT;
- if (static_ptr && *object == static_ptr)
- return VALID_STATIC_OBJECT;
- if (!*object)
- return INVALID_OBJECT;
- if (check_valid_pointer (*object))
- return INVALID_OBJECT;
- if ((*object)->magic != magic)
- return INVALID_OBJECT;
- return VALID_OBJECT;
-}
-
-verifyable_object_state
-verifyable_object_isvalid (void const * objectptr, long magic)
-{
- return verifyable_object_isvalid (objectptr, magic, NULL);
-}
-
-/* Pthreads */
-void *
-pthread::thread_init_wrapper (void *_arg)
-{
- // Setup the local/global storage of this thread
-
- pthread *thread = (pthread *) _arg;
- struct __reent_t local_reent;
- struct _winsup_t local_winsup;
- struct _reent local_clib = _REENT_INIT (local_clib);
-
- struct sigaction _sigs[NSIG];
- sigset_t _sig_mask; /* one set for everything to ignore. */
- LONG _sigtodo[NSIG + __SIGOFFSET];
-
- // setup signal structures
- thread->sigs = _sigs;
- thread->sigmask = &_sig_mask;
- thread->sigtodo = _sigtodo;
-
- memset (&local_winsup, 0, sizeof (struct _winsup_t));
-
- local_reent._clib = &local_clib;
- local_reent._winsup = &local_winsup;
-
- local_winsup._process_logmask = LOG_UPTO (LOG_DEBUG);
-
- MT_INTERFACE->reent_key.set (&local_reent);
-
- thread->setThreadIdtoCurrent ();
- setTlsSelfPointer (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 ();
-
-#ifdef _CYG_THREAD_FAILSAFE
- if (_REENT == _impure_ptr)
- system_printf ("local storage for thread isn't setup correctly");
-#endif
-
- thread_printf ("started thread %p %p %p %p %p %p", _arg, &local_clib,
- _impure_ptr, thread, thread->function, thread->arg);
-
- // call the user's thread
- void *ret = thread->function (thread->arg);
-
- thread->exit (ret);
-
-#if 0
-// ??? This code only runs if the thread exits by returning.
-// it's all now in __pthread_exit ();
-#endif
- /* never reached */
- return 0;
-}
-
-bool
-pthread::isGoodObject (pthread_t const *thread)
-{
- if (verifyable_object_isvalid (thread, PTHREAD_MAGIC) != VALID_OBJECT)
- return false;
- return true;
-}
-
-unsigned long
-pthread::getsequence_np ()
-{
- return getThreadId ();
-}
-
-int
-pthread::create (pthread_t *thread, const pthread_attr_t *attr,
- void *(*start_routine) (void *), void *arg)
-{
- DECLARE_TLS_STORAGE;
- if (attr && !pthread_attr::isGoodObject (attr))
- return EINVAL;
-
- *thread = new pthread ();
- (*thread)->create (start_routine, attr ? *attr : NULL, arg);
- if (!isGoodObject (thread))
- {
- 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 (!isGoodObject (&thread))
- return ESRCH;
-
- return thread->cancel ();
-}
-
-/* Races in pthread_atfork:
- We are race safe in that any additions to the lists are made via
- InterlockedExchangePointer.
- However, if the user application doesn't perform syncronisation of some sort
- It's not guaranteed that a near simultaneous call to pthread_atfork and fork
- will result in the new atfork handlers being calls.
- More rigorous internal syncronisation isn't needed as the user program isn't
- guaranteeing their own state.
-
- as far as multiple calls to pthread_atfork, the worst case is simultaneous calls
- will result in an indeterminate order for parent and child calls (what gets inserted
- first isn't guaranteed.)
-
- There is one potential race... Does the result of InterlockedExchangePointer
- get committed to the return location _before_ any context switches can occur?
- If yes, we're safe, if no, we're not. */
-void
-pthread::atforkprepare (void)
-{
- MT_INTERFACE->fixup_before_fork ();
-
- callback *cb = MT_INTERFACE->pthread_prepare;
- while (cb)
- {
- cb->cb ();
- cb = cb->next;
- }
-}
-
-void
-pthread::atforkparent (void)
-{
- callback *cb = MT_INTERFACE->pthread_parent;
- while (cb)
- {
- cb->cb ();
- cb = cb->next;
- }
-}
-
-void
-pthread::atforkchild (void)
-{
- MT_INTERFACE->fixup_after_fork ();
-
- 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;
- prepcb->next = (callback *) InterlockedExchangePointer ((LONG *) &MT_INTERFACE->pthread_prepare, (long int) 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 */
- parentcb->next = (callback *) InterlockedExchangePointer ((LONG *) t, (long int) 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 */
- childcb->next = (callback *) InterlockedExchangePointer ((LONG *) t, (long int) childcb);
- }
- return 0;
-}
-
-int
-__pthread_attr_init (pthread_attr_t *attr)
-{
- if (check_valid_pointer (attr))
- return EINVAL;
- *attr = new pthread_attr;
- if (!pthread_attr::isGoodObject (attr))
- {
- delete (*attr);
- *attr = NULL;
- return EAGAIN;
- }
- return 0;
-}
-
-int
-__pthread_attr_getinheritsched (const pthread_attr_t *attr,
- int *inheritsched)
-{
- if (!pthread_attr::isGoodObject (attr))
- return EINVAL;
- *inheritsched = (*attr)->inheritsched;
- return 0;
-}
-
-int
-__pthread_attr_getschedparam (const pthread_attr_t *attr,
- struct sched_param *param)
-{
- if (!pthread_attr::isGoodObject (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 */
-int
-__pthread_attr_getschedpolicy (const pthread_attr_t *attr, int *policy)
-{
- if (!pthread_attr::isGoodObject (attr))
- return EINVAL;
- *policy = SCHED_FIFO;
- return 0;
-}
-
-
-int
-__pthread_attr_getscope (const pthread_attr_t *attr, int *contentionscope)
-{
- if (!pthread_attr::isGoodObject (attr))
- return EINVAL;
- *contentionscope = (*attr)->contentionscope;
- return 0;
-}
-
-int
-__pthread_attr_setdetachstate (pthread_attr_t *attr, int detachstate)
-{
- if (!pthread_attr::isGoodObject (attr))
- return EINVAL;
- if (detachstate < 0 || detachstate > 1)
- return EINVAL;
- (*attr)->joinable = detachstate;
- return 0;
-}
-
-int
-__pthread_attr_getdetachstate (const pthread_attr_t *attr, int *detachstate)
-{
- if (!pthread_attr::isGoodObject (attr))
- return EINVAL;
- *detachstate = (*attr)->joinable;
- return 0;
-}
-
-int
-__pthread_attr_setinheritsched (pthread_attr_t *attr, int inheritsched)
-{
- if (!pthread_attr::isGoodObject (attr))
- return EINVAL;
- if (inheritsched != PTHREAD_INHERIT_SCHED
- && inheritsched != PTHREAD_EXPLICIT_SCHED)
- return ENOTSUP;
- (*attr)->inheritsched = inheritsched;
- return 0;
-}
-
-int
-__pthread_attr_setschedparam (pthread_attr_t *attr,
- const struct sched_param *param)
-{
- if (!pthread_attr::isGoodObject (attr))
- return EINVAL;
- if (!valid_sched_parameters (param))
- return ENOTSUP;
- (*attr)->schedparam = *param;
- return 0;
-}
-
-/* See __pthread_attr_getschedpolicy for some notes */
-int
-__pthread_attr_setschedpolicy (pthread_attr_t *attr, int policy)
-{
- if (!pthread_attr::isGoodObject (attr))
- return EINVAL;
- if (policy != SCHED_FIFO)
- return ENOTSUP;
- return 0;
-}
-
-int
-__pthread_attr_setscope (pthread_attr_t *attr, int contentionscope)
-{
- if (!pthread_attr::isGoodObject (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;
-}
-
-int
-__pthread_attr_setstacksize (pthread_attr_t *attr, size_t size)
-{
- if (!pthread_attr::isGoodObject (attr))
- return EINVAL;
- (*attr)->stacksize = size;
- return 0;
-}
-
-int
-__pthread_attr_getstacksize (const pthread_attr_t *attr, size_t *size)
-{
- if (!pthread_attr::isGoodObject (attr))
- return EINVAL;
- *size = (*attr)->stacksize;
- return 0;
-}
-
-int
-__pthread_attr_destroy (pthread_attr_t *attr)
-{
- if (!pthread_attr::isGoodObject (attr))
- return EINVAL;
- delete (*attr);
- *attr = NULL;
- return 0;
-}
-
-int
-pthread::join (pthread_t *thread, void **return_val)
-{
- pthread_t joiner = self ();
-
- if (!isGoodObject (&joiner))
- return EINVAL;
-
- // Initialize return val with NULL
- if (return_val)
- *return_val = NULL;
-
- /* FIXME: wait on the thread cancellation event as well - we are a cancellation point*/
- if (!isGoodObject (thread))
- return ESRCH;
-
- if (__pthread_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 ();
- WaitForSingleObject ((*thread)->win32_obj_id, INFINITE);
- if (return_val)
- *return_val = (*thread)->return_ptr;
- // cleanup
- delete (*thread);
- } /* End if */
-
- pthread_testcancel ();
-
- return 0;
-}
-
-int
-pthread::detach (pthread_t *thread)
-{
- if (!isGoodObject (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 (WAIT_TIMEOUT == WaitForSingleObject ((*thread)->win32_obj_id, 0))
- {
- // 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 (!isGoodObject (thread))
- return ESRCH;
-
- if ((*thread)->suspended == false)
- {
- (*thread)->suspended = true;
- SuspendThread ((*thread)->win32_obj_id);
- }
-
- return 0;
-}
-
-
-int
-pthread::resume (pthread_t *thread)
-{
- if (!isGoodObject (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
-*/
-int
-__pthread_getconcurrency (void)
-{
- return MT_INTERFACE->concurrency;
-}
-
-/* keep this in sync with sched.cc */
-int
-__pthread_getschedparam (pthread_t thread, int *policy,
- struct sched_param *param)
-{
- if (!pthread::isGoodObject (&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 SpecificData */
-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::isGoodObject (key))
- return EBUSY;
-
- *key = new pthread_key (destructor);
-
- if (!pthread_key::isGoodObject (key))
- {
- delete (*key);
- *key = NULL;
- return EAGAIN;
- }
- return 0;
-}
-
-int
-__pthread_key_delete (pthread_key_t key)
-{
- if (!pthread_key::isGoodObject (&key))
- return EINVAL;
-
- delete (key);
- return 0;
-}
-
-/* provided for source level compatability. See
-http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_getconcurrency.html
-*/
-int
-__pthread_setconcurrency (int new_level)
-{
- if (new_level < 0)
- return EINVAL;
- MT_INTERFACE->concurrency = new_level;
- return 0;
-}
-
-/* keep syncronised with sched.cc */
-int
-__pthread_setschedparam (pthread_t thread, int policy,
- const struct sched_param *param)
-{
- if (!pthread::isGoodObject (&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;
-}
-
-
-int
-__pthread_setspecific (pthread_key_t key, const void *value)
-{
- if (!pthread_key::isGoodObject (&key))
- return EINVAL;
- (key)->set (value);
- return 0;
-}
-
-void *
-__pthread_getspecific (pthread_key_t key)
-{
- if (!pthread_key::isGoodObject (&key))
- return NULL;
-
- return (key)->get ();
-
-}
-
-/* Thread synchronisation */
-bool
-pthread_cond::isGoodObject (pthread_cond_t const *cond)
-{
- if (verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC) != VALID_OBJECT)
- return false;
- return true;
-}
-
-bool
-pthread_cond::isGoodInitializer (pthread_cond_t const *cond)
-{
- if (verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC, PTHREAD_COND_INITIALIZER) != VALID_STATIC_OBJECT)
- return false;
- return true;
-}
-
-bool
-pthread_cond::isGoodInitializerOrObject (pthread_cond_t const *cond)
-{
- if (verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC, PTHREAD_COND_INITIALIZER) == INVALID_OBJECT)
- return false;
- return true;
-}
-
-bool
-pthread_cond::isGoodInitializerOrBadObject (pthread_cond_t const *cond)
-{
- verifyable_object_state objectState = verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC, PTHREAD_COND_INITIALIZER);
- if (objectState == VALID_OBJECT)
- return false;
- return true;
-}
-
-int
-__pthread_cond_destroy (pthread_cond_t *cond)
-{
- if (pthread_cond::isGoodInitializer (cond))
- return 0;
- if (!pthread_cond::isGoodObject (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)
-{
- if (attr && !pthread_condattr::isGoodObject (attr))
- return EINVAL;
- if (!condInitializationLock.lock ())
- return EINVAL;
-
- if (!isGoodInitializerOrBadObject (cond))
- {
- condInitializationLock.unlock ();
- return EBUSY;
- }
-
- *cond = new pthread_cond (attr ? (*attr) : NULL);
- if (!isGoodObject (cond))
- {
- delete (*cond);
- *cond = NULL;
- condInitializationLock.unlock ();
- return EAGAIN;
- }
- condInitializationLock.unlock ();
- return 0;
-}
-
-int
-__pthread_cond_broadcast (pthread_cond_t *cond)
-{
- if (pthread_cond::isGoodInitializer (cond))
- pthread_cond::init (cond, NULL);
- if (!pthread_cond::isGoodObject (cond))
- return EINVAL;
-
- (*cond)->BroadCast ();
-
- return 0;
-}
-
-int
-__pthread_cond_signal (pthread_cond_t *cond)
-{
- if (pthread_cond::isGoodInitializer (cond))
- pthread_cond::init (cond, NULL);
- if (!pthread_cond::isGoodObject (cond))
- return EINVAL;
-
- (*cond)->Signal ();
-
- return 0;
-}
-
-int
-__pthread_cond_dowait (pthread_cond_t *cond, pthread_mutex_t *mutex,
- long waitlength)
-{
-// and yes cond_access here is still open to a race. (we increment, context swap,
-// broadcast occurs - we miss the broadcast. the functions aren't split properly.
- int rv;
- pthread_mutex **themutex = NULL;
- if (pthread_mutex::isGoodInitializer (mutex))
- pthread_mutex::init (mutex, NULL);
- themutex = mutex;
- if (pthread_cond::isGoodInitializer (cond))
- pthread_cond::init (cond, NULL);
-
- if (!pthread_mutex::isGoodObject (themutex))
- return EINVAL;
- if (!pthread_cond::isGoodObject (cond))
- return EINVAL;
-
- /* if the cond variable is blocked, then the above timer test maybe wrong. *shrug**/
- if (pthread_mutex_lock (&(*cond)->cond_access))
- system_printf ("Failed to lock condition variable access mutex, this %p", *cond);
-
- if ((*cond)->waiting)
- if ((*cond)->mutex && ((*cond)->mutex != (*themutex)))
- {
- if (pthread_mutex_unlock (&(*cond)->cond_access))
- system_printf ("Failed to unlock condition variable access mutex, this %p", *cond);
- return EINVAL;
- }
- InterlockedIncrement (&((*cond)->waiting));
-
- (*cond)->mutex = (*themutex);
- InterlockedIncrement (&((*themutex)->condwaits));
- if (pthread_mutex_unlock (&(*cond)->cond_access))
- system_printf ("Failed to unlock condition variable access mutex, this %p", *cond);
- /* At this point calls to Signal will progress evebn if we aren' yet waiting
- However, the loop there should allow us to get scheduled and call wait,
- and have them call PulseEvent again if we dont' respond. */
- rv = (*cond)->TimedWait (waitlength);
- /* this may allow a race on the mutex acquisition and waits.
- But doing this within the cond access mutex creates a different race */
- InterlockedDecrement (&((*cond)->waiting));
- /* Tell Signal that we have been released */
- InterlockedDecrement (&((*cond)->ExitingWait));
- (*themutex)->Lock ();
- if (pthread_mutex_lock (&(*cond)->cond_access))
- system_printf ("Failed to lock condition variable access mutex, this %p", *cond);
- if ((*cond)->waiting == 0)
- (*cond)->mutex = NULL;
- InterlockedDecrement (&((*themutex)->condwaits));
- if (pthread_mutex_unlock (&(*cond)->cond_access))
- system_printf ("Failed to unlock condition variable access mutex, this %p", *cond);
-
- return rv;
-}
-
-extern "C" int
-pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex,
- const struct timespec *abstime)
-{
- if (check_valid_pointer (abstime))
- return EINVAL;
- struct timeb currSysTime;
- long waitlength;
- ftime (&currSysTime);
- waitlength = (abstime->tv_sec - currSysTime.time) * 1000;
- if (waitlength < 0)
- return ETIMEDOUT;
- return __pthread_cond_dowait (cond, mutex, waitlength);
-}
-
-extern "C" int
-pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex)
-{
- return __pthread_cond_dowait (cond, mutex, INFINITE);
-}
-
-int
-__pthread_condattr_init (pthread_condattr_t *condattr)
-{
- if (check_valid_pointer (condattr))
- return EINVAL;
- *condattr = new pthread_condattr;
- if (!pthread_condattr::isGoodObject (condattr))
- {
- delete (*condattr);
- *condattr = NULL;
- return EAGAIN;
- }
- return 0;
-}
-
-int
-__pthread_condattr_getpshared (const pthread_condattr_t *attr, int *pshared)
-{
- if (!pthread_condattr::isGoodObject (attr))
- return EINVAL;
- *pshared = (*attr)->shared;
- return 0;
-}
-
-int
-__pthread_condattr_setpshared (pthread_condattr_t *attr, int pshared)
-{
- if (!pthread_condattr::isGoodObject (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;
-}
-
-int
-__pthread_condattr_destroy (pthread_condattr_t *condattr)
-{
- if (!pthread_condattr::isGoodObject (condattr))
- return EINVAL;
- delete (*condattr);
- *condattr = NULL;
- return 0;
-}
-
-/* Thread signal */
-int
-__pthread_kill (pthread_t thread, int sig)
-{
- // lock myself, for the use of thread2signal
- // two different kills might clash: FIXME
-
- if (!pthread::isGoodObject (&thread))
- return EINVAL;
-
- if (thread->sigs)
- myself->setthread2signal (thread);
-
- int rval = raise (sig);
-
- // unlock myself
- return rval;
-}
-
-int
-__pthread_sigmask (int operation, const sigset_t *set, sigset_t *old_set)
-{
- pthread *thread = pthread::self ();
-
- // lock this myself, for the use of thread2signal
- // two differt kills might clash: FIXME
-
- if (thread->sigs)
- myself->setthread2signal (thread);
-
- int rval = sigprocmask (operation, set, old_set);
-
- // unlock this myself
-
- return rval;
-}
-
-/* ID */
-
-int
-__pthread_equal (pthread_t *t1, pthread_t *t2)
-{
- return (*t1 == *t2);
-}
-
-/* Mutexes */
-
-/* FIXME: there's a potential race with PTHREAD_MUTEX_INITALIZER:
- the mutex is not actually inited until the first use.
- So two threads trying to lock/trylock may collide.
- Solution: we need a global mutex on mutex creation, or possibly simply
- on all constructors that allow INITIALIZER macros.
- the lock should be very small: only around the init routine, not
- every test, or all mutex access will be synchronised. */
-
-int
-pthread_mutex::init (pthread_mutex_t *mutex,
- const pthread_mutexattr_t *attr)
-{
- if (attr && !pthread_mutexattr::isGoodObject (attr) || check_valid_pointer (mutex))
- return EINVAL;
- if (!mutexInitializationLock.lock ())
- return EINVAL;
-
- if (!isGoodInitializerOrBadObject (mutex))
- {
- mutexInitializationLock.unlock ();
- return EBUSY;
- }
-
- *mutex = new pthread_mutex (attr ? (*attr) : NULL);
- if (!isGoodObject (mutex))
- {
- delete (*mutex);
- *mutex = NULL;
- mutexInitializationLock.unlock ();
- return EAGAIN;
- }
- mutexInitializationLock.unlock ();
- return 0;
-}
-
-int
-__pthread_mutex_getprioceiling (const pthread_mutex_t *mutex,
- int *prioceiling)
-{
- pthread_mutex_t *themutex = (pthread_mutex_t *) mutex;
- if (pthread_mutex::isGoodInitializer (mutex))
- pthread_mutex::init ((pthread_mutex_t *) mutex, NULL);
- if (!pthread_mutex::isGoodObject (themutex))
- return EINVAL;
- /* 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;
-}
-
-int
-__pthread_mutex_lock (pthread_mutex_t *mutex)
-{
- pthread_mutex_t *themutex = mutex;
- /* This could be simplified via isGoodInitializerOrObject
- and isGoodInitializer, but in a performance critical call like this....
- no. */
- switch (verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC, PTHREAD_MUTEX_INITIALIZER))
- {
- case INVALID_OBJECT:
- return EINVAL;
- break;
- case VALID_STATIC_OBJECT:
- if (pthread_mutex::isGoodInitializer (mutex))
- {
- int rv = pthread_mutex::init (mutex, NULL);
- if (rv && rv != EBUSY)
- return rv;
- }
- /* No else needed. If it's been initialized while we waited,
- we can just attempt to lock it */
- break;
- case VALID_OBJECT:
- break;
- }
- return (*themutex)->Lock ();
-}
-
-int
-__pthread_mutex_trylock (pthread_mutex_t *mutex)
-{
- pthread_mutex_t *themutex = mutex;
- if (pthread_mutex::isGoodInitializer (mutex))
- pthread_mutex::init (mutex, NULL);
- if (!pthread_mutex::isGoodObject (themutex))
- return EINVAL;
- return (*themutex)->TryLock ();
-}
-
-int
-__pthread_mutex_unlock (pthread_mutex_t *mutex)
-{
- if (pthread_mutex::isGoodInitializer (mutex))
- pthread_mutex::init (mutex, NULL);
- if (!pthread_mutex::isGoodObject (mutex))
- return EINVAL;
- return (*mutex)->UnLock ();
-}
-
-int
-__pthread_mutex_destroy (pthread_mutex_t *mutex)
-{
- int rv;
-
- if (pthread_mutex::isGoodInitializer (mutex))
- return 0;
- if (!pthread_mutex::isGoodObject (mutex))
- return EINVAL;
-
- rv = (*mutex)->Destroy ();
- if (rv)
- return rv;
-
- *mutex = NULL;
- return 0;
-}
-
-int
-__pthread_mutex_setprioceiling (pthread_mutex_t *mutex, int prioceiling,
- int *old_ceiling)
-{
- pthread_mutex_t *themutex = mutex;
- if (pthread_mutex::isGoodInitializer (mutex))
- pthread_mutex::init (mutex, NULL);
- if (!pthread_mutex::isGoodObject (themutex))
- return EINVAL;
- return ENOSYS;
-}
-
-/* Win32 doesn't support mutex priorities - see __pthread_mutex_getprioceiling
- for more detail */
-int
-__pthread_mutexattr_getprotocol (const pthread_mutexattr_t *attr,
- int *protocol)
-{
- if (!pthread_mutexattr::isGoodObject (attr))
- return EINVAL;
- return ENOSYS;
-}
-
-int
-__pthread_mutexattr_getpshared (const pthread_mutexattr_t *attr,
- int *pshared)
-{
- if (!pthread_mutexattr::isGoodObject (attr))
- return EINVAL;
- *pshared = (*attr)->pshared;
- return 0;
-}
-
-int
-__pthread_mutexattr_gettype (const pthread_mutexattr_t *attr, int *type)
-{
- if (!pthread_mutexattr::isGoodObject (attr))
- return EINVAL;
- *type = (*attr)->mutextype;
- return 0;
-}
-
-/* FIXME: write and test process shared mutex's. */
-int
-__pthread_mutexattr_init (pthread_mutexattr_t *attr)
-{
- if (pthread_mutexattr::isGoodObject (attr))
- return EBUSY;
-
- *attr = new pthread_mutexattr ();
- if (!pthread_mutexattr::isGoodObject (attr))
- {
- delete (*attr);
- *attr = NULL;
- return ENOMEM;
- }
- return 0;
-}
-
-int
-__pthread_mutexattr_destroy (pthread_mutexattr_t *attr)
-{
- if (!pthread_mutexattr::isGoodObject (attr))
- return EINVAL;
- delete (*attr);
- *attr = NULL;
- return 0;
-}
-
-
-/* Win32 doesn't support mutex priorities */
-int
-__pthread_mutexattr_setprotocol (pthread_mutexattr_t *attr, int protocol)
-{
- if (!pthread_mutexattr::isGoodObject (attr))
- return EINVAL;
- return ENOSYS;
-}
-
-/* Win32 doesn't support mutex priorities */
-int
-__pthread_mutexattr_setprioceiling (pthread_mutexattr_t *attr,
- int prioceiling)
-{
- if (!pthread_mutexattr::isGoodObject (attr))
- return EINVAL;
- return ENOSYS;
-}
-
-int
-__pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *attr,
- int *prioceiling)
-{
- if (!pthread_mutexattr::isGoodObject (attr))
- return EINVAL;
- return ENOSYS;
-}
-
-int
-__pthread_mutexattr_setpshared (pthread_mutexattr_t *attr, int pshared)
-{
- if (!pthread_mutexattr::isGoodObject (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 */
-int
-__pthread_mutexattr_settype (pthread_mutexattr_t *attr, int type)
-{
- if (!pthread_mutexattr::isGoodObject (attr))
- return EINVAL;
-
- switch (type)
- {
- case PTHREAD_MUTEX_ERRORCHECK:
- case PTHREAD_MUTEX_RECURSIVE:
- (*attr)->mutextype = type;
- break;
- default:
- return EINVAL;
- }
-
- return 0;
-}
-
-/* Semaphores */
-
-/* static members */
-bool
-semaphore::isGoodObject (sem_t const * sem)
-{
- if (verifyable_object_isvalid (sem, SEM_MAGIC) != VALID_OBJECT)
- return false;
- return true;
-}
-
-int
-semaphore::init (sem_t *sem, int pshared, unsigned int value)
-{
- /* opengroup calls this undefined */
- if (isGoodObject (sem))
- return EBUSY;
-
- if (value > SEM_VALUE_MAX)
- return EINVAL;
-
- *sem = new semaphore (pshared, value);
-
- if (!isGoodObject (sem))
- {
- delete (*sem);
- *sem = NULL;
- return EAGAIN;
- }
- return 0;
-}
-
-int
-semaphore::destroy (sem_t *sem)
-{
- if (!isGoodObject (sem))
- return EINVAL;
-
- /* FIXME - new feature - test for busy against threads... */
-
- delete (*sem);
- *sem = NULL;
- return 0;
-}
-
-int
-semaphore::wait (sem_t *sem)
-{
- if (!isGoodObject (sem))
- {
- set_errno (EINVAL);
- return -1;
- }
-
- (*sem)->Wait ();
- return 0;
-}
-
-int
-semaphore::trywait (sem_t *sem)
-{
- if (!isGoodObject (sem))
- {
- set_errno (EINVAL);
- return -1;
- }
-
- return (*sem)->TryWait ();
-}
-
-int
-semaphore::post (sem_t *sem)
-{
- if (!isGoodObject (sem))
- return EINVAL;
-
- (*sem)->Post ();
- return 0;
-}
-
-/* pthreadNull */
-pthread *
-pthreadNull::getNullpthread ()
-{
- /* because of weird entry points */
- _instance.magic = 0;
- return &_instance;
-}
-
-pthreadNull::pthreadNull ()
-{
- attr.joinable = PTHREAD_CREATE_DETACHED;
- /* Mark ourselves as invalid */
- magic = 0;
-}
-
-pthreadNull::~pthreadNull ()
-{
-}
-
-void
-pthreadNull::create (void *(*)(void *), pthread_attr *, void *)
-{
-}
-
-void
-pthreadNull::exit (void *value_ptr)
-{
- ExitThread (0);
-}
-
-int
-pthreadNull::cancel ()
-{
- return 0;
-}
-
-void
-pthreadNull::testcancel ()
-{
-}
-
-int
-pthreadNull::setcancelstate (int state, int *oldstate)
-{
- return EINVAL;
-}
-
-int
-pthreadNull::setcanceltype (int type, int *oldtype)
-{
- return EINVAL;
-}
-
-void
-pthreadNull::push_cleanup_handler (__pthread_cleanup_handler *handler)
-{
-}
-
-void
-pthreadNull::pop_cleanup_handler (int const execute)
-{
-}
-unsigned long
-pthreadNull::getsequence_np ()
-{
- return 0;
-}
-
-pthreadNull pthreadNull::_instance;
-
-#endif // MT_SAFE
diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h
deleted file mode 100644
index cf08a7630..000000000
--- a/winsup/cygwin/thread.h
+++ /dev/null
@@ -1,630 +0,0 @@
-/* thread.h: Locking and threading module definitions
-
- Copyright 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
-
- Written by Marco Fuykschot <marco@ddi.nl>
- Major update 2001 Robert Collins <rbtcollins@hotmail.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. */
-
-#ifndef _CYGNUS_THREADS_
-#define _CYGNUS_THREADS_
-
-#define LOCK_FD_LIST 1
-#define LOCK_MEMORY_LIST 2
-#define LOCK_MMAP_LIST 3
-#define LOCK_DLL_LIST 4
-
-#define WRITE_LOCK 1
-#define READ_LOCK 2
-
-extern "C"
-{
-#if defined (_CYG_THREAD_FAILSAFE) && defined (_MT_SAFE)
- void AssertResourceOwner (int, int);
-#else
-#define AssertResourceOwner(i,ii)
-#endif
-}
-
-#ifndef _MT_SAFE
-
-#define SetResourceLock(i,n,c)
-#define ReleaseResourceLock(i,n,c)
-
-#else
-
-#include <pthread.h>
-#include <signal.h>
-#include <pwd.h>
-#include <grp.h>
-#define _NOMNTENT_FUNCS
-#include <mntent.h>
-
-extern "C"
-{
-
-struct _winsup_t
-{
- /*
- 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;
- DWORD available_drives;
- char mnt_type[80];
- char mnt_opts[80];
- char mnt_fsname[MAX_PATH];
- char mnt_dir[MAX_PATH];
-
- /* strerror */
- char _strerror_buf[20];
-
- /* sysloc.cc */
- char *_process_ident;
- 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;
- struct protoent *_protoent_buf;
- struct servent *_servent_buf;
- struct hostent *_hostent_buf;
-};
-
-
-struct __reent_t
-{
- struct _reent *_clib;
- struct _winsup_t *_winsup;
-};
-
-_reent *_reent_clib ();
-_winsup_t *_reent_winsup ();
-void SetResourceLock (int, int, const char *) __attribute__ ((regparm (3)));
-void ReleaseResourceLock (int, int, const char *)
- __attribute__ ((regparm (3)));
-
-#ifdef _CYG_THREAD_FAILSAFE
-void AssertResourceOwner (int, int);
-#else
-#define AssertResourceOwner(i,ii)
-#endif
-}
-
-class nativeMutex
-{
-public:
- bool init ();
- bool lock ();
- void unlock ();
-private:
- HANDLE theHandle;
-};
-
-class per_process;
-class pinfo;
-
-class ResourceLocks
-{
-public:
- ResourceLocks ()
- {
- }
- LPCRITICAL_SECTION Lock (int);
- void Init ();
- void Delete ();
-#ifdef _CYG_THREAD_FAILSAFE
- DWORD owner;
- DWORD count;
-#endif
-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 MUTEX_LOCK_COUNTER_INITIAL (-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;
-
-verifyable_object_state verifyable_object_isvalid (void const *, long);
-verifyable_object_state verifyable_object_isvalid (void const *, long, void *);
-
-/* interface */
-template <class ListNode> class List {
-public:
- List();
- void Insert (ListNode *aNode);
- ListNode *Remove ( ListNode *aNode);
- ListNode *Pop ();
- void forEach (void (*)(ListNode *aNode));
-protected:
- ListNode *head;
-};
-
-class pthread_key:public verifyable_object
-{
-public:
- static bool isGoodObject (pthread_key_t const *);
- static void runAllDestructors ();
-
- DWORD dwTlsIndex;
-
- int set (const void *);
- void *get () const;
-
- pthread_key (void (*)(void *));
- ~pthread_key ();
- static void fixup_before_fork();
- static void fixup_after_fork();
-
- /* List support calls */
- class pthread_key *next;
-private:
- // lists of objects. USE THREADSAFE INSERTS AND DELETES.
- static List<pthread_key> keys;
- static void saveAKey (pthread_key *);
- static void restoreAKey (pthread_key *);
- static void destroyAKey (pthread_key *);
- void saveKeyToBuffer ();
- void recreateKeyFromBuffer ();
- void (*destructor) (void *);
- void run_destructor ();
- void *fork_buf;
-};
-
-/* implementation */
-template <class ListNode>
-List<ListNode>::List<ListNode> () : head(NULL)
-{
-}
-template <class ListNode> void
-List<ListNode>::Insert (ListNode *aNode)
-{
- if (!aNode)
- return;
- aNode->next = (ListNode *) InterlockedExchangePointer (&head, aNode);
-}
-template <class ListNode> ListNode *
-List<ListNode>::Remove ( ListNode *aNode)
-{
- if (!aNode)
- return NULL;
- if (!head)
- return NULL;
- if (aNode == head)
- return Pop ();
- ListNode *resultPrev = head;
- while (resultPrev && resultPrev->next && !(aNode == resultPrev->next))
- resultPrev = resultPrev->next;
- if (resultPrev)
- return (ListNode *)InterlockedExchangePointer (&resultPrev->next, resultPrev->next->next);
- return NULL;
-}
-template <class ListNode> ListNode *
-List<ListNode>::Pop ()
-{
- return (ListNode *) InterlockedExchangePointer (&head, head->next);
-}
-/* poor mans generic programming. */
-template <class ListNode> void
-List<ListNode>::forEach (void (*callback)(ListNode *))
-{
- ListNode *aNode = head;
- while (aNode)
- {
- callback (aNode);
- aNode = aNode->next;
- }
-}
-
-class pthread_attr:public verifyable_object
-{
-public:
- static bool isGoodObject(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 isGoodObject(pthread_mutexattr_t const *);
- int pshared;
- int mutextype;
- pthread_mutexattr ();
- ~pthread_mutexattr ();
-};
-
-class pthread_mutex:public verifyable_object
-{
-public:
- static bool isGoodObject (pthread_mutex_t const *);
- static bool isGoodInitializer (pthread_mutex_t const *);
- static bool isGoodInitializerOrObject (pthread_mutex_t const *);
- static bool isGoodInitializerOrBadObject (pthread_mutex_t const *mutex);
- static void initMutex ();
- static int init (pthread_mutex_t *, const pthread_mutexattr_t *);
-
- LONG lock_counter;
- HANDLE win32_obj_id;
- unsigned int recursion_counter;
- LONG condwaits;
- pthread_t owner;
- int type;
- int pshared;
- class pthread_mutex * next;
-
- int Lock ();
- int TryLock ();
- int UnLock ();
- int Destroy ();
- void SetOwner ();
- int LockRecursive ();
- void fixup_after_fork ();
-
- pthread_mutex (pthread_mutexattr * = NULL);
- pthread_mutex (pthread_mutex_t *, pthread_mutexattr *);
- ~pthread_mutex ();
-
-private:
- static nativeMutex mutexInitializationLock;
-};
-
-class pthread:public verifyable_object
-{
-public:
- HANDLE win32_obj_id;
- class pthread_attr attr;
- void *(*function) (void *);
- void *arg;
- void *return_ptr;
- bool suspended;
- int cancelstate, canceltype;
- HANDLE cancel_event;
- pthread_t joiner;
- // int joinable;
-
- /* signal handling */
- struct sigaction *sigs;
- sigset_t *sigmask;
- LONG *sigtodo;
- virtual void create (void *(*)(void *), pthread_attr *, void *);
-
- pthread ();
- virtual ~pthread ();
-
- static void initMainThread (bool);
- static bool isGoodObject(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);
-
- 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 void *thread_init_wrapper (void *);
-
- virtual unsigned long getsequence_np();
-
-private:
- DWORD thread_id;
- __pthread_cleanup_handler *cleanup_stack;
- pthread_mutex mutex;
-
- void pop_all_cleanup_handlers (void);
- void precreate (pthread_attr *);
- void postcreate ();
- void setThreadIdtoCurrent ();
- static void setTlsSelfPointer (pthread *);
- static pthread *getTlsSelfPointer ();
- void cancel_self ();
- DWORD getThreadId ();
- void initCurrentThread ();
-};
-
-class pthreadNull : public pthread
-{
- public:
- static pthread *getNullpthread();
- ~pthreadNull();
-
- /* From pthread These should never get called
- * as the ojbect is not verifyable
- */
- void create (void *(*)(void *), pthread_attr *, void *);
- void exit (void *value_ptr);
- 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:
- pthreadNull ();
- static pthreadNull _instance;
-};
-
-class pthread_condattr:public verifyable_object
-{
-public:
- static bool isGoodObject(pthread_condattr_t const *);
- int shared;
-
- pthread_condattr ();
- ~pthread_condattr ();
-};
-
-class pthread_cond:public verifyable_object
-{
-public:
- static bool isGoodObject (pthread_cond_t const *);
- static bool isGoodInitializer (pthread_cond_t const *);
- static bool isGoodInitializerOrObject (pthread_cond_t const *);
- static bool isGoodInitializerOrBadObject (pthread_cond_t const *);
- static void initMutex ();
- static int init (pthread_cond_t *, const pthread_condattr_t *);
-
- int shared;
- LONG waiting;
- LONG ExitingWait;
- pthread_mutex *mutex;
- /* to allow atomic behaviour for cond_broadcast */
- pthread_mutex_t cond_access;
- HANDLE win32_obj_id;
- class pthread_cond * next;
- int TimedWait (DWORD dwMilliseconds);
- void BroadCast ();
- void Signal ();
- void fixup_after_fork ();
-
- pthread_cond (pthread_condattr *);
- ~pthread_cond ();
-
-private:
- static nativeMutex condInitializationLock;
-};
-
-class pthread_once
-{
-public:
- pthread_mutex_t mutex;
- int state;
-};
-
-/* shouldn't be here */
-class semaphore:public verifyable_object
-{
-public:
- static bool isGoodObject(sem_t const *);
- /* API calls */
- static int init (sem_t * sem, int pshared, unsigned int value);
- static int destroy (sem_t * sem);
- static int wait (sem_t * sem);
- static int trywait (sem_t * sem);
- static int post (sem_t * sem);
-
- HANDLE win32_obj_id;
- class semaphore * next;
- int shared;
- long currentvalue;
- void Wait ();
- void Post ();
- int TryWait ();
- void fixup_after_fork ();
-
- semaphore (int, unsigned int);
- ~semaphore ();
-};
-
-class callback
-{
-public:
- void (*cb)(void);
- class callback * next;
-};
-
-class MTinterface
-{
-public:
- // General
- int concurrency;
- long int threadcount;
-
- // Used for main thread data, and sigproc thread
- struct __reent_t reents;
- struct _winsup_t winsup_reent;
-
- callback *pthread_prepare;
- callback *pthread_child;
- callback *pthread_parent;
-
- // lists of pthread objects. USE THREADSAFE INSERTS AND DELETES.
- class pthread_mutex * mutexs;
- class pthread_cond * conds;
- class semaphore * semaphores;
-
- pthread_key reent_key;
- pthread_key thread_self_key;
-
- void Init (int);
- void fixup_before_fork (void);
- void fixup_after_fork (void);
-
- MTinterface () :
- concurrency (0), threadcount (1),
- pthread_prepare (NULL), pthread_child (NULL), pthread_parent (NULL),
- mutexs (NULL), conds (NULL), semaphores (NULL),
- reent_key (NULL), thread_self_key (NULL)
- {
- }
-};
-
-#define MT_INTERFACE user_data->threadinterface
-
-extern "C"
-{
-int __pthread_attr_init (pthread_attr_t * attr);
-int __pthread_attr_destroy (pthread_attr_t * attr);
-int __pthread_attr_setdetachstate (pthread_attr_t *, int);
-int __pthread_attr_getdetachstate (const pthread_attr_t *, int *);
-int __pthread_attr_setstacksize (pthread_attr_t * attr, size_t size);
-int __pthread_attr_getstacksize (const pthread_attr_t * attr, size_t * size);
-
-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_getstackaddr (const pthread_attr_t *, void **);
-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);
-int __pthread_attr_setstackaddr (pthread_attr_t *, void *);
-
-/* Thread SpecificData */
-int __pthread_key_create (pthread_key_t * key, void (*destructor) (void *));
-int __pthread_key_delete (pthread_key_t key);
-int __pthread_setspecific (pthread_key_t key, const void *value);
-void *__pthread_getspecific (pthread_key_t key);
-
-/* Thead synchroniation */
-int __pthread_cond_destroy (pthread_cond_t * cond);
-int __pthread_cond_signal (pthread_cond_t * cond);
-int __pthread_cond_broadcast (pthread_cond_t * cond);
-int __pthread_condattr_init (pthread_condattr_t * condattr);
-int __pthread_condattr_destroy (pthread_condattr_t * condattr);
-int __pthread_condattr_getpshared (const pthread_condattr_t * attr,
- int *pshared);
-int __pthread_condattr_setpshared (pthread_condattr_t * attr, int pshared);
-
-/* Thread signal */
-int __pthread_kill (pthread_t thread, int sig);
-int __pthread_sigmask (int operation, const sigset_t * set,
- sigset_t * old_set);
-
-/* ID */
-int __pthread_equal (pthread_t * t1, pthread_t * t2);
-
-/* Mutexes */
-int __pthread_mutex_lock (pthread_mutex_t *);
-int __pthread_mutex_trylock (pthread_mutex_t *);
-int __pthread_mutex_unlock (pthread_mutex_t *);
-int __pthread_mutex_destroy (pthread_mutex_t *);
-int __pthread_mutex_setprioceiling (pthread_mutex_t * mutex,
- int prioceiling, int *old_ceiling);
-int __pthread_mutex_getprioceiling (const pthread_mutex_t * mutex,
- int *prioceiling);
-
-
-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);
-
-
-/* Scheduling */
-int __pthread_getconcurrency (void);
-int __pthread_setconcurrency (int new_level);
-int __pthread_getschedparam (pthread_t thread, int *policy,
- struct sched_param *param);
-int __pthread_setschedparam (pthread_t thread, int policy,
- const struct sched_param *param);
-
-};
-#endif // MT_SAFE
-
-#endif // _CYGNUS_THREADS_
diff --git a/winsup/cygwin/threaded_queue.cc b/winsup/cygwin/threaded_queue.cc
deleted file mode 100755
index ba0fe4178..000000000
--- a/winsup/cygwin/threaded_queue.cc
+++ /dev/null
@@ -1,408 +0,0 @@
-/* threaded_queue.cc
-
- Copyright 2001, 2002 Red Hat Inc.
-
- Written by Robert Collins <rbtcollins@hotmail.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 "woutsup.h"
-
-#include <assert.h>
-#include <errno.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <stdlib.h>
-#include "threaded_queue.h"
-
-/*****************************************************************************/
-
-/* queue_request */
-
-queue_request::~queue_request ()
-{}
-
-/*****************************************************************************/
-
-/* threaded_queue */
-
-threaded_queue::threaded_queue (const size_t initial_workers)
- : _workers_count (0),
- _running (false),
- _submitters_head (NULL),
- _requests_count (0),
- _requests_head (NULL),
- _requests_sem (NULL)
-{
- InitializeCriticalSection (&_queue_lock);
-
- // This semaphore's count is the number of requests on the queue.
- // The maximum count (129792) is calculated as MAXIMUM_WAIT_OBJECTS
- // multiplied by max. threads per process (2028?), which is (a few)
- // more requests than could ever be pending with the current design.
-
- _requests_sem = CreateSemaphore (NULL, // SECURITY_ATTRIBUTES
- 0, // Initial count
- 129792, // Maximum count
- NULL); // Anonymous
-
- if (!_requests_sem)
- {
- system_printf (("failed to create the request queue semaphore, "
- "error = %lu"),
- GetLastError ());
- abort ();
- }
-
- create_workers (initial_workers);
-}
-
-threaded_queue::~threaded_queue ()
-{
- if (_running)
- stop ();
-
- debug_printf ("deleting all pending queue requests");
- queue_request *reqptr = _requests_head;
- while (reqptr)
- {
- queue_request *const ptr = reqptr;
- reqptr = reqptr->_next;
- safe_delete (ptr);
- }
-
- DeleteCriticalSection (&_queue_lock);
- if (_requests_sem)
- (void) CloseHandle (_requests_sem);
-}
-
-/* FIXME: return success or failure rather than quitting */
-void
-threaded_queue::add_submission_loop (queue_submission_loop *const submitter)
-{
- assert (this);
- assert (submitter);
- assert (submitter->_queue == this);
- assert (!submitter->_next);
-
- submitter->_next =
- TInterlockedExchangePointer (&_submitters_head, submitter);
-
- if (_running)
- submitter->start ();
-}
-
-bool
-threaded_queue::start ()
-{
- EnterCriticalSection (&_queue_lock);
- const bool was_running = _running;
- _running = true;
- queue_submission_loop *loopptr = _submitters_head;
- LeaveCriticalSection (&_queue_lock);
-
- if (!was_running)
- {
- debug_printf ("starting all queue submission loops");
-
- while (loopptr)
- {
- queue_submission_loop *const ptr = loopptr;
- loopptr = loopptr->_next;
- ptr->start ();
- }
- }
-
- return was_running;
-}
-
-bool
-threaded_queue::stop ()
-{
- EnterCriticalSection (&_queue_lock);
- const bool was_running = _running;
- _running = false;
- queue_submission_loop *loopptr = _submitters_head;
- LeaveCriticalSection (&_queue_lock);
-
- if (was_running)
- {
- debug_printf ("stopping all queue submission loops");
- while (loopptr)
- {
- queue_submission_loop *const ptr = loopptr;
- loopptr = loopptr->_next;
- ptr->stop ();
- }
-
- ReleaseSemaphore (_requests_sem, _workers_count, NULL);
- while (_workers_count)
- {
- debug_printf (("waiting for worker threads to terminate: "
- "%lu still running"),
- _workers_count);
- Sleep (1000);
- }
- debug_printf ("all worker threads have terminated");
- }
-
- return was_running;
-}
-
-/* FIXME: return success or failure */
-void
-threaded_queue::add (queue_request *const therequest)
-{
- assert (this);
- assert (therequest);
- assert (!therequest->_next);
-
- if (!_workers_count)
- {
- system_printf ("warning: no worker threads to handle request!");
- // FIXME: And then what?
- }
-
- EnterCriticalSection (&_queue_lock);
- if (!_requests_head)
- _requests_head = therequest;
- else
- {
- /* Add to the queue end. */
- queue_request *reqptr = _requests_head;
- for (; reqptr->_next; reqptr = reqptr->_next)
- {}
- assert (reqptr);
- assert (!reqptr->_next);
- reqptr->_next = therequest;
- }
-
- _requests_count += 1;
- assert (_requests_count > 0);
- LeaveCriticalSection (&_queue_lock);
-
- (void) ReleaseSemaphore (_requests_sem, 1, NULL);
-}
-
-/*static*/ DWORD WINAPI
-threaded_queue::start_routine (const LPVOID lpParam)
-{
- class threaded_queue *const queue = (class threaded_queue *) lpParam;
- assert (queue);
-
- queue->worker_loop ();
-
- const long count = InterlockedDecrement (&queue->_workers_count);
- assert (count >= 0);
-
- if (queue->_running)
- debug_printf ("worker loop has exited; thread about to terminate");
-
- return 0;
-}
-
-/* Called from the constructor: so no need to be thread-safe until the
- * worker threads start to be created; thus the interlocked increment
- * of the `_workers_count' field.
- */
-
-void
-threaded_queue::create_workers (const size_t initial_workers)
-{
- assert (initial_workers > 0);
-
- for (unsigned int i = 0; i != initial_workers; i++)
- {
- const long count = InterlockedIncrement (&_workers_count);
- assert (count > 0);
-
- DWORD tid;
- const HANDLE hThread =
- CreateThread (NULL, 0, start_routine, this, 0, &tid);
-
- if (!hThread)
- {
- system_printf ("failed to create thread, error = %lu",
- GetLastError ());
- abort ();
- }
-
- (void) CloseHandle (hThread);
- }
-}
-
-void
-threaded_queue::worker_loop ()
-{
- while (true)
- {
- const DWORD rc = WaitForSingleObject (_requests_sem, INFINITE);
- if (rc == WAIT_FAILED)
- {
- system_printf ("wait for request semaphore failed, error = %lu",
- GetLastError ());
- return;
- }
- assert (rc == WAIT_OBJECT_0);
-
- EnterCriticalSection (&_queue_lock);
- if (!_running)
- {
- LeaveCriticalSection (&_queue_lock);
- return;
- }
-
- assert (_requests_head);
- queue_request *const reqptr = _requests_head;
- _requests_head = reqptr->_next;
-
- _requests_count -= 1;
- assert (_requests_count >= 0);
- LeaveCriticalSection (&_queue_lock);
-
- assert (reqptr);
- reqptr->process ();
- safe_delete (reqptr);
- }
-}
-
-/*****************************************************************************/
-
-/* queue_submission_loop */
-
-queue_submission_loop::queue_submission_loop (threaded_queue *const queue,
- const bool ninterruptible)
- : _running (false),
- _interrupt_event (NULL),
- _queue (queue),
- _interruptible (ninterruptible),
- _hThread (NULL),
- _tid (0),
- _next (NULL)
-{
- if (_interruptible)
- {
- // verbose: debug_printf ("creating an interruptible processing thread");
-
- _interrupt_event = CreateEvent (NULL, // SECURITY_ATTRIBUTES
- FALSE, // Auto-reset
- FALSE, // Initially non-signalled
- NULL); // Anonymous
-
- if (!_interrupt_event)
- {
- system_printf ("failed to create interrupt event, error = %lu",
- GetLastError ());
- abort ();
- }
- }
-}
-
-queue_submission_loop::~queue_submission_loop ()
-{
- if (_running)
- stop ();
- if (_interrupt_event)
- (void) CloseHandle (_interrupt_event);
- if (_hThread)
- (void) CloseHandle (_hThread);
-}
-
-bool
-queue_submission_loop::start ()
-{
- assert (this);
- assert (!_hThread);
-
- const bool was_running = _running;
-
- if (!was_running)
- {
- _running = true;
-
- _hThread = CreateThread (NULL, 0, start_routine, this, 0, &_tid);
- if (!_hThread)
- {
- system_printf ("failed to create thread, error = %lu",
- GetLastError ());
- abort ();
- }
- }
-
- return was_running;
-}
-
-bool
-queue_submission_loop::stop ()
-{
- assert (this);
- assert (_hThread && _hThread != INVALID_HANDLE_VALUE);
-
- const bool was_running = _running;
-
- if (_running)
- {
- _running = false;
-
- if (_interruptible)
- {
- assert (_interrupt_event
- && _interrupt_event != INVALID_HANDLE_VALUE);
-
- SetEvent (_interrupt_event);
-
- if (WaitForSingleObject (_hThread, 1000) == WAIT_TIMEOUT)
- {
- system_printf (("request loop thread %lu failed to shutdown "
- "when asked politely: about to get heavy"),
- _tid);
-
- if (!TerminateThread (_hThread, 0))
- {
- system_printf (("failed to kill request loop thread %lu"
- ", error = %lu"),
- _tid, GetLastError ());
- abort ();
- }
- }
- }
- else
- {
- // FIXME: could wait to see if the request loop notices that
- // the submission loop is no longer running and shuts down
- // voluntarily.
-
- debug_printf ("killing request loop thread %lu", _tid);
-
- if (!TerminateThread (_hThread, 0))
- system_printf (("failed to kill request loop thread %lu"
- ", error = %lu"),
- _tid, GetLastError ());
- }
- }
-
- return was_running;
-}
-
-/*static*/ DWORD WINAPI
-queue_submission_loop::start_routine (const LPVOID lpParam)
-{
- class queue_submission_loop *const submission_loop =
- (class queue_submission_loop *) lpParam;
- assert (submission_loop);
-
- submission_loop->request_loop ();
-
- debug_printf ("submission loop has exited; thread about to terminate");
-
- submission_loop->stop ();
-
- return 0;
-}
-
-/*****************************************************************************/
diff --git a/winsup/cygwin/threaded_queue.h b/winsup/cygwin/threaded_queue.h
deleted file mode 100755
index 5b6fddc42..000000000
--- a/winsup/cygwin/threaded_queue.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/* threaded_queue.h
-
- Copyright 2001, 2002 Red Hat Inc.
-
- Written by Robert Collins <rbtcollins@hotmail.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. */
-
-#ifndef _THREADED_QUEUE_
-#define _THREADED_QUEUE_
-
-/*****************************************************************************/
-
-/* a specific request */
-
-class queue_request
-{
-public:
- queue_request *_next;
-
- queue_request () : _next (NULL) {}
- virtual ~queue_request ();
-
- virtual void process () = 0;
-};
-
-/*****************************************************************************/
-
-/* a queue to allocate requests from n submission loops to x worker threads */
-
-class queue_submission_loop;
-
-class threaded_queue
-{
-public:
- threaded_queue (size_t initial_workers = 1);
- ~threaded_queue ();
-
- void add_submission_loop (queue_submission_loop *);
-
- bool running () const { return _running; }
-
- bool start ();
- bool stop ();
-
- void add (queue_request *);
-
-private:
- long _workers_count;
- bool _running;
-
- queue_submission_loop *_submitters_head;
-
- long _requests_count; // Informational only.
- queue_request *_requests_head;
-
- CRITICAL_SECTION _queue_lock;
- HANDLE _requests_sem; // == _requests_count
-
- static DWORD WINAPI start_routine (LPVOID /* this */);
-
- void create_workers (size_t initial_workers);
- void worker_loop ();
-};
-
-/*****************************************************************************/
-
-/* parameters for a request finding and submitting loop */
-
-class queue_submission_loop
-{
- friend class threaded_queue;
-
-public:
- queue_submission_loop (threaded_queue *, bool ninterruptible);
- virtual ~queue_submission_loop ();
-
- bool start ();
- bool stop ();
-
- threaded_queue *queue () { return _queue; };
-
-protected:
- bool _running;
- HANDLE _interrupt_event;
- threaded_queue *const _queue;
-
-private:
- bool _interruptible;
- HANDLE _hThread;
- DWORD _tid;
- queue_submission_loop *_next;
-
- static DWORD WINAPI start_routine (LPVOID /* this */);
- virtual void request_loop () = 0;
-};
-
-#ifdef __cplusplus
-
-/*---------------------------------------------------------------------------*
- * Some type-safe versions of the various interlocked functions.
- *---------------------------------------------------------------------------*/
-
-template <typename T> T *
-TInterlockedExchangePointer (T **lvalue, T *rvalue)
-{
- return reinterpret_cast<T *>
- (InterlockedExchangePointer (reinterpret_cast<void **> (lvalue),
- reinterpret_cast<void *> (rvalue)));
-}
-
-template <typename T> T *
-TInterlockedCompareExchangePointer (T **lvalue, T *rvalue1, T *rvalue2)
-{
- return reinterpret_cast<T *>
- (InterlockedCompareExchangePointer (reinterpret_cast<void **> (lvalue),
- reinterpret_cast<void *> (rvalue1),
- reinterpret_cast<void *> (rvalue2)));
-}
-
-#endif /* __cplusplus */
-
-#endif /* _THREADED_QUEUE_ */
diff --git a/winsup/cygwin/times.cc b/winsup/cygwin/times.cc
deleted file mode 100644
index d56dbabc8..000000000
--- a/winsup/cygwin/times.cc
+++ /dev/null
@@ -1,665 +0,0 @@
-/* times.cc
-
- 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 <time.h>
-#include <sys/times.h>
-#include <sys/timeb.h>
-#include <utime.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "pinfo.h"
-#include "hires.h"
-
-#define FACTOR (0x19db1ded53e8000LL)
-#define NSPERSEC 10000000LL
-
-static void __stdcall timeval_to_filetime (timeval *time, FILETIME *out);
-
-/* 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;
-
- if (check_null_invalid_struct_errno (buf))
- return ((clock_t) -1);
-
- DWORD ticks = GetTickCount ();
- /* Ticks is in milliseconds, convert to our ticks. Use long long to prevent
- overflow. */
- clock_t tc = (clock_t) ((long long) 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;
-}
-
-extern "C" clock_t _times (struct tms *) __attribute__((alias ("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 ()
-{
-#ifdef _MT_SAFE
- char *b=_reent_winsup ()->timezone_buf;
-#else
- static NO_COPY char b[20] = {0};
-#endif
-
- 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);
-}
-
-/* FIXME: Make thread safe */
-extern "C" int
-gettimeofday (struct timeval *tv, struct timezone *tz)
-{
- static hires_ms gtod;
- static bool tzflag;
- LONGLONG now = gtod.usecs (false);
- 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;
-}
-
-extern "C" int _gettimeofday (struct timeval *, struct timezone *)
- __attribute__((alias ("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 */
-static void __stdcall
-timeval_to_filetime (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)
-{
- SYSTEMTIME systemtime;
- FILETIME filetime;
-
- GetSystemTime (&systemtime);
- SystemTimeToFileTime (&systemtime, &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;
- SYSTEMTIME systemtime;
- FILETIME filetime;
-
- GetSystemTime (&systemtime);
- SystemTimeToFileTime (&systemtime, &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;
-#ifdef _MT_SAFE
- struct tm &localtime_buf=_reent_winsup ()->_localtime_buf;
-#else
- static NO_COPY struct tm localtime_buf = {0};
-#endif
-
- 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 */
-
-/* utimes: standards? */
-extern "C" int
-utimes (const char *path, struct timeval *tvp)
-{
- int res = 0;
- struct timeval tmp[2];
- path_conv win32 (path);
-
- if (win32.error)
- {
- set_errno (win32.error);
- syscall_printf ("-1 = utimes (%s, %x)", path, tvp);
- return -1;
- }
-
- /* MSDN suggests using FILE_FLAG_BACKUP_SEMANTICS for accessing
- the times of directories. */
- /* Note: It's not documented in MSDN that FILE_WRITE_ATTRIBUTES is
- sufficient to change the timestamps... */
- HANDLE h = CreateFile (win32, FILE_WRITE_ATTRIBUTES,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- &sec_none_nih, OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS,
- 0);
-
- if (h == INVALID_HANDLE_VALUE)
- {
- if (win32.isdir ())
- {
- /* What we can do with directories more? */
- res = 0;
- }
- else
- {
- res = -1;
- __seterrno ();
- }
- }
- else
- {
- if (tvp == 0)
- {
- gettimeofday (&tmp[0], 0);
- tmp[1] = tmp[0];
- tvp = tmp;
- }
-
- FILETIME lastaccess;
- FILETIME lastwrite;
-
- timeval_to_filetime (tvp + 0, &lastaccess);
- timeval_to_filetime (tvp + 1, &lastwrite);
-
- debug_printf ("incoming lastaccess %08x %08x",
- tvp->tv_sec,
- tvp->tv_usec);
-
-// dump_filetime (lastaccess);
-// dump_filetime (lastwrite);
-
- /* FIXME: SetFileTime needs a handle with a write lock
- on the file whose time is being modified. So calls to utime()
- fail for read only files. */
-
- if (!SetFileTime (h, 0, &lastaccess, &lastwrite))
- {
- __seterrno ();
- res = -1;
- }
- else
- res = 0;
- CloseHandle (h);
- }
-
- syscall_printf ("%d = utimes (%s, %x); (h%d)",
- res, path, tvp, h);
- return res;
-}
-
-/* utime: POSIX 5.6.6.1 */
-extern "C" int
-utime (const char *path, 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 ()
-{
-}
-
-void
-hires_us::prime ()
-{
- LARGE_INTEGER ifreq;
- if (!QueryPerformanceFrequency (&ifreq))
- {
- inited = -1;
- return;
- }
-
- FILETIME f;
- int priority = GetThreadPriority (GetCurrentThread ());
- SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
- if (!QueryPerformanceCounter (&primed_pc))
- {
- SetThreadPriority (GetCurrentThread (), priority);
- inited = -1;
- return;
- }
-
- GetSystemTimeAsFileTime (&f);
- SetThreadPriority (GetCurrentThread (), priority);
-
- inited = 1;
- primed_ft.HighPart = f.dwHighDateTime;
- primed_ft.LowPart = f.dwLowDateTime;
- primed_ft.QuadPart -= FACTOR;
- primed_ft.QuadPart /= 10;
- freq = (double) ((double) 1000000. / (double) ifreq.QuadPart);
- return;
-}
-
-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));
- return justdelta ? now.QuadPart : primed_ft.QuadPart + now.QuadPart;
-}
-
-void
-hires_ms::prime ()
-{
- TIMECAPS tc;
- FILETIME f;
- int priority = GetThreadPriority (GetCurrentThread ());
- SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
-
- if (timeGetDevCaps (&tc, sizeof (tc)) != TIMERR_NOERROR)
- minperiod = 0;
- else
- {
- minperiod = min (max (tc.wPeriodMin, 1), tc.wPeriodMax);
- timeBeginPeriod (minperiod);
- }
-
- initime_ms = timeGetTime ();
- GetSystemTimeAsFileTime (&f);
- SetThreadPriority (GetCurrentThread (), priority);
-
- inited = 1;
- initime_us.HighPart = f.dwHighDateTime;
- initime_us.LowPart = f.dwLowDateTime;
- initime_us.QuadPart -= FACTOR;
- initime_us.QuadPart /= 10;
-}
-
-LONGLONG
-hires_ms::usecs (bool justdelta)
-{
- if (!inited)
- prime ();
- DWORD now = timeGetTime ();
- // FIXME: Not sure how this will handle the 49.71 day wrap around
- LONGLONG res = initime_us.QuadPart + ((LONGLONG) (now - initime_ms) * 1000);
- return res;
-}
-
-hires_ms::~hires_ms ()
-{
- timeEndPeriod (minperiod);
-}
diff --git a/winsup/cygwin/tty.cc b/winsup/cygwin/tty.cc
deleted file mode 100644
index 242a2a846..000000000
--- a/winsup/cygwin/tty.cc
+++ /dev/null
@@ -1,462 +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 <errno.h>
-#include <unistd.h>
-#include <utmp.h>
-#include <wingdi.h>
-#include <winuser.h>
-#include <sys/cygwin.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "pinfo.h"
-#include "cygwin/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
-ttyslot (void)
-{
- if (NOTSTATE (myself, PID_USETTY))
- return -1;
- return myself->ctty;
-}
-
-void __stdcall
-tty_init (void)
-{
- if (!myself->ppid_handle && 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)
-{
- tty_master = (fhandler_tty_master *)
- cygheap->fdtab.build_fhandler (-1, FH_TTYM, "/dev/ttym", NULL, ttynum);
- if (tty_master->init (ttynum))
- api_fatal ("Can't create master tty");
- else
- {
- /* Log utmp entry */
- struct utmp our_utmp;
-
- bzero ((char *) &our_utmp, sizeof (utmp));
- (void) time (&our_utmp.ut_time);
- strncpy (our_utmp.ut_name, getlogin (), sizeof (our_utmp.ut_name));
- cygwin_gethostname (our_utmp.ut_host, sizeof (our_utmp.ut_host));
- __small_sprintf (our_utmp.ut_line, "tty%d", ttynum);
- our_utmp.ut_type = USER_PROCESS;
- our_utmp.ut_pid = myself->pid;
- myself->ctty = ttynum;
- login (&our_utmp);
- }
-}
-
-void __stdcall
-tty_terminate (void)
-{
- 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 (1);
-}
-
-void
-tty_list::terminate (void)
-{
- 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);
- }
-
- 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);
- }
-}
-
-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 (void)
-{
- 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 (int with_console)
-{
- HWND console;
-
- /* FIXME: This whole function needs a protective mutex. */
-
- if (!with_console)
- console = NULL;
- else if (!(console = GetConsoleWindow ()))
- {
- char *oldtitle = new char [TITLESIZE];
-
- if (!oldtitle)
- {
- termios_printf ("Can't *allocate console title buffer");
- return -1;
- }
- if (!GetConsoleTitle (oldtitle, TITLESIZE))
- {
- termios_printf ("Can't read console title");
- return -1;
- }
-
- if (WaitForSingleObject (title_mutex, INFINITE) == WAIT_FAILED)
- termios_printf ("WFSO for title_mutext %p failed, %E", title_mutex);
-
- 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);
- ReleaseMutex (title_mutex);
- if (console == NULL)
- {
- termios_printf ("Can't find console window");
- return -1;
- }
- }
- /* Is a tty allocated for console? */
-
- int freetty = -1;
- 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. */
- }
-
- if (with_console && ttys[i].gethwnd () == console)
- {
- termios_printf ("console %x already associated with tty%d",
- console, i);
- /* Is the master alive? */
- HANDLE hMaster;
- hMaster = OpenProcess (PROCESS_DUP_HANDLE, FALSE, ttys[i].master_pid);
- if (hMaster)
- {
- CloseHandle (hMaster);
- return i;
- }
- /* Master is dead */
- freetty = i;
- break;
- }
- }
-
- /* There is no tty allocated to console, allocate the first free found */
- if (freetty == -1)
- {
- system_printf ("No free ttys available");
- return -1;
- }
- tty *t = ttys + freetty;
- t->init ();
- t->setsid (-1);
- t->setpgid (myself->pgid);
- t->sethwnd (console);
-
- if (with_console)
- {
- termios_printf ("console %x associated with tty%d", console, freetty);
- create_tty_master (freetty);
- }
- else
- termios_printf ("tty%d allocated", freetty);
- 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[sizeof (TTY_MASTER_ALIVE) + 16];
-
- __small_sprintf (buf, fmt, ntty);
- if ((ev = OpenEvent (EVENT_ALL_ACCESS, FALSE, buf)))
- CloseHandle (ev);
- return ev != NULL;
-}
-
-HANDLE
-tty::create_inuse (const char *fmt)
-{
- HANDLE h;
- char buf[sizeof (TTY_MASTER_ALIVE) + 16];
-
- __small_sprintf (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 (void)
-{
- output_stopped = 0;
- setsid (0);
- pgid = 0;
- hwnd = NULL;
- to_slave = NULL;
- from_slave = NULL;
- was_opened = 0;
-}
-
-HANDLE
-tty::get_event (const char *fmt, BOOL manual_reset)
-{
- HANDLE hev;
- char buf[40];
-
- __small_sprintf (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;
-}
-
-int
-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) == FALSE)
- {
- 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) == FALSE)
- {
- 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 ();
-
- /* Allow the others to open us (for handle duplication) */
-
- /* FIXME: we shold NOT set the security wide open when the
- daemon is running
- */
- if (wincap.has_security ())
- {
- if (cygserver_running == CYGSERVER_UNKNOWN)
- cygserver_init ();
-
- if (cygserver_running != CYGSERVER_OK
- && !SetKernelObjectSecurity (hMainProc,
- DACL_SECURITY_INFORMATION,
- get_null_sd ()))
- system_printf ("Can't set process security, %E");
- }
-
- /* Create synchronisation events */
-
- if (ptym->get_device () != FH_TTYM)
- {
- 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[40];
- __small_sprintf (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;
- }
-
- __small_sprintf (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;
- }
-
- ProtectHandle1INH (ptym->output_mutex, output_mutex);
- 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 30d8bb03b..000000000
--- a/winsup/cygwin/tty.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/* tty.h: shared tty info for cygwin
-
- 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. */
-
-
-/* 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%d.output.done"
-#define IOCTL_REQUEST_EVENT "cygtty%d.ioctl.request"
-#define IOCTL_DONE_EVENT "cygtty%d.ioctl.done"
-#define RESTART_OUTPUT_EVENT "cygtty%d.output.restart"
-#define INPUT_AVAILABLE_EVENT "cygtty%d.input.avail"
-#define OUTPUT_MUTEX "cygtty%d.output.mutex"
-#define INPUT_MUTEX "cygtty%d.input.mutex"
-#define TTY_SLAVE_ALIVE "cygtty%x.slave_alive"
-#define TTY_MASTER_ALIVE "cygtty%x.master_alive"
-
-#include <sys/termios.h>
-
-enum
-{
- TTY_INITIALIZED = 1, /* Set if tty is initialized */
- TTY_RSTCONS = 2 /* Set if console needs to be set to "non-cooked" */
-};
-
-#define TTYISSETF(x) __ISSETF (tc, x, TTY)
-#define TTYSETF(x) __SETF (tc, x, TTY)
-#define TTYCLEARF(x) __CLEARF (tc, x, TTY)
-#define TTYCONDSETF(n, x) __CONDSETF(n, tc, x, TTY)
-
-#ifndef MIN_CTRL_C_SLOP
-#define MIN_CTRL_C_SLOP 50
-#endif
-
-class tty_min
-{
- pid_t sid; /* Session ID of tty */
-public:
- DWORD status;
- pid_t pgid;
- int output_stopped;
- int ntty;
- DWORD last_ctrl_c; // tick count of last ctrl-c
-
- 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 set_ctty (int ttynum, int flags);
- 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 (2)));
-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;}
- int make_pipes (fhandler_pty_master *ptym);
- HANDLE open_output_mutex ()
- {
- char buf[80];
- __small_sprintf (buf, OUTPUT_MUTEX, ntty);
- return OpenMutex (MUTEX_ALL_ACCESS, TRUE, buf);
- }
- HANDLE open_input_mutex ()
- {
- char buf[80];
- __small_sprintf (buf, INPUT_MUTEX, ntty);
- return OpenMutex (MUTEX_ALL_ACCESS, TRUE, buf);
- }
- 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 (int n); /* n non zero 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 a2a46a03f..000000000
--- a/winsup/cygwin/uinfo.cc
+++ /dev/null
@@ -1,391 +0,0 @@
-/* uinfo.cc: user info (uid, gid, etc...)
-
- 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 <pwd.h>
-#include <unistd.h>
-#include <winnls.h>
-#include <wininet.h>
-#include <utmp.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <lm.h>
-#include <errno.h>
-#include <sys/cygwin.h>
-#include "pinfo.h"
-#include "security.h"
-#include "fhandler.h"
-#include "path.h"
-#include "dtable.h"
-#include "cygerrno.h"
-#include "cygheap.h"
-#include "registry.h"
-#include "child_info.h"
-#include "environ.h"
-#include "pwdgrp.h"
-
-void
-internal_getlogin (cygheap_user &user)
-{
- struct passwd *pw = NULL;
- HANDLE ptok = INVALID_HANDLE_VALUE;
-
- myself->gid = DEFAULT_GID;
- if (wincap.has_security ())
- {
- DWORD siz;
- cygsid tu;
- DWORD ret = 0;
-
- /* Try to get the SID either from current process and
- store it in user.psid */
- if (!OpenProcessToken (hMainProc, TOKEN_ADJUST_DEFAULT | TOKEN_QUERY,
- &ptok))
- system_printf ("OpenProcessToken(): %E");
- else if (!GetTokenInformation (ptok, TokenUser, &tu, sizeof tu, &siz))
- system_printf ("GetTokenInformation (TokenUser): %E");
- else if (!(ret = user.set_sid (tu)))
- system_printf ("Couldn't retrieve SID from access token!");
- else if (!GetTokenInformation (ptok, TokenPrimaryGroup,
- &user.groups.pgsid, sizeof tu, &siz))
- system_printf ("GetTokenInformation (TokenPrimaryGroup): %E");
- /* We must set the user name, uid and gid.
- If we have a SID, try to get the corresponding Cygwin
- password entry. Set user name which can be different
- from the Windows user name */
- if (ret)
- {
- pw = internal_getpwsid (tu);
- /* Set token owner to the same value as token user */
- if (!SetTokenInformation (ptok, TokenOwner, &tu, sizeof tu))
- debug_printf ("SetTokenInformation(TokenOwner): %E");
- }
- }
-
- 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)))
- {
- /* Set primary group to the group in /etc/passwd. */
- user.groups.pgsid = gsid;
- if (!SetTokenInformation (ptok, TokenPrimaryGroup,
- &gsid, sizeof gsid))
- debug_printf ("SetTokenInformation(TokenPrimaryGroup): %E");
- }
- else
- debug_printf ("gsid not found in augmented /etc/group");
- }
- }
- if (ptok != INVALID_HANDLE_VALUE)
- CloseHandle (ptok);
- (void) cygheap->user.ontherange (CH_HOME, pw);
-
- return;
-}
-
-void
-uinfo_init ()
-{
- if (!child_proc_info)
- internal_getlogin (cygheap->user); /* Set the cygheap->user. */
-
- /* Real and effective uid/gid are identical on process start up. */
- cygheap->user.orig_uid = cygheap->user.real_uid = myself->uid;
- cygheap->user.orig_gid = cygheap->user.real_gid = myself->gid;
- cygheap->user.set_orig_sid (); /* Update the original sid */
-
- cygheap->user.token = INVALID_HANDLE_VALUE; /* No token present */
-}
-
-extern "C" char *
-getlogin (void)
-{
-#ifdef _MT_SAFE
- char *this_username=_reent_winsup ()->_username;
-#else
- static char this_username[UNLEN + 1] NO_COPY;
-#endif
-
- return strcpy (this_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[MAX_PATH + 1];
- 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 = internal_getpwnam (name ());
- 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[MAX_PATH];
- char buf[MAX_PATH + 1];
- 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, ui->usri3_home_dir, MAX_PATH);
- if (!homepath_env_buf[0])
- {
- sys_wcstombs (homepath_env_buf, ui->usri3_home_dir_drive,
- MAX_PATH);
- 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[MAX_PATH + 1];
- cfree_and_set (puserprof, almost_null);
- /* FIXME: Should this just be setting a puserprofile like everything else? */
- const char *myname = winname ();
- if (myname && strcasematch (myname, "SYSTEM")
- && get_registry_hive_path (sid (), 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))
- (void) domain ();
- return pwinname;
-}
diff --git a/winsup/cygwin/uname.cc b/winsup/cygwin/uname.cc
deleted file mode 100644
index de7b9000c..000000000
--- a/winsup/cygwin/uname.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-/* uname.cc
-
- Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 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 <stdio.h>
-#include <sys/utsname.h>
-#include "cygwin_version.h"
-
-/* uname: POSIX 4.4.1.1 */
-extern "C" int
-uname (struct utsname *name)
-{
- DWORD len;
- SYSTEM_INFO sysinfo;
-
- if (check_null_invalid_struct_errno (name))
- return -1;
-
- char *snp = strstr (cygwin_version.dll_build_date, "SNP");
-
- memset (name, 0, sizeof (*name));
- __small_sprintf (name->sysname, "CYGWIN_%s", wincap.osname ());
-
- GetSystemInfo (&sysinfo);
-
- /* Computer name */
- len = sizeof (name->nodename) - 1;
- GetComputerNameA (name->nodename, &len);
-
- /* 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_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 a4e7c60a2..000000000
--- a/winsup/cygwin/wait.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-/* wait.cc: Posix wait routines.
-
- 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 <sys/wait.h>
-#include <stdlib.h>
-#include <errno.h>
-#include "cygerrno.h"
-#include "sigproc.h"
-#include "perthread.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);
-}
-
-pid_t
-waitpid (pid_t intpid, int *status, int options)
-{
- return wait4 (intpid, status, options, NULL);
-}
-
-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.
- */
-
-pid_t
-wait4 (int intpid, int *status, int options, struct rusage *r)
-{
- int res;
- waitq *w;
- HANDLE waitfor;
- bool sawsig;
-
- while (1)
- {
- sig_dispatch_pending (0);
- sigframe thisframe (mainthread);
- sawsig = 0;
- if (options & ~(WNOHANG | WUNTRACED))
- {
- set_errno (EINVAL);
- return -1;
- }
-
- if (r)
- memset (r, 0, sizeof (*r));
-
- if ((w = (waitq *) waitq_storage.get ()) == NULL)
- w = (waitq *) waitq_storage.create ();
-
- 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;
- goto done;
- }
-
- if ((waitfor = w->ev) == NULL)
- goto nochildren;
-
- res = WaitForSingleObject (waitfor, INFINITE);
-
- sigproc_printf ("%d = WaitForSingleObject (...)", res);
-
- if (w->ev == NULL)
- {
- nochildren:
- /* found no children */
- set_errno (ECHILD);
- res = -1;
- goto done;
- }
-
- if (w->status == -1)
- {
- set_sig_errno (EINTR);
- sawsig = 1;
- 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;
-
- done:
- if (!sawsig || !thisframe.call_signal_handler ())
- 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 351d320a4..000000000
--- a/winsup/cygwin/winbase.h
+++ /dev/null
@@ -1,104 +0,0 @@
-#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\
- ": "=a" (__res), "=q" (m): "1" (m));
- 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\
- ": "=a" (__res), "=q" (m): "1" (m));
- 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));
- 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));
- return __res;
-}
-
-#undef InterlockedIncrement
-#define InterlockedIncrement ilockincr
-#undef InterlockedDecrement
-#define InterlockedDecrement ilockdecr
-#undef InterlockedExchange
-#define InterlockedExchange ilockexch
-#undef InterlockedCompareExchange
-#define InterlockedCompareExchange ilockcmpexch
-
-#ifndef EXPCGf
-#define DECLARE_TLS_STORAGE do {} while (0)
-#else
-#define DECLARE_TLS_STORAGE char **tls[4096] __attribute__ ((unused))
-extern long tls_ix;
-extern char * volatile *__stackbase __asm__ ("%fs:4");
-
-extern __inline__ DWORD
-my_tlsalloc ()
-{
- DWORD n = ilockdecr (&tls_ix);
- __stackbase[tls_ix] = NULL;
- return n;
-}
-
-extern __inline__ BOOL
-my_tlssetvalue (DWORD ix, void *val)
-{
- __stackbase[ix] = (char *) val;
- return 1;
-}
-
-extern __inline__ void *
-my_tlsgetvalue (DWORD ix)
-{
- return __stackbase[ix];
-}
-
-extern __inline__ BOOL
-my_tlsfree (DWORD ix)
-{
- /* nothing for now */
- return 1;
-}
-
-#undef TlsAlloc
-#define TlsAlloc my_tlsalloc
-#undef TlsGetValue
-#define TlsGetValue my_tlsgetvalue
-#undef TlsSetValue
-#define TlsSetValue my_tlssetvalue
-#undef TlsFree
-#define TlsFree my_tlsfree
-#endif /*EXPCGF*/
-#endif /*_WINBASE2_H*/
diff --git a/winsup/cygwin/wincap.cc b/winsup/cygwin/wincap.cc
deleted file mode 100644
index e70a362da..000000000
--- a/winsup/cygwin/wincap.cc
+++ /dev/null
@@ -1,526 +0,0 @@
-/* wincap.cc -- figure out on which OS we're running. Set the
- capability class to the appropriate values.
-
- 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. */
-
-#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,
- 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_hard_links:false,
- can_open_directories:false,
- has_move_file_ex:false,
- has_negative_pids:false,
- has_unreliable_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
-};
-
-static NO_COPY wincaps wincap_95 = {
- lock_file_highword:0x0,
- chunksize:32 * 1024 * 1024,
- shared:FILE_SHARE_READ | FILE_SHARE_WRITE,
- is_winnt: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_hard_links:false,
- can_open_directories:false,
- has_move_file_ex:false,
- has_negative_pids:true,
- has_unreliable_pipes:true,
- 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
-};
-
-static NO_COPY wincaps wincap_95osr2 = {
- lock_file_highword:0x0,
- chunksize:32 * 1024 * 1024,
- shared:FILE_SHARE_READ | FILE_SHARE_WRITE,
- is_winnt: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_hard_links:false,
- can_open_directories:false,
- has_move_file_ex:false,
- has_negative_pids:true,
- has_unreliable_pipes:true,
- 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
-};
-
-static NO_COPY wincaps wincap_98 = {
- lock_file_highword:0x0,
- chunksize:32 * 1024 * 1024,
- shared:FILE_SHARE_READ | FILE_SHARE_WRITE,
- is_winnt: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_hard_links:false,
- can_open_directories:false,
- has_move_file_ex:false,
- has_negative_pids:true,
- has_unreliable_pipes:true,
- 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
-};
-
-static NO_COPY wincaps wincap_98se = {
- lock_file_highword:0x0,
- chunksize:32 * 1024 * 1024,
- shared:FILE_SHARE_READ | FILE_SHARE_WRITE,
- is_winnt: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_hard_links:false,
- can_open_directories:false,
- has_move_file_ex:false,
- has_negative_pids:true,
- has_unreliable_pipes:true,
- 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
-};
-
-static NO_COPY wincaps wincap_me = {
- lock_file_highword:0x0,
- chunksize:32 * 1024 * 1024,
- shared:FILE_SHARE_READ | FILE_SHARE_WRITE,
- is_winnt: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_hard_links:false,
- can_open_directories:false,
- has_move_file_ex:false,
- has_negative_pids:true,
- has_unreliable_pipes:true,
- 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
-};
-
-static NO_COPY wincaps wincap_nt3 = {
- lock_file_highword:0xffffffff,
- chunksize:0,
- shared:FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- is_winnt:true,
- 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_hard_links:true,
- can_open_directories:true,
- has_move_file_ex:true,
- has_negative_pids:false,
- has_unreliable_pipes:false,
- 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
-};
-
-static NO_COPY wincaps wincap_nt4 = {
- lock_file_highword:0xffffffff,
- chunksize:0,
- shared:FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- is_winnt:true,
- 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_hard_links:true,
- can_open_directories:true,
- has_move_file_ex:true,
- has_negative_pids:false,
- has_unreliable_pipes:false,
- 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
-};
-
-static NO_COPY wincaps wincap_nt4sp4 = {
- lock_file_highword:0xffffffff,
- chunksize:0,
- shared:FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- is_winnt:true,
- 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_hard_links:true,
- can_open_directories:true,
- has_move_file_ex:true,
- has_negative_pids:false,
- has_unreliable_pipes:false,
- 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
-};
-
-static NO_COPY wincaps wincap_2000 = {
- lock_file_highword:0xffffffff,
- chunksize:0,
- shared:FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- is_winnt: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_hard_links:true,
- can_open_directories:true,
- has_move_file_ex:true,
- has_negative_pids:false,
- has_unreliable_pipes:false,
- 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
-};
-
-static NO_COPY wincaps wincap_xp = {
- lock_file_highword:0xffffffff,
- chunksize:0,
- shared:FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- is_winnt: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_hard_links:true,
- can_open_directories:true,
- has_move_file_ex:true,
- has_negative_pids:false,
- has_unreliable_pipes:false,
- 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
-};
-
-wincapc wincap;
-
-void
-wincapc::init ()
-{
- const char *os;
-
- if (caps)
- return; // already initialized
-
- memset (&version, 0, sizeof version);
- version.dwOSVersionInfoSize = sizeof version;
- GetVersionEx (&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;
- break;
- case 5:
- os = "NT";
- if (version.dwMinorVersion == 0)
- caps = &wincap_2000;
- else
- caps = &wincap_xp;
- 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;
- }
- __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 a89f0a5ad..000000000
--- a/winsup/cygwin/wincap.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/* wincap.h: Header for OS capability class.
-
- 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. */
-
-#ifndef _WINCAP_H
-#define _WINCAP_H
-
-struct wincaps
-{
- DWORD lock_file_highword;
- DWORD chunksize;
- int shared;
- unsigned is_winnt : 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_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_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;
-};
-
-class wincapc
-{
- OSVERSIONINFO version;
- char osnam[40];
- void *caps;
-
-public:
- void init ();
-
- void set_chunksize (DWORD nchunksize);
-
- const char *osname () const { return osnam; }
-
-#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 (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_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_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)
-
-#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 55bc369c0..000000000
--- a/winsup/cygwin/window.cc
+++ /dev/null
@@ -1,250 +0,0 @@
-/* window.cc: hidden windows for signals/itimer support
-
- Copyright 1997, 1998, 2000, 2001, 2002 Red Hat, Inc.
-
- Written by Sergey 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 <sys/time.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <signal.h>
-#include <limits.h>
-#include <wingdi.h>
-#include <winuser.h>
-#define USE_SYS_TYPES_FD_SET
-#include <winsock2.h>
-#include <unistd.h>
-#include "cygerrno.h"
-#include "perprocess.h"
-#include "security.h"
-#include "cygthread.h"
-
-static NO_COPY UINT timer_active = 0;
-static NO_COPY struct itimerval itv;
-static NO_COPY DWORD start_time;
-static NO_COPY HWND ourhwnd = NULL;
-
-static LRESULT CALLBACK
-WndProc (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_TIMER:
- if (wParam == timer_active)
- {
- UINT elapse = itv.it_interval.tv_sec * 1000 +
- itv.it_interval.tv_usec / 1000;
- KillTimer (hwnd, timer_active);
- if (!elapse)
- {
- timer_active = 0;
- }
- else
- {
- timer_active = SetTimer (hwnd, 1, elapse, NULL);
- start_time = GetTickCount ();
- itv.it_value = itv.it_interval;
- }
- raise (SIGALRM);
- }
- 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 HANDLE window_started;
-
-static DWORD WINAPI
-Winmain (VOID *)
-{
- MSG msg;
- WNDCLASS wc;
- static NO_COPY char classname[] = "CygwinWndClass";
-
- /* Register the window class for the main window. */
-
- wc.style = 0;
- wc.lpfnWndProc = (WNDPROC) WndProc;
- 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))
- {
- system_printf ("Cannot register window class");
- return FALSE;
- }
-
- /* Create hidden window. */
- ourhwnd = CreateWindow (classname, classname, WS_POPUP, CW_USEDEFAULT,
- CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
- (HWND) NULL, (HMENU) NULL, user_data->hmodule,
- (LPVOID) NULL);
-
- SetEvent (window_started);
-
- if (!ourhwnd)
- {
- system_printf ("Cannot create window");
- return FALSE;
- }
-
- /* Start the message loop. */
-
- while (GetMessage (&msg, ourhwnd, 0, 0) == TRUE)
- DispatchMessage (&msg);
-
- ExitThread (0);
-}
-
-HWND __stdcall
-gethwnd ()
-{
- if (ourhwnd != NULL)
- return ourhwnd;
-
- cygthread *h;
-
- window_started = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
- h = new cygthread (Winmain, NULL, "win");
- h->SetThreadPriority (THREAD_PRIORITY_HIGHEST);
- WaitForSingleObject (window_started, INFINITE);
- CloseHandle (window_started);
- h->zap_h ();
- return ourhwnd;
-}
-
-extern "C" int
-setitimer (int which, const struct itimerval *value, struct itimerval *oldvalue)
-{
- UINT elapse;
-
- if (which != ITIMER_REAL)
- {
- set_errno (ENOSYS);
- return -1;
- }
- /* Check if we will wrap */
- if (itv.it_value.tv_sec >= (long) (UINT_MAX / 1000))
- {
- set_errno (EINVAL);
- return -1;
- }
- if (timer_active)
- {
- KillTimer (gethwnd (), timer_active);
- timer_active = 0;
- }
- if (oldvalue)
- *oldvalue = itv;
- if (value == NULL)
- {
- set_errno (EFAULT);
- return -1;
- }
- itv = *value;
- elapse = itv.it_value.tv_sec * 1000 + itv.it_value.tv_usec / 1000;
- if (elapse == 0)
- if (itv.it_value.tv_usec)
- elapse = 1;
- else
- return 0;
- if (!(timer_active = SetTimer (gethwnd (), 1, elapse, NULL)))
- {
- __seterrno ();
- return -1;
- }
- start_time = GetTickCount ();
- return 0;
-}
-
-extern "C" int
-getitimer (int which, struct itimerval *value)
-{
- UINT elapse, val;
-
- if (which != ITIMER_REAL)
- {
- set_errno (EINVAL);
- return -1;
- }
- if (value == NULL)
- {
- set_errno (EFAULT);
- return -1;
- }
- *value = itv;
- if (!timer_active)
- {
- value->it_value.tv_sec = 0;
- value->it_value.tv_usec = 0;
- return 0;
- }
- elapse = GetTickCount () - start_time;
- val = itv.it_value.tv_sec * 1000 + itv.it_value.tv_usec / 1000;
- val -= elapse;
- value->it_value.tv_sec = val / 1000;
- value->it_value.tv_usec = val % 1000;
- return 0;
-}
-
-extern "C" unsigned int
-alarm (unsigned int seconds)
-{
- int ret;
- struct itimerval newt, oldt;
-
- newt.it_value.tv_sec = seconds;
- newt.it_value.tv_usec = 0;
- newt.it_interval.tv_sec = 0;
- newt.it_interval.tv_usec = 0;
- setitimer (ITIMER_REAL, &newt, &oldt);
- ret = oldt.it_value.tv_sec;
- if (ret == 0 && oldt.it_value.tv_usec)
- ret = 1;
- return ret;
-}
-
-extern "C" useconds_t
-ualarm (useconds_t value, useconds_t interval)
-{
- struct itimerval timer, otimer;
-
- timer.it_value.tv_sec = 0;
- timer.it_value.tv_usec = value;
- timer.it_interval.tv_sec = 0;
- timer.it_interval.tv_usec = interval;
-
- if (setitimer (ITIMER_REAL, &timer, &otimer) < 0)
- return (u_int)-1;
-
- return (otimer.it_value.tv_sec * 1000000) + otimer.it_value.tv_usec;
-}
-
diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h
deleted file mode 100644
index 2f6e4966e..000000000
--- a/winsup/cygwin/winsup.h
+++ /dev/null
@@ -1,302 +0,0 @@
-/* winsup.h: main Cygwin header file.
-
- 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. */
-
-#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")))
-
-#ifdef __cplusplus
-
-#if !defined(__STDC_VERSION__) || __STDC_VERSION__ >= 199900L
-#define NEW_MACRO_VARARGS
-#endif
-
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0500
-#endif
-
-#include <sys/types.h>
-#include <sys/strace.h>
-
-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 <windows.h>
-#include <wincrypt.h>
-#include <lmcons.h>
-#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 *, const WCHAR *, int)
- __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 TITLESIZE 1024
-
-/* status bit manipulation */
-#define __ISSETF(what, x, prefix) \
- ((what)->status & prefix##_##x)
-#define __SETF(what, x, prefix) \
- ((what)->status |= prefix##_##x)
-#define __CLEARF(what, x, prefix) \
- ((what)->status &= ~prefix##_##x)
-#define __CONDSETF(n, what, x, prefix) \
- ((n) ? __SETF (what, x, prefix) : __CLEARF (what, x, prefix))
-
-#include "debug.h"
-
-/* Events/mutexes */
-extern HANDLE title_mutex;
-
-/**************************** Convenience ******************************/
-
-/* 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;
-
-#ifdef NEW_MACRO_VARARGS
-# define api_fatal(...) __api_fatal ("%P: *** " __VA_ARGS__)
-#else
-# define api_fatal(fmt, args...) __api_fatal ("%P: *** " fmt,## args)
-#endif
-
-#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 */
-extern "C" void __stdcall do_exit (int) __attribute__ ((noreturn));
-
-/* UID/GID */
-void uinfo_init (void);
-
-#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))
-
-extern "C" __uid32_t getuid32 (void);
-extern "C" __uid32_t geteuid32 (void);
-extern "C" struct passwd *getpwuid32 (__uid32_t);
-
-/* various events */
-void events_init (void);
-void events_terminate (void);
-
-void __stdcall close_all_files (void);
-BOOL __stdcall check_pty_fds (void);
-
-/* Invisible window initialization/termination. */
-HWND __stdcall gethwnd (void);
-
-/* Globals that handle initialization of winsock in a child process. */
-extern HANDLE wsock32_handle;
-extern HANDLE ws2_32_handle;
-
-/* Globals that handle initialization of netapi in a child process. */
-extern HANDLE netapi32_handle;
-
-/* 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);
-
-void set_file_api_mode (codepage_type);
-
-extern int cygwin_finished_initializing;
-
-/**************************** Miscellaneous ******************************/
-
-void __stdcall set_std_handle (int);
-int __stdcall writable_directory (const char *file);
-int __stdcall stat_dev (DWORD, int, unsigned long, struct __stat64 *);
-extern BOOL allow_ntsec;
-
-unsigned long __stdcall hash_path_name (unsigned long hash, const char *name) __attribute__ ((regparm(2)));
-void __stdcall nofinalslash (const char *src, char *dst) __attribute__ ((regparm(2)));
-extern "C" char *__stdcall rootdir (char *full_path) __attribute__ ((regparm(1)));
-
-/* 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)));
-
-/* Time related */
-void __stdcall totimeval (struct timeval *dst, FILETIME * src, int sub, int flag);
-long __stdcall to_time_t (FILETIME * ptr);
-void __stdcall to_timestruc_t (FILETIME * ptr, timestruc_t * out);
-void __stdcall time_as_timestruc_t (timestruc_t * out);
-
-void __stdcall set_console_title (char *);
-void early_stuff_init ();
-
-int __stdcall check_null_str (const char *name) __attribute__ ((regparm(1)));
-int __stdcall check_null_empty_str (const char *name) __attribute__ ((regparm(1)));
-int __stdcall check_null_empty_str_errno (const char *name) __attribute__ ((regparm(1)));
-int __stdcall check_null_str_errno (const char *name) __attribute__ ((regparm(1)));
-int __stdcall __check_null_invalid_struct (void *s, unsigned sz) __attribute__ ((regparm(2)));
-int __stdcall __check_null_invalid_struct_errno (void *s, unsigned sz) __attribute__ ((regparm(2)));
-int __stdcall __check_invalid_read_ptr_errno (const void *s, unsigned sz) __attribute__ ((regparm(2)));
-
-#define check_null_invalid_struct(s) \
- __check_null_invalid_struct ((s), sizeof (*(s)))
-#define check_null_invalid_struct_errno(s) \
- __check_null_invalid_struct_errno ((s), sizeof (*(s)))
-
-struct iovec;
-ssize_t check_iovec_for_read (const struct iovec *, int) __attribute__ ((regparm(2)));
-ssize_t check_iovec_for_write (const struct iovec *, int) __attribute__ ((regparm(2)));
-
-#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);
-
-class path_conv;
-int __stdcall stat_worker (const char *name, struct __stat64 *buf, int nofollow,
- path_conv *pc = NULL) __attribute__ ((regparm (3)));
-int __stdcall low_priority_sleep (DWORD) __attribute__ ((regparm (1)));
-#define SLEEP_0_STAY_LOW INFINITE
-
-/**************************** Exports ******************************/
-
-extern "C" {
-int cygwin_select (int , fd_set *, fd_set *, fd_set *,
- struct timeval *to);
-int cygwin_gethostname (char *__name, size_t __len);
-
-int kill_pgrp (pid_t, int);
-int _kill (int, int);
-int _raise (int sig);
-
-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
-
-/* 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 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]. */
-
-#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 HANDLE hMainThread;
-extern HANDLE hMainProc;
-
-extern bool cygwin_testing;
-extern unsigned _cygwin_testing_magic;
-extern HMODULE cygwin_hmodule;
-
-extern char almost_null[];
-
-#define winsock2_active (wsadata.wVersion >= 512)
-#define winsock_active (wsadata.wVersion < 512)
-extern struct WSAData wsadata;
-
-#endif /* defined __cplusplus */
diff --git a/winsup/cygwin/winver.rc b/winsup/cygwin/winver.rc
deleted file mode 100644
index 6a265cbd7..000000000
--- a/winsup/cygwin/winver.rc
+++ /dev/null
@@ -1,53 +0,0 @@
-#include <winver.h>
-#include <cygwin/version.h>
-
-#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-2002"
- 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
diff --git a/winsup/cygwin/woutsup.h b/winsup/cygwin/woutsup.h
deleted file mode 100644
index c048f1c19..000000000
--- a/winsup/cygwin/woutsup.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/* woutsup.h: for Cygwin code compiled outside the DLL (i.e. cygserver).
-
- 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. */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#ifdef __INSIDE_CYGWIN__
-#error "woutsup.h is not for code being compiled inside the dll"
-#endif
-
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0500
-#endif
-
-#if _WIN32_WINNT < 0x0500
-#undef _WIN32_WINNT
-#define _WIN32_WINNT 0x0500
-#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 <windows.h>
-#include <wincrypt.h>
-#include <lmcons.h>
-#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);
-
-extern int cygserver_running;
-
-#if !defined(__STDC_VERSION__) || __STDC_VERSION__ >= 199900L
-#define NEW_MACRO_VARARGS
-#endif
-
-/*
- * A reproduction of the <sys/strace.h> macros. This allows code that
- * runs both inside and outside the Cygwin DLL to use the same macros
- * for logging messages.
- */
-
-extern "C" void __cygserver__printf (const char *, const char *, ...);
-
-#ifdef NEW_MACRO_VARARGS
-
-#define system_printf(...) \
- do \
- { \
- __cygserver__printf (__PRETTY_FUNCTION__, __VA_ARGS__); \
- } while (false)
-
-#define __noop_printf(...) do {;} while (false)
-
-#else /* !NEW_MACRO_VARARGS */
-
-#define system_printf(args...) \
- do \
- { \
- __cygserver__printf (__PRETTY_FUNCTION__, ## args); \
- } while (false)
-
-#define __noop_printf(args...) do {;} while (false)
-
-#endif /* !NEW_MACRO_VARARGS */
-
-#ifdef DEBUGGING
-#define debug_printf system_printf
-#define paranoid_printf system_printf
-#define select_printf system_printf
-#define sigproc_printf system_printf
-#define syscall_printf system_printf
-#define termios_printf system_printf
-#define wm_printf system_printf
-#define minimal_printf system_printf
-#define malloc_printf system_printf
-#define thread_printf system_printf
-#else
-#define debug_printf __noop_printf
-#define paranoid_printf __noop_printf
-#define select_printf __noop_printf
-#define sigproc_printf __noop_printf
-#define syscall_printf __noop_printf
-#define termios_printf __noop_printf
-#define wm_printf __noop_printf
-#define minimal_printf __noop_printf
-#define malloc_printf __noop_printf
-#define thread_printf __noop_printf
-#endif
-
-#include "safe_memory.h"
diff --git a/winsup/cygwin/wsock_event.h b/winsup/cygwin/wsock_event.h
deleted file mode 100644
index 3f8638134..000000000
--- a/winsup/cygwin/wsock_event.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* wsock_event.h: Defining the wsock_event class
-
- 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. */
-
-#ifndef __WSOCK_EVENT_H__
-#define __WSOCK_EVENT_H__
-
-class wsock_event
-{
- WSAEVENT event;
- WSAOVERLAPPED ovr;
-public:
- wsock_event () : event (NULL) {};
- ~wsock_event ()
- {
- if (event)
- WSACloseEvent (event);
- event = NULL;
- };
-
- /* The methods are implemented in net.cc */
- LPWSAOVERLAPPED prepare ();
- int wait (int socket, LPDWORD flags);
-};
-
-#endif /* __WSOCK_EVENT_H__ */