diff options
author | cognet <cognet@FreeBSD.org> | 2006-01-26 01:32:46 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2006-01-26 01:32:46 +0000 |
commit | d6ecc915cc27c2d4d19e9d25926a18aae2eb5e13 (patch) | |
tree | bfc9e20a70f6bb0baac20efbd33dc290aa7a6058 /sys/compat/linux/linux_stats.c | |
parent | aff5d6bf80c7cee1d2a2e3b664554663ba72ae78 (diff) | |
download | FreeBSD-src-d6ecc915cc27c2d4d19e9d25926a18aae2eb5e13.zip FreeBSD-src-d6ecc915cc27c2d4d19e9d25926a18aae2eb5e13.tar.gz |
Linux compat bits needed to make linux programs use the new ptys :
linux_ioctl.[ch] : Implement LINUX_TIOCGPTN, which returns the pty number
linux_stats.c :
- Return the magic number for devfs.
- In various stats()-related functions, check that we're stating a
file in /dev/pts, and if so, change the st_rdev field to match what linux
expects to be there for a slave pty device. The glibc checks for this, and
their openpty() fails if it is no correct.
Diffstat (limited to 'sys/compat/linux/linux_stats.c')
-rw-r--r-- | sys/compat/linux/linux_stats.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/sys/compat/linux/linux_stats.c b/sys/compat/linux/linux_stats.c index d0c5231..be67b80 100644 --- a/sys/compat/linux/linux_stats.c +++ b/sys/compat/linux/linux_stats.c @@ -132,6 +132,16 @@ linux_newstat(struct thread *td, struct linux_newstat_args *args) #endif error = kern_stat(td, path, UIO_SYSSPACE, &buf); + if (!error && strlen(path) > strlen("/dev/pts/") && + !strncmp(path, "/dev/pts/", strlen("/dev/pts/")) + && path[9] >= '0' && path[9] <= '9') { + /* + * Linux checks major and minors of the slave device to make + * sure it's a pty deivce, so let's make him believe it is. + */ + buf.st_rdev = (136 << 8); + } + LFREEPATH(path); if (error) return (error); @@ -201,6 +211,7 @@ struct l_statfs { #define LINUX_NTFS_SUPER_MAGIC 0x5346544EL #define LINUX_PROC_SUPER_MAGIC 0x9fa0L #define LINUX_UFS_SUPER_MAGIC 0x00011954L /* XXX - UFS_MAGIC in Linux */ +#define LINUX_DEVFS_SUPER_MAGIC 0x1373L static long bsd_to_linux_ftype(const char *fstypename) @@ -217,6 +228,7 @@ bsd_to_linux_ftype(const char *fstypename) {"nwfs", LINUX_NCP_SUPER_MAGIC}, {"hpfs", LINUX_HPFS_SUPER_MAGIC}, {"coda", LINUX_CODA_SUPER_MAGIC}, + {"devfs", LINUX_DEVFS_SUPER_MAGIC}, {NULL, 0L}}; for (i = 0; b2l_tbl[i].bsd_name != NULL; i++) @@ -397,6 +409,16 @@ linux_stat64(struct thread *td, struct linux_stat64_args *args) #endif error = kern_stat(td, filename, UIO_SYSSPACE, &buf); + if (!error && strlen(filename) > strlen("/dev/pts/") && + !strncmp(filename, "/dev/pts/", strlen("/dev/pts/")) + && filename[9] >= '0' && filename[9] <= '9') { + /* + * Linux checks major and minors of the slave device to make + * sure it's a pty deivce, so let's make him believe it is. + */ + buf.st_rdev = (136 << 8); + } + LFREEPATH(filename); if (error) return (error); |