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

📄 utilities.c

📁 压缩包中包含LINUX下多个命令的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1988, 1993 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char sccsid[] = "@(#)utilities.c	8.3 (Berkeley) 5/30/95";#endif /* not lint */#ifdef HAVE_CONFIG_H#include <config.h>#endif#define	TELOPTS#define	TELCMDS#define	SLC_NAMES#include <arpa/telnet.h>#include <sys/types.h>#ifdef TIME_WITH_SYS_TIME# include <sys/time.h># include <time.h>#else# ifdef HAVE_SYS_TIME_H#  include <sys/time.h># else#  include <time.h># endif#endif#include <ctype.h>#include "general.h"#include "fdset.h"#include "ring.h"#include "defines.h"#include "externs.h"FILE	*NetTrace = 0;		/* Not in bss, since needs to stay */int	prettydump;/* * upcase() * *	Upcase (in place) the argument. */voidupcase(register char *argument){    register int c;    while ((c = *argument) != 0) {	if (islower(c)) {	    *argument = toupper(c);	}	argument++;    }}/* * SetSockOpt() * * Compensate for differences in 4.2 and 4.3 systems. */intSetSockOpt(int fd, int level, int option, int yesno){#ifndef	NOT43    return setsockopt(fd, level, option,				(char *)&yesno, sizeof yesno);#else	/* NOT43 */    if (yesno == 0) {		/* Can't do that in 4.2! */	fprintf(stderr, "Error: attempt to turn off an option 0x%x.\n",				option);	return -1;    }    return setsockopt(fd, level, option, 0, 0);#endif	/* NOT43 */}/* * The following are routines used to print out debugging information. */unsigned char NetTraceFile[256] = "(standard output)";voidSetNetTrace(register char *file){    if (NetTrace && NetTrace != stdout)	fclose(NetTrace);    if (file  && (strcmp(file, "-") != 0)) {	NetTrace = fopen(file, "w");	if (NetTrace) {	    strcpy((char *)NetTraceFile, file);	    return;	}	fprintf(stderr, "Cannot open %s.\n", file);    }    NetTrace = stdout;    strcpy((char *)NetTraceFile, "(standard output)");}voidDump(char direction, unsigned char *buffer, int length){#   define BYTES_PER_LINE	32#   define min(x,y)	((x<y)? x:y)    unsigned char *pThis;    int offset;    extern pettydump;    offset = 0;    while (length) {	/* print one line */	fprintf(NetTrace, "%c 0x%x\t", direction, offset);	pThis = buffer;	if (prettydump) {	    buffer = buffer + min(length, BYTES_PER_LINE/2);	    while (pThis < buffer) {		fprintf(NetTrace, "%c%.2x",		    (((*pThis)&0xff) == 0xff) ? '*' : ' ',		    (*pThis)&0xff);		pThis++;	    }	    length -= BYTES_PER_LINE/2;	    offset += BYTES_PER_LINE/2;	} else {	    buffer = buffer + min(length, BYTES_PER_LINE);	    while (pThis < buffer) {		fprintf(NetTrace, "%.2x", (*pThis)&0xff);		pThis++;	    }	    length -= BYTES_PER_LINE;	    offset += BYTES_PER_LINE;	}	if (NetTrace == stdout) {	    fprintf(NetTrace, "\r\n");	} else {	    fprintf(NetTrace, "\n");	}	if (length < 0) {	    fflush(NetTrace);	    return;	}	/* find next unique line */    }    fflush(NetTrace);}voidprintoption(char *direction, int cmd, int option){	if (!showoptions)		return;	if (cmd == IAC) {		if (TELCMD_OK(option))		    fprintf(NetTrace, "%s IAC %s", direction, TELCMD(option));		else		    fprintf(NetTrace, "%s IAC %d", direction, option);	} else {		register char *fmt;		fmt = (cmd == WILL) ? "WILL" : (cmd == WONT) ? "WONT" :			(cmd == DO) ? "DO" : (cmd == DONT) ? "DONT" : 0;		if (fmt) {		    fprintf(NetTrace, "%s %s ", direction, fmt);		    if (TELOPT_OK(option))			fprintf(NetTrace, "%s", TELOPT(option));		    else if (option == TELOPT_EXOPL)			fprintf(NetTrace, "EXOPL");		    else			fprintf(NetTrace, "%d", option);		} else		    fprintf(NetTrace, "%s %d %d", direction, cmd, option);	}	if (NetTrace == stdout) {	    fprintf(NetTrace, "\r\n");	    fflush(NetTrace);	} else {	    fprintf(NetTrace, "\n");	}	return;}voidoptionstatus(){    register int i;    extern char will_wont_resp[], do_dont_resp[];    for (i = 0; i < 256; i++) {	if (do_dont_resp[i]) {	    if (TELOPT_OK(i))		printf("resp DO_DONT %s: %d\n", TELOPT(i), do_dont_resp[i]);	    else if (TELCMD_OK(i))		printf("resp DO_DONT %s: %d\n", TELCMD(i), do_dont_resp[i]);	    else		printf("resp DO_DONT %d: %d\n", i,				do_dont_resp[i]);	    if (my_want_state_is_do(i)) {		if (TELOPT_OK(i))		    printf("want DO   %s\n", TELOPT(i));		else if (TELCMD_OK(i))		    printf("want DO   %s\n", TELCMD(i));		else		    printf("want DO   %d\n", i);	    } else {		if (TELOPT_OK(i))		    printf("want DONT %s\n", TELOPT(i));		else if (TELCMD_OK(i))		    printf("want DONT %s\n", TELCMD(i));		else		    printf("want DONT %d\n", i);	    }	} else {	    if (my_state_is_do(i)) {		if (TELOPT_OK(i))		    printf("     DO   %s\n", TELOPT(i));		else if (TELCMD_OK(i))		    printf("     DO   %s\n", TELCMD(i));		else		    printf("     DO   %d\n", i);	    }	}	if (will_wont_resp[i]) {	    if (TELOPT_OK(i))		printf("resp WILL_WONT %s: %d\n", TELOPT(i), will_wont_resp[i]);	    else if (TELCMD_OK(i))		printf("resp WILL_WONT %s: %d\n", TELCMD(i), will_wont_resp[i]);	    else		printf("resp WILL_WONT %d: %d\n",				i, will_wont_resp[i]);	    if (my_want_state_is_will(i)) {		if (TELOPT_OK(i))		    printf("want WILL %s\n", TELOPT(i));		else if (TELCMD_OK(i))		    printf("want WILL %s\n", TELCMD(i));		else		    printf("want WILL %d\n", i);	    } else {		if (TELOPT_OK(i))		    printf("want WONT %s\n", TELOPT(i));		else if (TELCMD_OK(i))		    printf("want WONT %s\n", TELCMD(i));		else		    printf("want WONT %d\n", i);	    }	} else {	    if (my_state_is_will(i)) {		if (TELOPT_OK(i))		    printf("     WILL %s\n", TELOPT(i));		else if (TELCMD_OK(i))		    printf("     WILL %s\n", TELCMD(i));		else		    printf("     WILL %d\n", i);	    }	}    }}/* char direction; '<' or '>' *//* unsigned char *pointer; where suboption data sits *//* int		  length; length of suboption data */voidprintsub(char direction, unsigned char *pointer, int length){    register int i;    char buf[512];    extern int want_status_response;    if (showoptions || direction == 0 ||	(want_status_response && (pointer[0] == TELOPT_STATUS))) {	if (direction) {	    fprintf(NetTrace, "%s IAC SB ",				(direction == '<')? "RCVD":"SENT");	    if (length >= 3) {		register int j;		i = pointer[length-2];		j = pointer[length-1];		if (i != IAC || j != SE) {		    fprintf(NetTrace, "(terminated by ");		    if (TELOPT_OK(i))			fprintf(NetTrace, "%s ", TELOPT(i));		    else if (TELCMD_OK(i))			fprintf(NetTrace, "%s ", TELCMD(i));		    else			fprintf(NetTrace, "%d ", i);		    if (TELOPT_OK(j))			fprintf(NetTrace, "%s", TELOPT(j));		    else if (TELCMD_OK(j))			fprintf(NetTrace, "%s", TELCMD(j));		    else			fprintf(NetTrace, "%d", j);		    fprintf(NetTrace, ", not IAC SE!) ");		}	    }	    length -= 2;	}	if (length < 1) {	    fprintf(NetTrace, "(Empty suboption??\?)");	    if (NetTrace == stdout)		fflush(NetTrace);	    return;	}	switch (pointer[0]) {	case TELOPT_TTYPE:	    fprintf(NetTrace, "TERMINAL-TYPE ");	    switch (pointer[1]) {	    case TELQUAL_IS:		fprintf(NetTrace, "IS \"%.*s\"", length-2, (char *)pointer+2);		break;	    case TELQUAL_SEND:		fprintf(NetTrace, "SEND");		break;	    default:		fprintf(NetTrace,				"- unknown qualifier %d (0x%x).",				pointer[1], pointer[1]);	    }	    break;	case TELOPT_TSPEED:	    fprintf(NetTrace, "TERMINAL-SPEED");	    if (length < 2) {		fprintf(NetTrace, " (empty suboption??\?)");		break;	    }	    switch (pointer[1]) {	    case TELQUAL_IS:		fprintf(NetTrace, " IS ");		fprintf(NetTrace, "%.*s", length-2, (char *)pointer+2);		break;	    default:		if (pointer[1] == 1)		    fprintf(NetTrace, " SEND");		else		    fprintf(NetTrace, " %d (unknown)", pointer[1]);		for (i = 2; i < length; i++)		    fprintf(NetTrace, " ?%d?", pointer[i]);		break;	    }	    break;	case TELOPT_LFLOW:	    fprintf(NetTrace, "TOGGLE-FLOW-CONTROL");	    if (length < 2) {		fprintf(NetTrace, " (empty suboption??\?)");		break;	    }	    switch (pointer[1]) {	    case LFLOW_OFF:		fprintf(NetTrace, " OFF"); break;	    case LFLOW_ON:		fprintf(NetTrace, " ON"); break;	    case LFLOW_RESTART_ANY:		fprintf(NetTrace, " RESTART-ANY"); break;	    case LFLOW_RESTART_XON:		fprintf(NetTrace, " RESTART-XON"); break;	    default:		fprintf(NetTrace, " %d (unknown)", pointer[1]);	    }	    for (i = 2; i < length; i++)		fprintf(NetTrace, " ?%d?", pointer[i]);	    break;	case TELOPT_NAWS:	    fprintf(NetTrace, "NAWS");	    if (length < 2) {		fprintf(NetTrace, " (empty suboption??\?)");		break;	    }	    if (length == 2) {		fprintf(NetTrace, " ?%d?", pointer[1]);		break;	    }	    fprintf(NetTrace, " %d %d (%d)",		pointer[1], pointer[2],		(int)((((unsigned int)pointer[1])<<8)|((unsigned int)pointer[2])));	    if (length == 4) {		fprintf(NetTrace, " ?%d?", pointer[3]);		break;	    }	    fprintf(NetTrace, " %d %d (%d)",		pointer[3], pointer[4],		(int)((((unsigned int)pointer[3])<<8)|((unsigned int)pointer[4])));	    for (i = 5; i < length; i++)		fprintf(NetTrace, " ?%d?", pointer[i]);	    break;#if	defined(AUTHENTICATION)	case TELOPT_AUTHENTICATION:	    fprintf(NetTrace, "AUTHENTICATION");	    if (length < 2) {		fprintf(NetTrace, " (empty suboption??\?)");		break;	    }	    switch (pointer[1]) {	    case TELQUAL_REPLY:	    case TELQUAL_IS:		fprintf(NetTrace, " %s ", (pointer[1] == TELQUAL_IS) ?							"IS" : "REPLY");		if (AUTHTYPE_NAME_OK(pointer[2]))		    fprintf(NetTrace, "%s ", AUTHTYPE_NAME(pointer[2]));		else		    fprintf(NetTrace, "%d ", pointer[2]);		if (length < 3) {		    fprintf(NetTrace, "(partial suboption??\?)");		    break;		}		fprintf(NetTrace, "%s|%s",			((pointer[3] & AUTH_WHO_MASK) == AUTH_WHO_CLIENT) ?			"CLIENT" : "SERVER",			((pointer[3] & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) ?			"MUTUAL" : "ONE-WAY");		auth_printsub(&pointer[1], length - 1, buf, sizeof(buf));		fprintf(NetTrace, "%s", buf);		break;	    case TELQUAL_SEND:		i = 2;		fprintf(NetTrace, " SEND ");		while (i < length) {		    if (AUTHTYPE_NAME_OK(pointer[i]))			fprintf(NetTrace, "%s ", AUTHTYPE_NAME(pointer[i]));		    else			fprintf(NetTrace, "%d ", pointer[i]);		    if (++i >= length) {			fprintf(NetTrace, "(partial suboption??\?)");			break;		    }		    fprintf(NetTrace, "%s|%s ",			((pointer[i] & AUTH_WHO_MASK) == AUTH_WHO_CLIENT) ?							"CLIENT" : "SERVER",			((pointer[i] & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) ?							"MUTUAL" : "ONE-WAY");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -