mars-dosutils/map.c

314 lines
7.5 KiB
C
Executable File

/* 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];
servern[0]='\0';
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 delete)
{
int result = -1;
if (drive > -1 && drive < 32) {
uint8 connid;
uint8 dhandle;
uint8 flags;
if (!delete ||
(!get_drive_info(drive, &connid, &dhandle, &flags) && flags && connid)){
uint8 nmdrive[3];
nmdrive[0] = drive+'A';
nmdrive[1] = ':';
nmdrive[2] = '\0';
result = redir_device_drive(delete ? -1 : 0x4, nmdrive, nwp->path);
}
}
return(result);
}
static int parse_argv(uint8 *drvstr, NWPATH *nwpath,
int argc, char *argv[], int smode, int argvmode)
{
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) {
if (argvmode != 1)
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[], int mode)
{
uint8 drvstr[22];
NWPATH nwpath;
if (!ipx_init()) argc = 1;
if (!parse_argv(drvstr, &nwpath, argc, argv, 0, mode)) {
if (*(nwpath.path) || mode==1) {
if (do_map(*drvstr - 'A', &nwpath, mode)< 0)
fprintf(stderr, "MAP Error\n");
}
if (mode != 1)
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_path[300];
if ( !*drvstr || j == *(drvstr+1)) {
if (p->drivenummer == 0xfe){
strcpy(path, p->dospath);
} else {
*path = p->drivenummer+'A';
*(path+1) = ':';
strcpy(path+2, p->dospath);
}
if (p->flags && !(p->flags & 0x80)){
char *pp=nwname_path;
*pp++ = '[';
get_fs_name(p->connid, pp);
pp +=strlen(pp);
*pp++='\\';
if (get_dir_path(p->dhandle, pp)) {
strcpy(pp, "ERROR NW");
}
pp += strlen(pp);
*pp ++= ']';
*pp = '\0';
} else {
*nwname_path = '\0';
}
printf("SEARCH%2d = %s %s\n", j, path, nwname_path);
}
p++;
}
return(0);
}
static int set_search(uint8 *drvstr, NWPATH *nwp, int pathmode)
{
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;
if (p->drivenummer + 'A' == nwp->path[0] && nwp->path[1] == ':'
&& !strcmp(nwp->path+2, p->dospath)) {
p->drivenummer=0xfe;
*(p->dospath) = '\0';
}
p++;
}
if (entry > 0) {
if (entry > 16) entry = 16;
if (pathmode == 2 && entry <= j && entry < 16) { /* insert modus */
int k=j+1-entry;
if (j < 16) {
p++;
k++;
j++;
}
while (k--) {
memcpy(p, p-1, sizeof(SEARCH_VECTOR_ENTRY));
--p;
}
}
if (--entry < j)
p = drives+entry;
else (p+1)->drivenummer = 0xff;
p->flags = 0;
p->drivenummer = 0xfe;
if (pathmode==1)
*(p->dospath) = '\0';
else
strcpy(p->dospath, nwp->path);
result = set_search_drive_vektor(drives);
}
return(result);
}
int func_path(int argc, char *argv[], int mode)
{
uint8 drvstr[22];
NWPATH nwpath;
if (!parse_argv(drvstr, &nwpath, argc, argv, 1, mode)) {
int result=0;
if (*(nwpath.path) || mode==1)
result=set_search(drvstr, &nwpath, mode);
if (mode != 1)
show_search(drvstr);
return(result);
}
return(1);
}
void remove_nwpathes(void)
{
SEARCH_VECTOR drives;
SEARCH_VECTOR_ENTRY *p=drives;
int j=0;
get_search_drive_vektor(drives);
while (p->drivenummer != 0xff && j++ < 16) {
if (p->flags && !(p->flags & 0x80)){
p->flags=0;
p->drivenummer=0xfe;
*(p->dospath) ='\0';
}
++p;
}
set_search_drive_vektor(drives);
}