blob: c83bc71660b845f5706f6875c81b29e381917d41 [file]
/***
* $RCSfile: tftp.java,v $ $Revision: 1.1 $ $Date: 2002/04/03 01:04:25 $
*
* NetComponents Internet Protocol Library
* Copyright (C) 1997-2002 Daniel F. Savarese
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library in the LICENSE file; if not, write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA
***/
import java.io.*;
import java.net.*;
import com.oroinc.net.tftp.*;
/***
* This is an example of a simple Java tftp client using NetComponents.
* Notice how all of the code is really just argument processing and
* error handling.
* <p>
* Usage: tftp [options] hostname localfile remotefile
* hostname - The name of the remote host
* localfile - The name of the local file to send or the name to use for
* the received file
* remotefile - The name of the remote file to receive or the name for
* the remote server to use to name the local file being sent.
* options: (The default is to assume -r -b)
* -s Send a local file
* -r Receive a remote file
* -a Use ASCII transfer mode
* -b Use binary transfer mode
* <p>
***/
public final class tftp {
static final String USAGE =
"Usage: tftp [options] hostname localfile remotefile\n\n" +
"hostname - The name of the remote host\n" +
"localfile - The name of the local file to send or the name to use for\n" +
"\tthe received file\n" +
"remotefile - The name of the remote file to receive or the name for\n" +
"\tthe remote server to use to name the local file being sent.\n\n"+
"options: (The default is to assume -r -b)\n" +
"\t-s Send a local file\n" +
"\t-r Receive a remote file\n" +
"\t-a Use ASCII transfer mode\n" +
"\t-b Use binary transfer mode\n";
public final static void main(String[] args) {
boolean receiveFile = true, closed;
int transferMode = TFTP.BINARY_MODE, argc;
String arg, hostname, localFilename, remoteFilename;
TFTPClient tftp;
// Parse options
for(argc = 0; argc < args.length; argc++) {
arg = args[argc];
if(arg.startsWith("-")) {
if(arg.equals("-r"))
receiveFile = true;
else if(arg.equals("-s"))
receiveFile = false;
else if(arg.equals("-a"))
transferMode = TFTP.ASCII_MODE;
else if(arg.equals("-b"))
transferMode = TFTP.BINARY_MODE;
else {
System.err.println("Error: unrecognized option.");
System.err.print(USAGE);
System.exit(1);
}
} else
break;
}
// Make sure there are enough arguments
if(args.length - argc != 3) {
System.err.println("Error: invalid number of arguments.");
System.err.print(USAGE);
System.exit(1);
}
// Get host and file arguments
hostname = args[argc];
localFilename = args[argc + 1];
remoteFilename = args[argc + 2];
// Create our TFTP instance to handle the file transfer.
tftp = new TFTPClient();
// We want to timeout if a response takes longer than 60 seconds
tftp.setDefaultTimeout(60000);
// Open local socket
try {
tftp.open();
} catch(SocketException e) {
System.err.println("Error: could not open local UDP socket.");
System.err.println(e.getMessage());
System.exit(1);
}
// We haven't closed the local file yet.
closed = false;
// If we're receiving a file, receive, otherwise send.
if(receiveFile) {
FileOutputStream output = null;
File file;
file = new File(localFilename);
// If file exists, don't overwrite it.
if(file.exists()) {
System.err.println("Error: " + localFilename + " already exists.");
System.exit(1);
}
// Try to open local file for writing
try {
output = new FileOutputStream(file);
} catch(IOException e) {
tftp.close();
System.err.println("Error: could not open local file for writing.");
System.err.println(e.getMessage());
System.exit(1);
}
// Try to receive remote file via TFTP
try {
tftp.receiveFile(remoteFilename, transferMode, output, hostname);
} catch(UnknownHostException e) {
System.err.println("Error: could not resolve hostname.");
System.err.println(e.getMessage());
System.exit(1);
} catch(IOException e) {
System.err.println(
"Error: I/O exception occurred while receiving file.");
System.err.println(e.getMessage());
System.exit(1);
}
finally {
// Close local socket and output file
tftp.close();
try {
output.close();
closed = true;
} catch(IOException e) {
closed = false;
System.err.println("Error: error closing file.");
System.err.println(e.getMessage());
}
}
if(!closed)
System.exit(1);
} else {
// We're sending a file
FileInputStream input = null;
// Try to open local file for reading
try {
input = new FileInputStream(localFilename);
} catch(IOException e) {
tftp.close();
System.err.println("Error: could not open local file for reading.");
System.err.println(e.getMessage());
System.exit(1);
}
// Try to send local file via TFTP
try {
tftp.sendFile(remoteFilename, transferMode, input, hostname);
} catch(UnknownHostException e) {
System.err.println("Error: could not resolve hostname.");
System.err.println(e.getMessage());
System.exit(1);
} catch(IOException e) {
System.err.println(
"Error: I/O exception occurred while sending file.");
System.err.println(e.getMessage());
System.exit(1);
}
finally {
// Close local socket and input file
tftp.close();
try {
input.close();
closed = true;
} catch(IOException e) {
closed = false;
System.err.println("Error: error closing file.");
System.err.println(e.getMessage());
}
}
if(!closed)
System.exit(1);
}
}
}