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

📄 config_phase.c

📁 嵌入式linux的一个cgi网站
💻 C
字号:
/* config_phase.c:  phase config.txt

*/

#include <stdio.h>
#include <string.h>#include <stdlib.h>
#include <unistd.h>
#include "config_phase.h"
#include "sysconf.h"

char trace_string[200];

void swap(config_item *a[], int i, int j)
{
	config_item *temp = a[i];
	a[i] = a[j];
	a[j] = temp;
}

int partition(config_item *a[], int p, int r)
{
	int x = a[r]->index;
	int i = p-1;
	int j;
	for(j=p; j<r; j++)
	{
		if(a[j]->index <= x)
		{
			i++;
			swap(a, i, j);
		}
	}
	swap(a, i+1, r);
	return i+1;
}

void quicksort(config_item *a[], int p, int r)
{
	int q;
	if(p < r)
	{
		q = partition(a, p, r);
		quicksort(a, p, q-1);
		quicksort(a, q+1, r);
	}
}


FILE *OpenGlobeConfig()                      // return NULL for open error
{
	FILE * fp;
	fp = fopen(CONFIG_FILE_NAME, "rb");

	return fp;
}

void CloseGlobeConfig(FILE * fp)
{
	fclose(fp);
}

int ReadGlobeConfig(FILE *fp, int config_num, config_item *items[])
{
	int i;
	int j=0;
	char temp_line[MAX_LINE_LENGTH];
	char *fake_index, *fake_data; 
	
	quicksort(items, 0,  config_num-1);

	for(i=0; i<items[config_num-1]->index; i++)                       // index must start from 1
	{
		memset(temp_line, 0, MAX_LINE_LENGTH);
		if( fgets(temp_line, MAX_LINE_LENGTH, fp))
		{
			if(items[j]->index == i+1)
			{
				fake_index = strtok(temp_line, "=");
				fake_data = strtok(NULL, "=");
				if(fake_data == NULL)
					fake_data = "";
				memset(items[j]->data, 0, strlen(items[j]->data));
				strncpy(items[j]->data, fake_data, strlen(fake_data));          //with '/n' 
				items[j]->data[strlen(items[j]->data)-1] = 0;
				//sscanf(temp_line, "%s=%s", fake_index, items[j]->data);
				j++;
			}
		}
		else
		{
			ASSERT("read NULL line\n");
			return 0;
		}
	}

	return 1;
}


FILE *OpenTempConfig()                      // return NULL for open error
{
	FILE * fp;
	char  temp_file_name[MAX_FILE_NAME_LEN];

	memset(temp_file_name, 0, MAX_FILE_NAME_LEN);
	sprintf(temp_file_name, "%s%d", CONFIG_TEMP_FILE_PROFIX, getpid());
	
	fp = fopen(temp_file_name, "wb");

	return fp;
}

void CloseTempConfig(FILE * fp)
{
	fclose(fp);
}

void UnlinkTempConfig()
{
	char  temp_file_name[MAX_FILE_NAME_LEN];

	memset(temp_file_name, 0, MAX_FILE_NAME_LEN);
	sprintf(temp_file_name, "%s%d", CONFIG_TEMP_FILE_PROFIX, getpid());
	unlink(temp_file_name);
}


int WriteTempConfig(FILE *fp, int config_num, config_item *items[])
{
	int i;                                                                                    //make sure we have sorted items in ReadGlobeConfig();
	int j = 0;

	for(i=0; i<config_num; i++)                   // index must start from 1
	{
		if(1 == items[i]->is_changed)
			j++;
	}
	
	fprintf(fp, "%d\n", j);
	
	for(i=0; i<config_num; i++)
	{
		if(1== items[i]->is_changed)
			fprintf(fp, "%d=%s\n", items[i]->index, items[i]->data);
	}

	return 1;
}

int SaveTempConfig(int config_num, config_item *items[])
{
	FILE * fp,*w_fd,*r_fd;
	int i, j=0;

	for(i=0; i<config_num; i++)                   // index must start from 1
	{
		if(1 ==  items[i]->is_changed )
			j++;
	}

	if(j > 0){
	fp = OpenTempConfig();
	fprintf(fp, "%d\n", j);
	
	for(i=0; i<config_num; i++)
	{
		if(1 == items[i]->is_changed )
			fprintf(fp, "%d=%s\n", items[i]->index, items[i]->data);
	}

		fclose(fp);

			r_fd = open_read_fifo();
    		w_fd = open_write_fifo();
			notify_config(w_fd);
			close_write_fifo(w_fd);

			read_fifo(r_fd);
			close_read_fifo();


	      UnlinkTempConfig();
	
	}

	return j;
}

config_item ** init_config_item(config_item *items[], int config_num, int *config_list)
{
	int i;

	items = malloc(sizeof(config_item *)*config_num);

	for(i=0; i<config_num; i++)
	{
		items[i] = malloc(sizeof(config_item));
		items[i]->data = malloc(MAX_LINE_LENGTH);
		memset(items[i]->data, 0, MAX_LINE_LENGTH);
		items[i]->index = config_list[i];
		items[i]->is_changed = 0;
	}

	return items;
}

void set_config_item(config_item *items[], int config_num ,int index ,char * value)
{
  int i;

  for(i = 0; i < config_num ; i++)
  	if(items[i]->index == index)
		strcat(items[i]->data,value);
	
}

void free_config_item(config_item *items[], int config_num)
{
	int i;
	for(i=0; i<config_num; i++)
	{
		free(items[i]->data);
		items[i]->data = NULL;
		free(items[i]);
		items[i] = NULL;
	}
	free(items);
	items = NULL;
}

int GetConfValues(int *config_list, config_item *items[], int config_num)
{
	int i;
	FILE * fp;
	
	fp = OpenGlobeConfig();
	
	if(!ReadGlobeConfig(fp, config_num, items))
	{
		ASSERT("read config error\n");
		CloseGlobeConfig(fp);
		return 0;
	}
	CloseGlobeConfig(fp);

	return 1;
}

void item_update(int index, config_item *items[], int config_num, char *data)
{
	int i;

	for(i=0; i<config_num; i++)
	{
		if(items[i]->index == index)
		{
			if(strcmp(items[i]->data, data))       // what's the matter
			{
			memset(trace_string, 0, 200);
		   	sprintf(trace_string, "old:%d: %d :%s\n", items[i]->index, strlen(items[i]->data),items[i]->data);
			trace(trace_string);
				memset(items[i]->data, 0, strlen(items[i]->data));
				strcpy(items[i]->data, data);
				items[i]->is_changed = 1;
				
				memset(trace_string, 0, 200);
				sprintf(trace_string, "new:%d: %d: %s?%d\n", items[i]->index, strlen(items[i]->data),items[i]->data,items[i]->is_changed);
				trace(trace_string);
			}
		}
	}
	
}

char *getdata(int index, config_item *items[], int config_num)
{
	int i;
	int len;
	for(i=0; i<config_num; i++)
	{
		if(items[i]->index == index)
		{
/*		
			if(!strcmp(items[i]->data, "\n"))
				memcpy(items[i]->data, "NULL", sizeof("NULL"));
			else
			{
				len = strlen(items[i]->data);
				*(items[i]->data+len-1) = 0;
			}
*/				
			return items[i]->data;
		}
	}
	
	return NULL;
}

int SaveConfig(char **postvars, config_item **items, int *config_list, char **config_name, int config_num)
{
	int i, j;
	
	//GetConfValues(config_list, items, config_num);
	if (postvars == 0)
		return 0;

	for (i=0; postvars[i]; i = i + 2)
	{
		for(j=0; j<config_num; j++)
		{
			if(!strcmp(postvars[i],  config_name[j]))
				item_update(config_list[j], items, config_num, postvars[i+1]);
		}
	}

	return SaveTempConfig(config_num, items);	
}

⌨️ 快捷键说明

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