Exemplo n.º 1
0
ECode CSerialPort::Open(
    /* [in] */ IParcelFileDescriptor* pfd,
    /* [in] */ Int32 speed)
{
    AutoPtr<IFileDescriptor> fd;
    pfd->GetFileDescriptor((IFileDescriptor**)&fd);
    native_open(fd, speed);
    mFileDescriptor = pfd;
    return NOERROR;
}
Exemplo n.º 2
0
int open(const char *path, int flags, ...)
{
	va_list ap;
	int data;

	va_start(ap, flags);
	data = va_arg(ap, int);
	va_end(ap);

	if (strcmp(path,TUNTAPPATH)==0 && tapfd[0] == -1) {
		if (socketpair(PF_UNIX, SOCK_DGRAM, 0,tapfd) == 0)
			return tapfd[0];
		else
			return -1;

	} else
		return native_open(path, flags, data);
}
Exemplo n.º 3
0
int ioctl(int fd, unsigned long int command, ...)
#endif
{
	va_list ap;
	char *data;
	char *vdesock;
	int pid;
	int callerpid=getpid();

	va_start(ap, command);
	data = va_arg(ap, char *);
	va_end(ap);

	if (fd == tapfd[0]) {
		if (command == TUNSETIFF) {
			struct ifreq *ifr = (struct ifreq *) data;
			char num[5];
			char name[10];
			char scallerpid[6];

			ifr->ifr_name[IFNAMSIZ-1] = '\0';
			if (ifr->ifr_name[0] == 0) {
				if (ifr->ifr_flags & IFF_TAP) 
					sprintf(name,"tap%d",tapcount++);
				else
					sprintf(name,"tun%d",tuncount++);
				strncpy(ifr->ifr_name,name,IFNAMSIZ);
			}
			else if (strchr(ifr->ifr_name, '%') != NULL) {
				sprintf(name,ifr->ifr_name,tapcount++);
				strncpy(ifr->ifr_name,name,IFNAMSIZ);
			}
			if ((ifr->ifr_flags & IFF_TAP) && (
					/* from env: single interface or VDEALLTAP */
					((vdesock=getenv(ifr->ifr_name)) != NULL) ||
						(vdesock=getenv(VDEALLTAP)) != NULL)
				 ){
				if ((pid=fork()) < 0) { 
					close(tapfd[1]);
					errno=EINVAL;
					return -1;
				} else if (pid > 0) { /*father*/
					if((pid=addpid(pid)) < 0) {
						close(tapfd[0]);
						close(tapfd[1]);
						return -1;
					} else {
						close(tapfd[1]);
						return 0;
					}
				} else { /*son*/
					plh=NULL;
					close(tapfd[0]);
					sprintf(num,"%d",tapfd[1]);
					sprintf(scallerpid,"%d",callerpid);
					return execlp(VDETAPEXEC,"-",num,vdesock,ifr->ifr_name,
							scallerpid,
							getvdeopt(ifr,"port"),
							getvdeopt(ifr,"group"),
							getvdeopt(ifr,"mode"),
							(char *) 0);
				}
			}
			else /*roll back to the native tuntap*/
			{
				int newfd;
				int saverrno;
				int resultioctl;
				close(tapfd[1]);
				if ((newfd=native_open(TUNTAPPATH,  O_RDWR, 0)) < 0) {
					saverrno=errno;
					close(tapfd[0]);
					errno=saverrno;
					return -1;
				} else
				{
					resultioctl=native_ioctl(fd, command, data);
					if (resultioctl < 0) {
						saverrno=errno;
						close(tapfd[0]);
						errno=saverrno;
						return -1;
					} else {
						dup2(newfd,tapfd[0]);
						return resultioctl;
					}
				}
			}
		} else  
			return 0;
	} else 
		return (native_ioctl(fd, command, data));
}