Exemplo n.º 1
0
int unix_loop(Stream_t *Stream, MainParam_t *mp, char *arg, int follow_dir_link)
{
	int ret;
	int isdir;

	mp->File = NULL;
	mp->direntry = NULL;
	mp->unixSourceName = arg;
	/*	mp->dir.attr = ATTR_ARCHIVE;*/
	mp->loop = _unix_loop;
	if((mp->lookupflags & DO_OPEN)){
		mp->File = SimpleFileOpen(0, 0, arg, O_RDONLY, 0, 0, 0, 0);
		if(!mp->File){
			perror(arg);
#if 0
			tmp = _basename(arg);
			strncpy(mp->filename, tmp, VBUFSIZE);
			mp->filename[VBUFSIZE-1] = '\0';
#endif
			return ERROR_ONE;
		}
		GET_DATA(mp->File, 0, 0, &isdir, 0);
		if(isdir) {
			struct stat buf;

			FREE(&mp->File);
#ifdef S_ISLNK
			if(!follow_dir_link &&
			   lstat(arg, &buf) == 0 &&
			   S_ISLNK(buf.st_mode)) {
				/* skip links to directories in order to avoid
				 * infinite loops */
				fprintf(stderr, 
					"skipping directory symlink %s\n", 
					arg);
				return 0;				
			}
#endif
			if(! (mp->lookupflags & ACCEPT_DIR))
				return 0;
			mp->File = OpenDir(Stream, arg);
		}
	}

	if(isdir)
		ret = mp->dirCallback(0, mp);
	else
		ret = mp->unixcallback(mp);
	FREE(&mp->File);
	return ret;
}
Exemplo n.º 2
0
static int test_directory(direntry_t *entry, MainParam_t *mp)
{
	Stream_t *File=mp->File;
	Stream_t *Target;
	char errmsg[80];

	if ((Target = SimpleFileOpen(0, 0, "-",
				     O_WRONLY,
				     errmsg, 0, 0, 0))) {
		copyfile(File, Target);
		FREE(&Target);
	}
	return GOT_ONE;
}
Exemplo n.º 3
0
void mcat(int argc, char **argv, int type)
{
    struct device *dev;
    struct device out_dev;
    char *drive, name[EXPAND_BUF];
    char errmsg[200];
    Stream_t *Stream;
    char buf[BUF_SIZE];

    mt_off_t address = 0;

    char mode = O_RDONLY;
    int optindex = 1;
    size_t len;

    noPrivileges = 1;

    if (argc < 2) {
        usage();
    }

    if (argv[1][0] == '-') {
        if (argv[1][1] != 'w') {
            usage();
        }
        mode = O_WRONLY;
        optindex++;
    }

    if (argc - optindex < 1)
        usage();


    if (skip_drive(argv[optindex]) == argv[optindex])
        usage();

    drive = get_drive(argv[optindex], NULL);

    /* check out a drive whose letter and parameters match */
    sprintf(errmsg, "Drive '%s:' not supported", drive);
    Stream = NULL;
    for (dev=devices; dev->name; dev++) {
        FREE(&Stream);
        if (strcmp(dev->drive, drive) != 0)
            continue;
        out_dev = *dev;
        expand(dev->name,name);
#ifdef USING_NEW_VOLD
        strcpy(name, getVoldName(dev, name));
#endif

        Stream = 0;
#ifdef USE_XDF
        Stream = XdfOpen(&out_dev, name, mode, errmsg, 0);
        if(Stream)
            out_dev.use_2m = 0x7f;

#endif

#ifdef USE_FLOPPYD
        if(!Stream)
            Stream = FloppydOpen(&out_dev, dev, name,
                                 mode, errmsg, 0, 1);
#endif


        if (!Stream)
            Stream = SimpleFileOpen(&out_dev, dev, name, mode,
                                    errmsg, 0, 1, 0);

        if( !Stream)
            continue;
        break;
    }

    /* print error msg if needed */
    if ( dev->drive == 0 ) {
        FREE(&Stream);
        fprintf(stderr,"%s\n",errmsg);
        exit(1);
    }

    if (mode == O_WRONLY) {
        while ((len = fread(buf, 1, BUF_SIZE, stdin))
                == BUF_SIZE) {
            WRITES(Stream, buf, address, BUF_SIZE);
            address += BUF_SIZE;
        }
        if (len)
            WRITES(Stream, buf, address, len);
    } else {
        while ((len = READS(Stream, buf, address, BUF_SIZE))
                == BUF_SIZE) {
            fwrite(buf, 1, BUF_SIZE, stdout);
            address += BUF_SIZE;
        }
        if (len)
            fwrite(buf, 1, len, stdout);
    }

    FREE(&Stream);
    exit(0);
}
Exemplo n.º 4
0
void mcat(int argc, char **argv, int type)
{
	struct device *dev;
	struct device out_dev;
	char drive, name[EXPAND_BUF];
        char errmsg[200];
        Stream_t *Stream;
	char buf[BUF_SIZE];

	mt_off_t address = 0;

	char mode = O_RDONLY;
	int optindex = 1;
	size_t len;

	noPrivileges = 1;

	if (argc < 2) {
		usage();
	}

	if (argv[1][0] == '-') {
		if (argv[1][1] != 'w') {
			usage();
		}
		mode = O_WRONLY;
		optindex++;
	}

	if (argc - optindex < 1)
		usage();


	if (!argv[optindex][0] || argv[optindex][1] != ':' 
	    || argv[optindex][2]) {
		usage();
	}

        drive = toupper(argv[optindex][0]);

        /* check out a drive whose letter and parameters match */       
        sprintf(errmsg, "Drive '%c:' not supported", drive);    
        Stream = NULL;
        for (dev=devices; dev->name; dev++) {
                FREE(&Stream);
                if (dev->drive != drive)
                        continue;
                out_dev = *dev;
                expand(dev->name,name);
#ifdef USING_NEW_VOLD
                strcpy(name, getVoldName(dev, name));
#endif

                Stream = 0;
#ifdef USE_XDF
                Stream = XdfOpen(&out_dev, name, mode, errmsg, 0);
				if(Stream)
                        out_dev.use_2m = 0x7f;

#endif

#ifdef USE_FLOPPYD
                if(!Stream)
                        Stream = FloppydOpen(&out_dev, dev, name, 
					     mode, errmsg, 0, 1);
#endif


                if (!Stream)
                        Stream = SimpleFileOpen(&out_dev, dev, name, mode,
						errmsg, 0, 1, 0);

                if( !Stream)
                        continue;
                break;
        }

        /* print error msg if needed */ 
        if ( dev->drive == 0 ){
                FREE(&Stream);
                fprintf(stderr,"%s\n",errmsg);
                exit(1);
        }


	if (mode == O_WRONLY) {
		mt_size_t size=0;
		size = out_dev.sectors * out_dev.heads * out_dev.tracks;
		size *= 512;
		while ((len = fread(buf, 1,
				    bufLen(BUF_SIZE, size, address),
				    stdin)) > 0) {			
			int r = WRITES(Stream, buf, address, len);
			fprintf(stderr, "Wrote to %d\n", (int) address);
			if(r < 0)
				break;
			address += len;
		}
	} else {
		while ((len = READS(Stream, buf, address, BUF_SIZE)) > 0) {
			fwrite(buf, 1, len, stdout);
			address += len;
		}
	}

	FREE(&Stream);
	exit(0);
}
Exemplo n.º 5
0
/* Write the Unix file */
static int unix_write(direntry_t *entry, MainParam_t *mp, int needfilter)
{
	Arg_t *arg=(Arg_t *) mp->arg;
	time_t mtime;
	Stream_t *File=mp->File;
	Stream_t *Target, *Source;
	struct stat stbuf;
	int ret;
	char errmsg[80];
	char *unixFile;

	File->Class->get_data(File, &mtime, 0, 0, 0);

	if (!arg->preserveTime)
		mtime = 0L;

	if(arg->type)
		unixFile = "-";
	else
		unixFile = mpBuildUnixFilename(mp);
	if(!unixFile) {
		printOom();
		return ERROR_ONE;
	}

	/* if we are creating a file, check whether it already exists */
	if(!arg->type) {
		if (!arg->nowarn && &arg->type && !access(unixFile, 0)){
			if( ask_confirmation("File \"%s\" exists, overwrite (y/n) ? ",
					     unixFile,0)) {
				free(unixFile);
				return ERROR_ONE;
			}
			
			/* sanity checking */
			if (!stat(unixFile, &stbuf) && !S_ISREG(stbuf.st_mode)) {
				fprintf(stderr,"\"%s\" is not a regular file\n",
					unixFile);
				
				free(unixFile);
				return ERROR_ONE;
			}
		}
	}

	if(!arg->type && arg->verbose) {
		fprintf(stderr,"Copying ");
		mpPrintFilename(stderr,mp);
		fprintf(stderr,"\n");
	}
	
	if(got_signal) {
		free(unixFile);
		return ERROR_ONE;
	}

	if ((Target = SimpleFileOpen(0, 0, unixFile,
				     O_WRONLY | O_CREAT | O_TRUNC,
				     errmsg, 0, 0, 0))) {
		ret = 0;
		if(needfilter && arg->textmode){
			Source = open_filter(COPY(File));
			if (!Source)
				ret = -1;
		} else
			Source = COPY(File);

		if (ret == 0 )
			ret = copyfile(Source, Target);
		FREE(&Source);
		FREE(&Target);
		if(ret <= -1){
			if(!arg->type) {
				unlink(unixFile);
				free(unixFile);
			}
			return ERROR_ONE;
		}
		if(!arg->type) {
			set_mtime(unixFile, mtime);
			free(unixFile);
		}
		return GOT_ONE;
	} else {
		fprintf(stderr,"%s\n", errmsg);
		if(!arg->type)
			free(unixFile);
		return ERROR_ONE;
	}
}