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

📄 environ.cc

📁 这是关于远程登陆TELNET 的源代码 已经测试过的。
💻 CC
字号:
#include <unistd.h>#include <stdlib.h>#include <string.h>#include <netdb.h>#include <arpa/telnet.h>#include "ring.h"#include "defines.h"#include "externs.h"#include "environ.h"#include "array.h"class enviro { protected:    char *var;	        /* pointer to variable name */    char *value;        /* pointer to variable's value */    int doexport;       /* 1 -> export with default list of variables */    void clean() { if (var) delete []var; if (value) delete []value; } public:    enviro() { var = value = NULL; doexport = 0; }    ~enviro() { clean(); }    const char *getname() const { return var; }    const char *getval() const { return value; }    void define(const char *vr, const char *vl) {	clean();	var = strcpy(new char[strlen(vr)+1], vr);	value = strcpy(new char[strlen(vl)+1], vl);    }    void clear() { clean(); var = value = NULL; }    void setexport(int ex) { doexport = ex; }    int getexport() const { return doexport; }};static array<enviro> vars;static enviro *env_find(const char *var) {    for (int i=0; i<vars.num(); i++) if (vars[i].getname()) {	if (!strcmp(vars[i].getname(), var))	    return &vars[i];    }    return NULL;}static void env_put(const char *var, const char *val, int exp) {    enviro *ep = env_find(var);    if (!ep) {	int x = vars.num();	vars.setsize(x+1);	ep = &vars[x];    }	    ep->define(var, val);    ep->setexport(exp);}static void env_copy(void) {    extern char **environ;    char *s;    int i;        for (i=0; environ[i]; i++) {	s = strchr(environ[i], '=');	if (s) {	    *s=0;	    env_put(environ[i], s+1, 0);	    *s='=';	}    }}/* * Special case for DISPLAY variable.  If it is ":0.0" or * "unix:0.0", we have to get rid of "unix" and insert our * hostname. */static void env_fix_display(void) {    enviro *ep = env_find("DISPLAY");    if (!ep) return;    ep->setexport(1);    if (strncmp(ep->getval(), ":", 1) && strncmp(ep->getval(), "unix:", 5)) {	return;    }    char hbuf[256];    const char *cp2 = strrchr(ep->getval(), ':');    int maxlen = sizeof(hbuf)-strlen(cp2)-1;    gethostname(hbuf, maxlen);    hbuf[maxlen] = 0;  /* ensure null termination */    /*     * dholland 7/30/96 if not a FQDN ask DNS     */    if (!strchr(hbuf, '.')) {	struct hostent *h = gethostbyname(hbuf);	if (h) {	    strncpy(hbuf, h->h_name, maxlen);	    hbuf[maxlen] = 0; /* ensure null termination */	}    }    strcat(hbuf, cp2);    ep->define("DISPLAY", hbuf);}/*********************************************** interface ***********/void env_init(void) {    env_copy();    env_fix_display();    /*     * If USER is not defined, but LOGNAME is, then add     * USER with the value from LOGNAME.  By default, we     * don't export the USER variable.     */    if (!env_find("USER")) {	enviro *ep = env_find("LOGNAME");	if (ep) env_put("USER", ep->getval(), 0);    }    enviro *ep = env_find("PRINTER");    if (ep) ep->setexport(1);}void env_define(const char *var, const char *value) {    env_put(var, value, 1);}void env_undefine(const char *var) {    enviro *ep = env_find(var);    if (ep) {	/*	 * We don't make any effort to reuse cleared environment spaces.	 * It's highly unlikely to be worth the trouble.	 */	ep->clear();    }}void env_export(const char *var) {    enviro *ep = env_find(var);    if (ep) ep->setexport(1);}void env_unexport(const char *var) {    enviro *ep = env_find(var);    if (ep) ep->setexport(0);}void env_send(const char *var) {    if (my_state_is_wont(TELOPT_ENVIRON)) {	fprintf(stderr, "Cannot send '%s': Telnet ENVIRON option disabled\n",		var);	return;    }    enviro *ep = env_find(var);    if (!ep) {	fprintf(stderr, "Cannot send '%s': variable not defined\n", var);	return;    }    env_opt_start_info();    env_opt_add(ep->getname());    env_opt_end(0);}void env_list(void) {    for (int i=0; i<vars.num(); i++) if (vars[i].getname()) {	printf("%c %-20s %s\n", vars[i].getexport() ? '*' : ' ',	       vars[i].getname(), vars[i].getval());    }}void env_iterate(int *iter, int /*exported_only*/) {    *iter = 0;}const char *env_next(int *iter, int exported_only) {    while (*iter>=0 && *iter<vars.num()) {	int k = (*iter)++;	if (!vars[k].getname()) continue; // deleted variable	if (vars[k].getexport() || !exported_only) {	    return vars[k].getname();	}    }    return NULL;}const char *env_getvalue(const char *var, int exported_only) {    enviro *ep = env_find(var);    if (ep && (!exported_only || ep->getexport()))    	return ep->getval();    return NULL;}

⌨️ 快捷键说明

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