smb_match.c revision bbf6f00c25b6a2bed23c35eac6d62998ecdb338c
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
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 * CDDL HEADER END
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Use is subject to license terms.
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * Maximum recursion depth for the wildcard match functions.
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * These functions may recurse when processing a '*'.
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wrightstatic int smb_match_private(const char *, const char *, int *);
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wrightstatic int smb_match_ci_private(const char *, const char *, int *);
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * 0 no-match
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright if ((rc = smb_match_private(patn, str, &depth)) == -1)
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * The '*' character matches multiple characters.
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * The '?' character matches a single character.
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * If the pattern has trailing '?'s then it matches the specified number
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * of characters or less. For example, "x??" matches "xab", "xa" and "x",
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * but not "xabc".
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * 0 no-match
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * -1 no-match, too many wildcards in pattern
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wrightsmb_match_private(const char *patn, const char *str, int *depth)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (;;) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (*patn) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*str != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*NOTREACHED*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright return (-1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (*str) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright /*NOTREACHED*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else if (*patn != 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown for (avail = SMB_NAME83_EXTLEN; (avail > 0) && (*patn != 0); avail--) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*patn != 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * 0 no-match
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright if ((rc = smb_match_ci_private(patn, str, &depth)) == -1)
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * The '*' character matches multiple characters.
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * The '?' character matches a single character.
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * If the pattern has trailing '?'s then it matches the specified number
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * of characters or less. For example, "x??" matches "xab", "xa" and "x",
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * but not "xabc".
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * 0 no-match
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright * -1 no-match, too many wildcards in pattern
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wrightsmb_match_ci_private(const char *patn, const char *str, int *depth)
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown const char *p;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * "<" is a special pattern that matches only those names that do
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * NOT have an extension. "." and ".." are ok.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((strcmp(str, ".") == 0) || (strcmp(str, "..") == 0))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (;;) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (*patn) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*str != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*NOTREACHED*/
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (1);
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright return (-1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (*str) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown nbytes1 = smb_mbtowc(&wc1, patn, MTS_MB_CHAR_MAX);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown nbytes2 = smb_mbtowc(&wc2, str, MTS_MB_CHAR_MAX);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown return (-1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (0);
3a6c5f83d4cb79e49561f3fad2b016450f0e6fecAlan Wright /*NOTREACHED*/