QT  X Ʈũ 
ڿ(youngsun@i-top.co.kr)
¥: 1999.12.26

Ϸ: gcc
    : C++ (QT 1.44 Library )
ȯ    : ¥ 6.1 XWindowȯ


===============================================================

<...>

ȳϼ. 
()ž ߿ ϰ ִ ڿ̶ մϴ.
켱, ϰ  ڷ  Ұ  ϱ .

  ó ϰ,  Gtk QT  Ǹ鼭,  
ȸ ǰߴ    Ŀ  ̺ 
 ؼ  Ʈ ȹϰ Ǿϴ.
 Ʈ ȸ ߿ ߴ Topflash, 
Ʈũ, , ȭ, ޽    ִ 
ͳݼַ   TopmanagerX  
ϴ.
̴ QT̺귯, ANSI-C fileóƾ ̺귯 
  Դϴ.
  ߿ Ʈũ QT Ͽ غ ϰ
ϴ.

 Gtk ̿  ٸ ó  ۷ øڽϴ.
ǻ̳  ߰Ͻźе  E-mailּҷ  
ֽñ ٶϴ.
׸ Gtk    Kernelм  ڷḦ 
 Դϴ.
 ɰ ݷ Ź帳ϴ.

===============================================================

<>

0.	RedHat Linux 6.1 SystemFile Ͽ...
	0.1.	/etc丮 ִ file
		0.1.1.	/etc/conf.modules
		0.1.2.	/etc/sysconfig/network-scripts/ifcfg-eth0
		0.1.3.	/etc/sysconfig/network

1.	߿ḮƮ ̿ Fileó ƾ Ͽ...
	1.1.	߿ḮƮ(Double LinkedList) 
	1.2.	fileó ̺귯 
	1.3.	Ǿ 

2.	QT ⺻ 
	2.1.	QT Class
	2.2.	Widget̶?
		2.2.1.	(QWidget), (QFrame), ư(QButton)
		2.2.2.	Makefile 
		2.2.3.	(QLabel)
		2.2.4.	ڽ(QLineEdit)
			2.2.4.1	QObject::connect, SIGNAL SLOT
		2.2.5.	޺ڽ(QComboBox)
		2.2.6.	Ʈ(QListView)
		2.2.7.	üũڽ(QCheckBox), ư(QRadioButton)
		2.2.8.	޴(QMenu)
		2.2.9.	(QToolBar) (QMainWindow)
	2.3.	QT ?

< Ѹ >.

3.	⺻ Format ۼϱ
	3.1.	޴ 
	3.2.	 ֱ
	3.3.	Network ̺귯 ϱ
	3.4.	Class
		3.4.1	ϹݳƮũ
		3.4.2	DNS
		3.4.3	IP-Aliasing
	< *** ü Source *** >
	3.5.	Ǿ 

4.	Ʈ ġ...

===============================================================

< 0. RedHat Linux 6.1 SystemFile Ͽ... >

0.1. /etc丮 ִ file

0.1.1. /etc/conf.modules
	 file ϵ ο ̽ ߰Ǿ  ش ̽
	 ˱  ̸ ̴  Ѵ.
	 Lan Card Chipset̸ 3c59x /etc/conf.modules 
	   Ѵ.
	
	alias eth0 3c59x
	
	⼭ 3c59x  ڸ Chipset ̸ ƴ϶  
	ϴ Network Module ̸̴.   Network Module 
	 Chipset̸ 1:1 ġȴ.(⼭ Module̶ Windows 
	̹ ϴ.)
	Module file *.o  ̵鿡   
	/lib/modules/2.2.12-20kr/net 丮 ִ.
	 "alias eth0 3c59x" ǹ̴ 3c59x eth0 aliasingؼ 
	ٴ ̴. 
	 Lan Card ̻ ýۿ ġǾִٸ Ʒ   
	Ǿ ̴.

	alias eth1 '̸'
	alias eth2 '̸'

	 ī尡 ISA  fileȿ io irqȣ  ־ 
	Ѵ.  io, irq ϴ ƾ   ,  
	90% ̻ PCIī带 ϰ Ƿ   .

0.1.2. /etc/sysconfig/network-scripts/ifcfg-eth0
	 ۾ ƴٸ  file  scanغ.

	cat /etc/sysconfig/network-scripts/ifcfg-eth0

	   µ ̴.

	DEVICE=eth0
	BROADCAST=172.31.255.255
	IPADDR=172.31.0.202
	NETMASK=255.255.0.0
	NETWORK=172.31.0.0
	ONBOOT=yes

	 IP, Netmask, Network, Broadcast ̷ Ǿ  ̴.
	  "ONBOOT=yes"  ý ýÿ  ø  
	 ɼ̴.
	 file ٸ ͸ Ἥ file Ű ٶ.

	̷ setting ϰ,  Lan Card Chipset 3c59x شǴ ⿡ 
	ġȴٸ  ɾ غ.

	/etc/rc.d/init.d/network restart

	 ɾ ϰ Ǹ ø⿡ ϴ ϴ Ÿش.
	 Ѵٸ   ɾ غ.

	ifconfig

	 ɾ   ýۿ   .

	eth0      Link encap:Ethernet  HWaddr 00:90:27:A2:70:DE  
	          inet addr:172.31.0.1  Bcast:172.31.255.255  Mask:255.255.0.0
	          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
	          RX packets:88055 errors:0 dropped:0 overruns:0 frame:0
              TX packets:119306 errors:0 dropped:0 overruns:0 carrier:0
	          collisions:0 txqueuelen:100 
	          Interrupt:17 Base address:0xef00 
	
	eth1      Link encap:Ethernet  HWaddr 00:90:27:57:17:27  
    	      inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
        	  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
	          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    	      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
        	  collisions:0 txqueuelen:100 
	          Interrupt:16 Base address:0xef40 

	lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
	          UP LOOPBACK RUNNING  MTU:3924  Metric:1
	          RX packets:146 errors:0 dropped:0 overruns:0 frame:0
              TX packets:146 errors:0 dropped:0 overruns:0 carrier:0
	          collisions:0 txqueuelen:0 

	    ֵ  IP() "inet addr:172.31.0.1" 
	õǾ ְ  Broadcast Netmask    Ÿִ.
	⼭ eth1   ι° Lan Card  ,   Card 
	OS ùٸ ν  Ÿ ̴.  file鿡   
	eth0 ϴ.
	° ° ܶ "lo" localhost  ̴.   
	kernel default settingϿֹǷ  Ű澵 ʿ䰡 .

0.1.3. /etc/sysconfig/network
	 file ȣƮӰ Ʈ̸ ϴ file̴.
	 file catغ.

	NETWORKING=yes
	FORWARD_IPV4=false
	HOSTNAME=superbug.i-top.co.kr
	GATEWAY=172.31.0.200

	 ó  Ư  ʿ 츦 ϰ   
	ٲ   Ѵ.
	 6.x  ̰ DOMAINNAME GATEWAYDEV׸ 
	 6.xĺʹ  κ .  ׸ ־ ׸,  
	׸̹Ƿ Ű澵 ʿ . DOMAINNAME׸ HOSTNAME  Ǿ
	, GATEWAYDEV Ʈ eth0 ϵ Ǿִ.


< 1. ߿ḮƮ ̿ Fileó ƾ Ͽ... >

	-> Fileóƾ ߿ḮƮ ̿ :
		Fileóƾ ߿ḮƮ ̿  Ͽ.
		ḮƮ   ߿  Ȯ强 Զ̴.
		  Fileó DB(ISAM, Postgre sql, mysqlŸ) 
		̿ϴ  ְ, Ȥ File Ѱ ھ о鿩 ó
		ϴ   ִ.
		 DB ̿ϴ  뷮 ͸ ó , ׸ 
		  ȭǾ   ̰, Ѱ ھ 
		鿩 óϴ  ѵΰ File ó   
		̹Ƿ  ϴ.
		Linux Network  File    ȭǾ 
		ʰ   ׷̵Ǵ ̹Ƿ  óƾ 
		ϴ.
		ٸ  鵵 ְ, ׸ ó ȮŰ 
		 ְ, ս File óϱ , ޸𸮰 Ȯϰ
		ϱ ḮƮ ߴ. в   ̳ Ȥ 
		  ƾ  ź Ÿ ħ ֽñ ٶ.


===============================================================
1.1. ߿ḮƮ(Double LinkedList) 
	߿ḮƮ  source ͳݻ ηְ, 
	кΰ  ٷ κ̹Ƿ  κп 
	  α ϰ file븸 ֵ ϰڴ.

--- < source 1.1.1  Double LinkedList. Filename:procfile.h > ---
	#include <stdio.h>

	#ifndef _LINKLIST_H_
	#define _LINKLIST_H_

	#ifndef SUCCESS
	#define SUCCESS                 1
	#define FAIL                    0
	#endif

	#ifndef TRUE                    
	#define TRUE                    1
	#define FALSE                   0
	#endif
   
	#ifndef _DOUBLE_LINKLIST_
	#define _DOUBLE_LINKLIST_
	typedef struct tagDOUBLELINK {
	    void *pzKey;
   
	    struct tagDOUBLELINK *next;
	    struct tagDOUBLELINK *prev;
	} DList;
	
	void   initDL(void);
	DList *searchDL(void *pzSearch);
	DList *insertAsFirstDL(void *pzInsert);
	DList *insertDL(void *pzInsert, DList *pIns);  /* insert front node p */
	DList *insertDLAsKey(void *pzInsert, void *pzSearch);
	DList *insertDLAsSort(void *pzInsert);
	int    deleteDL(DList *pDel);
	int    deleteDLAsKey(void *pzSearch);
	void   deleteAllDL(void);
	void   deletePerfectDL(void);
	void  *printDL(DList *pPrint);
	
	#endif
	#endif
----------------------------------------------------------------

--- < source 1.1.2  Double LinkedList. Filename:procfile.c > ---
	#include <stdio.h>
	#include <string.h>
	#include <malloc.h>
	#include <fcntl.h>
	#include "proc_file.h"

	DList *dblhead;
	DList *dbltail;

	void initDL(void)
	{
        dblhead = (DList *)malloc(sizeof(DList));
        dbltail = (DList *)malloc(sizeof(DList));
    
        dblhead->prev = dblhead;
        dblhead->next = dbltail;
        dbltail->prev = dblhead;
        dbltail->next = dbltail;
	}

	DList *searchDL(void *pzSearch)
	{
        DList *s;
    
        s = dblhead->next;
        while (s != dbltail)
        {
 		   	if (memcmp(s->pzKey, pzSearch, sizeof(pzSearch)) == 0)
 		   	    break;
            s = s->next;
        }
        return s;
	}

	DList *insertAsFirstDL(void *pzInsert)
	{
    	DList *p;

	    p = (DList *)malloc(sizeof(DList));
    	p->pzKey = pzInsert;
	    p->next = dblhead->next;
    	dblhead->next->prev = p;
	    dblhead->next = p;
    	p->prev = dblhead;

	    return p;
	}

	DList *insertAsLastDL(void *pzInsert)
	{
    	insertDL(pzInsert, dbltail);
	
		return (DList *)NULL;
	}

	DList *insertDL(void *pzInsert, DList *pIns) /* insert front node pIns */
	{
    	DList *s;
    
	    if (pIns == dblhead)
			return NULL;

	    s = (DList *)malloc(sizeof(DList));
    	s->pzKey = pzInsert;
	    pIns->prev->next = s;
    	s->prev = pIns->prev;
	    s->next = pIns;
    	pIns->prev = s;

	    return s;
	}

	DList *insertDLAsKey(void *pzInsert, void *pzSearch)
	{                                   /* insert insk front findk */
	    DList *s;
    	DList *r = NULL;

	    s = searchDL(pzSearch);
    	if (s != dbltail)
	    {
    	    r = (DList *)malloc(sizeof(DList));
        	r->pzKey = pzInsert;
	        s->prev->next = r;
    	    r->prev = s->prev;
	        r->next = s;
    	    s->prev = r;
    	}
	    return r;
	}

	DList *insertDLAsSort(void *pzInsert)
	{
    	DList *s;
    	DList *r;

	    s = dblhead->next;
    	while (s != dbltail)
	    {
			if (memcmp(s->pzKey, pzInsert, sizeof(pzInsert)) >= 0)
			    break;
	        s = s->next; 
    	}
    
	    r = (DList *)malloc(sizeof(DList));
    	r->pzKey = pzInsert;
	    s->prev->next = r;
    	r->prev = s->prev;
	    r->next = s;
    	s->prev = r;

	    return r;
	}

	int deleteDL(DList *pDel)
	{
    	if (pDel == dblhead || pDel == dbltail)
        	return FAIL;
	    pDel->prev->next = pDel->next;
    	pDel->next->prev = pDel->prev;
	    free(pDel);

	    return SUCCESS;
	}

	int deleteDLAsKey(void *pzSearch)
	{
    	DList *s;

	    s = searchDL(pzSearch);

    	if (s != dbltail)
	    {
    	    s->prev->next = s->next;
        	s->next->prev = s->prev;
	        free(s);
    	    return SUCCESS;
	    }
    	return FAIL;
	}

	void deleteAllDL(void)
	{
    	DList *s;
	    DList *p;

    	p = dblhead->next;
	    while (p != dbltail)
    	{
	        s = p;
    	    p = p->next;
        	free(s);
	    }

    	dblhead->next = dbltail;
	    dbltail->prev = dblhead;
	}

	void deletePerfectDL(void)
	{
    	DList *s;
	    DList *p;

	    p = dblhead->next;
    	while (p != dbltail)
	    {
    	    s = p;
        	p = p->next;
	        free(s);
    	}
	    free(dblhead);
    	free(dbltail);
	}

	void *printDL(DList *pPrint)
	{
    	pPrint = dblhead->next;
	    while (pPrint != dbltail)
    	{
        	printf("%s", (char *)(pPrint->pzKey));
	        pPrint = pPrint->next;
    	}

	    return pPrint->pzKey;
	}
------------------------------------------------------------------------

1.2. fileó ̺귯 

    ,  ߿ḮƮ ̿Ͽ Fileó غ .
     ⺻ algorithm  .

	< ḮƮ ̿ fileó algorithm 1.2.1 >
	1) file б 
	2)   оδ.
    3) о  Search ǿ ´ ˻Ѵ.
		3-1) ǿ  4) ̵.
		3-2)   ḮƮ node ϰ 2) ̵
    4) ǿ  ḮƮ node ó( Ȥ , ) 
	   ڿ Ѵ.
    5) ó   file ݴ´.
    6) file  .
    7) ޸𸮿 ϰ ִ ḮƮ    file 
	   printѴ.
    8) file ݴ´.

    ̷Ը   ذ   ̴.
    ׷Ƿ  source ׿  algorithm  ϰڴ.

	켱 algorithm 1.2.1 2) شϴ Լ .

	-------- < source 1.2.1 readOneLineSearchFile > -------------------
	int readOneLineSearchFile(char pszBuffer[], FILE *fp)
	{
    	int i = 0;
	    char c = '\0';
    
    	do
	    {
			c = getc(fp); /* file  ڸ оδ. */

        	pszBuffer[i++] = c; 
			/*  fileóԼ ϰԵ buffer  */
			/*  ڸ Ѵ. */

	        if (c == EOF || c == '\n') 
			/* ڰ file ̰ų ĳϰ̸ */
    	        break;                 
				/* loop . , ๮ڸ  */
	    } while (1);  /* ׶ ڸ  ۿ ϰ */
                      /* loop . */
    	pszBuffer[i] = '\0'; /* ۿ ִ ๮ڳ EOF Ѵ. */
	    nLine++; /* file line üũϱ  ܺκ̴. */
                 /*   а 1 Ų. */

	    return c;     /* ๮'\n', Ȥ EOF return ̴. */
	}
	-------------------------------------------------------------------

	 ḮƮ  file Ʈϴ Լ غ .
	ḮƮ  Լ   ٿ .
	ϹǷ ϱ⵵  ̴.

	--------------- < source 1.2.2 printToFileDL > -------------------
	void *printToFileDL(DList *pPrint, FILE *fp)
	{
    	pPrint = dblhead->next; /* node pPrint ʱȭѴ. */
	    while (pPrint != dbltail) /* pPrint    ݺؼ */
    	{
	        fprintf(fp, pPrint->pzKey); /* file ƮѴ. */
    	    pPrint = pPrint->next; /* node  ̵ */
	    }

    	return pPrint->pzKey; 
	}
	-------------------------------------------------------------------

	Ʒ Ұ source 1.2.3 ٷ   algorithm  ƾ̴.
	Code line   شϴ algorithm ȣ ǥسڴ.
	 Լ file(pszFileName) Ư ڿ(pszSearch) ִ 
	 ã   °  ڿ(pszInsert) ٲٴ Լ̴.
	 ˻ ڿ ߰ߵ  file ƹ ȭ Ͼ ʴ´.

	--------------- < source 1.2.3 insertStrToFile > -------------------
	void insertStrToFile(char *pszInsert, char *pszSearch, char *pszFileName, 
						 int nMaxLine, int nMaxCol) 
	{
        int i = 0;
        FILE *fp;
        char *pszBuffer[nMaxLine];
		/* nMaxLine nMaxCol ڷ δ  ޸𸮸 ϱ */
		/* ؼ̴.  pszBuffer ͺ   */
		/* ʱ ؼε,     ԵǸ  */
		/* ׷ ׻ nMaxLine*nMaxCol byteŭ ޸𸮸 ϰ */
		/* ǹǷ ޸   ʷ  ִ  ִ.*/
		/*  ƾ file ִ line ִ coloum ڷ */
		/* ޾Ƽ   ŭ شǴ ޸𸮸 ҴϿ ش. */
		/* ̷ ó  ޸ 뷮,  ƾ Ǿ */
		/*   nMaxLine*nMaxCol byteŭ ޸𸮿 Ҵ Ǳ⶧ */
		/* , ⺻޸𸮰 ū linuxýۿ     */
		/*  ִ. */
        
        nLine = 0;
    
        fp = fopen(pszFileName, "r"); /* algor 1) file б . */
        if (fp == NULL) /* file  ʴ´ٸ ƹó  . */
 	   		return;
        
        for (i = 0; i < nMaxLine; i++)
        {
 		   	pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
            memset(pszBuffer[i], '\0', nMaxCol);
        }
    
        initDL(); /* double linkedlist ʱȭѴ. */
        for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
		/* algor 2) fileκ Ѷ(pszBuffer[i]) оδ. */
        {
			/* algor 3-2) о (pszBuffer[i]) ˻ ڿ */
			/* (pszSearch) ϰ  ʴٸ */
 		   	if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
			/* algor 3-2) node   for (i = 0; ~) ̵  */
			/*  оδ.(algor 2) */
        	        insertAsLastDL(pszBuffer[i]);
	 	   	else /* algor 3-1) ˻ ڿ ԵǾִٸ */
			/* algor 4) ˻ ڿ Ե line  ڿ  */
			/* ḮƮ Ѵ. */
 		       	insertAsLastDL(pszInsert);
        }
		/*   for ƾ ˻ ڿ ߰ߵ ʴ´ٸ ḮƮ */
		/*  file    ִ node鸸  ̴. */
		/* ̷ ¿ ٷ Ʒ printToFileDLԼ ȣϰ Ǹ */
		/* file  ƹ͵  鼭  fileü   */
		/* ϰ Ǵ ̴. */

        fclose(fp); /* algor 5) file ݴ´. */
        fp = fopen(pszFileName, "w"); /* algor 6) file  . */
        printToFileDL(dblhead->next, fp); /* algor 7) ޸𸮿 ϰ */
										  /* ִ ḮƮ   */
										  /*   file printѴ.*/
        deletePerfectDL(); /* ḮƮ ʱȭ Ҵߴ ޸𸮸 ȸѴ.*/
        fclose(fp); /* algor 8) file ݴ´. */
        for (i = 0; i < nMaxLine; i++) /* ۿ Ҵߴ ޸𸮸 (ȸ)*/
 	   		free(pszBuffer[i]);
	}
	-------------------------------------------------------------------

	߿ḮƮ  ˰ִٸ ϱⰡ   ̴.
	 Լ  ߴٸ  Ѿ ϹǷ öϰ ϱ
	ٶ.  Լ ӻ ΰ ִ. 
	ù°, Ưڿ ٲٱ.
	ι°, Ưڿ   .
	⼭ ι°ӻ  . Ưڿ(pszSearch)  line 
	  ؾұ? ʹ  ̴.
	 pszInsert "", , 鹮ڿ Ѱָ ȴ.
	 Լ Ư file ӽϷ ϴ   ٷ  file 
	. ӽϷ ϴ Ͱ ޸𸮿 ϴ    ִµ
	׿    ʾƵ  ƽø ϴ´.
	strstrԼ   man ϰų library ޴ ϱ
	ٶ.

	  Լ  Լ   ణ ٸ.  Լ
	 ˻ڿ(pszSearch)   ƹϵ Ͼ   Լ
	 ڿ ˻  file    ڿ(pszInsert) 
	ְ ȴ. 
	˻ ڿ  ˻ȴٸ ٷ ƹ  ʰ ƾ .
	κ   Ƿ ο ָؾ κи Comment
	ϰڴ.

	--------------- < source 1.2.4 insertStrToFileLast > -------------------
	void insertStrToFileLast(char *pszInsert, char *pszSearch, 
							 char *pszFileName, int nMaxLine, int nMaxCol)
	{
    	char *pszBuffer[nMaxLine];
		int i = 0, j;
    	FILE *fp;
    
	    nLine = 0;

    	fp = fopen(pszFileName, "r");
	    if (fp == NULL)
			return;
    
	    for (i = 0; i < nMaxLine; i++)
    	{
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
    	}

	    initDL();
    	for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
	    {
			if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
        	    insertAsLastDL(pszBuffer[i]);
			else /* ˻ ڿ(pszSearch) ˻ ȴٸ ƾ . */
			{
        	    for (j = 0; j < nMaxLine; j++)
		        	free(pszBuffer[j]);
		    	fclose(fp);
			    deletePerfectDL();

			    return;
			}
	    }
		/*  ڿ(pszSearch) ˻ ʾҴٸ ̺κ Ѿ */
		/* ȴ.   ٷ Ʒ   ڿ ḮƮ  */
		/* 忡  Ű file ƮѴ. */
	    insertAsLastDL(pszInsert);
    	fclose(fp);
	    fp = fopen(pszFileName, "w");
    	printToFileDL(dblhead->next, fp);
	    deletePerfectDL();
    	fclose(fp);
	    for (j = 0; j < nMaxLine; j++)
    	    free(pszBuffer[j]);
	}
	-------------------------------------------------------------------
	
	̹  Լ file Ưڿ ã  ڿ ϴ 
	ڿ ٲپִ Լ̴.
	  insertStrToFileԼʹ ٸ  Ѵ.
	, insertStrToFileԼ line ڿ , ϴ ݸ
	changeStrToOneLineToFileԼ ڿ ϴ Լ̴.
	⺻ algorithm < algorithm 1.2.1 > ǰѴ.
	    ߴٸ  Լ    ̴.
	 Լ changeSearchStr̶ Լ callϴµ, changeSearchStr
	Լ  ־ ڿ(pszLine) Ưڿ(pszSearch) ã
	 ڿ(pszIns) ٲٴ  Ѵ.  (pszLine) 
	 Ưڿ(pszSearch)   Ƿ ȣ(recursive 
	call) ߴ. ⺻ C ˰ִٸ ƾ ü ϱ
	 ̶ ϴ´.
	  ߺǴ Comment ϰڴ.

	-------- < source 1.2.5 changeStrToOneLineToFile > -----------
	void changeSearchStr(char *pszIns, char *pszSearch, char *pszLine, 
						 char *pszSave, int nMaxCol)
	/* ⼭   pszSave ٲ   ̴. */
	{
	    int i = 0;
		char *pszPos;
		int nPos;
	
		/* (pszLine) ˻ڿ(pszSearch) ġ ϱ */
		/*  ˻ڿ pszLine  ġ صд. */
		pszPos = (char *)strstr(pszLine, pszSearch);
		/* ˻ڿ ġ Ѵ. */
		nPos = pszPos-pszLine;
		/* ˻ڿ ġ(nPos) pszSave pszLine   */
		for (i = 0; i < nPos; i++)
			pszSave[i] = pszLine[i];
		/*  (pszSave) ٲ ڿ(pszIns) .*/
		strcat(pszSave, pszIns);
		/*  (pszSave)   ڿ . */
		strcat(pszSave, pszLine+nPos+strlen(pszSearch));
		/* ̻ ˻ڿ(pszSearch) */
		pszPos = (char *)strstr(pszSave, pszSearch);
		/*  ʴ´ٸ ƾ . */
		if (pszPos == NULL)
			return;
		memset(pszLine, '\0', nMaxCol);
		/* ٲ (pszSave)  ο Ѵ. */
		strcpy(pszLine, pszSave);
		/* ȣ  pszSave ʱȭѴ. */
		memset(pszSave, '\0', nMaxCol);
		/* ù°  ˻ڿ ٲپǷ ι°, ° */
		/*  ڿ ٲٱ  ȣ Ѵ. */
		changeSearchStr(pszIns, pszSearch, pszLine, pszSave, nMaxCol);
	}
	/*   ο  ڿƾ Ƿ  Լ  */
	/* file  ξ о鿩 ڷ Ѱָ ȴ. */

	void changeStrToOneLineToFile(char *pszIns, char *pszSearch, 
						char *pszFileName, int nMaxLine, int nMaxCol)
	{
	    int i = 0, j = 0;
    	FILE *fp;
		/* pszLine ٲ ڿ  ̴. */
	    char *pszLine[nMaxLine];
    	char *pszBuffer[nMaxLine];
    
	    nLine = 0;

	    fp = fopen(pszFileName, "r");
    	if (fp == NULL)
			return;
    
	    for (i = 0; i < nMaxLine; i++)
    	{
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
			pszLine[i] = (char *)malloc(sizeof(char)*nMaxCol);
	       	memset(pszLine[i], '\0', nMaxCol);
    	}

	    initDL();
    	for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
		/*  ξ о鿩 */
    	{
			/* ˻ڿ(pszSearch) ٸ ḮƮ Ѵ.*/
			if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
            	insertAsLastDL(pszBuffer[i]);
			/* ˻ڿ ִٸ changeSearchStrԼ ̿ ˻ڿ */
			/* Ե  ϰ   ḮƮ Ѵ. */
			else
			{
				changeSearchStr(pszIns, pszSearch, pszBuffer[i], pszLine[j], 
								nMaxCol);
            	insertAsLastDL(pszLine[j]);
				j++;
			}
	    }

    	fclose(fp);
		/* file  */
	    fp = fopen(pszFileName, "w");
    	printToFileDL(dblhead->next, fp);
	    deletePerfectDL();
    	fclose(fp);
	    for (i = 0; i < nMaxLine; i++)
		{
			free(pszBuffer[i]);
			free(pszLine[i]);
		}
	}
	-------------------------------------------------------------------

	ܷ  ̴. Ư (, , , ) 
	 Լ     ׻ .
	̴ ḮƮ    ֵ Ư¡ ϳ
	̴. , ϱ   ϰ,   ߿ 뼺
	ִٴ ̴.

	̹  source  ణ ؼ ȭ file ó
	ƾ ۼغ .
	Ʒ Լ ˻ڿ(pszSearch) file(pszFileName) ٸ
	 ڿ(pszInsert)  ϰ ˻ڿ 
	ٸ  ˻ڿ    ڿ ٲٴ Լ
	.  Լ ٸ ִٸ  Լ flag ξٴ 
	̴.  flag file ˻  Թڿ ٲ  
	ϸ ׳ Թڿ δ   Ѵ. 
	 ڿ ˻ ʴ´ٸ flag TRUE settingȴ.

	-------- < source 1.2.6 addOnNotExistChangeOnExist > -----------
	void addOnNotExistChangeOnExist(char *pszIns, char *pszSearch, 
						char *pszFileName, int nMaxLine, int nMaxCol)
	{
    	int i = 0;
	    FILE *fp;
		/*   Ȥ   flag(flgAdd) */
    	int flgAdd = TRUE;
	    char *pszBuffer[nMaxLine];

	    nLine = 0;

    	fp = fopen(pszFileName, "r");
	    if (fp == NULL)
			return;
	    for (i = 0; i < nMaxLine; i++)
    	{
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
    	    memset(pszBuffer[i], '\0', nMaxCol);
	    }

    	initDL();
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    	{
			if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
            	insertAsLastDL(pszBuffer[i]);
			/*  ˻ڿ(pszSearch) ˻ȴٸ */
			else
			{
				/* Թڿ(pszIns) node ϰ */
			    insertAsLastDL(pszIns);
				/* flag FALSE resetŲ. */
	    		flgAdd = FALSE;
			}
    	}
	    fclose(fp);
		/* flag TRUE ˻ڿ ߰ߵ ʾҴٴ ̹Ƿ */
		/* ũƮ  node Թڿ Ѵ. */
    	if (flgAdd == TRUE)
        	insertAsLastDL(pszIns);
		/* file  */
	    fp = fopen(pszFileName, "w");
    	printToFileDL(dblhead->next, fp);
	    deletePerfectDL();
    	fclose(fp);
	    for (i = 0; i < nMaxLine; i++)
			free(pszBuffer[i]);
	}
	-------------------------------------------------------------------

	ϰ ٸ ߰ Ȥ   ٲپҴ.
	 ϰԵ  fileó Լ  ̷̴.
	 routine Ͽ  source غñ⸦...

	ʹ  routine  ڰ س  procedure
	 Ѳ ֱ ϰڴ. ׸  ǵ  ַ 
	ڴ.    ߴٸ ٸ Comment̵   
	 ̴.
	
	-------- < source 1.2.7 total functions > -----------

	/**************** proc_file.h *****************/
	#include <stdio.h>

	#ifndef _LINKLIST_H_
	#define _LINKLIST_H_

	#ifndef SUCCESS
	#define SUCCESS                 1
	#define FAIL                    0
	#endif

	#ifndef TRUE                    
	#define TRUE                    1
	#define FALSE                   0
	#endif

	#ifndef _DOUBLE_LINKLIST_
	#define _DOUBLE_LINKLIST_
	typedef struct tagDOUBLELINK {
	    void *pzKey;

	    struct tagDOUBLELINK *next;
	    struct tagDOUBLELINK *prev;
	} DList;

	void   initDL(void);
	DList *searchDL(void *pzSearch);
	DList *insertAsFirstDL(void *pzInsert);
	DList *insertDL(void *pzInsert, DList *pIns);  /* insert front node p */
	DList *insertDLAsKey(void *pzInsert, void *pzSearch);
	DList *insertDLAsSort(void *pzInsert);
	int    deleteDL(DList *pDel);
	int    deleteDLAsKey(void *pzSearch);
	void   deleteAllDL(void);
	void   deletePerfectDL(void);
	void  *printDL(DList *pPrint);

	void   deleteStrFromOneLine(char *pszSave, char *pszDel, char *pszLine);
	void   insertStrForeSearch(char *pszSave, char *pszInsert, 
					char *pszSearch, char *pszLine, char *pszTempLine);
	void   insertStrToOneLine(char *pszSave, char *pszIns, char *pszLine);
	void   changeSearchStr(char *pszIns, char *pszSearch, char *pszLine, 
						char *pszSave, int nMaxCol);
	void  *printToFileDL(DList *pPrint, FILE *fp);
	int    readOneLineSearchFile(char pszBuffer[], FILE *fp);
	void   insertStrToFile(char *pszInsert, char *pszSearch, 
					char *pszFileName, int nMaxLine, int nMaxCol);
	void   insertStrToFileLast(char *pszInsert, char *pszSearch, 
					char *pszFileName, int nMaxLine, int nMaxCol);
	int    countAllLineToFile(char *pszFileName, int nMaxLine, int nMaxCol);
	int    countSearchLineToFile(char *pszSearch, char *pszFileName, 
					int nMaxLine, int nMaxCol);
	int    saveAllLineToFile(char *pszSaveListStr[], char *pszFileName, 
					int nMaxLine, int nMaxCol);
	int    saveSearchLineToFile(char *pszSearch, char *pszSaveListStr[], 
					char *pszFileName, int nMaxLine, int nMaxCol);
	int    saveSearchLineToFileWithoutComment(char *pszSearch, 
					char *pszSaveListStr[], char cComment, 
					char *pszFileName, int nMaxLine, int nMaxCol);
	void   changeStrToOneLineToFile(char *pszIns, char *pszSearch, 
					char *pszFileName, int nMaxLine, int nMaxCol);
	void   insertStrToOneLineToFile(char *pszIns, char *pszSearch, 
					char *pszFileName, int nMaxLine, int nMaxCol);
	void   deleteStrToOneLineToFile(char *pszDel, char *pszSearch, 
					char *pszFileName, int nMaxLine, int nMaxCol);
	int    searchStrInFile(char *pszSearch, char *pszFileName, 
					int nMaxLine, int nMaxCol);
	void   addOnNotExistChangeOnExist(char *pszIns, char *pszSearch, 
					char *pszFileName, int nMaxLine, int nMaxCol);
	void   addOnNotExistChangeOnExistWithoutComment(char *pszIns, 
					char *pszSearch, char cComment, char *pszFileName, 
					int nMaxLine, int nMaxCol);
	void   addOnNotExistChangeOnExist2Search(char *pszIns, 
					char *pszFirstSearch, char *pszSecondSearch, 
					char *pszFileName, int nMaxLine, int nMaxCol);
	void   insertForeSearchToFile(char *pszInsert, char *pszSearch, 
					char *pszFileName, int nMaxLine, int nMaxCol);
	void   attatchStrToFileLine(char *pszInsert, char *pszSearch, 
					char *pszFileName, int nMaxLine, int nMaxCol);
	void   saveStrIdxToFileLine(char *pszSave, char *pszSearch, 
					char *pszFileName, int nStartIdx, int nEndIdx, 
					int nMaxLine, int nMaxCol);
	void   changeStrIdxToFileLine(char *pszInsert, char *pszSearch, 
					char *pszFileName, int nStartIdx, int nEndIdx, 
					int nMaxLine, int nMaxCol);
	void   attatchStrIdxToFileLine(char *pszInsert, char *pszSearch, 
					char *pszFileName, int nIdx, int nMaxLine, int nMaxCol);
	void   attatchStrToFileIdxLine(char *pszInsert, char *pszFileName, 
					int nLineIdx, int nColIdx, int nMaxLine, int nMaxCol);
	void   saveBetweenStrToFile(char *pszSaveLine[], char *pszStartLine, 
					char *pszEndLine, char *pszFileName, 
					int nMaxLine, int nMaxCol);
	void   changeBetweenStrToFile(char *pszInsert[], int nInsertNum, 
					char *pszStartLine, char *pszEndLine, 
					char *pszFileName, int nMaxLine, int nMaxCol);
	void   insertAfterStrToFile(char *pszInsert, char *pszStartLine, 
					char *pszFileName, int nMaxLine, int nMaxCol);

	#endif

	#endif
	/**********************************************/

	/**************** proc_file.c *****************/
	#include <stdio.h>
	#include <string.h>
	#include <malloc.h>
	#include <fcntl.h>
	#include "proc_file.h"

	DList *dblhead;
	DList *dbltail;

	void initDL(void)
	{
    	dblhead = (DList *)malloc(sizeof(DList));
    	dbltail = (DList *)malloc(sizeof(DList));

    	dblhead->prev = dblhead;
    	dblhead->next = dbltail;
    	dbltail->prev = dblhead;
    	dbltail->next = dbltail;
	}

	DList *searchDL(void *pzSearch)
	{
        DList *s;
    
	    s = dblhead->next;
	    while (s != dbltail)
        {
    		if (memcmp(s->pzKey, pzSearch, sizeof(pzSearch)) == 0)
		    break;
	        s = s->next;
	    }
        return s;
    }

	DList *insertAsFirstDL(void *pzInsert)
	{
        DList *p;
    
	    p = (DList *)malloc(sizeof(DList));
	    p->pzKey = pzInsert;
        p->next = dblhead->next;
        dblhead->next->prev = p;
	    dblhead->next = p;
	    p->prev = dblhead;
	
        return p;
    }
	
	DList *insertAsLastDL(void *pzInsert)
    {
        insertDL(pzInsert, dbltail);
		
		return (DList *)NULL;
    }
    
	DList *insertDL(void *pzInsert, DList *pIns) /* insert front node pIns */
	{
	    DList *s;
        
        if (pIns == dblhead)
		return NULL;
	
	    s = (DList *)malloc(sizeof(DList));
        s->pzKey = pzInsert;
        pIns->prev->next = s;
	    s->prev = pIns->prev;
	    s->next = pIns;
        pIns->prev = s;
    
	    return s;
	}
	
    DList *insertDLAsKey(void *pzInsert, void *pzSearch)
    {                                   /* insert insk front findk */
	    DList *s;
	    DList *r = NULL;
    
        s = searchDL(pzSearch);
	    if (s != dbltail)
	    {
            r = (DList *)malloc(sizeof(DList));
            r->pzKey = pzInsert;
	        s->prev->next = r;
	        r->prev = s->prev;
	        r->next = s;
            s->prev = r;
        }
	    return r;
	}

	DList *insertDLAsSort(void *pzInsert)
	{
        DList *s;
        DList *r;
	
	    s = dblhead->next;
        while (s != dbltail)
        {
			if (memcmp(s->pzKey, pzInsert, sizeof(pzInsert)) >= 0)
			    break;
	        s = s->next; 
        }
        
	    r = (DList *)malloc(sizeof(DList));
	    r->pzKey = pzInsert;
        s->prev->next = r;
        r->prev = s->prev;
	    r->next = s;
	    s->prev = r;
    
        return r;
	}
	
	int deleteDL(DList *pDel)
    {
        if (pDel == dblhead || pDel == dbltail)
	        return FAIL;
	    pDel->prev->next = pDel->next;
	    pDel->next->prev = pDel->prev;
        free(pDel);
    
	    return SUCCESS;
	}
    
    int deleteDLAsKey(void *pzSearch)
	{
	    DList *s;
	
        s = searchDL(pzSearch);
    
	    if (s != dbltail)
	    {
            s->prev->next = s->next;
            s->next->prev = s->prev;
	        free(s);
	        return SUCCESS;
        }
        return FAIL;
	}
	
	void deleteAllDL(void)
    {
        DList *s;
	    DList *p;
	
	    p = dblhead->next;
	    while (p != dbltail)
        {
            s = p;
	        p = p->next;
	        free(s);
        }
    
	    dblhead->next = dbltail;
	    dbltail->prev = dblhead;
	}
    
    void deletePerfectDL(void)
	{
	    DList *s;
        DList *p;
    
	    p = dblhead->next;
	    while (p != dbltail)
        {
            s = p;
	        p = p->next;
	        free(s);
	    }
        free(dblhead);
        free(dbltail);
	}
	
	void *printDL(DList *pPrint)
    {
        pPrint = dblhead->next;
	    while (pPrint != dbltail)
	    {
            printf("%s", (char *)(pPrint->pzKey));
            pPrint = pPrint->next;
	    }
	
	    return pPrint->pzKey;
    }
    
	/****** FILE procedure ******/
	
	/*  ο ˻ڿ(pszDel) . */
    void deleteStrFromOneLine(char *pszSave, char *pszDel, char *pszLine)
    {
	    char *pszPnt;
	    int i, nFirstLen;
        
        if ((pszPnt = (char *)strstr(pszLine, pszDel)) == NULL)
			return;
	    nFirstLen = pszPnt-pszLine;
	    for (i = 0; i < nFirstLen; i++)
    		pszSave[i] = pszLine[i];
        for (i = nFirstLen; pszLine[i+strlen(pszDel)] != '\0'; i++) 
			pszSave[i] = pszLine[i+strlen(pszDel)];
	    pszSave[i] = '\0';
	}
	
	/*  ο ˻ڿ(pszSearch)տ Թڿ(pszInsert) */
	/*  Ѵ. */
    void insertStrForeSearch(char *pszSave, char *pszInsert,
    	char *pszSearch, char *pszLine, char *pszTempLine)
	{
	    int i = 0;
        int nLen;
        char *pszPos;
	    
	    if ((char *)strstr(pszLine, pszInsert) != NULL)
	    {
    		strcat(pszSave, pszTempLine);
    		return;
	    }
	    pszPos = (char *)strstr(pszLine, pszSearch);
        nLen = pszPos-pszLine;
        for (i = 0; i < nLen; i++)
			pszSave[i] = pszLine[i];
	    strcat(pszSave, pszInsert);
        strcat(pszSave, strstr(pszLine, pszSearch));
    }
	
	/*  ο ˻ڿ(pszIns) ִٸ returnϰ ٸ */
	/*   ˻ڿ Ѵ. */
	void insertStrToOneLine(char *pszSave, char *pszIns, char *pszLine)
	{
        int nFirstPos, nSecondPos;
        
	    if ((char *)strstr(pszLine, pszIns) != NULL)
			return;
	    for (nFirstPos = 0; nFirstPos < strlen(pszLine); nFirstPos++)
    		pszSave[nFirstPos] = pszLine[nFirstPos];
        for (nSecondPos = 0; nSecondPos < strlen(pszIns); nSecondPos++)
			pszSave[nSecondPos+nFirstPos] = pszIns[nSecondPos];
	    pszSave[nSecondPos+nFirstPos] = '\0';
    }
        
	void changeSearchStr(char *pszIns, char *pszSearch, char *pszLine, 
						 char *pszSave, int nMaxCol)
	{
	    int i = 0;
    	char *pszPos;
    	int nPos;
		
		pszPos = (char *)strstr(pszLine, pszSearch);
    	nPos = pszPos-pszLine;
    	for (i = 0; i < nPos; i++)
			pszSave[i] = pszLine[i];
		strcat(pszSave, pszIns);
    	strcat(pszSave, pszLine+nPos+strlen(pszSearch));
    	pszPos = (char *)strstr(pszSave, pszSearch);
		if (pszPos == NULL)
			return;
		memset(pszLine, '\0', nMaxCol);
    	strcpy(pszLine, pszSave);
    	memset(pszSave, '\0', nMaxCol);
		changeSearchStr(pszIns, pszSearch, pszLine, pszSave, nMaxCol);
	}
	
	int nLine;
    
    void *printToFileDL(DList *pPrint, FILE *fp)
	{
	    pPrint = dblhead->next;
        while (pPrint != dbltail)
        {
	        fprintf(fp, pPrint->pzKey);
	        pPrint = pPrint->next;
	    }
    
        return pPrint->pzKey;
	}
	
    int readOneLineSearchFile(char pszBuffer[], FILE *fp)
    {
	    int i = 0;
	    char c = '\0';
        
        do
	    {
			c = getc(fp);
	
            pszBuffer[i++] = c;
    
	        if (c == EOF || c == '\n')
	            break;
	    } while (1);
    
        pszBuffer[i] = '\0';
	    nLine++;
	
        return c;
    }
	
	void insertStrToFileLast(char *pszInsert, char *pszSearch, 
					char *pszFileName, int nMaxLine, int nMaxCol)
	{
        char *pszBuffer[nMaxLine];
        int i = 0, j;
	    FILE *fp;
	    
        nLine = 0;
    
	    fp = fopen(pszFileName, "r");
	    if (fp == NULL)
    		return;
        
	    for (i = 0; i < nMaxLine; i++)
	    {
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
            memset(pszBuffer[i], '\0', nMaxCol);
        }
	
	    initDL();
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
	    {
    		if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
                insertAsLastDL(pszBuffer[i]);
			else
			{
                for (j = 0; j < nMaxLine; j++)
	    	        free(pszBuffer[j]);
		    	fclose(fp);
			    deletePerfectDL();
	
    		    return;
    		}
	    }
	    insertAsLastDL(pszInsert);
        fclose(fp);
        fp = fopen(pszFileName, "w");
	    printToFileDL(dblhead->next, fp);
	    deletePerfectDL();
        fclose(fp);
        for (j = 0; j < nMaxLine; j++)
	        free(pszBuffer[j]);
	}
	
	/* file μ returnѴ. */
    int countAllLineToFile(char *pszFileName, int nMaxLine, int nMaxCol)
    {
	    char *pszBuffer[nMaxLine];
	    int i = 0, nCount = 0;
	    FILE *fp;
        
        nLine = 0;
	
	    fp = fopen(pszFileName, "r");
        if (fp == NULL)
    		return 0;
	    for (i = 0; i < nMaxLine; i++)
	    {
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
            memset(pszBuffer[i], '\0', nMaxCol);
        }
	   
	    for (nCount = 0; 
			 (readOneLineSearchFile(pszBuffer[nCount], fp) != EOF) && 
			 (nCount < nMaxLine); nCount++);
    	fclose(fp);
        for (i = 0; i < nMaxLine; i++)
			free(pszBuffer[i]);
	
        return nCount;
    }
	
	/* file ˻ڿ(pszSearch) ִ line  returnѴ. */
	int countSearchLineToFile(char *pszSearch, char *pszFileName, 
							  int nMaxLine, int nMaxCol)
	{
        char *pszBuffer[nMaxLine];
        int i = 0;
	    int nCount = 0;
	    FILE *fp;
    
	    nLine = 0;
	
        fp = fopen(pszFileName, "r");
        if (fp == NULL)
			return 0;
	    for (i = 0; i < nMaxLine; i++)
        {
    		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
	    }
	   
        for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        {
			if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
		    nCount++;
        }
        fclose(fp);
	    for (i = 0; i < nMaxLine; i++)
			free(pszBuffer[i]);
    
        return nCount;
	}
	
	/* file   (pszSaveListStr) Ѵ. */
	int saveAllLineToFile(char *pszSaveListStr[], char *pszFileName, 
						  int nMaxLine, int nMaxCol)
    {
        char *pszBuffer[nMaxLine];
	    int i = 0, j;
	    FILE *fp;
	    
        nLine = 0;
        fp = fopen(pszFileName, "r");
	    if (fp == NULL)
			return 0;
        
        for (j = 0; j < nMaxLine; j++)
	    {
			pszBuffer[j] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[j], '\0', nMaxCol);
        }
    
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
			strcpy(pszSaveListStr[i], pszBuffer[i]);
        
        fclose(fp);
	    for (j = 0; j < nMaxLine; j++)
			free(pszBuffer[j]);
    
        return i;
	}
	
	/* file ˻ڿ(pszSearch) ִ line Comment(cComment) */
	/* ٸ (pszSaveListStr) Ѵ. */
	int saveSearchLineToFileWithoutComment(char *pszSearch, 
					char *pszSaveListStr[], char cComment, 
					char *pszFileName, int nMaxLine, int nMaxCol)
    {
        int i = 0;
	    int j = 0;
	    FILE *fp;
	    char *pszBuffer[nMaxLine];
	    
        nLine = 0;
    
	    if ((fp = fopen(pszFileName, "r")) == NULL)
			return FALSE;
        
        for (i = 0; i < nMaxLine; i++)
	    {
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
        }
       
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
	    {
    		if ((char *)strstr(pszBuffer[i], pszSearch) != NULL && 
				pszBuffer[i][0] != cComment)
    		{
		    	strcpy(pszSaveListStr[j], pszBuffer[i]);
			    j++;
    		}
        }
	
	    fclose(fp);
	    
        for (i = 0; i < nMaxLine; i++)
    		free(pszBuffer[i]);
		
		return TRUE;
	}
    
	/* file ˻ڿ(pszSearch) ִ line Comment(cComment)  */
	/*  (pszSaveListStr) Ѵ. */
    int saveSearchLineToFile(char *pszSearch, char *pszSaveListStr[], 
						char *pszFileName, int nMaxLine, int nMaxCol)
	{
	    int i = 0;
        int j = 0;
        FILE *fp;
	    char *pszBuffer[nMaxLine];
	    
	    nLine = 0;
    
        if ((fp = fopen(pszFileName, "r")) == NULL)
			return FALSE;
	    
        for (i = 0; i < nMaxLine; i++)
        {
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
        }
       
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
	    {
			if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
    		{
    	    	strcpy(pszSaveListStr[j], pszBuffer[i]);
			    j++;
			}
	    }
	
        fclose(fp);
        
	    for (i = 0; i < nMaxLine; i++)
			free(pszBuffer[i]);
    	
    	return TRUE;
	}
	
	void changeStrToOneLineToFile(char *pszIns, char *pszSearch, 
					char *pszFileName, int nMaxLine, int nMaxCol)
    {
        int i = 0, j = 0;
	    FILE *fp;
	    char *pszLine[nMaxLine];
        char *pszBuffer[nMaxLine];
        
	    nLine = 0;
	
        fp = fopen(pszFileName, "r");
        if (fp == NULL)
			return;
	    
	    for (i = 0; i < nMaxLine; i++)
        {
    		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
			pszLine[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszLine[i], '\0', nMaxCol);
        }
    
	    initDL();
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        {
    		if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
	            insertAsLastDL(pszBuffer[i]);
			else
			{
    			changeSearchStr(pszIns, pszSearch, pszBuffer[i], 
								pszLine[j], nMaxCol);
                insertAsLastDL(pszLine[j]);
				j++;
			}
        }
    
	    fclose(fp);
	    fp = fopen(pszFileName, "w");
        printToFileDL(dblhead->next, fp);
        deletePerfectDL();
	    fclose(fp);
	    for (i = 0; i < nMaxLine; i++)
		{
    		free(pszBuffer[i]);
    		free(pszLine[i]);
		}
	}

	/* ˻ڿ(pszSearch) ִ ο ˻ڿ ٷ */
	/* տ Թڿ(pszIns) Ѵ. */
	void insertStrToOneLineToFile(char *pszIns, char *pszSearch, 
					char *pszFileName, int nMaxLine, int nMaxCol)
	{
        int i = 0;
        FILE *fp;
	    char pszLine[nMaxCol];
	    char *pszBuffer[nMaxLine];
        
        memset(pszLine, '\0', nMaxCol);
	    nLine = 0;
	
        fp = fopen(pszFileName, "r");
        if (fp == NULL)
		return;
	    
	    for (i = 0; i < nMaxLine; i++)
        {
    		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
	    }

	    initDL();
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        {
    		if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
	            insertAsLastDL(pszBuffer[i]);
			else
    		{
                insertStrForeSearch(pszLine, pszIns, pszSearch, pszBuffer[i], 
									pszBuffer[i]);
	            insertAsLastDL(pszLine);
			}
	    }
    
        fclose(fp);
	    fp = fopen(pszFileName, "w");
	    printToFileDL(dblhead->next, fp);
        deletePerfectDL();
        fclose(fp);
	    for (i = 0; i < nMaxLine; i++)
			free(pszBuffer[i]);
    }
    
	/* file ˻ڿ(pszSearch) ã  ڿ ش. */
	void deleteStrToOneLineToFile(char *pszDel, char *pszSearch, 
					char *pszFileName, int nMaxLine, int nMaxCol)
	{
	    int i = 0;
        FILE *fp;
        char pszLine[nMaxCol];
	    char *pszBuffer[nMaxLine];
	    
	    memset(pszLine, '\0', nMaxCol);
        nLine = 0;
    
	    fp = fopen(pszFileName, "r");
	    	if (fp == NULL)
    			return;
        
	    for (i = 0; i < nMaxLine; i++)
	    {
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
            memset(pszBuffer[i], '\0', nMaxCol);
        }
	
	    initDL();
        for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        {
			if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
	            insertAsLastDL(pszBuffer[i]);
    		else
    		{
	            deleteStrFromOneLine(pszLine, pszDel, pszBuffer[i]);
	            insertAsLastDL(pszLine);
			}
        }
        fclose(fp);
	
	    fp = fopen(pszFileName, "w");
	    printToFileDL(dblhead->next, fp);
	    deletePerfectDL();
        fclose(fp);
        for (i = 0; i < nMaxLine; i++)
			free(pszBuffer[i]);
	}
    
    void insertStrToFile(char *pszInsert, char *pszSearch, char *pszFileName, 
						 int nMaxLine, int nMaxCol) 
	{
	    int i = 0;
	    FILE *fp;
        char *pszBuffer[nMaxLine];
        
	    nLine = 0;
	
        fp = fopen(pszFileName, "r");
        if (fp == NULL)
			return;
	    
        for (i = 0; i < nMaxLine; i++)
        {
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
	    }
    
        initDL();
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
	    {
			if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
                insertAsLastDL(pszBuffer[i]);
    		else
		    	insertAsLastDL(pszInsert);
	    }
        fclose(fp);
        fp = fopen(pszFileName, "w");
	    printToFileDL(dblhead->next, fp);
	    deletePerfectDL();
	    fclose(fp);
        for (i = 0; i < nMaxLine; i++)
    		free(pszBuffer[i]);
	}
	
	/* file ˻ڿ(pszSearch)  TRUE, */
	/*  FALSE returnѴ. */
    int searchStrInFile(char *pszSearch, char *pszFileName, 
						int nMaxLine, int nMaxCol) 
    {
	    int i = 0;
	    FILE *fp;
        char *pszBuffer[nMaxLine];
        
	    nLine = 0;
	
	    fp = fopen(pszFileName, "r");
        if (fp == NULL)
    		return FALSE;
	
	    for (i = 0; i < nMaxLine; i++)
	    {
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
            memset(pszBuffer[i], '\0', nMaxCol);
        }
	
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        {
    		if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
			{
	            for (i = 0; i < nMaxLine; i++)
		    	    free(pszBuffer[i]);
    
                fclose(fp);
			    return TRUE;
			}
        }
        fclose(fp);
	
	    for (i = 0; i < nMaxLine; i++)
    		free(pszBuffer[i]);
    
	    return FALSE;
	}
	
    void addOnNotExistChangeOnExist(char *pszIns, char *pszSearch, 
						char *pszFileName, int nMaxLine, int nMaxCol)
	{
	    int i = 0;
	    FILE *fp;
        int flgAdd = TRUE;
        char *pszBuffer[nMaxLine];
	    
	    nLine = 0;
    
        fp = fopen(pszFileName, "r");
	    if (fp == NULL)
			return;
	    for (i = 0; i < nMaxLine; i++)
        {
    		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
	    }
    
        initDL();
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
	    {
    		if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
                insertAsLastDL(pszBuffer[i]);
			else
			{
			    insertAsLastDL(pszIns);
    	    	flgAdd = FALSE;
    		}
	    }
	    fclose(fp);
	    if (flgAdd == TRUE)
	        insertAsLastDL(pszIns);
        fp = fopen(pszFileName, "w");
        printToFileDL(dblhead->next, fp);
	    deletePerfectDL();
	    fclose(fp);
        for (i = 0; i < nMaxLine; i++)
    		free(pszBuffer[i]);
	}
	
	/* Comment(cComment)  , ˻ڿ(pszSearch) */
	/*  file   Թڿ(pszIns)   */
	/* ϰ,  ˻ڿ ִ  Թڿ  */
	/* ۴. */
	void addOnNotExistChangeOnExistWithoutComment(char *pszIns, 
							char *pszSearch, char cComment, 
							char *pszFileName, int nMaxLine, int nMaxCol)
    {
        int i = 0;
	    FILE *fp;
	    int flgAdd = TRUE;
        char *pszBuffer[nMaxLine];
        
	    nLine = 0;
	
        fp = fopen(pszFileName, "r");
        if (fp == NULL)
			return;
	    for (i = 0; i < nMaxLine; i++)
	    {
    		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
            memset(pszBuffer[i], '\0', nMaxCol);
	    }
	
	    initDL();
        for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        {
			if ((char *)strstr(pszBuffer[i], pszSearch) == NULL || 
				pszBuffer[i][0] == cComment)
				insertAsLastDL(pszBuffer[i]);
    		else 
    		{
			    insertAsLastDL(pszIns);
		    	flgAdd = FALSE;
			}
        }
        fclose(fp);
	    if (flgAdd == TRUE)
	        insertAsLastDL(pszIns);
        fp = fopen(pszFileName, "w");
        printToFileDL(dblhead->next, fp);
	    deletePerfectDL();
	    fclose(fp);
        for (i = 0; i < nMaxLine; i++)
    		free(pszBuffer[i]);
	}
	
	/* ΰ ˻ڿ(pszFirstSearch, pszSecondSearch)   */
	/*   Թڿ(pszIns) ٲٰ,   ϳ  */
	/* Թڿ file   Ѵ. */
	void addOnNotExistChangeOnExist2Search(char *pszIns, char *pszFirstSearch, 
					char *pszSecondSearch, char *pszFileName, 
					int nMaxLine, int nMaxCol)
    {
        int i = 0;
	    FILE *fp;
	    int flgAdd = TRUE;
	    char *pszBuffer[nMaxLine];
	    
        nLine = 0;
    
	    fp = fopen(pszFileName, "r");
	    if (fp == NULL)
    		return;
        for (i = 0; i < nMaxLine; i++)
	    {
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
        }
    
	    initDL();
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        {
    		if ((char *)strstr(pszBuffer[i], pszFirstSearch) != NULL && 
				(char *)strstr(pszBuffer[i], pszSecondSearch) != NULL)
			{
			    insertAsLastDL(pszIns);
    	    	flgAdd = FALSE;
    		}
			else
	            insertAsLastDL(pszBuffer[i]);
	    }
        fclose(fp);
        if (flgAdd == TRUE)
	        insertAsLastDL(pszIns);
	    fp = fopen(pszFileName, "w");
	    printToFileDL(dblhead->next, fp);
        deletePerfectDL();
        fclose(fp);
	    for (i = 0; i < nMaxLine; i++)
			free(pszBuffer[i]);
    }
    
	/* ˻ڿ(pszSearch) ã   ٷ տ  */
	/* ڿ  Ѵ. */
	void insertForeSearchToFile(char *pszInsert, char *pszSearch, 
						char *pszFileName, int nMaxLine, int nMaxCol) 
	{
	    int i = 0;
        FILE *fp;
        char *pszBuffer[nMaxLine];
	    
	    nLine = 0;
    
        fp = fopen(pszFileName, "r");
	    if (fp == NULL)
			return;
        
        for (i = 0; i < nMaxLine; i++)
	    {
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
        }
    
	    initDL();
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        	insertAsLastDL(pszBuffer[i]);
	    fclose(fp);
	
        insertDLAsKey(pszInsert, pszSearch);
        fp = fopen(pszFileName, "w");
	    printToFileDL(dblhead->next, fp);
	    deletePerfectDL();
        fclose(fp);
        for (i = 0; i < nMaxLine; i++)
			free(pszBuffer[i]);
	}
	
	/* ˻ڿ(pszSearch) ã   ġ Թڿ */
	/* (pszInsert) Ѵ. */
    void attatchStrToFileLine(char *pszInsert, char *pszSearch, 
							char *pszFileName, int nMaxLine, int nMaxCol)
    {
		int i = 0, j;
		FILE *fp;
    	char *pszBuffer[nMaxLine];
    	
		nLine = 0;
		
        fp = fopen(pszFileName, "r");
        if (fp == NULL)
			return;
	    for (i = 0; i < nMaxLine; i++)
	    {
    		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
            memset(pszBuffer[i], '\0', nMaxCol);
	    }
	
	    initDL();
        for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        {
			if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
			{
    			pszBuffer[i][strlen(pszBuffer[i])-1] = '\0';
    			strcat(pszBuffer[i], pszInsert);
				pszBuffer[i][strlen(pszBuffer[i])] = '\n';
			}
			insertAsLastDL(pszBuffer[i]);
        }
        fclose(fp);
	    fp = fopen(pszFileName, "w");
	    printToFileDL(dblhead->next, fp);
        deletePerfectDL();
        fclose(fp);
	    for (i = 0; i < nMaxLine; i++)
			free(pszBuffer[i]);
    }
    
	/* ˻ڿ(pszSearch) ã ׶ ƯColoum(nStartIdx) */
	/* ƯColoum(nEndIdx) ڿ Save(pszSave)Ѵ. */
	void saveStrIdxToFileLine(char *pszSave, char *pszSearch, 
						char *pszFileName, int nStartIdx, int nEndIdx, 
						int nMaxLine, int nMaxCol)
	{
		int i = 0, j;
    	FILE *fp;
    	char *pszBuffer[nMaxLine];
		char pszEndBuffer[nMaxCol];
		
		nLine = 0;
		
        fp = fopen(pszFileName, "r");
        if (fp == NULL)
			return;
	    for (i = 0; i < nMaxLine; i++)
        {
    		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
	    }
	
        for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        {
			if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
			{
    			memset(pszEndBuffer, '\0', nMaxCol);
    			strcpy(pszEndBuffer, pszBuffer[i]+nStartIdx);
				for (j = 0; j < nEndIdx-nStartIdx; j++)
					pszSave[j] = pszEndBuffer[j];
    		}
        }
	    fclose(fp);
	}
		
	/* ˻ڿ(pszSearch) ã ׶ ƯColoum(nStartIdx) */
	/* ƯColoum(nEndIdx) ڿ Թڿ(pszInsert) üѴ. */
    void changeStrIdxToFileLine(char *pszInsert, char *pszSearch, 
								char *pszFileName, int nStartIdx, 
								int nEndIdx, int nMaxLine, int nMaxCol)
    {
		int i = 0, j;
		FILE *fp;
		char *pszBuffer[nMaxLine];
    	char pszEndBuffer[nMaxCol];
    	
		nLine = 0;
		
        fp = fopen(pszFileName, "r");
        if (fp == NULL)
			return;
	    for (i = 0; i < nMaxLine; i++)
	    {
    		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
            memset(pszBuffer[i], '\0', nMaxCol);
	    }
	
        initDL();
        for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
	    {
			if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
    		{
    			memset(pszEndBuffer, '\0', nMaxCol);
				strcpy(pszEndBuffer, pszBuffer[i]+nEndIdx);
				pszBuffer[i][nStartIdx] = '\0';
				strcat(pszBuffer[i], pszInsert);
    			strcat(pszBuffer[i], pszEndBuffer);
    			pszBuffer[i][strlen(pszBuffer[i])] = '\0';
			}
			insertAsLastDL(pszBuffer[i]);
	    }
	    fclose(fp);
        fp = fopen(pszFileName, "w");
        printToFileDL(dblhead->next, fp);
	    deletePerfectDL();
	    fclose(fp);
        for (i = 0; i < nMaxLine; i++)
    		free(pszBuffer[i]);
	}
	
	/* ˻ڿ(pszSearch) ã ׶ ƯColoum(nIdx)  ڿ */
	/*   ְ, Թڿ(pszInsert) . */
	void attatchStrIdxToFileLine(char *pszInsert, char *pszSearch, 
					char *pszFileName, int nIdx, int nMaxLine, int nMaxCol)
    {
    	int i = 0, j;
		FILE *fp;
		char *pszBuffer[nMaxLine];
    	
    	nLine = 0;
		
	    fp = fopen(pszFileName, "r");
        if (fp == NULL)
    		return;
	    for (i = 0; i < nMaxLine; i++)
	    {
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
            memset(pszBuffer[i], '\0', nMaxCol);
        }
	
	    initDL();
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        {
    		if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
			{
				pszBuffer[i][nIdx] = '\0';
    			strcat(pszBuffer[i], pszInsert);
    			pszBuffer[i][strlen(pszBuffer[i])] = '\n';
			}
			insertAsLastDL(pszBuffer[i]);
	    }
        fclose(fp);
        fp = fopen(pszFileName, "w");
	    printToFileDL(dblhead->next, fp);
	    deletePerfectDL();
        fclose(fp);
        for (i = 0; i < nMaxLine; i++)
			free(pszBuffer[i]);
	}
    
	/* Ư(nLineIdx) ƯColoum(nColIdx)  ڿ */
	/*   ְ, Թڿ(pszInsert) . */
    void attatchStrToFileIdxLine(char *pszInsert, char *pszFileName, 
					int nLineIdx, int nColIdx, int nMaxLine, int nMaxCol)
	{
		int i = 0, j;
		FILE *fp;
    	char *pszBuffer[nMaxLine];
    	
		nLine = 0;
		
	    fp = fopen(pszFileName, "r");
	    if (fp == NULL)
    		return;
        for (i = 0; i < nMaxLine; i++)
	    {
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
            memset(pszBuffer[i], '\0', nMaxCol);
        }
	
	    initDL();
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        {
    		if (i == nLineIdx-1)
			{
				pszBuffer[i][nColIdx] = '\0';
    			strcat(pszBuffer[i], pszInsert);
    			pszBuffer[i][strlen(pszBuffer[i])] = '\n';
			}
			insertAsLastDL(pszBuffer[i]);
        }
        fclose(fp);
	    fp = fopen(pszFileName, "w");
	    printToFileDL(dblhead->next, fp);
	    deletePerfectDL();
        fclose(fp);
        for (i = 0; i < nMaxLine; i++)
			free(pszBuffer[i]);
	}
	
	/* ˻ڿ(pszStartLine) ã   ٷ ο */
	/* Թڿ(pszInsert)  Ѵ. */
    void insertAfterStrToFile(char *pszInsert, char *pszStartLine, 
						char *pszFileName, int nMaxLine, int nMaxCol)
    {
	    char *pszBuffer[nMaxLine];
	    int i = 0, j, k;
        FILE *fp;
        
	    nLine = 0;
	
	    fp = fopen(pszFileName, "r");
        if (fp == NULL)
    		return;
	    
	    for (i = 0; i < nMaxLine; i++)
        {
    		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
	    }
    
        initDL();
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
	    {
			insertAsLastDL(pszBuffer[i]);
    		if ((char *)strstr(pszBuffer[i], pszStartLine) != NULL)
    		{
				insertAsLastDL(pszInsert);
				insertAsLastDL("\n");
				for (j = i+1; 
					 readOneLineSearchFile(pszBuffer[j], fp) != EOF; j++)
					insertAsLastDL(pszBuffer[j]);
    			break;
    		}
	    }
	    fclose(fp);
        fp = fopen(pszFileName, "w");
        printToFileDL(dblhead->next, fp);
	    deletePerfectDL();
	    fclose(fp);
	    for (i = 0; i < nMaxLine; i++)
    		free(pszBuffer[i]);
    	return;
	}
	
	/* ù° ˻ڿ(pszStartLine) ι° ˻ڿ(pszEndLine) */
	/*  ã  ̿ ִ line (pszSaveLine)Ѵ. */
    void saveBetweenStrToFile(char *pszSaveLine[], char *pszStartLine, 
			char *pszEndLine, char *pszFileName, int nMaxLine, int nMaxCol)
    {
	    char *pszBuffer[nMaxLine];
	    int i = 0, j;
        FILE *fp;
        
	    nLine = 0;
	
	    fp = fopen(pszFileName, "r");
        if (fp == NULL)
    		return;
	    
	    for (i = 0; i < nMaxLine; i++)
	    {
    		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
            memset(pszBuffer[i], '\0', nMaxCol);
	    }
	
        for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        {
			if ((char *)strstr(pszBuffer[i], pszStartLine) != NULL)
			{
				for (j = i+1; 
					 readOneLineSearchFile(pszBuffer[j], fp) != EOF; j++)
    			{
    				if ((char *)strstr(pszBuffer[j], pszEndLine) == NULL)
						strcpy(pszSaveLine[j-(i+1)], pszBuffer[j]);
					else
    					break;
    			}
	    		fclose(fp);
	
                for (j = 0; j < nMaxLine; j++)
    		        free(pszBuffer[j]);
	
			    return;
			}
        }
    }
	
	/* ù° ˻ڿ(pszStartLine) ι° ˻ڿ(pszEndLine) */
	/*  ã  ̿ ִ line Թڿ(pszInsert) ü */
	/* Ų. */
	void changeBetweenStrToFile(char *pszInsert[], int nInsertNum, 
						char *pszStartLine, char *pszEndLine, 
						char *pszFileName, int nMaxLine, int nMaxCol)
	{
	    char *pszBuffer[nMaxLine];
        int i = 0, j, k;
        FILE *fp;
	    
	    nLine = 0;
    
        fp = fopen(pszFileName, "r");
	    if (fp == NULL)
			return;
	    
        for (i = 0; i < nMaxLine; i++)
        {
			pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
	        memset(pszBuffer[i], '\0', nMaxCol);
        }
    
	    initDL();
	    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        {
    		insertAsLastDL(pszBuffer[i]);
			if ((char *)strstr(pszBuffer[i], pszStartLine) != NULL)
			{
				for (j = i+1; 
					 readOneLineSearchFile(pszBuffer[j], fp) != EOF; j++)
    				if ((char *)strstr(pszBuffer[j], pszEndLine) != NULL)
    					break;
				for (k = 0; k < nInsertNum; k++)
					insertAsLastDL(pszInsert[k]);
				insertAsLastDL(pszBuffer[j]);
    
    			for (k = j+1; 
					 readOneLineSearchFile(pszBuffer[k], fp) != EOF; k++)
					insertAsLastDL(pszBuffer[k]);
				break;
    		}
        }
	    fclose(fp);
	    fp = fopen(pszFileName, "w");
	    printToFileDL(dblhead->next, fp);
        deletePerfectDL();
        fclose(fp);
	    for (i = 0; i < nMaxLine; i++)
			free(pszBuffer[i]);
    	return;
    }
	
	-------------------------------------------------------
    
	ݱ ũƮ ̿ fileó   ٷҴ.
	׷,   Simple LinkedList  ʰ, Double LinkedList
	 ߴ ñ ̴.
	 Ŀ  Source  ȭŰ Ȯ强  
	ḮƮ  ̴.  ܼḮƮ Ѵٸ 
	𸮸 ణ   ְ Ȯ强 ξ .
	, Library Ŀ ȭų  ִٸ ߿ḮƮ 
	Ѵٰ Ѵ.
    
1.3. Ǿ 
	ռ ߵ  Source Ư Routine    
	Resource ũ   ִ  ִ.
	̸ Ϸ LinkList node key    file
	  LinkList   ƴ϶ ǿ   file
	  ϵ ϴ  .
	̷    Source ѹ غñ⸦ ٶ
	.
	

===============================================================
< 2. QT ⺻  >

	-> ڴ Ansi-C ϴ  α׷ӿ. 
	ַ ٷ оߴ Network  α׷̾  ȯ
	X-window ƴ text-mode. text-mode GUI࿡
	  Ұ   Curses Slangٵ  ٰ 
	  ִ Library ߴ.   ڽ  ؿ
	ö ִٰ ϱ ߰  ڸ  Ǿ.
	  Linux ׷̵ Ǹ鼭   ׷ȯ
	 Ǹ鼭  ڸ  ߴ.  ̶ û
	 ̾.   е Ѻ̶   д е
	߿ ôٸ  ڷḦ ø   ̴.
	Ÿ  C++  Ŭ    
	  3  QT ߴ.
	 ڷᵵ  Alzza  ԵǾִ QT 1.44  
	Source C++ QT ڴ ô̳  .
	̷  ϸ鼭 QT    ִ  
	 ͵ϰ Ǿµ   в  ٰ ϴ
	 ǰϿ  ڴ. ª Ƿ  ø 
	 å  ռ Source  Ϳ 
	ֽñ ٶ.

2.1. QT Class
	켱  QT  Class ϱ⿡ ռ Class
	  α ٶ.    ߿
	ܿ ʿ . ׳ ʿ  ãƺ  Ȱϱ 
	. Ʒ ǥ /usr/lib/qt/html/hierarchy.html  
	  Ե  ֿ Ŭ  ̴.

	-------- < ǥ 2.1.1 QT Class  > ---------

       QBrush 
       QCollection 
              QGList 
                    QList 
                           QStrList 
                                  QStrIList 
       QColor 
       QColorGroup 
       QConnection 
       QCursor 
       QEvent 
              QChildEvent 
              QCloseEvent 
              QCustomEvent 
              QDragMoveEvent 
              QDropEvent 
              QFocusEvent 
              QKeyEvent 
              QMouseEvent 
              QMoveEvent 
              QPaintEvent 
              QResizeEvent 
              QTimerEvent 
       QFont 
       QFontInfo 
       QFontMetrics 
       QGArray 
              QArray 
                    QByteArray 
                           QString 
                    QPointArray 
       QIconSet 
       QImage 
       QListBoxItem 
              QListBoxPixmap 
              QListBoxText 
       QListViewItem 
              QCheckListItem 
       QMenuData 
              QMenuBar 
              QPopupMenu 
       QMovie 
       QObject 
              QAccel 
              QApplication 
                    QXtApplication 
              QDragObject 
                    QImageDrag 
                    QStoredDrag 
                           QTextDrag 
                           QUrlDrag 
              QLayout 
                    QBoxLayout 
                           QHBoxLayout 
                           QVBoxLayout 
                    QGridLayout 
              QSignal 
              QToolTipGroup 
              QValidator 
                    QDoubleValidator 
                    QIntValidator 
              QWidget 
                    QButton 
                           QCheckBox 
                           QPushButton 
                           QRadioButton 
                           QToolButton 
                    QComboBox 
                    QDialog 
                           QFileDialog 
                           QMessageBox 
                           QPrintDialog 
                           QTabDialog 
                    QFrame 
                           QGroupBox 
                                  QButtonGroup 
                           QLCDNumber 
                           QLabel 
                           QMenuBar 
                           QProgressBar 
                           QScrollView 
                                  QListView 
                           QSpinBox 
                           QSplitter 
                           QTableView 
                                  QHeader 
                                  QListBox 
                                  QMultiLineEdit 
                                  QPopupMenu 
                           QWidgetStack 
                    QLineEdit 
                    QMainWindow 
                    QNPWidget 
                    QScrollBar 
                    QSemiModal 
                           QProgressDialog 
                    QSlider 
                    QStatusBar 
                    QTabBar 
                    QToolBar 
                    QWindow 
                    QXtWidget 
       QPaintDevice 
              QPicture 
              QPixmap 
                    QBitmap 
              QPrinter 
              QWidget 
       QPaintDeviceMetrics 
       QPainter 
       QPalette 
       QPen 
       QPixmapCache 
       QPoint 
       QRangeControl 
              QScrollBar 
              QSlider 
              QSpinBox 
       QRect 
       QSize 
       QTextStream 
       QTime 
       QToolTip 
       QWhatsThis 
       QWMatrix 
	-----------------------------------------


2.2. Widget(QWidget)̶?

	->   ̽(User Interface) ⺻ Class̴.
	 ǥ  ư, , ڽ Graphic Interface 
	ֵϴ Class   ġִ.
	 Widget鿡  δ öϰ ַ ϰڴ.

2.2.1. (QWidget), (QFrame), ư(QButton)

	---------- < source 2.2.1.1. testFrameButton.cpp > -----------
	#include <qapplication.h> /* QApplication  header file */
	#include <qwidget.h> /* QWidget  header file */

	int main(int argc, char* argv[])
	{
		/*  κ QT α׷ mainԼ ׻ ־ */
		/* ϴ κ̴. */
	    QApplication myapp(argc, argv);

		/* ڰ   */
    	QWidget *wdgtTest = new QWidget();
		/* setGeometry(xǥ, yǥ, , ) */
	    wdgtTest->setGeometry(100, 100, 200, 100);
    
		/* application  츦 wdgtTest  */
	    myapp.setMainWidget(wdgtTest);
		/* wdgtTest ش. */
    	wdgtTest->show();

		/* qt Ų.   κ ٸ 찡  */
		/*  ̴. ׻  κ̴. */
	    return myapp.exec();
	}
	-----------------------------------------------------------

	 Source ְ ƾ κ QWidget, QFrame,
	QPushButton Class ڵ̴.
	켱 header file 캸. header file  
	/usr/lib/qt/include/    ִ.

	public:
    	QWidget( QWidget *parent=0, const char *name=0, WFlags f=0 );

	private:    // Disabled copy constructor and operator=
	#if defined(Q_DISABLE_COPY)
    	QWidget( const QWidget & );
    	QWidget &operator=( const QWidget & );
	#endif

	 κ header file(/usr/lib/qt/include/qwidget.h) 
	 QWidget  κ̴. 
	⼭  ƾ κ ڵ  κ̴. ,
	QWidget *parent = 0, const char *name = 0, WFlags f = 0
	̷ ŬǺκп ڰ   ִٴ 
	C++ ѹ ٷﺻ ̶  ƽ ̴.
	C NULL #define 0 Ǿִ.  parent,
	name, f  NULL Ǹ ߴٴ ε ׳ ʱȭ״
	 ǹ̷ ޾Ƶ.   κ class (constructor)
	κп    ִ.
	̴ C++ Ư̶   ְڴ. ̷   
	 ϰ   ִ ̴. ڼ   ̾߱
	 ϰڴ.
	 ڵ鿡  캸.

	-> QWidget *parent: parent widget Ѵ. 
						 header file Ÿ class𿡼 
						 Ʈ NULL(0) Ǿִµ ̴ 
						ڽ ֻ  ϰڴٴ ̴.
						 parent ǵ (ڰ ) widget
						θclass    ü .
						parentڿ  ٸ widget Ѱشٸ
						parentڿ ӵǰ ȴ. ڼ 
						source 2.2.1.2 ٽ ٷڴ.
	-> const char *name:̰ widget  ĺ  Ѵ. 
						 ĺڴ α׷Ӱ    .
						library ü compile debugging۾
						  , Ȥ ڰ debugging tool 
						 Ư κп      name()
						Լ Ͽ    ִ.
						ڴ  debugging tool  Ƿ
						 ڿ  Ǵ ѹ  .
						  ڿ   ϱ ϰڴ.
	-> WFlags f:		   Ƿ Ʈ 
						.  ϰڴ. ڼ 
						/usr/lib/qt/html/qwidget.html file ϱ
						ٶ.

	---------- < source 2.2.1.2. testFrameButton.cpp > -----------
	#include <qapplication.h>
	#include <qwidget.h>
	#include <qframe.h> /* QFrame  header file */

	int main(int argc, char* argv[])
	{
	    QApplication myapp(argc, argv);

    	QWidget *wdgtTest = new QWidget();
	    wdgtTest->setGeometry(100, 100, 200, 100);
    
		/* parent ڸ wdgtTest Ѵ. */
    	QFrame *frTest = new QFrame(wdgtTest);
		/* parent wdgtTest̹Ƿ frTest  Ӽ */
		/* (xǥ, yǥ) ǥ wdgtTest  */
		/*  ǥ ȯȴ. */
	    frTest->setGeometry(10, 10, 150, 60);
		/* frame ¸ Ѵ. */
    	frTest->setFrameStyle(QFrame::Box | QFrame::Raised | 
							  QFrame::Plain);
    
	    myapp.setMainWidget(wdgtTest);
    	wdgtTest->show();

	    return myapp.exec();
	}
	-----------------------------------------------------------

	QFrame  class 
	/usr/lib/qt/include/qframe.h ǵǾִ.  
	public privateʿ Ǿִ.

	public:
    	QFrame( QWidget *parent=0, const char *name=0, WFlags f=0,
        	bool allowLines=TRUE );

	private:    // Disabled copy constructor and operator=
	#if defined(Q_DISABLE_COPY)
    	QFrame( const QFrame & );
    	QFrame &operator=( const QFrame & );
	#endif

	public member private member ؼ   ʾƵ 
	    ϰ  ϰڴ.

	-> public member: , , Ȥ  class  member 
				       ִ.
	-> private member: ٸ  class  member   .

	ڿ  ˾ƺ .

	-> QWidget *parent:    QWidget parentڿ .
	-> const char *name:         "                 "
	-> WFlags f:                 "                 "
	-> bool allowLines:   FALSE settingȴٸ ΰ 
						   ʴ´.

	---------- < source 2.2.1.3. testFrameButton.cpp > -----------
	#include <qapplication.h>
	#include <qwidget.h>
	#include <qframe.h>
	#include <qpushbutton.h> /* QPushButton  header file */

	int main(int argc, char* argv[])
	{
	    QApplication myapp(argc, argv);

    	QWidget *wdgtTest = new QWidget();
	    wdgtTest->setGeometry(100, 100, 200, 100);
    
    	QFrame *frTest = new QFrame(wdgtTest);
	    frTest->setGeometry(10, 10, 150, 60);
		/* ¿ Ͽ . */
    	frTest->setFrameStyle(QFrame::Box | QFrame::Raised | 
							  QFrame::Plain);
    
		/* text "׽Ʈ", parent frTest Ǿִ. */
	    QPushButton *bttnTest = new QPushButton("׽Ʈ", frTest);
		/* frTest  bttnTest  frTest   */
		/*  ǥ ȴ. */
    	bttnTest->setGeometry(20, 20, 100, 30);
		// bttnTest->resize(100, 30);

	    myapp.setMainWidget(wdgtTest);
    	wdgtTest->show();

	    return myapp.exec();
	}
	-----------------------------------------------------------
	/usr/lib/qt/include/qframe.h  setFrameStyle  
	   ִ.

	void setFrameStyle(int);

	ںκ  integerε ̰   ִ  
	header file  Ÿִ.

    enum { NoFrame  = 0,            // no frame
       Box      = 0x0001,           // rectangular box
       Panel    = 0x0002,           // rectangular panel
       WinPanel = 0x0003,           // rectangular panel (Windows)
       HLine    = 0x0004,           // horizontal line
       VLine    = 0x0005,           // vertical line
       MShape   = 0x000f,
       Plain    = 0x0010,           // plain line
       Raised   = 0x0020,           // raised shadow effect
       Sunken   = 0x0030,           // sunken shadow effect
       MShadow  = 0x00f0 };

	enumeration Ǿ member Ǳ  ڰ ִ 
	   ִ.  0x0001~0x0005, 0x000f, 0x0010, 0x0020, 0x0030, 
	0x00f0.   16 2 Ǯ.

	0x0001 => 0000 0000 0000 0001
	0x0002 => 0000 0000 0000 0010
	0x0003 => 0000 0000 0000 0011
	
	0x0004 => 0000 0000 0000 0100
	0x0005 => 0000 0000 0000 0101
	0x000f => 0000 0000 0000 1111
	
	0x0010 => 0000 0000 0001 0000
	0x0020 => 0000 0000 0010 0000
	0x0030 => 0000 0000 0011 0000
	
	0x00f0 => 0000 0000 1111 0000
	
	 2    ֵ bit operation ϰԸ 
	ٸ   Frame Style Ÿ  ִ   ȴ.
	  [ Box | WinPanel | Sunken ] ϰ Ǹ  Ÿ
	 ǫ  ü  Ÿش.

	/usr/lib/qt/include/qpushbutton.h   class 
	Ǿִ.

	public:
    	QPushButton( QWidget *parent=0, const char *name=0 );
	    QPushButton( const char *text, QWidget *parent=0, 
					const char *name=0 );

	private:    // Disabled copy constructor and operator=
	#if defined(Q_DISABLE_COPY)
	    QPushButton( const QPushButton & );
    	QPushButton &operator=( const QPushButton & );
	#endif

	Ȥ ñϰ   ִ κ
    QPushButton &operator=( const QPushButton & );
	  帱 source 2.2.1.4 ϰڴ.
	
	 ٿ  QPushButton ڿ ڿ "׽Ʈ" 
	frTest ִ. Ӽ   ؼ ̹ 
	Ƿ ⼭ ϰڴ.  widget Ӽ  
	setGeometry   ְ, resize Լε  
	ϴ.   Լ  ణ ̰ ִ.
	setGeometry ǥ ũ⿡     resize
	Լ xǥ yǥ ڷ .   Լ widget
	鿡  Ӽ ̹Ƿ QWidget  class publicԼ
	   Ǿִ.  QWidget ̵ Լ ϰ ִ.

2.2.1.1. Class Ͽ 
	ʹ   source Ͽ  ϴ 
	 ˾ƺ. 켱 source  Ư иѾѴ.
	 ̷ и source code̴.

	--------- < source 2.2.1.1.1 clssTestWidget.h > -----------
	#include <qwidget.h> /* Ʒ public QWidget κп  header */

	/* Ʒʿ ִ frTest bttnTest ϱ  class . */ 
	/* ϹԼ  Կ  */
	class QFrame; 
	class QPushButton;

	/* clssTestWidget class QWidget  public Ȥ class */
	/*   ִ.  clssTestWidget class QWidgetκ '' */
	/*  class̴. */
	class clssTestWidget : public QWidget
	{
		/* Qt library  class ׻ ̷ سƾ Ѵ. */
    	Q_OBJECT
        
	    public:
    	    clssTestWidget(); /*  */
        	~clssTestWidget(); /* Ҹ */
        
		/* widget(bttnTest) Ư SIGNAL ߻ , event ޾ */
		/* ϴ ó   ִ slot function  */
	    public slots:
    	    void printMessage();
        
		/* Ŀ ϰڴ. 켱 ̷ format ִٴ  ˾Ƶ. */
	    protected:
        
    	private:
        	QFrame *frTest;
	        QPushButton *bttnTest;
	};
	-----------------------------------------------------------

	--------- < source 2.2.1.1.2 clssTestWidget.cpp > ---------
	#include <qframe.h> /* frTest  header  */
	#include <qpushbutton.h> /* bttnTest  */

	#include <stdio.h>

	#include "clssTestWidget.h"
        
	clssTestWidget::clssTestWidget()
	{       
    	QFrame *frTest = new QFrame(this);
	    frTest->setGeometry(10, 10, 150, 60);
    	frTest->setFrameStyle(QFrame::Box | QFrame::Raised | QFrame::Plain);
        
	    QPushButton *bttnTest = new QPushButton("׽Ʈ", frTest);
    	bttnTest->setGeometry(20, 20, 100, 30);
		/* ư 'clicked()'Ǿ  printMessage()Լ ȣ϶ */
		/* ൿ ħ */
	    QObject::connect(bttnTest, SIGNAL(clicked()), this, 
						SLOT(printMessage()));
	}   
        
	clssTestWidget::~clssTestWidget()
	{
	}

	/* ư   óǴ Լ */
	void clssTestWidget::printMessage()
	{
    	emit printf("ư Ƚϴ.\n");
	}
	-----------------------------------------------------------

	--------- < source 2.2.1.1.3 main_test1.cpp > ---------
	#include <qapplication.h> /* QApplication  header file */
	#include "clssTestWidget.h"

	int main(int argc, char* argv[])
	{
    
	    QApplication myapp(argc, argv);

		/* class  */
    	clssTestWidget *wdgtTest = new clssTestWidget();
		/* class Ӽ */
	    wdgtTest->setGeometry(100, 100, 200, 100);
        
		/* main  widget  */
    	myapp.setMainWidget(wdgtTest);
		/* widget  */
	    wdgtTest->show();
    
    	return myapp.exec();
	}   
	-----------------------------------------------------------

	 source鿡 ռ  source , file и
	Ǿ class Ͽ  class main ȣѴٴ 
	  .  ̻  ϰ 
	Maikfile    Բ   module compile
	ϴ   ˾ƺڴ.

2.2.2. Makefile 
	2.2.1. source compileϴ  ؼ  
	 ʾҴ. Qt 2.0̻ʹ  GUI Tool  
	̴ ڵ ѹ    װ   
	      ʰ ִ. Makefile 
	 ־  tmake GUI Tool Ѵٰ .
	ڴ  Tool  ʴ´.  ϴ. Makefile
	  ֹ ؼ̴.
	Makefile ϰ ϰ    ִ ̶ tmake
	 ϴ ͵   ̴.
	Ʒ code 2.2.1.1 source  Compileϱ 
	Makefile̴.

	---------------- < Makefile 2.2.2 > ---------------------
	PROGS  = main_test1  ###  file ̸ ´.

	### X-window ȯ濡  library ԽŲ. (Qt )
	LIBS = -L/usr/lib/qt/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm 
	
	### Compiler Ѵ.
	CC = g++
	GCC = gcc

	### Header file ԽŲ.
	INCLUDE = -I/usr/lib/qt/include
	### Compile option Ѵ.
	C_FLAG =  -pipe -DNO_DEBUG -O2
	### Header file  option Compile option Ѵ. 
	CFLAGS = $(INCLUDE) $(C_FLAG)

	### file  Linker Ѵ. ⼭ g++ ȴ.
	SYSCONF_LINK		= $(CC)
	### class иѳ Header file .cpp source file 
	### Ű ýۿ ʱȭ graphic device  setting
	### Ű  Ư cpp file moc file Ű tool
	### . moc file  м  ʿ κ̹Ƿ 
	### ڴ.
	SYSCONF_MOC		= /usr/bin/moc
	MOC	=	$(SYSCONF_MOC)

	### mainԼ ִ source file Linkų  ʿ Object file
	###  Ŀ ϱ ϵ Label ´.
	MNU_OBJS = \
			main_test1.o \
			clssTestWidget_moc.o \
			clssTestWidget.o

	### 'make all'  Makefile Ѵ. (= make)
	all:	$(PROGS)
	### 'make clean' make   Ǵ  file
	###    Ѵ. clean, all,  ڰ  
	### ϴ°   Ʋ ȴ.
	clean:
		rm -f *.o
		rm -f main_test1
		rm -f *_moc.*

	############# COMPILE #############

	### main file Ѵ.
	main_test1.o: main_test1.cpp 
			$(CC) -c main_test1.cpp $(CFLAGS) -o $@

	### Header fileκ moc file .
	clssTestWidget_moc.cpp: clssTestWidget.h
			$(MOC) clssTestWidget.h -o clssTestWidget_moc.cpp 

	###  moc file Ѵ.
	clssTestWidget_moc.o: clssTestWidget_moc.cpp
			$(CC) -c clssTestWidget_moc.cpp $(CFLAGS) -o $@

	###  и module file Ѵ.
	clssTestWidget.o: clssTestWidget.cpp
			$(CC) -c clssTestWidget.cpp $(CFLAGS) -o $@

	###  κ PROGǺο ִ ̸ Label .
	main_test1: $(MNU_OBJS) $(OTHER_OBJS) 
			$(CC) $(MNU_OBJS) $(OTHER_OBJS) $(LIBS) -o $@
	------------------------------------------------------------

	shell󿡼 'make' Ȥ 'make all'  Ű ڵ
	compile  link ش. make object file ð, 
	compile   source ȭ    ȭ
	source module compileν ü Compileϴ ð ũ
	 ٿִ ȿ ִ.  source module μ  
	ٸ  Makefile  ʿ䰡 .
	   project    source module
	ʿ ϱ⶧ Makefile  ʼ̶   ִ.
	 Ұϴ source鿡 ؼ  source Makefile
	 sourceٷ ؿ ּ Ұϵ ϰڴ. Makefile 
	ϴµ ־ Զ  Ǿ Ѵ.

2.2.3. (QLabel)
	 2.2.10   տ   module compile
	  ϰڴ.   ߴ κе  Ѵ.
	켱 source  .

	-------------- < source 2.2.3.1 clssTestLabel.h > ---------------
	#include <qwidget.h>

	class QLabel;

	class clssTestLabel : public QWidget
	{
		Q_OBJECT
		
		public:
			clssTestLabel();
			~clssTestLabel();
		
		public slots:
		
		protected:
		
		private:
			QLabel *lblTest1;
			QLabel *lblTest2;
			QLabel *lblTest3;
	};
	-------------------------------------------------------------------

	-------------- < source 2.2.3.2 clssTestLabel.cpp > ---------------
	#include <qlabel.h>
	#include <qframe.h>

	#include "clssTestLabel.h"

	clssTestLabel::clssTestLabel()
	{
		QLabel *lblTest1 = new QLabel(this);
		lblTest1->setText("׽Ʈ 1");
		lblTest1->setGeometry(20, 20, 100, 30);
		/* QLabel setFrameStyleԼ ȣߴٴ  . */
		lblTest1->setFrameStyle(QFrame::Box | QFrame::Panel | QFrame::Raised);
		
		QLabel *lblTest2 = new QLabel(this);
		lblTest2->setText("׽Ʈ 2");
		lblTest2->setGeometry(20, 60, 100, 30);
		lblTest2->setFrameStyle(QFrame::Box | QFrame::Panel | QFrame::Sunken);
	
		QLabel *lblTest3 = new QLabel(this);
		lblTest3->setText("׽Ʈ 3");
		lblTest3->setGeometry(20, 100, 100, 30);
		lblTest3->setFrameStyle(QFrame::Box | QFrame::Panel | QFrame::Plain);
	}

	clssTestLabel::~clssTestLabel()
	{
	}
	-------------------------------------------------------------------

	 Source    Label format Ÿش.
	Ư   QLabel setFrameStyle ȣߴٴ ε
	/usr/lib/qt/include/qlabel.h setFrameStyleԼ Ǿ
	ʴ. qframe.h file Ǿִµ QLabel QFrame class
	ĻǾ  ڽ class̹Ƿ QFrame class Ǿִ  
	publicԼ Ͽ   ִ.  enumeration Box, Panel
	   QLabel member ƴϹǷ QFrame::  Ҽ 
	־ Compiler ˾Ƶ  ִ.

	-------------- < source 2.2.3.3 main_test2.cpp > ---------------
	#include <qapplication.h>
	#include "clssTestLabel.h"

	int main(int argc, char* argv[])
	{
	
   		QApplication myapp(argc, argv);

		clssTestLabel *clssTest = new clssTestLabel();
	
    	myapp.setMainWidget(clssTest);
	   	clssTest->show();

    	return myapp.exec();
	}
	-------------------------------------------------------------------

	---------------------- < Makefile 2.2.3.1 > ----------------------
	PROGS  = main_test2

	LIBS = -L/usr/lib/qt/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm 

	CC = g++
	GCC = gcc

	INCLUDE = -I/usr/lib/qt/include 
	C_FLAG =  -pipe -DNO_DEBUG -O2 
	CFLAGS = $(INCLUDE) $(C_FLAG)

	SYSCONF_LINK		= $(CC)
	SYSCONF_MOC		= /usr/bin/moc
	MOC	=	$(SYSCONF_MOC)

	MNU_OBJS = \
			main_test2.o \
			clssTestLabel_moc.o \
			clssTestLabel.o

	all:	$(PROGS)
	clean:
		rm -f *.o
		rm -f main_test2
		rm -f *_moc.*

	############# COMPILE #############

	main_test2.o: main_test2.cpp 
			$(CC) -c main_test2.cpp $(CFLAGS) -o $@
		
	clssTestLabel_moc.cpp: clssTestLabel.h
			$(MOC) clssTestLabel.h -o clssTestLabel_moc.cpp 

	clssTestLabel_moc.o: clssTestLabel_moc.cpp
			$(CC) -c clssTestLabel_moc.cpp $(CFLAGS) -o $@

	clssTestLabel.o: clssTestLabel.cpp
			$(CC) -c clssTestLabel.cpp $(CFLAGS) -o $@

	main_test2: $(MNU_OBJS) $(OTHER_OBJS) 
			$(CC) $(MNU_OBJS) $(OTHER_OBJS) $(LIBS) -o $@
	-------------------------------------------------------------------

2.2.4. ڽ(QLineEdit)

	-------------- < source 2.2.4.1 clssTestLineEdit.h > ---------------
	#include <qwidget.h>

	class QLineEdit;
	class QPushButton;

	class clssTestLineEdit : public QWidget
	{
		Q_OBJECT
		
		public:
			clssTestLineEdit();
			~clssTestLineEdit();
		
		public slots:
			void testClick();
		
		protected:
		
		private:
			QLineEdit *leTest1;
			QLineEdit *leTest2;
			QPushButton *bttnTest;
	};
	-------------------------------------------------------------------

	-------------- < source 2.2.4.2 clssTestLineEdit.cpp > ---------------
	#include <qlineedit.h>
	#include <qpushbutton.h>

	#include <stdio.h>

	#include "clssTestLineEdit.h"

	clssTestLineEdit::clssTestLineEdit()
	{
		leTest1 = new QLineEdit(this);
		leTest1->setGeometry(20, 20, 100, 30);
		leTest2 = new QLineEdit(this);
		leTest2->setGeometry(20, 60, 100, 30);
		leTest2->setText("ȯ!");
		/* setEnabled    ְ   ƴ Ѵ. */
		/* true->, false->Ұ */
		leTest2->setEnabled(false);
		bttnTest = new QPushButton("Ȯ ", this);
		bttnTest->setGeometry(20, 100, 100, 30);
		/* ư(bttnTest) (clicked())  testClick()Լ ϶ */
		QObject::connect(bttnTest, SIGNAL(clicked()), this, 
						SLOT(testClick()));
	}

	clssTestLineEdit::~clssTestLineEdit()
	{
	}

	void clssTestLineEdit::testClick()
	{
		/* leTest1->text()  leTest1 ڽȿ ǥõǾִ */
		/* text ´. */
		emit printf("ڽ1 ؽƮ < %s >Դϴ.\n", 
					leTest1->text());
		emit printf("ڽ2 ؽƮ < %s >Դϴ.\n", 
					leTest2->text());
	}
	-------------------------------------------------------------------

	QLineEdit class  edit box   ϴ class̴.
	ƯŰ(: Ű, insert, delete, home, end)   
	X-window ȣȯ ̷.  ڽ ִ ڿ 콺
	 < copy and paste >   ִٴ ̾߱.   ̴ Widget
	̴  ص.

	-------------- < source 2.2.4.3 main_test3.cpp > ---------------
	#include <qapplication.h>
	#include "clssTestLineEdit.h"

	int main(int argc, char* argv[])
	{
	
   		QApplication myapp(argc, argv);

		clssTestLineEdit *clssTest = new clssTestLineEdit();
	
	    myapp.setMainWidget(clssTest);
   		clssTest->show();

	    return myapp.exec();
	}
	-------------------------------------------------------------------

	---------------------- < Makefile 2.2.4 > ----------------------
	PROGS  = main_test3

	LIBS = -L/usr/lib/qt/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm 

	CC = g++
	GCC = gcc

	INCLUDE = -I/usr/lib/qt/include 
	C_FLAG =  -pipe -DNO_DEBUG -O2 
	CFLAGS = $(INCLUDE) $(C_FLAG)

	SYSCONF_LINK		= $(CC)
	SYSCONF_MOC		= /usr/bin/moc
	MOC	=	$(SYSCONF_MOC)

	MNU_OBJS = \
			main_test3.o \
			clssTestLineEdit_moc.o \
			clssTestLineEdit.o

	all:	$(PROGS)
	clean:
		rm -f *.o
		rm -f main_test3
		rm -f *_moc.*

	############# COMPILE #############

	main_test3.o: main_test3.cpp 
			$(CC) -c main_test3.cpp $(CFLAGS) -o $@
		
	clssTestLineEdit_moc.cpp: clssTestLineEdit.h
			$(MOC) clssTestLineEdit.h -o clssTestLineEdit_moc.cpp 

	clssTestLineEdit_moc.o: clssTestLineEdit_moc.cpp
			$(CC) -c clssTestLineEdit_moc.cpp $(CFLAGS) -o $@

	clssTestLineEdit.o: clssTestLineEdit.cpp
			$(CC) -c clssTestLineEdit.cpp $(CFLAGS) -o $@

	main_test3: $(MNU_OBJS) $(OTHER_OBJS) 
			$(CC) $(MNU_OBJS) $(OTHER_OBJS) $(LIBS) -o $@
	-------------------------------------------------------------------

2.2.4.1 QObject::connect, SIGNAL SLOT

	/usr/lib/qt/include/qobject.h Ǿִ connectԼ .

    static bool connect( const QObject *sender, const char *signal,
             const QObject *receiver, const char *member );
    bool    connect( const QObject *sender, const char *signal,
             const char *member ) const;

	  ΰ Ǿִµ ؿ ִ bool type ¿
	ִ const QObject *receiver  default < this > ִ.
	 const char *member  this class  memberѴ.
	 ù° static bool type ¿ member
	< const QObject *receiver > member̾ Ѵ.
	 ڵ   Լ ϴ     ִ.

	const QObject *sender   : signal  class ü.
	const char *signal      : 'ڰ  ൿ'̴.
	const QObject *receiver : signal ޾Ƽ ó class ü.
	const char *member      :  receiver class public member Լ
							  .

	const char *signal   ڼ ˾ƺ.
	 2.2.4.2 Source 

	QObject::connect(bttnTest, SIGNAL(clicked()), this, SLOT(testClick()));

	κп  const char *signal κ SIGNAL(clicked()) سҴ.
	QPushButton header file    signal Լ Ǿ
	ִ    ִ.

	signals:
    	void    pressed();
	    void    released();
    	void    clicked();
	    void    toggled( bool );

	 Լ Լ ü ̸ شǴ  ൿ Ͼ
	 ϴ signal 'this' class ְ ȴ. ⼭ this
	class clssTestLineEdit ϸ,  connectԼ  
	const char *memberκп clssTestLineEdit memberԼ testClick
	Լ   ̴.
	< SLOT > ϴ   ̾߱ ϰڴ. 켱 ׳ ̷ ٰ 
	ó  ص. member ںκ  member Լ   ݵ
	 SLOTȿ member ξϸ   member Լ public slots:
	Ȥ private slots:  Ǿ־ Ѵ.


2.2.5. ޺ڽ(QComboBox)

	-------------- < source 2.2.5.1 clssTestComboBox.h > ---------------
	#include <qwidget.h>

	class QComboBox;
	class QPushButton;

	class clssTestComboBox : public QWidget
	{
		Q_OBJECT
		
		public:
			clssTestComboBox();
			~clssTestComboBox();
		
		public slots:
			void testClick();
		
		protected:
		
		private:
			QComboBox *cbTest; /* ޺ڽ  class */
			QPushButton *bttnTest;
	};
	-------------------------------------------------------------------

	-------------- < source 2.2.5.2 clssTestComboBox.cpp > ---------------
	#include <qcombobox.h>
	#include <qpushbutton.h>

	#include <stdio.h>

	#include "clssTestComboBox.h"

	clssTestComboBox::clssTestComboBox()
	{
		cbTest = new QComboBox(this);
		cbTest->setGeometry(20, 20, 100, 30);
		/* ComboBox item ִ´. */
		cbTest->insertItem("ù°", 0);
		cbTest->insertItem("ι°", 1);
		cbTest->insertItem("°", 2);
		cbTest->insertItem("׹°", 3);
		cbTest->setCurrentItem(0);

		bttnTest = new QPushButton("Ȯ ", this);
		bttnTest->setGeometry(20, 100, 100, 30);
		QObject::connect(bttnTest, SIGNAL(clicked()), this, 
						SLOT(testClick()));
	}

	clssTestComboBox::~clssTestComboBox()
	{
	}

	void clssTestComboBox::testClick()
	{
		/* cbTest->currentText()  ComboBox ̴ */
		/* text returnѴ. */
		emit printf("޺ڽ1 ؽƮ < %s >Դϴ.\n", 
					cbTest->currentText());
	}
	-------------------------------------------------------------------

	Ʋκ  Ƿ QComboBox ؼ ϰڴ.
	/usr/lib/qt/include/qcombobox.h .(:   Qt
	ٿ޾ ٸ  ν ״ٸ path Ʋ .)

	public:
    	QComboBox( QWidget *parent=0, const char *name=0 );
	    QComboBox( bool rw, QWidget *parent=0, const char *name=0 );

	 Ư widget ϰ  ڰ ϴ. ڵ鿡 
	  ռ ̾߱ߴ κе Ƿ  ϰڴ.
	׷ ̹ < cbTest->insertItem("ù°", 0); >κ .
	header file insertItemԼ   Ǿִ.
	 Լ ޺ڽ item ߰  ϴ Լ̴.

    void    insertItem( const char *text, int index=-1 );
    void    insertItem( const QPixmap &pixmap, int index=-1 );
 
	ù°  .
	const char *text ޺ڽ ߰ų text̰ int index  text
	 ̴. index 0 Ѵ. -1 ʱȭǾִٴ 
	޺ڽ ƹ item  ʴٴ ̴. Compileؼ 
	 ٶ.  Ȯϰ ذ  ̴.
	 cbTest->currentText()κ .
	header file    .

    const char *currentText() const;

	 Լ  ޺ڽ Ÿִ text returnѴ.
	޺ڽ  text settingϴ Լ
	
    void    setCurrentItem( int index );

	̴. ⼭ index ǹ̴ insertItem index ǹ̿ ϴ.
	< cbTest->setCurrentItem(0); > ϴ  ù° item  text
	 ְڴٴ ̾߱.

	-------------- < source 2.2.5.3 main_test4.cpp > ---------------
	#include <qapplication.h>
	#include "clssTestComboBox.h"

	int main(int argc, char* argv[])
	{
   		QApplication myapp(argc, argv);

		clssTestComboBox *clssTest = new clssTestComboBox();
	
    	myapp.setMainWidget(clssTest);
	   	clssTest->show();

    	return myapp.exec();
	}
	-------------------------------------------------------------------

	---------------------- < Makefile 2.2.5 > ----------------------
	PROGS  = main_test4

	LIBS = -L/usr/lib/qt/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm 

	CC = g++
	GCC = gcc

	INCLUDE = -I/usr/lib/qt/include 
	C_FLAG =  -pipe -DNO_DEBUG -O2 
	CFLAGS = $(INCLUDE) $(C_FLAG)

	SYSCONF_LINK		= $(CC)
	SYSCONF_MOC		= /usr/bin/moc
	MOC	=	$(SYSCONF_MOC)

	MNU_OBJS = \
			main_test4.o \
			clssTestComboBox_moc.o \
			clssTestComboBox.o

	all:	$(PROGS)
	clean:
		rm -f *.o
		rm -f main_test4
		rm -f *_moc.*

	############# COMPILE #############

	main_test4.o: main_test4.cpp 
			$(CC) -c main_test4.cpp $(CFLAGS) -o $@
		
	clssTestComboBox_moc.cpp: clssTestComboBox.h
			$(MOC) clssTestComboBox.h -o clssTestComboBox_moc.cpp 

	clssTestComboBox_moc.o: clssTestComboBox_moc.cpp
			$(CC) -c clssTestComboBox_moc.cpp $(CFLAGS) -o $@

	clssTestComboBox.o: clssTestComboBox.cpp
			$(CC) -c clssTestComboBox.cpp $(CFLAGS) -o $@

	main_test4: $(MNU_OBJS) $(OTHER_OBJS) 
			$(CC) $(MNU_OBJS) $(OTHER_OBJS) $(LIBS) -o $@
	-------------------------------------------------------------------

2.2.6. Ʈ(QListView)
	-------------- < source 2.2.6.1 clssTestListView.h > ---------------
	#include <qwidget.h>

	class QListView;
	class QListViewItem;
	class QLabel;
	class QFrame;

	class clssTestListView : public QWidget
	{
		Q_OBJECT
		
		public:
			clssTestListView();
			~clssTestListView();
		
		public slots:
			void appearItem();
		
		protected:
		
		private:
			QFrame *frTest;
			QListView *lvTest;
			QListViewItem *lviTest[10];
			QLabel *lblTest1;
			QLabel *lblTest2;
			QLabel *lblTest3;
	};
	-------------------------------------------------------------------

	-------------- < source 2.2.6.2 clssTestListView.cpp > ---------------
	#include <qlistview.h>
	#include <qlabel.h>
	#include <qframe.h>

	#include <stdio.h>

	#include "clssTestListView.h"

	clssTestListView::clssTestListView()
	{
		int i;
		char szTest1[50], szTest2[50], szTest3[50];
	
		/* List ڸ ó  frame ׸. */
		frTest = new QFrame(this);
		frTest->setGeometry(20, 20, 200, 200);
		frTest->setFrameStyle(QFrame::Box | QFrame::Sunken | 
							QFrame::WinPanel);
	
		lvTest = new QListView(frTest);
		/* frame  3   ũⰡ  ϴ. */
		lvTest->setGeometry(3, 3, 194, 194);
		/*  field title Ѵ. */
		lvTest->addColumn("   ù°   ");
		lvTest->addColumn("   ι°   ");
		lvTest->addColumn("   °   ");
		/* tree   ƴ Ѵ. */
		lvTest->setRootIsDecorated(true);
	
		for (i = 0; i < 9; i++)
		{
			memset(szTest1, '\0', 50);
			memset(szTest2, '\0', 50);
			memset(szTest3, '\0', 50);
		
			sprintf(szTest1, "ȯ %d", i);
			sprintf(szTest2, " %d", i);
			sprintf(szTest3, " %d", i);
			/*                                     ù°   ι°   °*/
			lviTest[i] = new QListViewItem(lvTest, szTest1, szTest2, szTest3);
		}
		/* List(lvTest) item(lviTest[]) (selectionChanged()) */
		/* Ǿ  this class(clssTestListView) member function */
		/* (appearItem()) ض. */
		QObject::connect(lvTest, SIGNAL(selectionChanged()), this, 
						SLOT(appearItem()));
	
		lblTest1 = new QLabel(this);
		lblTest1->setGeometry(20, 230, 150, 20);
		lblTest2 = new QLabel(this);
		lblTest2->setGeometry(20, 260, 150, 20);
		lblTest3 = new QLabel(this);
		lblTest3->setGeometry(20, 290, 150, 20);
	}

	clssTestListView::~clssTestListView()
	{
	}

	void clssTestListView::appearItem()
	{
		/* õ item ù° field Label Ÿ */
		lblTest1->setText(lvTest->currentItem()->text(0));
		/* õ item ι° field Label Ÿ */
		lblTest2->setText(lvTest->currentItem()->text(1));
		/* õ item ° field Label Ÿ */
		lblTest3->setText(lvTest->currentItem()->text(2));
	}
	-------------------------------------------------------------------

	/usr/lib/qt/include/qlistview.h file  .

	public:
    	QListView( QWidget * parent = 0, const char * name = 0 );

	ٸ widget  ̰ Ƿ  Ѵ.

    virtual int addColumn( const char * label, int size = -1);

	field (const char *label) Ѵ.
	size ؼ ǰ ǾǷ ᵵ ׸ Ƚᵵ ׸̶
	̾߱ε  field size Ƿ ؼ ش field  ã
	Ƴµ ̴ ̴. ٽ ̾߱ ȸ   𸣰
	 ׷ ߿ ڴ ƴϹǷ    ΰڴ.

    virtual void setRootIsDecorated( bool );

	 ڰ false شٸ ù° field item տ ƹ
	  ȴ.
	 tree Ǿִ ƴ ˻ϰ ʹٸ  Լ .

    bool rootIsDecorated() const;

	̹  item List ϴ   ˾ƺ.
	header file   QListViewItem ϰ ִ.

	public:
    	QListViewItem( QListView * parent );
	    QListViewItem( QListViewItem * parent );
    	QListViewItem( QListView * parent, QListViewItem * after );
	    QListViewItem( QListViewItem * parent, QListViewItem * after );

    	QListViewItem( QListView * parent,
        	   const char *,     const char * = 0,
	           const char * = 0, const char * = 0,
    	       const char * = 0, const char * = 0,
        	   const char * = 0, const char * = 0 );
	    QListViewItem( QListViewItem * parent,
    	       const char *,     const char * = 0,
        	   const char * = 0, const char * = 0,
	           const char * = 0, const char * = 0,
    	       const char * = 0, const char * = 0 );

	    QListViewItem( QListView * parent, QListViewItem * after,
    	       const char *,     const char * = 0,
        	   const char * = 0, const char * = 0,
	           const char * = 0, const char * = 0,
    	       const char * = 0, const char * = 0 );
	    QListViewItem( QListViewItem * parent, QListViewItem * after,
    	       const char *,     const char * = 0,
        	   const char * = 0, const char * = 0,
	           const char * = 0, const char * = 0,
    	       const char * = 0, const char * = 0 );

	ణ ϴٰ      ̴.
	켱 parentں 캸.
	  parent type < QListView * >  < QListViewItem * > 
	 ΰ̴.
	< QListView * > parentڷ ޴´ٴ   Ǿִ List
	 < const char * >  text item Ѵٴ ̴.
	< QListViewItem * > parentڷ ޴´ٴ  List Ư item(parent)
	 root ϴ treeμ  item ڽ node Ѵٴ ̴.
	 ذ   ̴.  source
	< lviTest[i] = new QListViewItem(lvTest, szTest1, szTest2, szTest3); >
	 ԵǾִ for loop   ٲ  CompileϿ 
	.

	lviTest[0] = new QListViewItem(lvTest, 
			"׽Ʈ1-1", "׽Ʈ1-2", "׽Ʈ1-3");
	lviTest[1] = new QListViewItem(lviTest[0], 
			"׽Ʈ2-1", "׽Ʈ2-2", "׽Ʈ2-3");

	Ѻ  ڰ ̾߱ߴ κе  ذ  ̴.
	 List Ե text    ̴.

	lblTest1->setText(lvTest->currentItem()->text(0));

	QListViewItem text   ϴ.
	 QListViewItem type class lviTest1̶, lviTest1 ù°
	field text  < lviTest1->text(0); >̶ ϸ  ̴. 
	ComboBox  index ǹϴ  ƲǷ ϱ ٶ.
	 lvTest->currentItem() ǹϴ   List õ
	Item set Ѵ. header file currentItem()Լ  
	Ǿ ִ.

    QListViewItem * currentItem() const;

	type  QListViewItem̴. ̴ currentItem() QListViewItem
	class  member   ִٴ ̾߱Ⱑ ȴ.
	  List õ Item ι° field text ˰ ʹٸ
	  ϸ ȴ.

	lblTest1->setText(lvTest->currentItem()->text(1));

	̹ QListView ߻ Signal  ˾ƺ .
	header file     6 signalԼ ִ.

	signals:
	    void selectionChanged();
    	void selectionChanged( QListViewItem * );
	    void currentChanged( QListViewItem * );

    	void doubleClicked( QListViewItem * );
	    void returnPressed( QListViewItem * );
    	void rightButtonClicked( QListViewItem *, const QPoint&, int );
	    void rightButtonPressed( QListViewItem *, const QPoint&, int );

	 Signal ߻ Լ  ϴ.

	-------------- < source 2.2.6.3 main_test5.cpp > ---------------
	#include <qapplication.h>
	#include "clssTestListView.h"

	int main(int argc, char* argv[])
	{
	
	   	QApplication myapp(argc, argv);

		clssTestListView *clssTest = new clssTestListView();
		clssTest->setGeometry(100, 100, 500, 350);
	
	    myapp.setMainWidget(clssTest);
   		clssTest->show();

	    return myapp.exec();
	}
	-------------------------------------------------------------------

	---------------------- < Makefile 2.2.6 > ----------------------
	PROGS  = main_test5

	LIBS = -L/usr/lib/qt/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm 

	CC = g++
	GCC = gcc

	INCLUDE = -I/usr/lib/qt/include 
	C_FLAG =  -pipe -DNO_DEBUG -O2 
	CFLAGS = $(INCLUDE) $(C_FLAG)

	SYSCONF_LINK		= $(CC)
	SYSCONF_MOC		= /usr/bin/moc
	MOC	=	$(SYSCONF_MOC)

	MNU_OBJS = \
			main_test5.o \
			clssTestListView_moc.o \
			clssTestListView.o

	all:	$(PROGS)
	clean:
		rm -f *.o
		rm -f main_test5
		rm -f *_moc.*

############# COMPILE #############

	main_test5.o: main_test5.cpp 
			$(CC) -c main_test5.cpp $(CFLAGS) -o $@
		
	clssTestListView_moc.cpp: clssTestListView.h
			$(MOC) clssTestListView.h -o clssTestListView_moc.cpp 

	clssTestListView_moc.o: clssTestListView_moc.cpp
			$(CC) -c clssTestListView_moc.cpp $(CFLAGS) -o $@

	clssTestListView.o: clssTestListView.cpp
			$(CC) -c clssTestListView.cpp $(CFLAGS) -o $@

	main_test5: $(MNU_OBJS) $(OTHER_OBJS) 
			$(CC) $(MNU_OBJS) $(OTHER_OBJS) $(LIBS) -o $@
	-------------------------------------------------------------------
	

2.2.7. üũڽ(QCheckBox), ư(QRadioButton)

	-------------- < source 2.2.7.1 clssTestButton.h > ---------------
	#include <qwidget.h>

	class QButtonGroup;
	class QRadioButton;
	class QCheckBox;
	class QPushButton;

	class clssTestButton : public QWidget
	{
		Q_OBJECT
		
		public:
			clssTestButton();
			~clssTestButton();
		
		public slots:
			void procButton();
		
		protected:
		
		private:
			/* QRadioButton   Group class  */
			QButtonGroup *bgTest;
			QRadioButton *rbTest1;
			QRadioButton *rbTest2;
			QCheckBox *chkbTest1;
			QCheckBox *chkbTest2;
			QPushButton *bttnTest;
	};
	-------------------------------------------------------------------

	-------------- < source 2.2.7.2 clssTestButton.cpp > ---------------
	#include <qradiobutton.h>
	#include <qpushbutton.h>
	#include <qcheckbox.h>
	#include <qbuttongroup.h>

	#include <stdio.h>

	#include "clssTestButton.h"

	clssTestButton::clssTestButton()
	{
		/* radio button   ư ȰȭǸ ٸ ư */
		/* ȰȭǾ Ѵ. ̷   QButtonGroup class */
		/*  Ѵ. */
		bgTest = new QButtonGroup(this);
		bgTest->setGeometry(20, 20, 300, 100);

		/* radio button bgTest ӽŲ. */
		rbTest1 = new QRadioButton(" ", bgTest);
		rbTest1->setGeometry(20, 20, 100, 20);
		rbTest2 = new QRadioButton(" ", bgTest);
		rbTest2->setGeometry(150, 20, 100, 20);
	
		/* radio button  ϳ ư õǰ ϱ  */
		/*  QButtonGroup class ԽŲ. */
		bgTest->insert(rbTest1, 0);
		bgTest->insert(rbTest2, 1);
	
		/* üũڽ  */
		chkbTest1 = new QCheckBox(" üũ", this);
		chkbTest1->setGeometry(20, 160, 100, 20);
		chkbTest2 = new QCheckBox(" üũ", this);
		chkbTest2->setGeometry(150, 160, 100, 20);
	
		bttnTest = new QPushButton("Ȯ  ", this);
		bttnTest->setGeometry(60, 250, 100, 30);
		QObject::connect(bttnTest, SIGNAL(clicked()), this, 
						SLOT(procButton()));
	}

	clssTestButton::~clssTestButton()
	{
	}

	void clssTestButton::procButton()
	{
		if (rbTest1->isChecked())
			emit printf("  ư üũǾ ֽϴ.\n");
		else if (rbTest2->isChecked())
			emit printf("  ư üũǾ ֽϴ.\n");
		else
			emit printf("üũǾִ  ư ϴ.\n");

		if (chkbTest1->isChecked())
			emit printf(" üũ ڽ üũǾ ֽϴ.\n");
		if (chkbTest2->isChecked())
			emit printf(" üũ ڽ üũǾ ֽϴ.\n");
		if (chkbTest1->isChecked() == false && 
			chkbTest2->isChecked() == false)
			emit printf("üũǾִ üũڽ ϴ.\n");
	}
	-------------------------------------------------------------------

	QButtonGroup . /usr/lib/qt/include/qbuttongroup.h
	  Ǿִ.

	public:
    	QButtonGroup( QWidget *parent=0, const char *name=0 );
	    QButtonGroup( const char *title, QWidget *parent=0, 
						const char *name=0 );

	ڵ鿡    ʿ ϹǷ ϰڴ.
	ںκкٴ insertϴ κ  ʿϸ Ѵ.

    int     insert( QButton *, int id=-1 );

	int id  group ԵǴ ư id ִ  Ѵ.
	      Ѵ.

	 checkbox header file /usr/lib/qt/include/qradiobutton.h  
	Ÿ ںκ  .

	public:
    	QRadioButton( QWidget *parent=0, const char *name=0 );
	    QRadioButton( const char *text, QWidget *parent=0, 
						const char *name=0 );

	QRadioButton < const char *text > ڿ ڿ Ѱָ  ڿ
	 radiobutton title ȴ. üũ Ǿִ ˻ϴ Լ
	isChecked()̴.  checkingϴ Լ header file ̷ 
	Ǿִ.

    void    setChecked( bool check );

	isChecked(), setChecked(bool check)  Լ  QRadioButton
	QCheckBox Ȱ Ǿְ  ɵ .
	
	-------------- < source 2.2.7.3 main_test6.cpp > ---------------
	#include <qapplication.h>
	#include "clssTestButton.h"

	int main(int argc, char* argv[])
	{
	
   		QApplication myapp(argc, argv);

		clssTestButton *clssTest = new clssTestButton();
		clssTest->setGeometry(100, 100, 500, 350);
	
	    myapp.setMainWidget(clssTest);
   		clssTest->show();

	    return myapp.exec();
	}
	-------------------------------------------------------------------

	---------------------- < Makefile 2.2.7 > ----------------------
	PROGS  = main_test6

	LIBS = -L/usr/lib/qt/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm 

	CC = g++
	GCC = gcc

	INCLUDE = -I/usr/lib/qt/include 
	C_FLAG =  -pipe -DNO_DEBUG -O2 
	CFLAGS = $(INCLUDE) $(C_FLAG)

	SYSCONF_LINK		= $(CC)
	SYSCONF_MOC		= /usr/bin/moc
	MOC	=	$(SYSCONF_MOC)

	MNU_OBJS = \
			main_test6.o \
			clssTestButton_moc.o \
			clssTestButton.o

	all:	$(PROGS)
	clean:
		rm -f *.o
		rm -f main_test6
		rm -f *_moc.*

	############# COMPILE #############

	main_test6.o: main_test6.cpp 
			$(CC) -c main_test6.cpp $(CFLAGS) -o $@
		
	clssTestButton_moc.cpp: clssTestButton.h
			$(MOC) clssTestButton.h -o clssTestButton_moc.cpp 

	clssTestButton_moc.o: clssTestButton_moc.cpp
			$(CC) -c clssTestButton_moc.cpp $(CFLAGS) -o $@

	clssTestButton.o: clssTestButton.cpp
			$(CC) -c clssTestButton.cpp $(CFLAGS) -o $@

	main_test6: $(MNU_OBJS) $(OTHER_OBJS) 
			$(CC) $(MNU_OBJS) $(OTHER_OBJS) $(LIBS) -o $@
	-------------------------------------------------------------------

2.2.8. ޴(QMenu)

	-------------- < source 2.2.8.1 clssTestMenu.h > ---------------
	#include <qwidget.h>

	class QMenuBar;
	class QPopupMenu;

	class clssTestMenu : public QWidget
	{
		Q_OBJECT
		
		public:
			clssTestMenu();
			~clssTestMenu();
		
		public slots:
			void funcTest1();
			void funcTest2();
			void funcTest3();
			void funcTest4();
			void funcTest5();
			void funcTest6();
		
		protected:
		
		private:
			/* Pulldown ޴  ޴ */
			QMenuBar *mnuMainBar;
			/* Popup ޴  ޴ */
			QPopupMenu *mnuTest1;
			QPopupMenu *mnuTest2;
			QPopupMenu *mnuTest3;
	};
	-------------------------------------------------------------------

	-------------- < source 2.2.8.2 clssTestMenu.cpp > ---------------
	#include <qapplication.h>
	/* hot key  header. ⼭ hot key  ʴ´. */
	/*    hot keyɱ ־ ٶ. */
	#include <qkeycode.h>
	/* QMenuBar  header */
	#include <qmenubar.h>
	/* QPopupMenu  header */
	#include <qpopupmenu.h>

	#include <stdio.h>

	#include "clssTestMenu.h"

	clssTestMenu::clssTestMenu()
	{
		/* ü window ¸ Microsoft Windows · . */
		qApp->setStyle(WindowsStyle);

		mnuTest1 = new QPopupMenu;
		/* Popup menu  ִ´. */
		mnuTest1->insertItem("׽Ʈ1޴ ޴1", this, 
								SLOT(funcTest1()));
		mnuTest1->insertItem("׽Ʈ1޴ ޴2", this, 
								SLOT(funcTest2()));
		mnuTest1->insertItem("׽Ʈ1޴ ޴3", this, 
								SLOT(funcTest3()));

		mnuTest2 = new QPopupMenu;
		mnuTest2->insertItem("׽Ʈ2޴ ޴1", this, 
								SLOT(funcTest4()));
		mnuTest2->insertItem("׽Ʈ2޴ ޴2", this, 
								SLOT(funcTest5()));

		mnuTest3 = new QPopupMenu;
		mnuTest3->insertItem("׽Ʈ3޴ ޴1", this, 
								SLOT(funcTest6()));
	
		/*  popup menu pulldown menu ԽŲ. */
		mnuMainBar = new QMenuBar(this);
		mnuMainBar->insertItem(" ׽Ʈ1 ", mnuTest1);
		mnuMainBar->insertItem(" ׽Ʈ2 ", mnuTest2);
		mnuMainBar->insertItem(" ׽Ʈ3 ", mnuTest3);
	}

	clssTestMenu::~clssTestMenu()
	{
	}

	void clssTestMenu::funcTest1()
	{
		emit printf("test1 ޴\n");
	}

	void clssTestMenu::funcTest2()
	{
		emit printf("test2 ޴\n");
	}

	void clssTestMenu::funcTest3()
	{
		emit printf("test3 ޴\n");
	}

	void clssTestMenu::funcTest4()
	{
		emit printf("test4 ޴\n");
	}

	void clssTestMenu::funcTest5()
	{
		emit printf("test5 ޴\n");
	}

	void clssTestMenu::funcTest6()
	{
		emit printf("test6 ޴\n");
	}
	-------------------------------------------------------------------

	 ġ ̸ Ÿڸ  .

	 ---------------------------------------------------------
	| ׽Ʈ1  |  ׽Ʈ2  |  ׽Ʈ3                         |
	|---------------------------------------------------------|
	|| ׽Ʈ1޴ ޴1 |                              |
	|| ׽Ʈ1޴ ޴2 |                              |
	|| ׽Ʈ1޴ ޴3 |                              |
	| -------------------------                               |
	|                                                         |
	|                                                         |
	|                --------------------------               |
	 ----------------                          --------------- 
	
	 ׷ Ư  . ѹ Ⱦ ݹ ذ  ̴.
	/usr/lib/qt/include/qpopupmenu.h 캸.

	public:
    	QPopupMenu( QWidget *parent=0, const char *name=0 );
	
	  ʿ  Ѵ. ߿  insertItemԼε
	header file ãƺ ˰  Լ member Ǿ 
	̴. ׷   Ǿ ?
	QPopupMenu class θ .
	
	class Q_EXPORT QPopupMenu : public QTableView, public QMenuData

	⼭  QPopupMenu class QMenuData classκ  ޾Ҵ.
	, QMenuData class public member  QPopupMenu  
	ִٴ ̾߱. ׷ ٽ /usr/lib/qt/include/pmenudata.h 
	. insertItemԼ      Ǿִ.

    int     insertItem( const char *text,
                const QObject *receiver, const char *member,
                int accel=0 );
    int     insertItem( const QPixmap &pixmap,
                const QObject *receiver, const char *member,
                int accel=0 );
    int     insertItem( const QPixmap &pixmap, const char *text,
                const QObject *receiver, const char *member,
                int accel=0 );

    int     insertItem( const char *text,
                const QObject *receiver, const char *member,
                int accel, int id, int index = -1 );
    int     insertItem( const QPixmap &pixmap,
                const QObject *receiver, const char *member,
                int accel, int id, int index = -1 );
    int     insertItem( const QPixmap &pixmap, const char *text,
                const QObject *receiver, const char *member,
                int accel, int id, int index = -1 );

    int     insertItem( const char *text, int id=-1, int index=-1 );
    int     insertItem( const char *text, QPopupMenu *popup,
                int id=-1, int index=-1 );
    int     insertItem( const QPixmap &pixmap, int id=-1, int index=-1 );
    int     insertItem( const QPixmap &pixmap, QPopupMenu *popup,
                int id=-1, int index=-1 );
    int     insertItem( const QPixmap &pixmap, const char *text,
                int id=-1, int index=-1 );
    int     insertItem( const QPixmap &pixmap, const char *text,
                QPopupMenu *popup,
                int id=-1, int index=-1 );

	 ص  insertItem̶ Լ  ƢԴ 
	ذ  ̴. ε member function ̷  ȣǴ 
	   ̴. Ȳ   ϱ ٶ.
	insertItem Լ   . ٷ  ִ  츦  
	 ʿ   . source 2.2.8.2  insertItemԼ
	  ϰڴ.  source  Լ ٷ  Լ̴.

    int     insertItem( const char *text,
                const QObject *receiver, const char *member,
                int accel=0 );

	 ڿ  ϰڴ.
	ù°  < const char *text > Popup menu  Item ̸̴.
	ι°  < const QObject *receiver > Item ̸ ԵǴ class
	̴.
	°  < const char *member >  Item ڿ  õǾ
	clickǾ   receiver member function̴.
	׹°  < int accel > header source    hot-key(Ȥ
	 accel-key) Ѵ. accel-key  ణ  ˾ƺ.
	/usr/lib/qt/include/qkeycode.h   key ̷ 
	Ȥ ǵǾִ.

			.
			.
			.
	const uint SHIFT    = 0x00002000;       // accelerator modifiers
	const uint CTRL     = 0x00004000;
	const uint ALT      = 0x00008000;
	const uint ASCII_ACCEL  = 0x10000000;


	#define Key_Escape      0x1000      // misc keys
	#define Key_Tab         0x1001
	#define Key_Backtab     0x1002
	#define Key_Backspace       0x1003
	#define Key_Return      0x1004
	#define Key_Enter       0x1005
	#define Key_Insert      0x1006
	#define Key_Delete      0x1007
	#define Key_Pause       0x1008
	#define Key_Print       0x1009
	#define Key_SysReq      0x100a
	
	#define Key_Home        0x1010      // cursor movement
	#define Key_End         0x1011
	#define Key_Left        0x1012
			.
			.
			.

	  SHIFT, CTRL, ALT, ASCII_ACCEL 4byte unsigned int
	· ǵǾְ  key  2byte· Ǿ
	. ̴ ƯȮŰ SHIFT, CTRL, ALT key  key 
	Ͽ  ִٴ ̾߱ε   ٽ ѹ ϰڴ.
	 ڰ < ׽Ʈ1޴ ޴1 > Ű ALT+ENTER 
	ϰ ʹٸ   ϸ ȴ.

	mnuTest1->insertItem("׽Ʈ1޴ ޴1", this, 
							SLOT(funcTest1()), ALT|ENTER);

	 QMenuBar  캸.
	/usr/lib/qt/include/qmenubar.h   ϰ ִ.

	class Q_EXPORT QMenuBar : public QFrame, public QMenuData
	{
	friend class QPopupMenu;
    	Q_OBJECT
	public:
    	QMenuBar( QWidget *parent=0, const char *name=0 );
				.
				.
				.
	};
	
	ƹ ãƺƵ insertItemԼ ã  .  QPopupMenu
	   QMenuData  public member ӹް
	ִ.
	׷Ƿ ̿   ̻  ʾƵ Ǹ ϴ´.

	-------------- < source 2.2.8.3 main_test7.cpp > ---------------
	#include <qapplication.h>
	#include "clssTestMenu.h"

	int main(int argc, char* argv[])
	{
	
	   	QApplication myapp(argc, argv);

		clssTestMenu *clssTest = new clssTestMenu();
		clssTest->setGeometry(100, 100, 500, 350);
	
    	myapp.setMainWidget(clssTest);
	   	clssTest->show();

	    return myapp.exec();
	}
	-------------------------------------------------------------------

	---------------------- < Makefile 2.2.8 > ----------------------
	PROGS  = main_test7

	LIBS = -L/usr/lib/qt/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm 

	CC = g++
	GCC = gcc

	INCLUDE = -I/usr/lib/qt/include 
	C_FLAG =  -pipe -DNO_DEBUG -O2 
	CFLAGS = $(INCLUDE) $(C_FLAG)

	SYSCONF_LINK		= $(CC)
	SYSCONF_MOC		= /usr/bin/moc
	MOC	=	$(SYSCONF_MOC)

	MNU_OBJS = \
			main_test7.o \
			clssTestMenu_moc.o \
			clssTestMenu.o

	all:	$(PROGS)
	clean:
		rm -f *.o
		rm -f main_test7
		rm -f *_moc.*

	############# COMPILE #############

	main_test7.o: main_test7.cpp 
			$(CC) -c main_test7.cpp $(CFLAGS) -o $@
		
	clssTestMenu_moc.cpp: clssTestMenu.h
			$(MOC) clssTestMenu.h -o clssTestMenu_moc.cpp 

	clssTestMenu_moc.o: clssTestMenu_moc.cpp
			$(CC) -c clssTestMenu_moc.cpp $(CFLAGS) -o $@

	clssTestMenu.o: clssTestMenu.cpp
			$(CC) -c clssTestMenu.cpp $(CFLAGS) -o $@

	main_test7: $(MNU_OBJS) $(OTHER_OBJS) 
			$(CC) $(MNU_OBJS) $(OTHER_OBJS) $(LIBS) -o $@
	-------------------------------------------------------------------

2.2.9. (QToolBar), MainWindow(QMainWindow)

	-------------- < source 2.2.9.1 clssTestToolBar.h > ---------------
	#include <qmainwindow.h>

	class QToolBar;

	/* ̺κ < : public QMainWindow >    ٶ. */
	class clssTestToolBar : public QMainWindow
	{
		Q_OBJECT
		
		public:
			clssTestToolBar();
			~clssTestToolBar();
		
		public slots:
			void funcTest1();
			void funcTest2();
			void funcTest3();
			
		protected:
		
		private:
			QToolBar *tbTest;
	};
	-------------------------------------------------------------------

	-------------- < source 2.2.9.2 clssTestToolBar.cpp > ---------------
	#include <qapplication.h>
	#include <qtoolbar.h>
	#include <qtoolbutton.h>
	#include <qpixmap.h>

	#include <stdio.h>

	#include "clssTestToolBar.h"

	#ifndef TEST1_TOOLTIP
	/* ToolButton 콺 ٴ   ǳ Ѵ. */
	#define TEST1_TOOLTIP		"ù° ׽Ʈ"
	#define TEST2_TOOLTIP		"ι° ׽Ʈ"
	#define TEST3_TOOLTIP		"° ׽Ʈ"
	#endif

	clssTestToolBar::clssTestToolBar()
	{
		/* Icon  QPixmap  */
		QPixmap iconTest1, iconTest2, iconTest3;
		
		qApp->setStyle(WindowsStyle);
	
		/* ToolBar  image  QPixmap LoadingѴ. */
		iconTest1.load("./test1.gif");
		iconTest2.load("./test2.gif");
		iconTest3.load("./test3.gif");
	
		tbTest = new QToolBar(this);
		/* ToolBar  ̴. */
		tbTest->setOrientation(tbTest->Horizontal);
	
		/* ToolButton Ѵ. */
		QToolButton *tbttnTest1 = new QToolButton(iconTest1, 
				TEST1_TOOLTIP, 0, this, SLOT(funcTest1()), 
				tbTest, "test1");
		QToolButton *tbttnTest2 = new QToolButton(iconTest2, 
				TEST2_TOOLTIP, 0, this, SLOT(funcTest2()), 
				tbTest, "test2");
		QToolButton *tbttnTest3 = new QToolButton(iconTest3, 
				TEST3_TOOLTIP, 0, this, SLOT(funcTest3()), 
				tbTest, "test3");
	}

	clssTestToolBar::~clssTestToolBar()
	{
	}

	void clssTestToolBar::funcTest1()
	{
		emit printf("ù° \n");
	}

	void clssTestToolBar::funcTest2()
	{
		emit printf("ι° \n");
	}

	void clssTestToolBar::funcTest3()
	{
		emit printf("° \n");
	}
	-------------------------------------------------------------------

	/usr/lib/qt/include/qtoolbar.h 캸.

	public:
    	QToolBar( const char * label,
	          QMainWindow *, QMainWindow::ToolBarDock = QMainWindow::Top,
    	      bool newLine = FALSE, const char * name = 0 );
	    QToolBar( const char * label, QMainWindow *, QWidget *,
    	      bool newLine = FALSE, const char * name = 0, WFlags f = 0 );
	    QToolBar( QMainWindow * parent = 0, const char * name = 0 );

	⼭ Ǳ ƾ  κ ѱ ִ. ٷ QMainWindow *parent
	 κ̴.  ٷ widget parent  type  QWidget
	̾.  ⼭ QMainWindow̴. ׷   .
	QMainWindow QToolBar  QWidget  classμ  ̴.
	  ӵ  Ƿ QToolBar parent QMainWindow 
	  ִ. QMenuBar ̴. ̷ class 
	 ϰ踦 شٸ Ȯ α׷ ϰ ȴ.

	/usr/lib/qt/include/qtoolbutton.h .

	public:
	    QToolButton( QWidget * parent = 0, const char * name = 0 );
    	QToolButton( const QPixmap & pm, const char * textLabel,
         	 const char * grouptext,
	         QObject * receiver, const char * slot,
	         QToolBar * parent, const char * name = 0 );
    	QToolButton( QIconSet s, const char * textLabel,
	         const char * grouptext,
    	     QObject * receiver, const char * slot,
        	 QToolBar * parent, const char * name = 0 );

	source 2.2.9.2  QToolButton Լ ؼ ϰڴ.

	QToolButton *tbttnTest1 = new QToolButton(iconTest1, 
			TEST1_TOOLTIP, 0, this, SLOT(funcTest1()), 
			tbTest, "test1");

	 Լ header file   Լ ι° Լ 
	̴.
	ι° Լ ù° ڴ icon Ÿ. Qt 
	image file , bmp, gif, jpg, xpm  Ѵ.  file
	loadingϴ  ణ ٸ. ̷ file loadingϴ 
	 header file̳ Ȥ Qt ϴ  α׷ 
	ݹ    ̴. gif jpg file̹Ƿ  Linux
	X-window   format ȯѾѴ. X-window
	ϴ file format xpm fileε   xpm file 
	θ vi  ̴.

	static char * Ant_xpm[] = {
	"48 48 60 1",
	" 	c None",
	".	c #492449244924",
	"X	c #618561856185",
	"o	c #9E799E799E79",
	"O	c #208120812081",
	"+	c #514455555144",
	"@	c #410341034103",
	"#	c #965896589658",
	"$	c #082008200820",
	"%	c #8E388A288E38",
	"&	c #69A669A669A6",
	"*	c #71C675D671C6",
	"=	c #861782078617",
	"-	c #28A228A228A2",
	";	c #104014511040",
	":	c #10400C300000",
	">	c #410324921040",
	",	c #082004100000",
	"<	c #000000000000",
	"1	c #71C63CF32081",
	"2	c #8E38492428A2",
	"3	c #208114511040",
	"4	c #30C234D330C2",
	"5	c #208110400820",
	"6	c #492424921040",
	"7	c #51442CB21861",
	"8	c #38E320811040",
	"9	c #104008200000",
	"0	c #208114510820",
	"q	c #28A214510820",
	"w	c #79E741032081",
	"e	c #596530C21861",
	"r	c #10400C300820",
	"t	c #618534D32081",
	"y	c #30C218611040",
	"u	c #28A218610820",
	"i	c #79E7451428A2",
	"p	c #9658514430C2",
	"a	c #18610C300820",
	"s	c #186110400820",
	"d	c #30C21C711040",
	"f	c #49242CB21861",
	"g	c #104010400820",
	"h	c #59652CB21861",
	"j	c #492428A21861",
	"k	c #618538E32081",
	"l	c #30C21C710820",
	"z	c #69A634D32081",
	"x	c #20811C711861",
	"c	c #30C224921861",
	"v	c #30C22CB228A2",
	"b	c #186110401040",
	"n	c #410328A21861",
	"m	c #8617451428A2",
	"M	c #38E31C711040",
	"N	c #61855D755965",
	"B	c #69A638E32081",
	"V	c #410320811040",
	"C	c #51443CF330C2",
	"Z	c #514430C22081",
	"                                 .              ",
	"                                X.              ",
	"                               oOo              ",
	"                               +@               ",
	"                          #    $%               ",
	"                         %+    O                ",
	"                         &*   =O                ",
	"                         O*   =-                ",
	"                        o;    =O                ",
	"                        &@    =-=X+=            ",
	"                        O.    X:>,--#           ",
	"                       #<#   *<12>3* =          ",
	"                      &4-    ;56789<&$#         ",
	"                   o+$-=    *0q<6,w,$;=       o#",
	"                  %;4*      +8wq,ee<<<%      *;%",
	"                  %<O.#o   #Xr8>tw<<<;   o#.;+# ",
	"               %4% #+;<O% .9y<<u>,08<<<<<$-4#   ",
	"              X;*$%   &O<@5ipa<<<sd:O%          ",
	"             +$% +$*    *;fp8<,$$<<Xo           ",
	"            @$%  o$;o  X4gh5<<7$#*       %++-#  ",
	"          #.$%    oO. ;5jk9<<ld$     #X-;;.##   ",
	"     #*.-<;;%      o;.<2zu<<5y<*     ;;+#       ",
	"    .O.X=#      =%=&X+6ia<,j4$;4#   +-          ",
	"             *@;<<$O+*x0<97yX=4<$#o=<=          ",
	"           +;O4+&+O9<<<<ae0<=  @<-.$O           ",
	"          *$o  %c8etd<<<vb<+    &<<$o           ",
	"         %$*  &nt2pe<<<$X@&      &;+            ",
	"        o$-  =07t2e<<5aOOX<@      %+            ",
	"       oO$o  xt2qae,,79O<#X<+                   ",
	"       @<=  &>mtd<Mtjq<@<  4<*                  ",
	"     o&<+   NB7B<<<se<$+<  o$;%                 ",
	"    +;4=    :waa1,9jV5+X$   =<Oo                ",
	" #@$.#     o9e9<d5j5,C --    @4                 ",
	"-<+#        <7<,ue5<$% <&   &$o                 ",
	"o           -5<8q:Z+o  $   &;#                  ",
	"            o4$--&o   +@  &$%                   ",
	"                    o4$*  <#                    ",
	"                   =;O%  %<                     ",
	"                 o.<4o   =4                     ",
	"                o$<&     ++                     ",
	"                XO%      -X                     ",
	"                ;o       O#                     ",
	"               X@        $                      ",
	"               ;=        &                      ",
	"              &-                                ",
	"              -=                                ",
	"             %;                                 ",
	"             %+                                 "};
	
	ణ ǿ ̴. xpm file ó C ٷ   ִ char
	 pointer  ̴. ణ   ̴.
	  file gif QPixmap Loading ϰ Ǹ Loader
	̷ char pointer ȯ ְ ׸ memory loadingϰ
	ȴ. Windows System  ? Windows ̷ 
	  ׸ ȭ鿡 ѷشٴ   programmer 
	  ̴. , gif jpg format Windows  
	bmp ȯ memory loading  ׸ ȭ鿡 Ÿ.
	̷ bmp  ϴ  ٷ Pixmap file xpm format file
	 ̴. ذ   𸣰ڴ.
	ι°  char  pointer textlabel Mouse Pointer
	ToolButton ġ  Ÿ  ִ Tooltip(ǳ)̴.
	 ڵ ݱ ϰ source ߴٸ 
	ʿ䰡    ϰڴ.

	-------------- < source 2.2.9.3 main_test8.cpp > ---------------
	#include <qapplication.h>
	#include "clssTestToolBar.h"
	
	int main(int argc, char* argv[])
	{
	   	QApplication myapp(argc, argv);

		clssTestToolBar *clssTest = new clssTestToolBar();
		clssTest->setGeometry(100, 100, 500, 350);
	
    	myapp.setMainWidget(clssTest);
	   	clssTest->show();

    	return myapp.exec();
	}
	-------------------------------------------------------------------

	---------------------- < Makefile 2.2.9 > ----------------------
	PROGS  = main_test8

	LIBS = -L/usr/lib/qt/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm 

	CC = g++
	GCC = gcc

	INCLUDE = -I/usr/lib/qt/include 
	C_FLAG =  -pipe -DNO_DEBUG -O2 
	CFLAGS = $(INCLUDE) $(C_FLAG)

	SYSCONF_LINK		= $(CC)
	SYSCONF_MOC		= /usr/bin/moc
	MOC	=	$(SYSCONF_MOC)

	MNU_OBJS = \
			main_test8.o \
			clssTestToolBar_moc.o \
			clssTestToolBar.o

	all:	$(PROGS)
	clean:
		rm -f *.o
		rm -f main_test8
		rm -f *_moc.*

	############# COMPILE #############

	main_test8.o: main_test8.cpp 
			$(CC) -c main_test8.cpp $(CFLAGS) -o $@
		
	clssTestToolBar_moc.cpp: clssTestToolBar.h
			$(MOC) clssTestToolBar.h -o clssTestToolBar_moc.cpp 

	clssTestToolBar_moc.o: clssTestToolBar_moc.cpp
			$(CC) -c clssTestToolBar_moc.cpp $(CFLAGS) -o $@

	clssTestToolBar.o: clssTestToolBar.cpp
			$(CC) -c clssTestToolBar.cpp $(CFLAGS) -o $@
	
	main_test8: $(MNU_OBJS) $(OTHER_OBJS) 
	$(CC) $(MNU_OBJS) $(OTHER_OBJS) $(LIBS) -o $@
	-------------------------------------------------------------------

2.3. QT Library ٿ?
	 Site   ǥ Url
	< http://www.troll.no >
	 ٿ޾   ִ.


< Ѹ >.

ݱ ϳ Project ٹ̱  ׸ ª   ĿԽ
ϴ.
    Դϴ.  ʰ  network Library
   ȭε    Project ϱ⿡ 
Ƿ ׾Ҵٰ   ְ.   뷫  Ƿ  
  κп  code鿡 ؼ ǵ̸  ϵ 
ڽϴ.

===============================================================

< 3. ⺻ Format ۼϱ >

	  Project غ.
	Programming  е鵵  ƽð
	< Է->ó-> >    Ѵ. ̷  
	  Project     ̷ ǥȤ 
	 ȭ   .  ڴ  
	ϱ   İ Ѵ.

	켱 ⺻ format ƺ.
	⺻ format Windows window    ϴ.
	  Application鵵 Windows¿ GUI ϴ.
	 ڵ  Format ڴ.
	 -------------------------------------------------------- 
	|           ޴                                     |
	|--------------------------------------------------------|
	|           Icon                                     |
	|--------------------------------------------------------|
	|                                                        |
	|                                                        |
	|                                                        |
	|                                                        |
	|           ۾                                     |
	|                                                        |
	|                                                        |
	|        ----------------                                |
	|    ----                ---------                       |
	|----                             -----------------------|

3.1. ޴ 
	޴   ϳ Popup Menu ԽŰ  Ѵ.

	 -------------------------------------------------------- 
	|  Ʈũ                                          |
	|--------------------------------------------------------|
	| | ϹݳƮũ |                                   |
	|-| DNS          |-----------------------------------|
	| | IP-Aliasing  |                                   |
	| |------------------|                                   |
	|                                                        |
	|               -------------------------                |
	|    -----------                         -------         |
	|----                                           ---------|

	 Source  .

	-------------- < Source 3.1.1 Network_menu.h > -----------------
	#include <qmainwindow.h>

	class QMenuBar;
	class QPopupMenu;

	class clssNetwork : public QMainWindow
	{
		Q_OBJECT
		
		public:
			clssNetwork();
			~clssNetwork();
		
		public slots:
			void funcGenericNetwork();
			void funcDNS();
			void funcAlias();
			void funcQuit();
		
		protected:
		
		private:
			QMenuBar *mnuMainBar;
			QPopupMenu *mnuNetwork;
	};
	----------------------------------------------------------------

	-------------- < Source 3.1.2 Network_menu.cpp > ---------------
	#include <qapplication.h>
	#include <qkeycode.h>
	#include <qmenubar.h>
	#include <qpopupmenu.h>

	#include <stdio.h>

	#include "Network_menu.h"

	clssNetwork::clssNetwork()
	{
		qApp->setStyle(WindowsStyle);

		/* ޴   ޴ شϴ Լ ϰ */
		/*  ´. */
		mnuNetwork = new QPopupMenu;
		mnuNetwork->insertItem("Ϲ Ʈũ ", this, 
							SLOT(funcGenericNetwork()));
		mnuNetwork->insertItem("DNS ", this, SLOT(funcDNS()));
		mnuNetwork->insertItem("IP-Aliasing ", this, SLOT(funcAlias()));
		mnuNetwork->insertItem("", this, SLOT(funcQuit()));

		mnuMainBar = new QMenuBar(this);
		mnuMainBar->insertItem(" Ʈũ ", mnuNetwork);
	}

	clssNetwork::~clssNetwork()
	{
	}

	void clssNetwork::funcGenericNetwork()
	{
	}

	void clssNetwork::funcDNS()
	{
	}

	void clssNetwork::funcAlias()
	{
	}

	void clssNetwork::funcQuit()
	{
		exit(0);
	}
	----------------------------------------------------------------

	---------------- < Source 3.1.3 main_menu.cpp > ----------------
	#include <qapplication.h>
	#include "Network_menu.h"

	int main(int argc, char* argv[])
	{
	
   		QApplication myapp(argc, argv);

		clssNetwork *clssTest = new clssNetwork();
		clssTest->setGeometry(100, 100, 800, 600);
	
	    myapp.setMainWidget(clssTest);
   		clssTest->show();

	    return myapp.exec();
	}
	----------------------------------------------------------------

	--------------------- < Makefile 3.1. > ------------------------
	PROGS  = main_menu

	LIBS = -L/usr/lib/qt/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm 

	CC = g++
	GCC = gcc

	INCLUDE = -I/usr/lib/qt/include 
	C_FLAG =  -pipe -DNO_DEBUG -O2 
	CFLAGS = $(INCLUDE) $(C_FLAG)

	SYSCONF_LINK		= $(CC)
	SYSCONF_MOC		= /usr/bin/moc
	MOC	=	$(SYSCONF_MOC)

	MNU_OBJS = \
			main_menu.o \
			Network_menu_moc.o \
			Network_menu.o

	all:	$(PROGS)
	clean:
		rm -f *.o
		rm -f main_menu
		rm -f *_moc.*

	############# COMPILE #############

	main_menu.o: main_menu.cpp 
			$(CC) -c main_menu.cpp $(CFLAGS) -o $@
		
	Network_menu_moc.cpp: Network_menu.h
			$(MOC) Network_menu.h -o Network_menu_moc.cpp 

	Network_menu_moc.o: Network_menu_moc.cpp
			$(CC) -c Network_menu_moc.cpp $(CFLAGS) -o $@

	Network_menu.o: Network_menu.cpp
			$(CC) -c Network_menu.cpp $(CFLAGS) -o $@

	main_menu: $(MNU_OBJS) $(OTHER_OBJS) 
			$(CC) $(MNU_OBJS) $(OTHER_OBJS) $(LIBS) -o $@
	----------------------------------------------------------------

3.2.  ֱ

	ToolBar  ICON 16*16ũ gif file ڴ.
	Source .
	-------------- < Source 3.2.1 Network_menu.h > -----------------
	#include <qmainwindow.h>

	class QMenuBar;
	class QPopupMenu;
	class QToolBar;

	class clssNetwork : public QMainWindow
	{
		Q_OBJECT

		public:
			clssNetwork();
			~clssNetwork();
		
		public slots:
			void funcGenericNetwork();
			void funcDNS();
			void funcAlias();
			void funcQuit();
		
		protected:
		
		private:
			QMenuBar *mnuMainBar;
			QPopupMenu *mnuNetwork;
			QToolBar *tbNetwork;
	};
	----------------------------------------------------------------

	-------------- < Source 3.2.2 Network_menu.cpp > ---------------
	#include <qapplication.h>
	#include <qkeycode.h>
	#include <qmenubar.h>
	#include <qpopupmenu.h>
	#include <qtoolbar.h>
	#include <qtoolbutton.h>
	#include <qpixmap.h>

	#include <stdio.h>

	#include "Network_menu.h"

	/* icon  ǳ Ѵ. */
	#ifndef GENERIC_TOOLTIP
	#define GENERIC_TOOLTIP			"Ϲ Ʈũ "
	#define DNS_TOOLTIP				"DNS "
	#define ALIAS_TOOLTIP			"Alias "
	#endif

	clssNetwork::clssNetwork()
	{
		QPixmap iconGeneric, iconDNS, iconAlias;
	
		iconGeneric.load("./generic.gif");
		iconDNS.load("./dns.gif");
		iconAlias.load("./alias.gif");
	
		/* ¸ WindowsŸϷ */
		qApp->setStyle(WindowsStyle);

		mnuNetwork = new QPopupMenu;
		mnuNetwork->insertItem("Ϲ Ʈũ ", this, 
							SLOT(funcGenericNetwork()));
		mnuNetwork->insertItem("DNS ", this, SLOT(funcDNS()));
		mnuNetwork->insertItem("IP-Aliasing ", this, SLOT(funcAlias()));
		mnuNetwork->insertSeparator();
		mnuNetwork->insertItem("", this, SLOT(funcQuit()));

		mnuMainBar = new QMenuBar(this);
		mnuMainBar->insertItem(" Ʈũ ", mnuNetwork);
	
		tbNetwork = new QToolBar(this);
		tbNetwork->setOrientation(tbNetwork->Horizontal);
	
		QToolButton *tbttnGeneric = new QToolButton(iconGeneric, 
				GENERIC_TOOLTIP, 0, this, SLOT(funcGenericNetwork()), 
				tbNetwork, "generic");
		QToolButton *tbttnDNS = new QToolButton(iconDNS, DNS_TOOLTIP, 0, 
				this, SLOT(funcDNS()), tbNetwork, "dns");
		QToolButton *tbttnAlias = new QToolButton(iconAlias, ALIAS_TOOLTIP, 
				0, this, SLOT(funcAlias()), tbNetwork, "alias");
	}

	clssNetwork::~clssNetwork()
	{
	}

	void clssNetwork::funcGenericNetwork()
	{
	}

	void clssNetwork::funcDNS()
	{
	}

	void clssNetwork::funcAlias()
	{
	}

	void clssNetwork::funcQuit()
	{
		exit(0);
	}
	----------------------------------------------------------------

	------------------ < Source 3.2.3 main_menu.cpp > --------------
	#include <qapplication.h>
	#include "Network_menu.h"

	int main(int argc, char* argv[])
	{
	   	QApplication myapp(argc, argv);

		clssNetwork *clssTest = new clssNetwork();
		clssTest->setGeometry(100, 100, 800, 600);
	
    	myapp.setMainWidget(clssTest);
	   	clssTest->show();

    	return myapp.exec();
	}
	----------------------------------------------------------------

	---------------------- < Makefile 3.2. > -----------------------
	Makefile < Makefile 3.1. > .
	----------------------------------------------------------------

3.3. Network ̺귯 ϱ
	
	޴ ٸ ⺻ ۼ Ƿ ʹ Network
	̺귯 ϱ .  ̺귯 ʿ ߴ
	fileóƾ ϱ⵵ ϰ gcc ϴ network library
	ϱ⵵ Ѵ.   κи  ظ Ѵٸ  
	      ִ.
	켱 header file  .

	--------------- < Source 3.3.1 network.h > ---------------------
	#ifndef _NETWORK_H
	#define _NETWORK_H

	#ifndef TRUE
	#define TRUE						1
	#define FALSE						0
	#endif

	#ifndef MAX_LINE
	#define MAX_LINE					100
	#define MAX_COL						1000
	#endif

	#ifndef NO_SETTING
	#define NO_SETTING						"õǾ ʽϴ."
	#endif

	extern char pszNetConfHost[256];
	extern char pszNetConfDomain[256];

	extern char pszNetConfGateway[18];

	extern char pszNetConfIPAddr[18];
	extern char pszNetConfPrivate1IPAddr[18];
	extern char pszNetConfPrivate2IPAddr[18];

	extern char pszNetConfNetmask[18];
	extern char pszNetConfPrivate1Netmask[18];
	extern char pszNetConfPrivate2Netmask[18];

	extern char pszNetconfBroadcast[18];
	extern char pszNetconfPrivate1Broadcast[18];
	extern char pszNetconfPrivate2Broadcast[18];

	extern char pszNetConfNetwork[18];
	extern char pszNetConfPrivate1Network[18];
	extern char pszNetConfPrivate2Network[18];

	extern char pszNetConfNetCard[3][30];

	extern int nCountListStr;
	extern char pszSaveNameServer[20][30];
	extern int nCountNameServer;
	extern int nCountClient;

	extern int nAccountCount;

	/* IP Netmask ˾Ƴ  ׿ شϴ Network Broadcast */
	/*  ˾Ƴ  ü */
	typedef struct tagNETMASKTAB {
	    char pszNetwork[18];
    	char pszBroadcast[18];
	} NetTab;

	NetTab calculateNetMaskTab(char *pszIPAddr, char *pszNetmask);

	/* IP  dot  4 ȣ   ü */
	typedef struct tagSEPADDR {
	    char pszFirst[6];
    	char pszSecond[6];
	    char pszThird[6];
    	char pszFourth[6];
	} S_Addr;

	S_Addr separateAddress(char *pszAddr);
	/*  ¥ Ѵ. */
	char *calculateDate(void);

	/*  ù° Network card  Netmask ˾Ƴ. */
	void getCurrentNetmask(char *pszNetmask);
	/*  ù° Network card  Gateway ˾Ƴ. */
	void getCurrentGateway(char *pszGateway);
	/*  ù° Network card  Hostname ˾Ƴ. */
	void getCurrentHostName(char *pszHostName, char *pszDomainName);
	/*  ù° Network card  IP ˾Ƴ. */
	void getCurrentIPAddr(char *pszIPAddr);
	/*   ι° Network card  Netmask ˾Ƴ. */
	void getPrivate1Netmask(char *pszPrivateNetmask);
	/*  ι° Network card  缳IP ˾Ƴ. */
	void getPrivate1IPAddr(char *pszPrivateIPAddr);
	/*   ° Network card  Netmask ˾Ƴ. */
	void getPrivate2Netmask(char *pszPrivateNetmask);
	/*  ° Network card  缳IP ˾Ƴ. */
	void getPrivate2IPAddr(char *pszPrivateIPAddr);
	/* Network card ISA  Io number Irq number ˾Ƴ. */
	void getNetCardIoIrq(char *pszIo, char *pszIrq, int nCardIdx);
	/*  DNS   ˾Ƴ. */
	void getDNSServer(char *pszDNSServer[]);
	/*  IP Aliasing Ǿִٸ Aliasing IP  Netmask ˾Ƴ. */
	void getAliasNetmask(char *pszNetmask, int nIdx);
	/* Aliasing IP ˾Ƴ. */
	void getAliasIP(char *pszIPAddr, int nIdx);
	/* Networkī  ˾Ƴ. */
	void getEthNetworkCard(char *pszSaveNetCard[], char *pszCardInfo[]);
	/* IP ˾Ƴ. : 172.31.0.0/24 -> 172.31.0.0~172.31.0.255 */
	void calcIPRange(char *pszStartIP, char *pszEndIP, int nIPFourth, 
					int nRange);
	/* IP ޾ IP/numberκ number ˾Ƴ. */
	void calcIPDiffToRange(char *pszStartIP, char *pszEndIP, int *nRange);

	#endif
	----------------------------------------------------------------

	--------------- < Source 3.3.1 network.cpp > -------------------
	#include <stdio.h>
	#include <stdlib.h>
	#include <malloc.h>
	#include <string.h>
	#include <time.h>
	#include <netinet/in.h>
	#include <arpa/inet.h>
	#include <sys/utsname.h>
	#include "network.h"
	#include "proc_file.h"

	/*************** Calculate Netmask table **************/
	NetTab calculateNetMaskTab(char *pszIPAddr, char *pszNetmask)
	{
        struct in_addr IP;
        struct in_addr Mask;
        struct in_addr pNetwork;
        struct in_addr pBroadcast;
        NetTab pNet;
        
        memset(pNet.pszNetwork, '\0', 18);
        memset(pNet.pszBroadcast, '\0', 18);
        
        IP.s_addr = inet_addr(pszIPAddr);
        Mask.s_addr = inet_addr(pszNetmask);
        
		/* Network  IP & Netmask̴. */
        pNetwork.s_addr = IP.s_addr & Mask.s_addr;
		/* Network Ͽ pNetü network  ش. */
        memcpy(pNet.pszNetwork, inet_ntoa(pNetwork), 18);
        
		/* Broadcast  Network | Netmask̴. */
        pBroadcast.s_addr = pNetwork.s_addr | ~Mask.s_addr;
		/* Broadcast Ͽ pNetü broadcast  ش. */
        memcpy(pNet.pszBroadcast, inet_ntoa(pBroadcast), 18);
        
        return pNet;
	}

	/***************************************/
	S_Addr separateAddress(char *pszAddr)
	{
        int i = 0, j = 0, k = 0;
        S_Addr pAddr;
        
        memset(pAddr.pszFirst, '\0', 6);
        memset(pAddr.pszSecond, '\0', 6);
        memset(pAddr.pszThird, '\0', 6);
        memset(pAddr.pszFourth, '\0', 6);
        
		/* ü  member(pszFirst, pszSecond, pszThird, pszFourth) */
		/*  شϴ   ϴ ۾.  Ƿ  */
		/* ñ. */
        for (k = 0; *(pszAddr+i) != '\0'; i++, k++)
        {
  		   	if (*(pszAddr+i) == '.')
  		   	{
  		       	i++;
  		   	    k = 0;
  		   	    j++;
  		   	}
  		   	switch (j)
  		   	{
  		   	    case 0:
  		   			pAddr.pszFirst[k] = *(pszAddr+i);
  		   			break;
  		       	case 1:
  		   			pAddr.pszSecond[k] = *(pszAddr+i);
  		   			break;
  		   	    case 2:
  		   			pAddr.pszThird[k] = *(pszAddr+i);
  		   			break;
  		       	case 3:
  		   			pAddr.pszFourth[k] = *(pszAddr+i);
  		   			break;
  		   	    default:
  		   			break;
  		   	}
        }
        return pAddr;
	}

	/*     Լ ¥  Լ */
	/*  ־߰ڴ ; ־Ҵ. */
	char pszDate[11];
	char *calculateDate()
	{
        time_t tTime;
        int i;
        
        memset(pszDate, '\0', 11);
        
        tTime = time(NULL);
        for (i = 0; i < 4; i++)
			pszDate[i] = *(ctime(&tTime)+20+i);
        for (i = 0; i < 3; i++)
			pszDate[i+4] = *(ctime(&tTime)+4+i);
        for (i = 0; i < 2; i++)
			pszDate[i+4+3] = *(ctime(&tTime)+8+i);
        
        return pszDate;
	}

	void getCurrentNetmask(char *pszNetmask)
	{
        int i = 0;
        char pszSaveFile[1024];
        char pszSave[1024];
        FILE *fp;
        
        memset(pszSaveFile, '\0', 1024);
        memset(pszSave, '\0', 1024);
		/* Netmask   ؿִ ifcfg-eth0 file ִ */
		/*  Ͽ ˾Ƴ. */
		/* ifcfg-eth0 file  Redhat 6.0 ̷ Ǿ */
		/* ִ. */
		/*
			DEVICE=eth0
			IPADDR=172.31.10.1
			NETMASK=255.255.0.0
			NETWORK=172.31.0.0
			BROADCAST=172.31.255.255
			ONBOOT=yes
		*/
		/* ߿ NETMASK= ޺κи о ̴. */

	    if ((fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth0", "r")) == 
				NULL)
    		return;
	    while ((pszSaveFile[i] = fgetc(fp)) != EOF)
    		i++;
	    fclose(fp);
        strcpy(pszSave, (char *)strstr(pszSaveFile, "NETMASK="));
        for (i = 0; pszSave[i+8] != 'N'; i++)
		pszNetmask[i] = pszSave[i+8];
	    pszNetmask[i-1] = '\0';
	}

	void getCurrentGateway(char *pszGateway)
	{
        int i = 0;
        char pszSaveFile[1024];
        char pszSave[1024];
        FILE *fp;
        
        memset(pszSaveFile, '\0', 1024);
        memset(pszSave, '\0', 1024);
		/* gateway ˾Ƴ  network file ̿Ѵ. */
	    if ((fp = fopen("/etc/sysconfig/network", "r")) == NULL)
    		return;
	    while ((pszSaveFile[i] = fgetc(fp)) != EOF)
    		i++;
	    fclose(fp);
		/* GATEWAY=޺κ Ѵ. */
        strcpy(pszSave, (char *)strstr(pszSaveFile, "GATEWAY="));
        for (i = 0; pszSave[i+8] != 'G'; i++)
		pszGateway[i] = pszSave[i+8];
	    pszGateway[i-1] = '\0';
	}

	void getPrivate1Netmask(char *pszPrivateNetmask)
	{
        int i = 0;
        char pszSaveFile[1024];
        char pszSave[1024];
        FILE *fp;
        
        memset(pszSaveFile, '\0', 1024);
        memset(pszSave, '\0', 1024);
		/* ifcfg-eth1 file ̿Ѵ. */
	    if ((fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth1", "r")) == 
				NULL)
        {
	//		strcpy(pszPrivateNetmask, "255.255.0.0");
    		return;
	    }
        while ((pszSaveFile[i] = fgetc(fp)) != EOF)
    		i++;
	    fclose(fp);
    	strcpy(pszSave, (char *)strstr(pszSaveFile, "NETMASK="));
	    for (i = 0; pszSave[i+8] != 'N'; i++)
			pszPrivateNetmask[i] = pszSave[i+8];
	    pszPrivateNetmask[i-1] = '\0';
	}

	void getPrivate1IPAddr(char *pszPrivateIPAddr)
	{
        int i = 0;
        char pszSaveFile[1024];
        char pszSave[1024];
        FILE *fp;
        
        memset(pszSaveFile, '\0', 1024);
        memset(pszSave, '\0', 1024);
	    if ((fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth1", "r")) == 
				NULL)
        {
	//		strcpy(pszPrivateIPAddr, "172.31.0.1");
    		return;
	    }
        while ((pszSaveFile[i] = fgetc(fp)) != EOF)
    		i++;
	    fclose(fp);
    	strcpy(pszSave, (char *)strstr(pszSaveFile, "IPADDR="));
	    for (i = 0; pszSave[i+7] != 'N'; i++)
			pszPrivateIPAddr[i] = pszSave[i+7];
	    pszPrivateIPAddr[i-1] = '\0';
	}

	void getPrivate2Netmask(char *pszPrivateNetmask)
	{
        int i = 0;
        char pszSaveFile[1024];
        char pszSave[1024];
        FILE *fp;
        
        memset(pszSaveFile, '\0', 1024);
        memset(pszSave, '\0', 1024);
        if ((fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth2", "r")) == 
				NULL)
        {
//			strcpy(pszPrivateNetmask, "255.255.0.0");
			return;
        }
        while ((pszSaveFile[i] = fgetc(fp)) != EOF)
			i++;
        fclose(fp);
        strcpy(pszSave, (char *)strstr(pszSaveFile, "NETMASK="));
        for (i = 0; pszSave[i+8] != 'N'; i++)
			pszPrivateNetmask[i] = pszSave[i+8];
        pszPrivateNetmask[i-1] = '\0';
	}

	void getPrivate2IPAddr(char *pszPrivateIPAddr)
	{
        int i = 0;
        char pszSaveFile[1024];
        char pszSave[1024];
        FILE *fp;
        
        memset(pszSaveFile, '\0', 1024);
        memset(pszSave, '\0', 1024);
		/* ifcfg-eth2 file ̿Ѵ. */
        if ((fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth2", "r")) == 
				NULL)
        {
//			strcpy(pszPrivateIPAddr, "192.168.1.1");
			return;
        }
        while ((pszSaveFile[i] = fgetc(fp)) != EOF)
			i++;
        fclose(fp);
        strcpy(pszSave, (char *)strstr(pszSaveFile, "IPADDR="));
        for (i = 0; pszSave[i+7] != 'N'; i++)
			pszPrivateIPAddr[i] = pszSave[i+7];
        pszPrivateIPAddr[i-1] = '\0';
	}

	/* network ü utsname ̿Ѵ. */
	/* utsname member nodename hostname.domainname  */
	/*   Ǿִ. */
	void getCurrentHostName(char *pszHostName, char *pszDomainName)
	{
        struct utsname name;
        int i, j;
        
        uname(&name);
        for (i = 0; name.nodename[i] != '.'; i++)
			pszHostName[i] = name.nodename[i];
        i++;
        for (j = 0; name.nodename[i] != '\0'; i++, j++)
			pszDomainName[j] = name.nodename[i];
	}

	void getCurrentIPAddr(char *pszIPAddr)
	{
    	char *pszSaveListStr[20];
    	int i;
    	
    	for (i = 0; i < 20; i++)
    	{
			pszSaveListStr[i] = (char *)malloc(sizeof(char)*80);
    		memset(pszSaveListStr[i], '\0', 80);
    	}
		
		/* ifcfg-eth0 file IPADDRڿ ã   Ѵ. */
		saveSearchLineToFile("IPADDR", pszSaveListStr, 
			"/etc/sysconfig/network-scripts/ifcfg-eth0", 20, 80);
		/* IP κ . */
    	for (i = 0; pszSaveListStr[0][i+7] != '\n'; i++)
			pszIPAddr[i] = pszSaveListStr[0][i+7];
		for (i = 0; i < 20; i++)
			free(pszSaveListStr[i]);
	}

	/*  Network card κ PCI Cardιۿ  ʴ´. */
	/* Io, Irq number  settingؾϴ Card ISA Cardε */
	/* ISA Card   1000 1̳ ɱ?   ƾ */
	/*   ʿ䰡  ƾ ʿ  𸥴ٴ   */
	/* ־.  ƾ /etc/conf.modules file ʿϴ. */
	/* conf.modules file io=0x230 irq=11     */
	/*   κп  ڿ ó ʿϴ. ڼ  ׸ */
	/* ΰڴ. */
	void getNetCardIoIrq(char *pszIo, char *pszIrq, int nNetCardIdx)
	{
		int i;
		char *pszPosIo, *pszPosIrq;
		int nIrqIdx, nIoIdx;
		char *pszTmpStr = "options eth%d";
		char pszOptionStr[30];
		char *pszSaveListStr[3];
		
		for (i = 0; i < 3; i++)
		{
			if ((pszSaveListStr[i] = (char *)malloc(sizeof(char)*200)) == 
					NULL)
			{
				printf("Memory allocation error!\n");
				memset(pszSaveListStr[i], '\0', 200);
				exit(1);
			}
		}
		
		memset(pszOptionStr, '\0', 30);
		sprintf(pszOptionStr, pszTmpStr, nNetCardIdx);
		saveSearchLineToFile(pszOptionStr, pszSaveListStr, 
				"/etc/conf.modules", 200, 200);
		
		pszPosIo = strstr(pszSaveListStr[0], "0x");
		nIoIdx = pszPosIo-pszSaveListStr[0];
		pszPosIrq = strstr(pszSaveListStr[0], "irq=");
		nIrqIdx = pszPosIrq-pszSaveListStr[0];
			
		for (i = nIoIdx-1; i < nIrqIdx-4; i++)
			pszIo[i-nIoIdx+1] = pszSaveListStr[0][i+3];
		for (i = nIrqIdx; pszSaveListStr[0][i+4] != '\n'; i++)
			pszIrq[i-nIrqIdx] = pszSaveListStr[0][i+4];
		
		for (i = 0; i < 3; i++)
			free(pszSaveListStr[i]);
	}

	/* DNS Server /etc/resolv.conf file . */
	/* resolv.conf file ִ IP  DNS Server  */
	/* Ѵ.  nameserverμ   server IP ùٿ  */
	/* ٸ ׸ ϰų ڷ Ű  ִ.  Լ ܼ */
	/* settingǾִ DNS Server IP pszDNSServer Ѵ. */
	void getDNSServer(char *pszDNSServer[])
	{
		char *pszSaveListStr[50];
		int i;
		int nCntDNS;
		
		for (i = 0; i < 50; i++)
		{
			if ((pszSaveListStr[i] = (char *)malloc(sizeof(char)*200)) == 
					NULL)
			{
				printf("Memory allocation error!\n");
				exit(1);
			}
			memset(pszSaveListStr[i], '\0', 200);
		}
   
		saveSearchLineToFile("nameserver", pszSaveListStr, 
						"/etc/resolv.conf", 50, 200);
		nCntDNS = countAllLineToFile("/etc/resolv.conf", 50, 200);
		nCntDNS--;
		for (i = 0; i < nCntDNS; i++)
		{
			strcpy(pszDNSServer[i], pszSaveListStr[i]+11);
			pszDNSServer[i][strlen(pszDNSServer[i])-1] = '\0';
		}
		
		for (i = 0; i < 50; i++)
			free(pszSaveListStr[i]);
	}

	/* nIdx AliasingǾִ  Ѵ.  nIdx=1϶ */
	/* ̰ ǹϴ  eth0:1̴. ȣ ̴. */
	/*   eth0:1    ifcfg-eth0:1 file ȴ. */
	void getAliasIP(char *pszIPAddr, int nIdx)
	{
		char *pszSaveListStr[20];
		int i, j = 0;
		char pszSaveFile[100];
		FILE *fp;
		
		for (i = 0; i < 20; i++)
		{
			pszSaveListStr[i] = (char *)malloc(sizeof(char)*80);
			memset(pszSaveListStr[i], '\0', 80);
		}
		
		memset(pszSaveFile, '\0', 100);
		sprintf(pszSaveFile, "/etc/sysconfig/network-scripts/ifcfg-eth0:%d", 
					nIdx);
   
		if ((fp = fopen(pszSaveFile, "r")) == NULL)
		{
			printf("File Open Error!\n");
			for (i = 0; i < 20; i++)
				free(pszSaveListStr[i]);
			return;
		}
		fclose(fp);
		saveSearchLineToFile("IPADDR", pszSaveListStr, pszSaveFile, 20, 80);
        for (i = 0; pszSaveListStr[0][i+7] != '\n'; i++)
			pszIPAddr[i] = pszSaveListStr[0][i+7];
		for (i = 0; i < 20; i++)
			free(pszSaveListStr[i]);
	}

	/*   nIdx AliasingǾִ ̴. */
	void getAliasNetmask(char *pszNetmask, int nIdx)
	{
		char *pszSaveListStr[20];
		int i, j = 0;
		char pszSaveFile[100];
		FILE *fp;
		
		for (i = 0; i < 20; i++)
		{
			pszSaveListStr[i] = (char *)malloc(sizeof(char)*80);
			memset(pszSaveListStr[i], '\0', 80);
		}
		
		memset(pszSaveFile, '\0', 100);
		sprintf(pszSaveFile, "/etc/sysconfig/network-scripts/ifcfg-eth0:%d", 
						nIdx);
   
		if ((fp = fopen(pszSaveFile, "r")) == NULL)
		{
			printf("File Open Error!\n");
			for (i = 0; i < 20; i++)
				free(pszSaveListStr[i]);
			return;
		}
		fclose(fp);
		saveSearchLineToFile("NETMASK", pszSaveListStr, pszSaveFile, 20, 80);
        for (i = 0; pszSaveListStr[0][i+8] != '\n'; i++)
			pszNetmask[i] = pszSaveListStr[0][i+8];
		for (i = 0; i < 20; i++)
			free(pszSaveListStr[i]);
	}

	/* Network card /proc/interrupts file оδ. */
	/* interrupts file system   µ */
	/* ̴ ڰ  settingؼ ȵǴ file̴. */
	/* Network card ġǾ  ΰ file   Ÿ */
	/* µ ϳ /etc/conf.modules filḛ  ϳ */
	/* interrupts file̴. setting   conf.modules file */
	/*  ϰ  о  interrupts file Ѵ. */
	void getEthNetworkCard(char *pszSaveNetCard[], char *pszCardInfo[])
	{
		FILE *fp;
		int i, j, nIdx, nCount, nCardCount = 0;
		char *pszSaveListStr[100];
		char *pszSaveLine[4];
		
		if ((fp = fopen("/proc/interrupts", "r")) == NULL)
		{
			printf("file open error!\n");
			return;
		}
		fclose(fp);
		
		for (i = 0; i < 4; i++)
		{
			if ((pszSaveLine[i] = (char *)malloc(sizeof(char)*200)) == NULL)
			{
				printf("memory allocation error!\n");
				exit(1);
			}
			memset(pszSaveLine[i], '\0', 200);
		}
   
		for (i = 0; i < 100; i++)
		{
			if ((pszSaveListStr[i] = (char *)malloc(sizeof(char)*200)) == 
							NULL)
			{
				printf("memory allocation error!\n");
				exit(1);
			}
			memset(pszSaveListStr[i], '\0', 200);
		}
		nCount = saveAllLineToFile(pszSaveListStr, "/proc/interrupts", 
						100, 200);
		
		for (i = 0, nIdx = 0; i < nCount; i++)
		{
			for (j = 0; j < 40; j++)
			{
				if (strstr(pszSaveListStr[i], pszCardInfo[j]) != 
						(char *)NULL)
				{
					nCardCount++;
					strcpy(pszSaveLine[nIdx++], pszSaveListStr[i]);
					break;
				}
			}
		}
		if (nCardCount == 0)
		{
			strcpy(pszSaveNetCard[0], NO_SETTING);
			strcpy(pszSaveNetCard[1], NO_SETTING);
			strcpy(pszSaveNetCard[2], NO_SETTING);
		}
		else if (nCardCount == 1)
		{
			strcpy(pszSaveNetCard[0], pszSaveLine[0]+33);
			strcpy(pszSaveNetCard[1], NO_SETTING);
			strcpy(pszSaveNetCard[2], NO_SETTING);
		}
		else if (nCardCount == 2)
		{
			strcpy(pszSaveNetCard[0], pszSaveLine[0]+33);
			strcpy(pszSaveNetCard[1], pszSaveLine[1]+33);
			strcpy(pszSaveNetCard[2], NO_SETTING);
		}
		else
		{
			strcpy(pszSaveNetCard[0], pszSaveLine[0]+33);
			strcpy(pszSaveNetCard[1], pszSaveLine[1]+33);
			strcpy(pszSaveNetCard[2], pszSaveLine[2]+33);
		}
   
		for (i = 0; i < 4; i++)
			free(pszSaveLine[i]);
		for (i = 0; i < 100; i++)
			free(pszSaveListStr[i]);
	}

	/*   172.31.0.0/16 ̶ nRange  16̴. */
	/* ׸ pszStartIP 172.31.0.0̵Ǹ pszEndIP 172.31.255.255 */
	/*  ȴ.      ڷ   ǥ  ϰڴ. */
	void calcIPRange(char *pszStartIP, char *pszEndIP, int nIPFourth, 
					int nRange)
	{
		char pszSaveStartIP[4], pszSaveEndIP[4];
		
		memset(pszSaveStartIP, '\0', 4);
		memset(pszSaveEndIP, '\0', 4);
   
		if (nIPFourth%nRange != 0)
		{
			sprintf(pszSaveStartIP, "%d", (nIPFourth/nRange)*nRange);
			sprintf(pszSaveEndIP, "%d", (nIPFourth/nRange)*nRange+nRange-1);
		}
		else
		{
			sprintf(pszSaveStartIP, "%d", nIPFourth);
			sprintf(pszSaveEndIP, "%d", nIPFourth+nRange-1);
		}
		strcat(pszStartIP, pszSaveStartIP);
		strcat(pszEndIP, pszSaveEndIP);
	}

	/* ʹ ݴ pszStartIP pszEndIP  nRange ˾Ƴ. */
	/* ˾Ƴ  nRange Ǵµ   ͸ */
	/* . ̴ IP ׹° ȣ  Ѵ.  A, B class */
	/*   ʾҴ. */
	void calcIPDiffToRange(char *pszStartIP, char *pszEndIP, int *nRange)
	{
		S_Addr pAddr;
		int i, nSaveRange;
		int nStart, nEnd;
		
		pAddr = separateAddress(pszStartIP);
		nStart = atoi(pAddr.pszFourth);
		pAddr = separateAddress(pszEndIP);
		nEnd = atoi(pAddr.pszFourth);
   
		nSaveRange = nEnd-nStart+1;
		
		for (i = 0; nSaveRange > 0; i++)
			nSaveRange /= 2;
		
		*nRange = 32-(i-1);
	}
	----------------------------------------------------------------

3.4. Class

3.4.1. ϹݳƮũ

	ʹ  network   ڴ.
	ݺ  κ Source   ̹ ߴ κе̴.
     Source   ̸ ϰ Sourceַ Project
     ̲ ڴ.
    ϹݳƮũ޴ Ʈũī弳, IP Netmask,gateway
    Ϲ  Ʈũ        
    ƾ ϴ, Ȥ   ϰ Ǵ κе غҴ.
    켱 Source  ؼ  Ѻ ٶ. ذ  
    ̴. Source ռ ߴ proc_file.c network.cκ κ
	ԵǾ ִ. file ó ƾ network ó ƾ  ߴٸ
	    κе鵵    Ѵ.
 
	---------------- < Source 3.4.1 clssGeneric.h > ----------------
	#include <qwidget.h>

	class QLabel;
	class QLineEdit;
	class QComboBox; /* to combobox */
	class QPushButton;
	class QFrame;

	class clssDefGeneric : public QWidget
	{
		Q_OBJECT

		public:
			clssDefGeneric();
			~clssDefGeneric();
	
		private slots:
			void setApply();
			void setCancel();
			void printLabelFormat(QLabel *lblBold);
	
		private:
			QLabel *lblGenericNetworkTitle;
			QLabel *lblGateway;
			QLineEdit *leGateway;

			/* Eth0  member */
			QLabel *lblEth0;
			QLabel *lblEth0IPAddr;
			QLineEdit *leEth0IPAddr;
			QLabel *lblEth0Netmask;
			QLineEdit *leEth0Netmask;
			QLabel *lblEth0Network;
			QLineEdit *leEth0Network;
			QLabel *lblEth0Broadcast;
			QLineEdit *leEth0Broadcast;
			QLabel *lblEth0NetCard;
			/* Ʈũ ī combobox ϰ Ѵ. */
			QComboBox *cbEthNetCard[3]; /* to combobox */

			/* Eth1  members */
			QLabel *lblEth1;
			QLineEdit *leEth1IPAddr;
			QLineEdit *leEth1Netmask;
			QLineEdit *leEth1Network;
			QLineEdit *leEth1Broadcast;
			QLabel *lblEth1NetCard;

			/* Eth2  members */
			QLabel *lblEth2;
			QLineEdit *leEth2IPAddr;
			QLineEdit *leEth2Netmask;
			QLineEdit *leEth2Network;
			QLineEdit *leEth2Broadcast;
			QLabel *lblEth2NetCard;
	
			QPushButton *bttnCancel;
			QPushButton *bttnApply;
			
			QFrame *frEthInfo;
			QLabel *lblSeparator1;
			QLabel *lblSeparator2;
	};
	----------------------------------------------------------------

	--------------- < Source 3.4.2 clssGeneric.cpp > ---------------
	#include <qwidget.h>
	#include <qpushbutton.h>

	#include <qapplication.h>
	#include <qpalette.h>

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

	#include <qlabel.h>
	#include <qlineedit.h>
	#include <qcombobox.h>

	#include "network.h"
	#include "proc_file.h"
	#include "clssGeneric.h"

	clssDefGeneric::clssDefGeneric()
	{
		char *pszIPAddr, *pszNetmask, *pszGateway;
		char *pszPrivate1IPAddr, *pszPrivate1Netmask, *pszPrivate2IPAddr;
		char *pszPrivate2Netmask;
		int i, j, nCardIdx;
		NetTab pNet, pNetPrivate1, pNetPrivate2;
    	char *pszSaveListStr[2];

		/* Linux ϴ PCI type Network Card Modules */
        /*  string  ִ ȣ  ٷ module ̸̴. */
		const char *pszNetCard[40] = { 
		  	" 3Com Vortex series (3c590, 3c592, 3c597, 3c595) (3c59x) ", 
  			" 3Com Boomerang (3c900, 3c905, 3c575) (3c59x) ", 
		  	" 3Com Cyclone (3c905B) (3c59x) ", 
  		    " Intel EtherExpress Pro 100 (eepro100) ",
  	    	" HP J2585B, J2585A, J2970, J2973 (hp100) ",
	  	    " HP J2573 (hp100) ",
  		    " Compex ReadyLink ENET100-VG4 (hp100) ",
  	    	" Compex FreedomLine 100/VG (hp100) ",
	  	    " IBM token ring (ibmtr) ", 
  		    " NE2000 (PCI) (ne2k-pci) ",
  	    	" AMD PCnet/PCI 79C970/PCnet32/PCnet/PCI II 79C970A (pcnet32) ",
	  	    " PCnet/PCI II 79C971A (pcnet32) ",
  		    " Allied Telesyn AT2550 (rtl8139) ",
  	    	" Genius GF100TXR (RTL8139) (rtl8139) ",
	  	    " NDC Communications NE100TX-E (rtl8139) ",  
  		    " RealTek RTL8129/8139 Fast (rtl8139) ", //15
  	    	" SMC Ultra/SMC UltraEZ/SMC Ultra32 (smc-ultra) ",
	  	    " Compaq Netelligent 10 T PCI UTP (tlan) ",
  		    " Compaq Netelligent 10/100 TX PCI UTP (tlan) ", 
  	    	" Compaq Netelligent Integrated 10/100 TX UTP (tlan) ",
	  	    " Compaq Netelligent 10/100 TX Embedded UTP (tlan) ",
  		    " Compaq Netelligent 10/100 TX UTP (tlan) ",
  	    	" Compaq Netelligent 10 T/2 PCI UTP/Coax (tlan) ",
	  	    " Accton EtherDuo PCI/Accton EN1207 (tulip) ", 
  		    " Adaptec ANA6901/C/Adaptec ANA6911/TX (tulip) ",
  	    	" C-NET CNE-935 (tulip) ",
	  	    " Cogent EM100/Cogent EM110/Cogent EM400 (tulip) ",
  		    " Cogent EM960/Cogent EM964 Quartet (tulip) ",
  	    	" Danpex EN-9400P3 (tulip) ", 
	  	    " D-Link DFE500-Tx/D-Link DE-530CT (tulip) ",
  		    " Linksys EtherPCI (tulip) ",
  	    	" Kingston EtherX KNT40T/Kingston EtherX KNE100TX (tulip) ",
	  	    " Netgear FX310 TX 10/100 (tulip) ",
  		    " SMC EtherPower/SMC 8432BT/ SMC Ether Power10/100 (tulip) ", 
  	    	" Surecom EP-320X (tulip) ",
	  	    " Thomas Conrad TC5048 (tulip) ",
  		    " Znyx ZX312 EtherAction/Znyx ZX314/ZX315 (tulip) ",
  	    	" Znyx ZX342/ZX344/ZX345/ZX346/ZX348 (tulip) ",
	  	    " Znyx ZX351 (tulip) ",
			" õǾ ʽϴ! (No Setting)"
		};
	
		if (((pszIPAddr = (char *)malloc(sizeof(char)*18)) == NULL) ||
			((pszNetmask = (char *)malloc(sizeof(char)*18)) == NULL) ||
			((pszPrivate1IPAddr = (char *)malloc(sizeof(char)*18)) == NULL) ||
			((pszPrivate1Netmask = (char *)malloc(sizeof(char)*18)) == NULL)||
			((pszPrivate2IPAddr = (char *)malloc(sizeof(char)*18)) == NULL) ||
			((pszPrivate2Netmask = (char *)malloc(sizeof(char)*18)) == NULL)||
			((pszGateway = (char *)malloc(sizeof(char)*18)) == NULL))
		{
			emit printf("DefGeneric Class/Network: Memory Ҵ \n");
			exit(1);
		}
	
		/* ù° Ʈũ ī Ӽ(IP, Netmask)   ʱȭ */
		memset(pszIPAddr, '\0', 18);
		memset(pszNetmask, '\0', 18);

		/* ι° Ʈũ ī Ӽ(IP, Netmask)   ʱȭ */
		memset(pszPrivate1IPAddr, '\0', 18);
		memset(pszPrivate1Netmask, '\0', 18);

		/* ° Ʈũ ī Ӽ(IP, Netmask)   ʱȭ */
		memset(pszPrivate2IPAddr, '\0', 18);
		memset(pszPrivate2Netmask, '\0', 18);

		memset(pszGateway, '\0', 18);

		/* gateway, IP, Netmask  ´. */
		getCurrentGateway(pszGateway);
		getCurrentIPAddr(pszIPAddr);
		getCurrentNetmask(pszNetmask);
		/* network broadcast Ѵ. */
		pNet = calculateNetMaskTab(pszIPAddr, pszNetmask);
	
		getPrivate1Netmask(pszPrivate1Netmask);
		getPrivate1IPAddr(pszPrivate1IPAddr);
		pNetPrivate1 = calculateNetMaskTab(pszPrivate1IPAddr, 
				pszPrivate1Netmask);
	
		getPrivate2Netmask(pszPrivate2Netmask);
		getPrivate2IPAddr(pszPrivate2IPAddr);
		pNetPrivate2 = calculateNetMaskTab(pszPrivate2IPAddr, 
				pszPrivate2Netmask);
	
		/***********************/
		lblGenericNetworkTitle = 
			new QLabel("Network Setting (Ϲ Ʈũ )", this);
		lblGenericNetworkTitle->setGeometry(20, 20, 400, 20);
//		printLabelFormat(lblGenericNetworkTitle);
		/***********************/
	
    	frEthInfo = new QFrame(this);
		frEthInfo->setFrameStyle(QFrame::Box | 
				QFrame::Raised | QFrame::Plain);
		frEthInfo->setGeometry(25, 50, 700, 362);

		lblGateway = new QLabel("Ʈ", frEthInfo);
		lblGateway->setGeometry(10, 15, 80, 20);
		leGateway = new QLineEdit(frEthInfo);
		leGateway->setGeometry(90, 15, 150, 20);
		/* getCurrentGatewayԼ ̿Ͽ  gateway ڽ */
		/*  Ѵ. */
		leGateway->setText(pszGateway);

		/* separator ׸. */
		lblSeparator1 = new QLabel(frEthInfo);
		lblSeparator1->setFrameStyle(QFrame::Box | 
				QFrame::Raised | QFrame::Plain);
		lblSeparator1->setGeometry(20, 45, 630, 2);

		/******** Ethernet Card 0 ********/
		lblEth0 = new QLabel("ù° ̴ī", frEthInfo);
		lblEth0->setGeometry(90, 10+50, 100, 20);

		lblEth0IPAddr = new QLabel("IP ּ  ", frEthInfo);
		lblEth0IPAddr->setGeometry(10, 40+50, 80, 20);
		leEth0IPAddr = new QLineEdit(frEthInfo);
		leEth0IPAddr->setGeometry(90, 40+50, 150, 20);
		leEth0IPAddr->setText(pszIPAddr);
		/*** text -> proc ***/

		lblEth0Netmask = new QLabel("Netmask ", frEthInfo);
		lblEth0Netmask->setGeometry(10, 40+30+50, 80, 20);
		leEth0Netmask = new QLineEdit(frEthInfo);
		leEth0Netmask->setGeometry(90, 40+30+50, 150, 20);
		leEth0Netmask->setText(pszNetmask);
	
		lblEth0Network = new QLabel("Network ", frEthInfo);
		lblEth0Network->setGeometry(10, 40+60+50, 80, 20);
		leEth0Network = new QLineEdit(frEthInfo);
		leEth0Network->setGeometry(90, 40+60+50, 150, 20);
		/* Network IP Netmask  Ͽ  ̹Ƿ ̴ */
		/*   ʿ䰡  κ̹Ƿ ڽ edit  */
		/*  صд.(setEnabled(0)) */
		leEth0Network->setEnabled(0);
		/* pNet = calculateNetMaskTab(pszIPAddr, pszNetmask); Ͽ */
		/*  pNet.pszNetwork ڽ . */
		leEth0Network->setText(pNet.pszNetwork);
	
		lblEth0Broadcast = new QLabel("Broadcast ", frEthInfo);
		lblEth0Broadcast->setGeometry(10, 40+90+50, 80, 20);
		leEth0Broadcast = new QLineEdit(frEthInfo);
		leEth0Broadcast->setGeometry(90, 40+90+50, 150, 20);
		leEth0Broadcast->setEnabled(0);
		leEth0Broadcast->setText(pNet.pszBroadcast);

		lblSeparator2 = new QLabel(frEthInfo);
		lblSeparator2->setFrameStyle(QFrame::Box | 
			QFrame::Raised | QFrame::Plain);
		lblSeparator2->setGeometry(20, 40+90+50+40, 630, 2);
		/*** text -> proc ***/
	
		/*********************************/
		
		/******** Ethernet Card 1 ********/
		lblEth1 = new QLabel("ι° ̴ī", frEthInfo);
		lblEth1->setGeometry(300, 10+50, 100, 20);

		leEth1IPAddr = new QLineEdit(frEthInfo);
		leEth1IPAddr->setGeometry(300, 40+50, 150, 20);
		leEth1IPAddr->setText(pszPrivate1IPAddr);
		/*** text -> proc ***/

		leEth1Netmask = new QLineEdit(frEthInfo);
		leEth1Netmask->setGeometry(300, 40+30+50, 150, 20);
		leEth1Netmask->setText(pszPrivate1Netmask);
		/*** text -> proc ***/

		leEth1Network = new QLineEdit(frEthInfo);
		leEth1Network->setGeometry(300, 40+60+50, 150, 20);

		leEth1Broadcast = new QLineEdit(frEthInfo);
		leEth1Broadcast->setGeometry(300, 40+90+50, 150, 20);
		leEth1Network->setEnabled(0);
		leEth1Broadcast->setEnabled(0);
		if (strlen(pszPrivate1IPAddr) >= 7)
		{
			leEth1Network->setText(pNetPrivate1.pszNetwork);
			leEth1Broadcast->setText(pNetPrivate1.pszBroadcast);
		}
		/*********************************/
	
		/******** Ethernet Card 2 ********/
		lblEth2 = new QLabel("° ̴ī", frEthInfo);
		lblEth2->setGeometry(520, 10+50, 100, 20);

		leEth2IPAddr = new QLineEdit(frEthInfo);
		leEth2IPAddr->setGeometry(520, 40+50, 150, 20);
		leEth2IPAddr->setText(pszPrivate2IPAddr);
		/*** text -> proc ***/

		leEth2Netmask = new QLineEdit(frEthInfo);
		leEth2Netmask->setGeometry(520, 40+30+50, 150, 20);
		leEth2Netmask->setText(pszPrivate2Netmask);
		/*** text -> proc ***/

		leEth2Network = new QLineEdit(frEthInfo);
		leEth2Network->setGeometry(520, 40+60+50, 150, 20);

		leEth2Broadcast = new QLineEdit(frEthInfo);
		leEth2Broadcast->setGeometry(520, 40+90+50, 150, 20);
		leEth2Network->setEnabled(0);
		leEth2Broadcast->setEnabled(0);
		if (strlen(pszPrivate2IPAddr) >= 7)
		{
			leEth2Broadcast->setText(pNetPrivate2.pszBroadcast);
			leEth2Network->setText(pNetPrivate2.pszNetwork);
		}
		/*********************************/
	
   	 	for (i = 0; i < 2; i++)
    	{
			pszSaveListStr[i] = (char *)malloc(sizeof(char)*200);
			memset(pszSaveListStr[i], '\0', 200);
	    }
	
		/*********************************/
		lblEth0NetCard = new QLabel("Ethernet 0 ī", frEthInfo);
		lblEth0NetCard->setGeometry(10, 40+90+70+60, 90, 20);
		cbEthNetCard[0] = new QComboBox(frEthInfo, "comboBox_Eth0");
		cbEthNetCard[0]->setGeometry(110, 40+90+70+60, 470, 20);
		for (i = 0; i < 40; i++)
   	 		cbEthNetCard[0]->insertItem(pszNetCard[i]);
	    cbEthNetCard[0]->setAutoResize(FALSE);
		/* conf.modules file Card ã ܺκ */
		/* pszNetConfNetCard Ѵ. */
    	if (saveSearchLineToFile("alias eth0", pszSaveListStr, 
			"/etc/conf.modules", 80, 200))
		{
    		strcpy(pszNetConfNetCard[0], pszSaveListStr[0]+11);
    		pszNetConfNetCard[0][strlen(pszNetConfNetCard[0])-1] = '\0';
		}
	
		/*   pszNetCard,  Network Card Modules  */
		/* ġǴ Card conf.modules file ִ ˻ϰ */
		if (strlen(pszIPAddr) >= 7)
		{
			for (nCardIdx = 0; nCardIdx < 40; nCardIdx++)
				if (strstr(pszNetCard[nCardIdx], pszNetConfNetCard[0]) != 
					(char *)NULL)
					break;
			/*  ٸ No Settingڿ combobox SettingѴ. */
			if (strlen(pszNetConfNetCard[0]) < 2)
				nCardIdx = 39;
	   		cbEthNetCard[0]->setCurrentItem(nCardIdx);
		}
		else
		{
			nCardIdx = 39;
   			cbEthNetCard[0]->setCurrentItem(nCardIdx);
		}
	
		/*********************************/
	
		lblEth1NetCard = new QLabel("Ethernet 1 ī", frEthInfo);
		lblEth1NetCard->setGeometry(10, 40+90+70+90, 90, 20);
		cbEthNetCard[1] = new QComboBox(frEthInfo, "comboBox_Eth1");
		cbEthNetCard[1]->setGeometry(110, 40+90+70+90, 470, 20);
		for (i = 0; i < 40; i++)
    		cbEthNetCard[1]->insertItem(pszNetCard[i]);
 	   	cbEthNetCard[1]->setAutoResize(FALSE);
		for (i = 0; i < 2; i++)
    		memset(pszSaveListStr[i], '\0', 200);
	    if (saveSearchLineToFile("alias eth1", pszSaveListStr, 
			"/etc/conf.modules", 80, 200))
		{
	    	strcpy(pszNetConfNetCard[1], pszSaveListStr[0]+11);
    		pszNetConfNetCard[1][strlen(pszNetConfNetCard[1])-1] = '\0';
		}
		if (strlen(pszPrivate1IPAddr) >= 7)
		{
			for (nCardIdx = 0; nCardIdx < 40; nCardIdx++)
				if (strstr(pszNetCard[nCardIdx], pszNetConfNetCard[1]) != 
					(char *)NULL)
					break;
			if (strlen(pszNetConfNetCard[1]) < 2)
				nCardIdx = 39;
   			cbEthNetCard[1]->setCurrentItem(nCardIdx);
		}
		else
		{
			nCardIdx = 39;
   			cbEthNetCard[1]->setCurrentItem(nCardIdx);
		}

		/**********************************/
		lblEth2NetCard = new QLabel("Ethernet 2 ī", frEthInfo);
		lblEth2NetCard->setGeometry(10, 40+90+70+120, 90, 20);
		cbEthNetCard[2] = new QComboBox(frEthInfo, "comboBox_Eth2");
		cbEthNetCard[2]->setGeometry(110, 40+90+70+120, 470, 20);
		for (i = 0; i < 40; i++)
    		cbEthNetCard[2]->insertItem(pszNetCard[i]);
	    cbEthNetCard[2]->setAutoResize(FALSE);
		for (i = 0; i < 2; i++)
	    	memset(pszSaveListStr[i], '\0', 200);
    	if (saveSearchLineToFile("alias eth2", pszSaveListStr, 
			"/etc/conf.modules", 80, 200))
		{
    		strcpy(pszNetConfNetCard[2], pszSaveListStr[0]+11);
    		pszNetConfNetCard[2][strlen(pszNetConfNetCard[2])-1] = '\0';
		}
	
		if (strlen(pszPrivate2IPAddr) >= 7)
		{
			for (nCardIdx = 0; nCardIdx < 40; nCardIdx++)
				if (strstr(pszNetCard[nCardIdx], pszNetConfNetCard[2]) != 
					(char *)NULL)
					break;
			if (strlen(pszNetConfNetCard[2]) < 2)
				nCardIdx = 39;
   			cbEthNetCard[2]->setCurrentItem(nCardIdx);
		}
		else
		{
			nCardIdx = 39;
   			cbEthNetCard[2]->setCurrentItem(nCardIdx);
		}

		cbEthNetCard[2]->setGeometry(110, 40+90+70+125, 470, 20);
		/*************************************/

  		bttnApply = new QPushButton("          ", this);
	  	bttnApply->setGeometry(150, 50+60+90+70+120+80, 150, 30);
  		QObject::connect(bttnApply, SIGNAL(clicked()), this, 
			SLOT(setApply()));
	
	  	bttnCancel = new QPushButton("         ", this);
  		bttnCancel->setGeometry(450, 50+60+90+70+120+80, 150, 30);
	  	QObject::connect(bttnCancel, SIGNAL(clicked()), this, 
			SLOT(setCancel()));

		/************************************/
	    for (i = 0; i < 2; i++)
    	    free(pszSaveListStr[i]); 

		free(pszIPAddr);
		free(pszNetmask);

		free(pszPrivate1IPAddr);
		free(pszPrivate1Netmask);
	
		free(pszPrivate2IPAddr);
		free(pszPrivate2Netmask);

		free(pszGateway);
	}

	clssDefGeneric::~clssDefGeneric()
	{
		int i;

		delete lblEth0;
		delete lblEth0IPAddr;
		delete lblEth0Netmask;
		delete lblEth0Network;
		delete lblEth0Broadcast;
		delete leEth0IPAddr;
		delete leEth0Netmask;
		delete leEth0Network;
		delete leEth0Broadcast;

		delete lblEth1;
		delete leEth1IPAddr;
		delete leEth1Netmask;
		delete leEth1Network;
		delete leEth1Broadcast;
		
		delete lblEth2;
		delete leEth2IPAddr;
		delete leEth2Netmask;
		delete leEth2Network;
		delete leEth2Broadcast;
		
		delete lblGateway;
		delete leGateway;
	
		delete lblSeparator1;
		delete lblSeparator2;
	
		for (i = 0; i < 3; i++)
			delete cbEthNetCard[i];
	
		delete lblEth0NetCard;
		delete lblEth1NetCard;
		delete lblEth2NetCard;

		delete bttnCancel;
		delete bttnApply;
	
		delete lblGenericNetworkTitle;
	
		delete frEthInfo;
	}

	/* Network  Setting  ٷ   ƴϴ. */
	/* Network     Ǵ  file鵵 ٷ־ */
	/* ϱ ̴. */
	/*  Լ  ϰ ư  , ׷  */
	/* file Ѵ. */
	void clssDefGeneric::setApply()
	{
	    char *pszIfCfgEthFile = "DEVICE=%s\nIPADDR=%s\nNETMASK=%s\n\
				NETWORK=%s\nBROADCAST=%s\nONBOOT=yes\n";
    	char *pszNetworkFile = "NETWORKING=yes\nFORWARD_IPV4=true\n\
				HOSTNAME=%s.%s\nDOMAINNAME=%s\nGATEWAY=%s\nGATEWAYDEV=eth0\n";
		char pszOptions[95];
		char *pszSaveCardLine[3], pszSaveHostName[256], pszSaveDomainName[256];
		NetTab pNet, pNetPrivate1, pNetPrivate2;
    	FILE *fp;
		S_Addr pAddr, pSaveAddr;
		char pszTmpSearch[100];
		char pszTmpInsert[100];
		char pszSaveIP[18];
		int i;
  
		memset(pszSaveIP, '\0', 18);
		getCurrentIPAddr(pszSaveIP);
		pSaveAddr = separateAddress(pszSaveIP);

		pNet = calculateNetMaskTab((char *)leEth0IPAddr->text(), 
									(char *)leEth0Netmask->text());
		pNetPrivate1 = calculateNetMaskTab((char *)leEth1IPAddr->text(), 
											(char *)leEth1Netmask->text());
		pNetPrivate2 = calculateNetMaskTab((char *)leEth2IPAddr->text(), 
											(char *)leEth2Netmask->text());
		
		memset(pszSaveHostName, '\0', 256);
		memset(pszSaveDomainName, '\0', 256);
		getCurrentHostName(pszSaveHostName, pszSaveDomainName);

		leEth0Network->setText(pNet.pszNetwork);
		leEth0Broadcast->setText(pNet.pszBroadcast);
		leEth1Network->setText(pNetPrivate1.pszNetwork);
		leEth1Broadcast->setText(pNetPrivate1.pszBroadcast);
		leEth2Network->setText(pNetPrivate2.pszNetwork);
		leEth2Broadcast->setText(pNetPrivate2.pszBroadcast);
		
		/* ifcfg-eth0, ifcfg-eth1, ifcfg-eth2 file ٷ. */
        fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth0", "w");
        fprintf(fp, pszIfCfgEthFile, 
				"eth0", leEth0IPAddr->text(), leEth0Netmask->text(), 
				leEth0Network->text(), leEth0Broadcast->text());
        fclose(fp);
     

		if (strlen((char *)leEth1IPAddr->text()) >= 7)
		{
			char pszPrivate1IPAddr[20];
			char pszCommand[150];
   
		    fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth1", "w");
        	fprintf(fp, pszIfCfgEthFile, 
					"eth1", leEth1IPAddr->text(), leEth1Netmask->text(), 
					leEth1Network->text(), leEth1Broadcast->text());
        	fclose(fp);
		}
		
		if (strlen((char *)leEth2IPAddr->text()) >= 7)
		{
			char pszPrivate2IPAddr[20];
			char pszCommand[150];
   
		    fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth2", "w");
        	fprintf(fp, pszIfCfgEthFile, 
					"eth2", leEth2IPAddr->text(), leEth2Netmask->text(), 
					leEth2Network->text(), leEth2Broadcast->text());
		    fclose(fp);
		}
   
        fp = fopen("/etc/sysconfig/network", "w");
        fprintf(fp, pszNetworkFile, pszSaveHostName, pszSaveDomainName, 
				pszSaveDomainName, leGateway->text());
        fclose(fp);
   
		for (i = 0; i < 3; i++)
		{
			if ((pszSaveCardLine[i] = (char *)malloc(sizeof(char)*50)) == NULL)
			{
				printf("pszSaveCardLine Memory Error!\n");
				exit(1);
			}
			memset(pszSaveCardLine[i], '\0', 50);
		}
		for (i = 0; i < 3; i++)
		{
			sprintf(pszSaveCardLine[i], "alias eth%d ", i);
           
            if (cbEthNetCard[i]->currentItem() >= 0 && 
				cbEthNetCard[i]->currentItem() <= 2)
                strcat(pszSaveCardLine[i], "3c59x");
            else if (cbEthNetCard[i]->currentItem() == 3)
                strcat(pszSaveCardLine[i], "eepro100");
            else if (cbEthNetCard[i]->currentItem() >= 4 && 
					cbEthNetCard[i]->currentItem() <= 7)
                strcat(pszSaveCardLine[i], "hp100");
            else if (cbEthNetCard[i]->currentItem() == 8)
                strcat(pszSaveCardLine[i], "ibmtr");
            else if (cbEthNetCard[i]->currentItem() == 9)
                strcat(pszSaveCardLine[i], "ne2k-pci");
            else if (cbEthNetCard[i]->currentItem() == 10 || 
					cbEthNetCard[i]->currentItem() == 11)
                strcat(pszSaveCardLine[i], "pcnet32");
            else if (cbEthNetCard[i]->currentItem() >= 12 && 
					cbEthNetCard[i]->currentItem() <= 15)
                strcat(pszSaveCardLine[i], "rtl8139");
            else if (cbEthNetCard[i]->currentItem() == 16)
                strcat(pszSaveCardLine[i], "smc-ultra");
            else if (cbEthNetCard[i]->currentItem() >= 17 || 
					cbEthNetCard[i]->currentItem() <= 22)
                strcat(pszSaveCardLine[i], "tlan");
            else if (cbEthNetCard[i]->currentItem() >= 23 || 
					cbEthNetCard[i]->currentItem() <= 38)
                strcat(pszSaveCardLine[i], "tulip");
		}
   
		for (i = 0; i < 3; i++)
			strcat(pszSaveCardLine[i], "\n");
   
		/* conf.modules file Ѵ. proc_file.c  ٿ */
		/*  ٷ ƷԼ ǹϴ  */
		/* conf.modules file ִ 200line, 100column  Ͽ */
		/* alias eth0 ڿ Ե line ã Network Card */
		/*  pszSaveCardLine[0] ġѶ  ̴. */
        addOnNotExistChangeOnExist(pszSaveCardLine[0], "alias eth0", 
			"/etc/conf.modules", 200, 100);
        addOnNotExistChangeOnExist(pszSaveCardLine[1], "alias eth1", 
			"/etc/conf.modules", 200, 100);
        addOnNotExistChangeOnExist(pszSaveCardLine[2], "alias eth2", 
			"/etc/conf.modules", 200, 100);
   
		if (cbEthNetCard[0]->currentItem() == 39)
			insertStrToFile("", "alias eth0", "/etc/conf.modules", 200, 100);
		if (cbEthNetCard[1]->currentItem() == 39)
			insertStrToFile("", "alias eth1", "/etc/conf.modules", 200, 100);
		if (cbEthNetCard[2]->currentItem() == 39)
			insertStrToFile("", "alias eth2", "/etc/conf.modules", 200, 100);
   
		for (i = 0; i < 3; i++)
			free(pszSaveCardLine[i]);
   
		if (cbEthNetCard[0]->currentItem() == 39)
		{
			/*  Eth0 Card SettingǾ  ʴٸ ifcfg-eth0 file */
			/*  ϰ  Network 鹮ڿ ´. */
			system("rm -f /etc/sysconfig/network-scripts/ifcfg-eth0");
			leEth0IPAddr->setText("");
			leEth0Netmask->setText("");
			leEth0Network->setText("");
			leEth0Broadcast->setText("");
		}
		if (cbEthNetCard[1]->currentItem() == 39)
		{
			system("rm -f /etc/sysconfig/network-scripts/ifcfg-eth1");
			leEth1IPAddr->setText("");
			leEth1Netmask->setText("");
			leEth1Network->setText("");
			leEth1Broadcast->setText("");
		}
		if (cbEthNetCard[2]->currentItem() == 39)
		{
			system("rm -f /etc/sysconfig/network-scripts/ifcfg-eth2");
			leEth2IPAddr->setText("");
			leEth2Netmask->setText("");
			leEth2Network->setText("");
			leEth2Broadcast->setText("");
		}
		/**************************************/
		system("cp -f /etc/sysconfig/network-scripts/ifcfg-eth0 \
			/etc/sysconfig/network-scripts/ifcfg-eth0.org\n");
		system("cp -f /etc/sysconfig/network-scripts/ifcfg-eth1 \
			/etc/sysconfig/network-scripts/ifcfg-eth1.org\n");
		system("cp -f /etc/sysconfig/network-scripts/ifcfg-eth2 \
			/etc/sysconfig/network-scripts/ifcfg-eth2.org\n");
		system("cp -f /etc/sysconfig/network /etc/sysconfig/network.org\n");
		system("cp -f /etc/conf.modules /etc/conf.modules.org\n");
		system("cp -f /etc/resolv.conf /etc/resolv.conf.org\n");
		system("/etc/rc.d/init.d/network \
			stop;/etc/rc.d/init.d/network start\n");
	}

	/* ҹư   ߴ  ڸ ãư. */
	/*  ư  ٽ ҹư  ҿ . */
	void clssDefGeneric::setCancel()
	{
		char *pszIPAddr, *pszNetmask, *pszGateway;
		char **pszHostName, *pszDomainName;
		char *pszPrivate1IPAddr, *pszPrivate1Netmask; 
		char *pszPrivate2IPAddr, *pszPrivate2Netmask;
		NetTab pNet, pNetPrivate1, pNetPrivate2;
        char *pszSaveListStr[2];
   
		if (((pszIPAddr = (char *)malloc(sizeof(char)*18)) == NULL) ||
			((pszNetmask = (char *)malloc(sizeof(char)*18)) == NULL) ||
			((pszPrivate1IPAddr = (char *)malloc(sizeof(char)*18)) == NULL) ||
			((pszPrivate1Netmask = (char *)malloc(sizeof(char)*18)) == NULL)||
			((pszPrivate2IPAddr = (char *)malloc(sizeof(char)*18)) == NULL) ||
			((pszPrivate2Netmask = (char *)malloc(sizeof(char)*18)) == NULL)||
			((pszGateway = (char *)malloc(sizeof(char)*18)) == NULL) ||
			((pszHostName = (char *)malloc(sizeof(char)*256)) == NULL) ||
			((pszDomainName = (char *)malloc(sizeof(char)*256)) == NULL))
		{
			emit printf("DefGeneric Class/Network: Memory Ҵ \n");
			exit(1);
		}
		
		memset(pszIPAddr, '\0', 18);
		memset(pszNetmask, '\0', 18);
   
		memset(pszPrivate1IPAddr, '\0', 18);
		memset(pszPrivate1Netmask, '\0', 18);
   
		memset(pszPrivate2IPAddr, '\0', 18);
		memset(pszPrivate2Netmask, '\0', 18);
   
		memset(pszGateway, '\0', 18);
		memset(pszHostName, '\0', 256);
		memset(pszDomainName, '\0', 256);
		
		getCurrentHostName(pszHostName, pszDomainName);
		getCurrentGateway(pszGateway);
		
		getCurrentIPAddr(pszIPAddr);
		getCurrentNetmask(pszNetmask);
		pNet = calculateNetMaskTab(pszIPAddr, pszNetmask);
		
		getPrivate1Netmask(pszPrivate1Netmask);
		getPrivate1IPAddr(pszPrivate1IPAddr);
		pNetPrivate1 = calculateNetMaskTab(pszPrivate1IPAddr, 
			pszPrivate1Netmask);
		
		getPrivate2Netmask(pszPrivate2Netmask);
		getPrivate2IPAddr(pszPrivate2IPAddr);
		pNetPrivate2 = calculateNetMaskTab(pszPrivate2IPAddr, 
			pszPrivate2Netmask);
   
		/***** lineeditbox init: proc -> segmentation fault *****/
		leGateway->setText(pszGateway);;
   
		leEth0IPAddr->setText(pszIPAddr);
		leEth0Netmask->setText(pszNetmask);
		leEth0Network->setText(pNet.pszNetwork);
		leEth0Broadcast->setText(pNet.pszBroadcast);
   
		leEth1IPAddr->setText(pszPrivate1IPAddr);
		leEth1Netmask->setText(pszPrivate1Netmask);
		leEth1Network->setText(pNetPrivate1.pszNetwork);
		leEth1Broadcast->setText(pNetPrivate1.pszBroadcast);
   
		leEth2IPAddr->setText(pszPrivate2IPAddr);
		leEth2Netmask->setText(pszPrivate2Netmask);
		leEth2Network->setText(pNetPrivate2.pszNetwork);
		leEth2Broadcast->setText(pNetPrivate2.pszBroadcast);
	}

	/* Title Ÿִ κ̴.  ߿  κ̹Ƿ */
	/*  ϰڴ. */
	void clssDefGeneric::printLabelFormat(QLabel *lblBold) 
	{
		QPalette p = QWidget::palette();
    	QColorGroup n = palette().normal();
	    QColorGroup g(n.background(), n.foreground(), n.light(), 
			n.dark(), n.mid(), n.background(), n.base());
    	p.setNormal(g);
	    setPalette(p);
    	lblBold->setPalette(p);
	    lblBold->setMargin(3);
	
    	QFont bold = *QApplication::font();
	    bold.setBold(TRUE);
    	bold.setPointSize(bold.pointSize()+2);

	    lblBold->setFont(bold);
    	lblBold->setFixedSize(lblBold->sizeHint());
		lblBold->setFixedSize(lblBold->sizeHint());
	}
	----------------------------------------------------------------

	/* ʹ ָ޴,  Ǯٿ޴ icon box ϴ κ */
	/* ̴.  κе鿡   2.2忡  Ƿ */
	/*  ϰڴ. */
	--------------- < Source 3.4.3 Network_menu.h > ----------------
	#include <qmainwindow.h>

	class QMenuBar;
	class QPopupMenu;
	class QToolBar;
	class clssDefGeneric;

	class clssNetwork : public QMainWindow
	{
		Q_OBJECT
			
		public:
			clssNetwork();
			~clssNetwork();
			
		public slots:
			void funcGenericNetwork();
			void funcDNS();
			void funcAlias();
			void funcQuit();
			
		protected:
			
		private:
			QMenuBar *mnuMainBar;
			QPopupMenu *mnuNetwork;
			QToolBar *tbNetwork;
			clssDefGeneric *clssGeneric;
	};
	----------------------------------------------------------------

	-------------- < Source 3.4.4 Network_menu.cpp > ---------------
	#include <qapplication.h>
	#include <qkeycode.h>
	#include <qmenubar.h>
	#include <qpopupmenu.h>
	#include <qtoolbar.h>
	#include <qtoolbutton.h>
	#include <qpixmap.h>

	#include <stdio.h>

	#include "Network_menu.h"
	#include "clssGeneric.h"
	//#include "clssDNS.h"
	//#include "clssAlias.h"

	#ifndef GENERIC_TOOLTIP
	#define GENERIC_TOOLTIP			"Ϲ Ʈũ "
	#define DNS_TOOLTIP				"DNS "
	#define ALIAS_TOOLTIP			"Alias "
	#endif

	clssNetwork::clssNetwork()
	{
		QPixmap iconGeneric, iconDNS, iconAlias;
		
		iconGeneric.load("./generic.gif");
		iconDNS.load("./dns.gif");
		iconAlias.load("./alias.gif");
		
		qApp->setStyle(WindowsStyle);
   
		mnuNetwork = new QPopupMenu;
		mnuNetwork->insertItem("Ϲ Ʈũ ", this, 
			SLOT(funcGenericNetwork()));
		mnuNetwork->insertItem("DNS ", this, SLOT(funcDNS()));
		mnuNetwork->insertItem("IP-Aliasing ", this, SLOT(funcAlias()));
		mnuNetwork->insertSeparator();
		mnuNetwork->insertItem("", this, SLOT(funcQuit()));
   
		mnuMainBar = new QMenuBar(this);
		mnuMainBar->insertItem(" Ʈũ ", mnuNetwork);
		
		tbNetwork = new QToolBar(this);
		tbNetwork->setOrientation(tbNetwork->Horizontal);
		
		QToolButton *tbttnGeneric = new QToolButton(iconGeneric, 
			GENERIC_TOOLTIP, 0, this, SLOT(funcGenericNetwork()), 
			tbNetwork, "generic");
		QToolButton *tbttnDNS = new QToolButton(iconDNS, DNS_TOOLTIP, 0, 
			this, SLOT(funcDNS()), tbNetwork, "dns");
		QToolButton *tbttnAlias = new QToolButton(iconAlias, ALIAS_TOOLTIP, 
			0, this, SLOT(funcAlias()), tbNetwork, "alias");
	}

	clssNetwork::~clssNetwork()
	{
	}

	void clssNetwork::funcGenericNetwork()
	{
		clssGeneric = new clssDefGeneric();
		clssGeneric->setGeometry(150, 150, 750, 550);
		clssGeneric->show();
	}

	void clssNetwork::funcDNS()
	{
	}

	void clssNetwork::funcAlias()
	{
	}

	void clssNetwork::funcQuit()
	{
		exit(0);
	}
	----------------------------------------------------------------

	--------------------- < Makefile 3.4. > ------------------------
	PROGS  = main_menu

	LIBS = -L/usr/lib/qt/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm 

	CC = g++
	GCC = gcc

	INCLUDE = -I/usr/lib/qt/include 
	C_FLAG =  -pipe -DNO_DEBUG -O2 
	CFLAGS = $(INCLUDE) $(C_FLAG)

	SYSCONF_LINK		= $(CC)
	SYSCONF_MOC		= /usr/bin/moc
	MOC	=	$(SYSCONF_MOC)

	OTHER_OBJS = \
			network.o \
			proc_file.o

	MNU_OBJS = \
			main_menu.o \
			Network_menu_moc.o \
			Network_menu.o \
			clssGeneric.o \
			clssGeneric_moc.o

	all:	$(PROGS)
	clean:
		rm -f *.o
		rm -f main_menu
		rm -f *_moc.*

	############# COMPILE #############

	network.o: network.c
			$(CC) -c network.c -o $@

	proc_file.o: proc_file.c
			$(CC) -c proc_file.c -o $@

	main_menu.o: main_menu.cpp 
			$(CC) -c main_menu.cpp $(CFLAGS) -o $@
		
	Network_menu_moc.cpp: Network_menu.h
			$(MOC) Network_menu.h -o Network_menu_moc.cpp 

	Network_menu_moc.o: Network_menu_moc.cpp
			$(CC) -c Network_menu_moc.cpp $(CFLAGS) -o $@

	Network_menu.o: Network_menu.cpp
			$(CC) -c Network_menu.cpp $(CFLAGS) -o $@

	clssGeneric_moc.cpp: clssGeneric.h
			$(MOC) clssGeneric.h -o clssGeneric_moc.cpp

	clssGeneric_moc.o: clssGeneric_moc.cpp
			$(CC) -c clssGeneric_moc.cpp $(CFLAGS) -o $@

	clssGeneric.o: clssGeneric.cpp
			$(CC) -c clssGeneric.cpp $(CFLAGS) -o $@

	main_menu: $(MNU_OBJS) $(OTHER_OBJS) 
			$(CC) $(MNU_OBJS) $(OTHER_OBJS) $(LIBS) -o $@
	----------------------------------------------------------------

3.4.2. DNS

	  ȣƮ   ̸ , ׸ DNS Server ϴ
	  ̴. ڼ  ϰڴ. Source  
	 Ƿ ϱ 츮 Ѵ.

	-------------- < Source 3.4.2.1. clssDNS.h > -------------------
	#include <qwidget.h>

	class QLabel;
	class QLineEdit;
	class QComboBox; /* to combobox */
	class QPushButton;
	class QFrame;

	class clssDefDNS : public QWidget
	{
		Q_OBJECT

		public:
			clssDefDNS();
			~clssDefDNS();
	
		public slots:
			void printLabelFormat(QLabel *lblDNSTitle);
			void rebootSystem();

		private slots:
			void applySetting();
			void cancelSetting();
			void addDNS();
			void delDNS();
	
		private:
			QLabel *lblHostName;
			QLabel *lblDomainName;
			QLineEdit *leHostName;
			QLineEdit *leDomainName;

			QLabel *lblDNSServer;
			QComboBox *cbDNSServer;

			QPushButton *bttnCancel;
			QPushButton *bttnApply;
		
			QFrame *frWorkArea;
			QLabel *lblSeparator;
			QPushButton *bttnAdd;
			QPushButton *bttnDel;
		
			QLabel *lblDNSTitle;
	};
	----------------------------------------------------------------

	-------------- < Source 3.4.2.2. clssDNS.cpp > -----------------
	#include <qapplication.h>

	#include <qwidget.h>
	#include <qpushbutton.h>

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

	#include <qlabel.h>
	#include <qlineedit.h>
	#include <qcombobox.h>

	#include "network.h"
	#include "proc_file.h"
	#include "clssDNS.h"

	clssDefDNS::clssDefDNS()
	{
		char *pszNetmask, *pszHostName, *pszDomainName;
		int i, j;
		NetTab pNet;

		if (((pszNetmask = (char *)malloc(sizeof(char)*18)) == NULL) ||
			((pszHostName = (char *)malloc(sizeof(char)*256)) == NULL) ||
			((pszDomainName = (char *)malloc(sizeof(char)*256)) == NULL))
		{
			emit printf("GenericNetwork Class/Network: Memory Ҵ \n");
			exit(1);
		}
	
		memset(pszHostName, '\0', 256);
		memset(pszDomainName, '\0', 256);
	
		/* Hostname Domainname ´. */
		getCurrentHostName(pszHostName, pszDomainName);
		/***********************/
	
		lblDNSTitle = new QLabel("DNS Setting (DNS )", this);
		lblDNSTitle->setGeometry(10, 10, 400, 20);
	//	printLabelFormat(lblDNSTitle);

	    frWorkArea = new QFrame(this);
		frWorkArea->setFrameStyle(QFrame::Box | QFrame::Raised | 
									QFrame::Plain);
		frWorkArea->setGeometry(30, 30, 330, 430);

		/******** Ethernet Card 0 ********/
		lblHostName = new QLabel("ȣƮ", frWorkArea);
		lblHostName->setGeometry(20, 50, 80, 20);
		leHostName = new QLineEdit(frWorkArea);
		leHostName->setGeometry(100, 50, 180, 20);
		leHostName->setText(pszHostName);

		lblDomainName = new QLabel("θ", frWorkArea);
		lblDomainName->setGeometry(20, 80, 80, 20);
		leDomainName = new QLineEdit(frWorkArea);
		leDomainName->setGeometry(100, 80, 180, 20);
		leDomainName->setText(pszDomainName);
	
  		bttnApply = new QPushButton("   ", frWorkArea);
	  	bttnApply->setGeometry(50, 160, 80, 30);
  		QObject::connect(bttnApply, SIGNAL(clicked()), this, 
				SLOT(applySetting()));

	  	bttnCancel = new QPushButton("   ", frWorkArea);
  		bttnCancel->setGeometry(180, 160, 80, 30);
	  	QObject::connect(bttnCancel, SIGNAL(clicked()), this, 
				SLOT(cancelSetting()));

		/*************************************/
	    lblSeparator = new QLabel(frWorkArea);
		lblSeparator->setFrameStyle(QFrame::Box | QFrame::Raised | 
				QFrame::Plain);
		lblSeparator->setGeometry(20, 230, 290, 2);

		lblDNSServer = new QLabel("DNS", frWorkArea);
		lblDNSServer->setGeometry(20, 280, 80, 20);
		cbDNSServer = new QComboBox(TRUE, frWorkArea, "comboBox_DNS");
		cbDNSServer->setGeometry(100, 280, 150, 20);
		char *pszDNSServer[50];
		int nCntDNS = countAllLineToFile("/etc/resolv.conf", 50, 200);
		for (i = 0; i < 50; i++)
		{
			if ((pszDNSServer[i] = (char *)malloc(sizeof(char)*200)) == NULL)
			{
				printf("Memory allocation error!\n");
				exit(1);
			}
			memset(pszDNSServer[i], '\0', 200);
		}
		/* DNSServer ̸  ׵ ޺ڽ Ѵ. */
		getDNSServer(pszDNSServer);
		for (i = 0; i < nCntDNS-1; i++)
    		cbDNSServer->insertItem(pszDNSServer[i]);
	    cbDNSServer->setAutoResize(FALSE);

		for (i = 0; i < 50; i++)
			free(pszDNSServer[i]);
	
	  	bttnAdd = new QPushButton("   ", frWorkArea);
  		bttnAdd->setGeometry(50, 350, 80, 30);
	  	QObject::connect(bttnAdd, SIGNAL(clicked()), this, SLOT(addDNS()));

	  	bttnDel = new QPushButton("   ", frWorkArea);
  		bttnDel->setGeometry(180, 350, 80, 30);
	  	QObject::connect(bttnDel, SIGNAL(clicked()), this, SLOT(delDNS()));
		/************************************/

		free(pszHostName);
		free(pszDomainName);
	}

	clssDefDNS::~clssDefDNS()
	{
		int i;

		delete lblHostName;
		delete lblDomainName;
		delete leHostName;
		delete leDomainName;
	
		delete bttnCancel;
		delete bttnApply;
	
		delete lblDNSServer;
		delete cbDNSServer;

		delete bttnAdd;
		delete bttnDel;

		delete frWorkArea;
		delete lblDNSTitle;
	}

	/* DNS ߰ ư   Ǵ Լ̴. */
	/* ⼭ resolv.conf file ٷ. */
	void clssDefDNS::addDNS()
	{
		char pszTmpSearch[100], pszTmpInsert[100];
   
		if (strlen(cbDNSServer->text(cbDNSServer->currentItem())) != 0)
		{
			if (strcmp(cbDNSServer->text(cbDNSServer->currentItem()), 
				cbDNSServer->currentText()) != 0)
				cbDNSServer->insertItem(cbDNSServer->currentText());
   
			/*** resolv.conf DNS server changed ***/
			memset(pszTmpSearch, '\0', 100);
			memset(pszTmpInsert, '\0', 100);
			sprintf(pszTmpInsert, "nameserver %s\n", 
					cbDNSServer->currentText());
			sprintf(pszTmpSearch, "nameserver %s", 
					cbDNSServer->currentText());
			/*  resolv.conf pszTempSearch Ǿִ  */
			/* ڿ ã ߴٸ */
			if (!searchStrInFile(pszTmpSearch, 
					"/etc/resolv.conf", 100, 100))
				/* resolv.conf pszTmpSearchڿ ִٸ   */
				/*  pszTmpInsertڿ ٲٰ, ٸ file */
				/*  κп pszTmpInsertڿ δ */
				/* ϶. */
				addOnNotExistChangeOnExist(pszTmpInsert, pszTmpSearch, 
					"/etc/resolv.conf", 100, 100);
		}
	}

	/* DNS ư   Ǵ Լ̴. */
	/* addDNS() ϴ. */
	void clssDefDNS::delDNS()
	{
		char pszTmpSearch[100], pszTmpInsert[100];
   
		if (strlen(cbDNSServer->text(cbDNSServer->currentItem())) != 0)
		{
			/*** resolv.conf DNS server changed ***/
			memset(pszTmpSearch, '\0', 100);
			sprintf(pszTmpSearch, "nameserver %s", 
					cbDNSServer->text(cbDNSServer->currentItem()));
			if (!searchStrInFile(pszTmpSearch, 
					"/etc/resolve.conf", 100, 100))
				/* pszTmpSearchڿ ãҴٸ   鹮 */
				/*  ٲپ. */
				insertStrToFile("", pszTmpSearch, "/etc/resolv.conf", 
					100, 100);
			cbDNSServer->removeItem(cbDNSServer->currentItem());
			cbDNSServer->setCurrentItem(0);
		}
	}

	/* Hostname Ȥ Domainname Ǿ ư   */
	/* Ǵ Լ̴. */
	/* Hostname  Domainname Ǿ   ؾ߸  */
	/*   ų  ִ.  ⼭ Hostname Ȥ */
	/* Domainname ٲ   ش. */
	/* Source  κ  Ƿ  ϰڴ. */
	void clssDefDNS::applySetting()
	{
        char *pszNetworkFile = "NETWORKING=yes\nFORWARD_IPV4=true\n\
			HOSTNAME=%s.%s\nDOMAINNAME=%s\nGATEWAY=%s\nGATEWAYDEV=eth0\n";
		char pszGateway[18];
		char pszOptions[95];
		char *pszSaveCardLine[3];
        FILE *fp;
		S_Addr pAddr;
		char pszTmpSearch[100], pszTmpInsert[100];
		char pszSaveIP[18], pszSaveHostName[256], pszSaveDomainName[256];
		int i;
		char pszCommand[200];
     
		memset(pszSaveIP, '\0', 18);
		memset(pszGateway, '\0', 18);
		memset(pszSaveHostName, '\0', 256);
		memset(pszSaveDomainName, '\0', 256);
		getCurrentIPAddr(pszSaveIP);
		getCurrentGateway(pszGateway);
		getCurrentHostName(pszSaveHostName, pszSaveDomainName);
   
        fp = fopen("/etc/sysconfig/network", "w");
        fprintf(fp, pszNetworkFile, leHostName->text(), leDomainName->text(), 
			leDomainName->text(), pszGateway);
        fclose(fp);
   
		/**** update named daemon ****/
   
		if (strlen(leHostName->text()) >= 1)
		{
			pAddr = separateAddress(pszSaveIP);
   
			/*** HOSTNAME Host,Domain changed ***/
			char pszTmpDomain[100];
			char pszTmpHost[50];
   
			memset(pszTmpInsert, '\0', 100);
			memset(pszTmpHost, '\0', 50);
			memset(pszTmpDomain, '\0', 100);
			strcpy(pszTmpHost, leHostName->text());
			strcpy(pszTmpDomain, leDomainName->text());
			sprintf(pszTmpInsert, "%s.%s\n", pszTmpHost, pszTmpDomain);
			addOnNotExistChangeOnExist(pszTmpInsert, pszSaveHostName, 
					"/etc/HOSTNAME", 100, 100);
			
			memset(pszTmpDomain, '\0', 100);
			memset(pszTmpHost, '\0', 50);
			strcpy(pszTmpHost, leHostName->text());
			strcpy(pszTmpDomain, leDomainName->text());
			if (strcmp(pszSaveDomainName, pszTmpDomain) != 0 || 
				strcmp(pszSaveHostName, pszTmpHost) != 0)
			{
				QWidget *wdgtRebooting = new QWidget();
				wdgtRebooting->setGeometry(300, 300, 300, 150);
				QLabel *lblRebooting = new QLabel(
"ȣƮ̸ Ȥ  ̸ ٲǷ\n ϰڽϴ.", 
					wdgtRebooting);
				lblRebooting->setGeometry(20, 20, 250, 50);
				QPushButton *bttnRebooting = new QPushButton("    ", 
							wdgtRebooting);
				bttnRebooting->setGeometry(120, 90, 120, 30);
				QObject::connect(bttnRebooting, SIGNAL(clicked()), this, 
							SLOT(rebootSystem()));
				wdgtRebooting->show();
			}
		}
		
		system(
"/etc/rc.d/init.d/network stop;/etc/rc.d/init.d/network restart\n");
	}

	void clssDefDNS::cancelSetting()
	{
		char *pszHostName, *pszDomainName;
        char *pszSaveListStr[2];
   
		if (((pszHostName = (char *)malloc(sizeof(char)*256)) == NULL) ||
			((pszDomainName = (char *)malloc(sizeof(char)*256)) == NULL))
		{
			emit printf("GenericNetwork Class/Network: Memory Ҵ \n");
			exit(1);
		}
		
		memset(pszHostName, '\0', 256);
		memset(pszDomainName, '\0', 256);
		
		getCurrentHostName(pszHostName, pszDomainName);
		
		leHostName->setText(pszHostName);
		leDomainName->setText(pszDomainName);
	}

	void clssDefDNS::rebootSystem()
	{
		system("sync;sync;sync;sync;sync;init 6\n"); 
	}

	void clssDefDNS::printLabelFormat(QLabel *lblBold) 
	{
		QPalette p = QWidget::palette();
        QColorGroup n = palette().normal();
        QColorGroup g(n.background(), n.foreground(), n.light(), 
				n.dark(), n.mid(), n.background(), n.base());
        p.setNormal(g);
        setPalette(p);
        lblBold->setPalette(p);
        lblBold->setMargin(3);
		
        QFont bold = *QApplication::font();
        bold.setBold(TRUE);
        bold.setPointSize(bold.pointSize()+2);
   
        lblBold->setFont(bold);
        lblBold->setFixedSize(lblBold->sizeHint());
		lblBold->setFixedSize(lblBold->sizeHint());
	}
	----------------------------------------------------------------

	-------------- < Source 3.4.2.3. Network_menu.h > --------------
	#include <qmainwindow.h>

	class QMenuBar;
	class QPopupMenu;
	class QToolBar;
	class clssDefGeneric;
	class clssDefDNS;

	class clssNetwork : public QMainWindow
	{
		Q_OBJECT
		
		public:
			clssNetwork();
			~clssNetwork();
		
		public slots:
			void funcGenericNetwork();
			void funcDNS();
			void funcAlias();
			void funcQuit();
		
		protected:
		
		private:
			QMenuBar *mnuMainBar;
			QPopupMenu *mnuNetwork;
			QToolBar *tbNetwork;
			clssDefGeneric *clssGeneric;
			clssDefDNS *clssDNS;
	};
	----------------------------------------------------------------

	-------------- < Source 3.4.2.4. Network_menu.cpp > ------------
	#include <qapplication.h>
	#include <qkeycode.h>
	#include <qmenubar.h>
	#include <qpopupmenu.h>
	#include <qtoolbar.h>
	#include <qtoolbutton.h>
	#include <qpixmap.h>

	#include <stdio.h>

	#include "Network_menu.h"
	#include "clssGeneric.h"
	#include "clssDNS.h"
	//#include "clssAlias.h"

	#ifndef GENERIC_TOOLTIP
	#define GENERIC_TOOLTIP			"Ϲ Ʈũ "
	#define DNS_TOOLTIP				"DNS "
	#define ALIAS_TOOLTIP			"Alias "
	#endif

	clssNetwork::clssNetwork()
	{
		QPixmap iconGeneric, iconDNS, iconAlias;
	
		iconGeneric.load("./generic.gif");
		iconDNS.load("./dns.gif");
		iconAlias.load("./alias.gif");
	
		qApp->setStyle(WindowsStyle);

		mnuNetwork = new QPopupMenu;
		mnuNetwork->insertItem("Ϲ Ʈũ ", this, 
				SLOT(funcGenericNetwork()));
		mnuNetwork->insertItem("DNS ", this, SLOT(funcDNS()));
		mnuNetwork->insertItem("IP-Aliasing ", this, SLOT(funcAlias()));
		mnuNetwork->insertSeparator();
		mnuNetwork->insertItem("", this, SLOT(funcQuit()));

		mnuMainBar = new QMenuBar(this);
		mnuMainBar->insertItem(" Ʈũ ", mnuNetwork);
	
		tbNetwork = new QToolBar(this);
		tbNetwork->setOrientation(tbNetwork->Horizontal);
	
		QToolButton *tbttnGeneric = new QToolButton(iconGeneric, 
				GENERIC_TOOLTIP, 0, this, SLOT(funcGenericNetwork()), 
				tbNetwork, "generic");
		QToolButton *tbttnDNS = new QToolButton(iconDNS, DNS_TOOLTIP, 0, 
				this, SLOT(funcDNS()), tbNetwork, "dns");
		QToolButton *tbttnAlias = new QToolButton(iconAlias, ALIAS_TOOLTIP, 
				0, this, SLOT(funcAlias()), tbNetwork, "alias");
	}

	clssNetwork::~clssNetwork()
	{
	}

	void clssNetwork::funcGenericNetwork()
	{
		clssGeneric = new clssDefGeneric();
		clssGeneric->setGeometry(150, 150, 750, 550);
		clssGeneric->show();
	}

	void clssNetwork::funcDNS()
	{
		clssDNS = new clssDefDNS();
		clssDNS->setGeometry(150, 150, 400, 500);
		clssDNS->show();
	}

	void clssNetwork::funcAlias()
	{
	}

	void clssNetwork::funcQuit()
	{
		exit(0);
	}
	----------------------------------------------------------------

	--------------------- < Makefile 3.4.2. > ----------------------
	3.4.1 Makefile  clssDNS_moc.cpp, clssDNS.cpp, 
	clssDNS.h ش.
	----------------------------------------------------------------

3.4.3. IP-Aliasing

	IP-Aliasing ؼ 3.3忡   Ƿ ̰
	 3.3忡   κе鸸 ּóϰڴ.

	-------------- < Source 3.4.3.1 clssAlias.h > ------------------
	#include <qwidget.h>

	class QLineEdit;
	class QLabel;
	class QLineEdit;
	class QListView;
	class QListViewItem;
	class QFrame;
	class QPushButton;

	class clssDefAlias : public QWidget
	{
		Q_OBJECT

		public:
			clssDefAlias();
			~clssDefAlias();
	
		public slots:
			void addSetting();
			void deleteSetting();
			void getAliasingItem();
			void printLabelFormat(QLabel *lblAliasingTitle);
	
		private slots:

		private:
			QFrame *frWorkArea;
			QPushButton *bttnAdd;
			QPushButton *bttnDelete;
		
			QFrame *frAliasList;
			QListView *lvAliasList;
			QListViewItem *lviAlias[100];
		
			QLabel *lblNetworkArea;
			QLabel *lblIP;
			QLineEdit *leIP;
			QLabel *lblNetmask;
			QLineEdit *leNetmask;
			QLabel *lblNetwork;
			QLineEdit *leNetwork;
			QLabel *lblBroadcast;
			QLineEdit *leBroadcast;

			QLabel *lblAliasingTitle;

			int nAliasCount;
	};
	----------------------------------------------------------------

	-------------- < Source 3.4.3.2 clssAlias.cpp > ----------------
	#include <qapplication.h>
	#include <qwidget.h>
	#include <qpushbutton.h>
	#include <qframe.h>
	#include <qlineedit.h>
	#include <qlabel.h>
	#include <qlistview.h>

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

	#include "proc_file.h"
	#include "network.h"

	#include "clssAlias.h"

	clssDefAlias::clssDefAlias()
	{
		int i;
		char pszSaveFile[100];
		char pszVirtualIP[18];
		FILE *fp;
		
		for (nAliasCount = 0; nAliasCount < 10; nAliasCount++)
		{
			memset(pszSaveFile, '\0', 100);
			sprintf(pszSaveFile, 
				"/etc/sysconfig/network-scripts/ifcfg-eth0:%d", nAliasCount);
			
			if ((fp = fopen(pszSaveFile, "r")) == NULL)
				break;
			fclose(fp);
		}
   
		lblAliasingTitle = new QLabel("Virtual LAN ( Ʈũ ī )", 
				this);
		lblAliasingTitle->setGeometry(10, 10, 400, 20);
	//	printLabelFormat(lblAliasingTitle);
   
		frWorkArea = new QFrame(this, "IP Aliasing Area");
		frWorkArea->setFrameStyle(QFrame::Box | QFrame::Raised | 
				QFrame::Plain);
		frWorkArea->setGeometry(40, 60, 670, 310);
		
		lblNetworkArea = new QLabel("Ʈũ ", frWorkArea);
		lblNetworkArea->setGeometry(30, 20, 120, 20);
		
		frAliasList = new QFrame(frWorkArea, "Alias List Area");
		frAliasList->setFrameStyle(QFrame::Box | QFrame::Sunken | 
				QFrame::WinPanel);
		frAliasList->setGeometry(30, 60, 320, 220);
		
		lvAliasList = new QListView(frAliasList);
		lvAliasList->setGeometry(3, 3, 314, 214);
		lvAliasList->addColumn("       Ʈũ       ");
		lvAliasList->addColumn("               IP ּ               ");
		lvAliasList->setRootIsDecorated(true);
		
		if (nAliasCount > 0)
		{
			char pszVirtualCard[10];
   
			for (i = 0; i < nAliasCount; i++)
			{
				memset(pszVirtualCard, '\0', 10);
				memset(pszVirtualIP, '\0', 18);
				sprintf(pszVirtualCard, "eth0:%d", i);
				/* Aliasing IP ´. i index̴. */
				/* 3.3  ٿ   i 2 Ѱ */
				/* ٸ ifcfg-eth0:1 , , eth0:2 Card */
				/*  ϴ IP   ̴. */
				getAliasIP(pszVirtualIP, i);
				lviAlias[i] = new QListViewItem(lvAliasList, pszVirtualCard, 
					pszVirtualIP);
			}
		}
   
		QObject::connect(lvAliasList, SIGNAL(selectionChanged()), this, 
					SLOT(getAliasingItem()));
   
		lblIP = new QLabel("IP ּ", frWorkArea);
		lblIP->setGeometry(400, 60, 70, 20);
		leIP = new QLineEdit(frWorkArea);
		leIP->setGeometry(480, 60, 130, 20);
   
		lblNetmask = new QLabel("ݸũ", frWorkArea);
		lblNetmask->setGeometry(400, 100, 70, 20);
		leNetmask = new QLineEdit(frWorkArea);
		leNetmask->setGeometry(480, 100, 130, 20);
		leNetmask->setEnabled(false);
   
		lblNetwork = new QLabel("Ʈũ", frWorkArea);
		lblNetwork->setGeometry(400, 140, 70, 20);
		leNetwork = new QLineEdit(frWorkArea);
		leNetwork->setGeometry(480, 140, 130, 20);
		leNetwork->setEnabled(false);
   
		lblBroadcast = new QLabel("εĳƮ", frWorkArea);
		lblBroadcast->setGeometry(400, 180, 70, 20);
		leBroadcast = new QLineEdit(frWorkArea);
		leBroadcast->setGeometry(480, 180, 130, 20);
		leBroadcast->setEnabled(false);
   
		bttnAdd = new QPushButton("߰", this);
		bttnAdd->setGeometry(100, 410, 150, 30);
		QObject::connect(bttnAdd, SIGNAL(clicked()), this, 
				SLOT(addSetting()));
   
		bttnDelete = new QPushButton("", this);
		bttnDelete->setGeometry(480, 410, 150, 30);
		QObject::connect(bttnDelete, SIGNAL(clicked()), this, 
				SLOT(deleteSetting()));
	}

	clssDefAlias::~clssDefAlias()
	{
		int i;
   
		delete lblNetworkArea;
		
		if (nAliasCount > 0)
			for (i = 0; i < nAliasCount; i++)
				lviAlias[i];
		delete lvAliasList;
   
		delete lblIP;
		delete leIP;
		delete lblNetmask;
		delete leNetmask;
		delete lblNetwork;
		delete leNetwork;
		delete lblBroadcast;
		delete leBroadcast;
   
		delete frAliasList;
		delete frWorkArea;
		
		delete bttnAdd;
		delete bttnDelete;
   
		delete lblAliasingTitle;
	}

	void clssDefAlias::getAliasingItem()
	{
		char pszNetmask[18];
		NetTab pNet;

		memset(pszNetmask, '\0', 18);

		getCurrentNetmask(pszNetmask);

		leIP->setText(lvAliasList->currentItem()->text(1));
		pNet = calculateNetMaskTab((char *)leIP->text(), pszNetmask);
		leNetmask->setText(pszNetmask);
		leNetwork->setText(pNet.pszNetwork);
		leBroadcast->setText(pNet.pszBroadcast);
	}

	void clssDefAlias::addSetting()
	{
		FILE *fp;
		char pszVirtualCard[10], pszFile[100];
		char pszCommand[150];
		
		memset(pszVirtualCard, '\0', 10);
		memset(pszFile, '\0', 100);
   
		sprintf(pszVirtualCard, "eth0:%d", nAliasCount);
		sprintf(pszFile, "/etc/sysconfig/network-scripts/ifcfg-%s", 
					pszVirtualCard);
		
		lviAlias[nAliasCount] = new QListViewItem(lvAliasList, 
				pszVirtualCard, leIP->text());
   
		if ((fp = fopen(pszFile, "w")) == NULL)
		{
			emit printf("file open error!\n");
			exit(1);
		}
		
		fprintf(fp, "DEVICE=%s\nIPADDR=%s\nONBOOT=yes\n",
				pszVirtualCard, leIP->text());
		fclose(fp);
		
		nAliasCount++;
		system("/etc/rc.d/init.d/network restart\n");
	}

	void clssDefAlias::deleteSetting()
	{
		int i, j;
		char pszCommand[150], pszFile[100];
		char pszVirtualIP[18];
		FILE *fp;
   
		memset(pszFile, '\0', 100);
		sprintf(pszFile, "/etc/sysconfig/network-scripts/ifcfg-eth0:%d", 
				lvAliasList->itemPos(lvAliasList->currentItem())/18);
		if ((fp = fopen(pszFile, "r")) == NULL)
			return;
		fclose(fp);
		nAliasCount--;
		
		memset(pszCommand, '\0', 150);
		memset(pszFile, '\0', 100);
		sprintf(pszFile, "/etc/sysconfig/network-scripts/ifcfg-eth0:*");
		sprintf(pszCommand, "rm -f %s\n", pszFile);
		system(pszCommand);
		
		if (nAliasCount > 0)
		{
			for (i = 0, j = 0; i < nAliasCount+1; i++)
			{
				if (i != lvAliasList->itemPos(lvAliasList->currentItem())/18)
				{
					memset(pszFile, '\0', 100);
					sprintf(pszFile, 
						"/etc/sysconfig/network-scripts/ifcfg-eth0:%d", j);
		   
					if ((fp = fopen(pszFile, "w")) == NULL)
						return;
					fprintf(fp, "DEVICE=eth0:%d\nIPADDR=%s\nONBOOT=yes\n", 
						j, lviAlias[i]->text(1));
					fclose(fp);
					j++;
				}
			}
		}
		
		/* ⼭ clearŰ Ǹ List ִ  ׸  */
		/*  ȴ. ׸  ٽ ʿ ׸ ԽŰ */
		/* ġ refreshϴ ȿ   ִ. ̷ ν */
		/* Ư item  .  ̷   */
		/*  ´.  List ִ item   ȵ  */
		/*  clearߴٰ ٽ item Խѵ system  */
		/* ӵ س   item  , , õ */
		/*   Ʋ. refreshǴ  ״ ̰ */
		/* ǹǷ ణ ¥   ִٴ ̴. */
		/*  ̺κп   ϰ ʹ. Qt Ư */
		/*  item  Լ ִ.  Լ  ٶ. */
		/* Լ  ϹǷ ϱ  ̴. */
		/* /usr/lib/qt/include/qlistview.h  QListViewItem */
		/* class removeItem QListView class repaintԼ  */
		/*  ̵ ϰ ̿ϸ  ̴. */
		lvAliasList->clear();
   
		if (nAliasCount > 0)
		{
			char pszVirtualCard[10];
   
			for (i = 0; i < nAliasCount; i++)
			{
				memset(pszVirtualCard, '\0', 10);
				memset(pszVirtualIP, '\0', 18);
				sprintf(pszVirtualCard, "eth0:%d", i);
				getAliasIP(pszVirtualIP, i);
				lviAlias[i] = new QListViewItem(lvAliasList, pszVirtualCard, 
					pszVirtualIP);
			}
		}
   
		system("/etc/rc.d/init.d/network restart\n");
	}

	void clssDefAlias::printLabelFormat(QLabel *lblBold) 
	{
		QPalette p = QWidget::palette();
		QColorGroup n = palette().normal();
		QColorGroup g(n.background(), n.foreground(), n.light(), n.dark(), 
				n.mid(), n.background(), n.base());
		p.setNormal(g);
		setPalette(p);
		lblBold->setPalette(p);
		lblBold->setMargin(3);
		
		QFont bold = *QApplication::font();
		bold.setBold(TRUE);
		bold.setPointSize(bold.pointSize()+2);
   
		lblBold->setFont(bold);
		lblBold->setFixedSize(lblBold->sizeHint());
		lblBold->setFixedSize(lblBold->sizeHint());
	}
	----------------------------------------------------------------

	-------------- < Source 3.4.3.3 Network_menu.h > ---------------
	#include <qmainwindow.h>

	class QMenuBar;
	class QPopupMenu;
	class QToolBar;
	class clssDefGeneric;
	class clssDefDNS;
	class clssDefAlias;

	class clssNetwork : public QMainWindow
	{
		Q_OBJECT
		
		public:
			clssNetwork();
			~clssNetwork();
		
		public slots:
			void funcGenericNetwork();
			void funcDNS();
			void funcAlias();
			void funcQuit();
		
		protected:
		
		private:
			QMenuBar *mnuMainBar;
			QPopupMenu *mnuNetwork;
			QToolBar *tbNetwork;
			clssDefGeneric *clssGeneric;
			clssDefDNS *clssDNS;
			clssDefAlias *clssAlias;
	};
	----------------------------------------------------------------

	------------ < Source 3.4.3.4 Network_menu.cpp > ---------------
	#include <qapplication.h>
	#include <qkeycode.h>
	#include <qmenubar.h>
	#include <qpopupmenu.h>
	#include <qtoolbar.h>
	#include <qtoolbutton.h>
	#include <qpixmap.h>

	#include <stdio.h>

	#include "Network_menu.h"
	#include "clssGeneric.h"
	#include "clssDNS.h"
	#include "clssAlias.h"

	#ifndef GENERIC_TOOLTIP
	#define GENERIC_TOOLTIP			"Ϲ Ʈũ "
	#define DNS_TOOLTIP				"DNS "
	#define ALIAS_TOOLTIP			"Alias "
	#endif

	clssNetwork::clssNetwork()
	{
		QPixmap iconGeneric, iconDNS, iconAlias;
		
		iconGeneric.load("./generic.gif");
		iconDNS.load("./dns.gif");
		iconAlias.load("./alias.gif");
		
		qApp->setStyle(WindowsStyle);
   
		mnuNetwork = new QPopupMenu;
		mnuNetwork->insertItem("Ϲ Ʈũ ", this, 
					SLOT(funcGenericNetwork()));
		mnuNetwork->insertItem("DNS ", this, SLOT(funcDNS()));
		mnuNetwork->insertItem("IP-Aliasing ", this, SLOT(funcAlias()));
		mnuNetwork->insertSeparator();
		mnuNetwork->insertItem("", this, SLOT(funcQuit()));
   
		mnuMainBar = new QMenuBar(this);
		mnuMainBar->insertItem(" Ʈũ ", mnuNetwork);
		
		tbNetwork = new QToolBar(this);
		tbNetwork->setOrientation(tbNetwork->Horizontal);
		
		QToolButton *tbttnGeneric = new QToolButton(iconGeneric, 
			GENERIC_TOOLTIP, 0, this, SLOT(funcGenericNetwork()), 
			tbNetwork, "generic");
		QToolButton *tbttnDNS = new QToolButton(iconDNS, DNS_TOOLTIP, 0, 
			this, SLOT(funcDNS()), tbNetwork, "dns");
		QToolButton *tbttnAlias = new QToolButton(iconAlias, ALIAS_TOOLTIP, 
			0, this, SLOT(funcAlias()), tbNetwork, "alias");
	}

	clssNetwork::~clssNetwork()
	{
	}

	void clssNetwork::funcGenericNetwork()
	{
		clssGeneric = new clssDefGeneric();
		clssGeneric->setGeometry(150, 150, 750, 550);
		clssGeneric->show();
	}

	void clssNetwork::funcDNS()
	{
		clssDNS = new clssDefDNS();
		clssDNS->setGeometry(150, 150, 400, 500);
		clssDNS->show();
	}

	void clssNetwork::funcAlias()
	{
		clssAlias = new clssDefAlias();
		clssAlias->setGeometry(150, 150, 750, 500);
		clssAlias->show();
	}

	void clssNetwork::funcQuit()
	{
		exit(0);
	}
	----------------------------------------------------------------

	------------ < Source 3.4.3.5 main_menu.cpp > ------------------
	#include <qapplication.h>
	#include "Network_menu.h"

	char pszNetConfHost[256];
	char pszNetConfDomain[256];

	char pszNetConfGateway[18];

	char pszNetConfIPAddr[18];
	char pszNetConfPrivate1IPAddr[18];
	char pszNetConfPrivate2IPAddr[18];

	char pszNetConfNetmask[18];
	char pszNetConfPrivate1Netmask[18];
	char pszNetConfPrivate2Netmask[18];

	char pszNetconfBroadcast[18];
	char pszNetconfPrivate1Broadcast[18];
	char pszNetconfPrivate2Broadcast[18];

	char pszNetConfNetwork[18];
	char pszNetConfPrivate1Network[18];
	char pszNetConfPrivate2Network[18];

	char pszNetConfNetCard[3][30];

	int nCountListStr;
	char pszSaveNameServer[20][30];
	int nCountNameServer;
	int nCountClient;

	extern int nAccountCount;

	int main(int argc, char* argv[])
	{
   	   	QApplication myapp(argc, argv);
   
		clssNetwork *clssTest = new clssNetwork();
		clssTest->setGeometry(100, 100, 800, 600);
		
        myapp.setMainWidget(clssTest);
   	   	clssTest->show();
   
        return myapp.exec();
	}
	----------------------------------------------------------------

	--------------------- < Makefile 3.4.3. > ----------------------
	3.4.1 Makefile  clssAlias_moc.cpp, clssAlias.cpp, 
	clssAlias.h ش.
	----------------------------------------------------------------

. ̷μ    .  κ̾   
 Ϻ Source  ø ϰ 뿡 Project 
  ̸  ϰڴ.  ڷḦ ô е鲲  Ѹ 
  ü Source  ϰڴ. 켱  ڷḦ Qt ϱ 
 ô е̶    ؿ ִ ü Source file 
 compileϰ Űñ ٶ.  GUI  δ  
 ƴ϶  ° ǾѴ.
   Project  Ȯ غñ ٶ.

------------------------------------------------------------------------

< *** ü Source *** >

//	------------------- < Source : network.h > ---------------------
#ifndef _NETWORK_H
#define _NETWORK_H

#ifndef TRUE
#define TRUE						1
#define FALSE						0
#endif

#ifndef MAX_LINE
#define MAX_LINE					100
#define MAX_COL						1000
#endif

#ifndef NO_SETTING
#define NO_SETTING						"õǾ ʽϴ."
#endif

extern char pszNetConfHost[256];
extern char pszNetConfDomain[256];

extern char pszNetConfGateway[18];

extern char pszNetConfIPAddr[18];
extern char pszNetConfPrivate1IPAddr[18];
extern char pszNetConfPrivate2IPAddr[18];

extern char pszNetConfNetmask[18];
extern char pszNetConfPrivate1Netmask[18];
extern char pszNetConfPrivate2Netmask[18];

extern char pszNetconfBroadcast[18];
extern char pszNetconfPrivate1Broadcast[18];
extern char pszNetconfPrivate2Broadcast[18];

extern char pszNetConfNetwork[18];
extern char pszNetConfPrivate1Network[18];
extern char pszNetConfPrivate2Network[18];

extern char pszNetConfNetCard[3][30];

extern int nCountListStr;
extern char pszSaveNameServer[20][30];
extern int nCountNameServer;
extern int nCountClient;

extern int nAccountCount;

typedef struct tagNETMASKTAB {
    char pszNetwork[18];
    char pszBroadcast[18];
} NetTab;

NetTab calculateNetMaskTab(char *pszIPAddr, char *pszNetmask);

typedef struct tagSEPADDR {
    char pszFirst[6];
    char pszSecond[6];
    char pszThird[6];
    char pszFourth[6];
} S_Addr;

S_Addr separateAddress(char *pszAddr);
char *calculateDate(void);

void getCurrentNetmask(char *pszNetmask);
void getCurrentGateway(char *pszGateway);
void getCurrentHostName(char *pszHostName, char *pszDomainName);
void getCurrentIPAddr(char *pszIPAddr);
void getPrivate1Netmask(char *pszPrivateNetmask);
void getPrivate1IPAddr(char *pszPrivateIPAddr);
void getPrivate2Netmask(char *pszPrivateNetmask);
void getPrivate2IPAddr(char *pszPrivateIPAddr);
void getNetCardIoIrq(char *pszIo, char *pszIrq, int nCardIdx);
void getDNSServer(char *pszDNSServer[]);
void getAliasNetmask(char *pszNetmask, int nIdx);
void getAliasIP(char *pszIPAddr, int nIdx);
void getEthNetworkCard(char *pszSaveNetCard[], char *pszCardInfo[]);
void calcIPRange(char *pszStartIP, char *pszEndIP, int nIPFourth, int nRange);
void calcIPDiffToRange(char *pszStartIP, char *pszEndIP, int *nRange);

#endif
//	----------------------------------------------------------------

//	------------------- < Source : network.c > ---------------------
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/utsname.h>
#include "network.h"
#include "proc_file.h"

/*************** Calculate Netmask table **************/
NetTab calculateNetMaskTab(char *pszIPAddr, char *pszNetmask)
{
    struct in_addr IP;
    struct in_addr Mask;
    struct in_addr pNetwork;
    struct in_addr pBroadcast;
    NetTab pNet;
    
    memset(pNet.pszNetwork, '\0', 18);
    memset(pNet.pszBroadcast, '\0', 18);
    
    IP.s_addr = inet_addr(pszIPAddr);
    Mask.s_addr = inet_addr(pszNetmask);
    
    pNetwork.s_addr = IP.s_addr & Mask.s_addr;
    memcpy(pNet.pszNetwork, inet_ntoa(pNetwork), 18);
    
    pBroadcast.s_addr = pNetwork.s_addr | ~Mask.s_addr;
    memcpy(pNet.pszBroadcast, inet_ntoa(pBroadcast), 18);
    
    return pNet;
}

/***************************************/
S_Addr separateAddress(char *pszAddr)
{
    int i = 0, j = 0, k = 0;
    S_Addr pAddr;
    
    memset(pAddr.pszFirst, '\0', 6);
    memset(pAddr.pszSecond, '\0', 6);
    memset(pAddr.pszThird, '\0', 6);
    memset(pAddr.pszFourth, '\0', 6);
    
    for (k = 0; *(pszAddr+i) != '\0'; i++, k++)
    {
		if (*(pszAddr+i) == '.')
		{
	    	i++;
		    k = 0;
		    j++;
		}
		switch (j)
		{
		    case 0:
				pAddr.pszFirst[k] = *(pszAddr+i);
				break;
	    	case 1:
				pAddr.pszSecond[k] = *(pszAddr+i);
				break;
		    case 2:
				pAddr.pszThird[k] = *(pszAddr+i);
				break;
	    	case 3:
				pAddr.pszFourth[k] = *(pszAddr+i);
				break;
		    default:
				break;
		}
    }
    return pAddr;
}

char pszDate[11];
char *calculateDate()
{
    time_t tTime;
    int i;
    
    memset(pszDate, '\0', 11);
    
    tTime = time(NULL);
    for (i = 0; i < 4; i++)
		pszDate[i] = *(ctime(&tTime)+20+i);
    for (i = 0; i < 3; i++)
		pszDate[i+4] = *(ctime(&tTime)+4+i);
    for (i = 0; i < 2; i++)
		pszDate[i+4+3] = *(ctime(&tTime)+8+i);
    
    return pszDate;
}

void getCurrentNetmask(char *pszNetmask)
{
    int i = 0;
    char pszSaveFile[1024];
    char pszSave[1024];
    FILE *fp;
    
    memset(pszSaveFile, '\0', 1024);
    memset(pszSave, '\0', 1024);
    if ((fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth0", "r")) == NULL)
		return;
    while ((pszSaveFile[i] = fgetc(fp)) != EOF)
		i++;
    fclose(fp);
    strcpy(pszSave, (char *)strstr(pszSaveFile, "NETMASK="));
    for (i = 0; pszSave[i+8] != 'N'; i++)
		pszNetmask[i] = pszSave[i+8];
    pszNetmask[i-1] = '\0';
}

void getCurrentGateway(char *pszGateway)
{
    int i = 0;
    char pszSaveFile[1024];
    char pszSave[1024];
    FILE *fp;
    
    memset(pszSaveFile, '\0', 1024);
    memset(pszSave, '\0', 1024);
    if ((fp = fopen("/etc/sysconfig/network", "r")) == NULL)
		return;
    while ((pszSaveFile[i] = fgetc(fp)) != EOF)
		i++;
    fclose(fp);
    strcpy(pszSave, (char *)strstr(pszSaveFile, "GATEWAY="));
    for (i = 0; pszSave[i+8] != 'G'; i++)
		pszGateway[i] = pszSave[i+8];
    pszGateway[i-1] = '\0';
}

void getPrivate1Netmask(char *pszPrivateNetmask)
{
    int i = 0;
    char pszSaveFile[1024];
    char pszSave[1024];
    FILE *fp;
    
    memset(pszSaveFile, '\0', 1024);
    memset(pszSave, '\0', 1024);
    if ((fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth1", "r")) == NULL)
    {
//		strcpy(pszPrivateNetmask, "255.255.0.0");
		return;
    }
    while ((pszSaveFile[i] = fgetc(fp)) != EOF)
		i++;
    fclose(fp);
    strcpy(pszSave, (char *)strstr(pszSaveFile, "NETMASK="));
    for (i = 0; pszSave[i+8] != 'N'; i++)
		pszPrivateNetmask[i] = pszSave[i+8];
    pszPrivateNetmask[i-1] = '\0';
}

void getPrivate1IPAddr(char *pszPrivateIPAddr)
{
    int i = 0;
    char pszSaveFile[1024];
    char pszSave[1024];
    FILE *fp;
    
    memset(pszSaveFile, '\0', 1024);
    memset(pszSave, '\0', 1024);
    if ((fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth1", "r")) == NULL)
    {
//		strcpy(pszPrivateIPAddr, "172.31.0.1");
		return;
    }
    while ((pszSaveFile[i] = fgetc(fp)) != EOF)
		i++;
    fclose(fp);
    strcpy(pszSave, (char *)strstr(pszSaveFile, "IPADDR="));
    for (i = 0; pszSave[i+7] != 'N'; i++)
		pszPrivateIPAddr[i] = pszSave[i+7];
    pszPrivateIPAddr[i-1] = '\0';
}

void getPrivate2Netmask(char *pszPrivateNetmask)
{
    int i = 0;
    char pszSaveFile[1024];
    char pszSave[1024];
    FILE *fp;
    
    memset(pszSaveFile, '\0', 1024);
    memset(pszSave, '\0', 1024);
    if ((fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth2", "r")) == NULL)
    {
//		strcpy(pszPrivateNetmask, "255.255.0.0");
		return;
    }
    while ((pszSaveFile[i] = fgetc(fp)) != EOF)
		i++;
    fclose(fp);
    strcpy(pszSave, (char *)strstr(pszSaveFile, "NETMASK="));
    for (i = 0; pszSave[i+8] != 'N'; i++)
		pszPrivateNetmask[i] = pszSave[i+8];
    pszPrivateNetmask[i-1] = '\0';
}

void getPrivate2IPAddr(char *pszPrivateIPAddr)
{
    int i = 0;
    char pszSaveFile[1024];
    char pszSave[1024];
    FILE *fp;
    
    memset(pszSaveFile, '\0', 1024);
    memset(pszSave, '\0', 1024);
    if ((fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth2", "r")) == NULL)
    {
//		strcpy(pszPrivateIPAddr, "192.168.1.1");
		return;
    }
    while ((pszSaveFile[i] = fgetc(fp)) != EOF)
		i++;
    fclose(fp);
    strcpy(pszSave, (char *)strstr(pszSaveFile, "IPADDR="));
    for (i = 0; pszSave[i+7] != 'N'; i++)
		pszPrivateIPAddr[i] = pszSave[i+7];
    pszPrivateIPAddr[i-1] = '\0';
}

void getCurrentHostName(char *pszHostName, char *pszDomainName)
{
    struct utsname name;
    int i, j;
    
    uname(&name);
    for (i = 0; name.nodename[i] != '.'; i++)
		pszHostName[i] = name.nodename[i];
    i++;
    for (j = 0; name.nodename[i] != '\0'; i++, j++)
		pszDomainName[j] = name.nodename[i];
}

void getCurrentIPAddr(char *pszIPAddr)
{
	char *pszSaveListStr[20];
	int i;
	
	for (i = 0; i < 20; i++)
	{
		pszSaveListStr[i] = (char *)malloc(sizeof(char)*80);
		memset(pszSaveListStr[i], '\0', 80);
	}
	
	saveSearchLineToFile("IPADDR", pszSaveListStr, 
			"/etc/sysconfig/network-scripts/ifcfg-eth0", 20, 80);
    for (i = 0; pszSaveListStr[0][i+7] != '\n'; i++)
		pszIPAddr[i] = pszSaveListStr[0][i+7];
	for (i = 0; i < 20; i++)
		free(pszSaveListStr[i]);
}

void getNetCardIoIrq(char *pszIo, char *pszIrq, int nNetCardIdx)
{
	int i;
	char *pszPosIo, *pszPosIrq;
	int nIrqIdx, nIoIdx;
	char *pszTmpStr = "options eth%d";
	char pszOptionStr[30];
	char *pszSaveListStr[3];
	
	for (i = 0; i < 3; i++)
	{
		if ((pszSaveListStr[i] = (char *)malloc(sizeof(char)*200)) == NULL)
		{
			printf("Memory allocation error!\n");
			memset(pszSaveListStr[i], '\0', 200);
			exit(1);
		}
	}
	
	memset(pszOptionStr, '\0', 30);
	sprintf(pszOptionStr, pszTmpStr, nNetCardIdx);
	saveSearchLineToFile(pszOptionStr, pszSaveListStr, "/etc/conf.modules", 
			200, 200);
	
	pszPosIo = strstr(pszSaveListStr[0], "0x");
	nIoIdx = pszPosIo-pszSaveListStr[0];
	pszPosIrq = strstr(pszSaveListStr[0], "irq=");
	nIrqIdx = pszPosIrq-pszSaveListStr[0];
		
	for (i = nIoIdx-1; i < nIrqIdx-4; i++)
		pszIo[i-nIoIdx+1] = pszSaveListStr[0][i+3];
	for (i = nIrqIdx; pszSaveListStr[0][i+4] != '\n'; i++)
		pszIrq[i-nIrqIdx] = pszSaveListStr[0][i+4];
	
	for (i = 0; i < 3; i++)
		free(pszSaveListStr[i]);
}

void getDNSServer(char *pszDNSServer[])
{
	char *pszSaveListStr[50];
	int i;
	int nCntDNS;
	
	for (i = 0; i < 50; i++)
	{
		if ((pszSaveListStr[i] = (char *)malloc(sizeof(char)*200)) == NULL)
		{
			printf("Memory allocation error!\n");
			exit(1);
		}
		memset(pszSaveListStr[i], '\0', 200);
	}

	saveSearchLineToFile("nameserver", pszSaveListStr, "/etc/resolv.conf", 
			50, 200);
	nCntDNS = countAllLineToFile("/etc/resolv.conf", 50, 200);
	nCntDNS--;
	for (i = 0; i < nCntDNS; i++)
	{
		strcpy(pszDNSServer[i], pszSaveListStr[i]+11);
		pszDNSServer[i][strlen(pszDNSServer[i])-1] = '\0';
	}
	
	for (i = 0; i < 50; i++)
		free(pszSaveListStr[i]);
}

void getAliasIP(char *pszIPAddr, int nIdx)
{
	char *pszSaveListStr[20];
	int i, j = 0;
	char pszSaveFile[100];
	FILE *fp;
	
	for (i = 0; i < 20; i++)
	{
		pszSaveListStr[i] = (char *)malloc(sizeof(char)*80);
		memset(pszSaveListStr[i], '\0', 80);
	}
	
	memset(pszSaveFile, '\0', 100);
	sprintf(pszSaveFile, "/etc/sysconfig/network-scripts/ifcfg-eth0:%d", nIdx);

	if ((fp = fopen(pszSaveFile, "r")) == NULL)
	{
		printf("File Open Error!\n");
		for (i = 0; i < 20; i++)
			free(pszSaveListStr[i]);
		return;
	}
	fclose(fp);
	saveSearchLineToFile("IPADDR", pszSaveListStr, pszSaveFile, 20, 80);
    for (i = 0; pszSaveListStr[0][i+7] != '\n'; i++)
		pszIPAddr[i] = pszSaveListStr[0][i+7];
	for (i = 0; i < 20; i++)
		free(pszSaveListStr[i]);
}

void getAliasNetmask(char *pszNetmask, int nIdx)
{
	char *pszSaveListStr[20];
	int i, j = 0;
	char pszSaveFile[100];
	FILE *fp;
	
	for (i = 0; i < 20; i++)
	{
		pszSaveListStr[i] = (char *)malloc(sizeof(char)*80);
		memset(pszSaveListStr[i], '\0', 80);
	}
	
	memset(pszSaveFile, '\0', 100);
	sprintf(pszSaveFile, "/etc/sysconfig/network-scripts/ifcfg-eth0:%d", nIdx);

	if ((fp = fopen(pszSaveFile, "r")) == NULL)
	{
		printf("File Open Error!\n");
		for (i = 0; i < 20; i++)
			free(pszSaveListStr[i]);
		return;
	}
	fclose(fp);
	saveSearchLineToFile("NETMASK", pszSaveListStr, pszSaveFile, 20, 80);
    for (i = 0; pszSaveListStr[0][i+8] != '\n'; i++)
		pszNetmask[i] = pszSaveListStr[0][i+8];
	for (i = 0; i < 20; i++)
		free(pszSaveListStr[i]);
}

void getEthNetworkCard(char *pszSaveNetCard[], char *pszCardInfo[])
{
	FILE *fp;
	int i, j, nIdx, nCount, nCardCount = 0;
	char *pszSaveListStr[100];
	char *pszSaveLine[4];
	
	if ((fp = fopen("/proc/interrupts", "r")) == NULL)
	{
		printf("file open error!\n");
		return;
	}
	fclose(fp);
	
	for (i = 0; i < 4; i++)
	{
		if ((pszSaveLine[i] = (char *)malloc(sizeof(char)*200)) == NULL)
		{
			printf("memory allocation error!\n");
			exit(1);
		}
		memset(pszSaveLine[i], '\0', 200);
	}

	for (i = 0; i < 100; i++)
	{
		if ((pszSaveListStr[i] = (char *)malloc(sizeof(char)*200)) == NULL)
		{
			printf("memory allocation error!\n");
			exit(1);
		}
		memset(pszSaveListStr[i], '\0', 200);
	}
	nCount = saveAllLineToFile(pszSaveListStr, "/proc/interrupts", 100, 200);
	
	for (i = 0, nIdx = 0; i < nCount; i++)
	{
		for (j = 0; j < 40; j++)
		{
			if (strstr(pszSaveListStr[i], pszCardInfo[j]) != (char *)NULL)
			{
				nCardCount++;
				strcpy(pszSaveLine[nIdx++], pszSaveListStr[i]);
				break;
			}
		}
	}
	if (nCardCount == 0)
	{
		strcpy(pszSaveNetCard[0], NO_SETTING);
		strcpy(pszSaveNetCard[1], NO_SETTING);
		strcpy(pszSaveNetCard[2], NO_SETTING);
	}
	else if (nCardCount == 1)
	{
		strcpy(pszSaveNetCard[0], pszSaveLine[0]+33);
		strcpy(pszSaveNetCard[1], NO_SETTING);
		strcpy(pszSaveNetCard[2], NO_SETTING);
	}
	else if (nCardCount == 2)
	{
		strcpy(pszSaveNetCard[0], pszSaveLine[0]+33);
		strcpy(pszSaveNetCard[1], pszSaveLine[1]+33);
		strcpy(pszSaveNetCard[2], NO_SETTING);
	}
	else
	{
		strcpy(pszSaveNetCard[0], pszSaveLine[0]+33);
		strcpy(pszSaveNetCard[1], pszSaveLine[1]+33);
		strcpy(pszSaveNetCard[2], pszSaveLine[2]+33);
	}

	for (i = 0; i < 4; i++)
		free(pszSaveLine[i]);
	for (i = 0; i < 100; i++)
		free(pszSaveListStr[i]);
}

void calcIPRange(char *pszStartIP, char *pszEndIP, int nIPFourth, int nRange)
{
	char pszSaveStartIP[4], pszSaveEndIP[4];
	
	memset(pszSaveStartIP, '\0', 4);
	memset(pszSaveEndIP, '\0', 4);

	if (nIPFourth%nRange != 0)
	{
		sprintf(pszSaveStartIP, "%d", (nIPFourth/nRange)*nRange);
		sprintf(pszSaveEndIP, "%d", (nIPFourth/nRange)*nRange+nRange-1);
	}
	else
	{
		sprintf(pszSaveStartIP, "%d", nIPFourth);
		sprintf(pszSaveEndIP, "%d", nIPFourth+nRange-1);
	}
	strcat(pszStartIP, pszSaveStartIP);
	strcat(pszEndIP, pszSaveEndIP);
}


void calcIPDiffToRange(char *pszStartIP, char *pszEndIP, int *nRange)
{
	S_Addr pAddr;
	int i, nSaveRange;
	int nStart, nEnd;
	
	pAddr = separateAddress(pszStartIP);
	nStart = atoi(pAddr.pszFourth);
	pAddr = separateAddress(pszEndIP);
	nEnd = atoi(pAddr.pszFourth);

	nSaveRange = nEnd-nStart+1;
	
	for (i = 0; nSaveRange > 0; i++)
		nSaveRange /= 2;
	
	*nRange = 32-(i-1);
}
//	----------------------------------------------------------------

//	------------------- < Source : proc_file.h > -------------------
#include <stdio.h>

#ifndef _LINKLIST_H_
#define _LINKLIST_H_

#ifndef SUCCESS
#define SUCCESS                 1
#define FAIL                    0
#endif

#ifndef MAX_XXX_NUM
#define MAX_XXX_NUM				10000

#define BLACKLIST_INSERT		1
#define BLACKLIST_DELETE		0
#endif

#ifndef TRUE                    
#define TRUE                    1
#define FALSE                   0
#endif

#ifndef _DOUBLE_LINKLIST_
#define _DOUBLE_LINKLIST_
typedef struct tagDOUBLELINK {
    void *pzKey;

    struct tagDOUBLELINK *next;
    struct tagDOUBLELINK *prev;
} DList;

void   initDL(void);
DList *searchDL(void *pzSearch);
DList *insertAsFirstDL(void *pzInsert);
DList *insertDL(void *pzInsert, DList *pIns);  /* insert front node p */
DList *insertDLAsKey(void *pzInsert, void *pzSearch);
DList *insertDLAsSort(void *pzInsert);
int    deleteDL(DList *pDel);
int    deleteDLAsKey(void *pzSearch);
void   deleteAllDL(void);
void   deletePerfectDL(void);
void  *printDL(DList *pPrint);

void   deleteStrFromOneLine(char *pszSave, char *pszDel, char *pszLine);
void   insertStrForeSearch(char *pszSave, char *pszInsert, char *pszSearch, 
			char *pszLine, char *pszTempLine);
void   insertStrToOneLine(char *pszSave, char *pszIns, char *pszLine);
void   changeSearchStr(char *pszIns, char *pszSearch, char *pszLine, 
			char *pszSave, int nMaxCol);
void  *printToFileDL(DList *pPrint, FILE *fp);
int    readOneLineSearchFile(char pszBuffer[], FILE *fp);
void   insertStrToFile(char *pszInsert, char *pszSearch, char *pszFileName, 
			int nMaxLine, int nMaxCol);
void   insertStrToFileLast(char *pszInsert, char *pszSearch, char *pszFileName, 
			int nMaxLine, int nMaxCol);
int    countAllLineToFile(char *pszFileName, int nMaxLine, int nMaxCol);
int    countSearchLineToFile(char *pszSearch, char *pszFileName, int nMaxLine, 
			int nMaxCol);
int    saveAllLineToFile(char *pszSaveListStr[], char *pszFileName, 
			int nMaxLine, int nMaxCol);
int    saveSearchLineToFile(char *pszSearch, char *pszSaveListStr[], 
			char *pszFileName, int nMaxLine, int nMaxCol);
int    saveSearchLineToFileWithoutComment(char *pszSearch, 
			char *pszSaveListStr[], char cComment, char *pszFileName, 
			int nMaxLine, int nMaxCol);
void   changeStrToOneLineToFile(char *pszIns, char *pszSearch, 
			char *pszFileName, int nMaxLine, int nMaxCol);
void   insertStrToOneLineToFile(char *pszIns, char *pszSearch, 
			char *pszFileName, int nMaxLine, int nMaxCol);
void   deleteStrToOneLineToFile(char *pszDel, char *pszSearch, 
			char *pszFileName, int nMaxLine, int nMaxCol);
int    searchStrInFile(char *pszSearch, char *pszFileName, 
			int nMaxLine, int nMaxCol);
void   addOnNotExistChangeOnExist(char *pszIns, char *pszSearch, 
			char *pszFileName, int nMaxLine, int nMaxCol);
void   addOnNotExistChangeOnExistWithoutComment(char *pszIns, char *pszSearch, 
			char cComment, char *pszFileName, int nMaxLine, int nMaxCol);
void   addOnNotExistChangeOnExist2Search(char *pszIns, char *pszFirstSearch, 
		char *pszSecondSearch, char *pszFileName, int nMaxLine, int nMaxCol);
void   insertForeSearchToFile(char *pszInsert, char *pszSearch, 
			char *pszFileName, int nMaxLine, int nMaxCol);
void   attatchStrToFileLine(char *pszInsert, char *pszSearch, 
			char *pszFileName, int nMaxLine, int nMaxCol);
void   saveStrIdxToFileLine(char *pszSave, char *pszSearch, char *pszFileName, 
			int nStartIdx, int nEndIdx, int nMaxLine, int nMaxCol);
void   changeStrIdxToFileLine(char *pszInsert, char *pszSearch, 
			char *pszFileName, int nStartIdx, int nEndIdx, 
			int nMaxLine, int nMaxCol);
void   attatchStrIdxToFileLine(char *pszInsert, char *pszSearch, 
			char *pszFileName, int nIdx, int nMaxLine, int nMaxCol);
void   attatchStrToFileIdxLine(char *pszInsert, char *pszFileName, 
			int nLineIdx, int nColIdx, int nMaxLine, int nMaxCol);
void   saveBetweenStrToFile(char *pszSaveLine[], char *pszStartLine, 
			char *pszEndLine, char *pszFileName, int nMaxLine, int nMaxCol);
void   changeBetweenStrToFile(char *pszInsert[], int nInsertNum, 
			char *pszStartLine, char *pszEndLine, char *pszFileName, 
			int nMaxLine, int nMaxCol);
void   insertAfterStrToFile(char *pszInsert, char *pszStartLine, 
			char *pszFileName, int nMaxLine, int nMaxCol);

void   changeStrInFile(char *pszFile, char *pszSrc, char *pszDest, 
			int nStatus);

int    getUserBlackList(char *pszXXXData[MAX_XXX_NUM], int nMode);
#endif

#endif
//	----------------------------------------------------------------

//	------------------- < Source : proc_file.c > -------------------
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <fcntl.h>
#include "proc_file.h"

DList *dblhead;
DList *dbltail;

void initDL(void)
{
    dblhead = (DList *)malloc(sizeof(DList));
    dbltail = (DList *)malloc(sizeof(DList));

    dblhead->prev = dblhead;
    dblhead->next = dbltail;
    dbltail->prev = dblhead;
    dbltail->next = dbltail;
}

DList *searchDL(void *pzSearch)
{
    DList *s;

    s = dblhead->next;
    while (s != dbltail)
    {
		if (memcmp(s->pzKey, pzSearch, sizeof(pzSearch)) == 0)
		    break;
        s = s->next;
    }
    return s;
}

DList *insertAsFirstDL(void *pzInsert)
{
    DList *p;

    p = (DList *)malloc(sizeof(DList));
    p->pzKey = pzInsert;
    p->next = dblhead->next;
    dblhead->next->prev = p;
    dblhead->next = p;
    p->prev = dblhead;

    return p;
}

DList *insertAsLastDL(void *pzInsert)
{
    insertDL(pzInsert, dbltail);
	
	return (DList *)NULL;
}

DList *insertDL(void *pzInsert, DList *pIns) /* insert front node pIns */
{
    DList *s;
    
    if (pIns == dblhead)
		return NULL;

    s = (DList *)malloc(sizeof(DList));
    s->pzKey = pzInsert;
    pIns->prev->next = s;
    s->prev = pIns->prev;
    s->next = pIns;
    pIns->prev = s;

    return s;
}

DList *insertDLAsKey(void *pzInsert, void *pzSearch)
{                                   /* insert insk front findk */
    DList *s;
    DList *r = NULL;

    s = searchDL(pzSearch);
    if (s != dbltail)
    {
        r = (DList *)malloc(sizeof(DList));
        r->pzKey = pzInsert;
        s->prev->next = r;
        r->prev = s->prev;
        r->next = s;
        s->prev = r;
    }
    return r;
}

DList *insertDLAsSort(void *pzInsert)
{
    DList *s;
    DList *r;

    s = dblhead->next;
    while (s != dbltail)
    {
		if (memcmp(s->pzKey, pzInsert, sizeof(pzInsert)) >= 0)
		    break;
        s = s->next; 
    }
    
    r = (DList *)malloc(sizeof(DList));
    r->pzKey = pzInsert;
    s->prev->next = r;
    r->prev = s->prev;
    r->next = s;
    s->prev = r;

    return r;
}

int deleteDL(DList *pDel)
{
    if (pDel == dblhead || pDel == dbltail)
        return FAIL;
    pDel->prev->next = pDel->next;
    pDel->next->prev = pDel->prev;
    free(pDel);

    return SUCCESS;
}

int deleteDLAsKey(void *pzSearch)
{
    DList *s;

    s = searchDL(pzSearch);

    if (s != dbltail)
    {
        s->prev->next = s->next;
        s->next->prev = s->prev;
        free(s);
        return SUCCESS;
    }
    return FAIL;
}

void deleteAllDL(void)
{
    DList *s;
    DList *p;

    p = dblhead->next;
    while (p != dbltail)
    {
        s = p;
        p = p->next;
        free(s);
    }

    dblhead->next = dbltail;
    dbltail->prev = dblhead;
}

void deletePerfectDL(void)
{
    DList *s;
    DList *p;

    p = dblhead->next;
    while (p != dbltail)
    {
        s = p;
        p = p->next;
        free(s);
    }
    free(dblhead);
    free(dbltail);
}

void *printDL(DList *pPrint)
{
    pPrint = dblhead->next;
    while (pPrint != dbltail)
    {
        printf("%s", (char *)(pPrint->pzKey));
        pPrint = pPrint->next;
    }

    return pPrint->pzKey;
}

/****** Insert to FILE ******/

void deleteStrFromOneLine(char *pszSave, char *pszDel, char *pszLine)
{
    char *pszPnt;
    int i, nFirstLen;
    
    if ((pszPnt = (char *)strstr(pszLine, pszDel)) == NULL)
		return;
    nFirstLen = pszPnt-pszLine;
    for (i = 0; i < nFirstLen; i++)
		pszSave[i] = pszLine[i];
    for (i = nFirstLen; pszLine[i+strlen(pszDel)] != '\0'; i++) 
		pszSave[i] = pszLine[i+strlen(pszDel)];
    pszSave[i] = '\0';
}

void insertStrForeSearch(char *pszSave, char *pszInsert,
	char *pszSearch, char *pszLine, char *pszTempLine)
{
    int i = 0;
    int nLen;
    char *pszPos;
    
    if ((char *)strstr(pszLine, pszInsert) != NULL)
    {
		strcat(pszSave, pszTempLine);
		return;
    }
    pszPos = (char *)strstr(pszLine, pszSearch);
    nLen = pszPos-pszLine;
    for (i = 0; i < nLen; i++)
		pszSave[i] = pszLine[i];
    strcat(pszSave, pszInsert);
    strcat(pszSave, strstr(pszLine, pszSearch));
}

void insertStrToOneLine(char *pszSave, char *pszIns, char *pszLine)
{
    int nFirstPos, nSecondPos;
    
    if ((char *)strstr(pszLine, pszIns) != NULL)
		return;
    for (nFirstPos = 0; nFirstPos < strlen(pszLine); nFirstPos++)
		pszSave[nFirstPos] = pszLine[nFirstPos];
    for (nSecondPos = 0; nSecondPos < strlen(pszIns); nSecondPos++)
		pszSave[nSecondPos+nFirstPos] = pszIns[nSecondPos];
    pszSave[nSecondPos+nFirstPos] = '\0';
}
    
void changeSearchStr(char *pszIns, char *pszSearch, char *pszLine, 
			char *pszSave, int nMaxCol)
{
    int i = 0;
	char *pszPos;
	int nPos;
	
	pszPos = (char *)strstr(pszLine, pszSearch);
	nPos = pszPos-pszLine;
	for (i = 0; i < nPos; i++)
		pszSave[i] = pszLine[i];
	strcat(pszSave, pszIns);
	strcat(pszSave, pszLine+nPos+strlen(pszSearch));
	pszPos = (char *)strstr(pszSave, pszSearch);
	if (pszPos == NULL)
		return;
	memset(pszLine, '\0', nMaxCol);
	strcpy(pszLine, pszSave);
	memset(pszSave, '\0', nMaxCol);
	changeSearchStr(pszIns, pszSearch, pszLine, pszSave, nMaxCol);
}

int nLine;

void *printToFileDL(DList *pPrint, FILE *fp)
{
    pPrint = dblhead->next;
    while (pPrint != dbltail)
    {
        fprintf(fp, pPrint->pzKey);
        pPrint = pPrint->next;
    }

    return pPrint->pzKey;
}

int readOneLineSearchFile(char pszBuffer[], FILE *fp)
{
    int i = 0;
    char c = '\0';
    
    do
    {
		c = getc(fp);

        pszBuffer[i++] = c;

        if (c == EOF || c == '\n')
            break;
    } while (1);

    pszBuffer[i] = '\0';
    nLine++;

    return c;
}

void insertStrToFileLast(char *pszInsert, char *pszSearch, char *pszFileName, 
			int nMaxLine, int nMaxCol)
{
    char *pszBuffer[nMaxLine];
    int i = 0, j;
    FILE *fp;
    
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
            insertAsLastDL(pszBuffer[i]);
		else
		{
            for (j = 0; j < nMaxLine; j++)
	        free(pszBuffer[j]);
	    	fclose(fp);
		    deletePerfectDL();

		    return;
		}
    }
    insertAsLastDL(pszInsert);
    fclose(fp);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (j = 0; j < nMaxLine; j++)
        free(pszBuffer[j]);
}

int countAllLineToFile(char *pszFileName, int nMaxLine, int nMaxCol)
{
    char *pszBuffer[nMaxLine];
    int i = 0, nCount = 0;
    FILE *fp;
    
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return 0;
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }
   
    for (nCount = 0; (readOneLineSearchFile(pszBuffer[nCount], fp) != EOF) && 
			(nCount < nMaxLine); nCount++);
	fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);

    return nCount;
}

int countSearchLineToFile(char *pszSearch, char *pszFileName, int nMaxLine, 
			int nMaxCol)
{
    char *pszBuffer[nMaxLine];
    int i = 0;
    int nCount = 0;
    FILE *fp;
    
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return 0;
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }
   
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
	    nCount++;
    }
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);

    return nCount;
}

int saveAllLineToFile(char *pszSaveListStr[], char *pszFileName, int nMaxLine, 
			int nMaxCol)
{
    char *pszBuffer[nMaxLine];
    int i = 0, j;
    FILE *fp;
    
    nLine = 0;
    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return 0;
    
    for (j = 0; j < nMaxLine; j++)
    {
		pszBuffer[j] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[j], '\0', nMaxCol);
    }

    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
		strcpy(pszSaveListStr[i], pszBuffer[i]);
    
    fclose(fp);
    for (j = 0; j < nMaxLine; j++)
		free(pszBuffer[j]);

    return i;
}

int saveSearchLineToFileWithoutComment(char *pszSearch, char *pszSaveListStr[], 
			char cComment, char *pszFileName, int nMaxLine, int nMaxCol)
{
    int i = 0;
    int j = 0;
    FILE *fp;
    char *pszBuffer[nMaxLine];
    
    nLine = 0;

    if ((fp = fopen(pszFileName, "r")) == NULL)
		return FALSE;
    
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }
   
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) != NULL && 
			pszBuffer[i][0] != cComment)
		{
	    	strcpy(pszSaveListStr[j], pszBuffer[i]);
		    j++;
		}
    }

    fclose(fp);
    
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
	
	return TRUE;
}

int saveSearchLineToFile(char *pszSearch, char *pszSaveListStr[], 
			char *pszFileName, int nMaxLine, int nMaxCol)
{
    int i = 0;
    int j = 0;
    FILE *fp;
    char *pszBuffer[nMaxLine];
    
    nLine = 0;

    if ((fp = fopen(pszFileName, "r")) == NULL)
		return FALSE;
    
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }
   
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
		{
	    	strcpy(pszSaveListStr[j], pszBuffer[i]);
		    j++;
		}
    }

    fclose(fp);
    
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
	
	return TRUE;
}

void changeStrToOneLineToFile(char *pszIns, char *pszSearch, char *pszFileName, 
			int nMaxLine, int nMaxCol)
{
    int i = 0, j = 0;
    FILE *fp;
    char *pszLine[nMaxLine];
    char *pszBuffer[nMaxLine];
    
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
		pszLine[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszLine[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
            insertAsLastDL(pszBuffer[i]);
		else
		{
			changeSearchStr(pszIns, pszSearch, pszBuffer[i], pszLine[j], 
					nMaxCol);
            insertAsLastDL(pszLine[j]);
			j++;
		}
    }

    fclose(fp);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
	{
		free(pszBuffer[i]);
		free(pszLine[i]);
	}
}

void insertStrToOneLineToFile(char *pszIns, char *pszSearch, char *pszFileName, 
			int nMaxLine, int nMaxCol)
{
    int i = 0;
    FILE *fp;
    char pszLine[nMaxCol];
    char *pszBuffer[nMaxLine];
    
    memset(pszLine, '\0', nMaxCol);
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
	return;
    
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
            insertAsLastDL(pszBuffer[i]);
		else
		{
            insertStrForeSearch(pszLine, pszIns, pszSearch, pszBuffer[i], 
				pszBuffer[i]);
            insertAsLastDL(pszLine);
		}
    }

    fclose(fp);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
}

void deleteStrToOneLineToFile(char *pszDel, char *pszSearch, char *pszFileName, int nMaxLine, int nMaxCol)
{
    int i = 0;
    FILE *fp;
    char pszLine[nMaxCol];
    char *pszBuffer[nMaxLine];
    
    memset(pszLine, '\0', nMaxCol);
    nLine = 0;

    fp = fopen(pszFileName, "r");
    	if (fp == NULL)
			return;
    
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
            insertAsLastDL(pszBuffer[i]);
		else
		{
            deleteStrFromOneLine(pszLine, pszDel, pszBuffer[i]);
            insertAsLastDL(pszLine);
		}
    }
    fclose(fp);

    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
}

void insertStrToFile(char *pszInsert, char *pszSearch, char *pszFileName, 
			int nMaxLine, int nMaxCol) 
{
    int i = 0;
    FILE *fp;
    char *pszBuffer[nMaxLine];
    
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
            insertAsLastDL(pszBuffer[i]);
		else
	    	insertAsLastDL(pszInsert);
    }
    fclose(fp);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
}

int searchStrInFile(char *pszSearch, char *pszFileName, int nMaxLine, 
			int nMaxCol) 
{
    int i = 0;
    FILE *fp;
    char *pszBuffer[nMaxLine];
    
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return FALSE;

    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
		{
            for (i = 0; i < nMaxLine; i++)
	    	    free(pszBuffer[i]);

            fclose(fp);
		    return TRUE;
		}
    }
    fclose(fp);

    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);

    return FALSE;
}

/** if Search is true, change.. else add **/
void addOnNotExistChangeOnExist(char *pszIns, char *pszSearch, 
			char *pszFileName, int nMaxLine, int nMaxCol)
{
    int i = 0;
    FILE *fp;
    int flgAdd = TRUE;
    char *pszBuffer[nMaxLine];
    
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) == NULL)
            insertAsLastDL(pszBuffer[i]);
		else
		{
		    insertAsLastDL(pszIns);
	    	flgAdd = FALSE;
		}
    }
    fclose(fp);
    if (flgAdd == TRUE)
        insertAsLastDL(pszIns);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
}

void addOnNotExistChangeOnExistWithoutComment(char *pszIns, char *pszSearch, 
			char cComment, char *pszFileName, int nMaxLine, int nMaxCol)
{
    int i = 0;
    FILE *fp;
    int flgAdd = TRUE;
    char *pszBuffer[nMaxLine];
    
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) == NULL || 
			pszBuffer[i][0] == cComment)
			insertAsLastDL(pszBuffer[i]);
		else 
		{
		    insertAsLastDL(pszIns);
	    	flgAdd = FALSE;
		}
    }
    fclose(fp);
    if (flgAdd == TRUE)
        insertAsLastDL(pszIns);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
}

void addOnNotExistChangeOnExist2Search(char *pszIns, char *pszFirstSearch, 
		char *pszSecondSearch, char *pszFileName, int nMaxLine, int nMaxCol)
{
    int i = 0;
    FILE *fp;
    int flgAdd = TRUE;
    char *pszBuffer[nMaxLine];
    
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszFirstSearch) != NULL && 
			(char *)strstr(pszBuffer[i], pszSecondSearch) != NULL)
		{
		    insertAsLastDL(pszIns);
	    	flgAdd = FALSE;
		}
		else
            insertAsLastDL(pszBuffer[i]);
    }
    fclose(fp);
    if (flgAdd == TRUE)
        insertAsLastDL(pszIns);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
}

void insertForeSearchToFile(char *pszInsert, char *pszSearch, 
		char *pszFileName, int nMaxLine, int nMaxCol) 
{
    int i = 0;
    FILE *fp;
    char *pszBuffer[nMaxLine];
    
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
        insertAsLastDL(pszBuffer[i]);
    fclose(fp);

    insertDLAsKey(pszInsert, pszSearch);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
}

void attatchStrToFileLine(char *pszInsert, char *pszSearch, char *pszFileName, 
			int nMaxLine, int nMaxCol)
{
	int i = 0, j;
	FILE *fp;
	char *pszBuffer[nMaxLine];
	
	nLine = 0;
	
    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
		{
			pszBuffer[i][strlen(pszBuffer[i])-1] = '\0';
			strcat(pszBuffer[i], pszInsert);
			pszBuffer[i][strlen(pszBuffer[i])] = '\n';
		}
		insertAsLastDL(pszBuffer[i]);
    }
    fclose(fp);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
}

void saveStrIdxToFileLine(char *pszSave, char *pszSearch, char *pszFileName, 
			int nStartIdx, int nEndIdx, int nMaxLine, int nMaxCol)
{
	int i = 0, j;
	FILE *fp;
	char *pszBuffer[nMaxLine];
	char pszEndBuffer[nMaxCol];
	
	nLine = 0;
	
    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
		{
			memset(pszEndBuffer, '\0', nMaxCol);
			strcpy(pszEndBuffer, pszBuffer[i]+nStartIdx);
			for (j = 0; j < nEndIdx-nStartIdx; j++)
				pszSave[j] = pszEndBuffer[j];
		}
    }
    fclose(fp);
}
	
void changeStrIdxToFileLine(char *pszInsert, char *pszSearch, 
	char *pszFileName, int nStartIdx, int nEndIdx, int nMaxLine, int nMaxCol)
{
	int i = 0, j;
	FILE *fp;
	char *pszBuffer[nMaxLine];
	char pszEndBuffer[nMaxCol];
	
	nLine = 0;
	
    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
		{
			memset(pszEndBuffer, '\0', nMaxCol);
			strcpy(pszEndBuffer, pszBuffer[i]+nEndIdx);
			pszBuffer[i][nStartIdx] = '\0';
			strcat(pszBuffer[i], pszInsert);
			strcat(pszBuffer[i], pszEndBuffer);
			pszBuffer[i][strlen(pszBuffer[i])] = '\0';
		}
		insertAsLastDL(pszBuffer[i]);
    }
    fclose(fp);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
}

void attatchStrIdxToFileLine(char *pszInsert, char *pszSearch, 
			char *pszFileName, int nIdx, int nMaxLine, int nMaxCol)
{
	int i = 0, j;
	FILE *fp;
	char *pszBuffer[nMaxLine];
	
	nLine = 0;
	
    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszSearch) != NULL)
		{
			pszBuffer[i][nIdx] = '\0';
			strcat(pszBuffer[i], pszInsert);
			pszBuffer[i][strlen(pszBuffer[i])] = '\n';
		}
		insertAsLastDL(pszBuffer[i]);
    }
    fclose(fp);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
}

void attatchStrToFileIdxLine(char *pszInsert, char *pszFileName, int nLineIdx, 
			int nColIdx, int nMaxLine, int nMaxCol)
{
	int i = 0, j;
	FILE *fp;
	char *pszBuffer[nMaxLine];
	
	nLine = 0;
	
    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if (i == nLineIdx-1)
		{
			pszBuffer[i][nColIdx] = '\0';
			strcat(pszBuffer[i], pszInsert);
			pszBuffer[i][strlen(pszBuffer[i])] = '\n';
		}
		insertAsLastDL(pszBuffer[i]);
    }
    fclose(fp);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
}

void insertAfterStrToFile(char *pszInsert, char *pszStartLine, 
			char *pszFileName, int nMaxLine, int nMaxCol)
{
    char *pszBuffer[nMaxLine];
    int i = 0, j, k;
    FILE *fp;
    
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		insertAsLastDL(pszBuffer[i]);
		if ((char *)strstr(pszBuffer[i], pszStartLine) != NULL)
		{
			insertAsLastDL(pszInsert);
			insertAsLastDL("\n");
			for (j = i+1; readOneLineSearchFile(pszBuffer[j], fp) != EOF; j++)
				insertAsLastDL(pszBuffer[j]);
			break;
		}
    }
    fclose(fp);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
	return;
}

void saveBetweenStrToFile(char *pszSaveLine[], char *pszStartLine, 
			char *pszEndLine, char *pszFileName, int nMaxLine, int nMaxCol)
{
    char *pszBuffer[nMaxLine];
    int i = 0, j;
    FILE *fp;
    
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		if ((char *)strstr(pszBuffer[i], pszStartLine) != NULL)
		{
			for (j = i+1; readOneLineSearchFile(pszBuffer[j], fp) != EOF; j++)
			{
				if ((char *)strstr(pszBuffer[j], pszEndLine) == NULL)
					strcpy(pszSaveLine[j-(i+1)], pszBuffer[j]);
				else
					break;
			}
    		fclose(fp);

            for (j = 0; j < nMaxLine; j++)
		        free(pszBuffer[j]);

		    return;
		}
    }
}

void changeBetweenStrToFile(char *pszInsert[], int nInsertNum, 
			char *pszStartLine, char *pszEndLine, char *pszFileName, 
			int nMaxLine, int nMaxCol)
{
    char *pszBuffer[nMaxLine];
    int i = 0, j, k;
    FILE *fp;
    
    nLine = 0;

    fp = fopen(pszFileName, "r");
    if (fp == NULL)
		return;
    
    for (i = 0; i < nMaxLine; i++)
    {
		pszBuffer[i] = (char *)malloc(sizeof(char)*nMaxCol);
        memset(pszBuffer[i], '\0', nMaxCol);
    }

    initDL();
    for (i = 0; readOneLineSearchFile(pszBuffer[i], fp) != EOF; i++)
    {
		insertAsLastDL(pszBuffer[i]);
		if ((char *)strstr(pszBuffer[i], pszStartLine) != NULL)
		{
			for (j = i+1; readOneLineSearchFile(pszBuffer[j], fp) != EOF; j++)
				if ((char *)strstr(pszBuffer[j], pszEndLine) != NULL)
					break;
			for (k = 0; k < nInsertNum; k++)
				insertAsLastDL(pszInsert[k]);
			insertAsLastDL(pszBuffer[j]);

			for (k = j+1; readOneLineSearchFile(pszBuffer[k], fp) != EOF; k++)
				insertAsLastDL(pszBuffer[k]);
			break;
		}
    }
    fclose(fp);
    fp = fopen(pszFileName, "w");
    printToFileDL(dblhead->next, fp);
    deletePerfectDL();
    fclose(fp);
    for (i = 0; i < nMaxLine; i++)
		free(pszBuffer[i]);
	return;
}
//	----------------------------------------------------------------

//	---------------- < Source : clssGeneric.h > --------------------
#include <qwidget.h>

class QLabel;
class QLineEdit;
class QComboBox; /* to combobox */
class QPushButton;
class QFrame;

class clssDefGeneric : public QWidget
{
	Q_OBJECT

	public:
		clssDefGeneric();
		~clssDefGeneric();
	
	private slots:
		void setApply();
		void setCancel();
		void printLabelFormat(QLabel *lblBold);
	
	private:
		QLabel *lblGenericNetworkTitle;
		QLabel *lblGateway;
		QLineEdit *leGateway;

		QLabel *lblEth0;
		QLabel *lblEth0IPAddr;
		QLineEdit *leEth0IPAddr;
		QLabel *lblEth0Netmask;
		QLineEdit *leEth0Netmask;
		QLabel *lblEth0Network;
		QLineEdit *leEth0Network;
		QLabel *lblEth0Broadcast;
		QLineEdit *leEth0Broadcast;
		QLabel *lblEth0NetCard;
		QComboBox *cbEthNetCard[3]; /* to combobox */

		QLabel *lblEth1;
		QLineEdit *leEth1IPAddr;
		QLineEdit *leEth1Netmask;
		QLineEdit *leEth1Network;
		QLineEdit *leEth1Broadcast;
		QLabel *lblEth1NetCard;

		QLabel *lblEth2;
		QLineEdit *leEth2IPAddr;
		QLineEdit *leEth2Netmask;
		QLineEdit *leEth2Network;
		QLineEdit *leEth2Broadcast;
		QLabel *lblEth2NetCard;

		QPushButton *bttnCancel;
		QPushButton *bttnApply;
		
		QFrame *frEthInfo;
		QLabel *lblSeparator1;
		QLabel *lblSeparator2;
};
//	----------------------------------------------------------------

//	---------------- < Source : clssGeneric.cpp > ------------------
#include <qwidget.h>
#include <qpushbutton.h>

#include <qapplication.h>
#include <qpalette.h>

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

/* test */
#include <qlabel.h>
#include <qlineedit.h>
#include <qcombobox.h>
#include <qradiobutton.h>
#include <qbuttongroup.h>

#include "network.h"
#include "proc_file.h"
#include "clssGeneric.h"

clssDefGeneric::clssDefGeneric()
{
	char *pszIPAddr, *pszNetmask, *pszGateway;
	char *pszPrivate1IPAddr, *pszPrivate1Netmask, *pszPrivate2IPAddr;
	char *pszPrivate2Netmask;
	int i, j, nCardIdx;
	NetTab pNet, pNetPrivate1, pNetPrivate2;
    char *pszSaveListStr[2];

	const char *pszNetCard[40] = { 
	  	" 3Com Vortex series (3c590, 3c592, 3c597, 3c595) (3c59x) ",
  		" 3Com Boomerang (3c900, 3c905, 3c575) (3c59x) ", 
	  	" 3Com Cyclone (3c905B) (3c59x) ", 
  	    " Intel EtherExpress Pro 100 (eepro100) ",
  	    " HP J2585B, J2585A, J2970, J2973 (hp100) ",
  	    " HP J2573 (hp100) ",
  	    " Compex ReadyLink ENET100-VG4 (hp100) ",
  	    " Compex FreedomLine 100/VG (hp100) ",
  	    " IBM token ring (ibmtr) ",
  	    " NE2000 (PCI) (ne2k-pci) ",
  	    " AMD PCnet/PCI 79C970/PCnet32/PCnet/PCI II 79C970A (pcnet32) ",
  	    " PCnet/PCI II 79C971A (pcnet32) ",
  	    " Allied Telesyn AT2550 (rtl8139) ", 
  	    " Genius GF100TXR (RTL8139) (rtl8139) ",
  	    " NDC Communications NE100TX-E (rtl8139) ",  
  	    " RealTek RTL8129/8139 Fast (rtl8139) ",
  	    " SMC Ultra/SMC UltraEZ/SMC Ultra32 (smc-ultra) ",
  	    " Compaq Netelligent 10 T PCI UTP (tlan) ",
  	    " Compaq Netelligent 10/100 TX PCI UTP (tlan) ", 
  	    " Compaq Netelligent Integrated 10/100 TX UTP (tlan) ",
  	    " Compaq Netelligent 10/100 TX Embedded UTP (tlan) ",
  	    " Compaq Netelligent 10/100 TX UTP (tlan) ",
  	    " Compaq Netelligent 10 T/2 PCI UTP/Coax (tlan) ",
  	    " Accton EtherDuo PCI/Accton EN1207 (tulip) ",
  	    " Adaptec ANA6901/C/Adaptec ANA6911/TX (tulip) ",
  	    " C-NET CNE-935 (tulip) ",
  	    " Cogent EM100/Cogent EM110/Cogent EM400 (tulip) ",
  	    " Cogent EM960/Cogent EM964 Quartet (tulip) ",
  	    " Danpex EN-9400P3 (tulip) ", 
  	    " D-Link DFE500-Tx/D-Link DE-530CT (tulip) ",
  	    " Linksys EtherPCI (tulip) ",
  	    " Kingston EtherX KNT40T/Kingston EtherX KNE100TX (tulip) ",
  	    " Netgear FX310 TX 10/100 (tulip) ",
  	    " SMC EtherPower/SMC 8432BT/ SMC Ether Power10/100 (tulip) ", 
  	    " Surecom EP-320X (tulip) ",
  	    " Thomas Conrad TC5048 (tulip) ",
  	    " Znyx ZX312 EtherAction/Znyx ZX314/ZX315 (tulip) ",
  	    " Znyx ZX342/ZX344/ZX345/ZX346/ZX348 (tulip) ",
  	    " Znyx ZX351 (tulip) ", 
		" õǾ ʽϴ! (No Setting)"
	};
	
	if (((pszIPAddr = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszNetmask = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszPrivate1IPAddr = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszPrivate1Netmask = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszPrivate2IPAddr = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszPrivate2Netmask = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszGateway = (char *)malloc(sizeof(char)*18)) == NULL))
	{
		emit printf("DefGeneric Class/Network: Memory Ҵ \n");
		exit(1);
	}
	
	memset(pszIPAddr, '\0', 18);
	memset(pszNetmask, '\0', 18);

	memset(pszPrivate1IPAddr, '\0', 18);
	memset(pszPrivate1Netmask, '\0', 18);

	memset(pszPrivate2IPAddr, '\0', 18);
	memset(pszPrivate2Netmask, '\0', 18);

	memset(pszGateway, '\0', 18);

	getCurrentGateway(pszGateway);
	getCurrentIPAddr(pszIPAddr);
	getCurrentNetmask(pszNetmask);
	pNet = calculateNetMaskTab(pszIPAddr, pszNetmask);
	
	getPrivate1Netmask(pszPrivate1Netmask);
	getPrivate1IPAddr(pszPrivate1IPAddr);
	pNetPrivate1 = calculateNetMaskTab(pszPrivate1IPAddr, pszPrivate1Netmask);
	
	getPrivate2Netmask(pszPrivate2Netmask);
	getPrivate2IPAddr(pszPrivate2IPAddr);
	pNetPrivate2 = calculateNetMaskTab(pszPrivate2IPAddr, pszPrivate2Netmask);
	
	/***********************/
	lblGenericNetworkTitle = new QLabel(
			"Network Setting (Ϲ Ʈũ )", this);
	lblGenericNetworkTitle->setGeometry(20, 20, 400, 20);
//	printLabelFormat(lblGenericNetworkTitle);
	/***********************/
	
    frEthInfo = new QFrame(this);
	frEthInfo->setFrameStyle(QFrame::Box | QFrame::Raised | QFrame::Plain);
	frEthInfo->setGeometry(25, 50, 700, 362);

	lblGateway = new QLabel("Ʈ", frEthInfo);
	lblGateway->setGeometry(10, 15, 80, 20);
	leGateway = new QLineEdit(frEthInfo);
	leGateway->setGeometry(90, 15, 150, 20);
	leGateway->setText(pszGateway);

	lblSeparator1 = new QLabel(frEthInfo);
	lblSeparator1->setFrameStyle(QFrame::Box | QFrame::Raised | QFrame::Plain);
	lblSeparator1->setGeometry(20, 45, 630, 2);

	/******** Ethernet Card 0 ********/
	lblEth0 = new QLabel("ù° ̴ī", frEthInfo);
	lblEth0->setGeometry(90, 10+50, 100, 20);

	lblEth0IPAddr = new QLabel("IP ּ  ", frEthInfo);
	lblEth0IPAddr->setGeometry(10, 40+50, 80, 20);
	leEth0IPAddr = new QLineEdit(frEthInfo);
	leEth0IPAddr->setGeometry(90, 40+50, 150, 20);
	leEth0IPAddr->setText(pszIPAddr);
	/*** text -> proc ***/

	lblEth0Netmask = new QLabel("Netmask ", frEthInfo);
	lblEth0Netmask->setGeometry(10, 40+30+50, 80, 20);
	leEth0Netmask = new QLineEdit(frEthInfo);
	leEth0Netmask->setGeometry(90, 40+30+50, 150, 20);
	leEth0Netmask->setText(pszNetmask);
	
	lblEth0Network = new QLabel("Network ", frEthInfo);
	lblEth0Network->setGeometry(10, 40+60+50, 80, 20);
	leEth0Network = new QLineEdit(frEthInfo);
	leEth0Network->setGeometry(90, 40+60+50, 150, 20);
	leEth0Network->setEnabled(0);
	leEth0Network->setText(pNet.pszNetwork);
	
	lblEth0Broadcast = new QLabel("Broadcast ", frEthInfo);
	lblEth0Broadcast->setGeometry(10, 40+90+50, 80, 20);
	leEth0Broadcast = new QLineEdit(frEthInfo);
	leEth0Broadcast->setGeometry(90, 40+90+50, 150, 20);
	leEth0Broadcast->setEnabled(0);
	leEth0Broadcast->setText(pNet.pszBroadcast);

	lblSeparator2 = new QLabel(frEthInfo);
	lblSeparator2->setFrameStyle(QFrame::Box | QFrame::Raised | QFrame::Plain);
	lblSeparator2->setGeometry(20, 40+90+50+40, 630, 2);
	/*** text -> proc ***/
	
	/*********************************/
		
	/******** Ethernet Card 1 ********/
	lblEth1 = new QLabel("ι° ̴ī", frEthInfo);
	lblEth1->setGeometry(300, 10+50, 100, 20);

	leEth1IPAddr = new QLineEdit(frEthInfo);
	leEth1IPAddr->setGeometry(300, 40+50, 150, 20);
	leEth1IPAddr->setText(pszPrivate1IPAddr);
	/*** text -> proc ***/

	leEth1Netmask = new QLineEdit(frEthInfo);
	leEth1Netmask->setGeometry(300, 40+30+50, 150, 20);
	leEth1Netmask->setText(pszPrivate1Netmask);
	/*** text -> proc ***/

	leEth1Network = new QLineEdit(frEthInfo);
	leEth1Network->setGeometry(300, 40+60+50, 150, 20);

	leEth1Broadcast = new QLineEdit(frEthInfo);
	leEth1Broadcast->setGeometry(300, 40+90+50, 150, 20);
	leEth1Network->setEnabled(0);
	leEth1Broadcast->setEnabled(0);
	if (strlen(pszPrivate1IPAddr) >= 7)
	{
		leEth1Network->setText(pNetPrivate1.pszNetwork);
		leEth1Broadcast->setText(pNetPrivate1.pszBroadcast);
	}
	/*********************************/
	
	/******** Ethernet Card 2 ********/
	lblEth2 = new QLabel("° ̴ī", frEthInfo);
	lblEth2->setGeometry(520, 10+50, 100, 20);

	leEth2IPAddr = new QLineEdit(frEthInfo);
	leEth2IPAddr->setGeometry(520, 40+50, 150, 20);
	leEth2IPAddr->setText(pszPrivate2IPAddr);
	/*** text -> proc ***/

	leEth2Netmask = new QLineEdit(frEthInfo);
	leEth2Netmask->setGeometry(520, 40+30+50, 150, 20);
	leEth2Netmask->setText(pszPrivate2Netmask);
	/*** text -> proc ***/

	leEth2Network = new QLineEdit(frEthInfo);
	leEth2Network->setGeometry(520, 40+60+50, 150, 20);

	leEth2Broadcast = new QLineEdit(frEthInfo);
	leEth2Broadcast->setGeometry(520, 40+90+50, 150, 20);
	leEth2Network->setEnabled(0);
	leEth2Broadcast->setEnabled(0);
	if (strlen(pszPrivate2IPAddr) >= 7)
	{
		leEth2Broadcast->setText(pNetPrivate2.pszBroadcast);
		leEth2Network->setText(pNetPrivate2.pszNetwork);
	}
	/*********************************/

    for (i = 0; i < 2; i++)
    {
		pszSaveListStr[i] = (char *)malloc(sizeof(char)*200);
		memset(pszSaveListStr[i], '\0', 200);
    }
	
	/*********************************/
	lblEth0NetCard = new QLabel("Ethernet 0 ī", frEthInfo);
	lblEth0NetCard->setGeometry(10, 40+90+70+60, 90, 20);
	cbEthNetCard[0] = new QComboBox(frEthInfo, "comboBox_Eth0");
	cbEthNetCard[0]->setGeometry(110, 40+90+70+60, 470, 20);
	for (i = 0; i < 40; i++)
    	cbEthNetCard[0]->insertItem(pszNetCard[i]);
    cbEthNetCard[0]->setAutoResize(FALSE);
    if (saveSearchLineToFile("alias eth0", pszSaveListStr, 
			"/etc/conf.modules", 80, 200))
	{
    	strcpy(pszNetConfNetCard[0], pszSaveListStr[0]+11);
    	pszNetConfNetCard[0][strlen(pszNetConfNetCard[0])-1] = '\0';
	}
	
	if (strlen(pszIPAddr) >= 7)
	{
		for (nCardIdx = 0; nCardIdx < 40; nCardIdx++)
			if (strstr(pszNetCard[nCardIdx], pszNetConfNetCard[0]) != 
									(char *)NULL)
				break;
		if (strlen(pszNetConfNetCard[0]) < 2)
			nCardIdx = 39;
	   	cbEthNetCard[0]->setCurrentItem(nCardIdx);
	}
	else
	{
		nCardIdx = 39;
   		cbEthNetCard[0]->setCurrentItem(nCardIdx);
	}

	/*********************************/
	
	lblEth1NetCard = new QLabel("Ethernet 1 ī", frEthInfo);
	lblEth1NetCard->setGeometry(10, 40+90+70+90, 90, 20);
	cbEthNetCard[1] = new QComboBox(frEthInfo, "comboBox_Eth1");
	cbEthNetCard[1]->setGeometry(110, 40+90+70+90, 470, 20);
	for (i = 0; i < 40; i++)
    	cbEthNetCard[1]->insertItem(pszNetCard[i]);
    cbEthNetCard[1]->setAutoResize(FALSE);
	for (i = 0; i < 2; i++)
    	memset(pszSaveListStr[i], '\0', 200);
    if (saveSearchLineToFile("alias eth1", pszSaveListStr, 
			"/etc/conf.modules", 80, 200))
	{
    	strcpy(pszNetConfNetCard[1], pszSaveListStr[0]+11);
    	pszNetConfNetCard[1][strlen(pszNetConfNetCard[1])-1] = '\0';
	}
	if (strlen(pszPrivate1IPAddr) >= 7)
	{
		for (nCardIdx = 0; nCardIdx < 40; nCardIdx++)
			if (strstr(pszNetCard[nCardIdx], pszNetConfNetCard[1]) != 
						(char *)NULL)
				break;
		if (strlen(pszNetConfNetCard[1]) < 2)
			nCardIdx = 39;
   		cbEthNetCard[1]->setCurrentItem(nCardIdx);
	}
	else
	{
		nCardIdx = 39;
   		cbEthNetCard[1]->setCurrentItem(nCardIdx);
	}

	/**********************************/
	lblEth2NetCard = new QLabel("Ethernet 2 ī", frEthInfo);
	lblEth2NetCard->setGeometry(10, 40+90+70+120, 90, 20);
	cbEthNetCard[2] = new QComboBox(frEthInfo, "comboBox_Eth2");
	cbEthNetCard[2]->setGeometry(110, 40+90+70+120, 470, 20);
	for (i = 0; i < 40; i++)
    	cbEthNetCard[2]->insertItem(pszNetCard[i]);
    cbEthNetCard[2]->setAutoResize(FALSE);
	for (i = 0; i < 2; i++)
    	memset(pszSaveListStr[i], '\0', 200);
    if (saveSearchLineToFile("alias eth2", pszSaveListStr, 
			"/etc/conf.modules", 80, 200))
	{
    	strcpy(pszNetConfNetCard[2], pszSaveListStr[0]+11);
    	pszNetConfNetCard[2][strlen(pszNetConfNetCard[2])-1] = '\0';
	}
	
	if (strlen(pszPrivate2IPAddr) >= 7)
	{
		for (nCardIdx = 0; nCardIdx < 40; nCardIdx++)
			if (strstr(pszNetCard[nCardIdx], pszNetConfNetCard[2]) != 
							(char *)NULL)
				break;
		if (strlen(pszNetConfNetCard[2]) < 2)
			nCardIdx = 39;
   		cbEthNetCard[2]->setCurrentItem(nCardIdx);
	}
	else
	{
		nCardIdx = 39;
   		cbEthNetCard[2]->setCurrentItem(nCardIdx);
	}

	cbEthNetCard[2]->setGeometry(110, 40+90+70+125, 470, 20);
	/*************************************/

  	bttnApply = new QPushButton("          ", this);
  	bttnApply->setGeometry(150, 50+60+90+70+120+80, 150, 30);
  	QObject::connect(bttnApply, SIGNAL(clicked()), this, SLOT(setApply()));

  	bttnCancel = new QPushButton("         ", this);
  	bttnCancel->setGeometry(450, 50+60+90+70+120+80, 150, 30);
  	QObject::connect(bttnCancel, SIGNAL(clicked()), this, SLOT(setCancel()));

	/************************************/
    for (i = 0; i < 2; i++)
        free(pszSaveListStr[i]); 

	free(pszIPAddr);
	free(pszNetmask);

	free(pszPrivate1IPAddr);
	free(pszPrivate1Netmask);
	
	free(pszPrivate2IPAddr);
	free(pszPrivate2Netmask);

	free(pszGateway);
}

clssDefGeneric::~clssDefGeneric()
{
	int i;

	delete lblEth0;
	delete lblEth0IPAddr;
	delete lblEth0Netmask;
	delete lblEth0Network;
	delete lblEth0Broadcast;
	delete leEth0IPAddr;
	delete leEth0Netmask;
	delete leEth0Network;
	delete leEth0Broadcast;

	delete lblEth1;
	delete leEth1IPAddr;
	delete leEth1Netmask;
	delete leEth1Network;
	delete leEth1Broadcast;
	
	delete lblEth2;
	delete leEth2IPAddr;
	delete leEth2Netmask;
	delete leEth2Network;
	delete leEth2Broadcast;
	
	delete lblGateway;
	delete leGateway;
	
	delete lblSeparator1;
	delete lblSeparator2;
	
	for (i = 0; i < 3; i++)
		delete cbEthNetCard[i];
	
	delete lblEth0NetCard;
	delete lblEth1NetCard;
	delete lblEth2NetCard;

	delete bttnCancel;
	delete bttnApply;
	
	delete lblGenericNetworkTitle;

	delete frEthInfo;
}

void clssDefGeneric::setApply()
{
    char *pszIfCfgEthFile = 
"DEVICE=%s\nIPADDR=%s\nNETMASK=%s\nNETWORK=%s\nBROADCAST=%s\nONBOOT=yes\n";
    char *pszNetworkFile = 
"NETWORKING=yes\nFORWARD_IPV4=true\nHOSTNAME=%s.%s\nDOMAINNAME=%s\nGATEWAY=%s\nGATEWAYDEV=eth0\n";
	char pszOptions[95];
	char *pszSaveCardLine[3], pszSaveHostName[256], pszSaveDomainName[256];
	NetTab pNet, pNetPrivate1, pNetPrivate2;
    FILE *fp;
	S_Addr pAddr, pSaveAddr;
	char pszTmpSearch[100];
	char pszTmpInsert[100];
	char pszSaveIP[18];
	int i;
  
	memset(pszSaveIP, '\0', 18);
	getCurrentIPAddr(pszSaveIP);
	pSaveAddr = separateAddress(pszSaveIP);

	pNet = calculateNetMaskTab((char *)leEth0IPAddr->text(), 
			(char *)leEth0Netmask->text());
	pNetPrivate1 = calculateNetMaskTab((char *)leEth1IPAddr->text(), 
			(char *)leEth1Netmask->text());
	pNetPrivate2 = calculateNetMaskTab((char *)leEth2IPAddr->text(), 
			(char *)leEth2Netmask->text());
	
	memset(pszSaveHostName, '\0', 256);
	memset(pszSaveDomainName, '\0', 256);
	getCurrentHostName(pszSaveHostName, pszSaveDomainName);

	leEth0Network->setText(pNet.pszNetwork);
	leEth0Broadcast->setText(pNet.pszBroadcast);
	leEth1Network->setText(pNetPrivate1.pszNetwork);
	leEth1Broadcast->setText(pNetPrivate1.pszBroadcast);
	leEth2Network->setText(pNetPrivate2.pszNetwork);
	leEth2Broadcast->setText(pNetPrivate2.pszBroadcast);
	
    fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth0", "w");
    fprintf(fp, pszIfCfgEthFile, 
			"eth0", leEth0IPAddr->text(), leEth0Netmask->text(), 
			leEth0Network->text(), leEth0Broadcast->text());
    fclose(fp);
  
	if (strlen((char *)leEth1IPAddr->text()) >= 7)
	{
		char pszPrivate1IPAddr[20];
		char pszCommand[150];

	    fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth1", "w");
    	fprintf(fp, pszIfCfgEthFile, 
				"eth1", leEth1IPAddr->text(), leEth1Netmask->text(), 
				leEth1Network->text(), leEth1Broadcast->text());
    	fclose(fp);

		memset(pszPrivate1IPAddr, '\0', 20);
		memset(pszCommand, '\0', 150);
		getPrivate1IPAddr(pszPrivate1IPAddr);
		sprintf(pszCommand, "/usr/local/topflash/bin/host_ip del %s\n", 
				pszPrivate1IPAddr);
		system(pszCommand);
		memset(pszCommand, '\0', 150);
		sprintf(pszCommand, "/usr/local/topflash/bin/host_ip add %s\n", 
				leEth1IPAddr->text());
		system(pszCommand);
	}
	
	if (strlen((char *)leEth2IPAddr->text()) >= 7)
	{
		char pszPrivate2IPAddr[20];
		char pszCommand[150];

	    fp = fopen("/etc/sysconfig/network-scripts/ifcfg-eth2", "w");
    	fprintf(fp, pszIfCfgEthFile, 
				"eth2", leEth2IPAddr->text(), leEth2Netmask->text(), 
				leEth2Network->text(), leEth2Broadcast->text());
	    fclose(fp);

		memset(pszPrivate2IPAddr, '\0', 20);
		memset(pszCommand, '\0', 150);
		getPrivate2IPAddr(pszPrivate2IPAddr);
		sprintf(pszCommand, "/usr/local/topflash/bin/host_ip del %s\n", 
				pszPrivate2IPAddr);
		system(pszCommand);
		memset(pszCommand, '\0', 150);
		sprintf(pszCommand, "/usr/local/topflash/bin/host_ip add %s\n", 
				leEth2IPAddr->text());
		system(pszCommand);
	}

    fp = fopen("/etc/sysconfig/network", "w");
    fprintf(fp, pszNetworkFile, pszSaveHostName, pszSaveDomainName, 
			pszSaveDomainName, leGateway->text());
    fclose(fp);

	for (i = 0; i < 3; i++)
	{
		if ((pszSaveCardLine[i] = (char *)malloc(sizeof(char)*50)) == NULL)
		{
			printf("pszSaveCardLine Memory Error!\n");
			exit(1);
		}
		memset(pszSaveCardLine[i], '\0', 50);
	}
	for (i = 0; i < 3; i++)
	{
		sprintf(pszSaveCardLine[i], "alias eth%d ", i);
       
        if (cbEthNetCard[i]->currentItem() >= 0 && 
				cbEthNetCard[i]->currentItem() <= 2)
            strcat(pszSaveCardLine[i], "3c59x");
        else if (cbEthNetCard[i]->currentItem() == 3)
            strcat(pszSaveCardLine[i], "eepro100");
        else if (cbEthNetCard[i]->currentItem() >= 4 && 
				cbEthNetCard[i]->currentItem() <= 7)
            strcat(pszSaveCardLine[i], "hp100");
        else if (cbEthNetCard[i]->currentItem() == 8)
            strcat(pszSaveCardLine[i], "ibmtr");
        else if (cbEthNetCard[i]->currentItem() == 9)
            strcat(pszSaveCardLine[i], "ne2k-pci");
        else if (cbEthNetCard[i]->currentItem() == 10 || 
				cbEthNetCard[i]->currentItem() == 11)
            strcat(pszSaveCardLine[i], "pcnet32");
        else if (cbEthNetCard[i]->currentItem() >= 12 && 
				cbEthNetCard[i]->currentItem() <= 15)
            strcat(pszSaveCardLine[i], "rtl8139");
        else if (cbEthNetCard[i]->currentItem() == 16)
            strcat(pszSaveCardLine[i], "smc-ultra");
        else if (cbEthNetCard[i]->currentItem() >= 17 || 
				cbEthNetCard[i]->currentItem() <= 22)
            strcat(pszSaveCardLine[i], "tlan");
        else if (cbEthNetCard[i]->currentItem() >= 23 || 
				cbEthNetCard[i]->currentItem() <= 38)
            strcat(pszSaveCardLine[i], "tulip");
	}

	for (i = 0; i < 3; i++)
		strcat(pszSaveCardLine[i], "\n");

    addOnNotExistChangeOnExist(pszSaveCardLine[0], "alias eth0", 
				"/etc/conf.modules", 200, 100);
    addOnNotExistChangeOnExist(pszSaveCardLine[1], "alias eth1", 
				"/etc/conf.modules", 200, 100);
    addOnNotExistChangeOnExist(pszSaveCardLine[2], "alias eth2", 
				"/etc/conf.modules", 200, 100);

	if (cbEthNetCard[0]->currentItem() == 39)
		insertStrToFile("", "alias eth0", "/etc/conf.modules", 200, 100);
	if (cbEthNetCard[1]->currentItem() == 39)
		insertStrToFile("", "alias eth1", "/etc/conf.modules", 200, 100);
	if (cbEthNetCard[2]->currentItem() == 39)
		insertStrToFile("", "alias eth2", "/etc/conf.modules", 200, 100);

	for (i = 0; i < 3; i++)
		free(pszSaveCardLine[i]);

	if (cbEthNetCard[0]->currentItem() == 39)
	{
		system("rm -f /etc/sysconfig/network-scripts/ifcfg-eth0");
		leEth0IPAddr->setText("");
		leEth0Netmask->setText("");
		leEth0Network->setText("");
		leEth0Broadcast->setText("");
	}
	if (cbEthNetCard[1]->currentItem() == 39)
	{
		system("rm -f /etc/sysconfig/network-scripts/ifcfg-eth1");
		leEth1IPAddr->setText("");
		leEth1Netmask->setText("");
		leEth1Network->setText("");
		leEth1Broadcast->setText("");
	}
	if (cbEthNetCard[2]->currentItem() == 39)
	{
		system("rm -f /etc/sysconfig/network-scripts/ifcfg-eth2");
		leEth2IPAddr->setText("");
		leEth2Netmask->setText("");
		leEth2Network->setText("");
		leEth2Broadcast->setText("");
	}
	/**************************************/
	system("cp -f /etc/sysconfig/network-scripts/ifcfg-eth0 \
/etc/sysconfig/network-scripts/ifcfg-eth0.org\n");
	system("cp -f /etc/sysconfig/network-scripts/ifcfg-eth1 \
/etc/sysconfig/network-scripts/ifcfg-eth1.org\n");
	system("cp -f /etc/sysconfig/network-scripts/ifcfg-eth2 \
/etc/sysconfig/network-scripts/ifcfg-eth2.org\n");
	system("cp -f /etc/sysconfig/network /etc/sysconfig/network.org\n");
	system("cp -f /etc/conf.modules /etc/conf.modules.org\n");
	system("cp -f /etc/resolv.conf /etc/resolv.conf.org\n");
	system("/etc/rc.d/init.d/network stop;/etc/rc.d/init.d/network start\n");
}

void clssDefGeneric::setCancel()
{
	char *pszIPAddr, *pszNetmask, *pszGateway, *pszHostName, *pszDomainName;
	char *pszPrivate1IPAddr, *pszPrivate1Netmask, *pszPrivate2IPAddr;
	char *pszPrivate2Netmask;
	NetTab pNet, pNetPrivate1, pNetPrivate2;
    char *pszSaveListStr[2];

	if (((pszIPAddr = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszNetmask = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszPrivate1IPAddr = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszPrivate1Netmask = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszPrivate2IPAddr = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszPrivate2Netmask = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszGateway = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszHostName = (char *)malloc(sizeof(char)*256)) == NULL) ||
		((pszDomainName = (char *)malloc(sizeof(char)*256)) == NULL))
	{
		emit printf("DefGeneric Class/Network: Memory Ҵ \n");
		exit(1);
	}
	
	memset(pszIPAddr, '\0', 18);
	memset(pszNetmask, '\0', 18);

	memset(pszPrivate1IPAddr, '\0', 18);
	memset(pszPrivate1Netmask, '\0', 18);

	memset(pszPrivate2IPAddr, '\0', 18);
	memset(pszPrivate2Netmask, '\0', 18);

	memset(pszGateway, '\0', 18);
	memset(pszHostName, '\0', 256);
	memset(pszDomainName, '\0', 256);
	
	getCurrentHostName(pszHostName, pszDomainName);
	getCurrentGateway(pszGateway);
	
	getCurrentIPAddr(pszIPAddr);
	getCurrentNetmask(pszNetmask);
	pNet = calculateNetMaskTab(pszIPAddr, pszNetmask);
	
	getPrivate1Netmask(pszPrivate1Netmask);
	getPrivate1IPAddr(pszPrivate1IPAddr);
	pNetPrivate1 = calculateNetMaskTab(pszPrivate1IPAddr, pszPrivate1Netmask);
	
	getPrivate2Netmask(pszPrivate2Netmask);
	getPrivate2IPAddr(pszPrivate2IPAddr);
	pNetPrivate2 = calculateNetMaskTab(pszPrivate2IPAddr, pszPrivate2Netmask);

	/***** lineeditbox init: proc -> segmentation fault *****/
	leGateway->setText(pszGateway);;

	leEth0IPAddr->setText(pszIPAddr);
	leEth0Netmask->setText(pszNetmask);
	leEth0Network->setText(pNet.pszNetwork);
	leEth0Broadcast->setText(pNet.pszBroadcast);

	leEth1IPAddr->setText(pszPrivate1IPAddr);
	leEth1Netmask->setText(pszPrivate1Netmask);
	leEth1Network->setText(pNetPrivate1.pszNetwork);
	leEth1Broadcast->setText(pNetPrivate1.pszBroadcast);

	leEth2IPAddr->setText(pszPrivate2IPAddr);
	leEth2Netmask->setText(pszPrivate2Netmask);
	leEth2Network->setText(pNetPrivate2.pszNetwork);
	leEth2Broadcast->setText(pNetPrivate2.pszBroadcast);
}

void clssDefGeneric::printLabelFormat(QLabel *lblBold) 
{
	QPalette p = QWidget::palette();
    QColorGroup n = palette().normal();
    QColorGroup g(n.background(), n.foreground(), n.light(), n.dark(), 
				n.mid(), n.background(), n.base());
    p.setNormal(g);
    setPalette(p);
    lblBold->setPalette(p);
    lblBold->setMargin(3);
	
    QFont bold = *QApplication::font();
    bold.setBold(TRUE);
    bold.setPointSize(bold.pointSize()+2);

    lblBold->setFont(bold);
    lblBold->setFixedSize(lblBold->sizeHint());
	lblBold->setFixedSize(lblBold->sizeHint());
}
//	----------------------------------------------------------------

//	---------------- < Source : clssDNS.h > ------------------------
#include <qwidget.h>

class QLabel;
class QLineEdit;
class QComboBox; /* to combobox */
class QPushButton;
class QFrame;

class clssDefDNS : public QWidget
{
	Q_OBJECT

	public:
		clssDefDNS();
		~clssDefDNS();
	
	public slots:
		void printLabelFormat(QLabel *lblDNSTitle);
		void rebootSystem();

	private slots:
		void applySetting();
		void cancelSetting();
		void addDNS();
		void delDNS();
	
	private:
		QLabel *lblHostName;
		QLabel *lblDomainName;
		QLineEdit *leHostName;
		QLineEdit *leDomainName;

		QLabel *lblDNSServer;
		QComboBox *cbDNSServer;

		QPushButton *bttnCancel;
		QPushButton *bttnApply;
		
		QFrame *frWorkArea;
		QLabel *lblSeparator;
		QPushButton *bttnAdd;
		QPushButton *bttnDel;
		
		QLabel *lblDNSTitle;
};
//	----------------------------------------------------------------

//	---------------- < Source : clssDNS.cpp > ----------------------
#include <qapplication.h>

#include <qwidget.h>
#include <qpushbutton.h>

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

/* test */
#include <qlabel.h>
#include <qlineedit.h>
#include <qcombobox.h>

#include "network.h"
#include "proc_file.h"
#include "clssDNS.h"

clssDefDNS::clssDefDNS()
{
	char *pszNetmask, *pszHostName, *pszDomainName;
	int i, j;
	NetTab pNet;

	if (((pszNetmask = (char *)malloc(sizeof(char)*18)) == NULL) ||
		((pszHostName = (char *)malloc(sizeof(char)*256)) == NULL) ||
		((pszDomainName = (char *)malloc(sizeof(char)*256)) == NULL))
	{
		emit printf("GenericNetwork Class/Network: Memory Ҵ \n");
		exit(1);
	}
	
	memset(pszHostName, '\0', 256);
	memset(pszDomainName, '\0', 256);
	
	getCurrentHostName(pszHostName, pszDomainName);
	/***********************/
	
	lblDNSTitle = new QLabel("DNS Setting (DNS )", this);
	lblDNSTitle->setGeometry(10, 10, 400, 20);
//	printLabelFormat(lblDNSTitle);

    frWorkArea = new QFrame(this);
	frWorkArea->setFrameStyle(QFrame::Box | QFrame::Raised | QFrame::Plain);
	frWorkArea->setGeometry(30, 30, 330, 430);

	/******** Ethernet Card 0 ********/
	lblHostName = new QLabel("ȣƮ", frWorkArea);
	lblHostName->setGeometry(20, 50, 80, 20);
	leHostName = new QLineEdit(frWorkArea);
	leHostName->setGeometry(100, 50, 180, 20);
	leHostName->setText(pszHostName);

	lblDomainName = new QLabel("θ", frWorkArea);
	lblDomainName->setGeometry(20, 80, 80, 20);
	leDomainName = new QLineEdit(frWorkArea);
	leDomainName->setGeometry(100, 80, 180, 20);
	leDomainName->setText(pszDomainName);
	
  	bttnApply = new QPushButton("   ", frWorkArea);
  	bttnApply->setGeometry(50, 160, 80, 30);
  	QObject::connect(bttnApply, SIGNAL(clicked()), this, SLOT(applySetting()));

  	bttnCancel = new QPushButton("   ", frWorkArea);
  	bttnCancel->setGeometry(180, 160, 80, 30);
  	QObject::connect(bttnCancel, SIGNAL(clicked()), this, 
			SLOT(cancelSetting()));

	/*************************************/
    lblSeparator = new QLabel(frWorkArea);
	lblSeparator->setFrameStyle(QFrame::Box | QFrame::Raised | QFrame::Plain);
	lblSeparator->setGeometry(20, 230, 290, 2);

	lblDNSServer = new QLabel("DNS", frWorkArea);
	lblDNSServer->setGeometry(20, 280, 80, 20);
	cbDNSServer = new QComboBox(TRUE, frWorkArea, "comboBox_DNS");
	cbDNSServer->setGeometry(100, 280, 150, 20);
	char *pszDNSServer[50];
	int nCntDNS = countAllLineToFile("/etc/resolv.conf", 50, 200);
	for (i = 0; i < 50; i++)
	{
		if ((pszDNSServer[i] = (char *)malloc(sizeof(char)*200)) == NULL)
		{
			printf("Memory allocation error!\n");
			exit(1);
		}
		memset(pszDNSServer[i], '\0', 200);
	}
	getDNSServer(pszDNSServer);
	for (i = 0; i < nCntDNS-1; i++)
    	cbDNSServer->insertItem(pszDNSServer[i]);
    cbDNSServer->setAutoResize(FALSE);

	for (i = 0; i < 50; i++)
		free(pszDNSServer[i]);
	
  	bttnAdd = new QPushButton("   ", frWorkArea);
  	bttnAdd->setGeometry(50, 350, 80, 30);
  	QObject::connect(bttnAdd, SIGNAL(clicked()), this, SLOT(addDNS()));

  	bttnDel = new QPushButton("   ", frWorkArea);
  	bttnDel->setGeometry(180, 350, 80, 30);
  	QObject::connect(bttnDel, SIGNAL(clicked()), this, SLOT(delDNS()));
	/************************************/

	free(pszHostName);
	free(pszDomainName);
}

clssDefDNS::~clssDefDNS()
{
	int i;

	delete lblHostName;
	delete lblDomainName;
	delete leHostName;
	delete leDomainName;
	
	delete bttnCancel;
	delete bttnApply;
	
	delete lblDNSServer;
	delete cbDNSServer;

	delete bttnAdd;
	delete bttnDel;

	delete frWorkArea;
	delete lblDNSTitle;
}

void clssDefDNS::addDNS()
{
	char pszTmpSearch[100], pszTmpInsert[100];

	if (strlen(cbDNSServer->text(cbDNSServer->currentItem())) != 0)
	{
		if (strcmp(cbDNSServer->text(cbDNSServer->currentItem()), 
				cbDNSServer->currentText()) != 0)
			cbDNSServer->insertItem(cbDNSServer->currentText());

		/*** resolv.conf DNS server changed ***/
		memset(pszTmpSearch, '\0', 100);
		memset(pszTmpInsert, '\0', 100);
		sprintf(pszTmpInsert, "nameserver %s\n", cbDNSServer->currentText());
		sprintf(pszTmpSearch, "nameserver %s", cbDNSServer->currentText());
		if (!searchStrInFile(pszTmpSearch, "/etc/resolve.conf", 100, 100))
			addOnNotExistChangeOnExist(pszTmpInsert, pszTmpSearch, 
			"/etc/resolv.conf", 100, 100);
	}
}

void clssDefDNS::delDNS()
{
	char pszTmpSearch[100], pszTmpInsert[100];

	if (strlen(cbDNSServer->text(cbDNSServer->currentItem())) != 0)
	{
		/*** resolv.conf DNS server changed ***/
		memset(pszTmpSearch, '\0', 100);
		sprintf(pszTmpSearch, "nameserver %s", 
			cbDNSServer->text(cbDNSServer->currentItem()));
		if (!searchStrInFile(pszTmpSearch, "/etc/resolve.conf", 100, 100))
			insertStrToFile("", pszTmpSearch, "/etc/resolv.conf", 100, 100);
		cbDNSServer->removeItem(cbDNSServer->currentItem());
		cbDNSServer->setCurrentItem(0);
	}
}

void clssDefDNS::applySetting()
{
    char *pszNetworkFile = 
"NETWORKING=yes\nFORWARD_IPV4=true\nHOSTNAME=%s.%s\nDOMAINNAME=%s\nGATEWAY=%s\nGATEWAYDEV=eth0\n";
	char pszGateway[18];
	char pszOptions[95];
	char *pszSaveCardLine[3];
    FILE *fp;
	S_Addr pAddr;
	char pszTmpSearch[100], pszTmpInsert[100];
	char pszSaveIP[18], pszSaveHostName[256], pszSaveDomainName[256];
	int i;
	char pszCommand[200];
  
	memset(pszSaveIP, '\0', 18);
	memset(pszGateway, '\0', 18);
	memset(pszSaveHostName, '\0', 256);
	memset(pszSaveDomainName, '\0', 256);
	getCurrentIPAddr(pszSaveIP);
	getCurrentGateway(pszGateway);
	getCurrentHostName(pszSaveHostName, pszSaveDomainName);

    fp = fopen("/etc/sysconfig/network", "w");
    fprintf(fp, pszNetworkFile, leHostName->text(), leDomainName->text(), 
			leDomainName->text(), pszGateway);
    fclose(fp);

	/**** update named daemon ****/

	if (strlen(leHostName->text()) >= 1)
	{
		pAddr = separateAddress(pszSaveIP);

		/*** HOSTNAME Host,Domain changed ***/
		char pszTmpDomain[100];
		char pszTmpHost[50];

		memset(pszTmpInsert, '\0', 100);
		memset(pszTmpHost, '\0', 50);
		memset(pszTmpDomain, '\0', 100);
		strcpy(pszTmpHost, leHostName->text());
		strcpy(pszTmpDomain, leDomainName->text());
		sprintf(pszTmpInsert, "%s.%s\n", pszTmpHost, pszTmpDomain);
		addOnNotExistChangeOnExist(pszTmpInsert, pszSaveHostName, 
				"/etc/HOSTNAME", 100, 100);
		
		memset(pszTmpDomain, '\0', 100);
		memset(pszTmpHost, '\0', 50);
		strcpy(pszTmpHost, leHostName->text());
		strcpy(pszTmpDomain, leDomainName->text());
		if (strcmp(pszSaveDomainName, pszTmpDomain) != 0 || 
			strcmp(pszSaveHostName, pszTmpHost) != 0)
		{
			QWidget *wdgtRebooting = new QWidget();
			wdgtRebooting->setGeometry(300, 300, 300, 150);
			QLabel *lblRebooting = new QLabel(
		"ȣƮ̸ Ȥ  ̸ ٲǷ\n ϰڽϴ.", 
						wdgtRebooting);
			lblRebooting->setGeometry(20, 20, 250, 50);
			QPushButton *bttnRebooting = new QPushButton("    ", 
					wdgtRebooting);
			bttnRebooting->setGeometry(120, 90, 120, 30);
			QObject::connect(bttnRebooting, SIGNAL(clicked()), this, 
						SLOT(rebootSystem()));
			wdgtRebooting->show();
		}
	}
	
	system("/etc/rc.d/init.d/network stop;/etc/rc.d/init.d/network restart\n");
}

void clssDefDNS::cancelSetting()
{
	char *pszHostName, *pszDomainName;
    char *pszSaveListStr[2];

	if (((pszHostName = (char *)malloc(sizeof(char)*256)) == NULL) ||
		((pszDomainName = (char *)malloc(sizeof(char)*256)) == NULL))
	{
		emit printf("GenericNetwork Class/Network: Memory Ҵ \n");
		exit(1);
	}
	
	memset(pszHostName, '\0', 256);
	memset(pszDomainName, '\0', 256);
	
	getCurrentHostName(pszHostName, pszDomainName);
	
	leHostName->setText(pszHostName);
	leDomainName->setText(pszDomainName);
}

void clssDefDNS::rebootSystem()
{
	system("sync;sync;sync;sync;sync;sync;sync;sync;init 6\n"); 
}

void clssDefDNS::printLabelFormat(QLabel *lblBold) 
{
	QPalette p = QWidget::palette();
    QColorGroup n = palette().normal();
    QColorGroup g(n.background(), n.foreground(), n.light(), n.dark(), 
		n.mid(), n.background(), n.base());
    p.setNormal(g);
    setPalette(p);
    lblBold->setPalette(p);
    lblBold->setMargin(3);
	
    QFont bold = *QApplication::font();
    bold.setBold(TRUE);
    bold.setPointSize(bold.pointSize()+2);

    lblBold->setFont(bold);
    lblBold->setFixedSize(lblBold->sizeHint());
	lblBold->setFixedSize(lblBold->sizeHint());
}
//	----------------------------------------------------------------

//	---------------- < Source : clssAlias.h > ----------------------
#include <qwidget.h>

class QLineEdit;
class QLabel;
class QLineEdit;
class QListView;
class QListViewItem;
class QFrame;
class QPushButton;

class clssDefAlias : public QWidget
{
	Q_OBJECT

	public:
		clssDefAlias();
		~clssDefAlias();
	
	public slots:
		void addSetting();
		void deleteSetting();
		void getAliasingItem();
		void printLabelFormat(QLabel *lblAliasingTitle);
	
	private slots:

	private:
		QFrame *frWorkArea;
		QPushButton *bttnAdd;
		QPushButton *bttnDelete;
		
		QFrame *frAliasList;
		QListView *lvAliasList;
		QListViewItem *lviAlias[100];
		
		QLabel *lblNetworkArea;
		QLabel *lblIP;
		QLineEdit *leIP;
		QLabel *lblNetmask;
		QLineEdit *leNetmask;
		QLabel *lblNetwork;
		QLineEdit *leNetwork;
		QLabel *lblBroadcast;
		QLineEdit *leBroadcast;

		QLabel *lblAliasingTitle;

		int nAliasCount;
};
//	----------------------------------------------------------------

//	---------------- < Source : clssAlias.cpp > --------------------
#include <qapplication.h>
#include <qwidget.h>
#include <qpushbutton.h>
#include <qframe.h>
#include <qlineedit.h>
#include <qlabel.h>
#include <qlistview.h>

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

#include "proc_file.h"
#include "network.h"

#include "clssAlias.h"

clssDefAlias::clssDefAlias()
{
	int i;
	char pszSaveFile[100];
	char pszVirtualIP[18];
	FILE *fp;
	
	for (nAliasCount = 0; nAliasCount < 10; nAliasCount++)
	{
		memset(pszSaveFile, '\0', 100);
		sprintf(pszSaveFile, "/etc/sysconfig/network-scripts/ifcfg-eth0:%d", 
				nAliasCount);
		
		if ((fp = fopen(pszSaveFile, "r")) == NULL)
			break;
		fclose(fp);
	}

	lblAliasingTitle = new QLabel("Virtual LAN ( Ʈũ ī )", 
				this);
	lblAliasingTitle->setGeometry(10, 10, 400, 20);
//	printLabelFormat(lblAliasingTitle);

	frWorkArea = new QFrame(this, "IP Aliasing Area");
	frWorkArea->setFrameStyle(QFrame::Box | QFrame::Raised | QFrame::Plain);
	frWorkArea->setGeometry(40, 60, 670, 310);
	
	lblNetworkArea = new QLabel("Ʈũ ", frWorkArea);
	lblNetworkArea->setGeometry(30, 20, 120, 20);
	
	frAliasList = new QFrame(frWorkArea, "Alias List Area");
	frAliasList->setFrameStyle(QFrame::Box | QFrame::Sunken | QFrame::WinPanel);
	frAliasList->setGeometry(30, 60, 320, 220);
	
	lvAliasList = new QListView(frAliasList);
	lvAliasList->setGeometry(3, 3, 314, 214);
	lvAliasList->addColumn("       Ʈũ       ");
	lvAliasList->addColumn("               IP ּ               ");
	lvAliasList->setRootIsDecorated(true);
	
	if (nAliasCount > 0)
	{
		char pszVirtualCard[10];

		for (i = 0; i < nAliasCount; i++)
		{
			memset(pszVirtualCard, '\0', 10);
			memset(pszVirtualIP, '\0', 18);
			sprintf(pszVirtualCard, "eth0:%d", i);
			getAliasIP(pszVirtualIP, i);
			lviAlias[i] = new QListViewItem(lvAliasList, pszVirtualCard, 
				pszVirtualIP);
		}
	}

	QObject::connect(lvAliasList, SIGNAL(selectionChanged()), this, 
			SLOT(getAliasingItem()));

	lblIP = new QLabel("IP ּ", frWorkArea);
	lblIP->setGeometry(400, 60, 70, 20);
	leIP = new QLineEdit(frWorkArea);
	leIP->setGeometry(480, 60, 130, 20);

	lblNetmask = new QLabel("ݸũ", frWorkArea);
	lblNetmask->setGeometry(400, 100, 70, 20);
	leNetmask = new QLineEdit(frWorkArea);
	leNetmask->setGeometry(480, 100, 130, 20);
	leNetmask->setEnabled(false);

	lblNetwork = new QLabel("Ʈũ", frWorkArea);
	lblNetwork->setGeometry(400, 140, 70, 20);
	leNetwork = new QLineEdit(frWorkArea);
	leNetwork->setGeometry(480, 140, 130, 20);
	leNetwork->setEnabled(false);

	lblBroadcast = new QLabel("εĳƮ", frWorkArea);
	lblBroadcast->setGeometry(400, 180, 70, 20);
	leBroadcast = new QLineEdit(frWorkArea);
	leBroadcast->setGeometry(480, 180, 130, 20);
	leBroadcast->setEnabled(false);

	bttnAdd = new QPushButton("߰", this);
	bttnAdd->setGeometry(100, 410, 150, 30);
	QObject::connect(bttnAdd, SIGNAL(clicked()), this, SLOT(addSetting()));

	bttnDelete = new QPushButton("", this);
	bttnDelete->setGeometry(480, 410, 150, 30);
	QObject::connect(bttnDelete, SIGNAL(clicked()), this, 
				SLOT(deleteSetting()));
}

clssDefAlias::~clssDefAlias()
{
	int i;

	delete lblNetworkArea;
	
	if (nAliasCount > 0)
		for (i = 0; i < nAliasCount; i++)
			lviAlias[i];
	delete lvAliasList;

	delete lblIP;
	delete leIP;
	delete lblNetmask;
	delete leNetmask;
	delete lblNetwork;
	delete leNetwork;
	delete lblBroadcast;
	delete leBroadcast;

	delete frAliasList;
	delete frWorkArea;
	
	delete bttnAdd;
	delete bttnDelete;

	delete lblAliasingTitle;
}

void clssDefAlias::getAliasingItem()
{
	char pszNetmask[18];
	NetTab pNet;

	memset(pszNetmask, '\0', 18);

	getCurrentNetmask(pszNetmask);

	leIP->setText(lvAliasList->currentItem()->text(1));
	pNet = calculateNetMaskTab((char *)leIP->text(), pszNetmask);
	leNetmask->setText(pszNetmask);
	leNetwork->setText(pNet.pszNetwork);
	leBroadcast->setText(pNet.pszBroadcast);
}

void clssDefAlias::addSetting()
{
	FILE *fp;
	char pszVirtualCard[10], pszFile[100];
	char pszCommand[150];
	
	memset(pszVirtualCard, '\0', 10);
	memset(pszFile, '\0', 100);

	sprintf(pszVirtualCard, "eth0:%d", nAliasCount);
	sprintf(pszFile, "/etc/sysconfig/network-scripts/ifcfg-%s", pszVirtualCard);
	
	lviAlias[nAliasCount] = new QListViewItem(lvAliasList, pszVirtualCard, 
			leIP->text());

	if ((fp = fopen(pszFile, "w")) == NULL)
	{
		emit printf("file open error!\n");
		exit(1);
	}
	
	fprintf(fp, "DEVICE=%s\nIPADDR=%s\nONBOOT=yes\n",pszVirtualCard, 
				leIP->text());
	fclose(fp);
	
	nAliasCount++;
	system("/etc/rc.d/init.d/network restart\n");
}

void clssDefAlias::deleteSetting()
{
	int i, j;
	char pszCommand[150], pszFile[100];
	char pszVirtualIP[18];
	FILE *fp;

	memset(pszFile, '\0', 100);
	sprintf(pszFile, "/etc/sysconfig/network-scripts/ifcfg-eth0:%d", 
			lvAliasList->itemPos(lvAliasList->currentItem())/18);
	if ((fp = fopen(pszFile, "r")) == NULL)
		return;
	fclose(fp);
	nAliasCount--;
	
	memset(pszCommand, '\0', 150);
	memset(pszFile, '\0', 100);
	sprintf(pszFile, "/etc/sysconfig/network-scripts/ifcfg-eth0:*");
	sprintf(pszCommand, "rm -f %s\n", pszFile);
	system(pszCommand);
	
	if (nAliasCount > 0)
	{
		for (i = 0, j = 0; i < nAliasCount+1; i++)
		{
			if (i != lvAliasList->itemPos(lvAliasList->currentItem())/18)
			{
				memset(pszFile, '\0', 100);
				sprintf(pszFile, 
					"/etc/sysconfig/network-scripts/ifcfg-eth0:%d", j);
	   
				if ((fp = fopen(pszFile, "w")) == NULL)
					return;
				fprintf(fp, "DEVICE=eth0:%d\nIPADDR=%s\nONBOOT=yes\n", j, 
					lviAlias[i]->text(1));
				fclose(fp);
				j++;
			}
		}
	}
	
	lvAliasList->clear();

	if (nAliasCount > 0)
	{
		char pszVirtualCard[10];

		for (i = 0; i < nAliasCount; i++)
		{
			memset(pszVirtualCard, '\0', 10);
			memset(pszVirtualIP, '\0', 18);
			sprintf(pszVirtualCard, "eth0:%d", i);
			getAliasIP(pszVirtualIP, i);
			lviAlias[i] = new QListViewItem(lvAliasList, pszVirtualCard, 
					pszVirtualIP);
		}
	}

	system("/etc/rc.d/init.d/network restart\n");
}

void clssDefAlias::printLabelFormat(QLabel *lblBold) 
{
	QPalette p = QWidget::palette();
	QColorGroup n = palette().normal();
	QColorGroup g(n.background(), n.foreground(), n.light(), n.dark(), 
			n.mid(), n.background(), n.base());
	p.setNormal(g);
	setPalette(p);
	lblBold->setPalette(p);
	lblBold->setMargin(3);
	
	QFont bold = *QApplication::font();
	bold.setBold(TRUE);
	bold.setPointSize(bold.pointSize()+2);

	lblBold->setFont(bold);
	lblBold->setFixedSize(lblBold->sizeHint());
	lblBold->setFixedSize(lblBold->sizeHint());
}
//	----------------------------------------------------------------

//	---------------- < Source : Network_menu.h > -------------------
#include <qmainwindow.h>

class QMenuBar;
class QPopupMenu;
class QToolBar;
class clssDefGeneric;
class clssDefDNS;
class clssDefAlias;

class clssNetwork : public QMainWindow
{
	Q_OBJECT
		
	public:
		clssNetwork();
		~clssNetwork();
		
	public slots:
		void funcGenericNetwork();
		void funcDNS();
		void funcAlias();
		void funcQuit();
		
	protected:
		
	private:
		QMenuBar *mnuMainBar;
		QPopupMenu *mnuNetwork;
		QToolBar *tbNetwork;
		clssDefGeneric *clssGeneric;
		clssDefDNS *clssDNS;
		clssDefAlias *clssAlias;
};
//	----------------------------------------------------------------

//	---------------- < Source : Network_menu.cpp > -----------------
#include <qapplication.h>
#include <qkeycode.h>
#include <qmenubar.h>
#include <qpopupmenu.h>
#include <qtoolbar.h>
#include <qtoolbutton.h>
#include <qpixmap.h>

#include <stdio.h>

#include "Network_menu.h"
#include "clssGeneric.h"
#include "clssDNS.h"
#include "clssAlias.h"

#ifndef GENERIC_TOOLTIP
#define GENERIC_TOOLTIP			"Ϲ Ʈũ "
#define DNS_TOOLTIP				"DNS "
#define ALIAS_TOOLTIP			"Alias "
#endif

clssNetwork::clssNetwork()
{
	QPixmap iconGeneric, iconDNS, iconAlias;
	
	iconGeneric.load("./generic.gif");
	iconDNS.load("./dns.gif");
	iconAlias.load("./alias.gif");
	
	qApp->setStyle(WindowsStyle);

	mnuNetwork = new QPopupMenu;
	mnuNetwork->insertItem("Ϲ Ʈũ ", this, 
				SLOT(funcGenericNetwork()));
	mnuNetwork->insertItem("DNS ", this, SLOT(funcDNS()));
	mnuNetwork->insertItem("IP-Aliasing ", this, SLOT(funcAlias()));
	mnuNetwork->insertSeparator();
	mnuNetwork->insertItem("", this, SLOT(funcQuit()));

	mnuMainBar = new QMenuBar(this);
	mnuMainBar->insertItem(" Ʈũ ", mnuNetwork);
	
	tbNetwork = new QToolBar(this);
	tbNetwork->setOrientation(tbNetwork->Horizontal);
	
	QToolButton *tbttnGeneric = new QToolButton(iconGeneric, GENERIC_TOOLTIP, 
			0, this, SLOT(funcGenericNetwork()), tbNetwork, "generic");
	QToolButton *tbttnDNS = new QToolButton(iconDNS, DNS_TOOLTIP, 0, this, 
			SLOT(funcDNS()), tbNetwork, "dns");
	QToolButton *tbttnAlias = new QToolButton(iconAlias, ALIAS_TOOLTIP, 0, 
			this, SLOT(funcAlias()), tbNetwork, "alias");
}

clssNetwork::~clssNetwork()
{
}

void clssNetwork::funcGenericNetwork()
{
	clssGeneric = new clssDefGeneric();
	clssGeneric->setGeometry(150, 150, 750, 550);
	clssGeneric->show();
}

void clssNetwork::funcDNS()
{
	clssDNS = new clssDefDNS();
	clssDNS->setGeometry(150, 150, 400, 500);
	clssDNS->show();
}

void clssNetwork::funcAlias()
{
	clssAlias = new clssDefAlias();
	clssAlias->setGeometry(150, 150, 750, 500);
	clssAlias->show();
}

void clssNetwork::funcQuit()
{
	exit(0);
}
//	----------------------------------------------------------------

//	------------------ < Source : main_menu.cpp > ------------------
#include <qapplication.h>
#include "Network_menu.h"

char pszNetConfHost[256];
char pszNetConfDomain[256];

char pszNetConfGateway[18];

char pszNetConfIPAddr[18];
char pszNetConfPrivate1IPAddr[18];
char pszNetConfPrivate2IPAddr[18];

char pszNetConfNetmask[18];
char pszNetConfPrivate1Netmask[18];
char pszNetConfPrivate2Netmask[18];

char pszNetconfBroadcast[18];
char pszNetconfPrivate1Broadcast[18];
char pszNetconfPrivate2Broadcast[18];

char pszNetConfNetwork[18];
char pszNetConfPrivate1Network[18];
char pszNetConfPrivate2Network[18];

char pszNetConfNetCard[3][30];

int nCountListStr;
char pszSaveNameServer[20][30];
int nCountNameServer;
int nCountClient;

extern int nAccountCount;

int main(int argc, char* argv[])
{
	
   	QApplication myapp(argc, argv);

	clssNetwork *clssTest = new clssNetwork();
	clssTest->setGeometry(100, 100, 800, 600);
	
    myapp.setMainWidget(clssTest);
   	clssTest->show();

    return myapp.exec();
}
//	----------------------------------------------------------------

#	------------------------ < Makefile > --------------------------
PROGS  = main_menu

LIBS = -L/usr/lib/qt/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm 

CC = g++
GCC = gcc

INCLUDE = -I/usr/lib/qt/include 
C_FLAG =  -pipe -DNO_DEBUG -O2 
CFLAGS = $(INCLUDE) $(C_FLAG)

SYSCONF_LINK		= $(CC)
SYSCONF_MOC		= /usr/bin/moc
MOC	=	$(SYSCONF_MOC)

OTHER_OBJS = \
		network.o \
		proc_file.o

MNU_OBJS = \
		main_menu.o \
		Network_menu_moc.o \
		Network_menu.o \
		clssGeneric.o \
		clssGeneric_moc.o \
		clssDNS.o \
		clssDNS_moc.o \
		clssAlias.o \
		clssAlias_moc.o

all:	$(PROGS)
clean:
	rm -f *.o
	rm -f main_menu
	rm -f *_moc.*

############# COMPILE #############

network.o: network.c
		$(CC) -c network.c -o $@

proc_file.o: proc_file.c
		$(CC) -c proc_file.c -o $@

main_menu.o: main_menu.cpp 
		$(CC) -c main_menu.cpp $(CFLAGS) -o $@
		
Network_menu_moc.cpp: Network_menu.h
		$(MOC) Network_menu.h -o Network_menu_moc.cpp 

Network_menu_moc.o: Network_menu_moc.cpp
		$(CC) -c Network_menu_moc.cpp $(CFLAGS) -o $@

Network_menu.o: Network_menu.cpp
		$(CC) -c Network_menu.cpp $(CFLAGS) -o $@

clssGeneric_moc.cpp: clssGeneric.h
		$(MOC) clssGeneric.h -o clssGeneric_moc.cpp

clssGeneric_moc.o: clssGeneric_moc.cpp
		$(CC) -c clssGeneric_moc.cpp $(CFLAGS) -o $@

clssGeneric.o: clssGeneric.cpp
		$(CC) -c clssGeneric.cpp $(CFLAGS) -o $@

clssDNS_moc.cpp: clssDNS.h
		$(MOC) clssDNS.h -o clssDNS_moc.cpp

clssDNS_moc.o: clssDNS_moc.cpp
		$(CC) -c clssDNS_moc.cpp $(CFLAGS) -o $@

clssDNS.o: clssDNS.cpp
		$(CC) -c clssDNS.cpp $(CFLAGS) -o $@

clssAlias_moc.cpp: clssAlias.h
		$(MOC) clssAlias.h -o clssAlias_moc.cpp

clssAlias_moc.o: clssAlias_moc.cpp
		$(CC) -c clssAlias_moc.cpp $(CFLAGS) -o $@

clssAlias.o: clssAlias.cpp
		$(CC) -c clssAlias.cpp $(CFLAGS) -o $@

main_menu: $(MNU_OBJS) $(OTHER_OBJS) 
	$(CC) $(MNU_OBJS) $(OTHER_OBJS) $(LIBS) -o $@
#	----------------------------------------------------------------


3.5. Ǿ 

 ڶ α׷ ø Ϳ    д е鲲 ˼
 ̴.
Qt Library ϴ Library Ἥ ״   ,
óƾ ־  procedure ȭǾִٰ 帱 
. , ̽ļ Ȯ强 Ѵ ϴ ޸𸮿  Ϻ
 ȭ ̷ ߴ.  Ʈũóƾ ؼ 
 Ȥ ϰִ ó ־ ϴµ ׷  ߴ. ,
  Ʈ  Ʈũ  ϵ Format 
 𸣴 Ȳ ̸ հϴ    ϵ
 Ѵٴ   ո ̴.
ڴ 忡 ߴ α׷ Ϻ  Ʈũ óκ 
 ״ ̰ ÷ ʾҴ.  ô ˼۽ Ѵ.
 Source ڰ ()ž Topflash project ʱ⿡ 
ȭ۾  Source̴.
 гʿ ޵Ǿ  ִ ǰ̹Ƿ ȭ Ǿִ
Source    ˷帮  ٽѹ ˼۽ 
Ѵ.
 Source鿡  ٷ  帰ٿ   
Ʈ   ̾߱ ⼭ ġڴ.


4. Ʈ ġ...

 Ʈ ʹݿ ȵ Qt 1.44  Network ó 
ƮԴϴ. ׸ ̴    ִ ()ž ǰ
 ϳ TopmanagerX Ϻκп -ʱ ȭ - ڷ̱
 մϴ. Qt   Ʈ ϰ ׸ ǰȭ 
ϱ ؼ Gtkʹ ٸ trolltech License ξѴٴ
 ε ƽø մϴ.
׷  ǵ̸ Qtٴ Gtk Application ص帮
ͽϴ. ֱٿ ͼ Qt ణ α⸦   Open Source
 Ͽ찡  Ǿִ Gtkٴ  ɼ ٰ  
մϴ. Qt,  GUI ؼ Gtk մϴٸ Gtk Open Source
(?)  Qt GUI ռ ̶ մϴ.
׸  Borland翡 Delphi  ϰ ִٴ  
е鵵  ƽø Ͻϴ. ̷     
 Ƿ GUI߿ ȹ ΰ Ÿ  
ʾ  ̶ մϴ.
ϰ, ·   ø  MailServer Setting WebServer
Setting  Gtk Library Ἥ  Project øڽϴ.
ڶ   оּż  帳ϴ.
