Site hosted by Angelfire.com: Build your free website today!
/*************************************************************************
TuXBuZZ - bY DoC#include
requests.c 
**************************************************************************/


#include "requests.h"



int parse_requests(struct TuxbuzzPackage pack,int clientsock)
{
  
switch (pack.message){
case MSG_RINFO_REMOTE:
  process_request_info(clientsock,1);
  return MSG_RINFO_REMOTE;
break;
case MSG_RINFO_USER:
  process_request_info(clientsock,2);
  return MSG_RINFO_USER;
break;
case MSG_GET:
  process_request_get(clientsock);
  return MSG_GET;
break;  
case MSG_DISCONNECT:
  process_request_disconnect(clientsock);
  return MSG_DISCONNECT;
break;
case MSG_LS:
  process_request_ls(clientsock);
  return MSG_LS;
break;
case MSG_CHDIR:
  process_request_cd(clientsock,pack);
  return MSG_CHDIR;
break;
case MSG_PWD:
  process_request_pwd(clientsock);
  return MSG_PWD;
case MSG_EXEC:
  process_request_exec(clientsock,pack);
  return MSG_EXEC;
default:
  return -1;
  }
}


/* manda informacoes para o cliente. pode ser informacoes da maquina
ou do usuario (usuario pelo qual o servidor esta rodando )*/ 
int process_request_info(int clientsock,int flags)
{
struct utsname machine; /* para informacoes da maquina */
struct passwd *userinfo;/* para informacoes do usuario */
char userinfostr[1024];
pid_t uid;
  
bzero(userinfostr,1024);
  
switch(flags){
case 1: /* manda inf. da maquina */
  uname(&machine); /* pega as inf. da maquina */ 
  send(clientsock,&machine,sizeof(machine),0);
  return 0;
break;
case 2:/* manda inf. do usuario */
  uid = getuid();
  setpwent();
  do
    userinfo = getpwent();
  while(userinfo->pw_uid!=uid);
      
  sprintf(userinfostr,"Username: %s\n"
    "User Password: %s\n"
    "User ID: %d\n"
    "Group ID: %d\n"
    "Comment: %s\n"
    "Home Directory: %s\n"
    "Shell: %s\n",
    userinfo->pw_name,userinfo->pw_passwd,userinfo->pw_uid,userinfo->pw_gid
    ,userinfo->pw_gecos,userinfo->pw_dir,userinfo->pw_shell
    );
      send(clientsock,userinfostr,1024,0);
  return 0;
    }

  }


/* pega um arquivo e manda para o cliente */
int process_request_get(int clientsock)
{
 int fd;
 struct TuxbuzzPackage pack;
 
 bzero(&pack,sizeof(struct TuxbuzzPackage));
 pack.message = MSG_CONTINUE;
 send(clientsock,&pack,sizeof(struct TuxbuzzPackage),0);
 bzero(&pack,sizeof(struct TuxbuzzPackage));
 recv(clientsock,&pack,sizeof(struct TuxbuzzPackage),0);
   
 fd = open(pack.data,O_RDONLY);
 if(fd>0){
    bzero(&pack,sizeof(struct TuxbuzzPackage));
    for(;;){
	     pack.message = read(fd,pack.data,1024);        
	     send(clientsock,&pack,sizeof(struct TuxbuzzPackage),0);
	     bzero(&pack,sizeof(struct TuxbuzzPackage));
       recv(clientsock,&pack,sizeof(struct TuxbuzzPackage),0);
       if(pack.message!=MSG_CONTINUE) 
          break;
	        }
	      }else{ /* se nao pode abrir o arquivo especificado */  
               pack.message=-1;
			         send(clientsock,&pack,sizeof(struct TuxbuzzPackage),0);
			         bzero(&pack,sizeof(struct TuxbuzzPackage));
               recv(clientsock,&pack,sizeof(struct TuxbuzzPackage),0);
               return -1;
			   }
 if(fd>0)
  close(fd);        
 
 return 0;
}


/* ls do diretorio atual usando pipe  para mandar pro cliente*/
int process_request_ls(int clientsock)
{
struct TuxbuzzPackage pack;
FILE* pipedesc; /* descritor de arquivos do pipe */
 

pipedesc = popen("ls -l","r"); /* abre o pipe com ls*/

while(!feof(pipedesc))
{
  bzero(&pack,sizeof(struct TuxbuzzPackage));
  fread(pack.data,1024,1,pipedesc);
  pack.message=1;
  send(clientsock,&pack,sizeof(struct TuxbuzzPackage),0);
  recv(clientsock,&pack,sizeof(struct TuxbuzzPackage),0);
}

pack.message=0;
send(clientsock,&pack,sizeof(struct TuxbuzzPackage),0);
recv(clientsock,&pack,sizeof(struct TuxbuzzPackage),0);
pclose(pipedesc); /* fecha o pipe */

return 0;
}


/* muda o diretorio atual */
int process_request_cd(int clientsock,struct TuxbuzzPackage tpack)
{
struct TuxbuzzPackage pack;

bzero(&pack,sizeof(struct TuxbuzzPackage));
fprintf(stdout,"chdir: %s\n",tpack.data);
chdir(tpack.data);
getcwd(pack.data,1024);
send(clientsock,&pack,sizeof(struct TuxbuzzPackage),0);

return 0;
}

/* manda o diretorio atual (pwd) para o cliente */  
int process_request_pwd(int clientsock)
{
struct TuxbuzzPackage pack;

bzero(&pack,sizeof(struct TuxbuzzPackage));
getcwd(pack.data,sizeof (pack.data));
send(clientsock,&pack,sizeof(struct TuxbuzzPackage),0);

return 0;
}

int process_request_exec(int clientsock,struct TuxbuzzPackage tpack)
{
pid_t pid;
/*char *args[] = {NULL};*/
extern char **environ;

pid = fork();

if(pid==0){
  execlp(tpack.data,NULL);
exit(-1);
}else if(pid>0){
  fprintf(stdout,"exec: %s %d",tpack.data,strlen(tpack.data));
  return 0;}
else if(pid<0)fprintf(stdout,"MERDA!!!!!\n");
  return -1;
}


/* fecha a conexao com o cliente depois de receber MSG_DISCONNECT */
int process_request_disconnect(int clientsock)
{
  close(clientsock); /* fecha o socket do cliente */
  #ifdef TUXBUZZ_DEBUG
    fprintf(stdout,"connection closed by client\n");
    fflush(stdout);/* parece um bug de buffers : ( */
  #endif
  return 0;
}

/* fim de requests.c */