Cygwin: cygcheck: package info / available package search, take 1
cygcheck -i == dnf info <pattern...> cygcheck -e == dnf search <pattern...> Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
963d6c79ea
commit
76d2053ec8
|
@ -33,7 +33,7 @@ cygcheck_SOURCES = \
|
||||||
path.cc
|
path.cc
|
||||||
cygcheck_CPPFLAGS=-I$(srcdir)/.. -idirafter ${top_srcdir}/cygwin/include
|
cygcheck_CPPFLAGS=-I$(srcdir)/.. -idirafter ${top_srcdir}/cygwin/include
|
||||||
cygcheck_LDFLAGS = ${AM_LDFLAGS} -Wl,--disable-high-entropy-va
|
cygcheck_LDFLAGS = ${AM_LDFLAGS} -Wl,--disable-high-entropy-va
|
||||||
cygcheck_LDADD = -lz -lwininet -lpsapi -lntdll
|
cygcheck_LDADD = -lz -lwininet -lshlwapi -lpsapi -lntdll
|
||||||
|
|
||||||
cygwin_console_helper_SOURCES = cygwin-console-helper.cc
|
cygwin_console_helper_SOURCES = cygwin-console-helper.cc
|
||||||
|
|
||||||
|
|
|
@ -6,25 +6,27 @@
|
||||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
details. */
|
details. */
|
||||||
|
|
||||||
#define cygwin_internal cygwin_internal_dontuse
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <wininet.h>
|
#include <wininet.h>
|
||||||
|
#include <shlwapi.h>
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "wide_path.h"
|
#include "wide_path.h"
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <cygwin/version.h>
|
#include <cygwin/version.h>
|
||||||
|
#define cygwin_internal cygwin_internal_dontuse
|
||||||
#include <sys/cygwin.h>
|
#include <sys/cygwin.h>
|
||||||
|
#undef cygwin_internal
|
||||||
#define _NOMNTENT_MACROS
|
#define _NOMNTENT_MACROS
|
||||||
#include <mntent.h>
|
#include <mntent.h>
|
||||||
#undef cygwin_internal
|
|
||||||
#include "loadlib.h"
|
#include "loadlib.h"
|
||||||
|
|
||||||
#ifndef max
|
#ifndef max
|
||||||
|
@ -35,6 +37,11 @@
|
||||||
#define alloca __builtin_alloca
|
#define alloca __builtin_alloca
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
uintptr_t (*cygwin_internal) (cygwin_getinfo_types, ...);
|
||||||
|
WCHAR cygwin_dll_path[32768];
|
||||||
|
};
|
||||||
|
|
||||||
int verbose = 0;
|
int verbose = 0;
|
||||||
int registry = 0;
|
int registry = 0;
|
||||||
int sysinfo = 0;
|
int sysinfo = 0;
|
||||||
|
@ -45,6 +52,8 @@ int dump_only = 0;
|
||||||
int find_package = 0;
|
int find_package = 0;
|
||||||
int list_package = 0;
|
int list_package = 0;
|
||||||
int grep_packages = 0;
|
int grep_packages = 0;
|
||||||
|
int info_packages = 0;
|
||||||
|
int search_packages = 0;
|
||||||
int del_orphaned_reg = 0;
|
int del_orphaned_reg = 0;
|
||||||
|
|
||||||
static char emptystr[] = "";
|
static char emptystr[] = "";
|
||||||
|
@ -238,6 +247,14 @@ display_internet_error (const char *message, ...)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline char *
|
||||||
|
stpcpy (char *d, const char *s)
|
||||||
|
{
|
||||||
|
while ((*d++ = *s++))
|
||||||
|
;
|
||||||
|
return --d;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_path (char *s, int maxlen, bool issys)
|
add_path (char *s, int maxlen, bool issys)
|
||||||
{
|
{
|
||||||
|
@ -2069,10 +2086,462 @@ fetch_url (const char *url, FILE *outstream)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct passwd {
|
||||||
|
char *pw_name; /* user name */
|
||||||
|
char *pw_passwd; /* encrypted password */
|
||||||
|
uint32_t pw_uid; /* user uid */
|
||||||
|
uint32_t pw_gid; /* user gid */
|
||||||
|
char *pw_comment; /* comment */
|
||||||
|
char *pw_gecos; /* Honeywell login info */
|
||||||
|
char *pw_dir; /* home directory */
|
||||||
|
char *pw_shell; /* default shell */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sidbuf {
|
||||||
|
PSID psid;
|
||||||
|
int buffer[10];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Downloads setup.ini from cygwin.com, if it hasn't been downloaded
|
||||||
|
already or is older than 24h. */
|
||||||
|
static FILE *
|
||||||
|
maybe_download_setup_ini ()
|
||||||
|
{
|
||||||
|
time_t t24h_before;
|
||||||
|
char *path;
|
||||||
|
struct stat st;
|
||||||
|
FILE *fp;
|
||||||
|
struct passwd *pw;
|
||||||
|
sidbuf curr_user;
|
||||||
|
|
||||||
|
t24h_before = time (NULL) - 24 * 60 * 60;
|
||||||
|
for (int i = 0; i < 2; ++i)
|
||||||
|
{
|
||||||
|
/* Check for the system-wide setup.ini file first. If that's too
|
||||||
|
old and not writable, check for ~/.setup.ini. */
|
||||||
|
if (i == 0)
|
||||||
|
path = cygpath ("/etc/setup/setup.ini", NULL);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BOOL ret;
|
||||||
|
DWORD len;
|
||||||
|
HANDLE ptok;
|
||||||
|
|
||||||
|
if (!OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &ptok))
|
||||||
|
return NULL;
|
||||||
|
ret = GetTokenInformation (ptok, TokenUser, &curr_user,
|
||||||
|
sizeof curr_user, &len);
|
||||||
|
CloseHandle (ptok);
|
||||||
|
if (!ret)
|
||||||
|
return NULL;
|
||||||
|
pw = (struct passwd *) cygwin_internal (CW_GETPWSID, FALSE,
|
||||||
|
curr_user.psid);
|
||||||
|
if (!pw)
|
||||||
|
return NULL;
|
||||||
|
path = cygpath (pw->pw_dir, "/.setup.ini", NULL);
|
||||||
|
}
|
||||||
|
/* If file exists, and has been downloaded less than 24h ago,
|
||||||
|
and if we can open it for reading, just use it. */
|
||||||
|
if (stat (path, &st) == 0
|
||||||
|
&& st.st_mtime > t24h_before
|
||||||
|
&& (fp = fopen (path, "rt")) != NULL)
|
||||||
|
return fp;
|
||||||
|
/* Otherwise, try to open it for writing and fetch from cygwin.com. */
|
||||||
|
if ((fp = fopen (path, "w+")) != NULL)
|
||||||
|
{
|
||||||
|
fputs ("Fetching setup.ini from cygwin.com...\n", stderr);
|
||||||
|
if (!fetch_url ("https://cygwin.com/ftp/cygwin/x86_64/setup.ini", fp))
|
||||||
|
{
|
||||||
|
fclose (fp);
|
||||||
|
fp = fopen (path, "rt");
|
||||||
|
return fp;
|
||||||
|
}
|
||||||
|
fclose (fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct vers_info
|
||||||
|
{
|
||||||
|
char *version;
|
||||||
|
char *install;
|
||||||
|
char *source;
|
||||||
|
char *depends2;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ini_package_info
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
char *sdesc;
|
||||||
|
char *ldesc;
|
||||||
|
char *category;
|
||||||
|
char *url;
|
||||||
|
char *license;
|
||||||
|
vers_info curr;
|
||||||
|
size_t prev_count;
|
||||||
|
vers_info *prev;
|
||||||
|
size_t test_count;
|
||||||
|
vers_info *test;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_pkg_info (ini_package_info *pi)
|
||||||
|
{
|
||||||
|
free (pi->name);
|
||||||
|
free (pi->sdesc);
|
||||||
|
free (pi->ldesc);
|
||||||
|
free (pi->category);
|
||||||
|
free (pi->url);
|
||||||
|
free (pi->license);
|
||||||
|
free (pi->curr.version);
|
||||||
|
free (pi->curr.install);
|
||||||
|
free (pi->curr.source);
|
||||||
|
free (pi->curr.depends2);
|
||||||
|
if (pi->prev)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < pi->prev_count; ++i)
|
||||||
|
{
|
||||||
|
free (pi->prev[i].version);
|
||||||
|
free (pi->prev[i].install);
|
||||||
|
free (pi->prev[i].source);
|
||||||
|
free (pi->prev[i].depends2);
|
||||||
|
}
|
||||||
|
free (pi->prev);
|
||||||
|
}
|
||||||
|
if (pi->test)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < pi->test_count; ++i)
|
||||||
|
{
|
||||||
|
free (pi->test[i].version);
|
||||||
|
free (pi->test[i].install);
|
||||||
|
free (pi->test[i].source);
|
||||||
|
free (pi->test[i].depends2);
|
||||||
|
}
|
||||||
|
free (pi->test);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
collect_quoted_string (char *&tgt, FILE *fp, char *buf, size_t size, size_t offset)
|
||||||
|
{
|
||||||
|
bool found = false;
|
||||||
|
char *cp, *s;
|
||||||
|
|
||||||
|
cp = buf + offset;
|
||||||
|
if (*cp != '"') /* just 'til end of line */
|
||||||
|
{
|
||||||
|
if ((s = strchr (cp, '\n')))
|
||||||
|
*s = '\0';
|
||||||
|
tgt = strdup (cp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* text starts with a quote, collect 'til the closing quote */
|
||||||
|
++cp;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ((s = strrchr (cp, '"')) && (s == cp || s[-1] != '\\'))
|
||||||
|
{
|
||||||
|
*s = '\0';
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if (!tgt)
|
||||||
|
s = (char *) calloc (strlen (cp) + 1, sizeof *s);
|
||||||
|
else
|
||||||
|
s = (char *) realloc (tgt, strlen (tgt) + strlen (cp) + 1);
|
||||||
|
if (s)
|
||||||
|
{
|
||||||
|
tgt = s;
|
||||||
|
strcat (tgt, cp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (!found && (cp = fgets (buf, size, fp)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static ini_package_info *
|
||||||
|
collect_pkg_info (FILE *fp, ini_package_info *pi)
|
||||||
|
{
|
||||||
|
vers_info *vinfo = &pi->curr;
|
||||||
|
char buf[4096];
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
memset (pi, 0, sizeof *pi);
|
||||||
|
/* Search next line starting with "@ ". */
|
||||||
|
while ((s = fgets (buf, sizeof buf, fp)))
|
||||||
|
{
|
||||||
|
if (s[0] == '@' && s[1] == ' ')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!s)
|
||||||
|
goto error;
|
||||||
|
/* Extract package name */
|
||||||
|
if ((s = strchr (buf, '\n')))
|
||||||
|
*s = '\0';
|
||||||
|
pi->name = strdup (buf + 2);
|
||||||
|
/* collect all of this package block. */
|
||||||
|
while ((s = fgets (buf, sizeof buf, fp)))
|
||||||
|
{
|
||||||
|
/* empty line? EOR. */
|
||||||
|
if (s[0] == '\n')
|
||||||
|
break;
|
||||||
|
/* prev or test version? */
|
||||||
|
if (buf[0] == '[')
|
||||||
|
{
|
||||||
|
vers_info **vers_p = NULL;
|
||||||
|
size_t *vers_cnt_p = NULL;
|
||||||
|
|
||||||
|
if (!strncmp (buf, "[prev]", strlen ("[prev]")))
|
||||||
|
{
|
||||||
|
vers_p = &pi->prev;
|
||||||
|
vers_cnt_p = &pi->prev_count;
|
||||||
|
}
|
||||||
|
else if (!strncmp (buf, "[test]", strlen ("[test]")))
|
||||||
|
{
|
||||||
|
vers_p = &pi->test;
|
||||||
|
vers_cnt_p = &pi->test_count;
|
||||||
|
}
|
||||||
|
if (vers_p)
|
||||||
|
{
|
||||||
|
vers_info *v;
|
||||||
|
|
||||||
|
v = (vers_info *) realloc (*vers_p, (*vers_cnt_p + 1)
|
||||||
|
* sizeof (vers_info));
|
||||||
|
if (!v)
|
||||||
|
goto error;
|
||||||
|
*vers_p = v;
|
||||||
|
vinfo = *vers_p + *vers_cnt_p;
|
||||||
|
memset (vinfo, 0, sizeof *vinfo);
|
||||||
|
++(*vers_cnt_p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strncmp (buf, "sdesc: ", strlen ("sdesc: ")))
|
||||||
|
collect_quoted_string (pi->sdesc, fp, buf, sizeof buf,
|
||||||
|
strlen ("sdesc: "));
|
||||||
|
else if (!strncmp (buf, "ldesc: ", strlen ("ldesc: ")))
|
||||||
|
collect_quoted_string (pi->ldesc, fp, buf, sizeof buf,
|
||||||
|
strlen ("ldesc: "));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((s = strchr (buf, '\n')))
|
||||||
|
*s = '\0';
|
||||||
|
if (!strncmp (buf, "category: ", strlen ("category: ")))
|
||||||
|
pi->category = strdup (buf + strlen ("category: "));
|
||||||
|
else if (!strncmp (buf, "url: ", strlen ("url: ")))
|
||||||
|
pi->url = strdup (buf + strlen ("url: "));
|
||||||
|
else if (!strncmp (buf, "license: ", strlen ("license: ")))
|
||||||
|
pi->license = strdup (buf + strlen ("license: "));
|
||||||
|
else if (!strncmp (buf, "version: ", strlen ("version: ")))
|
||||||
|
vinfo->version = strdup (buf + strlen ("version: "));
|
||||||
|
else if (!strncmp (buf, "install: ", strlen ("install: ")))
|
||||||
|
vinfo->install = strdup (buf + strlen ("install: "));
|
||||||
|
else if (!strncmp (buf, "source: ", strlen ("source: ")))
|
||||||
|
vinfo->source = strdup (buf + strlen ("source: "));
|
||||||
|
else if (!strncmp (buf, "depends2: ", strlen ("depends2: ")))
|
||||||
|
vinfo->depends2 = strdup (buf + strlen ("depends2: "));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pi;
|
||||||
|
error:
|
||||||
|
free_pkg_info (pi);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
package_info_print (ini_package_info *pi, vers_info *vers)
|
||||||
|
{
|
||||||
|
char buf[4096];
|
||||||
|
|
||||||
|
printf ("Name : %s\n", pi->name);
|
||||||
|
if (vers->version)
|
||||||
|
{
|
||||||
|
char *version = strcpy (buf, vers->version);
|
||||||
|
char *release = NULL;
|
||||||
|
|
||||||
|
release = strrchr (version, '-');
|
||||||
|
if (release)
|
||||||
|
*release++ = '\0';
|
||||||
|
printf ("Version : %s\n", version);
|
||||||
|
if (release)
|
||||||
|
printf ("Release : %s\n", release);
|
||||||
|
}
|
||||||
|
if (vers->install)
|
||||||
|
{
|
||||||
|
char *arch = strcpy (buf, vers->install);
|
||||||
|
char *size = NULL;
|
||||||
|
char *cp;
|
||||||
|
|
||||||
|
cp = strchr (arch, '/');
|
||||||
|
if (cp)
|
||||||
|
{
|
||||||
|
*cp++ = '\0';
|
||||||
|
cp = strchr (cp, ' ');
|
||||||
|
if (cp)
|
||||||
|
{
|
||||||
|
size = ++cp;
|
||||||
|
cp = strchr (cp, ' ');
|
||||||
|
if (cp)
|
||||||
|
*cp = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cp)
|
||||||
|
{
|
||||||
|
printf ("Architecture : %s\n", arch);
|
||||||
|
printf ("Size : %s\n", size); /* FIXME: human-readable */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (vers->source)
|
||||||
|
{
|
||||||
|
char *source = strcpy (buf, vers->source);
|
||||||
|
char *cp = strchr (source, ' ');
|
||||||
|
if (cp)
|
||||||
|
{
|
||||||
|
*cp = '\0';
|
||||||
|
cp = strrchr (source, '/');
|
||||||
|
if (cp)
|
||||||
|
printf ("Source : %s\n", cp + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pi->sdesc)
|
||||||
|
printf ("Summary : %s\n", pi->sdesc);
|
||||||
|
if (pi->url)
|
||||||
|
printf ("Url : %s\n", pi->url);
|
||||||
|
if (pi->license)
|
||||||
|
printf ("License : %s\n", pi->license);
|
||||||
|
if (pi->ldesc)
|
||||||
|
{
|
||||||
|
char *ldesc = strcpy (buf, pi->ldesc);
|
||||||
|
|
||||||
|
while (ldesc)
|
||||||
|
{
|
||||||
|
char *nl = strchr (ldesc, '\n');
|
||||||
|
if (nl)
|
||||||
|
*nl = '\0';
|
||||||
|
printf ("%s : %s\n", ldesc == buf ? "Description " : " ",
|
||||||
|
ldesc);
|
||||||
|
ldesc = nl ? nl + 1 : NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
puts ("");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print full info for the package matching the search string in terms of
|
||||||
|
name/version. */
|
||||||
|
static int
|
||||||
|
package_info (char **search)
|
||||||
|
{
|
||||||
|
FILE *fp = maybe_download_setup_ini ();
|
||||||
|
ini_package_info pi_buf, *pi;
|
||||||
|
|
||||||
|
if (!fp)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
while (search && *search)
|
||||||
|
{
|
||||||
|
rewind (fp);
|
||||||
|
while ((pi = collect_pkg_info (fp, &pi_buf)))
|
||||||
|
{
|
||||||
|
/* Name matches? Print all versions */
|
||||||
|
if (PathMatchSpecA (pi->name, *search))
|
||||||
|
{
|
||||||
|
if (pi->curr.version)
|
||||||
|
package_info_print (pi, &pi->curr);
|
||||||
|
for (size_t i = 0; i < pi->prev_count; ++i)
|
||||||
|
package_info_print (pi, pi->prev + i);
|
||||||
|
for (size_t i = 0; i < pi->test_count; ++i)
|
||||||
|
package_info_print (pi, pi->test + i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Check if search matches name-version string */
|
||||||
|
char nv_buf[4096], *nvp, *cp;
|
||||||
|
|
||||||
|
nvp = stpcpy (nv_buf, pi->name);
|
||||||
|
*nvp++ = '-';
|
||||||
|
|
||||||
|
if (pi->curr.version)
|
||||||
|
{
|
||||||
|
stpcpy (nvp, pi->curr.version);
|
||||||
|
if (PathMatchSpecA (nv_buf, *search))
|
||||||
|
package_info_print (pi, &pi->curr);
|
||||||
|
else if ((cp = strrchr (nvp, '-'))) /* try w/o release */
|
||||||
|
{
|
||||||
|
*cp = '\0';
|
||||||
|
if (PathMatchSpecA (nv_buf, *search))
|
||||||
|
package_info_print (pi, &pi->curr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < pi->prev_count; ++i)
|
||||||
|
{
|
||||||
|
stpcpy (nvp, pi->prev[i].version);
|
||||||
|
if (PathMatchSpecA (nv_buf, *search))
|
||||||
|
package_info_print (pi, pi->prev + i);
|
||||||
|
else if ((cp = strrchr (nvp, '-'))) /* try w/o release */
|
||||||
|
{
|
||||||
|
*cp = '\0';
|
||||||
|
if (PathMatchSpecA (nv_buf, *search))
|
||||||
|
package_info_print (pi, pi->prev + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < pi->test_count; ++i)
|
||||||
|
{
|
||||||
|
stpcpy (nvp, pi->test[i].version);
|
||||||
|
if (PathMatchSpecA (nv_buf, *search))
|
||||||
|
package_info_print (pi, pi->test + i);
|
||||||
|
else if ((cp = strrchr (nvp, '-'))) /* try w/o release */
|
||||||
|
{
|
||||||
|
*cp = '\0';
|
||||||
|
if (PathMatchSpecA (nv_buf, *search))
|
||||||
|
package_info_print (pi, pi->test + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free_pkg_info (&pi_buf);
|
||||||
|
}
|
||||||
|
++search;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Search for the search string in name and sdesc of available packages. */
|
||||||
|
static int
|
||||||
|
package_search (char **search)
|
||||||
|
{
|
||||||
|
FILE *fp = maybe_download_setup_ini ();
|
||||||
|
ini_package_info pi_buf, *pi;
|
||||||
|
char *ext_search, *ep;
|
||||||
|
|
||||||
|
if (!fp)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
while (search && *search)
|
||||||
|
{
|
||||||
|
ext_search = (char *) malloc (strlen (*search) + 3);
|
||||||
|
ep = ext_search;
|
||||||
|
if (*(search)[0] != '*')
|
||||||
|
*ep++ = '*';
|
||||||
|
ep = stpcpy (ep, *search);
|
||||||
|
if (ep[-1] != '*')
|
||||||
|
stpcpy (ep, "*");
|
||||||
|
|
||||||
|
rewind (fp);
|
||||||
|
while ((pi = collect_pkg_info (fp, &pi_buf)))
|
||||||
|
{
|
||||||
|
if (PathMatchSpecA (pi->name, ext_search)
|
||||||
|
|| (pi->sdesc && PathMatchSpecA (pi->sdesc, ext_search)))
|
||||||
|
printf ("%s : %s\n", pi->name, pi->sdesc);
|
||||||
|
free_pkg_info (&pi_buf);
|
||||||
|
}
|
||||||
|
free (ext_search);
|
||||||
|
++search;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Queries Cygwin web site for packages containing files matching a regexp.
|
/* Queries Cygwin web site for packages containing files matching a regexp.
|
||||||
Return value is 1 if there was a problem, otherwise 0. */
|
Return value is 1 if there was a problem, otherwise 0. */
|
||||||
static int
|
static int
|
||||||
package_grep (char *search)
|
package_grep (const char *search)
|
||||||
{
|
{
|
||||||
/* construct the actual URL by escaping */
|
/* construct the actual URL by escaping */
|
||||||
char *url = (char *) alloca (sizeof (grep_base_url) + strlen (ARCH_str)
|
char *url = (char *) alloca (sizeof (grep_base_url) + strlen (ARCH_str)
|
||||||
|
@ -2109,6 +2578,8 @@ Usage: cygcheck [-v] [-h] PROGRAM\n\
|
||||||
cygcheck -k\n\
|
cygcheck -k\n\
|
||||||
cygcheck -f FILE [FILE]...\n\
|
cygcheck -f FILE [FILE]...\n\
|
||||||
cygcheck -l [PACKAGE]...\n\
|
cygcheck -l [PACKAGE]...\n\
|
||||||
|
cygcheck -i [PATTERN]...\n\
|
||||||
|
cygcheck -e [PATTERN]...\n\
|
||||||
cygcheck -p REGEXP\n\
|
cygcheck -p REGEXP\n\
|
||||||
cygcheck --delete-orphaned-installation-keys\n\
|
cygcheck --delete-orphaned-installation-keys\n\
|
||||||
cygcheck -h\n\n\
|
cygcheck -h\n\n\
|
||||||
|
@ -2124,8 +2595,12 @@ At least one command option or a PROGRAM is required, as shown above.\n\
|
||||||
-r, --registry also scan registry for Cygwin settings (with -s)\n\
|
-r, --registry also scan registry for Cygwin settings (with -s)\n\
|
||||||
-k, --keycheck perform a keyboard check session (must be run from a\n\
|
-k, --keycheck perform a keyboard check session (must be run from a\n\
|
||||||
plain console only, not from a pty/rxvt/xterm)\n\
|
plain console only, not from a pty/rxvt/xterm)\n\
|
||||||
-f, --find-package find the package to which FILE belongs\n\
|
-f, --find-package find the installed package to which FILE belongs\n\
|
||||||
-l, --list-package list contents of PACKAGE (or all packages if none given)\n\
|
-l, --list-package list contents of the installed PACKAGE (or all\n\
|
||||||
|
installed packages if none given)\n\
|
||||||
|
-i, --info-package print full info on packages matching PATTERN, installed\n\
|
||||||
|
and available packages\n\
|
||||||
|
-e, --search-package list all available packages matching PATTERN\n\
|
||||||
-p, --package-query search for REGEXP in the entire cygwin.com package\n\
|
-p, --package-query search for REGEXP in the entire cygwin.com package\n\
|
||||||
repository (requires internet connectivity)\n\
|
repository (requires internet connectivity)\n\
|
||||||
--delete-orphaned-installation-keys\n\
|
--delete-orphaned-installation-keys\n\
|
||||||
|
@ -2153,6 +2628,8 @@ struct option longopts[] = {
|
||||||
{"keycheck", no_argument, NULL, 'k'},
|
{"keycheck", no_argument, NULL, 'k'},
|
||||||
{"find-package", no_argument, NULL, 'f'},
|
{"find-package", no_argument, NULL, 'f'},
|
||||||
{"list-package", no_argument, NULL, 'l'},
|
{"list-package", no_argument, NULL, 'l'},
|
||||||
|
{"info-packages", no_argument, NULL, 'i'},
|
||||||
|
{"search-packages", no_argument, NULL, 'e'},
|
||||||
{"package-query", no_argument, NULL, 'p'},
|
{"package-query", no_argument, NULL, 'p'},
|
||||||
{"delete-orphaned-installation-keys", no_argument, NULL, CO_DELETE_KEYS},
|
{"delete-orphaned-installation-keys", no_argument, NULL, CO_DELETE_KEYS},
|
||||||
{"help", no_argument, NULL, 'h'},
|
{"help", no_argument, NULL, 'h'},
|
||||||
|
@ -2160,7 +2637,7 @@ struct option longopts[] = {
|
||||||
{0, no_argument, NULL, 0}
|
{0, no_argument, NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
static char opts[] = "cdsrvkflphV";
|
static char opts[] = "cdsrvkfliephV";
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_version ()
|
print_version ()
|
||||||
|
@ -2188,11 +2665,6 @@ nuke (char *ev)
|
||||||
putenv (s);
|
putenv (s);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
uintptr_t (*cygwin_internal) (int, ...);
|
|
||||||
WCHAR cygwin_dll_path[32768];
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
load_cygwin (int& argc, char **&argv)
|
load_cygwin (int& argc, char **&argv)
|
||||||
{
|
{
|
||||||
|
@ -2201,7 +2673,7 @@ load_cygwin (int& argc, char **&argv)
|
||||||
if (!(h = LoadLibrary ("cygwin1.dll")))
|
if (!(h = LoadLibrary ("cygwin1.dll")))
|
||||||
return;
|
return;
|
||||||
GetModuleFileNameW (h, cygwin_dll_path, 32768);
|
GetModuleFileNameW (h, cygwin_dll_path, 32768);
|
||||||
if ((cygwin_internal = (uintptr_t (*) (int, ...))
|
if ((cygwin_internal = (uintptr_t (*) (cygwin_getinfo_types, ...))
|
||||||
GetProcAddress (h, "cygwin_internal")))
|
GetProcAddress (h, "cygwin_internal")))
|
||||||
{
|
{
|
||||||
char **av = (char **) cygwin_internal (CW_ARGV);
|
char **av = (char **) cygwin_internal (CW_ARGV);
|
||||||
|
@ -2239,6 +2711,7 @@ load_cygwin (int& argc, char **&argv)
|
||||||
putenv (path);
|
putenv (path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* GDB chokes when the DLL got unloaded and, for some reason, fails to set
|
/* GDB chokes when the DLL got unloaded and, for some reason, fails to set
|
||||||
any breakpoint after the fact. */
|
any breakpoint after the fact. */
|
||||||
if (!IsDebuggerPresent ())
|
if (!IsDebuggerPresent ())
|
||||||
|
@ -2287,6 +2760,12 @@ main (int argc, char **argv)
|
||||||
case 'l':
|
case 'l':
|
||||||
list_package = 1;
|
list_package = 1;
|
||||||
break;
|
break;
|
||||||
|
case 'i':
|
||||||
|
info_packages = 1;
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
search_packages = 1;
|
||||||
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
grep_packages = 1;
|
grep_packages = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -2310,7 +2789,7 @@ main (int argc, char **argv)
|
||||||
putenv ("POSIXLY_CORRECT=");
|
putenv ("POSIXLY_CORRECT=");
|
||||||
|
|
||||||
if ((argc == 0) && !sysinfo && !keycheck && !check_setup && !list_package
|
if ((argc == 0) && !sysinfo && !keycheck && !check_setup && !list_package
|
||||||
&& !del_orphaned_reg)
|
&& !del_orphaned_reg && !info_packages && !search_packages)
|
||||||
{
|
{
|
||||||
if (givehelp)
|
if (givehelp)
|
||||||
usage (stdout, 0);
|
usage (stdout, 0);
|
||||||
|
@ -2319,18 +2798,20 @@ main (int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((check_setup || sysinfo || find_package || list_package || grep_packages
|
if ((check_setup || sysinfo || find_package || list_package || grep_packages
|
||||||
|| del_orphaned_reg)
|
|| del_orphaned_reg || info_packages || search_packages)
|
||||||
&& keycheck)
|
&& keycheck)
|
||||||
usage (stderr, 1);
|
usage (stderr, 1);
|
||||||
|
|
||||||
if ((find_package || list_package || grep_packages)
|
if ((find_package || list_package || grep_packages
|
||||||
|
|| info_packages || search_packages)
|
||||||
&& (check_setup || del_orphaned_reg))
|
&& (check_setup || del_orphaned_reg))
|
||||||
usage (stderr, 1);
|
usage (stderr, 1);
|
||||||
|
|
||||||
if (dump_only && !check_setup && !sysinfo)
|
if (dump_only && !check_setup && !sysinfo)
|
||||||
usage (stderr, 1);
|
usage (stderr, 1);
|
||||||
|
|
||||||
if (find_package + list_package + grep_packages > 1)
|
if (find_package + list_package + grep_packages
|
||||||
|
+ info_packages + search_packages > 1)
|
||||||
usage (stderr, 1);
|
usage (stderr, 1);
|
||||||
|
|
||||||
if (keycheck)
|
if (keycheck)
|
||||||
|
@ -2339,6 +2820,10 @@ main (int argc, char **argv)
|
||||||
del_orphaned_reg_installations ();
|
del_orphaned_reg_installations ();
|
||||||
if (grep_packages)
|
if (grep_packages)
|
||||||
return package_grep (*argv);
|
return package_grep (*argv);
|
||||||
|
if (info_packages)
|
||||||
|
return package_info (argv);
|
||||||
|
if (search_packages)
|
||||||
|
return package_search (argv);
|
||||||
|
|
||||||
init_paths ();
|
init_paths ();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue