📄 doio.c
字号:
for (elem = hent->h_addr_list; *elem; elem++) { (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_nset(str, *elem, len); }#else (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_nset(str, hent->h_addr, len);#endif /* h_addr */#else /* lint */ elem = Nullch; elem = elem; (void)astore(ary, ++sp, str_mortal(&str_no));#endif /* lint */ } return sp;}intdo_gnent(which,gimme,arglast)int which;int gimme;int *arglast;{ register ARRAY *ary = stack; register int sp = arglast[0]; register char **elem; register STR *str; struct netent *getnetbyname(); struct netent *getnetbyaddr(); struct netent *getnetent(); struct netent *nent; if (which == O_GNBYNAME) { char *name = str_get(ary->ary_array[sp+1]); nent = getnetbyname(name); } else if (which == O_GNBYADDR) { unsigned long addr = U_L(str_gnum(ary->ary_array[sp+1])); int addrtype = (int)str_gnum(ary->ary_array[sp+2]); nent = getnetbyaddr((long)addr,addrtype); } else nent = getnetent(); if (gimme != G_ARRAY) { astore(ary, ++sp, str = str_mortal(&str_undef)); if (nent) { if (which == O_GNBYNAME) str_numset(str, (double)nent->n_net); else str_set(str, nent->n_name); } return sp; } if (nent) {#ifndef lint (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_set(str, nent->n_name); (void)astore(ary, ++sp, str = str_mortal(&str_no)); for (elem = nent->n_aliases; *elem; elem++) { str_cat(str, *elem); if (elem[1]) str_ncat(str," ",1); } (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_numset(str, (double)nent->n_addrtype); (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_numset(str, (double)nent->n_net);#else /* lint */ elem = Nullch; elem = elem; (void)astore(ary, ++sp, str_mortal(&str_no));#endif /* lint */ } return sp;}intdo_gpent(which,gimme,arglast)int which;int gimme;int *arglast;{ register ARRAY *ary = stack; register int sp = arglast[0]; register char **elem; register STR *str; struct protoent *getprotobyname(); struct protoent *getprotobynumber(); struct protoent *getprotoent(); struct protoent *pent; if (which == O_GPBYNAME) { char *name = str_get(ary->ary_array[sp+1]); pent = getprotobyname(name); } else if (which == O_GPBYNUMBER) { int proto = (int)str_gnum(ary->ary_array[sp+1]); pent = getprotobynumber(proto); } else pent = getprotoent(); if (gimme != G_ARRAY) { astore(ary, ++sp, str = str_mortal(&str_undef)); if (pent) { if (which == O_GPBYNAME) str_numset(str, (double)pent->p_proto); else str_set(str, pent->p_name); } return sp; } if (pent) {#ifndef lint (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_set(str, pent->p_name); (void)astore(ary, ++sp, str = str_mortal(&str_no)); for (elem = pent->p_aliases; *elem; elem++) { str_cat(str, *elem); if (elem[1]) str_ncat(str," ",1); } (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_numset(str, (double)pent->p_proto);#else /* lint */ elem = Nullch; elem = elem; (void)astore(ary, ++sp, str_mortal(&str_no));#endif /* lint */ } return sp;}intdo_gsent(which,gimme,arglast)int which;int gimme;int *arglast;{ register ARRAY *ary = stack; register int sp = arglast[0]; register char **elem; register STR *str; struct servent *getservbyname(); struct servent *getservbynumber(); struct servent *getservent(); struct servent *sent; if (which == O_GSBYNAME) { char *name = str_get(ary->ary_array[sp+1]); char *proto = str_get(ary->ary_array[sp+2]); if (proto && !*proto) proto = Nullch; sent = getservbyname(name,proto); } else if (which == O_GSBYPORT) { int port = (int)str_gnum(ary->ary_array[sp+1]); char *proto = str_get(ary->ary_array[sp+2]); sent = getservbyport(port,proto); } else sent = getservent(); if (gimme != G_ARRAY) { astore(ary, ++sp, str = str_mortal(&str_undef)); if (sent) { if (which == O_GSBYNAME) {#ifdef HAS_NTOHS str_numset(str, (double)ntohs(sent->s_port));#else str_numset(str, (double)(sent->s_port));#endif } else str_set(str, sent->s_name); } return sp; } if (sent) {#ifndef lint (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_set(str, sent->s_name); (void)astore(ary, ++sp, str = str_mortal(&str_no)); for (elem = sent->s_aliases; *elem; elem++) { str_cat(str, *elem); if (elem[1]) str_ncat(str," ",1); } (void)astore(ary, ++sp, str = str_mortal(&str_no));#ifdef HAS_NTOHS str_numset(str, (double)ntohs(sent->s_port));#else str_numset(str, (double)(sent->s_port));#endif (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_set(str, sent->s_proto);#else /* lint */ elem = Nullch; elem = elem; (void)astore(ary, ++sp, str_mortal(&str_no));#endif /* lint */ } return sp;}#endif /* HAS_SOCKET */#ifdef HAS_SELECTintdo_select(gimme,arglast)int gimme;int *arglast;{ register STR **st = stack->ary_array; register int sp = arglast[0]; register int i; register int j; register char *s; register STR *str; double value; int maxlen = 0; int nfound; struct timeval timebuf; struct timeval *tbuf = &timebuf; int growsize;#if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678 int masksize; int offset; char *fd_sets[4]; int k;#if BYTEORDER & 0xf0000#define ORDERBYTE (0x88888888 - BYTEORDER)#else#define ORDERBYTE (0x4444 - BYTEORDER)#endif#endif for (i = 1; i <= 3; i++) { j = st[sp+i]->str_cur; if (maxlen < j) maxlen = j; }#if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678 growsize = maxlen; /* little endians can use vecs directly */#else#ifdef NFDBITS#ifndef NBBY#define NBBY 8#endif masksize = NFDBITS / NBBY;#else masksize = sizeof(long); /* documented int, everyone seems to use long */#endif growsize = maxlen + (masksize - (maxlen % masksize)); Zero(&fd_sets[0], 4, char*);#endif for (i = 1; i <= 3; i++) { str = st[sp+i]; j = str->str_len; if (j < growsize) { if (str->str_pok) { Str_Grow(str,growsize); s = str_get(str) + j; while (++j <= growsize) { *s++ = '\0'; } } else if (str->str_ptr) { Safefree(str->str_ptr); str->str_ptr = Nullch; } }#if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678 s = str->str_ptr; if (s) { New(403, fd_sets[i], growsize, char); for (offset = 0; offset < growsize; offset += masksize) { for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4)) fd_sets[i][j+offset] = s[(k % masksize) + offset]; } }#endif } str = st[sp+4]; if (str->str_nok || str->str_pok) { value = str_gnum(str); if (value < 0.0) value = 0.0; timebuf.tv_sec = (long)value; value -= (double)timebuf.tv_sec; timebuf.tv_usec = (long)(value * 1000000.0); } else tbuf = Null(struct timeval*);#if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678 nfound = select( maxlen * 8, st[sp+1]->str_ptr, st[sp+2]->str_ptr, st[sp+3]->str_ptr, tbuf);#else nfound = select( maxlen * 8, fd_sets[1], fd_sets[2], fd_sets[3], tbuf); for (i = 1; i <= 3; i++) { if (fd_sets[i]) { str = st[sp+i]; s = str->str_ptr; for (offset = 0; offset < growsize; offset += masksize) { for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4)) s[(k % masksize) + offset] = fd_sets[i][j+offset]; } Safefree(fd_sets[i]); } }#endif st[++sp] = str_mortal(&str_no); str_numset(st[sp], (double)nfound); if (gimme == G_ARRAY && tbuf) { value = (double)(timebuf.tv_sec) + (double)(timebuf.tv_usec) / 1000000.0; st[++sp] = str_mortal(&str_no); str_numset(st[sp], value); } return sp;}#endif /* SELECT */#ifdef HAS_SOCKETintdo_spair(stab1, stab2, arglast)STAB *stab1;STAB *stab2;int *arglast;{ register STR **st = stack->ary_array; register int sp = arglast[2]; register STIO *stio1; register STIO *stio2; int domain, type, protocol, fd[2]; if (!stab1 || !stab2) return FALSE; stio1 = stab_io(stab1); stio2 = stab_io(stab2); if (!stio1) stio1 = stab_io(stab1) = stio_new(); else if (stio1->ifp) do_close(stab1,FALSE); if (!stio2) stio2 = stab_io(stab2) = stio_new(); else if (stio2->ifp) do_close(stab2,FALSE); domain = (int)str_gnum(st[++sp]); type = (int)str_gnum(st[++sp]); protocol = (int)str_gnum(st[++sp]);#ifdef TAINT taintproper("Insecure dependency in socketpair");#endif#ifdef HAS_SOCKETPAIR if (socketpair(domain,type,protocol,fd) < 0) return FALSE;#else fatal("Socketpair unimplemented");#endif stio1->ifp = fdopen(fd[0], "r"); stio1->ofp = fdopen(fd[0], "w"); stio1->type = 's'; stio2->ifp = fdopen(fd[1], "r"); stio2->ofp = fdopen(fd[1], "w"); stio2->type = 's'; if (!stio1->ifp || !stio1->ofp || !stio2->ifp || !stio2->ofp) { if (stio1->ifp) fclose(stio1->ifp); if (stio1->ofp) fclose(stio1->ofp); if (!stio1->ifp && !stio1->ofp) close(fd[0]); if (stio2->ifp) fclose(stio2->ifp); if (stio2->ofp) fclose(stio2->ofp); if (!stio2->ifp && !stio2->ofp) close(fd[1]); return FALSE; } return TRUE;}#endif /* HAS_SOCKET */intdo_gpwent(which,gimme,arglast)int which;int gimme;int *arglast;{#ifdef I_PWD register ARRAY *ary = stack; register int sp = arglast[0]; register STR *str; struct passwd *getpwnam(); struct passwd *getpwuid(); struct passwd *getpwent(); struct passwd *pwent; if (which == O_GPWNAM) { char *name = str_get(ary->ary_array[sp+1]); pwent = getpwnam(name); } else if (which == O_GPWUID) { int uid = (int)str_gnum(ary->ary_array[sp+1]); pwent = getpwuid(uid); } else pwent = getpwent(); if (gimme != G_ARRAY) { astore(ary, ++sp, str = str_mortal(&str_undef)); if (pwent) { if (which == O_GPWNAM) str_numset(str, (double)pwent->pw_uid); else str_set(str, pwent->pw_name); } return sp; } if (pwent) { (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_set(str, pwent->pw_name); (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_set(str, pwent->pw_passwd); (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_numset(str, (double)pwent->pw_uid); (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_numset(str, (double)pwent->pw_gid); (void)astore(ary, ++sp, str = str_mortal(&str_no));#ifdef PWCHANGE str_numset(str, (double)pwent->pw_change);#else#ifdef PWQUOTA str_numset(str, (double)pwent->pw_quota);#else#ifdef PWAGE str_set(str, pwent->pw_age);#endif#endif#endif (void)astore(ary, ++sp, str = str_mortal(&str_no));#ifdef PWCLASS str_set(str,pwent->pw_class);#else#ifdef PWCOMMENT str_set(str, pwent->pw_comment);#endif#endif (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_set(str, pwent->pw_gecos); (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_set(str, pwent->pw_dir); (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_set(str, pwent->pw_shell);#ifdef PWEXPIRE (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_numset(str, (double)pwent->pw_expire);#endif } return sp;#else fatal("password routines not implemented");#endif}intdo_ggrent(which,gimme,arglast)int which;int gimme;int *arglast;{#ifdef I_GRP register ARRAY *ary = stack; register int sp = arglast[0]; register char **elem; register STR *str; struct group *getgrnam(); struct group *getgrgid(); struct group *getgrent(); struct group *grent; if (which == O_GGRNAM) { char *name = str_get(ary->ary_array[sp+1]); grent = getgrnam(name); } else if (which == O_GGRGID) { int gid = (int)str_gnum(ary->ary_array[sp+1]); grent = getgrgid(gid); } else grent = getgrent(); if (gimme != G_ARRAY) { astore(ary, ++sp, str = str_mortal(&str_undef)); if (grent) { if (which == O_GGRNAM) str_numset(str, (double)grent->gr_gid); else str_set(str, grent->gr_name); } return sp; } if (grent) { (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_set(str, grent->gr_name); (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_set(str, grent->gr_passwd); (void)astore(ary, ++sp, str = str_mortal(&str_no)); str_numset(str, (double)grent->gr_gid); (void)astore(ary, ++sp, str = str_mortal(&str_no)); for (elem = grent->gr_mem; *elem; elem++) { str_cat(str, *elem); if (elem[1]) str_ncat(str," ",1); } } return sp;#else fatal("group routines not implemented");#endif}intdo_dirop(optype,stab,gimme,arglast)int optype;STAB *stab;int gimme;int *arglast;{#if defined(DIRENT) && defined(HAS_READDIR) register ARRAY *ary = stack; register STR **st = ary->ary_array; register int sp = arglast[1]; register STIO *stio; long along;#ifndef apollo struct DIRENT *readdir();#endif register struct DIRENT *dp; if (!stab) goto nope; if (!(stio = stab_io(stab))) stio = stab_io(stab) = stio_new(); if (!stio->dirp && optype != O_OPEN_DIR) goto nope; st[sp] = &str_yes; switch (optype) { case O_OPEN_DIR:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -