xref: /freebsd/sys/cam/cam.c (revision 8b8a9b1d3e23a478005449b274bc6cb70bc4900b)
18b8a9b1dSJustin T. Gibbs /*
28b8a9b1dSJustin T. Gibbs  * Generic utility routines for the Common Access Method layer.
38b8a9b1dSJustin T. Gibbs  *
48b8a9b1dSJustin T. Gibbs  * Copyright (c) 1997 Justin T. Gibbs.
58b8a9b1dSJustin T. Gibbs  * All rights reserved.
68b8a9b1dSJustin T. Gibbs  *
78b8a9b1dSJustin T. Gibbs  * Redistribution and use in source and binary forms, with or without
88b8a9b1dSJustin T. Gibbs  * modification, are permitted provided that the following conditions
98b8a9b1dSJustin T. Gibbs  * are met:
108b8a9b1dSJustin T. Gibbs  * 1. Redistributions of source code must retain the above copyright
118b8a9b1dSJustin T. Gibbs  *    notice, this list of conditions, and the following disclaimer,
128b8a9b1dSJustin T. Gibbs  *    without modification, immediately at the beginning of the file.
138b8a9b1dSJustin T. Gibbs  * 2. The name of the author may not be used to endorse or promote products
148b8a9b1dSJustin T. Gibbs  *    derived from this software without specific prior written permission.
158b8a9b1dSJustin T. Gibbs  *
168b8a9b1dSJustin T. Gibbs  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
178b8a9b1dSJustin T. Gibbs  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
188b8a9b1dSJustin T. Gibbs  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
198b8a9b1dSJustin T. Gibbs  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
208b8a9b1dSJustin T. Gibbs  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
218b8a9b1dSJustin T. Gibbs  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
228b8a9b1dSJustin T. Gibbs  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
238b8a9b1dSJustin T. Gibbs  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
248b8a9b1dSJustin T. Gibbs  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
258b8a9b1dSJustin T. Gibbs  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
268b8a9b1dSJustin T. Gibbs  * SUCH DAMAGE.
278b8a9b1dSJustin T. Gibbs  *
288b8a9b1dSJustin T. Gibbs  *      $Id$
298b8a9b1dSJustin T. Gibbs  */
308b8a9b1dSJustin T. Gibbs #include <sys/param.h>
318b8a9b1dSJustin T. Gibbs 
328b8a9b1dSJustin T. Gibbs #include <cam/cam.h>
338b8a9b1dSJustin T. Gibbs 
348b8a9b1dSJustin T. Gibbs void
358b8a9b1dSJustin T. Gibbs cam_strvis(u_int8_t *dst, const u_int8_t *src, int srclen, int dstlen)
368b8a9b1dSJustin T. Gibbs {
378b8a9b1dSJustin T. Gibbs 
388b8a9b1dSJustin T. Gibbs 	/* Trim leading/trailing spaces. */
398b8a9b1dSJustin T. Gibbs 	while (srclen > 0 && src[0] == ' ')
408b8a9b1dSJustin T. Gibbs 		src++, srclen--;
418b8a9b1dSJustin T. Gibbs 	while (srclen > 0 && src[srclen-1] == ' ')
428b8a9b1dSJustin T. Gibbs 		srclen--;
438b8a9b1dSJustin T. Gibbs 
448b8a9b1dSJustin T. Gibbs 	while (srclen > 0 && dstlen > 1) {
458b8a9b1dSJustin T. Gibbs 		u_int8_t *cur_pos = dst;
468b8a9b1dSJustin T. Gibbs 
478b8a9b1dSJustin T. Gibbs 		if (*src < 0x20 || *src >= 0x80) {
488b8a9b1dSJustin T. Gibbs 			/* SCSI-II Specifies that these should never occur. */
498b8a9b1dSJustin T. Gibbs 			/* non-printable character */
508b8a9b1dSJustin T. Gibbs 			if (dstlen > 4) {
518b8a9b1dSJustin T. Gibbs 				*cur_pos++ = '\\';
528b8a9b1dSJustin T. Gibbs 				*cur_pos++ = ((*src & 0300) >> 6) + '0';
538b8a9b1dSJustin T. Gibbs 				*cur_pos++ = ((*src & 0070) >> 3) + '0';
548b8a9b1dSJustin T. Gibbs 				*cur_pos++ = ((*src & 0007) >> 0) + '0';
558b8a9b1dSJustin T. Gibbs 			} else {
568b8a9b1dSJustin T. Gibbs 				*cur_pos++ = '?';
578b8a9b1dSJustin T. Gibbs 			}
588b8a9b1dSJustin T. Gibbs 		} else {
598b8a9b1dSJustin T. Gibbs 			/* normal character */
608b8a9b1dSJustin T. Gibbs 			*cur_pos++ = *src;
618b8a9b1dSJustin T. Gibbs 		}
628b8a9b1dSJustin T. Gibbs 		src++;
638b8a9b1dSJustin T. Gibbs 		srclen--;
648b8a9b1dSJustin T. Gibbs 		dstlen -= cur_pos - dst;
658b8a9b1dSJustin T. Gibbs 		dst = cur_pos;
668b8a9b1dSJustin T. Gibbs 	}
678b8a9b1dSJustin T. Gibbs 	*dst = '\0';
688b8a9b1dSJustin T. Gibbs }
698b8a9b1dSJustin T. Gibbs 
708b8a9b1dSJustin T. Gibbs /*
718b8a9b1dSJustin T. Gibbs  * Compare string with pattern, returning 0 on match.
728b8a9b1dSJustin T. Gibbs  * Short pattern matches trailing blanks in name,
738b8a9b1dSJustin T. Gibbs  * wildcard '*' in pattern matches rest of name,
748b8a9b1dSJustin T. Gibbs  * wildcard '?' matches a single non-space character.
758b8a9b1dSJustin T. Gibbs  */
768b8a9b1dSJustin T. Gibbs int
778b8a9b1dSJustin T. Gibbs cam_strmatch(const u_int8_t *str, const u_int8_t *pattern, int str_len)
788b8a9b1dSJustin T. Gibbs {
798b8a9b1dSJustin T. Gibbs 
808b8a9b1dSJustin T. Gibbs 	while (*pattern != '\0'&& str_len > 0) {
818b8a9b1dSJustin T. Gibbs 
828b8a9b1dSJustin T. Gibbs 		if (*pattern == '*') {
838b8a9b1dSJustin T. Gibbs 			return (0);
848b8a9b1dSJustin T. Gibbs 		}
858b8a9b1dSJustin T. Gibbs 		if ((*pattern != *str)
868b8a9b1dSJustin T. Gibbs 		 && (*pattern != '?' || *str == ' ')) {
878b8a9b1dSJustin T. Gibbs 			return (1);
888b8a9b1dSJustin T. Gibbs 		}
898b8a9b1dSJustin T. Gibbs 		pattern++;
908b8a9b1dSJustin T. Gibbs 		str++;
918b8a9b1dSJustin T. Gibbs 		str_len--;
928b8a9b1dSJustin T. Gibbs 	}
938b8a9b1dSJustin T. Gibbs 	while (str_len > 0 && *str++ == ' ')
948b8a9b1dSJustin T. Gibbs 		str_len--;
958b8a9b1dSJustin T. Gibbs 
968b8a9b1dSJustin T. Gibbs 	return (str_len);
978b8a9b1dSJustin T. Gibbs }
988b8a9b1dSJustin T. Gibbs 
998b8a9b1dSJustin T. Gibbs caddr_t
1008b8a9b1dSJustin T. Gibbs cam_quirkmatch(caddr_t target, caddr_t quirk_table, int num_entries,
1018b8a9b1dSJustin T. Gibbs 	       int entry_size, cam_quirkmatch_t *comp_func)
1028b8a9b1dSJustin T. Gibbs {
1038b8a9b1dSJustin T. Gibbs 	for (; num_entries > 0; num_entries--, quirk_table += entry_size) {
1048b8a9b1dSJustin T. Gibbs 		if ((*comp_func)(target, quirk_table) == 0)
1058b8a9b1dSJustin T. Gibbs 			return (quirk_table);
1068b8a9b1dSJustin T. Gibbs 	}
1078b8a9b1dSJustin T. Gibbs 	return (NULL);
1088b8a9b1dSJustin T. Gibbs }
109