long #else int #endif __write (int fd, const void *buf, size_t size) { unsigned char c, *foo; unsigned flags; long r; struct xattr statbuf; _DOSTIME timebuf; if (__mint == 0 && isatty(fd)) { r = __OPEN_INDEX(fd); if (r < 0 || r >= __NHANDLES) r = __NHANDLES - 1; flags = __open_stat[r].flags; if ((flags & RAW) || _sig_handler[SIGINT] != SIG_DFL) { foo = (unsigned char *) buf; r = size; while (r-- > 0) { c = *foo++; if (c == '\n' && (flags & CRMOD)) _console_write_byte(fd, '\r'); _console_write_byte(fd, c); } return size; } } r = Fwrite(fd, size, buf); if (r < 0) { __set_errno (-r); return -1; } if (size && r == 0) { if (__mint >= 9) { if ((r = Fcntl (fd, &statbuf, FSTAT)) < 0) { __set_errno (-r); return -1; } if (((mode_t) statbuf.st_mode & S_IFMT) == S_IFREG) { __set_errno (ENOSPC); return -1; } } else if (Fdatime (&timebuf, fd, 0) == 0 && Fseek (0L, fd, SEEK_CUR) >= 0) { __set_errno (ENOSPC); return -1; } } return r; }
int x_datime(DOSTIME *time, int handle, int wflag) { #if USE_gemdos return xerror((int) gemdos(87, time, handle, wflag)); #else return xerror(Fdatime(time, handle, wflag)); #endif }
WORD wrfile( char *fstr ) { REG int ret, retmsg; int inhand,outhand; int time[2]; DMABUFFER *mydta, *saved; char *buffer; long copysiz, bufsiz, wrsiz, tmpsiz; int crted,sttime; char buf[2]; crted = 0; sttime = 1; retmsg = TRUE; rename = 0; open: /* open the source file */ if ( ( inhand = (WORD)Fopen(fixsrc, 0) ) < 0 ) { /* seek error or drive not ready */ /* if ( (inhand == E_SEEK) || (inhand == EDRVNR) ) return( FALSE ); */ /* skip */ if ( ( ret = fill_string( fixsrc, CNTOPEN ) ) == 1 ) { updatnum(NUMFILE, --numfiles); return SKIP; } else if (ret == 2) /* retry */ goto open; else /* abort */ goto ww_3; } if ( !ch_undo() || f_cancel ) /* user want to stop */ { Fclose( inhand ); ww_3: f_abort = 1; return( FALSE ); } saved = (DMABUFFER *)Fgetdta(); Fsetdta(mydta=(DMABUFFER *)malloc( (long)sizeof(DMABUFFER))); if ( Fsfirst( fixsrc, 0x37 ) ) { retmsg = SKIP; if ( do1_alert( RDERROR ) == 2 ) /* abort */ { f_abort = 1; retmsg = FALSE; } goto y2; } copysiz = mydta->d_fsize; buffer = (char *)malloc( copysiz ); if ( buffer ) { bufsiz = copysiz; } else { for (bufsiz = 128*1024L; bufsiz >= 1024L; bufsiz /= 2) { if ((buffer = (char *)malloc( bufsiz )) != 0) break; } if (!buffer) goto y2; } Fdatime( &time, inhand, 0 ); /* read the time and date */ rechkd: switch(chkdf(fstr, CPFILE)) { case CHECK: goto rechkd; case SKIP: retmsg = SKIP; goto y1; case QUIT: f_abort = 1; retmsg = FALSE; goto y1; case FALSE: retmsg = FALSE; goto y1; } /* if it is move operation, then try rename first */ if ( opcode == OP_MOVE ) { /* if same name and path, don't do it */ if ( strcmp( fixsrc, fixdst ) ) goto y22; Fclose( inhand ); if ( Frename(0, fixsrc, fixdst) >= 0 ) { inhand = (WORD)Fopen( fixdst, 0 ); if ( !p_timedate ) /* get the new time and date */ { time[0] = Tgettime(); time[1] = Tgetdate(); Fdatime( &time, inhand, 1 ); } y22: rename = 1; goto y1; } else inhand = (WORD)Fopen( fixsrc, 0 ); } while ( copysiz >= 0 ) /* let it passes through for zero file */ { tmpsiz = (copysiz > bufsiz) ? bufsiz : copysiz; if (Fread(inhand, tmpsiz, buffer) < 0) { retmsg = SKIP; if ( crted ) Fdelete( fixdst ); if (do1_alert( RDERROR ) == 2) { /* abort */ f_abort = 1; retmsg = FALSE; } goto y1; /* skip */ } create: if ( sttime ) { sttime = 0; if ((outhand = (WORD)Fcreate(fixdst, mydta->d_fattr&7)) < 0) { if ( ( ret = fill_string( fixdst, CNTCRTFL ) ) == 2 ) goto create; else if (ret == 3) /* abort */ { f_abort = 1; retmsg = FALSE; } else retmsg = SKIP; goto y1; } crted = 1; } if ((wrsiz = Fwrite(outhand, tmpsiz, buffer)) < 0) { retmsg = SKIP; Fclose(outhand); Fdelete(fixdst); if (do1_alert( WRERROR ) == 2) { /* abort */ f_abort = 1; retmsg = FALSE; } goto y1; } /* check if there are sufficent memory */ if (wrsiz != tmpsiz) { /* not sufficent memory ??*/ f_abort = 1; retmsg = FALSE; Fclose(outhand); Fdelete(fixdst); buf[0] = *fixdst; buf[1] = 0; fill_string( buf, STDISKFU ); goto y1; } copysiz -= tmpsiz; if ( !copysiz ) break; } if ( p_timedate ) Fdatime( &time, outhand, 1 ); y0: Fclose(outhand); y1: free(buffer); y2: updatnum(NUMFILE, --numfiles); Fsetdta(saved); y3: Fclose(inhand); free(mydta); if ( ( opcode == OP_MOVE ) && ( retmsg == TRUE ) ) upfdesk( fixsrc, fixdst ); return(retmsg); }
copy_dir () /* source und dest sind global; bei Fehler: return (1) */ { int source_len, dest_len, fd_source, fd_dest, error; char dta[44]; long old_dta, fail, size, count; error=0; source_len=strlen(source); dest_len=strlen(dest); old_dta=Fgetdta(); Fsetdta(dta); strcat(source,"\\*.*"); fail=Fsfirst(source,16); source[source_len]=0; while (!fail) { strcat(source,"\\"); strcat(source,dta+30); strcat(dest,"\\"); strcat(dest,dta+30); if (dta[21]==16) /* Directory */ { if (strcmp(dta+30,".")&&strcmp(dta+30,"..")) if (Dcreate(dest)) { printf("Ordner %s l„žt sich nicht anlegen.\n",dest); error=1; } else error|=copy_dir(source,dest); } else /* File */ { printf("%s nach %s\n",source,dest); if ((fd_source=Fopen(source,0))<0) { printf("Datei %s l„žt sich nicht ”ffnen.\n",source); error=1; } else if ((fd_dest=Fcreate(dest,dta[21]&~1))<0) { printf("Datei %s l„žt sich nicht einrichten.\n",dest); error=1; } else { size=*(long*)(dta+26); while (size) { count=(size<buf_size)?size:buf_size; size-=count; if (Fread(fd_source,count,buffer)!=count) { printf("Fehler beim Lesen von %s .\n",source); error=1; break; } if (Fwrite(fd_dest,count,buffer)!=count) { printf("Fehler beim Schreiben von %s .\n",dest); error=1; break; } } Fclose(fd_source); Fclose(fd_dest); fd_dest=Fopen(dest,1); Fdatime(fd_dest,dta+22,1); Fclose(fd_dest); } } source[source_len]=0; dest[dest_len]=0; fail=Fsnext(); } if (fail!=-49l) { printf("Ordner %s nicht gefunden.\n",source); error=1; } Fsetdta(old_dta); return (error); }