Mserv - a free open source jukebox-style music server for unix-like systems

mservcmd source

#define _GNU_SOURCE
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <mservcli.h>

int main(int argc, char *argv[])
{
  int i;
  unsigned int ui;
  char *user = "guest";
  char pass[32];
  char host[256];
  int port = 4444;
  struct sockaddr_in sin;
  struct hostent *hent;
  struct mservcli_id *id;
  int code;
  struct mservcli_data data;
  char *param[64];
  char *p;

  data.param = param;
  data.maxparams = 64;
  strcpy(pass, "guest");
  strcpy(host, "127.0.0.1");

  while ((i = getopt(argc, argv, "u:p:h:")) != -1) {
    switch(i) {
    case 'u':
      user = optarg;
      break;
    case 'p':
      strncpy(pass, optarg, sizeof(pass));
      pass[sizeof(pass)-1] = '\0';
      for (p = optarg; *p; p++)
        *p = 'x';
      break;
    case 'h':
      if ((p = strchr(optarg, ':')) != NULL) {
        port = atoi(p+1);
        i = ((unsigned int)(p-optarg) > sizeof(host)-1 ? sizeof(host)-1 :
             (unsigned int)(p-optarg));
        strncpy(host, optarg, i);
        host[i] = '\0';
      } else {
        strncpy(host, optarg, sizeof(host)-1);
        host[sizeof(host)-1] = '\0';
      }
      break;
    default:
      fputs("mservcmd: parameters not understood\n", stderr);
      exit(1);
    }
  }
  argc-= optind;
  argv+= optind;

  if (argc != 1) {
    fputs("Syntax: mservcmd [-u <user>] [-p <pass>] [-h <host>] <cmd>\n"
          "          See man page for further information\n",
          stderr);
    exit(1);
  }
  sin.sin_family = AF_INET;
  sin.sin_port = htons(port);
  if ((hent = gethostbyname(host)) == NULL) {
    fprintf(stderr, "mservcmd: unknown host\n", host);
    exit(2);
  }
  sin.sin_addr = *(struct in_addr *)hent->h_addr_list[0];
  if ((id = mservcli_connect(&sin, NULL, 0, user, pass, 0)) == NULL) {
    if (errno == EACCES) {
      fprintf(stderr, "mservcmd: server said access denied\n");
      exit(4);
    }
    fprintf(stderr, "mservcmd: unable to connect to server: %s\n",
            strerror(errno));
    exit(3);
  }
  if (mservcli_send(id, argv[0]) || mservcli_send(id, "\r\n")) {
    fprintf(stderr, "mservcmd: unable to send command: %s\n", strerror(errno));
    exit(5);
  }
  if ((code = mservcli_getresult(id)) == -1) {
    fprintf(stderr, "mservcmd: unable to get result to command: %s\n",
            strerror(errno));
    exit(5);
  }
  printf("%d\t%s\n", code, mservcli_getresultstr(id));
  do {
    if ((code = mservcli_getdata(id, &data)) == -1) {
      fprintf(stderr, "mservcmd: unable to get data: %s\n",
              strerror(errno));
      exit(5);
    }
    if (code)
      break;
    for (ui = 0; ui < data.params; ui++) {
      printf("%s%s", (ui ? "\t" : ""), data.param[ui]);
    }
    putchar('\n');
  } while (1);
  mservcli_free(id);
  return 0;
}