Example #1
0
File: var.c Project: 0xffea/MINIX3
void
setvareq(char *s, int flags)
{
	struct var *vp, **vpp;
	int len;

	if (aflag)
		flags |= VEXPORT;
	vpp = hashvar(s);
	for (vp = *vpp ; vp ; vp = vp->next) {
		if (varequal(s, vp->text)) {
			if (vp->flags & VREADONLY) {
				len = strchr(s, '=') - s;
				error("%.*s: is read only", len, s);
			}
			INTOFF;

			if (vp->func && (flags & VNOFUNC) == 0)
				(*vp->func)(strchr(s, '=') + 1);

			if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0)
				ckfree(vp->text);

			vp->flags &= ~(VTEXTFIXED|VSTACK|VUNSET);
			vp->flags |= flags;
			vp->text = s;

			/*
			 * We could roll this to a function, to handle it as
			 * a regular variable function callback, but why bother?
			 */
			if (vp == &vmpath || (vp == &vmail && ! mpathset()))
				chkmail(1);
			if ((vp->flags & VEXPORT) && localevar(s)) {
				putenv(s);
				(void) setlocale(LC_ALL, "");
			}
			INTON;
			return;
		}
	}
	/* not found */
	vp = ckmalloc(sizeof (*vp));
	vp->flags = flags;
	vp->text = s;
	vp->next = *vpp;
	vp->func = NULL;
	INTOFF;
	*vpp = vp;
	if ((vp->flags & VEXPORT) && localevar(s)) {
		putenv(s);
		(void) setlocale(LC_ALL, "");
	}
	INTON;
}
Example #2
0
void
chkmail(void)
{
	const char *mpath;
	char *p;
	char *q;
	time_t *mtp;
	struct stackmark smark;
#ifdef WINDOWS
	struct stat statb;
#else
	struct stat64 statb;
#endif

	setstackmark(&smark);
	mpath = mpathset() ? mpathval() : mailval();
	for (mtp = mailtime; mtp < mailtime + MAXMBOXES; mtp++) {
		p = padvance(&mpath, nullstr);
		if (p == NULL)
			break;
		if (*p == '\0')
			continue;
		for (q = p ; *q ; q++);
#ifdef DEBUG
		if (q[-1] != '/')
			abort();
#endif
		q[-1] = '\0';			/* delete trailing '/' */
#ifdef WINDOWS
		if (stat(p, &statb) < 0) {
#else
		if (stat64(p, &statb) < 0) {
#endif
			*mtp = 0;
			continue;
		}
		if (!changed && statb.st_mtime != *mtp) {
			outfmt(
				&errout, snlfmt,
				pathopt ? pathopt : "you have mail"
			);
		}
		*mtp = statb.st_mtime;
	}
	changed = 0;
	popstackmark(&smark);
}


void
changemail(const char *val)
{
	changed++;
}
Example #3
0
File: var.c Project: dezelin/kBuild
void
setvareq(char *s, int flags)
{
	struct var *vp, **vpp;
	int nlen;

	if (aflag)
		flags |= VEXPORT;
	vp = find_var(s, &vpp, &nlen);
	if (vp != NULL) {
		if (vp->flags & VREADONLY)
			error("%.*s: is read only", vp->name_len, s);
		if (flags & VNOSET)
			return;
		INTOFF;

		if (vp->func && (flags & VNOFUNC) == 0)
			(*vp->func)(s + vp->name_len + 1);

		if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0)
			ckfree(vp->text);

		vp->flags &= ~(VTEXTFIXED|VSTACK|VUNSET);
		vp->flags |= flags & ~VNOFUNC;
		vp->text = s;
#ifdef PC_OS2_LIBPATHS
                if ((vp->flags & VOS2LIBPATH) && (vp->flags & VEXPORT))
                    vp->flags &= ~VEXPORT;
#endif

		/*
		 * We could roll this to a function, to handle it as
		 * a regular variable function callback, but why bother?
		 */
		if (vp == &vmpath || (vp == &vmail && ! mpathset()))
			chkmail(1);
		INTON;
		return;
	}
	/* not found */
	if (flags & VNOSET)
		return;
	vp = ckmalloc(sizeof (*vp));
	vp->flags = flags & ~VNOFUNC;
	vp->text = s;
	vp->name_len = nlen;
	vp->next = *vpp;
	vp->func = NULL;
	*vpp = vp;
}
Example #4
0
void
chkmail(int32_t silent)
{
	int32_t i;
	const_cstring_t mpath;
	cstring_t p;
	cstring_t q;
	struct stackmark smark;
	struct stat statb;
	if (silent)
		nmboxes = 10;
	if (nmboxes == 0)
		return;
	setstackmark(&smark);
	mpath = mpathset() ? mpathval() : mailval();
	for (i = 0 ; i < nmboxes ; i++)
	{
		p = padvance(&mpath, nullstr);
		if (p == NULL)
			break;
		if (*p == '\0')
			continue;
		for (q = p ; *q ; q++);
		if (q[-1] != '/')
			abort();
		q[-1] = '\0';			/* delete trailing '/' */
#ifdef notdef /* this is what the System V shell claims to do (it lies) */
		if (stat(p, &statb) < 0)
			statb.st_mtime = 0;
		if (statb.st_mtime > mailtime[i] && ! silent)
		{
			out2str(pathopt ? pathopt : "you have mail");
			out2c('\n');
		}
		mailtime[i] = statb.st_mtime;
#else /* this is what it should do */
		if (stat(p, &statb) < 0)
			statb.st_size = 0;
		if (statb.st_size > mailtime[i] && ! silent)
		{
			out2str(pathopt ? pathopt : "you have mail");
			out2c('\n');
		}
		mailtime[i] = statb.st_size;
#endif
	}
	nmboxes = i;
	popstackmark(&smark);
}
Example #5
0
File: var.c Project: dezelin/kBuild
void
setvareq(shinstance *psh, char *s, int flags)
{
    struct var *vp, **vpp;
    int nlen;

    if (aflag(psh))
        flags |= VEXPORT;
    vp = find_var(psh, s, &vpp, &nlen);
    if (vp != NULL) {
        if (vp->flags & VREADONLY)
            error(psh, "%.*s: is read only", vp->name_len, s);
        if (flags & VNOSET)
            return;
        INTOFF;

        if (vp->func && (flags & VNOFUNC) == 0)
            (*vp->func)(psh, s + vp->name_len + 1);

        if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0)
            ckfree(psh, vp->text);

        vp->flags &= ~(VTEXTFIXED|VSTACK|VUNSET);
        vp->flags |= flags & ~VNOFUNC;
        vp->text = s;
#ifdef PC_OS2_LIBPATHS
        if ((vp->flags & VOS2LIBPATH) && (vp->flags & VEXPORT))
            vp->flags &= ~VEXPORT;
#endif

        /*
         * We could roll this to a function, to handle it as
         * a regular variable function callback, but why bother?
         */
        if (vp == &psh->vmpath || (vp == &psh->vmail && ! mpathset(psh)))
            chkmail(psh, 1);
        INTON;
        return;
    }
    /* not found */
    if (flags & VNOSET)
        return;

#ifdef PC_MIXED_PATH_VAR_NAME
    if (   nlen == 4
            && (s[0] == 'p' || s[0] == 'P')
            && (s[1] == 'a' || s[1] == 'A')
            && (s[2] == 't' || s[2] == 'T')
            && (s[3] == 'h' || s[3] == 'H') ) {
        s[0] = 'P';
        s[1] = 'A';
        s[2] = 'T';
        s[3] = 'H';
    }
#endif

    vp = ckmalloc(psh, sizeof (*vp));
    vp->flags = flags & ~VNOFUNC;
    vp->text = s;
    vp->name_len = nlen;
    vp->next = *vpp;
    vp->func = NULL;
    *vpp = vp;
}