static int rd_files(struct path_info *info, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) { int i; cmyth_conn_t control; cmyth_proglist_t list; int count; pthread_mutex_lock(&mutex); if ((i=lookup_server(info->host)) < 0) { pthread_mutex_unlock(&mutex); return 0; } control = ref_hold(conn[i].control); if (conn[i].list == NULL) { list = cmyth_proglist_get_all_recorded(control); conn[i].list = list; } else { list = conn[i].list; } list = ref_hold(list); pthread_mutex_unlock(&mutex); count = cmyth_proglist_get_count(list); for (i=0; i<count; i++) { cmyth_proginfo_t prog; long long len; char *fn, *pn; struct stat st; prog = cmyth_proglist_get_item(list, i); pn = cmyth_proginfo_pathname(prog); len = cmyth_proginfo_length(prog); fn = pn+1; memset(&st, 0, sizeof(st)); st.st_mode = S_IFREG | 0444; st.st_size = len; debug("%s(): file '%s' len %lld\n", __FUNCTION__, fn, len); filler(buf, fn, &st, 0); ref_release(prog); ref_release(pn); } ref_release(control); ref_release(list); return 0; }
static void cmyth_chain_update(cmyth_chain_t chain, cmyth_recorder_t rec, char *msg) { char *p; cmyth_proginfo_t prog = NULL; cmyth_chain_entry_t entry; int size, tip; long long offset; int start = 0; char *path; if ((p=strchr(msg, ' ')) != NULL) { *(p++) = '\0'; if (strcmp(msg, "LIVETV_CHAIN UPDATE") != 0) { return; } } else { p = msg; } prog = cmyth_recorder_get_cur_proginfo(rec); if (prog == NULL) { return; } path = cmyth_proginfo_pathname(prog); if (path == NULL) { return; } if (strlen(path) == 0) { ref_release(path); ref_release(prog); return; } ref_release(path); pthread_mutex_lock(&chain->chain_mutex); if (!chain->chain_id || (strncmp(p, chain->chain_id, strlen(p)) != 0)) { goto out; } tip = chain->chain_count - 1; if (tip >= 0) { path = cmyth_proginfo_pathname(chain->chain_list[tip]->prog); ref_release(path); if (cmyth_proginfo_compare(prog, chain->chain_list[tip]->prog) == 0) { ref_release(prog); goto out; } offset = chain->chain_list[tip]->offset + cmyth_proginfo_length(chain->chain_list[tip]->prog); } else { offset = 0; start = 1; } size = sizeof(*chain->chain_list) * (++chain->chain_count); chain->chain_list = ref_realloc(chain->chain_list, size); entry = ref_alloc(sizeof(*entry)); entry->prog = prog; entry->file = NULL; entry->offset = offset; chain->chain_list[tip+1] = entry; pthread_cond_broadcast(&chain->chain_cond); out: pthread_mutex_unlock(&chain->chain_mutex); if (start) { chain->chain_current = 0; cmyth_chain_switch(chain, 0); } }
static int ga_all(struct path_info *info, struct stat *stbuf) { cmyth_conn_t control; cmyth_proglist_t list; int count; int i; pthread_mutex_lock(&mutex); if ((i=lookup_server(info->host)) < 0) { pthread_mutex_unlock(&mutex); return -ENOENT; } control = ref_hold(conn[i].control); if (conn[i].list == NULL) { list = cmyth_proglist_get_all_recorded(control); conn[i].list = list; } else { list = conn[i].list; } list = ref_hold(list); pthread_mutex_unlock(&mutex); stbuf->st_mode = S_IFLNK | 0444; stbuf->st_nlink = 1; count = cmyth_proglist_get_count(list); debug("%s(): file '%s'\n", __FUNCTION__, info->file); for (i=0; i<count; i++) { cmyth_proginfo_t prog; long long len; char *title, *s; char tmp[512]; prog = cmyth_proglist_get_item(list, i); title = cmyth_proginfo_title(prog); s = cmyth_proginfo_subtitle(prog); snprintf(tmp, sizeof(tmp), "%s - %s.nuv", title, s); if (strcmp(tmp, info->file) == 0) { cmyth_timestamp_t ts; time_t t; char *pn; len = cmyth_proginfo_length(prog); pn = cmyth_proginfo_pathname(prog); debug("%s(): file '%s' len %lld\n", __FUNCTION__, tmp, len); stbuf->st_size = strlen(pn) + 8; ts = cmyth_proginfo_rec_end(prog); t = cmyth_timestamp_to_unixtime(ts); stbuf->st_atime = t; stbuf->st_mtime = t; stbuf->st_ctime = t; ref_release(pn); ref_release(prog); ref_release(ts); ref_release(title); ref_release(s); ref_release(control); ref_release(list); return 0; } ref_release(prog); ref_release(title); ref_release(s); } ref_release(control); ref_release(list); return -ENOENT; }
static int show_proglist(cmyth_proglist_t episodes, int level, int show_card) { int count, i; if (episodes == NULL) { return -1; } count = cmyth_proglist_get_count(episodes); for (i=0; i<count; i++) { char *title; char *subtitle=NULL, *channel = NULL; char *description=NULL, *category=NULL, *recgroup=NULL; char *pathname=NULL; cmyth_proginfo_t prog; int rec; prog = cmyth_proglist_get_item(episodes, i); title = cmyth_proginfo_title(prog); rec = cmyth_proginfo_check_recording(control, prog); if (level > 2) { subtitle = cmyth_proginfo_subtitle(prog); channel = cmyth_proginfo_channame(prog); } if (level > 3) { description = cmyth_proginfo_description(prog); category = cmyth_proginfo_category(prog); recgroup = cmyth_proginfo_recgroup(prog); } if (level > 4) { pathname = cmyth_proginfo_pathname(prog); } if (channel) { printf("\tChannel: %s\n", channel); } if (title) { printf("\tTitle: %s\n", title); if (rec > 0) { cmyth_timestamp_t end; char str[32]; end = cmyth_proginfo_rec_end(prog); cmyth_timestamp_to_string(str, end); printf("\t RECORDING on %d until %s\n", rec, str); ref_release(end); } } if (subtitle) { printf("\tSubtitle: %s\n", subtitle); } if (description) { printf("\tDescription: %s\n", description); } if (category) { printf("\tCategory: %s\n", category); } if (recgroup) { printf("\tRecording Group: %s\n", recgroup); } if (pathname) { printf("\tPathname: %s\n", pathname); } if (level > 4) { printf("\tBytes: %lld\n", cmyth_proginfo_length(prog)); } if (level > 1 && show_card) { long card = cmyth_proginfo_card_id(prog); if (card == 0) { printf("\tRecorder: will not record\n"); } else { printf("\tRecorder: %ld\n", card); } } ref_release(channel); ref_release(title); ref_release(subtitle); ref_release(description); ref_release(category); ref_release(recgroup); ref_release(pathname); ref_release(prog); } ref_release(episodes); return count; }
static int ga_files(struct path_info *info, struct stat *stbuf) { cmyth_conn_t control; cmyth_proglist_t list; int count; int i; pthread_mutex_lock(&mutex); if ((i=lookup_server(info->host)) < 0) { pthread_mutex_unlock(&mutex); return -ENOENT; } control = ref_hold(conn[i].control); if (conn[i].list == NULL) { list = cmyth_proglist_get_all_recorded(control); conn[i].list = list; parse_progs(conn+i); } else { list = conn[i].list; } list = ref_hold(list); pthread_mutex_unlock(&mutex); stbuf->st_mode = S_IFREG | 0444; stbuf->st_nlink = 1; count = cmyth_proglist_get_count(list); debug("%s(): file '%s'\n", __FUNCTION__, info->file); for (i=0; i<count; i++) { cmyth_proginfo_t prog; long long len; char *pn; prog = cmyth_proglist_get_item(list, i); pn = cmyth_proginfo_pathname(prog); if (strcmp(pn+1, info->file) == 0) { cmyth_timestamp_t ts; time_t t; len = cmyth_proginfo_length(prog); debug("%s(): file '%s' len %lld\n", __FUNCTION__, pn+1, len); stbuf->st_size = len; stbuf->st_blksize = MAX_BSIZE; stbuf->st_blocks = len / MAX_BSIZE; if ((len * MAX_BSIZE) != stbuf->st_blocks) { stbuf->st_blocks++; } ts = cmyth_proginfo_rec_end(prog); t = cmyth_timestamp_to_unixtime(ts); stbuf->st_atime = t; stbuf->st_mtime = t; stbuf->st_ctime = t; ref_release(prog); ref_release(pn); ref_release(ts); ref_release(control); ref_release(list); return 0; } ref_release(prog); ref_release(pn); } ref_release(control); ref_release(list); return -ENOENT; }
static int rd_all(struct path_info *info, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) { int i; cmyth_conn_t control; cmyth_proglist_t list; int count; struct myth_conn *mc; pthread_mutex_lock(&mutex); if ((i=lookup_server(info->host)) < 0) { pthread_mutex_unlock(&mutex); return 0; } control = ref_hold(conn[i].control); if (conn[i].list == NULL) { list = cmyth_proglist_get_all_recorded(control); conn[i].list = list; parse_progs(conn+i); } else { list = conn[i].list; } mc = conn+i; list = ref_hold(list); pthread_mutex_unlock(&mutex); count = cmyth_proglist_get_count(list); char *name[count]; for (i=0; i<count; i++) { cmyth_proginfo_t prog; long long len; char *fn, *pn, *t, *s; prog = cmyth_proglist_get_item(list, i); pn = cmyth_proginfo_pathname(prog); t = cmyth_proginfo_title(prog); s = cmyth_proginfo_subtitle(prog); len = cmyth_proginfo_length(prog); if (mc->progs[i].suffix == 0) { name[i] = ref_sprintf("%s - %s.nuv", t, s); } else { name[i] = ref_sprintf("%s - %s (%d).nuv", t, s, mc->progs[i].suffix); } fn = pn+1; debug("%s(): file '%s' len %lld\n", __FUNCTION__, fn, len); filler(buf, name[i], NULL, 0); ref_release(prog); ref_release(pn); ref_release(t); ref_release(s); } for (i=0; i<count; i++) { ref_release(name[i]); } ref_release(control); ref_release(list); return 0; }
static int rd_shows(struct path_info *info, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) { int i; cmyth_conn_t control; cmyth_proglist_t list; int count; pthread_mutex_lock(&mutex); if ((i=lookup_server(info->host)) < 0) { pthread_mutex_unlock(&mutex); return 0; } control = ref_hold(conn[i].control); if (conn[i].list == NULL) { list = cmyth_proglist_get_all_recorded(control); conn[i].list = list; } else { list = conn[i].list; } list = ref_hold(list); pthread_mutex_unlock(&mutex); count = cmyth_proglist_get_count(list); if(info->subdir) { for (i=0; i<count; i++) { cmyth_proginfo_t prog; long long len; char *fn, *pn, *t, *s; struct stat st; char tmp[512]; prog = cmyth_proglist_get_item(list, i); t = cmyth_proginfo_title(prog); if(strcmp(t, info->subdir) == 0) { pn = cmyth_proginfo_pathname(prog); s = cmyth_proginfo_subtitle(prog); len = cmyth_proginfo_length(prog); fn = pn+1; snprintf(tmp, sizeof(tmp), "%s.nuv", s); memset(&st, 0, sizeof(st)); st.st_mode = S_IFLNK | 0444; st.st_size = strlen(pn) + 8; debug("%s(): file '%s' len %lld\n", __FUNCTION__, fn, len); filler(buf, tmp, &st, 0); snprintf(tmp, sizeof(tmp), "%s.nuv.png", s); memset(&st, 0, sizeof(st)); st.st_mode = S_IFLNK | 0444; st.st_size = strlen(pn) + 8; debug("%s(): file '%s' len %lld\n", __FUNCTION__, fn, len); filler(buf, tmp, &st, 0); ref_release(pn); ref_release(s); } ref_release(prog); ref_release(t); } } else { char** seen = malloc(sizeof(char*) * count); int seen_counter, k; seen_counter = 0; memset(seen, count, sizeof(char*)); for (i=0; i<count; i++) { cmyth_proginfo_t prog; char *t; struct stat st; char found; prog = cmyth_proglist_get_item(list, i); t = cmyth_proginfo_title(prog); found = 0; for(k=0; k<seen_counter; k++) { if(strcmp(seen[k], t) == 0) { found = 1; break; } } if(!found) { seen[seen_counter] = strdup(t); seen_counter++; st.st_mode = S_IFDIR | 0555; st.st_nlink = 2; debug("%s(): dir '%s'\n", __FUNCTION__, t); filler(buf, t, &st, 0); } ref_release(prog); ref_release(t); } for(i=0; i<seen_counter; i++) { free(seen[i]); } free(seen); } ref_release(control); ref_release(list); return 0; }