Date: Sun, 5 Mar 2000 20:22:25 +0000 (GMT) From: Jose Marques <noway@nohow.demon.co.uk> To: Joe Shevland <shevlandj@kpi.com.au> Cc: SADA Kenji <sada@rr.iij4u.or.jp>, sada@FreeBSD.ORG, freebsd-java@FreeBSD.ORG Subject: RE: linux-jdk-1.2.2 ports Message-ID: <Pine.BSF.4.21.0003052020460.2631-100000@nohow.demon.co.uk> In-Reply-To: <NDBBLJFAELMHMDPDFAGLKENGCAAA.shevlandj@kpi.com.au>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 6 Mar 2000, Joe Shevland wrote: > This was sent roughly about a month ago and > worked out for me then... And the following patch for FreeBSD 4.0-CURRENT was posted to FreeBSD-current a few days ago: Perhaps somebody can test them and send-pr them? NB: I've not tried this patch myself yet. -8<- cut here ---- From=20salaman@teknos.com Sun Mar 5 20:20:33 2000 Date: Wed, 23 Feb 2000 16:40:43 -0400 From: Victor A. Salaman <salaman@teknos.com> To: "'freebsd-current@freebsd.org'" <freebsd-current@freebsd.org>, "'freebsd-emulation@freebsd.org'" <freebsd-emulation@freebsd.org> Subject: Linux Emulation patches [ Part 1, Text/PLAIN 123 lines. ] [ Unable to print this part. ] Hi: =A0 I was wondering who mantains the Linux Emulation? I have some patches that were sent to me for FreeBSD-3.4, I have converted them to FreeBSD 4.0-Current for Linux emulation problems. Specifically anyone trying to use any program that opens a server socket will get bitten by the emulation unless these patches are applied ( JServ, Resin, Tomcat are some Java programs affected by this... and=A0since Sun hasn't release a JDK 1.2 for FreeBSD,=A0well, the only way to run some server programs=A0is with Blackdown, but=A0without these patches they are useless ). =A0 Anyways, after sending email to marcel and peter with the patches, I haven't even received a reply. So therefore, I'm posting them here, in case anyone wants to commit them at all. I feel 4.0 shouldn't go out with a known broken linux emulation. =A0 --- /usr/src/sys/i386/linux/linux_file.c=A0Wed Feb 23 16:11:50 2000 +++ /usr/src/sys/i386/linux/linux_file.orig=A0Wed Feb 23 16:11:37 2000 @@ -199,6 +199,12 @@ =A0=A0=A0=A0 } */ fcntl_args; =A0=A0=A0=A0 struct linux_flock linux_flock; =A0=A0=A0=A0 struct flock *bsd_flock; +=A0=A0=A0 struct filedesc *fdp; +=A0=A0=A0 struct file *fp; +=A0=A0=A0 struct vnode *vp; +=A0=A0=A0 long pgid; +=A0=A0=A0 struct pgrp *pgrp; +=A0=A0=A0 struct tty *tp; =A0=A0=A0=A0 caddr_t sg; =A0=A0=A0=A0 dev_t dev; =A0 @@ -283,9 +289,47 @@ =A0 =A0=A0=A0=A0 case LINUX_F_SETOWN: =A0=A0=A0=A0 case LINUX_F_GETOWN: -=A0fcntl_args.cmd =3D args->cmd =3D=3D LINUX_F_SETOWN ? F_SETOWN : F_GETOW= N; -=A0fcntl_args.arg =3D args->arg; -=A0return fcntl(p, &fcntl_args); +=A0/* +=A0 * We need to route around the normal fcntl() for these calls, +=A0 * since it uses TIOC{G,S}PGRP, which is too restrictive for +=A0 * Linux F_{G,S}ETOWN semantics. For sockets, this problem +=A0 * does not exist. +=A0 */ +=A0fdp =3D p->p_fd; +=A0if ((u_int)args->fd >=3D fdp->fd_nfiles || +=A0=A0(fp =3D fdp->fd_ofiles[args->fd]) =3D=3D NULL) +=A0=A0=A0=A0 return EBADF; +=A0if (fp->f_type =3D=3D DTYPE_SOCKET) { +=A0=A0=A0=A0 fcntl_args.cmd =3D args->cmd =3D=3D LINUX_F_SETOWN ? F_SETOWN= : F_GETOWN; +=A0=A0=A0 =A0=A0=A0=A0 fcntl_args.arg =3D args->arg; +=A0=A0=A0=A0 return fcntl(p, &fcntl_args); +=A0} +=A0vp =3D (struct vnode *)fp->f_data; +=A0dev =3D vn_todev(vp); +=A0if (dev =3D=3D NODEV) +=A0=A0=A0=A0 return EINVAL; +=A0if (!(devsw(dev)->d_flags & D_TTY)) +=A0=A0=A0=A0 return EINVAL; +=A0tp =3D dev->si_tty; +=A0if (!tp) +=A0=A0=A0=A0 return EINVAL; +=A0if (args->cmd =3D=3D LINUX_F_GETOWN) { +=A0=A0=A0=A0 p->p_retval[0] =3D tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID; +=A0=A0=A0=A0 return 0; +=A0} +=A0if ((long)args->arg <=3D 0) { +=A0=A0=A0=A0 pgid =3D -(long)args->arg; +=A0} else { +=A0=A0=A0=A0 struct proc *p1 =3D pfind((long)args->arg); +=A0=A0=A0=A0 if (p1 =3D=3D 0) +=A0=A0return (ESRCH); +=A0=A0=A0=A0 pgid =3D (long)p1->p_pgrp->pg_id; +=A0} +=A0pgrp =3D pgfind(pgid); +=A0if (pgrp =3D=3D NULL || pgrp->pg_session !=3D p->p_session) +=A0=A0=A0=A0 return EPERM; +=A0tp->t_pgrp =3D pgrp; +=A0return 0; =A0=A0=A0=A0 } =A0=A0=A0=A0 return EINVAL; =A0} --- /usr/src/sys/i386/linux/linux_socket.c=A0Wed Feb 23 16:11:50 2000 +++ /usr/src/sys/i386/linux/linux_socket.orig=A0Wed Feb 23 16:11:48 2000 @@ -441,11 +441,6 @@ =A0=A0caddr_t name; =A0=A0int *anamelen; =A0=A0=A0=A0 } */ bsd_args; -=A0=A0=A0 struct fcntl_args /* { -=A0=A0=A0 int fd; -=A0=A0=A0 int cmd; -=A0=A0=A0 long arg; -=A0=A0=A0 } */ f_args; =A0=A0=A0=A0 int error; =A0 =A0=A0=A0=A0 if ((error=3Dcopyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) @@ -453,24 +448,7 @@ =A0=A0=A0=A0 bsd_args.s =3D linux_args.s; =A0=A0=A0=A0 bsd_args.name =3D (caddr_t)linux_args.addr; =A0=A0=A0=A0 bsd_args.anamelen =3D linux_args.namelen; - -=A0=A0=A0 if (error =3D oaccept(p, &bsd_args)) -=A0return error; -=A0=A0=A0 /* -=A0=A0=A0=A0 * linux appears not to copy flags from the parent socket to t= he -=A0=A0=A0=A0 * accepted one, so we must clear the flags in the new descrip= tor. -=A0=A0=A0=A0 */ -=A0=A0=A0 f_args.fd =3D p->p_retval[0]; -=A0=A0=A0 f_args.cmd =3D F_SETFL; -=A0=A0=A0 f_args.arg =3D 0; -=A0=A0 /* -=A0=A0=A0=A0 * we ignore errors here since otherwise we would have an open= file -=A0=A0=A0=A0 * descriptor that wasn't returned to the user. -=A0=A0=A0=A0 */ -=A0=A0=A0 (void) fcntl(p, &f_args); -=A0=A0=A0 /* put the file descriptor back as the return value */ -=A0=A0=A0 p->p_retval[0] =3D f_args.fd; -=A0=A0=A0 return 0; +=A0=A0=A0 return oaccept(p, &bsd_args); =A0} =A0 =A0struct linux_getsockname_args { -8<- cut here ---- --=20 Jose Marques To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-java" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0003052020460.2631-100000>