Exemplo n.º 1
0
static void
netlink_notification (NMNetlinkMonitor *monitor, struct nl_msg *msg, gpointer user_data)
{
	NMIP6Manager *manager = (NMIP6Manager *) user_data;
	NMIP6Device *device;
	struct nlmsghdr *hdr;
	gboolean config_changed = FALSE;

	hdr = nlmsg_hdr (msg);
	nm_log_dbg (LOGD_HW, "netlink notificate type %d", hdr->nlmsg_type);
	switch (hdr->nlmsg_type) {
	case RTM_NEWADDR:
	case RTM_DELADDR:
		device = process_addr (manager, msg);
		config_changed = TRUE;
		break;
	case RTM_NEWROUTE:
	case RTM_DELROUTE:
		device = process_route (manager, msg);
		config_changed = TRUE;
		break;
	case RTM_NEWPREFIX:
		device = process_prefix (manager, msg);
		break;
	case RTM_NEWNDUSEROPT:
		device = process_nduseropt (manager, msg);
		config_changed = TRUE;
		break;
	case RTM_NEWLINK:
		device = process_newlink (manager, msg);
		config_changed = TRUE;
		break;
	default:
		return;
	}

	if (device) {
		nm_log_dbg (LOGD_IP6, "(%s): syncing device with netlink changes", device->iface);
		nm_ip6_device_sync_from_netlink (device, config_changed);
	}
}
Exemplo n.º 2
0
Arquivo: sws.c Projeto: 01zhou/sws
void handle(int sockfd, struct sockaddr_in * cli_addr)
{
	char buffer[BUFFER_SIZE];
	char addr[MAX_URI_LEN];
	char first_line[BUFFER_SIZE];
	struct Message m,res;
	int i,entlen;

	char cgi_env[BUFFER_SIZE];

	time_t now_time;
	FILE* fp;

	bzero(buffer, sizeof(buffer));
	read(sockfd, buffer, sizeof(buffer)-1);
	if(global_option.l == 1)
	{
		/*copy first line of the request*/
		for(i=0; buffer[i]!='\r' && buffer[i]!='\n' && i<BUFFER_SIZE-1; i++)
			first_line[i] = buffer[i];
		first_line[i]=0;
	}

#ifdef DEBUG
	printf("Full Message:\n%s\n\n", buffer);
#endif

	m = read_req_msg(buffer);

#ifdef DEBUG
	printf("Method: %d\n", m.req.method);
	printf("URI: %s\n", m.req.URI);
	printf("Version: %d.%d\n\n", m.req.version.major, m.req.version.minor);
#endif

	/*Prepare response*/
	/*Always use HTTP/1.0*/
	res.type = RESPONSE;
	res.res.version.major = 1;
	res.res.version.minor = 0;
	now_time = time(NULL);
	strcpy(res.res.now_time, asctime(gmtime(&now_time)));
	strcpy(res.res.server, SERVER);

	if(m.type == UNKNOWN)
	{
		/* 400 Bad Request*/
		res.res.scode = 400;
		default_rp(&res);
		set_file(&res, "400.html" , 1, NULL);
	}
	else
	{
		res.res.isCGI = process_addr(addr, m.req.URI);

		if(res.res.isCGI==1)
		{
			bzero(cgi_env, sizeof(cgi_env));
			if(m.req.method == GET)
			{
				for(i=0;addr[i]!='?' && addr[i]!=0;i++);
				if(addr[i]=='?')
				{
					sprintf(cgi_env,"QUERY_STRING=%s", &(addr[i+1]));
					addr[i]=0;
				}
#ifdef DEBUG
				printf("ENV = %s\n", cgi_env);
#endif
			}
			else if(m.req.method == POST)
			{
				if(m.req.entity != NULL)
				{
					entlen = strlen(m.req.entity);
				}
				sprintf(cgi_env,"CONTENT_LENGTH=%d", entlen);
			}
		}


		if(m.req.method == GET || m.req.method == HEAD || m.req.method == POST)
		{

			/* Test Existence */
			if(access(addr, R_OK) != 0)
			{
				/* Not Exists*/
				/* Or permission denied*/
				res.res.isCGI = 0;
				res.res.scode = 404;
				default_rp(&res);
				if(m.req.method == HEAD)
					set_file(&res, "404.html" , 0, NULL);
				else
					set_file(&res, "404.html" , 1, NULL);
			}
			else if(res.res.isCGI == 1 && access(addr, X_OK)!=0)
			{
				/* Not Executable*/
				res.res.isCGI = 0;
				res.res.scode = 403;
				default_rp(&res);
				if(m.req.method == HEAD)
					set_file(&res, "403.html" , 0, NULL);
				else
					set_file(&res, "403.html" , 1, NULL);

			}
			else
			{
				res.res.scode = 200;
					default_rp(&res);

				if(res.res.isCGI==1)
					putenv(cgi_env);
				if(m.req.method == HEAD)
					set_file(&res, addr , 0, NULL);
				else if(m.req.method == GET)
					set_file(&res, addr , 1, NULL);
				else
				{
					/*POST*/
					set_file(&res, addr , 1, m.req.entity);
				}
			}
		}
	}
	if(global_option.l == 1)
	{
		if(global_option.d == 1)
		{
			fp = (FILE*) stdout;
		}
		else
		{
			/*logging*/
			fp = fopen(global_option.lfile, "a");
		}
		fprintf(fp, "%s ", inet_ntoa(cli_addr->sin_addr));
	}
	else
	{
		fp = NULL;
	}

	send_msg(sockfd, res, fp, first_line);

	if(global_option.l == 1 && global_option.d == 0)
	{
		fclose(fp);
	}

	close(sockfd);

}