ftp/ftps.c
author Madhusudan.C.S <madhusudancs@gmail.com>
Mon, 18 Jan 2010 17:21:39 +0530
changeset 1 47438813ede2
parent 0 30d751ac6d49
permissions -rw-r--r--
Added support for handling binary files. The problem was I was using XDR strings for reading data, storing it and transferring to the client from the server. But since this is no better than null-terminated string, whenever data had \000 the data used to become corrupt from that point. So now I changed all data to be integer arrays so there is no question of corruption.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     1
#include <rpc/rpc.h>
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     2
#include <stdio.h>
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     3
#include "ftp.h"
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     4
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     5
extern __thread int errno;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     6
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     7
readfile_res* retrieve_file_1_svc(request *req, struct svc_req *rqstp)
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     8
{
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
     9
    FILE *file;
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    10
    filechunk data;
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    11
    static readfile_res res;
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    12
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    13
    file = fopen(req->name, "rb");
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    14
	if (file == NULL) {
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    15
   	    res.errno = errno;
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    16
	    return (&res);
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    17
    }
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    18
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    19
    xdr_free((xdrproc_t)xdr_readfile_res, (char *)&res);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    20
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    21
    fseek (file, req->start, SEEK_SET);
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    22
    res.readfile_res_u.chunk.items = fread(res.readfile_res_u.chunk.data, sizeof(int), MAXLEN, file);
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    23
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    24
    /*
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    25
     * Return the result
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    26
     */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    27
    res.errno = 0;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    28
    fclose(file);
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    29
    return (&res);
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    30
}
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    31
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    32
int* send_file_1_svc(chunksend *rec, struct svc_req *rqstp)
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    33
{
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    34
    FILE *file;
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    35
    int write_items;
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    36
    static int result;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    37
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    38
    file = fopen(rec->name, "ab");
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    39
    if (file == NULL) {
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    40
  	result = errno;
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    41
	return &result;
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    42
    }
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    43
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    44
    write_items = fwrite(rec->data, sizeof(int), rec->items, file);
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    45
    fclose(file);
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    46
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    47
    result = 0;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    48
    return &result;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    49
}
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    50