Quizzer
view release on metacpan or search on metacpan
exercises/compile-tcsh/tcsh-6.10.00/tc.func.c view on Meta::CPAN
case 'A':
STRmCF[3] = 'A';
break;
default:
break;
}
}
cmd.word = STRNULL;
lastword = &cmd;
nextword = (struct wordent *) xcalloc(1, sizeof cmd);
nextword->word = Strsave(lspath);
lastword->next = nextword;
nextword->prev = lastword;
lastword = nextword;
nextword = (struct wordent *) xcalloc(1, sizeof cmd);
nextword->word = Strsave(STRmCF);
lastword->next = nextword;
nextword->prev = lastword;
#if defined(KANJI) && defined(SHORT_STRINGS) && defined(DSPMBYTE)
if (dspmbyte_ls) {
lastword = nextword;
nextword = (struct wordent *) xcalloc(1, sizeof cmd);
nextword->word = Strsave(STRmmliteral);
lastword->next = nextword;
nextword->prev = lastword;
}
#endif
#ifdef COLOR_LS_F
if (color_context_ls) {
lastword = nextword;
nextword = (struct wordent *) xcalloc(1, sizeof cmd);
nextword->word = Strsave(STRmmcolormauto);
lastword->next = nextword;
nextword->prev = lastword;
}
#endif /* COLOR_LS_F */
lastword = nextword;
for (cp = *v; cp; cp = *++v) {
nextword = (struct wordent *) xcalloc(1, sizeof cmd);
nextword->word = Strsave(cp);
lastword->next = nextword;
nextword->prev = lastword;
lastword = nextword;
}
lastword->next = &cmd;
cmd.prev = lastword;
/* build a syntax tree for the command. */
t = syntax(cmd.next, &cmd, 0);
if (seterr)
stderror(ERR_OLD);
/* expand aliases like process() does */
/* alias(&cmd); */
/* execute the parse tree. */
execute(t, tpgrp > 0 ? tpgrp : -1, NULL, NULL);
/* done. free the lex list and parse tree. */
freelex(&cmd), freesyn(t);
if (setintr)
#ifdef BSDSIGS
(void) sigsetmask(omask);
#else /* !BSDSIGS */
(void) sigrelse(SIGINT);
#endif /* BSDSIGS */
}
else {
Char *dp, *tmp, buf[MAXPATHLEN];
for (k = 0, i = 0; v[k] != NULL; k++) {
tmp = dnormalize(v[k], symlinks == SYM_IGNORE);
dp = &tmp[Strlen(tmp) - 1];
if (*dp == '/' && dp != tmp)
#ifdef apollo
if (dp != &tmp[1])
#endif /* apollo */
*dp = '\0';
if (stat(short2str(tmp), &st) == -1) {
if (k != i) {
if (i != 0)
xputchar('\n');
print_by_column(STRNULL, &v[i], k - i, FALSE);
}
xprintf("%S: %s.\n", tmp, strerror(errno));
i = k + 1;
}
else if (S_ISDIR(st.st_mode)) {
Char *cp;
if (k != i) {
if (i != 0)
xputchar('\n');
print_by_column(STRNULL, &v[i], k - i, FALSE);
}
if (k != 0 && v[1] != NULL)
xputchar('\n');
xprintf("%S:\n", tmp);
for (cp = tmp, dp = buf; *cp; *dp++ = (*cp++ | QUOTE))
continue;
if (
#ifdef WINNT_NATIVE
(dp[-1] != (Char) (':' | QUOTE)) &&
#endif /* WINNT_NATIVE */
(dp[-1] != (Char) ('/' | QUOTE)))
*dp++ = '/';
else
dp[-1] &= TRIM;
*dp = '\0';
(void) t_search(buf, NULL, LIST, 0, TW_ZERO, 0, STRNULL, 0);
i = k + 1;
}
xfree((ptr_t) tmp);
}
if (k != i) {
if (i != 0)
xputchar('\n');
print_by_column(STRNULL, &v[i], k - i, FALSE);
}
}
if (gargv) {
blkfree(gargv);
exercises/compile-tcsh/tcsh-6.10.00/tc.func.c view on Meta::CPAN
else
cp = p; /* else we get all of it */
/* if we find either in the current name, fg it */
if (strncmp(ep, cp, (size_t) epl) == 0 ||
strncmp(vp, cp, (size_t) vpl) == 0) {
/*
* If there is a choice, then choose the current process if
* available, or the previous process otherwise, or else
* anything will do - Robert Webb (robertw@mulga.cs.mu.oz.au).
*/
if (pp == pcurrent)
return pp;
else if (retp == NULL || pp == pprevious)
retp = pp;
}
}
return retp; /* Will be NULL if we didn't find a job */
}
void
fg_proc_entry(pp)
register struct process *pp;
{
#ifdef BSDSIGS
sigmask_t omask;
#endif
jmp_buf_t osetexit;
bool ohaderr;
Char oGettingInput;
getexit(osetexit);
#ifdef BSDSIGS
omask = sigblock(sigmask(SIGINT));
#else
(void) sighold(SIGINT);
#endif
oGettingInput = GettingInput;
GettingInput = 0;
ohaderr = haderr; /* we need to ignore setting of haderr due to
* process getting stopped by a signal */
if (setexit() == 0) { /* come back here after pjwait */
pendjob();
(void) alarm(0); /* No autologout */
if (!pstart(pp, 1)) {
pp->p_procid = 0;
stderror(ERR_BADJOB, pp->p_command, strerror(errno));
}
pjwait(pp);
}
setalarm(1); /* Autologout back on */
resexit(osetexit);
haderr = ohaderr;
GettingInput = oGettingInput;
#ifdef BSDSIGS
(void) sigsetmask(omask);
#else /* !BSDSIGS */
(void) sigrelse(SIGINT);
#endif /* BSDSIGS */
}
static char *
xgetpass(prm)
char *prm;
{
static char pass[PASSMAX + 1];
int fd, i;
signalfun_t sigint;
sigint = (signalfun_t) sigset(SIGINT, SIG_IGN);
(void) Rawmode(); /* Make sure, cause we want echo off */
if ((fd = open("/dev/tty", O_RDWR)) == -1)
fd = SHIN;
xprintf("%s", prm); flush();
for (i = 0;;) {
if (read(fd, &pass[i], 1) < 1 || pass[i] == '\n')
break;
if (i < PASSMAX)
i++;
}
pass[i] = '\0';
if (fd != SHIN)
(void) close(fd);
(void) sigset(SIGINT, sigint);
return(pass);
}
/*
* Ask the user for his login password to continue working
* On systems that have a shadow password, this will only
* work for root, but what can we do?
*
* If we fail to get the password, then we log the user out
* immediately
*/
/*ARGSUSED*/
static void
auto_lock(n)
int n;
{
#ifndef NO_CRYPT
int i;
char *srpp = NULL;
struct passwd *pw;
#ifdef POSIX
extern char *crypt __P((const char *, const char *));
#else
extern char *crypt __P(());
#endif
#undef XCRYPT
#if defined(PW_AUTH) && !defined(XCRYPT)
struct authorization *apw;
extern char *crypt16 __P((const char *, const char *));
# define XCRYPT(a, b) crypt16(a, b)
if ((pw = getpwuid(euid)) != NULL && /* effective user passwd */
(apw = getauthuid(euid)) != NULL) /* enhanced ultrix passwd */
srpp = apw->a_password;
#endif /* PW_AUTH && !XCRYPT */
#if defined(PW_SHADOW) && !defined(XCRYPT)
struct spwd *spw;
# define XCRYPT(a, b) crypt(a, b)
if ((pw = getpwuid(euid)) != NULL && /* effective user passwd */
(spw = getspnam(pw->pw_name)) != NULL) /* shadowed passwd */
srpp = spw->sp_pwdp;
#endif /* PW_SHADOW && !XCRYPT */
#ifndef XCRYPT
#define XCRYPT(a, b) crypt(a, b)
#if !defined(__MVS__)
if ((pw = getpwuid(euid)) != NULL) /* effective user passwd */
srpp = pw->pw_passwd;
#endif /* !MVS */
#endif /* !XCRYPT */
if (srpp == NULL) {
auto_logout(0);
/*NOTREACHED*/
return;
}
setalarm(0); /* Not for locking any more */
#ifdef BSDSIGS
(void) sigsetmask(sigblock(0) & ~(sigmask(SIGALRM)));
#else /* !BSDSIGS */
(void) sigrelse(SIGALRM);
#endif /* BSDSIGS */
xputchar('\n');
for (i = 0; i < 5; i++) {
const char *crpp;
char *pp;
#ifdef AFS
char *afsname;
Char *safs;
if ((safs = varval(STRafsuser)) != STRNULL)
afsname = short2str(safs);
else
if ((afsname = getenv("AFSUSER")) == NULL)
afsname = pw->pw_name;
#endif
pp = xgetpass("Password:");
crpp = XCRYPT(pp, srpp);
if ((strcmp(crpp, srpp) == 0)
#ifdef AFS
|| (ka_UserAuthenticateGeneral(KA_USERAUTH_VERSION,
afsname, /* name */
NULL, /* instance */
NULL, /* realm */
pp, /* password */
0, /* lifetime */
0, 0, /* spare */
NULL) /* reason */
== 0)
#endif /* AFS */
) {
(void) memset(pp, 0, PASSMAX);
if (GettingInput && !just_signaled) {
(void) Rawmode();
ClearLines();
ClearDisp();
Refresh();
}
just_signaled = 0;
return;
}
xprintf(CGETS(22, 2, "\nIncorrect passwd for %s\n"), pw->pw_name);
}
#endif /* NO_CRYPT */
auto_logout(0);
USE(n);
}
static void
auto_logout(n)
int n;
{
USE(n);
xprintf("auto-logout\n");
/* Don't leave the tty in raw mode */
if (editing)
(void) Cookedmode();
(void) close(SHIN);
set(STRlogout, Strsave(STRautomatic), VAR_READWRITE);
child = 1;
#ifdef TESLA
do_logout = 1;
#endif /* TESLA */
GettingInput = FALSE; /* make flush() work to write hist files. Huber*/
goodbye(NULL, NULL);
}
sigret_t
/*ARGSUSED*/
alrmcatch(snum)
int snum;
{
#ifdef UNRELSIGS
if (snum)
(void) sigset(SIGALRM, alrmcatch);
#endif /* UNRELSIGS */
(*alm_fun)(0);
setalarm(1);
#ifndef SIGVOID
return (snum);
#endif /* !SIGVOID */
}
/*
* Karl Kleinpaste, 21oct1983.
* Added precmd(), which checks for the alias
* precmd in aliases. If it's there, the alias
* is executed as a command. This is done
* after mailchk() and just before print-
* ing the prompt. Useful for things like printing
* one's current directory just before each command.
*/
void
precmd()
{
#ifdef BSDSIGS
sigmask_t omask;
omask = sigblock(sigmask(SIGINT));
#else /* !BSDSIGS */
(void) sighold(SIGINT);
#endif /* BSDSIGS */
if (precmd_active) { /* an error must have been caught */
aliasrun(2, STRunalias, STRprecmd);
xprintf(CGETS(22, 3, "Faulty alias 'precmd' removed.\n"));
goto leave;
}
precmd_active = 1;
if (!whyles && adrof1(STRprecmd, &aliases))
aliasrun(1, STRprecmd, NULL);
leave:
precmd_active = 0;
#ifdef BSDSIGS
(void) sigsetmask(omask);
#else /* !BSDSIGS */
(void) sigrelse(SIGINT);
#endif /* BSDSIGS */
}
void
postcmd()
{
#ifdef BSDSIGS
sigmask_t omask;
omask = sigblock(sigmask(SIGINT));
#else /* !BSDSIGS */
(void) sighold(SIGINT);
#endif /* BSDSIGS */
if (postcmd_active) { /* an error must have been caught */
aliasrun(2, STRunalias, STRpostcmd);
xprintf(CGETS(22, 3, "Faulty alias 'postcmd' removed.\n"));
goto leave;
}
postcmd_active = 1;
if (!whyles && adrof1(STRpostcmd, &aliases))
aliasrun(1, STRpostcmd, NULL);
leave:
postcmd_active = 0;
#ifdef BSDSIGS
(void) sigsetmask(omask);
#else /* !BSDSIGS */
(void) sigrelse(SIGINT);
#endif /* BSDSIGS */
}
/*
* Paul Placeway 11/24/87 Added cwd_cmd by hacking precmd() into
* submission... Run every time $cwd is set (after it is set). Useful
* for putting your machine and cwd (or anything else) in an xterm title
* space.
*/
void
cwd_cmd()
{
#ifdef BSDSIGS
sigmask_t omask;
omask = sigblock(sigmask(SIGINT));
#else /* !BSDSIGS */
(void) sighold(SIGINT);
#endif /* BSDSIGS */
if (cwdcmd_active) { /* an error must have been caught */
aliasrun(2, STRunalias, STRcwdcmd);
xprintf(CGETS(22, 4, "Faulty alias 'cwdcmd' removed.\n"));
goto leave;
}
cwdcmd_active = 1;
if (!whyles && adrof1(STRcwdcmd, &aliases))
aliasrun(1, STRcwdcmd, NULL);
leave:
cwdcmd_active = 0;
#ifdef BSDSIGS
(void) sigsetmask(omask);
#else /* !BSDSIGS */
(void) sigrelse(SIGINT);
#endif /* BSDSIGS */
}
/*
* Joachim Hoenig 07/16/91 Added beep_cmd, run every time tcsh wishes
* to beep the terminal bell. Useful for playing nice sounds instead.
*/
void
beep_cmd()
{
#ifdef BSDSIGS
sigmask_t omask;
omask = sigblock(sigmask(SIGINT));
#else /* !BSDSIGS */
(void) sighold(SIGINT);
#endif /* BSDSIGS */
if (beepcmd_active) { /* an error must have been caught */
aliasrun(2, STRunalias, STRbeepcmd);
xprintf(CGETS(22, 5, "Faulty alias 'beepcmd' removed.\n"));
}
else {
beepcmd_active = 1;
if (!whyles && adrof1(STRbeepcmd, &aliases))
aliasrun(1, STRbeepcmd, NULL);
}
beepcmd_active = 0;
#ifdef BSDSIGS
(void) sigsetmask(omask);
#else /* !BSDSIGS */
(void) sigrelse(SIGINT);
#endif /* BSDSIGS */
}
/*
* Karl Kleinpaste, 18 Jan 1984.
* Added period_cmd(), which executes the alias "periodic" every
* $tperiod minutes. Useful for occasional checking of msgs and such.
*/
void
period_cmd()
{
register Char *vp;
time_t t, interval;
#ifdef BSDSIGS
sigmask_t omask;
omask = sigblock(sigmask(SIGINT));
#else /* !BSDSIGS */
(void) sighold(SIGINT);
#endif /* BSDSIGS */
if (periodic_active) { /* an error must have been caught */
aliasrun(2, STRunalias, STRperiodic);
xprintf(CGETS(22, 6, "Faulty alias 'periodic' removed.\n"));
goto leave;
}
periodic_active = 1;
if (!whyles && adrof1(STRperiodic, &aliases)) {
vp = varval(STRtperiod);
if (vp == STRNULL) {
aliasrun(1, STRperiodic, NULL);
goto leave;
}
interval = getn(vp);
(void) time(&t);
if (t - t_period >= interval * 60) {
t_period = t;
aliasrun(1, STRperiodic, NULL);
}
}
leave:
periodic_active = 0;
#ifdef BSDSIGS
(void) sigsetmask(omask);
#else /* !BSDSIGS */
(void) sigrelse(SIGINT);
#endif /* BSDSIGS */
}
/*
* Karl Kleinpaste, 21oct1983.
* Set up a one-word alias command, for use for special things.
* This code is based on the mainline of process().
*/
void
aliasrun(cnt, s1, s2)
int cnt;
Char *s1, *s2;
{
struct wordent w, *new1, *new2; /* for holding alias name */
struct command *t = NULL;
jmp_buf_t osetexit;
int status;
getexit(osetexit);
if (seterr) {
xfree((ptr_t) seterr);
seterr = NULL; /* don't repeatedly print err msg. */
}
w.word = STRNULL;
new1 = (struct wordent *) xcalloc(1, sizeof w);
new1->word = Strsave(s1);
if (cnt == 1) {
/* build a lex list with one word. */
w.next = w.prev = new1;
new1->next = new1->prev = &w;
}
else {
/* build a lex list with two words. */
new2 = (struct wordent *) xcalloc(1, sizeof w);
new2->word = Strsave(s2);
w.next = new2->prev = new1;
new1->next = w.prev = new2;
new1->prev = new2->next = &w;
}
/* Save the old status */
status = getn(varval(STRstatus));
/* expand aliases like process() does. */
alias(&w);
/* build a syntax tree for the command. */
t = syntax(w.next, &w, 0);
if (seterr)
stderror(ERR_OLD);
psavejob();
/* catch any errors here */
if (setexit() == 0)
/* execute the parse tree. */
/*
* From: Michael Schroeder <mlschroe@immd4.informatik.uni-erlangen.de>
( run in 4.076 seconds using v1.01-cache-2.11-cpan-a5162978ef8 )