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; }
|