home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
TELECOM
/
UUCP_Blars.lzh
/
uux.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-11-02
|
7KB
|
284 lines
/*
* uux.c
*
* Copyrights (c) 1988 by reccoware systems, Wolfgang Ocker, Puchheim
*
*/
#include <stdio.h>
#include <strings.h>
#include <modes.h>
#include "uucp.h"
#include <pwd.h>
#include <errno.h>
#define TRUE 1
#define FALSE 0
#define PERMS (S_IREAD | S_IWRITE)
extern char *tzname[2]; /* contains two strings CDT or CST */
extern int daylight; /* array reference for above */
extern char *malloc();
struct passwd *names;
int fbfile, fcfile, fdfile;
char bfile[32], cfile[32], dfile[32], xfile[32];
char rmtname[16], rmtprog[128], HostName[16];
char *inpath, tmp[8192], tmp2[256];
char *p, *ptr, *cp;
char grade_char = 'N';
int debug, i, j, queue, progarg, rem_fnam_num;
char *rem_fnames[30];
char UserName[32];
int binfile = 0;
static int CheckLegalName();
char *uuarg[] = {"uucico", "-r1", "-x0", NULL, NULL};
extern int os9fork();
extern char **environ;
main(argc, argv)
int argc;
char *argv[];
{
struct passwd *pw;
queue = FALSE;
progarg = 0;
inpath = NULL;
if ((pw = getpwuid(getuid())) == NULL)
strcpy(UserName, "uucp");
else
strcpy(UserName, pw->pw_name);
for (i = 1; i < argc; i++)
if (argv[i][0] == '-') {
if (argv[i][1] == '\0')
inpath = "";
else
for (j = 1; j < strlen(argv[i]); j++)
switch (tolower(argv[i][j])) {
case '?':
usage();
exit(1);
case 'a':
j = strlen(argv[i]);
break; /* Hack */
strcpy(UserName, argv[i] + j + (argv[i][j + 1] == '=' ? 2 : 1));
j = strlen(argv[i]);
break;
case 's':
j = strlen(argv[i]); /* ignorieren */
break;
case 'r': /* Queuen! */
queue = TRUE;
break;
case 'd': /* Debug-Level */
case 'x':
debug = atoi(argv[i] + j + (argv[i][j + 1] == '=' ? 2 : 1));
j = strlen(argv[i]);
break;
case 'z': /* Eingabe kommt von? */
inpath = argv[i] + j + (argv[i][j + 1] == '=' ? 2 : 1);
j = strlen(argv[i]);
break;
case 'g':
grade_char = argv[i][++j];
break;
case 'b':
binfile = 1;
break;
default:
usage();
exit(_errmsg(1, "unknown option '%c'\n", argv[i][j]));
}
} else {
progarg = i;
break;
}
if (progarg == 0) /* Programmname angegeben (erstes Argument) */
exit(_errmsg(1, "no program\n"));
if (gethostname(HostName, 16 - 1) < 0)
exit(_errmsg(1, "No hostname\n"));
if ((pw = getpwname("uucp")) == NULL) {
exit(_errmsg(1, "Could not get uucp's uid"));
}
setuid((pw->pw_gid << 16) | pw->pw_uid);
if (!(ptr = index(argv[progarg], '!')))
exit(_errmsg(1, "no remote program given\n"));
*ptr = '\0';
strcpy(rmtname, argv[progarg]);
strcpy(rmtprog, ptr + 1);
if (CheckLegalName(rmtname) == FALSE)
exit(_errmsg(E_PNNF, "Unknown Host '%s'\n", rmtname));
if (chdir(SPOOLDIR) < 0 || (chdir(rmtname) < 0 &&
(makdir(rmtname, S_IFDIR, S_IFDIR | S_IREAD | S_IWRITE) < 0 ||
chdir(rmtname) < 0))) {
exit(_errmsg(errno, "Could not chdir to spool directory\n"));
}
if (inpath) {
sprintf(dfile, "D.%.7s%c%04x", rmtname, grade_char, getseq());
fdfile = creat(dfile, PERMS);
while ((i = read(0, tmp, sizeof tmp)) > 0) {
if (!binfile) {
for (j = 0; j < i; j++)
if (tmp[j] == '\n')
tmp[j] = '\l';
}
write(fdfile, tmp, i);
}
close(fdfile);
}
/* make the spool files for uucico */
sprintf(bfile, "B.%.7s%c%04x", HostName, grade_char, getseq);
mktemp(bfile);
fbfile = creat(bfile, PERMS);
sprintf(tmp, "U %s %s\l", UserName, HostName);
write(fbfile, tmp, strlen(tmp));
if (inpath) {
sprintf(tmp, "F %s\l", dfile);
write(fbfile, tmp, strlen(tmp));
}
rem_fnam_num = 0;
for (i = progarg + 1; i < argc; i++)
if (index(argv[i], '!') && argv[i][0] != '(') {
sprintf(tmp, "D.%s%c%.04x", rmtname, grade_char, getseq());
rem_fnames[rem_fnam_num] = malloc(strlen(tmp) + 1);
strcpy(rem_fnames[rem_fnam_num++], tmp);
cp = rindex(argv[i], '!') + 1;
if (rindex(cp, '/'))
cp = rindex(cp, '/') + 1;
sprintf(tmp2, "F %s %s\l", tmp, cp);
write(fbfile, tmp2, strlen(tmp2));
}
if (inpath) {
sprintf(tmp, "I %s\l", dfile);
write(fbfile, tmp, strlen(tmp));
}
j = 0;
sprintf(tmp, "C %s", rmtprog);
for (i = progarg + 1; i < argc; i++) {
strcat(tmp, " ");
if (index(argv[i], '!') && argv[i][0] != '(')
strcat(tmp, rem_fnames[j++]);
else {
strcpy(tmp2, argv[i]);
if (tmp2[0] == '(') {
tmp2[strlen(tmp2) - 1] = '\0'; /* ')' */
strcpy(tmp2, tmp2 + 1);
}
strcat(tmp, tmp2);
}
}
strcat(tmp, "\l");
write(fbfile, tmp, strlen(tmp));
close(fbfile);
sprintf(cfile, "C.%.7s%c%04x", rmtname, grade_char, getseq());
sprintf(xfile, "X.%.7s%c%04x", HostName, grade_char, getseq());
fcfile = creat(cfile, PERMS);
if (inpath) {
sprintf(tmp, "S %s %s %s - %s 0666\l", dfile, dfile, UserName, dfile);
write(fcfile, tmp, strlen(tmp));
}
j = 0;
for (i = 1; i < argc; i++) {
if (argv[i][0] == '-')
continue;
if (index(argv[i], '!') && argv[i][0] != '(') {
sprintf(tmp, "S %s %s %s - %s 0666\n",
rindex(argv[i], '!') + 1, rem_fnames[j], UserName,
rindex(argv[i], '!') + 1);
write(fcfile, tmp, strlen(tmp));
j++;
}
}
sprintf(tmp, "S %s %s %s - %s 0666\l", bfile, xfile, UserName, bfile);
write(fcfile, tmp, strlen(tmp));
close(fcfile);
/* Call uucico (in background) ... */
if (!queue) {
fclose(stdin);
fclose(stdout);
fclose(stderr);
open("/nil", S_IREAD); /* reopen std handles */
dup(0);
dup(0);
sprintf(tmp, "-s%s", rmtname);
uuarg[3] = tmp;
os9exec(os9fork, uuarg[0], uuarg, environ, 0, 0, 3);
}
}
/*
* Site-Namen ueberpruefen
*/
static int
CheckLegalName(name)
register char *name;
{
register FILE *fd;
char line[256], tmp[16], s_systems[150];
sprintf(s_systems, "%s/Systems", LIBDIR);
if ((fd = fopen(s_systems, "r")) == NULL)
return (FALSE);
while (fgets(line, sizeof line, fd) != NULL) {
sscanf(line, "%s ", tmp);
if (strncmp(name, tmp, 7) == 0) {
fclose(fd);
return (TRUE);
}
}
fclose(fd);
return (FALSE);
}
usage()
{
fputs("Syntax: uux [<opts>] <host>!<prog> [<args>]\n", stderr);
fputs("Function: UUCP Executive\n", stderr);
fputs("Options:\n", stderr);
fputs(" -a=<user name> user requesting the service\n", stderr);
fputs(" -b binary file transfer (default ascii)\n", stderr);
fputs(" -g<grade> specify grade\n", stderr);
fputs(" -r queue request\n", stderr);
fputs(" -d,-x=<level> debug level\n", stderr);
fputs(" -z input from standard input\n", stderr);
/* does not work
fputs(" -z=<path> input from <path>\n", stderr);
*/
}