ftp/ftpc.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 <string.h>
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     4
#include "ftp.h"
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     5
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     6
extern __thread int errno;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     7
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     8
/*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
     9
 * Gets the requested file from the server by calling the
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    10
 * remote procedure in a loop
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    11
 */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    12
int get_file(char *host, char *name)
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    13
{
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    14
    CLIENT *clnt;
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    15
    int bytes = 0, write_items;
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    16
    readfile_res *result;
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    17
    request req;
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    18
    FILE *file;
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    19
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    20
    /*
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    21
     * Initialize the request with the file name 
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    22
     */
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    23
    req.name = name;
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    24
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    25
    /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    26
     * Create client handle used for calling FTPPROG on
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    27
     * the server designated on the command line. Use
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    28
     * the tcp protocol when contacting the server.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    29
     */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    30
    clnt = clnt_create(host, FTPPROG, FTPVER, "tcp");
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    31
    if (clnt == NULL) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    32
        /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    33
         * Couldn't establish connection with server.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    34
         * Print error message and stop.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    35
         */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    36
         clnt_pcreateerror(host);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    37
         exit(1);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    38
    }
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    39
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    40
	/*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    41
	 * Open the file for writing on the client machine
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    42
	 */
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    43
    file = fopen(name, "wb");
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    44
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    45
    /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    46
     * Call the remote procedure retrieve_file on the server.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    47
	 * During each iteration of the loop remote procedure is
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    48
	 * called and only 1024 bytes of data is read and returned
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    49
	 * by the server. The loop terminates when the data returned
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    50
	 * from the server is less than 1024 bytes
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    51
     */
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    52
    while (1) {
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    53
        /*
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    54
	 * Specifies the byte position where the next read should be
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    55
	 * started in the server.
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    56
	 */
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    57
	req.start = bytes;
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    58
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    59
        result = retrieve_file_1(&req, clnt);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    60
        if (result == NULL) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    61
            /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    62
             * An RPC error occurred while calling the server.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    63
             * Print error message and stop.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    64
             */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    65
            clnt_perror(clnt, host);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    66
            exit(1);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    67
        }
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    68
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    69
        /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    70
         * We successfully called the remote procedure.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    71
         */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    72
        if (result->errno != 0) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    73
            /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    74
             * A remote system error occurred.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    75
             * Print error message and stop.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    76
             */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    77
            errno = result->errno;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    78
            perror(name);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    79
            exit(1);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    80
        }
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    81
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    82
        /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    83
         * Successfully got a chunk of the file.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    84
         * Write into our local file and update the
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    85
	 * total bytes of data read till now.
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    86
         */
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    87
	write_items = fwrite(result->readfile_res_u.chunk.data, sizeof(int), result->readfile_res_u.chunk.items, file);
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    88
	bytes += result->readfile_res_u.chunk.items * (sizeof(int));
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    89
	if (result->readfile_res_u.chunk.items < MAXLEN) 
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    90
	    break;
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    91
    }
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    92
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    93
    fclose(file);
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    94
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
    95
    return 0;
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    96
}
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    97
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    98
/*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    99
 * Stores the file on the server by calling the remote
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   100
 * procedure in a loop
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   101
 */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   102
int put_file(char *host, char *name)
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   103
{
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   104
    CLIENT *clnt;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   105
    int *result;
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   106
    filechunk data;
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   107
    chunksend chunk;
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   108
    FILE *file;
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   109
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   110
    /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   111
     * Create client handle used for calling FTPPROG on
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   112
     * the server designated on the command line. Use
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   113
     * the tcp protocol when contacting the server.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   114
     */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   115
    clnt = clnt_create(host, FTPPROG, FTPVER, "tcp");
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   116
    if (clnt == NULL) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   117
        /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   118
         * Couldn't establish connection with server.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   119
         * Print error message and stop.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   120
         */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   121
         clnt_pcreateerror(host);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   122
         exit(1);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   123
    }
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   124
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   125
    /*
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   126
     * Open the file that should be stored on the server
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   127
     */
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   128
    file = fopen(name, "rb");
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   129
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   130
    /*
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   131
     * Initialize the chunk to be sent with the name
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   132
     * of the file
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   133
     */ 
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   134
    chunk.name = name;
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   135
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   136
    /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   137
     * Call the remote procedure readdir on the server
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   138
     * in a loop sending only 1024 bytes of data in each
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   139
     * iteration. The loop terminates once the data less
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   140
     * than 1024 bytes is sent.
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   141
     */
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   142
    while (1) {
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   143
  	chunk.items = fread(chunk.data, sizeof(int), MAXLEN, file);
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   144
        result = send_file_1(&chunk, clnt);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   145
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   146
        if (result == NULL) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   147
            /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   148
             * An RPC error occurred while calling the server.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   149
             * Print error message and stop.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   150
             */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   151
            clnt_perror(clnt, host);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   152
            exit(1);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   153
        }
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   154
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   155
        /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   156
         * Okay, we successfully called the remote procedure.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   157
         */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   158
        if (*result != 0) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   159
            /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   160
             * A remote system error occurred.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   161
             * Print error message and stop.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   162
             */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   163
            errno = *result;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   164
            perror(name);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   165
            exit(1);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   166
        }
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   167
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   168
        /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   169
         * Successfully got a chunk of the file.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   170
         * Write into our local file.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   171
         */
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   172
	if (chunk.items < MAXLEN) 
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   173
	    break;
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   174
    }
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   175
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   176
    fclose(file);
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   177
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   178
    return 0;
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   179
}
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   180
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   181
/*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   182
 * Handles commands read on the command line and calls
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   183
 * the appropriate function to handle the command
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   184
 */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   185
int read_command(char *host)
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   186
{
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   187
    char command[MAXLEN];
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   188
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   189
    printf("> ");
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   190
    fflush(stdin);
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   191
    gets(command);
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   192
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   193
    if (strncmp(command, "get", 3) == 0) {
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   194
	return get_file(host, command+4);
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   195
    } else if(strncmp(command, "put", 3) == 0){
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   196
 	return put_file(host, command+4);
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   197
    } else if(strncmp(command, "exit", 4) == 0){
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   198
	exit(0);
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   199
    } else {
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   200
	return -1;
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   201
    }
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   202
}
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   203
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   204
int main(int argc, char *argv[])
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   205
{
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   206
   int result;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   207
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   208
   if (argc != 2) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   209
        fprintf(stderr, "usage: %s host\n", argv[0]);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   210
        exit(1);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   211
   }
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   212
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   213
   /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   214
    * Command handling loop
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   215
    */
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   216
   while(TRUE) {
1
47438813ede2 Added support for handling binary files.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 0
diff changeset
   217
       result = read_command(argv[1]);
0
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   218
   }
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   219
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   220
   return 0;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   221
}
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   222