/* * get_proto * * returns -1 if error */ int get_proto(struct MPIR_COMMUNICATOR *comm, int src_lrank) { int rc; if (src_lrank == MPI_ANY_SOURCE) rc = (comm->vmpi_only ? mpi : unknown); else { if (src_lrank >= 0 && src_lrank < comm->np) { int src_grank = comm->lrank_to_grank[src_lrank]; struct channel_t *cp; if (!(cp = get_channel(src_grank))) { rc = -1; globus_libc_fprintf(stderr, "ERROR: get_proto: proc %d failed get_channel " "for src_grank %d\n", MPID_MyWorldRank, src_grank); print_channels(); } else if (!(cp->selected_proto)) { rc = -1; globus_libc_fprintf(stderr, "ERROR: get_proto: proc %d has NULL selected protocol " "for src_grank %d\n", MPID_MyWorldRank, src_grank); print_channels(); } else rc = (cp->selected_proto)->type; } else { rc = -1; globus_libc_fprintf(stderr, "ERROR: get_proto: src_lrank %d out of bounds for communicator " "with %d procs\n", src_lrank, comm->np); } /* endif */ } /* endif */ return rc; } /* end get_proto() */
static int get_chmap(snd_pcm_t *pcm, int format, int channels, int rate) { snd_pcm_chmap_t *map; if (setup_pcm(pcm, format, channels, rate)) return 1; map = snd_pcm_get_chmap(pcm); if (!map) { printf("Cannot get chmap\n"); return 1; } printf("Channels = %d\n", map->channels); print_channels(map); free(map); return 0; }
static int set_chmap(snd_pcm_t *pcm, int format, int channels, int rate, int nargs, char **arg) { int i; snd_pcm_chmap_t *map; if (channels && channels != nargs) { printf("Inconsistent channels %d vs %d\n", channels, nargs); return 1; } if (!channels) { if (!nargs) { printf("No channels are given\n"); return 1; } channels = nargs; } if (setup_pcm(pcm, format, channels, rate)) return 1; map = malloc(sizeof(int) * (channels + 1)); if (!map) { printf("cannot malloc\n"); return 1; } map->channels = channels; for (i = 0; i < channels; i++) { int val = snd_pcm_chmap_from_string(arg[i]); if (val < 0) val = SND_CHMAP_UNKNOWN; map->pos[i] = val; } if (snd_pcm_set_chmap(pcm, map) < 0) { printf("Cannot set chmap\n"); return 1; } free(map); map = snd_pcm_get_chmap(pcm); if (!map) { printf("Cannot get chmap\n"); return 1; } printf("Get channels = %d\n", map->channels); print_channels(map); free(map); return 0; }
static int query_chmaps(snd_pcm_t *pcm) { snd_pcm_chmap_query_t **maps = snd_pcm_query_chmaps(pcm); snd_pcm_chmap_query_t **p, *v; if (!maps) { printf("Cannot query maps\n"); return 1; } for (p = maps; (v = *p) != NULL; p++) { printf("Type = %s, Channels = %d\n", snd_pcm_chmap_type_name(v->type), v->map.channels); print_channels(&v->map); } snd_pcm_free_chmaps(maps); return 0; }
int main(int argc, char *argv[]) { int channels_len; fm_channel_t* channels; if (read_channels(&channels, &channels_len) != 0) { printf("Failed to retrieve the channel list. Try again later.\n"); return -1; } char *addr = "localhost"; char *port = "10098"; int c; while ((c = getopt(argc, argv, "a:p:")) != -1) { switch (c) { case 'a': addr = optarg; break; case 'p': port = optarg; break; default: break; } } char input_buf[64] = ""; char output_format[512] = ""; char output_buf[1024] = ""; int buf_size; if (optind < argc) { strcpy(input_buf, argv[optind]); int i; char *buf = strcmp(input_buf, "info") == 0 ? output_format : input_buf; for (i = optind + 1; i < argc; i++) { strcat(buf, " "); strcat(buf, argv[i]); } } else { strcpy(input_buf, "info"); } int open_webpage = 0; if (strcmp(input_buf, "channels") == 0) { print_channels(channels, channels_len); return 0; } else if (strcmp(input_buf, "help") == 0) { print_usage(); return 0; } else if (strcmp(input_buf, "launch") == 0) { // forcefully restart RPD system("pgrep rpd && /usr/local/bin/rpc end && sleep 30; /usr/local/bin/rpd"); return 0; } else if (strncmp(input_buf, "webpage", 7) == 0) { // client told to trigger a webpage strcpy(input_buf, "info"); open_webpage = 1; } struct addrinfo hints, *results, *p; int sock_fd; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; if (getaddrinfo(addr, port, &hints, &results) != 0) { return -1; } for (p = results; p != NULL; p = p->ai_next) { sock_fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol); if (sock_fd < 0) { continue; } if (connect(sock_fd, p->ai_addr, p->ai_addrlen) == 0) { break; } close(sock_fd); } if (p == NULL) { perror("connect"); return -1; } freeaddrinfo(results); send(sock_fd, input_buf, strlen(input_buf), 0); buf_size = recv(sock_fd, output_buf, sizeof(output_buf), 0); if (buf_size == 0) { close(sock_fd); return 0; } output_buf[buf_size] = '\0'; close(sock_fd); json_object *obj = json_tokener_parse(output_buf); char *status = obj ? strdup(json_object_get_string(json_object_object_get(obj, "status"))) : "error", *channel = "", *artist = "", *title = "", pos[16] = "", len[16] = "", kbps[8] = "", *album = "", *cover = "", year[8] = "", *douban_url = "", *like = ""; if (strcmp(status, "error") != 0) { char *chl = strdup(json_object_get_string(json_object_object_get(obj, "channel"))); long int cid; if (strcmp(chl, LOCAL_CHANNEL) == 0) { channel = get_local_channel_name(); } else if (strcmp(chl, JING_TOP_CHANNEL) == 0) { channel = JING_TOP_CHANNEL_NAME; } else if (strcmp(chl, JING_PSN_CHANNEL) == 0) { channel = JING_PSN_CHANNEL_NAME; } else { // determining if it is an integer number char *address; cid = strtol(chl, &address, 10); if (*address == '\0') { // this is valid number // loop through the array to get the correct name for the channel int i; for (i=0; i<channels_len; i++) { if (channels[i].id == cid) { channel = channels[i].name; break; } } if (channel[0] == '\0') { channel = "未知兆赫"; } } else { channel = chl; } } sprintf(kbps, "%d", json_object_get_int(json_object_object_get(obj, "kbps"))); if (strcmp(status, "stop") != 0) { time_str(json_object_get_int(json_object_object_get(obj, "pos")), pos); time_str(json_object_get_int(json_object_object_get(obj, "len")), len); like = json_object_get_int(json_object_object_get(obj, "like")) ? "1" : "0"; artist = strdup(json_object_get_string(json_object_object_get(obj, "artist"))); title = strdup(json_object_get_string(json_object_object_get(obj, "title"))); album = strdup(json_object_get_string(json_object_object_get(obj, "album"))); sprintf(year, "%d", json_object_get_int(json_object_object_get(obj, "year"))); cover = strdup(json_object_get_string(json_object_object_get(obj, "cover"))); douban_url = strdup(json_object_get_string(json_object_object_get(obj, "url"))); } } if (output_format[0] == '\0') { if (strcmp(status, "error") == 0) { if (obj) printf("%s\n", json_object_get_string(json_object_object_get(obj, "message"))); else printf("Unkown error with buf content %s\n", output_buf); } else if (open_webpage) { // open the designated webpage char sh[1280]; // the url can become rather long after escaping char url[1024]; if (escapesh(url, douban_url)[0] == '\0') { // we need to make a custom url to open sprintf(url, "%s %s", artist, album); // first obtain a curl instance to escape the query CURL *curl = curl_easy_init(); char *st = curl_easy_escape(curl, url, 0); sprintf(url, "https://music.douban.com/subject_search?search_text=%s&cat=1003", st); curl_free(st); curl_easy_cleanup(curl); } /* printf("url is %s\n", url); */ sprintf(sh, "%s $'%s' &", "$BROWSER", url); /* printf("cmd is %s\n", sh); */ system(sh); } else { printf("RPD %s - %s / %s kbps\n", strcmp(status, "play") == 0? "Playing": (strcmp(status, "pause") == 0? "Paused": "Stopped"), channel, kbps); if (strcmp(status, "stop") != 0) { printf("%s%s - %s\n%s / %s\n", like[0] == '1' ? "[Like] ": "", artist, title, pos, len); } } } else { char info[1024], *arg = ""; int l = strlen(output_format) + 1; // we must print out the information the user wants // trim the space in front int i = 1, pi = 0; while ( i < l) { char ch = output_format[i++]; if (i < l - 1 && ch == '%') { char spec = output_format[i++]; switch (spec) { case 'a': arg = artist; break; case 't': arg = title; break; case 'b': arg = album; break; case 'y': arg = year; break; case 'i': arg = cover; break; case 'd': arg = douban_url; break; case 'c': arg = channel; break; case 'p': arg = pos; break; case 'l': arg = len; break; case 'u': arg = status; break; case 'k': arg = kbps; break; case 'r': arg = like; break; case '%': arg = "%%"; break; default: printf("Unknown specifier %c. Try help\n", spec); return 1; } // loop through the arg and copy the chars while (*arg != '\0') { info[pi++] = *arg; arg++; } } else info[pi++] = ch; } printf(info); } json_object_put(obj); // free the channel list free_channels(channels, channels_len); return 0; }
void static process_arguments(char **argv, int argc, int *monitoring, int *verbose, int *n_sus_per_file, int *duration_per_file, int *drop_fisus, int *esnf, char **hostname, Channel_t channels[], int *n_channels, char **base_filename, enum PCap_format *format) { int current_arg; while (argc > 1 && argv[1][0] == '-') { switch (argv[1][1]) { case 'c': *format = PCAP_CLASSIC; break; case 'f': if (argc < 3) { usage(); } if (!strcmp("fisu=no", argv[2])) { *drop_fisus = 1; } else if (!strcmp("esnf=yes", argv[2])) { *esnf = 1; } argc--; argv++; break; case 'm': *monitoring = 1; break; case 'n': if (argc < 3) { usage(); } parse_rotation(argv[2], n_sus_per_file, duration_per_file); argc--; argv++; break; case 'v': *verbose = 1; break; default: usage(); } argc--; argv++; } if (argc < 4) { usage(); } *hostname = argv[1]; argv += 2; argc -= 2; current_arg = arguments_to_channels(argc, argv, channels, n_channels); if (!n_channels){ die("No timeslots given (or, perhaps, no output filename given)."); } print_channels(channels, *n_channels); *base_filename = argv[current_arg]; }