fork(2) download
  1. /*
  2.  
  3.   @author: Alberto Jsé <guzzan0>
  4. @package: pkgrmd - This package remove all dependences alone of a applications.
  5.  
  6. */
  7.  
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <dirent.h>
  14. #include <ctype.h>
  15.  
  16. void search_package(char *package_name);
  17. char **depends_parser(FILE *pkgfile, int *memory_hex);
  18. int package_verify_and_remove(char **depends, int size_pointer);
  19.  
  20. int main(int argc, char *argv[])
  21. {
  22. if (argc > 1)
  23. {
  24. if (strstr(argv[1], "--"))
  25. {
  26. if (strncmp(argv[1], "--info", 6) == 0)
  27. {
  28. printf("Written by Alberto Jse <guzzan0>\nVersion: NULL\n\nPlease report bug to guzzano.ve@gmail.com\n");
  29. }
  30. else if (strncmp(argv[1], "--help", 6) == 0)
  31. {
  32. puts("Usage: pkgrmd <commands> or <package to remove>\nExample: pkgrmd wine, pkgrmd xorg, etc.\n");
  33. puts("Commands avaiable: \n\n--help (Show this help) \n--info (Show the current version and author)");
  34. }
  35. else if (strcmp(argv[1], "--") == 0)
  36. {
  37. printf("Command invalid. Please try with \"pkgrmd --help\"\n");
  38. }
  39. else
  40. {
  41. printf("Command \"%s\" not found. Please try with \"pkgrmd --help\"\n", argv[1]);
  42. }
  43. }
  44. else
  45. {
  46. if ((strlen(argv[1])) >= 1 && (strlen(argv[1])) <= 30)
  47. {
  48. search_package(argv[1]);
  49. }
  50. else if ((strlen(argv[1])) > 30)
  51. {
  52. puts("[pkgrmd] Maximum package name is 25");
  53. }
  54. }
  55. }
  56. else
  57. {
  58. printf("[pkgrmd] Try \"pkgdmr --help\" for more information. \n");
  59. }
  60.  
  61. return 0;
  62. }
  63.  
  64. /* Coding now... */
  65.  
  66. int package_verify_and_remove(char **depends, int size_pointer)
  67. {
  68. FILE *package_db_installed = fopen("/var/lib/pkg/db", "r");
  69. char lines_db_parser[255], *install_package_p;
  70.  
  71. while (fgets(lines_db_parser, 255, package_db_installed) != NULL)
  72. {
  73. if ((strstr(lines_db_parser, "/")) || (strstr(lines_db_parser, ".")))
  74. {
  75. continue;
  76. }
  77.  
  78.  
  79. printf("%s", lines_db_parser);
  80.  
  81. }
  82.  
  83. return 0;
  84. }
  85.  
  86. char **depends_parser(FILE *pkgfile, int *memory_hex)
  87. {
  88. char character, last_character = '0', *depends_string = NULL;
  89. int memory_add = 0;
  90.  
  91. while ((character = getc(pkgfile)) != EOF)
  92. {
  93. if (character != '#' && last_character == '\n')
  94. {
  95. break;
  96. }
  97.  
  98. if (character != '\n')
  99. {
  100. depends_string = realloc(depends_string, sizeof(char)*(memory_add+1));
  101. depends_string[memory_add] = character;
  102. memory_add++;
  103. }
  104. else
  105. {
  106. depends_string = realloc(depends_string, sizeof(char)*(memory_add+1));
  107. if (depends_string == NULL)
  108. {
  109. puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?");
  110. exit(EXIT_FAILURE);
  111. }
  112.  
  113. depends_string[memory_add] = '\0';
  114.  
  115. if (strstr(depends_string, "# Depends on:"))
  116. {
  117. char *depends_parsing = depends_string;
  118. int spaces_fix = 0;
  119.  
  120. depends_parsing = depends_parsing + 13;
  121.  
  122. if (strlen(depends_parsing) > 1)
  123. {
  124. /*
  125. Esto es una comprobación para saber si hay letras en [depends on:] ó si esta relleno
  126. de solo espacios. Así evitamos que el puntero devuelva valores vacios.
  127.  
  128. OJO: Todavia lo estoy programando, tiene algunos errores.
  129. */
  130. while (!(isalpha(*depends_parsing)))
  131. {
  132. if (*depends_parsing == '\0')
  133. {
  134. break;
  135. }
  136.  
  137. spaces_fix++;
  138. depends_parsing = depends_parsing + spaces_fix;
  139. }
  140.  
  141. if (*depends_parsing == '\0')
  142. {
  143. free(depends_string);
  144. return NULL;
  145. }
  146. /*
  147. Aquí termina la comprobración.
  148. */
  149.  
  150. int index_depends = 0, index_depends_memory = 0;
  151. char **depends_p = malloc(sizeof(char *)*(index_depends_memory+1));
  152. if (depends_p == NULL)
  153. {
  154. puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?");
  155. exit(EXIT_FAILURE);
  156. }
  157.  
  158. depends_p[index_depends_memory] = NULL;
  159.  
  160. while (*depends_parsing != '\0')
  161. {
  162. if (*depends_parsing != ' ')
  163. {
  164. if ((isalpha(*depends_parsing)) || (isdigit(*depends_parsing)) || *depends_parsing == '-')
  165. {
  166. depends_p[index_depends_memory] = realloc(depends_p[index_depends_memory], sizeof(char)*(index_depends+1));
  167. if (depends_p[index_depends_memory] == NULL)
  168. {
  169. puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?");
  170. exit(EXIT_FAILURE);
  171. }
  172.  
  173. depends_p[index_depends_memory][index_depends] = *depends_parsing;
  174.  
  175. index_depends++;
  176. }
  177. }
  178. else if (*depends_parsing == ' ')
  179. {
  180. depends_p[index_depends_memory] = realloc(depends_p[index_depends_memory], sizeof(char)*(index_depends+1));
  181. if (depends_p[index_depends_memory] == NULL)
  182. {
  183. puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?");
  184. exit(EXIT_FAILURE);
  185. }
  186.  
  187. depends_p[index_depends_memory][index_depends] = '\0';
  188.  
  189. index_depends_memory++;
  190. depends_p = realloc(depends_p, sizeof(char *)*(index_depends_memory+1));
  191. if (depends_p == NULL)
  192. {
  193. puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?");
  194. exit(EXIT_FAILURE);
  195. }
  196.  
  197. depends_p[index_depends_memory] = NULL;
  198.  
  199. index_depends = 0;
  200. }
  201.  
  202. depends_parsing++;
  203. }
  204.  
  205. /*
  206. Aquí estamos recibiendo la direción de int size_pointer
  207. para agregarle cuantos *chars tiene depends_p
  208.  
  209. Esto todavia esta en BETA, no sé que pueda pasar o si tiene algún
  210. efecto posterior modificar una variable de esta forma.
  211. */
  212. *memory_hex = index_depends_memory+1;
  213.  
  214. free(depends_string);
  215. return depends_p;
  216. }
  217. else
  218. {
  219. free(depends_string);
  220. return NULL;
  221. }
  222.  
  223. break;
  224. }
  225.  
  226. free(depends_string);
  227. depends_string = malloc(0);
  228. memory_add = 0;
  229. }
  230.  
  231. last_character = character;
  232. }
  233.  
  234. free(depends_string);
  235.  
  236. return NULL;
  237. }
  238.  
  239. void search_package(char *package_name)
  240. {
  241. char package_lines_file[225], *package_name_newline;
  242. int package_install = 0;
  243. FILE *file_db = fopen("/var/lib/pkg/db", "r");
  244.  
  245. package_name_newline = malloc(sizeof(char)*(strlen(package_name)+2));
  246. if (package_name == NULL)
  247. {
  248. puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?");
  249. exit(EXIT_FAILURE);
  250. }
  251.  
  252. sprintf(package_name_newline, "%s\n", package_name);
  253.  
  254. if (file_db)
  255. {
  256. while (fgets(package_lines_file, 225, file_db) != NULL)
  257. {
  258. if (strcmp(package_lines_file, package_name_newline) == 0)
  259. {
  260. package_install = 1;
  261. break;
  262. }
  263. }
  264. }
  265.  
  266. free(package_name_newline);
  267. fclose(file_db);
  268.  
  269. if (package_install == 0)
  270. {
  271. printf("[pkgrmd] The package \"%s\" is not installed. Please check with \"prt-get isinst <package>\"\n", package_name);
  272. return;
  273. }
  274. else if (package_install == 1)
  275. {
  276. char *ports_folders;
  277.  
  278. DIR *ports_directory = opendir("/usr/ports/"), *package_directory;
  279. struct dirent *ports_directory_s, *package_directory_s;
  280.  
  281. if (ports_directory)
  282. {
  283. while ((ports_directory_s = readdir(ports_directory)) != NULL)
  284. {
  285. if (*ports_directory_s->d_name == '.')
  286. {
  287. continue;
  288. }
  289.  
  290. ports_folders = malloc(sizeof(char)*(strlen("/usr/ports/")+strlen(ports_directory_s->d_name)+3));
  291. if (ports_folders == NULL)
  292. {
  293. puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?");
  294. exit(EXIT_FAILURE);
  295. }
  296.  
  297. sprintf(ports_folders, "/usr/ports/%s/", ports_directory_s->d_name);
  298.  
  299. if ((package_directory = opendir(ports_folders)) != NULL)
  300. {
  301. while ((package_directory_s = readdir(package_directory)) != NULL)
  302. {
  303. if (*package_directory_s->d_name == '.')
  304. {
  305. continue;
  306. }
  307.  
  308. if (strcmp(package_directory_s->d_name, package_name) == 0)
  309. {
  310. char *package_directory_full = malloc(sizeof(char)*(strlen(ports_folders)+strlen(package_directory_s->d_name)+9));
  311. if (package_directory_full == NULL)
  312. {
  313. puts("[pkgrmd] Pkgrmd can't create more space. You have memory free?");
  314. exit(EXIT_FAILURE);
  315. }
  316.  
  317. sprintf(package_directory_full, "%s%s/Pkgfile", ports_folders, package_directory_s->d_name);
  318.  
  319. FILE *package_pkgfile = fopen(package_directory_full, "r");
  320.  
  321. if (package_pkgfile)
  322. {
  323. struct stat verify_file;
  324. stat(package_directory_full, &verify_file);
  325.  
  326. if (verify_file.st_size > 0)
  327. {
  328. int counter_pointer, size_pointer = 0;
  329. char **package_main = depends_parser(package_pkgfile, &size_pointer);
  330.  
  331. if (package_main == NULL)
  332. {
  333. puts("[pkgrmd] This package has no dependencies.");
  334. }
  335. else
  336. {
  337. package_verify_and_remove(package_main, size_pointer);
  338. for (counter_pointer = 0 ; counter_pointer < size_pointer ; counter_pointer++)
  339. {
  340. free(package_main[counter_pointer]);
  341. }
  342.  
  343. free(package_main);
  344. }
  345.  
  346. }
  347. else if (verify_file.st_size <= 0)
  348. {
  349. printf("[pkgrmd] The file: %s is in blank. Please, recreate file with \"ports -u\"\n", package_directory_full);
  350. exit(EXIT_FAILURE);
  351. }
  352. }
  353. else
  354. {
  355. printf("[pkgrmd] The file: %s no found. Please, recreate file with \"ports -u\"\n", package_directory_full);
  356. exit(EXIT_FAILURE);
  357. }
  358.  
  359. free(package_directory_full);
  360. fclose(package_pkgfile);
  361.  
  362. break;
  363. }
  364. }
  365.  
  366. closedir(package_directory);
  367. }
  368. else
  369. {
  370. continue;
  371. }
  372.  
  373. free(ports_folders);
  374. }
  375.  
  376. closedir(ports_directory);
  377. }
  378. else
  379. {
  380. puts("[pkgrmd] I cant read directory: /usr/ports/, you have installed ports?");
  381. return;
  382. }
  383. }
  384. }
Success #stdin #stdout 0.01s 1724KB
stdin
Standard input is empty
stdout
[pkgrmd] Try "pkgdmr --help" for more information.