smb_match.c revision da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or http://www.opensolaris.org/os/licensing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Use is subject to license terms.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#pragma ident "%Z%%M% %I% %E% SMI"
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#ifndef _KERNEL
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <stdlib.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <string.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <sys/types.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <sys/sunddi.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#endif
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/ctype.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * c Any non-special character matches itslef
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * ? Match any character
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * ab character 'a' followed by character 'b'
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * S Any string of non-special characters
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * AB String 'A' followed by string 'B'
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * * Any String, including the empty string
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_match(char *patn, char *str)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (;;) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (*patn) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 0:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (*str == 0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case '?':
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*str != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw str++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw patn++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*NOTREACHED*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#if 0
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case '[':
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int invert = 0, clower, cupper;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw patn++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*patn == '!') {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw invert = 1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw patn++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (;;) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw clower = *patn;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (clower == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (clower == ']') {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw patn++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw patn++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*patn == '-') {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* range */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw patn++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw cupper = *patn;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (cupper == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw patn++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw cupper = clower;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*str < clower || cupper < *str)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* match */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (invert)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (*patn && *patn++ != ']')
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw str++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue; /* THIS WON`T WORK */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (invert) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw str++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#endif
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case '*':
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw patn++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*patn == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#if 0
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*patn != '?' && *patn != '*' && *patn != '[') {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* accelerate */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (*str) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*str == *patn &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw match(patn+1, str+1))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw str++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#endif
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (*str) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (smb_match(patn, str))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw str++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw default:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*str != *patn)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw str++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw patn++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_match83(char *patn, char *str83)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int avail;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *ptr;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char name83[14];
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ptr = name83;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (avail = 8; (avail > 0) && (*patn != '.') && (*patn != 0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw avail--) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *(ptr++) = *(patn++);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (avail--)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *(ptr++) = ' ';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *(ptr++) = '.';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*patn == '.')
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw patn++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else if (*patn != 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (avail = 3; (avail > 0) && (*patn != 0); avail--) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *(ptr++) = *(patn++);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*patn != 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (avail--)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *(ptr++) = ' ';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *ptr = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (smb_match_ci(name83, str83));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_match_ci(char *patn, char *str)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * "<" is a special pattern that matches only those names that do
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * NOT have an extension. "." and ".." are ok.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (strcmp(patn, "<") == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((strcmp(str, ".") == 0) || (strcmp(str, "..") == 0))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (strchr(str, '.') == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (;;) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (*patn) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 0:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (*str == 0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case '?':
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*str != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw str++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw patn++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*NOTREACHED*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case '*':
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw patn++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*patn == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (*str) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (smb_match_ci(patn, str))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw str++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw default:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*str != *patn) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int c1 = *str;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int c2 = *patn;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw c1 = mts_tolower(c1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw c2 = mts_tolower(c2);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (c1 != c2)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw str++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw patn++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* NOT REACHED */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}