/*
@author: Alberto Jsé <guzzan0>
@package: pkgrmd - This package remove all dependences alone of a applications.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <ctype.h>
void search_package(char *package_name);
char **depends_parser(FILE *pkgfile, int *memory_hex);
int package_verify_and_remove(char **depends, int size_pointer);
int main(int argc, char *argv[])
{
if (argc > 1)
{
{
if (strncmp(argv
[1], "--info", 6) == 0) {
printf("Written by Alberto Jse <guzzan0>\nVersion: NULL\n\nPlease report bug to guzzano.ve@gmail.com\n"); }
else if (strncmp(argv
[1], "--help", 6) == 0) {
puts("Usage: pkgrmd <commands> or <package to remove>\nExample: pkgrmd wine, pkgrmd xorg, etc.\n"); puts("Commands avaiable: \n\n--help (Show this help) \n--info (Show the current version and author)"); }
else if (strcmp(argv
[1], "--") == 0) {
printf("Command invalid. Please try with \"pkgrmd --help\"\n"); }
else
{
printf("Command \"%s\" not found. Please try with \"pkgrmd --help\"\n", argv
[1]); }
}
else
{
{
search_package(argv[1]);
}
else if ((strlen(argv
[1])) > 30) {
puts("[pkgrmd] Maximum package name is 25"); }
}
}
else
{
printf("[pkgrmd] Try \"pkgdmr --help\" for more information. \n"); }
return 0;
}
/* Coding now... */
int package_verify_and_remove(char **depends, int size_pointer)
{
FILE
*package_db_installed
= fopen("/var/lib/pkg/db", "r"); char lines_db_parser[255], *install_package_p;
while (fgets(lines_db_parser
, 255, package_db_installed
) != NULL
) {
if ((strstr(lines_db_parser
, "/")) || (strstr(lines_db_parser
, "."))) {
continue;
}
printf("%s", lines_db_parser
);
}
return 0;
}
char **depends_parser(FILE *pkgfile, int *memory_hex)
{
char character, last_character = '0', *depends_string = NULL;
int memory_add = 0;
while ((character
= getc(pkgfile
)) != EOF
) {
if (character != '#' && last_character == '\n')
{
break;
}
if (character != '\n')
{
depends_string
= realloc(depends_string
, sizeof(char)*(memory_add
+1)); depends_string[memory_add] = character;
memory_add++;
}
else
{
depends_string
= realloc(depends_string
, sizeof(char)*(memory_add
+1)); if (depends_string == NULL)
{
puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?"); }
depends_string[memory_add] = '\0';
if (strstr(depends_string
, "# Depends on:")) {
char *depends_parsing = depends_string;
int spaces_fix = 0;
depends_parsing = depends_parsing + 13;
if (strlen(depends_parsing
) > 1) {
/*
Esto es una comprobación para saber si hay letras en [depends on:] ó si esta relleno
de solo espacios. Así evitamos que el puntero devuelva valores vacios.
OJO: Todavia lo estoy programando, tiene algunos errores.
*/
while (!(isalpha(*depends_parsing
))) {
if (*depends_parsing == '\0')
{
break;
}
spaces_fix++;
depends_parsing = depends_parsing + spaces_fix;
}
if (*depends_parsing == '\0')
{
return NULL;
}
/*
Aquí termina la comprobración.
*/
int index_depends = 0, index_depends_memory = 0;
char **depends_p
= malloc(sizeof(char *)*(index_depends_memory
+1)); if (depends_p == NULL)
{
puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?"); }
depends_p[index_depends_memory] = NULL;
while (*depends_parsing != '\0')
{
if (*depends_parsing != ' ')
{
if ((isalpha(*depends_parsing
)) || (isdigit(*depends_parsing
)) || *depends_parsing
== '-') {
depends_p
[index_depends_memory
] = realloc(depends_p
[index_depends_memory
], sizeof(char)*(index_depends
+1)); if (depends_p[index_depends_memory] == NULL)
{
puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?"); }
depends_p[index_depends_memory][index_depends] = *depends_parsing;
index_depends++;
}
}
else if (*depends_parsing == ' ')
{
depends_p
[index_depends_memory
] = realloc(depends_p
[index_depends_memory
], sizeof(char)*(index_depends
+1)); if (depends_p[index_depends_memory] == NULL)
{
puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?"); }
depends_p[index_depends_memory][index_depends] = '\0';
index_depends_memory++;
depends_p
= realloc(depends_p
, sizeof(char *)*(index_depends_memory
+1)); if (depends_p == NULL)
{
puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?"); }
depends_p[index_depends_memory] = NULL;
index_depends = 0;
}
depends_parsing++;
}
/*
Aquí estamos recibiendo la direción de int size_pointer
para agregarle cuantos *chars tiene depends_p
Esto todavia esta en BETA, no sé que pueda pasar o si tiene algún
efecto posterior modificar una variable de esta forma.
*/
*memory_hex = index_depends_memory+1;
return depends_p;
}
else
{
return NULL;
}
break;
}
memory_add = 0;
}
last_character = character;
}
return NULL;
}
void search_package(char *package_name)
{
char package_lines_file[225], *package_name_newline;
int package_install = 0;
FILE
*file_db
= fopen("/var/lib/pkg/db", "r");
package_name_newline
= malloc(sizeof(char)*(strlen(package_name
)+2)); if (package_name == NULL)
{
puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?"); }
sprintf(package_name_newline
, "%s\n", package_name
);
if (file_db)
{
while (fgets(package_lines_file
, 225, file_db
) != NULL
) {
if (strcmp(package_lines_file
, package_name_newline
) == 0) {
package_install = 1;
break;
}
}
}
free(package_name_newline
);
if (package_install == 0)
{
printf("[pkgrmd] The package \"%s\" is not installed. Please check with \"prt-get isinst <package>\"\n", package_name
); return;
}
else if (package_install == 1)
{
char *ports_folders;
DIR *ports_directory = opendir("/usr/ports/"), *package_directory;
struct dirent *ports_directory_s, *package_directory_s;
if (ports_directory)
{
while ((ports_directory_s = readdir(ports_directory)) != NULL)
{
if (*ports_directory_s->d_name == '.')
{
continue;
}
ports_folders
= malloc(sizeof(char)*(strlen("/usr/ports/")+strlen(ports_directory_s
->d_name
)+3)); if (ports_folders == NULL)
{
puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?"); }
sprintf(ports_folders
, "/usr/ports/%s/", ports_directory_s
->d_name
);
if ((package_directory = opendir(ports_folders)) != NULL)
{
while ((package_directory_s = readdir(package_directory)) != NULL)
{
if (*package_directory_s->d_name == '.')
{
continue;
}
if (strcmp(package_directory_s
->d_name
, package_name
) == 0) {
char *package_directory_full
= malloc(sizeof(char)*(strlen(ports_folders
)+strlen(package_directory_s
->d_name
)+9)); if (package_directory_full == NULL)
{
puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?"); }
sprintf(package_directory_full
, "%s%s/Pkgfile", ports_folders
, package_directory_s
->d_name
);
FILE
*package_pkgfile
= fopen(package_directory_full
, "r");
if (package_pkgfile)
{
struct stat verify_file;
stat(package_directory_full, &verify_file);
if (verify_file.st_size > 0)
{
int counter_pointer, size_pointer = 0;
char **package_main = depends_parser(package_pkgfile, &size_pointer);
if (package_main == NULL)
{
puts("[pkgrmd] This package has no dependencies."); }
else
{
package_verify_and_remove(package_main, size_pointer);
for (counter_pointer = 0 ; counter_pointer < size_pointer ; counter_pointer++)
{
free(package_main
[counter_pointer
]); }
}
}
else if (verify_file.st_size <= 0)
{
printf("[pkgrmd] The file: %s is in blank. Please, recreate file with \"ports -u\"\n", package_directory_full
); }
}
else
{
printf("[pkgrmd] The file: %s no found. Please, recreate file with \"ports -u\"\n", package_directory_full
); }
free(package_directory_full
);
break;
}
}
closedir(package_directory);
}
else
{
continue;
}
}
closedir(ports_directory);
}
else
{
puts("[pkgrmd] I cant read directory: /usr/ports/, you have installed ports?"); return;
}
}
}
LyoKCiAgICBAYXV0aG9yOiAJCUFsYmVydG8gSnPDqSA8Z3V6emFuMD4KCUBwYWNrYWdlOgkJcGtncm1kIC0gVGhpcyBwYWNrYWdlIHJlbW92ZSBhbGwgZGVwZW5kZW5jZXMgYWxvbmUgb2YgYSBhcHBsaWNhdGlvbnMuCgoqLwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgkKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPGRpcmVudC5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCnZvaWQgc2VhcmNoX3BhY2thZ2UoY2hhciAqcGFja2FnZV9uYW1lKTsKY2hhciAqKmRlcGVuZHNfcGFyc2VyKEZJTEUgKnBrZ2ZpbGUsIGludCAqbWVtb3J5X2hleCk7CmludCBwYWNrYWdlX3ZlcmlmeV9hbmRfcmVtb3ZlKGNoYXIgKipkZXBlbmRzLCBpbnQgc2l6ZV9wb2ludGVyKTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIAp7CglpZiAoYXJnYyA+IDEpCgl7CgkJaWYgKHN0cnN0cihhcmd2WzFdLCAiLS0iKSkKCQl7CgkJCWlmIChzdHJuY21wKGFyZ3ZbMV0sICItLWluZm8iLCA2KSA9PSAwKQoJCQl7CgkJCQlwcmludGYoIldyaXR0ZW4gYnkgQWxiZXJ0byBKc2UgPGd1enphbjA+XG5WZXJzaW9uOiBOVUxMXG5cblBsZWFzZSByZXBvcnQgYnVnIHRvIGd1enphbm8udmVAZ21haWwuY29tXG4iKTsKCQkJfQoJCQllbHNlIGlmIChzdHJuY21wKGFyZ3ZbMV0sICItLWhlbHAiLCA2KSA9PSAwKQoJCQl7CgkJCQlwdXRzKCJVc2FnZTogcGtncm1kIDxjb21tYW5kcz4gb3IgPHBhY2thZ2UgdG8gcmVtb3ZlPlxuRXhhbXBsZTogcGtncm1kIHdpbmUsIHBrZ3JtZCB4b3JnLCBldGMuXG4iKTsKCQkJCXB1dHMoIkNvbW1hbmRzIGF2YWlhYmxlOiBcblxuLS1oZWxwIChTaG93IHRoaXMgaGVscCkgXG4tLWluZm8gKFNob3cgdGhlIGN1cnJlbnQgdmVyc2lvbiBhbmQgYXV0aG9yKSIpOwoJCQl9CgkJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiLS0iKSA9PSAwKQoJCQl7CgkJCQlwcmludGYoIkNvbW1hbmQgaW52YWxpZC4gUGxlYXNlIHRyeSB3aXRoIFwicGtncm1kIC0taGVscFwiXG4iKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXByaW50ZigiQ29tbWFuZCBcIiVzXCIgbm90IGZvdW5kLiBQbGVhc2UgdHJ5IHdpdGggXCJwa2dybWQgLS1oZWxwXCJcbiIsIGFyZ3ZbMV0pOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmICgoc3RybGVuKGFyZ3ZbMV0pKSA+PSAxICYmIChzdHJsZW4oYXJndlsxXSkpIDw9IDMwKQoJCQl7CgkJCQlzZWFyY2hfcGFja2FnZShhcmd2WzFdKTsKCQkJfQoJCQllbHNlIGlmICgoc3RybGVuKGFyZ3ZbMV0pKSA+IDMwKQoJCQl7CgkJCQlwdXRzKCJbcGtncm1kXSBNYXhpbXVtIHBhY2thZ2UgbmFtZSBpcyAyNSIpOwoJCQl9CgkJfQoJfQoJZWxzZQoJewoJCXByaW50ZigiW3BrZ3JtZF0gVHJ5IFwicGtnZG1yIC0taGVscFwiIGZvciBtb3JlIGluZm9ybWF0aW9uLiBcbiIpOwoJfQoKCXJldHVybiAwOwp9CgovKiBDb2Rpbmcgbm93Li4uICovCgppbnQgcGFja2FnZV92ZXJpZnlfYW5kX3JlbW92ZShjaGFyICoqZGVwZW5kcywgaW50IHNpemVfcG9pbnRlcikKewoJRklMRSAqcGFja2FnZV9kYl9pbnN0YWxsZWQgPSBmb3BlbigiL3Zhci9saWIvcGtnL2RiIiwgInIiKTsKCWNoYXIgbGluZXNfZGJfcGFyc2VyWzI1NV0sICppbnN0YWxsX3BhY2thZ2VfcDsKCgl3aGlsZSAoZmdldHMobGluZXNfZGJfcGFyc2VyLCAyNTUsIHBhY2thZ2VfZGJfaW5zdGFsbGVkKSAhPSBOVUxMKQoJewoJCWlmICgoc3Ryc3RyKGxpbmVzX2RiX3BhcnNlciwgIi8iKSkgfHwgKHN0cnN0cihsaW5lc19kYl9wYXJzZXIsICIuIikpKQoJCXsKCQkJY29udGludWU7CgkJfQoKCQkKCQlwcmludGYoIiVzIiwgbGluZXNfZGJfcGFyc2VyKTsKCQkKCX0KCglyZXR1cm4gMDsKfQoKY2hhciAqKmRlcGVuZHNfcGFyc2VyKEZJTEUgKnBrZ2ZpbGUsIGludCAqbWVtb3J5X2hleCkKewoJY2hhciBjaGFyYWN0ZXIsIGxhc3RfY2hhcmFjdGVyID0gJzAnLCAqZGVwZW5kc19zdHJpbmcgPSBOVUxMOwoJaW50IG1lbW9yeV9hZGQgPSAwOwkKCgl3aGlsZSAoKGNoYXJhY3RlciA9IGdldGMocGtnZmlsZSkpICE9IEVPRikKCXsKCQlpZiAoY2hhcmFjdGVyICE9ICcjJyAmJiBsYXN0X2NoYXJhY3RlciA9PSAnXG4nKQoJCXsKCQkJYnJlYWs7CgkJfQoKCQlpZiAoY2hhcmFjdGVyICE9ICdcbicpCgkJewoJCQlkZXBlbmRzX3N0cmluZyA9IHJlYWxsb2MoZGVwZW5kc19zdHJpbmcsIHNpemVvZihjaGFyKSoobWVtb3J5X2FkZCsxKSk7CgkJCWRlcGVuZHNfc3RyaW5nW21lbW9yeV9hZGRdID0gY2hhcmFjdGVyOwoJCQltZW1vcnlfYWRkKys7CgkJfQoJCWVsc2UKCQl7CgkJCWRlcGVuZHNfc3RyaW5nID0gcmVhbGxvYyhkZXBlbmRzX3N0cmluZywgc2l6ZW9mKGNoYXIpKihtZW1vcnlfYWRkKzEpKTsKCQkJaWYgKGRlcGVuZHNfc3RyaW5nID09IE5VTEwpCgkJCXsKCQkJCXB1dHMoIltwa2dybWRdIFBrZ3JtZCBjYW4ndCBjcmVhdGUgbW9yZSBzcGFjZS4gWW91IGhhdmUgbWVtb3J5IGZyZWU/Iik7CgkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CgkJCX0gCgkJCQoJCQlkZXBlbmRzX3N0cmluZ1ttZW1vcnlfYWRkXSA9ICdcMCc7CgoJCQlpZiAoc3Ryc3RyKGRlcGVuZHNfc3RyaW5nLCAiIyBEZXBlbmRzIG9uOiIpKQoJCQl7CgkJCQljaGFyICpkZXBlbmRzX3BhcnNpbmcgPSBkZXBlbmRzX3N0cmluZzsKCQkJCWludCBzcGFjZXNfZml4ID0gMDsKCQkJCQoJCQkJZGVwZW5kc19wYXJzaW5nID0gZGVwZW5kc19wYXJzaW5nICsgMTM7CgkJCQkKCQkJCWlmIChzdHJsZW4oZGVwZW5kc19wYXJzaW5nKSA+IDEpCgkJCQl7CgkJCQkJLyoKCQkJCQkJRXN0byBlcyB1bmEgY29tcHJvYmFjacOzbiBwYXJhIHNhYmVyIHNpIGhheSBsZXRyYXMgZW4gW2RlcGVuZHMgb246XSDDsyBzaSBlc3RhIHJlbGxlbm8KCQkJCQkJZGUgc29sbyBlc3BhY2lvcy4gQXPDrSBldml0YW1vcyBxdWUgZWwgcHVudGVybyBkZXZ1ZWx2YSB2YWxvcmVzIHZhY2lvcy4KCgkJCQkJCU9KTzogVG9kYXZpYSBsbyBlc3RveSBwcm9ncmFtYW5kbywgdGllbmUgYWxndW5vcyBlcnJvcmVzLgoJCQkJCSovCgkJCQkJd2hpbGUgKCEoaXNhbHBoYSgqZGVwZW5kc19wYXJzaW5nKSkpCgkJCQkJewoJCQkJCQlpZiAoKmRlcGVuZHNfcGFyc2luZyA9PSAnXDAnKQoJCQkJCQl7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQkJCgkJCQkJCXNwYWNlc19maXgrKzsKCQkJCQkJZGVwZW5kc19wYXJzaW5nID0gZGVwZW5kc19wYXJzaW5nICsgc3BhY2VzX2ZpeDsKCQkJCQl9CgoJCQkJCWlmICgqZGVwZW5kc19wYXJzaW5nID09ICdcMCcpCgkJCQkJewoJCQkJCQlmcmVlKGRlcGVuZHNfc3RyaW5nKTsKCQkJCQkJcmV0dXJuIE5VTEw7CgkJCQkJfQoJCQkJCS8qCgkJCQkJCUFxdcOtIHRlcm1pbmEgbGEgY29tcHJvYnJhY2nDs24uCgkJCQkJKi8KCgkJCQkJaW50IGluZGV4X2RlcGVuZHMgPSAwLCBpbmRleF9kZXBlbmRzX21lbW9yeSA9IDA7CgkJCQkJY2hhciAqKmRlcGVuZHNfcCA9IG1hbGxvYyhzaXplb2YoY2hhciAqKSooaW5kZXhfZGVwZW5kc19tZW1vcnkrMSkpOwoJCQkJCWlmIChkZXBlbmRzX3AgPT0gTlVMTCkKCQkJCQl7CgkJCQkJCXB1dHMoIltwa2dybWRdIFBrZ3JtZCBjYW4ndCBjcmVhdGUgbW9yZSBzcGFjZS4gWW91IGhhdmUgbWVtb3J5IGZyZWU/Iik7CgkJCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKCQkJCQl9CgoJCQkJCWRlcGVuZHNfcFtpbmRleF9kZXBlbmRzX21lbW9yeV0gPSBOVUxMOwoJCQkJCQoJCQkJCXdoaWxlICgqZGVwZW5kc19wYXJzaW5nICE9ICdcMCcpCgkJCQkJewoJCQkJCQlpZiAoKmRlcGVuZHNfcGFyc2luZyAhPSAnICcpCgkJCQkJCXsKCQkJCQkJCWlmICgoaXNhbHBoYSgqZGVwZW5kc19wYXJzaW5nKSkgfHwgKGlzZGlnaXQoKmRlcGVuZHNfcGFyc2luZykpIHx8ICpkZXBlbmRzX3BhcnNpbmcgPT0gJy0nKQoJCQkJCQkJewoJCQkJCQkJCWRlcGVuZHNfcFtpbmRleF9kZXBlbmRzX21lbW9yeV0gPSByZWFsbG9jKGRlcGVuZHNfcFtpbmRleF9kZXBlbmRzX21lbW9yeV0sIHNpemVvZihjaGFyKSooaW5kZXhfZGVwZW5kcysxKSk7CgkJCQkJCQkJaWYgKGRlcGVuZHNfcFtpbmRleF9kZXBlbmRzX21lbW9yeV0gPT0gTlVMTCkKCQkJCQkJCQl7CgkJCQkJCQkJCXB1dHMoIltwa2dybWRdIFBrZ3JtZCBjYW4ndCBjcmVhdGUgbW9yZSBzcGFjZS4gWW91IGhhdmUgbWVtb3J5IGZyZWU/Iik7CgkJCQkJCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKCQkJCQkJCQl9CgkJCQkJCQkJCgkJCQkJCQkJZGVwZW5kc19wW2luZGV4X2RlcGVuZHNfbWVtb3J5XVtpbmRleF9kZXBlbmRzXSA9ICpkZXBlbmRzX3BhcnNpbmc7CgoJCQkJCQkJCWluZGV4X2RlcGVuZHMrKzsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlIGlmICgqZGVwZW5kc19wYXJzaW5nID09ICcgJykKCQkJCQkJewoJCQkJCQkJZGVwZW5kc19wW2luZGV4X2RlcGVuZHNfbWVtb3J5XSA9IHJlYWxsb2MoZGVwZW5kc19wW2luZGV4X2RlcGVuZHNfbWVtb3J5XSwgc2l6ZW9mKGNoYXIpKihpbmRleF9kZXBlbmRzKzEpKTsKCQkJCQkJCWlmIChkZXBlbmRzX3BbaW5kZXhfZGVwZW5kc19tZW1vcnldID09IE5VTEwpCgkJCQkJCQl7CgkJCQkJCQkJcHV0cygiW3BrZ3JtZF0gUGtncm1kIGNhbid0IGNyZWF0ZSBtb3JlIHNwYWNlLiBZb3UgaGF2ZSBtZW1vcnkgZnJlZT8iKTsKCQkJCQkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CgkJCQkJCQl9CgkJCQkJCgkJCQkJCQlkZXBlbmRzX3BbaW5kZXhfZGVwZW5kc19tZW1vcnldW2luZGV4X2RlcGVuZHNdID0gJ1wwJzsKCgkJCQkJCQlpbmRleF9kZXBlbmRzX21lbW9yeSsrOwoJCQkJCQkJZGVwZW5kc19wID0gcmVhbGxvYyhkZXBlbmRzX3AsIHNpemVvZihjaGFyICopKihpbmRleF9kZXBlbmRzX21lbW9yeSsxKSk7CgkJCQkJCQlpZiAoZGVwZW5kc19wID09IE5VTEwpCgkJCQkJCQl7CgkJCQkJCQkJcHV0cygiW3BrZ3JtZF0gUGtncm1kIGNhbid0IGNyZWF0ZSBtb3JlIHNwYWNlLiBZb3UgaGF2ZSBtZW1vcnkgZnJlZT8iKTsKCQkJCQkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCWRlcGVuZHNfcFtpbmRleF9kZXBlbmRzX21lbW9yeV0gPSBOVUxMOwoKCQkJCQkJCWluZGV4X2RlcGVuZHMgPSAwOwoJCQkJCQl9CgkKCQkJCQkJZGVwZW5kc19wYXJzaW5nKys7CgkJCQkJfQoKCQkJCQkvKgoJCQkJCQlBcXXDrSBlc3RhbW9zIHJlY2liaWVuZG8gbGEgZGlyZWNpw7NuIGRlIGludCBzaXplX3BvaW50ZXIKCQkJCQkJcGFyYSBhZ3JlZ2FybGUgY3VhbnRvcyAqY2hhcnMgdGllbmUgZGVwZW5kc19wCgoJCQkJCQlFc3RvIHRvZGF2aWEgZXN0YSBlbiBCRVRBLCBubyBzw6kgcXVlIHB1ZWRhIHBhc2FyIG8gc2kgdGllbmUgYWxnw7puCgkJCQkJCWVmZWN0byBwb3N0ZXJpb3IgbW9kaWZpY2FyIHVuYSB2YXJpYWJsZSBkZSBlc3RhIGZvcm1hLgoJCQkJCSovCgkJCQkJKm1lbW9yeV9oZXggPSBpbmRleF9kZXBlbmRzX21lbW9yeSsxOwoJCQkJCQoJCQkJCWZyZWUoZGVwZW5kc19zdHJpbmcpOwoJCQkJCXJldHVybiBkZXBlbmRzX3A7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJZnJlZShkZXBlbmRzX3N0cmluZyk7CgkJCQkJcmV0dXJuIE5VTEw7CgkJCQl9CgoJCQkJYnJlYWs7CgkJCX0KCgkJCWZyZWUoZGVwZW5kc19zdHJpbmcpOwoJCQlkZXBlbmRzX3N0cmluZyA9IG1hbGxvYygwKTsKCQkJbWVtb3J5X2FkZCA9IDA7CgkJfQoKCQlsYXN0X2NoYXJhY3RlciA9IGNoYXJhY3RlcjsKCX0KCQoJZnJlZShkZXBlbmRzX3N0cmluZyk7CgoJcmV0dXJuIE5VTEw7Cn0KCnZvaWQgc2VhcmNoX3BhY2thZ2UoY2hhciAqcGFja2FnZV9uYW1lKQp7CgljaGFyIHBhY2thZ2VfbGluZXNfZmlsZVsyMjVdLCAqcGFja2FnZV9uYW1lX25ld2xpbmU7CglpbnQgcGFja2FnZV9pbnN0YWxsID0gMDsKCUZJTEUgKmZpbGVfZGIgPSBmb3BlbigiL3Zhci9saWIvcGtnL2RiIiwgInIiKTsKCglwYWNrYWdlX25hbWVfbmV3bGluZSA9IG1hbGxvYyhzaXplb2YoY2hhcikqKHN0cmxlbihwYWNrYWdlX25hbWUpKzIpKTsKCWlmIChwYWNrYWdlX25hbWUgPT0gTlVMTCkKCXsKCQlwdXRzKCJbcGtncm1kXSBQa2dybWQgY2FuJ3QgY3JlYXRlIG1vcmUgc3BhY2UuIFlvdSBoYXZlIG1lbW9yeSBmcmVlPyIpOwoJCWV4aXQoRVhJVF9GQUlMVVJFKTsKCX0KCQoJc3ByaW50ZihwYWNrYWdlX25hbWVfbmV3bGluZSwgIiVzXG4iLCBwYWNrYWdlX25hbWUpOwoKCWlmIChmaWxlX2RiKQoJewoJCXdoaWxlIChmZ2V0cyhwYWNrYWdlX2xpbmVzX2ZpbGUsIDIyNSwgZmlsZV9kYikgIT0gTlVMTCkKCQl7CgkJCWlmIChzdHJjbXAocGFja2FnZV9saW5lc19maWxlLCBwYWNrYWdlX25hbWVfbmV3bGluZSkgPT0gMCkKCQkJewoJCQkJcGFja2FnZV9pbnN0YWxsID0gMTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCWZyZWUocGFja2FnZV9uYW1lX25ld2xpbmUpOwoJZmNsb3NlKGZpbGVfZGIpOwoJCglpZiAocGFja2FnZV9pbnN0YWxsID09IDApCgl7CgkJcHJpbnRmKCJbcGtncm1kXSBUaGUgcGFja2FnZSBcIiVzXCIgaXMgbm90IGluc3RhbGxlZC4gUGxlYXNlIGNoZWNrIHdpdGggXCJwcnQtZ2V0IGlzaW5zdCA8cGFja2FnZT5cIlxuIiwgcGFja2FnZV9uYW1lKTsKCQlyZXR1cm47Cgl9CgllbHNlIGlmIChwYWNrYWdlX2luc3RhbGwgPT0gMSkKCXsKCQljaGFyICpwb3J0c19mb2xkZXJzOwoJCgkJRElSICpwb3J0c19kaXJlY3RvcnkgPSBvcGVuZGlyKCIvdXNyL3BvcnRzLyIpLCAqcGFja2FnZV9kaXJlY3Rvcnk7CgkJc3RydWN0IGRpcmVudCAqcG9ydHNfZGlyZWN0b3J5X3MsICpwYWNrYWdlX2RpcmVjdG9yeV9zOwoKCQlpZiAocG9ydHNfZGlyZWN0b3J5KQoJCXsKCQkJd2hpbGUgKChwb3J0c19kaXJlY3RvcnlfcyA9IHJlYWRkaXIocG9ydHNfZGlyZWN0b3J5KSkgIT0gTlVMTCkKCQkJewoJCQkJaWYgKCpwb3J0c19kaXJlY3Rvcnlfcy0+ZF9uYW1lID09ICcuJykKCQkJCXsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCQoJCQkJcG9ydHNfZm9sZGVycyA9IG1hbGxvYyhzaXplb2YoY2hhcikqKHN0cmxlbigiL3Vzci9wb3J0cy8iKStzdHJsZW4ocG9ydHNfZGlyZWN0b3J5X3MtPmRfbmFtZSkrMykpOwoJCQkJaWYgKHBvcnRzX2ZvbGRlcnMgPT0gTlVMTCkKCQkJCXsKCQkJCQlwdXRzKCJbcGtncm1kXSBQa2dybWQgY2FuJ3QgY3JlYXRlIG1vcmUgc3BhY2UuIFlvdSBoYXZlIG1lbW9yeSBmcmVlPyIpOwoJCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKCQkJCX0KCQkJCQoJCQkJc3ByaW50Zihwb3J0c19mb2xkZXJzLCAiL3Vzci9wb3J0cy8lcy8iLCBwb3J0c19kaXJlY3Rvcnlfcy0+ZF9uYW1lKTsKCgkJCQlpZiAoKHBhY2thZ2VfZGlyZWN0b3J5ID0gb3BlbmRpcihwb3J0c19mb2xkZXJzKSkgIT0gTlVMTCkKCQkJCXsKCQkJCQl3aGlsZSAoKHBhY2thZ2VfZGlyZWN0b3J5X3MgPSByZWFkZGlyKHBhY2thZ2VfZGlyZWN0b3J5KSkgIT0gTlVMTCkKCQkJCQl7CgkJCQkJCWlmICgqcGFja2FnZV9kaXJlY3Rvcnlfcy0+ZF9uYW1lID09ICcuJykKCQkJCQkJewoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCgkJCQkJCWlmIChzdHJjbXAocGFja2FnZV9kaXJlY3Rvcnlfcy0+ZF9uYW1lLCBwYWNrYWdlX25hbWUpID09IDApCgkJCQkJCXsKCQkJCQkJCWNoYXIgKnBhY2thZ2VfZGlyZWN0b3J5X2Z1bGwgPSBtYWxsb2Moc2l6ZW9mKGNoYXIpKihzdHJsZW4ocG9ydHNfZm9sZGVycykrc3RybGVuKHBhY2thZ2VfZGlyZWN0b3J5X3MtPmRfbmFtZSkrOSkpOwoJCQkJCQkJaWYgKHBhY2thZ2VfZGlyZWN0b3J5X2Z1bGwgPT0gTlVMTCkKCQkJCQkJCXsKCQkJCQkJCQlwdXRzKCJbcGtncm1kXSBQa2dybWQgY2FuJ3QgY3JlYXRlIG1vcmUgc3BhY2UuIFlvdSBoYXZlIG1lbW9yeSBmcmVlPyIpOwoJCQkJCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKCQkJCQkJCX0KCQkJCQkJCSAKCQkJCQkJCXNwcmludGYocGFja2FnZV9kaXJlY3RvcnlfZnVsbCwgIiVzJXMvUGtnZmlsZSIsIHBvcnRzX2ZvbGRlcnMsIHBhY2thZ2VfZGlyZWN0b3J5X3MtPmRfbmFtZSk7CgoJCQkJCQkJRklMRSAqcGFja2FnZV9wa2dmaWxlID0gZm9wZW4ocGFja2FnZV9kaXJlY3RvcnlfZnVsbCwgInIiKTsKCgkJCQkJCQlpZiAocGFja2FnZV9wa2dmaWxlKQoJCQkJCQkJewoJCQkJCQkJCXN0cnVjdCBzdGF0IHZlcmlmeV9maWxlOwoJCQkJCQkJCXN0YXQocGFja2FnZV9kaXJlY3RvcnlfZnVsbCwgJnZlcmlmeV9maWxlKTsKCgkJCQkJCQkJaWYgKHZlcmlmeV9maWxlLnN0X3NpemUgPiAwKQoJCQkJCQkJCXsKCQkJCQkJCQkJaW50IGNvdW50ZXJfcG9pbnRlciwgc2l6ZV9wb2ludGVyID0gMDsKCQkJCQkJCQkJY2hhciAqKnBhY2thZ2VfbWFpbiA9IGRlcGVuZHNfcGFyc2VyKHBhY2thZ2VfcGtnZmlsZSwgJnNpemVfcG9pbnRlcik7CgoJCQkJCQkJCQlpZiAocGFja2FnZV9tYWluID09IE5VTEwpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXB1dHMoIltwa2dybWRdIFRoaXMgcGFja2FnZSBoYXMgbm8gZGVwZW5kZW5jaWVzLiIpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWVsc2UKCQkJCQkJCQkJewoJCQkJCQkJCQkJcGFja2FnZV92ZXJpZnlfYW5kX3JlbW92ZShwYWNrYWdlX21haW4sIHNpemVfcG9pbnRlcik7CgkJCQkJCQkJCQlmb3IgKGNvdW50ZXJfcG9pbnRlciA9IDAgOyBjb3VudGVyX3BvaW50ZXIgPCBzaXplX3BvaW50ZXIgOyBjb3VudGVyX3BvaW50ZXIrKykKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQlmcmVlKHBhY2thZ2VfbWFpbltjb3VudGVyX3BvaW50ZXJdKTsKCQkJCQkJCQkJCX0KCgkJCQkJCQkJCQlmcmVlKHBhY2thZ2VfbWFpbik7CgkJCQkJCQkJCX0KCgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UgaWYgKHZlcmlmeV9maWxlLnN0X3NpemUgPD0gMCkKCQkJCQkJCQl7CgkJCQkJCQkJCXByaW50ZigiW3BrZ3JtZF0gVGhlIGZpbGU6ICVzIGlzIGluIGJsYW5rLiBQbGVhc2UsIHJlY3JlYXRlIGZpbGUgd2l0aCBcInBvcnRzIC11XCJcbiIsIHBhY2thZ2VfZGlyZWN0b3J5X2Z1bGwpOwoJCQkJCQkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCXByaW50ZigiW3BrZ3JtZF0gVGhlIGZpbGU6ICVzIG5vIGZvdW5kLiBQbGVhc2UsIHJlY3JlYXRlIGZpbGUgd2l0aCBcInBvcnRzIC11XCJcbiIsIHBhY2thZ2VfZGlyZWN0b3J5X2Z1bGwpOwoJCQkJCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQkJZnJlZShwYWNrYWdlX2RpcmVjdG9yeV9mdWxsKTsKCQkJCQkJCWZjbG9zZShwYWNrYWdlX3BrZ2ZpbGUpOwoJCQkJCQkJCgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJY2xvc2VkaXIocGFja2FnZV9kaXJlY3RvcnkpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoKCQkJCWZyZWUocG9ydHNfZm9sZGVycyk7CgkJCX0KCQkJCgkJCWNsb3NlZGlyKHBvcnRzX2RpcmVjdG9yeSk7CgkJfQoJCWVsc2UKCQl7CgkJCXB1dHMoIltwa2dybWRdIEkgY2FudCByZWFkIGRpcmVjdG9yeTogL3Vzci9wb3J0cy8sIHlvdSBoYXZlIGluc3RhbGxlZCBwb3J0cz8iKTsKCQkJcmV0dXJuOwoJCX0KCX0KfQk=