Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Very very basic FTP by Basshunter
- #if defined ftp_included
- #endinput
- #endif
- #define ftp_included
- #pragma library ftp
- #include <a_samp>
- #include <socket>
- #undef INVALID_SOCKET
- #define INVALID_SOCKET Socket:(-1) // warning miatt
- #define INVALID_FTP_ID -1
- #define MAX_FTP 255
- #define MAX_FILE_PATH_LEN 255
- #define MAX_USER_LEN 32
- #define MAX_PASS_LEN 32
- forward OnFTPConnected(ftpId);
- forward OnFTPDisconnected(ftpId);
- forward OnFileDownloaded(ftpId, file[], savedAs[]);
- enum ftpEnum {
- bool:Active,
- bool:Connected,
- Host[32],
- Socket:SocketId,
- Socket:DataSocketId,
- File[MAX_FILE_PATH_LEN],
- SaveAs[MAX_FILE_PATH_LEN]
- }
- new ftpData[MAX_FTP][ftpEnum];
- stock CreateFTP(host[], port, user[] = "", pass[] = "") {
- new ftpId = 0;
- for (; ftpId < MAX_FTP; ftpId++) if (!ftpData[ftpId][Active]) break;
- if (ftpId == MAX_FTP) return INVALID_FTP_ID;
- ftpData[ftpId][SocketId] = socket_create(TCP);
- if (is_socket_valid(ftpData[ftpId][SocketId])) {
- socket_connect(ftpData[ftpId][SocketId], host, port);
- format(ftpData[ftpId][Host], 32, host);
- new formatstring[256] = "";
- if (strlen(user) > 0) {
- format(formatstring, sizeof(formatstring), "USER %s\r\n", user);
- }
- if (strlen(pass) > 0) {
- format(formatstring, sizeof(formatstring), "%sPASS %s\r\n", formatstring, pass);
- }
- format(formatstring, sizeof(formatstring), "%sPWD\r\nTYPE I\r\nPASV\r\nMLSD\r\n", formatstring);
- socket_send(ftpData[ftpId][SocketId], formatstring, strlen(formatstring));
- ftpData[ftpId][Active] = true;
- ftpData[ftpId][Connected] = false;
- ftpData[ftpId][File][0] = '\0';
- ftpData[ftpId][SaveAs][0] = '\0';
- return ftpId;
- }
- return INVALID_FTP_ID;
- }
- stock DestroyFTP(ftpId) {
- if (!ftpData[ftpId][Active]) return 1;
- if (is_socket_valid(ftpData[ftpId][SocketId])) {
- socket_send(ftpData[ftpId][SocketId], "QUIT\r\n", strlen("QUIT\r\n"));
- socket_destroy(ftpData[ftpId][SocketId]);
- }
- if (is_socket_valid(ftpData[ftpId][DataSocketId])) {
- socket_send(ftpData[ftpId][DataSocketId], "QUIT\r\n", strlen("QUIT\r\n"));
- socket_destroy(ftpData[ftpId][DataSocketId]);
- }
- ftpData[ftpId][Connected] = false;
- ftpData[ftpId][File][0] = '\0';
- ftpData[ftpId][SaveAs][0] = '\0';
- ftpData[ftpId][Active] = false;
- CallRemoteFunction("OnFTPDisconnected", "i", ftpId);
- return 0;
- }
- stock DownloadFTP(ftpId, file[], saveAs[]) {
- if (!ftpData[ftpId][Active]) return 1;
- memcpy(ftpData[ftpId][File], file, 0, MAX_FILE_PATH_LEN * 4, MAX_FILE_PATH_LEN);
- memcpy(ftpData[ftpId][SaveAs], saveAs, 0, MAX_FILE_PATH_LEN * 4, MAX_FILE_PATH_LEN);
- new formatstring[128];
- format(formatstring, sizeof(formatstring), "RETR %s\r\n", file);
- socket_send(ftpData[ftpId][SocketId], formatstring, strlen(formatstring));
- return 0;
- }
- public onSocketAnswer(Socket:id, data[], data_len) {
- // FTP id behatárolása
- new
- bool:dataSocket = false,
- ftpId = 0;
- for (; ftpId < MAX_FTP; ftpId++) {
- if (ftpData[ftpId][SocketId] == id) break;
- if (ftpData[ftpId][DataSocketId] == id) {
- dataSocket = true;
- break;
- }
- }
- if (ftpId == INVALID_FTP_ID) return 1;
- if (!ftpData[ftpId][Connected]) {
- CallRemoteFunction("OnFTPConnected", "i", ftpId);
- ftpData[ftpId][Connected] = true;
- }
- if (dataSocket) {
- if (ftpData[ftpId][File][0] != '\0') {
- new File:downloaded = fopen(ftpData[ftpId][SaveAs], io_write);
- //fwrite(downloaded, data);
- //for (new i = 0; i < data_len; i++) printf("%c", getarg(1,i));
- for (new i = 0; i < data_len; i++) fputchar(downloaded, data[i] & 255, false);
- fclose(downloaded);
- CallRemoteFunction("OnFileDownloaded", "iss", ftpId, ftpData[ftpId][File], ftpData[ftpId][SaveAs]);
- ftpData[ftpId][File][0] = '\0';
- ftpData[ftpId][SaveAs][0] = '\0';
- }
- }
- else {
- new File:temp = ftemp();
- fwrite(temp, data);
- fseek(temp, 0, seek_start); // fájl elejére ugrás
- new line[256];
- // Soronként olvasás...
- while (fread(temp, line, sizeof(line))) {
- //printf("[FTP #%i] %s", ftpId, line);
- switch (GetFTPCode(line)) {
- // https://en.wikipedia.org/wiki/List_of_FTP_server_return_codes
- // Alkalmazva a teljesség igénye nélkül... :D
- case 227: {
- new port = GetPort(line);
- if (port != (-1)) {
- ftpData[ftpId][DataSocketId] = socket_create(TCP);
- if (is_socket_valid(ftpData[ftpId][DataSocketId])) {
- socket_connect(ftpData[ftpId][DataSocketId], ftpData[ftpId][Host], port);
- }
- printf("[FTP #%i] Szerver altal felkinalt port: %i", ftpId, port);
- }
- }
- // 332 Need account for login.
- // 430 Invalid username or password
- // 421 Connection timed out
- case 332, 430, 421: {
- DestroyFTP(ftpId);
- }
- // 550 File not found
- case 550: {
- printf("[FTP #%i] Fájl nem található: %s", ftpId, ftpData[ftpId][File]);
- ftpData[ftpId][File][0] = '\0';
- ftpData[ftpId][SaveAs][0] = '\0';
- }
- }
- }
- fclose(temp);
- }
- return 1;
- }
- // Segédfüggvények...
- // Megmondja, milyen szám van a sztring elején
- stock GetFTPCode(string[]) {
- new code;
- for (new i = 0; '0' <= string[i] <= '9'; i++) {
- code = (code * 10) + string[i] - '0';
- }
- return code;
- }
- // A passzív mód üzenetéből kiolvassa a portot
- // www.serv-u.com/respcode.asp?resp=227
- stock GetPort(string[]) {
- new p1, p2, delims = 0;
- for (new i = 0; string[i]; i++) {
- if ('0' <= string[i] <= '9') {
- if (delims == 4) p1 = p1 * 10 + string[i] - '0';
- if (delims == 5) p2 = p2 * 10 + string[i] - '0';
- }
- else if (delims >= 5) return (p1 * 256) + p2;
- if (string[i] == ',') delims++;
- }
- return -1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement