目录
一、全部文件
./..:
client server
./../client:
client client.c client.h downfile getfilename.c libclient.so main.c Makefile README.txt
./../client/downfile:
1.jpg 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg a.txt fight-loss.mp4
./../server:
1 error.txt getfilename.c libserver.so main.c Makefile README.txt server server.c server.h usr usr.db
./../server/1:
1.jpg 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg a.txt downfile fight-loss.mp4 新建文本文档.txt
./../server/1/downfile:
1.jpg
二、部分功能效果
注册与登录
浏览云盘与上传
下载文件到本地
注销用户
三、客户端
client/
main.c
#include"client.h"
int main(int argc, char **argv){
d data;
sockfd_init(&data, argc, argv);
m msg;
msg.connfd = data.sockfd;
char buf[__usrlen];
while(1){
printf("##########\n1.regis\n2.login\n3.quit\n4.select\n5.upfile\n6.downfd\n7.The cancellation of the user\n8.select local files\n#########\n");
fgets(buf, __usrlen, stdin);
switch(buf[0]){
case '1':
regis(&msg);
break;
case '2':
login(&msg);
break;
case '3':
quit(&msg);
break;
case '4':
sltall(&msg);
break;
case '5':
upfile(&msg);
break;
case '6':
downfd(&msg);
break;
case '7':
cancel(&msg);
case '8':
localfile(&msg);
}
}
}
client.h
#ifndef _CLIENT_H_
#define _CLIENT_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<dirent.h>
#define CORVAL 1
#define NORVAL 0
#define ERRVAL -1
#define _STR(x) _VAL(x)
#define _VAL(x) #x
#define handle_error(LOG) do { perror(LOG); exit(EXIT_FAILURE); } while(0)
#define qDbug() do { puts(_STR(__LINE__)); } while(0)
#define __port 50000
#define __ip "192.168.223.132"
#define __usrlen 64
#define __textlen 1024
#define R 'R'
#define L 'L'
#define Q 'Q'
#define S 'S'
#define U 'U'
#define D 'D'
#define C 'C'
#define __mode 0777
#define __buflen 128
typedef struct data{
int sockfd;
struct sockaddr_in saddr;
socklen_t addrlen;
}d, *dp;
typedef struct msg{
int ret;
char type;
char usrname[__usrlen];
char usrpass[__usrlen];
char filename[__buflen];
char text[__textlen];
int connfd;
int flag;
}m, *mp;
void sockfd_init(dp, int, char **);
void regis(mp);
void login(mp);
void quit(mp);
void sltall(mp);
void upfile(mp);
void downfd(mp);
void cancel(mp);
void localfile(mp);
int readFileList(char *, char *);
int lookFileList(char *);
#endif
client.c
#include"client.h"
void sockfd_init(dp data, int argc, char **argv){
if(1 == argc){
printf("whether to manually enter IP and PORT(y/n)\n");
int answer;
while(1){
if(89 == (answer = fgetc(stdin)) || 121 == answer){
printf("please use '%s < IP > < PORT >'\n", argv[0]);
getchar();
exit(EXIT_SUCCESS);
}
else if(78 == answer || 110 == answer){
printf("the default settings will be used\n");
getchar();
break;
}
else{
printf("please use y or n (case sensitive)\n");
getchar();
}
}
}
else if(3 == argc){
printf("using manual setting\n");
}
data->sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
data->saddr.sin_family = AF_INET;
if(1 == argc){
data->saddr.sin_port = htons(__port);
data->saddr.sin_addr.s_addr = inet_addr(__ip);
printf("ip:%s port:%d\n", __ip, __port);
}
else if(3 == argc){
data->saddr.sin_port = htons(atoi(argv[2]));
data->saddr.sin_addr.s_addr = inet_addr(argv[1]);
printf("ip:%s port:%s\n", argv[1], argv[2]);
}
else{
printf("too few arguments to server\n");
exit(EXIT_FAILURE);
}
data->addrlen = sizeof(data->saddr);
int nSendBuf = 512*1024*1024;
int nRecvBuf = 512*1024*1024;
setsockopt(data->sockfd, SOL_SOCKET, SO_SNDBUF, (const char *)&nSendBuf, sizeof(int));
setsockopt(data->sockfd, SOL_SOCKET, SO_RCVBUF, (const char *)&nRecvBuf, sizeof(int));
connect(data->sockfd, (const struct sockaddr *)&data->saddr, data->addrlen);
}
void regis(mp msg){
msg->type = R;
memset(msg->usrname, '\0', __usrlen);
printf("please input your usrname\n");
fgets(msg->usrname, __usrlen, stdin);
msg->usrname[strlen(msg->usrname) - 1] = '\0';
//printf("%s\n", msg->usrname);
memset(msg->usrpass, '\0', __usrlen);
printf("please input your usrpass\n");
fgets(msg->usrpass, __usrlen, stdin);
msg->usrpass[strlen(msg->usrpass) - 1] = '\0';
//printf("%s\n", msg->usrname);
send(msg->connfd, msg, sizeof(m), 0);
memset(msg->text, '\0', __textlen);
recv(msg->connfd, msg->text, __textlen, 0);
puts(msg->text);
memset(msg->text, '\0', __textlen);
}
void login(mp msg){
msg->type = L;
printf("please input your usrname\n");
memset(msg->usrname, '\0', __usrlen);
fgets(msg->usrname, __usrlen, stdin);
msg->usrname[strlen(msg->usrname) - 1] = '\0';
//printf("%s\n", msg->usrname);
printf("please input your usrpass\n");
memset(msg->usrpass, '\0', __usrlen);
fgets(msg->usrpass, __usrlen, stdin);
msg->usrpass[strlen(msg->usrpass) - 1] = '\0';
//printf("%s\n", msg->usrname);
send(msg->connfd, msg, sizeof(m), 0);
memset(msg->text, '\0', __textlen);
recv(msg->connfd, msg->text, __textlen, 0);
puts(msg->text);
memset(msg->text, '\0', __textlen);
}
void quit(mp msg){
msg->type = Q;
send(msg->connfd, msg, sizeof(m), 0);
memset(msg->text, '\0', __textlen);
recv(msg->connfd, msg->text, __textlen, 0);
puts(msg->text);
memset(msg->text, '\0', __textlen);
close(msg->connfd);
exit(0);
}
void sltall(mp msg){
msg->type = S;
send(msg->connfd, msg, sizeof(m), 0);
memset(msg->text, '\0', __textlen);
recv(msg->connfd, msg->text, __textlen, 0);
puts(msg->text);
memset(msg->text, '\0', __textlen);
}
void upfile(mp msg){
msg->type = U;
memset(msg->filename, '\0', __buflen);
printf("witch file do you want to up\n");
fgets(msg->filename, __buflen, stdin);
msg->filename[strlen(msg->filename) - 1] = '\0';
int fd = open(msg->filename, O_RDONLY);
struct stat buf;
fstat(fd, &buf);
msg->ret = buf.st_size;
send(msg->connfd, msg, sizeof(*msg), 0);
msg->type = 'u';
while(0 < (msg->ret = read(fd, msg->text, __textlen))){
send(msg->connfd, msg->text, msg->ret, 0);
memset(msg->text, '\0', __textlen);
}
memset(msg->text, '\0', __textlen);
#if 1
recv(msg->connfd, msg->text, __textlen, 0);
puts(msg->text);
memset(msg->text, '\0', __textlen);
#endif
}
void downfd(mp msg){
int st_size, now_size = 0;
msg->type = D;
char buf[__usrlen];
struct stat buf_stat;
memset(buf, '\0', __buflen);
memset(msg->filename, '\0', __buflen);
printf("witch file do you want to down\n");
fgets(msg->filename, __buflen, stdin);
msg->filename[strlen(msg->filename) - 1] = '\0';
send(msg->connfd, msg, sizeof(m), 0);
memset(msg->text, '\0', __textlen);
recv(msg->connfd, msg->text, __textlen, 0);
puts(msg->text);
if(0 != strcmp(msg->text, "downfd failed")){
int i = 0, j = 0;
for(i = 0; i < strlen(msg->filename); i++){
if('/' == msg->filename[i]){
j = ++i;
}
}
i = 0;
while(j < strlen(msg->filename)) buf[i++] = msg->filename[j++];
mkdir("downfile", __mode);
char temp[__usrlen];
memset(temp, '\0', __usrlen);
strcpy(temp, "downfile/");
strcat(temp, buf);
strcpy(buf, temp);
if(1 == readFileList("downfile/", buf)){
memset(temp, '\0', __usrlen);
strcpy(temp, "rm ");
strcat(temp, buf);
FILE *stream;
stream = popen(temp, "r");
memset(temp, '\0', __usrlen);
pclose(stream);
}
int fd, num, oldnum;
sleep(1);
recv(msg->connfd, &msg->ret, sizeof(msg->ret), 0);
st_size = msg->ret;
memset(msg->text, '\0', __textlen);
sleep(1);
while(0 < (msg->ret = recv(msg->connfd, msg->text, __textlen, 0))){
if(0 == strncmp(msg->text, "not found this file", strlen("not found this file"))){
puts(msg->text);
goto _loop;
}
fd = open(buf, O_CREAT | O_APPEND | O_WRONLY, __mode);
write(fd, msg->text, msg->ret);
now_size += msg->ret;
num = 100*now_size/st_size;
if(oldnum != num)
printf("%d%%-------------------------------%d/%d\n", num, now_size, st_size);
memset(msg->text, '\0', __textlen);
close(fd);
if(st_size == now_size) break;
oldnum = num;
}
puts("downfd success");
memset(buf, '\0', __buflen);
memset(msg->text, '\0', __textlen);
}
_loop:
;
}
void cancel(mp msg){
msg->type = C;
send(msg->connfd, msg, sizeof(m), 0);
memset(msg->text, '\0', __textlen);
recv(msg->connfd, msg->text, __textlen, 0);
puts(msg->text);
memset(msg->text, '\0', __textlen);
}
void localfile(mp msg){
lookFileList("downfile");
}
getfilename.c
#include"client.h"
int readFileList(char *basePath, char *path)
{
DIR *dir;
struct dirent *ptr;
char base[1000];
char buf[__usrlen];
if ((dir=opendir(basePath)) == NULL)
{
perror("Open dir error...");
exit(1);
}
while ((ptr=readdir(dir)) != NULL)
{
if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir
continue;
else if(ptr->d_type == 8){ ///file
strcpy(buf, basePath);
strcat(buf, ptr->d_name);
if(0 == strncmp(buf,path,strlen(path))){
closedir(dir);
return 1;
}
memset(buf, 0, __usrlen);
}
else if(ptr->d_type == 4) ///dir
{
memset(base,'\0',sizeof(base));
strcpy(base,basePath);
strcat(base,"/");
strcat(base,ptr->d_name);
readFileList(base, path);
}
}
closedir(dir);
return 0;
}
int lookFileList(char *basePath)
{
DIR *dir;
struct dirent *ptr;
char base[1000];
char buf[__usrlen];
if ((dir=opendir(basePath)) == NULL)
{
perror("Open dir error...");
exit(1);
}
while ((ptr=readdir(dir)) != NULL)
{
if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir
continue;
else if(ptr->d_type == 8){ ///file
puts(ptr->d_name);
}
else if(ptr->d_type == 4) ///dir
{
memset(base,'\0',sizeof(base));
strcpy(base,basePath);
strcat(base,"/");
strcat(base,ptr->d_name);
lookFileList(base);
}
}
closedir(dir);
return 0;
}
makefile
Target = client
CC = gcc
lib = libclient.so
objects = main.o client.o getfilename.o
OBJS = $(wildcard *.o)
hpp = $(wildcard *.h)
$(Target): $(lib) $(objects)
$(CC) main.o -lclient -L. -o $(Target) -Wl,-rpath=. -lsqlite3
$(lib): client.o getfilename.o
$(CC) -shared $^ -o $(lib) -lsqlite3
client.o: client.c $(hpp)
$(CC) -c -fPIC $< -o $@ -lsqlite3
getfilename.o: getfilename.c $(hpp)
$(CC) -c -fPIC $< -o $@
main.o: main.c $(hpp)
$(CC) -c $< -o $@ -lsqlite3
.PHONY : clean cleanexe unistall
clean :
-rm $(OBJS)
cleanall :
$(clean) $(Target) $(lib)
#uninstall should be used with caution
uninstall :
-rm *
echo Unistall Successfully!
echo Thanks for Using!
四、服务器
server/
main.c
#include"server.h"
int main(int argc, char **argv){
d data;
signal(SIGCHLD, handler);
listenfd_init(&data, argc, argv);
libusrdb_init();
struct sockaddr_in caddr;
socklen_t addrlen = sizeof(caddr);
pid_t pid;
int ret;
while(1){
int connfd = accept(data.sockfd, (struct sockaddr *)&caddr, &addrlen);
pid = fork();
if(0 == pid){
close(data.sockfd);
m msg;
while(1){
memset(&msg, 0, sizeof(m));
//while(0 < (ret = recv(connfd, &msg, sizeof(m), 0))){
ret = recv(connfd, &msg, sizeof(m), 0);
if(-1 == ret)
handle_error("recv");
switch(msg.type){
case R:
regis(connfd, &msg);
break;
case L:
login(connfd, &msg);
break;
case Q:
quit(connfd, &msg);
break;
case S:
sltall(connfd, &msg);
break;
case U:
upfile(connfd, &msg);
break;
case D:
downfd(connfd, &msg);
break;
case C:
cancel(connfd, &msg);
break;
default :
break;
}
msg.type = 'u';
//}
}
}
else{
close(connfd);
}
}
}
server.h
#ifndef _SERVER_H_
#define _SERVER_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<signal.h>
#include<sys/wait.h>
#include<sqlite3.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<dirent.h>
#define CORVAL 1
#define NORVAL 0
#define ERRVAL -1
#define _STR(x) _VAL(x)
#define _VAL(x) #x
#define handle_error(LOG) do { perror(LOG); exit(EXIT_FAILURE); } while(0)
#define qDbug() do { puts(_STR(__LINE__)); } while(0)
#define __port 50000
#define __backlog 100
#define __usrlen 64
#define __textlen 1024
#define R 'R'
#define L 'L'
#define Q 'Q'
#define S 'S'
#define U 'U'
#define D 'D'
#define C 'C'
#define __mode 0777
#define __buflen 128
typedef struct data{
int sockfd;
struct sockaddr_in saddr;
socklen_t addrlen;
}d, *dp;
typedef struct msg{
int ret;
char type;
char usrname[__usrlen];
char usrpass[__usrlen];
char filename[__buflen];
char text[__textlen];
int connfd;
int flag;
}m, *mp;
void handler(int);
void listenfd_init(dp, int, char **);
void libusrdb_init();
void regis(int, mp);
void login(int, mp);
void quit(int, mp);
void sltall(int, mp);
void upfile(int, mp);
void downfd(int, mp);
void cancel(int, mp);
int readFileList(char *, char *);
int findFileList(char *basePath, char *path);
#endif
server.c
#include"server.h"
sqlite3 *usrdb = NULL;
char *errmsg = NULL;
void handler(int signum){
wait(NULL);
}
void listenfd_init(dp data, int argc, char **argv){
if(1 == argc){
printf("whether to manually enter IP and PORT(y/n)\n");
int answer;
while(1){
if(89 == (answer = fgetc(stdin)) || 121 == answer){
printf("please use '%s < IP > < PORT >'\n", argv[0]);
getchar();
exit(EXIT_SUCCESS);
}
else if(78 == answer || 110 == answer){
printf("the default settings will be used\n");
getchar();
break;
}
else{
printf("please use y or n (case sensitive)\n");
getchar();
}
}
}
else if(3 == argc){
printf("using manual setting\n");
}
data->sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
data->saddr.sin_family = AF_INET;
if(1 == argc){
data->saddr.sin_port = htons(__port);
data->saddr.sin_addr.s_addr = INADDR_ANY;
printf("ip:0.0.0.0 port:%d\n", __port);
}
else if(3 == argc){
data->saddr.sin_port = htons(atoi(argv[2]));
data->saddr.sin_addr.s_addr = inet_addr(argv[1]);
printf("ip:%s port:%s\n", argv[1], argv[2]);
}
else{
printf("too few arguments to server\n");
exit(EXIT_FAILURE);
}
data->addrlen = sizeof(data->saddr);
bind(data->sockfd, (const struct sockaddr *)&data->saddr, data->addrlen);
listen(data->sockfd, __backlog);
int nSendBuf = 512*1024*1024;
int nRecvBuf = 512*1024*1024;
setsockopt(data->sockfd, SOL_SOCKET, SO_SNDBUF, (const char *)&nSendBuf, sizeof(int));
setsockopt(data->sockfd, SOL_SOCKET, SO_RCVBUF, (const char *)&nRecvBuf, sizeof(int));
}
void libusrdb_init(){
sqlite3_open("usr.db", &usrdb);
sqlite3_exec(usrdb, "CREATE TABLE if not exists usr(usrname text, usrpass text, usrpath text);", NULL, NULL, &errmsg);
}
int callback_reg(void *para, int f_num, char **f_value, char **f_name){
send(((mp)para)->connfd, "The usrname has been occupied", strlen("The usrname has been occupied"), 0);
((mp)para)->flag = 0;
}
void regis(int connfd, mp msg){
msg->connfd = connfd;
msg->flag = 1;
char buf[__usrlen];
char path[__usrlen];
memset(path, '\0', __usrlen);
sprintf(buf, "SELECT * FROM usr WHERE usrname == '%s';", (*msg).usrname);
sqlite3_exec(usrdb, buf, callback_reg, msg, &errmsg);
while(msg->flag--){
strcpy(path, (*msg).usrname);
mkdir(path, __mode);
sprintf(buf, "INSERT INTO usr VALUES('%s', '%s', '%s'); ", (*msg).usrname, (*msg).usrpass, (*msg).usrname);
if(SQLITE_OK != sqlite3_exec(usrdb, buf, NULL, NULL, &errmsg)) printf("%s\n", errmsg);
send(connfd, "register success", strlen("register success"), 0);
}
}
int callback_log(void *para, int f_num, char **f_value, char **f_name){
if(0 == strcmp(f_value[1], ((mp)para)->usrpass)){
send(((mp)para)->connfd, "login success", strlen("login success"), 0);
((mp)para)->flag = 0;
}
}
void login(int connfd, mp msg){
msg->connfd = connfd;
msg->flag = 1;
char buf[__usrlen];
sprintf(buf, "SELECT * FROM usr WHERE usrname == '%s';", (*msg).usrname);
sqlite3_exec(usrdb, buf, callback_log, msg, &errmsg);
while(msg->flag--){
send(connfd, "login failed", strlen("login failed"), 0);
}
}
void quit(int connfd, mp msg){
send(connfd, "you have exited", strlen("you have exited"), 0);
close(connfd);
exit(0);
}
int callback_st(void *para, int f_num, char **f_value, char **f_name){
char buf[__usrlen];
memset(buf, '\0', __usrlen);
strcpy(buf, "ls -R ");
strcat(buf, f_value[2]);
FILE *stream;
stream = popen(buf, "r");
memset(buf, '\0', __usrlen);
memset((*(mp)para).text, '\0', __textlen);
while(0 != fgets(buf, __usrlen, stream)){
strcat((*(mp)para).text, buf);
}
send((*(mp)para).connfd, (*(mp)para).text, __textlen, 0);
pclose(stream);
(*(mp)para).flag = 0;
}
void sltall(int connfd, mp msg){
msg->connfd = connfd;
msg->flag = 1;
char buf[__usrlen];
sprintf(buf, "SELECT * FROM usr WHERE usrpath == '%s';", (*msg).usrname);
sqlite3_exec(usrdb, buf, callback_st, msg, &errmsg);
while(msg->flag--){
send(connfd, "select failed", strlen("select failed"), 0);
}
}
int callback_up(void *para, int f_num, char **f_value, char **f_name){
char basepath[__usrlen];
char path[__usrlen];
memset(basepath, '\0', __usrlen);
memset(path, '\0', __usrlen);
strcpy(path, "./");
strcat(path, f_value[2]);
strcat(path, "/");
strcpy(basepath, path);
strcat(path, (*(mp)para).filename);
int len = strlen(path);
char buf[__usrlen];
memset(buf, '\0', __usrlen);
int i = 0, j = -1;
for(i = 0; i < len; i++){
if('/' == path[i]){
if(0 < j++){
strncpy(buf, path, i);
mkdir(buf, __mode);
memset(buf, '\0', __usrlen);
}
}
}
if((*(mp)para).flag != 0){
if(1 == readFileList(basepath, path)){
memset(buf, '\0', __usrlen);
strcpy(buf, "rm ");
strcat(buf, path);
FILE *stream;
stream = popen(buf, "r");
memset(buf, '\0', __usrlen);
pclose(stream);
}
}
int fd = open(path, O_WRONLY | O_CREAT | O_APPEND, __mode);
write(fd, (*(mp)para).text, (*(mp)para).ret);
close(fd);
(*(mp)para).flag = 0;
}
void upfile(int connfd, mp msg){
msg->connfd = connfd;
msg->flag = 1;
int st_size = msg->ret;
int now_size = 0;
char buf[__usrlen];
sprintf(buf, "SELECT * FROM usr WHERE usrpath == '%s';", (*msg).usrname);
while(0 < (msg->ret = recv(connfd, msg->text, __textlen, 0))){
sqlite3_exec(usrdb, buf, callback_up, msg, &errmsg);
now_size += msg->ret;
if(st_size == now_size) break;
}
if(0 == msg->flag){
send(connfd, "upfile success", strlen("upfile success"), 0);
}
while(msg->flag--){
send(connfd, "upfile failed", strlen("upfile failed"), 0);
}
}
int callback_df(void *para, int f_num, char **f_value, char **f_name){
send((*(mp)para).connfd, "please wait", sizeof("please wait"), 0);
int fd;
struct stat buf;
char path[__usrlen];
int flag = 0;
memset(path, '\0', __usrlen);
for(int i = 0; i < strlen((*(mp)para).filename); i++){
if('/' == (*(mp)para).filename[i] && 0 == strncmp((*(mp)para).usrname, (*(mp)para).filename, i - 1)){
strcpy(path, (*(mp)para).filename);
flag = 1;
break;
}
}
if(1 != flag){
strcat(path, "./");
strcat(path, (*(mp)para).usrname);
strcat(path, "/");
if(1 == findFileList(path, (*(mp)para).filename)){
//strcpy(path, (*(mp)para).filename);
}
else{
memset(path, 0, __usrlen);
strcpy(path, "error.txt");
fd = open(path, O_RDWR | O_CREAT, __mode);
write(fd, "not found this file", sizeof("not found this file"));
close(fd);
fd = open(path, O_RDONLY);
fstat(fd, &buf);
(*(mp)para).ret = buf.st_size;
sleep(1);
send((*(mp)para).connfd, &((*(mp)para).ret), sizeof((*(mp)para).ret), 0);
sleep(1);
while(0 < ((*(mp)para).ret = read(fd, (*(mp)para).text, __textlen))){
send((*(mp)para).connfd, (*(mp)para).text, (*(mp)para).ret, 0);
memset((*(mp)para).text, 0, __textlen);
}
close(fd);
goto _loop;
}
}
fd = open(path, O_RDONLY);
fstat(fd, &buf);
(*(mp)para).ret = buf.st_size;
sleep(1);
send((*(mp)para).connfd, &((*(mp)para).ret), sizeof((*(mp)para).ret), 0);
sleep(1);
while(0 < ((*(mp)para).ret = read(fd, (*(mp)para).text, __textlen))){
send((*(mp)para).connfd, (*(mp)para).text, (*(mp)para).ret, 0);
memset((*(mp)para).text, 0, __textlen);
}
close(fd);
_loop:
;
(*(mp)para).flag = 0;
}
void downfd(int connfd, mp msg){
msg->connfd = connfd;
msg->flag = 1;
char buf[__usrlen];
sprintf(buf, "SELECT * FROM usr WHERE usrpath == '%s';", (*msg).usrname);
sqlite3_exec(usrdb, buf, callback_df, msg, &errmsg);
while(msg->flag--){
send(connfd, "downfd failed", strlen("downfd failed"), 0);
}
}
void cancel(int connfd, mp msg){
char buf[__usrlen];
memset(buf, '\0', __usrlen);
sprintf(buf, "DELETE FROM usr WHERE usrname == '%s';", (*msg).usrname);
sqlite3_exec(usrdb, buf, NULL, NULL, &errmsg);
memset(buf, '\0', __usrlen);
strcpy(buf, "rm -r ");
strcat(buf, (*msg).usrname);
FILE *stream;
stream = popen(buf, "r");
memset(buf, '\0', __usrlen);
pclose(stream);
send(connfd, "cancel success", strlen("cancel success"), 0);
}
getfilename.c
#include"server.h"
int readFileList(char *basePath, char *path)
{
DIR *dir;
struct dirent *ptr;
char base[1000];
char buf[__usrlen];
if ((dir=opendir(basePath)) == NULL)
{
perror("Open dir error...");
exit(1);
}
while ((ptr=readdir(dir)) != NULL)
{
if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir
continue;
else if(ptr->d_type == 8){ ///file
strcpy(buf, basePath);
strcat(buf, ptr->d_name);
if(0 == strncmp(buf,path,strlen(path))){
closedir(dir);
return 1;
}
memset(buf, 0, __usrlen);
}
else if(ptr->d_type == 4) ///dir
{
memset(base,'\0',sizeof(base));
strcpy(base,basePath);
strcat(base,"/");
strcat(base,ptr->d_name);
readFileList(base, path);
}
}
closedir(dir);
return 0;
}
int findFileList(char *basePath, char *path)
{
DIR *dir;
struct dirent *ptr;
char base[1000];
char buf[__usrlen];
if ((dir=opendir(basePath)) == NULL)
{
perror("Open dir error...");
exit(1);
}
while ((ptr=readdir(dir)) != NULL)
{
if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir
continue;
else if(ptr->d_type == 8){ ///file
#if 0
strcpy(buf, basePath);
strcat(buf, ptr->d_name);
#endif
strcpy(buf, ptr->d_name);
if(0 == strncmp(buf,path,strlen(path))){
closedir(dir);
strcpy(buf, basePath);
strcat(buf, ptr->d_name);
memset(basePath, 0, strlen(basePath));
strcpy(*&basePath, buf);
return 1;
}
memset(buf, 0, __usrlen);
}
else if(ptr->d_type == 4) ///dir
{
memset(base,'\0',sizeof(base));
strcpy(base,basePath);
strcat(base,"/");
strcat(base,ptr->d_name);
readFileList(base, path);
}
}
closedir(dir);
return 0;
}
makefile
Target = server
CC = gcc
lib = libserver.so
objects = main.o server.o getfilename.o
OBJS = $(wildcard *.o)
hpp = $(wildcard *.h)
#$(Target): $(objects) server.h
# $(CC) -o $@ $^
$(Target): $(lib) $(objects)
$(CC) main.o -lserver -L. -o $(Target) -Wl,-rpath=. -lsqlite3
$(lib): server.o getfilename.o
$(CC) -shared $^ -o $(lib) -lsqlite3
server.o: server.c $(hpp)
$(CC) -c -fPIC $< -o $@ -lsqlite3
getfilename.o: getfilename.c $(hpp)
$(CC) -c -fPIC $< -o $@
main.o: main.c $(hpp)
$(CC) -c $< -o $@ -lsqlite3
.PHONY : clean cleanexe unistall
clean :
-rm $(OBJS)
cleanall :
$(clean) $(Target) $(lib)
#uninstall should be used with caution
uninstall :
-rm *
echo Unistall Successfully!
echo Thanks for Using!