ECode CSerialPort::Open( /* [in] */ IParcelFileDescriptor* pfd, /* [in] */ Int32 speed) { AutoPtr<IFileDescriptor> fd; pfd->GetFileDescriptor((IFileDescriptor**)&fd); native_open(fd, speed); mFileDescriptor = pfd; return NOERROR; }
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); }
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)); }