/* AM 980919 updated */ int osd_fchecksum (const char *game, const char *filename, unsigned int *length, unsigned int *sum) { char name[256]; int indx; struct stat stat_buffer; int found = 0; const char *gamename = game; /* Support "-romdir" yuck. */ if (alternate_name) gamename = alternate_name; for (indx=0;indx<rompathc && !found; ++indx) { const char* dir_name = rompathv[indx]; if (!found) { sprintf(name,"%s/%s",dir_name,gamename); if (cache_stat(name,&stat_buffer)==0 && (stat_buffer.st_mode & S_IFDIR)) { sprintf(name,"%s/%s/%s",dir_name,gamename,filename); if (checksum_file(name,0,length,sum)==0) { found = 1; } } } if (!found) { /* try with a .zip extension */ sprintf(name,"%s/%s.zip", dir_name, gamename); if (cache_stat(name,&stat_buffer)==0) { if (checksum_zipped_file (name, filename, length, sum)==0) { if (errorlog) fprintf(errorlog,"Using (osd_fchecksum) zip file for %s\n", filename); found = 1; } } } if (!found) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf(name,"%s/%s.zif",dir_name,gamename); if (cache_stat(name,&stat_buffer)==0) { sprintf(name,"%s/%s.zif/%s",dir_name,gamename,filename); if (checksum_file(name,0,length,sum)==0) { found = 1; } } } } if (!found) return -1; return 0; }
/* AM 980919 updated */ int osd_fchecksum (const char *game, const char *filename, unsigned int *length, unsigned int *sum) { char name[256]; int found = 0; const char *gamename = game; if (!found) { /* try with a .zip extension */ sprintf(name,"%s.zip\0", gamename); /*if (cache_stat(name)==0)*/ { sprintf(name,"%sroms/%s.zip\0", gp2x_path_mame, gamename); if (checksum_zipped_file (name, filename, length, sum)==0) { found = 1; } } } if (!found) { if (cache_stat((char *)gamename)==0) { sprintf(name,"%sroms/%s/%s\0",gp2x_path_mame, gamename, filename); if (checksum_file(name,0,length,sum)==0) { found = 1; } } } if (!found) return -1; return 0; }
//=========================================================================== void SMBSlave::mkdir( const QUrl &kurl, int permissions ) { qCDebug(KIO_SMB) << kurl; int errNum = 0; int retVal = 0; m_current_url = kurl; retVal = smbc_mkdir(m_current_url.toSmbcUrl(), 0777); if( retVal < 0 ){ errNum = errno; } else { errNum = 0; } if( retVal < 0 ) { if (errNum == EEXIST) { errNum = cache_stat(m_current_url, &st ); if (errNum == 0 && S_ISDIR(st.st_mode)) { error( KIO::ERR_DIR_ALREADY_EXIST, m_current_url.toDisplayString()); } else { error( KIO::ERR_FILE_ALREADY_EXIST, m_current_url.toDisplayString()); } } else { reportError(kurl, errNum); } qCDebug(KIO_SMB) << "exit with error " << kurl; } else // success { if(permissions != -1) { // TODO enable the following when complete //smbc_chmod( url.toSmbcUrl(), permissions ); } finished(); } }
/* AM 980919 update */ void *osd_fopen (const char *game, const char *filename, int filetype, int _write) { char name[256]; char *gamename; int found = 0; int indx; struct stat stat_buffer; FakeFileHandle *f; int pathc; char **pathv; f = (FakeFileHandle *) malloc(sizeof (FakeFileHandle)); if( !f ) { logerror("osd_fopen: failed to mallocFakeFileHandle!\n"); return 0; } memset (f, 0, sizeof (FakeFileHandle)); gamename = (char *) game; /* Support "-romdir" yuck. */ if( alternate_name ) { LOG(("osd_fopen: -romdir overrides '%s' by '%s'\n", gamename, alternate_name)); gamename = alternate_name; } switch( filetype ) { case OSD_FILETYPE_ROM: case OSD_FILETYPE_SAMPLE: /* only for reading */ if( _write ) { logerror("osd_fopen: type %02x write not supported\n",filetype); break; } if( filetype == OSD_FILETYPE_SAMPLE ) { LOG(("osd_fopen: using samplepath\n")); pathc = samplepathc; pathv = samplepathv; } else { LOG(("osd_fopen: using rompath\n")); pathc = rompathc; pathv = rompathv; } for( indx = 0; indx < pathc && !found; ++indx ) { const char *dir_name = pathv[indx]; if( !found ) { sprintf (name, "%s/%s", dir_name, gamename); LOG(("Trying %s\n", name)); if( cache_stat (name, &stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf (name, "%s/%s/%s", dir_name, gamename, filename); if( filetype == OSD_FILETYPE_ROM ) { if( checksum_file (name, &f->data, &f->length, &f->crc) == 0 ) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen (name, "rb"); found = f->file != 0; } } } if( !found ) { /* try with a .zip extension */ sprintf (name, "%s/%s.zip", dir_name, gamename); LOG(("Trying %s file\n", name)); if( cache_stat (name, &stat_buffer) == 0 ) { if( load_zipped_file (name, filename, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file for %s\n", filename)); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s/%s.zip", dir_name, gamename); LOG(("Trying %s directory\n", name)); if( cache_stat (name, &stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf (name, "%s/%s.zip/%s", dir_name, gamename, filename); if( filetype == OSD_FILETYPE_ROM ) { if( checksum_file (name, &f->data, &f->length, &f->crc) == 0 ) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen (name, "rb"); found = f->file != 0; } } } } break; #ifdef MESS case OSD_FILETYPE_IMAGE_R: /* only for reading */ if( _write ) { logerror("osd_fopen: type %02x write not supported\n",filetype); break; } else { LOG(("osd_fopen: using rompath\n")); pathc = rompathc; pathv = rompathv; } LOG(("Open IMAGE_R '%s' for %s\n", filename, game)); for( indx = 0; indx < pathc && !found; ++indx ) { const char *dir_name = pathv[indx]; /* this section allows exact path from .cfg */ if( !found ) { sprintf(name,"%s",dir_name); if( cache_stat(name,&stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf(name,"%s/%s",dir_name,filename); if( filetype == OSD_FILETYPE_ROM ) { if( checksum_file (name, &f->data, &f->length, &f->crc) == 0 ) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen(name,"rb"); found = f->file!=0; } } } if( !found ) { sprintf (name, "%s/%s", dir_name, gamename); LOG(("Trying %s directory\n", name)); if( cache_stat (name, &stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf (name, "%s/%s/%s", dir_name, gamename, filename); LOG(("Trying %s file\n", name)); if( filetype == OSD_FILETYPE_ROM ) { if( checksum_file(name, &f->data, &f->length, &f->crc) == 0 ) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen (name, "rb"); found = f->file != 0; } } } /* Zip cart support for MESS */ if( !found && filetype == OSD_FILETYPE_IMAGE_R ) { char *extension = strrchr (name, '.'); /* find extension */ if( extension ) strcpy (extension, ".zip"); else strcat (name, ".zip"); LOG(("Trying %s file\n", name)); if( cache_stat(name, &stat_buffer) == 0 ) { if( load_zipped_file(name, filename, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file for %s\n", filename)); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } if( !found ) { /* try with a .zip extension */ sprintf (name, "%s/%s.zip", dir_name, gamename); LOG(("Trying %s file\n", name)); if( cache_stat(name, &stat_buffer) == 0 ) { if( load_zipped_file(name, filename, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file for %s\n", filename)); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } } break; /* end of IMAGE_R */ case OSD_FILETYPE_IMAGE_RW: { static char *write_modes[] = {"rb","wb","r+b","r+b","w+b"}; char file[256]; char *extension; LOG(("Open IMAGE_RW '%s' for %s mode '%s'\n", filename, game, write_modes[_write])); strcpy (file, filename); do { /* 29-05-00 Lee Ward: Reversed the search order. */ for (indx=rompathc-1; indx>=0; --indx) { const char *dir_name = rompathv[indx]; /* Exact path support */ /* 29-05-00 Lee Ward: Changed the search order to prevent new files being created in the application root as default */ if( !found ) { sprintf (name, "%s/%s", dir_name, gamename); LOG(("Trying %s directory\n", name)); if( cache_stat(name, &stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf (name, "%s/%s/%s", dir_name, gamename, file); LOG(("Trying %s file\n", name)); f->file = fopen (name, write_modes[_write]); found = f->file != 0; if( !found && _write == 3 ) { f->file = fopen(name, write_modes[4]); found = f->file != 0; } } } /* Steph - Zip disk images support for MESS */ if( !found && !_write ) { extension = strrchr (name, '.'); /* find extension */ /* add .zip for zipfile */ if( extension ) strcpy(extension, ".zip"); else strcat(extension, ".zip"); LOG(("Trying %s file\n", name)); if( cache_stat(name, &stat_buffer) == 0 ) { if( load_zipped_file(name, filename, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file for %s\n", filename)); f->type = kZippedFile; f->offset = 0; f->crc = crc32(0L, f->data, f->length); found = 1; } } } if (!found) { sprintf(name, "%s", dir_name); LOG(("Trying %s directory\n", name)); if( cache_stat(name,&stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf(name,"%s/%s", dir_name, file); LOG(("Trying %s file\n", name)); f->file = fopen(name, write_modes[_write]); found = f->file != 0; if( !found && _write == 3 ) { f->file = fopen(name, write_modes[4]); found = f->file != 0; } } } if( !found && !_write ) { extension = strrchr (name, '.'); /* find extension */ /* add .zip for zipfile */ if( extension ) strcpy(extension, ".zip"); else strcat(extension, ".zip"); LOG(("Trying %s file\n", name)); if( cache_stat(name, &stat_buffer) == 0 ) { if( load_zipped_file(name, filename, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file for %s\n", filename)); f->type = kZippedFile; f->offset = 0; f->crc = crc32(0L, f->data, f->length); found = 1; } } } if( !found && !_write ) { /* try with a .zip extension */ sprintf (name, "%s/%s.zip", dir_name, gamename); LOG(("Trying %s file\n", name)); if( cache_stat (name, &stat_buffer) == 0 ) { if( load_zipped_file (name, file, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file for %s\n", filename)); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s/%s.zip", dir_name, gamename); LOG(("Trying %s ZipMagic directory\n", name)); if( cache_stat (name, &stat_buffer) == 0 && (stat_buffer.st_mode & S_IFDIR) ) { sprintf (name, "%s/%s.zip/%s", dir_name, gamename, file); LOG(("Trying %s\n", name)); f->file = fopen (name, write_modes[_write]); found = f->file != 0; if( !found && _write == 3 ) { f->file = fopen(name, write_modes[4]); found = f->file != 0; } } } if( found ) LOG(("IMAGE_RW %s FOUND in %s!\n", file, name)); } extension = strrchr (file, '.'); if( extension ) *extension = '\0'; } while( !found && extension ); } break; #endif /* MESS */ case OSD_FILETYPE_NVRAM: if( !found ) { sprintf (name, "%s/%s.nv", nvdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s.zip/%s.nv", nvdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf (name, "%s.zif/%s.nv", nvdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } break; case OSD_FILETYPE_HIGHSCORE: if( mame_highscore_enabled () ) { if( !found ) { sprintf (name, "%s/%s.hi", hidir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s.zip/%s.hi", hidir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf (name, "%s.zif/%s.hi", hidir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } } break; case OSD_FILETYPE_CONFIG: sprintf (name, "%s/%s.cfg", cfgdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s.zip/%s.cfg", cfgdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf (name, "%s.zif/%s.cfg", cfgdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } break; case OSD_FILETYPE_INPUTLOG: sprintf (name, "%s/%s.inp", inpdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s.zip/%s.cfg", inpdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf (name, "%s.zif/%s.cfg", inpdir, gamename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !_write ) { char file[256]; sprintf (file, "%s.inp", gamename); sprintf (name, "%s/%s.zip", inpdir, gamename); LOG(("Trying %s in %s\n", file, name)); if( cache_stat (name, &stat_buffer) == 0 ) { if( load_zipped_file (name, file, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file %s for %s\n", name, file)); f->type = kZippedFile; f->offset = 0; found = 1; } } } break; case OSD_FILETYPE_STATE: sprintf (name, "%s/%s.sta", stadir, gamename); f->file = fopen (name, _write ? "wb" : "rb"); found = !(f->file == 0); if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s.zip/%s.sta", stadir, gamename); f->file = fopen (name, _write ? "wb" : "rb"); found = !(f->file == 0); } if( !found ) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf (name, "%s.zif/%s.sta", stadir, gamename); f->file = fopen (name, _write ? "wb" : "rb"); found = !(f->file == 0); } break; case OSD_FILETYPE_ARTWORK: /* only for reading */ if( _write ) { logerror("osd_fopen: type %02x write not supported\n",filetype); break; } sprintf (name, "%s/%s", artworkdir, filename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; if( !found ) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf (name, "%s.zip/%s.png", artworkdir, filename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf (name, "%s.zif/%s.png", artworkdir, filename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; } if( !found ) { char file[256], *extension; sprintf(file, "%s", filename); sprintf(name, "%s/%s", artworkdir, filename); extension = strrchr(name, '.'); if( extension ) strcpy (extension, ".zip"); else strcat (name, ".zip"); LOG(("Trying %s in %s\n", file, name)); if( cache_stat (name, &stat_buffer) == 0 ) { if( load_zipped_file (name, file, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file %s\n", name)); f->type = kZippedFile; f->offset = 0; found = 1; } } if( !found ) { sprintf(name, "%s/%s.zip", artworkdir, game); LOG(("Trying %s in %s\n", file, name)); if( cache_stat (name, &stat_buffer) == 0 ) { if( load_zipped_file (name, file, &f->data, &f->length) == 0 ) { LOG(("Using (osd_fopen) zip file %s\n", name)); f->type = kZippedFile; f->offset = 0; found = 1; } } } } break; case OSD_FILETYPE_MEMCARD: sprintf (name, "%s/%s", memcarddir, filename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; break; case OSD_FILETYPE_SCREENSHOT: /* only for writing */ if( !_write ) { logerror("osd_fopen: type %02x read not supported\n",filetype); break; } sprintf (name, "%s/%s.png", screenshotdir, filename); f->type = kPlainFile; f->file = fopen (name, _write ? "wb" : "rb"); found = f->file != 0; break; case OSD_FILETYPE_HIGHSCORE_DB: case OSD_FILETYPE_HISTORY: /* only for reading */ if( _write ) { logerror("osd_fopen: type %02x write not supported\n",filetype); break; } f->type = kPlainFile; /* open as ASCII files, not binary like the others */ f->file = fopen (filename, _write ? "w" : "r"); found = f->file != 0; break; /* Steph */ case OSD_FILETYPE_CHEAT: sprintf (name, "%s/%s", cheatdir, filename); f->type = kPlainFile; /* open as ASCII files, not binary like the others */ f->file = fopen (filename, _write ? "a" : "r"); found = f->file != 0; break; case OSD_FILETYPE_LANGUAGE: /* only for reading */ if( _write ) { logerror("osd_fopen: type %02x write not supported\n",filetype); break; } sprintf (name, "%s.lng", filename); f->type = kPlainFile; /* open as ASCII files, not binary like the others */ f->file = fopen (name, _write ? "w" : "r"); found = f->file != 0; logerror("fopen %s = %08x\n",name,(int)f->file); break; default: logerror("osd_fopen(): unknown filetype %02x\n",filetype); } if( !found ) { free(f); return 0; } return f; }
/* * check if roms/samples for a game exist at all * return index+1 of the path vector component on success, otherwise 0 */ int osd_faccess (const char *newfilename, int filetype) { static int indx; static const char *filename; char name[256]; char **pathv; int pathc; char *dir_name; /* if filename == NULL, continue the search */ if( newfilename != NULL ) { indx = 0; filename = newfilename; } else indx++; #ifdef MESS if( filetype == OSD_FILETYPE_ROM || filetype == OSD_FILETYPE_IMAGE_R || filetype == OSD_FILETYPE_IMAGE_RW ) #else if( filetype == OSD_FILETYPE_ROM ) #endif { pathv = rompathv; pathc = rompathc; } else if( filetype == OSD_FILETYPE_SAMPLE ) { pathv = samplepathv; pathc = samplepathc; } else if( filetype == OSD_FILETYPE_SCREENSHOT ) { void *f; sprintf (name, "%s/%s.png", screenshotdir, newfilename); f = fopen (name, "rb"); if( f ) { fclose ((FILE*)f); return 1; } else return 0; } else return 0; for( ; indx < pathc; indx++ ) { struct stat stat_buffer; dir_name = pathv[indx]; /* does such a directory (or file) exist? */ sprintf (name, "%s/%s", dir_name, filename); if( cache_stat (name, &stat_buffer) == 0 ) return indx + 1; /* try again with a .zip extension */ sprintf (name, "%s/%s.zip", dir_name, filename); if( cache_stat (name, &stat_buffer) == 0 ) return indx + 1; /* try again with a .zif extension */ sprintf (name, "%s/%s.zif", dir_name, filename); if( cache_stat (name, &stat_buffer) == 0 ) return indx + 1; } /* no match */ return 0; }
void *osd_fopen(const char *game,const char *filename,int filetype,int _write) { char name[256]; char *gamename; int found = 0; FakeFileHandle *f; f = (FakeFileHandle *)gp2x_malloc(sizeof(FakeFileHandle)); if (!f) return 0; fast_memset(f,0,sizeof(FakeFileHandle)); gamename = (char *)game; switch (filetype) { case OSD_FILETYPE_ROM: /* only for reading */ if (_write) break; if (!found) { /* try with a .zip extension */ sprintf(name,"%s.zip\0", gamename); /*if (cache_stat(name)==0)*/ { sprintf(name,"%sroms/%s.zip\0", gp2x_path_mame, gamename); if (load_zipped_file(name, filename, &f->data, &f->length)==0) { f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } if (!found) { if (cache_stat(gamename)==0) { sprintf(name,"%sroms/%s/%s\0",gp2x_path_mame, gamename, filename); if (checksum_file (name, &f->data, &f->length, &f->crc)==0) { f->type = kRAMFile; f->offset = 0; found = 1; } } } break; case OSD_FILETYPE_SAMPLE: if (!found) { /* try with a .zip extension */ sprintf(name,"%s.zip\0", gamename); /*if (cache_stat_sample(name)==0)*/ { sprintf(name,"%ssamples/%s.zip\0", gp2x_path_mame, gamename); if (load_zipped_file(name, filename, &f->data, &f->length)==0) { f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } if (!found) { sprintf(name,"%ssamples/%s/%s\0",gp2x_path_mame, gamename, filename); if (checksum_file (name, &f->data, &f->length, &f->crc)==0) { f->type = kRAMFile; f->offset = 0; found = 1; } } break; case OSD_FILETYPE_HIGHSCORE: if (!found) { sprintf(name,"%shi/%s.hi", gp2x_path_mame, gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; } break; case OSD_FILETYPE_CONFIG: break; case OSD_FILETYPE_INPUTLOG: break; case OSD_FILETYPE_STATE: break; case OSD_FILETYPE_ARTWORK: break; } if (!found) { gp2x_free(f); return 0; } return f; }
//=========================================================================== void SMBSlave::get( const KURL& kurl ) { char buf[MAX_XFER_BUF_SIZE]; int filefd = 0; ssize_t bytesread = 0; // time_t curtime = 0; time_t lasttime = 0; time_t starttime = 0; KIO::filesize_t totalbytesread = 0; QByteArray filedata; SMBUrl url; kdDebug(KIO_SMB) << "SMBSlave::get on " << kurl << endl; // check (correct) URL KURL kvurl = checkURL(kurl); // if URL is not valid we have to redirect to correct URL if (kvurl != kurl) { redirection(kvurl); finished(); return; } if(!auth_initialize_smbc()) return; // Stat url = kurl; if(cache_stat(url,&st) == -1 ) { if ( errno == EACCES ) error( KIO::ERR_ACCESS_DENIED, url.prettyURL()); else error( KIO::ERR_DOES_NOT_EXIST, url.prettyURL()); return; } if ( S_ISDIR( st.st_mode ) ) { error( KIO::ERR_IS_DIRECTORY, url.prettyURL()); return; } // Set the total size totalSize( st.st_size ); // Open and read the file filefd = smbc_open(url.toSmbcUrl(),O_RDONLY,0); if(filefd >= 0) { if(buf) { bool isFirstPacket = true; lasttime = starttime = time(NULL); while(1) { bytesread = smbc_read(filefd, buf, MAX_XFER_BUF_SIZE); if(bytesread == 0) { // All done reading break; } else if(bytesread < 0) { error( KIO::ERR_COULD_NOT_READ, url.prettyURL()); return; } filedata.setRawData(buf,bytesread); if (isFirstPacket) { // We need a KMimeType::findByNameAndContent(filename,data) // For now we do: find by extension, and if not found (or extension not reliable) // then find by content. bool accurate = false; KMimeType::Ptr mime = KMimeType::findByURL( kurl, st.st_mode, false, true, &accurate ); if ( !mime || mime->name() == KMimeType::defaultMimeType() || !accurate ) { KMimeType::Ptr p_mimeType = KMimeType::findByContent(filedata); if ( p_mimeType && p_mimeType->name() != KMimeType::defaultMimeType() ) mime = p_mimeType; } mimeType(mime->name()); isFirstPacket = false; } data( filedata ); filedata.resetRawData(buf,bytesread); // increment total bytes read totalbytesread += bytesread; processedSize(totalbytesread); } } smbc_close(filefd); data( QByteArray() ); processedSize(static_cast<KIO::filesize_t>(st.st_size)); } else { error( KIO::ERR_CANNOT_OPEN_FOR_READING, url.prettyURL()); return; } finished(); }
//=========================================================================== void SMBSlave::put( const KURL& kurl, int permissions, bool overwrite, bool resume ) { void *buf; size_t bufsize; m_current_url = kurl; int filefd; bool exists; mode_t mode; QByteArray filedata; kdDebug(KIO_SMB) << "SMBSlave::put on " << kurl << endl; exists = (cache_stat(m_current_url, &st) != -1 ); if ( exists && !overwrite && !resume) { if (S_ISDIR(st.st_mode)) { kdDebug(KIO_SMB) << "SMBSlave::put on " << kurl <<" already isdir !!"<< endl; error( KIO::ERR_DIR_ALREADY_EXIST, m_current_url.prettyURL()); } else { kdDebug(KIO_SMB) << "SMBSlave::put on " << kurl <<" already exist !!"<< endl; error( KIO::ERR_FILE_ALREADY_EXIST, m_current_url.prettyURL()); } return; } if (exists && !resume && overwrite) { kdDebug(KIO_SMB) << "SMBSlave::put exists try to remove " << m_current_url.toSmbcUrl()<< endl; // remove(m_current_url.url().local8Bit()); } if (resume) { // append if resuming kdDebug(KIO_SMB) << "SMBSlave::put resume " << m_current_url.toSmbcUrl()<< endl; filefd = smbc_open(m_current_url.toSmbcUrl(), O_RDWR, 0 ); smbc_lseek(filefd, 0, SEEK_END); } else { if (permissions != -1) { mode = permissions | S_IWUSR | S_IRUSR; } else { mode = 600;//0666; } kdDebug(KIO_SMB) << "SMBSlave::put NO resume " << m_current_url.toSmbcUrl()<< endl; filefd = smbc_open(m_current_url.toSmbcUrl(), O_CREAT | O_TRUNC | O_WRONLY, mode); } if ( filefd < 0 ) { if ( errno == EACCES ) { kdDebug(KIO_SMB) << "SMBSlave::put error " << kurl <<" access denied !!"<< endl; error( KIO::ERR_WRITE_ACCESS_DENIED, m_current_url.prettyURL()); } else { kdDebug(KIO_SMB) << "SMBSlave::put error " << kurl <<" can not open for writing !!"<< endl; error( KIO::ERR_CANNOT_OPEN_FOR_WRITING, m_current_url.prettyURL()); } finished(); return; } // Loop until we got 0 (end of data) while(1) { kdDebug(KIO_SMB) << "SMBSlave::put request data "<< endl; dataReq(); // Request for data kdDebug(KIO_SMB) << "SMBSlave::put write " << m_current_url.toSmbcUrl()<< endl; if (readData(filedata) <= 0) { kdDebug(KIO_SMB) << "readData <= 0" << endl; break; } kdDebug(KIO_SMB) << "SMBSlave::put write " << m_current_url.toSmbcUrl()<< endl; buf = filedata.data(); bufsize = filedata.size(); int size = smbc_write(filefd, buf, bufsize); if ( size < 0) { kdDebug(KIO_SMB) << "SMBSlave::put error " << kurl <<" could not write !!"<< endl; error( KIO::ERR_COULD_NOT_WRITE, m_current_url.prettyURL()); finished(); return; } kdDebug(KIO_SMB ) << "wrote " << size << endl; } kdDebug(KIO_SMB) << "SMBSlave::put close " << m_current_url.toSmbcUrl()<< endl; if(smbc_close(filefd)) { kdDebug(KIO_SMB) << "SMBSlave::put on " << kurl <<" could not write !!"<< endl; error( KIO::ERR_COULD_NOT_WRITE, m_current_url.prettyURL()); finished(); return; } // set final permissions, if the file was just created if ( permissions != -1 && !exists ) { // TODO: did the smbc_chmod fail? // TODO: put in call to chmod when it is working! // smbc_chmod(url.toSmbcUrl(),permissions); } // We have done our job => finish finished(); }
/* AM 980919 update */ void *osd_fopen(const char *game,const char *filename,int filetype,int _write) { char name[256]; char *gamename; int found = 0; int indx; struct stat stat_buffer; FakeFileHandle *f; int pathc; char** pathv; #ifdef MESS char file[MAXPATHL]; char *extension; #endif f = (FakeFileHandle *)malloc(sizeof(FakeFileHandle)); if (!f) return 0; memset(f,0,sizeof(FakeFileHandle)); gamename = (char *)game; /* Support "-romdir" yuck. */ if (alternate_name) gamename = alternate_name; switch (filetype) { case OSD_FILETYPE_ROM: case OSD_FILETYPE_SAMPLE: #ifdef MESS case OSD_FILETYPE_ROM_CART: #endif /* only for reading */ if (_write) break; if (filetype==OSD_FILETYPE_ROM #ifdef MESS || OSD_FILETYPE_ROM_CART #endif ) { pathc = rompathc; pathv = rompathv; } else { pathc = samplepathc; pathv = samplepathv; } for (indx=0;indx<pathc && !found; ++indx) { const char* dir_name = pathv[indx]; if (!found) { sprintf(name,"%s/%s",dir_name,gamename); if (cache_stat(name,&stat_buffer)==0 && (stat_buffer.st_mode & S_IFDIR)) { sprintf(name,"%s/%s/%s",dir_name,gamename,filename); if (filetype==OSD_FILETYPE_ROM) { if (checksum_file (name, &f->data, &f->length, &f->crc)==0) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen(name,"rb"); found = f->file!=0; } } } #ifdef MESS /* Zip cart support for MESS */ if (!found && filetype == OSD_FILETYPE_ROM_CART) { extension = strrchr(name, '.'); /* find extension */ if (extension) *extension = '\0'; /* drop extension */ sprintf(name,"%s.zip", name); /* add .zip for zipfile */ if (cache_stat(name,&stat_buffer)==0) { if (load_zipped_file(name, filename, &f->data, &f->length)==0) { if (errorlog) fprintf(errorlog,"Using (osd_fopen) zip file for %s\n", filename); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } #endif if (!found) { /* try with a .zip extension */ sprintf(name,"%s/%s.zip", dir_name, gamename); if (cache_stat(name,&stat_buffer)==0) { if (load_zipped_file(name, filename, &f->data, &f->length)==0) { if (errorlog) fprintf(errorlog,"Using (osd_fopen) zip file for %s\n", filename); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } if (!found) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf(name,"%s/%s.zip",dir_name,gamename); if (cache_stat(name,&stat_buffer)==0 && (stat_buffer.st_mode & S_IFDIR)) { sprintf(name,"%s/%s.zip/%s",dir_name,gamename,filename); if (filetype==OSD_FILETYPE_ROM) { if (checksum_file (name, &f->data, &f->length, &f->crc)==0) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen(name,"rb"); found = f->file!=0; } } } /* ZipFolders support disabled for rom and sample load. There is no reason to keep it because now zip files are fully supported. */ #if 0 if (!found) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf(name,"%s/%s.zif",dir_name,gamename); if (cache_stat(name,&stat_buffer)==0) { sprintf(name,"%s/%s.zif/%s",dir_name,gamename,filename); if (filetype==OSD_FILETYPE_ROM) { if (checksum_file (name, &f->data, &f->length, &f->crc)==0) { f->type = kRAMFile; f->offset = 0; found = 1; } } else { f->type = kPlainFile; f->file = fopen(name,"rb"); found = f->file!=0; } } } #endif } break; #ifdef MESS case OSD_FILETYPE_IMAGE: if(errorlog) fprintf(errorlog,"Open IMAGE '%s' for %s\n", filename, game); strcpy(file, filename); do { for (indx=0; indx < rompathc && !found; ++indx) { const char* dir_name = rompathv[indx]; if (!found) { sprintf(name, "%s/%s", dir_name, gamename); if(errorlog) fprintf(errorlog,"Trying %s\n", name); if (cache_stat(name,&stat_buffer)==0 && (stat_buffer.st_mode & S_IFDIR)) { sprintf(name,"%s/%s/%s", dir_name, gamename, file); f->file = fopen(name,_write ? "r+b" : "rb"); found = f->file!=0; } } /******************************************************/ /* Zip IMAGE support for MESS */ if (filetype == OSD_FILETYPE_IMAGE && !_write) { extension = strrchr(name, '.'); /* find extension */ if (extension) *extension = '\0'; /* drop extension */ sprintf(name,"%s.zip", name); /* add .zip for zipfile */ if (cache_stat(name,&stat_buffer)==0) { if (load_zipped_file(name, filename, &f->data, &f->length)==0) { if (errorlog) fprintf(errorlog,"Using (osd_fopen) zip file for %s\n", filename); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } /******************************************************/ if (!found && !_write) { /* try with a .zip extension */ sprintf(name, "%s/%s.zip", dir_name, gamename); if (errorlog) fprintf(errorlog,"Trying %s\n", name); if (cache_stat(name,&stat_buffer)==0) { if (load_zipped_file(name, file, &f->data, &f->length)==0) { if (errorlog) fprintf(errorlog,"Using (osd_fopen) zip file for %s\n", filename); f->type = kZippedFile; f->offset = 0; f->crc = crc32 (0L, f->data, f->length); found = 1; } } } if (!found) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf(name, "%s/%s.zip", dir_name, gamename); if (errorlog) fprintf(errorlog,"Trying %s\n", name); if (cache_stat(name,&stat_buffer)==0 && (stat_buffer.st_mode & S_IFDIR)) { sprintf(name,"%s/%s.zip/%s",dir_name,gamename,file); f->file = fopen(name,_write ? "r+b" : "rb"); found = f->file!=0; } } if (found) { if (errorlog) fprintf(errorlog,"IMAGE %s FOUND in %s!\n",file,name); } } extension = strrchr(file, '.'); if (extension) *extension = '\0'; } while (!found && extension); break; #endif case OSD_FILETYPE_HIGHSCORE: if (mame_highscore_enabled()) { if (!found) { sprintf(name,"%s/%s.hi",hidir,gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; } if (!found) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf(name,"%s.zip/%s.hi",hidir,gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; } if (!found) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf(name,"%s.zif/%s.hi",hidir,gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; } } break; case OSD_FILETYPE_CONFIG: sprintf(name,"%s/%s.cfg",cfgdir,gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; if (!found) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf(name,"%s.zip/%s.cfg",cfgdir,gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; } if (!found) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf(name,"%s.zif/%s.cfg",cfgdir,gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; } break; case OSD_FILETYPE_INPUTLOG: sprintf(name,"%s/%s.inp", inpdir, gamename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; break; case OSD_FILETYPE_STATE: sprintf(name,"%s/%s.sta",stadir,gamename); f->file = fopen(name,_write ? "wb" : "rb"); found = !(f->file == 0); if (!found) { /* try with a .zip directory (if ZipMagic is installed) */ sprintf(name,"%s.zip/%s.sta",stadir,gamename); f->file = fopen(name,_write ? "wb" : "rb"); found = !(f->file == 0); } if (!found) { /* try with a .zif directory (if ZipFolders is installed) */ sprintf(name,"%s.zif/%s.sta",stadir,gamename); f->file = fopen(name,_write ? "wb" : "rb"); found = !(f->file == 0); } break; case OSD_FILETYPE_ARTWORK: /* only for reading */ if (_write) break; sprintf(name,"%s/%s", artworkdir, filename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; break; case OSD_FILETYPE_MEMCARD: sprintf(name, "%s/%s",memcarddir,filename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; break; case OSD_FILETYPE_SCREENSHOT: /* only for writing */ if (!_write) break; sprintf(name,"%s/%s.png", screenshotdir, filename); f->type = kPlainFile; f->file = fopen(name,_write ? "wb" : "rb"); found = f->file!=0; break; } if (!found) { free(f); return 0; } return f; }
//=========================================================================== void SMBSlave::rename( const QUrl& ksrc, const QUrl& kdest, KIO::JobFlags flags ) { SMBUrl src; SMBUrl dst; int errNum = 0; int retVal = 0; qCDebug(KIO_SMB) << "old name = " << ksrc << ", new name = " << kdest; src = ksrc; dst = kdest; // Check to se if the destination exists qCDebug(KIO_SMB) << "stat dst"; errNum = cache_stat(dst, &st); if( errNum == 0 ) { if(S_ISDIR(st.st_mode)) { qCDebug(KIO_SMB) << "KIO::ERR_DIR_ALREADY_EXIST"; error( KIO::ERR_DIR_ALREADY_EXIST, dst.toDisplayString()); return; } if(!(flags & KIO::Overwrite)) { qCDebug(KIO_SMB) << "KIO::ERR_FILE_ALREADY_EXIST"; error( KIO::ERR_FILE_ALREADY_EXIST, dst.toDisplayString()); return; } } qCDebug(KIO_SMB ) << "smbc_rename " << src.toSmbcUrl() << " " << dst.toSmbcUrl(); retVal = smbc_rename(src.toSmbcUrl(), dst.toSmbcUrl()); if( retVal < 0 ){ errNum = errno; } else { errNum = 0; } if( retVal < 0 ) { qCDebug(KIO_SMB ) << "failed "; switch(errNum) { case ENOENT: errNum = cache_stat(src, &st); if( errNum != 0 ) { if(errNum == EACCES) { qCDebug(KIO_SMB) << "KIO::ERR_ACCESS_DENIED"; error(KIO::ERR_ACCESS_DENIED, src.toDisplayString()); } else { qCDebug(KIO_SMB) << "KIO::ERR_DOES_NOT_EXIST"; error(KIO::ERR_DOES_NOT_EXIST, src.toDisplayString()); } } break; case EACCES: case EPERM: qCDebug(KIO_SMB) << "KIO::ERR_ACCESS_DENIED"; error( KIO::ERR_ACCESS_DENIED, dst.toDisplayString() ); break; default: qCDebug(KIO_SMB) << "KIO::ERR_CANNOT_RENAME"; error( KIO::ERR_CANNOT_RENAME, src.toDisplayString() ); } qCDebug(KIO_SMB) << "exit with error"; return; } qCDebug(KIO_SMB ) << "everything fine\n"; finished(); }
void SMBSlave::smbCopy(const QUrl& ksrc, const QUrl& kdst, int permissions, KIO::JobFlags flags) { SMBUrl src; SMBUrl dst; mode_t initialmode; ssize_t n; int dstflags; int srcfd = -1; int dstfd = -1; int errNum = 0; KIO::filesize_t processed_size = 0; unsigned char buf[MAX_XFER_BUF_SIZE]; qCDebug(KIO_SMB) << "SMBSlave::copy with src = " << ksrc << "and dest = " << kdst; // setup urls src = ksrc; dst = kdst; // Obtain information about source errNum = cache_stat(src, &st ); if( errNum != 0 ) { if ( errNum == EACCES ) { error( KIO::ERR_ACCESS_DENIED, src.toDisplayString()); } else { error( KIO::ERR_DOES_NOT_EXIST, src.toDisplayString()); } return; } if ( S_ISDIR( st.st_mode ) ) { error( KIO::ERR_IS_DIRECTORY, src.toDisplayString() ); return; } totalSize(st.st_size); // Check to se if the destination exists errNum = cache_stat(dst, &st); if( errNum == 0 ) { if(S_ISDIR(st.st_mode)) { error( KIO::ERR_DIR_ALREADY_EXIST, dst.toDisplayString()); return; } if(!(flags & KIO::Overwrite)) { error( KIO::ERR_FILE_ALREADY_EXIST, dst.toDisplayString()); return; } } // Open the source file srcfd = smbc_open(src.toSmbcUrl(), O_RDONLY, 0); if (srcfd < 0){ errNum = errno; } else { errNum = 0; } if(srcfd < 0) { if(errNum == EACCES) { error( KIO::ERR_ACCESS_DENIED, src.toDisplayString() ); } else { error( KIO::ERR_DOES_NOT_EXIST, src.toDisplayString() ); } return; } // Determine initial creation mode if(permissions != -1) { initialmode = permissions | S_IWUSR; } else { initialmode = 0 | S_IWUSR;//0666; } // Open the destination file dstflags = O_CREAT | O_TRUNC | O_WRONLY; if(!(flags & KIO::Overwrite)) { dstflags |= O_EXCL; } dstfd = smbc_open(dst.toSmbcUrl(), dstflags, initialmode); if (dstfd < 0){ errNum = errno; } else { errNum = 0; } if(dstfd < 0) { if(errNum == EACCES) { error(KIO::ERR_WRITE_ACCESS_DENIED, dst.toDisplayString()); } else { error(KIO::ERR_CANNOT_OPEN_FOR_READING, dst.toDisplayString()); } if(srcfd >= 0 ) { smbc_close(srcfd); } return; } // Perform copy while(1) { n = smbc_read(srcfd, buf, MAX_XFER_BUF_SIZE ); if(n > 0) { n = smbc_write(dstfd, buf, n); if(n == -1) { qCDebug(KIO_SMB) << "SMBSlave::copy copy now KIO::ERR_COULD_NOT_WRITE"; error( KIO::ERR_COULD_NOT_WRITE, dst.toDisplayString()); break; } processed_size += n; processedSize(processed_size); } else if(n == 0) { break; // finished } else { error( KIO::ERR_COULD_NOT_READ, src.toDisplayString()); break; } } // FINISHED: if(srcfd >= 0 ) { smbc_close(srcfd); } if(dstfd >= 0) { if(smbc_close(dstfd) == 0) { // TODO: set final permissions } else { error( KIO::ERR_COULD_NOT_WRITE, dst.toDisplayString()); return; } } finished(); }
void SMBSlave::smbCopyPut(const QUrl& ksrc, const QUrl& kdst, int permissions, KIO::JobFlags flags) { qCDebug(KIO_SMB) << "src = " << ksrc << ", dest = " << kdst; QFile srcFile (ksrc.toLocalFile()); const QFileInfo srcInfo (srcFile); if (srcInfo.exists()) { if (srcInfo.isDir()) { error(KIO::ERR_IS_DIRECTORY, ksrc.toDisplayString()); return; } } else { error(KIO::ERR_DOES_NOT_EXIST, ksrc.toDisplayString()); return; } if (!srcFile.open(QFile::ReadOnly)) { qCDebug(KIO_SMB) << "could not read from" << ksrc; switch (srcFile.error()) { case QFile::PermissionsError: error(KIO::ERR_WRITE_ACCESS_DENIED, ksrc.toDisplayString()); break; case QFile::OpenError: default: error(KIO::ERR_CANNOT_OPEN_FOR_READING, ksrc.toDisplayString()); break; } return; } totalSize(static_cast<filesize_t>(srcInfo.size())); bool bResume = false; bool bPartExists = false; const bool bMarkPartial = config()->readEntry("MarkPartial", true); const SMBUrl dstOrigUrl (kdst); if (bMarkPartial) { const int errNum = cache_stat(dstOrigUrl.partUrl(), &st); bPartExists = (errNum == 0); if (bPartExists) { if (!(flags & KIO::Overwrite) && !(flags & KIO::Resume)) { bResume = canResume(st.st_size); } else { bResume = (flags & KIO::Resume); } } } int dstfd = -1; int errNum = cache_stat(dstOrigUrl, &st); if (errNum == 0 && !(flags & KIO::Overwrite) && !(flags & KIO::Resume)) { if (S_ISDIR(st.st_mode)) { error( KIO::ERR_IS_DIRECTORY, dstOrigUrl.toDisplayString()); } else { error( KIO::ERR_FILE_ALREADY_EXIST, dstOrigUrl.toDisplayString()); } return; } KIO::filesize_t processed_size = 0; const SMBUrl dstUrl(bMarkPartial ? dstOrigUrl.partUrl() : dstOrigUrl); if (bResume) { // append if resuming qCDebug(KIO_SMB) << "resume" << dstUrl; dstfd = smbc_open(dstUrl.toSmbcUrl(), O_RDWR, 0 ); if (dstfd < 0) { errNum = errno; } else { const off_t offset = smbc_lseek(dstfd, 0, SEEK_END); if (offset == (off_t)-1) { error(KIO::ERR_COULD_NOT_SEEK, dstUrl.toDisplayString()); smbc_close(dstfd); return; } else { processed_size = offset; } } } else { mode_t mode; if (permissions == -1) { mode = 600; } else { mode = permissions | S_IRUSR | S_IWUSR; } qCDebug(KIO_SMB) << "NO resume" << dstUrl; dstfd = smbc_open(dstUrl.toSmbcUrl(), O_CREAT | O_TRUNC | O_WRONLY, mode); if (dstfd < 0) { errNum = errno; } } if (dstfd < 0) { if (errNum == EACCES) { qCDebug(KIO_SMB) << "access denied"; error( KIO::ERR_WRITE_ACCESS_DENIED, dstUrl.toDisplayString()); } else { qCDebug(KIO_SMB) << "can not open for writing"; error( KIO::ERR_CANNOT_OPEN_FOR_WRITING, dstUrl.toDisplayString()); } return; } bool isErr = false; if (processed_size == 0 || srcFile.seek(processed_size)) { // Perform the copy char buf[MAX_XFER_BUF_SIZE]; while (1) { const ssize_t bytesRead = srcFile.read(buf, MAX_XFER_BUF_SIZE); if (bytesRead <= 0) { if (bytesRead < 0) { error(KIO::ERR_COULD_NOT_READ, ksrc.toDisplayString()); isErr = true; } break; } const qint64 bytesWritten = smbc_write(dstfd, buf, bytesRead); if (bytesWritten == -1) { error(KIO::ERR_COULD_NOT_WRITE, kdst.toDisplayString()); isErr = true; break; } processed_size += bytesWritten; processedSize(processed_size); } } else { isErr = true; error(KIO::ERR_COULD_NOT_SEEK, ksrc.toDisplayString()); } // FINISHED if (smbc_close(dstfd) < 0) { qCDebug(KIO_SMB) << dstUrl << "could not write"; error( KIO::ERR_COULD_NOT_WRITE, dstUrl.toDisplayString()); return; } // Handle error condition. if (isErr) { if (bMarkPartial) { const int size = config()->readEntry("MinimumKeepSize", DEFAULT_MINIMUM_KEEP_SIZE); const int errNum = cache_stat(dstUrl, &st); if (errNum == 0 && st.st_size < size) { smbc_unlink(dstUrl.toSmbcUrl()); } } return; } // Rename partial file to its original name. if (bMarkPartial) { smbc_unlink(dstOrigUrl.toSmbcUrl()); if (smbc_rename(dstUrl.toSmbcUrl(), dstOrigUrl.toSmbcUrl()) < 0) { qCDebug(KIO_SMB) << "failed to rename" << dstUrl << "to" << dstOrigUrl << "->" << strerror(errno); error(ERR_CANNOT_RENAME_PARTIAL, dstUrl.toDisplayString()); return; } } #ifdef HAVE_UTIME_H // set modification time const QString mtimeStr = metaData( "modified" ); if (!mtimeStr.isEmpty() ) { QDateTime dt = QDateTime::fromString( mtimeStr, Qt::ISODate ); if ( dt.isValid() ) { struct utimbuf utbuf; utbuf.actime = st.st_atime; // access time, unchanged utbuf.modtime = dt.toTime_t(); // modification time smbc_utime( dstUrl.toSmbcUrl(), &utbuf ); } } #endif // We have done our job => finish finished(); }
void SMBSlave::smbCopyGet(const QUrl& ksrc, const QUrl& kdst, int permissions, KIO::JobFlags flags) { qCDebug(KIO_SMB) << "src = " << ksrc << ", dest = " << kdst; // check if destination is ok ... const QString dstFile = kdst.toLocalFile(); const QFileInfo dstInfo (dstFile); if(dstInfo.exists()) { if(dstInfo.isDir()) { error (ERR_IS_DIRECTORY, kdst.toDisplayString()); return; } if(!(flags & KIO::Overwrite)) { error(ERR_FILE_ALREADY_EXIST, kdst.toDisplayString()); return; } } bool bResume = false; const QFileInfo partInfo (dstFile + QLatin1String(".part")); const bool bPartExists = partInfo.exists(); const bool bMarkPartial = config()->readEntry("MarkPartial", true); if (bMarkPartial && bPartExists && partInfo.size() > 0) { if (partInfo.isDir()) { error(ERR_IS_DIRECTORY, partInfo.absoluteFilePath()); return; } bResume = canResume(partInfo.size()); } if (bPartExists && !bResume) // get rid of an unwanted ".part" file QFile::remove(partInfo.absoluteFilePath()); // open the output file... QFile::OpenMode mode; QString filename; if (bResume) { filename = partInfo.absoluteFilePath(); mode = QFile::WriteOnly | QFile::Append; } else { filename = (bMarkPartial ? partInfo.absoluteFilePath() : dstFile); mode = QFile::WriteOnly | QFile::Truncate; } QFile file (filename); if (!bResume) { QFile::Permissions perms; if (permissions == -1) { perms = QFile::ReadOwner | QFile::WriteOwner; } else { perms = KIO::convertPermissions(permissions | QFile::WriteOwner); } file.setPermissions(perms); } if (!file.open(mode)) { qCDebug(KIO_SMB) << "could not write to" << dstFile; switch (file.error()) { case QFile::OpenError: if (bResume) { error (ERR_CANNOT_RESUME, kdst.toDisplayString()); } else { error(ERR_CANNOT_OPEN_FOR_WRITING, kdst.toDisplayString()); } break; case QFile::PermissionsError: error(ERR_WRITE_ACCESS_DENIED, kdst.toDisplayString()); break; default: error(ERR_CANNOT_OPEN_FOR_WRITING, kdst.toDisplayString()); break; } return; } // setup the source urls const SMBUrl src(ksrc); // Obtain information about source int errNum = cache_stat (src, &st); if (errNum != 0) { if (errNum == EACCES) { error (KIO::ERR_ACCESS_DENIED, src.toDisplayString()); } else { error (KIO::ERR_DOES_NOT_EXIST, src.toDisplayString()); } return; } if (S_ISDIR( st.st_mode )) { error (KIO::ERR_IS_DIRECTORY, src.toDisplayString()); return; } totalSize(st.st_size); // Open the source file KIO::filesize_t processed_size = 0; int srcfd = smbc_open(src.toSmbcUrl(), O_RDONLY, 0); if (srcfd < 0){ errNum = errno; } else { errNum = 0; if (bResume) { qCDebug(KIO_SMB) << "seeking to size" << partInfo.size(); off_t offset = smbc_lseek(srcfd, partInfo.size(), SEEK_SET); if (offset == -1) { error(KIO::ERR_COULD_NOT_SEEK, src.toDisplayString()); smbc_close(srcfd); return; } else { processed_size += offset; } } } if (srcfd < 0) { if(errNum == EACCES) { error( KIO::ERR_ACCESS_DENIED, src.toDisplayString() ); } else { error( KIO::ERR_DOES_NOT_EXIST, src.toDisplayString() ); } return; } // Perform the copy char buf[MAX_XFER_BUF_SIZE]; bool isErr = false; while (1) { const ssize_t bytesRead = smbc_read(srcfd, buf, MAX_XFER_BUF_SIZE); if (bytesRead <= 0) { if (bytesRead < 0) { error( KIO::ERR_COULD_NOT_READ, src.toDisplayString()); isErr = true; } break; } const qint64 bytesWritten = file.write(buf, bytesRead); if (bytesWritten == -1) { qCDebug(KIO_SMB) << "copy now KIO::ERR_COULD_NOT_WRITE"; error( KIO::ERR_COULD_NOT_WRITE, kdst.toDisplayString()); isErr = true; break; } processed_size += bytesWritten; processedSize(processed_size); } // FINISHED smbc_close(srcfd); // Handle error condition. if (isErr) { const QString sPart = partInfo.absoluteFilePath(); if (bMarkPartial) { const int size = config()->readEntry("MinimumKeepSize", DEFAULT_MINIMUM_KEEP_SIZE); if (partInfo.size() < size) { QFile::remove(sPart); } } return; } // Rename partial file to its original name. if (bMarkPartial) { const QString sPart = partInfo.absoluteFilePath(); // Remove old dest file if it exists.. if (dstInfo.exists()) { QFile::remove(dstFile); } if (!QFile::rename(sPart, dstFile)) { qCDebug(KIO_SMB) << "failed to rename" << sPart << "to" << dstFile; error(ERR_CANNOT_RENAME_PARTIAL, sPart); return; } } // Restore the mtime on the file. const QString mtimeStr = metaData("modified"); qCDebug(KIO_SMB) << "modified:" << mtimeStr; if (!mtimeStr.isEmpty()) { QDateTime dt = QDateTime::fromString(mtimeStr, Qt::ISODate); if (dt.isValid()) { struct utimbuf utbuf; utbuf.actime = QFileInfo(file).lastRead().toTime_t(); // access time, unchanged utbuf.modtime = dt.toTime_t(); // modification time utime(QFile::encodeName(dstFile).constData(), &utbuf); } } finished(); }