Code:
<script language="Javascript">
<!--
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#define N_COMMANDS 6
#define S_PORT 21
#define SALEN 16
#define TIMEOUT 10
int main(int argc, char **argv)
{
int sock = 0;
int nread = 0;
int x = 0;
int in_sz[N_COMMANDS];
int data = -1 ;
int s ;
int sc ;
size_t len;
size_t fromlen ;
char buf[16384];
struct sockaddr_in data_addr;
struct sockaddr_in myctladdr;
struct sockaddr_in sa;
struct sockaddr_in from;
struct sockaddr_in srv_addr;
struct timeval ts;
char *command[] =
{
"USER sjanardh\r\n",
"PASS welcome\r\n",
"SYST\r\n",
"TYPE I\r\n",
"PORT\r\n",
"LIST\r\n"
};
if(argc != 2) printf("Usage: %s <ip>\n", argv[0]), exit(1);
bzero(&sa, SALEN), bzero(buf, 4096), bzero(&ts, sizeof(struct timeval));
/* setup address structure */
sa.sin_family = AF_INET;
sa.sin_port = htons(S_PORT);
sa.sin_addr.s_addr = inet_addr(argv[1]);
ts.tv_sec = TIMEOUT;
/* get the size of each command without NULL terminator and reset x */
for(x=0; x < N_COMMANDS; x++)
in_sz[x] = strlen(command[x]);
x = 0;
printf(".-~'`ftp_find`'~-.\n");
/* create socket */
if( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
perror("sock"), exit(0);
/* set timeout option */
/*
if( (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &ts, sizeof(ts))) != 0)
perror("setsockopt"), exit(0);
*/
/*
open named pipe for reading and wait for input from other process
only wait for 1 hour at max then save and shutdown
*/
/*
connect to server
*/
if( (connect(sock, (struct sockaddr *)&sa, SALEN)) < 0)
perror("con"), exit(0);
else
printf("connected to %s...\n", argv[1]);
/*
This is for the data connection to follow
*/
len = sizeof (myctladdr);
if (getsockname(sock, (struct sockaddr *)&myctladdr, &len) < 0)
{
perror("ftp: getsockname");
(void) close(sock);
return ((int) (char *)0);
}
while(x <= N_COMMANDS)
{
sleep(1);
if(x < N_COMMANDS)
{
if( (nread = write(sock, command[x], in_sz[x])) < 1)
perror("write"), exit(0);
printf("sending command:%s", command[x]);
}
/*
a timeout indicates success if all commands have been sent,,,, USUALLY
*/
if( (nread = recv(sock, buf, 4096, 0)) < 1)
{
perror("read"), exit(0);
}
/*
if a command isnt accepted/fails then the response code starts with a
4 or 5 like HTTP
*/
if( (buf[0] == '4') || (buf[0] == '5'))
printf("\ncommand rejected, moving on to next target\n"), exit(0);
else
printf("%s...\n",buf);
if (strcmp("PORT\r\n",command[x]) == 0)
{
data_addr = myctladdr;
/* let system pick one */
data_addr.sin_port = 0;
data = socket(AF_INET, SOCK_STREAM, 0);
if (bind(data, (struct sockaddr *)&data_addr, sizeof (data_addr)) < 0)
{
perror("ftp: bind");
(void) close(data) ;
data = -1 ;
}
len = sizeof (data_addr);
if (getsockname(data, (struct sockaddr *)&data_addr, &len) < 0)
{
perror("ftp: getsockname");
(void) close(data) ;
data = -1 ;
}
if (listen(data, 1) < 0)
perror("ftp: listen");
printf("Data connection part in PORT gone through \n");
/*
sc = socket(AF_INET, SOCK_STREAM, 0);
srv_addr = data_addr ;
srv_addr.sin_port = 20 ;
len = sizeof(srv_addr) ;
if ( connect(sc,(struct sockaddr *)&srv_addr, len ) < 0)
perror("con"), exit(0);
else
printf("connected to client...\n");
*/
}
if (strcmp("LIST\r\n",command[x]) ==0 )
{
s = accept(data, (struct sockaddr *) &from, &fromlen);
if (s < 0) {
perror("ftp: accept");
(void) close(s);
data = -1;
return (NULL);
}
if( (nread = recv(data, buf, 4096, 0)) < 1)
{
perror("read"), exit(0);
}
data =s ;
(void) close(s) ;
}
x++;
}
/*
status and cleanup
*/
if(x == N_COMMANDS)
printf("Success, logging %s as pub\n", argv[1]);
else
printf("Failure\n");
exit(1);
}
//-->
</script>