void configuration::sanity_check_values()
{
	if(conf[DTLS_BIND_PORT] == 0 || conf[DTLS_OUTGOING_PORT] == 0) {
		// use random but persistent ports for these
		std::ofstream conffile(conf[CONFIG_FILE], std::ios_base::out | std::ios_base::binary | std::ios_base::app);
		if(conf[DTLS_BIND_PORT] == 0) {
			uint16_t port = ntohs(get_random_port());
			iout() << "Assigned DTLS_BIND_PORT random port " << port;
			conffile << "\nDTLS_BIND_PORT=" << port << '\n';
			assign_value(DTLS_BIND_PORT, port);
		}
		if(conf[DTLS_OUTGOING_PORT] == 0) {
			uint16_t port = ntohs(get_random_port());
			iout() << "Assigned DTLS_OUTGOING_PORT random port " << port;
			conffile << "\nDTLS_OUTGOING_PORT=" << port << '\n';
			assign_value(DTLS_OUTGOING_PORT, port);
		}
	}
	if(conf[DTLS_BIND_PORT] == conf[DTLS_OUTGOING_PORT] || conf[DTLS_BIND6_PORT] == conf[DTLS_OUTGOING_PORT]) {
		eout() << "DTLS_BIND_PORT or DTLS_OUTGOING_PORT not initialized to separate valid ports, these should have been set to random ports during installation."
			<< " You must set DTLS_BIND_PORT and DTLS_OUTGOING_PORT to separate port numbers in the snow configuration file."
			   << " If you have more than one device try to choose different ports for each device.";
		abort();
	}
	check_port(conf[DTLS_OUTGOING_PORT], "DTLS_OUTGOING_PORT");
	check_port(conf[DTLS_BIND_PORT], "DTLS_BIND_PORT");
	check_port(conf[DTLS_BIND6_PORT], "DTLS_BIND6_PORT");
	check_port(conf[DHT_PORT], "DHT_PORT");
	check_port(conf[NAMESERV_PORT], "NAMESERV_PORT");
	check_nonzero(conf[NAMESERV_TIMEOUT_SECS], "NAMESERV_TIMEOUT_SECS");
	check_nonzero(conf[DTLS_IDLE_TIMEOUT_SECS], "DTLS_IDLE_TIMEOUT_SECS");
	check_nonzero(conf[HEARTBEAT_SECONDS], "HEARTBEAT_SECONDS");
	check_nonzero(conf[HEARTBEAT_RETRIES], "HEARTBEAT_RETRIES");
	if(conf[NAT_IP_GRACE_PERIOD_SECONDS] < 1800) {
		wout() << "NAT IP grace period of " << conf[NAT_IP_GRACE_PERIOD_SECONDS] << " from configuration file is too short, using minimum grace period of 1800 seconds";
		assign_value(NAT_IP_GRACE_PERIOD_SECONDS, 1800);
	}
	if(conf[DHT_BOOTSTRAP_TARGET]==0) {
		wout() << "DHT_BOOTSTRAP_TARGET cannot be zero, using default value";
		assign_value(DHT_BOOTSTRAP_TARGET, 6);
	}
	if(conf[DHT_MAX_PEERS] <= 3) {
		wout() << "DHT_MAX_PEERS cannot be " << conf[DHT_MAX_PEERS] << ", must be at least 4, using default value of 99";
		assign_value(DHT_MAX_PEERS, 99);
	}
	if(conf[NATPOOL_NETMASK_BITS] > 20 || conf[NATPOOL_NETMASK_BITS] < 4) {
		eout() << "NATPOOL_NETMASK_BITS must be between 4 and 20";
		abort();
	}
	uint32_t addr, netmask = ~htonl((1 << (32 - conf[NATPOOL_NETMASK_BITS])) - 1);
	if(inet_pton(AF_INET, conf[NATPOOL_NETWORK].c_str(), &addr) != 1 || (addr & ~netmask) != 0) {
		eout() << "NATPOOL_NETWORK/NATPOOL_NETMASK_BITS as " << conf[NATPOOL_NETWORK] << "/" << conf[NATPOOL_NETMASK_BITS] << " is not a valid subnet.";
		abort();
	}
	if(conf[VIRTUAL_INTERFACE_MTU] > 65535 || conf[VIRTUAL_INTERFACE_MTU] < 576) {
		eout() << "VIRTUAL_INTERFACE_MTU cannot be " << conf[VIRTUAL_INTERFACE_MTU];
		abort();
	}
}
Exemple #2
0
/*-------------------------------------------------------------------------------------*/
Socket tcp_passive_open(int port) 
/*-------------------------------------------------------------------------------------*/
{
  // parameter check                                                                                         
  check_port("tcp_open_server() failed", port);

  MySocket *s = (MySocket *)malloc( sizeof(MySocket) );
  if ( s == NULL ) 
    die("tcp_open__socket() failed: mem alloc error");

  struct sockaddr_in addr;

  s->sd = socket(PROTOCOLFAMILY, TYPE, PROTOCOL);
  check_sd("tcp_open_server failed(): socket creation error", s->sd);

  /* Construct the server address structure */
  memset(&addr, 0, sizeof(struct sockaddr_in));
  addr.sin_family = PROTOCOLFAMILY;
  addr.sin_addr.s_addr = htonl(INADDR_ANY);
  addr.sin_port = htons(port);

  if ( bind(s->sd, (struct sockaddr *)&addr, sizeof(addr)) != 0 ) {
    die("tcp_open_server failed(): bind() failed");  //will fail if e.g; port is in use
  }

  if( listen(s->sd, MAX_PENDING) != 0 )
	die("tcp_open_server failed(): listen() failed");

  s->port = port;
  s->ip_addr = NULL;  //INADDR_ANY ...	

  return (Socket)s;  
}
std::shared_ptr<HttpEndPointServer>
HttpEndPointServer::getHttpEndPointServer (const uint port,
    const std::string &iface, const std::string &addr)
{
  std::unique_lock <std::recursive_mutex> lock (mutex);
  uint finalPort = port;


  if (instance) {
    return instance;
  }

  if (finalPort == 0) {
    GST_INFO ("HttpService will start on any available port");
  } else {
    try {
      check_port (finalPort);
    } catch (std::exception &ex) {
      GST_WARNING ("Setting default port %d to http end point server",
                   DEFAULT_PORT);
      finalPort = DEFAULT_PORT;
    }
  }

  HttpEndPointServer::port = finalPort;
  HttpEndPointServer::interface = iface;
  HttpEndPointServer::announcedAddr = addr;

  instance = std::shared_ptr<HttpEndPointServer> (new HttpEndPointServer () );
  instance->start();

  return instance;
}
RabbitMQService::RabbitMQService (Glib::KeyFile &confFile) : Service (confFile)
{
  sigset_t mask;
  std::string address;
  int port;

  try {
    address = confFile.get_string (RABBITMQ_GROUP, RABBITMQ_SERVER_ADDRESS);
  } catch (const Glib::KeyFileError &err) {
    GST_WARNING ("Setting default address %s to media server",
                 RABBITMQ_SERVER_ADDRESS_DEFAULT);
    address = RABBITMQ_SERVER_ADDRESS_DEFAULT;
  }

  try {
    port = confFile.get_integer (RABBITMQ_GROUP, RABBITMQ_SERVER_PORT);
    check_port (port);
  } catch (const Glib::KeyFileError &err) {
    GST_WARNING ("Setting default port %d to media server",
                 RABBITMQ_SERVER_PORT_DEFAULT);
    port = RABBITMQ_SERVER_PORT_DEFAULT;
  }

  this->address = address;
  this->port = port;

  setConfig (address, port);
  this->confFile.load_from_data (confFile.to_data() );

  sigemptyset (&mask);
  sigaddset (&mask, SIGCHLD);
  signalHandler = std::shared_ptr <SignalHandler> (new SignalHandler (mask,
                  std::bind (&RabbitMQService::childSignal, this, std::placeholders::_1) ) );
}
Exemple #5
0
/*
 * This test checks if a port is created correctly for a new process.
 */
void test_ipc_1()
{
    test_reset();

    PORT new_port;
    new_port = create_process (test_ipc_1_process, 5, 0, "Receiver");
    kprintf("A new process with a port is created.");

    check_port(new_port, "Receiver", TRUE);
    if (test_result != 0)
       test_failed(test_result);
}
Exemple #6
0
/*-------------------------------------------------------------------------------------*/
int get_port( Socket socket ) 

/*-------------------------------------------------------------------------------------*/
{
  // parameter check
  check_socket_ptr("get_port() failed", socket);
    
  MySocket *s = (MySocket *)socket;
  
  check_port("get_port() failed", s->port);

  return s->port;
}
Exemple #7
0
int						main(int ac, const char **av)
{
	if (ac != 2 || !check_port(av[1]))
	{
		print_usage();
		return (EXIT_FAILURE);
	}
	init_server(av[1]);
	while (42)
	{
		ft_putendl("Server is now waiting...");
		accept_connection();
	}
	return (0);
}
Exemple #8
0
int			connect_serv(char *port)
{
  t_serv		serv;

  time(&start);
  signal(SIGINT, disconnect);
  create_depot();
  serv.port = atoi(port);
  serv.proto = getprotobyname(TCP);
  if (check_port(serv.port) == EXIT_FAILURE)
    return (EXIT_FAILURE);
  if (init_serveur(&serv) == EXIT_FAILURE)
    return (EXIT_FAILURE);
  run_serveur(&serv);
  return (EXIT_SUCCESS);
}
Exemple #9
0
/*-------------------------------------------------------------------------------------*/
Socket tcp_active_open( int remote_port, char *remote_ip ) 
/*-------------------------------------------------------------------------------------*/
{
  // parameter check                                                                                         
  check_port("tcp_open_client() failed", remote_port);
  check_ip_addr("tcp_open_client() failed", remote_ip);
    
  MySocket *client = (MySocket *)malloc( sizeof(MySocket) );
  if ( client == NULL ) 
    die("tcp_open_client() failed: mem alloc error");

  struct sockaddr_in addr;
  int length;
  char *p;

  client->sd = socket(PROTOCOLFAMILY, TYPE, PROTOCOL);
  check_sd("tcp_open_client() failed: socket creation error", client->sd);
    
  /* Construct the server address structure */
  memset(&addr, 0, sizeof(struct sockaddr_in));
  addr.sin_family = PROTOCOLFAMILY;
  if ( inet_aton(remote_ip, (struct in_addr *) &addr.sin_addr.s_addr) == 0 ) 
    die("tcp_open_client failed(): invalid ip address");

  addr.sin_port = htons(remote_port);

  if ( connect(client->sd, (struct sockaddr *) &addr, sizeof(addr) ) < 0 )
    die("tcp_open_client failed(): connect () failed");

  memset(&addr, 0, sizeof(struct sockaddr_in));
  length = sizeof(addr);
  if ( getsockname(client->sd, (struct sockaddr *)&addr, (socklen_t *)&length) != 0 )
    die("tcp_open_client failed(): getsockname() failed");
  
  p = inet_ntoa(addr.sin_addr);  //returns addr to statically allocated buffer
  
  client->ip_addr = (char *)malloc( sizeof(char)*CHAR_IP_ADDR_LENGTH);
  if ( client->ip_addr == NULL )
 	die("tcp_open_client failed(): mem alloc error");
  client->ip_addr = strcpy( client->ip_addr, p );
  client->port = ntohs(addr.sin_port);

  return (Socket)client;
}
Exemple #10
0
void check(void)
{
  int exit=FALSE;
  RESULT svar;
  do
  {
    svar=form_dialog();
    switch(svar.type)
    {
      case MENU_CLICKED:
        exit=!handle_menu(svar);
        break;
      case DIALOG_CLICKED:
      case WINDOW_CLICKED:
        exit=!handle_window(svar);
        break;
      case KEY_CLICKED:
        exit=!handle_key(svar);
        break;
      case BUTTON_CLICKED:
        exit=!handle_button(svar);
        break;
      case TIMER_EXIT:
        check_port();
        break;
      default:
        switch(svar.data[0])
        {
          char temp[MAXSTRING];
          case 0x400:                        /* ACC_ID           */
          case 0x4700:                       /* AV_PROTOKOLL     */
          case 0x4724:                       /* VA_ACCWINDOPEN   */
          case 0x4726:                       /* AV_ACCWINDCLOSED */
            break;
          default:
            sprintf(temp,"[1][ Message %#lx|From %d|%d,%d,%d,%d,%d][ NEXT ]",svar.data[0],svar.data[1],
              (unsigned short)svar.data[3],(unsigned short)svar.data[4],(unsigned short)svar.data[5],(unsigned short)svar.data[6],(unsigned short)svar.data[7]);
            alertbox(1,temp);
            break;
        }
    }
  }while(!exit);
}
Exemple #11
0
/* let's go... */
int main(int argc, char *argv[])
{
    int c = 0;
    ctrl_t *ctrl = NULL;


    /* banner is very important */
    banner();
    check_argc(argc);
    ctrl = alloc_structs();
    ctrl = set_ctrl_defaults(ctrl);

    while ((c = getopt(argc, argv, "h:t:s:m:p:vVH")) != -1) {
        switch (c) {
        case 'h':
            check_host(optarg);
            ctrl->packet->host = convert_host(optarg);
            break;
        case 't':
            check_pkt_type(ctrl, optarg);
            ctrl->packet->type = (unsigned char) ATOI(optarg);
            break;
        case 's':
            check_shell_mode(ctrl, optarg);
            ctrl->shell->mode = (unsigned char) ATOI(optarg);
            break;
        case 'm':
            ctrl->packet->payload = optarg;
            break;
        case 'p':
            check_port(ctrl, ATOI(optarg));
            ctrl->packet->port = (uint16_t) ATOI(optarg);
            break;
        case 'v':
            ctrl->verbose = VERBOSE;
            break;
        case 'V':
            puts(VERSION);
            __EXIT_SUCCESS;
            break;
        case 'H':
            usage();
            __EXIT_SUCCESS;
            break;
        default:
            __EXIT_FAILURE;
        }
    }

    /* few checks before we can go on */
    __VERBOSE_ARGS;
    check_args(ctrl);
    check_uid(ctrl);

    /* install signal handler */
    install_signals();

    /* let's go */
    start_trixd00r(ctrl);
    end_trixd00r(ctrl);

    return 0;
}
Exemple #12
0
int afp_parse_url(struct afp_url * url, const char * toparse, int verbose)
{
	char firstpart[255],secondpart[2048];
	char *p, *q;
	int firstpartlen;
	int skip_earliestpart=0;
	int skip_secondpart=0;
	char * lastchar;
	int foundv6literal=0;

	if (verbose) printf("Parsing %s\n",toparse);

	url->username[0]='\0';
	url->servername[0]='\0';
	url->uamname[0]='\0';
	url->password[0]='\0';
	url->volumename[0]='\0';
	url->path[0]='\0';

	/* The most complex URL is:
 
	afp://user;AUTH=authType:password@server-name:port/volume-name/path 

	where the optional parms are user, password, AUTH and port, so the
	simplest is:

	afp://server-name/volume-name/path 

	*/

	/* if there is a ://, make sure it is preceeded by afp */

	if ((p=strstr(toparse,"://"))!=NULL) {
		q=p-3;
		if (p<toparse) {
			if (verbose) printf("URL does not start with afp://\n");
			return -1;
		}

		if (strncmp(q,"afp",3)!=0) {
			if (verbose) printf("URL does not start with afp://\n");
			return -1;
		}
		p+=3;
	} else {
		if (verbose) printf("This isn't a URL at all.\n");
		return -1;

	}
	if (p==NULL) p=(char *)toparse;

	/* Now split on the first / */
	if (sscanf(p,"%[^/]/%[^$]",

		firstpart, secondpart)!=2) {
		/* Okay, so there's no volume. */
		skip_secondpart=1;
	}

	firstpartlen=strlen(firstpart);

	lastchar=firstpart+firstpartlen-1;

	/* First part could be something like:
		user;AUTH=authType:password

	   We'll assume that the breakout is:
                user;  optional user name
	        AUTH=authtype:
	*/

	/* Let's see if there's a ';'.  q is the end of the username */

	if ((p=escape_strchr(firstpart,'@',"@"))) {
		*p='\0';
		p++; 
	} else {
		skip_earliestpart=1;
		p=firstpart;
	}
	/* p now points to the start of the server name*/

	/* square brackets denote a literal ipv6 address */
	if (*p == '[' && 
		(q=strchr(p,']'))) {
		foundv6literal = 1;
		p++;
		*q = '\0';
		q++;
	}

	/* see if we have a port number */

	if ((foundv6literal && (q=strchr(q,':'))) ||
			(!foundv6literal && (q=strchr(p,':'))) ) {
		*q='\0';
		q++;
		if (check_port(q)) return -1;
		if ((url->port=atoi(q))==0) {
			if (verbose) printf("Port appears to be zero\n");
			return -1;
		}
	}

	snprintf(url->servername,strlen(p)+1,"%s", p);
	if (check_servername(url->servername)) {
			if (verbose) printf("This isn't a valid servername\n");
			return -1;
	}

	if ((p==NULL) || ((strlen(p)+p-1)==lastchar)) {
		/* afp://server */
	}

	if ((q) && ((strlen(q)+q-1)==lastchar)) {
		/* afp://server:port */
	}


	/* Earliest part */

	if (skip_earliestpart) {
		p+=strlen(p);
		goto parse_secondpart;
	}
	p=firstpart;

	/* Now we're left with something like user[;AUTH=uamname][:password] */

	/* Look for :password */

	if ((q=escape_strrchr(p,':',":"))) {
		*q='\0';
		q++;
		snprintf(url->password,strlen(q)+1, "%s", q);
		if (check_password(url->password)) {
			if (verbose) printf("This isn't a valid passwd\n");
			return -1;
		}
	}

	/* Now we're down to user[;AUTH=uamname] */
	p=firstpart;

	if ((q=strstr(p,";AUTH="))) {
		*q='\0';
		q+=6;
		snprintf(url->uamname,strlen(q)+1,"%s", q);
		if (check_uamname(url->uamname)) {
			if (verbose) printf("This isn't a valid uamname\n");
			return -1;
		}
	}

	if (strlen(p)>0) {
		snprintf(url->username,strlen(p)+1,"%s", p);
		if (check_username(url->username)) {
			if (verbose) printf("This isn't a valid username\n");
			return -1;
		}
	}


parse_secondpart:
	if (skip_secondpart) goto done;
	if (strlen(secondpart)==0) goto done;

	if (secondpart[strlen(secondpart)]=='/') 
		secondpart[strlen(secondpart)]='\0';

	p=secondpart;
	if ((q=strchr(p,'/'))) {
		*q='\0';
		q++;
	}
	snprintf(url->volumename,strlen(p)+1,"%s", p);


	if (q) {
		url->path[0]='/';
		snprintf(url->path+1,strlen(q)+1, "%s", q);
	}

done:
	escape_url(url);
	if (verbose) printf("Successful parsing of URL\n");
	return 0;
}
Exemple #13
0
static bool finalize_join(void) {
	char *name = xstrdup(get_value(data, "Name"));
	if(!name) {
		fprintf(stderr, "No Name found in invitation!\n");
		return false;
	}

	if(!check_id(name)) {
		fprintf(stderr, "Invalid Name found in invitation: %s!\n", name);
		return false;
	}

	if(!netname)
		netname = grep(data, "NetName");

	bool ask_netname = false;
	char temp_netname[32];

make_names:
	if(!confbasegiven) {
		free(confbase);
		confbase = NULL;
	}

	make_names(false);

	free(tinc_conf);
	free(hosts_dir);

	xasprintf(&tinc_conf, "%s" SLASH "tinc.conf", confbase);
	xasprintf(&hosts_dir, "%s" SLASH "hosts", confbase);

	if(!access(tinc_conf, F_OK)) {
		fprintf(stderr, "Configuration file %s already exists!\n", tinc_conf);
		if(confbasegiven)
			return false;

		// Generate a random netname, ask for a better one later.
		ask_netname = true;
		snprintf(temp_netname, sizeof temp_netname, "join_%x", rand());
		netname = temp_netname;
		goto make_names;
	}	

	if(mkdir(confbase, 0777) && errno != EEXIST) {
		fprintf(stderr, "Could not create directory %s: %s\n", confbase, strerror(errno));
		return false;
	}

	if(mkdir(hosts_dir, 0777) && errno != EEXIST) {
		fprintf(stderr, "Could not create directory %s: %s\n", hosts_dir, strerror(errno));
		return false;
	}

	FILE *f = fopen(tinc_conf, "w");
	if(!f) {
		fprintf(stderr, "Could not create file %s: %s\n", tinc_conf, strerror(errno));
		return false;
	}

	fprintf(f, "Name = %s\n", name);

	char filename[PATH_MAX];
	snprintf(filename, sizeof filename, "%s" SLASH "%s", hosts_dir, name);
	FILE *fh = fopen(filename, "w");
	if(!fh) {
		fprintf(stderr, "Could not create file %s: %s\n", filename, strerror(errno));
		fclose(f);
		return false;
	}

	// Filter first chunk on approved keywords, split between tinc.conf and hosts/Name
	// Other chunks go unfiltered to their respective host config files
	const char *p = data;
	char *l, *value;

	while((l = get_line(&p))) {
		// Ignore comments
		if(*l == '#')
			continue;

		// Split line into variable and value
		int len = strcspn(l, "\t =");
		value = l + len;
		value += strspn(value, "\t ");
		if(*value == '=') {
			value++;
			value += strspn(value, "\t ");
		}
		l[len] = 0;

		// Is it a Name?
		if(!strcasecmp(l, "Name"))
			if(strcmp(value, name))
				break;
			else
				continue;
		else if(!strcasecmp(l, "NetName"))
			continue;

		// Check the list of known variables
		bool found = false;
		int i;
		for(i = 0; variables[i].name; i++) {
			if(strcasecmp(l, variables[i].name))
				continue;
			found = true;
			break;
		}

		// Ignore unknown and unsafe variables
		if(!found) {
			fprintf(stderr, "Ignoring unknown variable '%s' in invitation.\n", l);
			continue;
		} else if(!(variables[i].type & VAR_SAFE)) {
			fprintf(stderr, "Ignoring unsafe variable '%s' in invitation.\n", l);
			continue;
		}

		// Copy the safe variable to the right config file
		fprintf(variables[i].type & VAR_HOST ? fh : f, "%s = %s\n", l, value);
	}

	fclose(f);

	while(l && !strcasecmp(l, "Name")) {
		if(!check_id(value)) {
			fprintf(stderr, "Invalid Name found in invitation.\n");
			return false;
		}

		if(!strcmp(value, name)) {
			fprintf(stderr, "Secondary chunk would overwrite our own host config file.\n");
			return false;
		}

		snprintf(filename, sizeof filename, "%s" SLASH "%s", hosts_dir, value);
		f = fopen(filename, "w");

		if(!f) {
			fprintf(stderr, "Could not create file %s: %s\n", filename, strerror(errno));
			return false;
		}

		while((l = get_line(&p))) {
			if(!strcmp(l, "#---------------------------------------------------------------#"))
				continue;
			int len = strcspn(l, "\t =");
			if(len == 4 && !strncasecmp(l, "Name", 4)) {
				value = l + len;
				value += strspn(value, "\t ");
				if(*value == '=') {
					value++;
					value += strspn(value, "\t ");
				}
				l[len] = 0;
				break;
			}

			fputs(l, f);
			fputc('\n', f);
		}

		fclose(f);
	}

	// Generate our key and send a copy to the server
	ecdsa_t *key = ecdsa_generate();
	if(!key)
		return false;

	char *b64key = ecdsa_get_base64_public_key(key);
	if(!b64key)
		return false;

	snprintf(filename, sizeof filename, "%s" SLASH "ed25519_key.priv", confbase);
	f = fopenmask(filename, "w", 0600);
	if(!f)
		return false;

	if(!ecdsa_write_pem_private_key(key, f)) {
		fprintf(stderr, "Error writing private key!\n");
		ecdsa_free(key);
		fclose(f);
		return false;
	}

	fclose(f);

	fprintf(fh, "Ed25519PublicKey = %s\n", b64key);

	sptps_send_record(&sptps, 1, b64key, strlen(b64key));
	free(b64key);
	ecdsa_free(key);

	check_port(name);

ask_netname:
	if(ask_netname && tty) {
		fprintf(stderr, "Enter a new netname: ");
		if(!fgets(line, sizeof line, stdin)) {
			fprintf(stderr, "Error while reading stdin: %s\n", strerror(errno));
			return false;
		}
		if(!*line || *line == '\n')
			goto ask_netname;

		line[strlen(line) - 1] = 0;

		char newbase[PATH_MAX];
		snprintf(newbase, sizeof newbase, CONFDIR SLASH "tinc" SLASH "%s", line);
		if(rename(confbase, newbase)) {
			fprintf(stderr, "Error trying to rename %s to %s: %s\n", confbase, newbase, strerror(errno));
			goto ask_netname;
		}

		netname = line;
		make_names(false);
	}

	fprintf(stderr, "Configuration stored in: %s\n", confbase);

	return true;
}
Exemple #14
0
void port_checker::do_checks(char* loc, int loc_size, bool check_defaults)
{
    char* old_loc = loc + strlen(loc);
//  std::cout << "Checking Ports: \"" << loc << "\"..." << std::endl;


    rtosc_arg_val_t query_args[2];
    query_args[0].type = query_args[1].type = 's';
    query_args[0].val.s = loc;
    query_args[1].val.s = "";
    send_msg("/path-search", 2, query_args);
    std::vector<rtosc_arg_val_t> args;
    std::vector<char> strbuf;

    int res = sender.wait_for_reply(&strbuf, &args, "/paths");
    if(!res)
        throw std::runtime_error("no reply from path-search");
    if(args.size() % 2)
        throw std::runtime_error("bad reply from path-search");

    bool self_disabled = false; // disabled by an rSelf() ?
    size_t port_max = args.size() >> 1;
    // std::cout << "found " << port_max << " subports" << std::endl;
    for(size_t port_no = 0; port_no < port_max; ++port_no)
    {
        if(args[port_no << 1].type != 's' ||
                args[(port_no << 1) + 1].type != 'b')
            throw std::runtime_error("Invalid \"paths\" reply: bad types");

        if(!strncmp(args[port_no << 1].val.s, "self:", 5)) {
            rtosc_blob_t& blob = args[(port_no << 1) + 1].val.b;
            const char* metadata = (const char*)blob.data;
            if(!port_is_enabled(loc, args[port_no << 1].val.s, metadata))
                self_disabled = true;
        }
    }
    if(self_disabled)
        m_skipped.insert("/" + std::string(loc));
    else
        ++ports_checked;

    std::map<std::string, unsigned> port_count;

    if(!self_disabled)
    for(size_t port_no = 0; port_no < port_max; ++port_no)
    {
        const char* portname = args[port_no << 1].val.s;
        int portlen = strlen(portname);
        rtosc_blob_t& blob = args[(port_no << 1) + 1].val.b;
        const char* metadata = (const char*)blob.data;
        int32_t meta_len = blob.len;
        if(!metadata)
            metadata = "";
        bool has_subports = portname[portlen-1] == '/';
/*      std::cout << "port /" << loc << portname
                  << " (" << port_no << "/" << port_max
                  << "), has subports: " << std::boolalpha << has_subports
                  << std::endl;*/

        if(port_is_enabled(loc, portname, metadata))
        {
            Port::MetaContainer meta(metadata);

            if(meta.find("parameter") != meta.end())
            {
                std::string portname_noargs = portname;
                portname_noargs.resize(portname_noargs.find(':'));
                ++port_count[portname_noargs];
            }

            if(has_subports)
            {
                // statistics: port may still be disabled, see above
                if(loc_size > portlen)
                {
                    strcpy(old_loc, portname);
                    char* hashsign = strchr(old_loc, '#');
                    if(hashsign)
                    {
                        // #16\0 => 0\0
                        *hashsign = '0';
                        *++hashsign = '/';
                        *++hashsign = 0;
                    }

                    bool next_check_defaults =
                       (meta.find("no defaults") == meta.end());

                    do_checks(loc, loc_size - portlen, next_check_defaults);
                }
                else
                    throw std::runtime_error("portname too long");
            }
            else {
                ++ports_checked;
                check_port(loc, portname, metadata, meta_len, check_defaults);
            }
        }
        else
            m_skipped.insert("/" + std::string(loc) + portname);
        *old_loc = 0;
    }

    for(const auto& pr : port_count)
    {
        if(pr.second > 1)
            m_issues.emplace(issue::duplicate_parameter,
                             "/" + std::string(loc) + pr.first);
    }
}
void rgb_led_config(int argc, char** argv)
{
    FRESULT f_res;
    FIL fil;
    char f_name[4];
    uint8_t pattern_size = sizeof(ha_host_ns::rgb_config_pattern);

    int8_t ep_id = -1;
    uint8_t dev_type = (uint8_t) ha_ns::RGB_LED;

    char Rport = '0';
    uint16_t Rpin = 0;
    uint16_t Rtimer_x = 0;
    uint16_t Rchannel = 0;

    char Gport = '0';
    uint16_t Gpin = 0;
    uint16_t Gtimer_x = 0;
    uint16_t Gchannel = 0;

    char Bport = '0';
    uint16_t Bpin = 0;
    uint16_t Btimer_x = 0;
    uint16_t Bchannel = 0;

    uint16_t red_at_wp = 0;
    uint16_t green_at_wp = 0;
    uint16_t blue_at_wp = 0;

    char config_str[pattern_size];

    if (argc <= 1) {
        printf("ERR: too few argument. Try -h to get help.\n");
        return;
    }

    /* Read all configuration from shell */
    for (uint8_t count = 1; count < argc; count++) {
        if (argv[count][0] == '-') {
            switch (argv[count][1]) {
            case 'h': //get help
                printf(rgb_usage);
                return;
            case 'e': //set endpoint id
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                /* save endpoint id */
                ep_id = atoi(argv[count]);
                if (ep_id < 0 || ep_id > ha_host_ns::max_end_point) {
                    printf("ERR: invalid endpoint id value\n");
                    return;
                }
                snprintf(f_name, sizeof(f_name), "%x", ep_id);
                f_res = f_open(&fil, f_name, FA_READ | FA_OPEN_ALWAYS);
                if (f_res != FR_OK) {
                    print_ferr(f_res);
                    return;
                }
                f_sync(&fil);
                UINT byte_read;
                f_res = f_read(&fil, config_str, pattern_size, &byte_read);
                if (f_res != FR_OK) {
                    print_ferr(f_res);
                    return;
                }
                f_close(&fil);
                sscanf(config_str, ha_host_ns::rgb_config_pattern, &Rport,
                        &Rpin, &Rtimer_x, &Rchannel, &Gport, &Gpin, &Gtimer_x,
                        &Gchannel, &Bport, &Bpin, &Btimer_x, &Bchannel,
                        &red_at_wp, &green_at_wp, &blue_at_wp);
                break;
            case 'R': //configure Red channel
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                if (!check_port(argv[count][0], &Rport)) {
                    printf("ERR: invalid port value.\n");
                    return;
                }
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                Rpin = atoi(argv[count]);
                if (Rpin < 0 || Rpin > 15) {
                    printf("ERR: invalid pin value\n");
                    return;
                }
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                Rtimer_x = atoi(argv[count]);
                if (Rtimer_x < 0 || Rtimer_x > 8 || Rtimer_x == 6
                        || Rtimer_x == 7) {
                    printf("ERR: invalid timer value for pwm\n");
                    return;
                }
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                Rchannel = atoi(argv[count]);
                if (Rchannel < 0 || Rchannel > 15) {
                    printf("ERR: invalid timer value\n");
                    return;
                }
                break;
            case 'G': //configure Green channel
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                if (!check_port(argv[count][0], &Gport)) {
                    printf("ERR: invalid port value.\n");
                    return;
                }
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                Gpin = atoi(argv[count]);
                if (Rpin < 0 || Rpin > 15) {
                    printf("ERR: invalid pin value\n");
                    return;
                }
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                Gtimer_x = atoi(argv[count]);
                if (Gtimer_x < 0 || Gtimer_x > 8 || Gtimer_x == 6
                        || Gtimer_x == 7) {
                    printf("ERR: invalid timer value for pwm\n");
                    return;
                }
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                Gchannel = atoi(argv[count]);
                if (Gchannel < 0 || Gchannel > 15) {
                    printf("ERR: invalid timer value\n");
                    return;
                }
                break;
            case 'B': //configure Blue channel
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                if (!check_port(argv[count][0], &Bport)) {
                    printf("ERR: invalid port value.\n");
                    return;
                }
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                Bpin = atoi(argv[count]);
                if (Rpin < 0 || Rpin > 15) {
                    printf("ERR: invalid pin value\n");
                    return;
                }
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                Btimer_x = atoi(argv[count]);
                if (Btimer_x < 0 || Btimer_x > 8 || Btimer_x == 6
                        || Btimer_x == 7) {
                    printf("ERR: invalid timer value for pwm\n");
                    return;
                }
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                Bchannel = atoi(argv[count]);
                if (Bchannel < 0 || Bchannel > 15) {
                    printf("ERR: invalid timer value\n");
                    return;
                }
                break;
            case 'C': //set calibrating factor
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                red_at_wp = atoi(argv[count]);
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                green_at_wp = atoi(argv[count]);
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                blue_at_wp = atoi(argv[count]);
                if (red_at_wp > 100 || green_at_wp > 100 || blue_at_wp > 100) {
                    printf(
                            "ERR: invalid calibrating factor. Try -h to get help.\n");
                    return;
                }
                break;
            default:
                printf("Unknown option.\n");
                return;
            }
        } else {
            printf("Unknown option.\n");
            return;
        }
    }

    if (ep_id < 0) {
        printf("ERR: missing -e option.\n");
        return;
    }

    /* Write configurations to file */
    f_res = f_open(&fil, f_name, FA_WRITE | FA_CREATE_ALWAYS);
    if (f_res != FR_OK) {
        print_ferr(f_res);
        return;
    }
    f_sync(&fil);

    snprintf(config_str, pattern_size, ha_host_ns::rgb_config_pattern, Rport,
            Rpin, Rtimer_x, Rchannel, Gport, Gpin, Gtimer_x, Gchannel, Bport,
            Bpin, Btimer_x, Bchannel, red_at_wp, green_at_wp, blue_at_wp);

    UINT byte_written;
    f_res = f_write(&fil, config_str, pattern_size, &byte_written);
    if (f_res != FR_OK) {
        print_ferr(f_res);
        f_close(&fil);
        return;
    }
    f_close(&fil);

    /* read back */
    f_res = f_open(&fil, f_name, FA_READ);
    if (f_res != FR_OK) {
        print_ferr(f_res);
        return;
    }
    f_sync(&fil);
    while (f_gets(config_str, sizeof(config_str), &fil)) {
        printf("%s", config_str);
    }
    f_close(&fil);

    /* modify device list file */
    modify_dev_list_file(ep_id, dev_type);

    return;
}
Exemple #16
0
static int __init init(void)
{
	int i, ret=0;
	u_int16_t port;

	/* nornamlize the input */
	normalize();

	for (i=0;i<MAXPT_PORTS;i++)
	     memset(&pt[i], 0, sizeof(struct ip_conntrack_helper));

	for (i = 0; i < entries && registered_port < MAXPT_PORTS; i++) {
	    for (port = pt_record[i].outport[0]; port <= pt_record[i].outport[1]; port++ ) {

	        pt[registered_port].max_expected = PTMAXEXPECTED;
 //               pt[registered_port].timeout = 0;
//                pt[registered_port].flags = IP_CT_HELPER_F_REUSE_EXPECT;
                //pt[registered_port].me = ip_conntrack_pt;
	        pt[registered_port].help = help;

		if ( pt_record[i].outproto == 1 ) {
		  pt[registered_port].tuple.src.u.tcp.port = htons(port);
		  pt[registered_port].tuple.dst.protonum = IPPROTO_TCP;
		  pt[registered_port].mask.src.u.tcp.port = 0xFFFF;
		  pt[registered_port].mask.dst.protonum = 0xFFFF;
		}
		else if ( pt_record[i].outproto == 2 ) {
		  pt[registered_port].tuple.src.u.udp.port = htons(port);
		  pt[registered_port].tuple.dst.protonum = IPPROTO_UDP;
		  pt[registered_port].mask.src.u.udp.port = 0xFFFF;
		  pt[registered_port].mask.dst.protonum = 0xFFFF;
		}
		else {
		  pt[registered_port].tuple.src.u.all = htons(port);
		  pt[registered_port].mask.src.u.all = 0xFFFF;
		  pt[registered_port].mask.dst.protonum = 0;
		}
	    	DEBUGP("ip_conntrack_pt: registering helper for port %d\n",port);
		if ( check_port(port) )
	    	    printk("ip_conntrack_pt: cannot register port %d (already registered by other module)\n",port);
		else
	    	    ret = ip_conntrack_helper_register(&pt[registered_port++]);

		if( registered_port >= MAXPT_PORTS ) {
			printk( "Conntrack port forwarding table is full.  Remaining entries are not processed.\n" );
			pt_record[i].outport[1] = port;
			entries = i + 1;
			break;
		}

	    	if (ret) {
		   failed_port = port;
	           printk("ip_conntrack_pt: port %d register FAILED,port already registered  \n",port); 
	           fini();
	           return ret;
	    	}
	    }
	}

	return 0;
}
void adc_sensor_config(int argc, char** argv)
{
    FRESULT f_res;
    FIL fil;
    char f_name[4];
    uint8_t pattern_size = sizeof(ha_host_ns::adc_sensor_config_pattern);
    uint8_t first_equa_type = 0;
    uint8_t first_params = 0;
    uint16_t num_params = 0;
    uint16_t num_equation = 0;

    int8_t ep_id = -1;
    int8_t specified_subtype = -1;

    char port = '0';
    uint16_t pin = 0;
    uint16_t adc_x = 0;
    uint16_t channel = 0;

    int filter_thres = 0;
    int under_thres = 0;
    int over_thres = 0;

    char config_str[pattern_size];

    if (argc <= 1) {
        printf("ERR: too few argument. Try -h to get help.\n");
        return;
    }

    /* Read all configuration from shell */
    for (uint8_t count = 1; count < argc; count++) {
        if (argv[count][0] == '-') {
            switch (argv[count][1]) {
            case 'h': //get help
                printf(adc_sensor_usage);
                return;
            case 's':
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                specified_subtype = atoi(argv[count]);
                break;
            case 'e': //set endpoint id
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                /* save endpoint id */
                ep_id = atoi(argv[count]);
                if (ep_id < 0 || ep_id > ha_host_ns::max_end_point) {
                    printf("ERR: invalid endpoint id value\n");
                    return;
                }
                snprintf(f_name, sizeof(f_name), "%x", ep_id);
                f_res = f_open(&fil, f_name, FA_READ | FA_OPEN_ALWAYS);
                if (f_res != FR_OK) {
                    print_ferr(f_res);
                    return;
                }
                f_sync(&fil);

                UINT byte_read;
                f_res = f_read(&fil, config_str, pattern_size, &byte_read);
                if (f_res != FR_OK) {
                    print_ferr(f_res);
                    f_close(&fil);
                    return;
                }
                f_close(&fil);
                sscanf(config_str, ha_host_ns::adc_sensor_config_pattern, &port,
                        &pin, &adc_x, &channel, &filter_thres, &under_thres,
                        &over_thres, &num_equation, &num_params);
                break;
            case 'p': //set port
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                if (!check_port(argv[count][0], &port)) {
                    printf("ERR: invalid port value.\n");
                    return;
                }
                break;
            case 'n': //set pin
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                pin = atoi(argv[count]);
                if (pin < 0 || pin > 15) {
                    printf("ERR: invalid pin value\n");
                    return;
                }
                break;
            case 'a': //set adc
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                adc_x = atoi(argv[count]);
                if (adc_x < 0 || adc_x > 3) {
                    printf("ERR: invalid adc value\n");
                    return;
                }
                break;
            case 'c': //set channel
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                channel = atoi(argv[count]);
                if (channel < 0 || channel > 15) {
                    printf("ERR: invalid channel value\n");
                    return;
                }
                break;
            case 't': //get equation type
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                first_equa_type = count;
                num_equation = 0;
                while (count < argc && argv[count][0] != '-') {
                    num_equation++;
                    count++;
                }
                if (num_equation == 0) {
                    printf("ERR: missing parameters in -t option.\n");
                    return;
                }
                count--;
                break;
            case 'P':
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                first_params = count;
                num_params = 0;
                while (count < argc) {
                    if (argv[count][0] == '-') {
                        if (!isdigit(argv[count][1])) {
                            break;
                        }
                    }
                    num_params++;
                    count++;
                }
                count--;
                break;
            case 'f':
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                filter_thres = atoi(argv[count]);
                break;
            case 'u':
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                under_thres = atoi(argv[count]);
                break;
            case 'o':
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                over_thres = atoi(argv[count]);
                break;
            default:
                printf("Unknown option.\n");
                return;
            }
        } else {
            printf("Unknown option.\n");
            return;
        }
    }

    if (ep_id < 0) {
        printf("ERR: missing -e option.\n");
        return;
    }

    if (specified_subtype < 0) {
        printf("ERR: missing -s option.\n");
        return;
    }

    if (first_equa_type == 0 || first_params == 0) {
        printf("ERR: missing -t or -P option.\n");
        return;
    }

    f_res = f_unlink(f_name);
    if (f_res != FR_OK) {
        print_ferr(f_res);
        return;
    }

    /* Write configurations to file */
    f_res = f_open(&fil, f_name, FA_WRITE | FA_CREATE_ALWAYS);
    if (f_res != FR_OK) {
        printf("Error on opening file to write configuration\n");
        return;
    }
    f_sync(&fil);

    snprintf(config_str, pattern_size, ha_host_ns::adc_sensor_config_pattern,
            port, pin, adc_x, channel, filter_thres, under_thres, over_thres,
            num_equation, num_params);
    f_puts(config_str, &fil);
    f_sync(&fil);

    for (uint8_t count = first_equa_type;
            count < first_equa_type + num_equation; count++) {
        snprintf(config_str, pattern_size, ha_host_ns::sensor_equa_type,
                argv[count][0]);
        f_puts(config_str, &fil);
        f_sync(&fil);
    }

    float param = 0.0f;
    for (uint8_t count = first_params; count < first_params + num_params;
            count++) {
        param = strtof(argv[count], NULL);
        snprintf(config_str, pattern_size, ha_host_ns::sensor_equa_params,
                param);
        f_puts(config_str, &fil);
        f_sync(&fil);
    }
    f_close(&fil);

    /* read back */
    f_res = f_open(&fil, f_name, FA_READ);
    if (f_res != FR_OK) {
        print_ferr(f_res);
        return;
    }
    f_sync(&fil);
    while (f_gets(config_str, sizeof(config_str), &fil)) {
        printf("%s", config_str);
    }
    f_close(&fil);

    /* modify device list file */
    modify_dev_list_file(ep_id,
            combine_dev_type(ha_ns::ADC_SENSOR, (uint8_t) specified_subtype));

    return;
}
static void adc_common_config(int argc, char** argv, int8_t *endpoint_id)
{
    FRESULT f_res;
    FIL fil;
    uint8_t pattern_size = sizeof(ha_host_ns::adc_dev_config_pattern);
    char f_name[4];

    *endpoint_id = -1;
    char port = '0';
    uint16_t pin = 0;
    uint16_t adc_x = 0;
    uint16_t channel = 0;

    char config_str[pattern_size];

    if (argc <= 1) {
        printf("ERR: too few argument. Try -h to get help.\n");
        return;
    }

    /* Read all configuration from shell */
    for (uint8_t count = 1; count < argc; count++) {
        if (argv[count][0] == '-') {
            switch (argv[count][1]) {
            case 'h': //get help
                printf(adc_usage, argv[0]);
                return;
            case 'e': //set endpoint id
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                /* save endpoint id */
                *endpoint_id = atoi(argv[count]);
                if (*endpoint_id < 0
                        || *endpoint_id > ha_host_ns::max_end_point) {
                    printf("ERR: invalid endpoint id value\n");
                    return;
                }
                /* get file name from ep id */
                snprintf(f_name, sizeof(f_name), "%x", *endpoint_id);
                /* open "ep id" file */
                f_res = f_open(&fil, f_name, FA_READ | FA_OPEN_ALWAYS);
                if (f_res != FR_OK) {
                    print_ferr(f_res);
                    return;
                }
                f_sync(&fil);
                UINT byte_read;
                f_res = f_read(&fil, config_str, pattern_size, &byte_read);
                if (f_res != FR_OK) {
                    print_ferr(f_res);
                    f_close(&fil);
                    return;
                }
                f_close(&fil);
                sscanf(config_str, ha_host_ns::adc_dev_config_pattern, &port,
                        &pin, &adc_x, &channel);
                break;
            case 'p':
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                if (!check_port(argv[count][0], &port)) {
                    printf("ERR: invalid port value.\n");
                    return;
                }
                break;
            case 'n':
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                pin = atoi(argv[count]);
                if (pin < 0 || pin > 15) {
                    printf("ERR: invalid pin value\n");
                    return;
                }
                break;
            case 'a':
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                adc_x = atoi(argv[count]);
                if (adc_x < 0 || adc_x > 3) {
                    printf("ERR: invalid adc value\n");
                    return;
                }
                break;
            case 'c':
                count++;
                if (count >= argc) {
                    printf("ERR: too few argument. Try -h to get help.\n");
                    return;
                }
                channel = atoi(argv[count]);
                if (channel < 0 || channel > 15) {
                    printf("ERR: invalid channel value\n");
                    return;
                }
                break;
            default:
                printf("Unknown option.\n");
                return;
            }
        } else {
            printf("Unknown option.\n");
            return;
        }
    }

    if (*endpoint_id < 0) {
        printf("ERR: missing -e option.\n");
        return;
    }

    /* Write configurations to file */
    f_res = f_open(&fil, f_name, FA_WRITE | FA_CREATE_ALWAYS);
    if (f_res != FR_OK) {
        print_ferr(f_res);
        return;
    }
    f_sync(&fil);

    snprintf(config_str, pattern_size, ha_host_ns::adc_dev_config_pattern, port,
            pin, adc_x, channel);

    UINT byte_written;
    f_res = f_write(&fil, config_str, pattern_size, &byte_written);
    if (f_res != FR_OK) {
        print_ferr(f_res);
        f_close(&fil);
        return;
    }
    f_close(&fil);

    /* read back */
    f_res = f_open(&fil, f_name, FA_READ);
    if (f_res != FR_OK) {
        print_ferr(f_res);
        return;
    }
    f_sync(&fil);
    while (f_gets(config_str, sizeof(config_str), &fil)) {
        printf("%s", config_str);
    }
    f_close(&fil);

    return;
}
Exemple #19
0
int main() {
    uint8_t i, id;
    uint8_t timing[19]; // This controller control 18 keys
    uint8_t cnt[19]; // This controller control 18 keys
    uint32_t status[19]; // This controller control 18 keys
    
    // program setup
    discharge_ports();
    SREG = 0; // No interrupts
    
    DDRD |= _BV(PIND0); // NOTE: Only output pin is number 0
    PORTD0_SBI;

    for (i = 0; i < 19; i++) {
        timing[i] = 0;
        cnt[i]    = 0;
        status[i] = 0;
    }
    
    // main loop
    while(1) {
        // first step: check wether a key was pressed or not
        for (i = 0; i < 19; i++) {
            id = i + 1;
            if (check_port(id)) {
                if (!(status[i] & 0x80000000L)) // wasting a 0
                    cnt[i]++; // added one 1
                // else // wasting 1, cnt does not change
                status[i] <<= 1; // shift
                status[i] |= 1; // last added is 1
                
                if (cnt[i] > THRESHOLD) {
                    if (timing[i]) // key was already pressed
                        timing[i] = SUST;
                    else
                        timing[i] = SUST + 1;
                }
            } else {
                if (status[i] & 0x80000000L) // wasting a 1
                    cnt[i]--; // removed one 1
                // else // wasting 1, cnt does not change
                status[i] <<= 1; // shift, last byte is already 1
                
                if (timing[i])
                    timing[i]--;
            }
        }
        
        discharge_ports(); // after reading discharges ports for the next reading
        
        // second step: if some messages are true then send data to the synth
        for (i = 0; i < 19; i++)
            if (timing[i] == SUST + 1) {
                send_message(0x80 | GET_NOTE(i));
            } else if (timing[i] == 1) {
                send_message(0x00 | GET_NOTE(i));
            }

        //_delay_us(100); // wait some time
    }
    
    return 0;
}
Exemple #20
0
void test_ipc_6_receiver(PROCESS self, PARAM param)
{
   PORT port1;
   PORT port2;
   PORT port3;
   PROCESS sender_1;
   PROCESS sender_2;
   PROCESS sender_3;
   int second_sender;
   int *data1;
   int *data2;
   int *data3;

   check_sum += 1;

   port1 = self->first_port;
   kprintf("%s: creating port 3 and port 2...\n", self->name);
   port3 = create_port();
   port2 = create_port(); 
   kprintf("%s: closing port 3 and port 2...\n", self->name);
   close_port(port2);
   close_port(port3);

   check_port(port1, self->name, TRUE);
   check_port(port2, self->name, FALSE);
   check_port(port3, self->name, FALSE);
   if (test_result != 0)
      test_failed(test_result);

   create_process(test_ipc_6_sender_process_3, 5, (PARAM) port3, "Sender 3");
   create_process(test_ipc_6_sender_process_2, 5, (PARAM) port2, "Sender 2");
   create_process(test_ipc_6_sender_process_1, 4, (PARAM) port1, "Sender 1");

   /*
    * receive first message
    */
   kprintf("%s: receiving first message...\n", self->name);
   data1 = (int*) receive(&sender_1);
   kprintf("\n%s: received a message from %s, parameter = %d.\n",
           self->name, sender_1->name, * data1);

   if (string_compare(sender_1->name, "Sender 2") == 1)
       test_failed(60);
   if (string_compare(sender_1->name, "Sender 3") == 1)
       test_failed(60);
   if (string_compare(sender_1->name, "Sender 1") != 1)
       test_failed(58);
    
   check_process("Sender 3", STATE_MESSAGE_BLOCKED, FALSE); 
   check_process("Sender 2", STATE_MESSAGE_BLOCKED, FALSE); 
   check_process("Sender 1", STATE_REPLY_BLOCKED, FALSE); 
   if (test_result != 0) {
       print_all_processes(kernel_window);
       test_failed(test_result);
   }
  
   /*
    * receive second message
    */
   kprintf("%s: opening port 2 and port 3...\n", self->name);
   open_port(port2);
   open_port(port3);

   check_sum += 2; // to check that first message is receiverd.

   kprintf("%s: receiving second message...\n", self->name);
   data2 = (int*) receive (&sender_2); 
   kprintf("%s: received a message from %s, parameter = %d.\n",
           self->name, sender_2->name, * data2);

   // second message can be from either sender 2 or sender 3, depending
   // on implementation of create_port(). 
   second_sender = 0;
   if (string_compare(sender_2->name, "Sender 2") == 1) {
       check_process("Sender 2", STATE_READY, TRUE); 
       check_process("Sender 3", STATE_MESSAGE_BLOCKED, FALSE); 
       second_sender = 2;
   } else if (string_compare(sender_2->name, "Sender 3") == 1) {
       check_process("Sender 3", STATE_READY, TRUE); 
       check_process("Sender 2", STATE_MESSAGE_BLOCKED, FALSE); 
       second_sender = 3;
   } else
       test_failed(44);
    
   check_sum += 4; // to check that second message is received.

   /* 
    * receive third message
    */
   kprintf("%s: receiving third message...\n", self->name);
   data3 = (int*) receive(&sender_3); 
   kprintf("%s: received a message from %s, parameter = %d.\n",
           self->name, sender_3->name, * data3);

   if (string_compare(sender_3->name, "Sender 1") == 1)
       test_failed(44);

   if (second_sender == 2) {
       if (string_compare(sender_3->name, "Sender 2") == 1)
	   test_failed(44);
       if (string_compare(sender_3->name, "Sender 3") != 1)
	   test_failed(58);
   } else {
       if (string_compare(sender_3->name, "Sender 3") == 1)
	   test_failed(44);
       if (string_compare(sender_3->name, "Sender 2") != 1)
	   test_failed(58);
   }
 
   check_process("Sender 3", STATE_READY, TRUE); 
   check_process("Sender 2", STATE_READY, TRUE); 
   check_process("Sender 1", STATE_REPLY_BLOCKED, FALSE); 
   if (test_result != 0) {
       print_all_processes(kernel_window);
       test_failed(test_result);
   }

   check_sum += 8; // to check that third message is received.

   return_to_boot();
}    
Exemple #21
0
int main(int argc, const char *const *argv) {
	bool is_server = false;
	bool is_client = false;
	std::string ip_str;
	int port;
	// Parse command options
	po::options_description options_desc("Allowed Options");
	options_desc.add_options()
		("help", "produce help message")
		("listen_ip", po::value<std::string>(), "if starts like a server,need a listen ip and port")
		("listen_port", po::value<int>(), "if starts like a server,need a listen port and ip")
		("conn_ip", po::value<std::string>(), "connect server ip")
		("conn_port", po::value<int>(), "connect server port");

	po::variables_map vm;
	po::store(po::parse_command_line(argc, argv, options_desc), vm);
	po::notify(vm);

	if (argc <= 1 || vm.count("help")) {
		usage();
		std::cout << options_desc << std::endl;
		return OK;
	}

	if (vm.count("listen_ip")) {
		ip_str = vm["listen_ip"].as<std::string>();
		if (!check_ip(ip_str)) {
			std::cout << "IP ERROR" << std::endl;
			return -1;
		}
		is_server = true;
	}

	if (vm.count("listen_port")) {
		port = vm["listen_port"].as<int>();
		if (!check_port(port)) {
			std::cout << "PORT ERROR" << std::endl;
			return -1;
		}

		if (vm.count("conn_ip")) {
			is_client = true;
		}

		if (!is_server) {
			std::cout << "HAS NO LISTEN IP!" << std::endl;
		}
	}

	// starts a server
	boost::shared_ptr<CTcpServer> server_ptr = NULL;
	boost::shared_ptr<CUdpServer> udp_server_ptr = NULL;
	if (is_server) {
		boost::asio::ip::address ip_addr = boost::asio::ip::make_address(ip_str);
		server_ptr = boost::make_shared<CTcpServer>(ip_addr, static_cast<unsigned short>(port));
		server_ptr->run();

		udp_server_ptr = boost::make_shared<CUdpServer>(ip_addr, static_cast<unsigned short>(port));
		udp_server_ptr->run();
	}

	// starts a client
	boost::shared_ptr<CTcpClient> client_ptr = NULL;
	if (is_client) {
		std::string client_ip_str(vm["conn_ip"].as<std::string>());
		client_ptr = boost::make_shared<CTcpClient>(client_ip_str, vm["conn_port"].as<int>());
		client_ptr->async_connect();
	}

	common_io_context.run();

	return OK;
}
int main(void) {

	int32_t	nready;
	uint8_t index_to;
	struct timeval timeout;

	/* settaggio della connessione TCP con l'applicazine fissa */
	to_app = setup_conn(SOCK_STREAM, AF_INET, LOCAL_LISTEN_PORT, (int8_t*) "INADDR_ANY", 0, 0, 1);
	/* accettazione della connessione proveniente dall'applicazione fissa */
	new_app_fd = listen_accept(to_app, &app_side);
	/* settaggio della connessione UDP con il monitor */
	udp_gate = setup_conn(SOCK_DGRAM, AF_INET, LOCAL_UDP_PORT, (int8_t*) "INADDR_ANY", 0, 0, 0);
	
	/* inizializzazione strutture */
	make_list(&port_list);
	clear_buffer(down_packets);
	clear_buffer(up_packets);
	udp_clear_buffer(to_app_packets);
	srand(getpid());
	/* inizializzazioni di default */
	last_uploaded = ID_START;
	actual_zero.tv_usec = actual_zero.tv_sec = 0;
	us_zero.tv_usec = us_zero.tv_sec = 0;
	index_to = BUFF_PACK_SIZE;	/* no timeout inizialmente */
	m_id_ports.type = 'C';
	m_id_ports.message = 0;
	last_notify = last_seq = 0;
	good_percentual = GOOD_P;

	FD_ZERO(&readfds);
	FD_ZERO(&writefds);
	FD_ZERO(&s_readfds);
	FD_ZERO(&s_writefds);

	FD_SET(new_app_fd, &readfds);	/* tanto prima aspetta un pacchetto da noi */
	FD_SET(udp_gate, &readfds);
	maxfds = (udp_gate > new_app_fd ? udp_gate : new_app_fd);

	for (;;) {

		s_readfds = readfds;
		s_writefds = writefds;
		nready = select(maxfds + 1, &s_readfds, &s_writefds, NULL, (index_to == BUFF_PACK_SIZE ? NULL : (&timeout)));
		if ((nready == ERROR) && (errno != EINTR)) {
			fprintf(stderr, "fatal error performing select. errno %s\n", strerror(errno));
			exit(EXIT_FAILURE);
		}
		if (FD_ISSET(new_app_fd, &s_readfds)) {
			uint8_t oldestpack, index;

			/* buffering dei pacchetti provenienti dall' applicazione */
			drop_expired(down_packets);
			safe_read(new_app_fd, DATA_BUFF_SIZE, data_app_fixed);
			/* evitiamo il possibile traboccamento di down_packets */
			if ((index = index_free_pack(down_packets)) == BUFF_PACK_SIZE) {
				oldestpack = oldest_pack(down_packets);
				clear_pack(down_packets, oldestpack);
				index = oldestpack;
			}
			memcpy(&(down_packets[index].udp_data.id_packet), data_app_fixed, sizeof(uint32_t));
			memcpy(&(down_packets[index].udp_data.data), &(data_app_fixed[4]), DATA_BUFF_SIZE - sizeof(uint32_t));
			down_packets[index].udp_data.type_packet = STANDARD;
			gettimeofday(&(down_packets[index].arrived), NULL);
			if (s_2_i(&us_zero) == 0)
				us_zero = down_packets[index].arrived;
			down_packets[index].udp_data.the_mighty_fix = s_2_i(&(down_packets[index].arrived)) - (s_2_i(&us_zero) + (INTER_PACKET * (down_packets[index].udp_data.id_packet - ID_FIRST_SENT)));
			down_packets[index].flag_to_send = NEW_ENTRY_FLAG;
			FD_SET(udp_gate, &writefds);
		}
		if (FD_ISSET(udp_gate, &s_writefds)) {
			uint8_t	index;
			struct errno_port ep;
			double rand_n;

			if ((index = first_pack_to_send(down_packets)) != BUFF_PACK_SIZE) {
				/* spedizione del pacchetto verso il monitor */
				ep.type_errno = EXIT_FAILURE;
				while ((ep.type_errno != EXIT_SUCCESS) && (ep.type_errno != EAGAIN) && (port_list != NULL)) {
					gettimeofday(&(down_packets[index].time_last_send), NULL);
					down_packets[index].udp_data.time_buffered = BUFFERED_TIME(down_packets[index]);
					ep = send_the_pack((int32_t*) &(down_packets[index]), STANDARD, udp_gate, port_list);
				/*	printf("utilizzato porta id: %u\n", ep.id_port); */
				}
			#ifdef O_DEBUG
				if (ep.type_errno == EXIT_SUCCESS) {
					printf("spedito il pacchetto con id %d\n", down_packets[index].udp_data.id_packet);
				}
			#endif
				RANDOM_N(rand_n);
				if ((rand_n > (good_percentual - 0)) && (down_packets[index].n_resending > 0)) {
					down_packets[index].flag_to_send = NACK_FLAG;	/* forza la riconsiderazione del pacchetto */
					down_packets[index].n_resending--;
				}
				if ((index = first_pack_to_send(down_packets)) == BUFF_PACK_SIZE)
					FD_CLR(udp_gate, &writefds);
			}
			else {
				FD_CLR(udp_gate, &writefds);
			}
		}
		if (FD_ISSET(udp_gate, &s_readfds)) {
			udp_packet tmp;
			struct sockaddr_in mon_side;
			
			/* ricezione dei dal monitor */
			general_recvfrom((int32_t *) &(tmp), sizeof(udp_packet), udp_gate, &mon_side);

			if (check_port(port_list, ntohs(mon_side.sin_port)) == FALSE) /* inserimento di una, forse, nuova porta monitor */
				insert_port(&port_list, ntohs(mon_side.sin_port));
			switch (tmp.type_packet) {
				case STANDARD: {
				#ifdef O_DEBUG
					printf("id pacchetto ricevuto: %d\n", tmp.id_packet);
				#endif
					up_packets[BUFF_PACK_SIZE - 1].udp_data = tmp;	/* speranza che sia vuoto per la legge di Gigio */
					gettimeofday(&(up_packets[BUFF_PACK_SIZE - 1].delivered), NULL);
					if ((actual_zero.tv_usec == 0) && (actual_zero.tv_sec == 0))	/* nuovo zero dell'opposto balancer */
						i_2_s(s_2_i(&(up_packets[BUFF_PACK_SIZE - 1].delivered)) - (INTER_PACKET * tmp.id_packet), &actual_zero);
					mighty_f_revenge(up_packets, BUFF_PACK_SIZE - 1, &actual_zero, 0);
					if (tmp.id_packet == (last_uploaded + 1)) {	/* e' il successivo */
						clear_pack(up_packets, BUFF_PACK_SIZE - 1);
						to_app_packets[index_udpfree_pack(to_app_packets)] = tmp;
						last_uploaded = tmp.id_packet;	/* aggiorno ultimo upload */
						check_inline_pack(up_packets, to_app_packets, &last_uploaded, tmp.id_packet);
						FD_SET(new_app_fd, &writefds);
					}
					else {
						if (tmp.id_packet > last_uploaded) {
							sort_buffer(up_packets);
						}
						else	/* in ritado abissale, drop */
							clear_pack(up_packets, BUFF_PACK_SIZE - 1);
					}
					break;
				}
				default : {		/* pacchetto di notifica */
					port_monitoring *ptmp = NULL;
					stat_notify *trick = (stat_notify*) &tmp;
				#ifdef O_DEBUG_N
					printf("pacchetto id: %d\n", tmp.id_packet);
					printf("pacchetto di notifica con porta id: %d\n", trick->id_port);
				#endif
				
					if ((last_notify < trick->id_notify) || (last_seq == trick->id_sequence)) { /* non e' in ritardo abissale */
						if ((trick->id_sequence < last_seq) || (trick->id_sequence > last_seq)) { /* nuova sequenza di notifiche */
							m_id_ports.message = trick->type_packet - NOTIFY_F;
							last_seq = trick->id_sequence;
						}
						last_notify = trick->id_notify;
						m_id_ports.message--; /* nuova notifica della stessa sequenza, decrementa contatore */
						m_id_ports.ports[m_id_ports.message] = trick->id_port + 1000;
						ptmp = find_port(port_list, trick->id_port + 1000); /* abbiamo spedito ID lato mobile, vogliamo quello fixed */
						if (ptmp == NULL) { /* porta di cui il fixed non era a conoscenza */
							if (m_id_ports.message == 0) {
							/* non ci sono piu' pacchetti di notifica, costruzione della lista delle porte aperte
							 * e reset-default per la prossima volta */
								m_id_ports.message = trick->type_packet - NOTIFY_F; /* lunghezza lista porte del mobile */
								build_act_ports(&port_list, &m_id_ports);
								m_id_ports.message = 0; /* reset per la prossima notifica */
								break;
							}
							insert_port(&port_list, trick->id_port + 1000);
							break; /* esce forzatamente dallo switch */
						}
						ptmp->not_to_fixed = *trick;	/* aggiorna la notifica */
						ptmp->last_tot_packets = ptmp->tot_packets - ptmp->medium_tot_packets;
						good_percentual = partial_pp_lost(port_list);
						ptmp->ack_packets += ptmp->not_to_fixed.n_received;
						ptmp->nack_packets = ptmp->tot_packets - ptmp->ack_packets;
						ptmp->medium_tot_packets = ptmp->tot_packets;
						mighty_f_ports(&port_list); /* calcolo performance delle porte */
						if (m_id_ports.message == 0) {
						/* non ci sono piu' pacchetti di notifica, costruzione della lista delle porte aperte
						* e reset-default per la prossima volta */
							m_id_ports.message = trick->type_packet - NOTIFY_F; /* lunghezza lista porte del mobile */
							build_act_ports(&port_list, &m_id_ports);
							m_id_ports.message = 0; /* reset per la prossima notifica */
						}
					}
				}
			}
		}
		if (FD_ISSET(new_app_fd, &s_writefds)) {
			memcpy(data_app_fixed, &(to_app_packets[0].id_packet), sizeof(uint32_t));
			memcpy(&(data_app_fixed[4]), &(to_app_packets[0].data), DATA_BUFF_SIZE - sizeof(uint32_t));
			safe_write(new_app_fd, DATA_BUFF_SIZE, data_app_fixed);
			udp_shift_pack(to_app_packets, 0);	/* clear e shift */
			if (to_app_packets[0].type_packet == FALSE)	/* non ce ne sono piu' */
				FD_CLR(new_app_fd, &writefds);
		}
		if (nready == 0) {	/* timeout espirato, nessun fd pronto */
			if (check_inline_pack(up_packets, to_app_packets, &last_uploaded, up_packets[0].udp_data.id_packet - 1))
				FD_SET(new_app_fd, &writefds);
		}
		index_to = BUFF_PACK_SIZE;
		timeout.tv_sec = timeout.tv_usec = 0;
		index_to = manage_timeout(up_packets, &timeout);
	}

	return 0;
}