Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2012 Mike Frysinger <vapier@gentoo.org> |
| 3 | * |
| 4 | * Redistribution and use in source and binary forms, with or without |
| 5 | * modification, are permitted provided that the following conditions |
| 6 | * are met: |
| 7 | * 1. Redistributions of source code must retain the above copyright |
| 8 | * notice, this list of conditions and the following disclaimer. |
| 9 | * 2. Redistributions in binary form must reproduce the above copyright |
| 10 | * notice, this list of conditions and the following disclaimer in the |
| 11 | * documentation and/or other materials provided with the distribution. |
| 12 | * 3. The name of the author may not be used to endorse or promote products |
| 13 | * derived from this software without specific prior written permission. |
| 14 | * |
| 15 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
| 16 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| 17 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| 18 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
| 19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| 20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 21 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 22 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 25 | */ |
| 26 | |
| 27 | #include "defs.h" |
| 28 | |
Dmitry V. Levin | a0866bc | 2016-05-28 18:46:39 +0000 | [diff] [blame] | 29 | #include DEF_MPERS_TYPE(struct_mtd_oob_buf) |
| 30 | |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 31 | #include <linux/ioctl.h> |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 32 | |
| 33 | /* The mtd api changes quickly, so we have to keep a local copy */ |
| 34 | #include <linux/version.h> |
| 35 | #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0) |
| 36 | # include "mtd-abi.h" |
| 37 | #else |
| 38 | # include <mtd/mtd-abi.h> |
| 39 | #endif |
| 40 | |
Dmitry V. Levin | a0866bc | 2016-05-28 18:46:39 +0000 | [diff] [blame] | 41 | typedef struct mtd_oob_buf struct_mtd_oob_buf; |
| 42 | |
| 43 | #include MPERS_DEFS |
| 44 | |
Dmitry V. Levin | 0ed617b | 2014-04-25 23:30:54 +0000 | [diff] [blame] | 45 | #include "xlat/mtd_mode_options.h" |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 46 | #include "xlat/mtd_file_mode_options.h" |
Dmitry V. Levin | 0ed617b | 2014-04-25 23:30:54 +0000 | [diff] [blame] | 47 | #include "xlat/mtd_type_options.h" |
Dmitry V. Levin | 0ed617b | 2014-04-25 23:30:54 +0000 | [diff] [blame] | 48 | #include "xlat/mtd_flags_options.h" |
Dmitry V. Levin | 0ed617b | 2014-04-25 23:30:54 +0000 | [diff] [blame] | 49 | #include "xlat/mtd_otp_options.h" |
Dmitry V. Levin | 0ed617b | 2014-04-25 23:30:54 +0000 | [diff] [blame] | 50 | #include "xlat/mtd_nandecc_options.h" |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 51 | |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 52 | static void |
| 53 | decode_erase_info_user(struct tcb *tcp, const long addr) |
| 54 | { |
| 55 | struct erase_info_user einfo; |
| 56 | |
| 57 | tprints(", "); |
| 58 | if (umove_or_printaddr(tcp, addr, &einfo)) |
| 59 | return; |
| 60 | |
| 61 | tprintf("{start=%#x, length=%#x}", einfo.start, einfo.length); |
| 62 | } |
| 63 | |
| 64 | static void |
| 65 | decode_erase_info_user64(struct tcb *tcp, const long addr) |
| 66 | { |
| 67 | struct erase_info_user64 einfo64; |
| 68 | |
| 69 | tprints(", "); |
| 70 | if (umove_or_printaddr(tcp, addr, &einfo64)) |
| 71 | return; |
| 72 | |
| 73 | tprintf("{start=%#" PRIx64 ", length=%#" PRIx64 "}", |
| 74 | (uint64_t) einfo64.start, (uint64_t) einfo64.length); |
| 75 | } |
| 76 | |
| 77 | static void |
| 78 | decode_mtd_oob_buf(struct tcb *tcp, const long addr) |
| 79 | { |
Dmitry V. Levin | a0866bc | 2016-05-28 18:46:39 +0000 | [diff] [blame] | 80 | struct_mtd_oob_buf mbuf; |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 81 | |
| 82 | tprints(", "); |
| 83 | if (umove_or_printaddr(tcp, addr, &mbuf)) |
| 84 | return; |
| 85 | |
Dmitry V. Levin | 484326d | 2016-06-11 01:28:21 +0000 | [diff] [blame] | 86 | tprintf("{start=%#x, length=%#x, ptr=", mbuf.start, mbuf.length); |
| 87 | printaddr((unsigned long) mbuf.ptr); |
| 88 | tprints("}"); |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 89 | } |
| 90 | |
| 91 | static void |
| 92 | decode_mtd_oob_buf64(struct tcb *tcp, const long addr) |
| 93 | { |
| 94 | struct mtd_oob_buf64 mbuf64; |
| 95 | |
| 96 | tprints(", "); |
| 97 | if (umove_or_printaddr(tcp, addr, &mbuf64)) |
| 98 | return; |
| 99 | |
| 100 | tprintf("{start=%#" PRIx64 ", length=%#x, usr_ptr=%#" PRIx64 "}", |
| 101 | (uint64_t) mbuf64.start, mbuf64.length, |
| 102 | (uint64_t) mbuf64.usr_ptr); |
| 103 | } |
| 104 | |
| 105 | static void |
| 106 | decode_otp_info(struct tcb *tcp, const long addr) |
| 107 | { |
| 108 | struct otp_info oinfo; |
| 109 | |
| 110 | tprints(", "); |
| 111 | if (umove_or_printaddr(tcp, addr, &oinfo)) |
| 112 | return; |
| 113 | |
| 114 | tprintf("{start=%#x, length=%#x, locked=%u}", |
| 115 | oinfo.start, oinfo.length, oinfo.locked); |
| 116 | } |
| 117 | |
| 118 | static void |
| 119 | decode_otp_select(struct tcb *tcp, const long addr) |
| 120 | { |
| 121 | unsigned int i; |
| 122 | |
| 123 | tprints(", "); |
| 124 | if (umove_or_printaddr(tcp, addr, &i)) |
| 125 | return; |
| 126 | |
| 127 | tprints("["); |
| 128 | printxval(mtd_otp_options, i, "MTD_OTP_???"); |
| 129 | tprints("]"); |
| 130 | } |
| 131 | |
| 132 | static void |
| 133 | decode_mtd_write_req(struct tcb *tcp, const long addr) |
| 134 | { |
| 135 | struct mtd_write_req mreq; |
| 136 | |
| 137 | tprints(", "); |
| 138 | if (umove_or_printaddr(tcp, addr, &mreq)) |
| 139 | return; |
| 140 | |
| 141 | tprintf("{start=%#" PRIx64 ", len=%#" PRIx64 |
| 142 | ", ooblen=%#" PRIx64 ", usr_data=%#" PRIx64 |
| 143 | ", usr_oob=%#" PRIx64 ", mode=", |
| 144 | (uint64_t) mreq.start, (uint64_t) mreq.len, |
| 145 | (uint64_t) mreq.ooblen, (uint64_t) mreq.usr_data, |
| 146 | (uint64_t) mreq.usr_oob); |
| 147 | printxval(mtd_mode_options, mreq.mode, "MTD_OPS_???"); |
| 148 | tprints("}"); |
| 149 | } |
| 150 | |
| 151 | static void |
| 152 | decode_mtd_info_user(struct tcb *tcp, const long addr) |
| 153 | { |
| 154 | struct mtd_info_user minfo; |
| 155 | |
| 156 | tprints(", "); |
| 157 | if (umove_or_printaddr(tcp, addr, &minfo)) |
| 158 | return; |
| 159 | |
| 160 | tprints("{type="); |
| 161 | printxval(mtd_type_options, minfo.type, "MTD_???"); |
| 162 | tprints(", flags="); |
| 163 | printflags(mtd_flags_options, minfo.flags, "MTD_???"); |
| 164 | tprintf(", size=%#x, erasesize=%#x, writesize=%#x, oobsize=%#x" |
| 165 | ", padding=%#" PRIx64 "}", |
| 166 | minfo.size, minfo.erasesize, minfo.writesize, minfo.oobsize, |
| 167 | (uint64_t) minfo.padding); |
| 168 | } |
| 169 | |
| 170 | static void |
| 171 | decode_nand_oobinfo(struct tcb *tcp, const long addr) |
| 172 | { |
| 173 | struct nand_oobinfo ninfo; |
| 174 | unsigned int i, j; |
| 175 | |
| 176 | tprints(", "); |
| 177 | if (umove_or_printaddr(tcp, addr, &ninfo)) |
| 178 | return; |
| 179 | |
| 180 | tprints("{useecc="); |
| 181 | printxval(mtd_nandecc_options, ninfo.useecc, "MTD_NANDECC_???"); |
| 182 | tprintf(", eccbytes=%#x", ninfo.eccbytes); |
| 183 | |
| 184 | tprints(", oobfree={"); |
| 185 | for (i = 0; i < ARRAY_SIZE(ninfo.oobfree); ++i) { |
| 186 | if (i) |
| 187 | tprints("}, "); |
| 188 | tprints("{"); |
| 189 | for (j = 0; j < ARRAY_SIZE(ninfo.oobfree[0]); ++j) { |
| 190 | if (j) |
| 191 | tprints(", "); |
| 192 | tprintf("%#x", ninfo.oobfree[i][j]); |
| 193 | } |
| 194 | } |
| 195 | |
| 196 | tprints("}}, eccpos={"); |
| 197 | for (i = 0; i < ARRAY_SIZE(ninfo.eccpos); ++i) { |
| 198 | if (i) |
| 199 | tprints(", "); |
| 200 | tprintf("%#x", ninfo.eccpos[i]); |
| 201 | } |
| 202 | |
| 203 | tprints("}"); |
| 204 | } |
| 205 | |
| 206 | static void |
| 207 | decode_nand_ecclayout_user(struct tcb *tcp, const long addr) |
| 208 | { |
| 209 | struct nand_ecclayout_user nlay; |
| 210 | unsigned int i; |
| 211 | |
| 212 | tprints(", "); |
| 213 | if (umove_or_printaddr(tcp, addr, &nlay)) |
| 214 | return; |
| 215 | |
| 216 | tprintf("{eccbytes=%#x, eccpos={", nlay.eccbytes); |
| 217 | for (i = 0; i < ARRAY_SIZE(nlay.eccpos); ++i) { |
| 218 | if (i) |
| 219 | tprints(", "); |
| 220 | tprintf("%#x", nlay.eccpos[i]); |
| 221 | } |
| 222 | tprintf("}, oobavail=%#x, oobfree={", nlay.oobavail); |
| 223 | for (i = 0; i < ARRAY_SIZE(nlay.oobfree); ++i) { |
| 224 | if (i) |
| 225 | tprints(", "); |
| 226 | tprintf("{offset=%#x, length=%#x}", |
| 227 | nlay.oobfree[i].offset, nlay.oobfree[i].length); |
| 228 | } |
| 229 | tprints("}"); |
| 230 | } |
| 231 | |
| 232 | static void |
| 233 | decode_mtd_ecc_stats(struct tcb *tcp, const long addr) |
| 234 | { |
| 235 | struct mtd_ecc_stats es; |
| 236 | |
| 237 | tprints(", "); |
| 238 | if (umove_or_printaddr(tcp, addr, &es)) |
| 239 | return; |
| 240 | |
| 241 | tprintf("{corrected=%#x, failed=%#x, badblocks=%#x, bbtblocks=%#x}", |
| 242 | es.corrected, es.failed, es.badblocks, es.bbtblocks); |
| 243 | } |
| 244 | |
Dmitry V. Levin | a0866bc | 2016-05-28 18:46:39 +0000 | [diff] [blame] | 245 | MPERS_PRINTER_DECL(int, mtd_ioctl, struct tcb *tcp, |
| 246 | const unsigned int code, const long arg) |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 247 | { |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 248 | switch (code) { |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 249 | case MEMERASE: |
| 250 | case MEMLOCK: |
| 251 | case MEMUNLOCK: |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 252 | case MEMISLOCKED: |
| 253 | decode_erase_info_user(tcp, arg); |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 254 | break; |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 255 | |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 256 | case MEMERASE64: |
| 257 | decode_erase_info_user64(tcp, arg); |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 258 | break; |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 259 | |
| 260 | case MEMWRITEOOB: |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 261 | case MEMREADOOB: |
| 262 | decode_mtd_oob_buf(tcp, arg); |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 263 | break; |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 264 | |
| 265 | case MEMWRITEOOB64: |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 266 | case MEMREADOOB64: |
| 267 | decode_mtd_oob_buf64(tcp, arg); |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 268 | break; |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 269 | |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 270 | case MEMWRITE: |
| 271 | decode_mtd_write_req(tcp, arg); |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 272 | break; |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 273 | |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 274 | case OTPGETREGIONINFO: |
| 275 | if (entering(tcp)) |
| 276 | return 0; |
| 277 | /* fall through */ |
| 278 | case OTPLOCK: |
| 279 | decode_otp_info(tcp, arg); |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 280 | break; |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 281 | |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 282 | case OTPSELECT: |
| 283 | decode_otp_select(tcp, arg); |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 284 | break; |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 285 | |
| 286 | case MTDFILEMODE: |
| 287 | tprints(", "); |
Dmitry V. Levin | 942da9c | 2016-05-16 23:06:17 +0000 | [diff] [blame] | 288 | printxval_long(mtd_file_mode_options, arg, "MTD_FILE_MODE_???"); |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 289 | break; |
| 290 | |
| 291 | case MEMGETBADBLOCK: |
| 292 | case MEMSETBADBLOCK: |
| 293 | tprints(", "); |
Dmitry V. Levin | dd5f0ce | 2015-07-20 11:14:12 +0000 | [diff] [blame] | 294 | printnum_int64(tcp, arg, "%" PRIu64); |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 295 | break; |
| 296 | |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 297 | case MEMGETINFO: |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 298 | if (entering(tcp)) |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 299 | return 0; |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 300 | decode_mtd_info_user(tcp, arg); |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 301 | break; |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 302 | |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 303 | case MEMGETOOBSEL: |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 304 | if (entering(tcp)) |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 305 | return 0; |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 306 | decode_nand_oobinfo(tcp, arg); |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 307 | break; |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 308 | |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 309 | case ECCGETLAYOUT: |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 310 | if (entering(tcp)) |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 311 | return 0; |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 312 | decode_nand_ecclayout_user(tcp, arg); |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 313 | break; |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 314 | |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 315 | case ECCGETSTATS: |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 316 | if (entering(tcp)) |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 317 | return 0; |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 318 | decode_mtd_ecc_stats(tcp, arg); |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 319 | break; |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 320 | |
| 321 | case OTPGETREGIONCOUNT: |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 322 | if (entering(tcp)) |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 323 | return 0; |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 324 | tprints(", "); |
| 325 | printnum_int(tcp, arg, "%u"); |
| 326 | break; |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 327 | |
| 328 | case MEMGETREGIONCOUNT: |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 329 | if (entering(tcp)) |
| 330 | return 0; |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 331 | tprints(", "); |
| 332 | printnum_int(tcp, arg, "%d"); |
| 333 | break; |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 334 | |
Dmitry V. Levin | 0a27c81 | 2016-05-28 18:42:50 +0000 | [diff] [blame] | 335 | case MEMGETREGIONINFO: |
| 336 | if (entering(tcp)) { |
| 337 | struct region_info_user rinfo; |
| 338 | |
| 339 | tprints(", "); |
| 340 | if (umove_or_printaddr(tcp, arg, &rinfo)) |
| 341 | break; |
| 342 | tprintf("{regionindex=%#x", rinfo.regionindex); |
| 343 | return 0; |
| 344 | } else { |
| 345 | struct region_info_user rinfo; |
| 346 | |
| 347 | if (!syserror(tcp) && !umove(tcp, arg, &rinfo)) |
| 348 | tprintf(", offset=%#x" |
| 349 | ", erasesize=%#x" |
| 350 | ", numblocks=%#x}", |
| 351 | rinfo.offset, |
| 352 | rinfo.erasesize, |
| 353 | rinfo.numblocks); |
| 354 | tprints("}"); |
| 355 | break; |
| 356 | } |
| 357 | |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 358 | default: |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 359 | return RVAL_DECODED; |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 360 | } |
Dmitry V. Levin | eddefd6 | 2015-07-07 04:12:12 +0300 | [diff] [blame] | 361 | |
| 362 | return RVAL_DECODED | 1; |
Mike Frysinger | 0cbed35 | 2012-04-04 22:22:01 -0400 | [diff] [blame] | 363 | } |