253 lines
6.3 KiB
C
253 lines
6.3 KiB
C
|
/* map.c 05-Apr-96 */
|
||
|
|
||
|
/****************************************************************
|
||
|
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany *
|
||
|
****************************************************************/
|
||
|
|
||
|
#include "net.h"
|
||
|
|
||
|
typedef struct {
|
||
|
uint8 connection;
|
||
|
uint8 volume;
|
||
|
uint8 buff[512]; /* complete path */
|
||
|
uint8 *path; /* points to path */
|
||
|
} NWPATH;
|
||
|
|
||
|
static void show_map(uint8 *drvstr)
|
||
|
{
|
||
|
int j;
|
||
|
for (j=0; j < 32; j++){
|
||
|
uint8 connid;
|
||
|
uint8 dhandle;
|
||
|
uint8 flags;
|
||
|
if (*drvstr && (j + 'A' != *drvstr)) continue;
|
||
|
if ((!get_drive_info(j, &connid, &dhandle, &flags)) && flags){
|
||
|
char servern[52];
|
||
|
char path[256];
|
||
|
if (flags & 0x80) { /* lokal DRIVE */
|
||
|
path[0]= '\\';
|
||
|
if (j < 2){
|
||
|
strcpy(path, "DISK LW");
|
||
|
} else if (getcurdir(j+1, path+1)) {
|
||
|
strcpy(path, "LW !OK");
|
||
|
}
|
||
|
} else {
|
||
|
if (get_dir_path(dhandle, path)) {
|
||
|
strcpy(path, "DHANDLE !OK");
|
||
|
}
|
||
|
}
|
||
|
if (connid) {
|
||
|
get_fs_name(connid, servern);
|
||
|
strcat(servern, "\\");
|
||
|
} else servern[0]='\0';
|
||
|
printf("MAP %c: = %s%s\n", (char)j+'A', servern, path);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#if 0
|
||
|
static void do_map(int drive, NWPATH *nwp)
|
||
|
{
|
||
|
if (drive > -1 && drive < 32) {
|
||
|
uint8 connid;
|
||
|
uint8 dhandle;
|
||
|
uint8 flags;
|
||
|
if ((!get_drive_info(drive, &connid, &dhandle, &flags)) && flags){
|
||
|
char servern[52];
|
||
|
char path[256];
|
||
|
if (flags & 0x80) { /* lokal DRIVE */
|
||
|
path[0]= '\\';
|
||
|
if (drive < 2){
|
||
|
strcpy(path, "DISK LW");
|
||
|
} else if (getcurdir(drive+1, path+1)) {
|
||
|
strcpy(path, "LW !OK");
|
||
|
}
|
||
|
} else {
|
||
|
if (get_dir_path(dhandle, path)) {
|
||
|
strcpy(path, "DHANDLE !OK");
|
||
|
}
|
||
|
}
|
||
|
if (connid) {
|
||
|
get_fs_name(connid, servern);
|
||
|
strcat(servern, "\\");
|
||
|
} else servern[0]='\0';
|
||
|
printf("DOMAP %c: = %s%s\n", (char)drive+'A', servern, path);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
static int do_map(int drive, NWPATH *nwp)
|
||
|
{
|
||
|
int result = -1;
|
||
|
if (drive > -1 && drive < 32) {
|
||
|
uint8 nmdrive[3];
|
||
|
nmdrive[0] = drive+'A';
|
||
|
nmdrive[1] = ':';
|
||
|
nmdrive[2] = '\0';
|
||
|
result = redir_device_drive(0x4, nmdrive, nwp->path);
|
||
|
}
|
||
|
return(result);
|
||
|
}
|
||
|
|
||
|
|
||
|
static int parse_argv(uint8 *drvstr, NWPATH *nwpath,
|
||
|
int argc, char *argv[], int smode)
|
||
|
{
|
||
|
int k = 0;
|
||
|
int mode = 0;
|
||
|
uint8 *pd = drvstr;
|
||
|
*drvstr = '\0';
|
||
|
memset(nwpath, 0, sizeof(NWPATH));
|
||
|
*(nwpath->buff) = '\0';
|
||
|
nwpath->path = nwpath->buff;
|
||
|
|
||
|
while (++k < argc && mode > -1) {
|
||
|
uint8 *p = argv[k];
|
||
|
while (*p && mode > -1) {
|
||
|
if (!mode) {
|
||
|
if (*p == ':') mode = -1;
|
||
|
else if (smode && *p != 's' && *p != 'S') mode = -1;
|
||
|
}
|
||
|
if (mode < 0) break;
|
||
|
else if (mode < 20) {
|
||
|
if (*p == ':') {
|
||
|
if (!mode || (mode > 1 && (*drvstr != 'S' || !smode)))
|
||
|
mode = -1;
|
||
|
else {
|
||
|
*pd = '\0';
|
||
|
if (mode > 1) {
|
||
|
*drvstr='s';
|
||
|
*(drvstr+1)=(uint8) atoi((char*)drvstr+1);
|
||
|
}
|
||
|
mode = 20;
|
||
|
pd = nwpath->buff;
|
||
|
}
|
||
|
} else {
|
||
|
if (++mode == 20) mode = -1;
|
||
|
else {
|
||
|
if (*p > 0x60 && *p < 0x7b)
|
||
|
*pd++ = *p - 0x20; /* upshift */
|
||
|
else
|
||
|
*pd++ = *p;
|
||
|
}
|
||
|
}
|
||
|
} else if (mode == 20) {
|
||
|
if (*p == '=') mode = 30;
|
||
|
else if (*p != ' ' && *p != '\t') mode = -2;
|
||
|
} else if (mode == 30) {
|
||
|
if (*p != ' ' && *p != '\t') {
|
||
|
mode = 40;
|
||
|
continue;
|
||
|
}
|
||
|
} else if (mode == 40) {
|
||
|
if (*p > 0x60 && *p < 0x7b)
|
||
|
*pd++ = *p - 0x20; /* upshift */
|
||
|
else
|
||
|
*pd++ = *p;
|
||
|
}
|
||
|
p++;
|
||
|
} /* while *p */
|
||
|
} /* while k */
|
||
|
if (mode == 30) {
|
||
|
getcwd((char *)nwpath->buff, sizeof(nwpath->buff));
|
||
|
mode = 40;
|
||
|
}
|
||
|
if (mode && mode != 20 && mode != 40) {
|
||
|
fprintf(stderr, "Cannot interpret line. errcode=%d\n", mode);
|
||
|
return(mode < 0 ? mode : -3);
|
||
|
}
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
int func_map(int argc, char *argv[])
|
||
|
{
|
||
|
uint8 drvstr[22];
|
||
|
NWPATH nwpath;
|
||
|
if (!ipx_init()) argc = 1;
|
||
|
if (!parse_argv(drvstr, &nwpath, argc, argv, 0)) {
|
||
|
if (*(nwpath.path)) {
|
||
|
if (do_map(*drvstr - 'A', &nwpath)< 0)
|
||
|
fprintf(stderr, "MAP Error\n");
|
||
|
}
|
||
|
show_map(drvstr);
|
||
|
return(0);
|
||
|
}
|
||
|
return(1);
|
||
|
}
|
||
|
/* ------------------------------------------------- */
|
||
|
static int show_search(uint8 *drvstr)
|
||
|
{
|
||
|
SEARCH_VECTOR drives;
|
||
|
SEARCH_VECTOR_ENTRY *p=drives;
|
||
|
int j=0;
|
||
|
get_search_drive_vektor(drives);
|
||
|
while (p->drivenummer != 0xff && j++ < 16) {
|
||
|
char path[256];
|
||
|
char nwname[256];
|
||
|
if ( !*drvstr || j == *(drvstr+1)) {
|
||
|
if (p->flags && !(p->flags & 0x80)){
|
||
|
get_fs_name(p->u.fs.connid, nwname);
|
||
|
if (get_dir_path(p->u.fs.dhandle, path)) {
|
||
|
strcpy(path, "ERROR NW");
|
||
|
}
|
||
|
(void)xadd_char(nwname, '\\', 20);
|
||
|
} else {
|
||
|
nwname[0] = '\0';
|
||
|
/*
|
||
|
nwname[0] = '<';
|
||
|
strcpy(nwname+1, "LOCAL");
|
||
|
*/
|
||
|
if (p->drivenummer == 0xfe){
|
||
|
strcpy(path, p->u.d.dospath);
|
||
|
} else if (getcurdir((int)(p->drivenummer)+1, path)) {
|
||
|
strcpy(path, "ERROR DOS");
|
||
|
}
|
||
|
/*
|
||
|
(void)xadd_char(nwname, '>', 20);
|
||
|
*/
|
||
|
}
|
||
|
strcat(nwname, path);
|
||
|
printf("SEARCH%2d = %c: %s\n", j, (char)(p->drivenummer)+'A', nwname);
|
||
|
}
|
||
|
p++;
|
||
|
}
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
static int set_search(uint8 *drvstr, NWPATH *nwp)
|
||
|
{
|
||
|
int result=-1;
|
||
|
SEARCH_VECTOR drives;
|
||
|
SEARCH_VECTOR_ENTRY *p=drives;
|
||
|
int j=0;
|
||
|
int entry = (*drvstr=='s') ? *(drvstr+1) : 0;
|
||
|
get_search_drive_vektor(drives);
|
||
|
while (p->drivenummer != 0xff && j++ < 16) {
|
||
|
if (!entry && (p->drivenummer + 'A' == *drvstr)) entry=j;
|
||
|
p++;
|
||
|
}
|
||
|
if (entry > 0) {
|
||
|
if (entry > 16) entry = 16;
|
||
|
if (--entry < j) p = drives+entry;
|
||
|
else (p+1)->drivenummer = 0xff;
|
||
|
p->drivenummer = 0xfe;
|
||
|
strcpy(p->u.d.dospath, nwp->path);
|
||
|
result = set_search_drive_vektor(drives);
|
||
|
}
|
||
|
return(result);
|
||
|
}
|
||
|
|
||
|
int func_path(int argc, char *argv[])
|
||
|
{
|
||
|
uint8 drvstr[22];
|
||
|
NWPATH nwpath;
|
||
|
if (!parse_argv(drvstr, &nwpath, argc, argv, 1)) {
|
||
|
int result=0;
|
||
|
if (*(nwpath.path)) result=set_search(drvstr, &nwpath);
|
||
|
show_search(drvstr);
|
||
|
return(result);
|
||
|
}
|
||
|
return(1);
|
||
|
}
|
||
|
|