/*METHOD: Evaluate the kraken database file*/ void evaluate_kfile(string k_file, string o_file, const taxonomy *my_taxonomy, const map<int, taxonomy *> *taxid2node, const map<string, int> seqid2taxid, const int kmer_len, const int read_len){ /*Read the file and get maps: * map of number seqid to the kmer distribution * map of number seqid to taxid */ map<int, string> id2kmers; map<int, int> id2taxid; map<int, string> id2seqid; map<int, string> id2tandl; int num_reads = read_kfile(k_file, &seqid2taxid, &id2seqid, &id2kmers, &id2taxid, &id2tandl); /*For each seqid, in parallel, convert kmer distribution to read distribution*/ convert_distribution(o_file, num_reads, &id2seqid, &id2kmers, &id2taxid, &id2tandl, my_taxonomy, taxid2node, kmer_len, read_len); }
int f_starttls( SNET *sn, int ac, char **av ) { int rc; X509 *peer; char buf[ 1024 ]; if ( ac != 1 ) { snet_writef( sn, "%d Syntax error (no parameters allowed)\r\n", 501 ); return( 1 ); } else { snet_writef( sn, "%d Ready to start TLS\r\n", 220 ); } /* We get here when the client asks for TLS with the STARTTLS verb */ /* * Client MUST NOT attempt to start a TLS session if a TLS * session is already active. No mention of what to do if it does... * * Once STARTTLS has succeeded, the STARTTLS verb is no longer valid */ /* * Begin TLS */ /* This is where the TLS start */ /* At this point the client is also starting TLS */ /* 1 is for server, 0 is client */ if (( rc = snet_starttls( sn, ctx, 1 )) != 1 ) { syslog( LOG_ERR, "f_starttls: snet_starttls: %s", ERR_error_string( ERR_get_error(), NULL ) ); snet_writef( sn, "%d SSL didn't work error! XXX\r\n", 501 ); return( 1 ); } if ( authlevel >= 2 ) { if (( peer = SSL_get_peer_certificate( sn->sn_ssl )) == NULL ) { syslog( LOG_ERR, "no peer certificate" ); return( -1 ); } syslog( LOG_INFO, "CERT Subject: %s\n", X509_NAME_oneline( X509_get_subject_name( peer ), buf, sizeof( buf ))); X509_NAME_get_text_by_NID( X509_get_subject_name( peer ), NID_commonName, buf, sizeof( buf )); if (( remote_cn = strdup( buf )) == NULL ) { syslog( LOG_ERR, "strdup: %m" ); X509_free( peer ); return( -1 ); } X509_free( peer ); } /* get command file */ if ( command_k( "config", 0 ) < 0 ) { /* Client not in config */ commands = noauth; ncommands = sizeof( noauth ) / sizeof( noauth[ 0 ] ); } else { /* Client in config */ commands = auth; ncommands = sizeof( auth ) / sizeof( auth[ 0 ] ); if ( read_kfile( sn, command_file ) != 0 ) { /* error message given in list_transcripts */ exit( 1 ); } } return( 0 ); }
int cmdloop( int fd, struct sockaddr_in *sin ) { SNET *sn; struct hostent *hp; char *p; int ac, i; int one = 1; unsigned int n; char **av, *line; struct timeval tv; extern char *version; extern int connections; extern int maxconnections; extern int rap_extensions; if ( authlevel == 0 ) { commands = noauth; ncommands = sizeof( noauth ) / sizeof( noauth[ 0 ] ); } else { commands = notls; ncommands = sizeof( notls ) / sizeof( notls[ 0 ] ); } if (( sn = snet_attach( fd, 1024 * 1024 )) == NULL ) { syslog( LOG_ERR, "snet_attach: %m" ); exit( 1 ); } remote_addr = strdup( inet_ntoa( sin->sin_addr )); if (( hp = gethostbyaddr( (char *)&sin->sin_addr, sizeof( struct in_addr ), AF_INET )) == NULL ) { remote_host = strdup( remote_addr ); } else { /* set global remote_host for retr command */ remote_host = strdup( hp->h_name ); for ( p = remote_host; *p != '\0'; p++ ) { *p = tolower( *p ); } } syslog( LOG_INFO, "child for [%s] %s", inet_ntoa( sin->sin_addr ), remote_host ); if ( setsockopt( fd, 6, TCP_NODELAY, &one, sizeof( one )) < 0 ) { syslog( LOG_ERR, "setsockopt: %m" ); } if ( maxconnections != 0 ) { if ( connections > maxconnections ) { syslog( LOG_INFO, "%s: connection refused: server busy\r\n", remote_host ); snet_writef( sn, "%d Server busy\r\n", 420 ); exit( 1 ); } } if (( access_list = list_new( )) == NULL ) { syslog( LOG_ERR, "new_list: %m" ); snet_writef( sn, "%d Service not available, closing transmission channel\r\n", 421 ); return( -1 ); } if ( authlevel == 0 ) { /* lookup proper command file based on the hostname, IP or CN */ if ( command_k( "config", 0 ) < 0 ) { syslog( LOG_INFO, "%s: Access denied: Not in config file", remote_host ); snet_writef( sn, "%d No access for %s\r\n", 500, remote_host ); exit( 1 ); } else { if ( read_kfile( sn, command_file ) != 0 ) { /* error message given in read_kfile */ exit( 1 ); } commands = auth; ncommands = sizeof( auth ) / sizeof( auth[ 0 ] ); } } if ( gethostname( hostname, MAXHOSTNAMELEN ) < 0 ) { syslog( LOG_ERR, "gethostname: %m" ); exit( 1 ); } snet_writef( sn, "200%sRAP 1 %s %s radmind access protocol\r\n", rap_extensions ? "-" : " ", hostname, version ); if ( rap_extensions ) { snet_writef( sn, "200 CAPA" ); #ifdef HAVE_ZLIB if ( max_zlib_level > 0 ) { snet_writef( sn, " ZLIB" ); } #endif /* HAVE_ZLIB */ snet_writef( sn, " REPO" ); snet_writef( sn, "\r\n" ); } /* * 60 minutes * To make fsdiff | lapply work, when fsdiff will take a long time, * we allow the server to wait a long time. */ tv.tv_sec = 60 * 60; tv.tv_usec = 0 ; while (( line = snet_getline( sn, &tv )) != NULL ) { tv.tv_sec = 60 * 60; tv.tv_usec = 0; if ( debug ) { fprintf( stderr, "<<< %s\n", line ); } if (( ac = argcargv( line, &av )) < 0 ) { syslog( LOG_ERR, "argcargv: %m" ); return( 1 ); } if ( ac == 0 ) { snet_writef( sn, "%d Illegal null command\r\n", 501 ); continue; } for ( i = 0; i < ncommands; i++ ) { n = MAX( strlen( av[ 0 ] ), 4 ); if ( strncasecmp( av[ 0 ], commands[ i ].c_name, n ) == 0 ) { break; } } if ( i >= ncommands ) { snet_writef( sn, "%d Command %s unrecognized\r\n", 500, av[ 0 ] ); continue; } if ( (*(commands[ i ].c_func))( sn, ac, av ) < 0 ) { break; } } snet_writef( sn, "%d Server closing connection\r\n", 444 ); if ( line == NULL ) { syslog( LOG_ERR, "snet_getline: %m" ); } return( 0 ); }
int read_kfile( SNET *sn, char *kfile ) { int ac; int linenum = 0; char **av; char line[ MAXPATHLEN ]; char path[ MAXPATHLEN ]; ACAV *acav; FILE *f; if ( snprintf( path, MAXPATHLEN, "command/%s", kfile ) >= MAXPATHLEN ) { syslog( LOG_ERR, "read_kfile: command/%s: path too long", kfile ); snet_writef( sn, "%d Service not available, closing transmission channel\r\n", 421 ); return( -1 ); } if (( acav = acav_alloc( )) == NULL ) { syslog( LOG_ERR, "acav_alloc: %m" ); snet_writef( sn, "%d Service not available, closing transmission channel\r\n", 421 ); return( -1 ); } if (( f = fopen( path, "r" )) == NULL ) { syslog( LOG_ERR, "fopen: %s: %m", path ); snet_writef( sn, "%d Service not available, closing transmission channel\r\n", 421 ); return( -1 ); } while ( fgets( line, MAXPATHLEN, f ) != NULL ) { linenum++; ac = acav_parse( acav, line, &av ); if (( ac == 0 ) || ( *av[ 0 ] == '#' )) { continue; } /* Skip minus lines in command files for now. Eventually, * the server should not give access to command files, special files * and transcripts that have been ultimately removed with a '-'. * This is difficult as ktcheck reads command files line by line * and will request info on a file that might be removed with a * later '-'. */ if ( *av[ 0 ] == '-' ) { continue; } if ( ac != 2 ) { syslog( LOG_ERR, "%s: line %d: invalid number of arguments", kfile, linenum ); snet_writef( sn, "%d Service not available, closing transmission channel\r\n", 421 ); goto error; } switch( *av[ 0 ] ) { case 'k': if ( !list_check( access_list, av[ 1 ] )) { if ( list_insert( access_list, av[ 1 ] ) != 0 ) { syslog( LOG_ERR, "list_insert: %m" ); snet_writef( sn, "%d Service not available, closing transmission channel\r\n", 421 ); goto error; } if ( read_kfile( sn, av[ 1 ] ) != 0 ) { goto error; } } break; case 'p': case 'n': if ( !list_check( access_list, av[ 1 ] )) { if ( list_insert( access_list, av[ 1 ] ) != 0 ) { syslog( LOG_ERR, "list_insert: %m" ); snet_writef( sn, "%d Service not available, closing transmission channel\r\n", 421 ); goto error; } } break; case 's': case 'x': break; default: syslog( LOG_ERR, "%s: line %d: %c: unknown file type", kfile, linenum, *av[ 0 ] ); snet_writef( sn, "%d Service not available, closing transmission channel\r\n", 421 ); goto error; } if ( ferror( f )) { syslog( LOG_ERR, "fgets: %m" ); snet_writef( sn, "%d Service not available, closing transmission channel\r\n", 421 ); goto error; } } if ( fclose( f ) != 0 ) { syslog( LOG_ERR, "fclose: %m" ); snet_writef( sn, "%d Service not available, closing transmission channel\r\n", 421 ); goto error; } if ( acav_free( acav ) != 0 ) { syslog( LOG_ERR, "acav_free: %m" ); snet_writef( sn, "%d Service not available, closing transmission channel\r\n", 421 ); return( -1 ); } return( 0 ); error: fclose( f ); acav_free( acav ); return( -1 ); }