void prim_conport(PRIM_PROTOTYPE) { /* int -- char * */ char *pname; CHECKOP(1); oper1 = POP(); if (mlev < LMAGE) abort_interp("Mage prim"); if (oper1->type != PROG_INTEGER) abort_interp("Argument not an integer (1)"); result = oper1->data.number; if ((result < 1) || (result > pcount())) abort_interp("Invalid connection number (1)"); pname = pport(result); CHECKOFLOW(1); CLEAR(oper1); PushString(pname); }
char proc_ftpd(char * buf) { char **cmdp, *cp, *arg, *tmpstr; char sendbuf[200]; int slen; long ret; /* Translate first word to lower case */ for (cp = buf; *cp != ' ' && *cp != '\0'; cp++) *cp = tolower(*cp); /* Find command in table; if not present, return syntax error */ for (cmdp = commands; *cmdp != NULL; cmdp++) if (strncmp(*cmdp, buf, strlen(*cmdp)) == 0) break; if (*cmdp == NULL) { //fsprintf(CTRL_SOCK, badcmd, buf); slen = sprintf(sendbuf, "500 Unknown command '%s'\r\n", buf); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); return 0; } /* Allow only USER, PASS and QUIT before logging in */ if (ftp.state == FTPS_NOT_LOGIN) { switch(cmdp - commands) { case USER_CMD: case PASS_CMD: case QUIT_CMD: break; default: //fsprintf(CTRL_SOCK, notlog); slen = sprintf(sendbuf, "530 Please log in with USER and PASS\r\n"); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); return 0; } } arg = &buf[strlen(*cmdp)]; while(*arg == ' ') arg++; /* Execute specific command */ switch (cmdp - commands) { case USER_CMD : #if defined(_FTP_DEBUG_) printf("USER_CMD : %s", arg); #endif slen = strlen(arg); arg[slen - 1] = 0x00; arg[slen - 2] = 0x00; strcpy(ftp.username, arg); //fsprintf(CTRL_SOCK, givepass); slen = sprintf(sendbuf, "331 Enter PASS command\r\n"); ret = send(CTRL_SOCK, (uint8_t *)sendbuf, slen); if(ret < 0) { #if defined(_FTP_DEBUG_) printf("%d:send() error:%ld\r\n",CTRL_SOCK,ret); #endif close(CTRL_SOCK); return ret; } break; case PASS_CMD : #if defined(_FTP_DEBUG_) printf("PASS_CMD : %s", arg); #endif slen = strlen(arg); arg[slen - 1] = 0x00; arg[slen - 2] = 0x00; ftplogin(arg); break; case TYPE_CMD : slen = strlen(arg); arg[slen - 1] = 0x00; arg[slen - 2] = 0x00; switch(arg[0]) { case 'A': case 'a': /* Ascii */ ftp.type = ASCII_TYPE; //fsprintf(CTRL_SOCK, typeok, arg); slen = sprintf(sendbuf, "200 Type set to %s\r\n", arg); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); break; case 'B': case 'b': /* Binary */ case 'I': case 'i': /* Image */ ftp.type = IMAGE_TYPE; //fsprintf(CTRL_SOCK, typeok, arg); slen = sprintf(sendbuf, "200 Type set to %s\r\n", arg); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); break; default: /* Invalid */ //fsprintf(CTRL_SOCK, badtype, arg); slen = sprintf(sendbuf, "501 Unknown type \"%s\"\r\n", arg); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); break; } break; case FEAT_CMD : slen = sprintf(sendbuf, "211-Features:\r\n MDTM\r\n REST STREAM\r\n SIZE\r\n MLST size*;type*;create*;modify*;\r\n MLSD\r\n UTF8\r\n CLNT\r\n MFMT\r\n211 END\r\n"); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); break; case QUIT_CMD : #if defined(_FTP_DEBUG_) printf("QUIT_CMD\r\n"); #endif //fsprintf(CTRL_SOCK, bye); slen = sprintf(sendbuf, "221 Goodbye!\r\n"); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); disconnect(CTRL_SOCK); break; case RETR_CMD : slen = strlen(arg); arg[slen - 1] = 0x00; arg[slen - 2] = 0x00; #if defined(_FTP_DEBUG_) printf("RETR_CMD\r\n"); #endif if(strlen(ftp.workingdir) == 1) sprintf(ftp.filename, "/%s", arg); else sprintf(ftp.filename, "%s/%s", ftp.workingdir, arg); slen = sprintf(sendbuf, "150 Opening data channel for file downloand from server of \"%s\"\r\n", ftp.filename); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); ftp.current_cmd = RETR_CMD; break; case APPE_CMD : case STOR_CMD: slen = strlen(arg); arg[slen - 1] = 0x00; arg[slen - 2] = 0x00; #if defined(_FTP_DEBUG_) printf("STOR_CMD\r\n"); #endif if(strlen(ftp.workingdir) == 1) sprintf(ftp.filename, "/%s", arg); else sprintf(ftp.filename, "%s/%s", ftp.workingdir, arg); slen = sprintf(sendbuf, "150 Opening data channel for file upload to server of \"%s\"\r\n", ftp.filename); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); ftp.current_cmd = STOR_CMD; if((ret = connect(DATA_SOCK, remote_ip.cVal, remote_port)) != SOCK_OK){ #if defined(_FTP_DEBUG_) printf("%d:Connect error\r\n", DATA_SOCK); #endif return ret; } connect_state_data = 0; break; case PORT_CMD: #if defined(_FTP_DEBUG_) printf("PORT_CMD\r\n"); #endif if (pport(arg) == -1){ //fsprintf(CTRL_SOCK, badport); slen = sprintf(sendbuf, "501 Bad port syntax\r\n"); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); } else{ //fsprintf(CTRL_SOCK, portok); ftp.dsock_mode = ACTIVE_MODE; ftp.dsock_state = DATASOCK_READY; slen = sprintf(sendbuf, "200 PORT command successful.\r\n"); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); } break; case MLSD_CMD: #if defined(_FTP_DEBUG_) printf("MLSD_CMD\r\n"); #endif slen = sprintf(sendbuf, "150 Opening data channel for directory listing of \"%s\"\r\n", ftp.workingdir); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); ftp.current_cmd = MLSD_CMD; break; case LIST_CMD: #if defined(_FTP_DEBUG_) printf("LIST_CMD\r\n"); #endif slen = sprintf(sendbuf, "150 Opening data channel for directory listing of \"%s\"\r\n", ftp.workingdir); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); ftp.current_cmd = LIST_CMD; break; case NLST_CMD: #if defined(_FTP_DEBUG_) printf("NLST_CMD\r\n"); #endif break; case SYST_CMD: slen = sprintf(sendbuf, "215 UNIX emulated by WIZnet\r\n"); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); break; case PWD_CMD: case XPWD_CMD: slen = sprintf(sendbuf, "257 \"%s\" is current directory.\r\n", ftp.workingdir); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); break; case PASV_CMD: slen = sprintf(sendbuf, "227 Entering Passive Mode (%d,%d,%d,%d,%d,%d)\r\n", local_ip.cVal[0], local_ip.cVal[1], local_ip.cVal[2], local_ip.cVal[3], local_port >> 8, local_port & 0x00ff); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); disconnect(DATA_SOCK); ftp.dsock_mode = PASSIVE_MODE; ftp.dsock_state = DATASOCK_READY; #if defined(_FTP_DEBUG_) printf("PASV port: %d\r\n", local_port); #endif break; case SIZE_CMD: slen = strlen(arg); arg[slen - 1] = 0x00; arg[slen - 2] = 0x00; if(slen > 3) { tmpstr = strrchr(arg, '/'); *tmpstr = 0; #if defined(F_FILESYSTEM) slen = get_filesize(arg, tmpstr + 1); #else slen = _MAX_SS; #endif if(slen > 0) slen = sprintf(sendbuf, "213 %d\r\n", slen); else slen = sprintf(sendbuf, "550 File not Found\r\n"); } else { slen = sprintf(sendbuf, "550 File not Found\r\n"); } send(CTRL_SOCK, (uint8_t *)sendbuf, slen); break; case CWD_CMD: slen = strlen(arg); arg[slen - 1] = 0x00; arg[slen - 2] = 0x00; if(slen > 3) { arg[slen - 3] = 0x00; tmpstr = strrchr(arg, '/'); *tmpstr = 0; #if defined(F_FILESYSTEM) slen = get_filesize(arg, tmpstr + 1); #else slen = 0; #endif *tmpstr = '/'; if(slen == 0){ slen = sprintf(sendbuf, "213 %d\r\n", slen); strcpy(ftp.workingdir, arg); slen = sprintf(sendbuf, "250 CWD successful. \"%s\" is current directory.\r\n", ftp.workingdir); } else { slen = sprintf(sendbuf, "550 CWD failed. \"%s\"\r\n", arg); } } else { strcpy(ftp.workingdir, arg); slen = sprintf(sendbuf, "250 CWD successful. \"%s\" is current directory.\r\n", ftp.workingdir); } send(CTRL_SOCK, (uint8_t *)sendbuf, slen); break; case MKD_CMD: case XMKD_CMD: slen = strlen(arg); arg[slen - 1] = 0x00; arg[slen - 2] = 0x00; #if defined(F_FILESYSTEM) if (f_mkdir(arg) != 0) { slen = sprintf(sendbuf, "550 Can't create directory. \"%s\"\r\n", arg); } else { slen = sprintf(sendbuf, "257 MKD command successful. \"%s\"\r\n", arg); //strcpy(ftp.workingdir, arg); } #else slen = sprintf(sendbuf, "550 Can't create directory. Permission denied\r\n"); #endif send(CTRL_SOCK, (uint8_t *)sendbuf, slen); break; case DELE_CMD: slen = strlen(arg); arg[slen - 1] = 0x00; arg[slen - 2] = 0x00; #if defined(F_FILESYSTEM) if (f_unlink(arg) != 0) { slen = sprintf(sendbuf, "550 Could not delete. \"%s\"\r\n", arg); } else { slen = sprintf(sendbuf, "250 Deleted. \"%s\"\r\n", arg); } #else slen = sprintf(sendbuf, "550 Could not delete. Permission denied\r\n"); #endif send(CTRL_SOCK, (uint8_t *)sendbuf, slen); break; case XCWD_CMD: case ACCT_CMD: case XRMD_CMD: case RMD_CMD: case STRU_CMD: case MODE_CMD: case XMD5_CMD: //fsprintf(CTRL_SOCK, unimp); slen = sprintf(sendbuf, "502 Command does not implemented yet.\r\n"); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); break; default: /* Invalid */ //fsprintf(CTRL_SOCK, badcmd, arg); slen = sprintf(sendbuf, "500 Unknown command \'%s\'\r\n", arg); send(CTRL_SOCK, (uint8_t *)sendbuf, slen); break; } return 1; }