コード例 #1
0
ファイル: readconfig.c プロジェクト: ajwans/cyrus-imapd
/*
**  Set the expiration fields for all groups that match this pattern.
*/
STATIC void EXPmatch(char *p, NEWSGROUP *v, char mod)
{
    NEWSGROUP	        *ngp;
    int	                i;
    BOOL	        negate;

    negate = *p == '!';
    if (negate)
	p++;
    for (ngp = Groups, i = nGroups; --i >= 0; ngp++)
    {
	if (negate ? !wildmat(ngp->Name, p) : wildmat(ngp->Name, p))
	    if (mod == 'a') {
		/*|| (mod == 'm' && ngp->Rest[0] == NF_FLAG_MODERATED)
		  || (mod == 'u' && ngp->Rest[0] != NF_FLAG_MODERATED)) { */
		ngp->Keep      = v->Keep;
		ngp->Default   = v->Default;
		ngp->Purge     = v->Purge;
		ngp->Poison    = v->Poison;
		if (EXPverbose > 4) {
		    (void)printf("%s", ngp->Name);
		    (void)printf(" %13.13s", ctime(&v->Keep) + 3);
		    (void)printf(" %13.13s", ctime(&v->Default) + 3);
		    (void)printf(" %13.13s", ctime(&v->Purge) + 3);
		    (void)printf(" (%s)\n", p);
		}
	    }
    }
}
コード例 #2
0
ファイル: wildmat.c プロジェクト: ajwans/cyrus-imapd
int
main()
{
    char	 p[80];
    char	 text[80];

    printf("Wildmat tester.  Enter pattern, then strings to test.\n");
    printf("A blank line gets prompts for a new pattern; a blank pattern\n");
    printf("exits the program.\n");

    for ( ; ; ) {
	printf("\nEnter pattern:  ");
	(void)fflush(stdout);
	if (gets(p) == NULL || p[0] == '\0')
	    break;
	for ( ; ; ) {
	    printf("Enter text:  ");
	    (void)fflush(stdout);
	    if (gets(text) == NULL)
		exit(0);
	    if (text[0] == '\0')
		/* Blank line; go back and get a new pattern. */
		break;
	    printf("      %s\n", wildmat(text, p) ? "YES" : "NO");
	}
    }

    exit(0);
    /* NOTREACHED */
}
コード例 #3
0
ファイル: serv_nntp.c プロジェクト: mingodad/citadel
//
// Output a room name (newsgroup name) in formats required for LIST and NEWGROUPS command
//
void output_roomname_in_list_format(struct ctdlroom *qrbuf, int which_format, char *wildmat_pattern) {
	char n_name[1024];
	struct nntp_msglist nm;
	long low_water_mark = 0;
	long high_water_mark = 0;

	room_to_newsgroup(n_name, qrbuf->QRname, sizeof n_name);

	if ((wildmat_pattern != NULL) && (!IsEmptyStr(wildmat_pattern))) {
		if (!wildmat(n_name, wildmat_pattern)) {
			return;
		}
	}

	nm = nntp_fetch_msglist(qrbuf);
	if ((nm.num_msgs > 0) && (nm.msgnums != NULL)) {
		low_water_mark = nm.msgnums[0];
		high_water_mark = nm.msgnums[nm.num_msgs - 1];
	}

	// Only the mandatory formats are supported
	switch(which_format) {
	case NNTP_LIST_ACTIVE:
		// FIXME we have hardcoded "n" for "no posting allowed" -- fix when we add posting
		cprintf("%s %ld %ld n\r\n", n_name, high_water_mark, low_water_mark);
		break;
	case NNTP_LIST_NEWSGROUPS:
		cprintf("%s %s\r\n", n_name, qrbuf->QRname);
		break;
	}

	if (nm.msgnums != NULL) {
		free(nm.msgnums);
	}
}
コード例 #4
0
ファイル: file.c プロジェクト: Distrotech/minicom
static int tag_untag(char *pat, int tag)
{
  GETSDIR_ENTRY *d = global_dirdat;
  int indxr, cntr;

  if (nrents < 1)
    return 0;

  for (indxr = nrents, cntr = 0; indxr; --indxr, ++d)
    if (S_ISREG(d->mode) && wildmat(d->fname, pat)) {
      if (tag) {
        d->cflags |= FL_TAG;
        ++cntr;
      } else if (d->cflags & FL_TAG) {
        d->cflags &= ~FL_TAG;
        ++cntr;
      }
    }

  return cntr;
}
コード例 #5
0
ファイル: userdeny_db.c プロジェクト: cyberpear/cyrus-imapd
/*
 * userdeny() checks to see if 'user' is denied access to 'service'
 * Returns 1 if a matching deny entry exists in DB, otherwise returns 0.
 */
EXPORTED int userdeny(const char *user, const char *service, char *msgbuf, size_t bufsiz)
{
    int r, ret = 0; /* allow access by default */
    const char *data = NULL;
    size_t datalen;
    struct buf buf = BUF_INITIALIZER;
    char *wild = NULL;
    const char *msg = NULL;
    tok_t tok;
    char *pat;
    int not;

    if (!denydb) denydb_open(/*create*/0);
    if (!denydb) return 0;

    memset(&tok, 0, sizeof(tok));

    /* fetch entry for user */
    syslog(LOG_DEBUG, "fetching user_deny.db entry for '%s'", user);
    do {
	r = cyrusdb_fetch(denydb, user, strlen(user), &data, &datalen, NULL);
    } while (r == CYRUSDB_AGAIN);

    /* XXX  Should we try to reopen the DB if we get IOERROR?
	    This might be necessary when using SQL backend
	    and we lose the connection.
    */

    if (r || !data || !datalen) {
	/* ignore non-existent/empty entry, report all other errors */
	if (r != CYRUSDB_NOTFOUND) {
	    syslog(LOG_WARNING,
		   "DENYDB_ERROR: error reading entry '%s': %s",
		   user, cyrusdb_strerror(r));
	}
	goto out;
    }
    buf_init_ro(&buf, data, datalen);

	/* parse the data */
    r = parse_record(&buf, &wild, &msg);
    if (r) {
	syslog(LOG_WARNING,
	       "DENYDB_ERROR: invalid entry for '%s'", user);
	goto out;
    }

    /* scan wildmat right to left for a match against our service */
    syslog(LOG_DEBUG, "wild: '%s'   service: '%s'", wild, service);
    tok_initm(&tok, wild, ",", 0);
    while ((pat = tok_next(&tok))) {
	/* XXX  trim leading & trailing whitespace? */

	/* is it a negated pattern? */
	not = (*pat == '!');
	if (not) ++pat;

	syslog(LOG_DEBUG, "pat %d:'%s'", not, pat);

	/* see if pattern matches our service */
	if (wildmat(service, pat)) {
	    /* match ==> we're done */
	    ret = !not;
	    if (msgbuf) strlcpy(msgbuf, msg, bufsiz);
	    break;
	}
    }

out:
    tok_fini(&tok);
    buf_free(&buf);
    return ret;
}
コード例 #6
0
ファイル: neo_files.c プロジェクト: dj5qv/mhuxd
static int _glob_match(void *rock, const char *filename)
{
  return wildmat(filename, rock);
}
コード例 #7
0
ファイル: userdeny_db.c プロジェクト: ajwans/cyrus-imapd
/*
 * userdeny() checks to see if 'user' is denied access to 'service'
 * Returns 1 if a matching deny entry exists in DB, otherwise returns 0.
 */
int userdeny(const char *user, const char *service, char *msgbuf, size_t bufsiz)
{
    int r, ret = 0; /* allow access by default */
    const char *data = NULL;
    int datalen;

    if (!deny_dbopen) return 0;

    /* fetch entry for user */
    syslog(LOG_DEBUG, "fetching user_deny.db entry for '%s'", user);
    do {
	r = DENYDB->fetch(denydb, user, strlen(user), &data, &datalen, NULL);
    } while (r == CYRUSDB_AGAIN);

    /* XXX  Should we try to reopen the DB if we get IOERROR?
            This might be necessary when using SQL backend
	    and we lose the connection.
    */

    if (r || !data || !datalen) {
	/* ignore non-existent/empty entry, report all other errors */
	if (r != CYRUSDB_NOTFOUND) {
	    syslog(LOG_WARNING,
		   "DENYDB_ERROR: error reading entry '%s': %s",
		   user, cyrusdb_strerror(r));
	}
    } else {
	/* parse the data */
	char *buf, *wild;
	unsigned long version;

	buf = xstrndup(data, datalen);  /* use a working copy */

	/* check version */
	if (((version = strtoul(buf, &wild, 10)) < 1) ||
	    (version > USERDENY_VERSION)) {
	    syslog(LOG_WARNING,
		   "DENYDB_ERROR: invalid version for entry '%s': %lu",
		   user, version);
	} else if (*wild++ != '\t') {
	    syslog(LOG_WARNING,
		   "DENYDB_ERROR: missing wildmat for entry '%s'", user);
	} else {
	    char *pat, *msg = "Access to this service has been blocked";
	    int not;

	    /* check if we have a deny message */
	    switch (version) {
	    case USERDENY_VERSION:
		if ((msg = strchr(wild, '\t'))) *msg++ = '\0';
		break;
	    }

	    /* scan wildmat right to left for a match against our service */
	    syslog(LOG_DEBUG, "wild: '%s'   service: '%s'", wild, service);
	    do {
		/* isolate next pattern */
		if ((pat = strrchr(wild, ','))) {
		    *pat++ = '\0';
		} else {
		    pat = wild;
		}

		/* XXX  trim leading & trailing whitespace? */

		/* is it a negated pattern? */
		not = (*pat == '!');
		if (not) ++pat;

		syslog(LOG_DEBUG, "pat %d:'%s'", not, pat);

		/* see if pattern matches our service */
		if (wildmat(service, pat)) {
		    /* match ==> we're done */
		    ret = !not;
		    if (msgbuf) strlcpy(msgbuf, msg, bufsiz);
		    break;
		}

		/* continue until we reach head of wildmat */
	    } while (pat != wild);
	}

	free(buf);
    }

    return ret;
}
コード例 #8
0
ファイル: msgid.c プロジェクト: oldprogs/fidogate
/*
 * Convert FIDO ^AMSGID/REPLY to RFC Message-ID/References
 */
char *s_msgid_fido_to_rfc(char *msgid, int *pzone)
{
    char *save;
    char *origaddr, *serialno;
    char *p, *s;
    Node idnode;
    int zone;
    TmpS *tmps;

    save = strsave(msgid);
    
    /*
     * Retrieve `origaddr' part
     */
    if(*save == '\"')					/* " */
    {
	/*
	 * Quoted: "abc""def" -> abc"def
	 */
	origaddr = save;
	p = save;
	s = save+1;
	while(*s)
	{
	    if(*s == '\"')				/* " */
	    {
		if(*(s+1) == '\"')			/* " */
		    s++;
		else
		    break;
	    }
	    *p++ = *s++;
	}
	if(*s == '\"')					/* " */
	    s++;
	while(*s && is_space(*s))
	    s++;
	*p = 0;
	serialno = s;
    }
    else
    {
	/*
	 * Not quoted
	 */
	origaddr = save;
	for(p=save; *p && !is_space(*p); p++) ;
	s = p;
	while(*s && is_space(*s))
	    s++;
	*p = 0;
	serialno = s;
    }

    /*
     * Retrieve `serialno' part
     */
    for(p=serialno; *p && !is_space(*p); p++) ;
    *p = 0;
    

    /***** New-style converted RFC Message-ID *****/
    if(wildmat(origaddr, "<*@*>"))
    {
	tmps = tmps_copy(origaddr);
	xfree(save);
	if(pzone)
	    *pzone = -2;
	return tmps->s;
    }
    

    /***** FTN-style *****/

    /*
     * Search for parsable FTN address in origaddr
     */
    for(p=origaddr; *p && !is_digit(*p); p++) ;
    for(s=p; *s && (is_digit(*s) || *s==':' || *s=='/' || *s=='.'); s++) ;
    *s = 0;
    if(asc_to_node(p, &idnode, TRUE) != ERROR)	/* Address found */
    {
	zone = idnode.zone;
	if(pzone)
	    *pzone = zone;
    }
    else
    {
	zone = cf_zone();
	if(pzone)
	    *pzone = -1;
    }
    
    /*
     * New-style FTN Message-IDs using MIME quoted-printable
     */
    tmps = tmps_alloc(2*MAXINETADDR);
    
    str_copy(tmps->s, tmps->len, "<MSGID_");
    msgid_mime_quote(tmps->s + strlen(tmps->s), msgid,
		     tmps->len - strlen(tmps->s));
    str_append(tmps->s, tmps->len, "@");
    str_append(tmps->s, tmps->len, msgid_domain(zone));
    str_append(tmps->s, tmps->len, ">");
    
    xfree(save);
    return tmps->s;
}