Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <string.h>
- #include <arpa/inet.h>
- #include <sys/socket.h>
- #include <errno.h>
- #define PUERTO 6666
- #define MAX_USER 100
- #define MAX_PASS 300
- #define MAX 512
- ssize_t read_n(int fd, void*datos, int n);
- ssize_t write_n(int fd, void*datos, int n);
- ssize_t copiaf (char* fich_destino, char* fich_origen, char*usuario, char*contrasena);
- int main(int argc, char*argv[])
- {
- if(argc<5){
- printf("Uso %s <dest> <orig> <user> <pass>\n", argv[0]);
- exit(1);
- }
- //Variables
- int sockfd;
- int long_user = strlen(argv[3]);
- int long_pass = strlen(argv[4]);
- int retorno;
- uint32_t longBE;
- struct sockaddr_in destino;
- socklen_t addrlen = sizeof(destino);
- //Preparamos la direccion de memoria
- memset((char*)&destino, 0, sizeof(destino));
- destino.sin_family = AF_INET;
- destino.sin_port = htons(PUERTO);
- //Abrimos el socket
- if((sockfd=socket(PF_INET, SOCK_STREAM, 0))<0){
- perror("socket");
- exit(1);
- }
- //Metemos la direccion IP
- uint32_t dir = inet_addr("127.0.0.1");
- memcpy(&destino.sin_addr, &dir, 4);
- //Nos conectamos al servidor
- if(connect(sockfd, (struct sockaddr*)&destino, addrlen)<0){
- perror("connect");
- close(sockfd);
- exit(1);
- }
- //Enviamos longitud y user
- longBE = htonl(long_user);
- if(write_n(sockfd, &longBE, sizeof(longBE))!=sizeof(longBE)){
- perror("write long user");
- close(sockfd);
- exit(1);
- }
- if(write_n(sockfd, argv[3], long_user)!= long_user){
- perror("write user");
- close(sockfd);
- exit(1);
- }
- //Recibimos el retorno del user
- if(read_n(sockfd, &longBE, sizeof(longBE))!=sizeof(longBE)){
- perror("read ret user");
- close(sockfd);
- exit(1);
- }
- retorno = ntohl(longBE);
- if(retorno==-1){
- printf("El user no se encuentra en el sistema\n");
- close(sockfd);
- exit(1);
- }else{
- printf("Se envía la contraseña\n");
- //Enviamos longitud y contraseña
- longBE = htonl(long_pass);
- if(write_n(sockfd, &longBE, sizeof(longBE))!=sizeof(longBE)){
- perror("write long pass");
- close(sockfd);
- exit(1);
- }
- if(write_n(sockfd, argv[4], long_pass)!=long_pass){
- perror("write pass");
- close(sockfd);
- exit(1);
- }
- //Recibimos el retorno de la contraseña
- if(read_n(sockfd, &longBE, sizeof(longBE))!=sizeof(longBE)){
- perror("read ret pass");
- close(sockfd);
- exit(1);
- }
- retorno = ntohl(longBE);
- if(retorno==-1){
- printf("La contraseña no coincide con el user\n");
- close(sockfd);
- exit(1);
- }else{
- printf("Se procede a hacer una copia de los ficheros\n");
- retorno = copiaf(argv[1], argv[2], argv[3], argv[4]);
- if(retorno>0){
- printf("Se han copiado %d bytes\n", retorno);
- }
- if(close(sockfd)<0){
- perror("close");
- exit(1);
- }
- }
- }//else de haber metido bien el user
- return 0;
- }
- ssize_t read_n(int fd, void*datos, int n)
- {
- ssize_t totalLeidos = 0;
- ssize_t intentandoLeer = n;
- ssize_t leidos;
- do{
- errno = 0;
- leidos=read(fd, totalLeidos + datos, intentandoLeer);
- if(leidos>0){
- totalLeidos += leidos;
- intentandoLeer -= leidos;
- }
- }while(((totalLeidos <n)&&(leidos>0))||(errno==EINTR));
- if(leidos<0){
- return leidos;
- }else{
- return totalLeidos;
- }
- }
- ssize_t write_n(int fd, void*datos, int n)
- {
- ssize_t totalLeidos = 0;
- ssize_t intentandoLeer = n;
- ssize_t leidos;
- do{
- errno = 0;
- leidos=write(fd, totalLeidos + datos, intentandoLeer);
- if(leidos>0){
- totalLeidos += leidos;
- intentandoLeer -= leidos;
- }
- }while(((totalLeidos <n)&&(leidos>0))||(errno==EINTR));
- if(leidos<0){
- return leidos;
- }else{
- return totalLeidos;
- }
- }
- ssize_t copiaf (char* fich_destino, char* fich_origen, char*usuario, char*contrasena)
- {
- ssize_t copiados = 0;
- int ret = -1;
- //Abrimos los ficheros
- int fdest = open(fich_destino, O_WRONLY|O_TRUNC|O_CREAT, 0644);
- if(fdest<0){
- perror("open dest");
- exit(1);
- }
- int forig = open(fich_origen, O_RDONLY);
- if(forig<0){
- perror("open origen");
- exit(1);
- }
- //Leemos del fichero de claves
- FILE * file = fopen("claves.txt", "r");
- //printf("Se ha abierto todo\n");
- char linea[500];
- char buffer[MAX];
- char *user;
- char *pass;
- while((fgets(linea, 500-1, file)!=NULL)){
- linea[strlen(linea)-1] = '\0';
- //printf("%s\n", linea);
- char*puntero = strstr(linea, "@");
- *puntero = '\0';
- user = linea;
- pass = puntero + 1;
- if(strcmp(usuario,user)==0){
- //printf("%s %s\n", pass, contrasena);
- if(strcmp(pass, contrasena)!=0){
- ret = -2;
- }else{
- int leidos;
- do{
- leidos = read(forig, buffer, MAX);
- if(leidos<0){
- perror("read orig");
- exit(1);
- }
- int escritos= write(fdest, buffer, leidos);
- if(escritos<0){
- perror("write dest");
- exit(1);
- }
- copiados+=escritos;
- }while(leidos>0);
- ret = copiados;
- break;
- }
- }
- }
- return ret;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement