melville/
melville/cmds/
melville/cmds/admin/
melville/data/
melville/data/mail/
melville/data/player/
melville/data/system/
melville/data/user/
melville/doc/functions/
melville/doc/help/
melville/inherit/
melville/log/
melville/obj/
melville/system/auto/
melville/system/player/
melville/system/user/
melville/users/
melville/users/mobydick/
melville/world/
/* The copy file command.
   The copy_file auto function is based on previous_object() security so
   it is necessary to check permissions of the caller before allowing the
   call. */

int do_command(string file) {

    int i ;
    string old, new, filename ;
    string *tmp ;

    if (!file || sscanf(file,"%s %s",old,new)!=2) {
        fail_msg ("Usage: cp <old filename> <new filename>\n") ;
        return 0 ;
    }
    if (!absolute_path(old)) old = previous_object()->query_cwd()+old ;
    old = resolve_path(old) ;
    if (!file_exists(old)) {
        write ("No such file or directory: "+old+".\n") ;
	return 1 ;
    }
/* Break out the actual file name from the whole path. We may need it below. */
    tmp = explode(old,"/") ;
    filename = tmp[sizeof(tmp)-1] ;
    if (!absolute_path(new)) new = previous_object()->query_cwd()+new ;
    new = resolve_path(new) ;
/* If new is a directory, add the filename to the end. Thus "mv foo.c /cmds"
   will move foo.c to /cmds/foo.c. */
    if (file_exists(new)==-1) new = new + "/" + filename ;
    if (file_exists(new)) {
        write ("Cannot overwrite existing file: "+new+"\n") ;
        return 1 ;
    }
    i = previous_object()->valid_read(old) ;
    if (!i) {
        write ("Permission denied to read "+old+"\n") ;
        return 1 ;
    }
    i = previous_object()->valid_write(new) ;
    if (!i) {
        write ("Permission denied to create "+new+"\n") ;
        return 1 ;
    }
    if (!copy_file(old,new)) {
        write ("Failed to copy "+old+" to "+new+"\n") ;
    } else {
        write (old+" copied to "+new+"\n") ;
    }
    return 1 ;
}