Example #1
0
/*
 * 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() */
Example #2
0
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;
}
Example #3
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;
}
Example #4
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;
}
Example #5
0
File: rpc.c Project: lynnard/RPC
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];
}