diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f65e19b973..af700ca590 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -24,7 +24,7 @@ jobs: # resulting in errors due to -Werror. Disable them for now. export CXXFLAGS="-Wno-error=stringop-truncation -Wno-error=array-bounds -Wno-error=overloaded-virtual -Wno-narrowing -Wno-use-after-free -Wno-error=maybe-uninitialized" (cd winsup && ./autogen.sh) - ./configure --disable-dependency-tracking --with-msys2-runtime-commit=$GITHUB_SHA + ./configure --disable-dependency-tracking --with-msys2-runtime-commit="$GITHUB_SHA" make -j8 - name: Install diff --git a/.github/workflows/cygwin.yml b/.github/workflows/cygwin.yml index e780428035..711d2922a9 100644 --- a/.github/workflows/cygwin.yml +++ b/.github/workflows/cygwin.yml @@ -162,7 +162,7 @@ jobs: # upload test logs to facilitate investigation of problems - name: Upload test logs - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: testlogs path: | diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index 1c68287d9f..97878699ca 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -11,7 +11,7 @@ details. */ changes to the DLL and is mainly informative in nature. */ #define CYGWIN_VERSION_DLL_MAJOR 3005 -#define CYGWIN_VERSION_DLL_MINOR 5 +#define CYGWIN_VERSION_DLL_MINOR 6 /* CYGWIN_VERSION_DLL_COMBINED gives us a single number representing the combined DLL major and minor numbers. */ diff --git a/winsup/cygwin/loadavg.cc b/winsup/cygwin/loadavg.cc index 127591a2e1..63a1ecebe2 100644 --- a/winsup/cygwin/loadavg.cc +++ b/winsup/cygwin/loadavg.cc @@ -15,17 +15,23 @@ A global load average estimate is maintained in shared memory. Access to that is guarded by a mutex. This estimate is only updated at most every 5 seconds. + The updates are done by any/all callers of the getloadavg() syscall. - We attempt to count running and runnable processes, but unlike linux we don't - count processes in uninterruptible sleep (blocked on I/O). + We attempt to count running and runnable tasks (i.e., threads), but unlike + Linux we don't count tasks in uninterruptible sleep (blocked on I/O). There + doesn't seem to be a kernel counter for the latter on Windows. - The number of running processes is estimated as (NumberOfProcessors) * (% - Processor Time). The number of runnable processes is estimated as - ProcessorQueueLength. + In the following text and code, "PDH" refers to Performance Data Helper, a + Windows component that arranges access to kernel counters. + + The number of running tasks is estimated as + (the NumberOfProcessors counter) * (the % Processor Time counter). + The number of runnable tasks is taken to be the ProcessorQueueLength counter. Note that PDH will only return data for '% Processor Time' afer the second call to PdhCollectQueryData(), as it's computed over an interval, so the first - attempt to estimate load will fail and 0.0 will be returned. + attempt to estimate load will fail and 0.0 will be returned. (This nuisance + is now worked-around near the end of load_init() below.) We also assume that '% Processor Time' averaged over the interval since the last time getloadavg() was called is a good approximation of the instantaneous @@ -68,8 +74,19 @@ static bool load_init (void) if (status != STATUS_SUCCESS) { debug_printf ("PdhAddEnglishCounterW(time), status %y", status); - return false; + + /* Windows 10 Pro 21H1, and maybe others, use an alternative name */ + status = PdhAddEnglishCounterW (query, + L"\\Processor Information(_Total)\\% Processor Time", + 0, &counter1); + if (status != STATUS_SUCCESS) + { + debug_printf ("PdhAddEnglishCounterW(alt time), status %y", status); + return false; + } } + + /* Windows 10 Pro 21H1, and maybe others, are missing this counter */ status = PdhAddEnglishCounterW (query, L"\\System\\Processor Queue Length", 0, &counter2); @@ -77,7 +94,7 @@ static bool load_init (void) if (status != STATUS_SUCCESS) { debug_printf ("PdhAddEnglishCounterW(queue length), status %y", status); - return false; + ; /* Ignore missing counter, just use zero in later calculations */ } mutex = CreateMutex(&sec_all_nih, FALSE, "cyg.loadavg.mutex"); @@ -87,6 +104,12 @@ static bool load_init (void) } initialized = true; + + /* Do the first data collection (which always fails) here, rather than in + get_load(). We wait at least one tick afterward so the collection done + in get_load() is guaranteed to have data to work with. */ + (void) PdhCollectQueryData (query); /* ignore errors */ + Sleep (15/*ms*/); /* wait for at least one kernel tick to have occurred */ } return initialized; @@ -101,8 +124,8 @@ static bool get_load (double *load) if (ret != ERROR_SUCCESS) return false; - /* Estimate the number of running processes as (NumberOfProcessors) * (% - Processor Time) */ + /* Estimate number of running tasks as + (NumberOfProcessors) * (% Processor Time) */ PDH_FMT_COUNTERVALUE fmtvalue1; ret = PdhGetFormattedCounterValue (counter1, PDH_FMT_DOUBLE, NULL, &fmtvalue1); if (ret != ERROR_SUCCESS) @@ -110,11 +133,10 @@ static bool get_load (double *load) double running = fmtvalue1.doubleValue * wincap.cpu_count () / 100; - /* Estimate the number of runnable processes using ProcessorQueueLength */ - PDH_FMT_COUNTERVALUE fmtvalue2; + /* Estimate the number of runnable tasks as ProcessorQueueLength */ + PDH_FMT_COUNTERVALUE fmtvalue2 = { 0 }; ret = PdhGetFormattedCounterValue (counter2, PDH_FMT_LONG, NULL, &fmtvalue2); - if (ret != ERROR_SUCCESS) - return false; + /* Ignore any error accessing this counter, just treat as if zero was read */ LONG rql = fmtvalue2.longValue; diff --git a/winsup/cygwin/local_includes/path.h b/winsup/cygwin/local_includes/path.h index 5f5cf5cb5b..77e07eb658 100644 --- a/winsup/cygwin/local_includes/path.h +++ b/winsup/cygwin/local_includes/path.h @@ -207,21 +207,33 @@ class path_conv { return (path_flags & (PATH_REP | PATH_REP_NOAPI)) == PATH_REP; } - int isdevice () const {return dev.not_device (FH_FS) && dev.not_device (FH_FIFO);} + int isfifo () const {return dev.is_device (FH_FIFO);} - int isspecial () const {return dev.not_device (FH_FS);} int iscygdrive () const {return dev.is_device (FH_CYGDRIVE);} - int is_fs_special () const {return dev.is_fs_special ();} - - int is_lnk_special () const {return (isdevice () && is_fs_special () - && !issocket ()) - || isfifo () || is_lnk_symlink ();} #ifdef __WITH_AF_UNIX int issocket () const {return dev.is_device (FH_LOCAL) || dev.is_device (FH_UNIX);} #else int issocket () const {return dev.is_device (FH_LOCAL);} #endif /* __WITH_AF_UNIX */ + + /* FIXME: This needs a cleanup with better, descriptive names and checking + all usages for correctness. */ + + /* Any file or device with representation on disk. This includes local + sockets, FIFOs, message queues and devices created with mknod. It does + not include the /proc hierarchy. */ + int isondisk () const {return dev.isfs ();} + /* Any device, virtual or with on-disk representation, and anything under + /proc. */ + int isspecial () const {return dev.not_device (FH_FS);} + /* Devices with representation on disk. This includes local sockets, FIFOs, + message queues and devices created with mknod. It does not include + the /proc hierarchy. */ + int is_fs_special () const {return dev.is_fs_special ();} + /* Like is_fs_special but excluding local sockets. */ + int is_lnk_special () const {return is_fs_special () && !issocket ();} + int iscygexec () const {return mount_flags & MOUNT_CYGWIN_EXEC;} int isopen () const {return path_flags & PATH_OPEN;} int isctty_capable () const {return path_flags & PATH_CTTY;} diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 5411acb408..66a4f485a0 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -1241,7 +1241,10 @@ path_conv::check (const char *src, unsigned opt, /* FIXME: bad hack alert!!! We need a better solution */ if (!strncmp (path_copy, MQ_PATH, MQ_LEN) && path_copy[MQ_LEN]) - dev.parse (FH_MQUEUE); + { + dev.parse (FH_MQUEUE); + dev.setfs (1); + } } if (opt & PC_NOFULL) @@ -2153,8 +2156,7 @@ symlink_worker (const char *oldpath, path_conv &win32_newpath, bool isdevice) syscall_printf ("symlink (%s, %S) wsym_type %d", oldpath, win32_newpath.get_nt_native_path (), wsym_type); - if ((!isdevice && win32_newpath.exists ()) - || (win32_newpath.isdevice () && !win32_newpath.is_fs_special ())) + if (win32_newpath.exists() && (!isdevice || !win32_newpath.isondisk ())) { set_errno (EEXIST); __leave; @@ -2343,7 +2345,7 @@ symlink_worker (const char *oldpath, path_conv &win32_newpath, bool isdevice) set_errno (src_path.error); __leave; } - if (!src_path.isdevice () && !src_path.is_fs_special ()) + if (!src_path.isspecial ()) { /* MSYS copy file instead make symlink */ diff --git a/winsup/cygwin/posix_ipc.cc b/winsup/cygwin/posix_ipc.cc index 34fd2ba34c..2650c35aca 100644 --- a/winsup/cygwin/posix_ipc.cc +++ b/winsup/cygwin/posix_ipc.cc @@ -225,11 +225,14 @@ mq_getattr (mqd_t mqd, struct mq_attr *mqstat) int ret = -1; cygheap_fdget fd ((int) mqd, true); - fhandler_mqueue *fh = fd->is_mqueue (); - if (!fh) - set_errno (EBADF); - else - ret = fh->mq_getattr (mqstat); + if (fd >= 0) + { + fhandler_mqueue *fh = fd->is_mqueue (); + if (!fh) + set_errno (EBADF); + else + ret = fh->mq_getattr (mqstat); + } return ret; } @@ -239,11 +242,14 @@ mq_setattr (mqd_t mqd, const struct mq_attr *mqstat, struct mq_attr *omqstat) int ret = -1; cygheap_fdget fd ((int) mqd, true); - fhandler_mqueue *fh = fd->is_mqueue (); - if (!fh) - set_errno (EBADF); - else - ret = fh->mq_setattr (mqstat, omqstat); + if (fd >= 0) + { + fhandler_mqueue *fh = fd->is_mqueue (); + if (!fh) + set_errno (EBADF); + else + ret = fh->mq_setattr (mqstat, omqstat); + } return ret; } @@ -253,11 +259,14 @@ mq_notify (mqd_t mqd, const struct sigevent *notification) int ret = -1; cygheap_fdget fd ((int) mqd, true); - fhandler_mqueue *fh = fd->is_mqueue (); - if (!fh) - set_errno (EBADF); - else - ret = fh->mq_notify (notification); + if (fd >= 0) + { + fhandler_mqueue *fh = fd->is_mqueue (); + if (!fh) + set_errno (EBADF); + else + ret = fh->mq_notify (notification); + } return ret; } @@ -268,11 +277,14 @@ mq_timedsend (mqd_t mqd, const char *ptr, size_t len, unsigned int prio, int ret = -1; cygheap_fdget fd ((int) mqd, true); - fhandler_mqueue *fh = fd->is_mqueue (); - if (!fh) - set_errno (EBADF); - else - ret = fh->mq_timedsend (ptr, len, prio, abstime); + if (fd >= 0) + { + fhandler_mqueue *fh = fd->is_mqueue (); + if (!fh) + set_errno (EBADF); + else + ret = fh->mq_timedsend (ptr, len, prio, abstime); + } return ret; } @@ -289,11 +301,14 @@ mq_timedreceive (mqd_t mqd, char *ptr, size_t maxlen, unsigned int *priop, int ret = -1; cygheap_fdget fd ((int) mqd, true); - fhandler_mqueue *fh = fd->is_mqueue (); - if (!fh) - set_errno (EBADF); - else - ret = fh->mq_timedrecv (ptr, maxlen, priop, abstime); + if (fd >= 0) + { + fhandler_mqueue *fh = fd->is_mqueue (); + if (!fh) + set_errno (EBADF); + else + ret = fh->mq_timedrecv (ptr, maxlen, priop, abstime); + } return ret; } @@ -309,14 +324,14 @@ mq_close (mqd_t mqd) __try { cygheap_fdget fd ((int) mqd, true); - if (!fd->is_mqueue ()) - { - set_errno (EBADF); - __leave; - } - - if (mq_notify (mqd, NULL)) /* unregister calling process */ - __leave; + if (fd < 0 || !fd->is_mqueue ()) + { + set_errno (EBADF); + __leave; + } + + if (mq_notify (mqd, NULL)) /* unregister calling process */ + __leave; fd->isclosed (true); fd->close (); diff --git a/winsup/cygwin/release/3.5.6 b/winsup/cygwin/release/3.5.6 new file mode 100644 index 0000000000..2bc485a559 --- /dev/null +++ b/winsup/cygwin/release/3.5.6 @@ -0,0 +1,24 @@ +Fixes: +------ + +- Fix a regression in 3.5.5 when checking for execute permissions in + execve(2) and access(2). + Addresses: https://cygwin.com/pipermail/cygwin/2024-December/256972.html + +- Fix a regression since 3.5.0 which fails to use POSIX semantics in + unlink/rename on NTFS. + +- Add fd validation where needed in mq_* functions. + Addresses: https://cygwin.com/pipermail/cygwin/2025-January/257090.html + +- Fix regression in 3.5.5 which causes process hangs. + Addresses: https://cygwin.com/pipermail/cygwin/2024-December/256954.html + Addresses: https://cygwin.com/pipermail/cygwin/2024-December/256971.html + Addresses: https://cygwin.com/pipermail/cygwin/2025-January/257058.html + Addresses: https://cygwin.com/pipermail/cygwin/2024-December/256987.html + +- Minor updates to load average calculations. + Addresses: https://cygwin.com/pipermail/cygwin/2024-August/256361.html + +- Fix mq_unlink(). + Addresses: https://cygwin.com/pipermail/cygwin/2025-January/257119.html diff --git a/winsup/cygwin/sec/base.cc b/winsup/cygwin/sec/base.cc index 2e50ce0c38..7c94f14028 100644 --- a/winsup/cygwin/sec/base.cc +++ b/winsup/cygwin/sec/base.cc @@ -603,8 +603,14 @@ check_access (security_descriptor &sd, GENERIC_MAPPING &mapping, int check_file_access (path_conv &pc, int flags, bool effective) { - int ret = -1; ACCESS_MASK desired = 0; + OBJECT_ATTRIBUTES attr; + IO_STATUS_BLOCK io; + NTSTATUS status; + HANDLE h = NULL; + ULONG opts = 0; + int ret = -1; + if (flags & R_OK) desired |= FILE_READ_DATA; if (flags & W_OK) @@ -612,16 +618,23 @@ check_file_access (path_conv &pc, int flags, bool effective) if (flags & X_OK) desired |= FILE_EXECUTE; + /* For R_OK and W_OK we check with FILE_OPEN_FOR_BACKUP_INTENT since + we want to enable the full power of backup/restore privileges. + For X_OK, drop the FILE_OPEN_FOR_BACKUP_INTENT flag. If the caller + holds SE_BACKUP_PRIVILEGE, FILE_OPEN_FOR_BACKUP_INTENT opens the file, + no matter what access is requested. + For directories, FILE_OPEN_FOR_BACKUP_INTENT flag is always required. */ + if (!(flags & X_OK) || pc.isdir ()) + opts = FILE_OPEN_FOR_BACKUP_INTENT; + else /* For a regular file to be executable, it must also be readable. */ + desired |= FILE_READ_DATA; + if (!effective) cygheap->user.deimpersonate (); - OBJECT_ATTRIBUTES attr; pc.init_reopen_attr (attr, pc.handle ()); - NTSTATUS status; - IO_STATUS_BLOCK io; - HANDLE h; - status = NtOpenFile (&h, desired, &attr, &io, FILE_SHARE_VALID_FLAGS, - FILE_OPEN_FOR_BACKUP_INTENT); + + status = NtOpenFile (&h, desired, &attr, &io, FILE_SHARE_VALID_FLAGS, opts); if (NT_SUCCESS (status)) { NtClose (h); diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index e584e960a7..7e8f356854 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -740,7 +740,7 @@ unlink_nt (path_conv &pc, bool shareable) easier and faster. Just try to do it and if it fails, it fails. */ if (wincap.has_posix_unlink_semantics () && !pc.isremote () && pc.fs_is_ntfs () - && pc.has_attribute (FILE_SUPPORTS_OPEN_BY_FILE_ID)) + && (pc.fs_flags () & FILE_SUPPORTS_OPEN_BY_FILE_ID)) { FILE_DISPOSITION_INFORMATION_EX fdie; @@ -774,18 +774,15 @@ unlink_nt (path_conv &pc, bool shareable) if (access & FILE_WRITE_ATTRIBUTES) NtSetAttributesFile (fh, pc.file_attributes ()); NtClose (fh); - /* Trying to delete in-use executables and DLLs using - FILE_DISPOSITION_POSIX_SEMANTICS returns STATUS_CANNOT_DELETE. - Fall back to the default method. */ - /* Additionaly that returns STATUS_INVALID_PARAMETER - on a bind mounted fs in hyper-v container. Falling back too. */ - if (status != STATUS_CANNOT_DELETE - && status != STATUS_INVALID_PARAMETER) - { - debug_printf ("NtSetInformationFile returns %y " - "with posix semantics. Disable it and retry.", status); - goto out; - } + /* Trying POSIX delete on in-use executables and DLLs returns + STATUS_CANNOT_DELETE. Trying POSIX delete on a bind mounted fs + in hyper-v container returns STATUS_INVALID_PARAMETER. + Fall back to default method in both cases. */ + if (status != STATUS_CANNOT_DELETE && status != STATUS_INVALID_PARAMETER) + goto out; + + debug_printf ("POSIX delete %S fails with %y, try default method", + pc.get_nt_native_path (), status); } /* If the R/O attribute is set, we have to open the file with @@ -1136,17 +1133,18 @@ unlink (const char *ourname) set_errno (EROFS); goto done; } - if (isdevfd_dev (devn) || (win32_name.isdevice () && !win32_name.issocket ())) - { - set_errno (EPERM); - goto done; - } if (!win32_name.exists ()) { debug_printf ("unlinking a nonexistent file"); set_errno (ENOENT); goto done; } + if (!win32_name.isondisk ()) + { + debug_printf ("unlinking a virtual file"); + set_errno (EPERM); + goto done; + } else if (win32_name.isdir ()) { debug_printf ("unlinking a directory"); @@ -2473,9 +2471,9 @@ rename2 (const char *oldpath, const char *newpath, unsigned int at2flags) /* POSIX semantics only on local NTFS drives. For the OPEN_BY_FILE_ID flag, see MINIMAL_WIN_NTFS_FLAGS comment in fs_info::update. */ use_posix_semantics = wincap.has_posix_rename_semantics () - && !oldpc.isremote () - && oldpc.fs_is_ntfs () - && oldpc.has_attribute (FILE_SUPPORTS_OPEN_BY_FILE_ID); + && !oldpc.isremote () + && oldpc.fs_is_ntfs () + && (oldpc.fs_flags () & FILE_SUPPORTS_OPEN_BY_FILE_ID); ignore_posix_semantics_retry: /* Opening the file must be part of the transaction. It's not sufficient diff --git a/winsup/doc/faq-setup.xml b/winsup/doc/faq-setup.xml index 15ae84c50f..17b11c9fbf 100644 --- a/winsup/doc/faq-setup.xml +++ b/winsup/doc/faq-setup.xml @@ -558,7 +558,7 @@ of Cygwin is as follows: the instructions in for all services that you installed. Common services that might have been -installed are sshd, cron, +installed are cygsshd, cron, cygserver, inetd, apache, postgresql, and so on. diff --git a/winsup/doc/faq-using.xml b/winsup/doc/faq-using.xml index e6a1a7c3f8..8a4eee99f0 100644 --- a/winsup/doc/faq-using.xml +++ b/winsup/doc/faq-using.xml @@ -168,7 +168,7 @@ will slow things down tremendously if it does not exist. If your service is one of those which switch the user context -(sshd, inetd, etc), then it depends on the method used to switch to +(cygsshd, inetd, etc), then it depends on the method used to switch to another user. This problem as well as its solution is described in detail in the Cygwin User's Guide, see . @@ -355,7 +355,9 @@ See the documentation for the option -noleaf in the man page. it has not been ported to Cygwin and has never worked. It is currently installed as part of the sh-utils, but again, it does not work. -You should rather install sshd and use +You should rather install sshd as a service +(the service will be called cygsshd so as not to +collide with the Microsoft sshd service) and use ssh username@localhost as a su replacement. @@ -535,7 +537,7 @@ running at the same time which conflict with each other. Apart from mixing executables of different Cygwin installations, this could also happen if you have one a single Cygwin installation, for example, if you update the Cygwin package without exiting all Cygwin apps (including -services like sshd) beforehand. +services like cygsshd) beforehand. The only DLL that is sanctioned by the Cygwin project is the one that you get by running the Cygwin Setup program, installed in a directory controlled by this program. If you have other @@ -987,75 +989,6 @@ create symlinks are just not available. - - Why does public key authentication with ssh fail after updating to Cygwin 1.7.34 or later? diff --git a/winsup/doc/highlights.xml b/winsup/doc/highlights.xml index 67e326cb4a..e1c05c5a48 100644 --- a/winsup/doc/highlights.xml +++ b/winsup/doc/highlights.xml @@ -87,9 +87,9 @@ that the root path is C:\Cygwin. So it looks for the fstab file in C:\Cygwin\etc\fstab. The layout of this file is very similar to the layout of the fstab file on Linux. Just instead of block devices, -the mount points point to Win32 paths. An installation with -setup.exe installs a fstab file by -default, which can easily be changed using the editor of your choice. +the mount points point to Win32 paths. On installation, a default +fstab file is created, which can easily be changed +using the editor of your choice. The fstab file allows mounting arbitrary Win32 paths into the POSIX file system space. A special case is the so-called diff --git a/winsup/doc/intro.xml b/winsup/doc/intro.xml index c683459790..a386099901 100644 --- a/winsup/doc/intro.xml +++ b/winsup/doc/intro.xml @@ -56,7 +56,7 @@ NOTES To port applications you will need to install the development tools, which you can do by selecting gcc in - setup.exe (dependencies are automatically handled). + the Cygwin Setup program (dependencies are automatically handled). If you need a specific program or library, you can search for a Cygwin package containing it at: diff --git a/winsup/doc/ntsec.xml b/winsup/doc/ntsec.xml index fd5b472b61..768c75a5ec 100644 --- a/winsup/doc/ntsec.xml +++ b/winsup/doc/ntsec.xml @@ -687,7 +687,7 @@ startup, you may wish to consider starting cygserver first in order to take advantage of this system-wide caching. To assure that cygserver has started -prior to starting sshd or other Cygwin processes, you may +prior to starting cygsshd or other Cygwin services, you may wish to create service startup dependencies. Cygserver should probably wait for Windows TCPIP and AFD services before it starts, and then @@ -707,7 +707,7 @@ shown below. You will need an administrative prompt to run the # Delay sshd until after Cygserver has started # Again note the (odd) required space character after "depend=" - sc config sshd depend= cygserver + sc config cygsshd depend= cygserver # View the Cygserver service details @@ -2230,8 +2230,8 @@ to 3.0 tried to creat a user token from scratch using an officially undocumented function NtCreateToken which is now disabled. -So we just start the servers which have to switch the user context -(sshd, inetd, cron, +So we just start the services which have to switch the user context +(cygsshd, inetd, cron, ...) as Windows services under the SYSTEM (or LocalSystem in the GUI) account and everything just works. Unfortunately that's too simple. Using S4U has a drawback. diff --git a/winsup/doc/ov-ex-unix.xml b/winsup/doc/ov-ex-unix.xml index c47a3992bb..28e351bc87 100644 --- a/winsup/doc/ov-ex-unix.xml +++ b/winsup/doc/ov-ex-unix.xml @@ -21,17 +21,18 @@ than most UNIX-like operating systems; these are described in more detail in . -Use the graphical command setup.exe any time you want -to update or install a Cygwin package. This program must be run -manually every time you want to check for updated packages since Cygwin +Use the graphical Cygwin Setup program (available from the +Cygwin homepage) +any time you want to update or install a Cygwin package. This program must +be run manually every time you want to check for updated packages since Cygwin does not currently include a mechanism for automatically detecting package updates. -By default, setup.exe only installs a minimal subset of +By default, the Cygwin Setup program only installs a minimal subset of packages. Add any other packages by clicking on the + next to the Category name and selecting the package from the displayed -list. You may search for specfic tools by using the +list. You may search for specific tools by using the Setup Package Search at the Cygwin web site. @@ -40,9 +41,8 @@ After installation, you can find Cygwin-specific documentation in the /usr/share/doc/Cygwin/ directory. -For more information about what each option in -setup.exe means, see . +For more information about what each option in Cygwin Setup means, +see . diff --git a/winsup/doc/ov-ex-win.xml b/winsup/doc/ov-ex-win.xml index 9a24021a72..7b5bf033e0 100644 --- a/winsup/doc/ov-ex-win.xml +++ b/winsup/doc/ov-ex-win.xml @@ -12,19 +12,19 @@ to become acquainted with UNIX basics (search for "UNIX basics" or "UNIX tutorial"). -To install a basic Cygwin environment, run the -setup.exe program and click Next +To install a basic Cygwin environment, run the Cygwin Setup program from +the Cygwin homepage and click +Next at each page. The default settings are correct for most users. If you want to know more about what each option means, see -. Use setup.exe +. Use the Cygwin Setup program any time you want to update or install a Cygwin package. If you are installing Cygwin for a specific purpose, use it to install the tools that you need. For example, if you want to compile C++ programs, you need the gcc-g++ package and probably a text -editor like nano. When running -setup.exe, clicking on categories and packages in the -package installation screen will provide you with the ability to control -what is installed or updated. +editor like nano. When running Cygwin Setup, +clicking on categories and packages in the package installation screen +will provide you with the ability to control what is installed or updated. After installation, you can find Cygwin-specific documentation in diff --git a/winsup/doc/overview.xml b/winsup/doc/overview.xml index aaaaef0cd3..4d312c714e 100644 --- a/winsup/doc/overview.xml +++ b/winsup/doc/overview.xml @@ -100,10 +100,9 @@ the GNU configure mechanism. Self hosting was achieved as of the beta The entire Cygwin toolset was available as a monolithic install. In April 2000, the project announced a -New Cygwin Net Release which provided the native non-Cygwin Win32 program -setup.exe to install and upgrade each package -separately. Since then, the Cygwin DLL and setup.exe -have seen continuous development. +New Cygwin Net Release which provided a graphical non-Cygwin +Setup program to install and upgrade each package separately. Since then, +the Cygwin DLL and the Setup tool have seen continuous development. diff --git a/winsup/doc/setup-net.xml b/winsup/doc/setup-net.xml index db39bb66c8..4475a622d1 100644 --- a/winsup/doc/setup-net.xml +++ b/winsup/doc/setup-net.xml @@ -94,8 +94,9 @@ or Just Me should always be left on the default All Users, unless you do not have write access to HKEY_LOCAL_MACHINE in the registry or the All Users Start Menu. This is true even if you are the only user planning to use Cygwin -on the machine. Selecting Just Me will cause problems -for programs such as crond and sshd. +on the machine. Note that selecting Just Me will cause +problems for Cygwin applications running as service, such as +crond or sshd. If you do not have the necessary permissions, but still want to use these programs, consult the Cygwin mailing list archives about others' experiences.