Frage

I'm trying to implement a small client-server program using Sun RPC. One function I would like it to have is for the client to be able to upload a file of any format to the server.

Right now I have this specification:

struct add_in{
  string author<>;
  string title<>;
  opaque file<>;
};

struct node{
  struct node * next;
  int id;
  string author<>;
  string title<>;
  opaque paper<>;
}; 

struct info_out{
  string author<>;
  string title<>;
};

typedef int add_out;
typedef int remove_in;
typedef struct node* list_out;
typedef int info_in;
typedef int fetch_in;
typedef char* fetch_out;

program FUNCTIONS {
  version FUNCTIONS_VERS {
    /* Add function. Adds paper to server "database"*/
    add_out ADD_PROC(add_in) = 1;
    /*Remove function. Removes paper from server "database"*/
    void REMOVE_PROC(remove_in) = 2;
    /*List function. Displays the papers currently stored by the server*/
    list_out LIST_PROC() = 3;
    /*Info function. Displays the auther and title of a specific paper*/
    info_out INFO_PROC(info_in) = 4;
    /*Fetch function. Fetches content of paper from server*/
    fetch_out FETCH_PROC(fetch_in) = 5;
  } = 1;
} = 0x00000001;

and this is my client:

#include "functions.h"
#include <stdio.h>
#include <stdlib.h>

char * read_file(char* path){
  FILE *file;
  char *buffer;
  long file_length;

  file = fopen(path, "rb");
  if(file == NULL){
    perror("Unable to open file");
    exit(1);
  }
  printf("file opened\n");

  fseek(file,0,SEEK_END);
  file_length = ftell(file);
  fseek(file,0,SEEK_SET);

  buffer=(char *)malloc(file_length+1);
  if(buffer == NULL){
    perror("Error allocating memory");
    exit(1);
  }
  printf("Memory allocated\n");

  fread(buffer, file_length, 1, file);
  fclose(file);

  printf("File imported, fd closed\n");
  return buffer;
}

int main(int argc, char** argv){
  CLIENT *cl;
  char *buf;
  add_in in;
  add_out *out;

  cl = clnt_create(argv[1], FUNCTIONS, FUNCTIONS_VERS, "tcp");
  in.author = argv[3];
  in.title = argv[4];
  in.file = read_file(argv[5]);


  out = add_proc_1(&in, cl);
  if(out == NULL){
    fprintf(stderr,"Error: %s\n", clnt_sperror(cl,argv[1]));
  }else{
    printf("%d\n",*out);
  }

  return 0;
}

The problem lies in the "in.file = read_file(argv[5])" statement. I get a compiler error stating:

incompatible types when assigning to type ‘struct ’ from type ‘char *’

So my question is, what kind of pointer does he need??

Thanks!

Linus

War es hilfreich?

Lösung

opaque file is translated into a struct:

struct {
    uint file_len;
    char* file_val;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top