⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 doio.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -