コード例 #1
0
ファイル: sc.c プロジェクト: OldsSourcesBackups/kitty
CK_SESSION_HANDLE sc_get_session(void *f, int try_write_syslog, CK_FUNCTION_LIST_PTR fl,
                                 const char *token_label) {
#define SC_MAX_SLOT 16
    CK_SESSION_HANDLE session = 0;
    unsigned long slot_count = SC_MAX_SLOT;
    CK_TOKEN_INFO token_info;
    CK_SLOT_ID slots[SC_MAX_SLOT];
    CK_SLOT_ID c_slot = SC_MAX_SLOT;
    CK_SLOT_ID slot = SC_MAX_SLOT;
    CK_RV rv  = 0;
    int i;
    char msg[SC_STR_MAX_LEN] = "";

    if(fl == 0) {
        sprintf(msg, "sc: Invalid state, no function list");
        goto err;
    }
    rv = fl->C_GetSlotList(TRUE, slots, &slot_count);
    if(CKR_OK != rv) {
        sprintf(msg, "sc: C_GetSlotList failed 0x%.4x", (int)rv);
        goto err;
    }
    if(slot_count < 1) {
        sprintf(msg, "sc: No token available");
        goto err;
    }
    for(i=0; i<slot_count; i++) {
        slot = slots[i];
        rv = fl->C_GetTokenInfo(slot,&token_info);
        if (CKR_OK != rv) {
            sprintf(msg, "sc: C_GetTokenInfo failed for token in slot %i", i);
            goto err;
        }
        {
            char buf[40];
            memset(buf, 0, 40);
            int j;
            strncpy(buf, token_info.label, 30);
            for(j=29;j>0;j--) {
                if(buf[j] == ' ') {
                    buf[j] = '\0';
                } else {
                    break;
                }
            }
            sprintf(msg, "sc: Found token in slot %i: %s", i, buf);
            if(f) {
                logevent(f, msg);
                if(try_write_syslog) sc_write_syslog(msg);
            }
        }
        if(strncmp(token_label, token_info.label, strlen(token_label)) == 0) {
            c_slot = i;
            break;
        }
    }
    if(c_slot == 64) {
        sprintf(msg, "sc: No token named: %s", token_label);
        goto err;
    }              
    rv = fl->C_OpenSession(slots[c_slot],CKF_SERIAL_SESSION|CKF_RW_SESSION, 0, 0, &session);
    if (CKR_OK != rv) {
        sprintf(msg, "sc: C_OpenSession failed");
        goto err;
    } else {
        if(f) logevent(f, "sc: Session opened");
    }
    return session;
 err:
    if(f) {
        logevent(f, msg);
        if(try_write_syslog) sc_write_syslog(msg);
    }
    //  m_fl->C_Finalize(0);
    //  m_fl = 0;
    return 0;
}
コード例 #2
0
ファイル: rlogin.c プロジェクト: kleopatra999/PuTTY
/*
 * Called to set up the rlogin connection.
 * 
 * Returns an error message, or NULL on success.
 *
 * Also places the canonical host name into `realhost'. It must be
 * freed by the caller.
 */
static const char *rlogin_init(void *frontend_handle, void **backend_handle,
                               Config *cfg,
                               char *host, int port, char **realhost,
                               int nodelay, int keepalive)
{
    static const struct plug_function_table fn_table = {
        rlogin_log,
        rlogin_closing,
        rlogin_receive,
        raw_sent
    };
    SockAddr addr;
    const char *err;
    Rlogin rlogin;
    char ruser[sizeof(cfg->username)];

    rlogin = snew(struct rlogin_tag);
    rlogin->fn = &fn_table;
    rlogin->s = NULL;
    rlogin->frontend = frontend_handle;
    rlogin->term_width = cfg->width;
    rlogin->term_height = cfg->height;
    rlogin->firstbyte = 1;
    rlogin->cansize = 0;
    rlogin->prompt = NULL;
    rlogin->cfg = *cfg;                /* STRUCTURE COPY */
    *backend_handle = rlogin;

    /*
     * Try to find host.
     */
    {
        char *buf;
        buf = dupprintf("Looking up host \"%s\"%s", host,
                        (cfg->addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" :
                         (cfg->addressfamily == ADDRTYPE_IPV6 ? " (IPv6)" :
                          "")));
        logevent(rlogin->frontend, buf);
        sfree(buf);
    }
    addr = name_lookup(host, port, realhost, cfg, cfg->addressfamily);
    if ((err = sk_addr_error(addr)) != NULL) {
        sk_addr_free(addr);
        return err;
    }

    if (port < 0)
        port = 513;                       /* default rlogin port */

    /*
     * Open socket.
     */
    rlogin->s = new_connection(addr, *realhost, port, 1, 0,
                               nodelay, keepalive, (Plug) rlogin, cfg);
    if ((err = sk_socket_error(rlogin->s)) != NULL)
        return err;

    if (*cfg->loghost) {
        char *colon;

        sfree(*realhost);
        *realhost = dupstr(cfg->loghost);
        colon = strrchr(*realhost, ':');
        if (colon) {
            /*
             * FIXME: if we ever update this aspect of ssh.c for
             * IPv6 literal management, this should change in line
             * with it.
             */
            *colon++ = '\0';
        }
    }

    /*
     * Send local username, remote username, terminal type and
     * terminal speed - unless we don't have the remote username yet,
     * in which case we prompt for it and may end up deferring doing
     * anything else until the local prompt mechanism returns.
     */
    if (get_remote_username(cfg, ruser, sizeof(ruser))) {
        rlogin_startup(rlogin, ruser);
    } else {
        int ret;

        rlogin->prompt = new_prompts(rlogin->frontend);
        rlogin->prompt->to_server = TRUE;
        rlogin->prompt->name = dupstr("Rlogin login name");
        add_prompt(rlogin->prompt, dupstr("rlogin username: "), TRUE,
                   sizeof(cfg->username)); 
        ret = get_userpass_input(rlogin->prompt, NULL, 0);
        if (ret >= 0) {
            rlogin_startup(rlogin, rlogin->prompt->prompts[0]->result);
        }
    }

    return NULL;
}
コード例 #3
0
ファイル: client.c プロジェクト: dermoth/supybot_NagiosLogger
/* Parse arguments and format message */
int
main(int argc, char **argv)
{
	int i, rc;
	char *url, *server, *notype, *stateid, *host, *message;
	char *fmt_msg = NULL;
	char *service = NULL;
	const char *paramtype = "";

	if (argc < 7 || argc > 8) {
		for (i=1; i<argc; i++) {
			if (strcmp(argv[i], "-h") == 0 ||
			    strcmp(argv[i], "--help") == 0) {
				usage(argv[0], NULL);
			}
		}
		usage(argv[0], "Wrong number of arguments");
	}

	for (i=1; i<argc; i++) {
		switch (i) {
			case 1:
				url = strdup(argv[i]);
				break;
			case 2:
				server = strdup(argv[i]);
				break;
			case 3:
				notype = strdup(argv[i]);
				break;
			case 4:
				stateid = strdup(argv[i]);
				if (strlen(stateid) != strspn(stateid, "0123456789"))
					usage(argv[0], "State ID is not a number");
				break;
			case 5:
				host = strdup(argv[i]);
				break;
			case 6:
				if (argc == 7) {
					message = strdup(argv[i]);
					paramtype = "Host";
				}	else {
					service = strdup(argv[i]);
					paramtype = "Service";
				}
				break;
			case 7:
				message = strdup(argv[i]);
				break;
		}
	}

	/* Format is: server(str)[Tab]notificationtype(str)[Tab]stateid(int)[Tab]host(str)[Tab]service(str)[Tab]message(str) */
	i = strlen(server) + strlen(notype) + strlen(stateid) + strlen(host) + (service ? strlen(service) : 0) + strlen(message) + 5 ;
	fmt_msg = malloc(i+1);
	assert(fmt_msg != NULL);
	rc = snprintf(fmt_msg, i+1, "%s\t%s\t%s\t%s\t%s\t%s", server, notype, stateid, host, service ? service : "", message);
	assert(rc == i);

	if (logevent(url, fmt_msg)) {
		printf("Successfully sent %s Alert event to %s\n", paramtype, url);
		exit(0);
	}
	printf("Failed sending %s Alert event to %s\n", paramtype, url);
	exit(1);

}
コード例 #4
0
ファイル: adb.c プロジェクト: kleopatra999/PuTTY
/*
 * Called to set up the adb connection.
 * 
 * Returns an error message, or NULL on success.
 *
 * Also places the canonical host name into `realhost'. It must be
 * freed by the caller.
 */
static const char *adb_init(void *frontend_handle, void **backend_handle,
                            Config *cfg,
                            char *host, int port, char **realhost, int nodelay,
                            int keepalive)
{
    static const struct plug_function_table fn_table = {
        adb_log,
        adb_closing,
        adb_receive,
        adb_sent
    };
    SockAddr addr;
    const char *err;
    Adb adb;

    adb = snew(struct adb_backend_data);
    adb->fn = &fn_table;
    adb->s = NULL;
    adb->state = 0;
    *backend_handle = adb;

    adb->frontend = frontend_handle;

    /*
     * Try to find host.
     */
    {
        char *buf;
        buf = dupprintf("Looking up host \"%s\"%s", "localhost",
                    (cfg->addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" :
                    (cfg->addressfamily == ADDRTYPE_IPV6 ? " (IPv6)" :
                    "")));
    logevent(adb->frontend, buf);
    sfree(buf);
    }
    addr = name_lookup("localhost", port, realhost, cfg, cfg->addressfamily);
    if ((err = sk_addr_error(addr)) != NULL) {
        sk_addr_free(addr);
        return err;
    }

    if (port < 0)
        port = 5037;               /* default adb port */

    /*
     * Open socket.
     */
    adb->s = new_connection(addr, *realhost, port, 0, 1, nodelay, keepalive,
                            (Plug) adb, cfg);
    if ((err = sk_socket_error(adb->s)) != NULL)
        return err;

    if (*cfg->loghost) {
        char *colon;

        sfree(*realhost);
        *realhost = dupstr(cfg->loghost);
        colon = strrchr(*realhost, ':');
        if (colon) {
            /*
             * FIXME: if we ever update this aspect of ssh.c for
             * IPv6 literal management, this should change in line
             * with it.
             */
            *colon++ = '\0';
        }
    }

    /* send initial data to adb server */
#define ADB_SHELL_DEFAULT_STR "0012" "host:transport-usb"
#define ADB_SHELL_DEFAULT_STR_LEN (sizeof(ADB_SHELL_DEFAULT_STR)-1)
#define ADB_SHELL_SERIAL_PREFIX "host:transport:"
#define ADB_SHELL_SERIAL_PREFIX_LEN (sizeof(ADB_SHELL_SERIAL_PREFIX)-1)
    do {
        size_t len = strlen(host);
        if (len == 0) {
            sk_write(adb->s, ADB_SHELL_DEFAULT_STR, ADB_SHELL_DEFAULT_STR_LEN);
        } else {
            char sendbuf[512];
#define ADB_SHELL_HOST_MAX_LEN \
        (sizeof(sendbuf)-4-ADB_SHELL_SERIAL_PREFIX_LEN-1)
            if (len > ADB_SHELL_HOST_MAX_LEN)
                len = ADB_SHELL_HOST_MAX_LEN;
            sprintf(sendbuf,"%04x" ADB_SHELL_SERIAL_PREFIX,
                len+ADB_SHELL_SERIAL_PREFIX_LEN);
            memcpy(sendbuf+4+ADB_SHELL_SERIAL_PREFIX_LEN, host, len);
            sk_write(adb->s,sendbuf,len+4+ADB_SHELL_SERIAL_PREFIX_LEN);
        }
    } while (0);

    sk_flush(adb->s);
    adb->state = 1;
    return NULL;
}
コード例 #5
0
ファイル: RLOGIN.C プロジェクト: AshKash/kit-sink
/*
 * Called to set up the rlogin connection.
 *
 * Returns an error message, or NULL on success.
 *
 * Also places the canonical host name into `realhost'. It must be
 * freed by the caller.
 */
static const char *rlogin_init(void *frontend_handle, void **backend_handle,
                               Config *cfg,
                               char *host, int port, char **realhost,
                               int nodelay)
{
    static const struct plug_function_table fn_table = {
        rlogin_closing,
        rlogin_receive,
        rlogin_sent
    };
    SockAddr addr;
    const char *err;
    Rlogin rlogin;

    rlogin = snew(struct rlogin_tag);
    rlogin->fn = &fn_table;
    rlogin->s = NULL;
    rlogin->frontend = frontend_handle;
    rlogin->term_width = cfg->width;
    rlogin->term_height = cfg->height;
    rlogin->firstbyte = 1;
    *backend_handle = rlogin;

    /*
     * Try to find host.
     */
    {
        char *buf;
        buf = dupprintf("Looking up host \"%s\"", host);
        logevent(rlogin->frontend, buf);
        sfree(buf);
    }
    addr = name_lookup(host, port, realhost, cfg);
    if ((err = sk_addr_error(addr)) != NULL) {
        sk_addr_free(addr);
        return err;
    }

    if (port < 0)
        port = 513;		       /* default rlogin port */

    /*
     * Open socket.
     */
    {
        char *buf, addrbuf[100];
        sk_getaddr(addr, addrbuf, 100);
        buf = dupprintf("Connecting to %s port %d", addrbuf, port);
        logevent(rlogin->frontend, buf);
        sfree(buf);
    }
    rlogin->s = new_connection(addr, *realhost, port, 1, 0,
                               nodelay, (Plug) rlogin, cfg);
    if ((err = sk_socket_error(rlogin->s)) != NULL)
        return err;

    /*
     * Send local username, remote username, terminal/speed
     */

    {
        char z = 0;
        char *p;
        sk_write(rlogin->s, &z, 1);
        sk_write(rlogin->s, cfg->localusername,
                 strlen(cfg->localusername));
        sk_write(rlogin->s, &z, 1);
        sk_write(rlogin->s, cfg->username,
                 strlen(cfg->username));
        sk_write(rlogin->s, &z, 1);
        sk_write(rlogin->s, cfg->termtype,
                 strlen(cfg->termtype));
        sk_write(rlogin->s, "/", 1);
        for (p = cfg->termspeed; isdigit((unsigned char)*p); p++) continue;
        sk_write(rlogin->s, cfg->termspeed, p - cfg->termspeed);
        rlogin->bufsize = sk_write(rlogin->s, &z, 1);
    }

    return NULL;
}
コード例 #6
0
ファイル: RAW.C プロジェクト: 545546460/TortoiseGit
/*
 * Called to set up the raw connection.
 * 
 * Returns an error message, or NULL on success.
 *
 * Also places the canonical host name into `realhost'. It must be
 * freed by the caller.
 */
static const char *raw_init(void *frontend_handle, void **backend_handle,
			    Conf *conf,
			    char *host, int port, char **realhost, int nodelay,
			    int keepalive)
{
    static const struct plug_function_table fn_table = {
	raw_log,
	raw_closing,
	raw_receive,
	raw_sent
    };
    SockAddr addr;
    const char *err;
    Raw raw;
    int addressfamily;
    char *loghost;

    raw = snew(struct raw_backend_data);
    raw->fn = &fn_table;
    raw->s = NULL;
    raw->closed_on_socket_error = FALSE;
    *backend_handle = raw;
    raw->sent_console_eof = raw->sent_socket_eof = FALSE;
    raw->bufsize = 0;

    raw->frontend = frontend_handle;

    addressfamily = conf_get_int(conf, CONF_addressfamily);
    /*
     * Try to find host.
     */
    {
	char *buf;
	buf = dupprintf("Looking up host \"%s\"%s", host,
			(addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" :
			 (addressfamily == ADDRTYPE_IPV6 ? " (IPv6)" :
			  "")));
	logevent(raw->frontend, buf);
	sfree(buf);
    }
    addr = name_lookup(host, port, realhost, conf, addressfamily);
    if ((err = sk_addr_error(addr)) != NULL) {
	sk_addr_free(addr);
	return err;
    }

    if (port < 0)
	port = 23;		       /* default telnet port */

    /*
     * Open socket.
     */
    raw->s = new_connection(addr, *realhost, port, 0, 1, nodelay, keepalive,
			    (Plug) raw, conf);
    if ((err = sk_socket_error(raw->s)) != NULL)
	return err;

    loghost = conf_get_str(conf, CONF_loghost);
    if (*loghost) {
	char *colon;

	sfree(*realhost);
	*realhost = dupstr(loghost);

	colon = host_strrchr(*realhost, ':');
	if (colon)
	    *colon++ = '\0';
    }

    return NULL;
}
コード例 #7
0
ファイル: winnet.c プロジェクト: ChrisAntaki/putty
void sk_init(void)
{
#ifndef NO_IPV6
    winsock2_module =
#endif
        winsock_module = load_system32_dll("ws2_32.dll");
    if (!winsock_module) {
	winsock_module = load_system32_dll("wsock32.dll");
    }
    if (!winsock_module)
	fatalbox("Unable to load any WinSock library");

#ifndef NO_IPV6
    /* Check if we have getaddrinfo in Winsock */
    if (GetProcAddress(winsock_module, "getaddrinfo") != NULL) {
#ifdef NET_SETUP_DIAGNOSTICS
	logevent(NULL, "Native WinSock IPv6 support detected");
#endif
	GET_WINDOWS_FUNCTION(winsock_module, getaddrinfo);
	GET_WINDOWS_FUNCTION(winsock_module, freeaddrinfo);
	GET_WINDOWS_FUNCTION(winsock_module, getnameinfo);
	GET_WINDOWS_FUNCTION(winsock_module, gai_strerror);
    } else {
	/* Fall back to wship6.dll for Windows 2000 */
	wship6_module = load_system32_dll("wship6.dll");
	if (wship6_module) {
#ifdef NET_SETUP_DIAGNOSTICS
	    logevent(NULL, "WSH IPv6 support detected");
#endif
	    GET_WINDOWS_FUNCTION(wship6_module, getaddrinfo);
	    GET_WINDOWS_FUNCTION(wship6_module, freeaddrinfo);
	    GET_WINDOWS_FUNCTION(wship6_module, getnameinfo);
	    GET_WINDOWS_FUNCTION(wship6_module, gai_strerror);
	} else {
#ifdef NET_SETUP_DIAGNOSTICS
	    logevent(NULL, "No IPv6 support detected");
#endif
	}
    }
    GET_WINDOWS_FUNCTION(winsock2_module, WSAAddressToStringA);
#else
#ifdef NET_SETUP_DIAGNOSTICS
    logevent(NULL, "PuTTY was built without IPv6 support");
#endif
#endif

    GET_WINDOWS_FUNCTION(winsock_module, WSAAsyncSelect);
    GET_WINDOWS_FUNCTION(winsock_module, WSAEventSelect);
    GET_WINDOWS_FUNCTION(winsock_module, select);
    GET_WINDOWS_FUNCTION(winsock_module, WSAGetLastError);
    GET_WINDOWS_FUNCTION(winsock_module, WSAEnumNetworkEvents);
    GET_WINDOWS_FUNCTION(winsock_module, WSAStartup);
    GET_WINDOWS_FUNCTION(winsock_module, WSACleanup);
    GET_WINDOWS_FUNCTION(winsock_module, closesocket);
    GET_WINDOWS_FUNCTION(winsock_module, ntohl);
    GET_WINDOWS_FUNCTION(winsock_module, htonl);
    GET_WINDOWS_FUNCTION(winsock_module, htons);
    GET_WINDOWS_FUNCTION(winsock_module, ntohs);
    GET_WINDOWS_FUNCTION(winsock_module, gethostname);
    GET_WINDOWS_FUNCTION(winsock_module, gethostbyname);
    GET_WINDOWS_FUNCTION(winsock_module, getservbyname);
    GET_WINDOWS_FUNCTION(winsock_module, inet_addr);
    GET_WINDOWS_FUNCTION(winsock_module, inet_ntoa);
    GET_WINDOWS_FUNCTION(winsock_module, connect);
    GET_WINDOWS_FUNCTION(winsock_module, bind);
    GET_WINDOWS_FUNCTION(winsock_module, setsockopt);
    GET_WINDOWS_FUNCTION(winsock_module, socket);
    GET_WINDOWS_FUNCTION(winsock_module, listen);
    GET_WINDOWS_FUNCTION(winsock_module, send);
    GET_WINDOWS_FUNCTION(winsock_module, shutdown);
    GET_WINDOWS_FUNCTION(winsock_module, ioctlsocket);
    GET_WINDOWS_FUNCTION(winsock_module, accept);
    GET_WINDOWS_FUNCTION(winsock_module, recv);
    GET_WINDOWS_FUNCTION(winsock_module, WSAIoctl);

    /* Try to get the best WinSock version we can get */
    if (!sk_startup(2,2) &&
	!sk_startup(2,0) &&
	!sk_startup(1,1)) {
	fatalbox("Unable to initialise WinSock");
    }

    sktree = newtree234(cmpfortree);
}
コード例 #8
0
ファイル: shell.c プロジェクト: egregious3000/isca-clone
void
do_login(void)
{
register int i;
register int users;
register char *name;
register struct tm *ltm;
register struct user *tmpuser = 0;
register int wrong = 0;
register char *bbsname;
char pas[9];
char temp[128];
char myname[MAXALIAS + 1];

  printf("\nDOC (Dave's Own version of Citadel) Version 1.71\n\nWelcome to the ISCA BBS.\n\n%s", (bbsname = getenv("BBSNAME")) ? "" : "\nLogin as 'Guest' to just look around, or 'New' to create a new account.\n\n");

  for (;;)
  {
    guest = 0;

    if (!bbsname)
      name = get_name("Name: ", 1);
    else
      strcpy(name = myname, bbsname);

    if (strcmp(name, "New"))
    {
      if ((tmpuser = getuser(name)))
        freeuser(tmpuser);
      if (tmpuser && (!bbsname || tty) && strcmp(name, "Guest"))
        get_string("Password: "******"Incorrect login.\n");
	else
	  printf("There is no user %s on this BBS.\n", name);
        if (++wrong > 3 || bbsname)
        {
	  if (!bbsname)
            printf("\n\nToo many attempts.  Goodbye.\n");
          my_exit(3);
        }
        flush_input(wrong);
        continue;
      }
      else
      {
        xinit();
	if (ouruser->keytime)
	{     
	  printf("\n\n\nYou have not yet registered your validation key...\n\n");
	  dokey(ouruser);
	  if (ouruser->keytime && ouruser->f_trouble)
	  {
	    printf("\n\nYou will need to enter your validation key before you may gain access to the\nBBS.  If you have not yet received your key and think you should, you may send\nE-mail to [email protected].  Please include your BBS username in this\nE-mail so the sysop who receives it knows who you are.  Remember that it can\ntake several days from the time your account was originally created for the\nsysops to validate the information you have provided, if it has been less than\nfour days since you created your account please do not send E-mail yet, as it\nlikely they haven't finished with your account yet.  Impatience won't make them\nwork any faster, and quite likely will make them decide to make you a special\ncase and work slower!  Remember, this BBS is a privilege, not a right.\n\n\n");
	    my_exit(15);
	  }
	}

	printf("\nIowa Student Computer Association BBS.\n");

	if (ouruser->f_deleted)
        {
	  if (ouruser->f_namechanged)
	    printf("\a\nThis account has been marked for deletion because of a request to change the\nusername from '%s' to '%s'.\n\nYou may login as '%s' using the same password.\n\n", ouruser->name, ouruser->reminder, ouruser->reminder);
          else
            printf("\a\nThis account has been marked for deletion, either through your choice or\nbecause you violated ISCA BBS rules by doing something such as providing\nobviously bogus profile info.  You will be logged off.\n\n");
          my_exit(10);
        }
	else if (ouruser->f_inactive)
        {
          printf("You seem to have been denied access to the message system.\n");
          printf("Please contact ISCA (e-mail address [email protected]) for more.\n");
          my_exit(10);
        }


	i = ouruser->time;
        ltm = localtime(&ouruser->time);
        users = add_loggedin(ouruser);

        if (!guest && ouruser->time)
        {
	  printf("Last on: %d/%d/%d %d:%02d ", ltm->tm_mon + 1,
                 ltm->tm_mday, 1900 + ltm->tm_year, ltm->tm_hour, ltm->tm_min);
          ltm = localtime(&ouruser->timeoff);
	  if (ouruser->timeoff >= i)
            printf("until %d:%02d from %s\n", ltm->tm_hour, ltm->tm_min, ouruser->remote);
	  else
	    printf("from %s\n", ouruser->remote);
        }

        strcpy(ouruser->loginname, ARGV[1] && ARGV[2] ? ARGV[2] : "");
        strncpy(ouruser->remote, ARGV[1] ? ARGV[1] : "local", sizeof ouruser->remote - 1);

        if (ouruser->f_noclient)
	{
	  printf("\n\nYou have been disallowed use of the BBS client, you must login using telnet.\n\n");
	  my_exit(10);
	}

	sprintf(temp, "%s %s%s%s/%d", client ? "CLIENT" : "LOGIN", ARGV[1] && ARGV[2] ? ARGV[2] : "", ARGV[1] && ARGV[2] ? "@" : "", ouruser->remote, mybtmp->remport);
	logevent(temp);

	++ouruser->timescalled;

	if (!guest)
	  printf("This is call %d.  There are %d users.\n", ouruser->timescalled, users);
        if (ouruser->f_aide)
           validate_users(0);

	/*
	 * Turn off expresses and tell the user this was done if user is
	 * configured for this 
	 */
	if (!guest && mybtmp->xstat)
	  printf("\nNOTE:  You have eXpress messages turned OFF as a default!\n");
        if (mybtmp->elf)
          printf("\nYou are marked as available to help others.\n");

	checkmail(FALSE);

	termset();

        if (*ouruser->reminder)
        {
          printf("\n\aREMINDER:\n%s\n\n", ouruser->reminder);
          printf("Please hit 'Y' to acknowledge having seen this reminder -> ");
          get_single_quiet("yY");
        }

	if (ouruser->f_badinfo || ouruser->f_duplicate)
	{
	  help("badinfo", NO);
	  mysleep(300);
	}

	if (guest)
	{
	  help("guestwelcome", NO);
	  hit_return_now();
	}
	return;
      }
    }
    else
      if (!(i = new_user()))
      {
	printf("\n\nSorry, there was some problem setting up your BBS account.\n\nPlease try again later.\n\n");
        my_exit(10);
      }
      else if (i > 0)
        return;
  }
}
コード例 #9
0
ファイル: sshcrcda.c プロジェクト: rdebath/sgt
/* Detect a crc32 compensation attack on a packet */
int detect_attack(uchar *buf, uint32 len, uchar *IV)
{
    static uint16 *h = (uint16 *) NULL;
    static uint32 n = HASH_MINSIZE / HASH_ENTRYSIZE;
    register uint32 i, j;
    uint32 l;
    register uchar *c;
    uchar *d;

    assert(!(len > (SSH_MAXBLOCKS * SSH_BLOCKSIZE) ||
             len % SSH_BLOCKSIZE != 0));
    for (l = n; l < HASH_FACTOR(len / SSH_BLOCKSIZE); l = l << 2)
        ;

    if (h == NULL) {
        logevent("Installing CRC compensation attack detector");
        n = l;
        h = (uint16 *) smalloc(n * HASH_ENTRYSIZE);
    } else {
        if (l > n) {
            n = l;
            h = (uint16 *) srealloc(h, n * HASH_ENTRYSIZE);
        }
    }

    if (len <= HASH_MINBLOCKS) {
        for (c = buf; c < buf + len; c += SSH_BLOCKSIZE) {
            if (IV && (!CMP(c, IV))) {
                if ((check_crc(c, buf, len, IV)))
                    return 1;          /* attack detected */
                else
                    break;
            }
            for (d = buf; d < c; d += SSH_BLOCKSIZE) {
                if (!CMP(c, d)) {
                    if ((check_crc(c, buf, len, IV)))
                        return 1;      /* attack detected */
                    else
                        break;
                }
            }
        }
        return 0;                      /* ok */
    }
    memset(h, HASH_UNUSEDCHAR, n * HASH_ENTRYSIZE);

    if (IV)
        h[HASH(IV) & (n - 1)] = HASH_IV;

    for (c = buf, j = 0; c < (buf + len); c += SSH_BLOCKSIZE, j++) {
        for (i = HASH(c) & (n - 1); h[i] != HASH_UNUSED;
             i = (i + 1) & (n - 1)) {
            if (h[i] == HASH_IV) {
                if (!CMP(c, IV)) {
                    if (check_crc(c, buf, len, IV))
                        return 1;      /* attack detected */
                    else
                        break;
                }
            } else if (!CMP(c, buf + h[i] * SSH_BLOCKSIZE)) {
                if (check_crc(c, buf, len, IV))
                    return 1;          /* attack detected */
                else
                    break;
            }
        }
        h[i] = j;
    }
    return 0;                          /* ok */
}
コード例 #10
0
ファイル: adb.c プロジェクト: svn2github/kitty
/*
 * Called to set up the adb connection.
 * 
 * Returns an error message, or NULL on success.
 *
 * Also places the canonical host name into `realhost'. It must be
 * freed by the caller.
 */
static const char *adb_init(void *frontend_handle, void **backend_handle,
                            Conf *conf,
                            char *host, int port, char **realhost, int nodelay,
                            int keepalive)
{
    static const struct plug_function_table fn_table = {
        adb_log,
        adb_closing,
        adb_receive,
        adb_sent,
        NULL
    };
    SockAddr addr;
    const char *err;
    Adb adb;

    adb = snew(struct adb_backend_data);
    adb->fn = &fn_table;
    adb->s = NULL;
    adb->state = STATE_WARMING_UP;
    *backend_handle = adb;

    adb->frontend = frontend_handle;

    /*
     * Try to find host.
     */
    {
        char *buf;
        buf = dupprintf("Looking up host \"%s\"%s", "localhost",
                (conf_get_int(conf, CONF_addressfamily) == ADDRTYPE_IPV4 ? " (IPv4)" :
                 (conf_get_int(conf, CONF_addressfamily) == ADDRTYPE_IPV6 ? " (IPv6)" :
                  "")));
        logevent(adb->frontend, buf);
        sfree(buf);
    }
    addr = name_lookup("localhost", port, realhost, conf, conf_get_int(conf, CONF_addressfamily));
    if ((err = sk_addr_error(addr)) != NULL) {
        sk_addr_free(addr);
        return err;
    }

    if (port < 0)
        port = 5037; /* default adb port */

    /*
     * Open socket.
     */
    adb->s = new_connection(addr, *realhost, port, 0, 1, nodelay, keepalive,
                            (Plug) adb, conf);
    if ((err = sk_socket_error(adb->s)) != NULL)
        return err;
    if (*conf_get_str(conf, CONF_loghost)) {
        char *colon;

        sfree(*realhost);
        *realhost = conf_get_str(conf, CONF_loghost);
        colon = strrchr(*realhost, ':');
        if (colon) {
            /*
             * FIXME: if we ever update this aspect of ssh.c for
             * IPv6 literal management, this should change in line
             * with it.
             */
            *colon++ = '\0';
        }
    }

    /* send initial data to adb server */
#define ADB_SHELL_DEFAULT_STR "0012" "host:transport-any"
#define ADB_SHELL_DEFAULT_STR_LEN (sizeof(ADB_SHELL_DEFAULT_STR)-1)
#define ADB_SHELL_USB_STR "0012" "host:transport-usb"
#define ADB_SHELL_USB_STR_LEN (sizeof(ADB_SHELL_USB_STR)-1)
#define ADB_SHELL_LOCAL_STR "0015" "host:transport-local"
#define ADB_SHELL_LOCAL_STR_LEN (sizeof(ADB_SHELL_LOCAL_STR)-1)
#define ADB_SHELL_SERIAL_PREFIX "host:transport:"
#define ADB_SHELL_SERIAL_PREFIX_LEN (sizeof(ADB_SHELL_SERIAL_PREFIX)-1)

#   define write_hello(str, len) \
        sk_write(adb->s, str, len); \
        sk_flush(adb->s); \
        adb->state = STATE_SENT_HELLO;

    do {
        size_t len;
        if (host[0] == ':')
            ++host;

        len = strlen(host);

        if (len == 0 || !strcmp("-a", host) || !strcmp(host, "transport-any")) {
            write_hello(ADB_SHELL_DEFAULT_STR, ADB_SHELL_DEFAULT_STR_LEN);
        } else if (!strcmp("-d", host) || !strcmp(host, "transport-usb")) {
            write_hello(ADB_SHELL_USB_STR, ADB_SHELL_USB_STR_LEN);
        } else if (!strcmp("-e", host) || !strcmp(host, "transport-local")) {
            write_hello(ADB_SHELL_LOCAL_STR, ADB_SHELL_LOCAL_STR_LEN);
        } else {
            char sendbuf[512];
#           define ADB_SHELL_HOST_MAX_LEN (sizeof(sendbuf)-4-ADB_SHELL_SERIAL_PREFIX_LEN)
            if (len > ADB_SHELL_HOST_MAX_LEN)
                len = ADB_SHELL_HOST_MAX_LEN;
            sprintf(sendbuf,"%04lx" ADB_SHELL_SERIAL_PREFIX, (unsigned long)(len+ADB_SHELL_SERIAL_PREFIX_LEN));
            memcpy(sendbuf+4+ADB_SHELL_SERIAL_PREFIX_LEN, host, len);
            write_hello(sendbuf, len+4+ADB_SHELL_SERIAL_PREFIX_LEN);
        }
    } while (0);
    return NULL;
}
コード例 #11
0
ファイル: sshdes.c プロジェクト: rdebath/sgt
static void des_sesskey(unsigned char *key) {
    des_key_setup(GET_32BIT_MSB_FIRST(key),
                  GET_32BIT_MSB_FIRST(key+4), &keys[0]);
    logevent("Initialised single-DES encryption");
}
コード例 #12
0
ファイル: odcgi.c プロジェクト: DeGaido/opendomo
/** Start a new session
 @param env Environment variables
 @param http_user User name sent by HTTP
 @param http_pass Password sent by HTTP
 @param http_session Session ID
 @param len Lenght of the variables
*/
	int
odcgi_login (script_env_t * env, const char *http_user,
		const char *http_pass, char *http_session, size_t len)
{
	/* Login by user/pass */
	if ((strlen (http_user) > 0) && (strlen (http_pass) > 0))
	{
		if (!session_is_valid_user (http_user, http_pass))
		{
			odcgi_print_login_form (ODCGI_ERROR__USER_ACCESS_DENIED, http_user);
			logevent ("warning", "Login failure for [%s]", http_user);
			return -1;
		}

		/* Create random session id */
		if (session_gen_random (http_session, len) == 0)
		{
			if (session_store_session (http_user, http_session) != 0)
				syslog (LOG_WARNING, "session not saved: %s\n", http_session);
		}
		else
		{
			odcgi_msg_error (ODCGI_ERROR__RANDOM, 
					"Cannot generate random code to identify this session.");
			return -1;
		}
		logevent ("notice", "Login user [%s] ", http_user);
		sstrncpy (env->user, http_user, MAX_ENV_SIZE);
	}

	/* Login by session id */
	else
	{
		/* Is valid session? */
		if (strlen (http_session) > 2)
		{
			if (!session_is_valid_sessid (http_session))
			{
				/* Maybe old cookie: no error */
				odcgi_print_login_form ("", http_user);
				return -1;
			}


			/* Privilege separation */
			char user[256] = "";
			if (session_get_user (http_session, user, sizeof (user)) != 0)
			{
				odcgi_print_login_form (ODCGI_ERROR__UNKNOWN_USER, http_user);
				//odcgi_msg("Error: " ODCGI_ERROR__UNKNOWN_USER, "", 1);
				return -1;
			}

			syslog (LOG_NOTICE, "user: %s\n", user);
			syslog (LOG_NOTICE, "session: %s\n", http_session);
			if (session_store_session (user, http_session) != 0)
				syslog (LOG_WARNING, "session not saved: %s\n", http_session);

			sstrncpy (env->user, user, MAX_ENV_SIZE);
		}

		/* No log-in post neither valid session already started */
		else
		{
			//! @bug Issue 55 reaches this point.
			/* First access: no error */
			if ((strlen (http_pass) == 0) && (strlen (http_user) > 0))
			{			// User but no password specified
				odcgi_print_login_form ("", http_user);
			}
			else if ((strlen (http_pass) == 0) && (strlen (http_user) == 0))
			{			// No user NOR password specified
				odcgi_print_login_form ("", "");
			}
			else
			{
				syslog (LOG_WARNING,
						"ISSUE55, please notify it to OD developers\n");
				syslog (LOG_WARNING, "http_user: ->%s<-\n", http_user);
				syslog (LOG_WARNING, "http_pass: ->%s<-\n", http_pass);
				syslog (LOG_WARNING, "http_session: ->%s<-\n", http_session);

				odcgi_print_login_form (ODCGI_ERROR__SESSION, "");
			}
			return -1;
		}
	}
	return 0;
}
コード例 #13
0
ファイル: sql_api.cpp プロジェクト: Avanznow/greensql-fw
int db_init(const std::string& type)
{
#ifdef WIN32
	return 1;
#else
  if (type == "mysql") {
    lib_handle = dlopen("/usr/lib/libgsql-mysql.so", RTLD_LAZY);
    if (!lib_handle) 
    {
      logevent(ERR, "Failed to load library libmysql_api.so: %s\n", dlerror());
      return 0;
    }    
  } else if (type == "pgsql") {
    lib_handle = dlopen("/usr/lib/libgsql-pgsql.so", RTLD_LAZY);
    if (!lib_handle)
    {
      logevent(ERR, "Failed to load library libpgsql_api.so: %s\n", dlerror());
      return 0;
    }
  }

  p_db_load = (int (*)(const char*, const char*, const char*, const char*, int))dlsym(lib_handle, "db_load");
  if ((dlerror()) != NULL)
  {
    logevent(ERR, "failed to load function db_load: %s\n", dlerror());
    return 0;
  }

  p_db_exec = (int (*)(const char*))dlsym(lib_handle, "db_exec");
  if ((dlerror()) != NULL)  
  {
    logevent(ERR, "failed to load function db_exec: %s\n", dlerror());
    return 0;
  }

  p_db_col_int = (int (*)(db_struct*, int))dlsym(lib_handle, "db_col_int");
  if ((dlerror()) != NULL)
  {
    logevent(ERR, "failed to load function db_col_int: %s\n", dlerror());
    return 0;
  }

  p_db_col_long_long = (long long int (*)(db_struct*, int))dlsym(lib_handle, "db_col_long_long");
  if ((dlerror()) != NULL)
  {
    logevent(ERR, "failed to load function db_col_long_long: %s\n", dlerror());
    return 0;
  }

  p_db_col_text = (char* (*)(db_struct*, int))dlsym(lib_handle, "db_col_text");
  if ((dlerror()) != NULL)
  {
    logevent(ERR, "failed to load function db_col_text: %s\n", dlerror());
    return 0;
  }

  p_db_fetch_row = (int (*)(db_struct*))dlsym(lib_handle, "db_fetch_row");
  if ((dlerror()) != NULL)
  {
    logevent(ERR, "failed to load function db_fetch_row: %s\n", dlerror());
    return 0;
  }

  p_db_escape_string = (char* (*)(const char*, unsigned int))dlsym(lib_handle, "db_escape_string");
  if ((dlerror()) != NULL)
  {
    logevent(ERR, "failed to load function db_escape_string: %s\n", dlerror());
    return 0;
  }

  p_db_query = (int (*)(db_struct*, const char*, int))dlsym(lib_handle, "db_query");
  if ((dlerror()) != NULL)
  {
    logevent(ERR, "failed to load function db_query: %s\n", dlerror());
    return 0;
  }

  p_db_changes = (int (*)())dlsym(lib_handle,"db_changes");
  if ((dlerror()) != NULL)
  {
    logevent(ERR, "failed to load function db_changes: %s\n", dlerror());
    return 0;
  }

  p_db_cleanup = (void (*)(db_struct*))dlsym(lib_handle, "db_cleanup");
  if ((dlerror()) != NULL)
  {
    logevent(ERR, "failed to load function db_cleanup: %s\n", dlerror());
    return 0;
  }

  p_db_close = (int (*)())dlsym(lib_handle, "db_close");
  if ((dlerror()) != NULL)
  {
    logevent(ERR, "failed to load function db_close: %s\n", dlerror());
    return 0;
  }

  p_db_error = (const char* (*)())dlsym(lib_handle, "db_error");
  if ((dlerror()) != NULL)
  {
    logevent(ERR, "failed to load function db_error: %s\n", dlerror());
    return 0;
  }
#endif
  return 1;
}
コード例 #14
0
ファイル: NiKomCon.c プロジェクト: dblarsson/NiKom
void main(int argc, char **argv) {
	int going=TRUE,forsok=2,car=1;
	long tid;
	char tellstr[100],*tmppscreen, titel[80];
	UBYTE tillftkn;
	NewList((struct List *)&aliaslist);
	NewList((struct List *)&edit_list);
	if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0)))
		cleanup(ERROR,"Kunde inte öppna intuition.library\n");
	if(!(UtilityBase=OpenLibrary("utility.library",37L)))
		cleanup(ERROR,"Kunde inte öppna utility.library\n");
	if(!(NiKomBase=OpenLibrary("nikom.library",0L)))
		cleanup(ERROR,"Kunde inte öppna nikom.linbrary");
	getnodeconfig("NiKom:Datocfg/ConNode.cfg");
	if(!(initnode(NODCON))) cleanup(ERROR,"Kunde inte registrera noden i Servern\n");
	if(!(nikomnodeport = CreateMsgPort()))
		cleanup(ERROR,"Kunde inte skapa NiKomNode-porten");
	sprintf(nikomnodeportnamn,"NiKomNode%d",nodnr);
	nikomnodeport->mp_Node.ln_Name = nikomnodeportnamn;
	nikomnodeport->mp_Node.ln_Pri = 1;
	AddPort(nikomnodeport);
	sprintf(rexxportnamn,"NiKomRexx%d",nodnr);
	if(!(rexxport=(struct MsgPort *)CreateMsgPort()))
		cleanup(ERROR,"Kunde inte öppna RexxPort\n");
	rexxport->mp_Node.ln_Name=rexxportnamn;
	rexxport->mp_Node.ln_Pri=50;
	AddPort(rexxport);
	if(!(RexxSysBase=(struct RsxLib *)OpenLibrary("rexxsyslib.library",0L)))
		cleanup(ERROR,"Kunde inte öppna rexxsyslib.library\n");
	if(pubscreen[0]=='-') tmppscreen=NULL;
	else tmppscreen=pubscreen;
	if(!(NiKwind=(struct Window *)OpenWindowTags(NULL,WA_Left,xpos,
																	  WA_Top,ypos,
																	  WA_Width,xsize,
																	  WA_Height,ysize,
																	  WA_IDCMP,IDCMP_CLOSEWINDOW,
																	  WA_MinWidth,50,
																	  WA_MinHeight,10,
																	  WA_MaxWidth,~0,
																	  WA_MaxHeight,~0,
																	  WA_SizeGadget,TRUE,
																	  WA_SizeBBottom, TRUE,
																	  WA_DragBar,TRUE,
																	  WA_DepthGadget,TRUE,
																	  WA_CloseGadget,TRUE,
																	  WA_SimpleRefresh,TRUE,
																	  WA_ScreenTitle,"NiKom © Tomas Kärki 1996-1998",
																	  WA_AutoAdjust,TRUE,
																	  WA_PubScreenName,tmppscreen,
																	  TAG_DONE)))
		cleanup(ERROR,"Kunde inte öppna fönstret\n");
	if(!OpenIO(NiKwind)) cleanup(ERROR,"Kunde inte öppna IO\n");
	if(!getkeyfile())
		cleanup(ERROR,"Korrupt nyckelfil\n");
	strcpy(Servermem->nodid[nodnr],nodid);
	sprintf(titel,"Nod #%d CON: <Ingen inloggad>",nodnr);
	SetWindowTitles(NiKwind,titel,(UBYTE *)-1L);
	Servermem->connectbps[nodnr] = -1;
	conreqtkn();
do
{
	memset(commandhistory,0,1024);
	Servermem->inne[nodnr].rader=0;
	sendfile("NiKom:Texter/Inlogg.txt");
	if(Servermem->cfg.ar.preinlogg) sendrexx(Servermem->cfg.ar.preinlogg);
	going=TRUE;
	while(going) {
		puttekn("\r\nNamn: ",-1);
		getstring(EKO,40,NULL);
		if(!stricmp(inmat,Servermem->cfg.ny))
		{
/*			if(!reggadnamn[0] && ((struct ShortUser *)Servermem->user_list.mlh_TailPred)->nummer >= 4)
				puttekn("\n\n\rDenna demoversion av NiKom kan hantera maximalt 5 användare.\n\r",-1);
			else { Versionen är nu obegränsad 970930! */
				if((car=nyanv())==2) goto panik;
				going=FALSE;
/*			} */
		}
		else if((inloggad=parsenamn(inmat))>=0) {
			readuser(inloggad,&Servermem->inne[nodnr]);
			forsok=2;
			while(forsok) {
				puttekn("\r\nLösen: ",-1);
				if(Servermem->inne[nodnr].flaggor & STAREKOFLAG)
					getstring(STAREKO,15,NULL);
				else
					getstring(EJEKO,15,NULL);
				if(CheckPassword(inloggad, inmat))
				{
					forsok=FALSE;
					going=FALSE;
				} else forsok--;
			}
		} else if(inloggad==-1) puttekn("\r\nHittar ej namnet\r\n",-1);
	}
	sprintf(titel,"Nod #%d CON: %s #%d",nodnr,Servermem->inne[nodnr].namn,inloggad);
	SetWindowTitles(NiKwind,titel,(UBYTE *)-1L);
	readuserbitmap(inloggad,Servermem->bitmaps[nodnr],0,temppek);
	Servermem->inloggad[nodnr]=inloggad;
	Servermem->idletime[nodnr] = time(NULL);
	if(getft("NiKom:Texter/Bulletin.txt")>Servermem->inne[nodnr].senast_in) sendfile("NiKom:Texter/Bulletin.txt");
	connection();
	if(Servermem->cfg.logmask & LOG_UTLOGG) {
		sprintf(outbuffer,"%s loggar ut från nod %d",getusername(inloggad),nodnr);
		logevent(outbuffer);
	}
	if(Servermem->say[nodnr]) displaysay();
	if(Servermem->cfg.ar.utlogg) sendrexx(Servermem->cfg.ar.utlogg);
	sendfile("NiKom:Texter/Utlogg.txt");
	sprintf(titel,"Nod #%d CON: <Ingen inloggad>",nodnr);
	SetWindowTitles(NiKwind,titel,(UBYTE *)-1L);
	SaveProgramCategory(inloggad);
	Servermem->inloggad[nodnr]=-1;

	Servermem->action[nodnr]=0;
	Servermem->inne[nodnr].textpek=textpek;
	time(&tid);
	Servermem->inne[nodnr].senast_in=tid;
	Servermem->inne[nodnr].tot_tid+=(tid-logintime);
	Servermem->inne[nodnr].loggin++;
	Servermem->info.inloggningar++;
	Servermem->inne[nodnr].defarea=area2;
	writeuser(inloggad,&Servermem->inne[nodnr]);
	writeuserbitmap(inloggad,Servermem->bitmaps[nodnr],0,temppek);
	writesenaste();
	freealiasmem();
	sprintf(tellstr,"loggade just ut från nod %d",nodnr);
	tellallnodes(tellstr);
panik:
	puttekn("\r\n\nEn inloggning till? (J/n)",-1);
	} while((tillftkn=gettekn())!='n' && tillftkn!='N');
	cleanup(OK,"");
}
コード例 #15
0
ファイル: sc.c プロジェクト: OldsSourcesBackups/kitty
unsigned char *sc_get_pub(void *f, int try_write_syslog, sc_lib *sclib,
                          const char *token_label, const char *cert_label,
                          char **algorithm, int *blob_len) {
    /* return pub_key and blob_len */
    unsigned char *pub_key = NULL;

    /* some local helper: */
    int i;
    char msg[SC_STR_MAX_LEN] = "";

    /* STORE OBJECTS AND ATTRIBUTES */
    CK_SESSION_HANDLE session = 0;

    /* OPEN SESSION */    
    session = sc_get_session(f, try_write_syslog, sclib->m_fl, token_label);
    if(session == 0) {
        return NULL;
    }

    /* SEARCH THE SPECIFIED CERTIFICATE AND DETERMINE THE ID */
    {
        sc_cert_list *cl;
        sc_cert_list *pcl;
        msg[0]='\0';
        cl = sc_get_cert_list(sclib, session, msg);
        if(cl == NULL) goto err;
        if(strlen(msg) > 0) {
            logevent(f, msg);
            if(try_write_syslog) sc_write_syslog(msg);
        }
        pcl = cl;
        while(pcl != NULL) {
            int len = strlen(cert_label);
            if(pcl->cert_attr[0].ulValueLen < len) len = pcl->cert_attr[0].ulValueLen;
            if(strncmp(cert_label, pcl->cert_attr[0].pValue, len) == 0) {
                sclib->m_KeyID = calloc(sizeof(char *), pcl->cert_attr[1].ulValueLen+1);
                strncpy(sclib->m_KeyID, pcl->cert_attr[1].pValue, pcl->cert_attr[1].ulValueLen);
                char p_buf[pcl->cert_attr[0].ulValueLen+1];
                memset(p_buf, 0, pcl->cert_attr[0].ulValueLen+1);
                strncpy(p_buf, pcl->cert_attr[0].pValue, pcl->cert_attr[0].ulValueLen);
                sprintf(msg, "sc: Found cert: %s", p_buf);
                logevent(f, msg);
                if(try_write_syslog) sc_write_syslog(msg);
                sprintf(msg, "sc: Found cert: %s", sclib->m_KeyID);
                logevent(f, msg);
                if(try_write_syslog) sc_write_syslog(msg);
                break;
            }
            pcl = pcl->next;
        }
        sc_free_cert_list(cl);
    }

    /* NOW GET THE PUB KEY FOR THIS CERT */
    if(sclib->m_KeyID == NULL) {
        sprintf(msg, "sc: No cert found: %s", cert_label);
        goto err;
    }
    {
        sc_pub_list  *pl;
        sc_pub_list  *ppl;
        msg[0]='\0';
        pl = sc_get_pub_list(sclib, session, msg);
        if(pl == NULL) goto err;
        if(strlen(msg) > 0) {
            logevent(f, msg);
            if(try_write_syslog) sc_write_syslog(msg);
        }
        ppl = pl;
        while(ppl != NULL) {
            if(strncmp(sclib->m_KeyID, ppl->pub_attr[0].pValue, ppl->pub_attr[0].ulValueLen) == 0) {
                // attr 0: id
                // attr 2: modulus
                // attr 3: exponent
                unsigned char *p, *blob;
                unsigned char *expo, *modu;
                int elen, mlen;
                elen = ((8 * ppl->pub_attr[3].ulValueLen) + 8) / 8;
                mlen = ((8 * ppl->pub_attr[2].ulValueLen) + 8) / 8;

                char p_buf[ppl->pub_attr[0].ulValueLen+1];
                memset(p_buf, 0, ppl->pub_attr[0].ulValueLen+1);
                strncpy(p_buf, ppl->pub_attr[0].pValue, ppl->pub_attr[0].ulValueLen);
                sprintf(msg, "sc: Found key: %s", p_buf);
                logevent(f, msg);
                if(try_write_syslog) sc_write_syslog(msg);          

                expo = bignum_from_bytes(ppl->pub_attr[3].pValue, ppl->pub_attr[3].ulValueLen);
                modu = bignum_from_bytes(ppl->pub_attr[2].pValue, ppl->pub_attr[2].ulValueLen);
                *algorithm = calloc(sizeof(char *), strlen("ssh-rsa")+1);
                strcpy(*algorithm, "ssh-rsa");
                /* ugly (but used in pagent prototype) */
                if(sclib->rsakey != NULL) {
                    free(sclib->rsakey->exponent);
                    free(sclib->rsakey->modulus);
                    free(sclib->rsakey);
                }
                sclib->rsakey = calloc(1, sizeof(struct RSAKey));
                sclib->rsakey->exponent = expo;
                sclib->rsakey->modulus = modu;

                *blob_len = 19 + elen + mlen;
                blob = calloc(sizeof(char *), *blob_len);
                p = blob;
                SC_PUT_32BIT(p, 7);
                p += 4;
                memcpy(p, "ssh-rsa", 7);
                p += 7;
                SC_PUT_32BIT(p, elen);
                p += 4;
                for (i = elen; i--;) *p++ = bignum_byte(expo, i);
                SC_PUT_32BIT(p, mlen);
                p += 4;
                for (i = mlen; i--;)
                    *p++ = bignum_byte(modu, i);
                pub_key = blob;

                sclib->m_SshPK = calloc(sizeof(char *), *blob_len);
                memcpy(sclib->m_SshPK, blob, *blob_len);         
                sclib->m_SshPK_len = *blob_len;

                sclib->m_SshPk_alg = calloc(sizeof(char *), strlen("ssh-rsa")+1);
                strcpy(sclib->m_SshPk_alg, "ssh-rsa");

                sprintf(msg, "sc: Blob: %i (%i,%i)", *blob_len, elen, mlen);
                logevent(f, msg);
                if(try_write_syslog) sc_write_syslog(msg);

                {
                    char *buffi = sc_base64key(blob, *blob_len);
                    sprintf(msg, "sc: ssh-rsa %s token-key", buffi);
                    logevent(f, msg);
                    if(try_write_syslog) sc_write_syslog(msg);
                    free(buffi);
                }
                //used in sclib free(expo);
                //free(modu);
                break;
            }
            ppl = ppl->next;
        }
        sc_free_pub_list(pl);
    }
    if(sclib->m_SshPK == NULL) {
        sprintf(msg, "sc: No pub key found: %s", cert_label);
        goto err;
    }
    sclib->m_fl->C_CloseSession(session);
    return pub_key;
    
 err:
    logevent(f, msg);
    if(try_write_syslog) sc_write_syslog(msg);
    sclib->m_fl->C_CloseSession(session);
    return NULL;
}
コード例 #16
0
ファイル: WINSER.C プロジェクト: YueLinHo/TortoiseGit
/*
 * Called to set up the serial connection.
 * 
 * Returns an error message, or NULL on success.
 *
 * Also places the canonical host name into `realhost'. It must be
 * freed by the caller.
 */
static const char *serial_init(void *frontend_handle, void **backend_handle,
			       Conf *conf, const char *host, int port,
			       char **realhost, int nodelay, int keepalive)
{
    Serial serial;
    HANDLE serport;
    const char *err;
    char *serline;

    serial = snew(struct serial_backend_data);
    serial->port = INVALID_HANDLE_VALUE;
    serial->out = serial->in = NULL;
    serial->bufsize = 0;
    serial->break_in_progress = FALSE;
    *backend_handle = serial;

    serial->frontend = frontend_handle;

    serline = conf_get_str(conf, CONF_serline);
    {
	char *msg = dupprintf("Opening serial device %s", serline);
	logevent(serial->frontend, msg);
        sfree(msg);
    }

    {
	/*
	 * Munge the string supplied by the user into a Windows filename.
	 *
	 * Windows supports opening a few "legacy" devices (including
	 * COM1-9) by specifying their names verbatim as a filename to
	 * open. (Thus, no files can ever have these names. See
	 * <http://msdn2.microsoft.com/en-us/library/aa365247.aspx>
	 * ("Naming a File") for the complete list of reserved names.)
	 *
	 * However, this doesn't let you get at devices COM10 and above.
	 * For that, you need to specify a filename like "\\.\COM10".
	 * This is also necessary for special serial and serial-like
	 * devices such as \\.\WCEUSBSH001. It also works for the "legacy"
	 * names, so you can do \\.\COM1 (verified as far back as Win95).
	 * See <http://msdn2.microsoft.com/en-us/library/aa363858.aspx>
	 * (CreateFile() docs).
	 *
	 * So, we believe that prepending "\\.\" should always be the
	 * Right Thing. However, just in case someone finds something to
	 * talk to that doesn't exist under there, if the serial line
	 * contains a backslash, we use it verbatim. (This also lets
	 * existing configurations using \\.\ continue working.)
	 */
	char *serfilename =
	    dupprintf("%s%s", strchr(serline, '\\') ? "" : "\\\\.\\", serline);
	serport = CreateFile(serfilename, GENERIC_READ | GENERIC_WRITE, 0, NULL,
			     OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
	sfree(serfilename);
    }

    if (serport == INVALID_HANDLE_VALUE)
	return "Unable to open serial port";

    err = serial_configure(serial, serport, conf);
    if (err)
	return err;

    serial->port = serport;
    serial->out = handle_output_new(serport, serial_sentdata, serial,
				    HANDLE_FLAG_OVERLAPPED);
    serial->in = handle_input_new(serport, serial_gotdata, serial,
				  HANDLE_FLAG_OVERLAPPED |
				  HANDLE_FLAG_IGNOREEOF |
				  HANDLE_FLAG_UNITBUFFER);

    *realhost = dupstr(serline);

    /*
     * Specials are always available.
     */
    update_specials_menu(serial->frontend);

    return NULL;
}
コード例 #17
0
ファイル: sc.c プロジェクト: OldsSourcesBackups/kitty
unsigned char *sc_sig(void *f, int try_write_syslog, sc_lib *sclib,
                      const char *token_label, const char *password_s,
                      char *sigdata, int sigdata_len, int *sigblob_len) {
    CK_RV rv  = 0; 
    char msg[SC_STR_MAX_LEN] = "";
    CK_SESSION_HANDLE session = 0;
    const char *pwd = password_s;
    /* TEMPLATES: */
    CK_BBOOL  bTrue = 1;
    CK_OBJECT_CLASS  class_private_key = CKO_PRIVATE_KEY;
    CK_KEY_TYPE      key_type  = CKK_RSA;
    CK_ATTRIBUTE key_template[] = {
        { CKA_CLASS,    &class_private_key,  sizeof (class_private_key) },
        { CKA_KEY_TYPE, &key_type,           sizeof (key_type) },
        { CKA_TOKEN,    &bTrue,              sizeof (bTrue) },
        { CKA_SIGN,     &bTrue,              sizeof (bTrue) },
        { CKA_PRIVATE,  &bTrue,              sizeof (bTrue) }
    };
    CK_ATTRIBUTE key_getattributes[] = { 
        {CKA_ID, NULL_PTR, 0},             /* ID to search the key */
        {CKA_MODULUS, NULL_PTR, 0}
    };
    /* STORE OBJECTS AND ATTRIBUTES */
    int max_o = 20;
    CK_OBJECT_HANDLE list[max_o];
    CK_ULONG found = 0;
    CK_OBJECT_HANDLE pO;
    int ii,j;

    unsigned char *ret = NULL;
    *sigblob_len = 0;

    session = sc_get_session(f, try_write_syslog, sclib->m_fl, token_label);
    if(session == 0) {
        return NULL;
    }
  
    rv = sclib->m_fl->C_Login(session, CKU_USER, (CK_CHAR_PTR)pwd, strlen(pwd));
    if (CKR_OK != rv) {
        logevent(f, "sc: Login failed");
        sclib->m_fl->C_CloseSession(session);
        return NULL;
    }
    rv = sclib->m_fl->C_FindObjectsInit(session, key_template, 4);
    if (CKR_OK != rv) {
        sprintf(msg, "sc: C_FindObjectsInit priv key failed, 0x%.4x", (int)rv);
        goto err;
    }
    rv = sclib->m_fl->C_FindObjects(session, list, max_o-1, &found);
    if (CKR_OK != rv) {
        sprintf(msg, "sc: C_FindObjects priv key failed, 0x%.4x", (int)rv);
        goto err;
    } 
    rv = sclib->m_fl->C_FindObjectsFinal(session);
    if (CKR_OK != rv) {
        sprintf(msg, "sc: C_FindObjectsFinal priv key failed, 0x%.4x", (int)rv);
        goto err;
    }
    if (found < 1) {
        sprintf(msg, "sc: No priv keys found");
        goto err;
    }
    for(ii=0; ii<found; ii++) {
        pO = list[ii];
        int ts = 1;//sizeof (key_getattributes) / sizeof (CK_ATTRIBUTE);
        int nr;
        sc_write_syslog("1");
        for(nr=0;nr<ts;nr++) {
            key_getattributes[nr].ulValueLen = 0;
            key_getattributes[nr].pValue = NULL;
        }
        rv = sclib->m_fl->C_GetAttributeValue(session, pO, key_getattributes, ts);
        if(CKR_OK == rv) {
            for(nr=0;nr<ts;nr++) {
                key_getattributes[nr].pValue = calloc(sizeof(char *),key_getattributes[nr].ulValueLen+1);
            }
            if(sclib->m_fl->C_GetAttributeValue(session, pO, key_getattributes, ts) == CKR_OK) {
                if(strncmp(key_getattributes[0].pValue, sclib->m_KeyID, key_getattributes[0].ulValueLen) == 0) {
                    CK_BYTE signature[500];    
                    CK_ULONG signature_length = 500;
                    CK_MECHANISM mechanism = { CKM_RSA_PKCS, NULL_PTR, 0 };
                    unsigned char *bytes;
                    Bignum out;
                    int nbytes;
                    int r;
                    unsigned char hash_sha[20];
                    
                    char p_buf[key_getattributes[0].ulValueLen+1];
                    memset(p_buf, 0, key_getattributes[0].ulValueLen+1);
                    strncpy(p_buf, key_getattributes[0].pValue, key_getattributes[0].ulValueLen);
                    sprintf(msg, "sc: Found pkey: %s", p_buf);
                    logevent(f, msg);
                    if(try_write_syslog) sc_write_syslog(msg);
                    
                    rv = sclib->m_fl->C_SignInit(session, &mechanism, pO);
                    if (CKR_OK != rv) {
                        free(key_getattributes[0].pValue);
                        free(key_getattributes[1].pValue);
                        sprintf(msg, "sc: SignInit failed, 0x%.4x", (int)rv);
                        goto err;
                    }

                    /* rsa2_sign() */
                    SHA_Simple(sigdata, sigdata_len, hash_sha);
                    //        MD5Simple(sigdata, sigdata_len, hash_md5);
                    {
                        int message_len = sizeof(id_sha1) + sizeof(hash_sha);
                        CK_BYTE message[message_len];
                        for(j=0;j<sizeof(id_sha1);j++) message[j] = id_sha1[j]; 
                        memcpy((char *) &message[sizeof(id_sha1)], hash_sha, sizeof(hash_sha));
                        
                        rv = sclib->m_fl->C_Sign(session, message, message_len, signature, &signature_length);
                        if (CKR_OK != rv) {
                            free(key_getattributes[0].pValue); 
                            free(key_getattributes[1].pValue); 
                            sprintf(msg, "sc: Sign failed, 0x%.4x", (int)rv);
                            goto err;
                        }
                    }

                    out = bignum_from_bytes(signature, signature_length);
                    nbytes = (bignum_bitcount(out) + 7) / 8;
                    *sigblob_len = 4 + 7 + 4 + nbytes;
                    bytes = calloc(sizeof(char *), *sigblob_len);
                    SC_PUT_32BIT(bytes, 7);
                    memcpy(bytes + 4, "ssh-rsa", 7);
                    SC_PUT_32BIT(bytes + 4 + 7, nbytes);
                    for (r = 0; r < nbytes; r++)
                        bytes[4 + 7 + 4 + r] = bignum_byte(out, nbytes - 1 - r);
                    ret = bytes;
                    
                    free(out);
                    free(key_getattributes[0].pValue); 
                    free(key_getattributes[1].pValue); 
                    break;
                }
            } else {
                logevent(f, "sc: GetAttributeValue failed, no data loaded");
            }
            free(key_getattributes[0].pValue); 
            free(key_getattributes[1].pValue); 
        } else {
            sprintf(msg, "sc: GetAttributeValue failed (pkey), 0x%.4x", (int)rv);
            logevent(f, msg);
            if(try_write_syslog) sc_write_syslog(msg);
        }
    }

    sclib->m_fl->C_Logout(session);
    sclib->m_fl->C_CloseSession(session);
    return ret;

 err:
    logevent(f, msg);
    if(try_write_syslog) sc_write_syslog(msg);
    sclib->m_fl->C_Logout(session);
    sclib->m_fl->C_CloseSession(session);
    if(ret != NULL) free(ret);
    /* just return an invalid signature ... */
    *sigblob_len = 1;
    return " ";
}
コード例 #18
0
ファイル: WINSER.C プロジェクト: YueLinHo/TortoiseGit
static const char *serial_configure(Serial serial, HANDLE serport, Conf *conf)
{
    DCB dcb;
    COMMTIMEOUTS timeouts;

    /*
     * Set up the serial port parameters. If we can't even
     * GetCommState, we ignore the problem on the grounds that the
     * user might have pointed us at some other type of two-way
     * device instead of a serial port.
     */
    if (GetCommState(serport, &dcb)) {
	char *msg;
	const char *str;

	/*
	 * Boilerplate.
	 */
	dcb.fBinary = TRUE;
	dcb.fDtrControl = DTR_CONTROL_ENABLE;
	dcb.fDsrSensitivity = FALSE;
	dcb.fTXContinueOnXoff = FALSE;
	dcb.fOutX = FALSE;
	dcb.fInX = FALSE;
	dcb.fErrorChar = FALSE;
	dcb.fNull = FALSE;
	dcb.fRtsControl = RTS_CONTROL_ENABLE;
	dcb.fAbortOnError = FALSE;
	dcb.fOutxCtsFlow = FALSE;
	dcb.fOutxDsrFlow = FALSE;

	/*
	 * Configurable parameters.
	 */
	dcb.BaudRate = conf_get_int(conf, CONF_serspeed);
	msg = dupprintf("Configuring baud rate %lu", dcb.BaudRate);
	logevent(serial->frontend, msg);
	sfree(msg);

	dcb.ByteSize = conf_get_int(conf, CONF_serdatabits);
	msg = dupprintf("Configuring %u data bits", dcb.ByteSize);
	logevent(serial->frontend, msg);
	sfree(msg);

	switch (conf_get_int(conf, CONF_serstopbits)) {
	  case 2: dcb.StopBits = ONESTOPBIT; str = "1"; break;
	  case 3: dcb.StopBits = ONE5STOPBITS; str = "1.5"; break;
	  case 4: dcb.StopBits = TWOSTOPBITS; str = "2"; break;
	  default: return "Invalid number of stop bits (need 1, 1.5 or 2)";
	}
	msg = dupprintf("Configuring %s data bits", str);
	logevent(serial->frontend, msg);
	sfree(msg);

	switch (conf_get_int(conf, CONF_serparity)) {
	  case SER_PAR_NONE: dcb.Parity = NOPARITY; str = "no"; break;
	  case SER_PAR_ODD: dcb.Parity = ODDPARITY; str = "odd"; break;
	  case SER_PAR_EVEN: dcb.Parity = EVENPARITY; str = "even"; break;
	  case SER_PAR_MARK: dcb.Parity = MARKPARITY; str = "mark"; break;
	  case SER_PAR_SPACE: dcb.Parity = SPACEPARITY; str = "space"; break;
	}
	msg = dupprintf("Configuring %s parity", str);
	logevent(serial->frontend, msg);
	sfree(msg);

	switch (conf_get_int(conf, CONF_serflow)) {
	  case SER_FLOW_NONE:
	    str = "no";
	    break;
	  case SER_FLOW_XONXOFF:
	    dcb.fOutX = dcb.fInX = TRUE;
	    str = "XON/XOFF";
	    break;
	  case SER_FLOW_RTSCTS:
	    dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
	    dcb.fOutxCtsFlow = TRUE;
	    str = "RTS/CTS";
	    break;
	  case SER_FLOW_DSRDTR:
	    dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
	    dcb.fOutxDsrFlow = TRUE;
	    str = "DSR/DTR";
	    break;
	}
	msg = dupprintf("Configuring %s flow control", str);
	logevent(serial->frontend, msg);
	sfree(msg);

	if (!SetCommState(serport, &dcb))
	    return "Unable to configure serial port";

	timeouts.ReadIntervalTimeout = 1;
	timeouts.ReadTotalTimeoutMultiplier = 0;
	timeouts.ReadTotalTimeoutConstant = 0;
	timeouts.WriteTotalTimeoutMultiplier = 0;
	timeouts.WriteTotalTimeoutConstant = 0;
	if (!SetCommTimeouts(serport, &timeouts))
	    return "Unable to configure serial timeouts";
    }

    return NULL;
}
コード例 #19
0
ファイル: telnet.c プロジェクト: BackupTheBerlios/sftp4tc-svn
static void process_subneg(Telnet telnet)
{
    unsigned char b[2048], *p, *q;
    int var, value, n;
    char *e;

    switch (telnet->sb_opt) {
      case TELOPT_TSPEED:
	if (telnet->sb_len == 1 && telnet->sb_buf[0] == TELQUAL_SEND) {
	    char *logbuf;
	    b[0] = IAC;
	    b[1] = SB;
	    b[2] = TELOPT_TSPEED;
	    b[3] = TELQUAL_IS;
	    strcpy((char *)(b + 4), telnet->cfg.termspeed);
	    n = 4 + strlen(telnet->cfg.termspeed);
	    b[n] = IAC;
	    b[n + 1] = SE;
	    telnet->bufsize = sk_write(telnet->s, (char *)b, n + 2);
	    logevent(telnet->frontend, "server:\tSB TSPEED SEND");
	    logbuf = dupprintf("client:\tSB TSPEED IS %s", telnet->cfg.termspeed);
	    logevent(telnet->frontend, logbuf);
	    sfree(logbuf);
	} else
	    logevent(telnet->frontend, "server:\tSB TSPEED <something weird>");
	break;
      case TELOPT_TTYPE:
	if (telnet->sb_len == 1 && telnet->sb_buf[0] == TELQUAL_SEND) {
	    char *logbuf;
	    b[0] = IAC;
	    b[1] = SB;
	    b[2] = TELOPT_TTYPE;
	    b[3] = TELQUAL_IS;
	    for (n = 0; telnet->cfg.termtype[n]; n++)
		b[n + 4] = (telnet->cfg.termtype[n] >= 'a'
			    && telnet->cfg.termtype[n] <=
			    'z' ? telnet->cfg.termtype[n] + 'A' -
			    'a' : telnet->cfg.termtype[n]);
	    b[n + 4] = IAC;
	    b[n + 5] = SE;
	    telnet->bufsize = sk_write(telnet->s, (char *)b, n + 6);
	    b[n + 4] = 0;
	    logevent(telnet->frontend, "server:\tSB TTYPE SEND");
	    logbuf = dupprintf("client:\tSB TTYPE IS %s", b + 4);
	    logevent(telnet->frontend, logbuf);
	    sfree(logbuf);
	} else
	    logevent(telnet->frontend, "server:\tSB TTYPE <something weird>\r\n");
	break;
      case TELOPT_OLD_ENVIRON:
      case TELOPT_NEW_ENVIRON:
	p = telnet->sb_buf;
	q = p + telnet->sb_len;
	if (p < q && *p == TELQUAL_SEND) {
	    char *logbuf;
	    p++;
	    logbuf = dupprintf("server:\tSB %s SEND", telopt(telnet->sb_opt));
	    logevent(telnet->frontend, logbuf);
	    sfree(logbuf);
	    if (telnet->sb_opt == TELOPT_OLD_ENVIRON) {
		if (telnet->cfg.rfc_environ) {
		    value = RFC_VALUE;
		    var = RFC_VAR;
		} else {
		    value = BSD_VALUE;
		    var = BSD_VAR;
		}
		/*
		 * Try to guess the sense of VAR and VALUE.
		 */
		while (p < q) {
		    if (*p == RFC_VAR) {
			value = RFC_VALUE;
			var = RFC_VAR;
		    } else if (*p == BSD_VAR) {
			value = BSD_VALUE;
			var = BSD_VAR;
		    }
		    p++;
		}
	    } else {
		/*
		 * With NEW_ENVIRON, the sense of VAR and VALUE
		 * isn't in doubt.
		 */
		value = RFC_VALUE;
		var = RFC_VAR;
	    }
	    b[0] = IAC;
	    b[1] = SB;
	    b[2] = telnet->sb_opt;
	    b[3] = TELQUAL_IS;
	    n = 4;
	    e = telnet->cfg.environmt;
	    while (*e) {
		b[n++] = var;
		while (*e && *e != '\t')
		    b[n++] = *e++;
		if (*e == '\t')
		    e++;
		b[n++] = value;
		while (*e)
		    b[n++] = *e++;
		e++;
	    }
	    if (*telnet->cfg.username) {
		b[n++] = var;
		b[n++] = 'U';
		b[n++] = 'S';
		b[n++] = 'E';
		b[n++] = 'R';
		b[n++] = value;
		e = telnet->cfg.username;
		while (*e)
		    b[n++] = *e++;
	    }
	    b[n++] = IAC;
	    b[n++] = SE;
	    telnet->bufsize = sk_write(telnet->s, (char *)b, n);
	    logbuf = dupprintf("client:\tSB %s IS %s%s%s%s",
			       telopt(telnet->sb_opt),
			       *telnet->cfg.username ? "USER="******"",
			       telnet->cfg.username,
			       *telnet->cfg.username ? " " : "",
			       n == 6 ? "<nothing>" :
			       (*telnet->cfg.environmt ? "<stuff>" : ""));
	    logevent(telnet->frontend, logbuf);
	    sfree(logbuf);
	}
	break;
    }
}
コード例 #20
0
ファイル: NiKTransfer.c プロジェクト: dblarsson/NiKom
int download(void) {
	int cnt,freedlonly=FALSE, global = 0, matchall = 0;
	char *nextfile,*nextnext;
	struct Fil *filpek;
	struct TransferFiles *tf;
	if(Servermem->inne[nodnr].upload+1==0) {
		puttekn("\r\n\nVARNING!! Uploads = -1",-1);
		return(0);
	}
	if(Servermem->cfg.uldlratio[Servermem->inne[nodnr].status] && Servermem->cfg.uldlratio[Servermem->inne[nodnr].status] < (Servermem->inne[nodnr].download+1)/(Servermem->inne[nodnr].upload+1)) {
		sprintf(outbuffer,"\r\n\nDu måste ladda upp en fil per %d filer du laddar ner.\r\n",Servermem->cfg.uldlratio[Servermem->inne[nodnr].status]);
		puttekn(outbuffer,-1);
		puttekn("Endast filer med fri download tillåts.\n\r",-1);
		freedlonly=TRUE;
	}
	if(area2==-1) {
		puttekn("\r\n\nDu befinner dig inte i någon area!\r\n",-1);
		return(0);
	}
	if((!global && Servermem->areor[area2].flaggor & AREA_NODOWNLOAD) && (Servermem->inne[nodnr].status < Servermem->cfg.st.laddaner)) {
		puttekn("\n\n\rDu har ingen rätt att ladda ner från den här arean!\n\r",-1);
		return(0);
	}
	if(!argument[0]) {
		puttekn("\r\n\nSkriv: Download <filnamn> [<filnamn> [<filnamn> [...]]]\r\n",-1);
		return(0);
	}
	nextfile=argument;
	if(nextfile[0] == '-')
	{
		puttekn("\r\n\nTest\r\n",-1);
		if(nextfile[1] == 'g' || nextfile[1] == 'G')
			global = 1;

		if(nextfile[1] == 'a' || nextfile[1] == 'A')
			matchall = 1;

		if(!global && !matchall)
		{
			puttekn("\r\n\nOkänd option, bara -A eller -G stödjs.\r\n",-1);
			return(0);
		}

		nextfile=hittaefter(nextfile);
	}

	nextnext=hittaefter(nextfile);
	puttekn("\n\n\r",-1);
	NewList((struct List *)&tf_list);
	while(nextfile[0])
	{
		for(cnt=0;nextfile[cnt]!=' ' && nextfile[cnt]!=0;cnt++);
		nextfile[cnt]=0;
		if(!global && !(filpek=parsefil(nextfile,area2))) {
			sprintf(outbuffer,"Finns ingen fil som matchar \"%s\"\n\r",nextfile);
			puttekn(outbuffer,-1);
			nextfile=nextnext;
			nextnext=hittaefter(nextnext);
			continue;
		}
		if(!filpek && global && !(filpek=parsefilallareas(nextfile)))
		{
			sprintf(outbuffer,"Finns ingen fil som matchar \"%s\"\n\r",nextfile);
			puttekn(outbuffer,-1);
			nextfile=nextnext;
			nextnext=hittaefter(nextnext);
			continue;
		}

		if(filpek->status>Servermem->inne[nodnr].status && Servermem->inne[nodnr].status<Servermem->cfg.st.laddaner)
		{
			sprintf(outbuffer,"Du har ingen rätt att ladda ner %s!\n\r",filpek->namn);
			puttekn(outbuffer,-1);
			nextfile=nextnext;
			nextnext=hittaefter(nextnext);
			continue;
		}
		if(freedlonly && !(filpek->flaggor & FILE_FREEDL))
		{
			nextfile=nextnext;
			nextnext=hittaefter(nextnext);
			continue;
		}
		if(!(tf=(struct TransferFiles *)AllocMem(sizeof(struct TransferFiles),MEMF_CLEAR))) {
			puttekn("Kunde inte allokera en TransferFiles-struktur\n\r",-1);
			nextfile=nextnext;
			nextnext=hittaefter(nextnext);
			continue;
		}
		sprintf(tf->path,"%s%s",Servermem->areor[area2].dir[filpek->dir],filpek->namn);
		tf->filpek=filpek;
		AddTail((struct List *)&tf_list,(struct Node *)tf);
		sprintf(outbuffer,"Skickar filen %s. Storlek: %d %s\r\n",filpek->namn,filpek->size,(filpek->flaggor & FILE_FREEDL) ? "(Fri download)" : "");
		puttekn(outbuffer,-1);
		nextfile=nextnext;
		nextnext=hittaefter(nextnext);
	}
	if(!tf_list.mlh_Head->mln_Succ) {
		puttekn("\n\rInga filer att skicka.\n\r",-1);
		return(0);
	}
	Servermem->action[nodnr] = DOWNLOAD;
	Servermem->varmote[nodnr] = area2;
	Servermem->vilkastr[nodnr] = NULL;
	sendbinfile();
	if(Servermem->cfg.logmask & LOG_DOWNLOAD) {
		for(tf=(struct TransferFiles *)tf_list.mlh_Head;tf->node.mln_Succ;tf=(struct TransferFiles *)tf->node.mln_Succ)
			if(tf->sucess) {
				sprintf(outbuffer,"%s laddar ner %s (%d cps)",getusername(inloggad),tf->filpek->namn,tf->cps);
				logevent(outbuffer);
			}
	}
	for(tf=(struct TransferFiles *)tf_list.mlh_Head;tf->node.mln_Succ;tf=(struct TransferFiles *)tf->node.mln_Succ) {
		if(tf->sucess) {
			if(!(tf->filpek->flaggor & FILE_FREEDL)) Servermem->inne[nodnr].download++;
			Statstr.dl++;
			raisefiledl(tf->filpek);
			sprintf(outbuffer,"%s, %d cps\n\r",tf->filpek->namn,tf->cps);
			puttekn(outbuffer,-1);
		} else {
			sprintf(outbuffer,"%s misslyckades.\n\r",tf->filpek->namn);
			puttekn(outbuffer,-1);
		}
	}
	while(tf=(struct TransferFiles *)RemHead((struct List *)&tf_list))
		FreeMem(tf,sizeof(struct TransferFiles));

	if(carrierdropped()) return(1);
	else return(0);
}
コード例 #21
0
/*
 * Called to set up the rlogin connection.
 * 
 * Returns an error message, or NULL on success.
 *
 * Also places the canonical host name into `realhost'. It must be
 * freed by the caller.
 */
static const char *rlogin_init(void *frontend_handle, void **backend_handle,
			       Conf *conf,
			       char *host, int port, char **realhost,
			       int nodelay, int keepalive)
{
    static const struct plug_function_table fn_table = {
	rlogin_log,
	rlogin_closing,
	rlogin_receive,
	rlogin_sent
    };
    SockAddr addr;
    const char *err;
    Rlogin rlogin;
    char *ruser;
    int addressfamily;
    char *loghost;

    rlogin = snew(struct rlogin_tag);
    rlogin->fn = &fn_table;
    rlogin->s = NULL;
    rlogin->closed_on_socket_error = FALSE;
    rlogin->frontend = frontend_handle;
    rlogin->term_width = conf_get_int(conf, CONF_width);
    rlogin->term_height = conf_get_int(conf, CONF_height);
    rlogin->firstbyte = 1;
    rlogin->cansize = 0;
    rlogin->prompt = NULL;
    rlogin->conf = conf_copy(conf);
    *backend_handle = rlogin;

    addressfamily = conf_get_int(conf, CONF_addressfamily);
    /*
     * Try to find host.
     */
    {
	char *buf;
	buf = dupprintf("Looking up host \"%s\"%s", host,
			(addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" :
			 (addressfamily == ADDRTYPE_IPV6 ? " (IPv6)" :
			  "")));
	logevent(rlogin->frontend, buf);
	sfree(buf);
    }
    addr = name_lookup(host, port, realhost, conf, addressfamily);
    if ((err = sk_addr_error(addr)) != NULL) {
	sk_addr_free(addr);
	return err;
    }

    if (port < 0)
	port = 513;		       /* default rlogin port */

    /*
     * Open socket.
     */
    rlogin->s = new_connection(addr, *realhost, port, 1, 0,
			       nodelay, keepalive, (Plug) rlogin, conf);
    if ((err = sk_socket_error(rlogin->s)) != NULL)
	return err;

    loghost = conf_get_str(conf, CONF_loghost);
    if (*loghost) {
	char *colon;

	sfree(*realhost);
	*realhost = dupstr(loghost);

	colon = host_strrchr(*realhost, ':');
	if (colon)
	    *colon++ = '\0';
    }

    /*
     * Send local username, remote username, terminal type and
     * terminal speed - unless we don't have the remote username yet,
     * in which case we prompt for it and may end up deferring doing
     * anything else until the local prompt mechanism returns.
     */
    if ((ruser = get_remote_username(conf)) != NULL) {
        rlogin_startup(rlogin, ruser);
        sfree(ruser);
    } else {
        int ret;

        rlogin->prompt = new_prompts(rlogin->frontend);
        rlogin->prompt->to_server = TRUE;
        rlogin->prompt->name = dupstr("Rlogin login name");
        add_prompt(rlogin->prompt, dupstr("rlogin username: "), TRUE); 
        ret = get_userpass_input(rlogin->prompt, NULL, 0);
        if (ret >= 0) {
            rlogin_startup(rlogin, rlogin->prompt->prompts[0]->result);
        }
    }

    return NULL;
}
コード例 #22
0
ファイル: NiKTransfer.c プロジェクト: dblarsson/NiKom
int upload(void) {	/* Ändrad för nikfiles.data 960707 JÖ */
	int area,ret,editret,dirnr;
	long tid;
	struct EditLine *el;
	FILE *fp;
	__aligned struct FileInfoBlock info;
	struct Fil *allokpek;
	char nikfilename[100],errbuff[100],filnamn[50],tmpfullname[100], outbuffer[81];
	UBYTE tn;
	struct TransferFiles *tf;

	if(Servermem->cfg.ar.preup1) sendrexx(Servermem->cfg.ar.preup1);
	if(area2==-1) {
		puttekn("\r\nI vilken area? ",-1);
	} else {
		sprintf(outbuffer,"\r\nI vilken area? (<RETURN> för %s)",Servermem->areor[area2].namn);
		puttekn(outbuffer,-1);
	}
	if(getstring(EKO,40,NULL)) return(1);
	if((area=parsearea(inmat))==-1) {
		puttekn("\n\rFinns ingen sådan area!\n\r",-1);
		return(0);
	} else if(area==-3) {
		if(area2==-1) return(0);
		area=area2;
	}
	if(!arearatt(area, inloggad, &Servermem->inne[nodnr])) {
		puttekn("\n\rFinns ingen sådan area!\n\r",-1);
		return(0);
	}
	if((Servermem->areor[area].flaggor & AREA_NOUPLOAD) && (Servermem->inne[nodnr].status < Servermem->cfg.st.laddaner)) {
		puttekn("\n\n\rDu har ingen rätt att ladda upp till den arean!\n\r",-1);
		return(0);
	}
	Servermem->action[nodnr] = UPLOAD;
	Servermem->varmote[nodnr] = area;
	Servermem->vilkastr[nodnr] = NULL;
	if(ret=recbinfile(Servermem->cfg.ultmp)) {
		while(tf=(struct TransferFiles *)RemHead((struct List *)&tf_list))
			FreeMem(tf,sizeof(struct TransferFiles));
		if(carrierdropped()) return(1);
		return(0);
	}

	/* printf("Filnamn = %s\n",FilePart(tf->Filnamn));
	printf("Cps = %d\n\n",tf->cps); */

	for(tf=(struct TransferFiles *)tf_list.mlh_Head;tf->node.mln_Succ;tf=(struct TransferFiles *)tf->node.mln_Succ) {
		strcpy(xprfilnamn,tf->Filnamn);
		if(stcgfn(filnamn,xprfilnamn)>40) puttekn("\r\nVARNING! Filnamnet större än 40 tecken!\r\n",-1);
		if(!filnamn[0]) {
			puttekn("\r\n\nHmm... Filen har inget namn. Skriv ett brev till sysop.\r\n",-1);
			continue;
		}
		if(!valnamn(filnamn,area,errbuff)) {
			for(;;) {
				puttekn(errbuff,-1);
				puttekn("\r\nNytt namn: ",-1);
				if(getstring(EKO,40,NULL)) { DeleteFile(xprfilnamn); return(1); }
				if(!inmat[0]) continue;
				if(valnamn(inmat,area,errbuff)) break;
			}
			strcpy(filnamn,inmat);
			sprintf(tmpfullname,"%s%s",Servermem->cfg.ultmp,filnamn);
			if(!Rename(xprfilnamn,tmpfullname)) {
				sprintf(outbuffer,"\r\n\nKunde inte döpa om filen från '%s'\r\ntill '%s'.\r\n",xprfilnamn,tmpfullname);
				puttekn(outbuffer,-1);
				DeleteFile(xprfilnamn);
				continue;
			}
		} else strcpy(tmpfullname,xprfilnamn);
		if(!(allokpek=(struct Fil *)AllocMem(sizeof(struct Fil),MEMF_PUBLIC | MEMF_CLEAR))) {
			puttekn("\r\n\nKunde inte allokera minne för filen!\r\n",-1);
			continue;
		}
		time(&tid);
		allokpek->tid=allokpek->validtime=tid;
		allokpek->uppladdare=inloggad;
		if(dfind(&info,tmpfullname,0)) {
			sprintf(outbuffer,"\r\nHittar inte filen %s!\r\n",tmpfullname);
			puttekn(outbuffer,-1);
			FreeMem(allokpek,sizeof(struct Fil));
			continue;
		}
		allokpek->size=info.fib_Size;

		sprintf(outbuffer,"\r\n\r\nFilnamn: %s", filnamn);
		puttekn(outbuffer,-1);
		puttekn("\r\nVilken status ska behövas för att ladda ner filen? (0)",-1);
		if(getstring(EKO,3,NULL)) { FreeMem(allokpek,sizeof(struct Fil)); return(1); }
		allokpek->status=atoi(inmat);
		if(Servermem->inne[nodnr].status >= Servermem->cfg.st.filer) {
			puttekn("\n\rSka filen valideras? ",-1);
			if(jaellernej('j','n',1)) puttekn("Ja",-1);
			else {
				puttekn("Nej",-1);
				allokpek->flaggor|=FILE_NOTVALID;
			}
			puttekn("\n\rSka filen ha fri download? ",-1);
			if(jaellernej('j','n',2)) {
				puttekn("Ja",-1);
				allokpek->flaggor|=FILE_FREEDL;
			} else puttekn("Nej",-1);
		} else if(Servermem->cfg.cfgflags & NICFG_VALIDATEFILES) allokpek->flaggor|=FILE_NOTVALID;
		sendfile("NiKom:Texter/Nyckelhjälp.txt");
		puttekn("\r\nVilka söknycklar ska filen ha? (? för att få en lista)\r\n",-1);
		if(editkey(allokpek->nycklar)) { FreeMem(allokpek,sizeof(struct Fil)); return(1); }
		puttekn("\r\nBeskrivning:\r\n",-1);
		if(getstring(EKO,70,NULL)) { FreeMem(allokpek,sizeof(struct Fil)); return(1); }
		strcpy(allokpek->beskr,inmat);
		dirnr=choosedir(area,allokpek->nycklar,allokpek->size);
		if(dirnr==-1) {
			puttekn("\r\n\nKunde inte hitta något lämpligt directory för filen!\r\n",-1);
			DeleteFile(tmpfullname);
			FreeMem(allokpek,sizeof(struct Fil));
			continue;
		}
		allokpek->dir=dirnr;
		strcpy(allokpek->namn,filnamn);
		sprintf(inmat,"%s %s",tmpfullname,Servermem->areor[area].dir[dirnr]);
		argument=inmat;
		sendrexx(10);
		AddTail((struct List *)&Servermem->areor[area].ar_list,(struct Node *)allokpek);
		if(writefiles(area)) {
			puttekn("\r\n\nKunde inte skriva till datafilen\r\n",-1);

		}

		Servermem->inne[nodnr].upload++;
		Statstr.ul++;
		if(Servermem->cfg.logmask & LOG_UPLOAD) {
			sprintf(outbuffer,"%s laddar upp %s",getusername(inloggad),allokpek->namn);
			logevent(outbuffer);
		}
		if(Servermem->cfg.ar.postup1) sendrexx(Servermem->cfg.ar.postup1);
		puttekn("\r\n\nVill du skriva en längre beskrivning? (J/n) ",-1);
		while((tn=gettekn())!='j' && tn!='J' && tn!='n' && tn!='N' && tn!=13);
		if(tn=='j' || tn=='J') {
			puttekn("\r\n\nOk, går in i editorn.\r\n",-1);
			if((editret=edittext(NULL))==1) return(1);
			else if(editret==2) continue;
			sprintf(nikfilename,"%slongdesc/%s.long",Servermem->areor[area].dir[dirnr],filnamn);
			if(!(fp=fopen(nikfilename,"w"))) {
				puttekn("\r\n\nKunde inte öppna longdesc-filen\r\n",-1);
				freeeditlist();
				continue;
			}
			for(el=(struct EditLine *)edit_list.mlh_Head;el->line_node.mln_Succ;el=(struct EditLine *)el->line_node.mln_Succ) {
				if(fputs(el->text,fp)) {
					freeeditlist();
					fclose(fp);
					continue;
				}
				fputc('\n',fp);
			}
			freeeditlist();
			fclose(fp);
			puttekn("\r\n",-1);
			allokpek->flaggor|=FILE_LONGDESC;
			updatefile(area,allokpek);
		}
	}

	while(tf=(struct TransferFiles *)RemHead((struct List *)&tf_list))
		FreeMem(tf,sizeof(struct TransferFiles));

	return(0);
}
コード例 #23
0
ファイル: winproxy.c プロジェクト: albuer/puttyplus
Socket platform_new_connection(SockAddr addr, char *hostname,
			       int port, int privport,
			       int oobinline, int nodelay, int keepalive,
			       Plug plug, Conf *conf)
{
    char *cmd;

    static const struct socket_function_table socket_fn_table = {
	sk_localproxy_plug,
	sk_localproxy_close,
	sk_localproxy_write,
	sk_localproxy_write_oob,
	sk_localproxy_write_eof,
	sk_localproxy_flush,
	sk_localproxy_set_private_ptr,
	sk_localproxy_get_private_ptr,
	sk_localproxy_set_frozen,
	sk_localproxy_socket_error
    };

    Local_Proxy_Socket ret;
    HANDLE us_to_cmd, us_from_cmd, cmd_to_us, cmd_from_us;
    SECURITY_ATTRIBUTES sa;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    if (conf_get_int(conf, CONF_proxy_type) != PROXY_CMD)
	return NULL;

    cmd = format_telnet_command(addr, port, conf);

    {
	char *msg = dupprintf("Starting local proxy command: %s", cmd);
	/* We're allowed to pass NULL here, because we're part of the Windows
	 * front end so we know logevent doesn't expect any data. */
	logevent(NULL, msg);
	sfree(msg);
    }

    ret = snew(struct Socket_localproxy_tag);
    ret->fn = &socket_fn_table;
    ret->plug = plug;
    ret->error = NULL;

    /*
     * Create the pipes to the proxy command, and spawn the proxy
     * command process.
     */
    sa.nLength = sizeof(sa);
    sa.lpSecurityDescriptor = NULL;    /* default */
    sa.bInheritHandle = TRUE;
    if (!CreatePipe(&us_from_cmd, &cmd_to_us, &sa, 0)) {
	ret->error = dupprintf("Unable to create pipes for proxy command");
        sfree(cmd);
	return (Socket)ret;
    }

    if (!CreatePipe(&cmd_from_us, &us_to_cmd, &sa, 0)) {
	CloseHandle(us_from_cmd);
	CloseHandle(cmd_to_us);
	ret->error = dupprintf("Unable to create pipes for proxy command");
        sfree(cmd);
	return (Socket)ret;
    }

    SetHandleInformation(us_to_cmd, HANDLE_FLAG_INHERIT, 0);
    SetHandleInformation(us_from_cmd, HANDLE_FLAG_INHERIT, 0);

    si.cb = sizeof(si);
    si.lpReserved = NULL;
    si.lpDesktop = NULL;
    si.lpTitle = NULL;
    si.dwFlags = STARTF_USESTDHANDLES;
    si.cbReserved2 = 0;
    si.lpReserved2 = NULL;
    si.hStdInput = cmd_from_us;
    si.hStdOutput = cmd_to_us;
    si.hStdError = NULL;
    CreateProcess(NULL, cmd, NULL, NULL, TRUE,
		  CREATE_NO_WINDOW | NORMAL_PRIORITY_CLASS,
		  NULL, NULL, &si, &pi);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    sfree(cmd);

    CloseHandle(cmd_from_us);
    CloseHandle(cmd_to_us);

    ret->to_cmd_H = us_to_cmd;
    ret->from_cmd_H = us_from_cmd;

    ret->from_cmd_h = handle_input_new(ret->from_cmd_H, localproxy_gotdata,
				       ret, 0, NULL);
    ret->to_cmd_h = handle_output_new(ret->to_cmd_H, localproxy_sentdata,
				      ret, 0, NULL);

    /* We are responsible for this and don't need it any more */
    sk_addr_free(addr);

    return (Socket) ret;
}
コード例 #24
0
ファイル: NiKTransfer.c プロジェクト: dblarsson/NiKom
int sendbinfile(void) {
	struct TransferFiles *tf;
	int xprreturkod,cnt=0;
	if(!(XProtocolBase=(struct Library *)OpenLibrary("xprzmodem.library",0L)))
	{
		puttekn("\r\n\nKunde inte öppna xprzmodem.library!\r\n",-1);
		return(2);
	}
	if(!(xio=(struct XPR_IO *)AllocMem(sizeof(struct XPR_IO),MEMF_PUBLIC | MEMF_CLEAR))) {
		puttekn("\r\n\nKunde inte allokera en io-struktur\r\n",-1);
		CloseLibrary(XProtocolBase);
		return(2);
	}
	puttekn("\r\nDu kan börja ta emot med Zmodem.\r\n",-1);
	puttekn("Tryck Ctrl-X några gånger för att avbryta.\r\n",-1);
	AbortIO((struct IORequest *)serreadreq);
	WaitIO((struct IORequest *)serreadreq);
	if(!CheckIO((struct IORequest *)inactivereq)) {
		AbortIO((struct IORequest *)inactivereq);
		WaitIO((struct IORequest *)inactivereq);
	}

	xpr_setup(xio);
	xio->xpr_filename=zinitstring;
	XProtocolSetup(xio);
	xio->xpr_filename="Hejhopp";
	xprreturkod=XProtocolSend(xio);
	Delay(30);
	XProtocolCleanup(xio);
	CloseLibrary(XProtocolBase);
	if(!CheckIO((struct IORequest *)serreadreq)) {
		AbortIO((struct IORequest *)serreadreq);
		WaitIO((struct IORequest *)serreadreq);
		printf("Serreadreq avbruten!!\n");
	}
	if(!CheckIO((struct IORequest *)timerreq)) {
		AbortIO((struct IORequest *)timerreq);
		WaitIO((struct IORequest *)timerreq);
		printf("Timerreq avbruten!!\n");
	}
	FreeMem(xio,sizeof(struct XPR_IO));
	Delay(100);
	serchangereq->IOSer.io_Command=CMD_CLEAR;
	DoIO((struct IORequest *)serchangereq);
	serchangereq->IOSer.io_Command=CMD_FLUSH;
	DoIO((struct IORequest *)serchangereq);
	serreqtkn();
	updateinactive();
	if(Servermem->cfg.logmask & LOG_SENDFILE) {
		for(tf=(struct TransferFiles *)tf_list.mlh_Head;tf->node.mln_Succ;tf=(struct TransferFiles *)tf->node.mln_Succ)
			if(tf->sucess) {
				sprintf(outbuffer,"Skickar filen %s till %s",tf->path,getusername(inloggad));
				logevent(outbuffer);
			}
	}
	for(tf=(struct TransferFiles *)tf_list.mlh_Head;tf->node.mln_Succ;tf=(struct TransferFiles *)tf->node.mln_Succ)
		if(tf->sucess) cnt++;
	if(cnt==1) strcpy(outbuffer,"\n\n\rFörde över 1 fil.\n\n\r");
	else sprintf(outbuffer,"\n\n\rFörde över %d filer.\n\n\r",cnt);
	puttekn(outbuffer,-1);
	return(0);
}
コード例 #25
0
ファイル: server.c プロジェクト: monsanto/bouncethis
void portthread (void * port_ptr)
{
 SOCKET s;
 BT_PORT port_info ;

 port_info = *(BT_PORT*) port_ptr ;

 s = bt_listen (port_info.port);

 if (!s)
  _endthread();

 while (1)
 {
  socklen_t addrlen = sizeof(SOCKADDR_IN);
  SOCKADDR_IN addr ; 
  SOCKET client_sock;
  BT_CLIENT * client ;
  char reason, *ip;

  client_sock = accept (s, (SOCKADDR*) &addr, &addrlen);

  if (client_sock == -1)
   continue;

  ip = inet_ntoa (addr.sin_addr);

  if ((reason = allow(ip)) <= 0)
  {
   switch (reason)
   {
   case 0:
	logevent("Refused %s:%i (filter)", 
	 ip,port_info.port);
	break;
   case -1:
	logevent("Refused %s:%i (connection limit)", 
	 ip,port_info.port);
	break;
   case -2:
	logevent("Refused %s:%i (clone limit)", 
	 ip,port_info.port);
	break;
   }
   bt_close(client_sock);
   continue;
  }

  client = addconn(ip,port_info.port);
  client->sock = client_sock;
  client->use_pass = port_info.use_pass ;

  if (client->use_pass)
   bt_cpy (client->password, port_info.password);

  if (_beginthread (proxythread,0,client) == -1)
  {
   logevent ("Could not create proxy thread for %s:%i",
	client->ip,client->port);

   bt_close(client->sock);
   delconn(client);

   _endthread();
  }
 }

 _endthread();
}
コード例 #26
0
ファイル: rlogin.c プロジェクト: rdebath/sgt
/*
 * Called to set up the rlogin connection.
 * 
 * Returns an error message, or NULL on success.
 *
 * Also places the canonical host name into `realhost'. It must be
 * freed by the caller.
 */
static char *rlogin_init(char *host, int port, char **realhost, int nodelay)
{
    static struct plug_function_table fn_table = {
	rlogin_closing,
	rlogin_receive,
	rlogin_sent
    }, *fn_table_ptr = &fn_table;

    SockAddr addr;
    char *err;

    /*
     * Try to find host.
     */
    {
	char buf[200];
	sprintf(buf, "Looking up host \"%.170s\"", host);
	logevent(buf);
    }
    addr = sk_namelookup(host, realhost);
    if ((err = sk_addr_error(addr)))
	return err;

    if (port < 0)
	port = 513;		       /* default rlogin port */

    /*
     * Open socket.
     */
    {
	char buf[200], addrbuf[100];
	sk_getaddr(addr, addrbuf, 100);
	sprintf(buf, "Connecting to %.100s port %d", addrbuf, port);
	logevent(buf);
    }
    s = sk_new(addr, port, 1, 0, nodelay, &fn_table_ptr);
    if ((err = sk_socket_error(s)))
	return err;

    sk_addr_free(addr);

    /*
     * Send local username, remote username, terminal/speed
     */

    {
	char z = 0;
	char *p;
	sk_write(s, &z, 1);
	sk_write(s, cfg.localusername, strlen(cfg.localusername));
	sk_write(s, &z, 1);
	sk_write(s, cfg.username, strlen(cfg.username));
	sk_write(s, &z, 1);
	sk_write(s, cfg.termtype, strlen(cfg.termtype));
	sk_write(s, "/", 1);
	for (p = cfg.termspeed; isdigit(*p); p++);
	sk_write(s, cfg.termspeed, p - cfg.termspeed);
	rlogin_bufsize = sk_write(s, &z, 1);
    }

    return NULL;
}