* 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. * syslog.cc (syslog): Teach syslog about syslog priorities other than LOG_ERR, LOG_WARNING and LOG_INFO * path.cc (path_conv::check): Don't perform file system or rootdir checks on devices.
This commit is contained in:
parent
8af0f81d52
commit
32fb80db07
|
@ -1,3 +1,21 @@
|
||||||
|
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>
|
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.
|
* dcrt0.cc (dll_crt0_1): Don't close hexec_proc if it is NULL.
|
||||||
|
|
|
@ -83,15 +83,9 @@ opendir (const char *dirname)
|
||||||
DIR *res = 0;
|
DIR *res = 0;
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
|
|
||||||
path_conv real_dirname (dirname, PC_SYM_FOLLOW | PC_FULL);
|
path_conv real_dirname;
|
||||||
|
|
||||||
if (real_dirname.error)
|
if (stat_worker (dirname, &statbuf, 1, &real_dirname) == -1)
|
||||||
{
|
|
||||||
set_errno (real_dirname.error);
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stat (real_dirname, &statbuf) == -1)
|
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
if (!(statbuf.st_mode & S_IFDIR))
|
if (!(statbuf.st_mode & S_IFDIR))
|
||||||
|
|
|
@ -471,8 +471,6 @@ path_conv::check (const char *src, unsigned opt,
|
||||||
if (error)
|
if (error)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
update_fs_info (full_path);
|
|
||||||
|
|
||||||
/* devn should not be a device. If it is, then stop parsing now. */
|
/* devn should not be a device. If it is, then stop parsing now. */
|
||||||
if (devn != FH_BAD)
|
if (devn != FH_BAD)
|
||||||
{
|
{
|
||||||
|
@ -480,6 +478,8 @@ path_conv::check (const char *src, unsigned opt,
|
||||||
goto out; /* Found a device. Stop parsing. */
|
goto out; /* Found a device. Stop parsing. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_fs_info (full_path);
|
||||||
|
|
||||||
/* Eat trailing slashes */
|
/* Eat trailing slashes */
|
||||||
char *dostail = strchr (full_path, '\0');
|
char *dostail = strchr (full_path, '\0');
|
||||||
|
|
||||||
|
@ -668,24 +668,27 @@ out:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
update_fs_info (path);
|
if (devn == FH_BAD)
|
||||||
if (!fs_name[0])
|
|
||||||
{
|
{
|
||||||
set_has_acls (FALSE);
|
update_fs_info (path);
|
||||||
set_has_buggy_open (FALSE);
|
if (!fs_name[0])
|
||||||
}
|
{
|
||||||
else
|
set_has_acls (FALSE);
|
||||||
{
|
set_has_buggy_open (FALSE);
|
||||||
set_isdisk ();
|
}
|
||||||
debug_printf ("root_dir(%s), this->path(%s), set_has_acls(%d)",
|
|
||||||
root_dir, this->path, fs_flags & FS_PERSISTENT_ACLS);
|
|
||||||
if (!allow_smbntsec && is_remote_drive)
|
|
||||||
set_has_acls (FALSE);
|
|
||||||
else
|
else
|
||||||
set_has_acls (fs_flags & FS_PERSISTENT_ACLS);
|
{
|
||||||
/* Known file systems with buggy open calls. Further explanation
|
set_isdisk ();
|
||||||
in fhandler.cc (fhandler_disk_file::open). */
|
debug_printf ("root_dir(%s), this->path(%s), set_has_acls(%d)",
|
||||||
set_has_buggy_open (strcmp (fs_name, "SUNWNFS") == 0);
|
root_dir, this->path, fs_flags & FS_PERSISTENT_ACLS);
|
||||||
|
if (!allow_smbntsec && 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 (!(opt & PC_FULL))
|
if (!(opt & PC_FULL))
|
||||||
|
|
|
@ -1067,9 +1067,8 @@ suffix_info stat_suffixes[] =
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Cygwin internal */
|
/* Cygwin internal */
|
||||||
static int
|
int __stdcall
|
||||||
stat_worker (const char *caller, const char *name, struct stat *buf,
|
stat_worker (const char *name, struct stat *buf, int nofollow, path_conv *pc)
|
||||||
int nofollow)
|
|
||||||
{
|
{
|
||||||
int res = -1;
|
int res = -1;
|
||||||
int oret;
|
int oret;
|
||||||
|
@ -1078,36 +1077,38 @@ stat_worker (const char *caller, const char *name, struct stat *buf,
|
||||||
path_conv real_path;
|
path_conv real_path;
|
||||||
fhandler_base *fh = NULL;
|
fhandler_base *fh = NULL;
|
||||||
|
|
||||||
|
if (!pc)
|
||||||
|
pc = &real_path;
|
||||||
MALLOC_CHECK;
|
MALLOC_CHECK;
|
||||||
int open_flags = O_RDONLY | O_BINARY | O_DIROPEN
|
int open_flags = O_RDONLY | O_BINARY | O_DIROPEN
|
||||||
| (nofollow ? O_NOSYMLINK : 0);
|
| (nofollow ? O_NOSYMLINK : 0);
|
||||||
|
|
||||||
debug_printf ("%s (%s, %p)", caller, name, buf);
|
|
||||||
|
|
||||||
if (check_null_invalid_struct_errno (buf))
|
if (check_null_invalid_struct_errno (buf))
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
fh = cygheap->fdtab.build_fhandler_from_name (-1, name, NULL, real_path,
|
fh = cygheap->fdtab.build_fhandler_from_name (-1, name, NULL, *pc,
|
||||||
(nofollow ?
|
(nofollow ?
|
||||||
PC_SYM_NOFOLLOW
|
PC_SYM_NOFOLLOW
|
||||||
: PC_SYM_FOLLOW)
|
: PC_SYM_FOLLOW)
|
||||||
| PC_FULL, stat_suffixes);
|
| PC_FULL, stat_suffixes);
|
||||||
if (real_path.error)
|
if (pc->error)
|
||||||
{
|
{
|
||||||
set_errno (real_path.error);
|
set_errno (pc->error);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
debug_printf ("(%s, %p, %d, %p)", name, buf, nofollow, pc);
|
||||||
|
|
||||||
memset (buf, 0, sizeof (struct stat));
|
memset (buf, 0, sizeof (struct stat));
|
||||||
|
|
||||||
if (real_path.is_device ())
|
if (pc->is_device ())
|
||||||
return stat_dev (real_path.get_devn (), real_path.get_unitn (),
|
return stat_dev (pc->get_devn (), pc->get_unitn (),
|
||||||
hash_path_name (0, real_path.get_win32 ()), buf);
|
hash_path_name (0, pc->get_win32 ()), buf);
|
||||||
|
|
||||||
debug_printf ("%d = file_attributes for '%s'", (DWORD) real_path,
|
debug_printf ("%d = file_attributes for '%s'", (DWORD) real_path,
|
||||||
(char *) real_path);
|
(char *) real_path);
|
||||||
|
|
||||||
if ((oret = fh->open (&real_path, open_flags, 0)))
|
if ((oret = fh->open (pc, open_flags, 0)))
|
||||||
/* ok */;
|
/* ok */;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1115,9 +1116,9 @@ stat_worker (const char *caller, const char *name, struct stat *buf,
|
||||||
/* If we couldn't open the file, try a "query open" with no permissions.
|
/* 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. */
|
This will allow us to determine *some* things about the file, at least. */
|
||||||
fh->set_query_open (TRUE);
|
fh->set_query_open (TRUE);
|
||||||
if ((oret = fh->open (&real_path, open_flags, 0)))
|
if ((oret = fh->open (pc, open_flags, 0)))
|
||||||
/* ok */;
|
/* ok */;
|
||||||
else if (allow_ntsec && real_path.has_acls () && get_errno () == EACCES
|
else if (allow_ntsec && pc->has_acls () && get_errno () == EACCES
|
||||||
&& !get_file_attribute (TRUE, real_path, &ntsec_atts, &uid, &gid)
|
&& !get_file_attribute (TRUE, real_path, &ntsec_atts, &uid, &gid)
|
||||||
&& !ntsec_atts && uid == myself->uid && gid == myself->gid)
|
&& !ntsec_atts && uid == myself->uid && gid == myself->gid)
|
||||||
{
|
{
|
||||||
|
@ -1127,7 +1128,7 @@ stat_worker (const char *caller, const char *name, struct stat *buf,
|
||||||
in a failing open call in the same process. Check that
|
in a failing open call in the same process. Check that
|
||||||
case. */
|
case. */
|
||||||
set_file_attribute (TRUE, real_path, 0400);
|
set_file_attribute (TRUE, real_path, 0400);
|
||||||
oret = fh->open (&real_path, open_flags, 0);
|
oret = fh->open (pc, open_flags, 0);
|
||||||
set_file_attribute (TRUE, real_path, ntsec_atts);
|
set_file_attribute (TRUE, real_path, ntsec_atts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1141,44 +1142,44 @@ stat_worker (const char *caller, const char *name, struct stat *buf,
|
||||||
set the number of links to 2. */
|
set the number of links to 2. */
|
||||||
/* Unfortunately the count of 2 confuses `find (1)' command. So
|
/* Unfortunately the count of 2 confuses `find (1)' command. So
|
||||||
let's try it with `1' as link count. */
|
let's try it with `1' as link count. */
|
||||||
if (real_path.isdir ())
|
if (pc->isdir ())
|
||||||
buf->st_nlink = (real_path.isremote ()
|
buf->st_nlink = (pc->isremote ()
|
||||||
? 1 : num_entries (real_path.get_win32 ()));
|
? 1 : num_entries (pc->get_win32 ()));
|
||||||
fh->close ();
|
fh->close ();
|
||||||
}
|
}
|
||||||
else if (real_path.exists ())
|
else if (pc->exists ())
|
||||||
{
|
{
|
||||||
/* Unfortunately, the above open may fail if the file exists, though.
|
/* Unfortunately, the above open may fail if the file exists, though.
|
||||||
So we have to care for this case here, too. */
|
So we have to care for this case here, too. */
|
||||||
WIN32_FIND_DATA wfd;
|
WIN32_FIND_DATA wfd;
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
buf->st_nlink = 1;
|
buf->st_nlink = 1;
|
||||||
if (real_path.isdir () && real_path.isremote ())
|
if (pc->isdir () && pc->isremote ())
|
||||||
buf->st_nlink = num_entries (real_path.get_win32 ());
|
buf->st_nlink = num_entries (pc->get_win32 ());
|
||||||
buf->st_dev = FHDEVN (FH_DISK) << 8;
|
buf->st_dev = FHDEVN (FH_DISK) << 8;
|
||||||
buf->st_ino = hash_path_name (0, real_path.get_win32 ());
|
buf->st_ino = hash_path_name (0, pc->get_win32 ());
|
||||||
if (real_path.isdir ())
|
if (pc->isdir ())
|
||||||
buf->st_mode = S_IFDIR;
|
buf->st_mode = S_IFDIR;
|
||||||
else if (real_path.issymlink ())
|
else if (pc->issymlink ())
|
||||||
buf->st_mode = S_IFLNK;
|
buf->st_mode = S_IFLNK;
|
||||||
else if (real_path.issocket ())
|
else if (pc->issocket ())
|
||||||
buf->st_mode = S_IFSOCK;
|
buf->st_mode = S_IFSOCK;
|
||||||
else
|
else
|
||||||
buf->st_mode = S_IFREG;
|
buf->st_mode = S_IFREG;
|
||||||
if (!real_path.has_acls ()
|
if (!pc->has_acls ()
|
||||||
|| get_file_attribute (TRUE, real_path.get_win32 (),
|
|| get_file_attribute (TRUE, pc->get_win32 (),
|
||||||
&buf->st_mode,
|
&buf->st_mode,
|
||||||
&buf->st_uid, &buf->st_gid))
|
&buf->st_uid, &buf->st_gid))
|
||||||
{
|
{
|
||||||
buf->st_mode |= STD_RBITS | STD_XBITS;
|
buf->st_mode |= STD_RBITS | STD_XBITS;
|
||||||
if (!(real_path.has_attribute (FILE_ATTRIBUTE_READONLY)))
|
if (!(pc->has_attribute (FILE_ATTRIBUTE_READONLY)))
|
||||||
buf->st_mode |= STD_WBITS;
|
buf->st_mode |= STD_WBITS;
|
||||||
if (real_path.issymlink ())
|
if (pc->issymlink ())
|
||||||
buf->st_mode |= S_IRWXU | S_IRWXG | S_IRWXO;
|
buf->st_mode |= S_IRWXU | S_IRWXG | S_IRWXO;
|
||||||
get_file_attribute (FALSE, real_path.get_win32 (),
|
get_file_attribute (FALSE, pc->get_win32 (),
|
||||||
NULL, &buf->st_uid, &buf->st_gid);
|
NULL, &buf->st_uid, &buf->st_gid);
|
||||||
}
|
}
|
||||||
if ((handle = FindFirstFile (real_path.get_win32 (), &wfd))
|
if ((handle = FindFirstFile (pc->get_win32 (), &wfd))
|
||||||
!= INVALID_HANDLE_VALUE)
|
!= INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
buf->st_atime = to_time_t (&wfd.ftLastAccessTime);
|
buf->st_atime = to_time_t (&wfd.ftLastAccessTime);
|
||||||
|
@ -1197,7 +1198,7 @@ stat_worker (const char *caller, const char *name, struct stat *buf,
|
||||||
if (fh)
|
if (fh)
|
||||||
delete fh;
|
delete fh;
|
||||||
MALLOC_CHECK;
|
MALLOC_CHECK;
|
||||||
syscall_printf ("%d = %s (%s, %p)", res, caller, name, buf);
|
syscall_printf ("%d = (%s, %p)", res, name, buf);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1205,7 +1206,8 @@ extern "C" int
|
||||||
_stat (const char *name, struct stat *buf)
|
_stat (const char *name, struct stat *buf)
|
||||||
{
|
{
|
||||||
sigframe thisframe (mainthread);
|
sigframe thisframe (mainthread);
|
||||||
return stat_worker ("stat", name, buf, 0);
|
syscall_printf ("entering");
|
||||||
|
return stat_worker (name, buf, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* lstat: Provided by SVR4 and 4.3+BSD, POSIX? */
|
/* lstat: Provided by SVR4 and 4.3+BSD, POSIX? */
|
||||||
|
@ -1213,7 +1215,8 @@ extern "C" int
|
||||||
lstat (const char *name, struct stat *buf)
|
lstat (const char *name, struct stat *buf)
|
||||||
{
|
{
|
||||||
sigframe thisframe (mainthread);
|
sigframe thisframe (mainthread);
|
||||||
return stat_worker ("lstat", name, buf, 1);
|
syscall_printf ("entering");
|
||||||
|
return stat_worker (name, buf, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int acl_access (const char *, int);
|
extern int acl_access (const char *, int);
|
||||||
|
|
|
@ -257,13 +257,18 @@ syslog (int priority, const char *message, ...)
|
||||||
WORD eventType;
|
WORD eventType;
|
||||||
switch (LOG_PRI (priority))
|
switch (LOG_PRI (priority))
|
||||||
{
|
{
|
||||||
|
case LOG_EMERG:
|
||||||
|
case LOG_ALERT:
|
||||||
|
case LOG_CRIT:
|
||||||
case LOG_ERR:
|
case LOG_ERR:
|
||||||
eventType = EVENTLOG_ERROR_TYPE;
|
eventType = EVENTLOG_ERROR_TYPE;
|
||||||
break;
|
break;
|
||||||
case LOG_WARNING:
|
case LOG_WARNING:
|
||||||
eventType = EVENTLOG_WARNING_TYPE;
|
eventType = EVENTLOG_WARNING_TYPE;
|
||||||
break;
|
break;
|
||||||
|
case LOG_NOTICE:
|
||||||
case LOG_INFO:
|
case LOG_INFO:
|
||||||
|
case LOG_DEBUG:
|
||||||
eventType = EVENTLOG_INFORMATION_TYPE;
|
eventType = EVENTLOG_INFORMATION_TYPE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -307,14 +312,29 @@ syslog (int priority, const char *message, ...)
|
||||||
eventlog capability. */
|
eventlog capability. */
|
||||||
switch (LOG_PRI (priority))
|
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:
|
case LOG_ERR:
|
||||||
pass.print ("%s : ", "LOG_ERR");
|
pass.print ("%s : ", "LOG_ERR");
|
||||||
break;
|
break;
|
||||||
case LOG_WARNING:
|
case LOG_WARNING:
|
||||||
pass.print ("%s : ", "LOG_WARNING");
|
pass.print ("%s : ", "LOG_WARNING");
|
||||||
break;
|
break;
|
||||||
|
case LOG_NOTICE:
|
||||||
|
pass.print ("%s : ", "LOG_NOTICE");
|
||||||
|
break;
|
||||||
case LOG_INFO:
|
case LOG_INFO:
|
||||||
pass.print ("%s : ", "LOG_INFO");
|
pass.print ("%s : ", "LOG_INFO");
|
||||||
|
break;
|
||||||
|
case LOG_DEBUG:
|
||||||
|
pass.print ("%s : ", "LOG_DEBUG");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
pass.print ("%s : ", "LOG_ERR");
|
pass.print ("%s : ", "LOG_ERR");
|
||||||
|
|
|
@ -214,6 +214,10 @@ extern "C" void __malloc_unlock (struct _reent *);
|
||||||
extern "C" void __malloc_lock (struct _reent *);
|
extern "C" void __malloc_lock (struct _reent *);
|
||||||
extern "C" void __malloc_unlock (struct _reent *);
|
extern "C" void __malloc_unlock (struct _reent *);
|
||||||
|
|
||||||
|
class path_conv;
|
||||||
|
int __stdcall stat_worker (const char *name, struct stat *buf, int nofollow,
|
||||||
|
path_conv *pc = NULL) __attribute__ ((regparm (3)));
|
||||||
|
|
||||||
/**************************** Exports ******************************/
|
/**************************** Exports ******************************/
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
Loading…
Reference in New Issue