I added another function to core_functions.c. It attempts to connect
to eth0 but for some weird reason, probably a bug not from our part,
it is failing.

The function is:  int connectWired(const char ethx)

And the error is: (passed command to execl is "ifup eth0")
"This command should be called as ifup, ifdown, or ifquery"

Any pointers as to what is the cause are appreciated.

Edward

On 27/08/2015, Steve Litt <[email protected]> wrote:
> On Thu, 27 Aug 2015 14:18:02 +0100
> Edward Bartolo <[email protected]> wrote:
>
>>
>> Now, in the case of frequently changing wifi hotspots, the frontend
>> need to be made to detect that a different wifi hotspot is required.
>> This can be achieved with TTimer calling a subroutine regularly in
>> which a connection is tested, and in case the active wifi is
>> unreachable, other wifi's are tried starting with the strongest
>> signal. In case, no essid file is found, the user is prompted to enter
>> password and essid. However, this can become a nuisance, so we have to
>> decide where to stop regarding automating wifi connections.
>
> You're right.
>
> Probably something in the network software sends a message (besides the
> one sent to dbus) indicating that the current active wifi just
> disconnected, and if that can be redirected to your software, that
> pretty much does the job.
>
> SteveT
>
> Steve Litt
> August 2015 featured book: Troubleshooting: Just the Facts
> http://www.troubleshooters.com/tjust
>
/*
    netman - A Network Connection Manager
    Copyright (C) 2015  Edward Bartolo

    "netman" is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    "netman" is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with "netman".  If not, see <http://www.gnu.org/licenses/>.
*/

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <alloca.h>
#include <sys/types.h>
#include <sys/wait.h>

#include "core_functions.h"
#include "essid_encoder.h"
#include "paths.h"

#define SIMPLE_SCAN_OPT ""
//#define POWER_SCAN_OPT "-B 4"

int connectWired(
	const char * ethx
) {
	int err;
	int valid_eth = 0;
	
	if (ethx == NULL) 
		return 107; // ethx is NULL
	
	char ethN[10];
	strcpy(ethN, "eth");
	
	valid_eth = (strncmp(ethN, ethx, 3) == 0);
	if (valid_eth && (strlen(ethx) > 3 && strlen(ethx) < 6)) {
		if (strlen(ethx) == 4) {
			valid_eth = isdigit(ethx[3]);
		} else {
			valid_eth = ethx[3] != '0' && isdigit(ethx[3]) && isdigit(ethx[4]);
		}		
	}
	
		
	if (!valid_eth) {
		fprintf(stderr, "ERROR: ethX not recognized.\n");

		return 106;  //ethx not recognized
	}
		
	err = execl("/sbin/ifup", ethx, (char *) NULL);
		
	fprintf(
		stderr, 
		"ERROR: connectWired(): "
		"\"/sbin/ifup %s\" failed; err=%d\n",
		ethx, err
	);
			
	return err;
}

int connectionConnect(
	const char * essid
) {
	char filename[1024];
	char * encoded_essid;
	int err;

	err = encode_essid_alloc(essid, &encoded_essid);

	if(err!=0) {
		fprintf(stderr, "ERROR: essid_encode_alloc(essid=%s) failed; err=%d\n", essid, err);

		return err;
	}

	err = encode_essid(essid, &encoded_essid);

	if(err!=0) {
		fprintf(stderr, "ERROR: essid_encode(essid=%s) failed; err=%d\n", essid, err);
		
		return err;
	}

	err = snprintf(filename, 1024, "%s/%s", IFACES_PATH, encoded_essid);

	if(err<0) {
		fprintf(stderr, "ERROR: snprintf(filename) failed; err=%d\n", err);
		
		return err;
	}

	fprintf(stderr, "DEBUG: now executing: /sbin/ifup wlan0 -i %s\n", filename); // DEBUG

	err = execl("/sbin/ifup", "ifup", "wlan0", "-i", filename, (char *) NULL);

	fprintf(
		stderr, 
		"ERROR: connectionConnect(): "
		"\"/sbin/ifup wlan0 -i %s\" failed; err=%d\n",
		filename, err
	);

	return err;
}

int disconnectActiveConnection()
{
	int err = execl("/sbin/ifdown", "ifdown", "wlan0", (char *) NULL);

	fprintf(
		stderr, 
		"ERROR: disconnectActiveConnection(): "
		"\"/sbin/ifdown wlan0\" failed; err=%d\n",
		err
	);

	return err;
} 

int power_scan(scan_type scan)
{
	const char *command_up = "/sbin/ifconfig wlan0 up";
	int status;
	FILE * shell_reader;
	char * scan_buffer;
	int err;

	scan_buffer = calloc(1024, 1);

	if(!scan_buffer) {
		fprintf(
			stderr, 
			"ERROR: power_scan(): "
			"could not allocate 104 bytes for scan_buffer (Error: %s)\n", 
			strerror(errno)
		);

		return -1;
	}

	status = system(command_up);

	if(status==-1 || !WIFEXITED(status)) {
		fprintf(
			stderr, 
			"ERROR: power_scan(): "
			"\"%s\" did not exit regularly (status=%d).\n", 
			command_up, status
		);

		return status;
	}
	else if (0 != WEXITSTATUS(status)) {
		fprintf(
			stderr, "ERROR: power_scan(): "
			"\"%s\" did not exit successfully (status=%d).\n", 
			command_up, WEXITSTATUS(status)
		);

		return status;
	}

	if (scan == simple)
		shell_reader = popen(
			"/sbin/iwlist wlan0 scanning | "
			"/bin/grep " SIMPLE_SCAN_OPT " ESSID", 
			"r"
		);
	else 
		shell_reader = popen("/sbin/iwlist wlan0 scanning",
			//"/sbin/iwlist wlan0 scanning | "
			//"/bin/grep " POWER_SCAN_OPT " ESSID", 
			"r"
		);

	if(!shell_reader) {
		fprintf(
			stderr, 
			"ERROR: power_scan(): "
			"popen() failed (Error: %s)\n", 
			strerror(errno)
		);

		return -1;
	}

	while((scan_buffer = fgets(scan_buffer, 1024, shell_reader)))
		printf("%s", scan_buffer);

	err = pclose(shell_reader);

	if(err) {
		fprintf(
			stderr, 
			"ERROR: power_scan(): "
			"pclose(shell_reader) failed (Error: %s)\n", 
			strerror(errno)
		);

		return -1;
	}

	return 0;
}

int scan(void)
{
	return power_scan(simple);
}

_______________________________________________
Dng mailing list
[email protected]
https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng

Reply via email to