/*---------------------------------------------------------------------- verchk 1996.06.(Revised) È­ÀÏÀ» Àü¼ÛÇÏ´Â ÇÁ·Î±×·¥. - È­ÀÏ Å©±â¿Í ³¯ÀÚ¸¦ Á¶»çÇؼ­ Ʋ¸®¸é Àü¼ÛÇÏ°í °°À¸¸é Àü¼ÛÀ» ÇÏÁö ¾Ê´Â´Ù. -----------------------------------------------------------------------*/ #include #include #include #include #include /* #include */ #include #include #include #include #include #include #include #include #include struct test001 { unsigned char file[20]; unsigned char sp1[1]; unsigned char size[10]; unsigned char sp2[1]; unsigned char date[12]; unsigned char sp3[1]; }; struct test001 test01[300]; struct stat buf; char Host_Dir[1024]; char dummy[1024]; char data1[1024]; char snd_buf[1024]; char a_buf[1024]; char p_buff[1024]; char FileName[1024]; char buffer[1024]; struct tm *tt; time_t timer; /*------------------------------------------------------------------*/ /* define */ /*------------------------------------------------------------------*/ #define MaxPacketSize 2000 #define TCP_Mail_Port 5001 /* For use in TNet MailSsvr */ #define FLQ 0 /* File List ¿ä±¸ C -> S */ #define FLC 1 /* File List Ãß°¡¿ä±¸ C -> S */ #define FDQ 2 /* 1 File ¼ö½Å¿ä±¸ C -> S */ #define DOK 3 /* Data¸¦¡¡Á¤»ó󸮡¡ÇßÀ»¶§ C -> S */ #define CTM 8 /* ÇöÀç Server Time ¿ä±¸ C -> S */ #define TOK 9 /* Àüü¸¦¡¡¼ö½ÅÀ»¡¡´ÙÇßÀ»¶§ C -> S */ struct sockaddr_in serv_addr,peer_addr; int serv_addr_len,peer_addr_len; char *pname; char *date_inp[12] = { "Jan01","Feb02","Mar03","Apr04","May05","Jun06", "Jul07","Aug08","Sep09","Oct10","Nov11","Dec12" }; char packet[MaxPacketSize+1]; int errno; int pid_no; sig_child() { /*------------------------------------------------------------------ Purpose : This is a 4.3 BSD SIGCLD signal handler that can be used by a server that not interested in it's child's exit st- atus ,but needs to wait for them,to avoid clogging up the system with zombies. * WNOHANG is the option to prevent the system from blocking. --------------------------------------------------------------------- */ /* while(wait3((union wait *)0,WNOHANG,(struct rusage *)0) > 0); */ } main(argc,argv,envp) /*-------------------------------------------------------------------- Super server main(); ---------------------------------------------------------------------*/ int argc; char *argv[]; char *envp[]; { int child,sd,sd1; short port; /* Two bytes port number */ int ret,childpid; putenv("LANG=korean"); pname= argv[0]; if(argc != 2) port = TCP_Mail_Port; /* Default port number */ else port= atoi(argv[1]); /* Port number by user */ signal(SIGCHLD, SIG_IGN); if ((childpid = fork()) < 0) { fprintf(stderr, "Can't fork"); exit(1); } else if (childpid > 0) exit(0); if (setpgrp() == -1) { printf("Can't change process group"); fprintf(stderr, "Can't change process group"); exit(1); } serv_addr_len= peer_addr_len= sizeof(struct sockaddr_in); if((sd= socket(AF_INET, SOCK_STREAM, 0)) < 0) { /* log_write("MailSsvr : socket");exit(0); */ } serv_addr.sin_family= AF_INET; serv_addr.sin_addr.s_addr= htonl(INADDR_ANY); serv_addr.sin_port= htons(port); /* Bind it's local address */ if(bind(sd,(struct sockaddr *)&serv_addr,serv_addr_len)==-1){ printf("MailSsvr: bind\n"); exit(0); } printf("\n Bind Ok ..."); if(listen(sd,5)==-1) exit(0); printf("\n listen Ok ...\n"); for(;;) { do { sd1= accept(sd, &peer_addr, &peer_addr_len); } while(sd1==-1 && errno==EINTR); if(sd1 < 0) exit(0); if((child=fork()) == 0) { /* child */ close(sd); *pname = getpid() % 256; pid_no = getpid(); Mailsvr(sd1); exit(0); } close(sd1); /* Super server doesn't need it any more */ } } /*---------------------------------------------------- Åë½Å ó¸® Module ----------------------------------------------------*/ Mailsvr( td ) int td; { DIR *Dir; struct dirent *DirEnt; struct stat Stat; int i,dnt,tnt; int n,slen,ret; int fd; int Fstat; FILE *ff; FILE *gg; int R_GUBUN; char FileNm[100]; char Fname[100]; while(1) { clr_packet(packet,MaxPacketSize+1); recv(td,packet,1024,0); if ((strncmp(packet,"FLQ",3)) == 0) R_GUBUN = FLQ; else if ((strncmp(packet,"FLC",3)) == 0) R_GUBUN = FLC; else if ((strncmp(packet,"FDQ",3)) == 0) R_GUBUN = FDQ; else if ((strncmp(packet,"CTM",3)) == 0) R_GUBUN = CTM; else if ((strncmp(packet,"TOK",3)) == 0) R_GUBUN = TOK; else R_GUBUN = 99; switch (R_GUBUN) { case FLQ: /* FILE LIST ¿äû */ dnt = -1; memset(Host_Dir,0x00,100); strcpy(Host_Dir,&packet[4]); Dir = opendir(Host_Dir); if (Dir == NULL ) { return ; } sprintf(buffer,"/tmp/dummy%d",pid_no); gg = fopen(buffer,"w+"); while ( ( DirEnt = readdir ( Dir )) != NULL ) { if (DirEnt->d_name[0] == '.') continue; sprintf(Fname,"%s%s",Host_Dir,DirEnt->d_name); Fstat = stat(Fname,&Stat); if( S_ISDIR( Stat.st_mode) ) continue; fprintf(gg, "%s\n", DirEnt->d_name); } closedir(Dir); fclose(gg); tnt=file_imp_move(buffer,Host_Dir); sprintf(dummy,"rm /tmp/dummy%d",pid_no); system(dummy); case FLC: /* FILE LIST °è¼Ó */ dnt++; if (dnt+1 > tnt) { /* È­ÀÏÀÌ¡¡¾øÀ»¡¡¶§ */ memset(snd_buf,0x00,1024); slen = send(td, "LED\0", 4,0); } else { memset(snd_buf,0x00,1024); strcpy(snd_buf,"LTS"); strcat(snd_buf,"\t"); strcat(snd_buf,test01[dnt].file); strcat(snd_buf,"\t"); strcat(snd_buf,test01[dnt].size); strcat(snd_buf,"\t"); strcat(snd_buf,test01[dnt].date); strcat(snd_buf,"\0"); slen = send(td, snd_buf, strlen(snd_buf),0); } break; case FDQ: /* FILE Àü¼Û¿äû */ memset(FileNm,0x00,100); strcpy(FileNm,&packet[4]); DataTrans(FileNm,Host_Dir,td); break; case CTM: /* ÇöÀç½Ã°¢ */ _tzset(); time(&timer); tt = localtime(&timer); memset(buffer,0x00,100); strftime(buffer, 25, "%Y/%m/%d %H:%M:%S", tt); log_write(buffer); memset(snd_buf,0x00,1024); strcpy(snd_buf,"CTM"); strcat(snd_buf,"\t"); strcat(snd_buf,buffer); slen = send(td, snd_buf, strlen(snd_buf), 0); break; case TOK: /* Àüü¿Ï·á */ close(td); exit(0); default: slen = send(td, "TED\0", 4,0); break; } } /* End while(1) */ } /*---------------------------------------------------- È­ÀÏ Å©±â , ³¯ÀÚ È®ÀÎ ----------------------------------------------------*/ int size_date_check(Hs,ont,f_name) char *Hs; char *f_name; int ont; { int i,k; strcpy(FileName,Hs); strcat(FileName,f_name); k = stat(FileName,&buf); if (k != 0) { return(-1); /* È­ÀÏÀÌ ¾ø½¿ */ } sprintf(test01[ont].size,"%ld\n",buf.st_size); sprintf(p_buff,"%s",ctime(&buf.st_mtime)); for(i=0;i<12;i++) { if(strncmp(date_inp[i],&p_buff[4],3) == 0) { strncpy(&p_buff[6],&date_inp[i][3],2); if (p_buff[8] == 0x20) p_buff[8] = '0'; strncpy(test01[ont].date,&p_buff[20],4); strncat(test01[ont].date,&p_buff[ 6],4); strncat(test01[ont].date,&p_buff[11],2); strncat(test01[ont].date,&p_buff[14],2); return(0); } } return(-1); } /*---------------------------------------------------- µ¥ÀÌŸ Àü¼Û ----------------------------------------------------*/ int DataTrans(FileN,HD,msgsock) char *FileN; char *HD; int msgsock; { int R_GUBUN; int sval, k = 0,index=0,idx=0; int flag = 0; FILE *fin1; char c_buf[1024]; char ErrMsg[100]; memset(FileName,0x00,1024); strcpy(FileName,HD); strcat(FileName,FileN); if ((fin1 = fopen(FileName,"rb")) == NULL) { memset(ErrMsg,0x00,100); strcpy(ErrMsg,FileName); strcat(ErrMsg," NotFound!!"); log_write(ErrMsg); sval = send(msgsock, "END\0", 4,flag); return; } /* Àü¼Û DATA SEND */ index = 1; while(index) { memset(c_buf,0x00,1024); k=read(fileno(fin1),c_buf,1024); if (k<=0) { index = 0; sval = send(msgsock, "END\0", 4,flag); fclose(fin1); return; } sval = send(msgsock, c_buf, k,flag); if (sval < 0) { fclose(fin1); return; } clr_packet(packet,MaxPacketSize+1); recv(msgsock,packet,1024,0); if ((strncmp(packet,"TOK",3)) == 0) { close(msgsock); exit(1); } } } clr_packet(packet,n) char packet[]; int n; { int i; for ( i = 0 ; i < n ; i++ ) packet[i] = 0; } file_imp_move(fileN,Hs) char *fileN; char *Hs; { FILE *fi; int index,j,k; char *result; j = 0; if ((fi = fopen(fileN,"rb")) == NULL) return -1; index = 1; memset(test01,0x00,11100); while(index) { memset(a_buf,0x00,1024); result=fgets(a_buf,1024,fi); if (result==0) { index = 0; fclose(fi); return j; } k=data_move(a_buf,Hs,j); if (k==0) j++; } } data_move(data,Hs,cnt) char *data; char *Hs; int cnt; { int sz, len,ret,d_pos; memset(test01[cnt].file,0x00,20); sz = strlen(data); strncpy(test01[cnt].file,data,sz-1) ; len=size_date_check(Hs,cnt,test01[cnt].file); return len; } char_colron(data) char *data; { int i; for(i=0;data[i] != 0x00 ;i++) { if (data[i] == ':' ) { i = i+(strlen(Host_Dir)); return i; } } } log_write(buff) char *buff; { FILE *fp; /* error, file pointer */ fp = (FILE *) fopen("plog", "a+"); if (fp == NULL) fprintf(stdout, "%s\n", buff); else { fprintf(fp, "%s\n", buff); fclose(fp); } }