ftp/ftpc.c
author Madhusudan.C.S <madhusudancs@gmail.com>
Mon, 18 Jan 2010 14:10:13 +0530
changeset 0 30d751ac6d49
child 1 47438813ede2
permissions -rw-r--r--
Solution to first assignment. First assignment was to implement a FTP Server and Client using SUN RPC. This is in C. Doesn't support binary file formats yet. Both binary file format transfer support and Python equivalent of the code is to be added yet.
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;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    15
	int total_bytes = 0, write_bytes;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    16
    readfile_res *result;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    17
	request req;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    18
	FILE *file;
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
    /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    21
	 * Initialize the request with the file name 
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    22
	 */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    23
	req.name = name;
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
	 */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    43
    file = fopen(name, "w");
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
     */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    52
	while (1) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    53
		/*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    54
		 * Specifies the byte position where the next read should be
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    55
		 * started in the server.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    56
		 */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    57
		req.start = total_bytes;
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
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    85
		 * total bytes of data read till now.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    86
         */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    87
		write_bytes = fwrite(result->readfile_res_u.chunk.data, 1, result->readfile_res_u.chunk.bytes, file);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    88
		total_bytes += result->readfile_res_u.chunk.bytes;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    89
		if (result->readfile_res_u.chunk.bytes < MAXLEN) 
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    90
		    break;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    91
	}
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    92
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    93
	fclose(file);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    94
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
    95
	return 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
    char data[1024];
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   106
	int read_bytes;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   107
    int *result;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   108
	chunksend chunk;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   109
	FILE *file;
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
    /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   112
     * Create client handle used for calling FTPPROG on
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   113
     * the server designated on the command line. Use
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   114
     * the tcp protocol when contacting the server.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   115
     */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   116
    clnt = clnt_create(host, FTPPROG, FTPVER, "tcp");
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   117
    if (clnt == NULL) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   118
        /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   119
         * Couldn't establish connection with server.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   120
         * Print error message and stop.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   121
         */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   122
         clnt_pcreateerror(host);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   123
         exit(1);
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
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   126
    /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   127
	 * Open the file that should be stored on the server
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   128
	 */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   129
    file = fopen(name, "r");
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   130
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   131
    /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   132
	 * Initialize the chunk to be sent with the name
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   133
	 * of the file
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   134
	 */ 
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   135
	chunk.name = name;
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
    /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   138
     * Call the remote procedure readdir on the server
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   139
	 * in a loop sending only 1024 bytes of data in each
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   140
	 * iteration. The loop terminates once the data less
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   141
	 * than 1024 bytes is sent.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   142
     */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   143
	while (1) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   144
		read_bytes = fread(data, 1, MAXLEN, file);
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
        chunk.data = data;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   147
		chunk.bytes = read_bytes;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   148
        result = send_file_1(&chunk, clnt);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   149
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   150
        if (result == NULL) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   151
            /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   152
             * An RPC error occurred while calling the server.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   153
             * Print error message and stop.
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
            clnt_perror(clnt, host);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   156
            exit(1);
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
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
         * Okay, we successfully called the remote procedure.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   161
         */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   162
        if (*result != 0) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   163
            /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   164
             * A remote system error occurred.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   165
             * Print error message and stop.
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
            errno = *result;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   168
            perror(name);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   169
            exit(1);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   170
        }
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   171
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   172
        /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   173
         * Successfully got a chunk of the file.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   174
         * Write into our local file.
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   175
         */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   176
		if (read_bytes < MAXLEN) 
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   177
		    break;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   178
	}
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
	fclose(file);
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
	return 0;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   183
}
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
/*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   186
 * Handles commands read on the command line and calls
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   187
 * the appropriate function to handle the command
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   188
 */
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   189
int read_command(char *host)
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   190
{
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   191
	char command[MAXLEN];
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
	printf("> ");
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   194
	fflush(stdin);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   195
	gets(command);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   196
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   197
    if (strncmp(command, "get", 3) == 0) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   198
		return get_file(host, command+4);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   199
	} else if(strncmp(command, "put", 3) == 0){
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   200
		return put_file(host, command+4);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   201
	} else if(strncmp(command, "exit", 4) == 0){
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   202
		exit(0);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   203
    } else {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   204
		return -1;
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
}
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
int main(int argc, char *argv[])
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   209
{
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   210
   int result;
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
   if (argc != 2) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   213
        fprintf(stderr, "usage: %s host\n", argv[0]);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   214
        exit(1);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   215
   }
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   216
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   217
   /*
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   218
    * Command handling loop
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
   while(TRUE) {
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   221
	   result = read_command(argv[1]);
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   222
   }
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   223
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   224
   return 0;
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   225
}
30d751ac6d49 Solution to first assignment.
Madhusudan.C.S <madhusudancs@gmail.com>
parents:
diff changeset
   226