diff --git a/netcall.c b/netcall.c index 4f5b888..b33e0e7 100644 --- a/netcall.c +++ b/netcall.c @@ -54,24 +54,38 @@ int redir_device_drive(int devicetyp, uint8 *devname, uint8 *remotename) { REGS regs; SREGS sregs; - int result; uint8 buff1[16]; uint8 buff2[128]; uint8 *ldevname = buff1; uint8 *lremotename = buff2; - strncpy(ldevname, devname, 16); + + memset(®s, 0, sizeof(regs)); + memset(&sregs, 0, sizeof(sregs)); + memset(buff1, 0, sizeof(buff1)); + memset(buff2, 0, sizeof(buff2)); + + strmaxcpy(ldevname, devname, sizeof(buff1) - 1); + regs.x.ax = (devicetyp == -1) ? 0x5f04 : 0x5f03; regs.h.bl = (uint8)devicetyp; regs.x.cx = 0x574e; /* user sign 'NW' */ sregs.ds = FP_SEG(ldevname); regs.x.si = FP_OFF(ldevname); + if (devicetyp > -1) { - strncpy(lremotename, remotename, 128); + strmaxcpy(lremotename, remotename, sizeof(buff2) - 1); sregs.es = FP_SEG(lremotename); regs.x.di = FP_OFF(lremotename); } - result = intdosx(®s, ®s, &sregs); - return(regs.x.cflag ? -result : 0); + + intdosx(®s, ®s, &sregs); + + /* + * Return the actual DOS/redirector error code from AX when carry is set. + * The old code returned the intdosx() function result. With OpenWatcom + * this can hide which redirector error happened. + */ + return(regs.x.cflag ? -(int)regs.x.ax : 0); } int list_redir(int index, int *devicetyp, uint8 *devname, uint8 *remotename)