ssize_t read(int d,void *buf,size_t nbytes) { StdFileDes *sfd = _lx_fhfromfd(d); if (sfd) { long r; __chkabort(); if((r=Read(sfd->lx_fh,buf,nbytes))!=EOF) return r; __seterrno(); } return EOF; }
off_t lseek(int d,off_t offset,int whence) { StdFileDes *sfd = _lx_fhfromfd(d); if (sfd) { long r,file=sfd->lx_fh; __chkabort(); if (Seek(file,offset,whence==SEEK_SET?OFFSET_BEGINNING: whence==SEEK_END?OFFSET_END:OFFSET_CURRENT)!=EOF) if ((r=Seek(file,0,OFFSET_CURRENT))!=EOF) return r; __seterrno(); } return EOF; }
int close(int d) { StdFileDes *sfd = _lx_fhfromfd(d); if (sfd) { if (!(sfd->lx_inuse-=1)) { if (sfd->lx_pos=d,!sfd->lx_sys) { if (!Close(sfd->lx_fh)) { __seterrno(); return EOF; } } } else { stdfiledes[d] = 0; } } return 0; }
ssize_t write(int d,const void *buf,size_t nbytes) { StdFileDes *sfd = _lx_fhfromfd(d); if (sfd) { long r; __chkabort(); switch((sfd->lx_oflags&O_APPEND)!=0) { case 1: if(!sfd->lx_isatty&&(Seek(sfd->lx_fh,0,OFFSET_END)==EOF)) break; default: if((r=Write(sfd->lx_fh,(char *)buf,nbytes))!=EOF) return r; } __seterrno(); } return EOF; }
int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, int *fromlen) { struct SocketSettings *lss; StdFileDes *fp = _lx_fhfromfd(s); int rc; switch (lss=_lx_get_socket_settings(),lss->lx_network_type) { case LX_AS225: rc = SOCK_recvfrom(fp->lx_sock,buf,len,flags, from, fromlen); break; case LX_AMITCP: rc = TCP_RecvFrom(fp->lx_sock,buf,len,flags, from, fromlen); break; default: rc = -1; break; } return rc; }
int shutdown(int s, int how) { struct SocketSettings *lss; StdFileDes *fp = _lx_fhfromfd(s); int rc; switch (lss=_lx_get_socket_settings(),lss->lx_network_type) { case LX_AS225: rc = SOCK_shutdown(fp->lx_sock,how); break; case LX_AMITCP: rc = TCP_ShutDown(fp->lx_sock,how); break; default: rc = 0; break; } return rc; }
int recvmsg(int s, struct msghdr *msg, int flags) { struct SocketSettings *lss; StdFileDes *fp = _lx_fhfromfd(s); int rc; switch (lss=_lx_get_socket_settings(),lss->lx_network_type) { case LX_AS225: rc = SOCK_recvmsg(fp->lx_sock,msg,flags); break; case LX_AMITCP: rc = TCP_RecvMsg(fp->lx_sock,msg,flags); break; default: rc = -1; break; } return rc; }
int getpeername(int s, struct sockaddr *asa, int *alen) { struct SocketSettings *lss; StdFileDes *fp = _lx_fhfromfd(s); int rc; switch (lss=_lx_get_socket_settings(),lss->lx_network_type) { case LX_AS225: rc = SOCK_getpeername(fp->lx_sock,asa,alen); break; case LX_AMITCP: rc = TCP_GetPeerName(fp->lx_sock,asa,alen); break; default: rc = -1; break; } return rc; }
int getsockopt(int s, int level, int name, void *val, int *valsize) { struct SocketSettings *lss; StdFileDes *fp = _lx_fhfromfd(s); int rc; switch (lss=_lx_get_socket_settings(),lss->lx_network_type) { case LX_AS225: rc = SOCK_getsockopt(fp->lx_sock,level,name,val, valsize); break; case LX_AMITCP: rc = TCP_GetSockOpt(fp->lx_sock,level,name,val, valsize); break; default: rc = 0; break; } return rc; }
int listen(int s, int backlog) { struct SocketSettings *lss; register StdFileDes *fp; int rc; if ((fp=_lx_fhfromfd(s))) { switch (lss=_lx_get_socket_settings(),lss->lx_network_type) { case LX_AS225: rc = SOCK_listen(fp->lx_sock, backlog); break; case LX_AMITCP: rc = TCP_Listen(fp->lx_sock, backlog); break; default: rc = -1; break; } } else rc = -1; return rc; }
int ioctl(int s, unsigned long cmd, ...) { struct SocketSettings *lss; StdFileDes *fp = _lx_fhfromfd(s); int arglen,inout,rc; caddr_t data; va_list va; if (fp->lx_type == LX_FILE) { errno = EBADF; return -1; } va_start(va, cmd); inout = va_arg(va, int); arglen = va_arg(va, int); data = va_arg(va, caddr_t); va_end(va); switch (lss=_lx_get_socket_settings(),lss->lx_network_type) { case LX_AS225: /* _SIGH_... they left almost everything neatly as it was in the BSD kernel * code they used, but for whatever reason they decided they needed their * own kind of ioctl encoding :-(( * * Well then, here we go, and map `normal' cmds into CBM cmds: */ switch (cmd) { case SIOCADDRT : cmd = ('r'<<8)|1; break; case SIOCDELRT : cmd = ('r'<<8)|2; break; case SIOCSIFADDR : cmd = ('i'<<8)|3; break; case SIOCGIFADDR : cmd = ('i'<<8)|4; break; case SIOCSIFDSTADDR : cmd = ('i'<<8)|5; break; case SIOCGIFDSTADDR : cmd = ('i'<<8)|6; break; case SIOCSIFFLAGS : cmd = ('i'<<8)|7; break; case SIOCGIFFLAGS : cmd = ('i'<<8)|8; break; case SIOCGIFCONF : cmd = ('i'<<8)|9; break; case SIOCSIFMTU : cmd = ('i'<<8)|10; break; case SIOCGIFMTU : cmd = ('i'<<8)|11; break; case SIOCGIFBRDADDR : cmd = ('i'<<8)|12; break; case SIOCSIFBRDADDR : cmd = ('i'<<8)|13; break; case SIOCGIFNETMASK : cmd = ('i'<<8)|14; break; case SIOCSIFNETMASK : cmd = ('i'<<8)|15; break; case SIOCGIFMETRIC : cmd = ('i'<<8)|16; break; case SIOCSIFMETRIC : cmd = ('i'<<8)|17; break; case SIOCSARP : cmd = ('i'<<8)|18; break; case SIOCGARP : cmd = ('i'<<8)|19; break; case SIOCDARP : cmd = ('i'<<8)|20; break; case SIOCATMARK : cmd = ('i'<<8)|21; break; case FIONBIO : cmd = ('m'<<8)|22; break; case FIONREAD : cmd = ('m'<<8)|23; break; case FIOASYNC : cmd = ('m'<<8)|24; break; case SIOCSPGRP : cmd = ('m'<<8)|25; break; case SIOCGPGRP : cmd = ('m'<<8)|26; break; default: /* we really don't have to bother the library with cmds we can't even * map over... */ break; } rc = SOCK_ioctl(fp->lx_sock,cmd,data); break; case LX_AMITCP: rc = TCP_IoctlSocket(fp->lx_sock,cmd,data); break; default: rc = 0; break; } return rc; }
int _lx_addflags(int d,int oflags) { StdFileDes *sfd = _lx_fhfromfd(d); return sfd?sfd->lx_oflags|=oflags:0; }
int isatty(int d) { StdFileDes *sfd = _lx_fhfromfd(d); return sfd?sfd->lx_isatty:0; }