xref: /aosp_15_r20/external/libusb/libusb/strerror.c (revision 86b64dcb59b3a0b37502ecd56e119234366a6f7e)
1*86b64dcbSAndroid Build Coastguard Worker /*
2*86b64dcbSAndroid Build Coastguard Worker  * libusb strerror code
3*86b64dcbSAndroid Build Coastguard Worker  * Copyright © 2013 Hans de Goede <[email protected]>
4*86b64dcbSAndroid Build Coastguard Worker  *
5*86b64dcbSAndroid Build Coastguard Worker  * This library is free software; you can redistribute it and/or
6*86b64dcbSAndroid Build Coastguard Worker  * modify it under the terms of the GNU Lesser General Public
7*86b64dcbSAndroid Build Coastguard Worker  * License as published by the Free Software Foundation; either
8*86b64dcbSAndroid Build Coastguard Worker  * version 2.1 of the License, or (at your option) any later version.
9*86b64dcbSAndroid Build Coastguard Worker  *
10*86b64dcbSAndroid Build Coastguard Worker  * This library is distributed in the hope that it will be useful,
11*86b64dcbSAndroid Build Coastguard Worker  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*86b64dcbSAndroid Build Coastguard Worker  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13*86b64dcbSAndroid Build Coastguard Worker  * Lesser General Public License for more details.
14*86b64dcbSAndroid Build Coastguard Worker  *
15*86b64dcbSAndroid Build Coastguard Worker  * You should have received a copy of the GNU Lesser General Public
16*86b64dcbSAndroid Build Coastguard Worker  * License along with this library; if not, write to the Free Software
17*86b64dcbSAndroid Build Coastguard Worker  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18*86b64dcbSAndroid Build Coastguard Worker  */
19*86b64dcbSAndroid Build Coastguard Worker 
20*86b64dcbSAndroid Build Coastguard Worker #include "libusbi.h"
21*86b64dcbSAndroid Build Coastguard Worker 
22*86b64dcbSAndroid Build Coastguard Worker #include <ctype.h>
23*86b64dcbSAndroid Build Coastguard Worker #include <string.h>
24*86b64dcbSAndroid Build Coastguard Worker 
25*86b64dcbSAndroid Build Coastguard Worker /** \ingroup libusb_misc
26*86b64dcbSAndroid Build Coastguard Worker  * How to add a new \ref libusb_strerror() translation:
27*86b64dcbSAndroid Build Coastguard Worker  * <ol>
28*86b64dcbSAndroid Build Coastguard Worker  * <li> Download the latest \c strerror.c from:<br>
29*86b64dcbSAndroid Build Coastguard Worker  *      https://raw.github.com/libusb/libusb/master/libusb/strerror.c </li>
30*86b64dcbSAndroid Build Coastguard Worker  * <li> Open the file in an UTF-8 capable editor </li>
31*86b64dcbSAndroid Build Coastguard Worker  * <li> Add the 2 letter <a href="https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">ISO 639-1</a>
32*86b64dcbSAndroid Build Coastguard Worker  *      code for your locale at the end of \c usbi_locale_supported[]<br>
33*86b64dcbSAndroid Build Coastguard Worker  *    Eg. for Chinese, you would add "zh" so that:
34*86b64dcbSAndroid Build Coastguard Worker  *    \code... usbi_locale_supported[] = { "en", "nl", "fr" };\endcode
35*86b64dcbSAndroid Build Coastguard Worker  *    becomes:
36*86b64dcbSAndroid Build Coastguard Worker  *    \code... usbi_locale_supported[] = { "en", "nl", "fr", "zh" };\endcode </li>
37*86b64dcbSAndroid Build Coastguard Worker  * <li> Copy the <tt>{ / * English (en) * / ... }</tt> section and add it at the end of \c usbi_localized_errors<br>
38*86b64dcbSAndroid Build Coastguard Worker  *    Eg. for Chinese, the last section of \c usbi_localized_errors could look like:
39*86b64dcbSAndroid Build Coastguard Worker  *    \code
40*86b64dcbSAndroid Build Coastguard Worker  *     }, { / * Chinese (zh) * /
41*86b64dcbSAndroid Build Coastguard Worker  *         "Success",
42*86b64dcbSAndroid Build Coastguard Worker  *         ...
43*86b64dcbSAndroid Build Coastguard Worker  *         "Other error",
44*86b64dcbSAndroid Build Coastguard Worker  *     },
45*86b64dcbSAndroid Build Coastguard Worker  * };\endcode </li>
46*86b64dcbSAndroid Build Coastguard Worker  * <li> Translate each of the English messages from the section you copied into your language </li>
47*86b64dcbSAndroid Build Coastguard Worker  * <li> Save the file (in UTF-8 format) and send it to \c libusb-devel\@lists.sourceforge.net </li>
48*86b64dcbSAndroid Build Coastguard Worker  * </ol>
49*86b64dcbSAndroid Build Coastguard Worker  */
50*86b64dcbSAndroid Build Coastguard Worker 
51*86b64dcbSAndroid Build Coastguard Worker static const char * const usbi_locale_supported[] = { "en", "nl", "fr", "ru", "de", "hu" };
52*86b64dcbSAndroid Build Coastguard Worker static const char * const usbi_localized_errors[ARRAYSIZE(usbi_locale_supported)][LIBUSB_ERROR_COUNT] = {
53*86b64dcbSAndroid Build Coastguard Worker 	{ /* English (en) */
54*86b64dcbSAndroid Build Coastguard Worker 		"Success",
55*86b64dcbSAndroid Build Coastguard Worker 		"Input/Output Error",
56*86b64dcbSAndroid Build Coastguard Worker 		"Invalid parameter",
57*86b64dcbSAndroid Build Coastguard Worker 		"Access denied (insufficient permissions)",
58*86b64dcbSAndroid Build Coastguard Worker 		"No such device (it may have been disconnected)",
59*86b64dcbSAndroid Build Coastguard Worker 		"Entity not found",
60*86b64dcbSAndroid Build Coastguard Worker 		"Resource busy",
61*86b64dcbSAndroid Build Coastguard Worker 		"Operation timed out",
62*86b64dcbSAndroid Build Coastguard Worker 		"Overflow",
63*86b64dcbSAndroid Build Coastguard Worker 		"Pipe error",
64*86b64dcbSAndroid Build Coastguard Worker 		"System call interrupted (perhaps due to signal)",
65*86b64dcbSAndroid Build Coastguard Worker 		"Insufficient memory",
66*86b64dcbSAndroid Build Coastguard Worker 		"Operation not supported or unimplemented on this platform",
67*86b64dcbSAndroid Build Coastguard Worker 		"Other error",
68*86b64dcbSAndroid Build Coastguard Worker 	}, { /* Dutch (nl) */
69*86b64dcbSAndroid Build Coastguard Worker 		"Gelukt",
70*86b64dcbSAndroid Build Coastguard Worker 		"Invoer-/uitvoerfout",
71*86b64dcbSAndroid Build Coastguard Worker 		"Ongeldig argument",
72*86b64dcbSAndroid Build Coastguard Worker 		"Toegang geweigerd (onvoldoende toegangsrechten)",
73*86b64dcbSAndroid Build Coastguard Worker 		"Apparaat bestaat niet (verbinding met apparaat verbroken?)",
74*86b64dcbSAndroid Build Coastguard Worker 		"Niet gevonden",
75*86b64dcbSAndroid Build Coastguard Worker 		"Apparaat of hulpbron is bezig",
76*86b64dcbSAndroid Build Coastguard Worker 		"Bewerking verlopen",
77*86b64dcbSAndroid Build Coastguard Worker 		"Waarde is te groot",
78*86b64dcbSAndroid Build Coastguard Worker 		"Gebroken pijp",
79*86b64dcbSAndroid Build Coastguard Worker 		"Onderbroken systeemaanroep",
80*86b64dcbSAndroid Build Coastguard Worker 		"Onvoldoende geheugen beschikbaar",
81*86b64dcbSAndroid Build Coastguard Worker 		"Bewerking wordt niet ondersteund",
82*86b64dcbSAndroid Build Coastguard Worker 		"Andere fout",
83*86b64dcbSAndroid Build Coastguard Worker 	}, { /* French (fr) */
84*86b64dcbSAndroid Build Coastguard Worker 		"Succès",
85*86b64dcbSAndroid Build Coastguard Worker 		"Erreur d'entrée/sortie",
86*86b64dcbSAndroid Build Coastguard Worker 		"Paramètre invalide",
87*86b64dcbSAndroid Build Coastguard Worker 		"Accès refusé (permissions insuffisantes)",
88*86b64dcbSAndroid Build Coastguard Worker 		"Périphérique introuvable (peut-être déconnecté)",
89*86b64dcbSAndroid Build Coastguard Worker 		"Elément introuvable",
90*86b64dcbSAndroid Build Coastguard Worker 		"Resource déjà occupée",
91*86b64dcbSAndroid Build Coastguard Worker 		"Operation expirée",
92*86b64dcbSAndroid Build Coastguard Worker 		"Débordement",
93*86b64dcbSAndroid Build Coastguard Worker 		"Erreur de pipe",
94*86b64dcbSAndroid Build Coastguard Worker 		"Appel système abandonné (peut-être à cause d’un signal)",
95*86b64dcbSAndroid Build Coastguard Worker 		"Mémoire insuffisante",
96*86b64dcbSAndroid Build Coastguard Worker 		"Opération non supportée or non implémentée sur cette plateforme",
97*86b64dcbSAndroid Build Coastguard Worker 		"Autre erreur",
98*86b64dcbSAndroid Build Coastguard Worker 	}, { /* Russian (ru) */
99*86b64dcbSAndroid Build Coastguard Worker 		"Успех",
100*86b64dcbSAndroid Build Coastguard Worker 		"Ошибка ввода/вывода",
101*86b64dcbSAndroid Build Coastguard Worker 		"Неверный параметр",
102*86b64dcbSAndroid Build Coastguard Worker 		"Доступ запрещён (не хватает прав)",
103*86b64dcbSAndroid Build Coastguard Worker 		"Устройство отсутствует (возможно, оно было отсоединено)",
104*86b64dcbSAndroid Build Coastguard Worker 		"Элемент не найден",
105*86b64dcbSAndroid Build Coastguard Worker 		"Ресурс занят",
106*86b64dcbSAndroid Build Coastguard Worker 		"Истекло время ожидания операции",
107*86b64dcbSAndroid Build Coastguard Worker 		"Переполнение",
108*86b64dcbSAndroid Build Coastguard Worker 		"Ошибка канала",
109*86b64dcbSAndroid Build Coastguard Worker 		"Системный вызов прерван (возможно, сигналом)",
110*86b64dcbSAndroid Build Coastguard Worker 		"Память исчерпана",
111*86b64dcbSAndroid Build Coastguard Worker 		"Операция не поддерживается данной платформой",
112*86b64dcbSAndroid Build Coastguard Worker 		"Неизвестная ошибка"
113*86b64dcbSAndroid Build Coastguard Worker 	}, { /* German (de) */
114*86b64dcbSAndroid Build Coastguard Worker 		"Erfolgreich",
115*86b64dcbSAndroid Build Coastguard Worker 		"Eingabe-/Ausgabefehler",
116*86b64dcbSAndroid Build Coastguard Worker 		"Ungültiger Parameter",
117*86b64dcbSAndroid Build Coastguard Worker 		"Keine Berechtigung (Zugriffsrechte fehlen)",
118*86b64dcbSAndroid Build Coastguard Worker 		"Kein passendes Gerät gefunden (es könnte entfernt worden sein)",
119*86b64dcbSAndroid Build Coastguard Worker 		"Entität nicht gefunden",
120*86b64dcbSAndroid Build Coastguard Worker 		"Die Ressource ist belegt",
121*86b64dcbSAndroid Build Coastguard Worker 		"Die Wartezeit für die Operation ist abgelaufen",
122*86b64dcbSAndroid Build Coastguard Worker 		"Mehr Daten empfangen als erwartet",
123*86b64dcbSAndroid Build Coastguard Worker 		"Datenübergabe unterbrochen (broken pipe)",
124*86b64dcbSAndroid Build Coastguard Worker 		"Unterbrechung während des Betriebssystemaufrufs",
125*86b64dcbSAndroid Build Coastguard Worker 		"Nicht genügend Hauptspeicher verfügbar",
126*86b64dcbSAndroid Build Coastguard Worker 		"Die Operation wird nicht unterstützt oder ist auf dieser Platform nicht implementiert",
127*86b64dcbSAndroid Build Coastguard Worker 		"Allgemeiner Fehler",
128*86b64dcbSAndroid Build Coastguard Worker 	}, { /* Hungarian (hu) */
129*86b64dcbSAndroid Build Coastguard Worker 		"Sikeres",
130*86b64dcbSAndroid Build Coastguard Worker 		"Be-/kimeneti hiba",
131*86b64dcbSAndroid Build Coastguard Worker 		"Érvénytelen paraméter",
132*86b64dcbSAndroid Build Coastguard Worker 		"Hozzáférés megtagadva",
133*86b64dcbSAndroid Build Coastguard Worker 		"Az eszköz nem található (eltávolították?)",
134*86b64dcbSAndroid Build Coastguard Worker 		"Nem található",
135*86b64dcbSAndroid Build Coastguard Worker 		"Az erőforrás foglalt",
136*86b64dcbSAndroid Build Coastguard Worker 		"Időtúllépés",
137*86b64dcbSAndroid Build Coastguard Worker 		"Túlcsordulás",
138*86b64dcbSAndroid Build Coastguard Worker 		"Törött adatcsatorna",
139*86b64dcbSAndroid Build Coastguard Worker 		"Rendszerhívás megszakítva",
140*86b64dcbSAndroid Build Coastguard Worker 		"Nincs elég memória",
141*86b64dcbSAndroid Build Coastguard Worker 		"A művelet nem támogatott ezen a rendszeren",
142*86b64dcbSAndroid Build Coastguard Worker 		"Általános hiba",
143*86b64dcbSAndroid Build Coastguard Worker 	},
144*86b64dcbSAndroid Build Coastguard Worker };
145*86b64dcbSAndroid Build Coastguard Worker 
146*86b64dcbSAndroid Build Coastguard Worker static const char * const (*usbi_error_strings)[LIBUSB_ERROR_COUNT] = &usbi_localized_errors[0];
147*86b64dcbSAndroid Build Coastguard Worker 
148*86b64dcbSAndroid Build Coastguard Worker /** \ingroup libusb_misc
149*86b64dcbSAndroid Build Coastguard Worker  * Set the language, and only the language, not the encoding! used for
150*86b64dcbSAndroid Build Coastguard Worker  * translatable libusb messages.
151*86b64dcbSAndroid Build Coastguard Worker  *
152*86b64dcbSAndroid Build Coastguard Worker  * This takes a locale string in the default setlocale format: lang[-region]
153*86b64dcbSAndroid Build Coastguard Worker  * or lang[_country_region][.codeset]. Only the lang part of the string is
154*86b64dcbSAndroid Build Coastguard Worker  * used, and only 2 letter ISO 639-1 codes are accepted for it, such as "de".
155*86b64dcbSAndroid Build Coastguard Worker  * The optional region, country_region or codeset parts are ignored. This
156*86b64dcbSAndroid Build Coastguard Worker  * means that functions which return translatable strings will NOT honor the
157*86b64dcbSAndroid Build Coastguard Worker  * specified encoding.
158*86b64dcbSAndroid Build Coastguard Worker  * All strings returned are encoded as UTF-8 strings.
159*86b64dcbSAndroid Build Coastguard Worker  *
160*86b64dcbSAndroid Build Coastguard Worker  * If libusb_setlocale() is not called, all messages will be in English.
161*86b64dcbSAndroid Build Coastguard Worker  *
162*86b64dcbSAndroid Build Coastguard Worker  * The following functions return translatable strings: libusb_strerror().
163*86b64dcbSAndroid Build Coastguard Worker  * Note that the libusb log messages controlled through LIBUSB_OPTION_LOG_LEVEL
164*86b64dcbSAndroid Build Coastguard Worker  * are not translated, they are always in English.
165*86b64dcbSAndroid Build Coastguard Worker  *
166*86b64dcbSAndroid Build Coastguard Worker  * For POSIX UTF-8 environments if you want libusb to follow the standard
167*86b64dcbSAndroid Build Coastguard Worker  * locale settings, call libusb_setlocale(setlocale(LC_MESSAGES, NULL)),
168*86b64dcbSAndroid Build Coastguard Worker  * after your app has done its locale setup.
169*86b64dcbSAndroid Build Coastguard Worker  *
170*86b64dcbSAndroid Build Coastguard Worker  * \param locale locale-string in the form of lang[_country_region][.codeset]
171*86b64dcbSAndroid Build Coastguard Worker  * or lang[-region], where lang is a 2 letter ISO 639-1 code
172*86b64dcbSAndroid Build Coastguard Worker  * \returns \ref LIBUSB_SUCCESS on success
173*86b64dcbSAndroid Build Coastguard Worker  * \returns \ref LIBUSB_ERROR_INVALID_PARAM if the locale doesn't meet the requirements
174*86b64dcbSAndroid Build Coastguard Worker  * \returns \ref LIBUSB_ERROR_NOT_FOUND if the requested language is not supported
175*86b64dcbSAndroid Build Coastguard Worker  * \returns a LIBUSB_ERROR code on other errors
176*86b64dcbSAndroid Build Coastguard Worker  */
177*86b64dcbSAndroid Build Coastguard Worker 
libusb_setlocale(const char * locale)178*86b64dcbSAndroid Build Coastguard Worker int API_EXPORTED libusb_setlocale(const char *locale)
179*86b64dcbSAndroid Build Coastguard Worker {
180*86b64dcbSAndroid Build Coastguard Worker 	size_t i;
181*86b64dcbSAndroid Build Coastguard Worker 
182*86b64dcbSAndroid Build Coastguard Worker 	if (!locale || strlen(locale) < 2
183*86b64dcbSAndroid Build Coastguard Worker 	    || (locale[2] != '\0' && locale[2] != '-' && locale[2] != '_' && locale[2] != '.'))
184*86b64dcbSAndroid Build Coastguard Worker 		return LIBUSB_ERROR_INVALID_PARAM;
185*86b64dcbSAndroid Build Coastguard Worker 
186*86b64dcbSAndroid Build Coastguard Worker 	for (i = 0; i < ARRAYSIZE(usbi_locale_supported); i++) {
187*86b64dcbSAndroid Build Coastguard Worker 		if (usbi_locale_supported[i][0] == tolower((unsigned char)locale[0])
188*86b64dcbSAndroid Build Coastguard Worker 		    && usbi_locale_supported[i][1] == tolower((unsigned char)locale[1]))
189*86b64dcbSAndroid Build Coastguard Worker 			break;
190*86b64dcbSAndroid Build Coastguard Worker 	}
191*86b64dcbSAndroid Build Coastguard Worker 
192*86b64dcbSAndroid Build Coastguard Worker 	if (i == ARRAYSIZE(usbi_locale_supported))
193*86b64dcbSAndroid Build Coastguard Worker 		return LIBUSB_ERROR_NOT_FOUND;
194*86b64dcbSAndroid Build Coastguard Worker 
195*86b64dcbSAndroid Build Coastguard Worker 	usbi_error_strings = &usbi_localized_errors[i];
196*86b64dcbSAndroid Build Coastguard Worker 
197*86b64dcbSAndroid Build Coastguard Worker 	return LIBUSB_SUCCESS;
198*86b64dcbSAndroid Build Coastguard Worker }
199*86b64dcbSAndroid Build Coastguard Worker 
200*86b64dcbSAndroid Build Coastguard Worker /** \ingroup libusb_misc
201*86b64dcbSAndroid Build Coastguard Worker  * Returns a constant string with a short description of the given error code,
202*86b64dcbSAndroid Build Coastguard Worker  * this description is intended for displaying to the end user and will be in
203*86b64dcbSAndroid Build Coastguard Worker  * the language set by libusb_setlocale().
204*86b64dcbSAndroid Build Coastguard Worker  *
205*86b64dcbSAndroid Build Coastguard Worker  * The returned string is encoded in UTF-8.
206*86b64dcbSAndroid Build Coastguard Worker  *
207*86b64dcbSAndroid Build Coastguard Worker  * The messages always start with a capital letter and end without any dot.
208*86b64dcbSAndroid Build Coastguard Worker  * The caller must not free() the returned string.
209*86b64dcbSAndroid Build Coastguard Worker  *
210*86b64dcbSAndroid Build Coastguard Worker  * \param errcode the error code whose description is desired
211*86b64dcbSAndroid Build Coastguard Worker  * \returns a short description of the error code in UTF-8 encoding
212*86b64dcbSAndroid Build Coastguard Worker  */
libusb_strerror(int errcode)213*86b64dcbSAndroid Build Coastguard Worker DEFAULT_VISIBILITY const char * LIBUSB_CALL libusb_strerror(int errcode)
214*86b64dcbSAndroid Build Coastguard Worker {
215*86b64dcbSAndroid Build Coastguard Worker 	int errcode_index = -errcode;
216*86b64dcbSAndroid Build Coastguard Worker 
217*86b64dcbSAndroid Build Coastguard Worker 	if (errcode_index < 0 || errcode_index >= LIBUSB_ERROR_COUNT) {
218*86b64dcbSAndroid Build Coastguard Worker 		/* "Other Error", which should always be our last message, is returned */
219*86b64dcbSAndroid Build Coastguard Worker 		errcode_index = LIBUSB_ERROR_COUNT - 1;
220*86b64dcbSAndroid Build Coastguard Worker 	}
221*86b64dcbSAndroid Build Coastguard Worker 
222*86b64dcbSAndroid Build Coastguard Worker 	return (*usbi_error_strings)[errcode_index];
223*86b64dcbSAndroid Build Coastguard Worker }
224