int parse_fixed_program_record(unsigned char **pp, struct fixed_program_record * prog, int varsize) { unsigned char * p = *pp; int data_len; u8 offset; memset(prog, 0, sizeof prog); prog->flags = rtv_to_u32(&p); prog->event_time = rtv_to_u32(&p); prog->tmsid = rtv_to_u32(&p); prog->minutes = rtv_to_u16(&p); prog->genre1 = *p++; prog->genre2 = *p++; prog->genre3 = *p++; prog->genre4 = *p++; prog->record_len = rtv_to_u16(&p); prog->title_len = *p++; prog->episode_len = *p++; prog->description_len = *p++; prog->actor_len = *p++; prog->guest_len = *p++; prog->suzuki_len = *p++; prog->producer_len = *p++; prog->director_len = *p++; if (varsize) data_len = prog->record_len - 28; else data_len = sizeof(prog->datablock); memcpy(prog->datablock, p, data_len); p += data_len; *pp = p; p = prog->datablock; if (prog->flags & 0x0040) parse_parts(&p, &prog->parts); if (prog->flags & 0x0020) parse_movie(&p, &prog->movie); offset = p - prog->datablock; prog->title_offset = offset; offset += prog->title_len; prog->episode_offset = offset; offset += prog->episode_len; prog->description_offset = offset; offset += prog->description_len; prog->actor_offset = offset; offset += prog->actor_len; prog->guest_offset = offset; offset += prog->guest_len; prog->suzuki_offset = offset; offset += prog->suzuki_len; prog->producer_offset = offset; offset += prog->producer_len; prog->director_offset = offset; offset += prog->director_len; expect(prog->record_len == 0 || ((offset + 28 + 3) & 0xfffc) == prog->record_len); return 0; }
static int parse_cmdline(struct cmdline_parts **parts, const char *cmdline) { int ret; char *buf; char *pbuf; char *next; struct cmdline_parts **next_parts; *parts = NULL; next = pbuf = buf = strdup(cmdline); if (!buf) { DBG_MSG("Fail to dup cmdline, size=%d\n", strlen(cmdline)); return -ENOMEM; } next_parts = parts; while (next && *pbuf) { next = strchr(pbuf, ';'); if (next) *next = '\0'; ret = parse_parts(next_parts, pbuf); if (ret) goto fail; if (next) pbuf = ++next; next_parts = &(*next_parts)->next_parts; } if (!*parts) { DBG_MSG("cmdline partition has not valid partition."); ret = -EINVAL; goto fail; } ret = 0; done: free(buf); return ret; fail: free_parts(parts); goto done; }