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; }
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; }
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); }
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); }
/* 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; } }