⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 supdetect.c

📁 linux 下通过802.1认证的安装包
💻 C
字号:
/**
 *  Library to attempt to detect other supplicants that may be running.
 *
 *  \file supdetect.c
 *
 *  \author chris@open1x.org
 *
 *  \warning  This library expects to be able to use some calls from the main part of the
 *            supplicant.  It is *NOT* suitable for using with other programs!
 *
 * $Id: supdetect.c,v 1.1.2.15 2007/08/26 07:16:05 chessing Exp $
 * $Date: 2007/08/26 07:16:05 $
 **/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include "supdetect_private.h"
#include "../../src/error_prequeue.h"

#ifdef WINDOWS
#include "windows_calls.h"
#elif LINUX
#include "linux_calls.h"

#define _strdup  strdup
#elif DARWIN
#include "darwin_calls.h"

#define _strdup  strdup

#else
#error You need to define checks for this OS!
#endif

#include "supdetect.h"

typedef void (*found_callback)(char *name, int *blocktype, int *severity);

#ifdef WINDOWS
sup_fingerprints supsearch[] = {
	{CHECK_PROCESS, "WPA Supplicant", "wpa_supplicant.exe", NULL, OTHER_SUPPLICANT, BLOCKER},
	{CHECK_SERVICE, "Atheros Configuration Service", "Atheros Configuration Service", NULL, (WIRELESS_MANAGER | OTHER_SUPPLICANT), BLOCKER},
	{CHECK_PROCESS, "NetGear WG111v2 Manager", "WG111v2.exe", NULL, WIRELESS_MANAGER, BLOCKER},
	{CHECK_PROCESS, "NetGear WG511 Manager", "WG511WLU.exe", NULL, WIRELESS_MANAGER, BLOCKER},
	{-1, NULL, NULL, NULL, -1, -1}
};
#elif LINUX
sup_fingerprints supsearch[] = {
  {-1, NULL, NULL, NULL, -1, -1}
};
#elif DARWIN
sup_fingerprints supsearch[] = {
  {-1, NULL, NULL, NULL, -1, -1}
};
#else
#error You need to define fingerprints for this OS!
#endif

void *callback = NULL;

void supdetect_bind_callback(found_callback cb)
{
}

/**
 * \brief Convert a mixed case string to an all upper case string.
 * 
 * \warning This function converts the string IN PLACE!
 *
 * @param[in] instr   The string to convert to all upper case.
 **/
void toupper_str(char *instr)
{
	unsigned int i, t;

	for (i = 0; i<strlen(instr); i++)
	{
		t = toupper(instr[i]);
		instr[i] = t;
	}
}

/**
 * \brief Add a found supplicant or wireless manager to the queue so that we
 *        can pass it to a listening UI when it connects.
 *
 * @param[in] toadd   The record that matched that we want to log.
 **/
void supdetect_add_to_ui_queue(sup_fingerprints *toadd)
{
	char *result = NULL;

	result = Malloc(strlen(toadd->product_name)+256);
	if (result == NULL)
	{
		printf("Couldn't allocate memory to create error/warning for the UI!\n");
		return;
	}

	if (toadd->block_type && OTHER_SUPPLICANT)
	{
		if (toadd->severity == BLOCKER)
		{
			sprintf(result, "<ERROR> The supplicant '%s' was found.  This may prevent this supplicant from working properly.  Please disable the other supplicant.", toadd->product_name);
		}
		else
		{
			sprintf(result, "<Warning> The supplicant '%s' was found.  This may have adverse effects on this supplicant.  You should consider disabling the other supplicant.", toadd->product_name);
		}
	}
	else
	{
		// For now, the only other option is a wireless manager.  If this changes
		// in the future, this needs to be updated.
		if (toadd->severity == BLOCKER)
		{
			sprintf(result, "<ERROR> The wireless manager '%s' was found.  This may prevent this supplicant from working properly.  Please disable the wireless manager.", toadd->product_name);
		}
		else
		{
			sprintf(result, "<Warning> The wireless manager '%s' was found.  This may have adverse effects on this supplicant.  You should consider disabling the wireless manager.", toadd->product_name);
		}
	}

	if (result != NULL)
	{
		if (error_prequeue_add(result) != 0)
		{
			printf("Couldn't add error/warning message to the UI queue.\n");
		}

		free(result);
		result = NULL;
	}
}

/**
 * \brief Check to see if a file exists.
 *
 * @param[in] search   The record used to search and see if this file exists.
 *
 * \retval 1 if the record was matched
 * \retval 0 if it wasn't.
 * \retval -1 on error
 **/
int supdetect_file_exists(sup_fingerprints *search)
{
	int len = 0;
	char *filename = NULL;
	FILE *fp = NULL;

	if (search->location != NULL)
		len = (int)strlen(search->location);
	
	if (search->product_name != NULL)
		len += (int)strlen(search->product_name);

	len += 3;  // A few bytes for padding.

	filename = malloc(len);
	if (filename == NULL) return -1;

	memset(filename, 0x00, len);

	sprintf(filename, "%s%s", search->location, search->match_string);

	fp = fopen(filename, "r");
	if (fp == NULL) 
	{
		free(filename);
		return 0;
	}

	free(filename);
	fclose(fp);

	return 1;
}

/**
 * \brief Search through all of the known fingerprints to see if any match.
 *
 * \retval >=1 the number of matches found.
 * \retval 0 if no match is found.
 **/
int supdetect_check_for_other_supplicants()
{
	int i = 0;
	int found = 0;

#ifdef WINDOWS
	if (windows_calls_wmi_init() != 0) return -1;
	if (windows_calls_wmi_connect() != 0) return -1;
#endif

	found += os_strange_checks();           // Look for anything weird with this OS.

	while (supsearch[i].check_type != -1)
	{
		switch (supsearch[i].check_type)
		{
		case CHECK_FILE:
			if (supdetect_file_exists(&supsearch[i]) > 0)
			{
				found++;
				
				supdetect_add_to_ui_queue(&supsearch[i]);
			}
			break;

		case CHECK_PROCESS:
			if (supdetect_check_process_list(&supsearch[i]) > 0)
			{
				found++;

				supdetect_add_to_ui_queue(&supsearch[i]);
			}
			break;

#ifdef WINDOWS         // Windows specific checks.
		case CHECK_REGISTRY:
			break;

		case CHECK_SERVICE:
			if (supdetect_check_service_list(&supsearch[i]) > 0)
			{
				found++;

				supdetect_add_to_ui_queue(&supsearch[i]);
			}
			break;
#endif  // WINDOWS

		default:
			printf("Requested check for unknown type %d!\n", supsearch[i].check_type);
			break;
		}

		i++;
	}

#ifdef WINDOWS
	windows_calls_wmi_deinit();
#endif

	return found;
}

/**
 * \brief  Look to see if a specific program is already running.
 *
 * @param[in] matchstr   The name of the program to look for.  This should only be the name of the
 *                       executable, and not the full path.  So, if I wanted to see how many instances
 *                       of Xsupplicant are running, I would put in "xsupplicant.exe" instead of
 *                       "c:\blah\xsupplicant.exe".
 *
 * \retval >=0   The number of instances of the named program that are running.  If you are checking
 *               to see if another instance of the same program is running, you want to check if this
 *               value is >=2.  (One for the previous instance, one for the current.)
 * \retval <0    On error
 **/
int supdetect_numinstances(char *matchstr)
{
	sup_fingerprints mymatch;
	int numinstances = 0;

#ifdef WINDOWS
	if (windows_calls_wmi_init() != 0)
		return -1;

	if (windows_calls_wmi_connect() != 0)
		return -1;
#endif

	memset(&mymatch, 0x00, sizeof(mymatch));

	mymatch.match_string = _strdup(matchstr);

	numinstances = supdetect_check_process_list(&mymatch);

	free(mymatch.match_string);

#ifdef WINDOWS
	windows_calls_wmi_deinit();
#endif

	return numinstances;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -