aboutsummaryrefslogtreecommitdiffstats
path: root/options.c
blob: 33de4c05a87d32878f55b04eb603ea98b560a4dd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
 * $Id: options.c,v 1.7 2004/03/17 11:34:36 kalle Exp $
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <popt.h>

#include "config.h"
#include "options.h"
#include "command.h"

static options_t options;

static struct poptOption optionsTable[] = {
#ifdef DEBUG
  { "debug",        'D', 0, 0, 'D', "Enable debug output." },
#endif
  { "version",      'V', 0, 0, 'V', "Display version information." },
  { "keys",         'k', 0, 0, 'k', "Display key bindings." },
  { "port",         'p', POPT_ARG_INT, &options.port, 0, 
    "Connect to server on port [" DEFAULT_PORT_STR "].", "PORT" },
  { "host",         'h', POPT_ARG_STRING, &options.host, 0, 
    "Connect to server [" DEFAULT_HOST "].", "HOSTNAME" },
  POPT_AUTOHELP
  { NULL, 0, 0, NULL, 0 }
};

static void
usage(poptContext optCon, int exitcode, char *error, char *addl) 
{
  poptPrintUsage(optCon, stderr, 0);
  if (error) 
    fprintf(stderr, "%s: %s0", error, addl);
  exit(exitcode);
}

options_t *
options_parse( int argc, char **argv )
{
  int c;
  poptContext optCon;   /* context for parsing command-line options */

  optCon = poptGetContext(NULL, argc, argv, optionsTable, 0);
  while ((c = poptGetNextOpt(optCon)) >= 0) 
    {
      switch (c) 
	{
#ifdef DEBUG
	case 'D':
	  options.debug = 1;
	  break;
#endif
	case 'V':
	  printf("Version " VERSION "\n");
	  exit(EXIT_SUCCESS);
	case 'k':
	  command_dump_keys();
	  exit(EXIT_SUCCESS);
	default:
	  fprintf(stderr, "%s: %s\n",
		  poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
		  poptStrerror(c));
	  poptFreeContext(optCon);
	  exit(EXIT_FAILURE);
	  break;
	}
    }
  if (c < -1) 
    {
      /* an error occurred during option processing */
      fprintf(stderr, "%s: %s\n",
	      poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
	      poptStrerror(c));
      poptFreeContext(optCon);
      exit(EXIT_FAILURE);
    }

  poptFreeContext(optCon);
  return &options;
}

void
options_init( void )
{
  char *value;

  memset(&options, 0, sizeof(options_t));
  if( (value=getenv(MPD_HOST_ENV)) )
    options.host = strdup(value);
  else
    options.host = strdup(DEFAULT_HOST);
  if( (value=getenv(MPD_PORT_ENV)) )
    options.port = atoi(value);
  else
    options.port = DEFAULT_PORT;
}


options_t *
options_get(void)
{
  return &options;
}