服务端信息处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include "Server.h"

// 接收并处理命令
int RecvCommand(Node_t *p){
int netfd = p->netfd;
//接收指令
SignalSend_t *cmd = (SignalSend_t *)calloc(1, sizeof(SignalSend_t));
if (cmd == NULL){
printf("Error calloc\n");
syslog(LOG_ERR, "(error: %s)", strerror(errno));
return 0;
}
ssize_t ret = recv(netfd, cmd, sizeof(SignalSend_t), 0);
if (ret <= 0){
printf("Client %d disconnected\n", netfd);
syslog(LOG_ERR, "Client %d disconnected\n", netfd);
free(cmd);
return -1;
}
//printf("cmd->size == %d, cmd->path == %s, cmd->pathname[0] = %s\n", cmd->size, cmd->path, cmd->pathname[0]);

FileBuf_t *msg = (FileBuf_t *)malloc(sizeof(FileBuf_t));
memset(msg->buf, 0, strlen(msg->buf));

char path[DEPTH * PATHLEN] = BEGIN; //拼接客户端眼中实际地址

// 判断路径, PUTS 用客户端自己的地址
int depth = p->depth;
if(cmd->sig_t != PUTS){
int pret = JudgePath(cmd, &depth, p->path, path); //获得了地址
if (pret == -1){
syslog(LOG_ERR, "Error path");
memcpy(msg->buf, "Error path", strlen("Error path"));
msg->size = strlen(msg->buf);
send(netfd, msg, sizeof(FileBuf_t), 0);
free(cmd);
free(msg);
return 0;
}
printf("path == %s\n", path);
}
char showpath[LENGTH] = ROOT; //pwd用

switch(cmd->sig_t){

case CD: // cd
if(CmdCd(path, depth, msg, p) != 0){
syslog(LOG_ERR, "CD: (error: %s)", strerror(errno));
}
break;
case LS: // ls
if(CmdLs(path, msg) != 0){
syslog(LOG_ERR, "LS: (error: %s)", strerror(errno));
}
break;
case PWD: // pwd
printf("path == %s\n", path);
strcat(showpath, path);
memcpy(&showpath[strlen(ROOT)], "n", 1); //把.变成n
memcpy(msg->buf, showpath, strlen(showpath));
break;
case REMOVE: // remove
if(unlink(path) != 0){
sprintf(msg->buf, "REMOVE: (error: %s)", strerror(errno));
syslog(LOG_ERR, "REMOVE: (error: %s)", strerror(errno));
}
break;
case MKDIR: // mkdir
if(mkdir(path, 0755) != 0){
sprintf(msg->buf, "MKDIR: (error: %s)", strerror(errno));
syslog(LOG_ERR, "MKDIR: (error: %s)", strerror(errno));
}
break;
case RMDIR: // rmdir
if(rmdir(path) != 0){
sprintf(msg->buf, "RMDIR: (error: %s)", strerror(errno));
syslog(LOG_ERR, "RMDIR: (error: %s)", strerror(errno));
}
break;
case PUTS: // puts (上传)
if(RecvFile(netfd) == -1){
sprintf(msg->buf, "PUTS: (error: %s)", strerror(errno));
syslog(LOG_ERR, "PUTS: (error: %s)", strerror(errno));
}
break;
case GETS: // gets (下载)
if(TransFile(netfd, path) == -1){
sprintf(msg->buf, "GETS: (error: %s)", strerror(errno));
syslog(LOG_ERR, "GETS: (error: %s)", strerror(errno));
}
break;
default:
memcpy(msg->buf, cmd->path, strlen(cmd->path));
break;
}

msg->size = strlen(msg->buf);
printf("sig_t == %d\n%s\n", cmd->sig_t, msg->buf);

int send_ret = send(netfd, msg, sizeof(FileBuf_t), MSG_NOSIGNAL);

// 释放内存
free(cmd);
free(msg);
if (send_ret == -1){
syslog(LOG_ERR, "send msgback (error: %s)", strerror(errno));
return -1;
}
return 0;
}

服务端地址拼接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "Server.h"
// 路径判断函数
int JudgePath(const SignalSend_t *cmd, int *depth, char cpath[DEPTH][PATHLEN], char *path){
if(cmd->size == 0){
if(cmd->sig_t != 0){
for(int i = 0; i <= *depth; ++i){
strcat(path, "/");
strncat(path, cpath[i], strlen(cpath[i]));
}
}
return 0; // 路径不变
}
char newpath[DEPTH][PATHLEN];
memset(newpath, 0, sizeof(newpath));

if(strcmp(cmd->pathname[0], "/") == 0 && cmd->size > 0){
// 绝对路径,重置当前路径为根目录, 理论上这里需要清空
*depth = -1;
}else{
for(int j = 0; j <= *depth; ++j){
memcpy(newpath[j], cpath[j], strlen(cpath[j]));
}
}

for(int i = 0; i < cmd->size; ++i){
if(*depth < -1 || *depth > DEPTH - 2){
return -1;;// 不能跳出根目录
}
if(strcmp(cmd->pathname[i], "..") == 0){
memset(newpath[*depth + 1], 0, PATHLEN);
--(*depth);
continue;
}else if (strcmp(cmd->pathname[i], ".") != 0){
memcpy(newpath[*depth + 1], cmd->pathname[i], strlen(cmd->pathname[i]));
++(*depth);
}
}

for(int i = 0; i < *depth + 1; ++i){
strcat(path, "/");
strncat(path, newpath[i], strlen(newpath[i]));
}
return 0;
}