Пример #1
0
static int recv_lnk(int socket, struct server_data* server_data, int dir_fd)
{
    char* lnkname = NULL;
    char* lnkdest = NULL;
    int ret = -1;

    if (server_receive(socket, server_data, data_handler_stringify, &lnkname) != 0) {
        VIR_DEBUG("server_receive was not successfull (on lnkname)!");
        goto err;
    }

    if (server_receive(socket, server_data, data_handler_stringify, &lnkdest) != 0) {
        VIR_DEBUG("server_receive was not successfull (on lnkdest)!");
        goto err;
    }
    VIR_DEBUG("%d", dir_fd);
/*    VIR_DEBUG("received link '%s'->'%s'", lnkname, lnkdest);
    if (symlinkat(lnkdest, dir_fd, lnkname) < 0) {
        VIR_DEBUG("symlinkat: errno: %s", strerror(errno));
        goto err;
    }*/

    VIR_DEBUG("received symlink '%s' (%lu byte(s)) -> '%s' (%lu byte(s)).", lnkname, strlen(lnkname)+1, lnkdest, strlen(lnkdest)+1);

    ret = 0;
err:
    free(lnkname);
    free(lnkdest);
    return ret;
}
Пример #2
0
static int recv_dir(int socket, struct server_data* server_data, int dir_fd)
{
    char* dirname = NULL;
    int ret = -1;
    if (server_receive(socket, server_data, data_handler_stringify, &dirname) != 0) {
        VIR_DEBUG("server_receive was not successfull (on dir)!");
        goto err;
    }

    //permission 664
    if (mkdirat(dir_fd, dirname, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) {
        if (errno == EEXIST) {
            VIR_DEBUG("directory '%s' already exists. jump mkdir step", dirname);
        } else {
            VIR_DEBUG("errno: %s", strerror(errno));
            goto err;
        }
    }

    VIR_DEBUG("received dir '%s' (%lu byte(s)).", dirname, strlen(dirname)+1);

    ret = 0;
 err:
    free(dirname);
    return ret;
}
Пример #3
0
static int recv_reg(int socket, struct server_data* server_data, int dir_fd)
{
    char* msg = NULL;
    int filefd;
  //  struct stat statdata;
    int ret = -1;
    
    //VIR_DEBUG("receiving new regular file");

    if (server_receive(socket, server_data, data_handler_stringify, &msg) != 0) {
        VIR_DEBUG("server_receive was not successfull (on filename)!");
        goto err;
    }

 //   VIR_DEBUG("about to receive reg '%s' at fd %d", msg, dir_fd);
    //open with permission 664
    filefd = openat(dir_fd, msg, O_RDWR | O_CREAT | O_NOFOLLOW, S_IRUSR | S_IWUSR |  S_IRGRP | S_IWGRP | S_IROTH);

    if (filefd < 0) {
        VIR_DEBUG("errno: %s", strerror(errno));
        goto err;
    }

    if (server_receive(socket, server_data, data_handler_filewriter, &filefd) != 0) {
        VIR_DEBUG("server_received was not successfull!");
        goto err;
    }
 /*   if (fstat(filefd, &statdata)) {
        VIR_DEBUG("cannot stat file");
        goto err;
    }
*/
    VIR_DEBUG("received file '%s'.", msg);

    ret = 0;
err:
    close(filefd);
    free(msg);
    return ret;
}
Пример #4
0
/*
 * TASK to handle an incoming request
 */
int server_request (void *parm)
{
  SERVERPARM *s;
  DBUF *req, *res;
  char *curl;

  s = (SERVERPARM *) parm;
  curl = xml_get_text (s->xml, "Phineas.Console.Url");
  res = NULL;
  while ((req = server_receive (s->conn)) != NULL)
  {
    debug ("received %d bytes\n", dbuf_size (req));
    if (dbuf_size (req) == 0)
    {
      dbuf_free (req);
      net_close (s->conn);
      return (-1);
    }
    dbuf_putc (req, 0);
    /*
     * log the request, but filter out GET requests for the console... 
     * noise
     */
    if (!(*curl && strstarts (dbuf_getbuf (req) + 4, curl)))
      server_logrequest (s->conn, dbuf_size (req), dbuf_getbuf (req));
    if ((res = server_response (s->xml, dbuf_getbuf (req))) == NULL)
    {
      res = server_respond (500,
	    "<h3>Failure processing ebXML request</h3>");
    }
    server_header (res);
    net_write (s->conn, dbuf_getbuf (res), dbuf_size (res));
    dbuf_free (res);
    dbuf_free (req);
  }
  net_close (s->conn);
  debug ("request completed\n");
  return (0);
}
Пример #5
0
int main(int argc, char **argv)
{
  int status;
  char ip_addr[INET_ADDRSTRLEN];
  char *service;
  int server_sock = -1;
  int exit_flag = 0;
  int ftp_sock = 9999;

  fd_set temp;

  /*Init. Logger*/
#ifndef MY_PC
  cse4589_init_log(argv[2]);
#endif

  int sock;
  if(argc<3)
  {
    printf("No args\n");
    return 1;
  }
  if(!validate_port(argv[2]))
    return 0;

  FD_ZERO(&wait_fd);
  FD_ZERO(&temp);
  FD_SET(0, &wait_fd);
  tv.tv_sec = 15;
  tv.tv_usec = 0;

  if(!strcmp(argv[1], "s"))
  {
    is_server = true;
  }
  else if(strcmp(argv[1], "c"))
  {
    printf("Usage ./sock [s/c]\n");
    return 0;
  }
  set_listening_port(argv[2]);
  server_sock = server_start(argv[2]);
  if(server_sock <=0)return 0;
  sock = server_sock;
  add_fd(sock);

  int i =2;
  while(!exit_flag)
  {
    temp = wait_fd;
    int ret = select(active_sockets, &temp, NULL, NULL, NULL);
    if(ret)
    {
      if(FD_ISSET(STDIN, &temp))
      {
        exit_flag = parse_shell();
      }
      else if(FD_ISSET(server_sock, &temp))
      {
        // server socket is active, check for new connections
        if(is_server)
        {
          int new_socket = server_accept(server_sock);
          add_fd(new_socket);
        }
        else
        {
          int new_socket = server_accept(server_sock);
          //add ftp socket
          add_fd(new_socket);
          ftp_sock = new_socket;
        }
      }
      else if(FD_ISSET(ftp_sock, &temp))
      {
        client_receive_file(&ftp_sock);
      }
      else
      {
        for(int fd = 3; fd<=active_sockets; fd++)
        {
          if(FD_ISSET(fd, &temp))
          {
            if(is_server)
              server_receive(fd);
            else
              client_receive(fd);
          }
        }
      } //End of else
    } //end of select handling
  } //end loop
  clear_fd(sock);
  close(sock);
#ifndef MY_PC
  fclose(fopen(LOGFILE, "w"));
#endif
  return 0;
}
Пример #6
0
int process_requests(int s){
   char buffer[10000];
   fra_t fragment;
   struct sockaddr remote;
   int rlen,retval;
   int N=0;
   struct file_s file[100];
   
   struct fgetinfo p1;
   struct fgetfrag p2;
   struct finfo    *p4;
   struct ffrag    *p5;
  
   while (1) {
      switch (server_receive(s,buffer,sizeof(buffer),&remote,&rlen)){
         case 1:
            memcpy(&p1,buffer,sizeof(p1));
            if(check_fgetinfo(p1)){
               printf("Corrupted packet\n");
            }
            else{
               print_fgetinfo(p1);
               //check if file exists and can be open
               if((file[N].fd=(FILE *)fopen(p1.file_path,"r"))==NULL){
                  // If file not found tell the client
                  p4=get_sinfo(0,0,0);
               }
               else{
                  strncpy(file[N].file_path,p1.file_path,FILENAME_MAX);
                  file[N].file_id=N;
                  // If file found, tell the client info about it
                  fseek(file[N].fd, 0, SEEK_END);      // seek to end of file
                  file[N].size=ftell(file[N].fd); // get file size
                  // Has no sense to seek back to beginning of file
                  p4=get_sinfo(1,file[N].file_id,file[N].size);
                  N++;
               }
               // Send info about the file
               if(reply(s,&remote,rlen,p4,sizeof(*p4))){
                  printf("Error sending\n");
               }
            }
            break;
         case 2:
            memcpy(&p2,buffer,sizeof(p2));
            if(check_fgetfrag(p2)){
               printf("Corrupted packet\n");
            }
            else{
               // Send fragment
               fseek(file[p2.file_id].fd,SEEK_SET,p2.offset);
               if((retval=fread(fragment,sizeof(char),sizeof(fra_t),file[p2.file_id].fd))<=0){
                  printf("Nothing read\n");
               }
               p5=get_ffrag(p2.file_id,p2.offset,fragment,retval);
               if(reply(s,&remote,rlen,p5,sizeof(*p5))){
                  printf("Error sending\n");
               }
            }
            break;
         case 0:
            printf("Error receiving\n");
            break;
         default:
            printf("Unknown packet received\n");
            break;
      }   
   }
}