1/*
2 * FreeBSD install - a package for the installation and maintenance
3 * of non-core utilities.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * Jeremy D. Lea.
15 * 11 May 2002
16 *
17 * This is the version module. Based on pkg_version.pl by Bruce A. Mah.
18 *
19 */
20
21#include <sys/cdefs.h>
22__FBSDID("$FreeBSD$");
23
24
25#include <getopt.h>
26#include <err.h>
27
28#include "lib.h"
29#include "version.h"
30
31char	*LimitChars = NULL;
32char	*PreventChars = NULL;
33char	*MatchName = NULL;
34char	*LookUpOrigin = NULL;
35Boolean RegexExtended = FALSE;
36Boolean UseINDEXOnly = FALSE;
37Boolean ShowOrigin = FALSE;
38
39static void usage(void);
40
41static char opts[] = "dIhl:L:qs:XtTO:ov";
42static struct option longopts[] = {
43	{ "extended",	no_argument,		NULL,		'X' },
44	{ "help",	no_argument,		NULL,		'h' },
45	{ "match",	required_argument,	NULL,		's' },
46	{ "no-status",	required_argument,	NULL,		'L' },
47	{ "origin",	required_argument,	NULL,		'O' },
48	{ "quiet",	no_argument,		NULL,		'q' },
49	{ "show-origin",no_argument,		NULL,		'o' },
50	{ "status",	required_argument,	NULL,		'l' },
51	{ "index-only",	no_argument,		NULL,		'I' },
52	{ "verbose",	no_argument,		NULL,		'v' },
53	{ NULL,		0,			NULL,		0 }
54};
55
56int
57main(int argc, char **argv)
58{
59    int ch, cmp = 0;
60
61    warnpkgng();
62    if (argc == 4 && !strcmp(argv[1], "-t")) {
63	cmp = version_cmp(argv[2], argv[3]);
64	printf(cmp > 0 ? ">\n" : (cmp < 0 ? "<\n" : "=\n"));
65	exit(0);
66    }
67    else if (argc == 4 && !strcmp(argv[1], "-T")) {
68	cmp = version_match(argv[3], argv[2]);
69	exit(cmp == 1 ? 0 : 1);
70    }
71    else while ((ch = getopt_long(argc, argv, opts, longopts, NULL)) != -1) {
72	switch(ch) {
73	case 'v':
74	    Verbose++;
75	    break;
76
77	case 'I':
78	    UseINDEXOnly = TRUE;
79	    break;
80
81	case 'l':
82	    LimitChars = optarg;
83	    break;
84
85	case 'L':
86	    PreventChars = optarg;
87	    break;
88
89	case 'q':
90	    Quiet = TRUE;
91	    break;
92
93	case 's':
94	    MatchName = optarg;
95	    break;
96
97	case 'O':
98	    LookUpOrigin = optarg;
99	    break;
100
101	case 'o':
102	    ShowOrigin = TRUE;
103	    break;
104
105	case 't':
106	    errx(2, "Invalid -t usage.");
107	    break;
108
109	case 'T':
110	    errx(2, "Invalid -T usage.");
111	    break;
112
113	case 'X':
114	    RegexExtended = TRUE;
115	    break;
116
117	case 'h':
118	default:
119	    usage();
120	    break;
121	}
122    }
123
124    argc -= optind;
125    argv += optind;
126
127    return pkg_perform(argv);
128}
129
130static void
131usage(void)
132{
133    fprintf(stderr, "%s\n%s\n%s\n",
134	"usage: pkg_version [-hIoqv] [-l limchar] [-L limchar] [[-X] -s string] [-O origin] [index]",
135	"       pkg_version -t v1 v2",
136	"       pkg_version -T name pattern");
137    exit(1);
138}
139