summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2006-01-26 01:32:46 +0000
committercognet <cognet@FreeBSD.org>2006-01-26 01:32:46 +0000
commitd6ecc915cc27c2d4d19e9d25926a18aae2eb5e13 (patch)
treebfc9e20a70f6bb0baac20efbd33dc290aa7a6058 /sys/compat
parentaff5d6bf80c7cee1d2a2e3b664554663ba72ae78 (diff)
downloadFreeBSD-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')
-rw-r--r--sys/compat/linux/linux_ioctl.c10
-rw-r--r--sys/compat/linux/linux_ioctl.h2
-rw-r--r--sys/compat/linux/linux_stats.c22
3 files changed, 33 insertions, 1 deletions
diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c
index 44b5fa5..14568e2 100644
--- a/sys/compat/linux/linux_ioctl.c
+++ b/sys/compat/linux/linux_ioctl.c
@@ -1010,7 +1010,15 @@ linux_ioctl_termio(struct thread *td, struct linux_ioctl_args *args)
args->cmd = TIOCCBRK;
error = (ioctl(td, (struct ioctl_args *)args));
break;
-
+ case LINUX_TIOCGPTN: {
+ int nb;
+
+ error = fo_ioctl(fp, TIOCGPTN, (caddr_t)&nb, td->td_ucred, td);
+ if (!error)
+ error = copyout(&nb, (void *)args->arg,
+ sizeof(int));
+ break;
+ }
default:
error = ENOIOCTL;
break;
diff --git a/sys/compat/linux/linux_ioctl.h b/sys/compat/linux/linux_ioctl.h
index 96243dd..5e3b520 100644
--- a/sys/compat/linux/linux_ioctl.h
+++ b/sys/compat/linux/linux_ioctl.h
@@ -362,6 +362,8 @@
#define LINUX_TIOCSBRK 0x5427
#define LINUX_TIOCCBRK 0x5428
+#define LINUX_TIOCGPTN 0x5430
+
#ifdef __alpha__
#define LINUX_FIOCLEX 0x6601
#define LINUX_FIONCLEX 0x6602
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);
OpenPOWER on IntegriCloud