home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpm
/
uzi
/
uzi-util.ark
/
UCP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1988-12-22
|
9KB
|
547 lines
/**************************************************
UZI (Unix Z80 Implementation) Utilities: ucp.c
***************************************************/
#include <stdio.h>
#include "unix.h";
#include "extern.h"
int16 *syserror = &udata.u_error;
static char cwd[100];
static char line[128];
#ifndef CPM
extern char *sys_errlist[];
#endif
main(argc,argval)
int argc;
char *argval[];
{
int rdev;
char cmd[30], arg1[30], arg2[30], arg3[30];
int count;
struct filesys fsys;
int j;
char *argv[5];
if (argc < 2)
rdev = 0;
else
rdev = atoi(argval[1]);
xfs_init(rdev);
strcpy(cwd,"/");
for(;;)
{
printf("unix: ");
if (gets(line) == NULL)
{
xfs_end();
exit();
}
cmd[0] = '\0';
*arg1 = '\0';
arg2[0] = '\0';
arg3[0] = '\0';
count = sscanf(line,"%s %s %s %s",cmd, arg1, arg2, arg3);
if (count == 0 || cmd[0] == '\0')
continue;
_sync();
if (strcmp(cmd,"\n") == 0)
continue;
else if (strcmp(cmd,"exit") == 0)
{
xfs_end();
exit();
}
else if (strcmp(cmd,"ls") == 0)
{
if (*arg1 )
ls(arg1);
else
ls(".");
}
else if (strcmp(cmd,"cd") == 0)
{
if (*arg1 )
{
strcpy(cwd,arg1);
if (_chdir(arg1) != 0)
{
printf("cd: error number %d\n",*syserror);
}
}
}
else if (strcmp(cmd,"mkdir") == 0)
{
if (*arg1 )
mkdir(arg1);
}
else if (strcmp(cmd,"mknod") == 0)
{
if (*arg1 && *arg2 && *arg3 )
mknod(arg1,arg2, arg3);
}
else if (strcmp(cmd,"chmod") == 0)
{
if (*arg1 && *arg2 )
chmod(arg1,arg2);
}
else if (strcmp(cmd,"get") == 0)
{
if (*arg1 )
get(arg1,0);
}
else if (strcmp(cmd,"bget") == 0)
{
if (*arg1 )
get(arg1,1);
}
else if (strcmp(cmd,"put") == 0)
{
if (*arg1 )
put(arg1,0);
}
else if (strcmp(cmd,"bput") == 0)
{
if (*arg1 )
put(arg1,1);
}
else if (strcmp(cmd,"type") == 0)
{
if (*arg1 )
type(arg1);
}
else if (strcmp(cmd,"dump") == 0)
{
if (*arg1 )
fdump(arg1);
}
else if (strcmp(cmd,"rm") == 0)
{
if (*arg1 )
unlink(arg1);
}
else if (strcmp(cmd,"df") == 0)
{
for (j=0; j < 4; ++j)
{
_getfsys(j,&fsys);
if (fsys.s_mounted)
{
printf("%d: %u blks used %u blks free %u inodes used %u inodes free\n",
j,(fsys.s_fsize - fsys.s_isize)-fsys.s_tfree, fsys.s_tfree,
(8*(fsys.s_isize-2)-fsys.s_tinode), fsys.s_tinode);
}
}
}
else if (strcmp(cmd,"rmdir") == 0)
{
if (*arg1 )
rmdir(arg1);
}
else if (strcmp(cmd,"mount") == 0)
{
if (*arg1 && *arg2)
if (_mount(arg1,arg2,0) != 0)
{
printf("Mount error.%d\n", *syserror);
}
}
else if (strcmp(cmd,"umount") == 0)
{
if (*arg1)
if (_umount(arg1) != 0)
{
printf("Umount error.%d\n", *syserror);
}
}
else
{
printf("Unknown command\n");
}
}
}
ls(path)
char *path;
{
struct direct buf;
struct stat statbuf;
char dname[128];
int d;
d = _open(path,0);
if (d < 0)
{
printf("ls: can't open %s\n",path);
return;
}
while (_read(d,(char *)&buf,16) == 16)
{
if (buf.d_name[0] == '\0')
continue;
if (path[0] != '.' || path[1] )
{
strcpy(dname,path);
strcat(dname,"/");
}
else
dname[0] = '\0';
strcat(dname,buf.d_name);
if (_stat(dname,&statbuf) != 0)
{
printf("ls: can't stat %s\n",dname);
continue;
}
if ((statbuf.st_mode & F_MASK) == F_DIR)
strcat(dname,"/");
printf("%-6d %-15s",
(statbuf.st_mode & F_CDEV) ?
statbuf.st_rdev :
512*statbuf.st_size.o_blkno + statbuf.st_size.o_offset,
dname);
printf(" 0%-6o %-2d %-5d\n", statbuf.st_mode, statbuf.st_nlink,
statbuf.st_ino);
}
_close(d);
}
chmod(path,modes)
char *path;
char *modes;
{
int mode;
int dev;
mode = -1;
sscanf(modes,"%o",&mode);
if (mode == -1 )
{
printf("chmod: bad mode\n");
return(-1);
}
if (_chmod(path,mode))
{
printf("_chmod: error %d\n",*syserror);
return(-1);
}
}
mknod(path,modes, devs)
char *path;
char *modes;
char *devs;
{
int mode;
int dev;
mode = -1;
sscanf(modes,"%o",&mode);
if (mode == -1 )
{
printf("mknod: bad mode\n");
return(-1);
}
if ((mode & F_MASK) != F_BDEV && (mode & F_MASK) != F_CDEV)
{
printf("mknod: mode is not device\n");
return(-1);
}
dev = -1;
sscanf(devs,"%d",&dev);
if (dev == -1 )
{
printf("mknod: bad device\n");
return(-1);
}
if (_mknod(path,mode,dev) != 0)
{
printf("_mknod: error %d\n",*syserror);
return(-1);
}
return(0);
}
mkdir(path)
char *path;
{
char dot[100];
if ( _mknod(path, 040000 | 0777, 0) != 0)
{
printf("mkdir: mknod error %d\n",*syserror);
return(-1);
}
strcpy(dot,path);
strcat(dot,"/.");
if ( _link(path,dot) != 0)
{
printf("mkdir: link dot error %d\n",*syserror);
return(-1);
}
strcpy(dot,path);
strcat(dot,"/..");
if ( _link(".",dot) != 0)
{
printf("mkdir: link dotdot error %d\n",*syserror);
return(-1);
}
return(0);
}
get(arg,binflag)
char *arg;
int binflag;
{
FILE *fp;
int d;
char cbuf[512];
int nread;
fp = fopen(arg,binflag ? "rb" : "r");
if (fp == NULL)
{
printf("Source file not found\n");
return(-1);
}
d = _creat(arg,0666);
if (d < 0)
{
printf("Cant open unix file error %d\n",*syserror);
return(-1);
}
for (;;)
{
nread = fread(cbuf,1,512,fp);
if (nread == 0)
break;
if (_write(d,cbuf,nread) != nread)
{
printf("_write error %d\n",*syserror);
fclose(fp);
_close(d);
return(-1);
}
}
fclose(fp);
_close(d);
return(0);
}
put(arg,binflag)
char *arg;
int binflag;
{
FILE *fp;
int d;
char cbuf[512];
int nread;
fp = fopen(arg,binflag ? "wb" : "w");
if (fp == NULL)
{
printf("Cant open destination file.\n");
return(-1);
}
d = _open(arg,0);
if (d < 0)
{
printf("Cant open unix file error %d\n",*syserror);
return(-1);
}
for (;;)
{
if ((nread =_read(d,cbuf,512)) == 0)
break;
if (fwrite(cbuf,1,nread,fp) != nread)
{
printf("fwrite error");
fclose(fp);
_close(d);
return(-1);
}
}
fclose(fp);
_close(d);
return(0);
}
type(arg)
char *arg;
{
int d;
char cbuf[512];
int nread;
d = _open(arg,0);
if (d < 0)
{
printf("Cant open unix file error %d\n",*syserror);
return(-1);
}
for (;;)
{
if( (nread = _read(d,cbuf,512)) == 0)
break;
fwrite(cbuf, 1, nread, stdout);
}
_close(d);
return(0);
}
fdump(arg)
char *arg;
{
int d;
char cbuf[512];
int nread;
printf("Dump starting.\n");
d = _open(arg,0);
if (d < 0)
{
printf("Cant open unix file error %d\n",*syserror);
return(-1);
}
for (;;)
{
if( (nread = _read(d,cbuf,512)) == 0)
break;
}
_close(d);
printf("Dump done.\n");
return(0);
}
unlink(path)
char *path;
{
struct stat statbuf;
if (_stat(path,&statbuf) != 0)
{
printf("unlink: can't stat %s\n",path);
return(-1);
}
if ((statbuf.st_mode & F_MASK) == F_DIR)
{
printf("unlink: %s directory\n",path);
return(-1);
}
if (_unlink(path) != 0)
{
printf("unlink: _unlink errn=or %d\n",*syserror);
return(-1);
}
return(0);
}
rmdir(path)
char *path;
{
struct stat statbuf;
char newpath[100];
struct direct dir;
int fd;
if (_stat(path,&statbuf) != 0)
{
printf("rmdir: can't stat %s\n",path);
return(-1);
}
if (statbuf.st_mode & F_DIR == 0)
{
printf("rmdir: %s not directory\n",path);
return(-1);
}
if((fd = _open(path,0)) < 0) {
printf("rmdir: %s unreadable\n", path);
return(-1);
}
while(_read(fd, (char *)&dir, sizeof (dir)) == sizeof (dir)) {
if(dir.d_ino == 0) continue;
if(!strcmp(dir.d_name, ".") || !strcmp(dir.d_name, ".."))
continue;
printf("rmdir: %s not empty\n", path);
_close(fd);
return(-1);
}
_close(fd);
strcpy(newpath,path);
strcat(newpath,"/.");
if (_unlink(newpath) != 0)
{
printf("rmdir: can't unlink \".\" error %d\n",*syserror);
return(-1);
}
strcat(newpath,".");
if (_unlink(newpath) != 0)
{
printf("rmdir: can't unlink \"..\" error %d\n",*syserror);
return(-1);
}
if (_unlink(path) != 0)
{
printf("rmdir: _unlink error %d\n",*syserror);
return(-1);
}
return(0);
}