17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 55aefb655Srie * Common Development and Distribution License (the "License"). 65aefb655Srie * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 215aefb655Srie 227c478bd9Sstevel@tonic-gate /* 234f680cc6SAli Bahrami * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate #include <stdio.h> 285aefb655Srie #include <strings.h> 29ba2be530Sab196087 #include <_machelf.h> 305aefb655Srie #include "_conv.h" 317c478bd9Sstevel@tonic-gate #include "globals_msg.h" 327c478bd9Sstevel@tonic-gate 33c13de8f6Sab196087 34c13de8f6Sab196087 /* 354f680cc6SAli Bahrami * Map an integer into a descriptive string. 36c13de8f6Sab196087 * 37c13de8f6Sab196087 * entry: 384f680cc6SAli Bahrami * inv_buf - A buffer into which this routine can format 394f680cc6SAli Bahrami * a result string, if necessary. 404f680cc6SAli Bahrami * val - The value for which a string is desired. 414f680cc6SAli Bahrami * flags - CONV_FMT_* values to be passed to conv_invalid_val() if 424f680cc6SAli Bahrami * necessary. The caller is reponsible for having examined 434f680cc6SAli Bahrami * the CONV_FMT_ALT_* part of flags and passing the proper 444f680cc6SAli Bahrami * msg array. 454f680cc6SAli Bahrami * num_msg - # of Msg entries in msg. 464f680cc6SAli Bahrami * msg - Array of num_msg Msg items corresponding to the possible 474f680cc6SAli Bahrami * strings corresponding to val. 484f680cc6SAli Bahrami * local_sgs_msg - Message string table from module from which 494f680cc6SAli Bahrami * this function is called. 50c13de8f6Sab196087 * 51c13de8f6Sab196087 * exit: 524f680cc6SAli Bahrami * If val lies in the range [0-(num_msg-1)], then the string 534f680cc6SAli Bahrami * corresponding to it is returned. If val is outside the range, 544f680cc6SAli Bahrami * conv_invalid_val() is called to format an ASCII representation 554f680cc6SAli Bahrami * of it into inv_buf, and that is returned. 564f680cc6SAli Bahrami */ 574f680cc6SAli Bahrami /*ARGSUSED5*/ 584f680cc6SAli Bahrami static const char * 594f680cc6SAli Bahrami map_msg2str(Conv_inv_buf_t *inv_buf, Conv_elfvalue_t val, 604f680cc6SAli Bahrami Conv_fmt_flags_t flags, size_t num_msg, const Msg *msg, 614f680cc6SAli Bahrami const char *local_sgs_msg) 624f680cc6SAli Bahrami { 634f680cc6SAli Bahrami if ((val < num_msg) && (msg[val] != 0)) 644f680cc6SAli Bahrami return (MSG_ORIG_STRTAB(msg[val], local_sgs_msg)); 654f680cc6SAli Bahrami 664f680cc6SAli Bahrami /* If we get here, it's an unknown value */ 674f680cc6SAli Bahrami return (conv_invalid_val(inv_buf, val, flags)); 684f680cc6SAli Bahrami } 694f680cc6SAli Bahrami 704f680cc6SAli Bahrami /* 714f680cc6SAli Bahrami * Map an integer into a descriptive string from a NULL terminated 724f680cc6SAli Bahrami * array of Val_desc or Val_desc2 descriptors. 734f680cc6SAli Bahrami * 744f680cc6SAli Bahrami * entry: 754f680cc6SAli Bahrami * inv_buf - A buffer into which this routine can format 764f680cc6SAli Bahrami * a result string, if necessary. 774f680cc6SAli Bahrami * osabi,mach (_conv_vd22str only) - The osab/mach under which 784f680cc6SAli Bahrami * val is to be interpreted. Items with a non-0 osabi or machine 794f680cc6SAli Bahrami * that do not match are quietly ignored. 804f680cc6SAli Bahrami * val - The value for which a string is desired. 814f680cc6SAli Bahrami * flags - CONV_FMT_* values to be passed to conv_invalid_val() if 824f680cc6SAli Bahrami * necessary. The caller is reponsible for having examined 834f680cc6SAli Bahrami * the CONV_FMT_ALT_* part of flags and passing the proper 844f680cc6SAli Bahrami * descriptor array. 854f680cc6SAli Bahrami * vdp - Pointer to NULL terminated array of Val_desc descriptors. 864f680cc6SAli Bahrami * local_sgs_msg - Message string table from module from which 874f680cc6SAli Bahrami * this function is called. 884f680cc6SAli Bahrami * 894f680cc6SAli Bahrami * exit: 904f680cc6SAli Bahrami * If val is found in the vdp array, and in the osabi version of 914f680cc6SAli Bahrami * this function if the osabi matches, then the string corresponding 924f680cc6SAli Bahrami * val is returned. If a string for val is not found, conv_invalid_val() 934f680cc6SAli Bahrami * is called to format an ASCII representation of it into inv_buf, and 944f680cc6SAli Bahrami * that is returned. 954f680cc6SAli Bahrami */ 964f680cc6SAli Bahrami /*ARGSUSED4*/ 974f680cc6SAli Bahrami static const char * 984f680cc6SAli Bahrami map_vd2str(Conv_inv_buf_t *inv_buf, Conv_elfvalue_t val, 994f680cc6SAli Bahrami Conv_fmt_flags_t flags, const Val_desc *vdp, const char *local_sgs_msg) 1004f680cc6SAli Bahrami { 1014f680cc6SAli Bahrami for (; vdp->v_msg; vdp++) { 1024f680cc6SAli Bahrami if (val == vdp->v_val) 1034f680cc6SAli Bahrami return (MSG_ORIG_STRTAB(vdp->v_msg, local_sgs_msg)); 1044f680cc6SAli Bahrami } 1054f680cc6SAli Bahrami 1064f680cc6SAli Bahrami /* If we get here, it's an unknown value */ 1074f680cc6SAli Bahrami return (conv_invalid_val(inv_buf, val, flags)); 1084f680cc6SAli Bahrami } 1094f680cc6SAli Bahrami 1104f680cc6SAli Bahrami /*ARGSUSED6*/ 1114f680cc6SAli Bahrami static const char * 1124f680cc6SAli Bahrami map_vd22str(Conv_inv_buf_t *inv_buf, uchar_t osabi, Half mach, 1134f680cc6SAli Bahrami Conv_elfvalue_t val, Conv_fmt_flags_t flags, const Val_desc2 *vdp, 1144f680cc6SAli Bahrami const char *local_sgs_msg) 1154f680cc6SAli Bahrami { 1164f680cc6SAli Bahrami for (; vdp->v_msg; vdp++) { 1174f680cc6SAli Bahrami if (CONV_VD2_SKIP(osabi, mach, vdp)) 1184f680cc6SAli Bahrami continue; 1194f680cc6SAli Bahrami 1204f680cc6SAli Bahrami if (val == vdp->v_val) 1214f680cc6SAli Bahrami return (MSG_ORIG_STRTAB(vdp->v_msg, local_sgs_msg)); 1224f680cc6SAli Bahrami } 1234f680cc6SAli Bahrami 1244f680cc6SAli Bahrami /* If we get here, it's an unknown value */ 1254f680cc6SAli Bahrami return (conv_invalid_val(inv_buf, val, flags)); 1264f680cc6SAli Bahrami } 1274f680cc6SAli Bahrami 1284f680cc6SAli Bahrami /* 1294f680cc6SAli Bahrami * Process an array of conv_ds_XXX_t structures and call the appropriate 1304f680cc6SAli Bahrami * map functions for the format of the strings given. 131c13de8f6Sab196087 */ 1327c478bd9Sstevel@tonic-gate const char * 1334f680cc6SAli Bahrami _conv_map_ds(uchar_t osabi, Half mach, Conv_elfvalue_t value, 1344f680cc6SAli Bahrami const conv_ds_t **dsp, Conv_fmt_flags_t fmt_flags, Conv_inv_buf_t *inv_buf, 1354f680cc6SAli Bahrami const char *local_sgs_msg) 1367c478bd9Sstevel@tonic-gate { 1374f680cc6SAli Bahrami const conv_ds_t *ds; 1387c478bd9Sstevel@tonic-gate 1394f680cc6SAli Bahrami for (ds = *dsp; ds != NULL; ds = *(++dsp)) { 1404f680cc6SAli Bahrami if ((value < ds->ds_baseval) || (value > ds->ds_topval)) 1414f680cc6SAli Bahrami continue; 1424f680cc6SAli Bahrami 1434f680cc6SAli Bahrami switch (ds->ds_type) { 1444f680cc6SAli Bahrami case CONV_DS_MSGARR: 1454f680cc6SAli Bahrami return (map_msg2str(inv_buf, value - ds->ds_baseval, 1464f680cc6SAli Bahrami fmt_flags, ds->ds_topval - ds->ds_baseval + 1, 1474f680cc6SAli Bahrami /*LINTED*/ 1484f680cc6SAli Bahrami ((conv_ds_msg_t *)ds)->ds_msg, 1494f680cc6SAli Bahrami local_sgs_msg)); 1504f680cc6SAli Bahrami 1514f680cc6SAli Bahrami case CONV_DS_VD: 1524f680cc6SAli Bahrami return (map_vd2str(inv_buf, value, fmt_flags, 1534f680cc6SAli Bahrami /*LINTED*/ 1544f680cc6SAli Bahrami ((conv_ds_vd_t *)ds)->ds_vd, 1554f680cc6SAli Bahrami local_sgs_msg)); 1564f680cc6SAli Bahrami 1574f680cc6SAli Bahrami case CONV_DS_VD2: 1584f680cc6SAli Bahrami return (map_vd22str(inv_buf, osabi, mach, value, 1594f680cc6SAli Bahrami fmt_flags, 1604f680cc6SAli Bahrami /*LINTED*/ 1614f680cc6SAli Bahrami ((conv_ds_vd2_t *)ds)->ds_vd2, 1624f680cc6SAli Bahrami local_sgs_msg)); 1635aefb655Srie } 1647c478bd9Sstevel@tonic-gate } 1655aefb655Srie 1664f680cc6SAli Bahrami return (conv_invalid_val(inv_buf, value, fmt_flags)); 1674f680cc6SAli Bahrami } 168c13de8f6Sab196087 1695aefb655Srie /* 1704f680cc6SAli Bahrami * Iterate over every message string in a given array of Msg codes, 1714f680cc6SAli Bahrami * calling a user supplied callback for each one. 172ba4e3c84Sab196087 * 173ba4e3c84Sab196087 * entry: 1744f680cc6SAli Bahrami * basevalue - Value corresponding to the first Msg in the array. 1754f680cc6SAli Bahrami * local_sgs_msg - Pointer to the __sgs_msg array for the 1764f680cc6SAli Bahrami * libconv module making the call. 1774f680cc6SAli Bahrami * num_msg - # of items in array referenced by msg 1784f680cc6SAli Bahrami * msg - Array of Msg indexes for the strings to iterate over. 1794f680cc6SAli Bahrami * The value corresponding to each element of msg must be: 1804f680cc6SAli Bahrami * value[i] = basevalue + i 1814f680cc6SAli Bahrami * func, uvalue - User supplied function to be called for each 1824f680cc6SAli Bahrami * string in msg. uvalue is an arbitrary user supplied pointer 1834f680cc6SAli Bahrami * to be passed to func. 1844f680cc6SAli Bahrami * local_sgs_msg - Pointer to the __sgs_msg array for the 1854f680cc6SAli Bahrami * libconv module making the call. 186ba4e3c84Sab196087 * 187ba4e3c84Sab196087 * exit: 1884f680cc6SAli Bahrami * The callback function is called for every non-zero item in 1894f680cc6SAli Bahrami * msg[]. If any callback returns CONV_ITER_DONE, execution stops 1904f680cc6SAli Bahrami * with that item and the function returns immediately. Otherwise, 1914f680cc6SAli Bahrami * it continues to the end of the array. 1924f680cc6SAli Bahrami * 1934f680cc6SAli Bahrami * The value from the last callback is returned. 194ba4e3c84Sab196087 */ 1954f680cc6SAli Bahrami /*ARGSUSED5*/ 1964f680cc6SAli Bahrami static conv_iter_ret_t 1974f680cc6SAli Bahrami _conv_iter_msgarr(uint32_t basevalue, const Msg *msg, size_t num_msg, 1984f680cc6SAli Bahrami conv_iter_cb_t func, void *uvalue, const char *local_sgs_msg) 199ba4e3c84Sab196087 { 2004f680cc6SAli Bahrami for (; num_msg-- > 0; basevalue++, msg++) { 2014f680cc6SAli Bahrami if (*msg != 0) 2024f680cc6SAli Bahrami if ((* func)(MSG_ORIG_STRTAB(*msg, local_sgs_msg), 2034f680cc6SAli Bahrami basevalue, uvalue) == CONV_ITER_DONE) 2044f680cc6SAli Bahrami return (CONV_ITER_DONE); 205ba4e3c84Sab196087 } 206ba4e3c84Sab196087 2074f680cc6SAli Bahrami return (CONV_ITER_CONT); 208ba4e3c84Sab196087 } 209ba4e3c84Sab196087 210ba4e3c84Sab196087 /* 2114f680cc6SAli Bahrami * Iterate over every message string in a given array of Val_desc or 2124f680cc6SAli Bahrami * Val_desc2 descriptors, calling a user supplied callback for each one. 213c13de8f6Sab196087 * 214c13de8f6Sab196087 * entry: 2154f680cc6SAli Bahrami * osabi,mach (_conv_iter_vd2 only) - The osabi/mach for which 2164f680cc6SAli Bahrami * strings are desired. Strings with a non-0 osabi or machine 2174f680cc6SAli Bahrami * that do not match are quietly ignored. 2184f680cc6SAli Bahrami * vdp - Pointer to NULL terminated array of Val_desc descriptors. 2194f680cc6SAli Bahrami * func, uvalue - User supplied function to be called for each 2204f680cc6SAli Bahrami * string in msg. uvalue is an arbitrary user supplied pointer 2214f680cc6SAli Bahrami * to be passed to func. 2224f680cc6SAli Bahrami * local_sgs_msg - Pointer to the __sgs_msg array for the 2234f680cc6SAli Bahrami * libconv module making the call. 224c13de8f6Sab196087 * 225c13de8f6Sab196087 * exit: 2264f680cc6SAli Bahrami * The callback function is called for every descriptor referenced by 2274f680cc6SAli Bahrami * vdp. In the case of the OSABI-version of this function, strings from 2284f680cc6SAli Bahrami * the wrong osabi are not used. If any callback returns CONV_ITER_DONE, 2294f680cc6SAli Bahrami * execution stops with that item and the function returns immediately. 2304f680cc6SAli Bahrami * Otherwise, it continues to the end of the array. 2314f680cc6SAli Bahrami * 2324f680cc6SAli Bahrami * The value from the last callback is returned. 2334f680cc6SAli Bahrami */ 2344f680cc6SAli Bahrami /*ARGSUSED3*/ 2354f680cc6SAli Bahrami conv_iter_ret_t 2364f680cc6SAli Bahrami _conv_iter_vd(const Val_desc *vdp, conv_iter_cb_t func, void *uvalue, 2374f680cc6SAli Bahrami const char *local_sgs_msg) 2384f680cc6SAli Bahrami { 2394f680cc6SAli Bahrami for (; vdp->v_msg; vdp++) { 2404f680cc6SAli Bahrami if ((* func)(MSG_ORIG_STRTAB(vdp->v_msg, local_sgs_msg), 2414f680cc6SAli Bahrami vdp->v_val, uvalue) == CONV_ITER_DONE) 2424f680cc6SAli Bahrami return (CONV_ITER_DONE); 2434f680cc6SAli Bahrami } 2444f680cc6SAli Bahrami 2454f680cc6SAli Bahrami return (CONV_ITER_CONT); 2464f680cc6SAli Bahrami } 2474f680cc6SAli Bahrami 2484f680cc6SAli Bahrami /*ARGSUSED5*/ 2494f680cc6SAli Bahrami conv_iter_ret_t 2504f680cc6SAli Bahrami _conv_iter_vd2(conv_iter_osabi_t osabi, Half mach, const Val_desc2 *vdp, 2514f680cc6SAli Bahrami conv_iter_cb_t func, void *uvalue, const char *local_sgs_msg) 2524f680cc6SAli Bahrami { 2534f680cc6SAli Bahrami for (; vdp->v_msg; vdp++) { 2544f680cc6SAli Bahrami if (CONV_ITER_VD2_SKIP(osabi, mach, vdp)) 2554f680cc6SAli Bahrami continue; 2564f680cc6SAli Bahrami 2574f680cc6SAli Bahrami if ((* func)(MSG_ORIG_STRTAB(vdp->v_msg, local_sgs_msg), 2584f680cc6SAli Bahrami vdp->v_val, uvalue) == CONV_ITER_DONE) 2594f680cc6SAli Bahrami return (CONV_ITER_DONE); 2604f680cc6SAli Bahrami } 2614f680cc6SAli Bahrami 2624f680cc6SAli Bahrami return (CONV_ITER_CONT); 2634f680cc6SAli Bahrami } 2644f680cc6SAli Bahrami 2654f680cc6SAli Bahrami /* 2664f680cc6SAli Bahrami * Process an array of conv_ds_XXX_t structures and call the appropriate 2674f680cc6SAli Bahrami * iteration functions for the format of the strings given. 2684f680cc6SAli Bahrami */ 2694f680cc6SAli Bahrami conv_iter_ret_t 2704f680cc6SAli Bahrami _conv_iter_ds(conv_iter_osabi_t osabi, Half mach, const conv_ds_t **dsp, 2714f680cc6SAli Bahrami conv_iter_cb_t func, void *uvalue, const char *local_sgs_msg) 2724f680cc6SAli Bahrami { 2734f680cc6SAli Bahrami const conv_ds_t *ds; 2744f680cc6SAli Bahrami 2754f680cc6SAli Bahrami for (ds = *dsp; ds != NULL; ds = *(++dsp)) { 2764f680cc6SAli Bahrami switch (ds->ds_type) { 2774f680cc6SAli Bahrami case CONV_DS_MSGARR: 2784f680cc6SAli Bahrami if (_conv_iter_msgarr(ds->ds_baseval, 2794f680cc6SAli Bahrami /*LINTED*/ 2804f680cc6SAli Bahrami ((conv_ds_msg_t *)ds)->ds_msg, 2814f680cc6SAli Bahrami ds->ds_topval - ds->ds_baseval + 1, func, uvalue, 2824f680cc6SAli Bahrami local_sgs_msg) == CONV_ITER_DONE) 2834f680cc6SAli Bahrami return (CONV_ITER_DONE); 2844f680cc6SAli Bahrami break; 2854f680cc6SAli Bahrami 2864f680cc6SAli Bahrami case CONV_DS_VD: 2874f680cc6SAli Bahrami /*LINTED*/ 2884f680cc6SAli Bahrami if (_conv_iter_vd(((conv_ds_vd_t *)ds)->ds_vd, 2894f680cc6SAli Bahrami func, uvalue, local_sgs_msg) == CONV_ITER_DONE) 2904f680cc6SAli Bahrami return (CONV_ITER_DONE); 2914f680cc6SAli Bahrami break; 2924f680cc6SAli Bahrami 2934f680cc6SAli Bahrami case CONV_DS_VD2: 2944f680cc6SAli Bahrami if (_conv_iter_vd2(osabi, mach, 2954f680cc6SAli Bahrami /*LINTED*/ 2964f680cc6SAli Bahrami ((conv_ds_vd2_t *)ds)->ds_vd2, 2974f680cc6SAli Bahrami func, uvalue, local_sgs_msg) == CONV_ITER_DONE) 2984f680cc6SAli Bahrami return (CONV_ITER_DONE); 2994f680cc6SAli Bahrami break; 3004f680cc6SAli Bahrami } 3014f680cc6SAli Bahrami } 3024f680cc6SAli Bahrami 3034f680cc6SAli Bahrami return (CONV_ITER_CONT); 3044f680cc6SAli Bahrami } 3054f680cc6SAli Bahrami 3064f680cc6SAli Bahrami /* 3074f680cc6SAli Bahrami * Initialize the uvalue block prior to use of an interation function 3084f680cc6SAli Bahrami * employing conv_iter_strtol(). 3094f680cc6SAli Bahrami * 3104f680cc6SAli Bahrami * entry: 3114f680cc6SAli Bahrami * str - String to be matched to a value 3124f680cc6SAli Bahrami * uvalue - Pointer to uninitialized uvalue block 3134f680cc6SAli Bahrami * 3144f680cc6SAli Bahrami * exit: 3154f680cc6SAli Bahrami * Initializes the uvalue block for use. Returns True (1) if a non-empty 3164f680cc6SAli Bahrami * string was supplied, and False (0). 3175aefb655Srie */ 3185aefb655Srie int 3194f680cc6SAli Bahrami conv_iter_strtol_init(const char *str, conv_strtol_uvalue_t *uvalue) 3205aefb655Srie { 3214f680cc6SAli Bahrami const char *tail; 322ba4e3c84Sab196087 323*e23c41c9SAli Bahrami while (conv_strproc_isspace(*str)) 3244f680cc6SAli Bahrami str++; 3254f680cc6SAli Bahrami uvalue->csl_str = str; 3264f680cc6SAli Bahrami uvalue->csl_found = 0; 327ba4e3c84Sab196087 3284f680cc6SAli Bahrami tail = str + strlen(str); 329*e23c41c9SAli Bahrami while ((tail > str) && conv_strproc_isspace(*(tail - 1))) 3304f680cc6SAli Bahrami tail--; 3314f680cc6SAli Bahrami uvalue->csl_strlen = tail - str; 332ba4e3c84Sab196087 3334f680cc6SAli Bahrami return (uvalue->csl_strlen > 0); 334ba4e3c84Sab196087 } 3355aefb655Srie 3365aefb655Srie /* 3374f680cc6SAli Bahrami * conv_iter_strtol() is used with iteration functions to map a string 3384f680cc6SAli Bahrami * to the value of its corresponding ELF constant. 3394f680cc6SAli Bahrami * 3404f680cc6SAli Bahrami * entry: 3414f680cc6SAli Bahrami * str - String supplied by this iteration 3424f680cc6SAli Bahrami * value - Value of ELF constant corresponding to str 3434f680cc6SAli Bahrami * uvalue - Pointer to conv_strtol_uvalue_t block previously 3444f680cc6SAli Bahrami * initialized by a call to conv_iter_strtol_init(). 3455aefb655Srie */ 3464f680cc6SAli Bahrami conv_iter_ret_t 3474f680cc6SAli Bahrami conv_iter_strtol(const char *str, uint32_t value, void *uvalue) 3484f680cc6SAli Bahrami { 3494f680cc6SAli Bahrami conv_strtol_uvalue_t *state = (conv_strtol_uvalue_t *)uvalue; 3505aefb655Srie 3514f680cc6SAli Bahrami if ((strlen(str) == state->csl_strlen) && 3524f680cc6SAli Bahrami (strncasecmp(str, state->csl_str, state->csl_strlen) == 0)) { 3534f680cc6SAli Bahrami state->csl_found = 1; 3544f680cc6SAli Bahrami state->csl_value = value; 3554f680cc6SAli Bahrami return (CONV_ITER_DONE); /* Found it. Stop now. */ 3565aefb655Srie } 3575aefb655Srie 3584f680cc6SAli Bahrami return (CONV_ITER_CONT); /* Keep looking */ 3595aefb655Srie } 360