#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <iconv.h>
#include <mysql/mysql.h>
#include "sqlite3.h"
void getDiskFile(MYSQL *con, char *rtdir,char* fname,long id);
int creatfile(char *path)
{
int fd;
if((fd=open(path,O_CREAT|O_RDWR))== -1)
{
perror("open fail");
return 0;
}
close(fd);
return 1;
}
int CreateDir(const char *sPathName)
{
char DirName[256];
strcpy(DirName, sPathName);
int i,len = strlen(DirName);
if(DirName[len-1]!='/')
strcat(DirName, "/");
len = strlen(DirName);
for(i=1; i<len; i++)
{
if(DirName[i]=='/')
{
DirName[i] = 0;
if(access(DirName, NULL)!=0 )
{
if(mkdir(DirName, 0755)==-1)
{
perror("mkdir error");
return -1;
}
}
DirName[i] = '/';
}
}
return 0;
}
// make the directory
// rootpath is the root directory you want to generate the directory
// dbName is the database name ,parent means parent id
// rtdir is the sourcedir
void makedir(char *rootpath,char *dbName,int parent, char *rtdir,MYSQL *con)
{
sqlite3 *db;
sqlite3_stmt * stmt = NULL;
const char *zTail;
char SQL[256];
printf("dbname==%s\n",dbName);
sprintf(SQL,"SELECT id,name,filenum FROM folder where parent=%d;",parent);
printf("SELECT id,name,filenum FROM folder where parent=%d\n;",parent);
int r =sqlite3_open(dbName,&db);
if (sqlite3_prepare_v2(db, SQL, -1, &stmt, &zTail) ==SQLITE_OK)
{
while( sqlite3_step(stmt) ==SQLITE_ROW )
{
int id =sqlite3_column_int( stmt, 0);
const unsigned char *foldername = sqlite3_column_text(stmt,1);
int filenum = sqlite3_column_int(stmt,2);
printf("ID = %d\n,name=%s\n,filenumber=%d\n",id,foldername,filenum);
char sql[256];
if(filenum>0)
{
sqlite3_stmt *filestmt =NULL;
char sql[256];
sprintf(sql,"SELECT name,attid FROM file where folder = %d;",id);
if (sqlite3_prepare_v2(db, sql, -1, &filestmt, &zTail) ==SQLITE_OK)
{
while( sqlite3_step(filestmt) ==SQLITE_ROW )
{
const unsigned char *name= sqlite3_column_text(filestmt,0);
long attid = sqlite3_column_int(filestmt,1);
printf("filename = %s\n",name);
char path[1024];
//creatfile
if(rootpath)
sprintf(path,"%s/%s",rootpath,foldername);
else
sprintf(path,"%s",foldername);
CreateDir(path);
char tempfile[1024];
sprintf(tempfile,"%s/%s",path,name);
creatfile(tempfile);
//write data into file
getDiskFile(con,rtdir,tempfile,attid);
}
}
sqlite3_finalize(filestmt);
}else
{
//creat son folders
char path[1024];
if(rootpath)
sprintf(path,"%s/%s",rootpath,foldername);
else
sprintf(path,"%s",foldername);
printf("folderpath = %s\n",path);
CreateDir(path);
//creatdir
}
char path[1024];
if(rootpath)
sprintf(path,"%s/%s",rootpath,foldername);
else
sprintf(path,"%s",foldername);
printf("recursion path = %s\n",path );
makedir(path,dbName,id,rtdir,con);
printf("creat parent = %s\n",path);
}
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return;
}
/* get netdisk files */
void getDiskFile( MYSQL *con, char *rtdir,char* fname,long id)
{
char buf[500];
sprintf(buf, "select boxid, apos, filelen from attlist where id = %d", id);
if (mysql_query(con, buf ) != 0)
{
printf("db query failed: %s\n", buf);
exit(1);
}
MYSQL_RES* att_res = mysql_store_result(con);
if(att_res == NULL)
{
printf("store result failed\n");
exit(1);
}
MYSQL_ROW att_row = mysql_fetch_row(att_res);
if(att_row)
{
/* get box file through boxid */
sprintf(buf, "select boxfile from mail_boxs where id = %s", att_row[0]);
if (mysql_query(con, buf ) != 0)
{
printf("db query failed: %s\n", buf);
exit(1);
}
MYSQL_RES* box_res = mysql_store_result(con);
if(box_res == NULL)
{
printf("store result failed\n");
exit(1);
}
MYSQL_ROW box_row = mysql_fetch_row(box_res);
if(box_row)
{
sprintf(buf, "%s/%s", rtdir, box_row[0]);
int bfd = open(buf, O_RDONLY);
if(bfd != -1)
{
int dfd = creat(fname, 0766);
if(dfd != -1)
{
/* read data from box file */
lseek(bfd, atoi(att_row[1]), SEEK_SET);
int len = atoi(att_row[2]);
char *dskdata =(char*)malloc(len+1);
if(!dskdata)
{
printf("malloc failed\n");
exit(1);
}
int num, off;
off = 0;
while(len > 0)
{
num = read(bfd, dskdata+off, len);
if(num < 0)
{
printf("read netdisk data failed\n");
exit(1);
}
len -= num;
off += num;
}
/* write data to netdisk file */
len = atoi(att_row[2]);
off = 0;
while(len > 0)
{
num = write(dfd, dskdata+off, len);
if(num < 0)
{
printf("write netdisk failed\n");
exit(1);
}
len -= num;
off += num;
}
free(dskdata);
close(dfd);
}
close(bfd);
}
}
mysql_free_result(box_res);
}
mysql_free_result(att_res);
}
int main(int argc, char **argv)
{
if(argc < 7)
{
printf("usage: %s srcdir dstdir dbuser dbpass dbname ldapfile\n", argv[0]);
exit(1);
}
int fd = open(argv[6], O_RDONLY);
if(fd == -1)
{
printf("cannot open %s\n",argv[6]);
return 1;
}
int len = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
char *ldapdata;
if((ldapdata =(char*)malloc(len + 1)) == NULL)
{
printf("malloc failed\n");
exit(1);
}
int off = 0, num = 0;
while(off < len)
{
num = read(fd, ldapdata+off, len-off);
if(num < 0)
{
printf("read %s failed\n", argv[6]);
exit(1);
}
off += num;
}
*(ldapdata+len) = 0;
close(fd);
MYSQL* con = mysql_init(NULL);
if (con == NULL)
{
printf("init mysql failed\n");
exit(1);
}
if (mysql_real_connect(con, "127.0.0.1", argv[3], argv[4], argv[5], 3306, NULL, 0) == NULL)
{
printf("connect to db failed\n");
exit(1);
}
char diskdir[300];
sprintf(diskdir, "%s/mail/userindex", argv[1]);
/* open data directoty */
DIR *dirp = opendir(diskdir);
if(!dirp)
{
printf("cannot access %s\n", diskdir);
exit(1);
}
struct dirent *dent;
/* get domain info */
while((dent = readdir(dirp)))
{
if(dent->d_type != DT_DIR || *dent->d_name == '.' || (strcmp(dent->d_name, "chinamil.com.cn") && strcmp(dent->d_name, "plapic.com.cn")))
continue;
char dmname[1024];
sprintf(dmname, "%s/%s", diskdir, dent->d_name);
DIR *dmnp = opendir(dmname);
if(!dmnp)
{
printf("cannot access %s\n", dmname);
exit(1);
}
struct dirent *orgdent;
/* get org names */
while((orgdent = readdir(dmnp)))
{
if(orgdent->d_type != DT_DIR || *orgdent->d_name == '.')
continue;
char orgname[1024];
sprintf(orgname, "%s/%s", dmname, orgdent->d_name);
DIR *orgp = opendir(orgname);
if(!orgp)
{
printf("cannot access %s\n", orgname);
exit(1);
}
struct dirent *userdent;
/* get user accounts */
while((userdent = readdir(orgp)))
{
if(userdent->d_type != DT_DIR || *userdent->d_name == '.')
continue;
char destname[1024];
char diskname[1024];
char cmdstr[1024];
char storeid[300];
char account[300];
char *pt, *qt;
sprintf(storeid, "dn: storeid=%s,", userdent->d_name);
pt = strstr(ldapdata, storeid);
if(!pt)
{
printf("the user id %s isn't found\n", userdent->d_name);
continue;
}
pt = strstr(pt, "mail:");
if(!pt)
{
printf("mail address isn't found\n");
exit(1);
}
pt += strlen("mail:");
while(*pt == ' ') pt++;
qt = pt;
while(*qt != '\r' && *qt != '\n') qt++;
memcpy(account, pt, qt-pt);
account[qt-pt] = 0;
sprintf(destname, "%s/%s", argv[2], account);
sprintf(diskname, "%s/%s/netdisk.db", orgname, userdent->d_name);
if(access(diskname, F_OK) == -1)
continue;
makedir(destname, diskname,0,argv[1],con);
}
closedir(orgp);
}
closedir(dmnp);
}
closedir(dirp);
free(ldapdata);
}