diff --git a/HGBD.HC b/HGBD.HC index d8a2f5a..d6d5553 100644 --- a/HGBD.HC +++ b/HGBD.HC @@ -4,7 +4,6 @@ #define HGC_SCREENSHOT 0x03 #define HGC_DIRH 0x04 #define HGC_GETURL 0x05 -#define HGC_GETURLSTR 0x06 #define HGC_DELH 0x07 #define HGC_CDH 0x08 #define HGC_DIRCURH 0x09 @@ -30,15 +29,19 @@ BlkDevAdd(HGBD_DEV,0,1,1); HGBD = Let2Drv(HGBD_DEV->first_drv_let); -U0 HGExec(I64 cmd) +U0 FreeHGBD() { - while (HGBD_OP>0) { Sleep(1+(RandU16/8192)); }; + HGBD_OP=0; +} + +U0 HGExec(I64 cmd, Bool chain=FALSE) +{ + while (HGBD_OP>0 && !chain) { Sleep(1+(RandU16/8192)); }; HGBD_OP=cmd; OutU8(HGC_PORT,HGC_NOOP); while (InU8(HGC_PORT)!=HGC_NOOP) { Sleep(0); }; OutU8(HGC_PORT,cmd); while (InU8(HGC_PORT)!=cmd) { Sleep(0); }; - HGBD_OP=0; } U0 ReadParamBuf() { DskCacheInvalidate(HGBD); BlkRead(HGBD,HGBD_PARAM_BUF,0,1); } @@ -67,6 +70,7 @@ I64 CdH(U8 *pathname) ReadParamBuf; result = Str2I64(HGBD_PARAM_BUF); if (result==0) { Print("%s ", pathname); PrintErr("Path not found.\n"); }; + FreeHGBD; return result; } @@ -79,7 +83,7 @@ I64 CopyG(U8 *filename) HGExec(HGC_COPYG); ReadParamBuf; size = Str2I64(HGBD_PARAM_BUF); - if (size==-1) { return 0; }; + if (size==-1) { FreeHGBD; return 0; }; Print("Copying %s to Guest\n",filename); BlkRead(HGBD,HGFS_BUF,1,(size/BLK_SIZE)+1); if (StrCmp(filename+StrLen(filename)-2,".Z")==0) { @@ -91,6 +95,7 @@ I64 CopyG(U8 *filename) } else { FileWrite(filename, HGFS_BUF, size); }; + FreeHGBD; return 1; } @@ -98,7 +103,7 @@ I64 CopyH(U8 *filename) { I64 size; CDirEntry *de = FilesFind(filename); - if (de==NULL) { return 0; }; + if (de==NULL) { FreeHGBD; return 0; }; Print("Copying %s to Host\n",de->full_name); U8 *file = FileRead(de->full_name, &size); ZeroParamBuf; @@ -109,6 +114,7 @@ I64 CopyH(U8 *filename) HGExec(HGC_COPYH); Free(file); DirEntryDel(de); + FreeHGBD; return 1; } @@ -122,6 +128,7 @@ I64 DelH(U8 *filename) ReadParamBuf; result = Str2I64(HGBD_PARAM_BUF); if (result==1) { Print("DelH %s\n", filename); }; + FreeHGBD; return result; } @@ -136,6 +143,7 @@ I64 DirH() { BlkRead(HGBD,HGFS_BUF,1,(size/BLK_SIZE)+1); MemSetU8(ToI64(HGFS_BUF)+size, 0x0, 1); Print(HGFS_BUF); + FreeHGBD; return entries; } @@ -155,10 +163,13 @@ I64 CopyFindH(U8 *files) U8 *DirCurH() { + U8 StrDCH[1024]; ZeroParamBuf; HGExec(HGC_DIRCURH); ReadParamBuf; - return HGBD_PARAM_BUF; + StrCpy(StrDCH,HGBD_PARAM_BUF); + FreeHGBD; + return StrDCH; } U0 ScrShot() @@ -166,7 +177,7 @@ U0 ScrShot() I64 size; BMPScrnCapture(SCREENSHOT_FILE); CDirEntry *de = FilesFind(SCREENSHOT_FILE); - if (de==NULL) { return; }; + if (de==NULL) { FreeHGBD; return; }; U8 *file = FileRead(de->full_name, &size); ZeroParamBuf; MemCpy(HGBD_PARAM_BUF,&size,8); @@ -177,6 +188,7 @@ U0 ScrShot() OutU8(0x03F8, 0x99); Free(file); DirEntryDel(de); + FreeHGBD; } U0 GetURL(U8 *url) @@ -195,7 +207,7 @@ U0 GetURL(U8 *url) HGExec(HGC_GETURL); ReadParamBuf; size = Str2I64(HGBD_PARAM_BUF); - if (size==-1) { PrintErr("Bad URL.\n"); return; }; + if (size==-1) { PrintErr("Bad URL.\n"); FreeHGBD; return; }; BlkRead(HGBD,HGFS_BUF,1,(size/BLK_SIZE)+1); if (StrCmp(localfile+StrLen(localfile)-2,".Z")==0) { U8 uzlocalfile[28]; @@ -206,21 +218,7 @@ U0 GetURL(U8 *url) } else { FileWrite(localfile, HGFS_BUF, size); }; -} - -U8 *GetURLStr(U8 *url) -{ - I64 size; - ZeroParamBuf; - StrCpy(HGBD_PARAM_BUF,url); - WriteParamBuf; - HGExec(HGC_GETURLSTR); - ReadParamBuf; - size = Str2I64(HGBD_PARAM_BUF); - if (size==-1) { PrintErr("Bad URL.\n"); return ""; }; - BlkRead(HGBD,HGFS_BUF,1,(size/BLK_SIZE)+1); - MemSetU8(ToI64(HGFS_BUF)+size, 0x0, 1); - return HGFS_BUF; + FreeHGBD; } U0 HCopy() @@ -234,6 +232,7 @@ U0 HCopy() BlkWrite(HGBD,clip,1,(size/BLK_SIZE)+1); HGExec(HGC_HCOPY); Free(clip); + FreeHGBD; } U0 HPaste() @@ -246,6 +245,7 @@ U0 HPaste() BlkRead(HGBD,HGFS_BUF,1,(size/BLK_SIZE)+1); MemSetU8(ToI64(HGFS_BUF)+size, 0x0, 1); Print(HGFS_BUF); + FreeHGBD; } U0 HGBDInit() diff --git a/hgbdd b/hgbdd index 45f0643..d96cd74 100644 --- a/hgbdd +++ b/hgbdd @@ -30,8 +30,6 @@ def builtin(data): HGCDirH() if data == HGC_GETURL: HGCGetURL() - if data == HGC_GETURLSTR: - HGCGetURLStr() if data == HGC_HCOPY: HGCHCopy() if data == HGC_HPASTE: @@ -220,29 +218,6 @@ def HGCGetURL(): logger.error("error reading url " + url) conn.send(chr(HGC_GETURL)) -def HGCGetURLStr(): - os.lseek(HGBD,0,os.SEEK_SET) - HGBD_PARAM_BUF = os.read(HGBD,BLK_SIZE) - url_comp = urlparse.urlparse(HGBD_PARAM_BUF[:HGBD_PARAM_BUF.find('\x00')]) - url = url_comp.scheme + "://" + url_comp.netloc + urllib.quote(url_comp.path) - filedata = subprocess.Popen('wget -q -O - -U "" "' + url + '" 2>/dev/null', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[0] - filedata = filedata.replace('$','$$') - filesize = len(filedata) - if filesize>0: - ZeroParamBuf() - os.lseek(HGBD,0,os.SEEK_SET) - os.write(HGBD,str(filesize)) - os.lseek(HGBD,BLK_SIZE,os.SEEK_SET) - os.write(HGBD,filedata) - logger.info("CUrl " + url) - else: - filesize = -1 - ZeroParamBuf() - os.lseek(HGBD,0,os.SEEK_SET) - os.write(HGBD,str(filesize)) - logger.error("error reading url " + url) - conn.send(chr(HGC_GETURLSTR)) - def HGCHCopy(): os.lseek(HGBD,0,os.SEEK_SET) HGBD_PARAM_BUF = os.read(HGBD,BLK_SIZE)