forked from mirrors/pacman
		
	Compare commits
	
		
			935 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					d3d3b861ac | ||
| 
						 | 
					a0d0f3f47f | ||
| 
						 | 
					e1ae3a6038 | ||
| 
						 | 
					0c1a0a6d87 | ||
| 
						 | 
					5a39172835 | ||
| 
						 | 
					d9c0a08e6d | ||
| 
						 | 
					8ac7cf6b1b | ||
| 
						 | 
					4de3d9092e | ||
| 
						 | 
					8cc4ed0d63 | ||
| 
						 | 
					abfa8370c0 | ||
| 
						 | 
					8f414cd040 | ||
| 
						 | 
					fb401f569e | ||
| 
						 | 
					36f31dd133 | ||
| 
						 | 
					cc13f47532 | ||
| 
						 | 
					9168977b3b | ||
| 
						 | 
					22abe27bfa | ||
| 
						 | 
					4928f9edc3 | ||
| 
						 | 
					273cc66a8a | ||
| 
						 | 
					7e5bbf0387 | ||
| 
						 | 
					3f937c8404 | ||
| 
						 | 
					524847145d | ||
| 
						 | 
					a8ca9b93f8 | ||
| 
						 | 
					2df519f807 | ||
| 
						 | 
					dc7d691b20 | ||
| 
						 | 
					484d5ec624 | ||
| 
						 | 
					ab7d2890a4 | ||
| 
						 | 
					cf0edb92ba | ||
| 
						 | 
					94bc64ae1b | ||
| 
						 | 
					c4d6688694 | ||
| 
						 | 
					b0543440ca | ||
| 
						 | 
					39b0ac43fc | ||
| 
						 | 
					73139ccb3c | ||
| 
						 | 
					6bb5948025 | ||
| 
						 | 
					e0400fff96 | ||
| 
						 | 
					938fb2c878 | ||
| 
						 | 
					07ecd40a1a | ||
| 
						 | 
					6dfb9d35f8 | ||
| 
						 | 
					83c05e71bc | ||
| 
						 | 
					1463a9aa36 | ||
| 
						 | 
					ad8d3ceb89 | ||
| 
						 | 
					775b94e649 | ||
| 
						 | 
					497501d1c7 | ||
| 
						 | 
					d1af9b70c8 | ||
| 
						 | 
					e0acf2f144 | ||
| 
						 | 
					9a58d5c6c5 | ||
| 
						 | 
					83f99bfb39 | ||
| 
						 | 
					a8ed39ce05 | ||
| 
						 | 
					6f3a657f66 | ||
| 
						 | 
					bcc6a5d72d | ||
| 
						 | 
					1b8bb7c1cd | ||
| 
						 | 
					f682cbd433 | ||
| 
						 | 
					7edeb276b6 | ||
| 
						 | 
					bd83c8e756 | ||
| 
						 | 
					40a264478e | ||
| 
						 | 
					6e081a0c57 | ||
| 
						 | 
					98e0371ae3 | ||
| 
						 | 
					f66f9f11cd | ||
| 
						 | 
					ea3c47825e | ||
| 
						 | 
					69962184bb | ||
| 
						 | 
					d8fab9b441 | ||
| 
						 | 
					bf56fb6eb8 | ||
| 
						 | 
					619c3629ca | ||
| 
						 | 
					e70d540501 | ||
| 
						 | 
					fa929e8258 | ||
| 
						 | 
					b242b2d050 | ||
| 
						 | 
					47657107af | ||
| 
						 | 
					5e13b2b6af | ||
| 
						 | 
					80b0f27125 | ||
| 
						 | 
					d1fc3aec4c | ||
| 
						 | 
					507b01b912 | ||
| 
						 | 
					b6ccae2d18 | ||
| 
						 | 
					dd82b8d09f | ||
| 
						 | 
					6adf502f0d | ||
| 
						 | 
					d26d50e664 | ||
| 
						 | 
					2517ba3303 | ||
| 
						 | 
					c406949226 | ||
| 
						 | 
					1e0ed133f4 | ||
| 
						 | 
					907e8af5be | ||
| 
						 | 
					f1beb050a3 | ||
| 
						 | 
					43787d0067 | ||
| 
						 | 
					a78e3e3a23 | ||
| 
						 | 
					1df9b2aa79 | ||
| 
						 | 
					067721cbff | ||
| 
						 | 
					33685b960d | ||
| 
						 | 
					595e1a437f | ||
| 
						 | 
					7d961c849b | ||
| 
						 | 
					6767de5380 | ||
| 
						 | 
					213950afa3 | ||
| 
						 | 
					491b656c54 | ||
| 
						 | 
					03e1b4caa9 | ||
| 
						 | 
					a7691ba6fd | ||
| 
						 | 
					4b6a5ae159 | ||
| 
						 | 
					765178c5ba | ||
| 
						 | 
					0ef7129a4a | ||
| 
						 | 
					4849a4596d | ||
| 
						 | 
					0a4a5cea97 | ||
| 
						 | 
					3e4749fe3e | ||
| 
						 | 
					361ed6a600 | ||
| 
						 | 
					e4690232d6 | ||
| 
						 | 
					ca58e326dc | ||
| 
						 | 
					69694edd2c | ||
| 
						 | 
					d36d70d294 | ||
| 
						 | 
					33f2518531 | ||
| 
						 | 
					01f5c9e79a | ||
| 
						 | 
					5e7875ae6a | ||
| 
						 | 
					3a460a8be6 | ||
| 
						 | 
					47dd315609 | ||
| 
						 | 
					8375ad214a | ||
| 
						 | 
					b7ebacc576 | ||
| 
						 | 
					ec790ced7c | ||
| 
						 | 
					994cb4da4f | ||
| 
						 | 
					a27f993600 | ||
| 
						 | 
					afdbfc05f7 | ||
| 
						 | 
					7eb2f0cd15 | ||
| 
						 | 
					8e3b39a9e0 | ||
| 
						 | 
					0f92fc5963 | ||
| 
						 | 
					79cbce60ac | ||
| 
						 | 
					70e2c34f0f | ||
| 
						 | 
					3796164848 | ||
| 
						 | 
					95119d46d4 | ||
| 
						 | 
					288a81d847 | ||
| 
						 | 
					bfe36c2ddf | ||
| 
						 | 
					e1899cbc64 | ||
| 
						 | 
					a94ad29740 | ||
| 
						 | 
					41d8deff88 | ||
| 
						 | 
					86d9fcbfff | ||
| 
						 | 
					69a3558b75 | ||
| 
						 | 
					49dff4c80b | ||
| 
						 | 
					83ee9708b1 | ||
| 
						 | 
					07e89c1e5d | ||
| 
						 | 
					52c65fdfea | ||
| 
						 | 
					c12fa4ab19 | ||
| 
						 | 
					b1a09b93ef | ||
| 
						 | 
					223a92ca9d | ||
| 
						 | 
					7ad78c2c88 | ||
| 
						 | 
					a7d7798032 | ||
| 
						 | 
					f883efe2cb | ||
| 
						 | 
					e01dbcc068 | ||
| 
						 | 
					68856755c4 | ||
| 
						 | 
					a2356d5ae3 | ||
| 
						 | 
					4a02350ded | ||
| 
						 | 
					d1e04c1b67 | ||
| 
						 | 
					0f69e2ec0b | ||
| 
						 | 
					3905ada993 | ||
| 
						 | 
					d8eacae7bc | ||
| 
						 | 
					befddfc3e6 | ||
| 
						 | 
					c736a12e86 | ||
| 
						 | 
					7f1235ccbc | ||
| 
						 | 
					4737a87b84 | ||
| 
						 | 
					f7653e582b | ||
| 
						 | 
					db70c9da15 | ||
| 
						 | 
					a03313f3f6 | ||
| 
						 | 
					905ae640cf | ||
| 
						 | 
					4ed12aec30 | ||
| 
						 | 
					17c3de3e4f | ||
| 
						 | 
					3d9f961d13 | ||
| 
						 | 
					8ffa2b24a5 | ||
| 
						 | 
					b961ebe16f | ||
| 
						 | 
					6317db8429 | ||
| 
						 | 
					3e08614fda | ||
| 
						 | 
					0e79802c0a | ||
| 
						 | 
					8d0ff3d7dc | ||
| 
						 | 
					29ad9e0a0a | ||
| 
						 | 
					7ed54a9940 | ||
| 
						 | 
					a4e0d3e930 | ||
| 
						 | 
					6c236277a3 | ||
| 
						 | 
					7054e37126 | ||
| 
						 | 
					400942fedf | ||
| 
						 | 
					7ea1ea88bb | ||
| 
						 | 
					7c956d5d4b | ||
| 
						 | 
					98fdfa1968 | ||
| 
						 | 
					37da18aee8 | ||
| 
						 | 
					d88e524e7c | ||
| 
						 | 
					062c391919 | ||
| 
						 | 
					16fd66f879 | ||
| 
						 | 
					d9545103b9 | ||
| 
						 | 
					5a9b07b0e7 | ||
| 
						 | 
					24f4f9822f | ||
| 
						 | 
					3c3ee6796a | ||
| 
						 | 
					83a1e4fee3 | ||
| 
						 | 
					c51b9ca0ad | ||
| 
						 | 
					ad051f7328 | ||
| 
						 | 
					13072ef86c | ||
| 
						 | 
					11873b70ae | ||
| 
						 | 
					11ab9aa9f5 | ||
| 
						 | 
					cf1f014393 | ||
| 
						 | 
					5bb2d2e0a0 | ||
| 
						 | 
					35d8cc8bc8 | ||
| 
						 | 
					50f53b293c | ||
| 
						 | 
					7479bf21e8 | ||
| 
						 | 
					06b228b20f | ||
| 
						 | 
					19c3880ec9 | ||
| 
						 | 
					2c5f000d5b | ||
| 
						 | 
					234b6ffc2c | ||
| 
						 | 
					d74dad79b7 | ||
| 
						 | 
					515720a6fc | ||
| 
						 | 
					8129b93afe | ||
| 
						 | 
					e3676ae7b5 | ||
| 
						 | 
					499e09734b | ||
| 
						 | 
					b3c0ae5205 | ||
| 
						 | 
					7480df68ce | ||
| 
						 | 
					f46db04f98 | ||
| 
						 | 
					8973875a1f | ||
| 
						 | 
					b221af660d | ||
| 
						 | 
					040083b97f | ||
| 
						 | 
					3a458783a2 | ||
| 
						 | 
					12a6c77fdd | ||
| 
						 | 
					7ceeebf150 | ||
| 
						 | 
					e1b9f7b300 | ||
| 
						 | 
					29dede2eb7 | ||
| 
						 | 
					cab1379a1a | ||
| 
						 | 
					710e83999b | ||
| 
						 | 
					d1240f67ea | ||
| 
						 | 
					2cfcc874b9 | ||
| 
						 | 
					dc3336c277 | ||
| 
						 | 
					c7e4005e5c | ||
| 
						 | 
					de43d00db0 | ||
| 
						 | 
					12387ca4e5 | ||
| 
						 | 
					0dad2f6e62 | ||
| 
						 | 
					a12a4ea396 | ||
| 
						 | 
					455ca55f4e | ||
| 
						 | 
					a2002b8f69 | ||
| 
						 | 
					87fb8f5d57 | ||
| 
						 | 
					84d6de806b | ||
| 
						 | 
					5a07b75b22 | ||
| 
						 | 
					be72e10015 | ||
| 
						 | 
					c5982a3eb5 | ||
| 
						 | 
					e1dce078b2 | ||
| 
						 | 
					6aa9fdce5a | ||
| 
						 | 
					0ee3ce70a8 | ||
| 
						 | 
					73fcf17041 | ||
| 
						 | 
					30cad47fb9 | ||
| 
						 | 
					f7a3c4c8df | ||
| 
						 | 
					2e7d002315 | ||
| 
						 | 
					f0357e415c | ||
| 
						 | 
					5c48ca3239 | ||
| 
						 | 
					268d0bbcbe | ||
| 
						 | 
					30d978a966 | ||
| 
						 | 
					cc03d6366a | ||
| 
						 | 
					a8a4395098 | ||
| 
						 | 
					6731d0a940 | ||
| 
						 | 
					dddd6a46a0 | ||
| 
						 | 
					762cbf574b | ||
| 
						 | 
					f3e2858621 | ||
| 
						 | 
					c65cea0dcb | ||
| 
						 | 
					10cbfc956c | ||
| 
						 | 
					d64c409913 | ||
| 
						 | 
					592ed13bce | ||
| 
						 | 
					329a7b7e24 | ||
| 
						 | 
					c4350d90f1 | ||
| 
						 | 
					b6914d16cc | ||
| 
						 | 
					a98babbfef | ||
| 
						 | 
					343ea81718 | ||
| 
						 | 
					ffdfc82523 | ||
| 
						 | 
					e9b8a7693d | ||
| 
						 | 
					d9e5dab6ac | ||
| 
						 | 
					d307ed5eb9 | ||
| 
						 | 
					82fc816d79 | ||
| 
						 | 
					43940f591e | ||
| 
						 | 
					eae363c96f | ||
| 
						 | 
					d3f135af8f | ||
| 
						 | 
					e07547ee4e | ||
| 
						 | 
					6d544984f2 | ||
| 
						 | 
					9934b3bd34 | ||
| 
						 | 
					24824b54ce | ||
| 
						 | 
					2ca27ab3a1 | ||
| 
						 | 
					1723e6dc4f | ||
| 
						 | 
					16334f778b | ||
| 
						 | 
					c28052e45b | ||
| 
						 | 
					2a466c2abc | ||
| 
						 | 
					6cfc4757b9 | ||
| 
						 | 
					3752edbff4 | ||
| 
						 | 
					d008a816f1 | ||
| 
						 | 
					78b63ce7c3 | ||
| 
						 | 
					231d6cc1e4 | ||
| 
						 | 
					5d291d050e | ||
| 
						 | 
					c4bd476ad1 | ||
| 
						 | 
					c885a953eb | ||
| 
						 | 
					4a7f3bbc46 | ||
| 
						 | 
					d18e600952 | ||
| 
						 | 
					0745288c14 | ||
| 
						 | 
					9f139550f8 | ||
| 
						 | 
					2dbdfe0788 | ||
| 
						 | 
					b9833838c6 | ||
| 
						 | 
					9cddc4ad80 | ||
| 
						 | 
					3ceef97799 | ||
| 
						 | 
					b2688e9559 | ||
| 
						 | 
					b952a3b08c | ||
| 
						 | 
					c5c1a1349a | ||
| 
						 | 
					b008193c12 | ||
| 
						 | 
					cea6d7eb13 | ||
| 
						 | 
					70db027204 | ||
| 
						 | 
					f41dc7e8fa | ||
| 
						 | 
					1175702828 | ||
| 
						 | 
					d4a92cacc6 | ||
| 
						 | 
					11b9bc443d | ||
| 
						 | 
					11f4a7a48e | ||
| 
						 | 
					855bc16a9e | ||
| 
						 | 
					5fc3ecf7f8 | ||
| 
						 | 
					796eaaed40 | ||
| 
						 | 
					88bd1cec77 | ||
| 
						 | 
					82ffe2cbfd | ||
| 
						 | 
					1741b5cc30 | ||
| 
						 | 
					a628feee46 | ||
| 
						 | 
					bd5ec9cd8e | ||
| 
						 | 
					f37c501657 | ||
| 
						 | 
					fa4aad5b50 | ||
| 
						 | 
					f3f39cef84 | ||
| 
						 | 
					7de92cb223 | ||
| 
						 | 
					ebb2e36cc4 | ||
| 
						 | 
					31f2e0cba3 | ||
| 
						 | 
					ff88228abd | ||
| 
						 | 
					31a7b150b0 | ||
| 
						 | 
					20b5cc96be | ||
| 
						 | 
					ea79de21d8 | ||
| 
						 | 
					71f854dde8 | ||
| 
						 | 
					05f87e0b09 | ||
| 
						 | 
					8d5018e780 | ||
| 
						 | 
					ce8f91a71b | ||
| 
						 | 
					6bf60568f8 | ||
| 
						 | 
					83f076d3a8 | ||
| 
						 | 
					835365b817 | ||
| 
						 | 
					c9cc2332cf | ||
| 
						 | 
					450bcb5d7b | ||
| 
						 | 
					fffaba50fb | ||
| 
						 | 
					c5eccedc63 | ||
| 
						 | 
					a58dc9283c | ||
| 
						 | 
					0903452032 | ||
| 
						 | 
					dd865d2981 | ||
| 
						 | 
					d0c64c4196 | ||
| 
						 | 
					0bfefa87c8 | ||
| 
						 | 
					6e4f695a0f | ||
| 
						 | 
					725edde73f | ||
| 
						 | 
					857357f940 | ||
| 
						 | 
					f3fa77bcf1 | ||
| 
						 | 
					1f6afe6b0b | ||
| 
						 | 
					ca41470462 | ||
| 
						 | 
					f0803f6ece | ||
| 
						 | 
					edd9ed6a3b | ||
| 
						 | 
					c4112da8c3 | ||
| 
						 | 
					c493eef643 | ||
| 
						 | 
					05608ee57e | ||
| 
						 | 
					e0f41e0fb4 | ||
| 
						 | 
					c36dbf9711 | ||
| 
						 | 
					6b57118c15 | ||
| 
						 | 
					07996bfac7 | ||
| 
						 | 
					82d45d66ca | ||
| 
						 | 
					5c1b83d9b1 | ||
| 
						 | 
					ce74f76a4c | ||
| 
						 | 
					76dfea6e83 | ||
| 
						 | 
					5a6ebec7b2 | ||
| 
						 | 
					96c4b1c303 | ||
| 
						 | 
					a42e52a09f | ||
| 
						 | 
					6803260f26 | ||
| 
						 | 
					40ea6cd607 | ||
| 
						 | 
					9d3d647f00 | ||
| 
						 | 
					5f38660be1 | ||
| 
						 | 
					9d09c9fdf7 | ||
| 
						 | 
					1d16875db7 | ||
| 
						 | 
					4885a7fa3a | ||
| 
						 | 
					21240d4746 | ||
| 
						 | 
					9a40927533 | ||
| 
						 | 
					09f950af07 | ||
| 
						 | 
					8fa330335f | ||
| 
						 | 
					ef4757afa5 | ||
| 
						 | 
					d9f9b87d3f | ||
| 
						 | 
					1d37c19e04 | ||
| 
						 | 
					5136df0f39 | ||
| 
						 | 
					b283a1e065 | ||
| 
						 | 
					0b57da2a43 | ||
| 
						 | 
					fab66f157d | ||
| 
						 | 
					1a919a11b8 | ||
| 
						 | 
					67445334e7 | ||
| 
						 | 
					1e16b94a85 | ||
| 
						 | 
					07a1292721 | ||
| 
						 | 
					4c37d74ae5 | ||
| 
						 | 
					f10aea73e4 | ||
| 
						 | 
					b03b06cfd3 | ||
| 
						 | 
					6997a738bb | ||
| 
						 | 
					c55cbfbd5f | ||
| 
						 | 
					cbaff216b3 | ||
| 
						 | 
					573260556d | ||
| 
						 | 
					66d9995711 | ||
| 
						 | 
					aecd0740cf | ||
| 
						 | 
					a3def7ac87 | ||
| 
						 | 
					dffff9659b | ||
| 
						 | 
					e42d97b737 | ||
| 
						 | 
					e99b6a131e | ||
| 
						 | 
					cd8747ba6d | ||
| 
						 | 
					804e2505cf | ||
| 
						 | 
					c5d4c92ad4 | ||
| 
						 | 
					d9875c5e6c | ||
| 
						 | 
					49d9426b6a | ||
| 
						 | 
					2b3405e01b | ||
| 
						 | 
					94f61c5b29 | ||
| 
						 | 
					9929a34a6d | ||
| 
						 | 
					ccdb2fa800 | ||
| 
						 | 
					03447ce39c | ||
| 
						 | 
					a7940e7419 | ||
| 
						 | 
					819f675004 | ||
| 
						 | 
					00949db191 | ||
| 
						 | 
					06974ebf2f | ||
| 
						 | 
					88644e181d | ||
| 
						 | 
					005eab0a08 | ||
| 
						 | 
					98073afe55 | ||
| 
						 | 
					768d3589a3 | ||
| 
						 | 
					2bd1687f51 | ||
| 
						 | 
					9f500f684d | ||
| 
						 | 
					bb3dada871 | ||
| 
						 | 
					058ee17371 | ||
| 
						 | 
					70d6fe6632 | ||
| 
						 | 
					61410814c2 | ||
| 
						 | 
					05f7c0280e | ||
| 
						 | 
					f1d25ba2dd | ||
| 
						 | 
					333269482a | ||
| 
						 | 
					fa3aaa41e3 | ||
| 
						 | 
					7e5dea5d32 | ||
| 
						 | 
					31c9a521b4 | ||
| 
						 | 
					0c9e86bab1 | ||
| 
						 | 
					0be9e4a4cd | ||
| 
						 | 
					df7b390514 | ||
| 
						 | 
					0e85c4989b | ||
| 
						 | 
					fec10d4a65 | ||
| 
						 | 
					74f6d717a3 | ||
| 
						 | 
					74e5a494b0 | ||
| 
						 | 
					7963c5d000 | ||
| 
						 | 
					e37adcd664 | ||
| 
						 | 
					e458606ad2 | ||
| 
						 | 
					15ca6dca5c | ||
| 
						 | 
					b300b991a7 | ||
| 
						 | 
					8ee0724558 | ||
| 
						 | 
					95d7e16163 | ||
| 
						 | 
					7d205a70a2 | ||
| 
						 | 
					d86a60c694 | ||
| 
						 | 
					dad96ccce2 | ||
| 
						 | 
					89c070b263 | ||
| 
						 | 
					29a96bcfe1 | ||
| 
						 | 
					48e2a1a119 | ||
| 
						 | 
					297cd7897b | ||
| 
						 | 
					c0fe1743e5 | ||
| 
						 | 
					f0e34be990 | ||
| 
						 | 
					36db8c5047 | ||
| 
						 | 
					49427d1fb4 | ||
| 
						 | 
					bf120635a7 | ||
| 
						 | 
					3934a842b8 | ||
| 
						 | 
					3294039a00 | ||
| 
						 | 
					0b92d9ed9c | ||
| 
						 | 
					1c39e4fbad | ||
| 
						 | 
					3a04267cdd | ||
| 
						 | 
					65847fad44 | ||
| 
						 | 
					e209955606 | ||
| 
						 | 
					8f72ffbc45 | ||
| 
						 | 
					0fe93bc34c | ||
| 
						 | 
					1376ba5b0e | ||
| 
						 | 
					6907a22b27 | ||
| 
						 | 
					727e03fe19 | ||
| 
						 | 
					282be6bf4b | ||
| 
						 | 
					7f5b24597b | ||
| 
						 | 
					af357d6ab0 | ||
| 
						 | 
					36e48573ce | ||
| 
						 | 
					00628c7268 | ||
| 
						 | 
					1d53dd716d | ||
| 
						 | 
					b678e00271 | ||
| 
						 | 
					57eac093c4 | ||
| 
						 | 
					3eec745910 | ||
| 
						 | 
					6dc71926f9 | ||
| 
						 | 
					6c9b82e72a | ||
| 
						 | 
					eda741ae93 | ||
| 
						 | 
					043931ca45 | ||
| 
						 | 
					e2f00abe26 | ||
| 
						 | 
					62880d7568 | ||
| 
						 | 
					36474af463 | ||
| 
						 | 
					ae7139adcf | ||
| 
						 | 
					44889da5b7 | ||
| 
						 | 
					6cce517f1a | ||
| 
						 | 
					dfc532668d | ||
| 
						 | 
					77a93328cf | ||
| 
						 | 
					bfd6d22be2 | ||
| 
						 | 
					87ee38d8b3 | ||
| 
						 | 
					ddb8617d96 | ||
| 
						 | 
					24324ff0e1 | ||
| 
						 | 
					97103f860d | ||
| 
						 | 
					c748eadc80 | ||
| 
						 | 
					07502f2d82 | ||
| 
						 | 
					e8443b1685 | ||
| 
						 | 
					7af0ab1cde | ||
| 
						 | 
					1ce7f39ad7 | ||
| 
						 | 
					c839415e3f | ||
| 
						 | 
					26195f8da1 | ||
| 
						 | 
					6a6fc3107f | ||
| 
						 | 
					a2995f586e | ||
| 
						 | 
					06840f14b4 | ||
| 
						 | 
					a7b02d07f4 | ||
| 
						 | 
					ab79b13079 | ||
| 
						 | 
					f612e5ede7 | ||
| 
						 | 
					925d74f38d | ||
| 
						 | 
					de8b9a85a5 | ||
| 
						 | 
					afc96f2ab3 | ||
| 
						 | 
					bd88a8d551 | ||
| 
						 | 
					495ba26e63 | ||
| 
						 | 
					3189d3bc4a | ||
| 
						 | 
					39262acab6 | ||
| 
						 | 
					ca43fdd92f | ||
| 
						 | 
					d796d1cdda | ||
| 
						 | 
					f818f570c5 | ||
| 
						 | 
					eb39a9482b | ||
| 
						 | 
					cf1401a04d | ||
| 
						 | 
					23a2d2c16a | ||
| 
						 | 
					68284da0d7 | ||
| 
						 | 
					6633b8e5c2 | ||
| 
						 | 
					98a2fc8deb | ||
| 
						 | 
					35ffe6af2d | ||
| 
						 | 
					0ed848a9ea | ||
| 
						 | 
					13235ba65a | ||
| 
						 | 
					b94e8ecd1f | ||
| 
						 | 
					9efd10cd2a | ||
| 
						 | 
					c2cce4f3f5 | ||
| 
						 | 
					ad577b3cb4 | ||
| 
						 | 
					0f4aaeee42 | ||
| 
						 | 
					002d2fda7a | ||
| 
						 | 
					2860ade2f5 | ||
| 
						 | 
					84974ed04c | ||
| 
						 | 
					c2e6a01a28 | ||
| 
						 | 
					4c80f994c3 | ||
| 
						 | 
					e92905a2c8 | ||
| 
						 | 
					fed3e09c94 | ||
| 
						 | 
					b1894ccf06 | ||
| 
						 | 
					f1bb56cebf | ||
| 
						 | 
					9a29888ba7 | ||
| 
						 | 
					5f6e8c9274 | ||
| 
						 | 
					452bf71cec | ||
| 
						 | 
					3bb469d558 | ||
| 
						 | 
					7633c14bd5 | ||
| 
						 | 
					028b965e1a | ||
| 
						 | 
					925f42e460 | ||
| 
						 | 
					71fa9f912d | ||
| 
						 | 
					57b9b19b10 | ||
| 
						 | 
					08fc1db24c | ||
| 
						 | 
					ddad400900 | ||
| 
						 | 
					1059df7486 | ||
| 
						 | 
					565e167356 | ||
| 
						 | 
					011ef6be0e | ||
| 
						 | 
					590a8fcb1e | ||
| 
						 | 
					0aef91bc4f | ||
| 
						 | 
					cd1e39ba62 | ||
| 
						 | 
					bfe1771067 | ||
| 
						 | 
					1fdbe79022 | ||
| 
						 | 
					37b6cceed4 | ||
| 
						 | 
					220842b37b | ||
| 
						 | 
					6d876f9b6b | ||
| 
						 | 
					9540dfc4d9 | ||
| 
						 | 
					6b62508c86 | ||
| 
						 | 
					8a04bc25a1 | ||
| 
						 | 
					939d5a9511 | ||
| 
						 | 
					64c1cf7921 | ||
| 
						 | 
					1c5c7c907c | ||
| 
						 | 
					0a80cf31cf | ||
| 
						 | 
					7ce674491b | ||
| 
						 | 
					9aab1440ca | ||
| 
						 | 
					97e1dd9318 | ||
| 
						 | 
					09c803783d | ||
| 
						 | 
					a12acbc2ff | ||
| 
						 | 
					db172b09c5 | ||
| 
						 | 
					399184d68f | ||
| 
						 | 
					122b4c2187 | ||
| 
						 | 
					6f5a90edb3 | ||
| 
						 | 
					865ac0f055 | ||
| 
						 | 
					f01c6f814a | ||
| 
						 | 
					77a09c92c6 | ||
| 
						 | 
					51ed7dff0d | ||
| 
						 | 
					f5dc5c46e0 | ||
| 
						 | 
					bdd8ebd631 | ||
| 
						 | 
					6a413fe72f | ||
| 
						 | 
					93c77565f6 | ||
| 
						 | 
					e378170c25 | ||
| 
						 | 
					f8f4c2a6f3 | ||
| 
						 | 
					3725998cbc | ||
| 
						 | 
					777bdc6c50 | ||
| 
						 | 
					719e0d3ddb | ||
| 
						 | 
					1187edb38c | ||
| 
						 | 
					112858ae61 | ||
| 
						 | 
					7d8e9b8ed6 | ||
| 
						 | 
					5246fdecf6 | ||
| 
						 | 
					522c94f168 | ||
| 
						 | 
					2d32a9a3a3 | ||
| 
						 | 
					e06586ceb4 | ||
| 
						 | 
					61cb8e76c3 | ||
| 
						 | 
					c45cfb1741 | ||
| 
						 | 
					8581694ceb | ||
| 
						 | 
					4f8ae2bab6 | ||
| 
						 | 
					7b8f8f69f1 | ||
| 
						 | 
					79e98316ea | ||
| 
						 | 
					1150d9e15a | ||
| 
						 | 
					db3b86e7f3 | ||
| 
						 | 
					94d22f9309 | ||
| 
						 | 
					4bdb868ac8 | ||
| 
						 | 
					624a878701 | ||
| 
						 | 
					63335859d1 | ||
| 
						 | 
					f15cce1d41 | ||
| 
						 | 
					3ace8ceb23 | ||
| 
						 | 
					11d8418737 | ||
| 
						 | 
					763d638ca1 | ||
| 
						 | 
					a8c3202836 | ||
| 
						 | 
					f12ead2cf2 | ||
| 
						 | 
					d589a7b5db | ||
| 
						 | 
					e27a5c8851 | ||
| 
						 | 
					ac7d17f88e | ||
| 
						 | 
					d8d287b4d2 | ||
| 
						 | 
					d62a429b92 | ||
| 
						 | 
					c699c0b154 | ||
| 
						 | 
					963b942bb9 | ||
| 
						 | 
					a4a7006a13 | ||
| 
						 | 
					78f297dabe | ||
| 
						 | 
					fa3aa6441c | ||
| 
						 | 
					eedd56f320 | ||
| 
						 | 
					aa89a65a83 | ||
| 
						 | 
					54ef162a1a | ||
| 
						 | 
					886a31ef20 | ||
| 
						 | 
					85902d98e8 | ||
| 
						 | 
					3d4bf3b3fd | ||
| 
						 | 
					7468956236 | ||
| 
						 | 
					e97541c208 | ||
| 
						 | 
					41f9fa9bed | ||
| 
						 | 
					3497eb4e2c | ||
| 
						 | 
					508b360c24 | ||
| 
						 | 
					b803a33a8f | ||
| 
						 | 
					b899099327 | ||
| 
						 | 
					ee638415e3 | ||
| 
						 | 
					ab53aa3e3c | ||
| 
						 | 
					3847446603 | ||
| 
						 | 
					81e6071e0f | ||
| 
						 | 
					34876e4fe9 | ||
| 
						 | 
					36d98b3919 | ||
| 
						 | 
					83071f579c | ||
| 
						 | 
					d980bd403d | ||
| 
						 | 
					620cddfc13 | ||
| 
						 | 
					0f26e3aa5b | ||
| 
						 | 
					deb5601d8d | ||
| 
						 | 
					0ee9ced4cb | ||
| 
						 | 
					eb2d607899 | ||
| 
						 | 
					36ae77dd49 | ||
| 
						 | 
					25b7df4dab | ||
| 
						 | 
					51359e6d33 | ||
| 
						 | 
					7f6c1a76c6 | ||
| 
						 | 
					19fcc74016 | ||
| 
						 | 
					bdf00d3dbd | ||
| 
						 | 
					1cd6515af0 | ||
| 
						 | 
					d21f6ca4aa | ||
| 
						 | 
					06cb713f39 | ||
| 
						 | 
					e27e658033 | ||
| 
						 | 
					53f4e43191 | ||
| 
						 | 
					4272b37d3d | ||
| 
						 | 
					6f3a2145b0 | ||
| 
						 | 
					5f404f2cb7 | ||
| 
						 | 
					e92083798c | ||
| 
						 | 
					5b33f48389 | ||
| 
						 | 
					700a5374f1 | ||
| 
						 | 
					6eee3f6781 | ||
| 
						 | 
					4664a095a4 | ||
| 
						 | 
					82a701401c | ||
| 
						 | 
					ef3ec2603d | ||
| 
						 | 
					2f5f157274 | ||
| 
						 | 
					71fd34e596 | ||
| 
						 | 
					ee015f086f | ||
| 
						 | 
					be97276735 | ||
| 
						 | 
					76a991c117 | ||
| 
						 | 
					ba63e31cc7 | ||
| 
						 | 
					0074cadb3b | ||
| 
						 | 
					c206b3a6d5 | ||
| 
						 | 
					d355376865 | ||
| 
						 | 
					fbb44a6e0d | ||
| 
						 | 
					00a1b1deeb | ||
| 
						 | 
					07e97a5f2c | ||
| 
						 | 
					8be4db8caf | ||
| 
						 | 
					f6700d5c98 | ||
| 
						 | 
					a775530941 | ||
| 
						 | 
					c730ca5997 | ||
| 
						 | 
					29ea0fa09f | ||
| 
						 | 
					4d9278f87f | ||
| 
						 | 
					52bffd2457 | ||
| 
						 | 
					e2aa952689 | ||
| 
						 | 
					8b62d9bc0a | ||
| 
						 | 
					70a86c14f4 | ||
| 
						 | 
					d76341297a | ||
| 
						 | 
					fb3ad7f882 | ||
| 
						 | 
					01ad3faee9 | ||
| 
						 | 
					bcd442761b | ||
| 
						 | 
					c5761bfe41 | ||
| 
						 | 
					895a888865 | ||
| 
						 | 
					5689478c68 | ||
| 
						 | 
					ff7ad5fd73 | ||
| 
						 | 
					ff8e519d4b | ||
| 
						 | 
					7d27cf8364 | ||
| 
						 | 
					24000b83c9 | ||
| 
						 | 
					17a6ac5675 | ||
| 
						 | 
					7968d30510 | ||
| 
						 | 
					e826c143d3 | ||
| 
						 | 
					9d6568da0f | ||
| 
						 | 
					451cd2c88d | ||
| 
						 | 
					dfaeb6bb2c | ||
| 
						 | 
					11ba7a0e8a | ||
| 
						 | 
					beffab02c4 | ||
| 
						 | 
					2668782db2 | ||
| 
						 | 
					87072ff639 | ||
| 
						 | 
					361b6a9403 | ||
| 
						 | 
					80b024d56a | ||
| 
						 | 
					45fe92bf39 | ||
| 
						 | 
					b059040011 | ||
| 
						 | 
					8c6a636cd9 | ||
| 
						 | 
					c750114894 | ||
| 
						 | 
					4fdcf50d66 | ||
| 
						 | 
					19755b648c | ||
| 
						 | 
					fb4b422fc4 | ||
| 
						 | 
					992fa50dfd | ||
| 
						 | 
					c1a5b11f11 | ||
| 
						 | 
					991b3ff7e6 | ||
| 
						 | 
					e62566a763 | ||
| 
						 | 
					67c33fb8ff | ||
| 
						 | 
					3df88a1a01 | ||
| 
						 | 
					cc25576f8b | ||
| 
						 | 
					e68f5d9a30 | ||
| 
						 | 
					d2f05f72f0 | ||
| 
						 | 
					307a6de17a | ||
| 
						 | 
					4015b23e8e | ||
| 
						 | 
					7fc635fee0 | ||
| 
						 | 
					de36c5fac4 | ||
| 
						 | 
					7f98460e37 | ||
| 
						 | 
					c47d25d74b | ||
| 
						 | 
					2102d1a2eb | ||
| 
						 | 
					78cbc045c1 | ||
| 
						 | 
					9d73b261cf | ||
| 
						 | 
					8f30e1b110 | ||
| 
						 | 
					142c2132cf | ||
| 
						 | 
					1744fe12d4 | ||
| 
						 | 
					d63599719a | ||
| 
						 | 
					0d1fcd329f | ||
| 
						 | 
					8807cac100 | ||
| 
						 | 
					c1f742d775 | ||
| 
						 | 
					73d5eb1edf | ||
| 
						 | 
					8f1c873b5f | ||
| 
						 | 
					5842dad7e7 | ||
| 
						 | 
					41da225336 | ||
| 
						 | 
					fe9804a96d | ||
| 
						 | 
					aad57cc06a | ||
| 
						 | 
					ac1726788c | ||
| 
						 | 
					1855b3073a | ||
| 
						 | 
					7b26167580 | ||
| 
						 | 
					79f1a3c4a1 | ||
| 
						 | 
					e711e5b950 | ||
| 
						 | 
					65c1880735 | ||
| 
						 | 
					11fb9c7674 | ||
| 
						 | 
					f2c4e7e552 | ||
| 
						 | 
					ba467779bb | ||
| 
						 | 
					aec60e3782 | ||
| 
						 | 
					93f02f5793 | ||
| 
						 | 
					3000b6b473 | ||
| 
						 | 
					ac6f6b317a | ||
| 
						 | 
					b9a2318bec | ||
| 
						 | 
					70cf4546d6 | ||
| 
						 | 
					2cd79bc853 | ||
| 
						 | 
					dd95c96b8a | ||
| 
						 | 
					0fbdfd02dc | ||
| 
						 | 
					6b308d89f9 | ||
| 
						 | 
					f2d696cd51 | ||
| 
						 | 
					42ab639bf7 | ||
| 
						 | 
					b14c5477e5 | ||
| 
						 | 
					3045f09ef4 | ||
| 
						 | 
					73c74355ab | ||
| 
						 | 
					bda208f823 | ||
| 
						 | 
					d360153bc6 | ||
| 
						 | 
					47de7973fd | ||
| 
						 | 
					500a6f576d | ||
| 
						 | 
					73553e60ec | ||
| 
						 | 
					22b1338390 | ||
| 
						 | 
					991bfb7cbf | ||
| 
						 | 
					7680f46157 | ||
| 
						 | 
					c4fccfe3e6 | ||
| 
						 | 
					e8a40526cb | ||
| 
						 | 
					c03faa32f3 | ||
| 
						 | 
					8fd9037cfd | ||
| 
						 | 
					9a127d8ed4 | ||
| 
						 | 
					4758cfe33f | ||
| 
						 | 
					da24324e2d | ||
| 
						 | 
					3ec723ddc7 | ||
| 
						 | 
					1b25cb80ba | ||
| 
						 | 
					9c552272e8 | ||
| 
						 | 
					97be2f0e0a | ||
| 
						 | 
					b7b3fc2386 | ||
| 
						 | 
					1d7ad5d24b | ||
| 
						 | 
					4d63ebe2fb | ||
| 
						 | 
					1cf79eb8c8 | ||
| 
						 | 
					2df1534b78 | ||
| 
						 | 
					225acbbff1 | ||
| 
						 | 
					31e55b8049 | ||
| 
						 | 
					a7d33d0c36 | ||
| 
						 | 
					1cb1b0a52c | ||
| 
						 | 
					036f98575c | ||
| 
						 | 
					fade60088e | ||
| 
						 | 
					59da64146d | ||
| 
						 | 
					2eab4ab033 | ||
| 
						 | 
					8b34aa50b9 | ||
| 
						 | 
					9579879b1b | ||
| 
						 | 
					204bbc4714 | ||
| 
						 | 
					934e8c79af | ||
| 
						 | 
					e3268d5e88 | ||
| 
						 | 
					e39c104d13 | ||
| 
						 | 
					53c749ce0a | ||
| 
						 | 
					1ff04b980f | ||
| 
						 | 
					10b8cd75b3 | ||
| 
						 | 
					dd7b17aa0a | ||
| 
						 | 
					ada5bc1404 | ||
| 
						 | 
					908e9f41ed | ||
| 
						 | 
					fdbcc9847d | ||
| 
						 | 
					6f19a8c9f7 | ||
| 
						 | 
					36737aebb7 | ||
| 
						 | 
					96ad414d73 | ||
| 
						 | 
					670b315c4d | ||
| 
						 | 
					442e1420f9 | ||
| 
						 | 
					3c5661ec3c | ||
| 
						 | 
					791928dc48 | ||
| 
						 | 
					74994faee7 | ||
| 
						 | 
					4af6c72d79 | ||
| 
						 | 
					6760ec2b77 | ||
| 
						 | 
					2c8c763723 | ||
| 
						 | 
					91594a1ef8 | ||
| 
						 | 
					fdcfcf28a2 | ||
| 
						 | 
					a6c05458d4 | ||
| 
						 | 
					4c31bc6e3f | ||
| 
						 | 
					cb35affd1b | ||
| 
						 | 
					e95be3379a | ||
| 
						 | 
					0152266dd3 | ||
| 
						 | 
					50de7019c0 | ||
| 
						 | 
					c3f3d0b81a | ||
| 
						 | 
					ecf15be0a7 | ||
| 
						 | 
					84cfc13589 | ||
| 
						 | 
					3c8a448a2f | ||
| 
						 | 
					dcb6fb224d | ||
| 
						 | 
					efd8ae483f | ||
| 
						 | 
					202ade1398 | ||
| 
						 | 
					4ffda3f05b | ||
| 
						 | 
					dff2d916ba | ||
| 
						 | 
					dd8cf0c12d | ||
| 
						 | 
					8df7208d7b | ||
| 
						 | 
					c5addd94e3 | ||
| 
						 | 
					2f71d1dc00 | ||
| 
						 | 
					a461837835 | ||
| 
						 | 
					0e03c0849d | ||
| 
						 | 
					3089c833ff | ||
| 
						 | 
					d3d18a42d2 | ||
| 
						 | 
					9477abc359 | ||
| 
						 | 
					e8069cfc3d | ||
| 
						 | 
					4ef664f485 | ||
| 
						 | 
					c3ae209246 | ||
| 
						 | 
					f6c8532fd0 | ||
| 
						 | 
					c0190798e1 | ||
| 
						 | 
					86ff381ac2 | ||
| 
						 | 
					4a3cd364d0 | ||
| 
						 | 
					3f269503d5 | ||
| 
						 | 
					630b7b94c3 | ||
| 
						 | 
					43dacceb6b | ||
| 
						 | 
					c02556e290 | ||
| 
						 | 
					a9fb4d9d5b | ||
| 
						 | 
					98c8ab18ff | ||
| 
						 | 
					33c08ac91e | ||
| 
						 | 
					fd64988c80 | ||
| 
						 | 
					55f790ebe4 | ||
| 
						 | 
					283bf7e87c | ||
| 
						 | 
					86e7f60756 | ||
| 
						 | 
					cfa2eebdaf | ||
| 
						 | 
					a8b22e16ef | ||
| 
						 | 
					38da050f31 | ||
| 
						 | 
					9a3325a56d | ||
| 
						 | 
					ed6fda2f98 | ||
| 
						 | 
					ef26c44524 | ||
| 
						 | 
					b9263fb4e1 | ||
| 
						 | 
					47e41b2023 | ||
| 
						 | 
					e29301954c | ||
| 
						 | 
					82fb7a0202 | ||
| 
						 | 
					768451c5e3 | ||
| 
						 | 
					db49c4a7f0 | ||
| 
						 | 
					2f060dec6a | ||
| 
						 | 
					f9505063f8 | ||
| 
						 | 
					18c6946961 | ||
| 
						 | 
					ac88e90557 | ||
| 
						 | 
					5b962f0d1c | ||
| 
						 | 
					39c75c7000 | ||
| 
						 | 
					061948597d | ||
| 
						 | 
					4ae902ec5f | ||
| 
						 | 
					39ce9b3afc | ||
| 
						 | 
					f7b577dc77 | ||
| 
						 | 
					cedc633757 | ||
| 
						 | 
					8584c25903 | ||
| 
						 | 
					88746ec067 | ||
| 
						 | 
					39da0198cd | ||
| 
						 | 
					60159c2e77 | ||
| 
						 | 
					9f2a3023f8 | ||
| 
						 | 
					0908533127 | ||
| 
						 | 
					a31d091fb3 | ||
| 
						 | 
					36747e4a7f | ||
| 
						 | 
					3df49acb30 | ||
| 
						 | 
					b625d03dd6 | ||
| 
						 | 
					964e8c5bf2 | ||
| 
						 | 
					482da2eceb | ||
| 
						 | 
					5a89a12aa0 | ||
| 
						 | 
					422925a65e | ||
| 
						 | 
					ae20f88202 | ||
| 
						 | 
					93591d428f | ||
| 
						 | 
					f0f8319769 | ||
| 
						 | 
					38f94da47d | ||
| 
						 | 
					a4120f2015 | ||
| 
						 | 
					8fde399fe6 | ||
| 
						 | 
					2f2f53ddc9 | ||
| 
						 | 
					82e22596d8 | ||
| 
						 | 
					ee34869e89 | ||
| 
						 | 
					0ff52b6845 | ||
| 
						 | 
					c67c864ffd | ||
| 
						 | 
					488f341f57 | ||
| 
						 | 
					0303b26b1e | ||
| 
						 | 
					0cf05c77ad | ||
| 
						 | 
					b2fde01c54 | ||
| 
						 | 
					524b338974 | ||
| 
						 | 
					352b799efc | ||
| 
						 | 
					ff713a51bd | ||
| 
						 | 
					0da6c591c0 | ||
| 
						 | 
					e6c9076a74 | ||
| 
						 | 
					cff36093f3 | ||
| 
						 | 
					f2eac18a6e | ||
| 
						 | 
					4ad4527d10 | ||
| 
						 | 
					96e458b705 | ||
| 
						 | 
					8a58648471 | ||
| 
						 | 
					a5b6a75787 | ||
| 
						 | 
					159e1b06a5 | ||
| 
						 | 
					278c847106 | ||
| 
						 | 
					75bfe825fc | ||
| 
						 | 
					67391c2c6c | 
							
								
								
									
										1
									
								
								.mailmap
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								.mailmap
									
									
									
									
									
								
							@@ -7,6 +7,7 @@ Bryan Ischo <bryan@ischo.com> <bji-keyword-pacman.3644cb@www.ischo.com>
 | 
			
		||||
Christos Nouskas <nous@archlinux.us> <nouskas@gmail.com>
 | 
			
		||||
Daenyth Blank <daenyth+arch@gmail.com> <Daenyth+Arch@gmail.com>
 | 
			
		||||
Daenyth Blank <Daenyth+arch@gmail.com> <Daenyth+git@gmail.com>
 | 
			
		||||
Dave Reisner <dreisner@archlinux.org> <d@falconindy.com>
 | 
			
		||||
甘露(Gan Lu) <rhythm.gan@gmail.com>
 | 
			
		||||
Giovanni Scafora <giovanni@archlinux.org> <linuxmania@gmail.com>
 | 
			
		||||
Jaroslaw Swierczynski <swiergot@gmail.com> <swiergot@juvepoland.com>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,12 @@ source_file = lib/libalpm/po/libalpm.pot
 | 
			
		||||
source_lang = en
 | 
			
		||||
 | 
			
		||||
[archlinux-pacman.pacman-pot]
 | 
			
		||||
file_filter = po/<lang>.po
 | 
			
		||||
source_file = po/pacman.pot
 | 
			
		||||
file_filter = src/pacman/po/<lang>.po
 | 
			
		||||
source_file = src/pacman/po/pacman.pot
 | 
			
		||||
source_lang = en
 | 
			
		||||
 | 
			
		||||
[archlinux-pacman.pacman-scripts-pot]
 | 
			
		||||
file_filter = scripts/po/<lang>.po
 | 
			
		||||
source_file = scripts/po/pacman-scripts.pot
 | 
			
		||||
source_lang = en
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								AUTHORS
									
									
									
									
									
								
							@@ -1,16 +1 @@
 | 
			
		||||
Judd Vinet <jvinet@zeroflux.org>
 | 
			
		||||
Aurelien Foret <aurelien@archlinux.org>
 | 
			
		||||
Aaron Griffin <aaron@archlinux.org>
 | 
			
		||||
Dan McGee <dan@archlinux.org>
 | 
			
		||||
 | 
			
		||||
Miklós Vajna <vmiklos@frugalware.org>
 | 
			
		||||
Christian Hamar <krics@linuxforum.hu>
 | 
			
		||||
Josh Wheeler <deltalima@gmail.com>
 | 
			
		||||
David Kimpe <DNAku@frugalware.org>
 | 
			
		||||
James Rosten <seinfeld90@gmail.com>
 | 
			
		||||
Roman Kyrylych <Roman.Kyrylych@gmail.com>
 | 
			
		||||
Andrew Fyfe <andrew@neptune-one.net>
 | 
			
		||||
Chantry Xavier <shiningxc@gmail.com>
 | 
			
		||||
Nagy Gabor <ngaba@bibl.u-szeged.hu>
 | 
			
		||||
Nathan Jones <nathanj@insightbb.com>
 | 
			
		||||
Allan McRae <mcrae_allan@hotmail.com>
 | 
			
		||||
Use `git shortlog -s` for a list of contributors.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								HACKING
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								HACKING
									
									
									
									
									
								
							@@ -35,7 +35,7 @@ while(it) {
 | 
			
		||||
  if(fn) {
 | 
			
		||||
    fn(it->data);
 | 
			
		||||
  } else {
 | 
			
		||||
    return(1);
 | 
			
		||||
    return 1;
 | 
			
		||||
  }
 | 
			
		||||
  free(it);
 | 
			
		||||
  it = ptr;
 | 
			
		||||
@@ -67,11 +67,11 @@ alpm_list_t *alpm_list_add(alpm_list_t *list, void *data)
 | 
			
		||||
       NOT
 | 
			
		||||
    // This is a comment
 | 
			
		||||
 | 
			
		||||
5.  Return statements should be written like a function call.
 | 
			
		||||
5.  Return statements should *not* be written like function calls.
 | 
			
		||||
 | 
			
		||||
    return(0);
 | 
			
		||||
       NOT
 | 
			
		||||
    return 0;
 | 
			
		||||
       NOT
 | 
			
		||||
    return(0);
 | 
			
		||||
 | 
			
		||||
6.  The sizeof() operator should accept a type, not a value. (TODO: in certain
 | 
			
		||||
    cases, it may be better- should this be a set guideline? Read "The Practice
 | 
			
		||||
@@ -147,5 +147,5 @@ For example, to run valgrind:
 | 
			
		||||
    valgrind --leak-check=full -- src/pacman/.libs/lt-pacman -Syu
 | 
			
		||||
 | 
			
		||||
/////
 | 
			
		||||
vim: set ts=2 sw=2 syntax=asciidoc et:
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								INSTALL
									
									
									
									
									
								
							@@ -16,8 +16,8 @@ properly build pacman.
 | 
			
		||||
libarchive
 | 
			
		||||
http://code.google.com/p/libarchive/
 | 
			
		||||
 | 
			
		||||
libfetch
 | 
			
		||||
ftp://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/net/libfetch/README.html
 | 
			
		||||
libcurl
 | 
			
		||||
http://curl.haxx.se/libcurl/
 | 
			
		||||
 | 
			
		||||
Briefly, the shell commands `./configure; make; make install' should
 | 
			
		||||
configure, build, and install this package.  The following
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								Makefile.am
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
SUBDIRS = lib/libalpm src/util src/pacman scripts etc po test/pacman test/util contrib
 | 
			
		||||
SUBDIRS = lib/libalpm src/util src/pacman scripts etc test/pacman test/util contrib
 | 
			
		||||
if WANT_DOC
 | 
			
		||||
SUBDIRS += doc
 | 
			
		||||
endif
 | 
			
		||||
@@ -14,14 +14,19 @@ EXTRA_DIST = HACKING
 | 
			
		||||
 | 
			
		||||
# Sample makepkg prototype files
 | 
			
		||||
pkgdatadir = ${datadir}/${PACKAGE}
 | 
			
		||||
dist_pkgdata_DATA = PKGBUILD.proto PKGBUILD-split.proto proto.install ChangeLog.proto
 | 
			
		||||
dist_pkgdata_DATA = \
 | 
			
		||||
	proto/PKGBUILD.proto \
 | 
			
		||||
	proto/PKGBUILD-split.proto \
 | 
			
		||||
	proto/proto.install \
 | 
			
		||||
	proto/ChangeLog.proto
 | 
			
		||||
 | 
			
		||||
# run the pactest test suite and vercmp tests
 | 
			
		||||
check-local: test/pacman test/util src/pacman src/util
 | 
			
		||||
	$(PYTHON) $(top_srcdir)/test/pacman/pactest.py --debug=1 \
 | 
			
		||||
	LC_ALL=C $(PYTHON) $(top_srcdir)/test/pacman/pactest.py --debug=1 \
 | 
			
		||||
		--test $(top_srcdir)/test/pacman/tests/*.py \
 | 
			
		||||
		-p $(top_builddir)/src/pacman/pacman
 | 
			
		||||
	rm -rf $(top_builddir)/root
 | 
			
		||||
	$(SH) $(top_srcdir)/test/util/pacsorttest.sh \
 | 
			
		||||
		$(top_builddir)/src/util/pacsort
 | 
			
		||||
	$(SH) $(top_srcdir)/test/util/vercmptest.sh \
 | 
			
		||||
		$(top_builddir)/src/util/vercmp
 | 
			
		||||
 | 
			
		||||
@@ -31,4 +36,9 @@ install-data-local:
 | 
			
		||||
	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
update-po:
 | 
			
		||||
	$(MAKE) -C lib/libalpm/po update-po
 | 
			
		||||
	$(MAKE) -C scripts/po update-po
 | 
			
		||||
	$(MAKE) -C src/pacman/po update-po
 | 
			
		||||
 | 
			
		||||
# vim:set ts=2 sw=2 noet:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										96
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										96
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,5 +1,95 @@
 | 
			
		||||
VERSION         DESCRIPTION
 | 
			
		||||
-----------------------------------------------------------------------------
 | 
			
		||||
4.0.0         - well-integrated and powerful signed packages and databases
 | 
			
		||||
                support in pacman, the library, and scripts (FS#5331)
 | 
			
		||||
              - over 800 commits to pacman.git since 3.5.4 release
 | 
			
		||||
              - many code cleanup commits across library/binaries/scripts
 | 
			
		||||
              - many performance improvement commits across library/binaries
 | 
			
		||||
              - add new -S --recursive operation to upgrade a full dep chain
 | 
			
		||||
              - report upgrade size on sync operations (FS#12566)
 | 
			
		||||
              - early terminal input is flushed before question prompts
 | 
			
		||||
              - remove duplicate code shared in sync and upgrade operations
 | 
			
		||||
              - remove ShowSize; replaced with VerbosePkgLists (FS#15772)
 | 
			
		||||
              - print callback (warning, error) messages to stderr (FS#25099)
 | 
			
		||||
              - download progress callback has more room for filenames
 | 
			
		||||
              - fix selection entry for long values (FS#25253)
 | 
			
		||||
              - make config parsing two-pass process, enhance error messages
 | 
			
		||||
              - print helpful tips on -Qi <filename> or -S <filename>
 | 
			
		||||
              - replace libfetch with libcurl for backend download library
 | 
			
		||||
                - timeout when mirror is not responding (FS#15369)
 | 
			
		||||
                - full HTTPS protocol support (FS#22435)
 | 
			
		||||
                - support of non-traditional/redirected URLs (FS#22645)
 | 
			
		||||
                - ensure downloads are only resumed if appropriate (FS#23803)
 | 
			
		||||
              - only remove empty directories if no remaining owner (FS#25141)
 | 
			
		||||
              - better cache directory choosing and honor $TMPDIR (FS#25435)
 | 
			
		||||
              - replaces are parsed as dependency-style strings (FS#23410)
 | 
			
		||||
              - split package verification and load stages
 | 
			
		||||
              - sync database reading refactor for performance
 | 
			
		||||
              - use a larger buffer for package checksum validation
 | 
			
		||||
              - filelists now have a dedicated type with metadata
 | 
			
		||||
              - diskspace check no longer requires iterating package archives
 | 
			
		||||
              - update and add checksum routines from PolarSSL
 | 
			
		||||
              - validate sync database sha256sum if available
 | 
			
		||||
              - correctly parse sizes in database > 2GiB
 | 
			
		||||
              - API: several type renames from pm* to alpm_* prefix
 | 
			
		||||
              - API: several enum constant renames from PM to ALPM_* prefix
 | 
			
		||||
              - API: several types are now public exposed structs
 | 
			
		||||
              - API: handle is no longer a single global variable
 | 
			
		||||
              - API: more changes than can be mentioned here, see README
 | 
			
		||||
              - much improved API documentation for use by Doxygen
 | 
			
		||||
              - pactest: several performance/checking improvements
 | 
			
		||||
              - scripts:
 | 
			
		||||
                - refactor some common components into shared bash library
 | 
			
		||||
                - split translations into pacman-scripts catalog (FS#15148)
 | 
			
		||||
              - makepkg:
 | 
			
		||||
                - allow signing packages after creation
 | 
			
		||||
                - allow verifying source file signatures (FS#20448)
 | 
			
		||||
                - support UPX compression of executables (FS#17213)
 | 
			
		||||
                - allow usage of an alternate build directory (FS#22308)
 | 
			
		||||
                - cleancache option has been removed; use shell instead
 | 
			
		||||
                - improved variable sanity checking (FS#16004)
 | 
			
		||||
                - better handling of package extensions (.tar.Z or invalid)
 | 
			
		||||
                - allow PKGEXT/SRCEXT environment overrides (FS#19860)
 | 
			
		||||
                - only check for writable PKGDEST if necessary (FS#24735)
 | 
			
		||||
                - check_software function exits early if missing req'd binaries
 | 
			
		||||
                - do source packaging in fakeroot (FS#24330)
 | 
			
		||||
                - be more POSIX-compatible in use of `ln` (FS#24893)
 | 
			
		||||
                - handle spaces with filenames in noextract (FS#25100)
 | 
			
		||||
                - allow epoch-versioned optdepends
 | 
			
		||||
              - pacman-key: new keyring management tool for signed data
 | 
			
		||||
              - pacsort: new utility, sort version numbers as pacman does
 | 
			
		||||
              - pactree: support sync databases with -s option
 | 
			
		||||
              - pkgdelta: add a manpage
 | 
			
		||||
              - repo-add:
 | 
			
		||||
                - handle and include package signatures in databases
 | 
			
		||||
                - verify database signature before modification
 | 
			
		||||
                - sign database after creation/modification
 | 
			
		||||
                - general script cleanup and bash-ification
 | 
			
		||||
                - add sha256sums to database (FS#23103)
 | 
			
		||||
              - contrib/bacman: code cleanups and small bug fixes
 | 
			
		||||
              - contrib/bash_completion: updates for new options/commands
 | 
			
		||||
              - contrib/paccache: new, pacman cache cleanup script
 | 
			
		||||
              - contrib/paclist: rewrite using bash
 | 
			
		||||
              - contrib/paclog-pkglist: new, recover from missing local DB
 | 
			
		||||
              - documentation: extensive updates to all manpages
 | 
			
		||||
              - translations: extensive updates, new languages: lt, zh_TW
 | 
			
		||||
3.5.4         - fix display of lists on non-TTYs and other output fixes
 | 
			
		||||
              - fix group selection entry for large inputs (FS#24253)
 | 
			
		||||
              - fix divide by zero when downloading zero length files
 | 
			
		||||
              - flush terminal input before reading response (FS#20538)
 | 
			
		||||
              - allow files to be replaced by directories (FS#24904)
 | 
			
		||||
              - makepkg: fix filenames with spaces and noextract (FS#25100)
 | 
			
		||||
              - scripts: remove ln -f option for POSIX compliance (FS#24893)
 | 
			
		||||
              - various small documentation updates
 | 
			
		||||
              - minor translation updates: de, fi
 | 
			
		||||
3.5.3         - segfault when creating lock in non-existent dir (FS#24292)
 | 
			
		||||
              - segfault when uninstalling broken backed-up symlink (FS#24230)
 | 
			
		||||
              - --print should not enable --noconfirm (FS#24287)
 | 
			
		||||
              - fix default path substitution in documentation
 | 
			
		||||
              - makepkg: quote variables that may contain spaces (FS#24002)
 | 
			
		||||
              - makepkg: fix creation of source package with -p (FS#24567)
 | 
			
		||||
              - repo-add: include dotfiles in filelists (FS#24534)
 | 
			
		||||
              - minor translation updates: de, fi, fr, sk, zh_CN
 | 
			
		||||
3.5.2         - ensure we show correct missing dependency info (FS#23424)
 | 
			
		||||
              - pacman usage/--help updates (FS#23433, FS#23369)
 | 
			
		||||
              - ensure stdout/stderr are flushed before prompts (FS#23492)
 | 
			
		||||
@@ -105,7 +195,7 @@ VERSION         DESCRIPTION
 | 
			
		||||
              - Installing packages with -U can handle installing
 | 
			
		||||
                dependencies, conflict resolution and replacing packages
 | 
			
		||||
                (FS#3492, FS#5798)
 | 
			
		||||
              - can upgrade the system and install a new package using 
 | 
			
		||||
              - can upgrade the system and install a new package using
 | 
			
		||||
                "pacman -Syu <pkg>" (FS#15581)
 | 
			
		||||
              - new -D/--database operation for modifying package install
 | 
			
		||||
                reasons (FS#12950)
 | 
			
		||||
@@ -117,7 +207,7 @@ VERSION         DESCRIPTION
 | 
			
		||||
              - allow -Qo to perform a functional 'which' (FS#8798)
 | 
			
		||||
              - cache cleaning cleans all directories, not just first
 | 
			
		||||
              - cleanupdelta: new utility to help remove unused deltas from
 | 
			
		||||
                a repo database 
 | 
			
		||||
                a repo database
 | 
			
		||||
              - bash completion: rewrite for size and performance (FS#16630)
 | 
			
		||||
              - repo-add: handle removing the final package from a repo
 | 
			
		||||
              - rankmirrors: rewrite using bash
 | 
			
		||||
@@ -563,7 +653,7 @@ VERSION         DESCRIPTION
 | 
			
		||||
              - Makefile fix for nonstandard lib search paths (Kevin Piche)
 | 
			
		||||
              - fixed the leftover directories in /tmp
 | 
			
		||||
              - speed improvement patches from Tommi Rantala
 | 
			
		||||
2.9.2         - bugfix for 2.9.1 
 | 
			
		||||
2.9.2         - bugfix for 2.9.1
 | 
			
		||||
2.9.1         - --refresh now only downloads fresh packages lists if they've
 | 
			
		||||
                been updated (currently only works with FTP)
 | 
			
		||||
2.9           - Improved -Rs functionality -- pacman now tracks why a package
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										90
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										90
									
								
								README
									
									
									
									
									
								
							@@ -73,8 +73,8 @@ The following options are read-only, having ONLY alpm_option_get_* functions:
 | 
			
		||||
 | 
			
		||||
* lockfile: The file used for locking the database
 | 
			
		||||
  (Default: <dbpath>/db.lck)
 | 
			
		||||
* localdb: A pmdb_t structure for the local (installed) database
 | 
			
		||||
* syncdbs: A list of pmdb_t structures to which pacman can sync from.
 | 
			
		||||
* localdb: A alpm_db_t structure for the local (installed) database
 | 
			
		||||
* syncdbs: A list of alpm_db_t structures to which pacman can sync from.
 | 
			
		||||
 | 
			
		||||
The following options are write-only, having ONLY alpm_option_set_* functions:
 | 
			
		||||
 | 
			
		||||
@@ -154,7 +154,7 @@ specified error code into a more friendly sentence, and alpm_strerrorlast()
 | 
			
		||||
does the same for the last error encountered (represented by pm_errno).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[List - alpm_list_t] 
 | 
			
		||||
[List - alpm_list_t]
 | 
			
		||||
 | 
			
		||||
The alpm_list_t structure is a doubly-linked list for use with the libalpm
 | 
			
		||||
routines. This type is provided publicly so that frontends are free to use it
 | 
			
		||||
@@ -192,8 +192,8 @@ remove.c and sync.c).
 | 
			
		||||
 | 
			
		||||
The frontend is using a configuration file, usually "/etc/pacman.conf".  Some
 | 
			
		||||
of these options are only useful for the frontend only (mainly the ones used to
 | 
			
		||||
control the output like showsize or totaldownload, or the behavior with
 | 
			
		||||
cleanmethod and syncfirst).  The rest is used to configure the library.
 | 
			
		||||
control the output like totaldownload, or the behavior with cleanmethod and
 | 
			
		||||
syncfirst).  The rest is used to configure the library.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[UPGRADE/REMOVE/SYNC]
 | 
			
		||||
@@ -365,3 +365,83 @@ API CHANGES BETWEEN 3.4 AND 3.5
 | 
			
		||||
   PM_TRANS_FLAG_NODEPVERSION, PM_TRANS_EVT_DISKSPACE_START,
 | 
			
		||||
   PM_TRANS_EVT_DISKSPACE_DONE, PM_TRANS_CONV_SELECT_PROVIDER,
 | 
			
		||||
   PM_TRANS_PROGRESS_DISKSPACE_START, PM_TRANS_PROGRESS_INTEGRITY_START
 | 
			
		||||
 | 
			
		||||
API CHANGES BETWEEN 3.5 AND 4.0
 | 
			
		||||
===============================
 | 
			
		||||
 | 
			
		||||
[REMOVED]
 | 
			
		||||
- error codes:
 | 
			
		||||
    PM_ERR_LIBFETCH, PM_ERR_WRITE
 | 
			
		||||
- alpm_option_set_root(), alpm_option_set_dbpath()
 | 
			
		||||
- alpm_list_first()
 | 
			
		||||
- alpm_grp_get_name(), alpm_grp_get_pkgs()
 | 
			
		||||
- alpm_delta_get_from(), alpm_delta_get_to(), alpm_delta_get_filename(),
 | 
			
		||||
    alpm_delta_get_md5sum(), alpm_delta_get_size()
 | 
			
		||||
- alpm_miss_get_target(), alpm_miss_get_dep(), alpm_miss_get_causingpkg()
 | 
			
		||||
- alpm_dep_get_mod(), alpm_dep_get_name(), alpm_dep_get_version()
 | 
			
		||||
- alpm_conflict_get_package1(), alpm_conflict_get_package2(),
 | 
			
		||||
    alpm_conflict_get_reason()
 | 
			
		||||
- alpm_fileconflict_get_target(), alpm_fileconflict_get_type(),
 | 
			
		||||
    alpm_fileconflict_get_file(), alpm_fileconflict_get_ctarget()
 | 
			
		||||
- alpm_db_get_url()
 | 
			
		||||
 | 
			
		||||
[CHANGED]
 | 
			
		||||
- PM_ prefixes for enum values are now ALPM_
 | 
			
		||||
- pm prefixes for structs and enums are now alpm_
 | 
			
		||||
- alpm_initialize now has parameters: char *root, char *dbpath,
 | 
			
		||||
    _alpm_errno_t *err and returns an alpm_handle_t struct.
 | 
			
		||||
- alpm_release now takes an alpm_handle_t *.
 | 
			
		||||
- alpm_db_register_sync() now requires a extra parameter of a alpm_siglevel_t.
 | 
			
		||||
- alpm_pkg_load() now requires an extra parameter of an alpm_siglevel_t
 | 
			
		||||
- alpm_db_setserver() replaced by alpm_db_set_servers(), alpm_db_add_server(),
 | 
			
		||||
    alpm_db_remove_server()
 | 
			
		||||
- alpm_trans_init() no longer takes callbacks, set those using
 | 
			
		||||
    alpm_option_set_*cb() functions
 | 
			
		||||
- many functions now require a first parameter of an alpm_handle_t *:
 | 
			
		||||
  - alpm_option_get_*
 | 
			
		||||
  - alpm_option_set_*
 | 
			
		||||
  - alpm_option_add_*
 | 
			
		||||
  - alpm_option_remove_*
 | 
			
		||||
  - alpm_trans_*
 | 
			
		||||
  - alpm_add_pkg
 | 
			
		||||
  - alpm_checkconflicts
 | 
			
		||||
  - alpm_checkdeps
 | 
			
		||||
  - alpm_db_register_sync
 | 
			
		||||
  - alpm_db_set_pkgreason
 | 
			
		||||
  - alpm_db_unregister_all
 | 
			
		||||
  - alpm_fetch_pkgurl
 | 
			
		||||
  - alpm_find_dbs_satisfier
 | 
			
		||||
  - alpm_logaction
 | 
			
		||||
  - alpm_pkg_load
 | 
			
		||||
  - alpm_release
 | 
			
		||||
  - alpm_remove_pkg
 | 
			
		||||
  - alpm_sync_sysupgrade
 | 
			
		||||
- several structs are no longer opaque
 | 
			
		||||
  - alpm_conflict_t
 | 
			
		||||
  - alpm_delta_t
 | 
			
		||||
  - alpm_depend_t
 | 
			
		||||
  - alpm_depmissing_t
 | 
			
		||||
  - alpm_depmod_t
 | 
			
		||||
  - alpm_fileconflict_t
 | 
			
		||||
  - alpm_group_t
 | 
			
		||||
  - alpm_pkg_reason_t
 | 
			
		||||
 | 
			
		||||
[ADDED]
 | 
			
		||||
- option functions:
 | 
			
		||||
    alpm_{get,set}_eventcb(), alpm_option_{get,set}_convcb(),
 | 
			
		||||
	alpm_option_{get,set}_progresscb()
 | 
			
		||||
- package signing functions:
 | 
			
		||||
    alpm_option_get_default_siglevel(), alpm_option_set_default_siglevel(),
 | 
			
		||||
    alpm_option_get_gpgdir(), alpm_option_set_gpgdir(), alpm_db_get_siglevel(),
 | 
			
		||||
    alpm_siglist_cleanup(), alpm_db_check_pgp_signature(), alpm_pkg_check_pgp_signature(),
 | 
			
		||||
    alpm_pkg_get_origin(), alpm_pkg_get_sha256sum(), alpm_pkg_get_base64_sig()
 | 
			
		||||
- list functions:
 | 
			
		||||
    alpm_list_to_array(), alpm_list_previous()
 | 
			
		||||
- structs:
 | 
			
		||||
    alpm_backup_t, alpm_file_t, alpm_filelist_t
 | 
			
		||||
- enums:
 | 
			
		||||
    alpm_siglevel_t, alpm_sigstatus_t, alpm_sigvalidity_t, alpm_pkgfrom_t
 | 
			
		||||
- error codes:
 | 
			
		||||
    ALPM_ERR_DB_INVALID, ALPM_ERR_DB_INVALID_SIG, ALPM_ERR_GPGME,
 | 
			
		||||
    ALPM_ERR_PKG_INVALID_CHECKSUM, ALPM_ERR_PKG_INVALID_SIG, ALPM_ERR_SIG_INVALID,
 | 
			
		||||
    ALPM_ERR_SIG_MISSING
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										57
									
								
								TODO.aaron
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								TODO.aaron
									
									
									
									
									
								
							@@ -1,57 +0,0 @@
 | 
			
		||||
== This is my custom TODO file ==
 | 
			
		||||
 | 
			
		||||
* transaction object should contain two package list (install and remove)
 | 
			
		||||
  instead of a single list of syncpkgs - this should allow us to get rid of that
 | 
			
		||||
  type.  This also requires seperate functionality to return a list of
 | 
			
		||||
  "replaces" packages to the front end, so the frontend can handle the QUESTION()
 | 
			
		||||
  stuff in that case
 | 
			
		||||
 | 
			
		||||
* libalpm -> front end communication needs a work-up.  Both progress functions
 | 
			
		||||
  can be combined into one callback, IFF we adjust it to accept a prefix string
 | 
			
		||||
  for the progress bars, and format it at the lib side.  Question functions
 | 
			
		||||
  should also do the same - create the string at the library side, and simply
 | 
			
		||||
  call some sort of int yes_no = ask_question("Do foo with bar?");
 | 
			
		||||
 | 
			
		||||
* move logging (alpm_logaction) out of the library.  log files should be
 | 
			
		||||
  written by the app, not the library.  Adding a PM_LOG_* constant that
 | 
			
		||||
  frontends can recognize and send to a file is probably a good idea.
 | 
			
		||||
 | 
			
		||||
* clear up list allocation/deallocation - some lists need to be free'd, some
 | 
			
		||||
  do not and there is no clear indication WHEN this should happen.
 | 
			
		||||
 | 
			
		||||
* remove DB entries (directories) on a read error?
 | 
			
		||||
 | 
			
		||||
* Add a pm_errstr error string, which will allow us to do things like:
 | 
			
		||||
    pm_errno = PM_ERR_LIBARCHIVE;
 | 
			
		||||
    pm_errstr = archive_error_string(archive);
 | 
			
		||||
  or:
 | 
			
		||||
    pm_errno = PM_ERR_LIBDOWNLOAD;
 | 
			
		||||
    pm_errstr = downloadLastErrString;
 | 
			
		||||
  This way we don't break abstraction when returning specific errors in
 | 
			
		||||
  cases like the above.
 | 
			
		||||
 | 
			
		||||
* pacman: A LOT of functions are way too long.  There should be an upper limit of
 | 
			
		||||
  100-200 lines.  _alpm_add_commit is around 600 lines, and is far too complex.
 | 
			
		||||
 | 
			
		||||
* pacman: fixup doxygen documentation for public interface
 | 
			
		||||
 | 
			
		||||
* feature for 3.1: package file hooks *
 | 
			
		||||
  I've been planning on this one for some time.  Here's a simple rundown:
 | 
			
		||||
  in /etc/pacman.d/hooks:
 | 
			
		||||
     Hook /usr/include/* : /usr/bin/ctags -R /usr/include/*.h -f /usr/include/systags
 | 
			
		||||
  This will allow us to make "global hooks" to simplify a lot of repetitive
 | 
			
		||||
  install files (scrollkeeper, depmod, etc).  This also allows us to move
 | 
			
		||||
  ldconfig out of pacman entirely.
 | 
			
		||||
  possible: /etc/pacman.hooks/* files for hooks, so packages can add them too
 | 
			
		||||
 | 
			
		||||
* feature for 3.1: multiple search/match types
 | 
			
		||||
  option: MatchType regex (current way)
 | 
			
		||||
          MatchType fnmatch (use fnmatch to match things like 'pacman -S gnome*')
 | 
			
		||||
          MatchType plain (no matching.  expect plain text).
 | 
			
		||||
 | 
			
		||||
* feature for 3.1: revamp the autotools system.  I'd LOVE to use a manual system
 | 
			
		||||
  like wmii and friends do.  It'd be real nice if we could just do away with
 | 
			
		||||
  autotools altogether.
 | 
			
		||||
 | 
			
		||||
**** BUGS ****
 | 
			
		||||
* Removal of conflicts on -A and -U (INCOMPLETE)
 | 
			
		||||
							
								
								
									
										101
									
								
								TODO.dan
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								TODO.dan
									
									
									
									
									
								
							@@ -1,101 +0,0 @@
 | 
			
		||||
TODO.dan
 | 
			
		||||
========
 | 
			
		||||
 | 
			
		||||
This is my personal TODO list. No guarantees if it is out of date and things no
 | 
			
		||||
longer apply. If you want to help out with any of it, send me an email.
 | 
			
		||||
 | 
			
		||||
Pacman 3.1:
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
Downgrade feature - allow users to see cached packages and downgrade to
 | 
			
		||||
(previous or any?) available options.
 | 
			
		||||
 | 
			
		||||
Installed size and download size in -Si/Qi output should scale with package
 | 
			
		||||
size- KB to MB to GB. We should also get consistancy of K/KB, M/MB, etc.
 | 
			
		||||
 | 
			
		||||
Extreme similarity between some of the sync and add code...we have to be able
 | 
			
		||||
to abstract more away from sync actions and add actions to just 'actions'
 | 
			
		||||
(example: sync,c, add.c, and deptest.c all contain a switch on PM_DEP_MOD_*).
 | 
			
		||||
Merge update, add, and sync code when possible, so we reduce duplication.
 | 
			
		||||
 | 
			
		||||
Review progress/transaction event subsystem. (from TODO)
 | 
			
		||||
 | 
			
		||||
Add Doxygen comments to every function in libalpm including private functions.
 | 
			
		||||
Ensure functions are doing exactly their purpose and nothing more. Find
 | 
			
		||||
functions that perform duplicate behavior and merge them. Combine and refactor
 | 
			
		||||
others. Delete unnecessary functions. Stop keeping everything clustered in
 | 
			
		||||
little add/sync/remove parts, allow transactions to share code.
 | 
			
		||||
 | 
			
		||||
Go through options list. Decide if namings are good, all options are still
 | 
			
		||||
relevant, etc. Ideas for -Re (#6273), changing meaning of -c (has two meanings,
 | 
			
		||||
another FS bug), etc. Remove the -A flag and possibly -D, -T, and -Y (-Y is
 | 
			
		||||
killed now in favor of vercmp binary) if they can be done by other actions.
 | 
			
		||||
Possible switch of -U --> -I (#5571).
 | 
			
		||||
 | 
			
		||||
Review display and logging functions. There seems to be an abundance of them.
 | 
			
		||||
Make it extensible to use color, review what verbose/debug means. Perhaps
 | 
			
		||||
separate logging functionality- Pacman has its normal log, and alpm backend
 | 
			
		||||
keeps a very simple log file - listing only adds (including syncs) and removes.
 | 
			
		||||
This way a consistency list can be kept of what is currently installed and what
 | 
			
		||||
isn't, without all the logging junk from the front end.
 | 
			
		||||
 | 
			
		||||
Profile the code. Find the functions that are being called a lot, and see what
 | 
			
		||||
can be done about it. Find out if all these calls are necessary (e.g. excessive
 | 
			
		||||
alpm_list_count calls), and maybe think about changing data structures to speed
 | 
			
		||||
operations up (e.g. a 'count' field). NOTE: already found two huge issues with
 | 
			
		||||
quick profiling- excessive setlocale calls, and extremely excessive strcmp
 | 
			
		||||
calls.
 | 
			
		||||
 | 
			
		||||
Fix other localized issues- use non-printf when necessary. We may need to use
 | 
			
		||||
some wchar_t output on the progress bar as char/byte counts differ here. Sizes
 | 
			
		||||
of packages (e.g. 10,400.23 MB) should all be localized with correct
 | 
			
		||||
seperators.
 | 
			
		||||
 | 
			
		||||
Rewrite makepkg to use terminal-safe coloring/bolding. tput utility should
 | 
			
		||||
allow us to do this. Make universal message functions for systemwide use,
 | 
			
		||||
including all pacman utilites- abs, pacman-optimize, etc.
 | 
			
		||||
 | 
			
		||||
Bugs/FRs to smash: 6468, 6437, 6430?, 6420, 6404, 6389, 6312?, 6284, 6273?,
 | 
			
		||||
6255?, 6208, 5987, 5885, 5571, 4182, 3492, 2810?, 1769, 1588, 1571
 | 
			
		||||
 | 
			
		||||
Update doxygen comments, they may need some work. Try to document all of the
 | 
			
		||||
private internal functions too- it helps a ton for people just getting a
 | 
			
		||||
start on pacman hacking.
 | 
			
		||||
 | 
			
		||||
Other smaller things:
 | 
			
		||||
---------------------
 | 
			
		||||
 | 
			
		||||
unsigned int vs. unsigned- determine a standard and stick with it
 | 
			
		||||
 | 
			
		||||
FS #4185 - move where message is logged, perhaps?
 | 
			
		||||
 | 
			
		||||
Update copyrights (2007)
 | 
			
		||||
 | 
			
		||||
Update pacman website, and add/finish pacman coding style page
 | 
			
		||||
 | 
			
		||||
Refine makepkg error codes. Each kind of failure could have its own code:
 | 
			
		||||
  --package already built
 | 
			
		||||
  --failed integ checks
 | 
			
		||||
  --failed build
 | 
			
		||||
  --etc.
 | 
			
		||||
 | 
			
		||||
Add utility function to either frontend or backend to convert sizes: e.g. bytes
 | 
			
		||||
to KB, MB, GB.
 | 
			
		||||
 | 
			
		||||
Revamp the downloadprog function a bit. Seems kind of messy.
 | 
			
		||||
 | 
			
		||||
--print-uri option to sync should not require saying yes or no to up to date
 | 
			
		||||
 | 
			
		||||
Build a replacement for this, or at least standardize its use. We shouldn't
 | 
			
		||||
always need to pass handle->root around, it is constant. Something like char*
 | 
			
		||||
buildpath(file).
 | 
			
		||||
	/* build the new entryname relative to handle->root */
 | 
			
		||||
	snprintf(filename, PATH_MAX, "%s%s", handle->root, entryname);
 | 
			
		||||
 | 
			
		||||
Random ideas:
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
Possibly split utilities/extras from pacman package
 | 
			
		||||
 | 
			
		||||
Make .indent.pro file for GNU indent (started, but didn't finish)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										17
									
								
								TRANSLATORS
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								TRANSLATORS
									
									
									
									
									
								
							@@ -1,14 +1,13 @@
 | 
			
		||||
Thanks to all of those who have helped translate pacman, both in the past
 | 
			
		||||
and currently. Here are some of the current translators (past translators
 | 
			
		||||
can be found by looking in the GIT history).
 | 
			
		||||
Thanks to all of those who have helped translate pacman, both in the past and
 | 
			
		||||
currently. Our translations are currently maintained in Transifex; please read
 | 
			
		||||
doc/translation-help.txt for more details.
 | 
			
		||||
 | 
			
		||||
If your language is listed here and you are interested in helping translate,
 | 
			
		||||
contact either the pacman mailing list at pacman-dev@archlinux.org, or one
 | 
			
		||||
of the translators listed above.
 | 
			
		||||
Below is a list of past translators before we switched to Transifex; more can
 | 
			
		||||
be found by looking in the GIT history.
 | 
			
		||||
 | 
			
		||||
If your language is not listed here and you wish it was, let the pacman mailing
 | 
			
		||||
list know you are interested in making a translation. We will be happy to add
 | 
			
		||||
your language to the mix.
 | 
			
		||||
If your language is not already in the various po/ subdirectories and you wish
 | 
			
		||||
it was, set up a team in Transifex for your language and we will be happy to
 | 
			
		||||
add your language to the mix.
 | 
			
		||||
 | 
			
		||||
Catalan (ca):
 | 
			
		||||
	Manuel Tortosa <manutortosa@chakra-project.org>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								autoclean.sh
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								autoclean.sh
									
									
									
									
									
								
							@@ -26,12 +26,7 @@ rm -f test/pacman/*.pyc
 | 
			
		||||
rm -f doc/html/*.html
 | 
			
		||||
rm -f doc/man3/*.3
 | 
			
		||||
 | 
			
		||||
rm -f po/{Makefile.in,Makefile}
 | 
			
		||||
rm -f po/POTFILES
 | 
			
		||||
rm -f po/stamp-po
 | 
			
		||||
rm -f po/*.gmo
 | 
			
		||||
 | 
			
		||||
rm -f lib/libalpm/po/{Makefile.in,Makefile}
 | 
			
		||||
rm -f lib/libalpm/po/POTFILES
 | 
			
		||||
rm -f lib/libalpm/po/stamp-po
 | 
			
		||||
rm -f lib/libalpm/po/*.gmo
 | 
			
		||||
rm -f {lib/libalpm,scripts,src/pacman}/po/{Makefile.in,Makefile}
 | 
			
		||||
rm -f {lib/libalpm,scripts,src/pacman}/po/POTFILES
 | 
			
		||||
rm -f {lib/libalpm,scripts,src/pacman}/po/stamp-po
 | 
			
		||||
rm -f {lib/libalpm,scripts,src/pacman}/po/*.gmo
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										131
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										131
									
								
								configure.ac
									
									
									
									
									
								
							@@ -41,13 +41,13 @@ AC_PREREQ(2.62)
 | 
			
		||||
#   Bugfix releases:
 | 
			
		||||
#     pacman_version_micro += 1
 | 
			
		||||
 | 
			
		||||
m4_define([lib_current], [6])
 | 
			
		||||
m4_define([lib_revision], [2])
 | 
			
		||||
m4_define([lib_current], [7])
 | 
			
		||||
m4_define([lib_revision], [0])
 | 
			
		||||
m4_define([lib_age], [0])
 | 
			
		||||
 | 
			
		||||
m4_define([pacman_version_major], [3])
 | 
			
		||||
m4_define([pacman_version_minor], [5])
 | 
			
		||||
m4_define([pacman_version_micro], [2])
 | 
			
		||||
m4_define([pacman_version_major], [4])
 | 
			
		||||
m4_define([pacman_version_minor], [0])
 | 
			
		||||
m4_define([pacman_version_micro], [0])
 | 
			
		||||
m4_define([pacman_version],
 | 
			
		||||
          [pacman_version_major.pacman_version_minor.pacman_version_micro])
 | 
			
		||||
 | 
			
		||||
@@ -93,10 +93,13 @@ AC_ARG_WITH(openssl,
 | 
			
		||||
	AS_HELP_STRING([--with-openssl], [use OpenSSL crypto implementations instead of internal routines]),
 | 
			
		||||
	[], [with_openssl=check])
 | 
			
		||||
 | 
			
		||||
# Help line for libfetch
 | 
			
		||||
AC_ARG_WITH(fetch,
 | 
			
		||||
	AS_HELP_STRING([--with-fetch], [use libfetch as an internal downloader]),
 | 
			
		||||
	[], [with_fetch=check])
 | 
			
		||||
# Help line for using gpgme
 | 
			
		||||
AC_ARG_WITH(gpgme,
 | 
			
		||||
	AS_HELP_STRING([--with-gpgme], [use GPGME for PGP signature verification]),
 | 
			
		||||
	[], [with_gpgme=check])
 | 
			
		||||
 | 
			
		||||
# Check for useable libcurl
 | 
			
		||||
LIBCURL_CHECK_CONFIG([yes], [7.19.4], [with_libcurl=yes], [with_libcurl=no])
 | 
			
		||||
 | 
			
		||||
# Help line for documentation
 | 
			
		||||
AC_ARG_ENABLE(doc,
 | 
			
		||||
@@ -122,17 +125,22 @@ AC_ARG_ENABLE(git-version,
 | 
			
		||||
# Checks for programs.
 | 
			
		||||
AC_PROG_AWK
 | 
			
		||||
AC_PROG_CC_C99
 | 
			
		||||
AC_PROG_CXX
 | 
			
		||||
AC_PROG_INSTALL
 | 
			
		||||
AC_PROG_LN_S
 | 
			
		||||
AC_PROG_MAKE_SET
 | 
			
		||||
AC_PROG_LIBTOOL
 | 
			
		||||
AC_PROG_RANLIB
 | 
			
		||||
AC_CHECK_PROGS([PYTHON], [python2.7 python2.6 python2.5 python2 python], [false])
 | 
			
		||||
AC_PATH_PROGS([BASH_SHELL], [bash bash4 bash3], [false])
 | 
			
		||||
 | 
			
		||||
# find installed gettext
 | 
			
		||||
AM_GNU_GETTEXT([external])
 | 
			
		||||
AM_GNU_GETTEXT([external], [need-ngettext])
 | 
			
		||||
AM_GNU_GETTEXT_VERSION(0.13.1)
 | 
			
		||||
 | 
			
		||||
AC_CHECK_LIB([m], [fabs], ,
 | 
			
		||||
	AC_MSG_ERROR([libm is needed to compile pacman!]))
 | 
			
		||||
 | 
			
		||||
# Check for libarchive
 | 
			
		||||
AC_CHECK_LIB([archive], [archive_read_data], ,
 | 
			
		||||
	AC_MSG_ERROR([libarchive is needed to compile pacman!]))
 | 
			
		||||
@@ -145,40 +153,38 @@ AS_IF([test "x$with_openssl" != "xno"],
 | 
			
		||||
	[if test "x$with_openssl" != "xcheck"; then
 | 
			
		||||
		AC_MSG_FAILURE([--with-openssl was given, but -lssl was not found])
 | 
			
		||||
	fi],
 | 
			
		||||
	[-lcrypto])],
 | 
			
		||||
	[-lcrypto])
 | 
			
		||||
	with_openssl=$ac_cv_lib_ssl_MD5_Final],
 | 
			
		||||
	AC_MSG_RESULT(no))
 | 
			
		||||
AM_CONDITIONAL([HAVE_LIBSSL], [test "x$ac_cv_lib_ssl_MD5_Final" = "xyes"])
 | 
			
		||||
AM_CONDITIONAL([HAVE_LIBSSL], [test "x$with_openssl" = "xyes"])
 | 
			
		||||
 | 
			
		||||
# Enable or disable usage of libfetch
 | 
			
		||||
AC_MSG_CHECKING(whether to link with libfetch)
 | 
			
		||||
AS_IF([test "x$with_fetch" != "xno"],
 | 
			
		||||
# Check for gpgme
 | 
			
		||||
AC_MSG_CHECKING(whether to link with libgpgme)
 | 
			
		||||
AS_IF([test "x$with_gpgme" != "xno"],
 | 
			
		||||
	[AC_MSG_RESULT(yes)
 | 
			
		||||
	AC_CHECK_LIB([fetch], [fetchParseURL], ,
 | 
			
		||||
	[if test "x$with_fetch" != "xcheck"; then
 | 
			
		||||
		AC_MSG_FAILURE([--with-fetch was given, but -lfetch was not found])
 | 
			
		||||
	AC_CHECK_LIB([gpgme], [gpgme_check_version], ,
 | 
			
		||||
	[if test "x$with_gpgme" != "xcheck"; then
 | 
			
		||||
		AC_MSG_FAILURE([--with-ggpme was given, but -lgpgme was not found])
 | 
			
		||||
	fi],
 | 
			
		||||
	[-lcrypto -ldl])
 | 
			
		||||
	# Check if libfetch supports connnection caching which we use
 | 
			
		||||
	AS_IF([test "x$ac_cv_lib_fetch_fetchParseURL" = "xyes"],
 | 
			
		||||
	[AC_CHECK_DECL(fetchConnectionCacheInit, ,
 | 
			
		||||
		AC_MSG_ERROR([libfetch must be version 2.28 or greater]),
 | 
			
		||||
		[#include <fetch.h>])
 | 
			
		||||
	])
 | 
			
		||||
	],
 | 
			
		||||
	[-lgpgme])
 | 
			
		||||
	with_gpgme=$ac_cv_lib_gpgme_gpgme_check_version],
 | 
			
		||||
	AC_MSG_RESULT(no))
 | 
			
		||||
AM_CONDITIONAL([HAVE_LIBFETCH], [test "x$ac_cv_lib_fetch_fetchParseURL" = "xyes"])
 | 
			
		||||
AM_CONDITIONAL([HAVE_LIBGPGME], [test "x$with_gpgme" = "xyes"])
 | 
			
		||||
 | 
			
		||||
# Checks for header files.
 | 
			
		||||
AC_CHECK_HEADERS([fcntl.h glob.h libintl.h locale.h mntent.h string.h \
 | 
			
		||||
                  sys/ioctl.h sys/mount.h sys/param.h sys/statvfs.h \
 | 
			
		||||
                  sys/time.h sys/types.h sys/ucred.h syslog.h wchar.h])
 | 
			
		||||
AC_CHECK_HEADERS([fcntl.h float.h glob.h libintl.h limits.h locale.h \
 | 
			
		||||
                  mntent.h stddef.h string.h sys/ioctl.h sys/mount.h \
 | 
			
		||||
                  sys/param.h sys/statvfs.h sys/time.h sys/types.h \
 | 
			
		||||
                  sys/ucred.h syslog.h termios.h wchar.h])
 | 
			
		||||
 | 
			
		||||
# Checks for typedefs, structures, and compiler characteristics.
 | 
			
		||||
AC_C_INLINE
 | 
			
		||||
AC_TYPE_INT64_T
 | 
			
		||||
AC_TYPE_MODE_T
 | 
			
		||||
AC_TYPE_OFF_T
 | 
			
		||||
AC_TYPE_PID_T
 | 
			
		||||
AC_TYPE_SIZE_T
 | 
			
		||||
AC_TYPE_SSIZE_T
 | 
			
		||||
AC_STRUCT_TM
 | 
			
		||||
AC_TYPE_UID_T
 | 
			
		||||
AC_STRUCT_DIRENT_D_TYPE
 | 
			
		||||
@@ -188,10 +194,14 @@ PATH_MAX_DEFINED
 | 
			
		||||
AC_FUNC_FORK
 | 
			
		||||
AC_FUNC_GETMNTENT
 | 
			
		||||
AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
 | 
			
		||||
AC_FUNC_MALLOC
 | 
			
		||||
AC_FUNC_MKTIME
 | 
			
		||||
AC_CHECK_FUNCS([geteuid getmntinfo realpath regcomp strcasecmp \
 | 
			
		||||
                strndup strrchr strsep swprintf \
 | 
			
		||||
                wcwidth uname])
 | 
			
		||||
AC_FUNC_STRCOLL
 | 
			
		||||
AC_CHECK_FUNCS([dup2 getcwd geteuid getmntinfo gettimeofday memmove memset \
 | 
			
		||||
                mkdir realpath regcomp rmdir setenv setlocale strcasecmp \
 | 
			
		||||
                strchr strcspn strdup strerror strndup strrchr strsep strstr \
 | 
			
		||||
                strtol swprintf tcflush wcwidth uname])
 | 
			
		||||
 | 
			
		||||
# For the diskspace code
 | 
			
		||||
FS_STATS_TYPE
 | 
			
		||||
AC_CHECK_MEMBERS([struct statvfs.f_flag],,,[[#include <sys/statvfs.h>]])
 | 
			
		||||
@@ -215,7 +225,7 @@ STRIP_STATIC="--strip-debug"
 | 
			
		||||
case "${host_os}" in
 | 
			
		||||
	*bsd*)
 | 
			
		||||
		SIZECMD="stat -L -f %z"
 | 
			
		||||
		SEDINPLACE="sed -i ''"
 | 
			
		||||
		SEDINPLACE="sed -i \"\""
 | 
			
		||||
		;;
 | 
			
		||||
	cygwin*)
 | 
			
		||||
		host_os_cygwin=yes
 | 
			
		||||
@@ -240,48 +250,10 @@ AC_SUBST(STRIP_BINARIES)
 | 
			
		||||
AC_SUBST(STRIP_SHARED)
 | 
			
		||||
AC_SUBST(STRIP_STATIC)
 | 
			
		||||
 | 
			
		||||
# Check for architecture, used in default makepkg.conf
 | 
			
		||||
# (Note single space left after CARCHFLAGS)
 | 
			
		||||
case "${host}" in
 | 
			
		||||
	i686-*)
 | 
			
		||||
		CARCH="i686"
 | 
			
		||||
		CARCHFLAGS="-march=i686 "
 | 
			
		||||
		;;
 | 
			
		||||
	x86_64-*)
 | 
			
		||||
		CARCH="x86_64"
 | 
			
		||||
		CARCHFLAGS="-march=x86-64 "
 | 
			
		||||
		;;
 | 
			
		||||
	ia64-*)
 | 
			
		||||
		CARCH="ia64"
 | 
			
		||||
		CARCHFLAGS="-march=ia64 "
 | 
			
		||||
		;;
 | 
			
		||||
	sparc-*)
 | 
			
		||||
		CARCH="sparc"
 | 
			
		||||
		CARCHFLAGS="-mcpu=v9 "
 | 
			
		||||
		;;
 | 
			
		||||
	ppc-* | powerpc-*)
 | 
			
		||||
		CARCH="ppc"
 | 
			
		||||
		CARCHFLAGS="-mcpu=750 "
 | 
			
		||||
		;;
 | 
			
		||||
	i386-*)
 | 
			
		||||
		CARCH="i386"
 | 
			
		||||
		CARCHFLAGS="-march=i386 "
 | 
			
		||||
		;;
 | 
			
		||||
	arm-*)
 | 
			
		||||
		CARCH="arm"
 | 
			
		||||
		CARCHFLAGS="-march=armv4 "
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		AC_MSG_WARN([[Your architecture is unknown for makepkg.conf, consider adding it to configure.ac]])
 | 
			
		||||
		CARCH="unknown"
 | 
			
		||||
		CARCHFLAGS=""
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
# Now do some things common to all architectures
 | 
			
		||||
# Variables plugged into makepkg.conf
 | 
			
		||||
CARCH="${host%%-*}"
 | 
			
		||||
CHOST="${host}"
 | 
			
		||||
AC_SUBST(CARCH)
 | 
			
		||||
AC_SUBST(CARCHFLAGS)
 | 
			
		||||
AC_SUBST(CHOST)
 | 
			
		||||
 | 
			
		||||
# Check for documentation support and status
 | 
			
		||||
@@ -371,11 +343,12 @@ AC_CONFIG_FILES([
 | 
			
		||||
lib/libalpm/Makefile
 | 
			
		||||
lib/libalpm/po/Makefile.in
 | 
			
		||||
src/pacman/Makefile
 | 
			
		||||
src/pacman/po/Makefile.in
 | 
			
		||||
src/util/Makefile
 | 
			
		||||
scripts/Makefile
 | 
			
		||||
scripts/po/Makefile.in
 | 
			
		||||
doc/Makefile
 | 
			
		||||
etc/Makefile
 | 
			
		||||
po/Makefile.in
 | 
			
		||||
test/pacman/Makefile
 | 
			
		||||
test/pacman/tests/Makefile
 | 
			
		||||
test/util/Makefile
 | 
			
		||||
@@ -395,12 +368,15 @@ ${PACKAGE_NAME}:
 | 
			
		||||
    localstatedir          : $(eval echo ${localstatedir})
 | 
			
		||||
       database dir        : $(eval echo ${localstatedir})/lib/pacman/
 | 
			
		||||
       cache dir           : $(eval echo ${localstatedir})/cache/pacman/pkg/
 | 
			
		||||
 | 
			
		||||
    compiler               : ${CC}
 | 
			
		||||
    preprocessor flags     : ${CPPFLAGS}
 | 
			
		||||
    compiler flags         : ${CFLAGS}
 | 
			
		||||
    defines                : ${DEFS}
 | 
			
		||||
    library flags          : ${LIBS}
 | 
			
		||||
    linker flags           : ${LDFLAGS}
 | 
			
		||||
 | 
			
		||||
    Architecture           : ${CARCH}
 | 
			
		||||
    Architecture flags     : ${CARCHFLAGS}
 | 
			
		||||
    Host Type              : ${CHOST}
 | 
			
		||||
    Filesize command       : ${SIZECMD}
 | 
			
		||||
    In-place sed command   : ${SEDINPLACE}
 | 
			
		||||
@@ -417,6 +393,9 @@ ${PACKAGE_NAME}:
 | 
			
		||||
    build script name      : ${BUILDSCRIPT}
 | 
			
		||||
 | 
			
		||||
  Compilation options:
 | 
			
		||||
    Use libcurl            : ${with_libcurl}
 | 
			
		||||
    Use GPGME              : ${with_gpgme}
 | 
			
		||||
    Use OpenSSL            : ${with_openssl}
 | 
			
		||||
    Run make in doc/ dir   : ${wantdoc} ${asciidoc}
 | 
			
		||||
    Doxygen support        : ${usedoxygen}
 | 
			
		||||
    debug support          : ${debug}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								contrib/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								contrib/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,7 +1,9 @@
 | 
			
		||||
bacman
 | 
			
		||||
bash_completion
 | 
			
		||||
paccache
 | 
			
		||||
pacdiff
 | 
			
		||||
paclist
 | 
			
		||||
paclog-pkglist
 | 
			
		||||
pacscripts
 | 
			
		||||
pacsearch
 | 
			
		||||
wget-xdelta.sh
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,11 @@
 | 
			
		||||
OURSCRIPTS = \
 | 
			
		||||
	bacman \
 | 
			
		||||
	paccache \
 | 
			
		||||
	pacdiff \
 | 
			
		||||
	paclist \
 | 
			
		||||
	paclog-pkglist \
 | 
			
		||||
	pacscripts \
 | 
			
		||||
	pacsearch \
 | 
			
		||||
	wget-xdelta.sh
 | 
			
		||||
	pacsearch
 | 
			
		||||
 | 
			
		||||
OURFILES = \
 | 
			
		||||
	bash_completion \
 | 
			
		||||
@@ -14,12 +15,13 @@ EXTRA_DIST = \
 | 
			
		||||
	PKGBUILD.vim \
 | 
			
		||||
	bacman.in \
 | 
			
		||||
	bash_completion.in \
 | 
			
		||||
	paccache.in \
 | 
			
		||||
	paclog-pkglist.in \
 | 
			
		||||
	pacdiff.in \
 | 
			
		||||
	paclist.in \
 | 
			
		||||
	pacscripts.in \
 | 
			
		||||
	pacsearch.in \
 | 
			
		||||
	vimprojects \
 | 
			
		||||
	wget-xdelta.sh.in \
 | 
			
		||||
	zsh_completion.in \
 | 
			
		||||
	README
 | 
			
		||||
 | 
			
		||||
@@ -29,11 +31,12 @@ MOSTLYCLEANFILES = $(OURSCRIPTS) $(OURFILES) *.tmp
 | 
			
		||||
edit = sed \
 | 
			
		||||
	-e 's|@sysconfdir[@]|$(sysconfdir)|g' \
 | 
			
		||||
	-e 's|@localstatedir[@]|$(localstatedir)|g' \
 | 
			
		||||
	-e 's|@BASH_SHELL[@]|$(BASH_SHELL)|g'
 | 
			
		||||
	-e 's|@SIZECMD[@]|$(SIZECMD)|g' \
 | 
			
		||||
	-e '1s|!/bin/bash|!$(BASH_SHELL)|g'
 | 
			
		||||
 | 
			
		||||
$(OURSCRIPTS): Makefile
 | 
			
		||||
	@echo '    ' GEN $@;
 | 
			
		||||
	@rm -f $@ $@.tmp
 | 
			
		||||
	@$(RM) $@ $@.tmp
 | 
			
		||||
	@$(edit) $(srcdir)/$@.in >$@.tmp
 | 
			
		||||
	@chmod +x $@.tmp
 | 
			
		||||
	@chmod a-w $@.tmp
 | 
			
		||||
@@ -41,7 +44,7 @@ $(OURSCRIPTS): Makefile
 | 
			
		||||
 | 
			
		||||
$(OURFILES): Makefile
 | 
			
		||||
	@echo '    ' GEN $@;
 | 
			
		||||
	@rm -f $@ $@.tmp
 | 
			
		||||
	@$(RM) $@ $@.tmp
 | 
			
		||||
	@$(edit) $(srcdir)/$@.in >$@.tmp
 | 
			
		||||
	@chmod a-w $@.tmp
 | 
			
		||||
	@mv $@.tmp $@
 | 
			
		||||
@@ -50,12 +53,13 @@ all-am: $(OURSCRIPTS) $(OURFILES)
 | 
			
		||||
 | 
			
		||||
bacman: $(srcdir)/bacman.in
 | 
			
		||||
bash_completion: $(srcdir)/bash_completion.in
 | 
			
		||||
paccache: $(srcdir)/paccache.in
 | 
			
		||||
pacdiff: $(srcdir)/pacdiff.in
 | 
			
		||||
paclist: $(srcdir)/paclist.in
 | 
			
		||||
paclog-pkglist: $(srcdir)/paclog-pkglist.in
 | 
			
		||||
pacscripts: $(srcdir)/pacscripts.in
 | 
			
		||||
pacsearch: $(srcdir)/pacsearch.in
 | 
			
		||||
pactree: $(srcdir)/pactree.in
 | 
			
		||||
wget-xdelta.sh: $(srcdir)/wget-xdelta.sh.in
 | 
			
		||||
zsh_completion: $(srcdir)/zsh_completion.in
 | 
			
		||||
 | 
			
		||||
# vim:set ts=2 sw=2 noet:
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ elseif exists("b:current_syntax")
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
let b:main_syntax = "sh"
 | 
			
		||||
let b:is_bash = 1
 | 
			
		||||
runtime! syntax/sh.vim
 | 
			
		||||
 | 
			
		||||
" case on
 | 
			
		||||
@@ -106,6 +107,11 @@ syn keyword pb_k_optdepends optdepends contained
 | 
			
		||||
syn match pbValidOptdepends /\([[:alnum:]]\|+\|-\|_\)*/ contained
 | 
			
		||||
syn region pbOptdependsGroup start=/^optdepends=(/ end=/)/ contains=pb_k_optdepends,pbValidOptdepends,shDoubleQuote,shSingleQuote
 | 
			
		||||
 | 
			
		||||
" checkdepends
 | 
			
		||||
syn keyword pb_k_ckdepends ckdepends contained
 | 
			
		||||
syn match pbValidCkdepends /\([[:alnum:]]\|+\|-\|_\)*/ contained
 | 
			
		||||
syn region pbCkdependsGroup start=/^checkdepends=(/ end=/)/ contains=pb_k_ckdepends,pbValidCkdepends,shDoubleQuote,shSingleQuote
 | 
			
		||||
 | 
			
		||||
" conflicts
 | 
			
		||||
syn keyword pb_k_conflicts conflicts contained
 | 
			
		||||
syn match pbValidConflicts /\([[:alnum:]]\|+\|-\|_\)*/ contained
 | 
			
		||||
@@ -214,6 +220,9 @@ hi def link pb_k_pkgrel pbKeywords
 | 
			
		||||
hi def link pbIllegalPkgdesc Error
 | 
			
		||||
hi def link pb_k_desc pbKeywords
 | 
			
		||||
 | 
			
		||||
hi def link pbIllegalEpoch Error
 | 
			
		||||
hi def link pb_k_epoch pbKeywords
 | 
			
		||||
 | 
			
		||||
hi def link pbIllegalUrl Error
 | 
			
		||||
hi def link pb_k_url pbKeywords
 | 
			
		||||
 | 
			
		||||
@@ -228,6 +237,7 @@ hi def link pbIllegalArch Error
 | 
			
		||||
hi def link pb_k_groups pbKeywords
 | 
			
		||||
hi def link pb_k_makedepends pbKeywords
 | 
			
		||||
hi def link pb_k_optdepends pbKeywords
 | 
			
		||||
hi def link pb_k_ckdepends pbKeywords
 | 
			
		||||
hi def link pb_k_depends pbKeywords
 | 
			
		||||
hi def link pb_k_replaces pbKeywords
 | 
			
		||||
hi def link pb_k_conflicts pbKeywords
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,3 @@ database entries. Useful for reuse, or possible config file extension.
 | 
			
		||||
 | 
			
		||||
vimprojects - a project file for the vim project plugin.
 | 
			
		||||
 | 
			
		||||
wget-xdelta.sh - A download script for pacman which allows binary deltas
 | 
			
		||||
generated with makepkg to be used instead of downloading full binary packages.
 | 
			
		||||
This should cut download sizes for some package upgrades significantly.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!@BASH_SHELL@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
#
 | 
			
		||||
#   bacman: recreate a package from a running system
 | 
			
		||||
#   This script rebuilds an already installed package using metadata
 | 
			
		||||
@@ -20,69 +20,72 @@
 | 
			
		||||
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
shopt -s extglob
 | 
			
		||||
shopt -s nullglob
 | 
			
		||||
 | 
			
		||||
readonly progname="bacman"
 | 
			
		||||
readonly progver="0.2.1"
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# User Friendliness
 | 
			
		||||
#
 | 
			
		||||
function usage(){
 | 
			
		||||
    echo "This program recreates a package using pacman's db and system files"
 | 
			
		||||
    echo "Usage:   $progname <installed package name>"
 | 
			
		||||
    echo "Example: $progname kernel26"
 | 
			
		||||
usage() {
 | 
			
		||||
	echo "This program recreates a package using pacman's db and system files"
 | 
			
		||||
	echo "Usage:   $progname <installed package name>"
 | 
			
		||||
	echo "Example: $progname kernel26"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ $# -ne 1 ] ; then
 | 
			
		||||
    usage
 | 
			
		||||
    exit 1
 | 
			
		||||
if (( $# != 1 )); then
 | 
			
		||||
	usage
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ "$1" = "--help" -o "$1" = "-h" ] ; then
 | 
			
		||||
    usage
 | 
			
		||||
    exit 0
 | 
			
		||||
if [[ $1 == "--help" || $1 == "-h" ]]; then
 | 
			
		||||
	usage
 | 
			
		||||
	exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ "$1" = "--version" -o "$1" = "-v" ]; then
 | 
			
		||||
    echo "$progname version $progver"
 | 
			
		||||
    echo "Copyright (C) 2008 locci"
 | 
			
		||||
    exit 0
 | 
			
		||||
if [[ $1 == "--version" || $1 == "-v" ]]; then
 | 
			
		||||
	echo "$progname version $progver"
 | 
			
		||||
	echo "Copyright (C) 2008 locci"
 | 
			
		||||
	exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Fakeroot support
 | 
			
		||||
#
 | 
			
		||||
if [ $EUID -gt 0 ]; then
 | 
			
		||||
    if [ -f /usr/bin/fakeroot ]; then
 | 
			
		||||
        echo "Entering fakeroot environment"
 | 
			
		||||
        export INFAKEROOT="1"
 | 
			
		||||
        /usr/bin/fakeroot -u -- $0 $1
 | 
			
		||||
        exit $?
 | 
			
		||||
    else
 | 
			
		||||
        echo "WARNING: installing fakeroot or running ${progname} as root is required to"
 | 
			
		||||
        echo "         preserve the ownership permissions of files in some packages"
 | 
			
		||||
        echo ""
 | 
			
		||||
    fi
 | 
			
		||||
if (( EUID )); then
 | 
			
		||||
	if [[ -f /usr/bin/fakeroot ]]; then
 | 
			
		||||
		echo "Entering fakeroot environment"
 | 
			
		||||
		export INFAKEROOT="1"
 | 
			
		||||
		/usr/bin/fakeroot -u -- "$0" "$@"
 | 
			
		||||
		exit $?
 | 
			
		||||
	else
 | 
			
		||||
		echo "WARNING: installing fakeroot or running ${progname} as root is required to"
 | 
			
		||||
		echo "         preserve the ownership permissions of files in some packages"
 | 
			
		||||
		echo ""
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Setting environmental variables
 | 
			
		||||
#
 | 
			
		||||
if [ ! -r @sysconfdir@/pacman.conf ]; then
 | 
			
		||||
    echo "ERROR: unable to read @sysconfdir@/pacman.conf"
 | 
			
		||||
    exit 1
 | 
			
		||||
if [[ ! -r @sysconfdir@/pacman.conf ]]; then
 | 
			
		||||
	echo "ERROR: unable to read @sysconfdir@/pacman.conf"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
eval $(awk '/DBPath/ {print $1$2$3}' @sysconfdir@/pacman.conf)
 | 
			
		||||
pac_db="${DBPath:-@localstatedir@/lib/pacman/}/local"
 | 
			
		||||
 | 
			
		||||
if [ ! -r @sysconfdir@/makepkg.conf ]; then
 | 
			
		||||
    echo "ERROR: unable to read @sysconfdir@/makepkg.conf"
 | 
			
		||||
    exit 1
 | 
			
		||||
if [[ ! -r @sysconfdir@/makepkg.conf ]]; then
 | 
			
		||||
	echo "ERROR: unable to read @sysconfdir@/makepkg.conf"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
source "@sysconfdir@/makepkg.conf"
 | 
			
		||||
if [ -r ~/.makepkg.conf ]; then
 | 
			
		||||
    source ~/.makepkg.conf
 | 
			
		||||
if [[ -r ~/.makepkg.conf ]]; then
 | 
			
		||||
	source ~/.makepkg.conf
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
pkg_arch=${CARCH:-'unknown'}
 | 
			
		||||
@@ -90,27 +93,35 @@ pkg_dest="${PKGDEST:-$PWD}"
 | 
			
		||||
pkg_pkger=${PACKAGER:-'Unknown Packager'}
 | 
			
		||||
 | 
			
		||||
pkg_name="$1"
 | 
			
		||||
pkg_dir="$(echo $pac_db/$pkg_name-[0-9]*)"
 | 
			
		||||
pkg_namver="${pkg_dir##*/}"
 | 
			
		||||
pkg_dir=("$pac_db/$pkg_name"-+([^-])-+([0-9]))
 | 
			
		||||
pkg_namver=("${pkg_dir[@]##*/}")
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Checks everything is in place
 | 
			
		||||
#
 | 
			
		||||
if [ ! -d "$pac_db" ] ; then
 | 
			
		||||
    echo "ERROR: pacman database directory ${pac_db} not found"
 | 
			
		||||
    exit 1
 | 
			
		||||
if [[ ! -d $pac_db ]]; then
 | 
			
		||||
	echo "ERROR: pacman database directory ${pac_db} not found"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ ! -d "$pkg_dir" ] ; then
 | 
			
		||||
    echo "ERROR: package ${pkg_name} not found in pacman database"
 | 
			
		||||
    exit 1
 | 
			
		||||
if (( ${#pkg_dir[@]} != 1 )); then
 | 
			
		||||
	printf "ERROR: %d entries for package %s found in pacman database\n" \
 | 
			
		||||
		${#pkg_dir[@]} "${pkg_name}"
 | 
			
		||||
	printf "%s\n" "${pkg_dir[@]}"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ ! -d $pkg_dir ]]; then
 | 
			
		||||
	printf "ERROR: package %s is found in pacman database,\n" "${pkg_name}"
 | 
			
		||||
	printf "       but \`%s' is not a directory\n" "${pkg_dir}"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Begin
 | 
			
		||||
#
 | 
			
		||||
echo Package: ${pkg_namver}
 | 
			
		||||
work_dir=$(mktemp -d -p /tmp)
 | 
			
		||||
echo "Package: ${pkg_namver}"
 | 
			
		||||
work_dir=$(mktemp -d --tmpdir bacman.XXXXXXXXXX)
 | 
			
		||||
cd "$work_dir" || exit 1
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
@@ -120,136 +131,135 @@ echo "Copying package files..."
 | 
			
		||||
 | 
			
		||||
cat "$pkg_dir"/files |
 | 
			
		||||
while read i; do
 | 
			
		||||
    if [ -z "$i" ] ; then
 | 
			
		||||
        continue
 | 
			
		||||
    fi
 | 
			
		||||
	if [[ -z $i ]]; then
 | 
			
		||||
		continue
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
    if [[ "$i" =~ %[A-Z]*% ]] ; then
 | 
			
		||||
        current=$i
 | 
			
		||||
        continue
 | 
			
		||||
    fi
 | 
			
		||||
	if [[ $i == %+([A-Z])% ]]; then
 | 
			
		||||
		current=$i
 | 
			
		||||
		continue
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
    case $current in
 | 
			
		||||
        %FILES%)
 | 
			
		||||
            ret=0
 | 
			
		||||
            if [ -e "/$i" ]; then
 | 
			
		||||
                bsdtar -cnf - "/$i" 2> /dev/null | bsdtar -xpf -
 | 
			
		||||
	case "$current" in
 | 
			
		||||
		%FILES%)
 | 
			
		||||
			ret=0
 | 
			
		||||
			if [[ -e /$i ]]; then
 | 
			
		||||
				bsdtar -cnf - "/$i" 2> /dev/null | bsdtar -xpf -
 | 
			
		||||
 | 
			
		||||
                # Workaround to bsdtar not reporting a missing file as an error
 | 
			
		||||
                if [ ! -e "$work_dir/$i" -a ! -L "$work_dir/$i" ]; then
 | 
			
		||||
                    echo ""
 | 
			
		||||
                    echo "ERROR: unable to add /$i to the package"
 | 
			
		||||
                    echo "       If your user does not have permssion to read this file then"
 | 
			
		||||
                    echo "       you will need to run $progname as root"
 | 
			
		||||
                    rm -rf "$work_dir"
 | 
			
		||||
                    exit 1
 | 
			
		||||
                fi
 | 
			
		||||
            else
 | 
			
		||||
                echo ""
 | 
			
		||||
                echo "WARNING: package file /$i is missing"
 | 
			
		||||
                echo ""
 | 
			
		||||
            fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        ;;
 | 
			
		||||
    esac
 | 
			
		||||
				# Workaround to bsdtar not reporting a missing file as an error
 | 
			
		||||
				if ! [[ -e $work_dir/$i || -L $work_dir/$i ]]; then
 | 
			
		||||
					echo ""
 | 
			
		||||
					echo "ERROR: unable to add /$i to the package"
 | 
			
		||||
					echo "       If your user does not have permssion to read this file then"
 | 
			
		||||
					echo "       you will need to run $progname as root"
 | 
			
		||||
					rm -rf "$work_dir"
 | 
			
		||||
					exit 1
 | 
			
		||||
				fi
 | 
			
		||||
			else
 | 
			
		||||
				echo ""
 | 
			
		||||
				echo "WARNING: package file /$i is missing"
 | 
			
		||||
				echo ""
 | 
			
		||||
			fi
 | 
			
		||||
			;;
 | 
			
		||||
	esac
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
ret=$?
 | 
			
		||||
if [ $ret -ne 0 ]; then
 | 
			
		||||
    rm -rf "$work_dir"
 | 
			
		||||
    exit 1
 | 
			
		||||
if (( ret )); then
 | 
			
		||||
	rm -rf "$work_dir"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
pkg_size=$(du -sk | awk '{print $1 * 1024}')
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# .PKGINFO stuff
 | 
			
		||||
# TODO adopt makepkg's write_pkginfo() into this or scripts/library
 | 
			
		||||
#
 | 
			
		||||
echo Generating .PKGINFO metadata...
 | 
			
		||||
echo "# Generated by $progname $progver"    > .PKGINFO
 | 
			
		||||
if [ "$INFAKEROOT" = "1" ]; then
 | 
			
		||||
    echo "# Using $(fakeroot -v)"    >> .PKGINFO
 | 
			
		||||
if [[ $INFAKEROOT == "1" ]]; then
 | 
			
		||||
	echo "# Using $(fakeroot -v)"    >> .PKGINFO
 | 
			
		||||
fi
 | 
			
		||||
echo "# $(LC_ALL=C date)"            >> .PKGINFO
 | 
			
		||||
echo "#"                    >> .PKGINFO
 | 
			
		||||
 | 
			
		||||
cat "$pkg_dir"/{desc,files} |
 | 
			
		||||
while read i; do
 | 
			
		||||
    if [[ -z "$i" ]]; then
 | 
			
		||||
        continue;
 | 
			
		||||
    fi
 | 
			
		||||
	if [[ -z $i ]]; then
 | 
			
		||||
		continue;
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
    if [[ "$i" =~ %[A-Z]*% ]] ; then
 | 
			
		||||
        current=$i
 | 
			
		||||
        continue
 | 
			
		||||
    fi
 | 
			
		||||
	if [[ $i == %+([A-Z])% ]]; then
 | 
			
		||||
		current=$i
 | 
			
		||||
		continue
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
    case "$current" in
 | 
			
		||||
        # desc
 | 
			
		||||
        %NAME%)
 | 
			
		||||
            echo "pkgname = $i"    >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %VERSION%)
 | 
			
		||||
            echo "pkgver = $i"    >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %DESC%)
 | 
			
		||||
            echo "pkgdesc = $i"    >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %URL%)
 | 
			
		||||
            echo "url = $i"    >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %LICENSE%)
 | 
			
		||||
            echo "license = $i"    >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %ARCH%)
 | 
			
		||||
            echo "arch = $i"    >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %BUILDDATE%)
 | 
			
		||||
            echo "builddate = $(date -u "+%s")"    >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %PACKAGER%)
 | 
			
		||||
            echo "packager = $pkg_pkger"        >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %SIZE%)
 | 
			
		||||
            echo "size = $pkg_size"        >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %GROUPS%)
 | 
			
		||||
            echo "group = $i"    >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %REPLACES%)
 | 
			
		||||
            echo "replaces = $i"    >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %DEPENDS%)
 | 
			
		||||
            echo "depend = $i"   >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %OPTDEPENDS%)
 | 
			
		||||
            echo "optdepend = $i" >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %CONFLICTS%)
 | 
			
		||||
            echo "conflict = $i" >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
        %PROVIDES%)
 | 
			
		||||
            echo "provides = $i"  >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
	case "$current" in
 | 
			
		||||
		# desc
 | 
			
		||||
		%NAME%)
 | 
			
		||||
			echo "pkgname = $i"    >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%VERSION%)
 | 
			
		||||
			echo "pkgver = $i"    >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%DESC%)
 | 
			
		||||
			echo "pkgdesc = $i"    >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%URL%)
 | 
			
		||||
			echo "url = $i"    >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%LICENSE%)
 | 
			
		||||
			echo "license = $i"    >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%ARCH%)
 | 
			
		||||
			echo "arch = $i"    >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%BUILDDATE%)
 | 
			
		||||
			echo "builddate = $(date -u "+%s")"    >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%PACKAGER%)
 | 
			
		||||
			echo "packager = $pkg_pkger"        >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%SIZE%)
 | 
			
		||||
			echo "size = $pkg_size"        >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%GROUPS%)
 | 
			
		||||
			echo "group = $i"    >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%REPLACES%)
 | 
			
		||||
			echo "replaces = $i"    >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%DEPENDS%)
 | 
			
		||||
			echo "depend = $i"   >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%OPTDEPENDS%)
 | 
			
		||||
			echo "optdepend = $i" >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%CONFLICTS%)
 | 
			
		||||
			echo "conflict = $i" >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
		%PROVIDES%)
 | 
			
		||||
			echo "provides = $i"  >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
 | 
			
		||||
        # files
 | 
			
		||||
        %BACKUP%)
 | 
			
		||||
            # strip the md5sum after the tab
 | 
			
		||||
            echo "backup = ${i%%$'\t'*}"   >> .PKGINFO
 | 
			
		||||
        ;;
 | 
			
		||||
    esac
 | 
			
		||||
		# files
 | 
			
		||||
		%BACKUP%)
 | 
			
		||||
			# strip the md5sum after the tab
 | 
			
		||||
			echo "backup = ${i%%$'\t'*}"   >> .PKGINFO
 | 
			
		||||
			;;
 | 
			
		||||
	esac
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
comp_files=".PKGINFO"
 | 
			
		||||
 | 
			
		||||
if [ -f "$pkg_dir/install" ] ; then
 | 
			
		||||
    cp "$pkg_dir/install" "$work_dir/.INSTALL"
 | 
			
		||||
    comp_files+=" .INSTALL"
 | 
			
		||||
if [[ -f $pkg_dir/install ]]; then
 | 
			
		||||
	cp "$pkg_dir/install" "$work_dir/.INSTALL"
 | 
			
		||||
	comp_files+=" .INSTALL"
 | 
			
		||||
fi
 | 
			
		||||
if  [ -f $pkg_dir/changelog ] ; then
 | 
			
		||||
    cp "$pkg_dir/changelog" "$work_dir/.CHANGELOG"
 | 
			
		||||
    comp_files+=" .CHANGELOG"
 | 
			
		||||
if [[ -f $pkg_dir/changelog ]]; then
 | 
			
		||||
	cp "$pkg_dir/changelog" "$work_dir/.CHANGELOG"
 | 
			
		||||
	comp_files+=" .CHANGELOG"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
@@ -263,36 +273,27 @@ chmod 644 "$work_dir"/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null
 | 
			
		||||
#
 | 
			
		||||
echo "Generating the package..."
 | 
			
		||||
 | 
			
		||||
case "$PKGEXT" in
 | 
			
		||||
	*tar.gz)  EXT=${PKGEXT%.gz} ;;
 | 
			
		||||
	*tar.bz2) EXT=${PKGEXT%.bz2} ;;
 | 
			
		||||
	*tar.xz)  EXT=${PKGEXT%.xz} ;;
 | 
			
		||||
	*tar)     EXT=${PKGEXT} ;;
 | 
			
		||||
	*) echo "WARNING: '%s' is not a valid archive extension." \
 | 
			
		||||
	"$PKGEXT" ; EXT=$PKGEXT ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
pkg_file="$pkg_dest/$pkg_namver-$pkg_arch${PKGEXT}"
 | 
			
		||||
ret=0
 | 
			
		||||
 | 
			
		||||
# when fileglobbing, we want * in an empty directory to expand to
 | 
			
		||||
# the null string rather than itself
 | 
			
		||||
shopt -s nullglob
 | 
			
		||||
# TODO: Maybe this can be set globally for robustness
 | 
			
		||||
shopt -s -o pipefail
 | 
			
		||||
bsdtar -cf - $comp_files * |
 | 
			
		||||
case "$PKGEXT" in
 | 
			
		||||
    *tar.gz)  gzip -c -f -n ;;
 | 
			
		||||
    *tar.bz2) bzip2 -c -f ;;
 | 
			
		||||
    *tar.xz)  xz -c -z - ;;
 | 
			
		||||
    *tar)     cat ;;
 | 
			
		||||
esac > ${pkg_file} || ret=$?
 | 
			
		||||
	*tar.gz)  gzip -c -f -n ;;
 | 
			
		||||
	*tar.bz2) bzip2 -c -f ;;
 | 
			
		||||
	*tar.xz)  xz -c -z - ;;
 | 
			
		||||
	*tar.Z)   compress -c -f ;;
 | 
			
		||||
	*tar)     cat ;;
 | 
			
		||||
	*) echo "WARNING: '%s' is not a valid archive extension." \
 | 
			
		||||
	"$PKGEXT" >&2; cat ;;
 | 
			
		||||
esac > "${pkg_file}"; ret=$?
 | 
			
		||||
 | 
			
		||||
if [ $ret -ne 0 ]; then
 | 
			
		||||
    echo "ERROR: unable to write package to $pkg_dest"
 | 
			
		||||
    echo "       Maybe the disk is full or you do not have write access"
 | 
			
		||||
    rm -rf "$work_dir"
 | 
			
		||||
    exit 1
 | 
			
		||||
if (( ret )); then
 | 
			
		||||
	echo "ERROR: unable to write package to $pkg_dest"
 | 
			
		||||
	echo "       Maybe the disk is full or you do not have write access"
 | 
			
		||||
	rm -rf "$work_dir"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
rm -rf "$work_dir"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,15 +27,30 @@ _arch_incomp() {
 | 
			
		||||
  local r="\s-(-${1#* }\s|\w*${1% *})"; [[ $COMP_LINE =~ $r ]]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_pacman_key() {
 | 
			
		||||
  local cur opts prev
 | 
			
		||||
  COMPREPLY=()
 | 
			
		||||
  _get_comp_words_by_ref cur prev
 | 
			
		||||
  if [[ $cur = -* &&
 | 
			
		||||
      $prev != -@(a|-add|c|-config|g|-gpgdir|h|-help|import?(-trustdb)) ]]; then
 | 
			
		||||
    opts=('add delete export finger help list-keys recv-keys updatedb verify version
 | 
			
		||||
           config edit-key gpgdir import import-trustdb init keyserver list-sigs
 | 
			
		||||
           lsign-key populate refresh-keys'
 | 
			
		||||
          'a d e f h l r u v V')
 | 
			
		||||
    _arch_ptr2comp opts
 | 
			
		||||
  fi
 | 
			
		||||
  true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_makepkg() {
 | 
			
		||||
  local cur opts prev
 | 
			
		||||
  COMPREPLY=()
 | 
			
		||||
  _get_comp_words_by_ref cur prev
 | 
			
		||||
  if [[ $cur = -* && ! $prev =~ ^-(-(cleancache|config|help)$|\w*[Chp]) ]]; then
 | 
			
		||||
    opts=('allsource asroot clean cleancache config force geninteg help holdver
 | 
			
		||||
           ignorearch install log nobuild nocolor noconfirm nodeps noextract
 | 
			
		||||
           noprogressbar pkg repackage rmdeps skipinteg source syncdeps'
 | 
			
		||||
          'A C L R c d e f g h i m o p r s')
 | 
			
		||||
  if [[ $cur = -* && ! $prev =~ ^-(-(config|help)$|\w*[Chp]) ]]; then
 | 
			
		||||
    opts=('allsource asroot check clean config force geninteg help holdver ignorearch
 | 
			
		||||
           install log nobuild nocheck nocolor noconfirm nodeps noextract noprogressbar
 | 
			
		||||
           nosign pkg repackage rmdeps sign skipinteg source syncdeps'
 | 
			
		||||
          'A L R S c d e f g h i m o p r s')
 | 
			
		||||
    _arch_ptr2comp opts
 | 
			
		||||
  fi
 | 
			
		||||
  true
 | 
			
		||||
@@ -58,11 +73,11 @@ _pacman() {
 | 
			
		||||
  database=('asdeps asexplicit')
 | 
			
		||||
  query=('changelog check deps explicit file foreign groups info list owns
 | 
			
		||||
          search unrequired upgrades' 'c e g i k l m o p s t u')
 | 
			
		||||
  remove=('cascade dbonly nodeps nosave print recursive unneeded' 'c k n p s u')
 | 
			
		||||
  sync=('asdeps asexplicit clean downloadonly force groups ignore ignoregroup
 | 
			
		||||
         info list needed nodeps print refresh search sysupgrade'
 | 
			
		||||
  remove=('cascade dbonly nodeps nosave print recursive unneeded' 'c n p s u')
 | 
			
		||||
  sync=('asdeps asexplicit clean dbonly downloadonly force groups ignore ignoregroup
 | 
			
		||||
         info list needed nodeps print refresh recursive search sysupgrade'
 | 
			
		||||
        'c f g i l p s u w y')
 | 
			
		||||
  upgrade=('asdeps asexplicit force nodeps print' 'f p')
 | 
			
		||||
  upgrade=('asdeps asexplicit force needed nodeps print recursive' 'f p')
 | 
			
		||||
  common=('arch cachedir config dbpath debug help logfile noconfirm
 | 
			
		||||
           noprogressbar noscriptlet quiet root verbose' 'b d h q r v')
 | 
			
		||||
  core=('database help query remove sync upgrade version' 'D Q R S U V h')
 | 
			
		||||
@@ -109,5 +124,6 @@ else
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
complete -F _makepkg -o default makepkg
 | 
			
		||||
complete -F _pacman_key -o default pacman-key
 | 
			
		||||
 | 
			
		||||
# ex:et ts=2 sw=2 ft=sh
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										300
									
								
								contrib/paccache.in
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										300
									
								
								contrib/paccache.in
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,300 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
#
 | 
			
		||||
# pacache - flexible pacman cache cleaning
 | 
			
		||||
#
 | 
			
		||||
# Copyright (C) 2011 Dave Reisner <dreisner@archlinux.org>
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or
 | 
			
		||||
# modify it under the terms of the GNU General Public License
 | 
			
		||||
# as published by the Free Software Foundation; either version 2
 | 
			
		||||
# of the License, or (at your option) any later version.
 | 
			
		||||
#
 | 
			
		||||
# This program is distributed in the hope that it will be useful,
 | 
			
		||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
# GNU General Public License for more details.
 | 
			
		||||
#
 | 
			
		||||
# You should have received a copy of the GNU General Public License
 | 
			
		||||
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
shopt -s extglob
 | 
			
		||||
 | 
			
		||||
declare -a candidates=() cmdopts=() whitelist=() blacklist=()
 | 
			
		||||
declare -i delete=0 dryrun=0 filecount=0 move=0 needsroot=0 totalsaved=0 verbose=0
 | 
			
		||||
declare    cachedir=@localstatedir@/cache/pacman/pkg delim=$'\n' keep=3 movedir= scanarch=
 | 
			
		||||
 | 
			
		||||
msg() {
 | 
			
		||||
	local mesg=$1; shift
 | 
			
		||||
	printf "==> $mesg\n" "$@"
 | 
			
		||||
} >&2
 | 
			
		||||
 | 
			
		||||
error() {
 | 
			
		||||
	local mesg=$1; shift
 | 
			
		||||
	printf "==> ERROR: $mesg\n" "$@"
 | 
			
		||||
} >&2
 | 
			
		||||
 | 
			
		||||
die() {
 | 
			
		||||
	error "$@"
 | 
			
		||||
	exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# reads a list of files on stdin and prints out deletion candidates
 | 
			
		||||
pkgfilter() {
 | 
			
		||||
	# there's whitelist and blacklist parameters passed to this
 | 
			
		||||
	# script after the block of awk.
 | 
			
		||||
 | 
			
		||||
	awk -v keep="$1" -v scanarch="$2" '
 | 
			
		||||
	function parse_filename(filename,     parts, count, i, pkgname, arch) {
 | 
			
		||||
 | 
			
		||||
		count = split(filename, parts, "-")
 | 
			
		||||
 | 
			
		||||
		i = 1
 | 
			
		||||
		pkgname = parts[i++]
 | 
			
		||||
		while (i <= count - 3) {
 | 
			
		||||
			pkgname = pkgname "-" parts[i++]
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		arch = substr(parts[count], 1, index(parts[count], ".") - 1)
 | 
			
		||||
 | 
			
		||||
		# filter on whitelist or blacklist
 | 
			
		||||
		if (wlen && !whitelist[pkgname]) return
 | 
			
		||||
		if (blen && blacklist[pkgname]) return
 | 
			
		||||
 | 
			
		||||
		if ("" == packages[pkgname,arch]) {
 | 
			
		||||
			packages[pkgname,arch] = filename
 | 
			
		||||
		} else {
 | 
			
		||||
			packages[pkgname,arch] = packages[pkgname,arch] SUBSEP filename
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	BEGIN {
 | 
			
		||||
		# create whitelist
 | 
			
		||||
		wlen = ARGV[1]; delete ARGV[1]
 | 
			
		||||
		for (i = 2; i < 2 + wlen; i++) {
 | 
			
		||||
			whitelist[ARGV[i]] = 1
 | 
			
		||||
			delete ARGV[i]
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		# create blacklist
 | 
			
		||||
		blen = ARGV[i]; delete ARGV[i]
 | 
			
		||||
		while (i++ < ARGC) {
 | 
			
		||||
			blacklist[ARGV[i]] = 1
 | 
			
		||||
			delete ARGV[i]
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		# read package filenames
 | 
			
		||||
		while (getline < "/dev/stdin") {
 | 
			
		||||
			parse_filename($0)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for (pkglist in packages) {
 | 
			
		||||
			# idx[1,2] = idx[pkgname,arch]
 | 
			
		||||
			split(pkglist, idx, SUBSEP)
 | 
			
		||||
 | 
			
		||||
			# enforce architecture match if specified
 | 
			
		||||
			if (!scanarch || scanarch == idx[2]) {
 | 
			
		||||
				count = split(packages[idx[1], idx[2]], pkgs, SUBSEP)
 | 
			
		||||
				for(i = 1; i <= count - keep; i++) {
 | 
			
		||||
					print pkgs[i]
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}' "${@:3}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_to_human() {
 | 
			
		||||
	awk -v size="$1" '
 | 
			
		||||
	BEGIN {
 | 
			
		||||
		suffix[1] = "B"
 | 
			
		||||
		suffix[2] = "KiB"
 | 
			
		||||
		suffix[3] = "MiB"
 | 
			
		||||
		suffix[4] = "GiB"
 | 
			
		||||
		suffix[5] = "TiB"
 | 
			
		||||
		count = 1
 | 
			
		||||
 | 
			
		||||
		while (size > 1024) {
 | 
			
		||||
			size /= 1024
 | 
			
		||||
			count++
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		sizestr = sprintf("%.2f", size)
 | 
			
		||||
		sub(/\.?0+$/, "", sizestr)
 | 
			
		||||
		printf("%s %s", sizestr, suffix[count])
 | 
			
		||||
	}'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
runcmd() {
 | 
			
		||||
	if (( needsroot )); then
 | 
			
		||||
		msg "Privilege escalation required"
 | 
			
		||||
		if sudo -v &>/dev/null && sudo -l &>/dev/null; then
 | 
			
		||||
			sudo "$@"
 | 
			
		||||
		else
 | 
			
		||||
			printf '%s ' 'root'
 | 
			
		||||
			su -c "$(printf '%q ' "$@")"
 | 
			
		||||
		fi
 | 
			
		||||
	else
 | 
			
		||||
		"$@"
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
summarize() {
 | 
			
		||||
	local -i filecount=$1; shift
 | 
			
		||||
	local seenarch= seen= arch= name=
 | 
			
		||||
	local -r pkg_re='(.+)-[^-]+-[0-9]+-([^.]+)\.pkg.*'
 | 
			
		||||
 | 
			
		||||
	if (( delete )); then
 | 
			
		||||
		printf -v output 'finished: %d packages removed' "$filecount"
 | 
			
		||||
	elif (( move )); then
 | 
			
		||||
		printf -v output "finished: %d packages moved to \`%s'" "$filecount" "$movedir"
 | 
			
		||||
	elif (( dryrun )); then
 | 
			
		||||
		if (( verbose )); then
 | 
			
		||||
			msg "Candidate packages:"
 | 
			
		||||
			while read -r pkg; do
 | 
			
		||||
				if (( verbose >= 3 )); then
 | 
			
		||||
					[[ $pkg =~ $pkg_re ]] && name=${BASH_REMATCH[1]} arch=${BASH_REMATCH[2]}
 | 
			
		||||
					if [[ -z $seen || $seenarch != "$arch" || $seen != "$name" ]]; then
 | 
			
		||||
						printf '%s (%s):\n' "$name" "$arch"
 | 
			
		||||
					fi
 | 
			
		||||
					printf '  %s\n' "$pkg"
 | 
			
		||||
				elif (( verbose >= 2 )); then
 | 
			
		||||
					printf "$PWD/%s$delim" "$pkg"
 | 
			
		||||
				else
 | 
			
		||||
					printf "%s$delim" "$pkg"
 | 
			
		||||
				fi
 | 
			
		||||
			done < <(printf '%s\n' "$@" | pacsort)
 | 
			
		||||
		fi
 | 
			
		||||
		printf -v output 'finished dry run: %d candidates' "$filecount"
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	printf '\n' >&2
 | 
			
		||||
	msg "$output (diskspace saved: %s)" "$(size_to_human "$totalsaved")"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
usage() {
 | 
			
		||||
	cat <<EOF
 | 
			
		||||
usage: ${0##*/} <operation> [options] [targets...]
 | 
			
		||||
 | 
			
		||||
${0##*/} is a flexible pacman cache cleaning utility, which has numerous
 | 
			
		||||
options to help control how much, and what, is deleted from any directory
 | 
			
		||||
containing pacman package tarballs.
 | 
			
		||||
 | 
			
		||||
  Operations:
 | 
			
		||||
    -d               perform a dry run, only finding candidate packages.
 | 
			
		||||
    -m  <movedir>    move candidate packages to 'movedir'.
 | 
			
		||||
    -r               remove candidate packages.
 | 
			
		||||
 | 
			
		||||
  Options:
 | 
			
		||||
    -a  <arch>       scan for 'arch' (default: all architectures).
 | 
			
		||||
    -c  <cachedir>   scan 'cachedir' for packages (default: @localstatedir@/cache/pacman/pkg).
 | 
			
		||||
    -f               apply force to mv(1) and rm(1) operations.
 | 
			
		||||
    -h               display this help message.
 | 
			
		||||
    -i  <pkgs>       ignore 'pkgs', which is a comma separated. Alternatively,
 | 
			
		||||
                     specify '-' to read package names from stdin, newline delimited.
 | 
			
		||||
    -k  <num>        keep 'num' of each package in 'cachedir' (default: 3).
 | 
			
		||||
    -u               target uninstalled packages.
 | 
			
		||||
    -v               increase verbosity. specify up to 3 times.
 | 
			
		||||
    -z               use null delimiters for candidate names (only with -v and -vv)
 | 
			
		||||
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if (( ! UID )); then
 | 
			
		||||
	error "Do not run this script as root. You will be prompted for privilege escalation."
 | 
			
		||||
	exit 42
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
while getopts ':a:c:dfhi:k:m:rsuvz' opt; do
 | 
			
		||||
	case $opt in
 | 
			
		||||
		a) scanarch=$OPTARG ;;
 | 
			
		||||
		c) cachedir=$OPTARG ;;
 | 
			
		||||
		d) dryrun=1 ;;
 | 
			
		||||
		f) cmdopts=(-f) ;;
 | 
			
		||||
		h) usage
 | 
			
		||||
			exit 0 ;;
 | 
			
		||||
		i) if [[ $OPTARG = '-' ]]; then
 | 
			
		||||
				 [[ ! -t 0 ]] && IFS=$'\n' read -r -d '' -a ign
 | 
			
		||||
			 else
 | 
			
		||||
				 IFS=',' read -r -a ign <<< "$OPTARG"
 | 
			
		||||
			 fi
 | 
			
		||||
			 blacklist+=("${ign[@]}")
 | 
			
		||||
			unset i ign ;;
 | 
			
		||||
		k) keep=$OPTARG
 | 
			
		||||
			if [[ -z $keep || -n ${keep//[0-9]/} ]]; then
 | 
			
		||||
				die 'argument to option -k must be a non-negative integer'
 | 
			
		||||
			else
 | 
			
		||||
				keep=$(( 10#$keep ))
 | 
			
		||||
			fi ;;
 | 
			
		||||
		m) move=1 movedir=$OPTARG ;;
 | 
			
		||||
		r) delete=1 ;;
 | 
			
		||||
		u) IFS=$'\n' read -r -d '' -a ign < <(pacman -Qq)
 | 
			
		||||
			 blacklist+=("${ign[@]}")
 | 
			
		||||
			 unset ign ;;
 | 
			
		||||
		v) (( ++verbose )) ;;
 | 
			
		||||
		z) delim='\0' ;;
 | 
			
		||||
		:) die "option '--%s' requires an argument" "$OPTARG" ;;
 | 
			
		||||
		?) die "invalid option -- '%s'" "$OPTARG" ;;
 | 
			
		||||
	esac
 | 
			
		||||
done
 | 
			
		||||
shift $(( OPTIND - 1 ))
 | 
			
		||||
 | 
			
		||||
# remaining args are a whitelist
 | 
			
		||||
whitelist=("$@")
 | 
			
		||||
 | 
			
		||||
# sanity checks
 | 
			
		||||
case $(( dryrun+delete+move )) in
 | 
			
		||||
	0) die "no operation specified (use -h for help)" ;;
 | 
			
		||||
	[^1]) die "only one operation may be used at a time" ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
[[ -d $cachedir ]] ||
 | 
			
		||||
	die "cachedir \`%s' does not exist or is not a directory" "$cachedir"
 | 
			
		||||
 | 
			
		||||
[[ $movedir && ! -d $movedir ]] &&
 | 
			
		||||
	die "move-to directory \`%s' does not exist or is not a directory" "$movedir"
 | 
			
		||||
 | 
			
		||||
if (( move || delete )); then
 | 
			
		||||
	# make it an absolute path since we're about to chdir
 | 
			
		||||
	[[ ${movedir:0:1} != '/' ]] && movedir=$PWD/$movedir
 | 
			
		||||
	[[ ! -w $cachedir || ( $movedir && ! -w $movedir ) ]] && needsroot=1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# unlikely that this will fail, but better make sure
 | 
			
		||||
cd "$cachedir" || die "failed to chdir to \`%s'" "$cachedir"
 | 
			
		||||
 | 
			
		||||
# note that these results are returned in an arbitrary order from awk, but
 | 
			
		||||
# they'll be resorted (in summarize) iff we have a verbosity level set.
 | 
			
		||||
IFS=$'\n' read -r -d '' -a candidates < \
 | 
			
		||||
	<(printf '%s\n' *.pkg.tar?(.+([^.])) | pacsort |
 | 
			
		||||
		pkgfilter "$keep" "$scanarch" \
 | 
			
		||||
			"${#whitelist[*]}" "${whitelist[@]}" \
 | 
			
		||||
			"${#blacklist[*]}" "${blacklist[@]}")
 | 
			
		||||
 | 
			
		||||
if (( ! ${#candidates[*]} )); then
 | 
			
		||||
	msg 'no candidate packages found for pruning'
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# grab this prior to signature scavenging
 | 
			
		||||
pkgcount=${#candidates[*]}
 | 
			
		||||
 | 
			
		||||
# copy the list, merging in any found sigs
 | 
			
		||||
for cand in "${candidates[@]}"; do
 | 
			
		||||
  candtemp+=("$cand")
 | 
			
		||||
  [[ -f $cand.sig ]] && candtemp+=("$cand.sig")
 | 
			
		||||
done
 | 
			
		||||
candidates=("${candtemp[@]}")
 | 
			
		||||
unset candtemp
 | 
			
		||||
 | 
			
		||||
# do this before we destroy anything
 | 
			
		||||
totalsaved=$(@SIZECMD@ "${candidates[@]}" | awk '{ sum += $1 } END { print sum }')
 | 
			
		||||
 | 
			
		||||
# crush. kill. destroy.
 | 
			
		||||
(( verbose )) && cmdopts+=(-v)
 | 
			
		||||
if (( delete )); then
 | 
			
		||||
	runcmd rm "${cmdopts[@]}" "${candidates[@]}"
 | 
			
		||||
elif (( move )); then
 | 
			
		||||
	runcmd mv "${cmdopts[@]}" "${candidates[@]}" "$movedir"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
summarize "$pkgcount" "${candidates[@]}"
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!@BASH_SHELL@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
#   pacdiff : a simple pacnew/pacorig/pacsave updater
 | 
			
		||||
#
 | 
			
		||||
#   Copyright (c) 2007 Aaron Griffin <aaronmgriffin@gmail.com>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,8 @@
 | 
			
		||||
#!/usr/bin/perl
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
# paclist - List all packages installed from a given repo
 | 
			
		||||
#
 | 
			
		||||
# Copyright (C) 2008 Dan McGee <dpmcgee@gmail.com>
 | 
			
		||||
# Copyright (C) 2011 Dave Reisner <dreisner@archlinux.org>
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or
 | 
			
		||||
# modify it under the terms of the GNU General Public License
 | 
			
		||||
@@ -16,73 +17,27 @@
 | 
			
		||||
# You should have received a copy of the GNU General Public License
 | 
			
		||||
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
export TEXTDOMAIN='pacman'
 | 
			
		||||
export TEXTDOMAINDIR='/usr/share/locale'
 | 
			
		||||
 | 
			
		||||
my $progname = "paclist";
 | 
			
		||||
my $version = "1.0";
 | 
			
		||||
 | 
			
		||||
if ($#ARGV != 0 || $ARGV[0] eq "--help" || $ARGV[0] eq "-h") {
 | 
			
		||||
	print "$progname - List all packages installed from a given repo\n";
 | 
			
		||||
	print "Usage:   $progname <repo>\n";
 | 
			
		||||
	print "Example: $progname testing\n";
 | 
			
		||||
	if ($#ARGV != 0) {
 | 
			
		||||
		exit 1;
 | 
			
		||||
# determine whether we have gettext; make it a no-op if we do not
 | 
			
		||||
if ! type gettext &>/dev/null; then
 | 
			
		||||
	gettext() {
 | 
			
		||||
		echo "$@"
 | 
			
		||||
	}
 | 
			
		||||
	exit 0;
 | 
			
		||||
}
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ( $ARGV[0] eq "--version" || $ARGV[0] eq "-v") {
 | 
			
		||||
	print "$progname version $version\n";
 | 
			
		||||
	print "Copyright (C) 2008 Dan McGee\n";
 | 
			
		||||
	exit 0;
 | 
			
		||||
}
 | 
			
		||||
if [[ -z $1 ]]; then
 | 
			
		||||
	printf '%s - List all packages installed from a given repo\n' "${0##*/}"
 | 
			
		||||
	printf 'Usage:   %s <repo>\n' "${0##*/}"
 | 
			
		||||
	printf 'Example: %s testing\n' "${0##*/}"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# This hash table will be used to store pairs of ('name version', count) from
 | 
			
		||||
# the return of both pacman -Sl <repo> and pacman -Q output. We then check to
 | 
			
		||||
# see if a value was added twice (count = 2)- if so, we will print that package
 | 
			
		||||
# as it is both in the repo we queried and installed on our local system.
 | 
			
		||||
my %packages = ();
 | 
			
		||||
my $output;
 | 
			
		||||
printf -v installed '[%s]' "$(gettext installed)"
 | 
			
		||||
pacman -Sl $1 | awk -v i="$installed" '$NF == i { print $2,$3 }'
 | 
			
		||||
 | 
			
		||||
$output = `pacman -Sl $ARGV[0]`;
 | 
			
		||||
if ($? != 0) {
 | 
			
		||||
	exit 1;
 | 
			
		||||
}
 | 
			
		||||
my @sync = split(/\n/, $output);
 | 
			
		||||
# sample output from pacman -Sl:
 | 
			
		||||
# testing foobar 1.0-1
 | 
			
		||||
foreach $_ (@sync) {
 | 
			
		||||
	my @info = split(/ /);
 | 
			
		||||
	# we only want to store 'foobar 1.0-1' in our hash table
 | 
			
		||||
	my $pkg = $info[1] . " " . $info[2];
 | 
			
		||||
	$packages{$pkg}++;
 | 
			
		||||
}
 | 
			
		||||
# exit with pacman's return value, not awk's
 | 
			
		||||
exit ${PIPESTATUS[0]}
 | 
			
		||||
 | 
			
		||||
$output = `pacman -Q`;
 | 
			
		||||
if ($? != 0) {
 | 
			
		||||
	exit 1;
 | 
			
		||||
}
 | 
			
		||||
# sample output from pacman -Q:
 | 
			
		||||
# foobar 1.0-1
 | 
			
		||||
my @local = split(/\n/, $output);
 | 
			
		||||
foreach $_ (@local) {
 | 
			
		||||
	# store 'foobar 1.0-1' in our hash table
 | 
			
		||||
	$packages{$_}++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# run comparison check- if value was added twice, it was in the intersection
 | 
			
		||||
my @intersection;
 | 
			
		||||
foreach $_ (keys %packages) {
 | 
			
		||||
	if ($packages{$_} == 2) {
 | 
			
		||||
		push @{ \@intersection }, $_;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# print our intersection, and bask in the glory and speed of perl
 | 
			
		||||
@intersection = sort @intersection;
 | 
			
		||||
foreach $_ (@intersection) {
 | 
			
		||||
	print $_ . "\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#vim: set noet:
 | 
			
		||||
# vim: set ts=2 sw=2 noet:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										68
									
								
								contrib/paclog-pkglist.in
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										68
									
								
								contrib/paclog-pkglist.in
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,68 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
#
 | 
			
		||||
# paclog-pkglist - Parse a log file into a list of currently installed packages
 | 
			
		||||
#
 | 
			
		||||
# Copyright (C) 2011 Dave Reisner <dave@archlinux.org>
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or
 | 
			
		||||
# modify it under the terms of the GNU General Public License
 | 
			
		||||
# as published by the Free Software Foundation; either version 2
 | 
			
		||||
# of the License, or (at your option) any later version.
 | 
			
		||||
#
 | 
			
		||||
# This program is distributed in the hope that it will be useful,
 | 
			
		||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
# GNU General Public License for more details.
 | 
			
		||||
#
 | 
			
		||||
# You should have received a copy of the GNU General Public License
 | 
			
		||||
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
export TEXTDOMAIN='pacman'
 | 
			
		||||
export TEXTDOMAINDIR='/usr/share/locale'
 | 
			
		||||
declare logfile=${1:-@localstatedir@/log/pacman.log}
 | 
			
		||||
 | 
			
		||||
if [[ $1 ]]; then
 | 
			
		||||
	if [[ $1 = -@(h|-help) ]]; then
 | 
			
		||||
		printf 'usage:   %s [pacman log]\n' "${0##*/}"
 | 
			
		||||
		printf 'example: %s @localstatedir@/log/pacman.log\n' "${0##*/}"
 | 
			
		||||
		printf '\ndefaults to: @localstatedir@/log/pacman.log\n'
 | 
			
		||||
		exit 0
 | 
			
		||||
	elif [[ ! -e $logfile ]]; then
 | 
			
		||||
		printf $"target not found: %s\n" "$1"
 | 
			
		||||
		exit 1
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
<"$logfile" awk '
 | 
			
		||||
{
 | 
			
		||||
	action  = $3
 | 
			
		||||
	pkgname = $4
 | 
			
		||||
	pkgver  = $5
 | 
			
		||||
	upgver  = $7
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
NF == 5 && action == "installed" {
 | 
			
		||||
	gsub(/[()]/, "", pkgver)
 | 
			
		||||
	pkg[pkgname] = pkgver
 | 
			
		||||
	next
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
NF == 7 && action == "upgraded" {
 | 
			
		||||
	sub(/\)/, "", upgver)
 | 
			
		||||
	pkg[pkgname] = upgver
 | 
			
		||||
	next
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
NF == 5 && action == "removed" {
 | 
			
		||||
	pkg[pkgname] = -1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
END {
 | 
			
		||||
	for (i in pkg) {
 | 
			
		||||
		if (pkg[i] != -1) {
 | 
			
		||||
			printf "%s %s\n",i,pkg[i]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}' | sort
 | 
			
		||||
 | 
			
		||||
# vim: set ts=2 sw=2 noet:
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!@BASH_SHELL@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
#
 | 
			
		||||
#   pacscripts : tries to print out the {pre,post}_{install,remove,upgrade}
 | 
			
		||||
#   scripts of a given package
 | 
			
		||||
@@ -61,7 +61,7 @@ spacman() {
 | 
			
		||||
	if [ $EUID -eq 0 ]; then
 | 
			
		||||
		pacman "$@"
 | 
			
		||||
	else
 | 
			
		||||
		if [ ! "$(type -p sudo)" ]; then
 | 
			
		||||
		if ! type -p sudo; then
 | 
			
		||||
			error "Cannot find the sudo binary! Is sudo installed?"
 | 
			
		||||
			error "Otherwise try to run the program as root"
 | 
			
		||||
			exit 1
 | 
			
		||||
 
 | 
			
		||||
@@ -111,6 +111,8 @@ if ($#querypkgs >= 0) {
 | 
			
		||||
foreach $_ (@querypkgs) {
 | 
			
		||||
	# we grab 4 fields here: repo, name/ver, installed, and desc
 | 
			
		||||
	my @pkgfields = /^(.*?)\/(.*?) ?(\[.*\])?\n(.*)$/s;
 | 
			
		||||
	# skip any non-matching line
 | 
			
		||||
	next if not defined $pkgfields[1];
 | 
			
		||||
	# since installed is optional, we should fill it in if necessary
 | 
			
		||||
	$pkgfields[2] = "" if not defined $pkgfields[2];
 | 
			
		||||
	# check if the package was listed in the sync out
 | 
			
		||||
 
 | 
			
		||||
@@ -1,70 +0,0 @@
 | 
			
		||||
#!@BASH_SHELL@
 | 
			
		||||
 | 
			
		||||
if [ -r "@sysconfdir@/makepkg.conf" ]; then
 | 
			
		||||
	source @sysconfdir@/makepkg.conf
 | 
			
		||||
else
 | 
			
		||||
	echo "wget-xdelta: Unable to find makepkg.conf"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -r ~/.makepkg.conf ]; then
 | 
			
		||||
	source ~/.makepkg.conf
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
out_file=$(basename $1)
 | 
			
		||||
file_url=$2
 | 
			
		||||
 | 
			
		||||
if ! [[ "$out_file" =~ "pkg.tar.gz" ]]; then
 | 
			
		||||
	# If it's not a package file download as normal and exit.
 | 
			
		||||
	#wget --passive-ftp -c -O "$out_file" "$file_url"
 | 
			
		||||
	exit $?
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Get the package name and version
 | 
			
		||||
[[ "$out_file" =~ "$CARCH" ]] && arch="-$CARCH" || arch=""
 | 
			
		||||
pkg_data=$(echo $out_file | \
 | 
			
		||||
	sed "s|^\(.*\)-\([[:alnum:]_\.]*-[[:alnum:]_\.]*\)${arch}${PKGEXT}.part|\1 \2|")
 | 
			
		||||
pkgname=$(echo $pkg_data | cut -d ' ' -f 1)
 | 
			
		||||
new_version=$(echo $pkg_data | cut -d ' ' -f 2)
 | 
			
		||||
base_url=${file_url%/*}
 | 
			
		||||
 | 
			
		||||
# Look for the last version
 | 
			
		||||
for file in $(ls -r @localstatedir@/cache/pacman/pkg/${pkgname}-*-*{,-$CARCH}$PKGEXT 2>/dev/null); do
 | 
			
		||||
	[[ "$file" =~ "$CARCH" ]] && arch="-$CARCH" || arch=""
 | 
			
		||||
	check_version=$(echo $file | \
 | 
			
		||||
		sed "s|^.*/${pkgname}-\([[:alnum:]_\.]*-[[:alnum:]_\.]*\)${arch}$PKGEXT$|\1|" | \
 | 
			
		||||
		grep -v "^@localstatedir@/cache/pacman/pkg")
 | 
			
		||||
 | 
			
		||||
	[ "$check_version" = "" ] && continue
 | 
			
		||||
 | 
			
		||||
	vercmp=$(vercmp "$check_version" "$old_version")
 | 
			
		||||
	if [ "$check_version" != "$new_version" -a $vercmp -gt 0 ]; then
 | 
			
		||||
		old_version=$check_version
 | 
			
		||||
		old_file=$file
 | 
			
		||||
	fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
if [ "$old_version" != "" -a "$old_version" != "$new_version" ]; then
 | 
			
		||||
	# Great, we have a cached file, now calculate a patch name from it
 | 
			
		||||
	delta_name="$pkgname-${old_version}_to_${new_version}-${CARCH}.delta"
 | 
			
		||||
 | 
			
		||||
	echo "wget-xdelta: Attempting to download delta $delta_name..." >&2
 | 
			
		||||
	if wget --passive-ftp -c "$base_url/$delta_name"; then
 | 
			
		||||
		echo "wget-xdelta: Applying delta..."
 | 
			
		||||
		if xdelta patch "$delta_name" "$old_file" "$out_file"; then
 | 
			
		||||
			echo "wget-xdelta: Delta applied successfully!"
 | 
			
		||||
			rm "$delta_name"
 | 
			
		||||
			exit 0
 | 
			
		||||
		else
 | 
			
		||||
			echo "wget-xdelta: Failed to apply delta!"
 | 
			
		||||
			rm $delta_name
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
 fi
 | 
			
		||||
 | 
			
		||||
echo "wget-xdelta: Downloading new package..."
 | 
			
		||||
wget --passive-ftp -c -O "$out_file" "$file_url"
 | 
			
		||||
exit $?
 | 
			
		||||
 | 
			
		||||
# vim:set ts=4 sw=4 noet:
 | 
			
		||||
@@ -33,6 +33,9 @@ _pacman_opts_common=(
 | 
			
		||||
_pacman_opts_pkgfile=(
 | 
			
		||||
	'-d[Skip dependency checks]'
 | 
			
		||||
	'-f[Overwrite conflicting files]'
 | 
			
		||||
	'--dbonly[Only remove database entry, do not remove files]'
 | 
			
		||||
	'--needed[Do not reinstall up to date packages]'
 | 
			
		||||
	'--recursive[Reinstall all dependencies of target packages]'
 | 
			
		||||
	'*:package file:_files -g "*.pkg.tar.*(.)"'
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -62,9 +65,9 @@ _pacman_opts_query_modifiers=(
 | 
			
		||||
_pacman_opts_remove=(
 | 
			
		||||
	'-c[Remove all dependent packages]'
 | 
			
		||||
	'-d[Skip dependency checks]'
 | 
			
		||||
	'-k[Only remove database entry, do not remove files]'
 | 
			
		||||
	'-n[Remove protected configuration files]'
 | 
			
		||||
	'-s[Remove dependencies not required by other packages]'
 | 
			
		||||
	'--dbonly[Only remove database entry, do not remove files]'
 | 
			
		||||
	'*:installed package:_pacman_completions_installed_packages'
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -74,6 +77,9 @@ _pacman_opts_sync_actions=(
 | 
			
		||||
	'*-cc[Remove all packages from cache]:*:clean:->sync_clean'
 | 
			
		||||
	'-g[View all members of a package group]:*:package groups:->sync_group'
 | 
			
		||||
	'-s[Search package names and descriptions]:*:search text:->sync_search'
 | 
			
		||||
	'--dbonly[Only remove database entry, do not remove files]'
 | 
			
		||||
	'--needed[Do not reinstall up to date packages]'
 | 
			
		||||
	'--recursive[Reinstall all dependencies of target packages]'
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# options for passing to _arguments: options for --sync command
 | 
			
		||||
@@ -110,12 +116,12 @@ _pacman_action_none() {
 | 
			
		||||
_pacman_action_query() {
 | 
			
		||||
	local context state line
 | 
			
		||||
	typeset -A opt_args
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
#	_arguments -s : \
 | 
			
		||||
#		"$_pacman_opts_common[@]" \
 | 
			
		||||
#		"$_pacman_opts_query_actions[@]" \
 | 
			
		||||
#		"$_pacman_opts_query_modifiers[@]"
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
	case $state in
 | 
			
		||||
		query_file)
 | 
			
		||||
			_arguments -s : \
 | 
			
		||||
@@ -162,12 +168,12 @@ _pacman_action_remove() {
 | 
			
		||||
_pacman_action_sync() {
 | 
			
		||||
	local context state line
 | 
			
		||||
	typeset -A opt_args
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
#	_arguments -s : \
 | 
			
		||||
#		"$_pacman_opts_common[@]" \
 | 
			
		||||
#		"$_pacman_opts_sync_actions[@]" #\
 | 
			
		||||
#		#"$_pacman_opts_sync_modifiers[@]"
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
	case $state in
 | 
			
		||||
		sync_clean)
 | 
			
		||||
			_arguments -s : \
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								doc/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								doc/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -3,7 +3,9 @@ libalpm.3
 | 
			
		||||
makepkg.8
 | 
			
		||||
makepkg.conf.5
 | 
			
		||||
pacman.8
 | 
			
		||||
pacman-key.8
 | 
			
		||||
pacman.conf.5
 | 
			
		||||
pkgdelta.8
 | 
			
		||||
repo-add.8
 | 
			
		||||
repo-remove.8
 | 
			
		||||
vercmp.8
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										143
									
								
								doc/Doxyfile
									
									
									
									
									
								
							
							
						
						
									
										143
									
								
								doc/Doxyfile
									
									
									
									
									
								
							@@ -1,11 +1,13 @@
 | 
			
		||||
# Doxyfile 1.5.5
 | 
			
		||||
# Doxyfile 1.7.5.1
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Project related configuration options
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
DOXYFILE_ENCODING      = UTF-8
 | 
			
		||||
PROJECT_NAME           = libalpm
 | 
			
		||||
PROJECT_NUMBER         = 
 | 
			
		||||
PROJECT_NUMBER         =
 | 
			
		||||
PROJECT_BRIEF          = "Arch Linux Package Manager Library"
 | 
			
		||||
PROJECT_LOGO           =
 | 
			
		||||
OUTPUT_DIRECTORY       = ./
 | 
			
		||||
CREATE_SUBDIRS         = NO
 | 
			
		||||
OUTPUT_LANGUAGE        = English
 | 
			
		||||
@@ -25,27 +27,31 @@ ABBREVIATE_BRIEF       = "The $name class" \
 | 
			
		||||
ALWAYS_DETAILED_SEC    = YES
 | 
			
		||||
INLINE_INHERITED_MEMB  = NO
 | 
			
		||||
FULL_PATH_NAMES        = NO
 | 
			
		||||
STRIP_FROM_PATH        = 
 | 
			
		||||
STRIP_FROM_INC_PATH    = 
 | 
			
		||||
STRIP_FROM_PATH        =
 | 
			
		||||
STRIP_FROM_INC_PATH    =
 | 
			
		||||
SHORT_NAMES            = NO
 | 
			
		||||
JAVADOC_AUTOBRIEF      = YES
 | 
			
		||||
QT_AUTOBRIEF           = NO
 | 
			
		||||
MULTILINE_CPP_IS_BRIEF = NO
 | 
			
		||||
DETAILS_AT_TOP         = NO
 | 
			
		||||
INHERIT_DOCS           = YES
 | 
			
		||||
SEPARATE_MEMBER_PAGES  = NO
 | 
			
		||||
TAB_SIZE               = 4
 | 
			
		||||
ALIASES                = 
 | 
			
		||||
ALIASES                =
 | 
			
		||||
OPTIMIZE_OUTPUT_FOR_C  = YES
 | 
			
		||||
OPTIMIZE_OUTPUT_JAVA   = NO
 | 
			
		||||
OPTIMIZE_FOR_FORTRAN   = NO
 | 
			
		||||
OPTIMIZE_OUTPUT_VHDL   = NO
 | 
			
		||||
EXTENSION_MAPPING      =
 | 
			
		||||
BUILTIN_STL_SUPPORT    = NO
 | 
			
		||||
CPP_CLI_SUPPORT        = NO
 | 
			
		||||
SIP_SUPPORT            = NO
 | 
			
		||||
IDL_PROPERTY_SUPPORT   = YES
 | 
			
		||||
DISTRIBUTE_GROUP_DOC   = NO
 | 
			
		||||
SUBGROUPING            = YES
 | 
			
		||||
INLINE_GROUPED_CLASSES = NO
 | 
			
		||||
INLINE_SIMPLE_STRUCTS  = NO
 | 
			
		||||
TYPEDEF_HIDES_STRUCT   = NO
 | 
			
		||||
SYMBOL_CACHE_SIZE      = 0
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Build related configuration options
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
@@ -63,20 +69,27 @@ INTERNAL_DOCS          = NO
 | 
			
		||||
CASE_SENSE_NAMES       = YES
 | 
			
		||||
HIDE_SCOPE_NAMES       = NO
 | 
			
		||||
SHOW_INCLUDE_FILES     = YES
 | 
			
		||||
FORCE_LOCAL_INCLUDES   = NO
 | 
			
		||||
INLINE_INFO            = YES
 | 
			
		||||
SORT_MEMBER_DOCS       = YES
 | 
			
		||||
SORT_BRIEF_DOCS        = NO
 | 
			
		||||
SORT_MEMBERS_CTORS_1ST = NO
 | 
			
		||||
SORT_GROUP_NAMES       = NO
 | 
			
		||||
SORT_BY_SCOPE_NAME     = NO
 | 
			
		||||
STRICT_PROTO_MATCHING  = NO
 | 
			
		||||
GENERATE_TODOLIST      = YES
 | 
			
		||||
GENERATE_TESTLIST      = YES
 | 
			
		||||
GENERATE_BUGLIST       = YES
 | 
			
		||||
GENERATE_DEPRECATEDLIST= YES
 | 
			
		||||
ENABLED_SECTIONS       = 
 | 
			
		||||
ENABLED_SECTIONS       =
 | 
			
		||||
MAX_INITIALIZER_LINES  = 30
 | 
			
		||||
SHOW_USED_FILES        = YES
 | 
			
		||||
SHOW_DIRECTORIES       = NO
 | 
			
		||||
FILE_VERSION_FILTER    = 
 | 
			
		||||
SHOW_FILES             = YES
 | 
			
		||||
SHOW_NAMESPACES        = YES
 | 
			
		||||
FILE_VERSION_FILTER    =
 | 
			
		||||
LAYOUT_FILE            =
 | 
			
		||||
CITE_BIB_FILES         =
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to warning and progress messages
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
@@ -86,25 +99,26 @@ WARN_IF_UNDOCUMENTED   = YES
 | 
			
		||||
WARN_IF_DOC_ERROR      = YES
 | 
			
		||||
WARN_NO_PARAMDOC       = NO
 | 
			
		||||
WARN_FORMAT            = "$file:$line: $text"
 | 
			
		||||
WARN_LOGFILE           = 
 | 
			
		||||
WARN_LOGFILE           =
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to the input files
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
INPUT                  = ../lib/libalpm/
 | 
			
		||||
INPUT_ENCODING         = UTF-8
 | 
			
		||||
FILE_PATTERNS          = 
 | 
			
		||||
FILE_PATTERNS          =
 | 
			
		||||
RECURSIVE              = NO
 | 
			
		||||
EXCLUDE                = 
 | 
			
		||||
EXCLUDE                =
 | 
			
		||||
EXCLUDE_SYMLINKS       = NO
 | 
			
		||||
EXCLUDE_PATTERNS       = 
 | 
			
		||||
EXCLUDE_SYMBOLS        = 
 | 
			
		||||
EXAMPLE_PATH           = 
 | 
			
		||||
EXCLUDE_PATTERNS       =
 | 
			
		||||
EXCLUDE_SYMBOLS        =
 | 
			
		||||
EXAMPLE_PATH           =
 | 
			
		||||
EXAMPLE_PATTERNS       = *
 | 
			
		||||
EXAMPLE_RECURSIVE      = NO
 | 
			
		||||
IMAGE_PATH             = 
 | 
			
		||||
INPUT_FILTER           = 
 | 
			
		||||
FILTER_PATTERNS        = 
 | 
			
		||||
IMAGE_PATH             =
 | 
			
		||||
INPUT_FILTER           =
 | 
			
		||||
FILTER_PATTERNS        =
 | 
			
		||||
FILTER_SOURCE_FILES    = NO
 | 
			
		||||
FILTER_SOURCE_PATTERNS =
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to source browsing
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
@@ -121,31 +135,58 @@ VERBATIM_HEADERS       = YES
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
ALPHABETICAL_INDEX     = NO
 | 
			
		||||
COLS_IN_ALPHA_INDEX    = 5
 | 
			
		||||
IGNORE_PREFIX          = 
 | 
			
		||||
IGNORE_PREFIX          =
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to the HTML output
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
GENERATE_HTML          = NO
 | 
			
		||||
HTML_OUTPUT            = html
 | 
			
		||||
HTML_FILE_EXTENSION    = .html
 | 
			
		||||
HTML_HEADER            = 
 | 
			
		||||
HTML_FOOTER            = 
 | 
			
		||||
HTML_STYLESHEET        = 
 | 
			
		||||
HTML_HEADER            =
 | 
			
		||||
HTML_FOOTER            =
 | 
			
		||||
HTML_STYLESHEET        =
 | 
			
		||||
HTML_EXTRA_FILES       =
 | 
			
		||||
HTML_COLORSTYLE_HUE    = 220
 | 
			
		||||
HTML_COLORSTYLE_SAT    = 100
 | 
			
		||||
HTML_COLORSTYLE_GAMMA  = 80
 | 
			
		||||
HTML_TIMESTAMP         = YES
 | 
			
		||||
HTML_ALIGN_MEMBERS     = YES
 | 
			
		||||
GENERATE_HTMLHELP      = NO
 | 
			
		||||
HTML_DYNAMIC_SECTIONS  = NO
 | 
			
		||||
GENERATE_DOCSET        = NO
 | 
			
		||||
DOCSET_FEEDNAME        = "Doxygen generated docs"
 | 
			
		||||
DOCSET_BUNDLE_ID       = org.doxygen.Project
 | 
			
		||||
HTML_DYNAMIC_SECTIONS  = NO
 | 
			
		||||
CHM_FILE               = 
 | 
			
		||||
HHC_LOCATION           = 
 | 
			
		||||
DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
 | 
			
		||||
DOCSET_PUBLISHER_NAME  = Publisher
 | 
			
		||||
GENERATE_HTMLHELP      = NO
 | 
			
		||||
CHM_FILE               =
 | 
			
		||||
HHC_LOCATION           =
 | 
			
		||||
GENERATE_CHI           = NO
 | 
			
		||||
CHM_INDEX_ENCODING     =
 | 
			
		||||
BINARY_TOC             = NO
 | 
			
		||||
TOC_EXPAND             = NO
 | 
			
		||||
GENERATE_QHP           = NO
 | 
			
		||||
QCH_FILE               =
 | 
			
		||||
QHP_NAMESPACE          = org.doxygen.Project
 | 
			
		||||
QHP_VIRTUAL_FOLDER     = doc
 | 
			
		||||
QHP_CUST_FILTER_NAME   =
 | 
			
		||||
QHP_CUST_FILTER_ATTRS  =
 | 
			
		||||
QHP_SECT_FILTER_ATTRS  =
 | 
			
		||||
QHG_LOCATION           =
 | 
			
		||||
GENERATE_ECLIPSEHELP   = NO
 | 
			
		||||
ECLIPSE_DOC_ID         = org.doxygen.Project
 | 
			
		||||
DISABLE_INDEX          = NO
 | 
			
		||||
ENUM_VALUES_PER_LINE   = 4
 | 
			
		||||
GENERATE_TREEVIEW      = NO
 | 
			
		||||
USE_INLINE_TREES       = NO
 | 
			
		||||
TREEVIEW_WIDTH         = 250
 | 
			
		||||
EXT_LINKS_IN_WINDOW    = NO
 | 
			
		||||
FORMULA_FONTSIZE       = 10
 | 
			
		||||
FORMULA_TRANSPARENT    = YES
 | 
			
		||||
USE_MATHJAX            = NO
 | 
			
		||||
MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
 | 
			
		||||
MATHJAX_EXTENSIONS     =
 | 
			
		||||
SEARCHENGINE           = NO
 | 
			
		||||
SERVER_BASED_SEARCH    = NO
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to the LaTeX output
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
@@ -154,13 +195,16 @@ LATEX_OUTPUT           = latex
 | 
			
		||||
LATEX_CMD_NAME         = latex
 | 
			
		||||
MAKEINDEX_CMD_NAME     = makeindex
 | 
			
		||||
COMPACT_LATEX          = NO
 | 
			
		||||
PAPER_TYPE             = a4wide
 | 
			
		||||
EXTRA_PACKAGES         = 
 | 
			
		||||
LATEX_HEADER           = 
 | 
			
		||||
PAPER_TYPE             = letter
 | 
			
		||||
EXTRA_PACKAGES         =
 | 
			
		||||
LATEX_HEADER           =
 | 
			
		||||
LATEX_FOOTER           =
 | 
			
		||||
PDF_HYPERLINKS         = NO
 | 
			
		||||
USE_PDFLATEX           = NO
 | 
			
		||||
LATEX_BATCHMODE        = NO
 | 
			
		||||
LATEX_HIDE_INDICES     = NO
 | 
			
		||||
LATEX_SOURCE_CODE      = NO
 | 
			
		||||
LATEX_BIB_STYLE        = plain
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to the RTF output
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
@@ -168,8 +212,8 @@ GENERATE_RTF           = NO
 | 
			
		||||
RTF_OUTPUT             = rtf
 | 
			
		||||
COMPACT_RTF            = NO
 | 
			
		||||
RTF_HYPERLINKS         = NO
 | 
			
		||||
RTF_STYLESHEET_FILE    = 
 | 
			
		||||
RTF_EXTENSIONS_FILE    = 
 | 
			
		||||
RTF_STYLESHEET_FILE    =
 | 
			
		||||
RTF_EXTENSIONS_FILE    =
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to the man page output
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
@@ -182,8 +226,8 @@ MAN_LINKS              = NO
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
GENERATE_XML           = NO
 | 
			
		||||
XML_OUTPUT             = xml
 | 
			
		||||
XML_SCHEMA             = 
 | 
			
		||||
XML_DTD                = 
 | 
			
		||||
XML_SCHEMA             =
 | 
			
		||||
XML_DTD                =
 | 
			
		||||
XML_PROGRAMLISTING     = YES
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options for the AutoGen Definitions output
 | 
			
		||||
@@ -195,9 +239,9 @@ GENERATE_AUTOGEN_DEF   = NO
 | 
			
		||||
GENERATE_PERLMOD       = NO
 | 
			
		||||
PERLMOD_LATEX          = NO
 | 
			
		||||
PERLMOD_PRETTY         = YES
 | 
			
		||||
PERLMOD_MAKEVAR_PREFIX = 
 | 
			
		||||
PERLMOD_MAKEVAR_PREFIX =
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Configuration options related to the preprocessor   
 | 
			
		||||
# Configuration options related to the preprocessor
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
ENABLE_PREPROCESSING   = YES
 | 
			
		||||
MACRO_EXPANSION        = YES
 | 
			
		||||
@@ -207,24 +251,31 @@ INCLUDE_PATH           = ../..
 | 
			
		||||
INCLUDE_FILE_PATTERNS  = *.h
 | 
			
		||||
PREDEFINED             = HAVE_CONFIG_H= \
 | 
			
		||||
                         SYMHIDDEN= \
 | 
			
		||||
                         SYMEXPORT=
 | 
			
		||||
EXPAND_AS_DEFINED      = 
 | 
			
		||||
                         SYMEXPORT= \
 | 
			
		||||
                         HAVE_LIBARCHIVE \
 | 
			
		||||
                         HAVE_LIBCURL \
 | 
			
		||||
                         HAVE_LIBGPGME
 | 
			
		||||
EXPAND_AS_DEFINED      =
 | 
			
		||||
SKIP_FUNCTION_MACROS   = YES
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Configuration::additions related to external references   
 | 
			
		||||
# Configuration::additions related to external references
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
TAGFILES               = 
 | 
			
		||||
GENERATE_TAGFILE       = 
 | 
			
		||||
TAGFILES               =
 | 
			
		||||
GENERATE_TAGFILE       =
 | 
			
		||||
ALLEXTERNALS           = NO
 | 
			
		||||
EXTERNAL_GROUPS        = YES
 | 
			
		||||
PERL_PATH              = /usr/bin/perl
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Configuration options related to the dot tool   
 | 
			
		||||
# Configuration options related to the dot tool
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
CLASS_DIAGRAMS         = NO
 | 
			
		||||
MSCGEN_PATH            = 
 | 
			
		||||
MSCGEN_PATH            =
 | 
			
		||||
HIDE_UNDOC_RELATIONS   = YES
 | 
			
		||||
HAVE_DOT               = YES
 | 
			
		||||
DOT_NUM_THREADS        = 0
 | 
			
		||||
DOT_FONTNAME           = Helvetica
 | 
			
		||||
DOT_FONTSIZE           = 10
 | 
			
		||||
DOT_FONTPATH           =
 | 
			
		||||
CLASS_GRAPH            = YES
 | 
			
		||||
COLLABORATION_GRAPH    = YES
 | 
			
		||||
GROUP_GRAPHS           = YES
 | 
			
		||||
@@ -237,15 +288,13 @@ CALLER_GRAPH           = NO
 | 
			
		||||
GRAPHICAL_HIERARCHY    = YES
 | 
			
		||||
DIRECTORY_GRAPH        = YES
 | 
			
		||||
DOT_IMAGE_FORMAT       = png
 | 
			
		||||
DOT_PATH               = 
 | 
			
		||||
DOTFILE_DIRS           = 
 | 
			
		||||
INTERACTIVE_SVG        = NO
 | 
			
		||||
DOT_PATH               =
 | 
			
		||||
DOTFILE_DIRS           =
 | 
			
		||||
MSCFILE_DIRS           =
 | 
			
		||||
DOT_GRAPH_MAX_NODES    = 50
 | 
			
		||||
MAX_DOT_GRAPH_DEPTH    = 3
 | 
			
		||||
DOT_TRANSPARENT        = NO
 | 
			
		||||
DOT_MULTI_TARGETS      = NO
 | 
			
		||||
GENERATE_LEGEND        = YES
 | 
			
		||||
DOT_CLEANUP            = YES
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Configuration::additions related to the search engine   
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
SEARCHENGINE           = NO
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,8 @@ ASCIIDOC_MANS = \
 | 
			
		||||
	makepkg.8 \
 | 
			
		||||
	repo-add.8 \
 | 
			
		||||
	vercmp.8 \
 | 
			
		||||
	pkgdelta.8 \
 | 
			
		||||
	pacman-key.8 \
 | 
			
		||||
	PKGBUILD.5 \
 | 
			
		||||
	makepkg.conf.5 \
 | 
			
		||||
	pacman.conf.5 \
 | 
			
		||||
@@ -20,6 +22,8 @@ HTML_MANPAGES = \
 | 
			
		||||
	makepkg.8.html \
 | 
			
		||||
	repo-add.8.html \
 | 
			
		||||
	vercmp.8.html \
 | 
			
		||||
	pkgdelta.8.html \
 | 
			
		||||
	pacman-key.8.html \
 | 
			
		||||
	PKGBUILD.5.html \
 | 
			
		||||
	makepkg.conf.5.html \
 | 
			
		||||
	pacman.conf.5.html \
 | 
			
		||||
@@ -41,6 +45,8 @@ EXTRA_DIST = \
 | 
			
		||||
	makepkg.8.txt \
 | 
			
		||||
	repo-add.8.txt \
 | 
			
		||||
	vercmp.8.txt \
 | 
			
		||||
	pkgdelta.8.txt \
 | 
			
		||||
	pacman-key.8.txt \
 | 
			
		||||
	PKGBUILD.5.txt \
 | 
			
		||||
	PKGBUILD-example.txt \
 | 
			
		||||
	makepkg.conf.5.txt \
 | 
			
		||||
@@ -70,7 +76,7 @@ REAL_PACKAGE_VERSION = $(PACKAGE_VERSION)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
man_MANS =
 | 
			
		||||
dist_man_MANS = $(ASCIIDOC_MANS) repo-remove.8
 | 
			
		||||
dist_man_MANS = $(ASCIIDOC_MANS)
 | 
			
		||||
 | 
			
		||||
if USE_DOXYGEN
 | 
			
		||||
man_MANS += $(DOXYGEN_MANS)
 | 
			
		||||
@@ -86,16 +92,16 @@ html: $(HTML_DOCS)
 | 
			
		||||
website: html
 | 
			
		||||
	bsdtar czf website.tar.gz $(HTML_DOCS) \
 | 
			
		||||
		-C /etc/asciidoc/stylesheets/ \
 | 
			
		||||
		xhtml11.css xhtml11-manpage.css xhtml11-quirks.css \
 | 
			
		||||
		asciidoc.css asciidoc-manpage.css \
 | 
			
		||||
		-C /etc/asciidoc/javascripts/ \
 | 
			
		||||
		asciidoc-xhtml11.js \
 | 
			
		||||
		asciidoc.js \
 | 
			
		||||
		-C /etc/asciidoc/ \
 | 
			
		||||
		images
 | 
			
		||||
 | 
			
		||||
pkgdatadir = ${datadir}/${PACKAGE}
 | 
			
		||||
 | 
			
		||||
ASCIIDOC_OPTS = \
 | 
			
		||||
	-f asciidoc.conf \
 | 
			
		||||
	-f $(srcdir)/asciidoc.conf \
 | 
			
		||||
	-a pacman_version="$(REAL_PACKAGE_VERSION)" \
 | 
			
		||||
	-a pacman_date="`date +%Y-%m-%d`" \
 | 
			
		||||
	-a pkgdatadir=$(pkgdatadir) \
 | 
			
		||||
@@ -106,11 +112,12 @@ A2X_OPTS = \
 | 
			
		||||
	--no-xmllint \
 | 
			
		||||
	-d manpage \
 | 
			
		||||
	-f manpage \
 | 
			
		||||
	--xsltproc-opts='-param man.endnotes.list.enabled 0 -param man.endnotes.are.numbered 0'
 | 
			
		||||
	--xsltproc-opts='-param man.endnotes.list.enabled 0 -param man.endnotes.are.numbered 0' \
 | 
			
		||||
	--destination-dir='./'
 | 
			
		||||
 | 
			
		||||
# These rules are due to the includes and files of the asciidoc text
 | 
			
		||||
$(ASCIIDOC_MANS): asciidoc.conf footer.txt
 | 
			
		||||
	a2x $(A2X_OPTS) --asciidoc-opts="$(ASCIIDOC_OPTS)" $@.txt
 | 
			
		||||
	a2x $(A2X_OPTS) --asciidoc-opts="$(ASCIIDOC_OPTS) --out-file=./$@.xml" $(srcdir)/$@.txt
 | 
			
		||||
 | 
			
		||||
%.html: %.txt
 | 
			
		||||
	asciidoc $(ASCIIDOC_OPTS) $*.txt
 | 
			
		||||
@@ -133,13 +140,25 @@ pacman.8 pacman.8.html: pacman.8.txt
 | 
			
		||||
makepkg.8 makepkg.8.html: makepkg.8.txt
 | 
			
		||||
repo-add.8 repo-add.8.html: repo-add.8.txt
 | 
			
		||||
vercmp.8 vercmp.8.html: vercmp.8.txt
 | 
			
		||||
pkgdelta.8 pkgdelta.8.html: pkgdelta.8.txt
 | 
			
		||||
pacman-key.8 pacman-key.8.html: pacman-key.8.txt
 | 
			
		||||
PKGBUILD.5 PKGBUILD.5.html: PKGBUILD.5.txt PKGBUILD-example.txt
 | 
			
		||||
makepkg.conf.5 makepkg.conf.5.html: makepkg.conf.5.txt
 | 
			
		||||
pacman.conf.5 pacman.conf.5.html: pacman.conf.5.txt
 | 
			
		||||
libalpm.3 libalpm.3.html: libalpm.3.txt
 | 
			
		||||
# this one is just a symlink
 | 
			
		||||
repo-remove.8: repo-add.8
 | 
			
		||||
	rm -f repo-remove.8
 | 
			
		||||
	$(RM) repo-remove.8
 | 
			
		||||
	$(LN_S) repo-add.8 repo-remove.8
 | 
			
		||||
 | 
			
		||||
install-data-hook:
 | 
			
		||||
	cd $(DESTDIR)$(mandir)/man8 && \
 | 
			
		||||
		$(RM) repo-remove.8 && \
 | 
			
		||||
		( $(LN_S) repo-add.8 repo-remove.8 || \
 | 
			
		||||
		ln repo-add.8 repo-remove.8 || \
 | 
			
		||||
		cp repo-add.8 repo-remove.8 )
 | 
			
		||||
 | 
			
		||||
uninstall-hook:
 | 
			
		||||
	$(RM) $(DESTDIR)$(mandir)/man8/repo-remove.8
 | 
			
		||||
 | 
			
		||||
# vim:set ts=2 sw=2 noet:
 | 
			
		||||
 
 | 
			
		||||
@@ -13,8 +13,12 @@ source=(ftp://ftp.gnu.org/gnu/$pkgname/$pkgname-$pkgver.tar.gz)
 | 
			
		||||
md5sums=('ee5ae84d115f051d87fcaaef3b4ae782')
 | 
			
		||||
 | 
			
		||||
build() {
 | 
			
		||||
  cd $srcdir/$pkgname-$pkgver
 | 
			
		||||
  cd "$srcdir"/$pkgname-$pkgver
 | 
			
		||||
  ./configure --prefix=/usr
 | 
			
		||||
  make
 | 
			
		||||
  make prefix=$pkgdir/usr install
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
package() {
 | 
			
		||||
  cd "$srcdir"/$pkgname-$pkgver
 | 
			
		||||
  make prefix="$pkgdir"/usr install
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/////
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet:
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
PKGBUILD(5)
 | 
			
		||||
===========
 | 
			
		||||
@@ -16,12 +16,12 @@ PKGBUILD
 | 
			
		||||
 | 
			
		||||
Description
 | 
			
		||||
-----------
 | 
			
		||||
This manual page is meant to describe general rules about PKGBUILDs. Once a
 | 
			
		||||
This manual page describes general rules about PKGBUILDs. Once a
 | 
			
		||||
PKGBUILD is written, the actual package is built using makepkg and installed
 | 
			
		||||
with pacman.
 | 
			
		||||
 | 
			
		||||
NOTE: An example PKGBUILD, useful for reference, is located in '{pkgdatadir}'.
 | 
			
		||||
Also located there are other example files such as a ChangeLog and an install
 | 
			
		||||
NOTE: An example PKGBUILD, useful for reference, is located in '{pkgdatadir}'
 | 
			
		||||
along with other example files such as a ChangeLog and an install
 | 
			
		||||
script. You can copy the provided PKGBUILD.proto file to a new package build
 | 
			
		||||
directory and make customizations to suit your needs.
 | 
			
		||||
 | 
			
		||||
@@ -30,33 +30,33 @@ Options and Directives
 | 
			
		||||
----------------------
 | 
			
		||||
The following is a list of standard options and directives available for use
 | 
			
		||||
in a PKGBUILD. These are all understood and interpreted by makepkg, and most
 | 
			
		||||
will be directly transferred to the built package.
 | 
			
		||||
of them will be directly transferred to the built package.
 | 
			
		||||
 | 
			
		||||
If you need to create any custom variables for use in your build process, it is
 | 
			
		||||
recommended to name your custom variables with an '_' (underscore) prefix.
 | 
			
		||||
recommended to prefix their name with an '_' (underscore).
 | 
			
		||||
This will prevent any possible name clashes with internal makepkg variables.
 | 
			
		||||
For example, to store the base kernel version in a variable, use something
 | 
			
		||||
similar to `$_basekernver`.
 | 
			
		||||
 | 
			
		||||
*pkgname (array)*::
 | 
			
		||||
	The name of the package. This has be a unix-friendly name as it will be
 | 
			
		||||
	used in the package filename. Members of the array are not allowed to start
 | 
			
		||||
	with hyphens.
 | 
			
		||||
	Either the name of the package or an array of names for split packages.
 | 
			
		||||
	Because it will be used in the package filename, this has to be unix-friendly.
 | 
			
		||||
	Members of the array are not allowed to start with hyphens.
 | 
			
		||||
 | 
			
		||||
*pkgver*::
 | 
			
		||||
	The version of the software as released from the author (e.g. '2.7.1').
 | 
			
		||||
	The version of the software as released from the author (e.g., '2.7.1').
 | 
			
		||||
	The variable is not allowed to contain colons or hyphens.
 | 
			
		||||
 | 
			
		||||
*pkgrel*::
 | 
			
		||||
	This is the release number specific to the Arch Linux release. This
 | 
			
		||||
	allows package maintainers to make updates to the package's configure
 | 
			
		||||
	flags, for example. A pkgrel of '1' is typically used for each upstream
 | 
			
		||||
	software release and is incremented for intermediate PKGBUILD updates. The
 | 
			
		||||
	flags, for example. This is typically set to '1' for each new upstream
 | 
			
		||||
	software release and incremented for intermediate PKGBUILD updates. The
 | 
			
		||||
	variable is not allowed to contain hyphens.
 | 
			
		||||
 | 
			
		||||
*pkgdesc*::
 | 
			
		||||
	This should be a brief description of the package and its functionality.
 | 
			
		||||
	Try to keep the description to one line of text.
 | 
			
		||||
	Try to keep the description to one line of text and not use the package's name.
 | 
			
		||||
 | 
			
		||||
*epoch*::
 | 
			
		||||
	Used to force the package to be seen as newer than any previous versions
 | 
			
		||||
@@ -69,56 +69,59 @@ similar to `$_basekernver`.
 | 
			
		||||
 | 
			
		||||
*url*::
 | 
			
		||||
	This field contains a URL that is associated with the software being
 | 
			
		||||
	packaged. This is typically the project's website.
 | 
			
		||||
	packaged. Typically the project's website.
 | 
			
		||||
 | 
			
		||||
*license (array)*::
 | 
			
		||||
	This field specifies the license(s) that apply to the package.
 | 
			
		||||
	Commonly-used licenses are found in '/usr/share/licenses/common'. If you
 | 
			
		||||
	Commonly used licenses can be found in '/usr/share/licenses/common'. If you
 | 
			
		||||
	see the package's license there, simply reference it in the license
 | 
			
		||||
	field (e.g. `license=('GPL')`). If the package provides a license not
 | 
			
		||||
	found in '/usr/share/licenses/common', then you should include the license
 | 
			
		||||
	field (e.g., `license=('GPL')`). If the package provides a license not
 | 
			
		||||
	available in '/usr/share/licenses/common', then you should include it
 | 
			
		||||
	in the package itself and set `license=('custom')` or
 | 
			
		||||
	`license=('custom:LicenseName')`. The license should be placed in
 | 
			
		||||
	'$pkgdir/usr/share/licenses/$pkgname' when building the package. If
 | 
			
		||||
	multiple licenses are applicable for a package, list all of them:
 | 
			
		||||
	'$pkgdir/usr/share/licenses/$pkgname/' when building the package. If
 | 
			
		||||
	multiple licenses are applicable, list all of them:
 | 
			
		||||
	`license=('GPL' 'FDL')`.
 | 
			
		||||
 | 
			
		||||
*install*::
 | 
			
		||||
	Specifies a special install script that is to be included in the package.
 | 
			
		||||
	This file should reside in the same directory as the PKGBUILD, and will
 | 
			
		||||
	be copied into the package by makepkg. It does not need to be included
 | 
			
		||||
	in the source array (e.g. `install=pkgname.install`).
 | 
			
		||||
	in the source array (e.g., `install=$pkgname.install`).
 | 
			
		||||
 | 
			
		||||
*changelog*::
 | 
			
		||||
	Specifies a changelog file that is to be included in the package.
 | 
			
		||||
	This file should reside in the same directory as the PKGBUILD, and will
 | 
			
		||||
	be copied into the package by makepkg. It does not need to be included
 | 
			
		||||
	in the source array (e.g. `changelog=$pkgname.changelog`).
 | 
			
		||||
	in the source array (e.g., `changelog=$pkgname.changelog`).
 | 
			
		||||
 | 
			
		||||
*source (array)*::
 | 
			
		||||
	An array of source files required to build the package. Source files
 | 
			
		||||
	must either reside in the same directory as the PKGBUILD file, or be a
 | 
			
		||||
	fully-qualified URL that makepkg will use to download the file. In order
 | 
			
		||||
	to make the PKGBUILD as useful as possible, use the $pkgname and $pkgver
 | 
			
		||||
	variables if possible when specifying the download location. Any files
 | 
			
		||||
	that are compressed will automatically be extracted, unless found in
 | 
			
		||||
	the noextract array listed below.
 | 
			
		||||
	must either reside in the same directory as the PKGBUILD, or be a
 | 
			
		||||
	fully-qualified URL that makepkg can use to download the file.
 | 
			
		||||
	To make the PKGBUILD as useful as possible, use the `$pkgname` and `$pkgver`
 | 
			
		||||
	variables if possible when specifying the download location. Compressed files
 | 
			
		||||
	will be extracted automatically unless found in
 | 
			
		||||
	the noextract array described below.
 | 
			
		||||
+
 | 
			
		||||
It is also possible to specify an optional filename, which is helpful
 | 
			
		||||
It is also possible to change the name of the downloaded file, which is helpful
 | 
			
		||||
with weird URLs and for handling multiple source files with the same
 | 
			
		||||
name. The syntax is: `source=('filename::url')`.
 | 
			
		||||
+
 | 
			
		||||
Files in the source array with extensions `.sig` or `.asc` are recognized by
 | 
			
		||||
makepkg as PGP signatures and will be automatically used to verify the integrity
 | 
			
		||||
of the corresponding source file.
 | 
			
		||||
 | 
			
		||||
*noextract (array)*::
 | 
			
		||||
	An array of filenames corresponding to those from the source array. Files
 | 
			
		||||
	listed here will not be extracted with the rest of the source files. This
 | 
			
		||||
	is useful for packages which use compressed data which is downloaded but
 | 
			
		||||
	not necessary to uncompress.
 | 
			
		||||
	is useful for packages that use compressed data directly.
 | 
			
		||||
 | 
			
		||||
*md5sums (array)*::
 | 
			
		||||
	This array contains an MD5 hash for every source file specified in the
 | 
			
		||||
	source array (in the same order). makepkg will use this to verify source
 | 
			
		||||
	file integrity during subsequent builds. To easily generate md5sums, run
 | 
			
		||||
	``makepkg -g >> PKGBUILD''. If desired, move the md5sums line to an
 | 
			
		||||
	`makepkg -g >> PKGBUILD`. If desired, move the md5sums line to an
 | 
			
		||||
	appropriate location.
 | 
			
		||||
 | 
			
		||||
*sha1sums, sha256sums, sha384sums, sha512sums (arrays)*::
 | 
			
		||||
@@ -133,31 +136,36 @@ name. The syntax is: `source=('filename::url')`.
 | 
			
		||||
	example, one could install all KDE packages by installing the 'kde' group.
 | 
			
		||||
 | 
			
		||||
*arch (array)*::
 | 
			
		||||
	Defines on which architectures the given package is available (e.g.
 | 
			
		||||
	Defines on which architectures the given package is available (e.g.,
 | 
			
		||||
	`arch=('i686' 'x86_64')`). Packages that contain no architecture specific
 | 
			
		||||
	files may use arch=('any').
 | 
			
		||||
	files should use `arch=('any')`.
 | 
			
		||||
 | 
			
		||||
*backup (array)*::
 | 
			
		||||
	A space-delimited array of filenames, without preceding slashes, that
 | 
			
		||||
	An array of filenames, without preceding slashes, that
 | 
			
		||||
	should be backed up if the package is removed or upgraded. This is
 | 
			
		||||
	commonly used for packages placing configuration files in /etc. See
 | 
			
		||||
	Handling Config Files in linkman:pacman[8] for more information.
 | 
			
		||||
 | 
			
		||||
*depends (array)*::
 | 
			
		||||
	An array of packages that this package depends on to run. Packages in
 | 
			
		||||
	An array of packages this package depends on to run. Entries in
 | 
			
		||||
	this list should be surrounded with single quotes and contain at least
 | 
			
		||||
	the package name. Entries can also include a version requirement of the
 | 
			
		||||
	form 'name<>version', where <> is one of five comparisons: >= (greater
 | 
			
		||||
	than or equal to), <= (less than or equal to), = (equal to), > (greater
 | 
			
		||||
	than), or < (less than).
 | 
			
		||||
	form 'name<>version', where `<>` is one of five comparisons: `>=` (greater
 | 
			
		||||
	than or equal to), `<=` (less than or equal to), `=` (equal to), `>`
 | 
			
		||||
	(greater than), or `<` (less than).
 | 
			
		||||
+
 | 
			
		||||
If the dependency name appears to be a library (ends with .so), makepkg will
 | 
			
		||||
try to find a binary that depends on the library in the built package and
 | 
			
		||||
append the version needed by the binary. Appending the version yourself
 | 
			
		||||
disables auto detection.
 | 
			
		||||
 | 
			
		||||
*makedepends (array)*::
 | 
			
		||||
	An array of packages that this package depends on to build, but are not
 | 
			
		||||
	An array of packages this package depends on to build but are not
 | 
			
		||||
	needed at runtime. Packages in this list follow the same format as
 | 
			
		||||
	depends.
 | 
			
		||||
 | 
			
		||||
*checkdepends (array)*::
 | 
			
		||||
	An array of packages that this package depends on to run its test suite,
 | 
			
		||||
	An array of packages this package depends on to run its test suite
 | 
			
		||||
	but are not needed at runtime. Packages in this list follow the same
 | 
			
		||||
	format as depends. These dependencies are only considered when the
 | 
			
		||||
	check() function is present and is to be run by makepkg.
 | 
			
		||||
@@ -174,26 +182,33 @@ name. The syntax is: `source=('filename::url')`.
 | 
			
		||||
*conflicts (array)*::
 | 
			
		||||
	An array of packages that will conflict with this package (i.e. they
 | 
			
		||||
	cannot both be installed at the same time). This directive follows the
 | 
			
		||||
	same format as depends. Versioned conflicts are also supported.
 | 
			
		||||
	same format as depends. Versioned conflicts are supported using the
 | 
			
		||||
	operators as described in `depends`.
 | 
			
		||||
 | 
			
		||||
*provides (array)*::
 | 
			
		||||
	An array of ``virtual provisions'' that this package provides. This allows
 | 
			
		||||
	An array of ``virtual provisions'' this package provides. This allows
 | 
			
		||||
	a package to provide dependencies other than its own package name. For
 | 
			
		||||
	example, the dcron package can provide 'cron', which allows packages to
 | 
			
		||||
	depend on 'cron' rather than 'dcron OR fcron'.
 | 
			
		||||
	Versioned provisions are also possible, in the 'name=version' format.
 | 
			
		||||
	For example, dcron can provide 'cron=2.0' to satisfy the 'cron>=2.0'
 | 
			
		||||
	dependency of other packages. Provisions involving the '>' and '<'
 | 
			
		||||
	operators are invalid as only specific versions of a package may be
 | 
			
		||||
	provided.
 | 
			
		||||
+
 | 
			
		||||
Versioned provisions are also possible, in the 'name=version' format. For
 | 
			
		||||
example, dcron can provide 'cron=2.0' to satisfy the 'cron>=2.0' dependency of
 | 
			
		||||
other packages. Provisions involving the `>` and `<` operators are invalid as
 | 
			
		||||
only specific versions of a package may be provided.
 | 
			
		||||
+
 | 
			
		||||
If the provision name appears to be a library (ends with .so), makepkg will
 | 
			
		||||
try to find the library in the built package and append the correct
 | 
			
		||||
version. Appending the version yourself disables auto detection.
 | 
			
		||||
 | 
			
		||||
*replaces (array)*::
 | 
			
		||||
	An array of packages that this package should replace, and can be used
 | 
			
		||||
	An array of packages this package should replace. This can be used
 | 
			
		||||
	to handle renamed/combined packages. For example, if the 'j2re' package
 | 
			
		||||
	is renamed to 'jre', this directive allows future upgrades to continue
 | 
			
		||||
	as expected even though the package has moved. Sysupgrade is currently
 | 
			
		||||
	the only pacman operation that utilizes this field, a normal sync will
 | 
			
		||||
	not use its value.
 | 
			
		||||
	as expected even though the package has moved. Versioned replaces are
 | 
			
		||||
	supported using the operators as described in `depends`.
 | 
			
		||||
+
 | 
			
		||||
Sysupgrade is currently the only pacman operation that utilizes this field.
 | 
			
		||||
A normal sync or upgrade will not use its value.
 | 
			
		||||
 | 
			
		||||
*options (array)*::
 | 
			
		||||
	This array allows you to override some of makepkg's default behavior
 | 
			
		||||
@@ -223,6 +238,9 @@ name. The syntax is: `source=('filename::url')`.
 | 
			
		||||
	*zipman*;;
 | 
			
		||||
		Compress man and info pages with gzip.
 | 
			
		||||
 | 
			
		||||
	*upx*;;
 | 
			
		||||
		Compress binary executable files using UPX.
 | 
			
		||||
 | 
			
		||||
	*ccache*;;
 | 
			
		||||
		Allow the use of ccache during build. More useful in its negative
 | 
			
		||||
		form `!ccache` with select packages that have problems building
 | 
			
		||||
@@ -248,27 +266,28 @@ name. The syntax is: `source=('filename::url')`.
 | 
			
		||||
 | 
			
		||||
build() Function
 | 
			
		||||
----------------
 | 
			
		||||
In addition to the above directives, the optional build() bash function usually
 | 
			
		||||
In addition to the above directives, the optional build() function usually
 | 
			
		||||
comprises the remainder of the PKGBUILD. This is directly sourced and executed
 | 
			
		||||
by makepkg, so anything that bash or the system has available is available for
 | 
			
		||||
use here. The function is run in `bash -e` mode, meaning any command that exits
 | 
			
		||||
with a non-zero status will cause the function to exit. Be sure any exotic
 | 
			
		||||
commands used are covered by `makedepends`.
 | 
			
		||||
 | 
			
		||||
All of the above variables such as `pkgname` and `pkgver` are available for use
 | 
			
		||||
in the build function. In addition, makepkg defines three variables for your
 | 
			
		||||
use during the build and install process. These three variables are as follows:
 | 
			
		||||
All of the above variables such as `$pkgname` and `$pkgver` are available for use
 | 
			
		||||
in the build function. In addition, makepkg defines the following three
 | 
			
		||||
variables for use during the build and install process:
 | 
			
		||||
 | 
			
		||||
*startdir*::
 | 
			
		||||
	This contains the absolute path to the directory where the PKGBUILD was
 | 
			
		||||
	This contains the absolute path to the directory where the PKGBUILD is
 | 
			
		||||
	located, which is usually the output of `$(pwd)` when makepkg is started.
 | 
			
		||||
	Use of this variable is deprecated and strongly discouraged.
 | 
			
		||||
 | 
			
		||||
*srcdir*::
 | 
			
		||||
	This points to the directory where makepkg extracts or copies all source
 | 
			
		||||
	This contains the directory where makepkg extracts, or copies, all source
 | 
			
		||||
	files.
 | 
			
		||||
 | 
			
		||||
*pkgdir*::
 | 
			
		||||
	This points to the directory where makepkg bundles the installed package
 | 
			
		||||
	This contains the directory where makepkg bundles the installed package
 | 
			
		||||
	(this directory will become the root directory of your built package).
 | 
			
		||||
 | 
			
		||||
If you create any variables of your own in the build function, it is
 | 
			
		||||
@@ -301,9 +320,9 @@ Each split package uses a corresponding packaging function with name
 | 
			
		||||
`package_foo()`, where `foo` is the name of the split package.
 | 
			
		||||
 | 
			
		||||
All options and directives for the split packages default to the global values
 | 
			
		||||
given within the PKGBUILD. However, some of these can be overridden within each
 | 
			
		||||
split package's packaging function. The following variables can be overridden:
 | 
			
		||||
`pkgver`, `pkgrel`, `pkgdesc`, `arch`, `license`, `groups`, `depends`,
 | 
			
		||||
given in the PKGBUILD. Nevertheless, the following ones can be overridden within
 | 
			
		||||
each split package's packaging function:
 | 
			
		||||
`pkgver`, `pkgrel`, `epoch`, `pkgdesc`, `arch`, `license`, `groups`, `depends`,
 | 
			
		||||
`optdepends`, `provides`, `conflicts`, `replaces`, `backup`, `options`,
 | 
			
		||||
`install` and `changelog`.
 | 
			
		||||
 | 
			
		||||
@@ -321,31 +340,37 @@ Pacman has the ability to store and execute a package-specific script when it
 | 
			
		||||
installs, removes, or upgrades a package. This allows a package to configure
 | 
			
		||||
itself after installation and perform an opposite action upon removal.
 | 
			
		||||
 | 
			
		||||
The exact time the script is run varies with each operation:
 | 
			
		||||
The exact time the script is run varies with each operation, and should be
 | 
			
		||||
self-explanatory. Note that during an upgrade operation, none of the install
 | 
			
		||||
or remove scripts will be called.
 | 
			
		||||
 | 
			
		||||
Scripts are passed either one or two ``full version strings'', where a full
 | 
			
		||||
version string is either 'pkgver-pkgrel' or 'epoch:pkgver-pkgrel' if epoch is
 | 
			
		||||
non-zero.
 | 
			
		||||
 | 
			
		||||
*pre_install*::
 | 
			
		||||
	script is run right before files are extracted. One argument is passed:
 | 
			
		||||
	new package version.
 | 
			
		||||
	Run right before files are extracted. One argument is passed:
 | 
			
		||||
	new package full version string.
 | 
			
		||||
 | 
			
		||||
*post_install*::
 | 
			
		||||
	script is run right after files are extracted. One argument is passed:
 | 
			
		||||
	new package version.
 | 
			
		||||
	Run right after files are extracted. One argument is passed:
 | 
			
		||||
	new package full version string.
 | 
			
		||||
 | 
			
		||||
*pre_upgrade*::
 | 
			
		||||
	script is run right before files are extracted. Two arguments are passed
 | 
			
		||||
	in the following order: new package version, old package version.
 | 
			
		||||
	Run right before files are extracted. Two arguments are passed in this
 | 
			
		||||
	order: new package full version string, old package full version string.
 | 
			
		||||
 | 
			
		||||
*post_upgrade*::
 | 
			
		||||
	script is run after files are extracted. Two arguments are passed
 | 
			
		||||
	in the following order: new package version, old package version.
 | 
			
		||||
	Run after files are extracted. Two arguments are passed in this order:
 | 
			
		||||
	new package full version string, old package full version string.
 | 
			
		||||
 | 
			
		||||
*pre_remove*::
 | 
			
		||||
	script is run right before files are removed. One argument is passed:
 | 
			
		||||
	old package version.
 | 
			
		||||
	Run right before files are removed. One argument is passed:
 | 
			
		||||
	old package full version string.
 | 
			
		||||
 | 
			
		||||
*post_remove*::
 | 
			
		||||
	script is run right after files are removed. One argument is passed:
 | 
			
		||||
	old package version.
 | 
			
		||||
	Run right after files are removed. One argument is passed:
 | 
			
		||||
	old package full version string.
 | 
			
		||||
 | 
			
		||||
To use this feature, create a file such as 'pkgname.install' and put it in the
 | 
			
		||||
same directory as the PKGBUILD script. Then use the install directive:
 | 
			
		||||
@@ -363,7 +388,7 @@ makepkg supports building development versions of packages without having to
 | 
			
		||||
manually update the pkgver in the PKGBUILD. This was formerly done using the
 | 
			
		||||
separate utility 'versionpkg'. In order to utilize this functionality, your
 | 
			
		||||
PKGBUILD must use correct variable names depending on the SCM being fetched
 | 
			
		||||
from.
 | 
			
		||||
from (e.g., 'makepkg-git', 'mplayer-svn').
 | 
			
		||||
 | 
			
		||||
*CVS*::
 | 
			
		||||
	The generated pkgver will be the date the package is built.
 | 
			
		||||
@@ -384,8 +409,7 @@ from.
 | 
			
		||||
		The SVN module to fetch.
 | 
			
		||||
 | 
			
		||||
*Git*::
 | 
			
		||||
	The generated pkgver will be one formatted by the 'git-describe'
 | 
			
		||||
	command, with '-' characters converted to '_' characters.
 | 
			
		||||
	The generated pkgver will be the date the package is built.
 | 
			
		||||
 | 
			
		||||
	*_gitroot*;;
 | 
			
		||||
		The URL (all protocols supported) to the GIT repository.
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,11 @@ plus=+
 | 
			
		||||
caret=^
 | 
			
		||||
startsb=[
 | 
			
		||||
endsb=]
 | 
			
		||||
backslash=\
 | 
			
		||||
tilde=~
 | 
			
		||||
apostrophe='
 | 
			
		||||
backtick=`
 | 
			
		||||
litdd=--
 | 
			
		||||
 | 
			
		||||
ifdef::backend-docbook[]
 | 
			
		||||
[linkman-inlinemacro]
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/////
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet:
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
 | 
			
		||||
See the pacman website at http://www.archlinux.org/pacman/[] for current
 | 
			
		||||
@@ -20,12 +20,15 @@ Current maintainers:
 | 
			
		||||
 | 
			
		||||
* Allan McRae <allan@archlinux.org>
 | 
			
		||||
* Dan McGee <dan@archlinux.org>
 | 
			
		||||
* Xavier Chantry <shiningxc@gmail.com>
 | 
			
		||||
* Dave Reisner <dreisner@archlinux.org>
 | 
			
		||||
 | 
			
		||||
Past contributors:
 | 
			
		||||
Past major contributors:
 | 
			
		||||
 | 
			
		||||
* Judd Vinet <jvinet@zeroflux.org>
 | 
			
		||||
* Aurelien Foret <aurelien@archlinux.org>
 | 
			
		||||
* Aaron Griffin <aaron@archlinux.org>
 | 
			
		||||
* Xavier Chantry <shiningxc@gmail.com>
 | 
			
		||||
* Nagy Gabor <ngaba@bibl.u-szeged.hu>
 | 
			
		||||
 | 
			
		||||
See the 'AUTHORS' file for additional contributors.
 | 
			
		||||
For additional contributors, use `git shortlog -s` on the pacman.git
 | 
			
		||||
repository.
 | 
			
		||||
 
 | 
			
		||||
@@ -16,10 +16,10 @@ automatically and can download packages from a remote server.
 | 
			
		||||
 | 
			
		||||
History
 | 
			
		||||
~~~~~~~
 | 
			
		||||
Version 2.0 of pacman introduced the ability to sync packages (the `--sync`
 | 
			
		||||
Version 2.0 of pacman introduced the ability to sync packages (the '\--sync'
 | 
			
		||||
option) with a master server through the use of package databases. Prior to
 | 
			
		||||
this, packages would have to be installed manually using the `--add` and
 | 
			
		||||
`--upgrade` operations.
 | 
			
		||||
this, packages would have to be installed manually using the '\--add' and
 | 
			
		||||
'\--upgrade' operations.
 | 
			
		||||
 | 
			
		||||
Version 3.0 was the switch to a two-part pacman- a backend named libalpm
 | 
			
		||||
(library for Arch Linux Package Management), and the familiar pacman frontend.
 | 
			
		||||
@@ -41,7 +41,9 @@ configuration files dealing with pacman.
 | 
			
		||||
* linkman:makepkg[8]
 | 
			
		||||
* linkman:makepkg.conf[5]
 | 
			
		||||
* linkman:pacman[8]
 | 
			
		||||
* linkman:pacman-key[8]
 | 
			
		||||
* linkman:pacman.conf[5]
 | 
			
		||||
* linkman:pkgdelta[8]
 | 
			
		||||
* linkman:repo-add[8]
 | 
			
		||||
* linkman:vercmp[8]
 | 
			
		||||
 | 
			
		||||
@@ -63,6 +65,8 @@ Releases
 | 
			
		||||
`------------`-------
 | 
			
		||||
Date         Version
 | 
			
		||||
---------------------
 | 
			
		||||
2011-08-10   v3.5.4
 | 
			
		||||
2011-06-07   v3.5.3
 | 
			
		||||
2011-04-18   v3.5.2
 | 
			
		||||
2011-03-23   v3.5.1
 | 
			
		||||
2011-03-16   v3.5.0
 | 
			
		||||
@@ -105,9 +109,9 @@ link:ftp://ftp.archlinux.org/other/pacman/[]. To install, download the newest
 | 
			
		||||
available source tarball, unpack it in a directory, and run the three magic
 | 
			
		||||
commands:
 | 
			
		||||
 | 
			
		||||
    $ ./configure
 | 
			
		||||
    $ make
 | 
			
		||||
    # make install
 | 
			
		||||
	$ ./configure
 | 
			
		||||
	$ make
 | 
			
		||||
	# make install
 | 
			
		||||
 | 
			
		||||
You may wish to read the options presented by `./configure --help` in order to
 | 
			
		||||
set appropriate paths and build options that are correct for your system.
 | 
			
		||||
@@ -130,7 +134,7 @@ these trees).
 | 
			
		||||
 | 
			
		||||
The current development tree can be fetched with the following command:
 | 
			
		||||
 | 
			
		||||
    git clone git://projects.archlinux.org/pacman.git pacman
 | 
			
		||||
	git clone git://projects.archlinux.org/pacman.git pacman
 | 
			
		||||
 | 
			
		||||
which will fetch the full development history into a directory named pacman.
 | 
			
		||||
You can browse the source as well using
 | 
			
		||||
@@ -204,5 +208,5 @@ pacman is Copyright (C) 2006-2011 Pacman Development Team
 | 
			
		||||
version 2 or later.
 | 
			
		||||
 | 
			
		||||
/////
 | 
			
		||||
vim: set ts=2 sw=2 syntax=asciidoc et:
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/////
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet:
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
libalpm(3)
 | 
			
		||||
==========
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/////
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet:
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
makepkg(8)
 | 
			
		||||
==========
 | 
			
		||||
@@ -11,24 +11,24 @@ makepkg - package build utility
 | 
			
		||||
 | 
			
		||||
Synopsis
 | 
			
		||||
--------
 | 
			
		||||
makepkg [options]
 | 
			
		||||
'makepkg' [options]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Description
 | 
			
		||||
-----------
 | 
			
		||||
makepkg is a script to automate the building of packages. The requirements for
 | 
			
		||||
'makepkg' is a script to automate the building of packages. The requirements for
 | 
			
		||||
using the script are a build-capable \*nix platform and a custom build script
 | 
			
		||||
for each package you wish to build (known as a PKGBUILD). See
 | 
			
		||||
linkman:PKGBUILD[5] for details on creating your own build scripts.
 | 
			
		||||
 | 
			
		||||
The advantage to a script-based build is that the work is only done once. Once
 | 
			
		||||
you have the build script for a package, makepkg will do the rest: download and
 | 
			
		||||
you have the build script for a package, 'makepkg' will do the rest: download and
 | 
			
		||||
validate source files, check dependencies, configure the build-time settings,
 | 
			
		||||
build the package, install the package into a temporary root, make
 | 
			
		||||
customizations, generate meta-info, and package the whole thing up for pacman
 | 
			
		||||
to use.
 | 
			
		||||
 | 
			
		||||
NOTE: makepkg uses your current locale by default and does not unset it when
 | 
			
		||||
NOTE: 'makepkg' uses your current locale by default and does not unset it when
 | 
			
		||||
building packages. If you wish to share your build output with others when
 | 
			
		||||
seeking help or for other purposes, you may wish to run "`LC_ALL=C makepkg`" so
 | 
			
		||||
your logs and output are not localized.
 | 
			
		||||
@@ -48,12 +48,8 @@ Options
 | 
			
		||||
*-c, \--clean*::
 | 
			
		||||
	Clean up leftover work files and directories after a successful build.
 | 
			
		||||
 | 
			
		||||
*-C, \--cleancache*::
 | 
			
		||||
	Removes all cached source files from the directory specified in `SRCDEST`
 | 
			
		||||
	in linkman:makepkg.conf[5].
 | 
			
		||||
 | 
			
		||||
*\--config* <file>::
 | 
			
		||||
	Use an alternate config file instead of the `{sysconfdir}/makepkg.conf`
 | 
			
		||||
	Use an alternate config file instead of the +{sysconfdir}/makepkg.conf+
 | 
			
		||||
	default.
 | 
			
		||||
 | 
			
		||||
*-d, \--nodeps*::
 | 
			
		||||
@@ -89,7 +85,13 @@ Options
 | 
			
		||||
	using "`makepkg -g >> PKGBUILD`".
 | 
			
		||||
 | 
			
		||||
*--skipinteg*::
 | 
			
		||||
	Do not perform any integrity checks, just print a warning instead.
 | 
			
		||||
	Do not perform any integrity checks (checksum and PGP) on source files.
 | 
			
		||||
 | 
			
		||||
*\--skipchecksums*::
 | 
			
		||||
	Do not verify checksums of source files.
 | 
			
		||||
 | 
			
		||||
*\--skippgpcheck*::
 | 
			
		||||
	Do not verify PGP signatures of source files.
 | 
			
		||||
 | 
			
		||||
*-h, \--help*::
 | 
			
		||||
	Output syntax and command line options.
 | 
			
		||||
@@ -115,7 +117,7 @@ Options
 | 
			
		||||
 | 
			
		||||
*-o, \--nobuild*::
 | 
			
		||||
	Download and extract files only, but do not build them. Useful with the
 | 
			
		||||
	`\--noextract` option if you wish to tweak the files in src/ before
 | 
			
		||||
	'\--noextract' option if you wish to tweak the files in src/ before
 | 
			
		||||
	building.
 | 
			
		||||
 | 
			
		||||
*-p* <buildscript>::
 | 
			
		||||
@@ -136,6 +138,13 @@ Options
 | 
			
		||||
	dependencies are not found, pacman will try to resolve them. If
 | 
			
		||||
	successful, the missing packages will be downloaded and installed.
 | 
			
		||||
 | 
			
		||||
*-S, \--source*::
 | 
			
		||||
	Do not actually build the package, but build a source-only tarball that
 | 
			
		||||
	does not include sources that can be fetched via a download URL. This is
 | 
			
		||||
	useful for passing a single tarball to another program such as a chroot,
 | 
			
		||||
	remote builder, or a tarball upload. Because integrity checks are verified,
 | 
			
		||||
	all source files of the package need to be present or downloadable.
 | 
			
		||||
 | 
			
		||||
*\--allsource*::
 | 
			
		||||
	Do not actually build the package, but build a source-only tarball that
 | 
			
		||||
	includes all sources, including those that are normally download via
 | 
			
		||||
@@ -143,16 +152,8 @@ Options
 | 
			
		||||
	such as a chroot or remote builder. It will also satisfy requirements of
 | 
			
		||||
	the GPL when distributing binary packages.
 | 
			
		||||
 | 
			
		||||
*\--source*::
 | 
			
		||||
	Do not actually build the package, but build a source-only tarball that
 | 
			
		||||
	does not include sources that can be fetched via a download URL. This is
 | 
			
		||||
	useful for passing a single tarball to another program such as a chroot,
 | 
			
		||||
	remote builder, or a tarball upload. Because integrity checks are verified,
 | 
			
		||||
	all source files of the package need to be present or downloadable.
 | 
			
		||||
 | 
			
		||||
*\--pkg <list>*::
 | 
			
		||||
	Only build listed packages from a split package. The use of quotes is
 | 
			
		||||
	necessary when specifying multiple packages. e.g. `--pkg "pkg1 pkg3"`
 | 
			
		||||
	Only build listed packages from a split package.
 | 
			
		||||
 | 
			
		||||
*\--check*::
 | 
			
		||||
	Run the check() function in the PKGBUILD, overriding the setting in
 | 
			
		||||
@@ -161,6 +162,18 @@ Options
 | 
			
		||||
*\--nocheck*::
 | 
			
		||||
	Do not run the check() function in the PKGBUILD or handle the checkdepends.
 | 
			
		||||
 | 
			
		||||
*\--sign*::
 | 
			
		||||
	Sign the resulting package with gpg, overriding the setting in
 | 
			
		||||
	linkman:makepkg.conf[5].
 | 
			
		||||
 | 
			
		||||
*\--nosign*::
 | 
			
		||||
	Do not create a signature for the built package.
 | 
			
		||||
 | 
			
		||||
*\--key* <key>::
 | 
			
		||||
	Specify a key to use when signing packages, overriding the GPGKEY setting
 | 
			
		||||
	in linkman:makepkg.conf[5]. If not specified in either location, the
 | 
			
		||||
	default key from the keyring will be used.
 | 
			
		||||
 | 
			
		||||
*\--noconfirm*::
 | 
			
		||||
	(Passed to pacman) Prevent pacman from waiting for user input before
 | 
			
		||||
	proceeding with operations.
 | 
			
		||||
@@ -194,6 +207,9 @@ Environment Variables
 | 
			
		||||
	Folder where the downloaded sources will be stored. Overrides the
 | 
			
		||||
	corresponding value defined in linkman:makepkg.conf[5].
 | 
			
		||||
 | 
			
		||||
**BUILDDIR=**"/path/to/folder"::
 | 
			
		||||
	Folder where the package will be built. Overrides the corresponding
 | 
			
		||||
	value defined in linkman:makepkg.conf[5].
 | 
			
		||||
 | 
			
		||||
Configuration
 | 
			
		||||
-------------
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/////
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet:
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
makepkg.conf(5)
 | 
			
		||||
===============
 | 
			
		||||
@@ -70,7 +70,7 @@ Options
 | 
			
		||||
	This is often used to set the number of jobs used, for example, `-j2`.
 | 
			
		||||
	Other flags that make accepts can also be passed.
 | 
			
		||||
 | 
			
		||||
**BUILDENV=(**fakeroot !distcc color !ccache**)**::
 | 
			
		||||
**BUILDENV=(**fakeroot !distcc color !ccache check !sign**)**::
 | 
			
		||||
	This array contains options that affect the build environment, the defaults
 | 
			
		||||
	are shown here. All options should always be left in the array; to enable
 | 
			
		||||
	or disable an option simply remove or place an ``!'' at the front of the
 | 
			
		||||
@@ -96,14 +96,33 @@ Options
 | 
			
		||||
	*check*;;
 | 
			
		||||
		Run the check() function if present in the PKGBUILD. This can be
 | 
			
		||||
		enabled or disabled for individual packages through the use of
 | 
			
		||||
		makepkg's `--check` and `--nocheck` options respectively.
 | 
			
		||||
		makepkg's '\--check' and '\--nocheck' options respectively.
 | 
			
		||||
 | 
			
		||||
	*sign*;;
 | 
			
		||||
		Generate a PGP signature file using GnuPG. This will execute `gpg
 | 
			
		||||
		--detach-sign --use-agent` on the built package to generate a detached
 | 
			
		||||
		signature file, using the GPG agent if it is available. The signature
 | 
			
		||||
		file will be the entire filename of the package with a ``.sig''
 | 
			
		||||
		extension.
 | 
			
		||||
 | 
			
		||||
**DISTCC_HOSTS=**"host1 ..."::
 | 
			
		||||
	If using DistCC, this is used to specify a space-delimited list of hosts
 | 
			
		||||
	running in the DistCC cluster. In addition, you will want to modify your
 | 
			
		||||
	`MAKEFLAGS`.
 | 
			
		||||
 | 
			
		||||
**OPTIONS=(**strip !docs libtool emptydirs zipman**)**::
 | 
			
		||||
**BUILDDIR=**"/path/to/folder"::
 | 
			
		||||
	If this value is not set, packages will by default be built in
 | 
			
		||||
	subdirectories of the directory that makepkg is called from.  This
 | 
			
		||||
	option allows setting the build location to another folder.
 | 
			
		||||
	Incorrect use of `$startdir` in a PKGBUILD may cause building with
 | 
			
		||||
	this option to fail.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
**GPGKEY=**""::
 | 
			
		||||
	Specify a key to use for gpg signing instead of the default key in the
 | 
			
		||||
	keyring. Can be overridden with makepkg's '\--key' option.
 | 
			
		||||
 | 
			
		||||
**OPTIONS=(**strip docs libtool emptydirs zipman purge !upx**)**::
 | 
			
		||||
	This array contains options that affect the default packaging. They are
 | 
			
		||||
	equivalent to options that can be placed in the PKGBUILD; the defaults are
 | 
			
		||||
	shown here. All options should always be left in the array; to enable or
 | 
			
		||||
@@ -135,6 +154,10 @@ Options
 | 
			
		||||
		Remove files specified by the `PURGE_TARGETS` variable from the
 | 
			
		||||
		package.
 | 
			
		||||
 | 
			
		||||
	*upx*;;
 | 
			
		||||
		Compress binary executable files using UPX.  Additional options
 | 
			
		||||
		can be passed to UPX by specifying the `UPXFLAGS` variable.
 | 
			
		||||
 | 
			
		||||
**INTEGRITY_CHECK=(**check1 ...**)**::
 | 
			
		||||
	File integrity checks to use. Multiple checks may be specified; this
 | 
			
		||||
	affects both generation and checking. The current valid options are:
 | 
			
		||||
@@ -192,7 +215,8 @@ Options
 | 
			
		||||
 | 
			
		||||
**PKGEXT=**".pkg.tar.gz", **SRCEXT=**".src.tar.gz"::
 | 
			
		||||
	Sets the compression used when making compiled or source packages. The
 | 
			
		||||
	current valid suffixes are `.tar`, `.tar.gz`, `.tar,bz2` and `.tar.xz`.
 | 
			
		||||
	current valid suffixes are `.tar`, `.tar.gz`, `.tar,bz2`, `.tar.xz`, and
 | 
			
		||||
	`.tar.Z`.
 | 
			
		||||
	Do not touch these unless you know what you are doing.
 | 
			
		||||
 | 
			
		||||
See Also
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										142
									
								
								doc/pacman-key.8.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								doc/pacman-key.8.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,142 @@
 | 
			
		||||
/////
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
pacman-key(8)
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Name
 | 
			
		||||
----
 | 
			
		||||
pacman-key - manage pacman's list of trusted keys
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Synopsis
 | 
			
		||||
--------
 | 
			
		||||
'pacman-key' [options]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Description
 | 
			
		||||
-----------
 | 
			
		||||
'pacman-key' is a wrapper script for GnuPG used to manage pacman's keyring, which
 | 
			
		||||
is the collection of PGP keys used to check signed packages and databases. It
 | 
			
		||||
provides the ability to import and export keys, fetch keys from keyservers and
 | 
			
		||||
update the key trust database.
 | 
			
		||||
 | 
			
		||||
More complex keyring management can be achieved using GnuPG directly combined with
 | 
			
		||||
the '\--homedir' option pointing at the pacman keyring (located in
 | 
			
		||||
+{sysconfdir}/pacman.d/gnupg+ by default).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Options
 | 
			
		||||
-------
 | 
			
		||||
*-a, \--add* [file(s)]::
 | 
			
		||||
	Add the key(s) contained in the specified file or files to pacman's
 | 
			
		||||
	keyring. If a key already exists, update it.
 | 
			
		||||
 | 
			
		||||
*\--config* <file>::
 | 
			
		||||
	Use an alternate config file instead of the +{sysconfdir}/pacman.conf+
 | 
			
		||||
	default.
 | 
			
		||||
 | 
			
		||||
*-d, \--delete* <keyid(s)>::
 | 
			
		||||
	Remove the key(s) identified by the specified keyid(s) from pacman's
 | 
			
		||||
	keyring.
 | 
			
		||||
 | 
			
		||||
*-e, \--export* [keyid(s)]::
 | 
			
		||||
	Export key(s) identified by the specified keyid(s) to 'stdout'. If no keyid
 | 
			
		||||
	is specified, all keys will be exported.
 | 
			
		||||
 | 
			
		||||
*\--edit-key* <keyid(s)>::
 | 
			
		||||
	Present a menu for key management task on the specified keyid(s). Useful
 | 
			
		||||
	for adjusting a keys trust level.
 | 
			
		||||
 | 
			
		||||
*-f, \--finger* [keyid(s)]::
 | 
			
		||||
	List a fingerprint for each specified keyid, or for all known keys if no
 | 
			
		||||
	keyids are specified.
 | 
			
		||||
 | 
			
		||||
*\--gpgdir* <dir>::
 | 
			
		||||
	Set an alternate home directory for GnuPG. If unspecified, the value is
 | 
			
		||||
	read from +{sysconfdir}/pacman.conf+.
 | 
			
		||||
 | 
			
		||||
*-h, \--help*::
 | 
			
		||||
	Output syntax and command line options.
 | 
			
		||||
 | 
			
		||||
*\--import* <dir(s)>::
 | 
			
		||||
	Imports keys from `pubring.gpg` into the public keyring from the specified
 | 
			
		||||
	directories.
 | 
			
		||||
 | 
			
		||||
*\--import-trustdb* <dir(s)> ::
 | 
			
		||||
	Imports ownertrust values from `trustdb.gpg` into the shared trust database
 | 
			
		||||
	from the specified directories.
 | 
			
		||||
 | 
			
		||||
*\--init*::
 | 
			
		||||
	Ensure the keyring is properly initialized and has the required access
 | 
			
		||||
	permissions.
 | 
			
		||||
 | 
			
		||||
*\--keyserver* <keyserver>::
 | 
			
		||||
	Use the specified keyserver if the operation requires one. This will take
 | 
			
		||||
	precedence over any keyserver option specified in a `gpg.conf`
 | 
			
		||||
	configuration file. Running '\--init' with this option will set the default
 | 
			
		||||
	keyserver if one was not already configured.
 | 
			
		||||
 | 
			
		||||
*-l, \--list-keys* [keyid(s)]::
 | 
			
		||||
	Lists all or specified keys from the public keyring.
 | 
			
		||||
 | 
			
		||||
*\--list-sigs* [keyid(s)]::
 | 
			
		||||
	Same as '\--list-keys', but the signatures are listed too.
 | 
			
		||||
 | 
			
		||||
*\--lsign-key* <keyid>::
 | 
			
		||||
	Locally sign the given key. This is primarily used to root the web of trust
 | 
			
		||||
	in the local private key generated by '\--init'.
 | 
			
		||||
 | 
			
		||||
*-r, \--recv-keys* <keyid(s)>::
 | 
			
		||||
	Equivalent to '\--recv-keys' in GnuPG.
 | 
			
		||||
 | 
			
		||||
*\--refresh-keys* [keyid(s)]::
 | 
			
		||||
	Equivalent to '\--refresh-keys' in GnuPG.
 | 
			
		||||
 | 
			
		||||
*\--populate* [keyring(s)]::
 | 
			
		||||
	Reload the default keys from the (optionally provided) keyrings in
 | 
			
		||||
	+{pkgdatadir}/keyrings+. For more information, see
 | 
			
		||||
	<<SC,Providing a Keyring for Import>> below.
 | 
			
		||||
 | 
			
		||||
*-u, \--updatedb*::
 | 
			
		||||
	Equivalent to '\--check-trustdb' in GnuPG.
 | 
			
		||||
 | 
			
		||||
*-v, \--verify* <signature>::
 | 
			
		||||
	Verify the given signature file.
 | 
			
		||||
 | 
			
		||||
*-V, \--version*::
 | 
			
		||||
	Displays the program version.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Providing a Keyring for Import
 | 
			
		||||
------------------------------
 | 
			
		||||
A distribution or other repository provided may want to provide a set of
 | 
			
		||||
PGP keys used in the signing of its packages and repository databases that can
 | 
			
		||||
be readily imported into the pacman keyring. This is achieved by providing a
 | 
			
		||||
PGP keyring file `foo.gpg` that contains the keys for the foo keyring in the
 | 
			
		||||
directory +{pkgdatadir}/keyrings+.
 | 
			
		||||
 | 
			
		||||
Optionally, the file `foo-trusted` can be provided containing a list of trusted
 | 
			
		||||
key IDs for that keyring. This is a file in a format compatible with 'gpg
 | 
			
		||||
\--export-ownertrust' output. This file will inform the user which keys a user
 | 
			
		||||
needs to verify and sign to build a local web of trust, in addition to
 | 
			
		||||
assigning provided owner trust values.
 | 
			
		||||
 | 
			
		||||
Also optionally, the file `foo-revoked` can be provided containing a list of
 | 
			
		||||
revoked key IDs for that keyring. Revoked is defined as "no longer valid for
 | 
			
		||||
any signing", so should be used with prudence. A key being marked as revoked
 | 
			
		||||
will be disabled in the keyring and no longer treated as valid, so this always
 | 
			
		||||
takes priority over it's trusted state in any other keyring.
 | 
			
		||||
 | 
			
		||||
All files are required to be signed (detached) by a trusted PGP key that the
 | 
			
		||||
user must manually import to the pacman keyring. This prevents a potentially
 | 
			
		||||
malicious repository adding keys to the pacman keyring without the users
 | 
			
		||||
knowledge.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
See Also
 | 
			
		||||
--------
 | 
			
		||||
linkman:pacman[8], linkman:pacman.conf[5]
 | 
			
		||||
 | 
			
		||||
include::footer.txt[]
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/////
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet:
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
pacman(8)
 | 
			
		||||
=========
 | 
			
		||||
@@ -13,7 +13,6 @@ Synopsis
 | 
			
		||||
--------
 | 
			
		||||
'pacman' <operation> [options] [targets]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Description
 | 
			
		||||
-----------
 | 
			
		||||
Pacman is a package management utility that tracks installed packages on a Linux
 | 
			
		||||
@@ -35,7 +34,7 @@ read from stdin.
 | 
			
		||||
Operations
 | 
			
		||||
----------
 | 
			
		||||
*-D, \--database*::
 | 
			
		||||
	Modify the package database. This options allows you to modify certain
 | 
			
		||||
	Modify the package database. This operation allows you to modify certain
 | 
			
		||||
	attributes of the installed packages in pacman's database. At the
 | 
			
		||||
	moment, you can only change the install reason using '\--asdeps' and
 | 
			
		||||
	'\--asexplicit' options.
 | 
			
		||||
@@ -69,20 +68,25 @@ Operations
 | 
			
		||||
	interprets ">" as redirection to file.)
 | 
			
		||||
+
 | 
			
		||||
In addition to packages, groups can be specified as well. For example, if
 | 
			
		||||
gnome is a defined package group, then `pacman -S gnome` will install every
 | 
			
		||||
package in the gnome group, as well as the dependencies of those packages.
 | 
			
		||||
gnome is a defined package group, then `pacman -S gnome` will provide a
 | 
			
		||||
prompt allowing you to select which packages to install from a numbered list.
 | 
			
		||||
The package selection is specified using a space separated list of package
 | 
			
		||||
numbers. Sequential packages may be selected by specifying the first and last
 | 
			
		||||
package numbers separated by a hyphen (`-`). Excluding packages is achieved by
 | 
			
		||||
prefixing a number or range of numbers with a caret (`^`).
 | 
			
		||||
+
 | 
			
		||||
Packages which provide other packages are also handled. For example, `pacman -S
 | 
			
		||||
foo` will first look for a foo package. If foo is not found, packages which
 | 
			
		||||
Packages that provide other packages are also handled. For example, `pacman -S
 | 
			
		||||
foo` will first look for a foo package. If foo is not found, packages that
 | 
			
		||||
provide the same functionality as foo will be searched for. If any package is
 | 
			
		||||
found, it will be installed.
 | 
			
		||||
found, it will be installed. A selection prompt is provided if multiple packages
 | 
			
		||||
providing foo are found.
 | 
			
		||||
+
 | 
			
		||||
You can also use `pacman -Su` to upgrade all packages that are out of date. See
 | 
			
		||||
<<SO,Sync Options>> below. When upgrading, pacman performs version comparison
 | 
			
		||||
to determine which packages need upgrading. This behavior operates as follows:
 | 
			
		||||
 | 
			
		||||
  Alphanumeric:
 | 
			
		||||
    1.0a < 1.0alpha < 1.0b < 1.0beta < 1.0p < 1.0pre < 1.0rc < 1.0
 | 
			
		||||
    1.0a < 1.0b < 1.0beta < 1.0p < 1.0pre < 1.0rc < 1.0 < 1.0.a < 1.0.1
 | 
			
		||||
  Numeric:
 | 
			
		||||
    1 < 1.0 < 1.1 < 1.1.1 < 1.2 < 2.0 < 3.0.0
 | 
			
		||||
+
 | 
			
		||||
@@ -94,7 +98,7 @@ greater than `1:3.6-1`.
 | 
			
		||||
*-T, \--deptest*::
 | 
			
		||||
	Check dependencies; this is useful in scripts such as makepkg to check
 | 
			
		||||
	installed packages. This operation will check each dependency specified and
 | 
			
		||||
	return a list of those which are not currently satisfied on the system.
 | 
			
		||||
	return a list of dependencies that are not currently satisfied on the system.
 | 
			
		||||
	This operation accepts no other options. Example usage: `pacman -T qt
 | 
			
		||||
	"bash>=3.2"`.
 | 
			
		||||
 | 
			
		||||
@@ -117,7 +121,7 @@ Options
 | 
			
		||||
-------
 | 
			
		||||
*-b, \--dbpath* <path>::
 | 
			
		||||
	Specify an alternative database location (a typical default is
 | 
			
		||||
	`{localstatedir}/lib/pacman`). This should not be used unless you know what you are
 | 
			
		||||
	+{localstatedir}/lib/pacman+). This should not be used unless you know what you are
 | 
			
		||||
	doing. *NOTE*: if specified, this is an absolute path and the root path is
 | 
			
		||||
	not automatically prepended.
 | 
			
		||||
 | 
			
		||||
@@ -125,7 +129,7 @@ Options
 | 
			
		||||
	Specify an alternative installation root (default is `/`). This should
 | 
			
		||||
	not be used as a way to install software into `/usr/local` instead of
 | 
			
		||||
	`/usr`. This option is used if you want to install a package on a
 | 
			
		||||
	temporary mounted partition which is "owned" by another system.
 | 
			
		||||
	temporary mounted partition that is "owned" by another system.
 | 
			
		||||
	*NOTE*: if database path or logfile are not specified on either the
 | 
			
		||||
	command line or in linkman:pacman.conf[5], their default location will
 | 
			
		||||
	be inside this root path.
 | 
			
		||||
@@ -138,7 +142,7 @@ Options
 | 
			
		||||
 | 
			
		||||
*\--cachedir* <dir>::
 | 
			
		||||
	Specify an alternative package cache location (a typical default is
 | 
			
		||||
	`{localstatedir}/cache/pacman/pkg`). Multiple cache directories can be specified,
 | 
			
		||||
	+{localstatedir}/cache/pacman/pkg+). Multiple cache directories can be specified,
 | 
			
		||||
	and they are tried in the order they are passed to pacman. *NOTE*: this
 | 
			
		||||
	is an absolute path, the root path is not automatically prepended.
 | 
			
		||||
 | 
			
		||||
@@ -149,6 +153,14 @@ Options
 | 
			
		||||
	Display debug messages. When reporting bugs, this option is recommended
 | 
			
		||||
	to be used.
 | 
			
		||||
 | 
			
		||||
*\--gpgdir* <dir>::
 | 
			
		||||
	Specify a directory of files used by GnuPG to verify package signatures (a
 | 
			
		||||
	typical default is +{sysconfdir}/pacman.d/gnupg+). This directory should contain
 | 
			
		||||
	two files: `pubring.gpg` and `trustdb.gpg`. `pubring.gpg` holds the public keys
 | 
			
		||||
	of all packagers. `trustdb.gpg` contains a so-called trust database, which
 | 
			
		||||
	specifies that the keys are authentic and trusted. *NOTE*: this is an absolute
 | 
			
		||||
	path, the root path is not automatically prepended.
 | 
			
		||||
 | 
			
		||||
*\--logfile* <file>::
 | 
			
		||||
	Specify an alternate log file. This is an absolute path, regardless of
 | 
			
		||||
	the installation root setting.
 | 
			
		||||
@@ -165,7 +177,7 @@ Transaction Options (apply to '-S', '-R' and '-U')
 | 
			
		||||
	dependencies are installed and there are no package conflicts in the
 | 
			
		||||
	system. Specify this option twice to skip all dependency checks.
 | 
			
		||||
 | 
			
		||||
*-k, \--dbonly*::
 | 
			
		||||
*\--dbonly*::
 | 
			
		||||
	Adds/Removes the database entry only, leaves all files in place.
 | 
			
		||||
 | 
			
		||||
*\--noprogressbar*::
 | 
			
		||||
@@ -217,6 +229,17 @@ Upgrade Options (apply to '-S' and '-U')[[UO]]
 | 
			
		||||
	there is one available. Multiple groups can be specified by
 | 
			
		||||
	separating them with a comma.
 | 
			
		||||
 | 
			
		||||
*\--needed*::
 | 
			
		||||
	Do not reinstall the targets that are already up to date.
 | 
			
		||||
 | 
			
		||||
*\--recursive*::
 | 
			
		||||
	Recursively reinstall all dependencies of the targets. This forces upgrades
 | 
			
		||||
	or reinstalls of all dependencies without requiring explicit version
 | 
			
		||||
	requirements. This is most useful in combination with the '\--needed' flag,
 | 
			
		||||
	which will induce a deep dependency upgrade without any unnecessary
 | 
			
		||||
	reinstalls.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Query Options[[QO]]
 | 
			
		||||
-------------------
 | 
			
		||||
*-c, \--changelog*::
 | 
			
		||||
@@ -230,7 +253,7 @@ Query Options[[QO]]
 | 
			
		||||
 | 
			
		||||
*-e, \--explicit*::
 | 
			
		||||
	Restrict or filter output to explicitly installed packages. This option
 | 
			
		||||
	can be combined with '-t' to list explicitly installed packages which
 | 
			
		||||
	can be combined with '-t' to list explicitly installed packages that
 | 
			
		||||
	are not required by any other package.
 | 
			
		||||
 | 
			
		||||
*-g, \--groups*::
 | 
			
		||||
@@ -366,12 +389,14 @@ linkman:pacman.conf[5].
 | 
			
		||||
	report of all packages to upgrade will be presented and  the operation
 | 
			
		||||
	will not proceed without user confirmation. Dependencies are
 | 
			
		||||
	automatically resolved at this level and will be installed/upgraded if
 | 
			
		||||
	necessary. Pass this option twice to enable package downgrade; in this
 | 
			
		||||
	case pacman will select sync packages whose version does not match with
 | 
			
		||||
	the local version. This can be useful when the user switches from a testing
 | 
			
		||||
	repo to a stable one. Additional targets can also be specified manually, so
 | 
			
		||||
	that '-Su foo' will do a system upgrade and install/upgrade the foo package in
 | 
			
		||||
	the same operation.
 | 
			
		||||
	necessary.
 | 
			
		||||
+
 | 
			
		||||
Pass this option twice to enable package downgrade; in this case pacman will
 | 
			
		||||
select sync packages whose version does not match with the local version.  This
 | 
			
		||||
can be useful when the user switches from a testing repo to a stable one.
 | 
			
		||||
+
 | 
			
		||||
Additional targets can also be specified manually, so that '-Su foo' will do a
 | 
			
		||||
system upgrade and install/upgrade the foo package in the same operation.
 | 
			
		||||
 | 
			
		||||
*-w, \--downloadonly*::
 | 
			
		||||
	Retrieve all packages from the server, but do not install/upgrade anything.
 | 
			
		||||
@@ -384,7 +409,14 @@ linkman:pacman.conf[5].
 | 
			
		||||
	to date.
 | 
			
		||||
 | 
			
		||||
*\--needed*::
 | 
			
		||||
	Don't reinstall the targets that are already up to date.
 | 
			
		||||
	Do not reinstall the targets that are already up to date.
 | 
			
		||||
 | 
			
		||||
*\--recursive*::
 | 
			
		||||
	Recursively reinstall all dependencies of the targets. This forces upgrades
 | 
			
		||||
	or reinstalls of all dependencies without requiring explicit version
 | 
			
		||||
	requirements. This is most useful in combination with the '\--needed' flag,
 | 
			
		||||
	which will induce a deep dependency upgrade without any unnecessary
 | 
			
		||||
	reinstalls.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Handling Config Files[[HCF]]
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/////
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet:
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
pacman.conf(5)
 | 
			
		||||
==============
 | 
			
		||||
@@ -35,7 +35,7 @@ NoUpgrade = etc/passwd etc/group etc/shadow
 | 
			
		||||
NoUpgrade = etc/fstab
 | 
			
		||||
 | 
			
		||||
[core]
 | 
			
		||||
Include = {sysconfdir}/pacman.d/core
 | 
			
		||||
Include = /etc/pacman.d/core
 | 
			
		||||
 | 
			
		||||
[custom]
 | 
			
		||||
Server = file:///home/pkgs
 | 
			
		||||
@@ -57,22 +57,31 @@ Options
 | 
			
		||||
 | 
			
		||||
*DBPath =* path/to/db/dir::
 | 
			
		||||
	Overrides the default location of the toplevel database directory.  A
 | 
			
		||||
	typical default is `{localstatedir}/lib/pacman/`. Most users will not need to set
 | 
			
		||||
	typical default is +{localstatedir}/lib/pacman/+. Most users will not need to set
 | 
			
		||||
	this option. *NOTE*: if specified, this is an absolute path and the root
 | 
			
		||||
	path is not automatically prepended.
 | 
			
		||||
 | 
			
		||||
*CacheDir =* path/to/cache/dir::
 | 
			
		||||
	Overrides the default location of the package cache directory. A typical
 | 
			
		||||
	default is `{localstatedir}/cache/pacman/pkg/`. Multiple cache directories can be
 | 
			
		||||
	default is +{localstatedir}/cache/pacman/pkg/+. Multiple cache directories can be
 | 
			
		||||
	specified, and they are tried in the order they are listed in the config
 | 
			
		||||
	file. If a file is not found in any cache directory, it will be downloaded
 | 
			
		||||
	to the first cache directory with write access. *NOTE*: this is an absolute
 | 
			
		||||
	path, the root path is not automatically prepended.
 | 
			
		||||
 | 
			
		||||
*GPGDir =* path/to/gpg/dir::
 | 
			
		||||
	Overrides the default location of the directory containing configuration
 | 
			
		||||
	files for GnuPG. A typical default is +{sysconfdir}/pacman.d/gnupg/+.
 | 
			
		||||
	This directory should contain two files: `pubring.gpg` and `trustdb.gpg`.
 | 
			
		||||
	`pubring.gpg` holds the public keys of all packagers. `trustdb.gpg`
 | 
			
		||||
	contains a so-called trust database, which specifies that the keys are
 | 
			
		||||
	authentic and trusted.
 | 
			
		||||
	*NOTE*: this is an absolute path, the root path is not automatically
 | 
			
		||||
	prepended.
 | 
			
		||||
 | 
			
		||||
*LogFile =* '/path/to/file'::
 | 
			
		||||
	Overrides the default location of the pacman log file. A typical default
 | 
			
		||||
	is `{localstatedir}/log/pacman.log`. This is an absolute path and the root directory
 | 
			
		||||
	is +{localstatedir}/log/pacman.log+. This is an absolute path and the root directory
 | 
			
		||||
	is not prepended.
 | 
			
		||||
 | 
			
		||||
*HoldPkg =* package ...::
 | 
			
		||||
@@ -147,12 +156,13 @@ Options
 | 
			
		||||
	packages are only cleaned if not installed locally and not present in any
 | 
			
		||||
	known sync database.
 | 
			
		||||
 | 
			
		||||
*SigLevel =* ...::
 | 
			
		||||
	Set the default signature verification level. For more information, see
 | 
			
		||||
	<<SC,Package and Database Signature Checking>> below.
 | 
			
		||||
 | 
			
		||||
*UseSyslog*::
 | 
			
		||||
	Log action messages through syslog(). This will insert log entries into
 | 
			
		||||
	`{localstatedir}/log/messages` or equivalent.
 | 
			
		||||
 | 
			
		||||
*ShowSize*::
 | 
			
		||||
	Display the size of individual packages for '\--sync' and '\--query' modes.
 | 
			
		||||
	+{localstatedir}/log/messages+ or equivalent.
 | 
			
		||||
 | 
			
		||||
*UseDelta*::
 | 
			
		||||
	Download delta files instead of complete packages if possible.  Requires
 | 
			
		||||
@@ -168,6 +178,10 @@ Options
 | 
			
		||||
	Performs an approximate check for adequate available disk space before
 | 
			
		||||
	installing packages.
 | 
			
		||||
 | 
			
		||||
*VerbosePkgLists*::
 | 
			
		||||
	Displays name, version and size of target packages formatted
 | 
			
		||||
	as a table for upgrade, sync and remove operations.
 | 
			
		||||
 | 
			
		||||
Repository Sections
 | 
			
		||||
-------------------
 | 
			
		||||
Each repository section defines a section name and at least one location where
 | 
			
		||||
@@ -183,27 +197,99 @@ contain a file that lists the servers for that repository.
 | 
			
		||||
 | 
			
		||||
--------
 | 
			
		||||
[core]
 | 
			
		||||
# use this repository first
 | 
			
		||||
Server = ftp://ftp.archlinux.org/core/os/arch
 | 
			
		||||
# use this server first
 | 
			
		||||
Server = ftp://ftp.archlinux.org/$repo/os/$arch
 | 
			
		||||
# next use servers as defined in the mirrorlist below
 | 
			
		||||
Include = {sysconfdir}/pacman.d/mirrorlist
 | 
			
		||||
--------
 | 
			
		||||
 | 
			
		||||
During parsing, pacman will define the `$repo` variable to the name of the
 | 
			
		||||
current section. This is often utilized in files specified using the 'Include'
 | 
			
		||||
directive so all repositories can use the same mirrorfile. pacman also defines
 | 
			
		||||
the `$arch` variable to the value of `Architecture`, so the same mirrorfile can
 | 
			
		||||
even be used for different architectures.
 | 
			
		||||
 | 
			
		||||
--------
 | 
			
		||||
Server = ftp://ftp.archlinux.org/$repo/os/$arch
 | 
			
		||||
--------
 | 
			
		||||
 | 
			
		||||
The order of repositories in the configuration files matters; repositories
 | 
			
		||||
listed first will take precedence over those listed later in the file when
 | 
			
		||||
packages in two repositories have identical names, regardless of version
 | 
			
		||||
number.
 | 
			
		||||
 | 
			
		||||
*Include =* path::
 | 
			
		||||
	Include another config file. This file can include repositories or
 | 
			
		||||
	general configuration options. Wildcards in the specified paths will get
 | 
			
		||||
	expanded based on linkman:glob[7] rules.
 | 
			
		||||
 | 
			
		||||
*Server =* url::
 | 
			
		||||
	A full URL to a location where the database, packages, and signatures (if
 | 
			
		||||
	available) for this repository can be found.
 | 
			
		||||
+
 | 
			
		||||
During parsing, pacman will define the `$repo` variable to the name of the
 | 
			
		||||
current section. This is often utilized in files specified using the 'Include'
 | 
			
		||||
directive so all repositories can use the same mirrorfile. pacman also defines
 | 
			
		||||
the `$arch` variable to the value of `Architecture`, so the same mirrorfile can
 | 
			
		||||
even be used for different architectures.
 | 
			
		||||
 | 
			
		||||
*SigLevel =* ...::
 | 
			
		||||
	Set the signature verification level for this repository. For more
 | 
			
		||||
	information, see <<SC,Package and Database Signature Checking>> below.
 | 
			
		||||
 | 
			
		||||
Package and Database Signature Checking
 | 
			
		||||
---------------------------------------
 | 
			
		||||
The 'SigLevel' directive is valid in both the `[options]` and repository
 | 
			
		||||
sections. If used in `[options]`, it sets a default value for any repository
 | 
			
		||||
that does not provide the setting.
 | 
			
		||||
 | 
			
		||||
* If set to *Never*, no signature checking will take place.
 | 
			
		||||
* If set to *Optional* , signatures will be checked when present, but unsigned
 | 
			
		||||
  databases and packages will also be accepted.
 | 
			
		||||
* If set to *Required*, signatures will be required on all packages and
 | 
			
		||||
  databases.
 | 
			
		||||
 | 
			
		||||
Alternatively, you can get more fine-grained control by combining some of
 | 
			
		||||
the options and prefixes described below. All options in a config file are
 | 
			
		||||
processed in top-to-bottom, left-to-right fashion, where later options override
 | 
			
		||||
and/or supplement earlier ones. If 'SigLevel' is specified in a repository
 | 
			
		||||
section, the starting value is that from the `[options]` section, or the
 | 
			
		||||
built-in system default as shown below if not specified.
 | 
			
		||||
 | 
			
		||||
The options are split into two main groups, described below. Terms used such as
 | 
			
		||||
``marginally trusted'' are terms used by GnuPG, for more information please
 | 
			
		||||
consult linkman:gpg[1].
 | 
			
		||||
 | 
			
		||||
When to Check::
 | 
			
		||||
	These options control if and when signature checks should take place.
 | 
			
		||||
 | 
			
		||||
	*Never*;;
 | 
			
		||||
		All signature checking is suppressed, even if signatures are present.
 | 
			
		||||
 | 
			
		||||
	*Optional* (default);;
 | 
			
		||||
		Signatures are checked if present; absence of a signature is not an
 | 
			
		||||
		error. An invalid signature is a fatal error, as is a signature from a
 | 
			
		||||
		key not in the keyring.
 | 
			
		||||
 | 
			
		||||
	*Required*;;
 | 
			
		||||
		Signatures are required; absence of a signature or an invalid signature
 | 
			
		||||
		is a fatal error, as is a signature from a key not in the keyring.
 | 
			
		||||
 | 
			
		||||
What is Allowed::
 | 
			
		||||
	These options control what signatures are viewed as permissible. Note that
 | 
			
		||||
	neither of these options allows acceptance of invalid or expired
 | 
			
		||||
	signatures, or those from revoked keys.
 | 
			
		||||
 | 
			
		||||
	*TrustedOnly* (default);;
 | 
			
		||||
		If a signature is checked, it must be in the keyring and fully trusted;
 | 
			
		||||
		marginal trust does not meet this criteria.
 | 
			
		||||
 | 
			
		||||
	*TrustAll*;;
 | 
			
		||||
		If a signature is checked, it must be in the keyring, but is not
 | 
			
		||||
		required to be assigned a trust level (e.g., unknown or marginal
 | 
			
		||||
		trust).
 | 
			
		||||
 | 
			
		||||
Options in both groups can additionally be prefixed with either *Package* or
 | 
			
		||||
*Database*, which will cause it to only take effect on the specified object
 | 
			
		||||
type. For example, `PackageTrustAll` would allow marginal and unknown trust
 | 
			
		||||
level signatures for packages.
 | 
			
		||||
 | 
			
		||||
The built-in default is the following:
 | 
			
		||||
 | 
			
		||||
--------
 | 
			
		||||
SigLevel = Optional TrustedOnly
 | 
			
		||||
--------
 | 
			
		||||
 | 
			
		||||
Using Your Own Repository
 | 
			
		||||
-------------------------
 | 
			
		||||
If you have numerous custom packages of your own, it is often easier to generate
 | 
			
		||||
@@ -215,11 +301,12 @@ directory with these packages so pacman can find it when run with '\--refresh'.
 | 
			
		||||
 | 
			
		||||
The above command will generate a compressed database named
 | 
			
		||||
'/home/pkgs/custom.db.tar.gz'. Note that the database must be of the form
 | 
			
		||||
'{treename}.db.tar.gz', where '{treename}' is the name of the section defined in
 | 
			
		||||
the configuration file. That's it! Now configure your custom section in the
 | 
			
		||||
configuration file as shown in the config example above. Pacman will now use your
 | 
			
		||||
package repository. If you add new packages to the repository, remember to
 | 
			
		||||
re-generate the database and use pacman's '\--refresh' option.
 | 
			
		||||
'\{treename\}.db.tar.{ext}', where '\{treename\}' is the name of the section
 | 
			
		||||
defined in the configuration file and '\{ext\}' is a valid compression type as
 | 
			
		||||
documented in linkman:repo-add[8]. That's it! Now configure your custom section
 | 
			
		||||
in the configuration file as shown in the config example above. Pacman will now
 | 
			
		||||
use your package repository. If you add new packages to the repository,
 | 
			
		||||
remember to re-generate the database and use pacman's '\--refresh' option.
 | 
			
		||||
 | 
			
		||||
For more information on the repo-add command, see ``repo-add \--help'' or
 | 
			
		||||
linkman:repo-add[8].
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										42
									
								
								doc/pkgdelta.8.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								doc/pkgdelta.8.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
/////
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
pkgdelta(8)
 | 
			
		||||
=========
 | 
			
		||||
 | 
			
		||||
Name
 | 
			
		||||
----
 | 
			
		||||
pkgdelta - package delta generation utility
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Synopsis
 | 
			
		||||
--------
 | 
			
		||||
'pkgdelta' [-q] <package1> <package2>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Description
 | 
			
		||||
-----------
 | 
			
		||||
'pkgdelta' is used to create package delta files between two versions of the
 | 
			
		||||
same package. These files are essentially binary patches. linkman:pacman[8] can
 | 
			
		||||
download deltas instead of full package upgrades, and use them with the
 | 
			
		||||
previous versions of packages (in the package cache) to synthesize the upgraded
 | 
			
		||||
version of the packages. This likely reduces download sizes for upgrades
 | 
			
		||||
significantly.
 | 
			
		||||
 | 
			
		||||
'pkgdelta' requires linkman:xdelta3[1] to do its job.
 | 
			
		||||
 | 
			
		||||
Options
 | 
			
		||||
-------
 | 
			
		||||
*-q, \--quiet*::
 | 
			
		||||
	Be quiet. Do not output anything but warnings and errors.
 | 
			
		||||
 | 
			
		||||
Examples
 | 
			
		||||
--------
 | 
			
		||||
 | 
			
		||||
  $ pkgdelta libreoffice-3.3.2-1-x86_64.pkg.tar.xz libreoffice-3.3.2-2-x86_64.pkg.tar.xz
 | 
			
		||||
 | 
			
		||||
See Also
 | 
			
		||||
--------
 | 
			
		||||
linkman:pacman[8], linkman:xdelta3[1]
 | 
			
		||||
 | 
			
		||||
include::footer.txt[]
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/////
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet:
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
repo-add(8)
 | 
			
		||||
==========
 | 
			
		||||
@@ -10,26 +10,55 @@ repo-add - package database maintenance utility
 | 
			
		||||
 | 
			
		||||
Synopsis
 | 
			
		||||
--------
 | 
			
		||||
repo-add [-d] [-f] [-q] <path-to-db> <package1> [<package2> ...]
 | 
			
		||||
'repo-add' [options] <path-to-db> <package|delta> [<package|delta> ...]
 | 
			
		||||
 | 
			
		||||
repo-remove [-q] <path-to-db> <packagename> [<packagename2> ...]
 | 
			
		||||
'repo-remove' [options] <path-to-db> <packagename|delta> [<packagename|delta> ...]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Description
 | 
			
		||||
-----------
 | 
			
		||||
repo-add and repo-remove are two scripts to help build a package database for
 | 
			
		||||
'repo-add' and 'repo-remove' are two scripts to help build a package database for
 | 
			
		||||
packages built with linkman:makepkg[8] and installed with linkman:pacman[8].
 | 
			
		||||
They also handle package deltas produced by linkman:pkgdelta[8].
 | 
			
		||||
 | 
			
		||||
repo-add will update a package database by reading a built package file.
 | 
			
		||||
Multiple packages to add can be specified on the command line.
 | 
			
		||||
'repo-add' will update a package database by reading a built package or package
 | 
			
		||||
delta file. Multiple packages and/or deltas to add can be specified on the
 | 
			
		||||
command line.
 | 
			
		||||
 | 
			
		||||
repo-remove will update a package database by removing the package name
 | 
			
		||||
specified on the command line. Multiple packages to remove can be specified
 | 
			
		||||
on the command line.
 | 
			
		||||
'repo-remove' will update a package database by removing the package name or
 | 
			
		||||
delta specified on the command line. Multiple packages and/or delta to remove
 | 
			
		||||
can be specified on the command line.
 | 
			
		||||
 | 
			
		||||
A package database is a tar file, optionally compressed. Valid extensions are
 | 
			
		||||
``.db'' or ``.files'' followed by an archive extension of ``.tar'',
 | 
			
		||||
``.tar.gz'', ``.tar.bz2'', ``.tar.xz'', or ``.tar.Z''. The file does not need
 | 
			
		||||
to exist, but all parent directories must exist.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Options
 | 
			
		||||
-------
 | 
			
		||||
Common Options
 | 
			
		||||
--------------
 | 
			
		||||
*-q, \--quiet*::
 | 
			
		||||
	Force this program to keep quiet and run silent except for warning and
 | 
			
		||||
	error messages.
 | 
			
		||||
 | 
			
		||||
*-s, \--sign*::
 | 
			
		||||
	Generate a PGP signature file using GnuPG. This will execute `gpg
 | 
			
		||||
	--detach-sign --use-agent` on the generated database to generate a detached
 | 
			
		||||
	signature file, using the GPG agent if it is available. The signature file
 | 
			
		||||
	will be the entire filename of the database with a ``.sig'' extension.
 | 
			
		||||
 | 
			
		||||
*-k, \--key* <key>::
 | 
			
		||||
	Specify a key to use when signing packages. Can also be specified using
 | 
			
		||||
	the GPGKEY environmental variable. If not specified in either location, the
 | 
			
		||||
	default key from the keyring will be used.
 | 
			
		||||
 | 
			
		||||
*-v, \--verify*::
 | 
			
		||||
	Verify the PGP signature of the database before updating the database.
 | 
			
		||||
	If the signature is invalid, an error is produced and the update does not
 | 
			
		||||
	proceed.
 | 
			
		||||
 | 
			
		||||
repo-add Options
 | 
			
		||||
----------------
 | 
			
		||||
*-d, \--delta*::
 | 
			
		||||
	Automatically generate and add a delta file between the old entry and the
 | 
			
		||||
	new one, if the old package file is found next to the new one.
 | 
			
		||||
@@ -39,12 +68,8 @@ Options
 | 
			
		||||
	specified packages. This is useful for creating databases listing all files
 | 
			
		||||
	in a given sync repository for tools that may use this information.
 | 
			
		||||
 | 
			
		||||
*-q, \--quiet*::
 | 
			
		||||
	Force this program to keep quiet and run silent except for warning and
 | 
			
		||||
	error messages.
 | 
			
		||||
 | 
			
		||||
See Also
 | 
			
		||||
--------
 | 
			
		||||
linkman:makepkg[8], linkman:pacman[8]
 | 
			
		||||
linkman:makepkg[8], linkman:pacman[8], linkman:pkgdelta[8]
 | 
			
		||||
 | 
			
		||||
include::footer.txt[]
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@ started with GIT if you have not worked with it before.
 | 
			
		||||
 | 
			
		||||
The pacman code can be fetched using the following command:
 | 
			
		||||
 | 
			
		||||
    git clone git://projects.archlinux.org/pacman.git
 | 
			
		||||
	git clone git://projects.archlinux.org/pacman.git
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Creating your patch
 | 
			
		||||
@@ -32,7 +32,7 @@ Creating your patch
 | 
			
		||||
The -s allows you to credit yourself by adding a "Signed Off By" line to
 | 
			
		||||
indicate who has "signed" the patch - who has approved it.
 | 
			
		||||
 | 
			
		||||
    Signed-off-by: Aaron Griffin <aaron@archlinux.org>
 | 
			
		||||
	Signed-off-by: Aaron Griffin <aaron@archlinux.org>
 | 
			
		||||
 | 
			
		||||
Please use your real name and email address. Feel free to "scramble" the
 | 
			
		||||
address if you're afraid of spam.
 | 
			
		||||
@@ -94,5 +94,5 @@ aren't their own.
 | 
			
		||||
--
 | 
			
		||||
 | 
			
		||||
/////
 | 
			
		||||
vim: set ts=2 sw=2 syntax=asciidoc et:
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
 
 | 
			
		||||
@@ -40,15 +40,15 @@ not worried about any local translations being overwritten. The .tx/ directory
 | 
			
		||||
is checked into the git repository so is preconfigured with the two project
 | 
			
		||||
resources (See `tx status` output for a quick overview).
 | 
			
		||||
 | 
			
		||||
    tx pull -f
 | 
			
		||||
    poedit po/<mylang>.po
 | 
			
		||||
    poedit lib/libalpm/po/<mylang>.po
 | 
			
		||||
    tx push -t -l <mylang>
 | 
			
		||||
	tx pull -f
 | 
			
		||||
	poedit po/<mylang>.po
 | 
			
		||||
	poedit lib/libalpm/po/<mylang>.po
 | 
			
		||||
	tx push -t -l <mylang>
 | 
			
		||||
 | 
			
		||||
Or to just push one of the two available resources:
 | 
			
		||||
 | 
			
		||||
    tx push -r archlinux-pacman.pacman-pot -t -l fi
 | 
			
		||||
    tx push -r archlinux-pacman.libalpm-pot -t -l fi
 | 
			
		||||
	tx push -r archlinux-pacman.pacman-pot -t -l fi
 | 
			
		||||
	tx push -r archlinux-pacman.libalpm-pot -t -l fi
 | 
			
		||||
 | 
			
		||||
See the <<Notes,Notes>> section for additional hints on translating.
 | 
			
		||||
 | 
			
		||||
@@ -79,7 +79,7 @@ Incremental Updates
 | 
			
		||||
If you have more advanced needs you will have to get a copy of the pacman
 | 
			
		||||
repository.
 | 
			
		||||
 | 
			
		||||
    git clone git://projects.archlinux.org/pacman.git pacman
 | 
			
		||||
	git clone git://projects.archlinux.org/pacman.git pacman
 | 
			
		||||
 | 
			
		||||
Next, you will need to run `./autogen.sh` and `./configure` in the base
 | 
			
		||||
directory to generate the correct Makefiles. At this point, all necessary
 | 
			
		||||
@@ -91,11 +91,11 @@ We need to first update the main message catalog file. Navigate into either the
 | 
			
		||||
work on first, and execute the following command.  If you are working in the
 | 
			
		||||
`po/` tree, replace 'libalpm.pot' with 'pacman.pot':
 | 
			
		||||
 | 
			
		||||
    make libalpm.pot-update
 | 
			
		||||
	make libalpm.pot-update
 | 
			
		||||
 | 
			
		||||
Next, update your specific language's translation file:
 | 
			
		||||
 | 
			
		||||
    make <po file>-update
 | 
			
		||||
	make <po file>-update
 | 
			
		||||
 | 
			
		||||
At this point, you can do the translation. To submit your changes, either email
 | 
			
		||||
the new `.po` file to the mailing-list with *[translation]* in the subject, or
 | 
			
		||||
@@ -104,7 +104,7 @@ submit a GIT-formatted patch (please do not include any `.pot` file changes).
 | 
			
		||||
As a shortcut, all translation files (including `.pot` files) can be updated
 | 
			
		||||
with the following command:
 | 
			
		||||
 | 
			
		||||
    make update-po
 | 
			
		||||
	make update-po
 | 
			
		||||
 | 
			
		||||
Adding a New Language
 | 
			
		||||
~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
@@ -133,16 +133,16 @@ msgid and msgstr 'variables' can be on as many lines as necessary. Line breaks
 | 
			
		||||
are ignored- if you need a literal line break, use an `\n` in your string. The
 | 
			
		||||
following two translations are equivalent:
 | 
			
		||||
 | 
			
		||||
    msgstr "This is a test translation"
 | 
			
		||||
	msgstr "This is a test translation"
 | 
			
		||||
 | 
			
		||||
    msgstr ""
 | 
			
		||||
    "This is a test translation"
 | 
			
		||||
	msgstr ""
 | 
			
		||||
	"This is a test translation"
 | 
			
		||||
 | 
			
		||||
If you want to test the translation (for example, the frontend one):
 | 
			
		||||
 | 
			
		||||
    rm *.gmo stamp-po
 | 
			
		||||
    make
 | 
			
		||||
    cp <lang code>.gmo /usr/share/locale/<lang code>/LC_MESSAGES/pacman.mo
 | 
			
		||||
	rm *.gmo stamp-po
 | 
			
		||||
	make
 | 
			
		||||
	cp <lang code>.gmo /usr/share/locale/<lang code>/LC_MESSAGES/pacman.mo
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Translating Manpages
 | 
			
		||||
@@ -160,5 +160,5 @@ check there first before undergoing a translation effort to ensure you are not
 | 
			
		||||
duplicating efforts.
 | 
			
		||||
 | 
			
		||||
/////
 | 
			
		||||
vim: set ts=2 sw=2 syntax=asciidoc et:
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/////
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet:
 | 
			
		||||
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
 | 
			
		||||
/////
 | 
			
		||||
vercmp(8)
 | 
			
		||||
=========
 | 
			
		||||
@@ -26,7 +26,7 @@ numbers. It outputs values as follows:
 | 
			
		||||
Version comparsion operates as follows:
 | 
			
		||||
 | 
			
		||||
  Alphanumeric:
 | 
			
		||||
    1.0a < 1.0alpha < 1.0b < 1.0beta < 1.0p < 1.0pre < 1.0rc < 1.0
 | 
			
		||||
    1.0a < 1.0b < 1.0beta < 1.0p < 1.0pre < 1.0rc < 1.0 < 1.0.a < 1.0.1
 | 
			
		||||
  Numeric:
 | 
			
		||||
    1 < 1.0 < 1.1 < 1.1.1 < 1.2 < 2.0 < 3.0.0
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,12 +19,11 @@ edit = sed \
 | 
			
		||||
	-e 's|@CARCH[@]|$(CARCH)|g' \
 | 
			
		||||
	-e 's|@CHOST[@]|$(CHOST)|g' \
 | 
			
		||||
	-e 's|@ARCHSWITCH[@]|$(ARCHSWITCH)|g' \
 | 
			
		||||
	-e 's|@CARCHFLAGS[@]|$(CARCHFLAGS)|g' \
 | 
			
		||||
	-e 's|@ROOTDIR[@]|$(ROOTDIR)|g'
 | 
			
		||||
 | 
			
		||||
$(dist_sysconf_DATA): Makefile
 | 
			
		||||
	@echo '    ' GEN $@;
 | 
			
		||||
	@rm -f $@ $@.tmp
 | 
			
		||||
	@$(RM) $@ $@.tmp
 | 
			
		||||
	@$(edit) `test -f ./$@.in || echo $(srcdir)/`$@.in >$@.tmp
 | 
			
		||||
	@mv $@.tmp $@
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,16 +8,16 @@
 | 
			
		||||
#
 | 
			
		||||
#-- The download utilities that makepkg should use to acquire sources
 | 
			
		||||
#  Format: 'protocol::agent'
 | 
			
		||||
DLAGENTS=('ftp::/usr/bin/wget -c --passive-ftp -t 3 --waitretry=3 -O %o %u'
 | 
			
		||||
          'http::/usr/bin/wget -c -t 3 --waitretry=3 -O %o %u'
 | 
			
		||||
          'https::/usr/bin/wget -c -t 3 --waitretry=3 --no-check-certificate -O %o %u'
 | 
			
		||||
DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
 | 
			
		||||
          'http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
 | 
			
		||||
          'https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
 | 
			
		||||
          'rsync::/usr/bin/rsync -z %u %o'
 | 
			
		||||
          'scp::/usr/bin/scp -C %u %o')
 | 
			
		||||
 | 
			
		||||
# Other common tools:
 | 
			
		||||
# /usr/bin/snarf
 | 
			
		||||
# /usr/bin/lftpget -c
 | 
			
		||||
# /usr/bin/curl
 | 
			
		||||
# /usr/bin/wget
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
# ARCHITECTURE, COMPILE FLAGS
 | 
			
		||||
@@ -26,11 +26,9 @@ DLAGENTS=('ftp::/usr/bin/wget -c --passive-ftp -t 3 --waitretry=3 -O %o %u'
 | 
			
		||||
CARCH="@CARCH@"
 | 
			
		||||
CHOST="@CHOST@"
 | 
			
		||||
 | 
			
		||||
#-- Exclusive: will only run on @CARCH@
 | 
			
		||||
# -march (or -mcpu) builds exclusively for an architecture
 | 
			
		||||
# -mtune optimizes for an architecture, but builds for whole processor family
 | 
			
		||||
CFLAGS="@CARCHFLAGS@-mtune=generic -O2 -pipe"
 | 
			
		||||
CXXFLAGS="@CARCHFLAGS@-mtune=generic -O2 -pipe"
 | 
			
		||||
#-- Compiler and Linker Flags
 | 
			
		||||
#CFLAGS="-O2 -pipe"
 | 
			
		||||
#CXXFLAGS="-O2 -pipe"
 | 
			
		||||
#LDFLAGS=""
 | 
			
		||||
#-- Make Flags: change this for DistCC/SMP systems
 | 
			
		||||
#MAKEFLAGS="-j2"
 | 
			
		||||
@@ -39,7 +37,7 @@ CXXFLAGS="@CARCHFLAGS@-mtune=generic -O2 -pipe"
 | 
			
		||||
# BUILD ENVIRONMENT
 | 
			
		||||
#########################################################################
 | 
			
		||||
#
 | 
			
		||||
# Defaults: BUILDENV=(fakeroot !distcc color !ccache check)
 | 
			
		||||
# Defaults: BUILDENV=(fakeroot !distcc color !ccache check !sign)
 | 
			
		||||
#  A negated environment option will do the opposite of the comments below.
 | 
			
		||||
#
 | 
			
		||||
#-- fakeroot: Allow building packages as a non-root user
 | 
			
		||||
@@ -47,19 +45,23 @@ CXXFLAGS="@CARCHFLAGS@-mtune=generic -O2 -pipe"
 | 
			
		||||
#-- color:    Colorize output messages
 | 
			
		||||
#-- ccache:   Use ccache to cache compilation
 | 
			
		||||
#-- check:    Run the check() function if present in the PKGBUILD
 | 
			
		||||
#-- sign:     Generate PGP signature file
 | 
			
		||||
#
 | 
			
		||||
BUILDENV=(fakeroot !distcc color !ccache check)
 | 
			
		||||
BUILDENV=(fakeroot !distcc color !ccache check !sign)
 | 
			
		||||
#
 | 
			
		||||
#-- If using DistCC, your MAKEFLAGS will also need modification. In addition,
 | 
			
		||||
#-- specify a space-delimited list of hosts running in the DistCC cluster.
 | 
			
		||||
#DISTCC_HOSTS=""
 | 
			
		||||
#
 | 
			
		||||
#-- Specify a directory for package building.
 | 
			
		||||
#BUILDDIR=/tmp/makepkg
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
# GLOBAL PACKAGE OPTIONS
 | 
			
		||||
#   These are default values for the options=() settings
 | 
			
		||||
#########################################################################
 | 
			
		||||
#
 | 
			
		||||
# Default: OPTIONS=(strip docs libtool emptydirs zipman purge)
 | 
			
		||||
# Default: OPTIONS=(strip docs libtool emptydirs zipman purge !upx)
 | 
			
		||||
#  A negated option will do the opposite of the comments below.
 | 
			
		||||
#
 | 
			
		||||
#-- strip:     Strip symbols from binaries/libraries
 | 
			
		||||
@@ -68,8 +70,9 @@ BUILDENV=(fakeroot !distcc color !ccache check)
 | 
			
		||||
#-- emptydirs: Leave empty directories in packages
 | 
			
		||||
#-- zipman:    Compress manual (man and info) pages in MAN_DIRS with gzip
 | 
			
		||||
#-- purge:     Remove files specified by PURGE_TARGETS
 | 
			
		||||
#-- upx:       Compress binary executable files using UPX
 | 
			
		||||
#
 | 
			
		||||
OPTIONS=(strip docs libtool emptydirs zipman purge)
 | 
			
		||||
OPTIONS=(strip docs libtool emptydirs zipman purge !upx)
 | 
			
		||||
 | 
			
		||||
#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512
 | 
			
		||||
INTEGRITY_CHECK=(md5)
 | 
			
		||||
@@ -100,6 +103,8 @@ PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
 | 
			
		||||
#SRCPKGDEST=/home/srcpackages
 | 
			
		||||
#-- Packager: name/email of the person or organization building packages
 | 
			
		||||
#PACKAGER="John Doe <john@doe.com>"
 | 
			
		||||
#-- Specify a key to use for package signing
 | 
			
		||||
#GPGKEY=""
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
# EXTENSION DEFAULTS
 | 
			
		||||
 
 | 
			
		||||
@@ -13,11 +13,12 @@
 | 
			
		||||
#DBPath      = @localstatedir@/lib/pacman/
 | 
			
		||||
#CacheDir    = @localstatedir@/cache/pacman/pkg/
 | 
			
		||||
#LogFile     = @localstatedir@/log/pacman.log
 | 
			
		||||
#GPGDir      = @sysconfdir@/pacman.d/gnupg/
 | 
			
		||||
HoldPkg     = pacman glibc
 | 
			
		||||
# If upgrades are available for these packages they will be asked for first
 | 
			
		||||
SyncFirst   = pacman
 | 
			
		||||
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
 | 
			
		||||
#XferCommand = /usr/bin/curl -C - -f %u > %o
 | 
			
		||||
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
 | 
			
		||||
#CleanMethod = KeepInstalled
 | 
			
		||||
Architecture = auto
 | 
			
		||||
 | 
			
		||||
@@ -28,12 +29,15 @@ Architecture = auto
 | 
			
		||||
#NoUpgrade   =
 | 
			
		||||
#NoExtract   =
 | 
			
		||||
 | 
			
		||||
# Misc options (all disabled by default)
 | 
			
		||||
# Misc options
 | 
			
		||||
#UseSyslog
 | 
			
		||||
#ShowSize
 | 
			
		||||
#UseDelta
 | 
			
		||||
#TotalDownload
 | 
			
		||||
#CheckSpace
 | 
			
		||||
CheckSpace
 | 
			
		||||
#VerbosePkgLists
 | 
			
		||||
 | 
			
		||||
# PGP signature checking
 | 
			
		||||
#SigLevel = Optional
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# REPOSITORIES
 | 
			
		||||
@@ -59,6 +63,7 @@ Architecture = auto
 | 
			
		||||
# servers immediately after the header and they will be used before the
 | 
			
		||||
# default mirrors.
 | 
			
		||||
#[core]
 | 
			
		||||
#SigLevel = Required
 | 
			
		||||
#Server = ftp://ftp.example.com/foobar/$repo/os/$arch/
 | 
			
		||||
# The file referenced here should contain a list of 'Server = ' lines.
 | 
			
		||||
#Include = @sysconfdir@/pacman.d/mirrorlist
 | 
			
		||||
@@ -66,5 +71,6 @@ Architecture = auto
 | 
			
		||||
# An example of a custom package repository.  See the pacman manpage for
 | 
			
		||||
# tips on creating your own repositories.
 | 
			
		||||
#[custom]
 | 
			
		||||
#SigLevel = Optional TrustAll
 | 
			
		||||
#Server = file:///home/custompkgs
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -35,13 +35,15 @@ libalpm_la_SOURCES = \
 | 
			
		||||
	diskspace.h diskspace.c \
 | 
			
		||||
	dload.h dload.c \
 | 
			
		||||
	error.c \
 | 
			
		||||
	graph.h \
 | 
			
		||||
	graph.h graph.c \
 | 
			
		||||
	group.h group.c \
 | 
			
		||||
	handle.h handle.c \
 | 
			
		||||
	log.h log.c \
 | 
			
		||||
	package.h package.c \
 | 
			
		||||
	pkghash.h pkghash.c \
 | 
			
		||||
	rawstr.c \
 | 
			
		||||
	remove.h remove.c \
 | 
			
		||||
	signing.c signing.h \
 | 
			
		||||
	sync.h sync.c \
 | 
			
		||||
	trans.h trans.c \
 | 
			
		||||
	util.h util.c \
 | 
			
		||||
@@ -49,10 +51,16 @@ libalpm_la_SOURCES = \
 | 
			
		||||
 | 
			
		||||
if !HAVE_LIBSSL
 | 
			
		||||
libalpm_la_SOURCES += \
 | 
			
		||||
	md5.h md5.c
 | 
			
		||||
	md5.h md5.c \
 | 
			
		||||
	sha2.h sha2.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
libalpm_la_LDFLAGS = -no-undefined -version-info $(LIB_VERSION_INFO)
 | 
			
		||||
if HAVE_LIBGPGME
 | 
			
		||||
libalpm_la_SOURCES += \
 | 
			
		||||
	base64.h base64.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
libalpm_la_LDFLAGS = -no-undefined -version-info $(LIB_VERSION_INFO) @LIBCURL@
 | 
			
		||||
libalpm_la_LIBADD = $(LTLIBINTL)
 | 
			
		||||
 | 
			
		||||
# vim:set ts=2 sw=2 noet:
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
@@ -37,82 +38,76 @@
 | 
			
		||||
 | 
			
		||||
/* libalpm */
 | 
			
		||||
#include "add.h"
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
#include "alpm_list.h"
 | 
			
		||||
#include "handle.h"
 | 
			
		||||
#include "trans.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "backup.h"
 | 
			
		||||
#include "package.h"
 | 
			
		||||
#include "db.h"
 | 
			
		||||
#include "conflict.h"
 | 
			
		||||
#include "deps.h"
 | 
			
		||||
#include "remove.h"
 | 
			
		||||
#include "handle.h"
 | 
			
		||||
 | 
			
		||||
/** Add a package to the transaction.
 | 
			
		||||
 * @param pkg the package to add
 | 
			
		||||
 * @return 0 on success, -1 on error (pm_errno is set accordingly)
 | 
			
		||||
 */
 | 
			
		||||
int SYMEXPORT alpm_add_pkg(pmpkg_t *pkg)
 | 
			
		||||
/** Add a package to the transaction. */
 | 
			
		||||
int SYMEXPORT alpm_add_pkg(alpm_handle_t *handle, alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	const char *pkgname, *pkgver;
 | 
			
		||||
	pmtrans_t *trans;
 | 
			
		||||
	pmdb_t *db_local;
 | 
			
		||||
	pmpkg_t *local;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	alpm_trans_t *trans;
 | 
			
		||||
	alpm_pkg_t *local;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(pkg != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	ASSERT(pkg != NULL, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
	ASSERT(handle == pkg->handle, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
	trans = handle->trans;
 | 
			
		||||
	ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
 | 
			
		||||
	ASSERT(trans->state == STATE_INITIALIZED, RET_ERR(PM_ERR_TRANS_NOT_INITIALIZED, -1));
 | 
			
		||||
	ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
 | 
			
		||||
	db_local = handle->db_local;
 | 
			
		||||
	ASSERT(trans != NULL, RET_ERR(handle, ALPM_ERR_TRANS_NULL, -1));
 | 
			
		||||
	ASSERT(trans->state == STATE_INITIALIZED,
 | 
			
		||||
			RET_ERR(handle, ALPM_ERR_TRANS_NOT_INITIALIZED, -1));
 | 
			
		||||
 | 
			
		||||
	pkgname = alpm_pkg_get_name(pkg);
 | 
			
		||||
	pkgver = alpm_pkg_get_version(pkg);
 | 
			
		||||
	pkgname = pkg->name;
 | 
			
		||||
	pkgver = pkg->version;
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "adding package '%s'\n", pkgname);
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "adding package '%s'\n", pkgname);
 | 
			
		||||
 | 
			
		||||
	if(_alpm_pkg_find(trans->add, pkgname)) {
 | 
			
		||||
		RET_ERR(PM_ERR_TRANS_DUP_TARGET, -1);
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_TRANS_DUP_TARGET, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	local = _alpm_db_get_pkgfromcache(db_local, pkgname);
 | 
			
		||||
	local = _alpm_db_get_pkgfromcache(handle->db_local, pkgname);
 | 
			
		||||
	if(local) {
 | 
			
		||||
		const char *localpkgname = alpm_pkg_get_name(local);
 | 
			
		||||
		const char *localpkgver = alpm_pkg_get_version(local);
 | 
			
		||||
		const char *localpkgname = local->name;
 | 
			
		||||
		const char *localpkgver = local->version;
 | 
			
		||||
		int cmp = _alpm_pkg_compare_versions(pkg, local);
 | 
			
		||||
 | 
			
		||||
		if(cmp == 0) {
 | 
			
		||||
			if(trans->flags & PM_TRANS_FLAG_NEEDED) {
 | 
			
		||||
			if(trans->flags & ALPM_TRANS_FLAG_NEEDED) {
 | 
			
		||||
				/* with the NEEDED flag, packages up to date are not reinstalled */
 | 
			
		||||
				_alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- skipping\n"),
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_WARNING, _("%s-%s is up to date -- skipping\n"),
 | 
			
		||||
						localpkgname, localpkgver);
 | 
			
		||||
				return(0);
 | 
			
		||||
			} else {
 | 
			
		||||
				_alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- reinstalling\n"),
 | 
			
		||||
				return 0;
 | 
			
		||||
			} else if(!(trans->flags & ALPM_TRANS_FLAG_DOWNLOADONLY)) {
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_WARNING, _("%s-%s is up to date -- reinstalling\n"),
 | 
			
		||||
						localpkgname, localpkgver);
 | 
			
		||||
			}
 | 
			
		||||
		} else if(cmp < 0) {
 | 
			
		||||
			/* local version is newer */
 | 
			
		||||
			_alpm_log(PM_LOG_WARNING, _("downgrading package %s (%s => %s)\n"),
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_WARNING, _("downgrading package %s (%s => %s)\n"),
 | 
			
		||||
					localpkgname, localpkgver, pkgver);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* add the package to the transaction */
 | 
			
		||||
	pkg->reason = PM_PKG_REASON_EXPLICIT;
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "adding package %s-%s to the transaction targets\n",
 | 
			
		||||
	pkg->reason = ALPM_PKG_REASON_EXPLICIT;
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "adding package %s-%s to the transaction add list\n",
 | 
			
		||||
						pkgname, pkgver);
 | 
			
		||||
	trans->add = alpm_list_add(trans->add, pkg);
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int perform_extraction(struct archive *archive,
 | 
			
		||||
static int perform_extraction(alpm_handle_t *handle, struct archive *archive,
 | 
			
		||||
		struct archive_entry *entry, const char *filename, const char *origname)
 | 
			
		||||
{
 | 
			
		||||
	int ret;
 | 
			
		||||
@@ -125,27 +120,26 @@ static int perform_extraction(struct archive *archive,
 | 
			
		||||
	ret = archive_read_extract(archive, entry, archive_flags);
 | 
			
		||||
	if(ret == ARCHIVE_WARN && archive_errno(archive) != ENOSPC) {
 | 
			
		||||
		/* operation succeeded but a "non-critical" error was encountered */
 | 
			
		||||
		_alpm_log(PM_LOG_WARNING, _("warning given when extracting %s (%s)\n"),
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_WARNING, _("warning given when extracting %s (%s)\n"),
 | 
			
		||||
				origname, archive_error_string(archive));
 | 
			
		||||
	} else if(ret != ARCHIVE_OK) {
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("could not extract %s (%s)\n"),
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_ERROR, _("could not extract %s (%s)\n"),
 | 
			
		||||
				origname, archive_error_string(archive));
 | 
			
		||||
		alpm_logaction("error: could not extract %s (%s)\n",
 | 
			
		||||
		alpm_logaction(handle, "error: could not extract %s (%s)\n",
 | 
			
		||||
				origname, archive_error_string(archive));
 | 
			
		||||
		return(1);
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int extract_single_file(struct archive *archive,
 | 
			
		||||
		struct archive_entry *entry, pmpkg_t *newpkg, pmpkg_t *oldpkg,
 | 
			
		||||
		pmtrans_t *trans, pmdb_t *db)
 | 
			
		||||
static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
 | 
			
		||||
		struct archive_entry *entry, alpm_pkg_t *newpkg, alpm_pkg_t *oldpkg)
 | 
			
		||||
{
 | 
			
		||||
	const char *entryname;
 | 
			
		||||
	mode_t entrymode;
 | 
			
		||||
	char filename[PATH_MAX]; /* the actual file we're extracting */
 | 
			
		||||
	int needbackup = 0, notouch = 0;
 | 
			
		||||
	char *hash_orig = NULL;
 | 
			
		||||
	const char *hash_orig = NULL;
 | 
			
		||||
	char *entryname_orig = NULL;
 | 
			
		||||
	int errors = 0;
 | 
			
		||||
 | 
			
		||||
@@ -157,19 +151,19 @@ static int extract_single_file(struct archive *archive,
 | 
			
		||||
	if(strcmp(entryname, ".INSTALL") == 0) {
 | 
			
		||||
		/* the install script goes inside the db */
 | 
			
		||||
		snprintf(filename, PATH_MAX, "%s%s-%s/install",
 | 
			
		||||
				_alpm_db_path(db), newpkg->name, newpkg->version);
 | 
			
		||||
				_alpm_db_path(handle->db_local), newpkg->name, newpkg->version);
 | 
			
		||||
		archive_entry_set_perm(entry, 0644);
 | 
			
		||||
	} else if(strcmp(entryname, ".CHANGELOG") == 0) {
 | 
			
		||||
		/* the changelog goes inside the db */
 | 
			
		||||
		snprintf(filename, PATH_MAX, "%s%s-%s/changelog",
 | 
			
		||||
				_alpm_db_path(db), newpkg->name, newpkg->version);
 | 
			
		||||
				_alpm_db_path(handle->db_local), newpkg->name, newpkg->version);
 | 
			
		||||
		archive_entry_set_perm(entry, 0644);
 | 
			
		||||
	} else if(*entryname == '.') {
 | 
			
		||||
		/* for now, ignore all files starting with '.' that haven't
 | 
			
		||||
		 * already been handled (for future possibilities) */
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "skipping extraction of '%s'\n", entryname);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "skipping extraction of '%s'\n", entryname);
 | 
			
		||||
		archive_read_data_skip(archive);
 | 
			
		||||
		return(0);
 | 
			
		||||
		return 0;
 | 
			
		||||
	} else {
 | 
			
		||||
		/* build the new entryname relative to handle->root */
 | 
			
		||||
		snprintf(filename, PATH_MAX, "%s%s", handle->root, entryname);
 | 
			
		||||
@@ -177,12 +171,12 @@ static int extract_single_file(struct archive *archive,
 | 
			
		||||
 | 
			
		||||
	/* if a file is in NoExtract then we never extract it */
 | 
			
		||||
	if(alpm_list_find_str(handle->noextract, entryname)) {
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "%s is in NoExtract, skipping extraction\n",
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "%s is in NoExtract, skipping extraction\n",
 | 
			
		||||
				entryname);
 | 
			
		||||
		alpm_logaction("note: %s is in NoExtract, skipping extraction\n",
 | 
			
		||||
		alpm_logaction(handle, "note: %s is in NoExtract, skipping extraction\n",
 | 
			
		||||
				entryname);
 | 
			
		||||
		archive_read_data_skip(archive);
 | 
			
		||||
		return(0);
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Check for file existence. This is one of the more crucial parts
 | 
			
		||||
@@ -216,42 +210,42 @@ static int extract_single_file(struct archive *archive,
 | 
			
		||||
				if(lsbuf.st_mode != entrymode) {
 | 
			
		||||
					/* if filesystem perms are different than pkg perms, warn user */
 | 
			
		||||
					mode_t mask = 07777;
 | 
			
		||||
					_alpm_log(PM_LOG_WARNING, _("directory permissions differ on %s\n"
 | 
			
		||||
					_alpm_log(handle, ALPM_LOG_WARNING, _("directory permissions differ on %s\n"
 | 
			
		||||
								"filesystem: %o  package: %o\n"), entryname, lsbuf.st_mode & mask,
 | 
			
		||||
							entrymode & mask);
 | 
			
		||||
					alpm_logaction("warning: directory permissions differ on %s\n"
 | 
			
		||||
					alpm_logaction(handle, "warning: directory permissions differ on %s\n"
 | 
			
		||||
							"filesystem: %o  package: %o\n", entryname, lsbuf.st_mode & mask,
 | 
			
		||||
							entrymode & mask);
 | 
			
		||||
				}
 | 
			
		||||
				_alpm_log(PM_LOG_DEBUG, "extract: skipping dir extraction of %s\n",
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_DEBUG, "extract: skipping dir extraction of %s\n",
 | 
			
		||||
						entryname);
 | 
			
		||||
				archive_read_data_skip(archive);
 | 
			
		||||
				return(0);
 | 
			
		||||
				return 0;
 | 
			
		||||
			} else {
 | 
			
		||||
				/* case 10/11: trying to overwrite dir with file/symlink, don't allow it */
 | 
			
		||||
				_alpm_log(PM_LOG_ERROR, _("extract: not overwriting dir with file %s\n"),
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_ERROR, _("extract: not overwriting dir with file %s\n"),
 | 
			
		||||
						entryname);
 | 
			
		||||
				archive_read_data_skip(archive);
 | 
			
		||||
				return(1);
 | 
			
		||||
				return 1;
 | 
			
		||||
			}
 | 
			
		||||
		} else if(S_ISLNK(lsbuf.st_mode) && S_ISDIR(entrymode)) {
 | 
			
		||||
			/* case 9: existing symlink, dir in package */
 | 
			
		||||
			if(S_ISDIR(sbuf.st_mode)) {
 | 
			
		||||
				/* the symlink on FS is to a directory, so we'll use it */
 | 
			
		||||
				_alpm_log(PM_LOG_DEBUG, "extract: skipping symlink overwrite of %s\n",
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_DEBUG, "extract: skipping symlink overwrite of %s\n",
 | 
			
		||||
						entryname);
 | 
			
		||||
				archive_read_data_skip(archive);
 | 
			
		||||
				return(0);
 | 
			
		||||
				return 0;
 | 
			
		||||
			} else {
 | 
			
		||||
				/* this is BAD. symlink was not to a directory */
 | 
			
		||||
				_alpm_log(PM_LOG_ERROR, _("extract: symlink %s does not point to dir\n"),
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_ERROR, _("extract: symlink %s does not point to dir\n"),
 | 
			
		||||
						entryname);
 | 
			
		||||
				archive_read_data_skip(archive);
 | 
			
		||||
				return(1);
 | 
			
		||||
				return 1;
 | 
			
		||||
			}
 | 
			
		||||
		} else if(S_ISREG(lsbuf.st_mode) && S_ISDIR(entrymode)) {
 | 
			
		||||
			/* case 6: trying to overwrite file with dir */
 | 
			
		||||
			_alpm_log(PM_LOG_DEBUG, "extract: overwriting file with dir %s\n",
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_DEBUG, "extract: overwriting file with dir %s\n",
 | 
			
		||||
					entryname);
 | 
			
		||||
		} else if(S_ISREG(entrymode)) {
 | 
			
		||||
			/* case 4,7: */
 | 
			
		||||
@@ -259,24 +253,24 @@ static int extract_single_file(struct archive *archive,
 | 
			
		||||
			if(alpm_list_find_str(handle->noupgrade, entryname)) {
 | 
			
		||||
				notouch = 1;
 | 
			
		||||
			} else {
 | 
			
		||||
				alpm_backup_t *backup;
 | 
			
		||||
				/* go to the backup array and see if our conflict is there */
 | 
			
		||||
				/* check newpkg first, so that adding backup files is retroactive */
 | 
			
		||||
				if(alpm_list_find_str(alpm_pkg_get_backup(newpkg), entryname) != NULL) {
 | 
			
		||||
				backup = _alpm_needbackup(entryname, newpkg);
 | 
			
		||||
				if(backup) {
 | 
			
		||||
					/* if we force hash_orig to be non-NULL retroactive backup works */
 | 
			
		||||
					hash_orig = "";
 | 
			
		||||
					needbackup = 1;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				/* check oldpkg for a backup entry, store the hash if available */
 | 
			
		||||
				if(oldpkg) {
 | 
			
		||||
					hash_orig = _alpm_needbackup(entryname, alpm_pkg_get_backup(oldpkg));
 | 
			
		||||
					if(hash_orig) {
 | 
			
		||||
					backup = _alpm_needbackup(entryname, oldpkg);
 | 
			
		||||
					if(backup) {
 | 
			
		||||
						hash_orig = backup->hash;
 | 
			
		||||
						needbackup = 1;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				/* if we force hash_orig to be non-NULL retroactive backup works */
 | 
			
		||||
				if(needbackup && !hash_orig) {
 | 
			
		||||
					STRDUP(hash_orig, "", RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		/* else if(S_ISLNK(entrymode)) */
 | 
			
		||||
@@ -285,7 +279,7 @@ static int extract_single_file(struct archive *archive,
 | 
			
		||||
 | 
			
		||||
	/* we need access to the original entryname later after calls to
 | 
			
		||||
	 * archive_entry_set_pathname(), so we need to dupe it and free() later */
 | 
			
		||||
	STRDUP(entryname_orig, entryname, RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
	STRDUP(entryname_orig, entryname, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
 | 
			
		||||
 | 
			
		||||
	if(needbackup) {
 | 
			
		||||
		char checkfile[PATH_MAX];
 | 
			
		||||
@@ -294,44 +288,36 @@ static int extract_single_file(struct archive *archive,
 | 
			
		||||
 | 
			
		||||
		snprintf(checkfile, PATH_MAX, "%s.paccheck", filename);
 | 
			
		||||
 | 
			
		||||
		ret = perform_extraction(archive, entry, checkfile, entryname_orig);
 | 
			
		||||
		ret = perform_extraction(handle, archive, entry, checkfile, entryname_orig);
 | 
			
		||||
		if(ret == 1) {
 | 
			
		||||
			/* error */
 | 
			
		||||
			FREE(hash_orig);
 | 
			
		||||
			FREE(entryname_orig);
 | 
			
		||||
			return(1);
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		hash_local = alpm_compute_md5sum(filename);
 | 
			
		||||
		hash_pkg = alpm_compute_md5sum(checkfile);
 | 
			
		||||
 | 
			
		||||
		/* append the new md5 hash to it's respective entry
 | 
			
		||||
		 * in newpkg's backup (it will be the new orginal) */
 | 
			
		||||
		alpm_list_t *backups;
 | 
			
		||||
		for(backups = alpm_pkg_get_backup(newpkg); backups;
 | 
			
		||||
				backups = alpm_list_next(backups)) {
 | 
			
		||||
			char *oldbackup = alpm_list_getdata(backups);
 | 
			
		||||
			if(!oldbackup || strcmp(oldbackup, entryname_orig) != 0) {
 | 
			
		||||
		/* update the md5 hash in newpkg's backup (it will be the new orginal) */
 | 
			
		||||
		alpm_list_t *i;
 | 
			
		||||
		for(i = alpm_pkg_get_backup(newpkg); i; i = i->next) {
 | 
			
		||||
			alpm_backup_t *backup = i->data;
 | 
			
		||||
			char *newhash;
 | 
			
		||||
			if(!backup->name || strcmp(backup->name, entryname_orig) != 0) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			char *backup = NULL;
 | 
			
		||||
			/* length is tab char, null byte and MD5 (32 char) */
 | 
			
		||||
			size_t backup_len = strlen(oldbackup) + 34;
 | 
			
		||||
			MALLOC(backup, backup_len, RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
 | 
			
		||||
			sprintf(backup, "%s\t%s", oldbackup, hash_pkg);
 | 
			
		||||
			backup[backup_len-1] = '\0';
 | 
			
		||||
			FREE(oldbackup);
 | 
			
		||||
			backups->data = backup;
 | 
			
		||||
			STRDUP(newhash, hash_pkg, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
 | 
			
		||||
			FREE(backup->hash);
 | 
			
		||||
			backup->hash = newhash;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "checking hashes for %s\n", entryname_orig);
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "current:  %s\n", hash_local);
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "new:      %s\n", hash_pkg);
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "original: %s\n", hash_orig);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "checking hashes for %s\n", entryname_orig);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "current:  %s\n", hash_local);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "new:      %s\n", hash_pkg);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "original: %s\n", hash_orig);
 | 
			
		||||
 | 
			
		||||
		if(!oldpkg) {
 | 
			
		||||
			if(strcmp(hash_local, hash_pkg) != 0) {
 | 
			
		||||
			if(hash_local && hash_pkg && strcmp(hash_local, hash_pkg) != 0) {
 | 
			
		||||
				/* looks like we have a local file that has a different hash as the
 | 
			
		||||
				 * file in the package, move it to a .pacorig */
 | 
			
		||||
				char newpath[PATH_MAX];
 | 
			
		||||
@@ -339,22 +325,22 @@ static int extract_single_file(struct archive *archive,
 | 
			
		||||
 | 
			
		||||
				/* move the existing file to the "pacorig" */
 | 
			
		||||
				if(rename(filename, newpath)) {
 | 
			
		||||
					_alpm_log(PM_LOG_ERROR, _("could not rename %s to %s (%s)\n"),
 | 
			
		||||
					_alpm_log(handle, ALPM_LOG_ERROR, _("could not rename %s to %s (%s)\n"),
 | 
			
		||||
							filename, newpath, strerror(errno));
 | 
			
		||||
					alpm_logaction("error: could not rename %s to %s (%s)\n",
 | 
			
		||||
					alpm_logaction(handle, "error: could not rename %s to %s (%s)\n",
 | 
			
		||||
							filename, newpath, strerror(errno));
 | 
			
		||||
					errors++;
 | 
			
		||||
				} else {
 | 
			
		||||
					/* rename the file we extracted to the real name */
 | 
			
		||||
					if(rename(checkfile, filename)) {
 | 
			
		||||
						_alpm_log(PM_LOG_ERROR, _("could not rename %s to %s (%s)\n"),
 | 
			
		||||
						_alpm_log(handle, ALPM_LOG_ERROR, _("could not rename %s to %s (%s)\n"),
 | 
			
		||||
								checkfile, filename, strerror(errno));
 | 
			
		||||
						alpm_logaction("error: could not rename %s to %s (%s)\n",
 | 
			
		||||
						alpm_logaction(handle, "error: could not rename %s to %s (%s)\n",
 | 
			
		||||
								checkfile, filename, strerror(errno));
 | 
			
		||||
						errors++;
 | 
			
		||||
					} else {
 | 
			
		||||
						_alpm_log(PM_LOG_WARNING, _("%s saved as %s\n"), filename, newpath);
 | 
			
		||||
						alpm_logaction("warning: %s saved as %s\n", filename, newpath);
 | 
			
		||||
						_alpm_log(handle, ALPM_LOG_WARNING, _("%s saved as %s\n"), filename, newpath);
 | 
			
		||||
						alpm_logaction(handle, "warning: %s saved as %s\n", filename, newpath);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
@@ -364,51 +350,51 @@ static int extract_single_file(struct archive *archive,
 | 
			
		||||
		} else if(hash_orig) {
 | 
			
		||||
			/* the fun part */
 | 
			
		||||
 | 
			
		||||
			if(strcmp(hash_orig, hash_local) == 0) {
 | 
			
		||||
			if(hash_local && strcmp(hash_orig, hash_local) == 0) {
 | 
			
		||||
				/* installed file has NOT been changed by user */
 | 
			
		||||
				if(strcmp(hash_orig, hash_pkg) != 0) {
 | 
			
		||||
					_alpm_log(PM_LOG_DEBUG, "action: installing new file: %s\n",
 | 
			
		||||
				if(hash_pkg && strcmp(hash_orig, hash_pkg) != 0) {
 | 
			
		||||
					_alpm_log(handle, ALPM_LOG_DEBUG, "action: installing new file: %s\n",
 | 
			
		||||
							entryname_orig);
 | 
			
		||||
 | 
			
		||||
					if(rename(checkfile, filename)) {
 | 
			
		||||
						_alpm_log(PM_LOG_ERROR, _("could not rename %s to %s (%s)\n"),
 | 
			
		||||
						_alpm_log(handle, ALPM_LOG_ERROR, _("could not rename %s to %s (%s)\n"),
 | 
			
		||||
								checkfile, filename, strerror(errno));
 | 
			
		||||
						alpm_logaction("error: could not rename %s to %s (%s)\n",
 | 
			
		||||
						alpm_logaction(handle, "error: could not rename %s to %s (%s)\n",
 | 
			
		||||
								checkfile, filename, strerror(errno));
 | 
			
		||||
						errors++;
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					/* there's no sense in installing the same file twice, install
 | 
			
		||||
					 * ONLY is the original and package hashes differ */
 | 
			
		||||
					_alpm_log(PM_LOG_DEBUG, "action: leaving existing file in place\n");
 | 
			
		||||
					/* no sense in installing the same file twice, install
 | 
			
		||||
					 * ONLY if the original and package hashes differ */
 | 
			
		||||
					_alpm_log(handle, ALPM_LOG_DEBUG, "action: leaving existing file in place\n");
 | 
			
		||||
					unlink(checkfile);
 | 
			
		||||
				}
 | 
			
		||||
			} else if(strcmp(hash_orig, hash_pkg) == 0) {
 | 
			
		||||
			} else if(hash_pkg && strcmp(hash_orig, hash_pkg) == 0) {
 | 
			
		||||
				/* originally installed file and new file are the same - this
 | 
			
		||||
				 * implies the case above failed - i.e. the file was changed by a
 | 
			
		||||
				 * user */
 | 
			
		||||
				_alpm_log(PM_LOG_DEBUG, "action: leaving existing file in place\n");
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_DEBUG, "action: leaving existing file in place\n");
 | 
			
		||||
				unlink(checkfile);
 | 
			
		||||
			} else if(strcmp(hash_local, hash_pkg) == 0) {
 | 
			
		||||
			} else if(hash_local && hash_pkg && strcmp(hash_local, hash_pkg) == 0) {
 | 
			
		||||
				/* this would be magical.  The above two cases failed, but the
 | 
			
		||||
				 * user changes just so happened to make the new file exactly the
 | 
			
		||||
				 * same as the one in the package... skip it */
 | 
			
		||||
				_alpm_log(PM_LOG_DEBUG, "action: leaving existing file in place\n");
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_DEBUG, "action: leaving existing file in place\n");
 | 
			
		||||
				unlink(checkfile);
 | 
			
		||||
			} else {
 | 
			
		||||
				char newpath[PATH_MAX];
 | 
			
		||||
				_alpm_log(PM_LOG_DEBUG, "action: keeping current file and installing"
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_DEBUG, "action: keeping current file and installing"
 | 
			
		||||
						" new one with .pacnew ending\n");
 | 
			
		||||
				snprintf(newpath, PATH_MAX, "%s.pacnew", filename);
 | 
			
		||||
				if(rename(checkfile, newpath)) {
 | 
			
		||||
					_alpm_log(PM_LOG_ERROR, _("could not install %s as %s (%s)\n"),
 | 
			
		||||
					_alpm_log(handle, ALPM_LOG_ERROR, _("could not install %s as %s (%s)\n"),
 | 
			
		||||
							filename, newpath, strerror(errno));
 | 
			
		||||
					alpm_logaction("error: could not install %s as %s (%s)\n",
 | 
			
		||||
					alpm_logaction(handle, "error: could not install %s as %s (%s)\n",
 | 
			
		||||
							filename, newpath, strerror(errno));
 | 
			
		||||
				} else {
 | 
			
		||||
					_alpm_log(PM_LOG_WARNING, _("%s installed as %s\n"),
 | 
			
		||||
					_alpm_log(handle, ALPM_LOG_WARNING, _("%s installed as %s\n"),
 | 
			
		||||
							filename, newpath);
 | 
			
		||||
					alpm_logaction("warning: %s installed as %s\n",
 | 
			
		||||
					alpm_logaction(handle, "warning: %s installed as %s\n",
 | 
			
		||||
							filename, newpath);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
@@ -416,126 +402,104 @@ static int extract_single_file(struct archive *archive,
 | 
			
		||||
 | 
			
		||||
		FREE(hash_local);
 | 
			
		||||
		FREE(hash_pkg);
 | 
			
		||||
		FREE(hash_orig);
 | 
			
		||||
	} else {
 | 
			
		||||
		int ret;
 | 
			
		||||
 | 
			
		||||
		/* we didn't need a backup */
 | 
			
		||||
		if(notouch) {
 | 
			
		||||
			/* change the path to a .pacnew extension */
 | 
			
		||||
			_alpm_log(PM_LOG_DEBUG, "%s is in NoUpgrade -- skipping\n", filename);
 | 
			
		||||
			_alpm_log(PM_LOG_WARNING, _("extracting %s as %s.pacnew\n"), filename, filename);
 | 
			
		||||
			alpm_logaction("warning: extracting %s as %s.pacnew\n", filename, filename);
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_DEBUG, "%s is in NoUpgrade -- skipping\n", filename);
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_WARNING, _("extracting %s as %s.pacnew\n"), filename, filename);
 | 
			
		||||
			alpm_logaction(handle, "warning: extracting %s as %s.pacnew\n", filename, filename);
 | 
			
		||||
			strncat(filename, ".pacnew", PATH_MAX - strlen(filename));
 | 
			
		||||
		} else {
 | 
			
		||||
			_alpm_log(PM_LOG_DEBUG, "extracting %s\n", filename);
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_DEBUG, "extracting %s\n", filename);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(trans->flags & PM_TRANS_FLAG_FORCE) {
 | 
			
		||||
		if(handle->trans->flags & ALPM_TRANS_FLAG_FORCE) {
 | 
			
		||||
			/* if FORCE was used, unlink() each file (whether it's there
 | 
			
		||||
			 * or not) before extracting. This prevents the old "Text file busy"
 | 
			
		||||
			 * error that crops up if forcing a glibc or pacman upgrade. */
 | 
			
		||||
			unlink(filename);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ret = perform_extraction(archive, entry, filename, entryname_orig);
 | 
			
		||||
		ret = perform_extraction(handle, archive, entry, filename, entryname_orig);
 | 
			
		||||
		if(ret == 1) {
 | 
			
		||||
			/* error */
 | 
			
		||||
			FREE(entryname_orig);
 | 
			
		||||
			return(1);
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* calculate an hash if this is in newpkg's backup */
 | 
			
		||||
		alpm_list_t *b;
 | 
			
		||||
		for(b = alpm_pkg_get_backup(newpkg); b; b = b->next) {
 | 
			
		||||
			char *backup = NULL, *hash = NULL;
 | 
			
		||||
			char *oldbackup = alpm_list_getdata(b);
 | 
			
		||||
			/* length is tab char, null byte and MD5 (32 char) */
 | 
			
		||||
			size_t backup_len = strlen(oldbackup) + 34;
 | 
			
		||||
 | 
			
		||||
			if(!oldbackup || strcmp(oldbackup, entryname_orig) != 0) {
 | 
			
		||||
		alpm_list_t *i;
 | 
			
		||||
		for(i = alpm_pkg_get_backup(newpkg); i; i = i->next) {
 | 
			
		||||
			alpm_backup_t *backup = i->data;
 | 
			
		||||
			char *newhash;
 | 
			
		||||
			if(!backup->name || strcmp(backup->name, entryname_orig) != 0) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			_alpm_log(PM_LOG_DEBUG, "appending backup entry for %s\n", filename);
 | 
			
		||||
 | 
			
		||||
			hash = alpm_compute_md5sum(filename);
 | 
			
		||||
			MALLOC(backup, backup_len, RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
 | 
			
		||||
			sprintf(backup, "%s\t%s", oldbackup, hash);
 | 
			
		||||
			backup[backup_len-1] = '\0';
 | 
			
		||||
			FREE(hash);
 | 
			
		||||
			FREE(oldbackup);
 | 
			
		||||
			b->data = backup;
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_DEBUG, "appending backup entry for %s\n", entryname_orig);
 | 
			
		||||
			newhash = alpm_compute_md5sum(filename);
 | 
			
		||||
			FREE(backup->hash);
 | 
			
		||||
			backup->hash = newhash;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	FREE(entryname_orig);
 | 
			
		||||
	return(errors);
 | 
			
		||||
	return errors;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int commit_single_pkg(pmpkg_t *newpkg, size_t pkg_current,
 | 
			
		||||
		size_t pkg_count, pmtrans_t *trans, pmdb_t *db)
 | 
			
		||||
static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
 | 
			
		||||
		size_t pkg_current, size_t pkg_count)
 | 
			
		||||
{
 | 
			
		||||
	int i, ret = 0, errors = 0;
 | 
			
		||||
	char scriptlet[PATH_MAX+1];
 | 
			
		||||
	int is_upgrade = 0;
 | 
			
		||||
	pmpkg_t *oldpkg = NULL;
 | 
			
		||||
	int is_upgrade;
 | 
			
		||||
	alpm_pkg_t *oldpkg = NULL;
 | 
			
		||||
	alpm_db_t *db = handle->db_local;
 | 
			
		||||
	alpm_trans_t *trans = handle->trans;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
 | 
			
		||||
 | 
			
		||||
	snprintf(scriptlet, PATH_MAX, "%s%s-%s/install",
 | 
			
		||||
			_alpm_db_path(db), alpm_pkg_get_name(newpkg),
 | 
			
		||||
			alpm_pkg_get_version(newpkg));
 | 
			
		||||
	ASSERT(trans != NULL, return -1);
 | 
			
		||||
 | 
			
		||||
	/* see if this is an upgrade. if so, remove the old package first */
 | 
			
		||||
	pmpkg_t *local = _alpm_db_get_pkgfromcache(db, newpkg->name);
 | 
			
		||||
	alpm_pkg_t *local = _alpm_db_get_pkgfromcache(db, newpkg->name);
 | 
			
		||||
	if(local) {
 | 
			
		||||
		is_upgrade = 1;
 | 
			
		||||
 | 
			
		||||
		/* we'll need to save some record for backup checks later */
 | 
			
		||||
		oldpkg = _alpm_pkg_dup(local);
 | 
			
		||||
		/* make sure all infos are loaded because the database entry
 | 
			
		||||
		 * will be removed soon */
 | 
			
		||||
		_alpm_local_db_read(oldpkg->origin_data.db, oldpkg, INFRQ_ALL);
 | 
			
		||||
 | 
			
		||||
		EVENT(trans, PM_TRANS_EVT_UPGRADE_START, newpkg, oldpkg);
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "upgrading package %s-%s\n",
 | 
			
		||||
				newpkg->name, newpkg->version);
 | 
			
		||||
		if(_alpm_pkg_dup(local, &oldpkg) == -1) {
 | 
			
		||||
			ret = -1;
 | 
			
		||||
			goto cleanup;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* copy over the install reason */
 | 
			
		||||
		newpkg->reason = alpm_pkg_get_reason(oldpkg);
 | 
			
		||||
		newpkg->reason = alpm_pkg_get_reason(local);
 | 
			
		||||
 | 
			
		||||
		/* pre_upgrade scriptlet */
 | 
			
		||||
		if(alpm_pkg_has_scriptlet(newpkg) && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) {
 | 
			
		||||
			_alpm_runscriptlet(handle->root, newpkg->origin_data.file,
 | 
			
		||||
					"pre_upgrade", newpkg->version, oldpkg->version, trans);
 | 
			
		||||
		}
 | 
			
		||||
		EVENT(handle, ALPM_EVENT_UPGRADE_START, newpkg, local);
 | 
			
		||||
	} else {
 | 
			
		||||
		is_upgrade = 0;
 | 
			
		||||
		EVENT(handle, ALPM_EVENT_ADD_START, newpkg, NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		EVENT(trans, PM_TRANS_EVT_ADD_START, newpkg, NULL);
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "adding package %s-%s\n",
 | 
			
		||||
				newpkg->name, newpkg->version);
 | 
			
		||||
 | 
			
		||||
		/* pre_install scriptlet */
 | 
			
		||||
		if(alpm_pkg_has_scriptlet(newpkg) && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) {
 | 
			
		||||
			_alpm_runscriptlet(handle->root, newpkg->origin_data.file,
 | 
			
		||||
					"pre_install", newpkg->version, NULL, trans);
 | 
			
		||||
		}
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "%s package %s-%s\n",
 | 
			
		||||
			is_upgrade ? "upgrading" : "adding", newpkg->name, newpkg->version);
 | 
			
		||||
		/* pre_install/pre_upgrade scriptlet */
 | 
			
		||||
	if(alpm_pkg_has_scriptlet(newpkg) &&
 | 
			
		||||
			!(trans->flags & ALPM_TRANS_FLAG_NOSCRIPTLET)) {
 | 
			
		||||
		const char *scriptlet_name = is_upgrade ? "pre_upgrade" : "pre_install";
 | 
			
		||||
		_alpm_runscriptlet(handle, newpkg->origin_data.file,
 | 
			
		||||
				scriptlet_name, newpkg->version, NULL, 1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* we override any pre-set reason if we have alldeps or allexplicit set */
 | 
			
		||||
	if(trans->flags & PM_TRANS_FLAG_ALLDEPS) {
 | 
			
		||||
		newpkg->reason = PM_PKG_REASON_DEPEND;
 | 
			
		||||
	} else if(trans->flags & PM_TRANS_FLAG_ALLEXPLICIT) {
 | 
			
		||||
		newpkg->reason = PM_PKG_REASON_EXPLICIT;
 | 
			
		||||
	if(trans->flags & ALPM_TRANS_FLAG_ALLDEPS) {
 | 
			
		||||
		newpkg->reason = ALPM_PKG_REASON_DEPEND;
 | 
			
		||||
	} else if(trans->flags & ALPM_TRANS_FLAG_ALLEXPLICIT) {
 | 
			
		||||
		newpkg->reason = ALPM_PKG_REASON_EXPLICIT;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(oldpkg) {
 | 
			
		||||
		/* set up fake remove transaction */
 | 
			
		||||
		if(_alpm_upgraderemove_package(oldpkg, newpkg, trans) == -1) {
 | 
			
		||||
			pm_errno = PM_ERR_TRANS_ABORT;
 | 
			
		||||
		if(_alpm_remove_single_package(handle, oldpkg, newpkg, 0, 0) == -1) {
 | 
			
		||||
			handle->pm_errno = ALPM_ERR_TRANS_ABORT;
 | 
			
		||||
			ret = -1;
 | 
			
		||||
			goto cleanup;
 | 
			
		||||
		}
 | 
			
		||||
@@ -544,23 +508,22 @@ static int commit_single_pkg(pmpkg_t *newpkg, size_t pkg_current,
 | 
			
		||||
	/* prepare directory for database entries so permission are correct after
 | 
			
		||||
	   changelog/install script installation (FS#12263) */
 | 
			
		||||
	if(_alpm_local_db_prepare(db, newpkg)) {
 | 
			
		||||
		alpm_logaction("error: could not create database entry %s-%s\n",
 | 
			
		||||
				alpm_pkg_get_name(newpkg), alpm_pkg_get_version(newpkg));
 | 
			
		||||
		pm_errno = PM_ERR_DB_WRITE;
 | 
			
		||||
		alpm_logaction(handle, "error: could not create database entry %s-%s\n",
 | 
			
		||||
				newpkg->name, newpkg->version);
 | 
			
		||||
		handle->pm_errno = ALPM_ERR_DB_WRITE;
 | 
			
		||||
		ret = -1;
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(!(trans->flags & PM_TRANS_FLAG_DBONLY)) {
 | 
			
		||||
	if(!(trans->flags & ALPM_TRANS_FLAG_DBONLY)) {
 | 
			
		||||
		struct archive *archive;
 | 
			
		||||
		struct archive_entry *entry;
 | 
			
		||||
		char cwd[PATH_MAX] = "";
 | 
			
		||||
		int restore_cwd = 0;
 | 
			
		||||
		int cwdfd;
 | 
			
		||||
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "extracting files\n");
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "extracting files\n");
 | 
			
		||||
 | 
			
		||||
		if ((archive = archive_read_new()) == NULL) {
 | 
			
		||||
			pm_errno = PM_ERR_LIBARCHIVE;
 | 
			
		||||
		if((archive = archive_read_new()) == NULL) {
 | 
			
		||||
			handle->pm_errno = ALPM_ERR_LIBARCHIVE;
 | 
			
		||||
			ret = -1;
 | 
			
		||||
			goto cleanup;
 | 
			
		||||
		}
 | 
			
		||||
@@ -568,35 +531,37 @@ static int commit_single_pkg(pmpkg_t *newpkg, size_t pkg_current,
 | 
			
		||||
		archive_read_support_compression_all(archive);
 | 
			
		||||
		archive_read_support_format_all(archive);
 | 
			
		||||
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "archive: %s\n", newpkg->origin_data.file);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "archive: %s\n", newpkg->origin_data.file);
 | 
			
		||||
		if(archive_read_open_filename(archive, newpkg->origin_data.file,
 | 
			
		||||
					ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) {
 | 
			
		||||
			pm_errno = PM_ERR_PKG_OPEN;
 | 
			
		||||
			handle->pm_errno = ALPM_ERR_PKG_OPEN;
 | 
			
		||||
			ret = -1;
 | 
			
		||||
			goto cleanup;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* save the cwd so we can restore it later */
 | 
			
		||||
		if(getcwd(cwd, PATH_MAX) == NULL) {
 | 
			
		||||
			_alpm_log(PM_LOG_ERROR, _("could not get current working directory\n"));
 | 
			
		||||
		} else {
 | 
			
		||||
			restore_cwd = 1;
 | 
			
		||||
		do {
 | 
			
		||||
			cwdfd = open(".", O_RDONLY);
 | 
			
		||||
		} while(cwdfd == -1 && errno == EINTR);
 | 
			
		||||
		if(cwdfd < 0) {
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_ERROR, _("could not get current working directory\n"));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* libarchive requires this for extracting hard links */
 | 
			
		||||
		if(chdir(handle->root) != 0) {
 | 
			
		||||
			_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), handle->root, strerror(errno));
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_ERROR, _("could not change directory to %s (%s)\n"),
 | 
			
		||||
					handle->root, strerror(errno));
 | 
			
		||||
			ret = -1;
 | 
			
		||||
			goto cleanup;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* call PROGRESS once with 0 percent, as we sort-of skip that here */
 | 
			
		||||
		if(is_upgrade) {
 | 
			
		||||
			PROGRESS(trans, PM_TRANS_PROGRESS_UPGRADE_START,
 | 
			
		||||
					alpm_pkg_get_name(newpkg), 0, pkg_count, pkg_current);
 | 
			
		||||
			PROGRESS(handle, ALPM_PROGRESS_UPGRADE_START,
 | 
			
		||||
					newpkg->name, 0, pkg_count, pkg_current);
 | 
			
		||||
		} else {
 | 
			
		||||
			PROGRESS(trans, PM_TRANS_PROGRESS_ADD_START,
 | 
			
		||||
					alpm_pkg_get_name(newpkg), 0, pkg_count, pkg_current);
 | 
			
		||||
			PROGRESS(handle, ALPM_PROGRESS_ADD_START,
 | 
			
		||||
					newpkg->name, 0, pkg_count, pkg_current);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for(i = 0; archive_read_next_header(archive, &entry) == ARCHIVE_OK; i++) {
 | 
			
		||||
@@ -608,9 +573,6 @@ static int commit_single_pkg(pmpkg_t *newpkg, size_t pkg_current,
 | 
			
		||||
				 * (missing metadata sizes) */
 | 
			
		||||
				int64_t pos = archive_position_compressed(archive);
 | 
			
		||||
				percent = (pos * 100) / newpkg->size;
 | 
			
		||||
				_alpm_log(PM_LOG_DEBUG, "decompression progress: "
 | 
			
		||||
						"%d%% (%"PRId64" / %jd)\n",
 | 
			
		||||
						percent, pos, (intmax_t)newpkg->size);
 | 
			
		||||
				if(percent >= 100) {
 | 
			
		||||
					percent = 100;
 | 
			
		||||
				}
 | 
			
		||||
@@ -619,37 +581,38 @@ static int commit_single_pkg(pmpkg_t *newpkg, size_t pkg_current,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if(is_upgrade) {
 | 
			
		||||
				PROGRESS(trans, PM_TRANS_PROGRESS_UPGRADE_START,
 | 
			
		||||
						alpm_pkg_get_name(newpkg), percent, pkg_count,
 | 
			
		||||
						pkg_current);
 | 
			
		||||
				PROGRESS(handle, ALPM_PROGRESS_UPGRADE_START,
 | 
			
		||||
						newpkg->name, percent, pkg_count, pkg_current);
 | 
			
		||||
			} else {
 | 
			
		||||
				PROGRESS(trans, PM_TRANS_PROGRESS_ADD_START,
 | 
			
		||||
						alpm_pkg_get_name(newpkg), percent, pkg_count,
 | 
			
		||||
						pkg_current);
 | 
			
		||||
				PROGRESS(handle, ALPM_PROGRESS_ADD_START,
 | 
			
		||||
						newpkg->name, percent, pkg_count, pkg_current);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/* extract the next file from the archive */
 | 
			
		||||
			errors += extract_single_file(archive, entry, newpkg, oldpkg,
 | 
			
		||||
					trans, db);
 | 
			
		||||
			errors += extract_single_file(handle, archive, entry, newpkg, oldpkg);
 | 
			
		||||
		}
 | 
			
		||||
		archive_read_finish(archive);
 | 
			
		||||
 | 
			
		||||
		/* restore the old cwd if we have it */
 | 
			
		||||
		if(restore_cwd && chdir(cwd) != 0) {
 | 
			
		||||
			_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), cwd, strerror(errno));
 | 
			
		||||
		if(cwdfd >= 0) {
 | 
			
		||||
			if(fchdir(cwdfd) != 0) {
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_ERROR,
 | 
			
		||||
						_("could not restore working directory (%s)\n"), strerror(errno));
 | 
			
		||||
			}
 | 
			
		||||
			close(cwdfd);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(errors) {
 | 
			
		||||
			ret = -1;
 | 
			
		||||
			if(is_upgrade) {
 | 
			
		||||
				_alpm_log(PM_LOG_ERROR, _("problem occurred while upgrading %s\n"),
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_ERROR, _("problem occurred while upgrading %s\n"),
 | 
			
		||||
						newpkg->name);
 | 
			
		||||
				alpm_logaction("error: problem occurred while upgrading %s\n",
 | 
			
		||||
				alpm_logaction(handle, "error: problem occurred while upgrading %s\n",
 | 
			
		||||
						newpkg->name);
 | 
			
		||||
			} else {
 | 
			
		||||
				_alpm_log(PM_LOG_ERROR, _("problem occurred while installing %s\n"),
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_ERROR, _("problem occurred while installing %s\n"),
 | 
			
		||||
						newpkg->name);
 | 
			
		||||
				alpm_logaction("error: problem occurred while installing %s\n",
 | 
			
		||||
				alpm_logaction(handle, "error: problem occurred while installing %s\n",
 | 
			
		||||
						newpkg->name);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@@ -658,69 +621,63 @@ static int commit_single_pkg(pmpkg_t *newpkg, size_t pkg_current,
 | 
			
		||||
	/* make an install date (in UTC) */
 | 
			
		||||
	newpkg->installdate = time(NULL);
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "updating database\n");
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "adding database entry '%s'\n", newpkg->name);
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "updating database\n");
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "adding database entry '%s'\n", newpkg->name);
 | 
			
		||||
 | 
			
		||||
	if(_alpm_local_db_write(db, newpkg, INFRQ_ALL)) {
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("could not update database entry %s-%s\n"),
 | 
			
		||||
				alpm_pkg_get_name(newpkg), alpm_pkg_get_version(newpkg));
 | 
			
		||||
		alpm_logaction("error: could not update database entry %s-%s\n",
 | 
			
		||||
				alpm_pkg_get_name(newpkg), alpm_pkg_get_version(newpkg));
 | 
			
		||||
		pm_errno = PM_ERR_DB_WRITE;
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_ERROR, _("could not update database entry %s-%s\n"),
 | 
			
		||||
				newpkg->name, newpkg->version);
 | 
			
		||||
		alpm_logaction(handle, "error: could not update database entry %s-%s\n",
 | 
			
		||||
				newpkg->name, newpkg->version);
 | 
			
		||||
		handle->pm_errno = ALPM_ERR_DB_WRITE;
 | 
			
		||||
		ret = -1;
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(_alpm_db_add_pkgincache(db, newpkg) == -1) {
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("could not add entry '%s' in cache\n"),
 | 
			
		||||
				alpm_pkg_get_name(newpkg));
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_ERROR, _("could not add entry '%s' in cache\n"),
 | 
			
		||||
				newpkg->name);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(is_upgrade) {
 | 
			
		||||
		PROGRESS(trans, PM_TRANS_PROGRESS_UPGRADE_START,
 | 
			
		||||
				alpm_pkg_get_name(newpkg), 100, pkg_count, pkg_current);
 | 
			
		||||
		PROGRESS(handle, ALPM_PROGRESS_UPGRADE_START,
 | 
			
		||||
				newpkg->name, 100, pkg_count, pkg_current);
 | 
			
		||||
	} else {
 | 
			
		||||
		PROGRESS(trans, PM_TRANS_PROGRESS_ADD_START,
 | 
			
		||||
				alpm_pkg_get_name(newpkg), 100, pkg_count, pkg_current);
 | 
			
		||||
		PROGRESS(handle, ALPM_PROGRESS_ADD_START,
 | 
			
		||||
				newpkg->name, 100, pkg_count, pkg_current);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* run the post-install script if it exists  */
 | 
			
		||||
	if(alpm_pkg_has_scriptlet(newpkg)
 | 
			
		||||
			&& !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) {
 | 
			
		||||
		if(is_upgrade) {
 | 
			
		||||
			_alpm_runscriptlet(handle->root, scriptlet, "post_upgrade",
 | 
			
		||||
					alpm_pkg_get_version(newpkg),
 | 
			
		||||
					oldpkg ? alpm_pkg_get_version(oldpkg) : NULL, trans);
 | 
			
		||||
		} else {
 | 
			
		||||
			_alpm_runscriptlet(handle->root, scriptlet, "post_install",
 | 
			
		||||
					alpm_pkg_get_version(newpkg), NULL, trans);
 | 
			
		||||
		}
 | 
			
		||||
			&& !(trans->flags & ALPM_TRANS_FLAG_NOSCRIPTLET)) {
 | 
			
		||||
		char *scriptlet = _alpm_local_db_pkgpath(db, newpkg, "install");
 | 
			
		||||
		const char *scriptlet_name = is_upgrade ? "post_upgrade" : "post_install";
 | 
			
		||||
 | 
			
		||||
		_alpm_runscriptlet(handle, scriptlet, scriptlet_name,
 | 
			
		||||
				newpkg->version, oldpkg ? oldpkg->version : NULL, 0);
 | 
			
		||||
		free(scriptlet);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(is_upgrade) {
 | 
			
		||||
		EVENT(trans, PM_TRANS_EVT_UPGRADE_DONE, newpkg, oldpkg);
 | 
			
		||||
		EVENT(handle, ALPM_EVENT_UPGRADE_DONE, newpkg, oldpkg);
 | 
			
		||||
	} else {
 | 
			
		||||
		EVENT(trans, PM_TRANS_EVT_ADD_DONE, newpkg, oldpkg);
 | 
			
		||||
		EVENT(handle, ALPM_EVENT_ADD_DONE, newpkg, oldpkg);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
cleanup:
 | 
			
		||||
	_alpm_pkg_free(oldpkg);
 | 
			
		||||
	return(ret);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int _alpm_upgrade_packages(pmtrans_t *trans, pmdb_t *db)
 | 
			
		||||
int _alpm_upgrade_packages(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	size_t pkg_count, pkg_current;
 | 
			
		||||
	int skip_ldconfig = 0, ret = 0;
 | 
			
		||||
	alpm_list_t *targ;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
 | 
			
		||||
	ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
 | 
			
		||||
	alpm_trans_t *trans = handle->trans;
 | 
			
		||||
 | 
			
		||||
	if(trans->add == NULL) {
 | 
			
		||||
		return(0);
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pkg_count = alpm_list_count(trans->add);
 | 
			
		||||
@@ -728,15 +685,16 @@ int _alpm_upgrade_packages(pmtrans_t *trans, pmdb_t *db)
 | 
			
		||||
 | 
			
		||||
	/* loop through our package list adding/upgrading one at a time */
 | 
			
		||||
	for(targ = trans->add; targ; targ = targ->next) {
 | 
			
		||||
		alpm_pkg_t *newpkg = targ->data;
 | 
			
		||||
 | 
			
		||||
		if(handle->trans->state == STATE_INTERRUPTED) {
 | 
			
		||||
			return(ret);
 | 
			
		||||
			return ret;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		pmpkg_t *newpkg = (pmpkg_t *)targ->data;
 | 
			
		||||
		if(commit_single_pkg(newpkg, pkg_current, pkg_count, trans, db)) {
 | 
			
		||||
		if(commit_single_pkg(handle, newpkg, pkg_current, pkg_count)) {
 | 
			
		||||
			/* something screwed up on the commit, abort the trans */
 | 
			
		||||
			trans->state = STATE_INTERRUPTED;
 | 
			
		||||
			pm_errno = PM_ERR_TRANS_ABORT;
 | 
			
		||||
			handle->pm_errno = ALPM_ERR_TRANS_ABORT;
 | 
			
		||||
			/* running ldconfig at this point could possibly screw system */
 | 
			
		||||
			skip_ldconfig = 1;
 | 
			
		||||
			ret = -1;
 | 
			
		||||
@@ -747,10 +705,10 @@ int _alpm_upgrade_packages(pmtrans_t *trans, pmdb_t *db)
 | 
			
		||||
 | 
			
		||||
	if(!skip_ldconfig) {
 | 
			
		||||
		/* run ldconfig if it exists */
 | 
			
		||||
		_alpm_ldconfig(handle->root);
 | 
			
		||||
		_alpm_ldconfig(handle);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(ret);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
#include "alpm_list.h"
 | 
			
		||||
#include "trans.h"
 | 
			
		||||
 | 
			
		||||
int _alpm_upgrade_packages(pmtrans_t *trans, pmdb_t *db);
 | 
			
		||||
int _alpm_upgrade_packages(alpm_handle_t *handle);
 | 
			
		||||
 | 
			
		||||
#endif /* _ALPM_ADD_H */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -23,20 +23,17 @@
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
/* connection caching setup */
 | 
			
		||||
#ifdef HAVE_LIBFETCH
 | 
			
		||||
#include <fetch.h>
 | 
			
		||||
#ifdef HAVE_LIBCURL
 | 
			
		||||
#include <curl/curl.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* libalpm */
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
#include "alpm_list.h"
 | 
			
		||||
#include "handle.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
 | 
			
		||||
/* Globals */
 | 
			
		||||
enum _pmerrno_t pm_errno SYMEXPORT;
 | 
			
		||||
 | 
			
		||||
/** \addtogroup alpm_interface Interface Functions
 | 
			
		||||
 * @brief Functions to initialize and release libalpm
 | 
			
		||||
 * @{
 | 
			
		||||
@@ -44,64 +41,85 @@ enum _pmerrno_t pm_errno SYMEXPORT;
 | 
			
		||||
 | 
			
		||||
/** Initializes the library.  This must be called before any other
 | 
			
		||||
 * functions are called.
 | 
			
		||||
 * @return 0 on success, -1 on error (pm_errno is set accordingly)
 | 
			
		||||
 * @param root the root path for all filesystem operations
 | 
			
		||||
 * @param dbpath the absolute path to the libalpm database
 | 
			
		||||
 * @param err an optional variable to hold any error return codes
 | 
			
		||||
 * @return a context handle on success, NULL on error, err will be set if provided
 | 
			
		||||
 */
 | 
			
		||||
int SYMEXPORT alpm_initialize(void)
 | 
			
		||||
alpm_handle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath,
 | 
			
		||||
		enum _alpm_errno_t *err)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle == NULL, RET_ERR(PM_ERR_HANDLE_NOT_NULL, -1));
 | 
			
		||||
	enum _alpm_errno_t myerr;
 | 
			
		||||
	const char *lf = "db.lck";
 | 
			
		||||
	size_t lockfilelen;
 | 
			
		||||
	alpm_handle_t *myhandle = _alpm_handle_new();
 | 
			
		||||
 | 
			
		||||
	handle = _alpm_handle_new();
 | 
			
		||||
	if(handle == NULL) {
 | 
			
		||||
		RET_ERR(PM_ERR_MEMORY, -1);
 | 
			
		||||
	if(myhandle == NULL) {
 | 
			
		||||
		myerr = ALPM_ERR_MEMORY;
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	}
 | 
			
		||||
	if(_alpm_db_register_local() == NULL) {
 | 
			
		||||
		/* error code should be set */
 | 
			
		||||
		_alpm_handle_free(handle);
 | 
			
		||||
		handle = NULL;
 | 
			
		||||
		return(-1);
 | 
			
		||||
	if((myerr = _alpm_set_directory_option(root, &(myhandle->root), 1))) {
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	}
 | 
			
		||||
	if((myerr = _alpm_set_directory_option(dbpath, &(myhandle->dbpath), 1))) {
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lockfilelen = strlen(myhandle->dbpath) + strlen(lf) + 1;
 | 
			
		||||
	myhandle->lockfile = calloc(lockfilelen, sizeof(char));
 | 
			
		||||
	snprintf(myhandle->lockfile, lockfilelen, "%s%s", myhandle->dbpath, lf);
 | 
			
		||||
 | 
			
		||||
	if(_alpm_db_register_local(myhandle) == NULL) {
 | 
			
		||||
		myerr = myhandle->pm_errno;
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#ifdef ENABLE_NLS
 | 
			
		||||
	bindtextdomain("libalpm", LOCALEDIR);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBFETCH
 | 
			
		||||
	fetchConnectionCacheInit(5, 1);
 | 
			
		||||
#endif
 | 
			
		||||
	return myhandle;
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
cleanup:
 | 
			
		||||
	_alpm_handle_free(myhandle);
 | 
			
		||||
	if(err && myerr) {
 | 
			
		||||
		*err = myerr;
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Release the library.  This should be the last alpm call you make.
 | 
			
		||||
 * @return 0 on success, -1 on error (pm_errno is set accordingly)
 | 
			
		||||
 * After this returns, handle should be considered invalid and cannot be reused
 | 
			
		||||
 * in any way.
 | 
			
		||||
 * @param myhandle the context handle
 | 
			
		||||
 * @return 0 on success, -1 on error
 | 
			
		||||
 */
 | 
			
		||||
int SYMEXPORT alpm_release(void)
 | 
			
		||||
int SYMEXPORT alpm_release(alpm_handle_t *myhandle)
 | 
			
		||||
{
 | 
			
		||||
	pmdb_t *db;
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
	alpm_db_t *db;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	CHECK_HANDLE(myhandle, return -1);
 | 
			
		||||
 | 
			
		||||
	/* close local database */
 | 
			
		||||
	db = handle->db_local;
 | 
			
		||||
	db = myhandle->db_local;
 | 
			
		||||
	if(db) {
 | 
			
		||||
		db->ops->unregister(db);
 | 
			
		||||
		handle->db_local = NULL;
 | 
			
		||||
		myhandle->db_local = NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(alpm_db_unregister_all() == -1) {
 | 
			
		||||
		return(-1);
 | 
			
		||||
	if(alpm_db_unregister_all(myhandle) == -1) {
 | 
			
		||||
		ret = -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_handle_free(handle);
 | 
			
		||||
	handle = NULL;
 | 
			
		||||
	_alpm_handle_unlock(myhandle);
 | 
			
		||||
	_alpm_handle_free(myhandle);
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBFETCH
 | 
			
		||||
	fetchConnectionCacheClose();
 | 
			
		||||
#ifdef HAVE_LIBCURL
 | 
			
		||||
	curl_global_cleanup();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
@@ -110,9 +128,30 @@ int SYMEXPORT alpm_release(void)
 | 
			
		||||
 * @brief Various libalpm functions
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Get the version of library */
 | 
			
		||||
const char SYMEXPORT *alpm_version(void) {
 | 
			
		||||
	return(LIB_VERSION);
 | 
			
		||||
/** Get the version of library.
 | 
			
		||||
 * @return the library version, e.g. "6.0.4"
 | 
			
		||||
 * */
 | 
			
		||||
const char SYMEXPORT *alpm_version(void)
 | 
			
		||||
{
 | 
			
		||||
	return LIB_VERSION;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Get the capabilities of the library.
 | 
			
		||||
 * @return a bitmask of the capabilities
 | 
			
		||||
 * */
 | 
			
		||||
enum alpm_caps SYMEXPORT alpm_capabilities(void)
 | 
			
		||||
{
 | 
			
		||||
	return 0
 | 
			
		||||
#ifdef ENABLE_NLS
 | 
			
		||||
		| ALPM_CAPABILITY_NLS
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef HAVE_LIBCURL
 | 
			
		||||
		| ALPM_CAPABILITY_DOWNLOADER
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef HAVE_LIBGPGME
 | 
			
		||||
		| ALPM_CAPABILITY_SIGNATURES
 | 
			
		||||
#endif
 | 
			
		||||
		| 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1186
									
								
								lib/libalpm/alpm.h
									
									
									
									
									
								
							
							
						
						
									
										1186
									
								
								lib/libalpm/alpm.h
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -20,7 +20,6 @@
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
/* libalpm */
 | 
			
		||||
#include "alpm_list.h"
 | 
			
		||||
@@ -90,9 +89,9 @@ alpm_list_t SYMEXPORT *alpm_list_add(alpm_list_t *list, void *data)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *ptr, *lp;
 | 
			
		||||
 | 
			
		||||
	ptr = calloc(1, sizeof(alpm_list_t));
 | 
			
		||||
	ptr = malloc(sizeof(alpm_list_t));
 | 
			
		||||
	if(ptr == NULL) {
 | 
			
		||||
		return(list);
 | 
			
		||||
		return list;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ptr->data = data;
 | 
			
		||||
@@ -101,7 +100,7 @@ alpm_list_t SYMEXPORT *alpm_list_add(alpm_list_t *list, void *data)
 | 
			
		||||
	/* Special case: the input list is empty */
 | 
			
		||||
	if(list == NULL) {
 | 
			
		||||
		ptr->prev = ptr;
 | 
			
		||||
		return(ptr);
 | 
			
		||||
		return ptr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lp = alpm_list_last(list);
 | 
			
		||||
@@ -109,7 +108,7 @@ alpm_list_t SYMEXPORT *alpm_list_add(alpm_list_t *list, void *data)
 | 
			
		||||
	ptr->prev = lp;
 | 
			
		||||
	list->prev = ptr;
 | 
			
		||||
 | 
			
		||||
	return(list);
 | 
			
		||||
	return list;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -124,13 +123,13 @@ alpm_list_t SYMEXPORT *alpm_list_add(alpm_list_t *list, void *data)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_list_add_sorted(alpm_list_t *list, void *data, alpm_list_fn_cmp fn)
 | 
			
		||||
{
 | 
			
		||||
	if(!fn || !list) {
 | 
			
		||||
		return(alpm_list_add(list, data));
 | 
			
		||||
		return alpm_list_add(list, data);
 | 
			
		||||
	} else {
 | 
			
		||||
		alpm_list_t *add = NULL, *prev = NULL, *next = list;
 | 
			
		||||
 | 
			
		||||
		add = calloc(1, sizeof(alpm_list_t));
 | 
			
		||||
		add = malloc(sizeof(alpm_list_t));
 | 
			
		||||
		if(add == NULL) {
 | 
			
		||||
			return(list);
 | 
			
		||||
			return list;
 | 
			
		||||
		}
 | 
			
		||||
		add->data = data;
 | 
			
		||||
 | 
			
		||||
@@ -146,19 +145,19 @@ alpm_list_t SYMEXPORT *alpm_list_add_sorted(alpm_list_t *list, void *data, alpm_
 | 
			
		||||
			add->prev = list->prev; /* list != NULL */
 | 
			
		||||
			add->next = list;
 | 
			
		||||
			list->prev = add;
 | 
			
		||||
			return(add);
 | 
			
		||||
			return add;
 | 
			
		||||
		} else if(next == NULL) { /* another special case: add last element */
 | 
			
		||||
			add->prev = prev;
 | 
			
		||||
			add->next = NULL;
 | 
			
		||||
			prev->next = add;
 | 
			
		||||
			list->prev = add;
 | 
			
		||||
			return(list);
 | 
			
		||||
			return list;
 | 
			
		||||
		} else {
 | 
			
		||||
			add->prev = prev;
 | 
			
		||||
			add->next = next;
 | 
			
		||||
			next->prev = add;
 | 
			
		||||
			prev->next = add;
 | 
			
		||||
			return(list);
 | 
			
		||||
			return list;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -178,11 +177,11 @@ alpm_list_t SYMEXPORT *alpm_list_join(alpm_list_t *first, alpm_list_t *second)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *tmp;
 | 
			
		||||
 | 
			
		||||
	if (first == NULL) {
 | 
			
		||||
		return(second);
 | 
			
		||||
	if(first == NULL) {
 | 
			
		||||
		return second;
 | 
			
		||||
	}
 | 
			
		||||
	if (second == NULL) {
 | 
			
		||||
		return(first);
 | 
			
		||||
	if(second == NULL) {
 | 
			
		||||
		return first;
 | 
			
		||||
	}
 | 
			
		||||
	/* tmp is the last element of the first list */
 | 
			
		||||
	tmp = first->prev;
 | 
			
		||||
@@ -193,7 +192,7 @@ alpm_list_t SYMEXPORT *alpm_list_join(alpm_list_t *first, alpm_list_t *second)
 | 
			
		||||
	/* set the back reference to the tail */
 | 
			
		||||
	second->prev = tmp;
 | 
			
		||||
 | 
			
		||||
	return(first);
 | 
			
		||||
	return first;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -207,14 +206,20 @@ alpm_list_t SYMEXPORT *alpm_list_join(alpm_list_t *first, alpm_list_t *second)
 | 
			
		||||
 */
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_list_mmerge(alpm_list_t *left, alpm_list_t *right, alpm_list_fn_cmp fn)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *newlist, *lp;
 | 
			
		||||
	alpm_list_t *newlist, *lp, *tail_ptr, *left_tail_ptr, *right_tail_ptr;
 | 
			
		||||
 | 
			
		||||
	if (left == NULL)
 | 
			
		||||
	if(left == NULL) {
 | 
			
		||||
		return right;
 | 
			
		||||
	if (right == NULL)
 | 
			
		||||
	}
 | 
			
		||||
	if(right == NULL) {
 | 
			
		||||
		return left;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (fn(left->data, right->data) <= 0) {
 | 
			
		||||
	/* Save tail node pointers for future use */
 | 
			
		||||
	left_tail_ptr = left->prev;
 | 
			
		||||
	right_tail_ptr = right->prev;
 | 
			
		||||
 | 
			
		||||
	if(fn(left->data, right->data) <= 0) {
 | 
			
		||||
		newlist = left;
 | 
			
		||||
		left = left->next;
 | 
			
		||||
	}
 | 
			
		||||
@@ -226,8 +231,8 @@ alpm_list_t SYMEXPORT *alpm_list_mmerge(alpm_list_t *left, alpm_list_t *right, a
 | 
			
		||||
	newlist->next = NULL;
 | 
			
		||||
	lp = newlist;
 | 
			
		||||
 | 
			
		||||
	while ((left != NULL) && (right != NULL)) {
 | 
			
		||||
		if (fn(left->data, right->data) <= 0) {
 | 
			
		||||
	while((left != NULL) && (right != NULL)) {
 | 
			
		||||
		if(fn(left->data, right->data) <= 0) {
 | 
			
		||||
			lp->next = left;
 | 
			
		||||
			left->prev = lp;
 | 
			
		||||
			left = left->next;
 | 
			
		||||
@@ -240,24 +245,23 @@ alpm_list_t SYMEXPORT *alpm_list_mmerge(alpm_list_t *left, alpm_list_t *right, a
 | 
			
		||||
		lp = lp->next;
 | 
			
		||||
		lp->next = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	if (left != NULL) {
 | 
			
		||||
	if(left != NULL) {
 | 
			
		||||
		lp->next = left;
 | 
			
		||||
		left->prev = lp;
 | 
			
		||||
		tail_ptr = left_tail_ptr;
 | 
			
		||||
	}
 | 
			
		||||
	else if (right != NULL) {
 | 
			
		||||
	else if(right != NULL) {
 | 
			
		||||
		lp->next = right;
 | 
			
		||||
		right->prev = lp;
 | 
			
		||||
		tail_ptr = right_tail_ptr;
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		tail_ptr = lp;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Find our tail pointer
 | 
			
		||||
	 * TODO maintain this in the algorithm itself */
 | 
			
		||||
	lp = newlist;
 | 
			
		||||
	while(lp && lp->next) {
 | 
			
		||||
		lp = lp->next;
 | 
			
		||||
	}
 | 
			
		||||
	newlist->prev = lp;
 | 
			
		||||
	newlist->prev = tail_ptr;
 | 
			
		||||
 | 
			
		||||
	return(newlist);
 | 
			
		||||
	return newlist;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -271,7 +275,7 @@ alpm_list_t SYMEXPORT *alpm_list_mmerge(alpm_list_t *left, alpm_list_t *right, a
 | 
			
		||||
 */
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_list_msort(alpm_list_t *list, size_t n, alpm_list_fn_cmp fn)
 | 
			
		||||
{
 | 
			
		||||
	if (n > 1) {
 | 
			
		||||
	if(n > 1) {
 | 
			
		||||
		alpm_list_t *left = list;
 | 
			
		||||
		alpm_list_t *lastleft = alpm_list_nth(list, n/2 - 1);
 | 
			
		||||
		alpm_list_t *right = lastleft->next;
 | 
			
		||||
@@ -282,12 +286,12 @@ alpm_list_t SYMEXPORT *alpm_list_msort(alpm_list_t *list, size_t n, alpm_list_fn
 | 
			
		||||
		right = alpm_list_msort(right, n - (n/2), fn);
 | 
			
		||||
		list = alpm_list_mmerge(left, right, fn);
 | 
			
		||||
	}
 | 
			
		||||
	return(list);
 | 
			
		||||
	return list;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Remove an item from the list.
 | 
			
		||||
 * item is not freed; this is the responsiblity of the caller.
 | 
			
		||||
 * item is not freed; this is the responsibility of the caller.
 | 
			
		||||
 *
 | 
			
		||||
 * @param haystack the list to remove the item from
 | 
			
		||||
 * @param item the item to remove from the list
 | 
			
		||||
@@ -298,7 +302,7 @@ alpm_list_t SYMEXPORT *alpm_list_remove_item(alpm_list_t *haystack,
 | 
			
		||||
		alpm_list_t *item)
 | 
			
		||||
{
 | 
			
		||||
	if(haystack == NULL || item == NULL) {
 | 
			
		||||
		return(haystack);
 | 
			
		||||
		return haystack;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(item == haystack) {
 | 
			
		||||
@@ -328,7 +332,7 @@ alpm_list_t SYMEXPORT *alpm_list_remove_item(alpm_list_t *haystack,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(haystack);
 | 
			
		||||
	return haystack;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -352,7 +356,7 @@ alpm_list_t SYMEXPORT *alpm_list_remove(alpm_list_t *haystack,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(needle == NULL) {
 | 
			
		||||
		return(haystack);
 | 
			
		||||
		return haystack;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while(i) {
 | 
			
		||||
@@ -373,7 +377,7 @@ alpm_list_t SYMEXPORT *alpm_list_remove(alpm_list_t *haystack,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(haystack);
 | 
			
		||||
	return haystack;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -388,8 +392,8 @@ alpm_list_t SYMEXPORT *alpm_list_remove(alpm_list_t *haystack,
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_list_remove_str(alpm_list_t *haystack,
 | 
			
		||||
		const char *needle, char **data)
 | 
			
		||||
{
 | 
			
		||||
	return(alpm_list_remove(haystack, (const void *)needle,
 | 
			
		||||
				(alpm_list_fn_cmp)strcmp, (void **)data));
 | 
			
		||||
	return alpm_list_remove(haystack, (const void *)needle,
 | 
			
		||||
			(alpm_list_fn_cmp)strcmp, (void **)data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -411,7 +415,7 @@ alpm_list_t SYMEXPORT *alpm_list_remove_dupes(const alpm_list_t *list)
 | 
			
		||||
		}
 | 
			
		||||
		lp = lp->next;
 | 
			
		||||
	}
 | 
			
		||||
	return(newlist);
 | 
			
		||||
	return newlist;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -429,7 +433,7 @@ alpm_list_t SYMEXPORT *alpm_list_strdup(const alpm_list_t *list)
 | 
			
		||||
		newlist = alpm_list_add(newlist, strdup(lp->data));
 | 
			
		||||
		lp = lp->next;
 | 
			
		||||
	}
 | 
			
		||||
	return(newlist);
 | 
			
		||||
	return newlist;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -447,7 +451,7 @@ alpm_list_t SYMEXPORT *alpm_list_copy(const alpm_list_t *list)
 | 
			
		||||
		newlist = alpm_list_add(newlist, lp->data);
 | 
			
		||||
		lp = lp->next;
 | 
			
		||||
	}
 | 
			
		||||
	return(newlist);
 | 
			
		||||
	return newlist;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -466,14 +470,14 @@ alpm_list_t SYMEXPORT *alpm_list_copy_data(const alpm_list_t *list,
 | 
			
		||||
	const alpm_list_t *lp = list;
 | 
			
		||||
	alpm_list_t *newlist = NULL;
 | 
			
		||||
	while(lp) {
 | 
			
		||||
		void *newdata = calloc(1, size);
 | 
			
		||||
		void *newdata = malloc(size);
 | 
			
		||||
		if(newdata) {
 | 
			
		||||
			memcpy(newdata, lp->data, size);
 | 
			
		||||
			newlist = alpm_list_add(newlist, newdata);
 | 
			
		||||
			lp = lp->next;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return(newlist);
 | 
			
		||||
	return newlist;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -489,7 +493,7 @@ alpm_list_t SYMEXPORT *alpm_list_reverse(alpm_list_t *list)
 | 
			
		||||
	alpm_list_t *newlist = NULL, *backup;
 | 
			
		||||
 | 
			
		||||
	if(list == NULL) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lp = alpm_list_last(list);
 | 
			
		||||
@@ -502,27 +506,11 @@ alpm_list_t SYMEXPORT *alpm_list_reverse(alpm_list_t *list)
 | 
			
		||||
		lp = lp->prev;
 | 
			
		||||
	}
 | 
			
		||||
	list->prev = backup; /* restore tail pointer */
 | 
			
		||||
	return(newlist);
 | 
			
		||||
	return newlist;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Accessors */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get the first element of a list.
 | 
			
		||||
 *
 | 
			
		||||
 * @param list the list
 | 
			
		||||
 *
 | 
			
		||||
 * @return the first element in the list
 | 
			
		||||
 */
 | 
			
		||||
inline alpm_list_t SYMEXPORT *alpm_list_first(const alpm_list_t *list)
 | 
			
		||||
{
 | 
			
		||||
	if(list) {
 | 
			
		||||
		return((alpm_list_t*)list);
 | 
			
		||||
	} else {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Return nth element from list (starting from 0).
 | 
			
		||||
 *
 | 
			
		||||
@@ -537,7 +525,7 @@ alpm_list_t SYMEXPORT *alpm_list_nth(const alpm_list_t *list, size_t n)
 | 
			
		||||
	while(n--) {
 | 
			
		||||
		i = i->next;
 | 
			
		||||
	}
 | 
			
		||||
	return((alpm_list_t*)i);
 | 
			
		||||
	return (alpm_list_t *)i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -550,9 +538,25 @@ alpm_list_t SYMEXPORT *alpm_list_nth(const alpm_list_t *list, size_t n)
 | 
			
		||||
inline alpm_list_t SYMEXPORT *alpm_list_next(const alpm_list_t *node)
 | 
			
		||||
{
 | 
			
		||||
	if(node) {
 | 
			
		||||
		return(node->next);
 | 
			
		||||
		return node->next;
 | 
			
		||||
	} else {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get the previous element of a list.
 | 
			
		||||
 *
 | 
			
		||||
 * @param list the list head
 | 
			
		||||
 *
 | 
			
		||||
 * @return the previous element, or NULL when no previous element exist
 | 
			
		||||
 */
 | 
			
		||||
inline alpm_list_t SYMEXPORT *alpm_list_previous(const alpm_list_t *list)
 | 
			
		||||
{
 | 
			
		||||
	if(list && list->prev->next) {
 | 
			
		||||
		return list->prev;
 | 
			
		||||
	} else {
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -566,9 +570,9 @@ inline alpm_list_t SYMEXPORT *alpm_list_next(const alpm_list_t *node)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_list_last(const alpm_list_t *list)
 | 
			
		||||
{
 | 
			
		||||
	if(list) {
 | 
			
		||||
		return(list->prev);
 | 
			
		||||
		return list->prev;
 | 
			
		||||
	} else {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -581,8 +585,8 @@ alpm_list_t SYMEXPORT *alpm_list_last(const alpm_list_t *list)
 | 
			
		||||
 */
 | 
			
		||||
void SYMEXPORT *alpm_list_getdata(const alpm_list_t *node)
 | 
			
		||||
{
 | 
			
		||||
	if(node == NULL) return(NULL);
 | 
			
		||||
	return(node->data);
 | 
			
		||||
	if(node == NULL) return NULL;
 | 
			
		||||
	return node->data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Misc */
 | 
			
		||||
@@ -602,7 +606,7 @@ size_t SYMEXPORT alpm_list_count(const alpm_list_t *list)
 | 
			
		||||
		++i;
 | 
			
		||||
		lp = lp->next;
 | 
			
		||||
	}
 | 
			
		||||
	return(i);
 | 
			
		||||
	return i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -620,17 +624,17 @@ void SYMEXPORT *alpm_list_find(const alpm_list_t *haystack, const void *needle,
 | 
			
		||||
	const alpm_list_t *lp = haystack;
 | 
			
		||||
	while(lp) {
 | 
			
		||||
		if(lp->data && fn(lp->data, needle) == 0) {
 | 
			
		||||
			return(lp->data);
 | 
			
		||||
			return lp->data;
 | 
			
		||||
		}
 | 
			
		||||
		lp = lp->next;
 | 
			
		||||
	}
 | 
			
		||||
	return(NULL);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* trivial helper function for alpm_list_find_ptr */
 | 
			
		||||
static int ptr_cmp(const void *p, const void *q)
 | 
			
		||||
{
 | 
			
		||||
	return(p != q);
 | 
			
		||||
	return (p != q);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -643,9 +647,10 @@ static int ptr_cmp(const void *p, const void *q)
 | 
			
		||||
 *
 | 
			
		||||
 * @return `needle` if found, NULL otherwise
 | 
			
		||||
 */
 | 
			
		||||
void SYMEXPORT *alpm_list_find_ptr(const alpm_list_t *haystack, const void *needle)
 | 
			
		||||
void SYMEXPORT *alpm_list_find_ptr(const alpm_list_t *haystack,
 | 
			
		||||
		const void *needle)
 | 
			
		||||
{
 | 
			
		||||
	return(alpm_list_find(haystack, needle, ptr_cmp));
 | 
			
		||||
	return alpm_list_find(haystack, needle, ptr_cmp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -659,8 +664,8 @@ void SYMEXPORT *alpm_list_find_ptr(const alpm_list_t *haystack, const void *need
 | 
			
		||||
char SYMEXPORT *alpm_list_find_str(const alpm_list_t *haystack,
 | 
			
		||||
		const char *needle)
 | 
			
		||||
{
 | 
			
		||||
	return((char *)alpm_list_find(haystack, (const void*)needle,
 | 
			
		||||
				(alpm_list_fn_cmp)strcmp));
 | 
			
		||||
	return (char *)alpm_list_find(haystack, (const void *)needle,
 | 
			
		||||
			(alpm_list_fn_cmp)strcmp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -688,7 +693,7 @@ void SYMEXPORT alpm_list_diff_sorted(const alpm_list_t *left,
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (l != NULL && r != NULL) {
 | 
			
		||||
	while(l != NULL && r != NULL) {
 | 
			
		||||
		int cmp = fn(l->data, r->data);
 | 
			
		||||
		if(cmp < 0) {
 | 
			
		||||
			if(onlyleft) {
 | 
			
		||||
@@ -706,13 +711,13 @@ void SYMEXPORT alpm_list_diff_sorted(const alpm_list_t *left,
 | 
			
		||||
			r = r->next;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	while (l != NULL) {
 | 
			
		||||
	while(l != NULL) {
 | 
			
		||||
		if(onlyleft) {
 | 
			
		||||
			*onlyleft = alpm_list_add(*onlyleft, l->data);
 | 
			
		||||
		}
 | 
			
		||||
		l = l->next;
 | 
			
		||||
	}
 | 
			
		||||
	while (r != NULL) {
 | 
			
		||||
	while(r != NULL) {
 | 
			
		||||
		if(onlyright) {
 | 
			
		||||
			*onlyright = alpm_list_add(*onlyright, r->data);
 | 
			
		||||
		}
 | 
			
		||||
@@ -745,7 +750,39 @@ alpm_list_t SYMEXPORT *alpm_list_diff(const alpm_list_t *lhs,
 | 
			
		||||
 | 
			
		||||
	alpm_list_free(left);
 | 
			
		||||
	alpm_list_free(right);
 | 
			
		||||
	return(ret);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Copy a list and data into a standard C array of fixed length.
 | 
			
		||||
 * Note that the data elements are shallow copied so any contained pointers
 | 
			
		||||
 * will point to the original data.
 | 
			
		||||
 *
 | 
			
		||||
 * @param list the list to copy
 | 
			
		||||
 * @param n    the size of the list
 | 
			
		||||
 * @param size the size of each data element
 | 
			
		||||
 *
 | 
			
		||||
 * @return an array version of the original list, data copied as well
 | 
			
		||||
 */
 | 
			
		||||
void SYMEXPORT *alpm_list_to_array(const alpm_list_t *list, size_t n,
 | 
			
		||||
		size_t size)
 | 
			
		||||
{
 | 
			
		||||
	size_t i;
 | 
			
		||||
	const alpm_list_t *item;
 | 
			
		||||
	char *array;
 | 
			
		||||
 | 
			
		||||
	if(n == 0) {
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	array = malloc(n * size);
 | 
			
		||||
	if(array == NULL) {
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	for(i = 0, item = list; i < n && item; i++, item = item->next) {
 | 
			
		||||
		memcpy(array + i * size, item->data, size);
 | 
			
		||||
	}
 | 
			
		||||
	return array;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 
 | 
			
		||||
@@ -67,9 +67,9 @@ alpm_list_t *alpm_list_copy_data(const alpm_list_t *list, size_t size);
 | 
			
		||||
alpm_list_t *alpm_list_reverse(alpm_list_t *list);
 | 
			
		||||
 | 
			
		||||
/* item accessors */
 | 
			
		||||
alpm_list_t *alpm_list_first(const alpm_list_t *list);
 | 
			
		||||
alpm_list_t *alpm_list_nth(const alpm_list_t *list, size_t n);
 | 
			
		||||
alpm_list_t *alpm_list_next(const alpm_list_t *list);
 | 
			
		||||
alpm_list_t *alpm_list_previous(const alpm_list_t *list);
 | 
			
		||||
alpm_list_t *alpm_list_last(const alpm_list_t *list);
 | 
			
		||||
void *alpm_list_getdata(const alpm_list_t *entry);
 | 
			
		||||
 | 
			
		||||
@@ -81,6 +81,7 @@ char *alpm_list_find_str(const alpm_list_t *haystack, const char *needle);
 | 
			
		||||
alpm_list_t *alpm_list_diff(const alpm_list_t *lhs, const alpm_list_t *rhs, alpm_list_fn_cmp fn);
 | 
			
		||||
void alpm_list_diff_sorted(const alpm_list_t *left, const alpm_list_t *right,
 | 
			
		||||
		alpm_list_fn_cmp fn, alpm_list_t **onlyleft, alpm_list_t **onlyright);
 | 
			
		||||
void *alpm_list_to_array(const alpm_list_t *list, size_t n, size_t size);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -32,82 +32,67 @@
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
 | 
			
		||||
/* split a backup string "file\thash" into two strings : file and hash */
 | 
			
		||||
static int backup_split(const char *string, char **file, char **hash)
 | 
			
		||||
/* split a backup string "file\thash" into the relevant components */
 | 
			
		||||
int _alpm_split_backup(const char *string, alpm_backup_t **backup)
 | 
			
		||||
{
 | 
			
		||||
	char *str = strdup(string);
 | 
			
		||||
	char *ptr;
 | 
			
		||||
	char *str, *ptr;
 | 
			
		||||
 | 
			
		||||
	STRDUP(str, string, return -1);
 | 
			
		||||
 | 
			
		||||
	/* tab delimiter */
 | 
			
		||||
	ptr = strchr(str, '\t');
 | 
			
		||||
	ptr = str ? strchr(str, '\t') : NULL;
 | 
			
		||||
	if(ptr == NULL) {
 | 
			
		||||
		if(file) {
 | 
			
		||||
			*file = str;
 | 
			
		||||
		} else {
 | 
			
		||||
			/* don't need our dup as the fname wasn't requested, so free it */
 | 
			
		||||
			FREE(str);
 | 
			
		||||
		}
 | 
			
		||||
		return(0);
 | 
			
		||||
		(*backup)->name = str;
 | 
			
		||||
		(*backup)->hash = NULL;
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	*ptr = '\0';
 | 
			
		||||
	ptr++;
 | 
			
		||||
	/* now str points to the filename and ptr points to the hash */
 | 
			
		||||
	if(file) {
 | 
			
		||||
		*file = strdup(str);
 | 
			
		||||
	}
 | 
			
		||||
	if(hash) {
 | 
			
		||||
		*hash = strdup(ptr);
 | 
			
		||||
	}
 | 
			
		||||
	STRDUP((*backup)->name, str, return -1);
 | 
			
		||||
	STRDUP((*backup)->hash, ptr, return -1);
 | 
			
		||||
	FREE(str);
 | 
			
		||||
	return(1);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *_alpm_backup_file(const char *string)
 | 
			
		||||
{
 | 
			
		||||
	char *file = NULL;
 | 
			
		||||
	backup_split(string, &file, NULL);
 | 
			
		||||
	return(file);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *_alpm_backup_hash(const char *string)
 | 
			
		||||
{
 | 
			
		||||
	char *hash = NULL;
 | 
			
		||||
	backup_split(string, NULL, &hash);
 | 
			
		||||
	return(hash);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Look for a filename in a pmpkg_t.backup list.  If we find it,
 | 
			
		||||
 * then we return the md5 hash (parsed from the same line)
 | 
			
		||||
/* Look for a filename in a alpm_pkg_t.backup list. If we find it,
 | 
			
		||||
 * then we return the full backup entry.
 | 
			
		||||
 */
 | 
			
		||||
char *_alpm_needbackup(const char *file, const alpm_list_t *backup)
 | 
			
		||||
alpm_backup_t *_alpm_needbackup(const char *file, alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	const alpm_list_t *lp;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(file == NULL || backup == NULL) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
	if(file == NULL || pkg == NULL) {
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* run through the backup list and parse out the hash for our file */
 | 
			
		||||
	for(lp = backup; lp; lp = lp->next) {
 | 
			
		||||
		char *filename = NULL;
 | 
			
		||||
		char *hash = NULL;
 | 
			
		||||
	for(lp = alpm_pkg_get_backup(pkg); lp; lp = lp->next) {
 | 
			
		||||
		alpm_backup_t *backup = lp->data;
 | 
			
		||||
 | 
			
		||||
		/* no hash found */
 | 
			
		||||
		if(!backup_split((char *)lp->data, &filename, &hash)) {
 | 
			
		||||
			FREE(filename);
 | 
			
		||||
			continue;
 | 
			
		||||
		if(strcmp(file, backup->name) == 0) {
 | 
			
		||||
			return backup;
 | 
			
		||||
		}
 | 
			
		||||
		if(strcmp(file, filename) == 0) {
 | 
			
		||||
			FREE(filename);
 | 
			
		||||
			return(hash);
 | 
			
		||||
		}
 | 
			
		||||
		FREE(filename);
 | 
			
		||||
		FREE(hash);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(NULL);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_backup_free(alpm_backup_t *backup)
 | 
			
		||||
{
 | 
			
		||||
	free(backup->name);
 | 
			
		||||
	free(backup->hash);
 | 
			
		||||
	free(backup);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_backup_t *_alpm_backup_dup(const alpm_backup_t *backup)
 | 
			
		||||
{
 | 
			
		||||
	alpm_backup_t *newbackup;
 | 
			
		||||
	CALLOC(newbackup, 1, sizeof(alpm_backup_t), return NULL);
 | 
			
		||||
 | 
			
		||||
	STRDUP(newbackup->name, backup->name, return NULL);
 | 
			
		||||
	STRDUP(newbackup->hash, backup->hash, return NULL);
 | 
			
		||||
 | 
			
		||||
	return newbackup;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -21,10 +21,12 @@
 | 
			
		||||
#define _ALPM_BACKUP_H
 | 
			
		||||
 | 
			
		||||
#include "alpm_list.h"
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
 | 
			
		||||
char *_alpm_backup_file(const char *string);
 | 
			
		||||
char *_alpm_backup_hash(const char *string);
 | 
			
		||||
char *_alpm_needbackup(const char *file, const alpm_list_t *backup);
 | 
			
		||||
int _alpm_split_backup(const char *string, alpm_backup_t **backup);
 | 
			
		||||
alpm_backup_t *_alpm_needbackup(const char *file, alpm_pkg_t *pkg);
 | 
			
		||||
void _alpm_backup_free(alpm_backup_t *backup);
 | 
			
		||||
alpm_backup_t *_alpm_backup_dup(const alpm_backup_t *backup);
 | 
			
		||||
 | 
			
		||||
#endif /* _ALPM_BACKUP_H */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										190
									
								
								lib/libalpm/base64.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								lib/libalpm/base64.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,190 @@
 | 
			
		||||
/*
 | 
			
		||||
 *  RFC 1521 base64 encoding/decoding
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2010, Brainspark B.V.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of PolarSSL (http://www.polarssl.org)
 | 
			
		||||
 *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
 | 
			
		||||
 *
 | 
			
		||||
 *  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 *  This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU General Public License as published by
 | 
			
		||||
 *  the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 *  (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 *  This program is distributed in the hope that it will be useful,
 | 
			
		||||
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 *  GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 *  You should have received a copy of the GNU General Public License
 | 
			
		||||
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 *  Pacman Notes:
 | 
			
		||||
 *
 | 
			
		||||
 *  Taken from the PolarSSL project at www.polarssl.org under terms of the
 | 
			
		||||
 *  GPL. This is from version 0.14.2 of the library, and has been modified
 | 
			
		||||
 *  as following, which may be helpful for future updates:
 | 
			
		||||
 *  * remove "polarssl/config.h" include
 | 
			
		||||
 *  * change include from "polarssl/base64.h" to "base64.h"
 | 
			
		||||
 *  * removal of SELF_TEST code
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "base64.h"
 | 
			
		||||
 | 
			
		||||
static const unsigned char base64_enc_map[64] =
 | 
			
		||||
{
 | 
			
		||||
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
 | 
			
		||||
    'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
 | 
			
		||||
    'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
 | 
			
		||||
    'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
 | 
			
		||||
    'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
 | 
			
		||||
    'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
 | 
			
		||||
    '8', '9', '+', '/'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const unsigned char base64_dec_map[128] =
 | 
			
		||||
{
 | 
			
		||||
    127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
 | 
			
		||||
    127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
 | 
			
		||||
    127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
 | 
			
		||||
    127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
 | 
			
		||||
    127, 127, 127,  62, 127, 127, 127,  63,  52,  53,
 | 
			
		||||
     54,  55,  56,  57,  58,  59,  60,  61, 127, 127,
 | 
			
		||||
    127,  64, 127, 127, 127,   0,   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, 127, 127, 127, 127, 127, 127,  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, 127, 127, 127, 127, 127
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Encode a buffer into base64 format
 | 
			
		||||
 */
 | 
			
		||||
int base64_encode( unsigned char *dst, size_t *dlen,
 | 
			
		||||
                   const unsigned char *src, size_t slen )
 | 
			
		||||
{
 | 
			
		||||
    size_t i, n;
 | 
			
		||||
    int C1, C2, C3;
 | 
			
		||||
    unsigned char *p;
 | 
			
		||||
 | 
			
		||||
    if( slen == 0 )
 | 
			
		||||
        return( 0 );
 | 
			
		||||
 | 
			
		||||
    n = (slen << 3) / 6;
 | 
			
		||||
 | 
			
		||||
    switch( (slen << 3) - (n * 6) )
 | 
			
		||||
    {
 | 
			
		||||
        case  2: n += 3; break;
 | 
			
		||||
        case  4: n += 2; break;
 | 
			
		||||
        default: break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if( *dlen < n + 1 )
 | 
			
		||||
    {
 | 
			
		||||
        *dlen = n + 1;
 | 
			
		||||
        return( POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    n = (slen / 3) * 3;
 | 
			
		||||
 | 
			
		||||
    for( i = 0, p = dst; i < n; i += 3 )
 | 
			
		||||
    {
 | 
			
		||||
        C1 = *src++;
 | 
			
		||||
        C2 = *src++;
 | 
			
		||||
        C3 = *src++;
 | 
			
		||||
 | 
			
		||||
        *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
 | 
			
		||||
        *p++ = base64_enc_map[(((C1 &  3) << 4) + (C2 >> 4)) & 0x3F];
 | 
			
		||||
        *p++ = base64_enc_map[(((C2 & 15) << 2) + (C3 >> 6)) & 0x3F];
 | 
			
		||||
        *p++ = base64_enc_map[C3 & 0x3F];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if( i < slen )
 | 
			
		||||
    {
 | 
			
		||||
        C1 = *src++;
 | 
			
		||||
        C2 = ((i + 1) < slen) ? *src++ : 0;
 | 
			
		||||
 | 
			
		||||
        *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
 | 
			
		||||
        *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
 | 
			
		||||
 | 
			
		||||
        if( (i + 1) < slen )
 | 
			
		||||
             *p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F];
 | 
			
		||||
        else *p++ = '=';
 | 
			
		||||
 | 
			
		||||
        *p++ = '=';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *dlen = p - dst;
 | 
			
		||||
    *p = 0;
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Decode a base64-formatted buffer
 | 
			
		||||
 */
 | 
			
		||||
int base64_decode( unsigned char *dst, size_t *dlen,
 | 
			
		||||
                   const unsigned char *src, size_t slen )
 | 
			
		||||
{
 | 
			
		||||
    size_t i, j, n;
 | 
			
		||||
    unsigned long x;
 | 
			
		||||
    unsigned char *p;
 | 
			
		||||
 | 
			
		||||
    for( i = j = n = 0; i < slen; i++ )
 | 
			
		||||
    {
 | 
			
		||||
        if( ( slen - i ) >= 2 &&
 | 
			
		||||
            src[i] == '\r' && src[i + 1] == '\n' )
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
        if( src[i] == '\n' )
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
        if( src[i] == '=' && ++j > 2 )
 | 
			
		||||
            return( POLARSSL_ERR_BASE64_INVALID_CHARACTER );
 | 
			
		||||
 | 
			
		||||
        if( src[i] > 127 || base64_dec_map[src[i]] == 127 )
 | 
			
		||||
            return( POLARSSL_ERR_BASE64_INVALID_CHARACTER );
 | 
			
		||||
 | 
			
		||||
        if( base64_dec_map[src[i]] < 64 && j != 0 )
 | 
			
		||||
            return( POLARSSL_ERR_BASE64_INVALID_CHARACTER );
 | 
			
		||||
 | 
			
		||||
        n++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if( n == 0 )
 | 
			
		||||
        return( 0 );
 | 
			
		||||
 | 
			
		||||
    n = ((n * 6) + 7) >> 3;
 | 
			
		||||
 | 
			
		||||
    if( *dlen < n )
 | 
			
		||||
    {
 | 
			
		||||
        *dlen = n;
 | 
			
		||||
        return( POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
 | 
			
		||||
   {
 | 
			
		||||
        if( *src == '\r' || *src == '\n' )
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
        j -= ( base64_dec_map[*src] == 64 );
 | 
			
		||||
        x  = (x << 6) | ( base64_dec_map[*src] & 0x3F );
 | 
			
		||||
 | 
			
		||||
        if( ++n == 4 )
 | 
			
		||||
        {
 | 
			
		||||
            n = 0;
 | 
			
		||||
            if( j > 0 ) *p++ = (unsigned char)( x >> 16 );
 | 
			
		||||
            if( j > 1 ) *p++ = (unsigned char)( x >>  8 );
 | 
			
		||||
            if( j > 2 ) *p++ = (unsigned char)( x       );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *dlen = p - dst;
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										70
									
								
								lib/libalpm/base64.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								lib/libalpm/base64.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
/**
 | 
			
		||||
 * \file base64.h
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2010, Brainspark B.V.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of PolarSSL (http://www.polarssl.org)
 | 
			
		||||
 *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
 | 
			
		||||
 *
 | 
			
		||||
 *  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 *  This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU General Public License as published by
 | 
			
		||||
 *  the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 *  (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 *  This program is distributed in the hope that it will be useful,
 | 
			
		||||
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 *  GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 *  You should have received a copy of the GNU General Public License
 | 
			
		||||
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _BASE64_H
 | 
			
		||||
#define _BASE64_H
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#define POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL               -0x0010  /**< Output buffer too small. */
 | 
			
		||||
#define POLARSSL_ERR_BASE64_INVALID_CHARACTER              -0x0012  /**< Invalid character in input. */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Encode a buffer into base64 format
 | 
			
		||||
 *
 | 
			
		||||
 * \param dst      destination buffer
 | 
			
		||||
 * \param dlen     size of the buffer
 | 
			
		||||
 * \param src      source buffer
 | 
			
		||||
 * \param slen     amount of data to be encoded
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, or POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL.
 | 
			
		||||
 *                 *dlen is always updated to reflect the amount
 | 
			
		||||
 *                 of data that has (or would have) been written.
 | 
			
		||||
 *
 | 
			
		||||
 * \note           Call this function with *dlen = 0 to obtain the
 | 
			
		||||
 *                 required buffer size in *dlen
 | 
			
		||||
 */
 | 
			
		||||
int base64_encode( unsigned char *dst, size_t *dlen,
 | 
			
		||||
                   const unsigned char *src, size_t slen );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Decode a base64-formatted buffer
 | 
			
		||||
 *
 | 
			
		||||
 * \param dst      destination buffer
 | 
			
		||||
 * \param dlen     size of the buffer
 | 
			
		||||
 * \param src      source buffer
 | 
			
		||||
 * \param slen     amount of data to be decoded
 | 
			
		||||
 *
 | 
			
		||||
 * \return         0 if successful, POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL, or
 | 
			
		||||
 *                 POLARSSL_ERR_BASE64_INVALID_DATA if the input data is not
 | 
			
		||||
 *                 correct. *dlen is always updated to reflect the amount
 | 
			
		||||
 *                 of data that has (or would have) been written.
 | 
			
		||||
 *
 | 
			
		||||
 * \note           Call this function with *dlen = 0 to obtain the
 | 
			
		||||
 *                 required buffer size in *dlen
 | 
			
		||||
 */
 | 
			
		||||
int base64_decode( unsigned char *dst, size_t *dlen,
 | 
			
		||||
                   const unsigned char *src, size_t slen );
 | 
			
		||||
 | 
			
		||||
#endif /* base64.h */
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 *  be_package.c
 | 
			
		||||
 *  be_package.c : backend for packages
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (c) 2006-2011 Pacman Development Team <pacman-dev@archlinux.org>
 | 
			
		||||
 *  Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
 | 
			
		||||
@@ -20,10 +20,8 @@
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
/* libarchive */
 | 
			
		||||
@@ -32,8 +30,10 @@
 | 
			
		||||
 | 
			
		||||
/* libalpm */
 | 
			
		||||
#include "alpm_list.h"
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "handle.h"
 | 
			
		||||
#include "package.h"
 | 
			
		||||
#include "deps.h" /* _alpm_splitdep */
 | 
			
		||||
 | 
			
		||||
@@ -43,40 +43,38 @@
 | 
			
		||||
 * @param pkg the package (file) to read the changelog
 | 
			
		||||
 * @return a 'file stream' to the package changelog
 | 
			
		||||
 */
 | 
			
		||||
static void *_package_changelog_open(pmpkg_t *pkg)
 | 
			
		||||
static void *_package_changelog_open(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	ASSERT(pkg != NULL, return(NULL));
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
 | 
			
		||||
	struct archive *archive = NULL;
 | 
			
		||||
	struct archive_entry *entry;
 | 
			
		||||
	const char *pkgfile = pkg->origin_data.file;
 | 
			
		||||
 | 
			
		||||
	if((archive = archive_read_new()) == NULL) {
 | 
			
		||||
		RET_ERR(PM_ERR_LIBARCHIVE, NULL);
 | 
			
		||||
		RET_ERR(pkg->handle, ALPM_ERR_LIBARCHIVE, NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	archive_read_support_compression_all(archive);
 | 
			
		||||
	archive_read_support_format_all(archive);
 | 
			
		||||
 | 
			
		||||
	if (archive_read_open_filename(archive, pkgfile,
 | 
			
		||||
	if(archive_read_open_filename(archive, pkgfile,
 | 
			
		||||
				ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) {
 | 
			
		||||
		RET_ERR(PM_ERR_PKG_OPEN, NULL);
 | 
			
		||||
		RET_ERR(pkg->handle, ALPM_ERR_PKG_OPEN, NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while(archive_read_next_header(archive, &entry) == ARCHIVE_OK) {
 | 
			
		||||
		const char *entry_name = archive_entry_pathname(entry);
 | 
			
		||||
 | 
			
		||||
		if(strcmp(entry_name, ".CHANGELOG") == 0) {
 | 
			
		||||
			return(archive);
 | 
			
		||||
			return archive;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	/* we didn't find a changelog */
 | 
			
		||||
	archive_read_finish(archive);
 | 
			
		||||
	errno = ENOENT;
 | 
			
		||||
 | 
			
		||||
	return(NULL);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -89,26 +87,17 @@ static void *_package_changelog_open(pmpkg_t *pkg)
 | 
			
		||||
 * @return the number of characters read, or 0 if there is no more data
 | 
			
		||||
 */
 | 
			
		||||
static size_t _package_changelog_read(void *ptr, size_t size,
 | 
			
		||||
		const pmpkg_t *pkg, const void *fp)
 | 
			
		||||
		const alpm_pkg_t UNUSED *pkg, void *fp)
 | 
			
		||||
{
 | 
			
		||||
	ssize_t sret = archive_read_data((struct archive*)fp, ptr, size);
 | 
			
		||||
	ssize_t sret = archive_read_data((struct archive *)fp, ptr, size);
 | 
			
		||||
	/* Report error (negative values) */
 | 
			
		||||
	if(sret < 0) {
 | 
			
		||||
		pm_errno = PM_ERR_LIBARCHIVE;
 | 
			
		||||
		return(0);
 | 
			
		||||
		RET_ERR(pkg->handle, ALPM_ERR_LIBARCHIVE, 0);
 | 
			
		||||
	} else {
 | 
			
		||||
		return((size_t)sret);
 | 
			
		||||
		return (size_t)sret;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
static int _package_changelog_feof(const pmpkg_t *pkg, void *fp)
 | 
			
		||||
{
 | 
			
		||||
	// note: this doesn't quite work, no feof in libarchive
 | 
			
		||||
	return( archive_read_data((struct archive*)fp, NULL, 0) );
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Close a package changelog for reading. Similar to fclose in functionality,
 | 
			
		||||
 * except that the 'file stream' is from an archive.
 | 
			
		||||
@@ -116,9 +105,9 @@ static int _package_changelog_feof(const pmpkg_t *pkg, void *fp)
 | 
			
		||||
 * @param fp a 'file stream' to the package changelog
 | 
			
		||||
 * @return whether closing the package changelog stream was successful
 | 
			
		||||
 */
 | 
			
		||||
static int _package_changelog_close(const pmpkg_t *pkg, void *fp)
 | 
			
		||||
static int _package_changelog_close(const alpm_pkg_t UNUSED *pkg, void *fp)
 | 
			
		||||
{
 | 
			
		||||
	return( archive_read_finish((struct archive *)fp) );
 | 
			
		||||
	return archive_read_finish((struct archive *)fp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Package file operations struct accessor. We implement this as a method
 | 
			
		||||
@@ -137,146 +126,276 @@ static struct pkg_operations *get_file_pkg_ops(void)
 | 
			
		||||
		file_pkg_ops.changelog_close = _package_changelog_close;
 | 
			
		||||
		file_pkg_ops_initialized = 1;
 | 
			
		||||
	}
 | 
			
		||||
	return(&file_pkg_ops);
 | 
			
		||||
	return &file_pkg_ops;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Parses the package description file for a package into a pmpkg_t struct.
 | 
			
		||||
 * Parses the package description file for a package into a alpm_pkg_t struct.
 | 
			
		||||
 * @param archive the archive to read from, pointed at the .PKGINFO entry
 | 
			
		||||
 * @param newpkg an empty pmpkg_t struct to fill with package info
 | 
			
		||||
 * @param newpkg an empty alpm_pkg_t struct to fill with package info
 | 
			
		||||
 *
 | 
			
		||||
 * @return 0 on success, 1 on error
 | 
			
		||||
 * @return 0 on success, -1 on error
 | 
			
		||||
 */
 | 
			
		||||
static int parse_descfile(struct archive *a, pmpkg_t *newpkg)
 | 
			
		||||
static int parse_descfile(alpm_handle_t *handle, struct archive *a, alpm_pkg_t *newpkg)
 | 
			
		||||
{
 | 
			
		||||
	char *ptr = NULL;
 | 
			
		||||
	char *key = NULL;
 | 
			
		||||
	int linenum = 0;
 | 
			
		||||
	int ret, linenum = 0;
 | 
			
		||||
	struct archive_read_buffer buf;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	memset(&buf, 0, sizeof(buf));
 | 
			
		||||
	/* 512K for a line length seems reasonable */
 | 
			
		||||
	buf.max_line_size = 512 * 1024;
 | 
			
		||||
 | 
			
		||||
	/* loop until we reach EOF or other error */
 | 
			
		||||
	while(_alpm_archive_fgets(a, &buf) == ARCHIVE_OK) {
 | 
			
		||||
		char *line = _alpm_strtrim(buf.line);
 | 
			
		||||
	while((ret = _alpm_archive_fgets(a, &buf)) == ARCHIVE_OK) {
 | 
			
		||||
		size_t len = _alpm_strip_newline(buf.line);
 | 
			
		||||
 | 
			
		||||
		linenum++;
 | 
			
		||||
		if(strlen(line) == 0 || line[0] == '#') {
 | 
			
		||||
		if(len == 0 || buf.line[0] == '#') {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		ptr = line;
 | 
			
		||||
		ptr = buf.line;
 | 
			
		||||
		key = strsep(&ptr, "=");
 | 
			
		||||
		if(key == NULL || ptr == NULL) {
 | 
			
		||||
			_alpm_log(PM_LOG_DEBUG, "%s: syntax error in description file line %d\n",
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_DEBUG, "%s: syntax error in description file line %d\n",
 | 
			
		||||
								newpkg->name ? newpkg->name : "error", linenum);
 | 
			
		||||
		} else {
 | 
			
		||||
			key = _alpm_strtrim(key);
 | 
			
		||||
			while(*ptr == ' ') ptr++;
 | 
			
		||||
			ptr = _alpm_strtrim(ptr);
 | 
			
		||||
			if(strcmp(key, "pkgname") == 0) {
 | 
			
		||||
				STRDUP(newpkg->name, ptr, RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
				STRDUP(newpkg->name, ptr, return -1);
 | 
			
		||||
				newpkg->name_hash = _alpm_hash_sdbm(newpkg->name);
 | 
			
		||||
			} else if(strcmp(key, "pkgbase") == 0) {
 | 
			
		||||
				/* not used atm */
 | 
			
		||||
			} else if(strcmp(key, "pkgver") == 0) {
 | 
			
		||||
				STRDUP(newpkg->version, ptr, RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
				STRDUP(newpkg->version, ptr, return -1);
 | 
			
		||||
			} else if(strcmp(key, "pkgdesc") == 0) {
 | 
			
		||||
				STRDUP(newpkg->desc, ptr, RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
				STRDUP(newpkg->desc, ptr, return -1);
 | 
			
		||||
			} else if(strcmp(key, "group") == 0) {
 | 
			
		||||
				newpkg->groups = alpm_list_add(newpkg->groups, strdup(ptr));
 | 
			
		||||
			} else if(strcmp(key, "url") == 0) {
 | 
			
		||||
				STRDUP(newpkg->url, ptr, RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
				STRDUP(newpkg->url, ptr, return -1);
 | 
			
		||||
			} else if(strcmp(key, "license") == 0) {
 | 
			
		||||
				newpkg->licenses = alpm_list_add(newpkg->licenses, strdup(ptr));
 | 
			
		||||
			} else if(strcmp(key, "builddate") == 0) {
 | 
			
		||||
				newpkg->builddate = _alpm_parsedate(ptr);
 | 
			
		||||
			} else if(strcmp(key, "packager") == 0) {
 | 
			
		||||
				STRDUP(newpkg->packager, ptr, RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
				STRDUP(newpkg->packager, ptr, return -1);
 | 
			
		||||
			} else if(strcmp(key, "arch") == 0) {
 | 
			
		||||
				STRDUP(newpkg->arch, ptr, RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
				STRDUP(newpkg->arch, ptr, return -1);
 | 
			
		||||
			} else if(strcmp(key, "size") == 0) {
 | 
			
		||||
				/* size in the raw package is uncompressed (installed) size */
 | 
			
		||||
				newpkg->isize = atol(ptr);
 | 
			
		||||
				newpkg->isize = _alpm_strtoofft(ptr);
 | 
			
		||||
			} else if(strcmp(key, "depend") == 0) {
 | 
			
		||||
				pmdepend_t *dep = _alpm_splitdep(ptr);
 | 
			
		||||
				alpm_depend_t *dep = _alpm_splitdep(ptr);
 | 
			
		||||
				newpkg->depends = alpm_list_add(newpkg->depends, dep);
 | 
			
		||||
			} else if(strcmp(key, "optdepend") == 0) {
 | 
			
		||||
				newpkg->optdepends = alpm_list_add(newpkg->optdepends, strdup(ptr));
 | 
			
		||||
			} else if(strcmp(key, "conflict") == 0) {
 | 
			
		||||
				newpkg->conflicts = alpm_list_add(newpkg->conflicts, strdup(ptr));
 | 
			
		||||
				alpm_depend_t *conflict = _alpm_splitdep(ptr);
 | 
			
		||||
				newpkg->conflicts = alpm_list_add(newpkg->conflicts, conflict);
 | 
			
		||||
			} else if(strcmp(key, "replaces") == 0) {
 | 
			
		||||
				newpkg->replaces = alpm_list_add(newpkg->replaces, strdup(ptr));
 | 
			
		||||
				alpm_depend_t *replace = _alpm_splitdep(ptr);
 | 
			
		||||
				newpkg->replaces = alpm_list_add(newpkg->replaces, replace);
 | 
			
		||||
			} else if(strcmp(key, "provides") == 0) {
 | 
			
		||||
				newpkg->provides = alpm_list_add(newpkg->provides, strdup(ptr));
 | 
			
		||||
				alpm_depend_t *provide = _alpm_splitdep(ptr);
 | 
			
		||||
				newpkg->provides = alpm_list_add(newpkg->provides, provide);
 | 
			
		||||
			} else if(strcmp(key, "backup") == 0) {
 | 
			
		||||
				newpkg->backup = alpm_list_add(newpkg->backup, strdup(ptr));
 | 
			
		||||
				alpm_backup_t *backup;
 | 
			
		||||
				CALLOC(backup, 1, sizeof(alpm_backup_t), return -1);
 | 
			
		||||
				STRDUP(backup->name, ptr, return -1);
 | 
			
		||||
				newpkg->backup = alpm_list_add(newpkg->backup, backup);
 | 
			
		||||
			} else if(strcmp(key, "force") == 0) {
 | 
			
		||||
				/* deprecated, skip it */
 | 
			
		||||
			} else if(strcmp(key, "makepkgopt") == 0) {
 | 
			
		||||
				/* not used atm */
 | 
			
		||||
			} else {
 | 
			
		||||
				_alpm_log(PM_LOG_DEBUG, "%s: unknown key '%s' in description file line %d\n",
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_DEBUG, "%s: unknown key '%s' in description file line %d\n",
 | 
			
		||||
									newpkg->name ? newpkg->name : "error", key, linenum);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		line[0] = '\0';
 | 
			
		||||
	}
 | 
			
		||||
	if(ret != ARCHIVE_EOF) {
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "error parsing package descfile\n");
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void files_merge(alpm_file_t a[], alpm_file_t b[], alpm_file_t c[],
 | 
			
		||||
		size_t m, size_t n)
 | 
			
		||||
{
 | 
			
		||||
	size_t i = 0, j = 0, k = 0;
 | 
			
		||||
	while(i < m && j < n) {
 | 
			
		||||
		if(strcmp(a[i].name, b[j].name) < 0) {
 | 
			
		||||
			c[k++] = a[i++];
 | 
			
		||||
		} else {
 | 
			
		||||
			c[k++] = b[j++];
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	while(i < m) {
 | 
			
		||||
		c[k++] = a[i++];
 | 
			
		||||
	}
 | 
			
		||||
	while(j < n) {
 | 
			
		||||
		c[k++] = b[j++];
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static alpm_file_t *files_msort(alpm_file_t *files, size_t n)
 | 
			
		||||
{
 | 
			
		||||
	alpm_file_t *work;
 | 
			
		||||
	size_t blocksize = 1;
 | 
			
		||||
 | 
			
		||||
	CALLOC(work, n, sizeof(alpm_file_t), return NULL);
 | 
			
		||||
 | 
			
		||||
	for(blocksize = 1; blocksize < n; blocksize *= 2) {
 | 
			
		||||
		size_t i, max_extent = 0;
 | 
			
		||||
		for(i = 0; i < n - blocksize; i += 2 * blocksize) {
 | 
			
		||||
			/* this limits our actual merge to the length of the array, since we will
 | 
			
		||||
			 * not likely be a perfect power of two. */
 | 
			
		||||
			size_t right_blocksize = blocksize;
 | 
			
		||||
			if(i + blocksize * 2 > n) {
 | 
			
		||||
				right_blocksize = n - i - blocksize;
 | 
			
		||||
			}
 | 
			
		||||
			files_merge(files + i, files + i + blocksize, work + i,
 | 
			
		||||
					blocksize, right_blocksize);
 | 
			
		||||
			max_extent = i + blocksize + right_blocksize;
 | 
			
		||||
		}
 | 
			
		||||
		/* ensure we only copy what we actually touched on this merge pass,
 | 
			
		||||
		 * no more, no less */
 | 
			
		||||
		memcpy(files, work, max_extent * sizeof(alpm_file_t));
 | 
			
		||||
	}
 | 
			
		||||
	free(work);
 | 
			
		||||
	return files;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Load a package and create the corresponding pmpkg_t struct.
 | 
			
		||||
 * Validate a package.
 | 
			
		||||
 * @param handle the context handle
 | 
			
		||||
 * @param pkgfile path to the package file
 | 
			
		||||
 * @param full whether to stop the load after metadata is read or continue
 | 
			
		||||
 *             through the full archive
 | 
			
		||||
 * @return An information filled pmpkg_t struct
 | 
			
		||||
 * @param syncpkg package object to load verification data from (md5sum,
 | 
			
		||||
 * sha256sum, and/or base64 signature)
 | 
			
		||||
 * @param level the required level of signature verification
 | 
			
		||||
 * @param sigdata signature data from the package to pass back
 | 
			
		||||
 * @return 0 if package is fully valid, -1 and pm_errno otherwise
 | 
			
		||||
 */
 | 
			
		||||
static pmpkg_t *pkg_load(const char *pkgfile, int full)
 | 
			
		||||
int _alpm_pkg_validate_internal(alpm_handle_t *handle,
 | 
			
		||||
		const char *pkgfile, alpm_pkg_t *syncpkg, alpm_siglevel_t level,
 | 
			
		||||
		alpm_siglist_t **sigdata)
 | 
			
		||||
{
 | 
			
		||||
	int ret = ARCHIVE_OK;
 | 
			
		||||
	int config = 0;
 | 
			
		||||
	struct archive *archive;
 | 
			
		||||
	struct archive_entry *entry;
 | 
			
		||||
	pmpkg_t *newpkg = NULL;
 | 
			
		||||
	struct stat st;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	int has_sig;
 | 
			
		||||
	handle->pm_errno = 0;
 | 
			
		||||
 | 
			
		||||
	if(pkgfile == NULL || strlen(pkgfile) == 0) {
 | 
			
		||||
		RET_ERR(PM_ERR_WRONG_ARGS, NULL);
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(stat(pkgfile, &st) != 0) {
 | 
			
		||||
		RET_ERR(PM_ERR_PKG_OPEN, NULL);
 | 
			
		||||
	/* attempt to access the package file, ensure it exists */
 | 
			
		||||
	if(access(pkgfile, R_OK) != 0) {
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_PKG_NOT_FOUND, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* can we get away with skipping checksums? */
 | 
			
		||||
	has_sig = 0;
 | 
			
		||||
	if(level & ALPM_SIG_PACKAGE) {
 | 
			
		||||
		if(syncpkg && syncpkg->base64_sig) {
 | 
			
		||||
			has_sig = 1;
 | 
			
		||||
		} else {
 | 
			
		||||
			char *sigpath = _alpm_sigpath(handle, pkgfile);
 | 
			
		||||
			if(sigpath && !_alpm_access(handle, NULL, sigpath, R_OK)) {
 | 
			
		||||
				has_sig = 1;
 | 
			
		||||
			}
 | 
			
		||||
			free(sigpath);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(syncpkg && !has_sig) {
 | 
			
		||||
		if(syncpkg->md5sum && !syncpkg->sha256sum) {
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_DEBUG, "md5sum: %s\n", syncpkg->md5sum);
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_DEBUG, "checking md5sum for %s\n", pkgfile);
 | 
			
		||||
			if(_alpm_test_checksum(pkgfile, syncpkg->md5sum, ALPM_CSUM_MD5) != 0) {
 | 
			
		||||
				RET_ERR(handle, ALPM_ERR_PKG_INVALID_CHECKSUM, -1);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(syncpkg->sha256sum) {
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_DEBUG, "sha256sum: %s\n", syncpkg->sha256sum);
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_DEBUG, "checking sha256sum for %s\n", pkgfile);
 | 
			
		||||
			if(_alpm_test_checksum(pkgfile, syncpkg->sha256sum, ALPM_CSUM_SHA256) != 0) {
 | 
			
		||||
				RET_ERR(handle, ALPM_ERR_PKG_INVALID_CHECKSUM, -1);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* even if we don't have a sig, run the check code if level tells us to */
 | 
			
		||||
	if(has_sig || level & ALPM_SIG_PACKAGE) {
 | 
			
		||||
		const char *sig = syncpkg ? syncpkg->base64_sig : NULL;
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "sig data: %s\n", sig ? sig : "<from .sig>");
 | 
			
		||||
		if(_alpm_check_pgp_helper(handle, pkgfile, sig,
 | 
			
		||||
					level & ALPM_SIG_PACKAGE_OPTIONAL, level & ALPM_SIG_PACKAGE_MARGINAL_OK,
 | 
			
		||||
					level & ALPM_SIG_PACKAGE_UNKNOWN_OK, sigdata)) {
 | 
			
		||||
			handle->pm_errno = ALPM_ERR_PKG_INVALID_SIG;
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Load a package and create the corresponding alpm_pkg_t struct.
 | 
			
		||||
 * @param handle the context handle
 | 
			
		||||
 * @param pkgfile path to the package file
 | 
			
		||||
 * @param full whether to stop the load after metadata is read or continue
 | 
			
		||||
 * through the full archive
 | 
			
		||||
 */
 | 
			
		||||
alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle,
 | 
			
		||||
		const char *pkgfile, int full)
 | 
			
		||||
{
 | 
			
		||||
	int ret, config = 0;
 | 
			
		||||
	struct archive *archive;
 | 
			
		||||
	struct archive_entry *entry;
 | 
			
		||||
	alpm_pkg_t *newpkg = NULL;
 | 
			
		||||
	struct stat st;
 | 
			
		||||
	size_t files_count = 0, files_size = 0;
 | 
			
		||||
	alpm_file_t *files = NULL;
 | 
			
		||||
 | 
			
		||||
	if(pkgfile == NULL || strlen(pkgfile) == 0) {
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_WRONG_ARGS, NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* attempt to stat the package file, ensure it exists */
 | 
			
		||||
	if(stat(pkgfile, &st) == 0) {
 | 
			
		||||
		newpkg = _alpm_pkg_new();
 | 
			
		||||
		if(newpkg == NULL) {
 | 
			
		||||
			RET_ERR(handle, ALPM_ERR_MEMORY, NULL);
 | 
			
		||||
		}
 | 
			
		||||
		newpkg->filename = strdup(pkgfile);
 | 
			
		||||
		newpkg->size = st.st_size;
 | 
			
		||||
	} else {
 | 
			
		||||
		/* couldn't stat the pkgfile, return an error */
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_PKG_NOT_FOUND, NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* try to create an archive object to read in the package */
 | 
			
		||||
	if((archive = archive_read_new()) == NULL) {
 | 
			
		||||
		RET_ERR(PM_ERR_LIBARCHIVE, NULL);
 | 
			
		||||
		alpm_pkg_free(newpkg);
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_LIBARCHIVE, NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	archive_read_support_compression_all(archive);
 | 
			
		||||
	archive_read_support_format_all(archive);
 | 
			
		||||
 | 
			
		||||
	if (archive_read_open_filename(archive, pkgfile,
 | 
			
		||||
	if(archive_read_open_filename(archive, pkgfile,
 | 
			
		||||
				ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) {
 | 
			
		||||
		RET_ERR(PM_ERR_PKG_OPEN, NULL);
 | 
			
		||||
		alpm_pkg_free(newpkg);
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_PKG_OPEN, NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newpkg = _alpm_pkg_new();
 | 
			
		||||
	if(newpkg == NULL) {
 | 
			
		||||
		archive_read_finish(archive);
 | 
			
		||||
		RET_ERR(PM_ERR_MEMORY, NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newpkg->filename = strdup(pkgfile);
 | 
			
		||||
	newpkg->size = st.st_size;
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "starting package load for %s\n", pkgfile);
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "starting package load for %s\n", pkgfile);
 | 
			
		||||
 | 
			
		||||
	/* If full is false, only read through the archive until we find our needed
 | 
			
		||||
	 * metadata. If it is true, read through the entire archive, which serves
 | 
			
		||||
@@ -286,17 +405,17 @@ static pmpkg_t *pkg_load(const char *pkgfile, int full)
 | 
			
		||||
 | 
			
		||||
		if(strcmp(entry_name, ".PKGINFO") == 0) {
 | 
			
		||||
			/* parse the info file */
 | 
			
		||||
			if(parse_descfile(archive, newpkg) != 0) {
 | 
			
		||||
				_alpm_log(PM_LOG_ERROR, _("could not parse package description file in %s\n"),
 | 
			
		||||
			if(parse_descfile(handle, archive, newpkg) != 0) {
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_ERROR, _("could not parse package description file in %s\n"),
 | 
			
		||||
						pkgfile);
 | 
			
		||||
				goto pkg_invalid;
 | 
			
		||||
			}
 | 
			
		||||
			if(newpkg->name == NULL || strlen(newpkg->name) == 0) {
 | 
			
		||||
				_alpm_log(PM_LOG_ERROR, _("missing package name in %s\n"), pkgfile);
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_ERROR, _("missing package name in %s\n"), pkgfile);
 | 
			
		||||
				goto pkg_invalid;
 | 
			
		||||
			}
 | 
			
		||||
			if(newpkg->version == NULL || strlen(newpkg->version) == 0) {
 | 
			
		||||
				_alpm_log(PM_LOG_ERROR, _("missing package version in %s\n"), pkgfile);
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_ERROR, _("missing package version in %s\n"), pkgfile);
 | 
			
		||||
				goto pkg_invalid;
 | 
			
		||||
			}
 | 
			
		||||
			config = 1;
 | 
			
		||||
@@ -308,13 +427,33 @@ static pmpkg_t *pkg_load(const char *pkgfile, int full)
 | 
			
		||||
			 * already been handled (for future possibilities) */
 | 
			
		||||
		} else if(full) {
 | 
			
		||||
			/* Keep track of all files for filelist generation */
 | 
			
		||||
			newpkg->files = alpm_list_add(newpkg->files, strdup(entry_name));
 | 
			
		||||
			if(files_count >= files_size) {
 | 
			
		||||
				size_t old_size = files_size;
 | 
			
		||||
				if(files_size == 0) {
 | 
			
		||||
					files_size = 4;
 | 
			
		||||
				} else {
 | 
			
		||||
					files_size *= 2;
 | 
			
		||||
				}
 | 
			
		||||
				files = realloc(files, sizeof(alpm_file_t) * files_size);
 | 
			
		||||
				if(!files) {
 | 
			
		||||
					ALLOC_FAIL(sizeof(alpm_file_t) * files_size);
 | 
			
		||||
					goto error;
 | 
			
		||||
				}
 | 
			
		||||
				/* ensure all new memory is zeroed out, in both the initial
 | 
			
		||||
				 * allocation and later reallocs */
 | 
			
		||||
				memset(files + old_size, 0,
 | 
			
		||||
						sizeof(alpm_file_t) * (files_size - old_size));
 | 
			
		||||
			}
 | 
			
		||||
			STRDUP(files[files_count].name, entry_name, goto error);
 | 
			
		||||
			files[files_count].size = archive_entry_size(entry);
 | 
			
		||||
			files[files_count].mode = archive_entry_mode(entry);
 | 
			
		||||
			files_count++;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(archive_read_data_skip(archive)) {
 | 
			
		||||
			_alpm_log(PM_LOG_ERROR, _("error while reading package %s: %s\n"),
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_ERROR, _("error while reading package %s: %s\n"),
 | 
			
		||||
					pkgfile, archive_error_string(archive));
 | 
			
		||||
			pm_errno = PM_ERR_LIBARCHIVE;
 | 
			
		||||
			handle->pm_errno = ALPM_ERR_LIBARCHIVE;
 | 
			
		||||
			goto error;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -325,14 +464,14 @@ static pmpkg_t *pkg_load(const char *pkgfile, int full)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(ret != ARCHIVE_EOF && ret != ARCHIVE_OK) { /* An error occured */
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("error while reading package %s: %s\n"),
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_ERROR, _("error while reading package %s: %s\n"),
 | 
			
		||||
				pkgfile, archive_error_string(archive));
 | 
			
		||||
		pm_errno = PM_ERR_LIBARCHIVE;
 | 
			
		||||
		handle->pm_errno = ALPM_ERR_LIBARCHIVE;
 | 
			
		||||
		goto error;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(!config) {
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("missing package metadata in %s\n"), pkgfile);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_ERROR, _("missing package metadata in %s\n"), pkgfile);
 | 
			
		||||
		goto pkg_invalid;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -340,49 +479,50 @@ static pmpkg_t *pkg_load(const char *pkgfile, int full)
 | 
			
		||||
 | 
			
		||||
	/* internal fields for package struct */
 | 
			
		||||
	newpkg->origin = PKG_FROM_FILE;
 | 
			
		||||
	/* TODO eventually kill/move this? */
 | 
			
		||||
	newpkg->origin_data.file = strdup(pkgfile);
 | 
			
		||||
	newpkg->ops = get_file_pkg_ops();
 | 
			
		||||
	newpkg->handle = handle;
 | 
			
		||||
 | 
			
		||||
	if(full) {
 | 
			
		||||
		/* attempt to hand back any memory we don't need */
 | 
			
		||||
		files = realloc(files, sizeof(alpm_file_t) * files_count);
 | 
			
		||||
		/* "checking for conflicts" requires a sorted list, ensure that here */
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "sorting package filelist for %s\n", pkgfile);
 | 
			
		||||
		newpkg->files = alpm_list_msort(newpkg->files, alpm_list_count(newpkg->files),
 | 
			
		||||
				_alpm_str_cmp);
 | 
			
		||||
		newpkg->infolevel = INFRQ_ALL;
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "sorting package filelist for %s\n", pkgfile);
 | 
			
		||||
		newpkg->files.files = files_msort(files, files_count);
 | 
			
		||||
		newpkg->files.count = files_count;
 | 
			
		||||
		newpkg->infolevel = INFRQ_BASE | INFRQ_DESC | INFRQ_FILES | INFRQ_SCRIPTLET;
 | 
			
		||||
	} else {
 | 
			
		||||
		/* get rid of any partial filelist we may have collected, it is invalid */
 | 
			
		||||
		FREELIST(newpkg->files);
 | 
			
		||||
		newpkg->infolevel = INFRQ_BASE | INFRQ_DESC;
 | 
			
		||||
		newpkg->infolevel = INFRQ_BASE | INFRQ_DESC | INFRQ_SCRIPTLET;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(newpkg);
 | 
			
		||||
	return newpkg;
 | 
			
		||||
 | 
			
		||||
pkg_invalid:
 | 
			
		||||
	pm_errno = PM_ERR_PKG_INVALID;
 | 
			
		||||
	handle->pm_errno = ALPM_ERR_PKG_INVALID;
 | 
			
		||||
error:
 | 
			
		||||
	_alpm_pkg_free(newpkg);
 | 
			
		||||
	archive_read_finish(archive);
 | 
			
		||||
 | 
			
		||||
	return(NULL);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_pkg_load(const char *filename, int full, pmpkg_t **pkg)
 | 
			
		||||
int SYMEXPORT alpm_pkg_load(alpm_handle_t *handle, const char *filename, int full,
 | 
			
		||||
		alpm_siglevel_t level, alpm_pkg_t **pkg)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	ASSERT(pkg != NULL, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(filename != NULL && strlen(filename) != 0,
 | 
			
		||||
			RET_ERR(PM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
	ASSERT(pkg != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
 | 
			
		||||
	*pkg = pkg_load(filename, full);
 | 
			
		||||
	if(_alpm_pkg_validate_internal(handle, filename, NULL, level, NULL) == -1) {
 | 
			
		||||
		/* pm_errno is set by pkg_validate */
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	*pkg = _alpm_pkg_load_internal(handle, filename, full);
 | 
			
		||||
	if(*pkg == NULL) {
 | 
			
		||||
		/* pm_errno is set by pkg_load */
 | 
			
		||||
		return(-1);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
 *  be_sync.c
 | 
			
		||||
 *  be_sync.c : backend for sync databases
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (c) 2006-2011 Pacman Development Team <pacman-dev@archlinux.org>
 | 
			
		||||
 *  Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
 | 
			
		||||
@@ -21,7 +21,8 @@
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
/* libarchive */
 | 
			
		||||
#include <archive.h>
 | 
			
		||||
@@ -38,32 +39,120 @@
 | 
			
		||||
#include "deps.h"
 | 
			
		||||
#include "dload.h"
 | 
			
		||||
 | 
			
		||||
static char *get_sync_dir(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	size_t len = strlen(handle->dbpath) + 6;
 | 
			
		||||
	char *syncpath;
 | 
			
		||||
	struct stat buf;
 | 
			
		||||
 | 
			
		||||
	MALLOC(syncpath, len, RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
 | 
			
		||||
	sprintf(syncpath, "%s%s", handle->dbpath, "sync/");
 | 
			
		||||
 | 
			
		||||
	if(stat(syncpath, &buf) != 0) {
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "database dir '%s' does not exist, creating it\n",
 | 
			
		||||
				syncpath);
 | 
			
		||||
		if(_alpm_makepath(syncpath) != 0) {
 | 
			
		||||
			free(syncpath);
 | 
			
		||||
			RET_ERR(handle, ALPM_ERR_SYSTEM, NULL);
 | 
			
		||||
		}
 | 
			
		||||
	} else if(!S_ISDIR(buf.st_mode)) {
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_WARNING, _("removing invalid file: %s\n"), syncpath);
 | 
			
		||||
		if(unlink(syncpath) != 0 || _alpm_makepath(syncpath) != 0) {
 | 
			
		||||
			free(syncpath);
 | 
			
		||||
			RET_ERR(handle, ALPM_ERR_SYSTEM, NULL);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return syncpath;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int sync_db_validate(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	alpm_siglevel_t level;
 | 
			
		||||
	const char *dbpath;
 | 
			
		||||
 | 
			
		||||
	if(db->status & DB_STATUS_VALID || db->status & DB_STATUS_MISSING) {
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	if(db->status & DB_STATUS_INVALID) {
 | 
			
		||||
		db->handle->pm_errno = ALPM_ERR_DB_INVALID_SIG;
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dbpath = _alpm_db_path(db);
 | 
			
		||||
	if(!dbpath) {
 | 
			
		||||
		/* pm_errno set in _alpm_db_path() */
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* we can skip any validation if the database doesn't exist */
 | 
			
		||||
	if(access(dbpath, R_OK) != 0 && errno == ENOENT) {
 | 
			
		||||
		db->status &= ~DB_STATUS_EXISTS;
 | 
			
		||||
		db->status |= DB_STATUS_MISSING;
 | 
			
		||||
		_alpm_log(db->handle, ALPM_LOG_WARNING,
 | 
			
		||||
				"database file for '%s' does not exist\n", db->treename);
 | 
			
		||||
		goto valid;
 | 
			
		||||
	}
 | 
			
		||||
	db->status |= DB_STATUS_EXISTS;
 | 
			
		||||
	db->status &= ~DB_STATUS_MISSING;
 | 
			
		||||
 | 
			
		||||
	/* this takes into account the default verification level if UNKNOWN
 | 
			
		||||
	 * was assigned to this db */
 | 
			
		||||
	level = alpm_db_get_siglevel(db);
 | 
			
		||||
 | 
			
		||||
	if(level & ALPM_SIG_DATABASE) {
 | 
			
		||||
		int retry, ret;
 | 
			
		||||
		do {
 | 
			
		||||
			retry = 0;
 | 
			
		||||
			alpm_siglist_t *siglist;
 | 
			
		||||
			ret = _alpm_check_pgp_helper(db->handle, dbpath, NULL,
 | 
			
		||||
					level & ALPM_SIG_DATABASE_OPTIONAL, level & ALPM_SIG_DATABASE_MARGINAL_OK,
 | 
			
		||||
					level & ALPM_SIG_DATABASE_UNKNOWN_OK, &siglist);
 | 
			
		||||
			if(ret) {
 | 
			
		||||
				retry = _alpm_process_siglist(db->handle, db->treename, siglist,
 | 
			
		||||
						level & ALPM_SIG_DATABASE_OPTIONAL, level & ALPM_SIG_DATABASE_MARGINAL_OK,
 | 
			
		||||
						level & ALPM_SIG_DATABASE_UNKNOWN_OK);
 | 
			
		||||
			}
 | 
			
		||||
			alpm_siglist_cleanup(siglist);
 | 
			
		||||
			free(siglist);
 | 
			
		||||
		} while(retry);
 | 
			
		||||
 | 
			
		||||
		if(ret) {
 | 
			
		||||
			db->status &= ~DB_STATUS_VALID;
 | 
			
		||||
			db->status |= DB_STATUS_INVALID;
 | 
			
		||||
			db->handle->pm_errno = ALPM_ERR_DB_INVALID_SIG;
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
valid:
 | 
			
		||||
	db->status |= DB_STATUS_VALID;
 | 
			
		||||
	db->status &= ~DB_STATUS_INVALID;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Update a package database
 | 
			
		||||
 *
 | 
			
		||||
 * An update of the package database \a db will be attempted. Unless
 | 
			
		||||
 * \a force is true, the update will only be performed if the remote
 | 
			
		||||
 * database was modified since the last update.
 | 
			
		||||
 *
 | 
			
		||||
 * A transaction is necessary for this operation, in order to obtain a
 | 
			
		||||
 * database lock. During this transaction the front-end will be informed
 | 
			
		||||
 * of the download progress of the database via the download callback.
 | 
			
		||||
 * This operation requires a database lock, and will return an applicable error
 | 
			
		||||
 * if the lock could not be obtained.
 | 
			
		||||
 *
 | 
			
		||||
 * Example:
 | 
			
		||||
 * @code
 | 
			
		||||
 * alpm_list_t *syncs = alpm_option_get_syncdbs();
 | 
			
		||||
 * if(alpm_trans_init(0, NULL, NULL, NULL) == 0) {
 | 
			
		||||
 *     for(i = syncs; i; i = alpm_list_next(i)) {
 | 
			
		||||
 *         pmdb_t *db = alpm_list_getdata(i);
 | 
			
		||||
 *         result = alpm_db_update(0, db);
 | 
			
		||||
 *         alpm_trans_release();
 | 
			
		||||
 * for(i = syncs; i; i = alpm_list_next(i)) {
 | 
			
		||||
 *     alpm_db_t *db = alpm_list_getdata(i);
 | 
			
		||||
 *     result = alpm_db_update(0, db);
 | 
			
		||||
 *
 | 
			
		||||
 *         if(result < 0) {
 | 
			
		||||
 *	           printf("Unable to update database: %s\n", alpm_strerrorlast());
 | 
			
		||||
 *         } else if(result == 1) {
 | 
			
		||||
 *             printf("Database already up to date\n");
 | 
			
		||||
 *         } else {
 | 
			
		||||
 *             printf("Database updated\n");
 | 
			
		||||
 *         }
 | 
			
		||||
 *     if(result < 0) {
 | 
			
		||||
 *	       printf("Unable to update database: %s\n", alpm_strerrorlast());
 | 
			
		||||
 *     } else if(result == 1) {
 | 
			
		||||
 *         printf("Database already up to date\n");
 | 
			
		||||
 *     } else {
 | 
			
		||||
 *         printf("Database updated\n");
 | 
			
		||||
 *     }
 | 
			
		||||
 * }
 | 
			
		||||
 * @endcode
 | 
			
		||||
@@ -77,78 +166,187 @@
 | 
			
		||||
 * @return 0 on success, -1 on error (pm_errno is set accordingly), 1 if up to
 | 
			
		||||
 * to date
 | 
			
		||||
 */
 | 
			
		||||
int SYMEXPORT alpm_db_update(int force, pmdb_t *db)
 | 
			
		||||
int SYMEXPORT alpm_db_update(int force, alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	char *dbfile, *syncpath;
 | 
			
		||||
	const char *dbpath;
 | 
			
		||||
	struct stat buf;
 | 
			
		||||
	size_t len;
 | 
			
		||||
	int ret;
 | 
			
		||||
	char *syncpath;
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
	int ret = -1;
 | 
			
		||||
	mode_t oldmask;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	alpm_handle_t *handle;
 | 
			
		||||
	alpm_siglevel_t level;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	ASSERT(db != NULL && db != handle->db_local, RET_ERR(PM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
	ASSERT(db != NULL, return -1);
 | 
			
		||||
	handle = db->handle;
 | 
			
		||||
	handle->pm_errno = 0;
 | 
			
		||||
	ASSERT(db != handle->db_local, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
	ASSERT(db->servers != NULL, RET_ERR(handle, ALPM_ERR_SERVER_NONE, -1));
 | 
			
		||||
 | 
			
		||||
	if(!alpm_list_find_ptr(handle->dbs_sync, db)) {
 | 
			
		||||
		RET_ERR(PM_ERR_DB_NOT_FOUND, -1);
 | 
			
		||||
	syncpath = get_sync_dir(handle);
 | 
			
		||||
	if(!syncpath) {
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	len = strlen(db->treename) + 4;
 | 
			
		||||
	MALLOC(dbfile, len, RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
	sprintf(dbfile, "%s.db", db->treename);
 | 
			
		||||
 | 
			
		||||
	dbpath = alpm_option_get_dbpath();
 | 
			
		||||
	len = strlen(dbpath) + 6;
 | 
			
		||||
	MALLOC(syncpath, len, RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
	sprintf(syncpath, "%s%s", dbpath, "sync/");
 | 
			
		||||
 | 
			
		||||
	/* make sure we have a sane umask */
 | 
			
		||||
	oldmask = umask(0022);
 | 
			
		||||
 | 
			
		||||
	if(stat(syncpath, &buf) != 0) {
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "database dir '%s' does not exist, creating it\n",
 | 
			
		||||
				syncpath);
 | 
			
		||||
		if(_alpm_makepath(syncpath) != 0) {
 | 
			
		||||
			free(dbfile);
 | 
			
		||||
			free(syncpath);
 | 
			
		||||
			RET_ERR(PM_ERR_SYSTEM, -1);
 | 
			
		||||
	level = alpm_db_get_siglevel(db);
 | 
			
		||||
 | 
			
		||||
	/* attempt to grab a lock */
 | 
			
		||||
	if(_alpm_handle_lock(handle)) {
 | 
			
		||||
		free(syncpath);
 | 
			
		||||
		umask(oldmask);
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_HANDLE_LOCK, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for(i = db->servers; i; i = i->next) {
 | 
			
		||||
		const char *server = i->data;
 | 
			
		||||
		struct dload_payload payload;
 | 
			
		||||
		size_t len;
 | 
			
		||||
		int sig_ret = 0;
 | 
			
		||||
 | 
			
		||||
		memset(&payload, 0, sizeof(struct dload_payload));
 | 
			
		||||
 | 
			
		||||
		/* set hard upper limit of 25MiB */
 | 
			
		||||
		payload.max_size = 25 * 1024 * 1024;
 | 
			
		||||
 | 
			
		||||
		/* print server + filename into a buffer */
 | 
			
		||||
		len = strlen(server) + strlen(db->treename) + 5;
 | 
			
		||||
		MALLOC(payload.fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
 | 
			
		||||
		snprintf(payload.fileurl, len, "%s/%s.db", server, db->treename);
 | 
			
		||||
		payload.handle = handle;
 | 
			
		||||
		payload.force = force;
 | 
			
		||||
		payload.unlink_on_fail = 1;
 | 
			
		||||
 | 
			
		||||
		ret = _alpm_download(&payload, syncpath, NULL);
 | 
			
		||||
		_alpm_dload_payload_reset(&payload);
 | 
			
		||||
 | 
			
		||||
		if(ret == 0 && (level & ALPM_SIG_DATABASE)) {
 | 
			
		||||
			/* an existing sig file is no good at this point */
 | 
			
		||||
			char *sigpath = _alpm_sigpath(handle, _alpm_db_path(db));
 | 
			
		||||
			if(!sigpath) {
 | 
			
		||||
				ret = -1;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
			unlink(sigpath);
 | 
			
		||||
			free(sigpath);
 | 
			
		||||
 | 
			
		||||
			/* if we downloaded a DB, we want the .sig from the same server */
 | 
			
		||||
			/* print server + filename into a buffer (leave space for .sig) */
 | 
			
		||||
			len = strlen(server) + strlen(db->treename) + 9;
 | 
			
		||||
			MALLOC(payload.fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
 | 
			
		||||
			snprintf(payload.fileurl, len, "%s/%s.db.sig", server, db->treename);
 | 
			
		||||
			payload.handle = handle;
 | 
			
		||||
			payload.force = 1;
 | 
			
		||||
			payload.errors_ok = (level & ALPM_SIG_DATABASE_OPTIONAL);
 | 
			
		||||
 | 
			
		||||
			/* set hard upper limit of 16KiB */
 | 
			
		||||
			payload.max_size = 16 * 1024;
 | 
			
		||||
 | 
			
		||||
			sig_ret = _alpm_download(&payload, syncpath, NULL);
 | 
			
		||||
			/* errors_ok suppresses error messages, but not the return code */
 | 
			
		||||
			sig_ret = payload.errors_ok ? 0 : sig_ret;
 | 
			
		||||
			_alpm_dload_payload_reset(&payload);
 | 
			
		||||
		}
 | 
			
		||||
	} else if(!S_ISDIR(buf.st_mode)) {
 | 
			
		||||
		_alpm_log(PM_LOG_WARNING, _("removing invalid file: %s\n"), syncpath);
 | 
			
		||||
		if(unlink(syncpath) != 0 || _alpm_makepath(syncpath) != 0) {
 | 
			
		||||
			free(dbfile);
 | 
			
		||||
			free(syncpath);
 | 
			
		||||
			RET_ERR(PM_ERR_SYSTEM, -1);
 | 
			
		||||
 | 
			
		||||
		if(ret != -1 && sig_ret != -1) {
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret = _alpm_download_single_file(dbfile, db->servers, syncpath, force);
 | 
			
		||||
	free(dbfile);
 | 
			
		||||
	free(syncpath);
 | 
			
		||||
	umask(oldmask);
 | 
			
		||||
 | 
			
		||||
	if(ret == 1) {
 | 
			
		||||
		/* files match, do nothing */
 | 
			
		||||
		pm_errno = 0;
 | 
			
		||||
		return(1);
 | 
			
		||||
		handle->pm_errno = 0;
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	} else if(ret == -1) {
 | 
			
		||||
		/* pm_errno was set by the download code */
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "failed to sync db: %s\n", alpm_strerrorlast());
 | 
			
		||||
		return(-1);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "failed to sync db: %s\n",
 | 
			
		||||
				alpm_strerror(handle->pm_errno));
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Cache needs to be rebuilt */
 | 
			
		||||
	_alpm_db_free_pkgcache(db);
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	/* clear all status flags regarding validity/existence */
 | 
			
		||||
	db->status &= ~DB_STATUS_VALID;
 | 
			
		||||
	db->status &= ~DB_STATUS_INVALID;
 | 
			
		||||
	db->status &= ~DB_STATUS_EXISTS;
 | 
			
		||||
	db->status &= ~DB_STATUS_MISSING;
 | 
			
		||||
 | 
			
		||||
	if(sync_db_validate(db)) {
 | 
			
		||||
		/* pm_errno should be set */
 | 
			
		||||
		ret = -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
cleanup:
 | 
			
		||||
 | 
			
		||||
	if(_alpm_handle_unlock(handle)) {
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_WARNING, _("could not remove lock file %s\n"),
 | 
			
		||||
				handle->lockfile);
 | 
			
		||||
	}
 | 
			
		||||
	free(syncpath);
 | 
			
		||||
	umask(oldmask);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Forward decl so I don't reorganize the whole file right now */
 | 
			
		||||
static int sync_db_read(pmdb_t *db, struct archive *archive,
 | 
			
		||||
		struct archive_entry *entry, pmpkg_t *likely_pkg);
 | 
			
		||||
static int sync_db_read(alpm_db_t *db, struct archive *archive,
 | 
			
		||||
		struct archive_entry *entry, alpm_pkg_t **likely_pkg);
 | 
			
		||||
 | 
			
		||||
static alpm_pkg_t *load_pkg_for_entry(alpm_db_t *db, const char *entryname,
 | 
			
		||||
		const char **entry_filename, alpm_pkg_t *likely_pkg)
 | 
			
		||||
{
 | 
			
		||||
	char *pkgname = NULL, *pkgver = NULL;
 | 
			
		||||
	unsigned long pkgname_hash;
 | 
			
		||||
	alpm_pkg_t *pkg;
 | 
			
		||||
 | 
			
		||||
	/* get package and db file names */
 | 
			
		||||
	if(entry_filename) {
 | 
			
		||||
		char *fname = strrchr(entryname, '/');
 | 
			
		||||
		if(fname) {
 | 
			
		||||
			*entry_filename = fname + 1;
 | 
			
		||||
		} else {
 | 
			
		||||
			*entry_filename = NULL;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if(_alpm_splitname(entryname, &pkgname, &pkgver, &pkgname_hash) != 0) {
 | 
			
		||||
		_alpm_log(db->handle, ALPM_LOG_ERROR,
 | 
			
		||||
				_("invalid name for database entry '%s'\n"), entryname);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(likely_pkg && strcmp(likely_pkg->name, pkgname) == 0) {
 | 
			
		||||
		pkg = likely_pkg;
 | 
			
		||||
	} else {
 | 
			
		||||
		pkg = _alpm_pkghash_find(db->pkgcache, pkgname);
 | 
			
		||||
	}
 | 
			
		||||
	if(pkg == NULL) {
 | 
			
		||||
		pkg = _alpm_pkg_new();
 | 
			
		||||
		if(pkg == NULL) {
 | 
			
		||||
			RET_ERR(db->handle, ALPM_ERR_MEMORY, NULL);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		pkg->name = pkgname;
 | 
			
		||||
		pkg->version = pkgver;
 | 
			
		||||
		pkg->name_hash = pkgname_hash;
 | 
			
		||||
 | 
			
		||||
		pkg->origin = PKG_FROM_SYNCDB;
 | 
			
		||||
		pkg->origin_data.db = db;
 | 
			
		||||
		pkg->ops = &default_pkg_ops;
 | 
			
		||||
		pkg->handle = db->handle;
 | 
			
		||||
 | 
			
		||||
		/* add to the collection */
 | 
			
		||||
		_alpm_log(db->handle, ALPM_LOG_FUNCTION, "adding '%s' to package cache for db '%s'\n",
 | 
			
		||||
				pkg->name, db->treename);
 | 
			
		||||
		db->pkgcache = _alpm_pkghash_add(db->pkgcache, pkg);
 | 
			
		||||
	} else {
 | 
			
		||||
		free(pkgname);
 | 
			
		||||
		free(pkgver);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pkg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This is the data table used to generate the estimating function below.
 | 
			
		||||
@@ -206,10 +404,10 @@ static size_t estimate_package_count(struct stat *st, struct archive *archive)
 | 
			
		||||
			/* assume it is at least somewhat compressed */
 | 
			
		||||
			per_package = 200;
 | 
			
		||||
	}
 | 
			
		||||
	return((size_t)(st->st_size / per_package) + 1);
 | 
			
		||||
	return (size_t)((st->st_size / per_package) + 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int sync_db_populate(pmdb_t *db)
 | 
			
		||||
static int sync_db_populate(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	const char *dbpath;
 | 
			
		||||
	size_t est_count;
 | 
			
		||||
@@ -217,14 +415,18 @@ static int sync_db_populate(pmdb_t *db)
 | 
			
		||||
	struct stat buf;
 | 
			
		||||
	struct archive *archive;
 | 
			
		||||
	struct archive_entry *entry;
 | 
			
		||||
	pmpkg_t *pkg = NULL;
 | 
			
		||||
	alpm_pkg_t *pkg = NULL;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	if(db->status & DB_STATUS_INVALID) {
 | 
			
		||||
		RET_ERR(db->handle, ALPM_ERR_DB_INVALID, -1);
 | 
			
		||||
	}
 | 
			
		||||
	if(db->status & DB_STATUS_MISSING) {
 | 
			
		||||
		RET_ERR(db->handle, ALPM_ERR_DB_NOT_FOUND, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
 | 
			
		||||
 | 
			
		||||
	if((archive = archive_read_new()) == NULL)
 | 
			
		||||
		RET_ERR(PM_ERR_LIBARCHIVE, 1);
 | 
			
		||||
	if((archive = archive_read_new()) == NULL) {
 | 
			
		||||
		RET_ERR(db->handle, ALPM_ERR_LIBARCHIVE, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	archive_read_support_compression_all(archive);
 | 
			
		||||
	archive_read_support_format_all(archive);
 | 
			
		||||
@@ -232,168 +434,131 @@ static int sync_db_populate(pmdb_t *db)
 | 
			
		||||
	dbpath = _alpm_db_path(db);
 | 
			
		||||
	if(!dbpath) {
 | 
			
		||||
		/* pm_errno set in _alpm_db_path() */
 | 
			
		||||
		return 1;
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "opening database archive %s\n", dbpath);
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_DEBUG, "opening database archive %s\n", dbpath);
 | 
			
		||||
 | 
			
		||||
	if(archive_read_open_filename(archive, dbpath,
 | 
			
		||||
				ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) {
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), dbpath,
 | 
			
		||||
		_alpm_log(db->handle, ALPM_LOG_ERROR, _("could not open file %s: %s\n"), dbpath,
 | 
			
		||||
				archive_error_string(archive));
 | 
			
		||||
		archive_read_finish(archive);
 | 
			
		||||
		RET_ERR(PM_ERR_DB_OPEN, 1);
 | 
			
		||||
		RET_ERR(db->handle, ALPM_ERR_DB_OPEN, -1);
 | 
			
		||||
	}
 | 
			
		||||
	if(stat(dbpath, &buf) != 0) {
 | 
			
		||||
		RET_ERR(PM_ERR_DB_OPEN, 1);
 | 
			
		||||
		RET_ERR(db->handle, ALPM_ERR_DB_OPEN, -1);
 | 
			
		||||
	}
 | 
			
		||||
	est_count = estimate_package_count(&buf, archive);
 | 
			
		||||
 | 
			
		||||
	/* initialize hash at 66% full */
 | 
			
		||||
	db->pkgcache = _alpm_pkghash_create(est_count * 3 / 2);
 | 
			
		||||
	if(db->pkgcache == NULL) {
 | 
			
		||||
		RET_ERR(PM_ERR_MEMORY, -1);
 | 
			
		||||
		RET_ERR(db->handle, ALPM_ERR_MEMORY, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while(archive_read_next_header(archive, &entry) == ARCHIVE_OK) {
 | 
			
		||||
		const struct stat *st;
 | 
			
		||||
 | 
			
		||||
		st = archive_entry_stat(entry);
 | 
			
		||||
 | 
			
		||||
		if(S_ISDIR(st->st_mode)) {
 | 
			
		||||
			const char *name;
 | 
			
		||||
 | 
			
		||||
			pkg = _alpm_pkg_new();
 | 
			
		||||
			if(pkg == NULL) {
 | 
			
		||||
				archive_read_finish(archive);
 | 
			
		||||
				RET_ERR(PM_ERR_MEMORY, -1);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			name = archive_entry_pathname(entry);
 | 
			
		||||
 | 
			
		||||
			if(_alpm_splitname(name, pkg) != 0) {
 | 
			
		||||
				_alpm_log(PM_LOG_ERROR, _("invalid name for database entry '%s'\n"),
 | 
			
		||||
						name);
 | 
			
		||||
				_alpm_pkg_free(pkg);
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/* duplicated database entries are not allowed */
 | 
			
		||||
			if(_alpm_pkghash_find(db->pkgcache, pkg->name)) {
 | 
			
		||||
				_alpm_log(PM_LOG_ERROR, _("duplicated database entry '%s'\n"), pkg->name);
 | 
			
		||||
				_alpm_pkg_free(pkg);
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			pkg->origin = PKG_FROM_SYNCDB;
 | 
			
		||||
			pkg->ops = &default_pkg_ops;
 | 
			
		||||
			pkg->origin_data.db = db;
 | 
			
		||||
 | 
			
		||||
			/* add to the collection */
 | 
			
		||||
			_alpm_log(PM_LOG_FUNCTION, "adding '%s' to package cache for db '%s'\n",
 | 
			
		||||
					pkg->name, db->treename);
 | 
			
		||||
			db->pkgcache = _alpm_pkghash_add(db->pkgcache, pkg);
 | 
			
		||||
			count++;
 | 
			
		||||
		mode_t mode = archive_entry_mode(entry);
 | 
			
		||||
		if(S_ISDIR(mode)) {
 | 
			
		||||
			continue;
 | 
			
		||||
		} else {
 | 
			
		||||
			/* we have desc, depends or deltas - parse it */
 | 
			
		||||
			sync_db_read(db, archive, entry, pkg);
 | 
			
		||||
			if(sync_db_read(db, archive, entry, &pkg) != 0) {
 | 
			
		||||
				_alpm_log(db->handle, ALPM_LOG_ERROR,
 | 
			
		||||
						_("could not parse package description file '%s' from db '%s'\n"),
 | 
			
		||||
						archive_entry_pathname(entry), db->treename);
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	count = alpm_list_count(db->pkgcache->list);
 | 
			
		||||
 | 
			
		||||
	if(count > 0) {
 | 
			
		||||
		db->pkgcache->list = alpm_list_msort(db->pkgcache->list, (size_t)count, _alpm_pkg_cmp);
 | 
			
		||||
	}
 | 
			
		||||
	archive_read_finish(archive);
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_DEBUG, "added %d packages to package cache for db '%s'\n",
 | 
			
		||||
			count, db->treename);
 | 
			
		||||
 | 
			
		||||
	return(count);
 | 
			
		||||
	return count;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define READ_NEXT(s) do { \
 | 
			
		||||
#define READ_NEXT() do { \
 | 
			
		||||
	if(_alpm_archive_fgets(archive, &buf) != ARCHIVE_OK) goto error; \
 | 
			
		||||
	s = _alpm_strtrim(buf.line); \
 | 
			
		||||
	line = buf.line; \
 | 
			
		||||
	_alpm_strip_newline(line); \
 | 
			
		||||
} while(0)
 | 
			
		||||
 | 
			
		||||
#define READ_AND_STORE(f) do { \
 | 
			
		||||
	READ_NEXT(line); \
 | 
			
		||||
	READ_NEXT(); \
 | 
			
		||||
	STRDUP(f, line, goto error); \
 | 
			
		||||
} while(0)
 | 
			
		||||
 | 
			
		||||
#define READ_AND_STORE_ALL(f) do { \
 | 
			
		||||
	char *linedup; \
 | 
			
		||||
	READ_NEXT(line); \
 | 
			
		||||
	if(strlen(line) == 0) break; \
 | 
			
		||||
	STRDUP(linedup, line, goto error); \
 | 
			
		||||
	if(_alpm_archive_fgets(archive, &buf) != ARCHIVE_OK) goto error; \
 | 
			
		||||
	if(_alpm_strip_newline(buf.line) == 0) break; \
 | 
			
		||||
	STRDUP(linedup, buf.line, goto error); \
 | 
			
		||||
	f = alpm_list_add(f, linedup); \
 | 
			
		||||
} while(1) /* note the while(1) and not (0) */
 | 
			
		||||
 | 
			
		||||
static int sync_db_read(pmdb_t *db, struct archive *archive,
 | 
			
		||||
		struct archive_entry *entry, pmpkg_t *likely_pkg)
 | 
			
		||||
#define READ_AND_SPLITDEP(f) do { \
 | 
			
		||||
	if(_alpm_archive_fgets(archive, &buf) != ARCHIVE_OK) goto error; \
 | 
			
		||||
	if(_alpm_strip_newline(buf.line) == 0) break; \
 | 
			
		||||
	f = alpm_list_add(f, _alpm_splitdep(line)); \
 | 
			
		||||
} while(1) /* note the while(1) and not (0) */
 | 
			
		||||
 | 
			
		||||
static int sync_db_read(alpm_db_t *db, struct archive *archive,
 | 
			
		||||
		struct archive_entry *entry, alpm_pkg_t **likely_pkg)
 | 
			
		||||
{
 | 
			
		||||
	const char *entryname = NULL, *filename;
 | 
			
		||||
	char *pkgname, *p, *q;
 | 
			
		||||
	pmpkg_t *pkg;
 | 
			
		||||
	const char *entryname, *filename;
 | 
			
		||||
	alpm_pkg_t *pkg;
 | 
			
		||||
	struct archive_read_buffer buf;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(db == NULL) {
 | 
			
		||||
		RET_ERR(PM_ERR_DB_NULL, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(entry != NULL) {
 | 
			
		||||
		entryname = archive_entry_pathname(entry);
 | 
			
		||||
	}
 | 
			
		||||
	entryname = archive_entry_pathname(entry);
 | 
			
		||||
	if(entryname == NULL) {
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "invalid archive entry provided to _alpm_sync_db_read, skipping\n");
 | 
			
		||||
		return(-1);
 | 
			
		||||
		_alpm_log(db->handle, ALPM_LOG_DEBUG,
 | 
			
		||||
				"invalid archive entry provided to _alpm_sync_db_read, skipping\n");
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_FUNCTION, "loading package data from archive entry %s\n",
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_FUNCTION, "loading package data from archive entry %s\n",
 | 
			
		||||
			entryname);
 | 
			
		||||
 | 
			
		||||
	memset(&buf, 0, sizeof(buf));
 | 
			
		||||
	/* 512K for a line length seems reasonable */
 | 
			
		||||
	buf.max_line_size = 512 * 1024;
 | 
			
		||||
 | 
			
		||||
	/* get package and db file names */
 | 
			
		||||
	STRDUP(pkgname, entryname, RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
	p = pkgname + strlen(pkgname);
 | 
			
		||||
	for(q = --p; *q && *q != '/'; q--);
 | 
			
		||||
	filename = q + 1;
 | 
			
		||||
	for(p = --q; *p && *p != '-'; p--);
 | 
			
		||||
	for(q = --p; *q && *q != '-'; q--);
 | 
			
		||||
	*q = '\0';
 | 
			
		||||
	pkg = load_pkg_for_entry(db, entryname, &filename, *likely_pkg);
 | 
			
		||||
 | 
			
		||||
	/* package is already in db due to parsing of directory name */
 | 
			
		||||
	if(likely_pkg && strcmp(likely_pkg->name, pkgname) == 0) {
 | 
			
		||||
		pkg = likely_pkg;
 | 
			
		||||
	} else {
 | 
			
		||||
		if(db->pkgcache == NULL) {
 | 
			
		||||
			RET_ERR(PM_ERR_MEMORY, -1);
 | 
			
		||||
		}
 | 
			
		||||
		pkg = _alpm_pkghash_find(db->pkgcache, pkgname);
 | 
			
		||||
	}
 | 
			
		||||
	if(pkg == NULL) {
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "package %s not found in %s sync database",
 | 
			
		||||
					pkgname, db->treename);
 | 
			
		||||
		return(-1);
 | 
			
		||||
		_alpm_log(db->handle, ALPM_LOG_DEBUG,
 | 
			
		||||
				"entry %s could not be loaded into %s sync database",
 | 
			
		||||
				entryname, db->treename);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(strcmp(filename, "desc") == 0 || strcmp(filename, "depends") == 0
 | 
			
		||||
			|| strcmp(filename, "deltas") == 0) {
 | 
			
		||||
		while(_alpm_archive_fgets(archive, &buf) == ARCHIVE_OK) {
 | 
			
		||||
			char *line = _alpm_strtrim(buf.line);
 | 
			
		||||
		int ret;
 | 
			
		||||
		while((ret = _alpm_archive_fgets(archive, &buf)) == ARCHIVE_OK) {
 | 
			
		||||
			char *line = buf.line;
 | 
			
		||||
			if(_alpm_strip_newline(line) == 0) {
 | 
			
		||||
				/* length of stripped line was zero */
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if(strcmp(line, "%NAME%") == 0) {
 | 
			
		||||
				READ_NEXT(line);
 | 
			
		||||
				READ_NEXT();
 | 
			
		||||
				if(strcmp(line, pkg->name) != 0) {
 | 
			
		||||
					_alpm_log(PM_LOG_ERROR, _("%s database is inconsistent: name "
 | 
			
		||||
					_alpm_log(db->handle, ALPM_LOG_ERROR, _("%s database is inconsistent: name "
 | 
			
		||||
								"mismatch on package %s\n"), db->treename, pkg->name);
 | 
			
		||||
				}
 | 
			
		||||
			} else if(strcmp(line, "%VERSION%") == 0) {
 | 
			
		||||
				READ_NEXT(line);
 | 
			
		||||
				READ_NEXT();
 | 
			
		||||
				if(strcmp(line, pkg->version) != 0) {
 | 
			
		||||
					_alpm_log(PM_LOG_ERROR, _("%s database is inconsistent: version "
 | 
			
		||||
					_alpm_log(db->handle, ALPM_LOG_ERROR, _("%s database is inconsistent: version "
 | 
			
		||||
								"mismatch on package %s\n"), db->treename, pkg->name);
 | 
			
		||||
				}
 | 
			
		||||
			} else if(strcmp(line, "%FILENAME%") == 0) {
 | 
			
		||||
@@ -409,106 +574,90 @@ static int sync_db_read(pmdb_t *db, struct archive *archive,
 | 
			
		||||
			} else if(strcmp(line, "%ARCH%") == 0) {
 | 
			
		||||
				READ_AND_STORE(pkg->arch);
 | 
			
		||||
			} else if(strcmp(line, "%BUILDDATE%") == 0) {
 | 
			
		||||
				READ_NEXT(line);
 | 
			
		||||
				READ_NEXT();
 | 
			
		||||
				pkg->builddate = _alpm_parsedate(line);
 | 
			
		||||
			} else if(strcmp(line, "%PACKAGER%") == 0) {
 | 
			
		||||
				READ_AND_STORE(pkg->packager);
 | 
			
		||||
			} else if(strcmp(line, "%CSIZE%") == 0) {
 | 
			
		||||
				/* Note: the CSIZE and SIZE fields both share the "size" field in the
 | 
			
		||||
				 * pkginfo_t struct. This can be done b/c CSIZE is currently only used
 | 
			
		||||
				 * in sync databases, and SIZE is only used in local databases.
 | 
			
		||||
				 */
 | 
			
		||||
				READ_NEXT(line);
 | 
			
		||||
				pkg->size = atol(line);
 | 
			
		||||
				/* also store this value to isize if isize is unset */
 | 
			
		||||
				if(pkg->isize == 0) {
 | 
			
		||||
					pkg->isize = pkg->size;
 | 
			
		||||
				}
 | 
			
		||||
				READ_NEXT();
 | 
			
		||||
				pkg->size = _alpm_strtoofft(line);
 | 
			
		||||
			} else if(strcmp(line, "%ISIZE%") == 0) {
 | 
			
		||||
				READ_NEXT(line);
 | 
			
		||||
				pkg->isize = atol(line);
 | 
			
		||||
				READ_NEXT();
 | 
			
		||||
				pkg->isize = _alpm_strtoofft(line);
 | 
			
		||||
			} else if(strcmp(line, "%MD5SUM%") == 0) {
 | 
			
		||||
				READ_AND_STORE(pkg->md5sum);
 | 
			
		||||
			} else if(strcmp(line, "%SHA256SUM%") == 0) {
 | 
			
		||||
				/* we don't do anything with this value right now */
 | 
			
		||||
				READ_NEXT(line);
 | 
			
		||||
				READ_AND_STORE(pkg->sha256sum);
 | 
			
		||||
			} else if(strcmp(line, "%PGPSIG%") == 0) {
 | 
			
		||||
				/* we don't do anything with this value right now */
 | 
			
		||||
				READ_NEXT(line);
 | 
			
		||||
				READ_AND_STORE(pkg->base64_sig);
 | 
			
		||||
			} else if(strcmp(line, "%REPLACES%") == 0) {
 | 
			
		||||
				READ_AND_STORE_ALL(pkg->replaces);
 | 
			
		||||
				READ_AND_SPLITDEP(pkg->replaces);
 | 
			
		||||
			} else if(strcmp(line, "%DEPENDS%") == 0) {
 | 
			
		||||
				/* Different than the rest because of the _alpm_splitdep call. */
 | 
			
		||||
				while(1) {
 | 
			
		||||
					READ_NEXT(line);
 | 
			
		||||
					if(strlen(line) == 0) break;
 | 
			
		||||
					pkg->depends = alpm_list_add(pkg->depends, _alpm_splitdep(line));
 | 
			
		||||
				}
 | 
			
		||||
				READ_AND_SPLITDEP(pkg->depends);
 | 
			
		||||
			} else if(strcmp(line, "%OPTDEPENDS%") == 0) {
 | 
			
		||||
				READ_AND_STORE_ALL(pkg->optdepends);
 | 
			
		||||
			} else if(strcmp(line, "%CONFLICTS%") == 0) {
 | 
			
		||||
				READ_AND_STORE_ALL(pkg->conflicts);
 | 
			
		||||
				READ_AND_SPLITDEP(pkg->conflicts);
 | 
			
		||||
			} else if(strcmp(line, "%PROVIDES%") == 0) {
 | 
			
		||||
				READ_AND_STORE_ALL(pkg->provides);
 | 
			
		||||
				READ_AND_SPLITDEP(pkg->provides);
 | 
			
		||||
			} else if(strcmp(line, "%DELTAS%") == 0) {
 | 
			
		||||
				/* Different than the rest because of the _alpm_delta_parse call. */
 | 
			
		||||
				while(1) {
 | 
			
		||||
					READ_NEXT(line);
 | 
			
		||||
					READ_NEXT();
 | 
			
		||||
					if(strlen(line) == 0) break;
 | 
			
		||||
					pkg->deltas = alpm_list_add(pkg->deltas, _alpm_delta_parse(line));
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(ret != ARCHIVE_EOF) {
 | 
			
		||||
			goto error;
 | 
			
		||||
		}
 | 
			
		||||
		*likely_pkg = pkg;
 | 
			
		||||
	} else if(strcmp(filename, "files") == 0) {
 | 
			
		||||
		/* currently do nothing with this file */
 | 
			
		||||
	} else {
 | 
			
		||||
		/* unknown database file */
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "unknown database file: %s\n", filename);
 | 
			
		||||
		_alpm_log(db->handle, ALPM_LOG_DEBUG, "unknown database file: %s\n", filename);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
	FREE(pkgname);
 | 
			
		||||
	/* TODO: return 0 always? */
 | 
			
		||||
	return(0);
 | 
			
		||||
}
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
static int sync_db_version(pmdb_t *db)
 | 
			
		||||
{
 | 
			
		||||
	return(2);
 | 
			
		||||
error:
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_DEBUG, "error parsing database file: %s\n", filename);
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct db_operations sync_db_ops = {
 | 
			
		||||
	.validate         = sync_db_validate,
 | 
			
		||||
	.populate         = sync_db_populate,
 | 
			
		||||
	.unregister       = _alpm_db_unregister,
 | 
			
		||||
	.version          = sync_db_version,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
pmdb_t *_alpm_db_register_sync(const char *treename)
 | 
			
		||||
alpm_db_t *_alpm_db_register_sync(alpm_handle_t *handle, const char *treename,
 | 
			
		||||
		alpm_siglevel_t level)
 | 
			
		||||
{
 | 
			
		||||
	pmdb_t *db;
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
	alpm_db_t *db;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "registering sync database '%s'\n", treename);
 | 
			
		||||
 | 
			
		||||
	for(i = handle->dbs_sync; i; i = i->next) {
 | 
			
		||||
		pmdb_t *sdb = i->data;
 | 
			
		||||
		if(strcmp(treename, sdb->treename) == 0) {
 | 
			
		||||
			_alpm_log(PM_LOG_DEBUG, "attempt to re-register the '%s' database, using existing\n", sdb->treename);
 | 
			
		||||
			return sdb;
 | 
			
		||||
		}
 | 
			
		||||
#ifndef HAVE_LIBGPGME
 | 
			
		||||
	if(level != 0 && level != ALPM_SIG_USE_DEFAULT) {
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_WRONG_ARGS, NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "registering sync database '%s'\n", treename);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	db = _alpm_db_new(treename, 0);
 | 
			
		||||
	if(db == NULL) {
 | 
			
		||||
		RET_ERR(PM_ERR_DB_CREATE, NULL);
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_DB_CREATE, NULL);
 | 
			
		||||
	}
 | 
			
		||||
	db->ops = &sync_db_ops;
 | 
			
		||||
	db->handle = handle;
 | 
			
		||||
	db->siglevel = level;
 | 
			
		||||
 | 
			
		||||
	sync_db_validate(db);
 | 
			
		||||
 | 
			
		||||
	handle->dbs_sync = alpm_list_add(handle->dbs_sync, db);
 | 
			
		||||
	return(db);
 | 
			
		||||
	return db;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -34,85 +34,90 @@
 | 
			
		||||
/* libalpm */
 | 
			
		||||
#include "conflict.h"
 | 
			
		||||
#include "alpm_list.h"
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
#include "handle.h"
 | 
			
		||||
#include "trans.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "deps.h"
 | 
			
		||||
 | 
			
		||||
pmconflict_t *_alpm_conflict_new(const char *package1, const char *package2,
 | 
			
		||||
		const char *reason)
 | 
			
		||||
static alpm_conflict_t *conflict_new(alpm_pkg_t *pkg1, alpm_pkg_t *pkg2,
 | 
			
		||||
		alpm_depend_t *reason)
 | 
			
		||||
{
 | 
			
		||||
	pmconflict_t *conflict;
 | 
			
		||||
	alpm_conflict_t *conflict;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	MALLOC(conflict, sizeof(alpm_conflict_t), return NULL);
 | 
			
		||||
 | 
			
		||||
	MALLOC(conflict, sizeof(pmconflict_t), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	conflict->package1_hash = pkg1->name_hash;
 | 
			
		||||
	conflict->package2_hash = pkg2->name_hash;
 | 
			
		||||
	STRDUP(conflict->package1, pkg1->name, return NULL);
 | 
			
		||||
	STRDUP(conflict->package2, pkg2->name, return NULL);
 | 
			
		||||
	conflict->reason = reason;
 | 
			
		||||
 | 
			
		||||
	STRDUP(conflict->package1, package1, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	STRDUP(conflict->package2, package2, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	STRDUP(conflict->reason, reason, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
 | 
			
		||||
	return(conflict);
 | 
			
		||||
	return conflict;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_conflict_free(pmconflict_t *conflict)
 | 
			
		||||
void _alpm_conflict_free(alpm_conflict_t *conflict)
 | 
			
		||||
{
 | 
			
		||||
	FREE(conflict->package2);
 | 
			
		||||
	FREE(conflict->package1);
 | 
			
		||||
	FREE(conflict->reason);
 | 
			
		||||
	FREE(conflict);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pmconflict_t *_alpm_conflict_dup(const pmconflict_t *conflict)
 | 
			
		||||
alpm_conflict_t *_alpm_conflict_dup(const alpm_conflict_t *conflict)
 | 
			
		||||
{
 | 
			
		||||
	pmconflict_t *newconflict;
 | 
			
		||||
	CALLOC(newconflict, 1, sizeof(pmconflict_t), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	alpm_conflict_t *newconflict;
 | 
			
		||||
	CALLOC(newconflict, 1, sizeof(alpm_conflict_t), return NULL);
 | 
			
		||||
 | 
			
		||||
	STRDUP(newconflict->package1, conflict->package1, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	STRDUP(newconflict->package2, conflict->package2, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	STRDUP(newconflict->reason, conflict->reason, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	newconflict->package1_hash = conflict->package1_hash;
 | 
			
		||||
	newconflict->package2_hash = conflict->package2_hash;
 | 
			
		||||
	STRDUP(newconflict->package1, conflict->package1, return NULL);
 | 
			
		||||
	STRDUP(newconflict->package2, conflict->package2, return NULL);
 | 
			
		||||
	newconflict->reason = conflict->reason;
 | 
			
		||||
 | 
			
		||||
	return(newconflict);
 | 
			
		||||
	return newconflict;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int conflict_isin(pmconflict_t *needle, alpm_list_t *haystack)
 | 
			
		||||
static int conflict_isin(alpm_conflict_t *needle, alpm_list_t *haystack)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
	const char *npkg1 = needle->package1;
 | 
			
		||||
	const char *npkg2 = needle->package2;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	for(i = haystack; i; i = i->next) {
 | 
			
		||||
		pmconflict_t *conflict = i->data;
 | 
			
		||||
		const char *cpkg1 = conflict->package1;
 | 
			
		||||
		const char *cpkg2 = conflict->package2;
 | 
			
		||||
		if((strcmp(cpkg1, npkg1) == 0  && strcmp(cpkg2, npkg2) == 0)
 | 
			
		||||
				|| (strcmp(cpkg1, npkg2) == 0 && strcmp(cpkg2, npkg1) == 0)) {
 | 
			
		||||
			return(1);
 | 
			
		||||
		alpm_conflict_t *conflict = i->data;
 | 
			
		||||
		if(needle->package1_hash == conflict->package1_hash
 | 
			
		||||
				&& needle->package2_hash == conflict->package2_hash
 | 
			
		||||
				&& strcmp(needle->package1, conflict->package1) == 0
 | 
			
		||||
				&& strcmp(needle->package2, conflict->package2) == 0) {
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Adds the pkg1/pkg2 conflict to the baddeps list
 | 
			
		||||
 * @param *baddeps list to add conflict to
 | 
			
		||||
/** Adds the pkg1/pkg2 conflict to the baddeps list.
 | 
			
		||||
 * @param handle the context handle
 | 
			
		||||
 * @param baddeps list to add conflict to
 | 
			
		||||
 * @param pkg1 first package
 | 
			
		||||
 * @param pkg2 package causing conflict
 | 
			
		||||
 * @param reason reason for this conflict
 | 
			
		||||
 */
 | 
			
		||||
static void add_conflict(alpm_list_t **baddeps, const char *pkg1,
 | 
			
		||||
		const char *pkg2, const char *reason)
 | 
			
		||||
static int add_conflict(alpm_handle_t *handle, alpm_list_t **baddeps,
 | 
			
		||||
		alpm_pkg_t *pkg1, alpm_pkg_t *pkg2, alpm_depend_t *reason)
 | 
			
		||||
{
 | 
			
		||||
	pmconflict_t *conflict = _alpm_conflict_new(pkg1, pkg2, reason);
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "package %s conflicts with %s (by %s)\n",
 | 
			
		||||
			pkg1, pkg2, reason);
 | 
			
		||||
	if(conflict && !conflict_isin(conflict, *baddeps)) {
 | 
			
		||||
	alpm_conflict_t *conflict = conflict_new(pkg1, pkg2, reason);
 | 
			
		||||
	if(!conflict) {
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	if(!conflict_isin(conflict, *baddeps)) {
 | 
			
		||||
		char *conflict_str = alpm_dep_compute_string(reason);
 | 
			
		||||
		*baddeps = alpm_list_add(*baddeps, conflict);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "package %s conflicts with %s (by %s)\n",
 | 
			
		||||
				pkg1->name, pkg2->name, conflict_str);
 | 
			
		||||
		free(conflict_str);
 | 
			
		||||
	} else {
 | 
			
		||||
		_alpm_conflict_free(conflict);
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Check if packages from list1 conflict with packages from list2.
 | 
			
		||||
@@ -121,232 +126,223 @@ static void add_conflict(alpm_list_t **baddeps, const char *pkg1,
 | 
			
		||||
 * If a conflict (pkg1, pkg2) is found, it is added to the baddeps list
 | 
			
		||||
 * in this order if order >= 0, or reverse order (pkg2,pkg1) otherwise.
 | 
			
		||||
 *
 | 
			
		||||
 * @param handle the context handle
 | 
			
		||||
 * @param list1 first list of packages
 | 
			
		||||
 * @param list2 second list of packages
 | 
			
		||||
 * @param *baddeps list to store conflicts
 | 
			
		||||
 * @param baddeps list to store conflicts
 | 
			
		||||
 * @param order if >= 0 the conflict order is preserved, if < 0 it's reversed
 | 
			
		||||
 */
 | 
			
		||||
static void check_conflict(alpm_list_t *list1, alpm_list_t *list2,
 | 
			
		||||
static void check_conflict(alpm_handle_t *handle,
 | 
			
		||||
		alpm_list_t *list1, alpm_list_t *list2,
 | 
			
		||||
		alpm_list_t **baddeps, int order) {
 | 
			
		||||
	alpm_list_t *i, *j, *k;
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
 | 
			
		||||
	if(!baddeps) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	for(i = list1; i; i = i->next) {
 | 
			
		||||
		pmpkg_t *pkg1 = i->data;
 | 
			
		||||
		const char *pkg1name = alpm_pkg_get_name(pkg1);
 | 
			
		||||
		alpm_pkg_t *pkg1 = i->data;
 | 
			
		||||
		alpm_list_t *j;
 | 
			
		||||
 | 
			
		||||
		for(j = alpm_pkg_get_conflicts(pkg1); j; j = j->next) {
 | 
			
		||||
			const char *conflict = j->data;
 | 
			
		||||
			pmdepend_t *parsed_conflict = _alpm_splitdep(conflict);
 | 
			
		||||
			alpm_depend_t *conflict = j->data;
 | 
			
		||||
			alpm_list_t *k;
 | 
			
		||||
 | 
			
		||||
			for(k = list2; k; k = k->next) {
 | 
			
		||||
				pmpkg_t *pkg2 = k->data;
 | 
			
		||||
				const char *pkg2name = alpm_pkg_get_name(pkg2);
 | 
			
		||||
				alpm_pkg_t *pkg2 = k->data;
 | 
			
		||||
 | 
			
		||||
				if(strcmp(pkg1name, pkg2name) == 0) {
 | 
			
		||||
				if(pkg1->name_hash == pkg2->name_hash
 | 
			
		||||
						&& strcmp(pkg1->name, pkg2->name) == 0) {
 | 
			
		||||
					/* skip the package we're currently processing */
 | 
			
		||||
					continue;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if(_alpm_depcmp(pkg2, parsed_conflict)) {
 | 
			
		||||
				if(_alpm_depcmp(pkg2, conflict)) {
 | 
			
		||||
					if(order >= 0) {
 | 
			
		||||
						add_conflict(baddeps, pkg1name, pkg2name, conflict);
 | 
			
		||||
						add_conflict(handle, baddeps, pkg1, pkg2, conflict);
 | 
			
		||||
					} else {
 | 
			
		||||
						add_conflict(baddeps, pkg2name, pkg1name, conflict);
 | 
			
		||||
						add_conflict(handle, baddeps, pkg2, pkg1, conflict);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			_alpm_dep_free(parsed_conflict);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Check for inter-conflicts */
 | 
			
		||||
alpm_list_t *_alpm_innerconflicts(alpm_list_t *packages)
 | 
			
		||||
alpm_list_t *_alpm_innerconflicts(alpm_handle_t *handle, alpm_list_t *packages)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *baddeps = NULL;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "check targets vs targets\n");
 | 
			
		||||
	check_conflict(handle, packages, packages, &baddeps, 0);
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "check targets vs targets\n");
 | 
			
		||||
	check_conflict(packages, packages, &baddeps, 0);
 | 
			
		||||
 | 
			
		||||
	return(baddeps);
 | 
			
		||||
	return baddeps;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Check for target vs (db - target) conflicts
 | 
			
		||||
 * In case of conflict the package1 field of pmdepconflict_t contains
 | 
			
		||||
 * the target package, package2 field contains the local package
 | 
			
		||||
 */
 | 
			
		||||
alpm_list_t *_alpm_outerconflicts(pmdb_t *db, alpm_list_t *packages)
 | 
			
		||||
/* Check for target vs (db - target) conflicts */
 | 
			
		||||
alpm_list_t *_alpm_outerconflicts(alpm_db_t *db, alpm_list_t *packages)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *baddeps = NULL;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(db == NULL) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	alpm_list_t *dblist = alpm_list_diff(_alpm_db_get_pkgcache(db),
 | 
			
		||||
			packages, _alpm_pkg_cmp);
 | 
			
		||||
 | 
			
		||||
	/* two checks to be done here for conflicts */
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "check targets vs db\n");
 | 
			
		||||
	check_conflict(packages, dblist, &baddeps, 1);
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "check db vs targets\n");
 | 
			
		||||
	check_conflict(dblist, packages, &baddeps, -1);
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_DEBUG, "check targets vs db\n");
 | 
			
		||||
	check_conflict(db->handle, packages, dblist, &baddeps, 1);
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_DEBUG, "check db vs targets\n");
 | 
			
		||||
	check_conflict(db->handle, dblist, packages, &baddeps, -1);
 | 
			
		||||
 | 
			
		||||
	alpm_list_free(dblist);
 | 
			
		||||
	return(baddeps);
 | 
			
		||||
	return baddeps;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Check the package conflicts in a database
 | 
			
		||||
 *
 | 
			
		||||
 * @param handle the context handle
 | 
			
		||||
 * @param pkglist the list of packages to check
 | 
			
		||||
 * @return an alpm_list_t of pmconflict_t
 | 
			
		||||
 * @return an alpm_list_t of alpm_conflict_t
 | 
			
		||||
 */
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_checkconflicts(alpm_list_t *pkglist) {
 | 
			
		||||
	return(_alpm_innerconflicts(pkglist));
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_checkconflicts(alpm_handle_t *handle,
 | 
			
		||||
		alpm_list_t *pkglist)
 | 
			
		||||
{
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return _alpm_innerconflicts(handle, pkglist);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Returns a alpm_list_t* of file conflicts.
 | 
			
		||||
 *  Hooray for set-intersects!
 | 
			
		||||
 *  Pre-condition: both lists are sorted!
 | 
			
		||||
static const int DIFFERENCE = 0;
 | 
			
		||||
static const int INTERSECT = 1;
 | 
			
		||||
/* Returns a set operation on the provided two lists of files.
 | 
			
		||||
 * Pre-condition: both lists are sorted!
 | 
			
		||||
 * When done, free the list but NOT the contained data.
 | 
			
		||||
 *
 | 
			
		||||
 * Operations:
 | 
			
		||||
 *   DIFFERENCE - a difference operation is performed. filesA - filesB.
 | 
			
		||||
 *   INTERSECT - an intersection operation is performed. filesA & filesB.
 | 
			
		||||
 */
 | 
			
		||||
static alpm_list_t *chk_fileconflicts(alpm_list_t *filesA, alpm_list_t *filesB)
 | 
			
		||||
static alpm_list_t *filelist_operation(alpm_filelist_t *filesA,
 | 
			
		||||
		alpm_filelist_t *filesB, int operation)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *ret = NULL;
 | 
			
		||||
	alpm_list_t *pA = filesA, *pB = filesB;
 | 
			
		||||
	size_t ctrA = 0, ctrB = 0;
 | 
			
		||||
 | 
			
		||||
	while(pA && pB) {
 | 
			
		||||
		const char *strA = pA->data;
 | 
			
		||||
		const char *strB = pB->data;
 | 
			
		||||
		/* skip directories, we don't care about dir conflicts */
 | 
			
		||||
	while(ctrA < filesA->count && ctrB < filesB->count) {
 | 
			
		||||
		alpm_file_t *fileA = filesA->files + ctrA;
 | 
			
		||||
		alpm_file_t *fileB = filesB->files + ctrB;
 | 
			
		||||
		const char *strA = fileA->name;
 | 
			
		||||
		const char *strB = fileB->name;
 | 
			
		||||
		/* skip directories, we don't care about them */
 | 
			
		||||
		if(strA[strlen(strA)-1] == '/') {
 | 
			
		||||
			pA = pA->next;
 | 
			
		||||
			ctrA++;
 | 
			
		||||
		} else if(strB[strlen(strB)-1] == '/') {
 | 
			
		||||
			pB = pB->next;
 | 
			
		||||
			ctrB++;
 | 
			
		||||
		} else {
 | 
			
		||||
			int cmp = strcmp(strA, strB);
 | 
			
		||||
			if(cmp < 0) {
 | 
			
		||||
				/* item only in filesA, ignore it */
 | 
			
		||||
				pA = pA->next;
 | 
			
		||||
				if(operation == DIFFERENCE) {
 | 
			
		||||
					/* item only in filesA, qualifies as a difference */
 | 
			
		||||
					ret = alpm_list_add(ret, fileA);
 | 
			
		||||
				}
 | 
			
		||||
				ctrA++;
 | 
			
		||||
			} else if(cmp > 0) {
 | 
			
		||||
				/* item only in filesB, ignore it */
 | 
			
		||||
				pB = pB->next;
 | 
			
		||||
				ctrB++;
 | 
			
		||||
			} else {
 | 
			
		||||
				/* item in both, record it */
 | 
			
		||||
				ret = alpm_list_add(ret, strdup(strA));
 | 
			
		||||
				pA = pA->next;
 | 
			
		||||
				pB = pB->next;
 | 
			
		||||
				if(operation == INTERSECT) {
 | 
			
		||||
					/* item in both, qualifies as an intersect */
 | 
			
		||||
					ret = alpm_list_add(ret, fileA);
 | 
			
		||||
				}
 | 
			
		||||
				ctrA++;
 | 
			
		||||
				ctrB++;
 | 
			
		||||
			}
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(ret);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Returns a alpm_list_t* of files that are in filesA but *NOT* in filesB
 | 
			
		||||
 *  This is an 'A minus B' set operation
 | 
			
		||||
 *  Pre-condition: both lists are sorted!
 | 
			
		||||
 */
 | 
			
		||||
static alpm_list_t *chk_filedifference(alpm_list_t *filesA, alpm_list_t *filesB)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *ret = NULL;
 | 
			
		||||
	alpm_list_t *pA = filesA, *pB = filesB;
 | 
			
		||||
 | 
			
		||||
	/* if both filesA and filesB have entries, do this loop */
 | 
			
		||||
	while(pA && pB) {
 | 
			
		||||
		const char *strA = pA->data;
 | 
			
		||||
		const char *strB = pB->data;
 | 
			
		||||
		/* skip directories, we don't care about dir conflicts */
 | 
			
		||||
		if(strA[strlen(strA)-1] == '/') {
 | 
			
		||||
			pA = pA->next;
 | 
			
		||||
		} else if(strB[strlen(strB)-1] == '/') {
 | 
			
		||||
			pB = pB->next;
 | 
			
		||||
		} else {
 | 
			
		||||
			int cmp = strcmp(strA, strB);
 | 
			
		||||
			if(cmp < 0) {
 | 
			
		||||
				/* item only in filesA, record it */
 | 
			
		||||
				ret = alpm_list_add(ret, strdup(strA));
 | 
			
		||||
				pA = pA->next;
 | 
			
		||||
			} else if(cmp > 0) {
 | 
			
		||||
				/* item only in fileB, but this means nothing */
 | 
			
		||||
				pB = pB->next;
 | 
			
		||||
			} else {
 | 
			
		||||
				/* item in both, ignore it */
 | 
			
		||||
				pA = pA->next;
 | 
			
		||||
				pB = pB->next;
 | 
			
		||||
			}
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
	/* ensure we have completely emptied pA */
 | 
			
		||||
	while(pA) {
 | 
			
		||||
		const char *strA = pA->data;
 | 
			
		||||
	/* if doing a difference, ensure we have completely emptied pA */
 | 
			
		||||
	while(operation == DIFFERENCE && ctrA < filesA->count) {
 | 
			
		||||
		alpm_file_t *fileA = filesA->files + ctrA;
 | 
			
		||||
		const char *strA = fileA->name;
 | 
			
		||||
		/* skip directories */
 | 
			
		||||
		if(strA[strlen(strA)-1] != '/') {
 | 
			
		||||
			ret = alpm_list_add(ret, strdup(strA));
 | 
			
		||||
			ret = alpm_list_add(ret, fileA);
 | 
			
		||||
		}
 | 
			
		||||
		pA = pA->next;
 | 
			
		||||
		ctrA++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(ret);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Adds pmfileconflict_t to a conflicts list. Pass the conflicts list, type (either
 | 
			
		||||
 * PM_FILECONFLICT_TARGET or PM_FILECONFLICT_FILESYSTEM), a file string, and either
 | 
			
		||||
 * two package names or one package name and NULL. This is a wrapper for former
 | 
			
		||||
 * functionality that was done inline.
 | 
			
		||||
/* Adds alpm_fileconflict_t to a conflicts list. Pass the conflicts list, the
 | 
			
		||||
 * conflicting file path, and either two packages or one package and NULL.
 | 
			
		||||
 */
 | 
			
		||||
static alpm_list_t *add_fileconflict(alpm_list_t *conflicts,
 | 
			
		||||
                    pmfileconflicttype_t type, const char *filestr,
 | 
			
		||||
                    const char* name1, const char* name2)
 | 
			
		||||
static alpm_list_t *add_fileconflict(alpm_handle_t *handle,
 | 
			
		||||
		alpm_list_t *conflicts, const char *filestr,
 | 
			
		||||
		alpm_pkg_t *pkg1, alpm_pkg_t *pkg2)
 | 
			
		||||
{
 | 
			
		||||
	pmfileconflict_t *conflict;
 | 
			
		||||
	MALLOC(conflict, sizeof(pmfileconflict_t), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	alpm_fileconflict_t *conflict;
 | 
			
		||||
	MALLOC(conflict, sizeof(alpm_fileconflict_t), goto error);
 | 
			
		||||
 | 
			
		||||
	conflict->type = type;
 | 
			
		||||
	STRDUP(conflict->target, name1, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	STRDUP(conflict->file, filestr, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	if(name2) {
 | 
			
		||||
		STRDUP(conflict->ctarget, name2, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	STRDUP(conflict->target, pkg1->name, goto error);
 | 
			
		||||
	STRDUP(conflict->file, filestr, goto error);
 | 
			
		||||
	if(pkg2) {
 | 
			
		||||
		conflict->type = ALPM_FILECONFLICT_TARGET;
 | 
			
		||||
		STRDUP(conflict->ctarget, pkg2->name, goto error);
 | 
			
		||||
	} else {
 | 
			
		||||
		conflict->ctarget = "";
 | 
			
		||||
		conflict->type = ALPM_FILECONFLICT_FILESYSTEM;
 | 
			
		||||
		STRDUP(conflict->ctarget, "", goto error);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	conflicts = alpm_list_add(conflicts, conflict);
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "found file conflict %s, packages %s and %s\n",
 | 
			
		||||
	          filestr, name1, name2 ? name2 : "(filesystem)");
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "found file conflict %s, packages %s and %s\n",
 | 
			
		||||
	          filestr, pkg1->name, pkg2 ? pkg2->name : "(filesystem)");
 | 
			
		||||
 | 
			
		||||
	return(conflicts);
 | 
			
		||||
	return conflicts;
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
	RET_ERR(handle, ALPM_ERR_MEMORY, conflicts);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_fileconflict_free(pmfileconflict_t *conflict)
 | 
			
		||||
void _alpm_fileconflict_free(alpm_fileconflict_t *conflict)
 | 
			
		||||
{
 | 
			
		||||
	if(strlen(conflict->ctarget) > 0) {
 | 
			
		||||
		FREE(conflict->ctarget);
 | 
			
		||||
	}
 | 
			
		||||
	FREE(conflict->file);;
 | 
			
		||||
	FREE(conflict->ctarget);
 | 
			
		||||
	FREE(conflict->file);
 | 
			
		||||
	FREE(conflict->target);
 | 
			
		||||
	FREE(conflict);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int dir_belongsto_pkg(char *dirpath, pmpkg_t *pkg)
 | 
			
		||||
const alpm_file_t *_alpm_filelist_contains(alpm_filelist_t *filelist,
 | 
			
		||||
		const char *name)
 | 
			
		||||
{
 | 
			
		||||
	size_t i;
 | 
			
		||||
	const alpm_file_t *file = filelist->files;
 | 
			
		||||
	for(i = 0; i < filelist->count; i++) {
 | 
			
		||||
		if(strcmp(file->name, name) == 0) {
 | 
			
		||||
			return file;
 | 
			
		||||
		}
 | 
			
		||||
		file++;
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int dir_belongsto_pkg(const char *root, const char *dirpath,
 | 
			
		||||
		alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	struct dirent *ent = NULL;
 | 
			
		||||
	struct stat sbuf;
 | 
			
		||||
	char path[PATH_MAX];
 | 
			
		||||
	char abspath[PATH_MAX];
 | 
			
		||||
	struct dirent *ent = NULL;
 | 
			
		||||
	DIR *dir;
 | 
			
		||||
 | 
			
		||||
	snprintf(abspath, PATH_MAX, "%s%s", handle->root, dirpath);
 | 
			
		||||
	snprintf(abspath, PATH_MAX, "%s%s", root, dirpath);
 | 
			
		||||
	dir = opendir(abspath);
 | 
			
		||||
	if(dir == NULL) {
 | 
			
		||||
		return(1);
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while((ent = readdir(dir)) != NULL) {
 | 
			
		||||
		const char *name = ent->d_name;
 | 
			
		||||
 | 
			
		||||
@@ -354,44 +350,42 @@ static int dir_belongsto_pkg(char *dirpath, pmpkg_t *pkg)
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		snprintf(path, PATH_MAX, "%s/%s", dirpath, name);
 | 
			
		||||
		snprintf(abspath, PATH_MAX, "%s%s", handle->root, path);
 | 
			
		||||
		snprintf(abspath, PATH_MAX, "%s%s", root, path);
 | 
			
		||||
		if(stat(abspath, &sbuf) != 0) {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		if(S_ISDIR(sbuf.st_mode)) {
 | 
			
		||||
			if(dir_belongsto_pkg(path, pkg)) {
 | 
			
		||||
			if(dir_belongsto_pkg(root, path, pkg)) {
 | 
			
		||||
				continue;
 | 
			
		||||
			} else {
 | 
			
		||||
				closedir(dir);
 | 
			
		||||
				return(0);
 | 
			
		||||
				return 0;
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			if(alpm_list_find_str(alpm_pkg_get_files(pkg), path)) {
 | 
			
		||||
			if(_alpm_filelist_contains(alpm_pkg_get_files(pkg), path)) {
 | 
			
		||||
				continue;
 | 
			
		||||
			} else {
 | 
			
		||||
				closedir(dir);
 | 
			
		||||
				return(0);
 | 
			
		||||
				return 0;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	closedir(dir);
 | 
			
		||||
	return(1);
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Find file conflicts that may occur during the transaction with two checks:
 | 
			
		||||
 * 1: check every target against every target
 | 
			
		||||
 * 2: check every target against the filesystem */
 | 
			
		||||
alpm_list_t *_alpm_db_find_fileconflicts(pmdb_t *db, pmtrans_t *trans,
 | 
			
		||||
alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle,
 | 
			
		||||
		alpm_list_t *upgrade, alpm_list_t *remove)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *i, *j, *conflicts = NULL;
 | 
			
		||||
	alpm_list_t *i, *conflicts = NULL;
 | 
			
		||||
	size_t numtargs = alpm_list_count(upgrade);
 | 
			
		||||
	size_t current;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(db == NULL || upgrade == NULL || trans == NULL) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
	if(!upgrade) {
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* TODO this whole function needs a huge change, which hopefully will
 | 
			
		||||
@@ -399,60 +393,74 @@ alpm_list_t *_alpm_db_find_fileconflicts(pmdb_t *db, pmtrans_t *trans,
 | 
			
		||||
	 * here as we do when we actually extract files in add.c with our 12
 | 
			
		||||
	 * different cases. */
 | 
			
		||||
	for(current = 0, i = upgrade; i; i = i->next, current++) {
 | 
			
		||||
		alpm_list_t *k, *tmpfiles = NULL;
 | 
			
		||||
		pmpkg_t *p1, *p2, *dbpkg;
 | 
			
		||||
		char path[PATH_MAX+1];
 | 
			
		||||
 | 
			
		||||
		p1 = i->data;
 | 
			
		||||
		if(!p1) {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		alpm_pkg_t *p1 = i->data;
 | 
			
		||||
		alpm_list_t *j;
 | 
			
		||||
		alpm_filelist_t tmpfiles;
 | 
			
		||||
		alpm_pkg_t *dbpkg;
 | 
			
		||||
		size_t filenum;
 | 
			
		||||
 | 
			
		||||
		int percent = (current * 100) / numtargs;
 | 
			
		||||
		PROGRESS(trans, PM_TRANS_PROGRESS_CONFLICTS_START, "", percent,
 | 
			
		||||
		PROGRESS(handle, ALPM_PROGRESS_CONFLICTS_START, "", percent,
 | 
			
		||||
		         numtargs, current);
 | 
			
		||||
		/* CHECK 1: check every target against every target */
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "searching for file conflicts: %s\n",
 | 
			
		||||
								alpm_pkg_get_name(p1));
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "searching for file conflicts: %s\n",
 | 
			
		||||
				p1->name);
 | 
			
		||||
		for(j = i->next; j; j = j->next) {
 | 
			
		||||
			p2 = j->data;
 | 
			
		||||
			if(!p2) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			tmpfiles = chk_fileconflicts(alpm_pkg_get_files(p1), alpm_pkg_get_files(p2));
 | 
			
		||||
			alpm_list_t *common_files;
 | 
			
		||||
			alpm_pkg_t *p2 = j->data;
 | 
			
		||||
			common_files = filelist_operation(alpm_pkg_get_files(p1),
 | 
			
		||||
					alpm_pkg_get_files(p2), INTERSECT);
 | 
			
		||||
 | 
			
		||||
			if(tmpfiles) {
 | 
			
		||||
				for(k = tmpfiles; k; k = k->next) {
 | 
			
		||||
					snprintf(path, PATH_MAX, "%s%s", handle->root, (char *)k->data);
 | 
			
		||||
					conflicts = add_fileconflict(conflicts, PM_FILECONFLICT_TARGET, path,
 | 
			
		||||
							alpm_pkg_get_name(p1), alpm_pkg_get_name(p2));
 | 
			
		||||
			if(common_files) {
 | 
			
		||||
				alpm_list_t *k;
 | 
			
		||||
				char path[PATH_MAX];
 | 
			
		||||
				for(k = common_files; k; k = k->next) {
 | 
			
		||||
					alpm_file_t *file = k->data;
 | 
			
		||||
					snprintf(path, PATH_MAX, "%s%s", handle->root, file->name);
 | 
			
		||||
					conflicts = add_fileconflict(handle, conflicts, path, p1, p2);
 | 
			
		||||
					if(handle->pm_errno == ALPM_ERR_MEMORY) {
 | 
			
		||||
						FREELIST(conflicts);
 | 
			
		||||
						FREELIST(common_files);
 | 
			
		||||
						return NULL;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				FREELIST(tmpfiles);
 | 
			
		||||
				alpm_list_free(common_files);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* declarations for second check */
 | 
			
		||||
		struct stat lsbuf, sbuf;
 | 
			
		||||
		char *filestr = NULL;
 | 
			
		||||
 | 
			
		||||
		/* CHECK 2: check every target against the filesystem */
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "searching for filesystem conflicts: %s\n", p1->name);
 | 
			
		||||
		dbpkg = _alpm_db_get_pkgfromcache(db, p1->name);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "searching for filesystem conflicts: %s\n",
 | 
			
		||||
				p1->name);
 | 
			
		||||
		dbpkg = _alpm_db_get_pkgfromcache(handle->db_local, p1->name);
 | 
			
		||||
 | 
			
		||||
		/* Do two different checks here. If the package is currently installed,
 | 
			
		||||
		 * then only check files that are new in the new package. If the package
 | 
			
		||||
		 * is not currently installed, then simply stat the whole filelist */
 | 
			
		||||
		 * is not currently installed, then simply stat the whole filelist. Note
 | 
			
		||||
		 * that the former list needs to be freed while the latter list should NOT
 | 
			
		||||
		 * be freed. */
 | 
			
		||||
		if(dbpkg) {
 | 
			
		||||
			alpm_list_t *difference;
 | 
			
		||||
			/* older ver of package currently installed */
 | 
			
		||||
			tmpfiles = chk_filedifference(alpm_pkg_get_files(p1),
 | 
			
		||||
					alpm_pkg_get_files(dbpkg));
 | 
			
		||||
			difference = filelist_operation(alpm_pkg_get_files(p1),
 | 
			
		||||
					alpm_pkg_get_files(dbpkg), DIFFERENCE);
 | 
			
		||||
			tmpfiles.count = alpm_list_count(difference);
 | 
			
		||||
			tmpfiles.files = alpm_list_to_array(difference, tmpfiles.count,
 | 
			
		||||
					sizeof(alpm_file_t));
 | 
			
		||||
			alpm_list_free(difference);
 | 
			
		||||
		} else {
 | 
			
		||||
			/* no version of package currently installed */
 | 
			
		||||
			tmpfiles = alpm_list_strdup(alpm_pkg_get_files(p1));
 | 
			
		||||
			tmpfiles = *alpm_pkg_get_files(p1);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for(j = tmpfiles; j; j = j->next) {
 | 
			
		||||
			filestr = j->data;
 | 
			
		||||
		for(filenum = 0; filenum < tmpfiles.count; filenum++) {
 | 
			
		||||
			alpm_file_t *file = tmpfiles.files + filenum;
 | 
			
		||||
			const char *filestr = file->name;
 | 
			
		||||
			const char *relative_path;
 | 
			
		||||
			alpm_list_t *k;
 | 
			
		||||
			/* have we acted on this conflict? */
 | 
			
		||||
			int resolved_conflict = 0;
 | 
			
		||||
			struct stat lsbuf;
 | 
			
		||||
			char path[PATH_MAX];
 | 
			
		||||
 | 
			
		||||
			snprintf(path, PATH_MAX, "%s%s", handle->root, filestr);
 | 
			
		||||
 | 
			
		||||
@@ -460,46 +468,56 @@ alpm_list_t *_alpm_db_find_fileconflicts(pmdb_t *db, pmtrans_t *trans,
 | 
			
		||||
			if(_alpm_lstat(path, &lsbuf) != 0) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			stat(path, &sbuf);
 | 
			
		||||
 | 
			
		||||
			if(path[strlen(path)-1] == '/') {
 | 
			
		||||
			if(S_ISDIR(file->mode)) {
 | 
			
		||||
				struct stat sbuf;
 | 
			
		||||
				if(S_ISDIR(lsbuf.st_mode)) {
 | 
			
		||||
					_alpm_log(PM_LOG_DEBUG, "%s is a directory, not a conflict\n", path);
 | 
			
		||||
					_alpm_log(handle, ALPM_LOG_DEBUG, "%s is a directory, not a conflict\n", path);
 | 
			
		||||
					continue;
 | 
			
		||||
				} else if(S_ISLNK(lsbuf.st_mode) && S_ISDIR(sbuf.st_mode)) {
 | 
			
		||||
					_alpm_log(PM_LOG_DEBUG,
 | 
			
		||||
				}
 | 
			
		||||
				stat(path, &sbuf);
 | 
			
		||||
				if(S_ISLNK(lsbuf.st_mode) && S_ISDIR(sbuf.st_mode)) {
 | 
			
		||||
					_alpm_log(handle, ALPM_LOG_DEBUG,
 | 
			
		||||
							"%s is a symlink to a dir, hopefully not a conflict\n", path);
 | 
			
		||||
					continue;
 | 
			
		||||
				}
 | 
			
		||||
				/* if we made it to here, we want all subsequent path comparisons to
 | 
			
		||||
				 * not include the trailing slash. This allows things like file ->
 | 
			
		||||
				 * directory replacements. */
 | 
			
		||||
				path[strlen(path) - 1] = '\0';
 | 
			
		||||
			}
 | 
			
		||||
			_alpm_log(PM_LOG_DEBUG, "checking possible conflict: %s\n", path);
 | 
			
		||||
 | 
			
		||||
			int resolved_conflict = 0; /* have we acted on this conflict? */
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_DEBUG, "checking possible conflict: %s\n", path);
 | 
			
		||||
			relative_path = path + strlen(handle->root);
 | 
			
		||||
 | 
			
		||||
			/* Check remove list (will we remove the conflicting local file?) */
 | 
			
		||||
			for(k = remove; k && !resolved_conflict; k = k->next) {
 | 
			
		||||
				pmpkg_t *rempkg = k->data;
 | 
			
		||||
				if(rempkg && alpm_list_find_str(alpm_pkg_get_files(rempkg), filestr)) {
 | 
			
		||||
					_alpm_log(PM_LOG_DEBUG, "local file will be removed, not a conflict: %s\n", filestr);
 | 
			
		||||
				alpm_pkg_t *rempkg = k->data;
 | 
			
		||||
				if(rempkg && _alpm_filelist_contains(alpm_pkg_get_files(rempkg),
 | 
			
		||||
							relative_path)) {
 | 
			
		||||
					_alpm_log(handle, ALPM_LOG_DEBUG,
 | 
			
		||||
							"local file will be removed, not a conflict: %s\n", path);
 | 
			
		||||
					resolved_conflict = 1;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/* Look at all the targets to see if file has changed hands */
 | 
			
		||||
			for(k = upgrade; k && !resolved_conflict; k = k->next) {
 | 
			
		||||
				p2 = k->data;
 | 
			
		||||
				alpm_pkg_t *p2 = k->data;
 | 
			
		||||
				if(!p2 || strcmp(p1->name, p2->name) == 0) {
 | 
			
		||||
					continue;
 | 
			
		||||
				}
 | 
			
		||||
				pmpkg_t *localp2 = _alpm_db_get_pkgfromcache(db, p2->name);
 | 
			
		||||
				alpm_pkg_t *localp2 = _alpm_db_get_pkgfromcache(handle->db_local, p2->name);
 | 
			
		||||
 | 
			
		||||
				/* localp2->files will be removed (target conflicts are handled by CHECK 1) */
 | 
			
		||||
				if(localp2 && alpm_list_find_str(alpm_pkg_get_files(localp2), filestr)) {
 | 
			
		||||
				if(localp2 && _alpm_filelist_contains(alpm_pkg_get_files(localp2), filestr)) {
 | 
			
		||||
					/* skip removal of file, but not add. this will prevent a second
 | 
			
		||||
					 * package from removing the file when it was already installed
 | 
			
		||||
					 * by its new owner (whether the file is in backup array or not */
 | 
			
		||||
					trans->skip_remove = alpm_list_add(trans->skip_remove, strdup(filestr));
 | 
			
		||||
					_alpm_log(PM_LOG_DEBUG, "file changed packages, adding to remove skiplist: %s\n", filestr);
 | 
			
		||||
					handle->trans->skip_remove =
 | 
			
		||||
						alpm_list_add(handle->trans->skip_remove, strdup(filestr));
 | 
			
		||||
					_alpm_log(handle, ALPM_LOG_DEBUG,
 | 
			
		||||
							"file changed packages, adding to remove skiplist: %s\n", path);
 | 
			
		||||
					resolved_conflict = 1;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
@@ -508,115 +526,66 @@ alpm_list_t *_alpm_db_find_fileconflicts(pmdb_t *db, pmtrans_t *trans,
 | 
			
		||||
			if(!resolved_conflict && S_ISDIR(lsbuf.st_mode) && dbpkg) {
 | 
			
		||||
				char *dir = malloc(strlen(filestr) + 2);
 | 
			
		||||
				sprintf(dir, "%s/", filestr);
 | 
			
		||||
				if(alpm_list_find_str(alpm_pkg_get_files(dbpkg),dir)) {
 | 
			
		||||
					_alpm_log(PM_LOG_DEBUG, "check if all files in %s belongs to %s\n",
 | 
			
		||||
				if(_alpm_filelist_contains(alpm_pkg_get_files(dbpkg), dir)) {
 | 
			
		||||
					_alpm_log(handle, ALPM_LOG_DEBUG,
 | 
			
		||||
							"check if all files in %s belongs to %s\n",
 | 
			
		||||
							dir, dbpkg->name);
 | 
			
		||||
					resolved_conflict = dir_belongsto_pkg(filestr, dbpkg);
 | 
			
		||||
					resolved_conflict = dir_belongsto_pkg(handle->root, filestr, dbpkg);
 | 
			
		||||
				}
 | 
			
		||||
				free(dir);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if(!resolved_conflict && dbpkg) {
 | 
			
		||||
				char *rpath = calloc(PATH_MAX+1, sizeof(char));
 | 
			
		||||
				char *rpath = calloc(PATH_MAX, sizeof(char));
 | 
			
		||||
				const char *relative_rpath;
 | 
			
		||||
				if(!realpath(path, rpath)) {
 | 
			
		||||
					FREE(rpath);
 | 
			
		||||
					free(rpath);
 | 
			
		||||
					continue;
 | 
			
		||||
				}
 | 
			
		||||
				char *filestr = rpath + strlen(handle->root);
 | 
			
		||||
				if(alpm_list_find_str(alpm_pkg_get_files(dbpkg),filestr)) {
 | 
			
		||||
				relative_rpath = rpath + strlen(handle->root);
 | 
			
		||||
				if(_alpm_filelist_contains(alpm_pkg_get_files(dbpkg), relative_rpath)) {
 | 
			
		||||
					resolved_conflict = 1;
 | 
			
		||||
				}
 | 
			
		||||
				free(rpath);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/* is the file unowned and in the backup list of the new package? */
 | 
			
		||||
			if(!resolved_conflict && _alpm_needbackup(filestr, p1)) {
 | 
			
		||||
				alpm_list_t *local_pkgs = _alpm_db_get_pkgcache(handle->db_local);
 | 
			
		||||
				int found = 0;
 | 
			
		||||
				for(k = local_pkgs; k && !found; k = k->next) {
 | 
			
		||||
					if(_alpm_filelist_contains(alpm_pkg_get_files(k->data), filestr)) {
 | 
			
		||||
							found = 1;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if(!found) {
 | 
			
		||||
					_alpm_log(handle, ALPM_LOG_DEBUG,
 | 
			
		||||
							"file was unowned but in new backup list: %s\n", path);
 | 
			
		||||
					resolved_conflict = 1;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if(!resolved_conflict) {
 | 
			
		||||
				_alpm_log(PM_LOG_DEBUG, "file found in conflict: %s\n", path);
 | 
			
		||||
				conflicts = add_fileconflict(conflicts, PM_FILECONFLICT_FILESYSTEM,
 | 
			
		||||
						path, p1->name, NULL);
 | 
			
		||||
				conflicts = add_fileconflict(handle, conflicts, path, p1, NULL);
 | 
			
		||||
				if(handle->pm_errno == ALPM_ERR_MEMORY) {
 | 
			
		||||
					FREELIST(conflicts);
 | 
			
		||||
					if(dbpkg) {
 | 
			
		||||
						/* only freed if it was generated from filelist_operation() */
 | 
			
		||||
						free(tmpfiles.files);
 | 
			
		||||
					}
 | 
			
		||||
					return NULL;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		FREELIST(tmpfiles);
 | 
			
		||||
		if(dbpkg) {
 | 
			
		||||
			/* only freed if it was generated from filelist_operation() */
 | 
			
		||||
			free(tmpfiles.files);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	PROGRESS(trans, PM_TRANS_PROGRESS_CONFLICTS_START, "", 100,
 | 
			
		||||
	PROGRESS(handle, ALPM_PROGRESS_CONFLICTS_START, "", 100,
 | 
			
		||||
			numtargs, current);
 | 
			
		||||
 | 
			
		||||
	return(conflicts);
 | 
			
		||||
	return conflicts;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_conflict_get_package1(pmconflict_t *conflict)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(NULL));
 | 
			
		||||
	ASSERT(conflict != NULL, return(NULL));
 | 
			
		||||
 | 
			
		||||
	return conflict->package1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_conflict_get_package2(pmconflict_t *conflict)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(NULL));
 | 
			
		||||
	ASSERT(conflict != NULL, return(NULL));
 | 
			
		||||
 | 
			
		||||
	return conflict->package2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_conflict_get_reason(pmconflict_t *conflict)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(NULL));
 | 
			
		||||
	ASSERT(conflict != NULL, return(NULL));
 | 
			
		||||
 | 
			
		||||
	return conflict->reason;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_fileconflict_get_target(pmfileconflict_t *conflict)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(NULL));
 | 
			
		||||
	ASSERT(conflict != NULL, return(NULL));
 | 
			
		||||
 | 
			
		||||
	return conflict->target;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pmfileconflicttype_t SYMEXPORT alpm_fileconflict_get_type(pmfileconflict_t *conflict)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(-1));
 | 
			
		||||
	ASSERT(conflict != NULL, return(-1));
 | 
			
		||||
 | 
			
		||||
	return conflict->type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_fileconflict_get_file(pmfileconflict_t *conflict)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(NULL));
 | 
			
		||||
	ASSERT(conflict != NULL, return(NULL));
 | 
			
		||||
 | 
			
		||||
	return conflict->file;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_fileconflict_get_ctarget(pmfileconflict_t *conflict)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(NULL));
 | 
			
		||||
	ASSERT(conflict != NULL, return(NULL));
 | 
			
		||||
 | 
			
		||||
	return conflict->ctarget;
 | 
			
		||||
}
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -24,28 +24,17 @@
 | 
			
		||||
#include "db.h"
 | 
			
		||||
#include "package.h"
 | 
			
		||||
 | 
			
		||||
struct __pmconflict_t {
 | 
			
		||||
	char *package1;
 | 
			
		||||
	char *package2;
 | 
			
		||||
	char *reason;
 | 
			
		||||
};
 | 
			
		||||
alpm_conflict_t *_alpm_conflict_dup(const alpm_conflict_t *conflict);
 | 
			
		||||
void _alpm_conflict_free(alpm_conflict_t *conflict);
 | 
			
		||||
alpm_list_t *_alpm_innerconflicts(alpm_handle_t *handle, alpm_list_t *packages);
 | 
			
		||||
alpm_list_t *_alpm_outerconflicts(alpm_db_t *db, alpm_list_t *packages);
 | 
			
		||||
alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle,
 | 
			
		||||
		alpm_list_t *upgrade, alpm_list_t *remove);
 | 
			
		||||
 | 
			
		||||
struct __pmfileconflict_t {
 | 
			
		||||
	char *target;
 | 
			
		||||
	pmfileconflicttype_t type;
 | 
			
		||||
	char *file;
 | 
			
		||||
	char *ctarget;
 | 
			
		||||
};
 | 
			
		||||
void _alpm_fileconflict_free(alpm_fileconflict_t *conflict);
 | 
			
		||||
 | 
			
		||||
pmconflict_t *_alpm_conflict_new(const char *package1, const char *package2, const char *reason);
 | 
			
		||||
pmconflict_t *_alpm_conflict_dup(const pmconflict_t *conflict);
 | 
			
		||||
void _alpm_conflict_free(pmconflict_t *conflict);
 | 
			
		||||
alpm_list_t *_alpm_innerconflicts(alpm_list_t *packages);
 | 
			
		||||
alpm_list_t *_alpm_outerconflicts(pmdb_t *db, alpm_list_t *packages);
 | 
			
		||||
alpm_list_t *_alpm_db_find_fileconflicts(pmdb_t *db, pmtrans_t *trans,
 | 
			
		||||
					 alpm_list_t *upgrade, alpm_list_t *remove);
 | 
			
		||||
 | 
			
		||||
void _alpm_fileconflict_free(pmfileconflict_t *conflict);
 | 
			
		||||
const alpm_file_t *_alpm_filelist_contains(alpm_filelist_t *filelist,
 | 
			
		||||
		const char *name);
 | 
			
		||||
 | 
			
		||||
#endif /* _ALPM_CONFLICT_H */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										578
									
								
								lib/libalpm/db.c
									
									
									
									
									
								
							
							
						
						
									
										578
									
								
								lib/libalpm/db.c
									
									
									
									
									
								
							@@ -26,11 +26,8 @@
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <regex.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
/* libalpm */
 | 
			
		||||
#include "db.h"
 | 
			
		||||
@@ -48,42 +45,40 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** Register a sync database of packages. */
 | 
			
		||||
pmdb_t SYMEXPORT *alpm_db_register_sync(const char *treename)
 | 
			
		||||
alpm_db_t SYMEXPORT *alpm_db_register_sync(alpm_handle_t *handle,
 | 
			
		||||
		const char *treename, alpm_siglevel_t level)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, NULL));
 | 
			
		||||
	ASSERT(treename != NULL && strlen(treename) != 0, RET_ERR(PM_ERR_WRONG_ARGS, NULL));
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	ASSERT(treename != NULL && strlen(treename) != 0,
 | 
			
		||||
			RET_ERR(handle, ALPM_ERR_WRONG_ARGS, NULL));
 | 
			
		||||
	/* Do not register a database if a transaction is on-going */
 | 
			
		||||
	ASSERT(handle->trans == NULL, RET_ERR(PM_ERR_TRANS_NOT_NULL, NULL));
 | 
			
		||||
	ASSERT(handle->trans == NULL, RET_ERR(handle, ALPM_ERR_TRANS_NOT_NULL, NULL));
 | 
			
		||||
 | 
			
		||||
	return(_alpm_db_register_sync(treename));
 | 
			
		||||
	return _alpm_db_register_sync(handle, treename, level);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Helper function for alpm_db_unregister{_all} */
 | 
			
		||||
void _alpm_db_unregister(pmdb_t *db)
 | 
			
		||||
void _alpm_db_unregister(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	if(db == NULL) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "unregistering database '%s'\n", db->treename);
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_DEBUG, "unregistering database '%s'\n", db->treename);
 | 
			
		||||
	_alpm_db_free(db);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Unregister all package databases. */
 | 
			
		||||
int SYMEXPORT alpm_db_unregister_all(void)
 | 
			
		||||
int SYMEXPORT alpm_db_unregister_all(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
	pmdb_t *db;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	alpm_db_t *db;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	/* Do not unregister a database if a transaction is on-going */
 | 
			
		||||
	ASSERT(handle->trans == NULL, RET_ERR(PM_ERR_TRANS_NOT_NULL, -1));
 | 
			
		||||
	ASSERT(handle->trans == NULL, RET_ERR(handle, ALPM_ERR_TRANS_NOT_NULL, -1));
 | 
			
		||||
 | 
			
		||||
	/* unregister all sync dbs */
 | 
			
		||||
	for(i = handle->dbs_sync; i; i = i->next) {
 | 
			
		||||
@@ -92,21 +87,21 @@ int SYMEXPORT alpm_db_unregister_all(void)
 | 
			
		||||
		i->data = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	FREELIST(handle->dbs_sync);
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Unregister a package database. */
 | 
			
		||||
int SYMEXPORT alpm_db_unregister(pmdb_t *db)
 | 
			
		||||
int SYMEXPORT alpm_db_unregister(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	int found = 0;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	alpm_handle_t *handle;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	ASSERT(db != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
	ASSERT(db != NULL, return -1);
 | 
			
		||||
	/* Do not unregister a database if a transaction is on-going */
 | 
			
		||||
	ASSERT(handle->trans == NULL, RET_ERR(PM_ERR_TRANS_NOT_NULL, -1));
 | 
			
		||||
	handle = db->handle;
 | 
			
		||||
	handle->pm_errno = 0;
 | 
			
		||||
	ASSERT(handle->trans == NULL, RET_ERR(handle, ALPM_ERR_TRANS_NOT_NULL, -1));
 | 
			
		||||
 | 
			
		||||
	if(db == handle->db_local) {
 | 
			
		||||
		handle->db_local = NULL;
 | 
			
		||||
@@ -125,196 +120,223 @@ int SYMEXPORT alpm_db_unregister(pmdb_t *db)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(!found) {
 | 
			
		||||
		RET_ERR(PM_ERR_DB_NOT_FOUND, -1);
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_DB_NOT_FOUND, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	db->ops->unregister(db);
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Get the serverlist of a database. */
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_db_get_servers(const alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(db != NULL, return NULL);
 | 
			
		||||
	return db->servers;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Set the serverlist of a database. */
 | 
			
		||||
int SYMEXPORT alpm_db_setserver(pmdb_t *db, const char *url)
 | 
			
		||||
int SYMEXPORT alpm_db_set_servers(alpm_db_t *db, alpm_list_t *servers)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
	int found = 0;
 | 
			
		||||
	char *newurl;
 | 
			
		||||
	size_t len = 0;
 | 
			
		||||
	ASSERT(db != NULL, return -1);
 | 
			
		||||
	if(db->servers) FREELIST(db->servers);
 | 
			
		||||
	db->servers = servers;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
static char *sanitize_url(const char *url)
 | 
			
		||||
{
 | 
			
		||||
	char *newurl;
 | 
			
		||||
	size_t len = strlen(url);
 | 
			
		||||
 | 
			
		||||
	STRDUP(newurl, url, return NULL);
 | 
			
		||||
	/* strip the trailing slash if one exists */
 | 
			
		||||
	if(newurl[len - 1] == '/') {
 | 
			
		||||
		newurl[len - 1] = '\0';
 | 
			
		||||
	}
 | 
			
		||||
	return newurl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Add a download server to a database.
 | 
			
		||||
 * @param db database pointer
 | 
			
		||||
 * @param url url of the server
 | 
			
		||||
 * @return 0 on success, -1 on error (pm_errno is set accordingly)
 | 
			
		||||
 */
 | 
			
		||||
int SYMEXPORT alpm_db_add_server(alpm_db_t *db, const char *url)
 | 
			
		||||
{
 | 
			
		||||
	char *newurl;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
 | 
			
		||||
	ASSERT(db != NULL, return -1);
 | 
			
		||||
	db->handle->pm_errno = 0;
 | 
			
		||||
	ASSERT(url != NULL && strlen(url) != 0, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
 | 
			
		||||
	for(i = handle->dbs_sync; i && !found; i = i->next) {
 | 
			
		||||
		pmdb_t *sdb = i->data;
 | 
			
		||||
		if(strcmp(db->treename, sdb->treename) == 0) {
 | 
			
		||||
			found = 1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if(!found) {
 | 
			
		||||
		RET_ERR(PM_ERR_DB_NOT_FOUND, -1);
 | 
			
		||||
	newurl = sanitize_url(url);
 | 
			
		||||
	if(!newurl) {
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	db->servers = alpm_list_add(db->servers, newurl);
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_DEBUG, "adding new server URL to database '%s': %s\n",
 | 
			
		||||
			db->treename, newurl);
 | 
			
		||||
 | 
			
		||||
	if(url) {
 | 
			
		||||
		len = strlen(url);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Remove a download server from a database.
 | 
			
		||||
 * @param db database pointer
 | 
			
		||||
 * @param url url of the server
 | 
			
		||||
 * @return 0 on success, 1 on server not present,
 | 
			
		||||
 * -1 on error (pm_errno is set accordingly)
 | 
			
		||||
 */
 | 
			
		||||
int SYMEXPORT alpm_db_remove_server(alpm_db_t *db, const char *url)
 | 
			
		||||
{
 | 
			
		||||
	char *newurl, *vdata = NULL;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(db != NULL, return -1);
 | 
			
		||||
	db->handle->pm_errno = 0;
 | 
			
		||||
	ASSERT(url != NULL && strlen(url) != 0, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
 | 
			
		||||
	newurl = sanitize_url(url);
 | 
			
		||||
	if(!newurl) {
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	if(len) {
 | 
			
		||||
		newurl = strdup(url);
 | 
			
		||||
		/* strip the trailing slash if one exists */
 | 
			
		||||
		if(newurl[len - 1] == '/') {
 | 
			
		||||
			newurl[len - 1] = '\0';
 | 
			
		||||
		}
 | 
			
		||||
		db->servers = alpm_list_add(db->servers, newurl);
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "adding new server URL to database '%s': %s\n",
 | 
			
		||||
	db->servers = alpm_list_remove_str(db->servers, newurl, &vdata);
 | 
			
		||||
	free(newurl);
 | 
			
		||||
	if(vdata) {
 | 
			
		||||
		_alpm_log(db->handle, ALPM_LOG_DEBUG, "removed server URL from database '%s': %s\n",
 | 
			
		||||
				db->treename, newurl);
 | 
			
		||||
	} else {
 | 
			
		||||
		FREELIST(db->servers);
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "serverlist flushed for '%s'\n", db->treename);
 | 
			
		||||
		free(vdata);
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Get the name of a package database. */
 | 
			
		||||
const char SYMEXPORT *alpm_db_get_name(const pmdb_t *db)
 | 
			
		||||
const char SYMEXPORT *alpm_db_get_name(const alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(NULL));
 | 
			
		||||
	ASSERT(db != NULL, return(NULL));
 | 
			
		||||
 | 
			
		||||
	ASSERT(db != NULL, return NULL);
 | 
			
		||||
	return db->treename;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Get a download URL for the package database. */
 | 
			
		||||
const char SYMEXPORT *alpm_db_get_url(const pmdb_t *db)
 | 
			
		||||
/** Get the signature verification level for a database. */
 | 
			
		||||
alpm_siglevel_t SYMEXPORT alpm_db_get_siglevel(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	char *url;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(NULL));
 | 
			
		||||
	ASSERT(db != NULL, return(NULL));
 | 
			
		||||
	ASSERT(db->servers != NULL, return(NULL));
 | 
			
		||||
 | 
			
		||||
	url = (char*)db->servers->data;
 | 
			
		||||
 | 
			
		||||
	return(url);
 | 
			
		||||
	ASSERT(db != NULL, return -1);
 | 
			
		||||
	if(db->siglevel & ALPM_SIG_USE_DEFAULT) {
 | 
			
		||||
		return db->handle->siglevel;
 | 
			
		||||
	} else {
 | 
			
		||||
		return db->siglevel;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Check the validity of a database. */
 | 
			
		||||
int SYMEXPORT alpm_db_get_valid(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(db != NULL, return -1);
 | 
			
		||||
	db->handle->pm_errno = 0;
 | 
			
		||||
	return db->ops->validate(db);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Get a package entry from a package database. */
 | 
			
		||||
pmpkg_t SYMEXPORT *alpm_db_get_pkg(pmdb_t *db, const char *name)
 | 
			
		||||
alpm_pkg_t SYMEXPORT *alpm_db_get_pkg(alpm_db_t *db, const char *name)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	alpm_pkg_t *pkg;
 | 
			
		||||
	ASSERT(db != NULL, return NULL);
 | 
			
		||||
	db->handle->pm_errno = 0;
 | 
			
		||||
	ASSERT(name != NULL && strlen(name) != 0,
 | 
			
		||||
			RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, NULL));
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(NULL));
 | 
			
		||||
	ASSERT(db != NULL, return(NULL));
 | 
			
		||||
	ASSERT(name != NULL && strlen(name) != 0, return(NULL));
 | 
			
		||||
 | 
			
		||||
	return(_alpm_db_get_pkgfromcache(db, name));
 | 
			
		||||
	pkg = _alpm_db_get_pkgfromcache(db, name);
 | 
			
		||||
	if(!pkg) {
 | 
			
		||||
		RET_ERR(db->handle, ALPM_ERR_PKG_NOT_FOUND, NULL);
 | 
			
		||||
	}
 | 
			
		||||
	return pkg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Get the package cache of a package database. */
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_db_get_pkgcache(pmdb_t *db)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_db_get_pkgcache(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(NULL));
 | 
			
		||||
	ASSERT(db != NULL, return(NULL));
 | 
			
		||||
 | 
			
		||||
	return(_alpm_db_get_pkgcache(db));
 | 
			
		||||
	ASSERT(db != NULL, return NULL);
 | 
			
		||||
	db->handle->pm_errno = 0;
 | 
			
		||||
	return _alpm_db_get_pkgcache(db);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Get a group entry from a package database. */
 | 
			
		||||
pmgrp_t SYMEXPORT *alpm_db_readgrp(pmdb_t *db, const char *name)
 | 
			
		||||
alpm_group_t SYMEXPORT *alpm_db_readgroup(alpm_db_t *db, const char *name)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	ASSERT(db != NULL, return NULL);
 | 
			
		||||
	db->handle->pm_errno = 0;
 | 
			
		||||
	ASSERT(name != NULL && strlen(name) != 0,
 | 
			
		||||
			RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, NULL));
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(NULL));
 | 
			
		||||
	ASSERT(db != NULL, return(NULL));
 | 
			
		||||
	ASSERT(name != NULL && strlen(name) != 0, return(NULL));
 | 
			
		||||
 | 
			
		||||
	return(_alpm_db_get_grpfromcache(db, name));
 | 
			
		||||
	return _alpm_db_get_groupfromcache(db, name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Get the group cache of a package database. */
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_db_get_grpcache(pmdb_t *db)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_db_get_groupcache(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	ASSERT(db != NULL, return NULL);
 | 
			
		||||
	db->handle->pm_errno = 0;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(NULL));
 | 
			
		||||
	ASSERT(db != NULL, return(NULL));
 | 
			
		||||
 | 
			
		||||
	return(_alpm_db_get_grpcache(db));
 | 
			
		||||
	return _alpm_db_get_groupcache(db);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Searches a database. */
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_db_search(pmdb_t *db, const alpm_list_t* needles)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_db_search(alpm_db_t *db, const alpm_list_t* needles)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	ASSERT(db != NULL, return NULL);
 | 
			
		||||
	db->handle->pm_errno = 0;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, return(NULL));
 | 
			
		||||
	ASSERT(db != NULL, return(NULL));
 | 
			
		||||
 | 
			
		||||
	return(_alpm_db_search(db, needles));
 | 
			
		||||
	return _alpm_db_search(db, needles);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Set install reason for a package in db. */
 | 
			
		||||
int SYMEXPORT alpm_db_set_pkgreason(pmdb_t *db, const char *name, pmpkgreason_t reason)
 | 
			
		||||
int SYMEXPORT alpm_db_set_pkgreason(alpm_handle_t *handle, alpm_pkg_t *pkg,
 | 
			
		||||
		alpm_pkgreason_t reason)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	ASSERT(pkg != NULL, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
	ASSERT(pkg->origin == PKG_FROM_LOCALDB,
 | 
			
		||||
			RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
	ASSERT(pkg->origin_data.db == handle->db_local,
 | 
			
		||||
			RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	ASSERT(db != NULL && name != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
 | 
			
		||||
	pmpkg_t *pkg = _alpm_db_get_pkgfromcache(db, name);
 | 
			
		||||
	if(pkg == NULL) {
 | 
			
		||||
		RET_ERR(PM_ERR_PKG_NOT_FOUND, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "setting install reason %u for %s/%s\n", reason, db->treename, name);
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG,
 | 
			
		||||
			"setting install reason %u for %s\n", reason, pkg->name);
 | 
			
		||||
	if(alpm_pkg_get_reason(pkg) == reason) {
 | 
			
		||||
		/* we are done */
 | 
			
		||||
		return(0);
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	/* set reason (in pkgcache) */
 | 
			
		||||
	pkg->reason = reason;
 | 
			
		||||
	/* write DESC */
 | 
			
		||||
	if(_alpm_local_db_write(db, pkg, INFRQ_DESC)) {
 | 
			
		||||
		RET_ERR(PM_ERR_DB_WRITE, -1);
 | 
			
		||||
	if(_alpm_local_db_write(handle->db_local, pkg, INFRQ_DESC)) {
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_DB_WRITE, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
pmdb_t *_alpm_db_new(const char *treename, int is_local)
 | 
			
		||||
alpm_db_t *_alpm_db_new(const char *treename, int is_local)
 | 
			
		||||
{
 | 
			
		||||
	pmdb_t *db;
 | 
			
		||||
	alpm_db_t *db;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	CALLOC(db, 1, sizeof(alpm_db_t), return NULL);
 | 
			
		||||
	STRDUP(db->treename, treename, return NULL);
 | 
			
		||||
	if(is_local) {
 | 
			
		||||
		db->status |= DB_STATUS_LOCAL;
 | 
			
		||||
	} else {
 | 
			
		||||
		db->status &= ~DB_STATUS_LOCAL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	CALLOC(db, 1, sizeof(pmdb_t), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	STRDUP(db->treename, treename, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	db->is_local = is_local;
 | 
			
		||||
 | 
			
		||||
	return(db);
 | 
			
		||||
	return db;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_db_free(pmdb_t *db)
 | 
			
		||||
void _alpm_db_free(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* cleanup pkgcache */
 | 
			
		||||
	_alpm_db_free_pkgcache(db);
 | 
			
		||||
	/* cleanup server list */
 | 
			
		||||
@@ -326,61 +348,51 @@ void _alpm_db_free(pmdb_t *db)
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char *_alpm_db_path(pmdb_t *db)
 | 
			
		||||
const char *_alpm_db_path(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	if(!db) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	if(!db->_path) {
 | 
			
		||||
		const char *dbpath;
 | 
			
		||||
		size_t pathsize;
 | 
			
		||||
 | 
			
		||||
		dbpath = alpm_option_get_dbpath();
 | 
			
		||||
		dbpath = db->handle->dbpath;
 | 
			
		||||
		if(!dbpath) {
 | 
			
		||||
			_alpm_log(PM_LOG_ERROR, _("database path is undefined\n"));
 | 
			
		||||
			RET_ERR(PM_ERR_DB_OPEN, NULL);
 | 
			
		||||
			_alpm_log(db->handle, ALPM_LOG_ERROR, _("database path is undefined\n"));
 | 
			
		||||
			RET_ERR(db->handle, ALPM_ERR_DB_OPEN, NULL);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(db->is_local) {
 | 
			
		||||
		if(db->status & DB_STATUS_LOCAL) {
 | 
			
		||||
			pathsize = strlen(dbpath) + strlen(db->treename) + 2;
 | 
			
		||||
			CALLOC(db->_path, 1, pathsize, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
			CALLOC(db->_path, 1, pathsize, RET_ERR(db->handle, ALPM_ERR_MEMORY, NULL));
 | 
			
		||||
			sprintf(db->_path, "%s%s/", dbpath, db->treename);
 | 
			
		||||
		} else {
 | 
			
		||||
			pathsize = strlen(dbpath) + 5 + strlen(db->treename) + 4;
 | 
			
		||||
			CALLOC(db->_path, 1, pathsize, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
			CALLOC(db->_path, 1, pathsize, RET_ERR(db->handle, ALPM_ERR_MEMORY, NULL));
 | 
			
		||||
			/* all sync DBs now reside in the sync/ subdir of the dbpath */
 | 
			
		||||
			sprintf(db->_path, "%ssync/%s.db", dbpath, db->treename);
 | 
			
		||||
		}
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "database path for tree %s set to %s\n",
 | 
			
		||||
		_alpm_log(db->handle, ALPM_LOG_DEBUG, "database path for tree %s set to %s\n",
 | 
			
		||||
				db->treename, db->_path);
 | 
			
		||||
	}
 | 
			
		||||
	return(db->_path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int _alpm_db_version(pmdb_t *db)
 | 
			
		||||
{
 | 
			
		||||
	if(!db) {
 | 
			
		||||
		return(-1);
 | 
			
		||||
	}
 | 
			
		||||
	return(db->ops->version(db));
 | 
			
		||||
	return db->_path;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int _alpm_db_cmp(const void *d1, const void *d2)
 | 
			
		||||
{
 | 
			
		||||
	pmdb_t *db1 = (pmdb_t *)d1;
 | 
			
		||||
	pmdb_t *db2 = (pmdb_t *)d2;
 | 
			
		||||
	return(strcmp(db1->treename, db2->treename));
 | 
			
		||||
	const alpm_db_t *db1 = d1;
 | 
			
		||||
	const alpm_db_t *db2 = d2;
 | 
			
		||||
	return strcmp(db1->treename, db2->treename);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles)
 | 
			
		||||
alpm_list_t *_alpm_db_search(alpm_db_t *db, const alpm_list_t *needles)
 | 
			
		||||
{
 | 
			
		||||
	const alpm_list_t *i, *j, *k;
 | 
			
		||||
	alpm_list_t *ret = NULL;
 | 
			
		||||
	/* copy the pkgcache- we will free the list var after each needle */
 | 
			
		||||
	alpm_list_t *list = alpm_list_copy(_alpm_db_get_pkgcache(db));
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	for(i = needles; i; i = i->next) {
 | 
			
		||||
		char *targ;
 | 
			
		||||
		regex_t reg;
 | 
			
		||||
@@ -390,16 +402,16 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles)
 | 
			
		||||
		}
 | 
			
		||||
		ret = NULL;
 | 
			
		||||
		targ = i->data;
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "searching for target '%s'\n", targ);
 | 
			
		||||
		_alpm_log(db->handle, ALPM_LOG_DEBUG, "searching for target '%s'\n", targ);
 | 
			
		||||
 | 
			
		||||
		if(regcomp(®, targ, REG_EXTENDED | REG_NOSUB | REG_ICASE | REG_NEWLINE) != 0) {
 | 
			
		||||
			RET_ERR(PM_ERR_INVALID_REGEX, NULL);
 | 
			
		||||
			RET_ERR(db->handle, ALPM_ERR_INVALID_REGEX, NULL);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for(j = list; j; j = j->next) {
 | 
			
		||||
			pmpkg_t *pkg = j->data;
 | 
			
		||||
			alpm_pkg_t *pkg = j->data;
 | 
			
		||||
			const char *matched = NULL;
 | 
			
		||||
			const char *name = alpm_pkg_get_name(pkg);
 | 
			
		||||
			const char *name = pkg->name;
 | 
			
		||||
			const char *desc = alpm_pkg_get_desc(pkg);
 | 
			
		||||
 | 
			
		||||
			/* check name as regex AND as plain text */
 | 
			
		||||
@@ -407,7 +419,7 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles)
 | 
			
		||||
				matched = name;
 | 
			
		||||
			}
 | 
			
		||||
			/* check desc */
 | 
			
		||||
			else if (desc && regexec(®, desc, 0, 0, 0) == 0) {
 | 
			
		||||
			else if(desc && regexec(®, desc, 0, 0, 0) == 0) {
 | 
			
		||||
				matched = desc;
 | 
			
		||||
			}
 | 
			
		||||
			/* TODO: should we be doing this, and should we print something
 | 
			
		||||
@@ -415,7 +427,8 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles)
 | 
			
		||||
			if(!matched) {
 | 
			
		||||
				/* check provides */
 | 
			
		||||
				for(k = alpm_pkg_get_provides(pkg); k; k = k->next) {
 | 
			
		||||
					if (regexec(®, k->data, 0, 0, 0) == 0) {
 | 
			
		||||
					alpm_depend_t *provide = k->data;
 | 
			
		||||
					if(regexec(®, provide->name, 0, 0, 0) == 0) {
 | 
			
		||||
						matched = k->data;
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
@@ -424,7 +437,7 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles)
 | 
			
		||||
			if(!matched) {
 | 
			
		||||
				/* check groups */
 | 
			
		||||
				for(k = alpm_pkg_get_groups(pkg); k; k = k->next) {
 | 
			
		||||
					if (regexec(®, k->data, 0, 0, 0) == 0) {
 | 
			
		||||
					if(regexec(®, k->data, 0, 0, 0) == 0) {
 | 
			
		||||
						matched = k->data;
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
@@ -432,7 +445,7 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if(matched != NULL) {
 | 
			
		||||
				_alpm_log(PM_LOG_DEBUG, "    search target '%s' matched '%s'\n",
 | 
			
		||||
				_alpm_log(db->handle, ALPM_LOG_DEBUG, "    search target '%s' matched '%s'\n",
 | 
			
		||||
				          targ, matched);
 | 
			
		||||
				ret = alpm_list_add(ret, pkg);
 | 
			
		||||
			}
 | 
			
		||||
@@ -445,179 +458,177 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles)
 | 
			
		||||
		regfree(®);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(ret);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Returns a new package cache from db.
 | 
			
		||||
 * It frees the cache if it already exists.
 | 
			
		||||
 */
 | 
			
		||||
int _alpm_db_load_pkgcache(pmdb_t *db)
 | 
			
		||||
static int load_pkgcache(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(db == NULL) {
 | 
			
		||||
		return(-1);
 | 
			
		||||
	}
 | 
			
		||||
	_alpm_db_free_pkgcache(db);
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "loading package cache for repository '%s'\n",
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_DEBUG, "loading package cache for repository '%s'\n",
 | 
			
		||||
			db->treename);
 | 
			
		||||
	if(db->ops->populate(db) == -1) {
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG,
 | 
			
		||||
		_alpm_log(db->handle, ALPM_LOG_DEBUG,
 | 
			
		||||
				"failed to load package cache for repository '%s'\n", db->treename);
 | 
			
		||||
		return(-1);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	db->pkgcache_loaded = 1;
 | 
			
		||||
	return(0);
 | 
			
		||||
	db->status |= DB_STATUS_PKGCACHE;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_db_free_pkgcache(pmdb_t *db)
 | 
			
		||||
static void free_groupcache(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	alpm_list_t *lg;
 | 
			
		||||
 | 
			
		||||
	if(db == NULL || !db->pkgcache_loaded) {
 | 
			
		||||
	if(db == NULL || !(db->status & DB_STATUS_GRPCACHE)) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "freeing package cache for repository '%s'\n",
 | 
			
		||||
	                        db->treename);
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_DEBUG,
 | 
			
		||||
			"freeing group cache for repository '%s'\n", db->treename);
 | 
			
		||||
 | 
			
		||||
	alpm_list_free_inner(_alpm_db_get_pkgcache(db),
 | 
			
		||||
	for(lg = db->grpcache; lg; lg = lg->next) {
 | 
			
		||||
		_alpm_group_free(lg->data);
 | 
			
		||||
		lg->data = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	FREELIST(db->grpcache);
 | 
			
		||||
	db->status &= ~DB_STATUS_GRPCACHE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_db_free_pkgcache(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	if(db == NULL || !(db->status & DB_STATUS_PKGCACHE)) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_DEBUG,
 | 
			
		||||
			"freeing package cache for repository '%s'\n", db->treename);
 | 
			
		||||
 | 
			
		||||
	if(db->pkgcache) {
 | 
			
		||||
		alpm_list_free_inner(db->pkgcache->list,
 | 
			
		||||
				(alpm_list_fn_free)_alpm_pkg_free);
 | 
			
		||||
	_alpm_pkghash_free(db->pkgcache);
 | 
			
		||||
	db->pkgcache_loaded = 0;
 | 
			
		||||
		_alpm_pkghash_free(db->pkgcache);
 | 
			
		||||
	}
 | 
			
		||||
	db->status &= ~DB_STATUS_PKGCACHE;
 | 
			
		||||
 | 
			
		||||
	_alpm_db_free_grpcache(db);
 | 
			
		||||
	free_groupcache(db);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pmpkghash_t *_alpm_db_get_pkgcache_hash(pmdb_t *db)
 | 
			
		||||
alpm_pkghash_t *_alpm_db_get_pkgcache_hash(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(db == NULL) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(!db->pkgcache_loaded) {
 | 
			
		||||
		_alpm_db_load_pkgcache(db);
 | 
			
		||||
	if(!(db->status & DB_STATUS_VALID)) {
 | 
			
		||||
		RET_ERR(db->handle, ALPM_ERR_DB_INVALID, NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* hmmm, still NULL ?*/
 | 
			
		||||
	if(!db->pkgcache) {
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "warning: pkgcache is NULL for db '%s'\n", db->treename);
 | 
			
		||||
	if(!(db->status & DB_STATUS_PKGCACHE)) {
 | 
			
		||||
		load_pkgcache(db);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(db->pkgcache);
 | 
			
		||||
	return db->pkgcache;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t *_alpm_db_get_pkgcache(pmdb_t *db)
 | 
			
		||||
alpm_list_t *_alpm_db_get_pkgcache(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	pmpkghash_t *hash = _alpm_db_get_pkgcache_hash(db);
 | 
			
		||||
	alpm_pkghash_t *hash = _alpm_db_get_pkgcache_hash(db);
 | 
			
		||||
 | 
			
		||||
	if(hash == NULL) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(hash->list);
 | 
			
		||||
	return hash->list;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* "duplicate" pkg then add it to pkgcache */
 | 
			
		||||
int _alpm_db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg)
 | 
			
		||||
int _alpm_db_add_pkgincache(alpm_db_t *db, alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	pmpkg_t *newpkg;
 | 
			
		||||
	alpm_pkg_t *newpkg;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(db == NULL || !db->pkgcache_loaded || pkg == NULL) {
 | 
			
		||||
		return(-1);
 | 
			
		||||
	if(db == NULL || pkg == NULL || !(db->status & DB_STATUS_PKGCACHE)) {
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newpkg = _alpm_pkg_dup(pkg);
 | 
			
		||||
	if(newpkg == NULL) {
 | 
			
		||||
		return(-1);
 | 
			
		||||
	if(_alpm_pkg_dup(pkg, &newpkg)) {
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "adding entry '%s' in '%s' cache\n",
 | 
			
		||||
						alpm_pkg_get_name(newpkg), db->treename);
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_DEBUG, "adding entry '%s' in '%s' cache\n",
 | 
			
		||||
						newpkg->name, db->treename);
 | 
			
		||||
	db->pkgcache = _alpm_pkghash_add_sorted(db->pkgcache, newpkg);
 | 
			
		||||
 | 
			
		||||
	_alpm_db_free_grpcache(db);
 | 
			
		||||
	free_groupcache(db);
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int _alpm_db_remove_pkgfromcache(pmdb_t *db, pmpkg_t *pkg)
 | 
			
		||||
int _alpm_db_remove_pkgfromcache(alpm_db_t *db, alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	pmpkg_t *data = NULL;
 | 
			
		||||
	alpm_pkg_t *data = NULL;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(db == NULL || !db->pkgcache_loaded || pkg == NULL) {
 | 
			
		||||
		return(-1);
 | 
			
		||||
	if(db == NULL || pkg == NULL || !(db->status & DB_STATUS_PKGCACHE)) {
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "removing entry '%s' from '%s' cache\n",
 | 
			
		||||
						alpm_pkg_get_name(pkg), db->treename);
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_DEBUG, "removing entry '%s' from '%s' cache\n",
 | 
			
		||||
						pkg->name, db->treename);
 | 
			
		||||
 | 
			
		||||
	db->pkgcache = _alpm_pkghash_remove(db->pkgcache, pkg, &data);
 | 
			
		||||
	if(data == NULL) {
 | 
			
		||||
		/* package not found */
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "cannot remove entry '%s' from '%s' cache: not found\n",
 | 
			
		||||
							alpm_pkg_get_name(pkg), db->treename);
 | 
			
		||||
		return(-1);
 | 
			
		||||
		_alpm_log(db->handle, ALPM_LOG_DEBUG, "cannot remove entry '%s' from '%s' cache: not found\n",
 | 
			
		||||
							pkg->name, db->treename);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_pkg_free(data);
 | 
			
		||||
 | 
			
		||||
	_alpm_db_free_grpcache(db);
 | 
			
		||||
	free_groupcache(db);
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pmpkg_t *_alpm_db_get_pkgfromcache(pmdb_t *db, const char *target)
 | 
			
		||||
alpm_pkg_t *_alpm_db_get_pkgfromcache(alpm_db_t *db, const char *target)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(db == NULL) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pmpkghash_t *pkgcache = _alpm_db_get_pkgcache_hash(db);
 | 
			
		||||
	alpm_pkghash_t *pkgcache = _alpm_db_get_pkgcache_hash(db);
 | 
			
		||||
	if(!pkgcache) {
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "warning: failed to get '%s' from NULL pkgcache\n",
 | 
			
		||||
				target);
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(_alpm_pkghash_find(pkgcache, target));
 | 
			
		||||
	return _alpm_pkghash_find(pkgcache, target);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Returns a new group cache from db.
 | 
			
		||||
 */
 | 
			
		||||
int _alpm_db_load_grpcache(pmdb_t *db)
 | 
			
		||||
static int load_grpcache(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *lp;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(db == NULL) {
 | 
			
		||||
		return(-1);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "loading group cache for repository '%s'\n",
 | 
			
		||||
	_alpm_log(db->handle, ALPM_LOG_DEBUG, "loading group cache for repository '%s'\n",
 | 
			
		||||
			db->treename);
 | 
			
		||||
 | 
			
		||||
	for(lp = _alpm_db_get_pkgcache(db); lp; lp = lp->next) {
 | 
			
		||||
		const alpm_list_t *i;
 | 
			
		||||
		pmpkg_t *pkg = lp->data;
 | 
			
		||||
		alpm_pkg_t *pkg = lp->data;
 | 
			
		||||
 | 
			
		||||
		for(i = alpm_pkg_get_groups(pkg); i; i = i->next) {
 | 
			
		||||
			const char *grpname = i->data;
 | 
			
		||||
			alpm_list_t *j;
 | 
			
		||||
			pmgrp_t *grp = NULL;
 | 
			
		||||
			alpm_group_t *grp = NULL;
 | 
			
		||||
			int found = 0;
 | 
			
		||||
 | 
			
		||||
			/* first look through the group cache for a group with this name */
 | 
			
		||||
@@ -635,71 +646,54 @@ int _alpm_db_load_grpcache(pmdb_t *db)
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			/* we didn't find the group, so create a new one with this name */
 | 
			
		||||
			grp = _alpm_grp_new(grpname);
 | 
			
		||||
			grp = _alpm_group_new(grpname);
 | 
			
		||||
			if(!grp) {
 | 
			
		||||
				free_groupcache(db);
 | 
			
		||||
				return -1;
 | 
			
		||||
			}
 | 
			
		||||
			grp->packages = alpm_list_add(grp->packages, pkg);
 | 
			
		||||
			db->grpcache = alpm_list_add(db->grpcache, grp);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	db->grpcache_loaded = 1;
 | 
			
		||||
	return(0);
 | 
			
		||||
	db->status |= DB_STATUS_GRPCACHE;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_db_free_grpcache(pmdb_t *db)
 | 
			
		||||
alpm_list_t *_alpm_db_get_groupcache(alpm_db_t *db)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *lg;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(db == NULL || !db->grpcache_loaded) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "freeing group cache for repository '%s'\n",
 | 
			
		||||
	                        db->treename);
 | 
			
		||||
 | 
			
		||||
	for(lg = db->grpcache; lg; lg = lg->next) {
 | 
			
		||||
		_alpm_grp_free(lg->data);
 | 
			
		||||
		lg->data = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	FREELIST(db->grpcache);
 | 
			
		||||
	db->grpcache_loaded = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t *_alpm_db_get_grpcache(pmdb_t *db)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(db == NULL) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(!db->grpcache_loaded) {
 | 
			
		||||
		_alpm_db_load_grpcache(db);
 | 
			
		||||
	if(!(db->status & DB_STATUS_VALID)) {
 | 
			
		||||
		RET_ERR(db->handle, ALPM_ERR_DB_INVALID, NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(db->grpcache);
 | 
			
		||||
	if(!(db->status & DB_STATUS_GRPCACHE)) {
 | 
			
		||||
		load_grpcache(db);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return db->grpcache;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pmgrp_t *_alpm_db_get_grpfromcache(pmdb_t *db, const char *target)
 | 
			
		||||
alpm_group_t *_alpm_db_get_groupfromcache(alpm_db_t *db, const char *target)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(db == NULL || target == NULL || strlen(target) == 0) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for(i = _alpm_db_get_grpcache(db); i; i = i->next) {
 | 
			
		||||
		pmgrp_t *info = i->data;
 | 
			
		||||
	for(i = _alpm_db_get_groupcache(db); i; i = i->next) {
 | 
			
		||||
		alpm_group_t *info = i->data;
 | 
			
		||||
 | 
			
		||||
		if(strcmp(info->name, target) == 0) {
 | 
			
		||||
			return(info);
 | 
			
		||||
			return info;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(NULL);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -22,81 +22,90 @@
 | 
			
		||||
#ifndef _ALPM_DB_H
 | 
			
		||||
#define _ALPM_DB_H
 | 
			
		||||
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
#include "pkghash.h"
 | 
			
		||||
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
/* libarchive */
 | 
			
		||||
#include <archive.h>
 | 
			
		||||
#include <archive_entry.h>
 | 
			
		||||
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
#include "pkghash.h"
 | 
			
		||||
#include "signing.h"
 | 
			
		||||
 | 
			
		||||
/* Database entries */
 | 
			
		||||
typedef enum _pmdbinfrq_t {
 | 
			
		||||
typedef enum _alpm_dbinfrq_t {
 | 
			
		||||
	INFRQ_BASE = 1,
 | 
			
		||||
	INFRQ_DESC = (1 << 1),
 | 
			
		||||
	INFRQ_FILES = (1 << 2),
 | 
			
		||||
	INFRQ_SCRIPTLET = (1 << 3),
 | 
			
		||||
	INFRQ_DSIZE = (1 << 4),
 | 
			
		||||
	/* ALL should be info stored in the package or database */
 | 
			
		||||
	INFRQ_ALL = 0x1F
 | 
			
		||||
} pmdbinfrq_t;
 | 
			
		||||
	INFRQ_ALL = 0x1F,
 | 
			
		||||
	INFRQ_ERROR = (1 << 31)
 | 
			
		||||
} alpm_dbinfrq_t;
 | 
			
		||||
 | 
			
		||||
/** Database status. Bitflags. */
 | 
			
		||||
enum _alpm_dbstatus_t {
 | 
			
		||||
	DB_STATUS_VALID = (1 << 0),
 | 
			
		||||
	DB_STATUS_INVALID = (1 << 1),
 | 
			
		||||
	DB_STATUS_EXISTS = (1 << 2),
 | 
			
		||||
	DB_STATUS_MISSING = (1 << 3),
 | 
			
		||||
 | 
			
		||||
	DB_STATUS_LOCAL = (1 << 10),
 | 
			
		||||
	DB_STATUS_PKGCACHE = (1 << 11),
 | 
			
		||||
	DB_STATUS_GRPCACHE = (1 << 12)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct db_operations {
 | 
			
		||||
	int (*populate) (pmdb_t *);
 | 
			
		||||
	void (*unregister) (pmdb_t *);
 | 
			
		||||
	int (*version) (pmdb_t *);
 | 
			
		||||
	int (*validate) (alpm_db_t *);
 | 
			
		||||
	int (*populate) (alpm_db_t *);
 | 
			
		||||
	void (*unregister) (alpm_db_t *);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Database */
 | 
			
		||||
struct __pmdb_t {
 | 
			
		||||
struct __alpm_db_t {
 | 
			
		||||
	alpm_handle_t *handle;
 | 
			
		||||
	char *treename;
 | 
			
		||||
	/* do not access directly, use _alpm_db_path(db) for lazy access */
 | 
			
		||||
	char *_path;
 | 
			
		||||
	int pkgcache_loaded;
 | 
			
		||||
	int grpcache_loaded;
 | 
			
		||||
	/* also indicates whether we are RO or RW */
 | 
			
		||||
	int is_local;
 | 
			
		||||
	pmpkghash_t *pkgcache;
 | 
			
		||||
	alpm_pkghash_t *pkgcache;
 | 
			
		||||
	alpm_list_t *grpcache;
 | 
			
		||||
	alpm_list_t *servers;
 | 
			
		||||
 | 
			
		||||
	struct db_operations *ops;
 | 
			
		||||
	/* flags determining validity, local, loaded caches, etc. */
 | 
			
		||||
	enum _alpm_dbstatus_t status;
 | 
			
		||||
	alpm_siglevel_t siglevel;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* db.c, database general calls */
 | 
			
		||||
pmdb_t *_alpm_db_new(const char *treename, int is_local);
 | 
			
		||||
void _alpm_db_free(pmdb_t *db);
 | 
			
		||||
const char *_alpm_db_path(pmdb_t *db);
 | 
			
		||||
int _alpm_db_version(pmdb_t *db);
 | 
			
		||||
alpm_db_t *_alpm_db_new(const char *treename, int is_local);
 | 
			
		||||
void _alpm_db_free(alpm_db_t *db);
 | 
			
		||||
const char *_alpm_db_path(alpm_db_t *db);
 | 
			
		||||
int _alpm_db_cmp(const void *d1, const void *d2);
 | 
			
		||||
alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles);
 | 
			
		||||
pmdb_t *_alpm_db_register_local(void);
 | 
			
		||||
pmdb_t *_alpm_db_register_sync(const char *treename);
 | 
			
		||||
void _alpm_db_unregister(pmdb_t *db);
 | 
			
		||||
alpm_list_t *_alpm_db_search(alpm_db_t *db, const alpm_list_t *needles);
 | 
			
		||||
alpm_db_t *_alpm_db_register_local(alpm_handle_t *handle);
 | 
			
		||||
alpm_db_t *_alpm_db_register_sync(alpm_handle_t *handle, const char *treename,
 | 
			
		||||
		alpm_siglevel_t level);
 | 
			
		||||
void _alpm_db_unregister(alpm_db_t *db);
 | 
			
		||||
 | 
			
		||||
/* be_*.c, backend specific calls */
 | 
			
		||||
int _alpm_local_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq);
 | 
			
		||||
int _alpm_local_db_prepare(pmdb_t *db, pmpkg_t *info);
 | 
			
		||||
int _alpm_local_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq);
 | 
			
		||||
int _alpm_local_db_remove(pmdb_t *db, pmpkg_t *info);
 | 
			
		||||
int _alpm_local_db_prepare(alpm_db_t *db, alpm_pkg_t *info);
 | 
			
		||||
int _alpm_local_db_write(alpm_db_t *db, alpm_pkg_t *info, alpm_dbinfrq_t inforeq);
 | 
			
		||||
int _alpm_local_db_remove(alpm_db_t *db, alpm_pkg_t *info);
 | 
			
		||||
char *_alpm_local_db_pkgpath(alpm_db_t *db, alpm_pkg_t *info, const char *filename);
 | 
			
		||||
 | 
			
		||||
/* cache bullshit */
 | 
			
		||||
/* packages */
 | 
			
		||||
int _alpm_db_load_pkgcache(pmdb_t *db);
 | 
			
		||||
void _alpm_db_free_pkgcache(pmdb_t *db);
 | 
			
		||||
int _alpm_db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg);
 | 
			
		||||
int _alpm_db_remove_pkgfromcache(pmdb_t *db, pmpkg_t *pkg);
 | 
			
		||||
pmpkghash_t *_alpm_db_get_pkgcache_hash(pmdb_t *db);
 | 
			
		||||
alpm_list_t *_alpm_db_get_pkgcache(pmdb_t *db);
 | 
			
		||||
int _alpm_db_ensure_pkgcache(pmdb_t *db, pmdbinfrq_t infolevel);
 | 
			
		||||
pmpkg_t *_alpm_db_get_pkgfromcache(pmdb_t *db, const char *target);
 | 
			
		||||
void _alpm_db_free_pkgcache(alpm_db_t *db);
 | 
			
		||||
int _alpm_db_add_pkgincache(alpm_db_t *db, alpm_pkg_t *pkg);
 | 
			
		||||
int _alpm_db_remove_pkgfromcache(alpm_db_t *db, alpm_pkg_t *pkg);
 | 
			
		||||
alpm_pkghash_t *_alpm_db_get_pkgcache_hash(alpm_db_t *db);
 | 
			
		||||
alpm_list_t *_alpm_db_get_pkgcache(alpm_db_t *db);
 | 
			
		||||
alpm_pkg_t *_alpm_db_get_pkgfromcache(alpm_db_t *db, const char *target);
 | 
			
		||||
/* groups */
 | 
			
		||||
int _alpm_db_load_grpcache(pmdb_t *db);
 | 
			
		||||
void _alpm_db_free_grpcache(pmdb_t *db);
 | 
			
		||||
alpm_list_t *_alpm_db_get_grpcache(pmdb_t *db);
 | 
			
		||||
pmgrp_t *_alpm_db_get_grpfromcache(pmdb_t *db, const char *target);
 | 
			
		||||
alpm_list_t *_alpm_db_get_groupcache(alpm_db_t *db);
 | 
			
		||||
alpm_group_t *_alpm_db_get_groupfromcache(alpm_db_t *db, const char *target);
 | 
			
		||||
 | 
			
		||||
#endif /* _ALPM_DB_H */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -34,51 +34,18 @@
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "graph.h"
 | 
			
		||||
 | 
			
		||||
/** \addtogroup alpm_deltas Delta Functions
 | 
			
		||||
 * @brief Functions to manipulate libalpm deltas
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_delta_get_from(pmdelta_t *delta)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(delta != NULL, return(NULL));
 | 
			
		||||
	return(delta->from);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_delta_get_to(pmdelta_t *delta)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(delta != NULL, return(NULL));
 | 
			
		||||
	return(delta->to);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_delta_get_filename(pmdelta_t *delta)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(delta != NULL, return(NULL));
 | 
			
		||||
	return(delta->delta);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_delta_get_md5sum(pmdelta_t *delta)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(delta != NULL, return(NULL));
 | 
			
		||||
	return(delta->delta_md5);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
off_t SYMEXPORT alpm_delta_get_size(pmdelta_t *delta)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(delta != NULL, return(-1));
 | 
			
		||||
	return(delta->delta_size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
static alpm_list_t *graph_init(alpm_list_t *deltas, int reverse)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *i, *j;
 | 
			
		||||
	alpm_list_t *vertices = NULL;
 | 
			
		||||
	/* create the vertices */
 | 
			
		||||
	for(i = deltas; i; i = i->next) {
 | 
			
		||||
		pmgraph_t *v = _alpm_graph_new();
 | 
			
		||||
		pmdelta_t *vdelta = i->data;
 | 
			
		||||
		alpm_graph_t *v = _alpm_graph_new();
 | 
			
		||||
		if(!v) {
 | 
			
		||||
			alpm_list_free(vertices);
 | 
			
		||||
			return NULL;
 | 
			
		||||
		}
 | 
			
		||||
		alpm_delta_t *vdelta = i->data;
 | 
			
		||||
		vdelta->download_size = vdelta->delta_size;
 | 
			
		||||
		v->weight = LONG_MAX;
 | 
			
		||||
		v->data = vdelta;
 | 
			
		||||
@@ -87,12 +54,12 @@ static alpm_list_t *graph_init(alpm_list_t *deltas, int reverse)
 | 
			
		||||
 | 
			
		||||
	/* compute the edges */
 | 
			
		||||
	for(i = vertices; i; i = i->next) {
 | 
			
		||||
		pmgraph_t *v_i = i->data;
 | 
			
		||||
		pmdelta_t *d_i = v_i->data;
 | 
			
		||||
		alpm_graph_t *v_i = i->data;
 | 
			
		||||
		alpm_delta_t *d_i = v_i->data;
 | 
			
		||||
		/* loop a second time so we make all possible comparisons */
 | 
			
		||||
		for(j = vertices; j; j = j->next) {
 | 
			
		||||
			pmgraph_t *v_j = j->data;
 | 
			
		||||
			pmdelta_t *d_j = v_j->data;
 | 
			
		||||
			alpm_graph_t *v_j = j->data;
 | 
			
		||||
			alpm_delta_t *d_j = v_j->data;
 | 
			
		||||
			/* We want to create a delta tree like the following:
 | 
			
		||||
			 *          1_to_2
 | 
			
		||||
			 *            |
 | 
			
		||||
@@ -108,29 +75,45 @@ static alpm_list_t *graph_init(alpm_list_t *deltas, int reverse)
 | 
			
		||||
		}
 | 
			
		||||
		v_i->childptr = v_i->children;
 | 
			
		||||
	}
 | 
			
		||||
	return(vertices);
 | 
			
		||||
	return vertices;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void graph_init_size(alpm_list_t *vertices)
 | 
			
		||||
static void graph_init_size(alpm_handle_t *handle, alpm_list_t *vertices)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
 | 
			
		||||
	for(i = vertices; i; i = i->next) {
 | 
			
		||||
		char *fpath, *md5sum;
 | 
			
		||||
		pmgraph_t *v = i->data;
 | 
			
		||||
		pmdelta_t *vdelta = v->data;
 | 
			
		||||
		alpm_graph_t *v = i->data;
 | 
			
		||||
		alpm_delta_t *vdelta = v->data;
 | 
			
		||||
 | 
			
		||||
		/* determine whether the delta file already exists */
 | 
			
		||||
		fpath = _alpm_filecache_find(vdelta->delta);
 | 
			
		||||
		md5sum = alpm_compute_md5sum(fpath);
 | 
			
		||||
		if(fpath && md5sum && strcmp(md5sum, vdelta->delta_md5) == 0) {
 | 
			
		||||
			vdelta->download_size = 0;
 | 
			
		||||
		fpath = _alpm_filecache_find(handle, vdelta->delta);
 | 
			
		||||
		if(fpath) {
 | 
			
		||||
			md5sum = alpm_compute_md5sum(fpath);
 | 
			
		||||
			if(md5sum && strcmp(md5sum, vdelta->delta_md5) == 0) {
 | 
			
		||||
				vdelta->download_size = 0;
 | 
			
		||||
			}
 | 
			
		||||
			FREE(md5sum);
 | 
			
		||||
			FREE(fpath);
 | 
			
		||||
		} else {
 | 
			
		||||
			char *fnamepart;
 | 
			
		||||
			CALLOC(fnamepart, strlen(vdelta->delta) + 6, sizeof(char), return);
 | 
			
		||||
			sprintf(fnamepart, "%s.part", vdelta->delta);
 | 
			
		||||
			fpath = _alpm_filecache_find(handle, fnamepart);
 | 
			
		||||
			if(fpath) {
 | 
			
		||||
				struct stat st;
 | 
			
		||||
				if(stat(fpath, &st) == 0) {
 | 
			
		||||
					vdelta->download_size = vdelta->delta_size - st.st_size;
 | 
			
		||||
					vdelta->download_size = vdelta->download_size < 0 ? 0 : vdelta->download_size;
 | 
			
		||||
				}
 | 
			
		||||
				FREE(fpath);
 | 
			
		||||
			}
 | 
			
		||||
			FREE(fnamepart);
 | 
			
		||||
		}
 | 
			
		||||
		FREE(fpath);
 | 
			
		||||
		FREE(md5sum);
 | 
			
		||||
 | 
			
		||||
		/* determine whether a base 'from' file exists */
 | 
			
		||||
		fpath = _alpm_filecache_find(vdelta->from);
 | 
			
		||||
		fpath = _alpm_filecache_find(handle, vdelta->from);
 | 
			
		||||
		if(fpath) {
 | 
			
		||||
			v->weight = vdelta->download_size;
 | 
			
		||||
		}
 | 
			
		||||
@@ -142,12 +125,12 @@ static void graph_init_size(alpm_list_t *vertices)
 | 
			
		||||
static void dijkstra(alpm_list_t *vertices)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
	pmgraph_t *v;
 | 
			
		||||
	alpm_graph_t *v;
 | 
			
		||||
	while(1) {
 | 
			
		||||
		v = NULL;
 | 
			
		||||
		/* find the smallest vertice not visited yet */
 | 
			
		||||
		for(i = vertices; i; i = i->next) {
 | 
			
		||||
			pmgraph_t *v_i = i->data;
 | 
			
		||||
			alpm_graph_t *v_i = i->data;
 | 
			
		||||
 | 
			
		||||
			if(v_i->state == -1) {
 | 
			
		||||
				continue;
 | 
			
		||||
@@ -165,8 +148,8 @@ static void dijkstra(alpm_list_t *vertices)
 | 
			
		||||
 | 
			
		||||
		v->childptr = v->children;
 | 
			
		||||
		while(v->childptr) {
 | 
			
		||||
			pmgraph_t *v_c = v->childptr->data;
 | 
			
		||||
			pmdelta_t *d_c = v_c->data;
 | 
			
		||||
			alpm_graph_t *v_c = v->childptr->data;
 | 
			
		||||
			alpm_delta_t *d_c = v_c->data;
 | 
			
		||||
			if(v_c->weight > v->weight + d_c->download_size) {
 | 
			
		||||
				v_c->weight = v->weight + d_c->download_size;
 | 
			
		||||
				v_c->parent = v;
 | 
			
		||||
@@ -181,13 +164,13 @@ static void dijkstra(alpm_list_t *vertices)
 | 
			
		||||
static off_t shortest_path(alpm_list_t *vertices, const char *to, alpm_list_t **path)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
	pmgraph_t *v = NULL;
 | 
			
		||||
	alpm_graph_t *v = NULL;
 | 
			
		||||
	off_t bestsize = 0;
 | 
			
		||||
	alpm_list_t *rpath = NULL;
 | 
			
		||||
 | 
			
		||||
	for(i = vertices; i; i = i->next) {
 | 
			
		||||
		pmgraph_t *v_i = i->data;
 | 
			
		||||
		pmdelta_t *d_i = v_i->data;
 | 
			
		||||
		alpm_graph_t *v_i = i->data;
 | 
			
		||||
		alpm_delta_t *d_i = v_i->data;
 | 
			
		||||
 | 
			
		||||
		if(strcmp(d_i->to, to) == 0) {
 | 
			
		||||
			if(v == NULL || v_i->weight < v->weight) {
 | 
			
		||||
@@ -198,54 +181,53 @@ static off_t shortest_path(alpm_list_t *vertices, const char *to, alpm_list_t **
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while(v != NULL) {
 | 
			
		||||
		pmdelta_t *vdelta = v->data;
 | 
			
		||||
		alpm_delta_t *vdelta = v->data;
 | 
			
		||||
		rpath = alpm_list_add(rpath, vdelta);
 | 
			
		||||
		v = v->parent;
 | 
			
		||||
	}
 | 
			
		||||
	*path = alpm_list_reverse(rpath);
 | 
			
		||||
	alpm_list_free(rpath);
 | 
			
		||||
 | 
			
		||||
	return(bestsize);
 | 
			
		||||
	return bestsize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Calculates the shortest path from one version to another.
 | 
			
		||||
 * The shortest path is defined as the path with the smallest combined
 | 
			
		||||
 * size, not the length of the path.
 | 
			
		||||
 * @param deltas the list of pmdelta_t * objects that a file has
 | 
			
		||||
 * @param handle the context handle
 | 
			
		||||
 * @param deltas the list of alpm_delta_t * objects that a file has
 | 
			
		||||
 * @param to the file to start the search at
 | 
			
		||||
 * @param path the pointer to a list location where pmdelta_t * objects that
 | 
			
		||||
 * @param path the pointer to a list location where alpm_delta_t * objects that
 | 
			
		||||
 * have the smallest size are placed. NULL is set if there is no path
 | 
			
		||||
 * possible with the files available.
 | 
			
		||||
 * @return the size of the path stored, or LONG_MAX if path is unfindable
 | 
			
		||||
 */
 | 
			
		||||
off_t _alpm_shortest_delta_path(alpm_list_t *deltas,
 | 
			
		||||
off_t _alpm_shortest_delta_path(alpm_handle_t *handle, alpm_list_t *deltas,
 | 
			
		||||
		const char *to, alpm_list_t **path)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *bestpath = NULL;
 | 
			
		||||
	alpm_list_t *vertices;
 | 
			
		||||
	off_t bestsize = LONG_MAX;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(deltas == NULL) {
 | 
			
		||||
		*path = NULL;
 | 
			
		||||
		return(bestsize);
 | 
			
		||||
		return bestsize;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "started delta shortest-path search for '%s'\n", to);
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "started delta shortest-path search for '%s'\n", to);
 | 
			
		||||
 | 
			
		||||
	vertices = graph_init(deltas, 0);
 | 
			
		||||
	graph_init_size(vertices);
 | 
			
		||||
	graph_init_size(handle, vertices);
 | 
			
		||||
	dijkstra(vertices);
 | 
			
		||||
	bestsize = shortest_path(vertices, to, &bestpath);
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "delta shortest-path search complete : '%jd'\n", (intmax_t)bestsize);
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "delta shortest-path search complete : '%jd'\n", (intmax_t)bestsize);
 | 
			
		||||
 | 
			
		||||
	alpm_list_free_inner(vertices, _alpm_graph_free);
 | 
			
		||||
	alpm_list_free(vertices);
 | 
			
		||||
 | 
			
		||||
	*path = bestpath;
 | 
			
		||||
	return(bestsize);
 | 
			
		||||
	return bestsize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static alpm_list_t *find_unused(alpm_list_t *deltas, const char *to, off_t quota)
 | 
			
		||||
@@ -256,8 +238,8 @@ static alpm_list_t *find_unused(alpm_list_t *deltas, const char *to, off_t quota
 | 
			
		||||
	vertices = graph_init(deltas, 1);
 | 
			
		||||
 | 
			
		||||
	for(i = vertices; i; i = i->next) {
 | 
			
		||||
		pmgraph_t *v = i->data;
 | 
			
		||||
		pmdelta_t *vdelta = v->data;
 | 
			
		||||
		alpm_graph_t *v = i->data;
 | 
			
		||||
		alpm_delta_t *vdelta = v->data;
 | 
			
		||||
		if(strcmp(vdelta->to, to) == 0)
 | 
			
		||||
		{
 | 
			
		||||
			v->weight = vdelta->download_size;
 | 
			
		||||
@@ -265,39 +247,41 @@ static alpm_list_t *find_unused(alpm_list_t *deltas, const char *to, off_t quota
 | 
			
		||||
	}
 | 
			
		||||
	dijkstra(vertices);
 | 
			
		||||
	for(i = vertices; i; i = i->next) {
 | 
			
		||||
		pmgraph_t *v = i->data;
 | 
			
		||||
		pmdelta_t *vdelta = v->data;
 | 
			
		||||
		alpm_graph_t *v = i->data;
 | 
			
		||||
		alpm_delta_t *vdelta = v->data;
 | 
			
		||||
		if(v->weight > quota) {
 | 
			
		||||
			unused = alpm_list_add(unused, vdelta->delta);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	alpm_list_free_inner(vertices, _alpm_graph_free);
 | 
			
		||||
	alpm_list_free(vertices);
 | 
			
		||||
	return(unused);
 | 
			
		||||
	return unused;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_unused_deltas(pmpkg_t *pkg)
 | 
			
		||||
/** \addtogroup alpm_deltas Delta Functions
 | 
			
		||||
 * @brief Functions to manipulate libalpm deltas
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_unused_deltas(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	off_t pkgsize = alpm_pkg_get_size(pkg);
 | 
			
		||||
	alpm_list_t *unused = find_unused(
 | 
			
		||||
			alpm_pkg_get_deltas(pkg),
 | 
			
		||||
			alpm_pkg_get_filename(pkg),
 | 
			
		||||
			pkgsize * MAX_DELTA_RATIO);
 | 
			
		||||
	return(unused);
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	return find_unused(pkg->deltas, pkg->filename, pkg->size * MAX_DELTA_RATIO);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
/** Parses the string representation of a pmdelta_t object.
 | 
			
		||||
/** Parses the string representation of a alpm_delta_t object.
 | 
			
		||||
 * This function assumes that the string is in the correct format.
 | 
			
		||||
 * This format is as follows:
 | 
			
		||||
 * $deltafile $deltamd5 $deltasize $oldfile $newfile
 | 
			
		||||
 * @param line the string to parse
 | 
			
		||||
 * @return A pointer to the new pmdelta_t object
 | 
			
		||||
 * @return A pointer to the new alpm_delta_t object
 | 
			
		||||
 */
 | 
			
		||||
/* TODO this does not really belong here, but in a parsing lib */
 | 
			
		||||
pmdelta_t *_alpm_delta_parse(char *line)
 | 
			
		||||
alpm_delta_t *_alpm_delta_parse(char *line)
 | 
			
		||||
{
 | 
			
		||||
	pmdelta_t *delta;
 | 
			
		||||
	alpm_delta_t *delta;
 | 
			
		||||
	char *tmp = line, *tmp2;
 | 
			
		||||
	regex_t reg;
 | 
			
		||||
 | 
			
		||||
@@ -308,47 +292,59 @@ pmdelta_t *_alpm_delta_parse(char *line)
 | 
			
		||||
	if(regexec(®, line, 0, 0, 0) != 0) {
 | 
			
		||||
		/* delta line is invalid, return NULL */
 | 
			
		||||
		regfree(®);
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	regfree(®);
 | 
			
		||||
 | 
			
		||||
	CALLOC(delta, 1, sizeof(pmdelta_t), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	CALLOC(delta, 1, sizeof(alpm_delta_t), return NULL);
 | 
			
		||||
 | 
			
		||||
	tmp2 = tmp;
 | 
			
		||||
	tmp = strchr(tmp, ' ');
 | 
			
		||||
	*(tmp++) = '\0';
 | 
			
		||||
	STRDUP(delta->delta, tmp2, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	STRDUP(delta->delta, tmp2, return NULL);
 | 
			
		||||
 | 
			
		||||
	tmp2 = tmp;
 | 
			
		||||
	tmp = strchr(tmp, ' ');
 | 
			
		||||
	*(tmp++) = '\0';
 | 
			
		||||
	STRDUP(delta->delta_md5, tmp2, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	STRDUP(delta->delta_md5, tmp2, return NULL);
 | 
			
		||||
 | 
			
		||||
	tmp2 = tmp;
 | 
			
		||||
	tmp = strchr(tmp, ' ');
 | 
			
		||||
	*(tmp++) = '\0';
 | 
			
		||||
	delta->delta_size = atol(tmp2);
 | 
			
		||||
	delta->delta_size = _alpm_strtoofft(tmp2);
 | 
			
		||||
 | 
			
		||||
	tmp2 = tmp;
 | 
			
		||||
	tmp = strchr(tmp, ' ');
 | 
			
		||||
	*(tmp++) = '\0';
 | 
			
		||||
	STRDUP(delta->from, tmp2, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	STRDUP(delta->from, tmp2, return NULL);
 | 
			
		||||
 | 
			
		||||
	tmp2 = tmp;
 | 
			
		||||
	STRDUP(delta->to, tmp2, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	STRDUP(delta->to, tmp2, return NULL);
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "delta : %s %s '%jd'\n", delta->from, delta->to, (intmax_t)delta->delta_size);
 | 
			
		||||
 | 
			
		||||
	return(delta);
 | 
			
		||||
	return delta;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_delta_free(pmdelta_t *delta)
 | 
			
		||||
void _alpm_delta_free(alpm_delta_t *delta)
 | 
			
		||||
{
 | 
			
		||||
	FREE(delta->from);
 | 
			
		||||
	FREE(delta->to);
 | 
			
		||||
	FREE(delta->delta);
 | 
			
		||||
	FREE(delta->delta_md5);
 | 
			
		||||
	FREE(delta->from);
 | 
			
		||||
	FREE(delta->to);
 | 
			
		||||
	FREE(delta);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_delta_t *_alpm_delta_dup(const alpm_delta_t *delta)
 | 
			
		||||
{
 | 
			
		||||
	alpm_delta_t *newdelta;
 | 
			
		||||
	CALLOC(newdelta, 1, sizeof(alpm_delta_t), return NULL);
 | 
			
		||||
	STRDUP(newdelta->delta, delta->delta, return NULL);
 | 
			
		||||
	STRDUP(newdelta->delta_md5, delta->delta_md5, return NULL);
 | 
			
		||||
	STRDUP(newdelta->from, delta->from, return NULL);
 | 
			
		||||
	STRDUP(newdelta->to, delta->to, return NULL);
 | 
			
		||||
	newdelta->delta_size = delta->delta_size;
 | 
			
		||||
	newdelta->download_size = delta->download_size;
 | 
			
		||||
 | 
			
		||||
	return newdelta;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -20,28 +20,16 @@
 | 
			
		||||
#ifndef _ALPM_DELTA_H
 | 
			
		||||
#define _ALPM_DELTA_H
 | 
			
		||||
 | 
			
		||||
#include "config.h" /* ensure off_t is correct length */
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h> /* off_t */
 | 
			
		||||
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
 | 
			
		||||
struct __pmdelta_t {
 | 
			
		||||
	/** filename of the delta patch */
 | 
			
		||||
	char *delta;
 | 
			
		||||
	/** md5sum of the delta file */
 | 
			
		||||
	char *delta_md5;
 | 
			
		||||
	/** filesize of the delta file */
 | 
			
		||||
	off_t delta_size;
 | 
			
		||||
	/** filename of the 'before' file */
 | 
			
		||||
	char *from;
 | 
			
		||||
	/** filename of the 'after' file */
 | 
			
		||||
	char *to;
 | 
			
		||||
	/** download filesize of the delta file */
 | 
			
		||||
	off_t download_size;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
pmdelta_t *_alpm_delta_parse(char *line);
 | 
			
		||||
void _alpm_delta_free(pmdelta_t *delta);
 | 
			
		||||
off_t _alpm_shortest_delta_path(alpm_list_t *deltas,
 | 
			
		||||
alpm_delta_t *_alpm_delta_parse(char *line);
 | 
			
		||||
void _alpm_delta_free(alpm_delta_t *delta);
 | 
			
		||||
alpm_delta_t *_alpm_delta_dup(const alpm_delta_t *delta);
 | 
			
		||||
off_t _alpm_shortest_delta_path(alpm_handle_t *handle, alpm_list_t *deltas,
 | 
			
		||||
		const char *to, alpm_list_t **path);
 | 
			
		||||
 | 
			
		||||
/* max percent of package size to download deltas */
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -27,31 +27,17 @@
 | 
			
		||||
#include "package.h"
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
 | 
			
		||||
/* Dependency */
 | 
			
		||||
struct __pmdepend_t {
 | 
			
		||||
	char *name;
 | 
			
		||||
	char *version;
 | 
			
		||||
	unsigned long name_hash;
 | 
			
		||||
	pmdepmod_t mod;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Missing dependency */
 | 
			
		||||
struct __pmdepmissing_t {
 | 
			
		||||
	char *target;
 | 
			
		||||
	pmdepend_t *depend;
 | 
			
		||||
	char *causingpkg; /* this is used in case of remove dependency error only */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void _alpm_dep_free(pmdepend_t *dep);
 | 
			
		||||
pmdepend_t *_alpm_dep_dup(const pmdepend_t *dep);
 | 
			
		||||
void _alpm_depmiss_free(pmdepmissing_t *miss);
 | 
			
		||||
alpm_list_t *_alpm_sortbydeps(alpm_list_t *targets, int reverse);
 | 
			
		||||
void _alpm_recursedeps(pmdb_t *db, alpm_list_t *targs, int include_explicit);
 | 
			
		||||
int _alpm_resolvedeps(alpm_list_t *localpkgs, alpm_list_t *dbs_sync, pmpkg_t *pkg,
 | 
			
		||||
void _alpm_dep_free(alpm_depend_t *dep);
 | 
			
		||||
alpm_depend_t *_alpm_dep_dup(const alpm_depend_t *dep);
 | 
			
		||||
void _alpm_depmiss_free(alpm_depmissing_t *miss);
 | 
			
		||||
alpm_list_t *_alpm_sortbydeps(alpm_handle_t *handle, alpm_list_t *targets, int reverse);
 | 
			
		||||
int _alpm_recursedeps(alpm_db_t *db, alpm_list_t *targs, int include_explicit);
 | 
			
		||||
int _alpm_resolvedeps(alpm_handle_t *handle, alpm_list_t *localpkgs, alpm_pkg_t *pkg,
 | 
			
		||||
		alpm_list_t *preferred, alpm_list_t **packages, alpm_list_t *remove,
 | 
			
		||||
		alpm_list_t **data);
 | 
			
		||||
pmdepend_t *_alpm_splitdep(const char *depstring);
 | 
			
		||||
int _alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep);
 | 
			
		||||
alpm_depend_t *_alpm_splitdep(const char *depstring);
 | 
			
		||||
int _alpm_depcmp_literal(alpm_pkg_t *pkg, alpm_depend_t *dep);
 | 
			
		||||
int _alpm_depcmp(alpm_pkg_t *pkg, alpm_depend_t *dep);
 | 
			
		||||
 | 
			
		||||
#endif /* _ALPM_DEPS_H */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -39,10 +39,6 @@
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* libarchive */
 | 
			
		||||
#include <archive.h>
 | 
			
		||||
#include <archive_entry.h>
 | 
			
		||||
 | 
			
		||||
/* libalpm */
 | 
			
		||||
#include "diskspace.h"
 | 
			
		||||
#include "alpm_list.h"
 | 
			
		||||
@@ -56,10 +52,10 @@ static int mount_point_cmp(const void *p1, const void *p2)
 | 
			
		||||
	const alpm_mountpoint_t *mp1 = p1;
 | 
			
		||||
	const alpm_mountpoint_t *mp2 = p2;
 | 
			
		||||
	/* the negation will sort all mountpoints before their parent */
 | 
			
		||||
	return(-strcmp(mp1->mount_dir, mp2->mount_dir));
 | 
			
		||||
	return -strcmp(mp1->mount_dir, mp2->mount_dir);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static alpm_list_t *mount_point_list(void)
 | 
			
		||||
static alpm_list_t *mount_point_list(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *mount_points = NULL, *ptr;
 | 
			
		||||
	alpm_mountpoint_t *mp;
 | 
			
		||||
@@ -71,23 +67,23 @@ static alpm_list_t *mount_point_list(void)
 | 
			
		||||
 | 
			
		||||
	fp = setmntent(MOUNTED, "r");
 | 
			
		||||
 | 
			
		||||
	if (fp == NULL) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
	if(fp == NULL) {
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while((mnt = getmntent(fp))) {
 | 
			
		||||
		if(!mnt) {
 | 
			
		||||
			_alpm_log(PM_LOG_WARNING, _("could not get filesystem information\n"));
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_WARNING, _("could not get filesystem information\n"));
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		if(statvfs(mnt->mnt_dir, &fsp) != 0) {
 | 
			
		||||
			_alpm_log(PM_LOG_WARNING,
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_WARNING,
 | 
			
		||||
					_("could not get filesystem information for %s: %s\n"),
 | 
			
		||||
					mnt->mnt_dir, strerror(errno));
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		CALLOC(mp, 1, sizeof(alpm_mountpoint_t), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
		CALLOC(mp, 1, sizeof(alpm_mountpoint_t), RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
 | 
			
		||||
		mp->mount_dir = strdup(mnt->mnt_dir);
 | 
			
		||||
		mp->mount_dir_len = strlen(mp->mount_dir);
 | 
			
		||||
		memcpy(&(mp->fsp), &fsp, sizeof(struct statvfs));
 | 
			
		||||
@@ -103,12 +99,12 @@ static alpm_list_t *mount_point_list(void)
 | 
			
		||||
 | 
			
		||||
	entries = getmntinfo(&fsp, MNT_NOWAIT);
 | 
			
		||||
 | 
			
		||||
	if (entries < 0) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
	if(entries < 0) {
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for(; entries-- > 0; fsp++) {
 | 
			
		||||
		CALLOC(mp, 1, sizeof(alpm_mountpoint_t), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
		CALLOC(mp, 1, sizeof(alpm_mountpoint_t), RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
 | 
			
		||||
		mp->mount_dir = strdup(fsp->f_mntonname);
 | 
			
		||||
		mp->mount_dir_len = strlen(mp->mount_dir);
 | 
			
		||||
		memcpy(&(mp->fsp), fsp, sizeof(FSSTATSTYPE));
 | 
			
		||||
@@ -126,9 +122,9 @@ static alpm_list_t *mount_point_list(void)
 | 
			
		||||
			mount_point_cmp);
 | 
			
		||||
	for(ptr = mount_points; ptr != NULL; ptr = ptr->next) {
 | 
			
		||||
		mp = ptr->data;
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "mountpoint: %s\n", mp->mount_dir);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "mountpoint: %s\n", mp->mount_dir);
 | 
			
		||||
	}
 | 
			
		||||
	return(mount_points);
 | 
			
		||||
	return mount_points;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static alpm_mountpoint_t *match_mount_point(const alpm_list_t *mount_points,
 | 
			
		||||
@@ -140,25 +136,30 @@ static alpm_mountpoint_t *match_mount_point(const alpm_list_t *mount_points,
 | 
			
		||||
		alpm_mountpoint_t *data = mp->data;
 | 
			
		||||
 | 
			
		||||
		if(strncmp(data->mount_dir, real_path, data->mount_dir_len) == 0) {
 | 
			
		||||
			return(data);
 | 
			
		||||
			return data;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* should not get here... */
 | 
			
		||||
	return(NULL);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int calculate_removed_size(const alpm_list_t *mount_points,
 | 
			
		||||
		pmpkg_t *pkg)
 | 
			
		||||
static int calculate_removed_size(alpm_handle_t *handle,
 | 
			
		||||
		const alpm_list_t *mount_points, alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *file;
 | 
			
		||||
	size_t i;
 | 
			
		||||
	alpm_filelist_t *filelist = alpm_pkg_get_files(pkg);
 | 
			
		||||
 | 
			
		||||
	alpm_list_t *files = alpm_pkg_get_files(pkg);
 | 
			
		||||
	for(file = files; file; file = file->next) {
 | 
			
		||||
	if(!filelist->count) {
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for(i = 0; i < filelist->count; i++) {
 | 
			
		||||
		const alpm_file_t *file = filelist->files + i;
 | 
			
		||||
		alpm_mountpoint_t *mp;
 | 
			
		||||
		struct stat st;
 | 
			
		||||
		char path[PATH_MAX];
 | 
			
		||||
		const char *filename = file->data;
 | 
			
		||||
		const char *filename = file->name;
 | 
			
		||||
 | 
			
		||||
		snprintf(path, PATH_MAX, "%s%s", handle->root, filename);
 | 
			
		||||
		_alpm_lstat(path, &st);
 | 
			
		||||
@@ -171,142 +172,118 @@ static int calculate_removed_size(const alpm_list_t *mount_points,
 | 
			
		||||
 | 
			
		||||
		mp = match_mount_point(mount_points, path);
 | 
			
		||||
		if(mp == NULL) {
 | 
			
		||||
			_alpm_log(PM_LOG_WARNING,
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_WARNING,
 | 
			
		||||
					_("could not determine mount point for file %s\n"), filename);
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* the addition of (divisor - 1) performs ceil() with integer division */
 | 
			
		||||
		mp->blocks_needed -=
 | 
			
		||||
			(st.st_size + mp->fsp.f_bsize - 1l) / mp->fsp.f_bsize;
 | 
			
		||||
			(st.st_size + mp->fsp.f_bsize - 1) / mp->fsp.f_bsize;
 | 
			
		||||
		mp->used |= USED_REMOVE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int calculate_installed_size(const alpm_list_t *mount_points,
 | 
			
		||||
		pmpkg_t *pkg)
 | 
			
		||||
static int calculate_installed_size(alpm_handle_t *handle,
 | 
			
		||||
		const alpm_list_t *mount_points, alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	int ret=0;
 | 
			
		||||
	struct archive *archive;
 | 
			
		||||
	struct archive_entry *entry;
 | 
			
		||||
	size_t i;
 | 
			
		||||
	alpm_filelist_t *filelist = alpm_pkg_get_files(pkg);
 | 
			
		||||
 | 
			
		||||
	if ((archive = archive_read_new()) == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_LIBARCHIVE;
 | 
			
		||||
		ret = -1;
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	if(!filelist->count) {
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	archive_read_support_compression_all(archive);
 | 
			
		||||
	archive_read_support_format_all(archive);
 | 
			
		||||
 | 
			
		||||
	if(archive_read_open_filename(archive, pkg->origin_data.file,
 | 
			
		||||
				ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) {
 | 
			
		||||
		pm_errno = PM_ERR_PKG_OPEN;
 | 
			
		||||
		ret = -1;
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while(archive_read_next_header(archive, &entry) == ARCHIVE_OK) {
 | 
			
		||||
	for(i = 0; i < filelist->count; i++) {
 | 
			
		||||
		const alpm_file_t *file = filelist->files + i;
 | 
			
		||||
		alpm_mountpoint_t *mp;
 | 
			
		||||
		const char *filename;
 | 
			
		||||
		mode_t mode;
 | 
			
		||||
		char path[PATH_MAX];
 | 
			
		||||
 | 
			
		||||
		filename = archive_entry_pathname(entry);
 | 
			
		||||
		mode = archive_entry_mode(entry);
 | 
			
		||||
		const char *filename = file->name;
 | 
			
		||||
 | 
			
		||||
		/* libarchive reports these as zero size anyways */
 | 
			
		||||
		/* NOTE: if we do start accounting for directory size, a dir matching a
 | 
			
		||||
		 * mountpoint needs to be attributed to the parent, not the mountpoint. */
 | 
			
		||||
		if(S_ISDIR(mode) || S_ISLNK(mode)) {
 | 
			
		||||
		if(S_ISDIR(file->mode) || S_ISLNK(file->mode)) {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* approximate space requirements for db entries */
 | 
			
		||||
		if(filename[0] == '.') {
 | 
			
		||||
			filename = alpm_option_get_dbpath();
 | 
			
		||||
			filename = handle->dbpath;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		snprintf(path, PATH_MAX, "%s%s", handle->root, filename);
 | 
			
		||||
 | 
			
		||||
		mp = match_mount_point(mount_points, path);
 | 
			
		||||
		if(mp == NULL) {
 | 
			
		||||
			_alpm_log(PM_LOG_WARNING,
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_WARNING,
 | 
			
		||||
					_("could not determine mount point for file %s\n"), filename);
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* the addition of (divisor - 1) performs ceil() with integer division */
 | 
			
		||||
		mp->blocks_needed +=
 | 
			
		||||
			(archive_entry_size(entry) + mp->fsp.f_bsize - 1l) / mp->fsp.f_bsize;
 | 
			
		||||
			(file->size + mp->fsp.f_bsize - 1) / mp->fsp.f_bsize;
 | 
			
		||||
		mp->used |= USED_INSTALL;
 | 
			
		||||
 | 
			
		||||
		if(archive_read_data_skip(archive)) {
 | 
			
		||||
			_alpm_log(PM_LOG_ERROR, _("error while reading package %s: %s\n"),
 | 
			
		||||
					pkg->name, archive_error_string(archive));
 | 
			
		||||
			pm_errno = PM_ERR_LIBARCHIVE;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	archive_read_finish(archive);
 | 
			
		||||
 | 
			
		||||
cleanup:
 | 
			
		||||
	return(ret);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int _alpm_check_diskspace(pmtrans_t *trans, pmdb_t *db_local)
 | 
			
		||||
int _alpm_check_diskspace(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *mount_points, *i;
 | 
			
		||||
	alpm_mountpoint_t *root_mp;
 | 
			
		||||
	size_t replaces = 0, current = 0, numtargs;
 | 
			
		||||
	int abort = 0;
 | 
			
		||||
	int error = 0;
 | 
			
		||||
	alpm_list_t *targ;
 | 
			
		||||
	alpm_trans_t *trans = handle->trans;
 | 
			
		||||
 | 
			
		||||
	numtargs = alpm_list_count(trans->add);
 | 
			
		||||
	mount_points = mount_point_list();
 | 
			
		||||
	mount_points = mount_point_list(handle);
 | 
			
		||||
	if(mount_points == NULL) {
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("could not determine filesystem mount points\n"));
 | 
			
		||||
		return(-1);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_ERROR, _("could not determine filesystem mount points\n"));
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	root_mp = match_mount_point(mount_points, handle->root);
 | 
			
		||||
	if(root_mp == NULL) {
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("could not determine root mount point %s\n"),
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_ERROR, _("could not determine root mount point %s\n"),
 | 
			
		||||
				handle->root);
 | 
			
		||||
		return(-1);
 | 
			
		||||
		error = 1;
 | 
			
		||||
		goto finish;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	replaces = alpm_list_count(trans->remove);
 | 
			
		||||
	if(replaces) {
 | 
			
		||||
		numtargs += replaces;
 | 
			
		||||
		for(targ = trans->remove; targ; targ = targ->next, current++) {
 | 
			
		||||
			pmpkg_t *local_pkg;
 | 
			
		||||
			alpm_pkg_t *local_pkg;
 | 
			
		||||
			int percent = (current * 100) / numtargs;
 | 
			
		||||
			PROGRESS(trans, PM_TRANS_PROGRESS_DISKSPACE_START, "", percent,
 | 
			
		||||
			PROGRESS(handle, ALPM_PROGRESS_DISKSPACE_START, "", percent,
 | 
			
		||||
					numtargs, current);
 | 
			
		||||
 | 
			
		||||
			local_pkg = targ->data;
 | 
			
		||||
			calculate_removed_size(mount_points, local_pkg);
 | 
			
		||||
			calculate_removed_size(handle, mount_points, local_pkg);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for(targ = trans->add; targ; targ = targ->next, current++) {
 | 
			
		||||
		pmpkg_t *pkg, *local_pkg;
 | 
			
		||||
		alpm_pkg_t *pkg, *local_pkg;
 | 
			
		||||
		int percent = (current * 100) / numtargs;
 | 
			
		||||
		PROGRESS(trans, PM_TRANS_PROGRESS_DISKSPACE_START, "", percent,
 | 
			
		||||
		PROGRESS(handle, ALPM_PROGRESS_DISKSPACE_START, "", percent,
 | 
			
		||||
				numtargs, current);
 | 
			
		||||
 | 
			
		||||
		pkg = targ->data;
 | 
			
		||||
		/* is this package already installed? */
 | 
			
		||||
		local_pkg = _alpm_db_get_pkgfromcache(db_local, pkg->name);
 | 
			
		||||
		local_pkg = _alpm_db_get_pkgfromcache(handle->db_local, pkg->name);
 | 
			
		||||
		if(local_pkg) {
 | 
			
		||||
			calculate_removed_size(mount_points, local_pkg);
 | 
			
		||||
			calculate_removed_size(handle, mount_points, local_pkg);
 | 
			
		||||
		}
 | 
			
		||||
		calculate_installed_size(mount_points, pkg);
 | 
			
		||||
		calculate_installed_size(handle, mount_points, pkg);
 | 
			
		||||
 | 
			
		||||
		for(i = mount_points; i; i = alpm_list_next(i)) {
 | 
			
		||||
		for(i = mount_points; i; i = i->next) {
 | 
			
		||||
			alpm_mountpoint_t *data = i->data;
 | 
			
		||||
			if(data->blocks_needed > data->max_blocks_needed) {
 | 
			
		||||
				data->max_blocks_needed = data->blocks_needed;
 | 
			
		||||
@@ -314,45 +291,47 @@ int _alpm_check_diskspace(pmtrans_t *trans, pmdb_t *db_local)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	PROGRESS(trans, PM_TRANS_PROGRESS_DISKSPACE_START, "", 100,
 | 
			
		||||
	PROGRESS(handle, ALPM_PROGRESS_DISKSPACE_START, "", 100,
 | 
			
		||||
			numtargs, current);
 | 
			
		||||
 | 
			
		||||
	for(i = mount_points; i; i = alpm_list_next(i)) {
 | 
			
		||||
	for(i = mount_points; i; i = i->next) {
 | 
			
		||||
		alpm_mountpoint_t *data = i->data;
 | 
			
		||||
		if(data->used && data->read_only) {
 | 
			
		||||
			_alpm_log(PM_LOG_ERROR, _("Partition %s is mounted read only\n"),
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_ERROR, _("Partition %s is mounted read only\n"),
 | 
			
		||||
					data->mount_dir);
 | 
			
		||||
			abort = 1;
 | 
			
		||||
			error = 1;
 | 
			
		||||
		} else if(data->used & USED_INSTALL) {
 | 
			
		||||
			/* cushion is roughly min(5% capacity, 20MiB) */
 | 
			
		||||
			long fivepc = ((long)data->fsp.f_blocks / 20) + 1;
 | 
			
		||||
			long twentymb = (20 * 1024 * 1024 / (long)data->fsp.f_bsize) + 1;
 | 
			
		||||
			long cushion = fivepc < twentymb ? fivepc : twentymb;
 | 
			
		||||
			fsblkcnt_t fivepc = (data->fsp.f_blocks / 20) + 1;
 | 
			
		||||
			fsblkcnt_t twentymb = (20 * 1024 * 1024 / data->fsp.f_bsize) + 1;
 | 
			
		||||
			fsblkcnt_t cushion = fivepc < twentymb ? fivepc : twentymb;
 | 
			
		||||
			blkcnt_t needed = data->max_blocks_needed + cushion;
 | 
			
		||||
 | 
			
		||||
			_alpm_log(PM_LOG_DEBUG, "partition %s, needed %ld, cushion %ld, free %ld\n",
 | 
			
		||||
					data->mount_dir, data->max_blocks_needed, cushion,
 | 
			
		||||
					(unsigned long)data->fsp.f_bfree);
 | 
			
		||||
			if(data->max_blocks_needed + cushion >= 0 &&
 | 
			
		||||
			   (unsigned long)(data->max_blocks_needed + cushion) > data->fsp.f_bfree) {
 | 
			
		||||
				_alpm_log(PM_LOG_ERROR, _("Partition %s too full: %ld blocks needed, %ld blocks free\n"),
 | 
			
		||||
						data->mount_dir, data->max_blocks_needed + cushion,
 | 
			
		||||
						(unsigned long)data->fsp.f_bfree);
 | 
			
		||||
				abort = 1;
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_DEBUG,
 | 
			
		||||
					"partition %s, needed %jd, cushion %ju, free %ju\n",
 | 
			
		||||
					data->mount_dir, (intmax_t)data->max_blocks_needed,
 | 
			
		||||
					(uintmax_t)cushion, (uintmax_t)data->fsp.f_bfree);
 | 
			
		||||
			if(needed >= 0 && (fsblkcnt_t)needed > data->fsp.f_bfree) {
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_ERROR,
 | 
			
		||||
						_("Partition %s too full: %jd blocks needed, %jd blocks free\n"),
 | 
			
		||||
						data->mount_dir, (intmax_t)needed, (uintmax_t)data->fsp.f_bfree);
 | 
			
		||||
				error = 1;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for(i = mount_points; i; i = alpm_list_next(i)) {
 | 
			
		||||
finish:
 | 
			
		||||
	for(i = mount_points; i; i = i->next) {
 | 
			
		||||
		alpm_mountpoint_t *data = i->data;
 | 
			
		||||
		FREE(data->mount_dir);
 | 
			
		||||
	}
 | 
			
		||||
	FREELIST(mount_points);
 | 
			
		||||
 | 
			
		||||
	if(abort) {
 | 
			
		||||
		RET_ERR(PM_ERR_DISK_SPACE, -1);
 | 
			
		||||
	if(error) {
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_DISK_SPACE, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,9 @@
 | 
			
		||||
#if defined(HAVE_SYS_STATVFS_H)
 | 
			
		||||
#include <sys/statvfs.h>
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(HAVE_SYS_TYPES_H)
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
 | 
			
		||||
@@ -39,14 +42,14 @@ typedef struct __alpm_mountpoint_t {
 | 
			
		||||
	char *mount_dir;
 | 
			
		||||
	size_t mount_dir_len;
 | 
			
		||||
	/* storage for additional disk usage calculations */
 | 
			
		||||
	long blocks_needed;
 | 
			
		||||
	long max_blocks_needed;
 | 
			
		||||
	blkcnt_t blocks_needed;
 | 
			
		||||
	blkcnt_t max_blocks_needed;
 | 
			
		||||
	enum mount_used_level used;
 | 
			
		||||
	int read_only;
 | 
			
		||||
	FSSTATSTYPE fsp;
 | 
			
		||||
} alpm_mountpoint_t;
 | 
			
		||||
 | 
			
		||||
int _alpm_check_diskspace(pmtrans_t *trans, pmdb_t *db_local);
 | 
			
		||||
int _alpm_check_diskspace(alpm_handle_t *handle);
 | 
			
		||||
 | 
			
		||||
#endif /* _ALPM_DISKSPACE_H */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,14 +29,9 @@
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
/* the following two are needed for FreeBSD's libfetch */
 | 
			
		||||
#include <limits.h> /* PATH_MAX */
 | 
			
		||||
#if defined(HAVE_SYS_PARAM_H)
 | 
			
		||||
#include <sys/param.h> /* MAXHOSTNAMELEN */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBFETCH
 | 
			
		||||
#include <fetch.h>
 | 
			
		||||
#ifdef HAVE_LIBCURL
 | 
			
		||||
#include <curl/curl.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* libalpm */
 | 
			
		||||
@@ -47,399 +42,574 @@
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "handle.h"
 | 
			
		||||
 | 
			
		||||
static char *get_filename(const char *url) {
 | 
			
		||||
#ifdef HAVE_LIBCURL
 | 
			
		||||
static const char *get_filename(const char *url)
 | 
			
		||||
{
 | 
			
		||||
	char *filename = strrchr(url, '/');
 | 
			
		||||
	if(filename != NULL) {
 | 
			
		||||
		filename++;
 | 
			
		||||
	}
 | 
			
		||||
	return(filename);
 | 
			
		||||
	return filename;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBFETCH
 | 
			
		||||
static char *get_destfile(const char *path, const char *filename) {
 | 
			
		||||
	char *destfile;
 | 
			
		||||
	/* len = localpath len + filename len + null */
 | 
			
		||||
	size_t len = strlen(path) + strlen(filename) + 1;
 | 
			
		||||
	CALLOC(destfile, len, sizeof(char), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	snprintf(destfile, len, "%s%s", path, filename);
 | 
			
		||||
 | 
			
		||||
	return(destfile);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static char *get_tempfile(const char *path, const char *filename) {
 | 
			
		||||
	char *tempfile;
 | 
			
		||||
	/* len = localpath len + filename len + '.part' len + null */
 | 
			
		||||
	size_t len = strlen(path) + strlen(filename) + 6;
 | 
			
		||||
	CALLOC(tempfile, len, sizeof(char), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	snprintf(tempfile, len, "%s%s.part", path, filename);
 | 
			
		||||
 | 
			
		||||
	return(tempfile);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const char *gethost(struct url *fileurl)
 | 
			
		||||
static char *get_fullpath(const char *path, const char *filename,
 | 
			
		||||
		const char *suffix)
 | 
			
		||||
{
 | 
			
		||||
	const char *host = _("disk");
 | 
			
		||||
	if(strcmp(SCHEME_FILE, fileurl->scheme) != 0) {
 | 
			
		||||
		host = fileurl->host;
 | 
			
		||||
	}
 | 
			
		||||
	return(host);
 | 
			
		||||
	char *filepath;
 | 
			
		||||
	/* len = localpath len + filename len + suffix len + null */
 | 
			
		||||
	size_t len = strlen(path) + strlen(filename) + strlen(suffix) + 1;
 | 
			
		||||
	MALLOC(filepath, len, return NULL);
 | 
			
		||||
	snprintf(filepath, len, "%s%s%s", path, filename, suffix);
 | 
			
		||||
 | 
			
		||||
	return filepath;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int dload_interrupted;
 | 
			
		||||
static void inthandler(int signum)
 | 
			
		||||
static CURL *get_libcurl_handle(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	dload_interrupted = 1;
 | 
			
		||||
	if(!handle->curl) {
 | 
			
		||||
		curl_global_init(CURL_GLOBAL_SSL);
 | 
			
		||||
		handle->curl = curl_easy_init();
 | 
			
		||||
	}
 | 
			
		||||
	return handle->curl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define check_stop() if(dload_interrupted) { ret = -1; goto cleanup; }
 | 
			
		||||
enum sighandlers { OLD = 0, NEW = 1 };
 | 
			
		||||
enum {
 | 
			
		||||
	ABORT_SIGINT = 1,
 | 
			
		||||
	ABORT_OVER_MAXFILESIZE
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int download_internal(const char *url, const char *localpath,
 | 
			
		||||
		int force) {
 | 
			
		||||
	FILE *localf = NULL;
 | 
			
		||||
	struct stat st;
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
	off_t dl_thisfile = 0;
 | 
			
		||||
	ssize_t nread = 0;
 | 
			
		||||
	char *tempfile, *destfile, *filename;
 | 
			
		||||
	struct sigaction sig_pipe[2], sig_int[2];
 | 
			
		||||
static int dload_interrupted;
 | 
			
		||||
static void inthandler(int UNUSED signum)
 | 
			
		||||
{
 | 
			
		||||
	dload_interrupted = ABORT_SIGINT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	off_t local_size = 0;
 | 
			
		||||
	time_t local_time = 0;
 | 
			
		||||
static int curl_progress(void *file, double dltotal, double dlnow,
 | 
			
		||||
		double UNUSED ultotal, double UNUSED ulnow)
 | 
			
		||||
{
 | 
			
		||||
	struct dload_payload *payload = (struct dload_payload *)file;
 | 
			
		||||
	off_t current_size, total_size;
 | 
			
		||||
 | 
			
		||||
	struct url *fileurl;
 | 
			
		||||
	struct url_stat ust;
 | 
			
		||||
	fetchIO *dlf = NULL;
 | 
			
		||||
 | 
			
		||||
	char buffer[PM_DLBUF_LEN];
 | 
			
		||||
 | 
			
		||||
	filename = get_filename(url);
 | 
			
		||||
	if(!filename) {
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("url '%s' is invalid\n"), url);
 | 
			
		||||
		RET_ERR(PM_ERR_SERVER_BAD_URL, -1);
 | 
			
		||||
	/* SIGINT sent, abort by alerting curl */
 | 
			
		||||
	if(dload_interrupted) {
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fileurl = fetchParseURL(url);
 | 
			
		||||
	if(!fileurl) {
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("url '%s' is invalid\n"), url);
 | 
			
		||||
		RET_ERR(PM_ERR_LIBFETCH, -1);
 | 
			
		||||
	current_size = payload->initial_size + (off_t)dlnow;
 | 
			
		||||
 | 
			
		||||
	/* is our filesize still under any set limit? */
 | 
			
		||||
	if(payload->max_size && current_size > payload->max_size) {
 | 
			
		||||
		dload_interrupted = ABORT_OVER_MAXFILESIZE;
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	destfile = get_destfile(localpath, filename);
 | 
			
		||||
	tempfile = get_tempfile(localpath, filename);
 | 
			
		||||
	/* none of what follows matters if the front end has no callback */
 | 
			
		||||
	if(payload->handle->dlcb == NULL) {
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(stat(tempfile, &st) == 0 && S_ISREG(st.st_mode) && st.st_size > 0) {
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "tempfile found, attempting continuation\n");
 | 
			
		||||
		local_time = fileurl->last_modified = st.st_mtime;
 | 
			
		||||
		local_size = fileurl->offset = (off_t)st.st_size;
 | 
			
		||||
		dl_thisfile = st.st_size;
 | 
			
		||||
		localf = fopen(tempfile, "ab");
 | 
			
		||||
	} else if(!force && stat(destfile, &st) == 0 && S_ISREG(st.st_mode) && st.st_size > 0) {
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "destfile found, using mtime only\n");
 | 
			
		||||
		local_time = fileurl->last_modified = st.st_mtime;
 | 
			
		||||
		local_size = /* no fu->off here */ (off_t)st.st_size;
 | 
			
		||||
	total_size = payload->initial_size + (off_t)dltotal;
 | 
			
		||||
 | 
			
		||||
	if(DOUBLE_EQ(dltotal, 0.0) || payload->prevprogress == total_size) {
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* initialize the progress bar here to avoid displaying it when
 | 
			
		||||
	 * a repo is up to date and nothing gets downloaded */
 | 
			
		||||
	if(payload->prevprogress == 0) {
 | 
			
		||||
		payload->handle->dlcb(payload->remote_name, 0, (off_t)dltotal);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	payload->handle->dlcb(payload->remote_name, current_size, total_size);
 | 
			
		||||
 | 
			
		||||
	payload->prevprogress = current_size;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int curl_gethost(const char *url, char *buffer)
 | 
			
		||||
{
 | 
			
		||||
	size_t hostlen;
 | 
			
		||||
	char *p, *q;
 | 
			
		||||
 | 
			
		||||
	if(strncmp(url, "file://", 7) == 0) {
 | 
			
		||||
		strcpy(buffer, _("disk"));
 | 
			
		||||
	} else {
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "no file found matching criteria, starting from scratch\n");
 | 
			
		||||
		p = strstr(url, "//");
 | 
			
		||||
		if(!p) {
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
		p += 2; /* jump over the found // */
 | 
			
		||||
		hostlen = strcspn(p, "/");
 | 
			
		||||
 | 
			
		||||
		/* there might be a user:pass@ on the URL. hide it. avoid using memrchr()
 | 
			
		||||
		 * for portability concerns. */
 | 
			
		||||
		q = p + hostlen;
 | 
			
		||||
		while(--q > p) {
 | 
			
		||||
			if(*q == '@') {
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(*q == '@' && p != q) {
 | 
			
		||||
			hostlen -= q - p + 1;
 | 
			
		||||
			p = q + 1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(hostlen > 255) {
 | 
			
		||||
			/* buffer overflow imminent */
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
		snprintf(buffer, hostlen + 1, "%s", p);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* pass the raw filename for passing to the callback function */
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "using '%s' for download progress\n", filename);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	/* print proxy info for debug purposes */
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "HTTP_PROXY: %s\n", getenv("HTTP_PROXY"));
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "http_proxy: %s\n", getenv("http_proxy"));
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "FTP_PROXY:  %s\n", getenv("FTP_PROXY"));
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "ftp_proxy:  %s\n", getenv("ftp_proxy"));
 | 
			
		||||
static int utimes_long(const char *path, long seconds)
 | 
			
		||||
{
 | 
			
		||||
	if(seconds != -1) {
 | 
			
		||||
		struct timeval tv[2];
 | 
			
		||||
		memset(&tv, 0, sizeof(tv));
 | 
			
		||||
		tv[0].tv_sec = tv[1].tv_sec = seconds;
 | 
			
		||||
		return utimes(path, tv);
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	/* 10s timeout */
 | 
			
		||||
	fetchTimeout = 10;
 | 
			
		||||
static size_t parse_headers(void *ptr, size_t size, size_t nmemb, void *user)
 | 
			
		||||
{
 | 
			
		||||
	size_t realsize = size * nmemb;
 | 
			
		||||
	const char *fptr, *endptr = NULL;
 | 
			
		||||
	const char * const cd_header = "Content-Disposition:";
 | 
			
		||||
	const char * const fn_key = "filename=";
 | 
			
		||||
	struct dload_payload *payload = (struct dload_payload *)user;
 | 
			
		||||
 | 
			
		||||
	if(_alpm_raw_ncmp(cd_header, ptr, strlen(cd_header)) == 0) {
 | 
			
		||||
		if((fptr = strstr(ptr, fn_key))) {
 | 
			
		||||
			fptr += strlen(fn_key);
 | 
			
		||||
 | 
			
		||||
			/* find the end of the field, which is either a semi-colon, or the end of
 | 
			
		||||
			 * the data. As per curl_easy_setopt(3), we cannot count on headers being
 | 
			
		||||
			 * null terminated, so we look for the closing \r\n */
 | 
			
		||||
			endptr = fptr + strcspn(fptr, ";\r\n") - 1;
 | 
			
		||||
 | 
			
		||||
			/* remove quotes */
 | 
			
		||||
			if(*fptr == '"' && *endptr == '"') {
 | 
			
		||||
				fptr++;
 | 
			
		||||
				endptr--;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			STRNDUP(payload->content_disp_name, fptr, endptr - fptr + 1,
 | 
			
		||||
					RET_ERR(payload->handle, ALPM_ERR_MEMORY, realsize));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return realsize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void curl_set_handle_opts(struct dload_payload *payload,
 | 
			
		||||
		CURL *curl, char *error_buffer)
 | 
			
		||||
{
 | 
			
		||||
	alpm_handle_t *handle = payload->handle;
 | 
			
		||||
	const char *useragent = getenv("HTTP_USER_AGENT");
 | 
			
		||||
	struct stat st;
 | 
			
		||||
 | 
			
		||||
	/* the curl_easy handle is initialized with the alpm handle, so we only need
 | 
			
		||||
	 * to reset the handle's parameters for each time it's used. */
 | 
			
		||||
	curl_easy_reset(curl);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_URL, payload->fileurl);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error_buffer);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10L);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, curl_progress);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, (void *)payload);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 1024L);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 10L);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, parse_headers);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)payload);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_NETRC, CURL_NETRC_OPTIONAL);
 | 
			
		||||
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "url: %s\n", payload->fileurl);
 | 
			
		||||
 | 
			
		||||
	if(payload->max_size) {
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "maxsize: %jd\n",
 | 
			
		||||
				(intmax_t)payload->max_size);
 | 
			
		||||
		curl_easy_setopt(curl, CURLOPT_MAXFILESIZE_LARGE,
 | 
			
		||||
				(curl_off_t)payload->max_size);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(useragent != NULL) {
 | 
			
		||||
		curl_easy_setopt(curl, CURLOPT_USERAGENT, useragent);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(!payload->allow_resume && !payload->force && payload->destfile_name &&
 | 
			
		||||
			stat(payload->destfile_name, &st) == 0) {
 | 
			
		||||
		/* start from scratch, but only download if our local is out of date. */
 | 
			
		||||
		curl_easy_setopt(curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE);
 | 
			
		||||
		curl_easy_setopt(curl, CURLOPT_TIMEVALUE, (long)st.st_mtime);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG,
 | 
			
		||||
				"using time condition: %lu\n", (long)st.st_mtime);
 | 
			
		||||
	} else if(stat(payload->tempfile_name, &st) == 0 && payload->allow_resume) {
 | 
			
		||||
		/* a previous partial download exists, resume from end of file. */
 | 
			
		||||
		payload->tempfile_openmode = "ab";
 | 
			
		||||
		curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, (curl_off_t)st.st_size);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG,
 | 
			
		||||
				"tempfile found, attempting continuation from %jd bytes\n",
 | 
			
		||||
				(intmax_t)st.st_size);
 | 
			
		||||
		payload->initial_size = st.st_size;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void mask_signal(int signal, void (*handler)(int),
 | 
			
		||||
		struct sigaction *origaction)
 | 
			
		||||
{
 | 
			
		||||
	struct sigaction newaction;
 | 
			
		||||
 | 
			
		||||
	newaction.sa_handler = handler;
 | 
			
		||||
	sigemptyset(&newaction.sa_mask);
 | 
			
		||||
	newaction.sa_flags = 0;
 | 
			
		||||
 | 
			
		||||
	sigaction(signal, NULL, origaction);
 | 
			
		||||
	sigaction(signal, &newaction, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void unmask_signal(int signal, struct sigaction sa)
 | 
			
		||||
{
 | 
			
		||||
	sigaction(signal, &sa, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static FILE *create_tempfile(struct dload_payload *payload, const char *localpath)
 | 
			
		||||
{
 | 
			
		||||
	int fd;
 | 
			
		||||
	FILE *fp;
 | 
			
		||||
	char *randpath;
 | 
			
		||||
	size_t len;
 | 
			
		||||
 | 
			
		||||
	/* create a random filename, which is opened with O_EXCL */
 | 
			
		||||
	len = strlen(localpath) + 14 + 1;
 | 
			
		||||
	MALLOC(randpath, len, RET_ERR(payload->handle, ALPM_ERR_MEMORY, NULL));
 | 
			
		||||
	snprintf(randpath, len, "%salpmtmp.XXXXXX", localpath);
 | 
			
		||||
	if((fd = mkstemp(randpath)) == -1 ||
 | 
			
		||||
			!(fp = fdopen(fd, payload->tempfile_openmode))) {
 | 
			
		||||
		unlink(randpath);
 | 
			
		||||
		close(fd);
 | 
			
		||||
		_alpm_log(payload->handle, ALPM_LOG_ERROR,
 | 
			
		||||
				_("failed to create temporary file for download\n"));
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	/* fp now points to our alpmtmp.XXXXXX */
 | 
			
		||||
	free(payload->tempfile_name);
 | 
			
		||||
	payload->tempfile_name = randpath;
 | 
			
		||||
	free(payload->remote_name);
 | 
			
		||||
	STRDUP(payload->remote_name, strrchr(randpath, '/') + 1,
 | 
			
		||||
			RET_ERR(payload->handle, ALPM_ERR_MEMORY, NULL));
 | 
			
		||||
 | 
			
		||||
	return fp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int curl_download_internal(struct dload_payload *payload,
 | 
			
		||||
		const char *localpath, char **final_file)
 | 
			
		||||
{
 | 
			
		||||
	int ret = -1;
 | 
			
		||||
	FILE *localf = NULL;
 | 
			
		||||
	char *effective_url;
 | 
			
		||||
	/* RFC1123 states applications should support this length */
 | 
			
		||||
	char hostname[256];
 | 
			
		||||
	char error_buffer[CURL_ERROR_SIZE] = {0};
 | 
			
		||||
	struct stat st;
 | 
			
		||||
	long timecond, respcode = 0, remote_time = -1;
 | 
			
		||||
	double remote_size, bytes_dl;
 | 
			
		||||
	struct sigaction orig_sig_pipe, orig_sig_int;
 | 
			
		||||
	/* shortcut to our handle within the payload */
 | 
			
		||||
	alpm_handle_t *handle = payload->handle;
 | 
			
		||||
	CURL *curl = get_libcurl_handle(handle);
 | 
			
		||||
	handle->pm_errno = 0;
 | 
			
		||||
 | 
			
		||||
	payload->tempfile_openmode = "wb";
 | 
			
		||||
	if(!payload->remote_name) {
 | 
			
		||||
		payload->remote_name = strdup(get_filename(payload->fileurl));
 | 
			
		||||
	}
 | 
			
		||||
	if(!payload->remote_name || curl_gethost(payload->fileurl, hostname) != 0) {
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_ERROR, _("url '%s' is invalid\n"), payload->fileurl);
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_SERVER_BAD_URL, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(strlen(payload->remote_name) > 0 && strcmp(payload->remote_name, ".sig") != 0) {
 | 
			
		||||
		payload->destfile_name = get_fullpath(localpath, payload->remote_name, "");
 | 
			
		||||
		payload->tempfile_name = get_fullpath(localpath, payload->remote_name, ".part");
 | 
			
		||||
		if(!payload->destfile_name || !payload->tempfile_name) {
 | 
			
		||||
			goto cleanup;
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		/* URL doesn't contain a filename, so make a tempfile. We can't support
 | 
			
		||||
		 * resuming this kind of download; partial transfers will be destroyed */
 | 
			
		||||
		payload->unlink_on_fail = 1;
 | 
			
		||||
 | 
			
		||||
		localf = create_tempfile(payload, localpath);
 | 
			
		||||
		if(localf == NULL) {
 | 
			
		||||
			goto cleanup;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	curl_set_handle_opts(payload, curl, error_buffer);
 | 
			
		||||
 | 
			
		||||
	if(localf == NULL) {
 | 
			
		||||
		localf = fopen(payload->tempfile_name, payload->tempfile_openmode);
 | 
			
		||||
		if(localf == NULL) {
 | 
			
		||||
			goto cleanup;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG,
 | 
			
		||||
			"opened tempfile for download: %s (%s)\n", payload->tempfile_name,
 | 
			
		||||
			payload->tempfile_openmode);
 | 
			
		||||
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, localf);
 | 
			
		||||
 | 
			
		||||
	/* ignore any SIGPIPE signals- these may occur if our FTP socket dies or
 | 
			
		||||
	 * something along those lines. Store the old signal handler first. */
 | 
			
		||||
	sig_pipe[NEW].sa_handler = SIG_IGN;
 | 
			
		||||
	sigemptyset(&sig_pipe[NEW].sa_mask);
 | 
			
		||||
	sig_pipe[NEW].sa_flags = 0;
 | 
			
		||||
	sigaction(SIGPIPE, NULL, &sig_pipe[OLD]);
 | 
			
		||||
	sigaction(SIGPIPE, &sig_pipe[NEW], NULL);
 | 
			
		||||
	mask_signal(SIGPIPE, SIG_IGN, &orig_sig_pipe);
 | 
			
		||||
	mask_signal(SIGINT, &inthandler, &orig_sig_int);
 | 
			
		||||
 | 
			
		||||
	dload_interrupted = 0;
 | 
			
		||||
	sig_int[NEW].sa_handler = &inthandler;
 | 
			
		||||
	sigemptyset(&sig_int[NEW].sa_mask);
 | 
			
		||||
	sig_int[NEW].sa_flags = 0;
 | 
			
		||||
	sigaction(SIGINT, NULL, &sig_int[OLD]);
 | 
			
		||||
	sigaction(SIGINT, &sig_int[NEW], NULL);
 | 
			
		||||
	/* perform transfer */
 | 
			
		||||
	payload->curlerr = curl_easy_perform(curl);
 | 
			
		||||
 | 
			
		||||
	/* NOTE: libfetch does not reset the error code, be sure to do it before
 | 
			
		||||
	 * calls into the library */
 | 
			
		||||
	/* disconnect relationships from the curl handle for things that might go out
 | 
			
		||||
	 * of scope, but could still be touched on connection teardown.  This really
 | 
			
		||||
	 * only applies to FTP transfers. See FS#26327 for an example. */
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
 | 
			
		||||
	curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *)NULL);
 | 
			
		||||
 | 
			
		||||
	/* TODO: if we call fetchStat() and get a redirect (disabling automagic
 | 
			
		||||
	 * redirect following), we should repeat the file locator stuff and get a new
 | 
			
		||||
	 * filename rather than only base if off the first URL, and then verify
 | 
			
		||||
	 * get_filename() didn't return ''. Of course, libfetch might not even allow
 | 
			
		||||
	 * us to even get that URL...FS#22645. This would allow us to download things
 | 
			
		||||
	 * without totally puking like
 | 
			
		||||
	 * http://www.archlinux.org/packages/community/x86_64/exim/download/ */
 | 
			
		||||
 | 
			
		||||
	/* find out the remote size *and* mtime in one go. there is a lot of
 | 
			
		||||
	 * trouble in trying to do both size and "if-modified-since" logic in a
 | 
			
		||||
	 * non-stat request, so avoid it. */
 | 
			
		||||
	fetchLastErrCode = 0;
 | 
			
		||||
	if(fetchStat(fileurl, &ust, "") == -1) {
 | 
			
		||||
		pm_errno = PM_ERR_LIBFETCH;
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("failed retrieving file '%s' from %s : %s\n"),
 | 
			
		||||
				filename, gethost(fileurl), fetchLastErrString);
 | 
			
		||||
		ret = -1;
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	/* was it a success? */
 | 
			
		||||
	switch(payload->curlerr) {
 | 
			
		||||
		case CURLE_OK:
 | 
			
		||||
			/* get http/ftp response code */
 | 
			
		||||
			curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &respcode);
 | 
			
		||||
			if(respcode >= 400) {
 | 
			
		||||
				payload->unlink_on_fail = 1;
 | 
			
		||||
				goto cleanup;
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		case CURLE_ABORTED_BY_CALLBACK:
 | 
			
		||||
			/* handle the interrupt accordingly */
 | 
			
		||||
			if(dload_interrupted == ABORT_OVER_MAXFILESIZE) {
 | 
			
		||||
				payload->curlerr = CURLE_FILESIZE_EXCEEDED;
 | 
			
		||||
				handle->pm_errno = ALPM_ERR_LIBCURL;
 | 
			
		||||
				/* the hardcoded 'size exceeded' message is same as libcurl's normal */
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_ERROR,
 | 
			
		||||
						_("failed retrieving file '%s' from %s : %s\n"),
 | 
			
		||||
						payload->remote_name, hostname, "Maximum file size exceeded");
 | 
			
		||||
			}
 | 
			
		||||
			goto cleanup;
 | 
			
		||||
		default:
 | 
			
		||||
			/* delete zero length downloads */
 | 
			
		||||
			if(stat(payload->tempfile_name, &st) == 0 && st.st_size == 0) {
 | 
			
		||||
				payload->unlink_on_fail = 1;
 | 
			
		||||
			}
 | 
			
		||||
			if(!payload->errors_ok) {
 | 
			
		||||
				handle->pm_errno = ALPM_ERR_LIBCURL;
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_ERROR,
 | 
			
		||||
						_("failed retrieving file '%s' from %s : %s\n"),
 | 
			
		||||
						payload->remote_name, hostname, error_buffer);
 | 
			
		||||
			} else {
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_DEBUG,
 | 
			
		||||
						"failed retrieving file '%s' from %s : %s\n",
 | 
			
		||||
						payload->remote_name, hostname, error_buffer);
 | 
			
		||||
			}
 | 
			
		||||
			goto cleanup;
 | 
			
		||||
	}
 | 
			
		||||
	check_stop();
 | 
			
		||||
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "ust.mtime: %ld local_time: %ld compare: %ld\n",
 | 
			
		||||
			ust.mtime, local_time, local_time - ust.mtime);
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "ust.size: %jd local_size: %jd compare: %jd\n",
 | 
			
		||||
			(intmax_t)ust.size, (intmax_t)local_size, (intmax_t)(local_size - ust.size));
 | 
			
		||||
	if(!force && ust.mtime && ust.mtime == local_time
 | 
			
		||||
			&& ust.size && ust.size == local_size) {
 | 
			
		||||
		/* the remote time and size values agreed with what we have, so move on
 | 
			
		||||
		 * because there is nothing more to do. */
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "files are identical, skipping %s\n", filename);
 | 
			
		||||
	/* retrieve info about the state of the transfer */
 | 
			
		||||
	curl_easy_getinfo(curl, CURLINFO_FILETIME, &remote_time);
 | 
			
		||||
	curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &remote_size);
 | 
			
		||||
	curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD, &bytes_dl);
 | 
			
		||||
	curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &timecond);
 | 
			
		||||
	curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url);
 | 
			
		||||
 | 
			
		||||
	/* time condition was met and we didn't download anything. we need to
 | 
			
		||||
	 * clean up the 0 byte .part file that's left behind. */
 | 
			
		||||
	if(timecond == 1 && DOUBLE_EQ(bytes_dl, 0)) {
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_DEBUG, "file met time condition\n");
 | 
			
		||||
		ret = 1;
 | 
			
		||||
		unlink(payload->tempfile_name);
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	}
 | 
			
		||||
	if(!ust.mtime || ust.mtime != local_time) {
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "mtimes were different or unavailable, downloading %s from beginning\n", filename);
 | 
			
		||||
		fileurl->offset = 0;
 | 
			
		||||
 | 
			
		||||
	/* remote_size isn't necessarily the full size of the file, just what the
 | 
			
		||||
	 * server reported as remaining to download. compare it to what curl reported
 | 
			
		||||
	 * as actually being transferred during curl_easy_perform() */
 | 
			
		||||
	if(!DOUBLE_EQ(remote_size, -1) && !DOUBLE_EQ(bytes_dl, -1) &&
 | 
			
		||||
			!DOUBLE_EQ(bytes_dl, remote_size)) {
 | 
			
		||||
		handle->pm_errno = ALPM_ERR_RETRIEVE;
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_ERROR, _("%s appears to be truncated: %jd/%jd bytes\n"),
 | 
			
		||||
				payload->remote_name, (intmax_t)bytes_dl, (intmax_t)remote_size);
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fetchLastErrCode = 0;
 | 
			
		||||
	dlf = fetchGet(fileurl, "");
 | 
			
		||||
	check_stop();
 | 
			
		||||
 | 
			
		||||
	if(fetchLastErrCode != 0 || dlf == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_LIBFETCH;
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("failed retrieving file '%s' from %s : %s\n"),
 | 
			
		||||
				filename, gethost(fileurl), fetchLastErrString);
 | 
			
		||||
		ret = -1;
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	if(payload->content_disp_name) {
 | 
			
		||||
		/* content-disposition header has a better name for our file */
 | 
			
		||||
		free(payload->destfile_name);
 | 
			
		||||
		payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, "");
 | 
			
		||||
	} else {
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "connected to %s successfully\n", fileurl->host);
 | 
			
		||||
	}
 | 
			
		||||
		const char *effective_filename = strrchr(effective_url, '/');
 | 
			
		||||
		if(effective_filename && strlen(effective_filename) > 2) {
 | 
			
		||||
			effective_filename++;
 | 
			
		||||
 | 
			
		||||
	if(localf && fileurl->offset == 0) {
 | 
			
		||||
		_alpm_log(PM_LOG_WARNING, _("resuming download of %s not possible; starting over\n"), filename);
 | 
			
		||||
		fclose(localf);
 | 
			
		||||
		localf = NULL;
 | 
			
		||||
	} else if(fileurl->offset) {
 | 
			
		||||
		_alpm_log(PM_LOG_DEBUG, "resuming download at position %jd\n", (intmax_t)fileurl->offset);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	if(localf == NULL) {
 | 
			
		||||
		_alpm_rmrf(tempfile);
 | 
			
		||||
		fileurl->offset = (off_t)0;
 | 
			
		||||
		dl_thisfile = 0;
 | 
			
		||||
		localf = fopen(tempfile, "wb");
 | 
			
		||||
		if(localf == NULL) { /* still null? */
 | 
			
		||||
			pm_errno = PM_ERR_RETRIEVE;
 | 
			
		||||
			_alpm_log(PM_LOG_ERROR, _("error writing to file '%s': %s\n"),
 | 
			
		||||
					tempfile, strerror(errno));
 | 
			
		||||
			ret = -1;
 | 
			
		||||
			goto cleanup;
 | 
			
		||||
			/* if destfile was never set, we wrote to a tempfile. even if destfile is
 | 
			
		||||
			 * set, we may have followed some redirects and the effective url may
 | 
			
		||||
			 * have a better suggestion as to what to name our file. in either case,
 | 
			
		||||
			 * refactor destfile to this newly derived name. */
 | 
			
		||||
			if(!payload->destfile_name || strcmp(effective_filename,
 | 
			
		||||
						strrchr(payload->destfile_name, '/') + 1) != 0) {
 | 
			
		||||
				free(payload->destfile_name);
 | 
			
		||||
				payload->destfile_name = get_fullpath(localpath, effective_filename, "");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Progress 0 - initialize */
 | 
			
		||||
	if(handle->dlcb) {
 | 
			
		||||
		handle->dlcb(filename, 0, ust.size);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while((nread = fetchIO_read(dlf, buffer, PM_DLBUF_LEN)) > 0) {
 | 
			
		||||
		check_stop();
 | 
			
		||||
		size_t nwritten = 0;
 | 
			
		||||
		nwritten = fwrite(buffer, 1, (size_t)nread, localf);
 | 
			
		||||
		if((nwritten != (size_t)nread) || ferror(localf)) {
 | 
			
		||||
			pm_errno = PM_ERR_RETRIEVE;
 | 
			
		||||
			_alpm_log(PM_LOG_ERROR, _("error writing to file '%s': %s\n"),
 | 
			
		||||
					tempfile, strerror(errno));
 | 
			
		||||
			ret = -1;
 | 
			
		||||
			goto cleanup;
 | 
			
		||||
		}
 | 
			
		||||
		dl_thisfile += nread;
 | 
			
		||||
 | 
			
		||||
		if(handle->dlcb) {
 | 
			
		||||
			handle->dlcb(filename, dl_thisfile, ust.size);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* did the transfer complete normally? */
 | 
			
		||||
	if (nread == -1) {
 | 
			
		||||
		/* not PM_ERR_LIBFETCH here because libfetch error string might be empty */
 | 
			
		||||
		pm_errno = PM_ERR_RETRIEVE;
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("failed retrieving file '%s' from %s\n"),
 | 
			
		||||
				filename, gethost(fileurl));
 | 
			
		||||
		ret = -1;
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ust.size != -1 && dl_thisfile < ust.size) {
 | 
			
		||||
		pm_errno = PM_ERR_RETRIEVE;
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("%s appears to be truncated: %jd/%jd bytes\n"),
 | 
			
		||||
				filename, (intmax_t)dl_thisfile, (intmax_t)ust.size);
 | 
			
		||||
		ret = -1;
 | 
			
		||||
		goto cleanup;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* probably safer to close the file descriptors now before renaming the file,
 | 
			
		||||
	 * for example to make sure the buffers are flushed.
 | 
			
		||||
	 */
 | 
			
		||||
	fclose(localf);
 | 
			
		||||
	localf = NULL;
 | 
			
		||||
	fetchIO_close(dlf);
 | 
			
		||||
	dlf = NULL;
 | 
			
		||||
 | 
			
		||||
	/* set the times on the file to the same as that of the remote file */
 | 
			
		||||
	if(ust.mtime) {
 | 
			
		||||
		struct timeval tv[2];
 | 
			
		||||
		memset(&tv, 0, sizeof(tv));
 | 
			
		||||
		tv[0].tv_sec = ust.atime;
 | 
			
		||||
		tv[1].tv_sec = ust.mtime;
 | 
			
		||||
		utimes(tempfile, tv);
 | 
			
		||||
	}
 | 
			
		||||
	if(rename(tempfile, destfile)) {
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("could not rename %s to %s (%s)\n"),
 | 
			
		||||
				tempfile, destfile, strerror(errno));
 | 
			
		||||
		ret = -1;
 | 
			
		||||
	}
 | 
			
		||||
	ret = 0;
 | 
			
		||||
 | 
			
		||||
cleanup:
 | 
			
		||||
	FREE(tempfile);
 | 
			
		||||
	FREE(destfile);
 | 
			
		||||
	if(localf != NULL) {
 | 
			
		||||
		/* if we still had a local file open, we got interrupted. set the mtimes on
 | 
			
		||||
		 * the file accordingly. */
 | 
			
		||||
		fflush(localf);
 | 
			
		||||
		if(ust.mtime) {
 | 
			
		||||
			struct timeval tv[2];
 | 
			
		||||
			memset(&tv, 0, sizeof(tv));
 | 
			
		||||
			tv[0].tv_sec = ust.atime;
 | 
			
		||||
			tv[1].tv_sec = ust.mtime;
 | 
			
		||||
			futimes(fileno(localf), tv);
 | 
			
		||||
		}
 | 
			
		||||
		fclose(localf);
 | 
			
		||||
		utimes_long(payload->tempfile_name, remote_time);
 | 
			
		||||
	}
 | 
			
		||||
	if(dlf != NULL) {
 | 
			
		||||
		fetchIO_close(dlf);
 | 
			
		||||
 | 
			
		||||
	if(ret == 0) {
 | 
			
		||||
		const char *realname = payload->tempfile_name;
 | 
			
		||||
		if(payload->destfile_name) {
 | 
			
		||||
			realname = payload->destfile_name;
 | 
			
		||||
			if(rename(payload->tempfile_name, payload->destfile_name)) {
 | 
			
		||||
				_alpm_log(handle, ALPM_LOG_ERROR, _("could not rename %s to %s (%s)\n"),
 | 
			
		||||
						payload->tempfile_name, payload->destfile_name, strerror(errno));
 | 
			
		||||
				ret = -1;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(ret != -1 && final_file) {
 | 
			
		||||
			STRDUP(*final_file, strrchr(realname, '/') + 1,
 | 
			
		||||
					RET_ERR(handle, ALPM_ERR_MEMORY, -1));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if((ret == -1 || dload_interrupted) && payload->unlink_on_fail &&
 | 
			
		||||
			payload->tempfile_name) {
 | 
			
		||||
		unlink(payload->tempfile_name);
 | 
			
		||||
	}
 | 
			
		||||
	fetchFreeURL(fileurl);
 | 
			
		||||
 | 
			
		||||
	/* restore the old signal handlers */
 | 
			
		||||
	sigaction(SIGINT, &sig_int[OLD], NULL);
 | 
			
		||||
	sigaction(SIGPIPE, &sig_pipe[OLD], NULL);
 | 
			
		||||
	unmask_signal(SIGINT, orig_sig_int);
 | 
			
		||||
	unmask_signal(SIGPIPE, orig_sig_pipe);
 | 
			
		||||
	/* if we were interrupted, trip the old handler */
 | 
			
		||||
	if(dload_interrupted) {
 | 
			
		||||
		raise(SIGINT);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(ret);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static int download(const char *url, const char *localpath,
 | 
			
		||||
		int force) {
 | 
			
		||||
/** Download a file given by a URL to a local directory.
 | 
			
		||||
 * Does not overwrite an existing file if the download fails.
 | 
			
		||||
 * @param payload the payload context
 | 
			
		||||
 * @param localpath the directory to save the file in
 | 
			
		||||
 * @param final_file the real name of the downloaded file (may be NULL)
 | 
			
		||||
 * @return 0 on success, -1 on error (pm_errno is set accordingly if errors_ok == 0)
 | 
			
		||||
 */
 | 
			
		||||
int _alpm_download(struct dload_payload *payload, const char *localpath,
 | 
			
		||||
		char **final_file)
 | 
			
		||||
{
 | 
			
		||||
	alpm_handle_t *handle = payload->handle;
 | 
			
		||||
 | 
			
		||||
	if(handle->fetchcb == NULL) {
 | 
			
		||||
#ifdef HAVE_LIBFETCH
 | 
			
		||||
		return(download_internal(url, localpath, force));
 | 
			
		||||
#ifdef HAVE_LIBCURL
 | 
			
		||||
		return curl_download_internal(payload, localpath, final_file);
 | 
			
		||||
#else
 | 
			
		||||
		RET_ERR(PM_ERR_EXTERNAL_DOWNLOAD, -1);
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_EXTERNAL_DOWNLOAD, -1);
 | 
			
		||||
#endif
 | 
			
		||||
	} else {
 | 
			
		||||
		int ret = handle->fetchcb(url, localpath, force);
 | 
			
		||||
		if(ret == -1) {
 | 
			
		||||
			RET_ERR(PM_ERR_EXTERNAL_DOWNLOAD, -1);
 | 
			
		||||
		int ret = handle->fetchcb(payload->fileurl, localpath, payload->force);
 | 
			
		||||
		if(ret == -1 && !payload->errors_ok) {
 | 
			
		||||
			RET_ERR(handle, ALPM_ERR_EXTERNAL_DOWNLOAD, -1);
 | 
			
		||||
		}
 | 
			
		||||
		return(ret);
 | 
			
		||||
		return ret;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Download a single file
 | 
			
		||||
 *   - servers must be a list of urls WITHOUT trailing slashes.
 | 
			
		||||
 *
 | 
			
		||||
 * RETURN:  0 for successful download
 | 
			
		||||
 *          1 if the files are identical
 | 
			
		||||
 *         -1 on error
 | 
			
		||||
 */
 | 
			
		||||
int _alpm_download_single_file(const char *filename,
 | 
			
		||||
		alpm_list_t *servers, const char *localpath,
 | 
			
		||||
		int force)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
	int ret = -1;
 | 
			
		||||
 | 
			
		||||
	ASSERT(servers != NULL, RET_ERR(PM_ERR_SERVER_NONE, -1));
 | 
			
		||||
 | 
			
		||||
	for(i = servers; i; i = i->next) {
 | 
			
		||||
		const char *server = i->data;
 | 
			
		||||
		char *fileurl = NULL;
 | 
			
		||||
		size_t len;
 | 
			
		||||
 | 
			
		||||
		/* print server + filename into a buffer */
 | 
			
		||||
		len = strlen(server) + strlen(filename) + 2;
 | 
			
		||||
		CALLOC(fileurl, len, sizeof(char), RET_ERR(PM_ERR_MEMORY, -1));
 | 
			
		||||
		snprintf(fileurl, len, "%s/%s", server, filename);
 | 
			
		||||
 | 
			
		||||
		ret = download(fileurl, localpath, force);
 | 
			
		||||
		FREE(fileurl);
 | 
			
		||||
		if(ret != -1) {
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(ret);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int _alpm_download_files(alpm_list_t *files,
 | 
			
		||||
		alpm_list_t *servers, const char *localpath)
 | 
			
		||||
{
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
	alpm_list_t *lp;
 | 
			
		||||
 | 
			
		||||
	for(lp = files; lp; lp = lp->next) {
 | 
			
		||||
		char *filename = lp->data;
 | 
			
		||||
		if(_alpm_download_single_file(filename, servers,
 | 
			
		||||
					localpath, 0) == -1) {
 | 
			
		||||
			ret++;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(ret);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Fetch a remote pkg. */
 | 
			
		||||
char SYMEXPORT *alpm_fetch_pkgurl(const char *url)
 | 
			
		||||
char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url)
 | 
			
		||||
{
 | 
			
		||||
	char *filename, *filepath;
 | 
			
		||||
	char *filepath;
 | 
			
		||||
	const char *cachedir;
 | 
			
		||||
	char *final_file = NULL;
 | 
			
		||||
	struct dload_payload payload;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	filename = get_filename(url);
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	ASSERT(url, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, NULL));
 | 
			
		||||
 | 
			
		||||
	/* find a valid cache dir to download to */
 | 
			
		||||
	cachedir = _alpm_filecache_setup();
 | 
			
		||||
	cachedir = _alpm_filecache_setup(handle);
 | 
			
		||||
 | 
			
		||||
	memset(&payload, 0, sizeof(struct dload_payload));
 | 
			
		||||
	payload.handle = handle;
 | 
			
		||||
	STRDUP(payload.fileurl, url, RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
 | 
			
		||||
	payload.allow_resume = 1;
 | 
			
		||||
 | 
			
		||||
	/* download the file */
 | 
			
		||||
	ret = download(url, cachedir, 0);
 | 
			
		||||
	ret = _alpm_download(&payload, cachedir, &final_file);
 | 
			
		||||
	_alpm_dload_payload_reset(&payload);
 | 
			
		||||
	if(ret == -1) {
 | 
			
		||||
		_alpm_log(PM_LOG_WARNING, _("failed to download %s\n"), url);
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		_alpm_log(handle, ALPM_LOG_WARNING, _("failed to download %s\n"), url);
 | 
			
		||||
		free(final_file);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "successfully downloaded %s\n", url);
 | 
			
		||||
 | 
			
		||||
	/* attempt to download the signature */
 | 
			
		||||
	if(ret == 0 && (handle->siglevel & ALPM_SIG_PACKAGE)) {
 | 
			
		||||
		char *sig_final_file = NULL;
 | 
			
		||||
		size_t len;
 | 
			
		||||
 | 
			
		||||
		len = strlen(url) + 5;
 | 
			
		||||
		MALLOC(payload.fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
 | 
			
		||||
		snprintf(payload.fileurl, len, "%s.sig", url);
 | 
			
		||||
		payload.handle = handle;
 | 
			
		||||
		payload.force = 1;
 | 
			
		||||
		payload.errors_ok = (handle->siglevel & ALPM_SIG_PACKAGE_OPTIONAL);
 | 
			
		||||
 | 
			
		||||
		ret = _alpm_download(&payload, cachedir, &sig_final_file);
 | 
			
		||||
		if(ret == -1 && !payload.errors_ok) {
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_WARNING,
 | 
			
		||||
					_("failed to download %s\n"), payload.fileurl);
 | 
			
		||||
			/* Warn now, but don't return NULL. We will fail later during package
 | 
			
		||||
			 * load time. */
 | 
			
		||||
		} else if(ret == 0) {
 | 
			
		||||
			_alpm_log(handle, ALPM_LOG_DEBUG,
 | 
			
		||||
					"successfully downloaded %s\n", payload.fileurl);
 | 
			
		||||
		}
 | 
			
		||||
		FREE(sig_final_file);
 | 
			
		||||
		_alpm_dload_payload_reset(&payload);
 | 
			
		||||
	}
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "successfully downloaded %s\n", url);
 | 
			
		||||
 | 
			
		||||
	/* we should be able to find the file the second time around */
 | 
			
		||||
	filepath = _alpm_filecache_find(filename);
 | 
			
		||||
	return(filepath);
 | 
			
		||||
	filepath = _alpm_filecache_find(handle, final_file);
 | 
			
		||||
	free(final_file);
 | 
			
		||||
 | 
			
		||||
	return filepath;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_dload_payload_reset(struct dload_payload *payload)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(payload, return);
 | 
			
		||||
 | 
			
		||||
	FREE(payload->remote_name);
 | 
			
		||||
	FREE(payload->tempfile_name);
 | 
			
		||||
	FREE(payload->destfile_name);
 | 
			
		||||
	FREE(payload->content_disp_name);
 | 
			
		||||
	FREE(payload->fileurl);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -25,14 +25,28 @@
 | 
			
		||||
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#define PM_DLBUF_LEN (1024 * 16)
 | 
			
		||||
struct dload_payload {
 | 
			
		||||
	alpm_handle_t *handle;
 | 
			
		||||
	const char *tempfile_openmode;
 | 
			
		||||
	char *remote_name;
 | 
			
		||||
	char *tempfile_name;
 | 
			
		||||
	char *destfile_name;
 | 
			
		||||
	char *content_disp_name;
 | 
			
		||||
	char *fileurl;
 | 
			
		||||
	off_t initial_size;
 | 
			
		||||
	off_t max_size;
 | 
			
		||||
	off_t prevprogress;
 | 
			
		||||
	int force;
 | 
			
		||||
	int allow_resume;
 | 
			
		||||
	int errors_ok;
 | 
			
		||||
	int unlink_on_fail;
 | 
			
		||||
	CURLcode curlerr;       /* last error produced by curl */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int _alpm_download_single_file(const char *filename,
 | 
			
		||||
		alpm_list_t *servers, const char *localpath,
 | 
			
		||||
		int force);
 | 
			
		||||
void _alpm_dload_payload_reset(struct dload_payload *payload);
 | 
			
		||||
 | 
			
		||||
int _alpm_download_files(alpm_list_t *files,
 | 
			
		||||
		alpm_list_t *servers, const char *localpath);
 | 
			
		||||
int _alpm_download(struct dload_payload *payload, const char *localpath,
 | 
			
		||||
		char **final_file);
 | 
			
		||||
 | 
			
		||||
#endif /* _ALPM_DLOAD_H */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,141 +20,142 @@
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
/* TODO: needed for the libfetch stuff, unfortunately- we should kill it */
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
/* the following two are needed for FreeBSD's libfetch */
 | 
			
		||||
#include <limits.h> /* PATH_MAX */
 | 
			
		||||
#if defined(HAVE_SYS_PARAM_H)
 | 
			
		||||
#include <sys/param.h> /* MAXHOSTNAMELEN */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBFETCH
 | 
			
		||||
#include <fetch.h> /* fetchLastErrString */
 | 
			
		||||
#ifdef HAVE_LIBCURL
 | 
			
		||||
#include <curl/curl.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* libalpm */
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
#include "handle.h"
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_strerrorlast(void)
 | 
			
		||||
enum _alpm_errno_t SYMEXPORT alpm_errno(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	return alpm_strerror(pm_errno);
 | 
			
		||||
	return handle->pm_errno;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_strerror(int err)
 | 
			
		||||
const char SYMEXPORT *alpm_strerror(enum _alpm_errno_t err)
 | 
			
		||||
{
 | 
			
		||||
	switch(err) {
 | 
			
		||||
		/* System */
 | 
			
		||||
		case PM_ERR_MEMORY:
 | 
			
		||||
		case ALPM_ERR_MEMORY:
 | 
			
		||||
			return _("out of memory!");
 | 
			
		||||
		case PM_ERR_SYSTEM:
 | 
			
		||||
		case ALPM_ERR_SYSTEM:
 | 
			
		||||
			return _("unexpected system error");
 | 
			
		||||
		case PM_ERR_BADPERMS:
 | 
			
		||||
		case ALPM_ERR_BADPERMS:
 | 
			
		||||
			return _("insufficient privileges");
 | 
			
		||||
		case PM_ERR_NOT_A_FILE:
 | 
			
		||||
		case ALPM_ERR_NOT_A_FILE:
 | 
			
		||||
			return _("could not find or read file");
 | 
			
		||||
		case PM_ERR_NOT_A_DIR:
 | 
			
		||||
		case ALPM_ERR_NOT_A_DIR:
 | 
			
		||||
			return _("could not find or read directory");
 | 
			
		||||
		case PM_ERR_WRONG_ARGS:
 | 
			
		||||
		case ALPM_ERR_WRONG_ARGS:
 | 
			
		||||
			return _("wrong or NULL argument passed");
 | 
			
		||||
		case PM_ERR_DISK_SPACE:
 | 
			
		||||
		case ALPM_ERR_DISK_SPACE:
 | 
			
		||||
			return _("not enough free disk space");
 | 
			
		||||
		/* Interface */
 | 
			
		||||
		case PM_ERR_HANDLE_NULL:
 | 
			
		||||
		case ALPM_ERR_HANDLE_NULL:
 | 
			
		||||
			return _("library not initialized");
 | 
			
		||||
		case PM_ERR_HANDLE_NOT_NULL:
 | 
			
		||||
		case ALPM_ERR_HANDLE_NOT_NULL:
 | 
			
		||||
			return _("library already initialized");
 | 
			
		||||
		case PM_ERR_HANDLE_LOCK:
 | 
			
		||||
		case ALPM_ERR_HANDLE_LOCK:
 | 
			
		||||
			return _("unable to lock database");
 | 
			
		||||
		/* Databases */
 | 
			
		||||
		case PM_ERR_DB_OPEN:
 | 
			
		||||
		case ALPM_ERR_DB_OPEN:
 | 
			
		||||
			return _("could not open database");
 | 
			
		||||
		case PM_ERR_DB_CREATE:
 | 
			
		||||
		case ALPM_ERR_DB_CREATE:
 | 
			
		||||
			return _("could not create database");
 | 
			
		||||
		case PM_ERR_DB_NULL:
 | 
			
		||||
		case ALPM_ERR_DB_NULL:
 | 
			
		||||
			return _("database not initialized");
 | 
			
		||||
		case PM_ERR_DB_NOT_NULL:
 | 
			
		||||
		case ALPM_ERR_DB_NOT_NULL:
 | 
			
		||||
			return _("database already registered");
 | 
			
		||||
		case PM_ERR_DB_NOT_FOUND:
 | 
			
		||||
		case ALPM_ERR_DB_NOT_FOUND:
 | 
			
		||||
			return _("could not find database");
 | 
			
		||||
		case PM_ERR_DB_VERSION:
 | 
			
		||||
		case ALPM_ERR_DB_INVALID:
 | 
			
		||||
			return _("invalid or corrupted database");
 | 
			
		||||
		case ALPM_ERR_DB_INVALID_SIG:
 | 
			
		||||
			return _("invalid or corrupted database (PGP signature)");
 | 
			
		||||
		case ALPM_ERR_DB_VERSION:
 | 
			
		||||
			return _("database is incorrect version");
 | 
			
		||||
		case PM_ERR_DB_WRITE:
 | 
			
		||||
		case ALPM_ERR_DB_WRITE:
 | 
			
		||||
			return _("could not update database");
 | 
			
		||||
		case PM_ERR_DB_REMOVE:
 | 
			
		||||
		case ALPM_ERR_DB_REMOVE:
 | 
			
		||||
			return _("could not remove database entry");
 | 
			
		||||
		/* Servers */
 | 
			
		||||
		case PM_ERR_SERVER_BAD_URL:
 | 
			
		||||
		case ALPM_ERR_SERVER_BAD_URL:
 | 
			
		||||
			return _("invalid url for server");
 | 
			
		||||
		case PM_ERR_SERVER_NONE:
 | 
			
		||||
		case ALPM_ERR_SERVER_NONE:
 | 
			
		||||
			return _("no servers configured for repository");
 | 
			
		||||
		/* Transactions */
 | 
			
		||||
		case PM_ERR_TRANS_NOT_NULL:
 | 
			
		||||
		case ALPM_ERR_TRANS_NOT_NULL:
 | 
			
		||||
			return _("transaction already initialized");
 | 
			
		||||
		case PM_ERR_TRANS_NULL:
 | 
			
		||||
		case ALPM_ERR_TRANS_NULL:
 | 
			
		||||
			return _("transaction not initialized");
 | 
			
		||||
		case PM_ERR_TRANS_DUP_TARGET:
 | 
			
		||||
		case ALPM_ERR_TRANS_DUP_TARGET:
 | 
			
		||||
			return _("duplicate target");
 | 
			
		||||
		case PM_ERR_TRANS_NOT_INITIALIZED:
 | 
			
		||||
		case ALPM_ERR_TRANS_NOT_INITIALIZED:
 | 
			
		||||
			return _("transaction not initialized");
 | 
			
		||||
		case PM_ERR_TRANS_NOT_PREPARED:
 | 
			
		||||
		case ALPM_ERR_TRANS_NOT_PREPARED:
 | 
			
		||||
			return _("transaction not prepared");
 | 
			
		||||
		case PM_ERR_TRANS_ABORT:
 | 
			
		||||
		case ALPM_ERR_TRANS_ABORT:
 | 
			
		||||
			return _("transaction aborted");
 | 
			
		||||
		case PM_ERR_TRANS_TYPE:
 | 
			
		||||
		case ALPM_ERR_TRANS_TYPE:
 | 
			
		||||
			return _("operation not compatible with the transaction type");
 | 
			
		||||
		case PM_ERR_TRANS_NOT_LOCKED:
 | 
			
		||||
		case ALPM_ERR_TRANS_NOT_LOCKED:
 | 
			
		||||
			return _("transaction commit attempt when database is not locked");
 | 
			
		||||
		/* Packages */
 | 
			
		||||
		case PM_ERR_PKG_NOT_FOUND:
 | 
			
		||||
		case ALPM_ERR_PKG_NOT_FOUND:
 | 
			
		||||
			return _("could not find or read package");
 | 
			
		||||
		case PM_ERR_PKG_IGNORED:
 | 
			
		||||
		case ALPM_ERR_PKG_IGNORED:
 | 
			
		||||
			return _("operation cancelled due to ignorepkg");
 | 
			
		||||
		case PM_ERR_PKG_INVALID:
 | 
			
		||||
		case ALPM_ERR_PKG_INVALID:
 | 
			
		||||
			return _("invalid or corrupted package");
 | 
			
		||||
		case PM_ERR_PKG_OPEN:
 | 
			
		||||
		case ALPM_ERR_PKG_INVALID_CHECKSUM:
 | 
			
		||||
			return _("invalid or corrupted package (checksum)");
 | 
			
		||||
		case ALPM_ERR_PKG_INVALID_SIG:
 | 
			
		||||
			return _("invalid or corrupted package (PGP signature)");
 | 
			
		||||
		case ALPM_ERR_PKG_OPEN:
 | 
			
		||||
			return _("cannot open package file");
 | 
			
		||||
		case PM_ERR_PKG_CANT_REMOVE:
 | 
			
		||||
		case ALPM_ERR_PKG_CANT_REMOVE:
 | 
			
		||||
			return _("cannot remove all files for package");
 | 
			
		||||
		case PM_ERR_PKG_INVALID_NAME:
 | 
			
		||||
		case ALPM_ERR_PKG_INVALID_NAME:
 | 
			
		||||
			return _("package filename is not valid");
 | 
			
		||||
		case PM_ERR_PKG_INVALID_ARCH:
 | 
			
		||||
		case ALPM_ERR_PKG_INVALID_ARCH:
 | 
			
		||||
			return _("package architecture is not valid");
 | 
			
		||||
		case PM_ERR_PKG_REPO_NOT_FOUND:
 | 
			
		||||
		case ALPM_ERR_PKG_REPO_NOT_FOUND:
 | 
			
		||||
			return _("could not find repository for target");
 | 
			
		||||
		/* Signatures */
 | 
			
		||||
		case ALPM_ERR_SIG_MISSING:
 | 
			
		||||
			return _("missing PGP signature");
 | 
			
		||||
		case ALPM_ERR_SIG_INVALID:
 | 
			
		||||
			return _("invalid PGP signature");
 | 
			
		||||
		/* Deltas */
 | 
			
		||||
		case PM_ERR_DLT_INVALID:
 | 
			
		||||
		case ALPM_ERR_DLT_INVALID:
 | 
			
		||||
			return _("invalid or corrupted delta");
 | 
			
		||||
		case PM_ERR_DLT_PATCHFAILED:
 | 
			
		||||
		case ALPM_ERR_DLT_PATCHFAILED:
 | 
			
		||||
			return _("delta patch failed");
 | 
			
		||||
		/* Dependencies */
 | 
			
		||||
		case PM_ERR_UNSATISFIED_DEPS:
 | 
			
		||||
		case ALPM_ERR_UNSATISFIED_DEPS:
 | 
			
		||||
			return _("could not satisfy dependencies");
 | 
			
		||||
		case PM_ERR_CONFLICTING_DEPS:
 | 
			
		||||
		case ALPM_ERR_CONFLICTING_DEPS:
 | 
			
		||||
			return _("conflicting dependencies");
 | 
			
		||||
		case PM_ERR_FILE_CONFLICTS:
 | 
			
		||||
		case ALPM_ERR_FILE_CONFLICTS:
 | 
			
		||||
			return _("conflicting files");
 | 
			
		||||
		/* Miscellaenous */
 | 
			
		||||
		case PM_ERR_RETRIEVE:
 | 
			
		||||
		case ALPM_ERR_RETRIEVE:
 | 
			
		||||
			return _("failed to retrieve some files");
 | 
			
		||||
		case PM_ERR_WRITE:
 | 
			
		||||
			return _("failed to copy some file");
 | 
			
		||||
		case PM_ERR_INVALID_REGEX:
 | 
			
		||||
		case ALPM_ERR_INVALID_REGEX:
 | 
			
		||||
			return _("invalid regular expression");
 | 
			
		||||
		/* Errors from external libraries- our own wrapper error */
 | 
			
		||||
		case PM_ERR_LIBARCHIVE:
 | 
			
		||||
		case ALPM_ERR_LIBARCHIVE:
 | 
			
		||||
			/* it would be nice to use archive_error_string() here, but that
 | 
			
		||||
			 * requires the archive struct, so we can't. Just use a generic
 | 
			
		||||
			 * error string instead. */
 | 
			
		||||
			return _("libarchive error");
 | 
			
		||||
		case PM_ERR_LIBFETCH:
 | 
			
		||||
#ifdef HAVE_LIBFETCH
 | 
			
		||||
			return fetchLastErrString;
 | 
			
		||||
#else
 | 
			
		||||
			/* obviously shouldn't get here... */
 | 
			
		||||
		case ALPM_ERR_LIBCURL:
 | 
			
		||||
			return _("download library error");
 | 
			
		||||
#endif
 | 
			
		||||
		case PM_ERR_EXTERNAL_DOWNLOAD:
 | 
			
		||||
		case ALPM_ERR_GPGME:
 | 
			
		||||
			return _("gpgme error");
 | 
			
		||||
		case ALPM_ERR_EXTERNAL_DOWNLOAD:
 | 
			
		||||
			return _("error invoking external downloader");
 | 
			
		||||
		/* Unknown error! */
 | 
			
		||||
		default:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										41
									
								
								lib/libalpm/graph.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								lib/libalpm/graph.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
/*
 | 
			
		||||
 *  graph.c - helpful graph structure and setup/teardown methods
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (c) 2007-2011 Pacman Development Team <pacman-dev@archlinux.org>
 | 
			
		||||
 *
 | 
			
		||||
 *  This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU General Public License as published by
 | 
			
		||||
 *  the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 *  (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 *  This program is distributed in the hope that it will be useful,
 | 
			
		||||
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 *  GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 *  You should have received a copy of the GNU General Public License
 | 
			
		||||
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
#include "graph.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
alpm_graph_t *_alpm_graph_new(void)
 | 
			
		||||
{
 | 
			
		||||
	alpm_graph_t *graph = NULL;
 | 
			
		||||
 | 
			
		||||
	CALLOC(graph, 1, sizeof(alpm_graph_t), return NULL);
 | 
			
		||||
	return graph;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_graph_free(void *data)
 | 
			
		||||
{
 | 
			
		||||
	alpm_graph_t *graph = data;
 | 
			
		||||
	alpm_list_free(graph->children);
 | 
			
		||||
	free(graph);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
@@ -1,8 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 *  graph.h - helpful graph structure and setup/teardown methods
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (c) 2006-2011 Pacman Development Team <pacman-dev@archlinux.org>
 | 
			
		||||
 *  Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
 | 
			
		||||
 *  Copyright (c) 2007-2011 Pacman Development Team <pacman-dev@archlinux.org>
 | 
			
		||||
 *
 | 
			
		||||
 *  This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -17,34 +16,27 @@
 | 
			
		||||
 *  You should have received a copy of the GNU General Public License
 | 
			
		||||
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef _ALPM_GRAPH_H
 | 
			
		||||
#define _ALPM_GRAPH_H
 | 
			
		||||
 | 
			
		||||
#include "config.h" /* ensure off_t is correct length */
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h> /* off_t */
 | 
			
		||||
 | 
			
		||||
#include "alpm_list.h"
 | 
			
		||||
#include "util.h" /* CALLOC() */
 | 
			
		||||
 | 
			
		||||
struct __pmgraph_t {
 | 
			
		||||
typedef struct __alpm_graph_t {
 | 
			
		||||
	char state; /* 0: untouched, -1: entered, other: leaving time */
 | 
			
		||||
	void *data;
 | 
			
		||||
	off_t weight; /* weight of the node */
 | 
			
		||||
	struct __pmgraph_t *parent; /* where did we come from? */
 | 
			
		||||
	void *data;
 | 
			
		||||
	struct __alpm_graph_t *parent; /* where did we come from? */
 | 
			
		||||
	alpm_list_t *children;
 | 
			
		||||
	alpm_list_t *childptr; /* points to a child in children list */
 | 
			
		||||
};
 | 
			
		||||
typedef struct __pmgraph_t pmgraph_t;
 | 
			
		||||
} alpm_graph_t;
 | 
			
		||||
 | 
			
		||||
static pmgraph_t *_alpm_graph_new(void)
 | 
			
		||||
{
 | 
			
		||||
	pmgraph_t *graph = NULL;
 | 
			
		||||
alpm_graph_t *_alpm_graph_new(void);
 | 
			
		||||
void _alpm_graph_free(void *data);
 | 
			
		||||
 | 
			
		||||
	CALLOC(graph, 1, sizeof(pmgraph_t), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	return(graph);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void _alpm_graph_free(void *data)
 | 
			
		||||
{
 | 
			
		||||
	pmgraph_t *graph = data;
 | 
			
		||||
	alpm_list_free(graph->children);
 | 
			
		||||
	free(graph);
 | 
			
		||||
}
 | 
			
		||||
#endif /* _ALPM_GRAPH_H */
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,6 @@
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
/* libalpm */
 | 
			
		||||
@@ -31,22 +30,18 @@
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
 | 
			
		||||
pmgrp_t *_alpm_grp_new(const char *name)
 | 
			
		||||
alpm_group_t *_alpm_group_new(const char *name)
 | 
			
		||||
{
 | 
			
		||||
	pmgrp_t* grp;
 | 
			
		||||
	alpm_group_t* grp;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	CALLOC(grp, 1, sizeof(alpm_group_t), return NULL);
 | 
			
		||||
	STRDUP(grp->name, name, free(grp); return NULL);
 | 
			
		||||
 | 
			
		||||
	CALLOC(grp, 1, sizeof(pmgrp_t), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	STRDUP(grp->name, name, RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
 | 
			
		||||
	return(grp);
 | 
			
		||||
	return grp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_grp_free(pmgrp_t *grp)
 | 
			
		||||
void _alpm_group_free(alpm_group_t *grp)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(grp == NULL) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
@@ -57,23 +52,4 @@ void _alpm_grp_free(pmgrp_t *grp)
 | 
			
		||||
	FREE(grp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_grp_get_name(const pmgrp_t *grp)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(grp != NULL, return(NULL));
 | 
			
		||||
 | 
			
		||||
	return grp->name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_grp_get_pkgs(const pmgrp_t *grp)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(grp != NULL, return(NULL));
 | 
			
		||||
 | 
			
		||||
	return grp->packages;
 | 
			
		||||
}
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -22,15 +22,8 @@
 | 
			
		||||
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
 | 
			
		||||
struct __pmgrp_t {
 | 
			
		||||
	/** group name */
 | 
			
		||||
	char *name;
 | 
			
		||||
	/** list of pmpkg_t packages */
 | 
			
		||||
	alpm_list_t *packages;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
pmgrp_t *_alpm_grp_new(const char *name);
 | 
			
		||||
void _alpm_grp_free(pmgrp_t *grp);
 | 
			
		||||
alpm_group_t *_alpm_group_new(const char *name);
 | 
			
		||||
void _alpm_group_free(alpm_group_t *grp);
 | 
			
		||||
 | 
			
		||||
#endif /* _ALPM_GROUP_H */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,14 +22,14 @@
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <syslog.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
 | 
			
		||||
/* libalpm */
 | 
			
		||||
#include "handle.h"
 | 
			
		||||
@@ -39,24 +39,17 @@
 | 
			
		||||
#include "trans.h"
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
 | 
			
		||||
/* global var for handle (private to libalpm) */
 | 
			
		||||
pmhandle_t *handle = NULL;
 | 
			
		||||
 | 
			
		||||
pmhandle_t *_alpm_handle_new()
 | 
			
		||||
alpm_handle_t *_alpm_handle_new(void)
 | 
			
		||||
{
 | 
			
		||||
	pmhandle_t *handle;
 | 
			
		||||
	alpm_handle_t *handle;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	CALLOC(handle, 1, sizeof(alpm_handle_t), return NULL);
 | 
			
		||||
 | 
			
		||||
	CALLOC(handle, 1, sizeof(pmhandle_t), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
 | 
			
		||||
	return(handle);
 | 
			
		||||
	return handle;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_handle_free(pmhandle_t *handle)
 | 
			
		||||
void _alpm_handle_free(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(handle == NULL) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
@@ -71,6 +64,11 @@ void _alpm_handle_free(pmhandle_t *handle)
 | 
			
		||||
		closelog();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBCURL
 | 
			
		||||
	/* release curl handle */
 | 
			
		||||
	curl_easy_cleanup(handle->curl);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	/* free memory */
 | 
			
		||||
	_alpm_trans_free(handle->trans);
 | 
			
		||||
	FREE(handle->root);
 | 
			
		||||
@@ -79,371 +77,364 @@ void _alpm_handle_free(pmhandle_t *handle)
 | 
			
		||||
	FREE(handle->logfile);
 | 
			
		||||
	FREE(handle->lockfile);
 | 
			
		||||
	FREE(handle->arch);
 | 
			
		||||
	FREE(handle->gpgdir);
 | 
			
		||||
	FREELIST(handle->dbs_sync);
 | 
			
		||||
	FREELIST(handle->noupgrade);
 | 
			
		||||
	FREELIST(handle->noextract);
 | 
			
		||||
	FREELIST(handle->ignorepkg);
 | 
			
		||||
	FREELIST(handle->ignoregrp);
 | 
			
		||||
	FREELIST(handle->ignoregroup);
 | 
			
		||||
	FREE(handle);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_cb_log SYMEXPORT alpm_option_get_logcb()
 | 
			
		||||
/** Lock the database */
 | 
			
		||||
int _alpm_handle_lock(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	int fd;
 | 
			
		||||
	char *dir, *ptr;
 | 
			
		||||
 | 
			
		||||
	ASSERT(handle->lockfile != NULL, return -1);
 | 
			
		||||
	ASSERT(handle->lckstream == NULL, return 0);
 | 
			
		||||
 | 
			
		||||
	/* create the dir of the lockfile first */
 | 
			
		||||
	dir = strdup(handle->lockfile);
 | 
			
		||||
	ptr = strrchr(dir, '/');
 | 
			
		||||
	if(ptr) {
 | 
			
		||||
		*ptr = '\0';
 | 
			
		||||
	}
 | 
			
		||||
	if(_alpm_makepath(dir)) {
 | 
			
		||||
		FREE(dir);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	FREE(dir);
 | 
			
		||||
 | 
			
		||||
	do {
 | 
			
		||||
		fd = open(handle->lockfile, O_WRONLY | O_CREAT | O_EXCL, 0000);
 | 
			
		||||
	} while(fd == -1 && errno == EINTR);
 | 
			
		||||
	if(fd >= 0) {
 | 
			
		||||
		FILE *f = fdopen(fd, "w");
 | 
			
		||||
		fprintf(f, "%ld\n", (long)getpid());
 | 
			
		||||
		fflush(f);
 | 
			
		||||
		fsync(fd);
 | 
			
		||||
		handle->lckstream = f;
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Remove a lock file */
 | 
			
		||||
int _alpm_handle_unlock(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle->lockfile != NULL, return -1);
 | 
			
		||||
	ASSERT(handle->lckstream != NULL, return 0);
 | 
			
		||||
 | 
			
		||||
	fclose(handle->lckstream);
 | 
			
		||||
	handle->lckstream = NULL;
 | 
			
		||||
 | 
			
		||||
	if(unlink(handle->lockfile) && errno != ENOENT) {
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
alpm_cb_log SYMEXPORT alpm_option_get_logcb(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->logcb;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_cb_download SYMEXPORT alpm_option_get_dlcb()
 | 
			
		||||
alpm_cb_download SYMEXPORT alpm_option_get_dlcb(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->dlcb;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_cb_fetch SYMEXPORT alpm_option_get_fetchcb()
 | 
			
		||||
alpm_cb_fetch SYMEXPORT alpm_option_get_fetchcb(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->fetchcb;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_cb_totaldl SYMEXPORT alpm_option_get_totaldlcb()
 | 
			
		||||
alpm_cb_totaldl SYMEXPORT alpm_option_get_totaldlcb(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->totaldlcb;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_option_get_root()
 | 
			
		||||
alpm_cb_event SYMEXPORT alpm_option_get_eventcb(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->eventcb;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_cb_question SYMEXPORT alpm_option_get_questioncb(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->questioncb;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_cb_progress SYMEXPORT alpm_option_get_progresscb(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->progresscb;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_option_get_root(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->root;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_option_get_dbpath()
 | 
			
		||||
const char SYMEXPORT *alpm_option_get_dbpath(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->dbpath;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_option_get_cachedirs()
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_option_get_cachedirs(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->cachedirs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_option_get_logfile()
 | 
			
		||||
const char SYMEXPORT *alpm_option_get_logfile(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->logfile;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_option_get_lockfile()
 | 
			
		||||
const char SYMEXPORT *alpm_option_get_lockfile(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->lockfile;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_get_usesyslog()
 | 
			
		||||
const char SYMEXPORT *alpm_option_get_gpgdir(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->gpgdir;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_get_usesyslog(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	return handle->usesyslog;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_option_get_noupgrades()
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_option_get_noupgrades(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->noupgrade;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_option_get_noextracts()
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_option_get_noextracts(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->noextract;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_option_get_ignorepkgs()
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_option_get_ignorepkgs(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->ignorepkg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_option_get_ignoregrps()
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_option_get_ignoregroups(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	return handle->ignoregrp;
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->ignoregroup;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_option_get_arch()
 | 
			
		||||
const char SYMEXPORT *alpm_option_get_arch(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->arch;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_get_usedelta()
 | 
			
		||||
int SYMEXPORT alpm_option_get_usedelta(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	return handle->usedelta;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_get_checkspace()
 | 
			
		||||
int SYMEXPORT alpm_option_get_checkspace(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	return handle->checkspace;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pmdb_t SYMEXPORT *alpm_option_get_localdb()
 | 
			
		||||
alpm_db_t SYMEXPORT *alpm_option_get_localdb(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->db_local;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_option_get_syncdbs()
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_option_get_syncdbs(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return NULL);
 | 
			
		||||
	return handle->dbs_sync;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_set_logcb(alpm_cb_log cb)
 | 
			
		||||
int SYMEXPORT alpm_option_set_logcb(alpm_handle_t *handle, alpm_cb_log cb)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->logcb = cb;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_set_dlcb(alpm_cb_download cb)
 | 
			
		||||
int SYMEXPORT alpm_option_set_dlcb(alpm_handle_t *handle, alpm_cb_download cb)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->dlcb = cb;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_set_fetchcb(alpm_cb_fetch cb)
 | 
			
		||||
int SYMEXPORT alpm_option_set_fetchcb(alpm_handle_t *handle, alpm_cb_fetch cb)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->fetchcb = cb;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_set_totaldlcb(alpm_cb_totaldl cb)
 | 
			
		||||
int SYMEXPORT alpm_option_set_totaldlcb(alpm_handle_t *handle, alpm_cb_totaldl cb)
 | 
			
		||||
{
 | 
			
		||||
	if (handle == NULL) {
 | 
			
		||||
		pm_errno = PM_ERR_HANDLE_NULL;
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->totaldlcb = cb;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_set_root(const char *root)
 | 
			
		||||
int SYMEXPORT alpm_option_set_eventcb(alpm_handle_t *handle, alpm_cb_event cb)
 | 
			
		||||
{
 | 
			
		||||
	struct stat st;
 | 
			
		||||
	char *realroot;
 | 
			
		||||
	size_t rootlen;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
 | 
			
		||||
	if(!root) {
 | 
			
		||||
		pm_errno = PM_ERR_WRONG_ARGS;
 | 
			
		||||
		return(-1);
 | 
			
		||||
	}
 | 
			
		||||
	if(stat(root, &st) == -1 || !S_ISDIR(st.st_mode)) {
 | 
			
		||||
		pm_errno = PM_ERR_NOT_A_DIR;
 | 
			
		||||
		return(-1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	realroot = calloc(PATH_MAX+1, sizeof(char));
 | 
			
		||||
	if(!realpath(root, realroot)) {
 | 
			
		||||
		FREE(realroot);
 | 
			
		||||
		pm_errno = PM_ERR_NOT_A_DIR;
 | 
			
		||||
		return(-1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* verify root ends in a '/' */
 | 
			
		||||
	rootlen = strlen(realroot);
 | 
			
		||||
	if(realroot[rootlen-1] != '/') {
 | 
			
		||||
		rootlen += 1;
 | 
			
		||||
	}
 | 
			
		||||
	if(handle->root) {
 | 
			
		||||
		FREE(handle->root);
 | 
			
		||||
	}
 | 
			
		||||
	handle->root = calloc(rootlen + 1, sizeof(char));
 | 
			
		||||
	strncpy(handle->root, realroot, rootlen);
 | 
			
		||||
	handle->root[rootlen-1] = '/';
 | 
			
		||||
	FREE(realroot);
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "option 'root' = %s\n", handle->root);
 | 
			
		||||
	return(0);
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->eventcb = cb;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_set_dbpath(const char *dbpath)
 | 
			
		||||
int SYMEXPORT alpm_option_set_questioncb(alpm_handle_t *handle, alpm_cb_question cb)
 | 
			
		||||
{
 | 
			
		||||
	struct stat st;
 | 
			
		||||
	size_t dbpathlen, lockfilelen;
 | 
			
		||||
	const char *lf = "db.lck";
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	if(!dbpath) {
 | 
			
		||||
		pm_errno = PM_ERR_WRONG_ARGS;
 | 
			
		||||
		return(-1);
 | 
			
		||||
	}
 | 
			
		||||
	if(stat(dbpath, &st) == -1 || !S_ISDIR(st.st_mode)) {
 | 
			
		||||
		pm_errno = PM_ERR_NOT_A_DIR;
 | 
			
		||||
		return(-1);
 | 
			
		||||
	}
 | 
			
		||||
	/* verify dbpath ends in a '/' */
 | 
			
		||||
	dbpathlen = strlen(dbpath);
 | 
			
		||||
	if(dbpath[dbpathlen-1] != '/') {
 | 
			
		||||
		dbpathlen += 1;
 | 
			
		||||
	}
 | 
			
		||||
	if(handle->dbpath) {
 | 
			
		||||
		FREE(handle->dbpath);
 | 
			
		||||
	}
 | 
			
		||||
	handle->dbpath = calloc(dbpathlen+1, sizeof(char));
 | 
			
		||||
	strncpy(handle->dbpath, dbpath, dbpathlen);
 | 
			
		||||
	handle->dbpath[dbpathlen-1] = '/';
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "option 'dbpath' = %s\n", handle->dbpath);
 | 
			
		||||
 | 
			
		||||
	if(handle->lockfile) {
 | 
			
		||||
		FREE(handle->lockfile);
 | 
			
		||||
	}
 | 
			
		||||
	lockfilelen = strlen(handle->dbpath) + strlen(lf) + 1;
 | 
			
		||||
	handle->lockfile = calloc(lockfilelen, sizeof(char));
 | 
			
		||||
	snprintf(handle->lockfile, lockfilelen, "%s%s", handle->dbpath, lf);
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "option 'lockfile' = %s\n", handle->lockfile);
 | 
			
		||||
	return(0);
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->questioncb = cb;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_add_cachedir(const char *cachedir)
 | 
			
		||||
int SYMEXPORT alpm_option_set_progresscb(alpm_handle_t *handle, alpm_cb_progress cb)
 | 
			
		||||
{
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->progresscb = cb;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static char *canonicalize_path(const char *path) {
 | 
			
		||||
	char *new_path;
 | 
			
		||||
	size_t len;
 | 
			
		||||
 | 
			
		||||
	/* verify path ends in a '/' */
 | 
			
		||||
	len = strlen(path);
 | 
			
		||||
	if(path[len - 1] != '/') {
 | 
			
		||||
		len += 1;
 | 
			
		||||
	}
 | 
			
		||||
	CALLOC(new_path, len + 1, sizeof(char), return NULL);
 | 
			
		||||
	strcpy(new_path, path);
 | 
			
		||||
	new_path[len - 1] = '/';
 | 
			
		||||
	return new_path;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum _alpm_errno_t _alpm_set_directory_option(const char *value,
 | 
			
		||||
		char **storage, int must_exist)
 | 
			
		||||
 {
 | 
			
		||||
	struct stat st;
 | 
			
		||||
	char *real = NULL;
 | 
			
		||||
	const char *path;
 | 
			
		||||
 | 
			
		||||
	path = value;
 | 
			
		||||
	if(!path) {
 | 
			
		||||
		return ALPM_ERR_WRONG_ARGS;
 | 
			
		||||
	}
 | 
			
		||||
	if(must_exist) {
 | 
			
		||||
		if(stat(path, &st) == -1 || !S_ISDIR(st.st_mode)) {
 | 
			
		||||
			return ALPM_ERR_NOT_A_DIR;
 | 
			
		||||
		}
 | 
			
		||||
		CALLOC(real, PATH_MAX, sizeof(char), return ALPM_ERR_MEMORY);
 | 
			
		||||
		if(!realpath(path, real)) {
 | 
			
		||||
			free(real);
 | 
			
		||||
			return ALPM_ERR_NOT_A_DIR;
 | 
			
		||||
		}
 | 
			
		||||
		path = real;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(*storage) {
 | 
			
		||||
		FREE(*storage);
 | 
			
		||||
	}
 | 
			
		||||
	*storage = canonicalize_path(path);
 | 
			
		||||
	if(!*storage) {
 | 
			
		||||
		return ALPM_ERR_MEMORY;
 | 
			
		||||
	}
 | 
			
		||||
	free(real);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_add_cachedir(alpm_handle_t *handle, const char *cachedir)
 | 
			
		||||
{
 | 
			
		||||
	char *newcachedir;
 | 
			
		||||
	size_t cachedirlen;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	if(!cachedir) {
 | 
			
		||||
		pm_errno = PM_ERR_WRONG_ARGS;
 | 
			
		||||
		return(-1);
 | 
			
		||||
	}
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	ASSERT(cachedir != NULL, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
	/* don't stat the cachedir yet, as it may not even be needed. we can
 | 
			
		||||
	 * fail later if it is needed and the path is invalid. */
 | 
			
		||||
 | 
			
		||||
	/* verify cachedir ends in a '/' */
 | 
			
		||||
	cachedirlen = strlen(cachedir);
 | 
			
		||||
	if(cachedir[cachedirlen-1] != '/') {
 | 
			
		||||
		cachedirlen += 1;
 | 
			
		||||
	newcachedir = canonicalize_path(cachedir);
 | 
			
		||||
	if(!newcachedir) {
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_MEMORY, -1);
 | 
			
		||||
	}
 | 
			
		||||
	newcachedir = calloc(cachedirlen + 1, sizeof(char));
 | 
			
		||||
	strncpy(newcachedir, cachedir, cachedirlen);
 | 
			
		||||
	newcachedir[cachedirlen-1] = '/';
 | 
			
		||||
	handle->cachedirs = alpm_list_add(handle->cachedirs, newcachedir);
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "option 'cachedir' = %s\n", newcachedir);
 | 
			
		||||
	return(0);
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "option 'cachedir' = %s\n", newcachedir);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_set_cachedirs(alpm_list_t *cachedirs)
 | 
			
		||||
int SYMEXPORT alpm_option_set_cachedirs(alpm_handle_t *handle, alpm_list_t *cachedirs)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR_VOID(PM_ERR_HANDLE_NULL));
 | 
			
		||||
	if(handle->cachedirs) FREELIST(handle->cachedirs);
 | 
			
		||||
	if(cachedirs) handle->cachedirs = cachedirs;
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	if(handle->cachedirs) {
 | 
			
		||||
		FREELIST(handle->cachedirs);
 | 
			
		||||
	}
 | 
			
		||||
	for(i = cachedirs; i; i = i->next) {
 | 
			
		||||
		int ret = alpm_option_add_cachedir(handle, i->data);
 | 
			
		||||
		if(ret) {
 | 
			
		||||
			return ret;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_remove_cachedir(const char *cachedir)
 | 
			
		||||
int SYMEXPORT alpm_option_remove_cachedir(alpm_handle_t *handle, const char *cachedir)
 | 
			
		||||
{
 | 
			
		||||
	char *vdata = NULL;
 | 
			
		||||
	char *newcachedir;
 | 
			
		||||
	size_t cachedirlen;
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	/* verify cachedir ends in a '/' */
 | 
			
		||||
	cachedirlen = strlen(cachedir);
 | 
			
		||||
	if(cachedir[cachedirlen-1] != '/') {
 | 
			
		||||
		cachedirlen += 1;
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	ASSERT(cachedir != NULL, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
 | 
			
		||||
	newcachedir = canonicalize_path(cachedir);
 | 
			
		||||
	if(!newcachedir) {
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_MEMORY, -1);
 | 
			
		||||
	}
 | 
			
		||||
	newcachedir = calloc(cachedirlen + 1, sizeof(char));
 | 
			
		||||
	strncpy(newcachedir, cachedir, cachedirlen);
 | 
			
		||||
	newcachedir[cachedirlen-1] = '/';
 | 
			
		||||
	handle->cachedirs = alpm_list_remove_str(handle->cachedirs, newcachedir, &vdata);
 | 
			
		||||
	FREE(newcachedir);
 | 
			
		||||
	if(vdata != NULL) {
 | 
			
		||||
		FREE(vdata);
 | 
			
		||||
		return(1);
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_set_logfile(const char *logfile)
 | 
			
		||||
int SYMEXPORT alpm_option_set_logfile(alpm_handle_t *handle, const char *logfile)
 | 
			
		||||
{
 | 
			
		||||
	char *oldlogfile = handle->logfile;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	if(!logfile) {
 | 
			
		||||
		pm_errno = PM_ERR_WRONG_ARGS;
 | 
			
		||||
		return(-1);
 | 
			
		||||
		handle->pm_errno = ALPM_ERR_WRONG_ARGS;
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	handle->logfile = strdup(logfile);
 | 
			
		||||
@@ -457,133 +448,186 @@ int SYMEXPORT alpm_option_set_logfile(const char *logfile)
 | 
			
		||||
		fclose(handle->logstream);
 | 
			
		||||
		handle->logstream = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	_alpm_log(PM_LOG_DEBUG, "option 'logfile' = %s\n", handle->logfile);
 | 
			
		||||
	return(0);
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "option 'logfile' = %s\n", handle->logfile);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_set_usesyslog(int usesyslog)
 | 
			
		||||
int SYMEXPORT alpm_option_set_gpgdir(alpm_handle_t *handle, const char *gpgdir)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR_VOID(PM_ERR_HANDLE_NULL));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	if(!gpgdir) {
 | 
			
		||||
		handle->pm_errno = ALPM_ERR_WRONG_ARGS;
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(handle->gpgdir) {
 | 
			
		||||
		FREE(handle->gpgdir);
 | 
			
		||||
	}
 | 
			
		||||
	handle->gpgdir = strdup(gpgdir);
 | 
			
		||||
 | 
			
		||||
	_alpm_log(handle, ALPM_LOG_DEBUG, "option 'gpgdir' = %s\n", handle->gpgdir);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_set_usesyslog(alpm_handle_t *handle, int usesyslog)
 | 
			
		||||
{
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->usesyslog = usesyslog;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_add_noupgrade(const char *pkg)
 | 
			
		||||
int SYMEXPORT alpm_option_add_noupgrade(alpm_handle_t *handle, const char *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR_VOID(PM_ERR_HANDLE_NULL));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->noupgrade = alpm_list_add(handle->noupgrade, strdup(pkg));
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_set_noupgrades(alpm_list_t *noupgrade)
 | 
			
		||||
int SYMEXPORT alpm_option_set_noupgrades(alpm_handle_t *handle, alpm_list_t *noupgrade)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR_VOID(PM_ERR_HANDLE_NULL));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	if(handle->noupgrade) FREELIST(handle->noupgrade);
 | 
			
		||||
	if(noupgrade) handle->noupgrade = noupgrade;
 | 
			
		||||
	handle->noupgrade = alpm_list_strdup(noupgrade);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_remove_noupgrade(const char *pkg)
 | 
			
		||||
int SYMEXPORT alpm_option_remove_noupgrade(alpm_handle_t *handle, const char *pkg)
 | 
			
		||||
{
 | 
			
		||||
	char *vdata = NULL;
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->noupgrade = alpm_list_remove_str(handle->noupgrade, pkg, &vdata);
 | 
			
		||||
	if(vdata != NULL) {
 | 
			
		||||
		FREE(vdata);
 | 
			
		||||
		return(1);
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_add_noextract(const char *pkg)
 | 
			
		||||
int SYMEXPORT alpm_option_add_noextract(alpm_handle_t *handle, const char *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR_VOID(PM_ERR_HANDLE_NULL));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->noextract = alpm_list_add(handle->noextract, strdup(pkg));
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_set_noextracts(alpm_list_t *noextract)
 | 
			
		||||
int SYMEXPORT alpm_option_set_noextracts(alpm_handle_t *handle, alpm_list_t *noextract)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR_VOID(PM_ERR_HANDLE_NULL));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	if(handle->noextract) FREELIST(handle->noextract);
 | 
			
		||||
	if(noextract) handle->noextract = noextract;
 | 
			
		||||
	handle->noextract = alpm_list_strdup(noextract);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_remove_noextract(const char *pkg)
 | 
			
		||||
int SYMEXPORT alpm_option_remove_noextract(alpm_handle_t *handle, const char *pkg)
 | 
			
		||||
{
 | 
			
		||||
	char *vdata = NULL;
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->noextract = alpm_list_remove_str(handle->noextract, pkg, &vdata);
 | 
			
		||||
	if(vdata != NULL) {
 | 
			
		||||
		FREE(vdata);
 | 
			
		||||
		return(1);
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_add_ignorepkg(const char *pkg)
 | 
			
		||||
int SYMEXPORT alpm_option_add_ignorepkg(alpm_handle_t *handle, const char *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR_VOID(PM_ERR_HANDLE_NULL));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->ignorepkg = alpm_list_add(handle->ignorepkg, strdup(pkg));
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_set_ignorepkgs(alpm_list_t *ignorepkgs)
 | 
			
		||||
int SYMEXPORT alpm_option_set_ignorepkgs(alpm_handle_t *handle, alpm_list_t *ignorepkgs)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR_VOID(PM_ERR_HANDLE_NULL));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	if(handle->ignorepkg) FREELIST(handle->ignorepkg);
 | 
			
		||||
	if(ignorepkgs) handle->ignorepkg = ignorepkgs;
 | 
			
		||||
	handle->ignorepkg = alpm_list_strdup(ignorepkgs);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_remove_ignorepkg(const char *pkg)
 | 
			
		||||
int SYMEXPORT alpm_option_remove_ignorepkg(alpm_handle_t *handle, const char *pkg)
 | 
			
		||||
{
 | 
			
		||||
	char *vdata = NULL;
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->ignorepkg = alpm_list_remove_str(handle->ignorepkg, pkg, &vdata);
 | 
			
		||||
	if(vdata != NULL) {
 | 
			
		||||
		FREE(vdata);
 | 
			
		||||
		return(1);
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_add_ignoregrp(const char *grp)
 | 
			
		||||
int SYMEXPORT alpm_option_add_ignoregroup(alpm_handle_t *handle, const char *grp)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR_VOID(PM_ERR_HANDLE_NULL));
 | 
			
		||||
	handle->ignoregrp = alpm_list_add(handle->ignoregrp, strdup(grp));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->ignoregroup = alpm_list_add(handle->ignoregroup, strdup(grp));
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_set_ignoregrps(alpm_list_t *ignoregrps)
 | 
			
		||||
int SYMEXPORT alpm_option_set_ignoregroups(alpm_handle_t *handle, alpm_list_t *ignoregrps)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR_VOID(PM_ERR_HANDLE_NULL));
 | 
			
		||||
	if(handle->ignoregrp) FREELIST(handle->ignoregrp);
 | 
			
		||||
	if(ignoregrps) handle->ignoregrp = ignoregrps;
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	if(handle->ignoregroup) FREELIST(handle->ignoregroup);
 | 
			
		||||
	handle->ignoregroup = alpm_list_strdup(ignoregrps);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_remove_ignoregrp(const char *grp)
 | 
			
		||||
int SYMEXPORT alpm_option_remove_ignoregroup(alpm_handle_t *handle, const char *grp)
 | 
			
		||||
{
 | 
			
		||||
	char *vdata = NULL;
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	handle->ignoregrp = alpm_list_remove_str(handle->ignoregrp, grp, &vdata);
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->ignoregroup = alpm_list_remove_str(handle->ignoregroup, grp, &vdata);
 | 
			
		||||
	if(vdata != NULL) {
 | 
			
		||||
		FREE(vdata);
 | 
			
		||||
		return(1);
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_set_arch(const char *arch)
 | 
			
		||||
int SYMEXPORT alpm_option_set_arch(alpm_handle_t *handle, const char *arch)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR_VOID(PM_ERR_HANDLE_NULL));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	if(handle->arch) FREE(handle->arch);
 | 
			
		||||
	if(arch) handle->arch = strdup(arch);
 | 
			
		||||
	if(arch) {
 | 
			
		||||
		handle->arch = strdup(arch);
 | 
			
		||||
	} else {
 | 
			
		||||
		handle->arch = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_set_usedelta(int usedelta)
 | 
			
		||||
int SYMEXPORT alpm_option_set_usedelta(alpm_handle_t *handle, int usedelta)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR_VOID(PM_ERR_HANDLE_NULL));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->usedelta = usedelta;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SYMEXPORT alpm_option_set_checkspace(int checkspace)
 | 
			
		||||
int SYMEXPORT alpm_option_set_checkspace(alpm_handle_t *handle, int checkspace)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR_VOID(PM_ERR_HANDLE_NULL));
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	handle->checkspace = checkspace;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_option_set_default_siglevel(alpm_handle_t *handle,
 | 
			
		||||
		alpm_siglevel_t level)
 | 
			
		||||
{
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
#ifdef HAVE_LIBGPGME
 | 
			
		||||
	handle->siglevel = level;
 | 
			
		||||
#else
 | 
			
		||||
	if(level != 0 && level != ALPM_SIG_USE_DEFAULT) {
 | 
			
		||||
		RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_siglevel_t SYMEXPORT alpm_option_get_default_siglevel(alpm_handle_t *handle)
 | 
			
		||||
{
 | 
			
		||||
	CHECK_HANDLE(handle, return -1);
 | 
			
		||||
	return handle->siglevel;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -24,50 +24,86 @@
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include "alpm_list.h"
 | 
			
		||||
#include "db.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
#include "trans.h"
 | 
			
		||||
 | 
			
		||||
typedef struct _pmhandle_t {
 | 
			
		||||
#ifdef HAVE_LIBCURL
 | 
			
		||||
#include <curl/curl.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define EVENT(h, e, d1, d2) \
 | 
			
		||||
do { \
 | 
			
		||||
	if((h)->eventcb) { \
 | 
			
		||||
		(h)->eventcb(e, d1, d2); \
 | 
			
		||||
	} \
 | 
			
		||||
} while(0)
 | 
			
		||||
#define QUESTION(h, q, d1, d2, d3, r) \
 | 
			
		||||
do { \
 | 
			
		||||
	if((h)->questioncb) { \
 | 
			
		||||
		(h)->questioncb(q, d1, d2, d3, r); \
 | 
			
		||||
	} \
 | 
			
		||||
} while(0)
 | 
			
		||||
#define PROGRESS(h, e, p, per, n, r) \
 | 
			
		||||
do { \
 | 
			
		||||
	if((h)->progresscb) { \
 | 
			
		||||
		(h)->progresscb(e, p, per, n, r); \
 | 
			
		||||
	} \
 | 
			
		||||
} while(0)
 | 
			
		||||
 | 
			
		||||
struct __alpm_handle_t {
 | 
			
		||||
	/* internal usage */
 | 
			
		||||
	pmdb_t *db_local;       /* local db pointer */
 | 
			
		||||
	alpm_list_t *dbs_sync;  /* List of (pmdb_t *) */
 | 
			
		||||
	alpm_db_t *db_local;       /* local db pointer */
 | 
			
		||||
	alpm_list_t *dbs_sync;  /* List of (alpm_db_t *) */
 | 
			
		||||
	FILE *logstream;        /* log file stream pointer */
 | 
			
		||||
	FILE *lckstream;        /* lock file stream pointer if one exists */
 | 
			
		||||
	pmtrans_t *trans;
 | 
			
		||||
	alpm_trans_t *trans;
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LIBCURL
 | 
			
		||||
	/* libcurl handle */
 | 
			
		||||
	CURL *curl;             /* reusable curl_easy handle */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	/* callback functions */
 | 
			
		||||
	alpm_cb_log logcb;      /* Log callback function */
 | 
			
		||||
	alpm_cb_download dlcb;  /* Download callback function */
 | 
			
		||||
	alpm_cb_totaldl totaldlcb;  /* Total download callback function */
 | 
			
		||||
	alpm_cb_fetch fetchcb; /* Download file callback function */
 | 
			
		||||
	alpm_cb_fetch fetchcb;  /* Download file callback function */
 | 
			
		||||
	alpm_cb_event eventcb;
 | 
			
		||||
	alpm_cb_question questioncb;
 | 
			
		||||
	alpm_cb_progress progresscb;
 | 
			
		||||
 | 
			
		||||
	/* filesystem paths */
 | 
			
		||||
	char *root;              /* Root path, default '/' */
 | 
			
		||||
	char *dbpath;            /* Base path to pacman's DBs */
 | 
			
		||||
	char *logfile;           /* Name of the log file */
 | 
			
		||||
	char *lockfile;          /* Name of the lock file */
 | 
			
		||||
	char *gpgdir;            /* Directory where GnuPG files are stored */
 | 
			
		||||
	alpm_list_t *cachedirs;  /* Paths to pacman cache directories */
 | 
			
		||||
 | 
			
		||||
	/* package lists */
 | 
			
		||||
	alpm_list_t *noupgrade;   /* List of packages NOT to be upgraded */
 | 
			
		||||
	alpm_list_t *noextract;   /* List of files NOT to extract */
 | 
			
		||||
	alpm_list_t *ignorepkg;   /* List of packages to ignore */
 | 
			
		||||
	alpm_list_t *ignoregrp;   /* List of groups to ignore */
 | 
			
		||||
	alpm_list_t *ignoregroup; /* List of groups to ignore */
 | 
			
		||||
 | 
			
		||||
	/* options */
 | 
			
		||||
	int usesyslog;    /* Use syslog instead of logfile? */ /* TODO move to frontend */
 | 
			
		||||
	char *arch;       /* Architecture of packages we should allow */
 | 
			
		||||
	int usedelta;     /* Download deltas if possible */
 | 
			
		||||
	int checkspace;   /* Check disk space before installing */
 | 
			
		||||
} pmhandle_t;
 | 
			
		||||
	int usesyslog;           /* Use syslog instead of logfile? */ /* TODO move to frontend */
 | 
			
		||||
	char *arch;              /* Architecture of packages we should allow */
 | 
			
		||||
	int usedelta;            /* Download deltas if possible */
 | 
			
		||||
	int checkspace;          /* Check disk space before installing */
 | 
			
		||||
	alpm_siglevel_t siglevel;   /* Default signature verification level */
 | 
			
		||||
 | 
			
		||||
/* global handle variable */
 | 
			
		||||
extern pmhandle_t *handle;
 | 
			
		||||
	/* error code */
 | 
			
		||||
	enum _alpm_errno_t pm_errno;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
pmhandle_t *_alpm_handle_new(void);
 | 
			
		||||
void _alpm_handle_free(pmhandle_t *handle);
 | 
			
		||||
alpm_handle_t *_alpm_handle_new(void);
 | 
			
		||||
void _alpm_handle_free(alpm_handle_t *handle);
 | 
			
		||||
 | 
			
		||||
int _alpm_handle_lock(alpm_handle_t *handle);
 | 
			
		||||
int _alpm_handle_unlock(alpm_handle_t *handle);
 | 
			
		||||
 | 
			
		||||
enum _alpm_errno_t _alpm_set_directory_option(const char *value,
 | 
			
		||||
		char **storage, int must_exist);
 | 
			
		||||
 | 
			
		||||
#endif /* _ALPM_HANDLE_H */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,10 +22,7 @@
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
/* libalpm */
 | 
			
		||||
#include "log.h"
 | 
			
		||||
@@ -39,18 +36,16 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** A printf-like function for logging.
 | 
			
		||||
 * @param handle the context handle
 | 
			
		||||
 * @param fmt output format
 | 
			
		||||
 * @return 0 on success, -1 on error (pm_errno is set accordingly)
 | 
			
		||||
 */
 | 
			
		||||
int SYMEXPORT alpm_logaction(const char *fmt, ...)
 | 
			
		||||
int SYMEXPORT alpm_logaction(alpm_handle_t *handle, const char *fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	int ret;
 | 
			
		||||
	va_list args;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
 | 
			
		||||
	ASSERT(handle != NULL, return -1);
 | 
			
		||||
 | 
			
		||||
	/* check if the logstream is open already, opening it if needed */
 | 
			
		||||
	if(handle->logstream == NULL) {
 | 
			
		||||
@@ -58,18 +53,18 @@ int SYMEXPORT alpm_logaction(const char *fmt, ...)
 | 
			
		||||
		/* if we couldn't open it, we have an issue */
 | 
			
		||||
		if(handle->logstream == NULL) {
 | 
			
		||||
			if(errno == EACCES) {
 | 
			
		||||
				pm_errno = PM_ERR_BADPERMS;
 | 
			
		||||
				handle->pm_errno = ALPM_ERR_BADPERMS;
 | 
			
		||||
			} else if(errno == ENOENT) {
 | 
			
		||||
				pm_errno = PM_ERR_NOT_A_DIR;
 | 
			
		||||
				handle->pm_errno = ALPM_ERR_NOT_A_DIR;
 | 
			
		||||
			} else {
 | 
			
		||||
				pm_errno = PM_ERR_SYSTEM;
 | 
			
		||||
				handle->pm_errno = ALPM_ERR_SYSTEM;
 | 
			
		||||
			}
 | 
			
		||||
		return(-1);
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	va_start(args, fmt);
 | 
			
		||||
	ret = _alpm_logaction(handle->usesyslog, handle->logstream, fmt, args);
 | 
			
		||||
	ret = _alpm_logaction(handle, fmt, args);
 | 
			
		||||
	va_end(args);
 | 
			
		||||
 | 
			
		||||
	/* TODO	We should add a prefix to log strings depending on who called us.
 | 
			
		||||
@@ -83,22 +78,21 @@ int SYMEXPORT alpm_logaction(const char *fmt, ...)
 | 
			
		||||
	 *   kpacman: "KPACMAN"
 | 
			
		||||
	 * This would allow us to share the log file between several frontends
 | 
			
		||||
	 * and know who does what */
 | 
			
		||||
	return(ret);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
void _alpm_log(pmloglevel_t flag, const char *fmt, ...)
 | 
			
		||||
void _alpm_log(alpm_handle_t *handle, alpm_loglevel_t flag, const char *fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	va_list args;
 | 
			
		||||
	alpm_cb_log logcb = alpm_option_get_logcb();
 | 
			
		||||
 | 
			
		||||
	if(logcb == NULL) {
 | 
			
		||||
	if(handle == NULL || handle->logcb == NULL) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	va_start(args, fmt);
 | 
			
		||||
	logcb(flag, fmt, args);
 | 
			
		||||
	handle->logcb(flag, fmt, args);
 | 
			
		||||
	va_end(args);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,14 +22,8 @@
 | 
			
		||||
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
 | 
			
		||||
#ifdef PACMAN_DEBUG
 | 
			
		||||
/* Log funtion entry points if debugging is enabled */
 | 
			
		||||
#define ALPM_LOG_FUNC _alpm_log(PM_LOG_FUNCTION, "Enter %s\n", __func__)
 | 
			
		||||
#else
 | 
			
		||||
#define ALPM_LOG_FUNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void _alpm_log(pmloglevel_t flag, const char *fmt, ...) __attribute__((format(printf,2,3)));
 | 
			
		||||
void _alpm_log(alpm_handle_t *handle, alpm_loglevel_t flag,
 | 
			
		||||
		const char *fmt, ...) __attribute__((format(printf,3,4)));
 | 
			
		||||
 | 
			
		||||
#endif /* _ALPM_LOG_H */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,12 @@
 | 
			
		||||
/*
 | 
			
		||||
 *  RFC 1321 compliant MD5 implementation
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2007  Christophe Devine
 | 
			
		||||
 *  Copyright (C) 2006-2010, Brainspark B.V.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of PolarSSL (http://www.polarssl.org)
 | 
			
		||||
 *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
 | 
			
		||||
 *
 | 
			
		||||
 *  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 *  This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -24,29 +29,19 @@
 | 
			
		||||
/*
 | 
			
		||||
 *  Pacman Notes:
 | 
			
		||||
 *
 | 
			
		||||
 *  Taken from the XySSL project at www.xyssl.org under terms of the
 | 
			
		||||
 *  GPL. This is from version 0.9 of the library, and has been modified
 | 
			
		||||
 *  Taken from the PolarSSL project at http://polarssl.org under terms of the
 | 
			
		||||
 *  GPL. This is from version 1.0.0 of the library, and has been modified
 | 
			
		||||
 *  as following, which may be helpful for future updates:
 | 
			
		||||
 *  * remove "xyssl/config.h" include
 | 
			
		||||
 *  * change include from "xyssl/md5.h" to "md5.h"
 | 
			
		||||
 *  * remove "polarssl/config.h" include
 | 
			
		||||
 *  * change include from "polarssl/sha2.h" to "sha2.h"
 | 
			
		||||
 *  * removal of HMAC code
 | 
			
		||||
 *  * removal of SELF_TEST code
 | 
			
		||||
 *  * removal of ipad and opad from the md5_context struct in md5.h
 | 
			
		||||
 *  * change of md5_file prototype from
 | 
			
		||||
 *        int md5_file( char *path, unsigned char *output )
 | 
			
		||||
 *      to
 | 
			
		||||
 *        int md5_file( const char *path, unsigned char *output )
 | 
			
		||||
 *  * use a dynamically-allocated buffer in md5_file, and increase the size
 | 
			
		||||
 *    for performance reasons
 | 
			
		||||
 *  * various static/inline changes
 | 
			
		||||
 *
 | 
			
		||||
 *  NOTE: XySSL has been renamed to PolarSSL, which is available at
 | 
			
		||||
 *  www.polarssl.org. If we update, we should get it from there.
 | 
			
		||||
 *  * removal of ipad and opad from the md5_context struct in sha2.h
 | 
			
		||||
 *  * increase the size of buffer for performance reasons
 | 
			
		||||
 *  * various static changes
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include "md5.h"
 | 
			
		||||
 | 
			
		||||
@@ -76,7 +71,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 * MD5 context setup
 | 
			
		||||
 */
 | 
			
		||||
static inline void md5_starts( md5_context *ctx )
 | 
			
		||||
static void md5_starts( md5_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    ctx->total[0] = 0;
 | 
			
		||||
    ctx->total[1] = 0;
 | 
			
		||||
@@ -87,7 +82,7 @@ static inline void md5_starts( md5_context *ctx )
 | 
			
		||||
    ctx->state[3] = 0x10325476;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void md5_process( md5_context *ctx, unsigned char data[64] )
 | 
			
		||||
static void md5_process( md5_context *ctx, const unsigned char data[64] )
 | 
			
		||||
{
 | 
			
		||||
    unsigned long X[16], A, B, C, D;
 | 
			
		||||
 | 
			
		||||
@@ -161,7 +156,7 @@ static inline void md5_process( md5_context *ctx, unsigned char data[64] )
 | 
			
		||||
    P( B, C, D, A, 12, 20, 0x8D2A4C8A );
 | 
			
		||||
 | 
			
		||||
#undef F
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
#define F(x,y,z) (x ^ y ^ z)
 | 
			
		||||
 | 
			
		||||
    P( A, B, C, D,  5,  4, 0xFFFA3942 );
 | 
			
		||||
@@ -213,9 +208,9 @@ static inline void md5_process( md5_context *ctx, unsigned char data[64] )
 | 
			
		||||
/*
 | 
			
		||||
 * MD5 process buffer
 | 
			
		||||
 */
 | 
			
		||||
static inline void md5_update( md5_context *ctx, unsigned char *input, int ilen )
 | 
			
		||||
static void md5_update( md5_context *ctx, const unsigned char *input, size_t ilen )
 | 
			
		||||
{
 | 
			
		||||
    int fill;
 | 
			
		||||
    size_t fill;
 | 
			
		||||
    unsigned long left;
 | 
			
		||||
 | 
			
		||||
    if( ilen <= 0 )
 | 
			
		||||
@@ -224,7 +219,7 @@ static inline void md5_update( md5_context *ctx, unsigned char *input, int ilen
 | 
			
		||||
    left = ctx->total[0] & 0x3F;
 | 
			
		||||
    fill = 64 - left;
 | 
			
		||||
 | 
			
		||||
    ctx->total[0] += ilen;
 | 
			
		||||
    ctx->total[0] += (unsigned long) ilen;
 | 
			
		||||
    ctx->total[0] &= 0xFFFFFFFF;
 | 
			
		||||
 | 
			
		||||
    if( ctx->total[0] < (unsigned long) ilen )
 | 
			
		||||
@@ -254,7 +249,7 @@ static inline void md5_update( md5_context *ctx, unsigned char *input, int ilen
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned char md5_padding[64] =
 | 
			
		||||
static const unsigned char md5_padding[64] =
 | 
			
		||||
{
 | 
			
		||||
 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 | 
			
		||||
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 | 
			
		||||
@@ -265,7 +260,7 @@ static unsigned char md5_padding[64] =
 | 
			
		||||
/*
 | 
			
		||||
 * MD5 final digest
 | 
			
		||||
 */
 | 
			
		||||
static inline void md5_finish( md5_context *ctx, unsigned char output[16] )
 | 
			
		||||
static void md5_finish( md5_context *ctx, unsigned char output[16] )
 | 
			
		||||
{
 | 
			
		||||
    unsigned long last, padn;
 | 
			
		||||
    unsigned long high, low;
 | 
			
		||||
@@ -293,7 +288,7 @@ static inline void md5_finish( md5_context *ctx, unsigned char output[16] )
 | 
			
		||||
/*
 | 
			
		||||
 * output = MD5( input buffer )
 | 
			
		||||
 */
 | 
			
		||||
void md5( unsigned char *input, int ilen, unsigned char output[16] )
 | 
			
		||||
void md5( const unsigned char *input, size_t ilen, unsigned char output[16] )
 | 
			
		||||
{
 | 
			
		||||
    md5_context ctx;
 | 
			
		||||
 | 
			
		||||
@@ -312,25 +307,19 @@ int md5_file( const char *path, unsigned char output[16] )
 | 
			
		||||
    FILE *f;
 | 
			
		||||
    size_t n;
 | 
			
		||||
    md5_context ctx;
 | 
			
		||||
    unsigned char *buf;
 | 
			
		||||
    unsigned char buf[4096];
 | 
			
		||||
 | 
			
		||||
    if( ( buf = calloc(8192, sizeof(unsigned char)) ) == NULL )
 | 
			
		||||
    if( ( f = fopen( path, "rb" ) ) == NULL )
 | 
			
		||||
        return( 1 );
 | 
			
		||||
 | 
			
		||||
    if( ( f = fopen( path, "rb" ) ) == NULL ) {
 | 
			
		||||
        free( buf );
 | 
			
		||||
        return( 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    md5_starts( &ctx );
 | 
			
		||||
 | 
			
		||||
    while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
 | 
			
		||||
        md5_update( &ctx, buf, (int) n );
 | 
			
		||||
        md5_update( &ctx, buf, n );
 | 
			
		||||
 | 
			
		||||
    md5_finish( &ctx, output );
 | 
			
		||||
 | 
			
		||||
    memset( &ctx, 0, sizeof( md5_context ) );
 | 
			
		||||
    free( buf );
 | 
			
		||||
 | 
			
		||||
    if( ferror( f ) != 0 )
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,12 @@
 | 
			
		||||
/*
 | 
			
		||||
 *  RFC 1321 compliant MD5 implementation
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2007  Christophe Devine
 | 
			
		||||
 *  Copyright (C) 2006-2010, Brainspark B.V.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file is part of PolarSSL (http://www.polarssl.org)
 | 
			
		||||
 *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
 | 
			
		||||
 *
 | 
			
		||||
 *  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 *  This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 *  it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -16,10 +21,11 @@
 | 
			
		||||
 *  You should have received a copy of the GNU General Public License
 | 
			
		||||
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _MD5_H
 | 
			
		||||
#define _MD5_H
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          MD5 context structure
 | 
			
		||||
 */
 | 
			
		||||
@@ -38,7 +44,7 @@ md5_context;
 | 
			
		||||
 * \param ilen     length of the input data
 | 
			
		||||
 * \param output   MD5 checksum result
 | 
			
		||||
 */
 | 
			
		||||
void md5( unsigned char *input, int ilen, unsigned char output[16] );
 | 
			
		||||
void md5( const unsigned char *input, size_t ilen, unsigned char output[16] );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * \brief          Output = MD5( file contents )
 | 
			
		||||
 
 | 
			
		||||
@@ -23,13 +23,9 @@
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
 | 
			
		||||
/* libalpm */
 | 
			
		||||
#include "package.h"
 | 
			
		||||
@@ -47,95 +43,97 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** Free a package. */
 | 
			
		||||
int SYMEXPORT alpm_pkg_free(pmpkg_t *pkg)
 | 
			
		||||
int SYMEXPORT alpm_pkg_free(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	ASSERT(pkg != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
	ASSERT(pkg != NULL, return -1);
 | 
			
		||||
 | 
			
		||||
	/* Only free packages loaded in user space */
 | 
			
		||||
	if(pkg->origin == PKG_FROM_FILE) {
 | 
			
		||||
		_alpm_pkg_free(pkg);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Check the integrity (with md5) of a package from the sync cache. */
 | 
			
		||||
int SYMEXPORT alpm_pkg_checkmd5sum(pmpkg_t *pkg)
 | 
			
		||||
int SYMEXPORT alpm_pkg_checkmd5sum(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	char *fpath;
 | 
			
		||||
	int retval;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	ASSERT(pkg != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
	ASSERT(pkg != NULL, return -1);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	/* We only inspect packages from sync repositories */
 | 
			
		||||
	ASSERT(pkg->origin == PKG_FROM_SYNCDB, RET_ERR(PM_ERR_PKG_INVALID, -1));
 | 
			
		||||
	ASSERT(pkg->origin == PKG_FROM_SYNCDB,
 | 
			
		||||
			RET_ERR(pkg->handle, ALPM_ERR_WRONG_ARGS, -1));
 | 
			
		||||
 | 
			
		||||
	fpath = _alpm_filecache_find(alpm_pkg_get_filename(pkg));
 | 
			
		||||
	fpath = _alpm_filecache_find(pkg->handle, pkg->filename);
 | 
			
		||||
 | 
			
		||||
	retval = _alpm_test_md5sum(fpath, alpm_pkg_get_md5sum(pkg));
 | 
			
		||||
	retval = _alpm_test_checksum(fpath, pkg->md5sum, ALPM_CSUM_MD5);
 | 
			
		||||
 | 
			
		||||
	if(retval == 0) {
 | 
			
		||||
		return(0);
 | 
			
		||||
	} else if (retval == 1) {
 | 
			
		||||
		pm_errno = PM_ERR_PKG_INVALID;
 | 
			
		||||
		return 0;
 | 
			
		||||
	} else if(retval == 1) {
 | 
			
		||||
		pkg->handle->pm_errno = ALPM_ERR_PKG_INVALID;
 | 
			
		||||
		retval = -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(retval);
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Default package accessor functions. These will get overridden by any
 | 
			
		||||
 * backend logic that needs lazy access, such as the local database through
 | 
			
		||||
 * a lazy-load cache. However, the defaults will work just fine for fully-
 | 
			
		||||
 * populated package structures. */
 | 
			
		||||
static const char *_pkg_get_filename(pmpkg_t *pkg)    { return pkg->filename; }
 | 
			
		||||
static const char *_pkg_get_name(pmpkg_t *pkg)        { return pkg->name; }
 | 
			
		||||
static const char *_pkg_get_version(pmpkg_t *pkg)     { return pkg->version; }
 | 
			
		||||
static const char *_pkg_get_desc(pmpkg_t *pkg)        { return pkg->desc; }
 | 
			
		||||
static const char *_pkg_get_url(pmpkg_t *pkg)         { return pkg->url; }
 | 
			
		||||
static time_t _pkg_get_builddate(pmpkg_t *pkg)        { return pkg->builddate; }
 | 
			
		||||
static time_t _pkg_get_installdate(pmpkg_t *pkg)      { return pkg->installdate; }
 | 
			
		||||
static const char *_pkg_get_packager(pmpkg_t *pkg)    { return pkg->packager; }
 | 
			
		||||
static const char *_pkg_get_md5sum(pmpkg_t *pkg)      { return pkg->md5sum; }
 | 
			
		||||
static const char *_pkg_get_arch(pmpkg_t *pkg)        { return pkg->arch; }
 | 
			
		||||
static off_t _pkg_get_size(pmpkg_t *pkg)              { return pkg->size; }
 | 
			
		||||
static off_t _pkg_get_isize(pmpkg_t *pkg)             { return pkg->isize; }
 | 
			
		||||
static pmpkgreason_t _pkg_get_reason(pmpkg_t *pkg)    { return pkg->reason; }
 | 
			
		||||
static int _pkg_has_scriptlet(pmpkg_t *pkg)           { return pkg->scriptlet; }
 | 
			
		||||
static const char *_pkg_get_desc(alpm_pkg_t *pkg)        { return pkg->desc; }
 | 
			
		||||
static const char *_pkg_get_url(alpm_pkg_t *pkg)         { return pkg->url; }
 | 
			
		||||
static time_t _pkg_get_builddate(alpm_pkg_t *pkg)        { return pkg->builddate; }
 | 
			
		||||
static time_t _pkg_get_installdate(alpm_pkg_t *pkg)      { return pkg->installdate; }
 | 
			
		||||
static const char *_pkg_get_packager(alpm_pkg_t *pkg)    { return pkg->packager; }
 | 
			
		||||
static const char *_pkg_get_arch(alpm_pkg_t *pkg)        { return pkg->arch; }
 | 
			
		||||
static off_t _pkg_get_isize(alpm_pkg_t *pkg)             { return pkg->isize; }
 | 
			
		||||
static alpm_pkgreason_t _pkg_get_reason(alpm_pkg_t *pkg)    { return pkg->reason; }
 | 
			
		||||
static int _pkg_has_scriptlet(alpm_pkg_t *pkg)           { return pkg->scriptlet; }
 | 
			
		||||
 | 
			
		||||
static alpm_list_t *_pkg_get_licenses(pmpkg_t *pkg)   { return pkg->licenses; }
 | 
			
		||||
static alpm_list_t *_pkg_get_groups(pmpkg_t *pkg)     { return pkg->groups; }
 | 
			
		||||
static alpm_list_t *_pkg_get_depends(pmpkg_t *pkg)    { return pkg->depends; }
 | 
			
		||||
static alpm_list_t *_pkg_get_optdepends(pmpkg_t *pkg) { return pkg->optdepends; }
 | 
			
		||||
static alpm_list_t *_pkg_get_conflicts(pmpkg_t *pkg)  { return pkg->conflicts; }
 | 
			
		||||
static alpm_list_t *_pkg_get_provides(pmpkg_t *pkg)   { return pkg->provides; }
 | 
			
		||||
static alpm_list_t *_pkg_get_replaces(pmpkg_t *pkg)   { return pkg->replaces; }
 | 
			
		||||
static alpm_list_t *_pkg_get_deltas(pmpkg_t *pkg)     { return pkg->deltas; }
 | 
			
		||||
static alpm_list_t *_pkg_get_files(pmpkg_t *pkg)      { return pkg->files; }
 | 
			
		||||
static alpm_list_t *_pkg_get_backup(pmpkg_t *pkg)     { return pkg->backup; }
 | 
			
		||||
static alpm_list_t *_pkg_get_licenses(alpm_pkg_t *pkg)   { return pkg->licenses; }
 | 
			
		||||
static alpm_list_t *_pkg_get_groups(alpm_pkg_t *pkg)     { return pkg->groups; }
 | 
			
		||||
static alpm_list_t *_pkg_get_depends(alpm_pkg_t *pkg)    { return pkg->depends; }
 | 
			
		||||
static alpm_list_t *_pkg_get_optdepends(alpm_pkg_t *pkg) { return pkg->optdepends; }
 | 
			
		||||
static alpm_list_t *_pkg_get_conflicts(alpm_pkg_t *pkg)  { return pkg->conflicts; }
 | 
			
		||||
static alpm_list_t *_pkg_get_provides(alpm_pkg_t *pkg)   { return pkg->provides; }
 | 
			
		||||
static alpm_list_t *_pkg_get_replaces(alpm_pkg_t *pkg)   { return pkg->replaces; }
 | 
			
		||||
static alpm_filelist_t *_pkg_get_files(alpm_pkg_t *pkg)  { return &(pkg->files); }
 | 
			
		||||
static alpm_list_t *_pkg_get_backup(alpm_pkg_t *pkg)     { return pkg->backup; }
 | 
			
		||||
 | 
			
		||||
static void *_pkg_changelog_open(pmpkg_t *pkg)        { return NULL; }
 | 
			
		||||
static size_t _pkg_changelog_read(void *ptr, size_t size, const pmpkg_t *pkg, const void *fp) { return 0; }
 | 
			
		||||
static int _pkg_changelog_close(const pmpkg_t *pkg, void *fp) { return EOF; }
 | 
			
		||||
static void *_pkg_changelog_open(alpm_pkg_t UNUSED *pkg)
 | 
			
		||||
{
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static size_t _pkg_changelog_read(void UNUSED *ptr, size_t UNUSED size,
 | 
			
		||||
		const alpm_pkg_t UNUSED *pkg, UNUSED void *fp)
 | 
			
		||||
{
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int _pkg_changelog_close(const alpm_pkg_t UNUSED *pkg,
 | 
			
		||||
		void UNUSED *fp)
 | 
			
		||||
{
 | 
			
		||||
	return EOF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int _pkg_force_load(alpm_pkg_t UNUSED *pkg) { return 0; }
 | 
			
		||||
 | 
			
		||||
/** The standard package operations struct. Get fields directly from the
 | 
			
		||||
 * struct itself with no abstraction layer or any type of lazy loading.
 | 
			
		||||
 */
 | 
			
		||||
struct pkg_operations default_pkg_ops = {
 | 
			
		||||
	.get_filename    = _pkg_get_filename,
 | 
			
		||||
	.get_name        = _pkg_get_name,
 | 
			
		||||
	.get_version     = _pkg_get_version,
 | 
			
		||||
	.get_desc        = _pkg_get_desc,
 | 
			
		||||
	.get_url         = _pkg_get_url,
 | 
			
		||||
	.get_builddate   = _pkg_get_builddate,
 | 
			
		||||
	.get_installdate = _pkg_get_installdate,
 | 
			
		||||
	.get_packager    = _pkg_get_packager,
 | 
			
		||||
	.get_md5sum      = _pkg_get_md5sum,
 | 
			
		||||
	.get_arch        = _pkg_get_arch,
 | 
			
		||||
	.get_size        = _pkg_get_size,
 | 
			
		||||
	.get_isize       = _pkg_get_isize,
 | 
			
		||||
	.get_reason      = _pkg_get_reason,
 | 
			
		||||
	.has_scriptlet   = _pkg_has_scriptlet,
 | 
			
		||||
@@ -147,181 +145,253 @@ struct pkg_operations default_pkg_ops = {
 | 
			
		||||
	.get_conflicts   = _pkg_get_conflicts,
 | 
			
		||||
	.get_provides    = _pkg_get_provides,
 | 
			
		||||
	.get_replaces    = _pkg_get_replaces,
 | 
			
		||||
	.get_deltas      = _pkg_get_deltas,
 | 
			
		||||
	.get_files       = _pkg_get_files,
 | 
			
		||||
	.get_backup      = _pkg_get_backup,
 | 
			
		||||
 | 
			
		||||
	.changelog_open  = _pkg_changelog_open,
 | 
			
		||||
	.changelog_read  = _pkg_changelog_read,
 | 
			
		||||
	.changelog_close = _pkg_changelog_close,
 | 
			
		||||
 | 
			
		||||
	.force_load      = _pkg_force_load,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Public functions for getting package information. These functions
 | 
			
		||||
 * delegate the hard work to the function callbacks attached to each
 | 
			
		||||
 * package, which depend on where the package was loaded from. */
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_filename(pmpkg_t *pkg)
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_filename(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	return pkg->ops->get_filename(pkg);
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->filename;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_name(pmpkg_t *pkg)
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_name(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	return pkg->ops->get_name(pkg);
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_version(pmpkg_t *pkg)
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_version(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	return pkg->ops->get_version(pkg);
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->version;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_desc(pmpkg_t *pkg)
 | 
			
		||||
alpm_pkgfrom_t SYMEXPORT alpm_pkg_get_origin(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return -1);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->origin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_desc(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_desc(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_url(pmpkg_t *pkg)
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_url(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_url(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
time_t SYMEXPORT alpm_pkg_get_builddate(pmpkg_t *pkg)
 | 
			
		||||
time_t SYMEXPORT alpm_pkg_get_builddate(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return -1);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_builddate(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
time_t SYMEXPORT alpm_pkg_get_installdate(pmpkg_t *pkg)
 | 
			
		||||
time_t SYMEXPORT alpm_pkg_get_installdate(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return -1);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_installdate(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_packager(pmpkg_t *pkg)
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_packager(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_packager(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_md5sum(pmpkg_t *pkg)
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_md5sum(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	return pkg->ops->get_md5sum(pkg);
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->md5sum;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_arch(pmpkg_t *pkg)
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_sha256sum(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->sha256sum;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_base64_sig(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->base64_sig;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char SYMEXPORT *alpm_pkg_get_arch(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_arch(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
off_t SYMEXPORT alpm_pkg_get_size(pmpkg_t *pkg)
 | 
			
		||||
off_t SYMEXPORT alpm_pkg_get_size(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	return pkg->ops->get_size(pkg);
 | 
			
		||||
	ASSERT(pkg != NULL, return -1);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
off_t SYMEXPORT alpm_pkg_get_isize(pmpkg_t *pkg)
 | 
			
		||||
off_t SYMEXPORT alpm_pkg_get_isize(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return -1);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_isize(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pmpkgreason_t SYMEXPORT alpm_pkg_get_reason(pmpkg_t *pkg)
 | 
			
		||||
alpm_pkgreason_t SYMEXPORT alpm_pkg_get_reason(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return -1);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_reason(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_licenses(pmpkg_t *pkg)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_licenses(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_licenses(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_groups(pmpkg_t *pkg)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_groups(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_groups(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_depends(pmpkg_t *pkg)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_depends(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_depends(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_optdepends(pmpkg_t *pkg)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_optdepends(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_optdepends(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_conflicts(pmpkg_t *pkg)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_conflicts(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_conflicts(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_provides(pmpkg_t *pkg)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_provides(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_provides(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_replaces(pmpkg_t *pkg)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_replaces(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_replaces(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_deltas(pmpkg_t *pkg)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_deltas(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	return pkg->ops->get_deltas(pkg);
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->deltas;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_files(pmpkg_t *pkg)
 | 
			
		||||
alpm_filelist_t SYMEXPORT *alpm_pkg_get_files(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_files(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_backup(pmpkg_t *pkg)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_get_backup(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->get_backup(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pmdb_t SYMEXPORT *alpm_pkg_get_db(pmpkg_t *pkg)
 | 
			
		||||
alpm_db_t SYMEXPORT *alpm_pkg_get_db(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	/* Sanity checks */
 | 
			
		||||
	ASSERT(pkg != NULL, return(NULL));
 | 
			
		||||
	ASSERT(pkg->origin != PKG_FROM_FILE, return(NULL));
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	ASSERT(pkg->origin != PKG_FROM_FILE, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
 | 
			
		||||
	return(pkg->origin_data.db);
 | 
			
		||||
	return pkg->origin_data.db;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Open a package changelog for reading. */
 | 
			
		||||
void SYMEXPORT *alpm_pkg_changelog_open(pmpkg_t *pkg)
 | 
			
		||||
void SYMEXPORT *alpm_pkg_changelog_open(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->changelog_open(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Read data from an open changelog 'file stream'. */
 | 
			
		||||
size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size,
 | 
			
		||||
		const pmpkg_t *pkg, const void *fp)
 | 
			
		||||
		const alpm_pkg_t *pkg, void *fp)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return 0);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->changelog_read(ptr, size, pkg, fp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
int SYMEXPORT alpm_pkg_changelog_feof(const pmpkg_t *pkg, void *fp)
 | 
			
		||||
{
 | 
			
		||||
	return pkg->ops->changelog_feof(pkg, fp);
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** Close a package changelog for reading. */
 | 
			
		||||
int SYMEXPORT alpm_pkg_changelog_close(const pmpkg_t *pkg, void *fp)
 | 
			
		||||
int SYMEXPORT alpm_pkg_changelog_close(const alpm_pkg_t *pkg, void *fp)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return -1);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->changelog_close(pkg, fp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SYMEXPORT alpm_pkg_has_scriptlet(pmpkg_t *pkg)
 | 
			
		||||
int SYMEXPORT alpm_pkg_has_scriptlet(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ASSERT(pkg != NULL, return -1);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
	return pkg->ops->has_scriptlet(pkg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void find_requiredby(pmpkg_t *pkg, pmdb_t *db, alpm_list_t **reqs)
 | 
			
		||||
static void find_requiredby(alpm_pkg_t *pkg, alpm_db_t *db, alpm_list_t **reqs)
 | 
			
		||||
{
 | 
			
		||||
	const alpm_list_t *i;
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
 | 
			
		||||
	for(i = _alpm_db_get_pkgcache(db); i; i = i->next) {
 | 
			
		||||
		pmpkg_t *cachepkg = i->data;
 | 
			
		||||
		alpm_list_t *i;
 | 
			
		||||
		for(i = alpm_pkg_get_depends(cachepkg); i; i = i->next) {
 | 
			
		||||
			if(_alpm_depcmp(pkg, i->data)) {
 | 
			
		||||
		alpm_pkg_t *cachepkg = i->data;
 | 
			
		||||
		alpm_list_t *j;
 | 
			
		||||
		for(j = alpm_pkg_get_depends(cachepkg); j; j = j->next) {
 | 
			
		||||
			if(_alpm_depcmp(pkg, j->data)) {
 | 
			
		||||
				const char *cachepkgname = cachepkg->name;
 | 
			
		||||
				if(alpm_list_find_str(*reqs, cachepkgname) == NULL) {
 | 
			
		||||
					*reqs = alpm_list_add(*reqs, strdup(cachepkgname));
 | 
			
		||||
@@ -332,101 +402,167 @@ static void find_requiredby(pmpkg_t *pkg, pmdb_t *db, alpm_list_t **reqs)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Compute the packages requiring a given package. */
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_compute_requiredby(pmpkg_t *pkg)
 | 
			
		||||
alpm_list_t SYMEXPORT *alpm_pkg_compute_requiredby(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	const alpm_list_t *i;
 | 
			
		||||
	alpm_list_t *reqs = NULL;
 | 
			
		||||
	pmdb_t *db;
 | 
			
		||||
	alpm_db_t *db;
 | 
			
		||||
 | 
			
		||||
	ASSERT(pkg != NULL, return NULL);
 | 
			
		||||
	pkg->handle->pm_errno = 0;
 | 
			
		||||
 | 
			
		||||
	if(pkg->origin == PKG_FROM_FILE) {
 | 
			
		||||
		/* The sane option; search locally for things that require this. */
 | 
			
		||||
		db = alpm_option_get_localdb();
 | 
			
		||||
		find_requiredby(pkg, db, &reqs);
 | 
			
		||||
		find_requiredby(pkg, pkg->handle->db_local, &reqs);
 | 
			
		||||
	} else {
 | 
			
		||||
		/* We have a DB package. if it is a local package, then we should
 | 
			
		||||
		 * only search the local DB; else search all known sync databases. */
 | 
			
		||||
		db = pkg->origin_data.db;
 | 
			
		||||
		if(db->is_local) {
 | 
			
		||||
		if(db->status & DB_STATUS_LOCAL) {
 | 
			
		||||
			find_requiredby(pkg, db, &reqs);
 | 
			
		||||
		} else {
 | 
			
		||||
			for(i = handle->dbs_sync; i; i = i->next) {
 | 
			
		||||
			for(i = pkg->handle->dbs_sync; i; i = i->next) {
 | 
			
		||||
				db = i->data;
 | 
			
		||||
				find_requiredby(pkg, db, &reqs);
 | 
			
		||||
			}
 | 
			
		||||
			reqs = alpm_list_msort(reqs, alpm_list_count(reqs), _alpm_str_cmp);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return(reqs);
 | 
			
		||||
	return reqs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
pmpkg_t *_alpm_pkg_new(void)
 | 
			
		||||
alpm_file_t *_alpm_file_copy(alpm_file_t *dest,
 | 
			
		||||
		const alpm_file_t *src)
 | 
			
		||||
{
 | 
			
		||||
	pmpkg_t* pkg;
 | 
			
		||||
	STRDUP(dest->name, src->name, return NULL);
 | 
			
		||||
	dest->size = src->size;
 | 
			
		||||
	dest->mode = src->mode;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	CALLOC(pkg, 1, sizeof(pmpkg_t), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
 | 
			
		||||
	return(pkg);
 | 
			
		||||
	return dest;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pmpkg_t *_alpm_pkg_dup(pmpkg_t *pkg)
 | 
			
		||||
/* Helper function for comparing files list entries
 | 
			
		||||
 */
 | 
			
		||||
int _alpm_files_cmp(const void *f1, const void *f2)
 | 
			
		||||
{
 | 
			
		||||
	pmpkg_t *newpkg;
 | 
			
		||||
	const alpm_file_t *file1 = f1;
 | 
			
		||||
	const alpm_file_t *file2 = f2;
 | 
			
		||||
	return strcmp(file1->name, file2->name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
alpm_pkg_t *_alpm_pkg_new(void)
 | 
			
		||||
{
 | 
			
		||||
	alpm_pkg_t* pkg;
 | 
			
		||||
 | 
			
		||||
	CALLOC(pkg, 1, sizeof(alpm_pkg_t), return NULL);
 | 
			
		||||
 | 
			
		||||
	return pkg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Duplicate a package data struct.
 | 
			
		||||
 * @param pkg the package to duplicate
 | 
			
		||||
 * @param new_ptr location to store duplicated package pointer
 | 
			
		||||
 * @return 0 on success, -1 on fatal error, 1 on non-fatal error
 | 
			
		||||
 */
 | 
			
		||||
int _alpm_pkg_dup(alpm_pkg_t *pkg, alpm_pkg_t **new_ptr)
 | 
			
		||||
{
 | 
			
		||||
	alpm_pkg_t *newpkg;
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
	if(!pkg || !pkg->handle) {
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	CALLOC(newpkg, 1, sizeof(pmpkg_t), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	if(!new_ptr) {
 | 
			
		||||
		RET_ERR(pkg->handle, ALPM_ERR_WRONG_ARGS, -1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(pkg->ops->force_load(pkg)) {
 | 
			
		||||
		_alpm_log(pkg->handle, ALPM_LOG_WARNING,
 | 
			
		||||
				_("could not fully load metadata for package %s-%s\n"),
 | 
			
		||||
				pkg->name, pkg->version);
 | 
			
		||||
		ret = 1;
 | 
			
		||||
		pkg->handle->pm_errno = ALPM_ERR_PKG_INVALID;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	CALLOC(newpkg, 1, sizeof(alpm_pkg_t), goto cleanup);
 | 
			
		||||
 | 
			
		||||
	newpkg->name_hash = pkg->name_hash;
 | 
			
		||||
	STRDUP(newpkg->filename, pkg->filename, RET_ERR(PM_ERR_MEMORY, newpkg));
 | 
			
		||||
	STRDUP(newpkg->name, pkg->name, RET_ERR(PM_ERR_MEMORY, newpkg));
 | 
			
		||||
	STRDUP(newpkg->version, pkg->version, RET_ERR(PM_ERR_MEMORY, newpkg));
 | 
			
		||||
	STRDUP(newpkg->desc, pkg->desc, RET_ERR(PM_ERR_MEMORY, newpkg));
 | 
			
		||||
	STRDUP(newpkg->url, pkg->url, RET_ERR(PM_ERR_MEMORY, newpkg));
 | 
			
		||||
	STRDUP(newpkg->filename, pkg->filename, goto cleanup);
 | 
			
		||||
	STRDUP(newpkg->name, pkg->name, goto cleanup);
 | 
			
		||||
	STRDUP(newpkg->version, pkg->version, goto cleanup);
 | 
			
		||||
	STRDUP(newpkg->desc, pkg->desc, goto cleanup);
 | 
			
		||||
	STRDUP(newpkg->url, pkg->url, goto cleanup);
 | 
			
		||||
	newpkg->builddate = pkg->builddate;
 | 
			
		||||
	newpkg->installdate = pkg->installdate;
 | 
			
		||||
	STRDUP(newpkg->packager, pkg->packager, RET_ERR(PM_ERR_MEMORY, newpkg));
 | 
			
		||||
	STRDUP(newpkg->md5sum, pkg->md5sum, RET_ERR(PM_ERR_MEMORY, newpkg));
 | 
			
		||||
	STRDUP(newpkg->arch, pkg->arch, RET_ERR(PM_ERR_MEMORY, newpkg));
 | 
			
		||||
	STRDUP(newpkg->packager, pkg->packager, goto cleanup);
 | 
			
		||||
	STRDUP(newpkg->md5sum, pkg->md5sum, goto cleanup);
 | 
			
		||||
	STRDUP(newpkg->sha256sum, pkg->md5sum, goto cleanup);
 | 
			
		||||
	STRDUP(newpkg->arch, pkg->arch, goto cleanup);
 | 
			
		||||
	newpkg->size = pkg->size;
 | 
			
		||||
	newpkg->isize = pkg->isize;
 | 
			
		||||
	newpkg->scriptlet = pkg->scriptlet;
 | 
			
		||||
	newpkg->reason = pkg->reason;
 | 
			
		||||
 | 
			
		||||
	newpkg->licenses   = alpm_list_strdup(pkg->licenses);
 | 
			
		||||
	newpkg->replaces   = alpm_list_strdup(pkg->replaces);
 | 
			
		||||
	for(i = pkg->replaces; i; i = i->next) {
 | 
			
		||||
		newpkg->replaces = alpm_list_add(newpkg->replaces, _alpm_dep_dup(i->data));
 | 
			
		||||
	}
 | 
			
		||||
	newpkg->groups     = alpm_list_strdup(pkg->groups);
 | 
			
		||||
	newpkg->files      = alpm_list_strdup(pkg->files);
 | 
			
		||||
	newpkg->backup     = alpm_list_strdup(pkg->backup);
 | 
			
		||||
	for(i = pkg->depends; i; i = alpm_list_next(i)) {
 | 
			
		||||
	if(pkg->files.count) {
 | 
			
		||||
		size_t filenum;
 | 
			
		||||
		size_t len = sizeof(alpm_file_t) * pkg->files.count;
 | 
			
		||||
		MALLOC(newpkg->files.files, len, goto cleanup);
 | 
			
		||||
		for(filenum = 0; filenum < pkg->files.count; filenum++) {
 | 
			
		||||
			if(!_alpm_file_copy(newpkg->files.files + filenum,
 | 
			
		||||
						pkg->files.files + filenum)) {
 | 
			
		||||
				goto cleanup;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		newpkg->files.count = pkg->files.count;
 | 
			
		||||
	}
 | 
			
		||||
	for(i = pkg->backup; i; i = i->next) {
 | 
			
		||||
		newpkg->backup = alpm_list_add(newpkg->backup, _alpm_backup_dup(i->data));
 | 
			
		||||
	}
 | 
			
		||||
	for(i = pkg->depends; i; i = i->next) {
 | 
			
		||||
		newpkg->depends = alpm_list_add(newpkg->depends, _alpm_dep_dup(i->data));
 | 
			
		||||
	}
 | 
			
		||||
	newpkg->optdepends = alpm_list_strdup(pkg->optdepends);
 | 
			
		||||
	newpkg->conflicts  = alpm_list_strdup(pkg->conflicts);
 | 
			
		||||
	newpkg->provides   = alpm_list_strdup(pkg->provides);
 | 
			
		||||
	newpkg->deltas     = alpm_list_copy_data(pkg->deltas, sizeof(pmdelta_t));
 | 
			
		||||
	for(i = pkg->conflicts; i; i = i->next) {
 | 
			
		||||
		newpkg->conflicts = alpm_list_add(newpkg->conflicts, _alpm_dep_dup(i->data));
 | 
			
		||||
	}
 | 
			
		||||
	for(i = pkg->provides; i; i = i->next) {
 | 
			
		||||
		newpkg->provides = alpm_list_add(newpkg->provides, _alpm_dep_dup(i->data));
 | 
			
		||||
	}
 | 
			
		||||
	for(i = pkg->deltas; i; i = i->next) {
 | 
			
		||||
		newpkg->deltas = alpm_list_add(newpkg->deltas, _alpm_delta_dup(i->data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* internal */
 | 
			
		||||
	newpkg->infolevel = pkg->infolevel;
 | 
			
		||||
	newpkg->origin = pkg->origin;
 | 
			
		||||
	newpkg->ops = pkg->ops;
 | 
			
		||||
	if(newpkg->origin == PKG_FROM_FILE) {
 | 
			
		||||
		newpkg->origin_data.file = strdup(pkg->origin_data.file);
 | 
			
		||||
	} else {
 | 
			
		||||
		newpkg->origin_data.db = pkg->origin_data.db;
 | 
			
		||||
	}
 | 
			
		||||
	newpkg->infolevel = pkg->infolevel;
 | 
			
		||||
	newpkg->ops = pkg->ops;
 | 
			
		||||
	newpkg->handle = pkg->handle;
 | 
			
		||||
 | 
			
		||||
	return(newpkg);
 | 
			
		||||
	*new_ptr = newpkg;
 | 
			
		||||
	return ret;
 | 
			
		||||
 | 
			
		||||
cleanup:
 | 
			
		||||
	_alpm_pkg_free(newpkg);
 | 
			
		||||
	RET_ERR(pkg->handle, ALPM_ERR_MEMORY, -1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_pkg_free(pmpkg_t *pkg)
 | 
			
		||||
void _alpm_pkg_free(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(pkg == NULL) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
@@ -438,17 +574,30 @@ void _alpm_pkg_free(pmpkg_t *pkg)
 | 
			
		||||
	FREE(pkg->url);
 | 
			
		||||
	FREE(pkg->packager);
 | 
			
		||||
	FREE(pkg->md5sum);
 | 
			
		||||
	FREE(pkg->sha256sum);
 | 
			
		||||
	FREE(pkg->base64_sig);
 | 
			
		||||
	FREE(pkg->arch);
 | 
			
		||||
 | 
			
		||||
	FREELIST(pkg->licenses);
 | 
			
		||||
	FREELIST(pkg->replaces);
 | 
			
		||||
	alpm_list_free_inner(pkg->replaces, (alpm_list_fn_free)_alpm_dep_free);
 | 
			
		||||
	alpm_list_free(pkg->replaces);
 | 
			
		||||
	FREELIST(pkg->groups);
 | 
			
		||||
	FREELIST(pkg->files);
 | 
			
		||||
	FREELIST(pkg->backup);
 | 
			
		||||
	if(pkg->files.count) {
 | 
			
		||||
		size_t i;
 | 
			
		||||
		for(i = 0; i < pkg->files.count; i++) {
 | 
			
		||||
			free(pkg->files.files[i].name);
 | 
			
		||||
		}
 | 
			
		||||
		free(pkg->files.files);
 | 
			
		||||
	}
 | 
			
		||||
	alpm_list_free_inner(pkg->backup, (alpm_list_fn_free)_alpm_backup_free);
 | 
			
		||||
	alpm_list_free(pkg->backup);
 | 
			
		||||
	alpm_list_free_inner(pkg->depends, (alpm_list_fn_free)_alpm_dep_free);
 | 
			
		||||
	alpm_list_free(pkg->depends);
 | 
			
		||||
	FREELIST(pkg->optdepends);
 | 
			
		||||
	FREELIST(pkg->conflicts);
 | 
			
		||||
	FREELIST(pkg->provides);
 | 
			
		||||
	alpm_list_free_inner(pkg->conflicts, (alpm_list_fn_free)_alpm_dep_free);
 | 
			
		||||
	alpm_list_free(pkg->conflicts);
 | 
			
		||||
	alpm_list_free_inner(pkg->provides, (alpm_list_fn_free)_alpm_dep_free);
 | 
			
		||||
	alpm_list_free(pkg->provides);
 | 
			
		||||
	alpm_list_free_inner(pkg->deltas, (alpm_list_fn_free)_alpm_delta_free);
 | 
			
		||||
	alpm_list_free(pkg->deltas);
 | 
			
		||||
	alpm_list_free(pkg->delta_path);
 | 
			
		||||
@@ -465,10 +614,8 @@ void _alpm_pkg_free(pmpkg_t *pkg)
 | 
			
		||||
 * Case 2: If pkg is a pkgcache entry (PKG_FROM_CACHE), it won't be freed,
 | 
			
		||||
 *         only the transaction specific fields of pkg will be freed.
 | 
			
		||||
 */
 | 
			
		||||
void _alpm_pkg_free_trans(pmpkg_t *pkg)
 | 
			
		||||
void _alpm_pkg_free_trans(alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(pkg == NULL) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
@@ -483,84 +630,79 @@ void _alpm_pkg_free_trans(pmpkg_t *pkg)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Is spkg an upgrade for localpkg? */
 | 
			
		||||
int _alpm_pkg_compare_versions(pmpkg_t *spkg, pmpkg_t *localpkg)
 | 
			
		||||
int _alpm_pkg_compare_versions(alpm_pkg_t *spkg, alpm_pkg_t *localpkg)
 | 
			
		||||
{
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	return alpm_pkg_vercmp(alpm_pkg_get_version(spkg),
 | 
			
		||||
			alpm_pkg_get_version(localpkg));
 | 
			
		||||
	return alpm_pkg_vercmp(spkg->version, localpkg->version);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Helper function for comparing packages
 | 
			
		||||
 */
 | 
			
		||||
int _alpm_pkg_cmp(const void *p1, const void *p2)
 | 
			
		||||
{
 | 
			
		||||
	pmpkg_t *pkg1 = (pmpkg_t *)p1;
 | 
			
		||||
	pmpkg_t *pkg2 = (pmpkg_t *)p2;
 | 
			
		||||
	return(strcoll(pkg1->name, pkg2->name));
 | 
			
		||||
	const alpm_pkg_t *pkg1 = p1;
 | 
			
		||||
	const alpm_pkg_t *pkg2 = p2;
 | 
			
		||||
	return strcmp(pkg1->name, pkg2->name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Test for existence of a package in a alpm_list_t*
 | 
			
		||||
 * of pmpkg_t*
 | 
			
		||||
 * of alpm_pkg_t*
 | 
			
		||||
 */
 | 
			
		||||
pmpkg_t *_alpm_pkg_find(alpm_list_t *haystack, const char *needle)
 | 
			
		||||
alpm_pkg_t *_alpm_pkg_find(alpm_list_t *haystack, const char *needle)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *lp;
 | 
			
		||||
	unsigned long needle_hash;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(needle == NULL || haystack == NULL) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	needle_hash = _alpm_hash_sdbm(needle);
 | 
			
		||||
 | 
			
		||||
	for(lp = haystack; lp; lp = lp->next) {
 | 
			
		||||
		pmpkg_t *info = lp->data;
 | 
			
		||||
		alpm_pkg_t *info = lp->data;
 | 
			
		||||
 | 
			
		||||
		if(info) {
 | 
			
		||||
			/* a zero hash will cause a fall-through just in case */
 | 
			
		||||
			if(info->name_hash && info->name_hash != needle_hash) {
 | 
			
		||||
			if(info->name_hash != needle_hash) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/* finally: we had hash match, verify string match */
 | 
			
		||||
			if(strcmp(info->name, needle) == 0) {
 | 
			
		||||
				return(info);
 | 
			
		||||
				return info;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return(NULL);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Test if a package should be ignored.
 | 
			
		||||
 *
 | 
			
		||||
 * Checks if the package is ignored via IgnorePkg, or if the package is
 | 
			
		||||
 * in a group ignored via IgnoreGrp.
 | 
			
		||||
 * in a group ignored via IgnoreGroup.
 | 
			
		||||
 *
 | 
			
		||||
 * @param handle the context handle
 | 
			
		||||
 * @param pkg the package to test
 | 
			
		||||
 *
 | 
			
		||||
 * @return 1 if the package should be ignored, 0 otherwise
 | 
			
		||||
 */
 | 
			
		||||
int _alpm_pkg_should_ignore(pmpkg_t *pkg)
 | 
			
		||||
int _alpm_pkg_should_ignore(alpm_handle_t *handle, alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *groups = NULL;
 | 
			
		||||
 | 
			
		||||
	/* first see if the package is ignored */
 | 
			
		||||
	if(alpm_list_find_str(handle->ignorepkg, alpm_pkg_get_name(pkg))) {
 | 
			
		||||
		return(1);
 | 
			
		||||
	if(alpm_list_find_str(handle->ignorepkg, pkg->name)) {
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* next see if the package is in a group that is ignored */
 | 
			
		||||
	for(groups = handle->ignoregrp; groups; groups = alpm_list_next(groups)) {
 | 
			
		||||
		char *grp = (char *)alpm_list_getdata(groups);
 | 
			
		||||
	for(groups = handle->ignoregroup; groups; groups = groups->next) {
 | 
			
		||||
		char *grp = groups->data;
 | 
			
		||||
		if(alpm_list_find_str(alpm_pkg_get_groups(pkg), grp)) {
 | 
			
		||||
			return(1);
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -24,17 +24,15 @@
 | 
			
		||||
#ifndef _ALPM_PACKAGE_H
 | 
			
		||||
#define _ALPM_PACKAGE_H
 | 
			
		||||
 | 
			
		||||
#include "config.h" /* ensure off_t is correct length */
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h> /* off_t */
 | 
			
		||||
#include <time.h> /* time_t */
 | 
			
		||||
 | 
			
		||||
#include "alpm.h"
 | 
			
		||||
#include "backup.h"
 | 
			
		||||
#include "db.h"
 | 
			
		||||
 | 
			
		||||
typedef enum _pmpkgfrom_t {
 | 
			
		||||
	PKG_FROM_FILE = 1,
 | 
			
		||||
	PKG_FROM_LOCALDB,
 | 
			
		||||
	PKG_FROM_SYNCDB
 | 
			
		||||
} pmpkgfrom_t;
 | 
			
		||||
#include "signing.h"
 | 
			
		||||
 | 
			
		||||
/** Package operations struct. This struct contains function pointers to
 | 
			
		||||
 * all methods used to access data in a package to allow for things such
 | 
			
		||||
@@ -44,40 +42,31 @@ typedef enum _pmpkgfrom_t {
 | 
			
		||||
 * defined default_pkg_ops struct to work just fine for their needs.
 | 
			
		||||
 */
 | 
			
		||||
struct pkg_operations {
 | 
			
		||||
	const char *(*get_filename) (pmpkg_t *);
 | 
			
		||||
	const char *(*get_name) (pmpkg_t *);
 | 
			
		||||
	const char *(*get_version) (pmpkg_t *);
 | 
			
		||||
	const char *(*get_desc) (pmpkg_t *);
 | 
			
		||||
	const char *(*get_url) (pmpkg_t *);
 | 
			
		||||
	time_t (*get_builddate) (pmpkg_t *);
 | 
			
		||||
	time_t (*get_installdate) (pmpkg_t *);
 | 
			
		||||
	const char *(*get_packager) (pmpkg_t *);
 | 
			
		||||
	const char *(*get_md5sum) (pmpkg_t *);
 | 
			
		||||
	const char *(*get_arch) (pmpkg_t *);
 | 
			
		||||
	off_t (*get_size) (pmpkg_t *);
 | 
			
		||||
	off_t (*get_isize) (pmpkg_t *);
 | 
			
		||||
	pmpkgreason_t (*get_reason) (pmpkg_t *);
 | 
			
		||||
	int (*has_scriptlet) (pmpkg_t *);
 | 
			
		||||
	const char *(*get_desc) (alpm_pkg_t *);
 | 
			
		||||
	const char *(*get_url) (alpm_pkg_t *);
 | 
			
		||||
	time_t (*get_builddate) (alpm_pkg_t *);
 | 
			
		||||
	time_t (*get_installdate) (alpm_pkg_t *);
 | 
			
		||||
	const char *(*get_packager) (alpm_pkg_t *);
 | 
			
		||||
	const char *(*get_arch) (alpm_pkg_t *);
 | 
			
		||||
	off_t (*get_isize) (alpm_pkg_t *);
 | 
			
		||||
	alpm_pkgreason_t (*get_reason) (alpm_pkg_t *);
 | 
			
		||||
	int (*has_scriptlet) (alpm_pkg_t *);
 | 
			
		||||
 | 
			
		||||
	alpm_list_t *(*get_licenses) (pmpkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_groups) (pmpkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_depends) (pmpkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_optdepends) (pmpkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_conflicts) (pmpkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_provides) (pmpkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_replaces) (pmpkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_deltas) (pmpkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_files) (pmpkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_backup) (pmpkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_licenses) (alpm_pkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_groups) (alpm_pkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_depends) (alpm_pkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_optdepends) (alpm_pkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_conflicts) (alpm_pkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_provides) (alpm_pkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_replaces) (alpm_pkg_t *);
 | 
			
		||||
	alpm_filelist_t *(*get_files) (alpm_pkg_t *);
 | 
			
		||||
	alpm_list_t *(*get_backup) (alpm_pkg_t *);
 | 
			
		||||
 | 
			
		||||
	void *(*changelog_open) (pmpkg_t *);
 | 
			
		||||
	size_t (*changelog_read) (void *, size_t, const pmpkg_t *, const void *);
 | 
			
		||||
	int (*changelog_close) (const pmpkg_t *, void *);
 | 
			
		||||
	void *(*changelog_open) (alpm_pkg_t *);
 | 
			
		||||
	size_t (*changelog_read) (void *, size_t, const alpm_pkg_t *, void *);
 | 
			
		||||
	int (*changelog_close) (const alpm_pkg_t *, void *);
 | 
			
		||||
 | 
			
		||||
	/* still to add:
 | 
			
		||||
	 * checkmd5sum() ?
 | 
			
		||||
	 * compute_requiredby()
 | 
			
		||||
	 */
 | 
			
		||||
	int (*force_load) (alpm_pkg_t *);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** The standard package operations struct. get fields directly from the
 | 
			
		||||
@@ -87,7 +76,7 @@ struct pkg_operations {
 | 
			
		||||
 */
 | 
			
		||||
extern struct pkg_operations default_pkg_ops;
 | 
			
		||||
 | 
			
		||||
struct __pmpkg_t {
 | 
			
		||||
struct __alpm_pkg_t {
 | 
			
		||||
	unsigned long name_hash;
 | 
			
		||||
	char *filename;
 | 
			
		||||
	char *name;
 | 
			
		||||
@@ -96,6 +85,8 @@ struct __pmpkg_t {
 | 
			
		||||
	char *url;
 | 
			
		||||
	char *packager;
 | 
			
		||||
	char *md5sum;
 | 
			
		||||
	char *sha256sum;
 | 
			
		||||
	char *base64_sig;
 | 
			
		||||
	char *arch;
 | 
			
		||||
 | 
			
		||||
	time_t builddate;
 | 
			
		||||
@@ -107,20 +98,20 @@ struct __pmpkg_t {
 | 
			
		||||
 | 
			
		||||
	int scriptlet;
 | 
			
		||||
 | 
			
		||||
	pmpkgreason_t reason;
 | 
			
		||||
	pmpkgfrom_t origin;
 | 
			
		||||
	alpm_pkgreason_t reason;
 | 
			
		||||
	alpm_dbinfrq_t infolevel;
 | 
			
		||||
	alpm_pkgfrom_t origin;
 | 
			
		||||
	/* origin == PKG_FROM_FILE, use pkg->origin_data.file
 | 
			
		||||
	 * origin == PKG_FROM_*DB, use pkg->origin_data.db */
 | 
			
		||||
	union {
 | 
			
		||||
		pmdb_t *db;
 | 
			
		||||
		alpm_db_t *db;
 | 
			
		||||
		char *file;
 | 
			
		||||
	} origin_data;
 | 
			
		||||
	pmdbinfrq_t infolevel;
 | 
			
		||||
	alpm_handle_t *handle;
 | 
			
		||||
 | 
			
		||||
	alpm_list_t *licenses;
 | 
			
		||||
	alpm_list_t *replaces;
 | 
			
		||||
	alpm_list_t *groups;
 | 
			
		||||
	alpm_list_t *files;
 | 
			
		||||
	alpm_list_t *backup;
 | 
			
		||||
	alpm_list_t *depends;
 | 
			
		||||
	alpm_list_t *optdepends;
 | 
			
		||||
@@ -131,16 +122,28 @@ struct __pmpkg_t {
 | 
			
		||||
	alpm_list_t *removes; /* in transaction targets only */
 | 
			
		||||
 | 
			
		||||
	struct pkg_operations *ops;
 | 
			
		||||
 | 
			
		||||
	alpm_filelist_t files;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
pmpkg_t* _alpm_pkg_new(void);
 | 
			
		||||
pmpkg_t *_alpm_pkg_dup(pmpkg_t *pkg);
 | 
			
		||||
void _alpm_pkg_free(pmpkg_t *pkg);
 | 
			
		||||
void _alpm_pkg_free_trans(pmpkg_t *pkg);
 | 
			
		||||
alpm_file_t *_alpm_file_copy(alpm_file_t *dest, const alpm_file_t *src);
 | 
			
		||||
int _alpm_files_cmp(const void *f1, const void *f2);
 | 
			
		||||
 | 
			
		||||
alpm_pkg_t* _alpm_pkg_new(void);
 | 
			
		||||
int _alpm_pkg_dup(alpm_pkg_t *pkg, alpm_pkg_t **new_ptr);
 | 
			
		||||
void _alpm_pkg_free(alpm_pkg_t *pkg);
 | 
			
		||||
void _alpm_pkg_free_trans(alpm_pkg_t *pkg);
 | 
			
		||||
 | 
			
		||||
int _alpm_pkg_validate_internal(alpm_handle_t *handle,
 | 
			
		||||
		const char *pkgfile, alpm_pkg_t *syncpkg, alpm_siglevel_t level,
 | 
			
		||||
		alpm_siglist_t **sigdata);
 | 
			
		||||
alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle,
 | 
			
		||||
		const char *pkgfile, int full);
 | 
			
		||||
 | 
			
		||||
int _alpm_pkg_cmp(const void *p1, const void *p2);
 | 
			
		||||
int _alpm_pkg_compare_versions(pmpkg_t *local_pkg, pmpkg_t *pkg);
 | 
			
		||||
pmpkg_t *_alpm_pkg_find(alpm_list_t *haystack, const char *needle);
 | 
			
		||||
int _alpm_pkg_should_ignore(pmpkg_t *pkg);
 | 
			
		||||
int _alpm_pkg_compare_versions(alpm_pkg_t *local_pkg, alpm_pkg_t *pkg);
 | 
			
		||||
alpm_pkg_t *_alpm_pkg_find(alpm_list_t *haystack, const char *needle);
 | 
			
		||||
int _alpm_pkg_should_ignore(alpm_handle_t *handle, alpm_pkg_t *pkg);
 | 
			
		||||
 | 
			
		||||
#endif /* _ALPM_PACKAGE_H */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,9 +17,10 @@
 | 
			
		||||
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include "pkghash.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
 | 
			
		||||
/* List of primes for possible sizes of hash tables.
 | 
			
		||||
 *
 | 
			
		||||
@@ -50,16 +51,12 @@ static const size_t prime_list[] =
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Allocate a hash table with at least "size" buckets */
 | 
			
		||||
pmpkghash_t *_alpm_pkghash_create(size_t size)
 | 
			
		||||
alpm_pkghash_t *_alpm_pkghash_create(size_t size)
 | 
			
		||||
{
 | 
			
		||||
	pmpkghash_t *hash = NULL;
 | 
			
		||||
	alpm_pkghash_t *hash = NULL;
 | 
			
		||||
	size_t i, loopsize;
 | 
			
		||||
 | 
			
		||||
	MALLOC(hash, sizeof(pmpkghash_t), RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
 | 
			
		||||
	hash->list = NULL;
 | 
			
		||||
	hash->entries = 0;
 | 
			
		||||
	hash->buckets = 0;
 | 
			
		||||
	CALLOC(hash, 1, sizeof(alpm_pkghash_t), return NULL);
 | 
			
		||||
 | 
			
		||||
	loopsize = sizeof(prime_list) / sizeof(*prime_list);
 | 
			
		||||
	for(i = 0; i < loopsize; i++) {
 | 
			
		||||
@@ -70,18 +67,18 @@ pmpkghash_t *_alpm_pkghash_create(size_t size)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(hash->buckets < size) {
 | 
			
		||||
		_alpm_log(PM_LOG_ERROR, _("database larger than maximum size\n"));
 | 
			
		||||
		errno = ERANGE;
 | 
			
		||||
		free(hash);
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	CALLOC(hash->hash_table, hash->buckets, sizeof(alpm_list_t*), \
 | 
			
		||||
				free(hash); RET_ERR(PM_ERR_MEMORY, NULL));
 | 
			
		||||
	CALLOC(hash->hash_table, hash->buckets, sizeof(alpm_list_t *), \
 | 
			
		||||
				free(hash); return NULL);
 | 
			
		||||
 | 
			
		||||
	return(hash);
 | 
			
		||||
	return hash;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static size_t get_hash_position(unsigned long name_hash, pmpkghash_t *hash)
 | 
			
		||||
static size_t get_hash_position(unsigned long name_hash, alpm_pkghash_t *hash)
 | 
			
		||||
{
 | 
			
		||||
	size_t position;
 | 
			
		||||
 | 
			
		||||
@@ -92,13 +89,13 @@ static size_t get_hash_position(unsigned long name_hash, pmpkghash_t *hash)
 | 
			
		||||
		position = (position + 1) % hash->buckets;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(position);
 | 
			
		||||
	return position;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Expand the hash table size to the next increment and rebin the entries */
 | 
			
		||||
static pmpkghash_t *rehash(pmpkghash_t *oldhash)
 | 
			
		||||
static alpm_pkghash_t *rehash(alpm_pkghash_t *oldhash)
 | 
			
		||||
{
 | 
			
		||||
	pmpkghash_t *newhash;
 | 
			
		||||
	alpm_pkghash_t *newhash;
 | 
			
		||||
	size_t newsize, position, i;
 | 
			
		||||
 | 
			
		||||
	/* Hash tables will need resized in two cases:
 | 
			
		||||
@@ -123,7 +120,7 @@ static pmpkghash_t *rehash(pmpkghash_t *oldhash)
 | 
			
		||||
	newhash = _alpm_pkghash_create(newsize);
 | 
			
		||||
	if(newhash == NULL) {
 | 
			
		||||
		/* creation of newhash failed, stick with old one... */
 | 
			
		||||
		return(oldhash);
 | 
			
		||||
		return oldhash;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newhash->list = oldhash->list;
 | 
			
		||||
@@ -131,7 +128,7 @@ static pmpkghash_t *rehash(pmpkghash_t *oldhash)
 | 
			
		||||
 | 
			
		||||
	for(i = 0; i < oldhash->buckets; i++) {
 | 
			
		||||
		if(oldhash->hash_table[i] != NULL) {
 | 
			
		||||
			pmpkg_t *package = oldhash->hash_table[i]->data;
 | 
			
		||||
			alpm_pkg_t *package = oldhash->hash_table[i]->data;
 | 
			
		||||
 | 
			
		||||
			position = get_hash_position(package->name_hash, newhash);
 | 
			
		||||
 | 
			
		||||
@@ -144,16 +141,16 @@ static pmpkghash_t *rehash(pmpkghash_t *oldhash)
 | 
			
		||||
 | 
			
		||||
	_alpm_pkghash_free(oldhash);
 | 
			
		||||
 | 
			
		||||
	return(newhash);
 | 
			
		||||
	return newhash;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static pmpkghash_t *pkghash_add_pkg(pmpkghash_t *hash, pmpkg_t *pkg, int sorted)
 | 
			
		||||
static alpm_pkghash_t *pkghash_add_pkg(alpm_pkghash_t *hash, alpm_pkg_t *pkg, int sorted)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *ptr;
 | 
			
		||||
	size_t position;
 | 
			
		||||
 | 
			
		||||
	if(pkg == NULL || hash == NULL) {
 | 
			
		||||
		return(hash);
 | 
			
		||||
		return hash;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if((hash->entries + 1) / MAX_HASH_LOAD > hash->buckets) {
 | 
			
		||||
@@ -162,37 +159,37 @@ static pmpkghash_t *pkghash_add_pkg(pmpkghash_t *hash, pmpkg_t *pkg, int sorted)
 | 
			
		||||
 | 
			
		||||
	position = get_hash_position(pkg->name_hash, hash);
 | 
			
		||||
 | 
			
		||||
	ptr = calloc(1, sizeof(alpm_list_t));
 | 
			
		||||
	ptr = malloc(sizeof(alpm_list_t));
 | 
			
		||||
	if(ptr == NULL) {
 | 
			
		||||
		return(hash);
 | 
			
		||||
		return hash;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ptr->data = pkg;
 | 
			
		||||
	ptr->next = NULL;
 | 
			
		||||
	ptr->prev = ptr;
 | 
			
		||||
	ptr->next = NULL;
 | 
			
		||||
 | 
			
		||||
	hash->hash_table[position] = ptr;
 | 
			
		||||
	if(!sorted){
 | 
			
		||||
	if(!sorted) {
 | 
			
		||||
		hash->list = alpm_list_join(hash->list, ptr);
 | 
			
		||||
	}else{
 | 
			
		||||
	} else {
 | 
			
		||||
		hash->list = alpm_list_mmerge(hash->list, ptr, _alpm_pkg_cmp);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	hash->entries += 1;
 | 
			
		||||
	return(hash);
 | 
			
		||||
	return hash;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pmpkghash_t *_alpm_pkghash_add(pmpkghash_t *hash, pmpkg_t *pkg)
 | 
			
		||||
alpm_pkghash_t *_alpm_pkghash_add(alpm_pkghash_t *hash, alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	return(pkghash_add_pkg(hash, pkg, 0));
 | 
			
		||||
	return pkghash_add_pkg(hash, pkg, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pmpkghash_t *_alpm_pkghash_add_sorted(pmpkghash_t *hash, pmpkg_t *pkg)
 | 
			
		||||
alpm_pkghash_t *_alpm_pkghash_add_sorted(alpm_pkghash_t *hash, alpm_pkg_t *pkg)
 | 
			
		||||
{
 | 
			
		||||
	return(pkghash_add_pkg(hash, pkg, 1));
 | 
			
		||||
	return pkghash_add_pkg(hash, pkg, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static size_t move_one_entry(pmpkghash_t *hash, size_t start, size_t end)
 | 
			
		||||
static size_t move_one_entry(alpm_pkghash_t *hash, size_t start, size_t end)
 | 
			
		||||
{
 | 
			
		||||
	/* Iterate backwards from 'end' to 'start', seeing if any of the items
 | 
			
		||||
	 * would hash to 'start'. If we find one, we move it there and break.  If
 | 
			
		||||
@@ -203,7 +200,7 @@ static size_t move_one_entry(pmpkghash_t *hash, size_t start, size_t end)
 | 
			
		||||
	 * 'start' we can stop this madness. */
 | 
			
		||||
	while(end != start) {
 | 
			
		||||
		alpm_list_t *i = hash->hash_table[end];
 | 
			
		||||
		pmpkg_t *info = i->data;
 | 
			
		||||
		alpm_pkg_t *info = i->data;
 | 
			
		||||
		size_t new_position = get_hash_position(info->name_hash, hash);
 | 
			
		||||
 | 
			
		||||
		if(new_position == start) {
 | 
			
		||||
@@ -217,7 +214,7 @@ static size_t move_one_entry(pmpkghash_t *hash, size_t start, size_t end)
 | 
			
		||||
		 * e.g. (47 + 0 - 1) % 47 == 46 */
 | 
			
		||||
		end = (hash->buckets + end - 1) % hash->buckets;
 | 
			
		||||
	}
 | 
			
		||||
	return(end);
 | 
			
		||||
	return end;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -229,8 +226,8 @@ static size_t move_one_entry(pmpkghash_t *hash, size_t start, size_t end)
 | 
			
		||||
 *
 | 
			
		||||
 * @return the resultant hash
 | 
			
		||||
 */
 | 
			
		||||
pmpkghash_t *_alpm_pkghash_remove(pmpkghash_t *hash, pmpkg_t *pkg,
 | 
			
		||||
		pmpkg_t **data)
 | 
			
		||||
alpm_pkghash_t *_alpm_pkghash_remove(alpm_pkghash_t *hash, alpm_pkg_t *pkg,
 | 
			
		||||
		alpm_pkg_t **data)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *i;
 | 
			
		||||
	size_t position;
 | 
			
		||||
@@ -240,12 +237,12 @@ pmpkghash_t *_alpm_pkghash_remove(pmpkghash_t *hash, pmpkg_t *pkg,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(pkg == NULL || hash == NULL) {
 | 
			
		||||
		return(hash);
 | 
			
		||||
		return hash;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	position = pkg->name_hash % hash->buckets;
 | 
			
		||||
	while((i = hash->hash_table[position]) != NULL) {
 | 
			
		||||
		pmpkg_t *info = i->data;
 | 
			
		||||
		alpm_pkg_t *info = i->data;
 | 
			
		||||
 | 
			
		||||
		if(info->name_hash == pkg->name_hash &&
 | 
			
		||||
					strcmp(info->name, pkg->name) == 0) {
 | 
			
		||||
@@ -277,16 +274,16 @@ pmpkghash_t *_alpm_pkghash_remove(pmpkghash_t *hash, pmpkg_t *pkg,
 | 
			
		||||
				position = prev;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return(hash);
 | 
			
		||||
			return hash;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		position = (position + 1) % hash->buckets;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(hash);
 | 
			
		||||
	return hash;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void _alpm_pkghash_free(pmpkghash_t *hash)
 | 
			
		||||
void _alpm_pkghash_free(alpm_pkghash_t *hash)
 | 
			
		||||
{
 | 
			
		||||
	size_t i;
 | 
			
		||||
	if(hash != NULL) {
 | 
			
		||||
@@ -298,16 +295,14 @@ void _alpm_pkghash_free(pmpkghash_t *hash)
 | 
			
		||||
	free(hash);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pmpkg_t *_alpm_pkghash_find(pmpkghash_t *hash, const char *name)
 | 
			
		||||
alpm_pkg_t *_alpm_pkghash_find(alpm_pkghash_t *hash, const char *name)
 | 
			
		||||
{
 | 
			
		||||
	alpm_list_t *lp;
 | 
			
		||||
	unsigned long name_hash;
 | 
			
		||||
	size_t position;
 | 
			
		||||
 | 
			
		||||
	ALPM_LOG_FUNC;
 | 
			
		||||
 | 
			
		||||
	if(name == NULL || hash == NULL) {
 | 
			
		||||
		return(NULL);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	name_hash = _alpm_hash_sdbm(name);
 | 
			
		||||
@@ -315,16 +310,16 @@ pmpkg_t *_alpm_pkghash_find(pmpkghash_t *hash, const char *name)
 | 
			
		||||
	position = name_hash % hash->buckets;
 | 
			
		||||
 | 
			
		||||
	while((lp = hash->hash_table[position]) != NULL) {
 | 
			
		||||
		pmpkg_t *info = lp->data;
 | 
			
		||||
		alpm_pkg_t *info = lp->data;
 | 
			
		||||
 | 
			
		||||
		if(info->name_hash == name_hash && strcmp(info->name, name) == 0) {
 | 
			
		||||
			return(info);
 | 
			
		||||
			return info;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		position = (position + 1) % hash->buckets;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(NULL);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* vim: set ts=2 sw=2 noet: */
 | 
			
		||||
 
 | 
			
		||||
@@ -27,12 +27,12 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief A hash table for holding pmpkg_t objects.
 | 
			
		||||
 * @brief A hash table for holding alpm_pkg_t objects.
 | 
			
		||||
 *
 | 
			
		||||
 * A combination of a hash table and a list, allowing for fast look-up
 | 
			
		||||
 * by package name but also iteration over the packages.
 | 
			
		||||
 */
 | 
			
		||||
struct __pmpkghash_t {
 | 
			
		||||
struct __alpm_pkghash_t {
 | 
			
		||||
	/** data held by the hash table */
 | 
			
		||||
	alpm_list_t **hash_table;
 | 
			
		||||
	/** number of buckets in hash table */
 | 
			
		||||
@@ -43,17 +43,17 @@ struct __pmpkghash_t {
 | 
			
		||||
	alpm_list_t *list;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct __pmpkghash_t pmpkghash_t;
 | 
			
		||||
typedef struct __alpm_pkghash_t alpm_pkghash_t;
 | 
			
		||||
 | 
			
		||||
pmpkghash_t *_alpm_pkghash_create(size_t size);
 | 
			
		||||
alpm_pkghash_t *_alpm_pkghash_create(size_t size);
 | 
			
		||||
 | 
			
		||||
pmpkghash_t *_alpm_pkghash_add(pmpkghash_t *hash, pmpkg_t *pkg);
 | 
			
		||||
pmpkghash_t *_alpm_pkghash_add_sorted(pmpkghash_t *hash, pmpkg_t *pkg);
 | 
			
		||||
pmpkghash_t *_alpm_pkghash_remove(pmpkghash_t *hash, pmpkg_t *pkg, pmpkg_t **data);
 | 
			
		||||
alpm_pkghash_t *_alpm_pkghash_add(alpm_pkghash_t *hash, alpm_pkg_t *pkg);
 | 
			
		||||
alpm_pkghash_t *_alpm_pkghash_add_sorted(alpm_pkghash_t *hash, alpm_pkg_t *pkg);
 | 
			
		||||
alpm_pkghash_t *_alpm_pkghash_remove(alpm_pkghash_t *hash, alpm_pkg_t *pkg, alpm_pkg_t **data);
 | 
			
		||||
 | 
			
		||||
void _alpm_pkghash_free(pmpkghash_t *hash);
 | 
			
		||||
void _alpm_pkghash_free(alpm_pkghash_t *hash);
 | 
			
		||||
 | 
			
		||||
pmpkg_t *_alpm_pkghash_find(pmpkghash_t *hash, const char *name);
 | 
			
		||||
alpm_pkg_t *_alpm_pkghash_find(alpm_pkghash_t *hash, const char *name);
 | 
			
		||||
 | 
			
		||||
#define MAX_HASH_LOAD 0.7
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ fr
 | 
			
		||||
hu
 | 
			
		||||
it
 | 
			
		||||
kk
 | 
			
		||||
lt
 | 
			
		||||
nb
 | 
			
		||||
pl
 | 
			
		||||
pt
 | 
			
		||||
@@ -24,3 +25,4 @@ sv
 | 
			
		||||
tr
 | 
			
		||||
uk
 | 
			
		||||
zh_CN
 | 
			
		||||
zh_TW
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
DOMAIN = libalpm
 | 
			
		||||
 | 
			
		||||
# These two variables depend on the location of this directory.
 | 
			
		||||
subdir = po
 | 
			
		||||
subdir = lib/libalpm/po
 | 
			
		||||
top_builddir = ../../../
 | 
			
		||||
 | 
			
		||||
# These options get passed to xgettext.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,20 @@
 | 
			
		||||
# SOME DESCRIPTIVE TITLE.
 | 
			
		||||
# Copyright (C) YEAR Pacman Development Team <pacman-dev@archlinux.org>
 | 
			
		||||
# This file is distributed under the same license as the PACKAGE package.
 | 
			
		||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
			
		||||
#
 | 
			
		||||
# Translators:
 | 
			
		||||
# Dan McGee <dpmcgee@gmail.com>, 2011.
 | 
			
		||||
# Hector Mtz-Seara <hseara@gmail.com>, 2011.
 | 
			
		||||
#   <jpreales@gmail.com>, 2011.
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: Arch Linux Pacman package manager\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: http://bugs.archlinux.org/index.php?project=3\n"
 | 
			
		||||
"POT-Creation-Date: 2011-04-18 11:23-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-04-12 11:15+0000\n"
 | 
			
		||||
"Last-Translator: hseara <hseara@gmail.com>\n"
 | 
			
		||||
"Language-Team: Catalan <None>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-10-05 22:35-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-10-11 14:03+0000\n"
 | 
			
		||||
"Last-Translator: toofishes <dpmcgee@gmail.com>\n"
 | 
			
		||||
"Language-Team: Catalan (http://www.transifex.net/projects/p/archlinux-pacman/"
 | 
			
		||||
"team/ca/)\n"
 | 
			
		||||
"Language: ca\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
@@ -81,6 +85,10 @@ msgstr "no es pot obtenir el directori de treball actual\n"
 | 
			
		||||
msgid "could not change directory to %s (%s)\n"
 | 
			
		||||
msgstr "no s'ha pogut canviar el directori a %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not restore working directory (%s)\n"
 | 
			
		||||
msgstr "no s'ha pogut restaurar el directori de treball (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "problem occurred while upgrading %s\n"
 | 
			
		||||
msgstr "ha ocorregut un problema en actualitzar %s\n"
 | 
			
		||||
@@ -131,7 +139,7 @@ msgstr "no s'ha pogut crear el directori %s: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not parse package description file in %s\n"
 | 
			
		||||
msgstr "no s'ha pogut analitzar el fitxers de descripció de paquet en %s\n"
 | 
			
		||||
msgstr "no s'ha pogut analitzar el fitxer de descripció de paquet en %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "missing package name in %s\n"
 | 
			
		||||
@@ -153,6 +161,16 @@ msgstr "falten les metadades del paquet en %s\n"
 | 
			
		||||
msgid "removing invalid file: %s\n"
 | 
			
		||||
msgstr "Esborrant fitxer invàlid: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "no s'ha pogut eliminar el fitxer de bloqueig %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not parse package description file '%s' from db '%s'\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"no s'ha pogut analitzar el fitxer de descripció de paquet '%s' de la base de "
 | 
			
		||||
"dades '%s'\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database path is undefined\n"
 | 
			
		||||
msgstr "no s'ha definit la ruta de la base de dades\n"
 | 
			
		||||
@@ -202,15 +220,19 @@ msgid "Partition %s is mounted read only\n"
 | 
			
		||||
msgstr "La partició %s està muntat només en mode lectura\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Partition %s too full: %ld blocks needed, %ld blocks free\n"
 | 
			
		||||
msgid "Partition %s too full: %jd blocks needed, %jd blocks free\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"La partició %s està molt plena: nombre de blocs requerits %ld, nombre de "
 | 
			
		||||
"blocs lliures %ld\n"
 | 
			
		||||
"La partició %s està molt plena: nombre de blocs requerits %jd, nombre de "
 | 
			
		||||
"blocs lliures %jd\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "disk"
 | 
			
		||||
msgstr "disc"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to create temporary file for download\n"
 | 
			
		||||
msgstr "ha fallat en crear un arxiu temporal per la baixada\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "url '%s' is invalid\n"
 | 
			
		||||
msgstr "l'url '%s' és invàlid\n"
 | 
			
		||||
@@ -219,18 +241,6 @@ msgstr "l'url '%s' és invàlid\n"
 | 
			
		||||
msgid "failed retrieving file '%s' from %s : %s\n"
 | 
			
		||||
msgstr "ha fallat en recuperar el fitxer '%s' des de %s : %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "resuming download of %s not possible; starting over\n"
 | 
			
		||||
msgstr "no es pot la reprendre la baixada de %s, s'està iniciant de nou\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error writing to file '%s': %s\n"
 | 
			
		||||
msgstr "error en escriure al fitxer '%s': %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed retrieving file '%s' from %s\n"
 | 
			
		||||
msgstr "ha fallat en recuperar el fitxer '%s' de %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s appears to be truncated: %jd/%jd bytes\n"
 | 
			
		||||
msgstr "%s sembla estar truncat: %jd/%jd bytes\n"
 | 
			
		||||
@@ -299,6 +309,14 @@ msgstr "la base de dades ja s'ha registrat"
 | 
			
		||||
msgid "could not find database"
 | 
			
		||||
msgstr "no s'ha pogut trobar la base de dades"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database"
 | 
			
		||||
msgstr "base de dades invàlida o corrupta"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database (PGP signature)"
 | 
			
		||||
msgstr "base de dades invàlida o corrupta (signatura PGP)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database is incorrect version"
 | 
			
		||||
msgstr "la versió de la base de dades és incorrecta"
 | 
			
		||||
@@ -360,6 +378,14 @@ msgstr "operació cancel·lada degut a ignorepkg"
 | 
			
		||||
msgid "invalid or corrupted package"
 | 
			
		||||
msgstr "paquet invàlid o corrupte"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (checksum)"
 | 
			
		||||
msgstr "base de dades invàlida o corrupta (checksum)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (PGP signature)"
 | 
			
		||||
msgstr "paquet invàlid o corrupte (signatura PGP)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot open package file"
 | 
			
		||||
msgstr "no s'ha pogut obrir el fitxer de paquet"
 | 
			
		||||
@@ -380,6 +406,14 @@ msgstr "l'arquitectura del paquet no és vàlida"
 | 
			
		||||
msgid "could not find repository for target"
 | 
			
		||||
msgstr "no s'ha pogut trobar el repositori per l'objectiu"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "missing PGP signature"
 | 
			
		||||
msgstr "falta signatura PGP"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid PGP signature"
 | 
			
		||||
msgstr "signatura PGP invàlida"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted delta"
 | 
			
		||||
msgstr "delta invàlid o corrupte"
 | 
			
		||||
@@ -404,10 +438,6 @@ msgstr "fitxers conflictius"
 | 
			
		||||
msgid "failed to retrieve some files"
 | 
			
		||||
msgstr "ha fallat en recuperar alguns fitxers"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to copy some file"
 | 
			
		||||
msgstr "no s'ha aconseguit copiar algun arxiu"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid regular expression"
 | 
			
		||||
msgstr "expressió regular invàlida"
 | 
			
		||||
@@ -420,6 +450,10 @@ msgstr "error de libarchive"
 | 
			
		||||
msgid "download library error"
 | 
			
		||||
msgstr "error de la llibreria de baixades"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "gpgme error"
 | 
			
		||||
msgstr "error de gpgme"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error invoking external downloader"
 | 
			
		||||
msgstr "error en invocar el baixador extern"
 | 
			
		||||
@@ -429,8 +463,8 @@ msgid "unexpected error"
 | 
			
		||||
msgstr "error inesperat"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database larger than maximum size\n"
 | 
			
		||||
msgstr "base de dades sobrepassa la grandaria màxima\n"
 | 
			
		||||
msgid "could not fully load metadata for package %s-%s\n"
 | 
			
		||||
msgstr "no s'ha pogut carregar completament les metadades pel paquet %s-%s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not find %s in database -- skipping\n"
 | 
			
		||||
@@ -444,6 +478,10 @@ msgstr "s'està eliminant %s de la llista d'objectius\n"
 | 
			
		||||
msgid "cannot remove file '%s': %s\n"
 | 
			
		||||
msgstr "no s'ha pogut eliminar el fitxer '%s': %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot remove %s (%s)\n"
 | 
			
		||||
msgstr "no es pot eliminar %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove database entry %s-%s\n"
 | 
			
		||||
msgstr "no s'ha pogut eliminar la entrada de la base de dades %s-%s\n"
 | 
			
		||||
@@ -498,14 +536,6 @@ msgstr "no s'ha pogut publicar la transacció d'eliminació\n"
 | 
			
		||||
msgid "could not commit transaction\n"
 | 
			
		||||
msgstr "no s'ha pogut publicar la transacció\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s database version is too old\n"
 | 
			
		||||
msgstr "%s versió de la base de dades és massa vella\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "no s'ha pogut eliminar el fitxer de bloqueig %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not create temp directory\n"
 | 
			
		||||
msgstr "no s'ha pogut crear el directori temporal\n"
 | 
			
		||||
@@ -514,6 +544,10 @@ msgstr "no s'ha pogut crear el directori temporal\n"
 | 
			
		||||
msgid "could not copy tempfile to %s (%s)\n"
 | 
			
		||||
msgstr "no s'ha pogut copiar el fitxer temporal a %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove %s\n"
 | 
			
		||||
msgstr "no s'ha pogut eliminar %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove tmpdir %s\n"
 | 
			
		||||
msgstr "no s'ha pogut eliminar el directori temporal %s\n"
 | 
			
		||||
@@ -532,7 +566,7 @@ msgstr "no s'ha pogut canviar el directori arrel (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "call to execv failed (%s)\n"
 | 
			
		||||
msgstr "la crida a execve ha fallat (%s)\n"
 | 
			
		||||
msgstr "la crida a execv ha fallat (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "call to waitpid failed (%s)\n"
 | 
			
		||||
@@ -551,5 +585,6 @@ msgid "no %s cache exists, creating...\n"
 | 
			
		||||
msgstr "no existeix memòria cau %s, s'està creant...\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "couldn't create package cache, using /tmp instead\n"
 | 
			
		||||
msgstr "no s'ha pogut crear la memòria cau del paquet, s'usarà /tmp\n"
 | 
			
		||||
msgid "couldn't find or create package cache, using %s instead\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"no s'ha trobat o creat packet de memòria cau, usant alternativaent %s\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,21 @@
 | 
			
		||||
# SOME DESCRIPTIVE TITLE.
 | 
			
		||||
# Copyright (C) YEAR Pacman Development Team <pacman-dev@archlinux.org>
 | 
			
		||||
# This file is distributed under the same license as the PACKAGE package.
 | 
			
		||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
			
		||||
#
 | 
			
		||||
# Translators:
 | 
			
		||||
# Dan McGee <dpmcgee@gmail.com>, 2011.
 | 
			
		||||
# David Kolibáč <david@kolibac.cz>, 2011.
 | 
			
		||||
#   <markotahal@gmail.com>, 2011.
 | 
			
		||||
# Vojtěch Gondžala <vojtech.gondzala@gmail.com>, 2011.
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: Arch Linux Pacman package manager\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: http://bugs.archlinux.org/index.php?project=3\n"
 | 
			
		||||
"POT-Creation-Date: 2011-04-18 11:23-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-03-22 15:34+0000\n"
 | 
			
		||||
"Last-Translator: vogo <vojtech.gondzala@gmail.com>\n"
 | 
			
		||||
"Language-Team: Czech <None>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-10-05 22:35-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-10-08 09:20+0000\n"
 | 
			
		||||
"Last-Translator: mmm <markotahal@gmail.com>\n"
 | 
			
		||||
"Language-Team: Czech (http://www.transifex.net/projects/p/archlinux-pacman/"
 | 
			
		||||
"team/cs/)\n"
 | 
			
		||||
"Language: cs\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
@@ -81,6 +86,10 @@ msgstr "nelze určit aktuální pracovní adresář\n"
 | 
			
		||||
msgid "could not change directory to %s (%s)\n"
 | 
			
		||||
msgstr "nelze změnit adresář na %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not restore working directory (%s)\n"
 | 
			
		||||
msgstr "nelze obnovit pracovní adresář ('%s')\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "problem occurred while upgrading %s\n"
 | 
			
		||||
msgstr "nastal problém při aktualizaci %s\n"
 | 
			
		||||
@@ -153,6 +162,14 @@ msgstr "chybí metadata balíčku v %s\n"
 | 
			
		||||
msgid "removing invalid file: %s\n"
 | 
			
		||||
msgstr "odstraněn neplatný soubor: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "nelze odstranit zamykací soubor %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not parse package description file '%s' from db '%s'\n"
 | 
			
		||||
msgstr "nelze načíst soubor s popisem balíčku '%s' z databáze '%s'\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database path is undefined\n"
 | 
			
		||||
msgstr "cesta k databázi není definována\n"
 | 
			
		||||
@@ -202,14 +219,17 @@ msgid "Partition %s is mounted read only\n"
 | 
			
		||||
msgstr "Diskový oddíl %s je připojen jen pro čtení\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Partition %s too full: %ld blocks needed, %ld blocks free\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Diskový oddíl %s je příliš plný: je potřeba %ld bloků, %ld bloků je volných\n"
 | 
			
		||||
msgid "Partition %s too full: %jd blocks needed, %jd blocks free\n"
 | 
			
		||||
msgstr "Oddíl '%s' je plný: je potřeba %jd bloků, ale k dispozici je jen %jd\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "disk"
 | 
			
		||||
msgstr "disk"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to create temporary file for download\n"
 | 
			
		||||
msgstr "nepodařilo se vytvořit dočasný soubor pro stahování\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "url '%s' is invalid\n"
 | 
			
		||||
msgstr "URL '%s' je chybná\n"
 | 
			
		||||
@@ -218,18 +238,6 @@ msgstr "URL '%s' je chybná\n"
 | 
			
		||||
msgid "failed retrieving file '%s' from %s : %s\n"
 | 
			
		||||
msgstr "selhalo získání souboru '%s' z %s: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "resuming download of %s not possible; starting over\n"
 | 
			
		||||
msgstr "nelze navázat stahování %s, začíná se znovu\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error writing to file '%s': %s\n"
 | 
			
		||||
msgstr "chyba při zápisu do souboru '%s': %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed retrieving file '%s' from %s\n"
 | 
			
		||||
msgstr "selhalo získání souboru '%s' z %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s appears to be truncated: %jd/%jd bytes\n"
 | 
			
		||||
msgstr "%s se zdá být zkrácen:  %jd/%jd bytů\n"
 | 
			
		||||
@@ -298,6 +306,14 @@ msgstr "databáze zaregistrována"
 | 
			
		||||
msgid "could not find database"
 | 
			
		||||
msgstr "nelze nalézt databázi"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database"
 | 
			
		||||
msgstr "neplatná nebo poškozená databáze"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database (PGP signature)"
 | 
			
		||||
msgstr "neplatná nebo poškozená databáze (PGP podpisy)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database is incorrect version"
 | 
			
		||||
msgstr "databáze má nesprávnou verzi"
 | 
			
		||||
@@ -358,6 +374,14 @@ msgstr "operace byla zrušena kvůli ignorovanému balíčku"
 | 
			
		||||
msgid "invalid or corrupted package"
 | 
			
		||||
msgstr "neplatný nebo poškozený balíček"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (checksum)"
 | 
			
		||||
msgstr "neplatná nebo poškozená databáze (kontrolní součty)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (PGP signature)"
 | 
			
		||||
msgstr "neplatný nebo poškozený balíček (PGP podpis)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot open package file"
 | 
			
		||||
msgstr "nelze otevřít soubor balíčku"
 | 
			
		||||
@@ -378,6 +402,14 @@ msgstr "architektura balíčku není platná"
 | 
			
		||||
msgid "could not find repository for target"
 | 
			
		||||
msgstr "nelze nalézt repositář cíle"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "missing PGP signature"
 | 
			
		||||
msgstr "chybějící podpis PGP"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid PGP signature"
 | 
			
		||||
msgstr "neplatný podpis PGP"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted delta"
 | 
			
		||||
msgstr "neplatný nebo poškozený delta rozdíl"
 | 
			
		||||
@@ -402,10 +434,6 @@ msgstr "konfliktní soubory"
 | 
			
		||||
msgid "failed to retrieve some files"
 | 
			
		||||
msgstr "selhalo získání některých souborů"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to copy some file"
 | 
			
		||||
msgstr "selhalo kopírování souboru"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid regular expression"
 | 
			
		||||
msgstr "nesprávný regulární výraz"
 | 
			
		||||
@@ -418,6 +446,10 @@ msgstr "chyba knihovny libarchive"
 | 
			
		||||
msgid "download library error"
 | 
			
		||||
msgstr "chyba knihovny pro stahování souborů"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "gpgme error"
 | 
			
		||||
msgstr "chyba v gpgme"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error invoking external downloader"
 | 
			
		||||
msgstr "chyba volání externího programu pro stahování souborů"
 | 
			
		||||
@@ -427,8 +459,8 @@ msgid "unexpected error"
 | 
			
		||||
msgstr "neočekávaná chyba"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database larger than maximum size\n"
 | 
			
		||||
msgstr "databáze je větší než maximální přípustná velikost\n"
 | 
			
		||||
msgid "could not fully load metadata for package %s-%s\n"
 | 
			
		||||
msgstr "nelze pořádně načíst metadata pro balícek %s-%s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not find %s in database -- skipping\n"
 | 
			
		||||
@@ -442,6 +474,10 @@ msgstr "'%s' odstraněn ze seznamu cílů\n"
 | 
			
		||||
msgid "cannot remove file '%s': %s\n"
 | 
			
		||||
msgstr "nelze odstranit soubor '%s': %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot remove %s (%s)\n"
 | 
			
		||||
msgstr "nelze odstranit '%s' ('%s')\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove database entry %s-%s\n"
 | 
			
		||||
msgstr "nelze odstranit záznam databáze %s-%s\n"
 | 
			
		||||
@@ -494,14 +530,6 @@ msgstr "nelze provést transakci pro odstranění\n"
 | 
			
		||||
msgid "could not commit transaction\n"
 | 
			
		||||
msgstr "nelze provést transakci\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s database version is too old\n"
 | 
			
		||||
msgstr "verze databáze %s  je příliš stará\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "nelze odstranit zamykací soubor %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not create temp directory\n"
 | 
			
		||||
msgstr "nelze vytvořit dočasný adresář\n"
 | 
			
		||||
@@ -510,6 +538,10 @@ msgstr "nelze vytvořit dočasný adresář\n"
 | 
			
		||||
msgid "could not copy tempfile to %s (%s)\n"
 | 
			
		||||
msgstr "nelze zkopírovat dočasný soubor do %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove %s\n"
 | 
			
		||||
msgstr "nelze odstranit %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove tmpdir %s\n"
 | 
			
		||||
msgstr "nelze odstranit dočasný adresář %s\n"
 | 
			
		||||
@@ -547,5 +579,6 @@ msgid "no %s cache exists, creating...\n"
 | 
			
		||||
msgstr "neexistuje mezipaměť %s, vytváří se...\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "couldn't create package cache, using /tmp instead\n"
 | 
			
		||||
msgstr "nelze vytvořit mezipaměť balíčků, používá se /tmp\n"
 | 
			
		||||
msgid "couldn't find or create package cache, using %s instead\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"nepodařilo se najít nebo vytvořit cache pro balíčky, používám místo toho %s\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,18 @@
 | 
			
		||||
# SOME DESCRIPTIVE TITLE.
 | 
			
		||||
# Copyright (C) YEAR Pacman Development Team <pacman-dev@archlinux.org>
 | 
			
		||||
# This file is distributed under the same license as the PACKAGE package.
 | 
			
		||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
			
		||||
#
 | 
			
		||||
# Translators:
 | 
			
		||||
# Joe Hansen <joedalton2@yahoo.dk>, 2011.
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: Arch Linux Pacman package manager\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: http://bugs.archlinux.org/index.php?project=3\n"
 | 
			
		||||
"POT-Creation-Date: 2011-04-18 11:23-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-03-22 15:34+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2011-10-05 22:35-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-09-22 16:37+0000\n"
 | 
			
		||||
"Last-Translator: toofishes <dpmcgee@gmail.com>\n"
 | 
			
		||||
"Language-Team: Danish <None>\n"
 | 
			
		||||
"Language-Team: Danish (http://www.transifex.net/projects/p/archlinux-pacman/"
 | 
			
		||||
"team/da/)\n"
 | 
			
		||||
"Language: da\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
@@ -81,6 +83,10 @@ msgstr "kunne ikke hente aktuelt arbejdsmappe\n"
 | 
			
		||||
msgid "could not change directory to %s (%s)\n"
 | 
			
		||||
msgstr "kunne ikke ændre mappe til %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not restore working directory (%s)\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "problem occurred while upgrading %s\n"
 | 
			
		||||
msgstr "der opstod et problem under opgradering %s\n"
 | 
			
		||||
@@ -153,6 +159,14 @@ msgstr "manglende pakkemetadata i %s\n"
 | 
			
		||||
msgid "removing invalid file: %s\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "kunne ikke fjerne låsningsfil %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not parse package description file '%s' from db '%s'\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database path is undefined\n"
 | 
			
		||||
msgstr "databasesti er udefineret\n"
 | 
			
		||||
@@ -202,13 +216,17 @@ msgid "Partition %s is mounted read only\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Partition %s too full: %ld blocks needed, %ld blocks free\n"
 | 
			
		||||
msgid "Partition %s too full: %jd blocks needed, %jd blocks free\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "disk"
 | 
			
		||||
msgstr "disk"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to create temporary file for download\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "url '%s' is invalid\n"
 | 
			
		||||
msgstr "adressen »%s« er ugyldig\n"
 | 
			
		||||
@@ -217,18 +235,6 @@ msgstr "adressen »%s« er ugyldig\n"
 | 
			
		||||
msgid "failed retrieving file '%s' from %s : %s\n"
 | 
			
		||||
msgstr "fejlede i indhentning af fil »%s« fra %s: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "resuming download of %s not possible; starting over\n"
 | 
			
		||||
msgstr "det er ikke muligt at genoptage hentning af %s; starter forfra\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error writing to file '%s': %s\n"
 | 
			
		||||
msgstr "fejl under skrivning til fil »%s«: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed retrieving file '%s' from %s\n"
 | 
			
		||||
msgstr "kunne ikke indhente fil »%s« fra %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s appears to be truncated: %jd/%jd bytes\n"
 | 
			
		||||
msgstr "%s ser ud til at være afkortet: %jd/%jd byte\n"
 | 
			
		||||
@@ -297,6 +303,14 @@ msgstr "database er allerede registreret"
 | 
			
		||||
msgid "could not find database"
 | 
			
		||||
msgstr "kunne ikke finde database"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database (PGP signature)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database is incorrect version"
 | 
			
		||||
msgstr ""
 | 
			
		||||
@@ -355,7 +369,15 @@ msgstr "handling afbrudt på grund af igonrepkg"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package"
 | 
			
		||||
msgstr "ugyldig eller ødelagt pakke"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (checksum)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (PGP signature)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot open package file"
 | 
			
		||||
@@ -377,6 +399,14 @@ msgstr "pakkearkitektur er ikke gyldig"
 | 
			
		||||
msgid "could not find repository for target"
 | 
			
		||||
msgstr "kunne ikke finde arkiv for mål"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "missing PGP signature"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid PGP signature"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted delta"
 | 
			
		||||
msgstr "ugyldig eller ødelagt delta"
 | 
			
		||||
@@ -401,10 +431,6 @@ msgstr "konfliktende filer"
 | 
			
		||||
msgid "failed to retrieve some files"
 | 
			
		||||
msgstr "kunne ikke indhente nogle filer"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to copy some file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid regular expression"
 | 
			
		||||
msgstr "ugyldigt regulært udtryk"
 | 
			
		||||
@@ -417,6 +443,10 @@ msgstr "biblioteksarkivfejl"
 | 
			
		||||
msgid "download library error"
 | 
			
		||||
msgstr "hent biblioteksfejl"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "gpgme error"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error invoking external downloader"
 | 
			
		||||
msgstr "fejl under opstart af ekstern hentningsprogram"
 | 
			
		||||
@@ -426,7 +456,7 @@ msgid "unexpected error"
 | 
			
		||||
msgstr "uventet fejl"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database larger than maximum size\n"
 | 
			
		||||
msgid "could not fully load metadata for package %s-%s\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
@@ -441,6 +471,10 @@ msgstr "fjerner %s fra målliste\n"
 | 
			
		||||
msgid "cannot remove file '%s': %s\n"
 | 
			
		||||
msgstr "kan ikke fjerne fil »%s«:%s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot remove %s (%s)\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove database entry %s-%s\n"
 | 
			
		||||
msgstr "kunne ikke fjerne databasepunkt %s-%s\n"
 | 
			
		||||
@@ -493,14 +527,6 @@ msgstr "kunne ikke indsende (commit) fjernelsestransaktion\n"
 | 
			
		||||
msgid "could not commit transaction\n"
 | 
			
		||||
msgstr "kunne ikke indsende (commit) transaktion\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s database version is too old\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "kunne ikke fjerne låsningsfil %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not create temp directory\n"
 | 
			
		||||
msgstr "kunne ikke oprette midlertidig mappe\n"
 | 
			
		||||
@@ -509,6 +535,10 @@ msgstr "kunne ikke oprette midlertidig mappe\n"
 | 
			
		||||
msgid "could not copy tempfile to %s (%s)\n"
 | 
			
		||||
msgstr "kunne ikke kopier midlertidig fil til %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, fuzzy, c-format
 | 
			
		||||
msgid "could not remove %s\n"
 | 
			
		||||
msgstr "kunne ikke fjerne tmpdir %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove tmpdir %s\n"
 | 
			
		||||
msgstr "kunne ikke fjerne tmpdir %s\n"
 | 
			
		||||
@@ -546,5 +576,5 @@ msgid "no %s cache exists, creating...\n"
 | 
			
		||||
msgstr "intet %s-mellemlager findes, opretter...\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "couldn't create package cache, using /tmp instead\n"
 | 
			
		||||
msgstr "kunne ikke oprette pakkemellemlager, bruger /tmp i steden for\n"
 | 
			
		||||
msgid "couldn't find or create package cache, using %s instead\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,19 @@
 | 
			
		||||
# SOME DESCRIPTIVE TITLE.
 | 
			
		||||
# Copyright (C) YEAR Pacman Development Team <pacman-dev@archlinux.org>
 | 
			
		||||
# This file is distributed under the same license as the PACKAGE package.
 | 
			
		||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
			
		||||
#
 | 
			
		||||
# Translators:
 | 
			
		||||
# Dan McGee <dpmcgee@gmail.com>, 2011.
 | 
			
		||||
# Matthias Gorissen <matthias@archlinux.de>, 2011.
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: Arch Linux Pacman package manager\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: http://bugs.archlinux.org/index.php?project=3\n"
 | 
			
		||||
"POT-Creation-Date: 2011-04-18 11:23-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-03-22 15:34+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2011-10-05 22:35-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-10-07 09:26+0000\n"
 | 
			
		||||
"Last-Translator: tlaloc <matthias@archlinux.de>\n"
 | 
			
		||||
"Language-Team: German <None>\n"
 | 
			
		||||
"Language-Team: German (http://www.transifex.net/projects/p/archlinux-pacman/"
 | 
			
		||||
"team/de/)\n"
 | 
			
		||||
"Language: de\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
@@ -81,6 +84,10 @@ msgstr "Konnte aktuelles Arbeitsverzeichnis nicht ermitteln\n"
 | 
			
		||||
msgid "could not change directory to %s (%s)\n"
 | 
			
		||||
msgstr "Konnte nicht zu Verzeichnis %s wechseln (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not restore working directory (%s)\n"
 | 
			
		||||
msgstr "Konnte das Arbeitsverzeichnis (%s) nicht wiederherstellen\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "problem occurred while upgrading %s\n"
 | 
			
		||||
msgstr "Fehler traten auf, während %s aktualisiert wurde\n"
 | 
			
		||||
@@ -157,6 +164,15 @@ msgstr "Fehlende Paket-Metadaten in %s\n"
 | 
			
		||||
msgid "removing invalid file: %s\n"
 | 
			
		||||
msgstr "Entferne ungültige Datei: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "Konnte Sperrdatei %s nicht entfernen\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not parse package description file '%s' from db '%s'\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Konnte Paket-Beschreibungsdatei '%s' der Datenbank '%s' nicht analysieren\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database path is undefined\n"
 | 
			
		||||
msgstr "Datenbank-Pfad ist nicht definiert\n"
 | 
			
		||||
@@ -206,14 +222,19 @@ msgid "Partition %s is mounted read only\n"
 | 
			
		||||
msgstr "Die Partition %s ist so eingehängt, daß sie nur gelesen werden kann\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Partition %s too full: %ld blocks needed, %ld blocks free\n"
 | 
			
		||||
msgid "Partition %s too full: %jd blocks needed, %jd blocks free\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Partition %s überfüllt: %ld Blöcke werden benötigt, %ld Blöcke sind frei\n"
 | 
			
		||||
"Partition %s ist überfüllt: %jd Blöcke werden benötigt, %jd Blöcke sind "
 | 
			
		||||
"frei\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "disk"
 | 
			
		||||
msgstr "Platte"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to create temporary file for download\n"
 | 
			
		||||
msgstr "Konnte temporäre Datei für den Download nicht anlegen\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "url '%s' is invalid\n"
 | 
			
		||||
msgstr "URL '%s' ist ungültig\n"
 | 
			
		||||
@@ -222,18 +243,6 @@ msgstr "URL '%s' ist ungültig\n"
 | 
			
		||||
msgid "failed retrieving file '%s' from %s : %s\n"
 | 
			
		||||
msgstr "Konnte Datei '%s' nicht von %s übertragen : %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "resuming download of %s not possible; starting over\n"
 | 
			
		||||
msgstr "Kann den Download von %s nicht wieder aufnehmen, starte neu\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error writing to file '%s': %s\n"
 | 
			
		||||
msgstr "Fehler beim Beschreiben von Datei '%s': %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed retrieving file '%s' from %s\n"
 | 
			
		||||
msgstr "Konnte Datei '%s' nicht von %s übertragen\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s appears to be truncated: %jd/%jd bytes\n"
 | 
			
		||||
msgstr "%s scheint verstümmelt zu sein: %jd/%jd Byte\n"
 | 
			
		||||
@@ -302,6 +311,14 @@ msgstr "Datenbank bereits registriert"
 | 
			
		||||
msgid "could not find database"
 | 
			
		||||
msgstr "Konnte Datenbank nicht finden"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database"
 | 
			
		||||
msgstr "Ungültige oder beschädigte Datenbank"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database (PGP signature)"
 | 
			
		||||
msgstr "Ungültige oder beschädigte Datenbank (PGP-Signatur)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database is incorrect version"
 | 
			
		||||
msgstr "Keine korrekte Version der Datenbank"
 | 
			
		||||
@@ -363,6 +380,14 @@ msgstr "Vorgang abgebrochen auf Grund von IgnorePkg"
 | 
			
		||||
msgid "invalid or corrupted package"
 | 
			
		||||
msgstr "Ungültiges oder beschädigtes Paket"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (checksum)"
 | 
			
		||||
msgstr "Ungültiges oder beschädigtes Paket (Prüfsumme)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (PGP signature)"
 | 
			
		||||
msgstr "Ungültiges oder beschädigtes Paket (PGP-Signatur)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot open package file"
 | 
			
		||||
msgstr "Kann Paketdatei nicht öffnen"
 | 
			
		||||
@@ -383,6 +408,14 @@ msgstr "Die Paket-Architektur ist ungültig"
 | 
			
		||||
msgid "could not find repository for target"
 | 
			
		||||
msgstr "Konnte kein Repositorium für das Ziel finden"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "missing PGP signature"
 | 
			
		||||
msgstr "Fehlende PGP-Signatur"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid PGP signature"
 | 
			
		||||
msgstr "Ungültige PGP-Signatur"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted delta"
 | 
			
		||||
msgstr "Ungültiges oder beschädigtes Delta"
 | 
			
		||||
@@ -407,10 +440,6 @@ msgstr "In Konflikt stehende Dateien"
 | 
			
		||||
msgid "failed to retrieve some files"
 | 
			
		||||
msgstr "Konnte manche Dateien nicht übertragen"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to copy some file"
 | 
			
		||||
msgstr "Konnte irgendeine Datei nicht kopieren"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid regular expression"
 | 
			
		||||
msgstr "Ungültiger Regulärer Ausdruck"
 | 
			
		||||
@@ -423,6 +452,10 @@ msgstr "libarchive-Fehler"
 | 
			
		||||
msgid "download library error"
 | 
			
		||||
msgstr "Fehler in der Bibliothek für Downloads"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "gpgme error"
 | 
			
		||||
msgstr "gpgme-Fehler"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error invoking external downloader"
 | 
			
		||||
msgstr "Fehler beim Aufruf eines externen Downloaders"
 | 
			
		||||
@@ -432,8 +465,8 @@ msgid "unexpected error"
 | 
			
		||||
msgstr "Unerwarteter Fehler"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database larger than maximum size\n"
 | 
			
		||||
msgstr "Datenbank überschreitet die maximal erlaubte Größe\n"
 | 
			
		||||
msgid "could not fully load metadata for package %s-%s\n"
 | 
			
		||||
msgstr "Konnte die Metadaten für Paket %s-%s nicht vollständig laden\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not find %s in database -- skipping\n"
 | 
			
		||||
@@ -447,6 +480,10 @@ msgstr "Entferne '%s' aus der Ziel-Liste\n"
 | 
			
		||||
msgid "cannot remove file '%s': %s\n"
 | 
			
		||||
msgstr "Kann Datei '%s' nicht entfernen: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot remove %s (%s)\n"
 | 
			
		||||
msgstr "Konnte %s nicht entfernen (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove database entry %s-%s\n"
 | 
			
		||||
msgstr "Konnte Datenbank-Eintrag %s-%s nicht entfernen\n"
 | 
			
		||||
@@ -499,14 +536,6 @@ msgstr "Konnte Lösch-Vorgang nicht durchführen\n"
 | 
			
		||||
msgid "could not commit transaction\n"
 | 
			
		||||
msgstr "Konnte den Vorgang nicht durchführen\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s database version is too old\n"
 | 
			
		||||
msgstr "Datenbank-Version %s ist zu alt\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "Konnte Sperrdatei %s nicht entfernen\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not create temp directory\n"
 | 
			
		||||
msgstr "Konnte temporäres Verzeichnis nicht erstellen\n"
 | 
			
		||||
@@ -515,6 +544,10 @@ msgstr "Konnte temporäres Verzeichnis nicht erstellen\n"
 | 
			
		||||
msgid "could not copy tempfile to %s (%s)\n"
 | 
			
		||||
msgstr "Konnte temporäre Datei nicht nach %s kopieren (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove %s\n"
 | 
			
		||||
msgstr "Konnte %s nicht entfernen\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove tmpdir %s\n"
 | 
			
		||||
msgstr "Konnte temporäres Verzeichnis %s nicht entfernen\n"
 | 
			
		||||
@@ -552,5 +585,6 @@ msgid "no %s cache exists, creating...\n"
 | 
			
		||||
msgstr "Es existiert kein %s-Puffer. Erstelle... \n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "couldn't create package cache, using /tmp instead\n"
 | 
			
		||||
msgstr "Konnte Paketpuffer nicht erstellen, benutze stattdessen /tmp\n"
 | 
			
		||||
msgid "couldn't find or create package cache, using %s instead\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Konnte den Paket-Puffer nicht finden oder erstellen, benutze stattdessen %s\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,20 @@
 | 
			
		||||
# SOME DESCRIPTIVE TITLE.
 | 
			
		||||
# Copyright (C) YEAR Pacman Development Team <pacman-dev@archlinux.org>
 | 
			
		||||
# This file is distributed under the same license as the PACKAGE package.
 | 
			
		||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
			
		||||
#
 | 
			
		||||
# Translators:
 | 
			
		||||
# Christos Nouskas <nous@archlinux.us>, 2011.
 | 
			
		||||
# Dan McGee <dpmcgee@gmail.com>, 2011.
 | 
			
		||||
# nous <nous@archlinux.us>, 2011.
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: Arch Linux Pacman package manager\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: http://bugs.archlinux.org/index.php?project=3\n"
 | 
			
		||||
"POT-Creation-Date: 2011-04-18 11:23-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-04-08 16:42+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2011-10-05 22:35-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-10-06 10:43+0000\n"
 | 
			
		||||
"Last-Translator: nous <nous@archlinux.us>\n"
 | 
			
		||||
"Language-Team: Greek <None>\n"
 | 
			
		||||
"Language-Team: Greek (http://www.transifex.net/projects/p/archlinux-pacman/"
 | 
			
		||||
"team/el/)\n"
 | 
			
		||||
"Language: el\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
@@ -81,6 +85,10 @@ msgstr "αδυναμία χρήσης τρέχοντος καταλόγου\n"
 | 
			
		||||
msgid "could not change directory to %s (%s)\n"
 | 
			
		||||
msgstr "αδυναμία μετάβασης στον κατάλογο %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not restore working directory (%s)\n"
 | 
			
		||||
msgstr "αδυναμία επαναφοράς καταλόγου εργασίας (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "problem occurred while upgrading %s\n"
 | 
			
		||||
msgstr "πρόβλημα κατά την αναβάθμιση του %s\n"
 | 
			
		||||
@@ -153,6 +161,14 @@ msgstr "απόντα μετα-δεδομένα πακέτου στο %s\n"
 | 
			
		||||
msgid "removing invalid file: %s\n"
 | 
			
		||||
msgstr "διαγραφή άκυρου αρχείου: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "αδυναμία διαγραφής αρχείου κλειδώματος %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not parse package description file '%s' from db '%s'\n"
 | 
			
		||||
msgstr "αδυναμία ανάλυσης αρχείου περιγραφής πακέτου '%s' βάσης '%s'\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database path is undefined\n"
 | 
			
		||||
msgstr "ακαθόριστη διαδρομή βάσης\n"
 | 
			
		||||
@@ -202,13 +218,17 @@ msgid "Partition %s is mounted read only\n"
 | 
			
		||||
msgstr "Kατάτμηση %s: προσαρτημένη μόνο για ανάγνωση\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Partition %s too full: %ld blocks needed, %ld blocks free\n"
 | 
			
		||||
msgstr "Kατάτμηση %s πλήρης: %ld blocks απαιτούνται, %ld ελεύθερα\n"
 | 
			
		||||
msgid "Partition %s too full: %jd blocks needed, %jd blocks free\n"
 | 
			
		||||
msgstr "Κατάτμηση %s πλήρης: %jd ελεύθερα μπλοκ, %jd απαιτούνται\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "disk"
 | 
			
		||||
msgstr "δίσκο"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to create temporary file for download\n"
 | 
			
		||||
msgstr "αποτυχία δημιουργίας προσωρινού αρχείου λήψης\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "url '%s' is invalid\n"
 | 
			
		||||
msgstr "άκυρη διεύθυνση '%s'\n"
 | 
			
		||||
@@ -217,18 +237,6 @@ msgstr "άκυρη διεύθυνση '%s'\n"
 | 
			
		||||
msgid "failed retrieving file '%s' from %s : %s\n"
 | 
			
		||||
msgstr "αποτυχία λήψης αρχείου '%s' από %s : %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "resuming download of %s not possible; starting over\n"
 | 
			
		||||
msgstr "συνέχιση λήψης %s αδύνατη, επανεκκίνηση\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error writing to file '%s': %s\n"
 | 
			
		||||
msgstr "σφάλμα εγγραφής στο '%s': %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed retrieving file '%s' from %s\n"
 | 
			
		||||
msgstr "αποτυχία λήψης αρχείου '%s' από %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s appears to be truncated: %jd/%jd bytes\n"
 | 
			
		||||
msgstr "το %s δείχνει ημιτελές: %jd/%jd bytes\n"
 | 
			
		||||
@@ -297,6 +305,14 @@ msgstr "βάση ήδη εκκινηθείσα"
 | 
			
		||||
msgid "could not find database"
 | 
			
		||||
msgstr "αδυναμία εύρεσης βάσης"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database"
 | 
			
		||||
msgstr "άκυρη ή κατεστραμμένη βάση"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database (PGP signature)"
 | 
			
		||||
msgstr "άκυρη ή κατεστραμμένη βάση (υπογραφή PGP)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database is incorrect version"
 | 
			
		||||
msgstr "εσφαλμένη έκδοση βάσης"
 | 
			
		||||
@@ -357,6 +373,14 @@ msgstr "ακύρωση λειτουργίας λόγω ignorepkg"
 | 
			
		||||
msgid "invalid or corrupted package"
 | 
			
		||||
msgstr "άκυρο ή κατεστραμμένο πακέτο"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (checksum)"
 | 
			
		||||
msgstr "άκυρο ή κατεστραμμένο πακέτο (άθροισμα ελέγχου)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (PGP signature)"
 | 
			
		||||
msgstr "άκυρο ή κατεστραμμένο πακέτο (υπογραφή PGP)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot open package file"
 | 
			
		||||
msgstr "αδυναμία ανοίγματος πακέτου"
 | 
			
		||||
@@ -377,6 +401,14 @@ msgstr "μη έγκυρη αρχιτεκτονική πακέτου"
 | 
			
		||||
msgid "could not find repository for target"
 | 
			
		||||
msgstr "αδυναμία εύρεσης αποθήκης για διεκπεραίωση"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "missing PGP signature"
 | 
			
		||||
msgstr "απούσα υπογραφή PGP"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid PGP signature"
 | 
			
		||||
msgstr "άκυρη υπογραφή PGP"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted delta"
 | 
			
		||||
msgstr "άκυρο ή κατεστραμμένο delta"
 | 
			
		||||
@@ -401,10 +433,6 @@ msgstr "διένεξη αρχείων"
 | 
			
		||||
msgid "failed to retrieve some files"
 | 
			
		||||
msgstr "αποτυχία λήψης κάποιων αρχείων"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to copy some file"
 | 
			
		||||
msgstr "αποτυχία αντιγραφής αρχείου"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid regular expression"
 | 
			
		||||
msgstr "άκυρη κανονική έκφραση"
 | 
			
		||||
@@ -417,6 +445,10 @@ msgstr "σφάλμα libarchive"
 | 
			
		||||
msgid "download library error"
 | 
			
		||||
msgstr "σφάλμα βιβλιοθήκης λήψης"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "gpgme error"
 | 
			
		||||
msgstr "σφάλμα gpgme"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error invoking external downloader"
 | 
			
		||||
msgstr "σφάλμα κλήσης προγράμματος λήψης"
 | 
			
		||||
@@ -426,8 +458,8 @@ msgid "unexpected error"
 | 
			
		||||
msgstr "απροσδόκητο σφάλμα"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database larger than maximum size\n"
 | 
			
		||||
msgstr "βάση μεγαλύτερη από μέγιστο όριο\n"
 | 
			
		||||
msgid "could not fully load metadata for package %s-%s\n"
 | 
			
		||||
msgstr "αδυναμία πλήρους φόρτωσης μεταδεδομένων πακέτου %s-%s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not find %s in database -- skipping\n"
 | 
			
		||||
@@ -441,9 +473,13 @@ msgstr "αφαίρεση του %s από λίστα διεκπεραίωσης\
 | 
			
		||||
msgid "cannot remove file '%s': %s\n"
 | 
			
		||||
msgstr "αδυναμία διαγραφής αρχείου '%s': %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot remove %s (%s)\n"
 | 
			
		||||
msgstr "αδυναμία διαγραφής %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove database entry %s-%s\n"
 | 
			
		||||
msgstr "αδυναμία διαγραφής εγγραφής βάσης %s-%s\n"
 | 
			
		||||
msgstr "αδυναμία κατάργησης εγγραφής βάσης %s-%s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove entry '%s' from cache\n"
 | 
			
		||||
@@ -494,14 +530,6 @@ msgstr "αδυναμία διεκπεραίωσης διαγραφής\n"
 | 
			
		||||
msgid "could not commit transaction\n"
 | 
			
		||||
msgstr "αδυναμία διεκπεραίωσης\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s database version is too old\n"
 | 
			
		||||
msgstr "πολύ παλιά έκδοση βάσης %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "αδυναμία διαγραφής αρχείου κλειδώματος %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not create temp directory\n"
 | 
			
		||||
msgstr "αδυναμία δημιουργίας προσωρινού καταλόγου\n"
 | 
			
		||||
@@ -510,6 +538,10 @@ msgstr "αδυναμία δημιουργίας προσωρινού καταλ
 | 
			
		||||
msgid "could not copy tempfile to %s (%s)\n"
 | 
			
		||||
msgstr "αδυναμία αντιγραφής προσωρινού αρχείου στο %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove %s\n"
 | 
			
		||||
msgstr "αδυναμία διαγραφής %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove tmpdir %s\n"
 | 
			
		||||
msgstr "αδυναμία διαγραφής προσωρινού καταλόγου %s\n"
 | 
			
		||||
@@ -547,5 +579,5 @@ msgid "no %s cache exists, creating...\n"
 | 
			
		||||
msgstr "δημιουργία κρύπτης %s...\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "couldn't create package cache, using /tmp instead\n"
 | 
			
		||||
msgstr "αδυναμία δημιουργίας κρύπτης πακέτων, χρήση /tmp\n"
 | 
			
		||||
msgid "couldn't find or create package cache, using %s instead\n"
 | 
			
		||||
msgstr "αδυναμία εύρεσης ή δημιουργίας κρύπτης πακέτων, χρήση %s\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,15 @@
 | 
			
		||||
# SOME DESCRIPTIVE TITLE.
 | 
			
		||||
# Copyright (C) YEAR Pacman Development Team <pacman-dev@archlinux.org>
 | 
			
		||||
# This file is distributed under the same license as the PACKAGE package.
 | 
			
		||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
			
		||||
#
 | 
			
		||||
# Translators:
 | 
			
		||||
# Dan McGee <dpmcgee@gmail.com>, 2011.
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: Arch Linux Pacman package manager\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: http://bugs.archlinux.org/index.php?project=3\n"
 | 
			
		||||
"POT-Creation-Date: 2011-04-18 11:23-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-03-22 15:34+0000\n"
 | 
			
		||||
"POT-Creation-Date: 2011-10-05 22:35-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-10-06 03:57+0000\n"
 | 
			
		||||
"Last-Translator: toofishes <dpmcgee@gmail.com>\n"
 | 
			
		||||
"Language-Team: LANGUAGE <LL@li.org>\n"
 | 
			
		||||
"Language: en_GB\n"
 | 
			
		||||
@@ -81,6 +82,10 @@ msgstr "could not get current working directory\n"
 | 
			
		||||
msgid "could not change directory to %s (%s)\n"
 | 
			
		||||
msgstr "could not change directory to %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not restore working directory (%s)\n"
 | 
			
		||||
msgstr "could not restore working directory (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "problem occurred while upgrading %s\n"
 | 
			
		||||
msgstr "problem occurred while upgrading %s\n"
 | 
			
		||||
@@ -153,6 +158,14 @@ msgstr "missing package metadata in %s\n"
 | 
			
		||||
msgid "removing invalid file: %s\n"
 | 
			
		||||
msgstr "removing invalid file: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "could not remove lock file %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not parse package description file '%s' from db '%s'\n"
 | 
			
		||||
msgstr "could not parse package description file '%s' from db '%s'\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database path is undefined\n"
 | 
			
		||||
msgstr "database path is undefined\n"
 | 
			
		||||
@@ -202,13 +215,17 @@ msgid "Partition %s is mounted read only\n"
 | 
			
		||||
msgstr "Partition %s is mounted read only\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Partition %s too full: %ld blocks needed, %ld blocks free\n"
 | 
			
		||||
msgstr "Partition %s too full: %ld blocks needed, %ld blocks free\n"
 | 
			
		||||
msgid "Partition %s too full: %jd blocks needed, %jd blocks free\n"
 | 
			
		||||
msgstr "Partition %s too full: %jd blocks needed, %jd blocks free\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "disk"
 | 
			
		||||
msgstr "disk"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to create temporary file for download\n"
 | 
			
		||||
msgstr "failed to create temporary file for download\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "url '%s' is invalid\n"
 | 
			
		||||
msgstr "URL '%s' is invalid\n"
 | 
			
		||||
@@ -217,18 +234,6 @@ msgstr "URL '%s' is invalid\n"
 | 
			
		||||
msgid "failed retrieving file '%s' from %s : %s\n"
 | 
			
		||||
msgstr "failed retrieving file '%s' from %s : %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "resuming download of %s not possible; starting over\n"
 | 
			
		||||
msgstr "resuming download of %s not possible; starting over\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error writing to file '%s': %s\n"
 | 
			
		||||
msgstr "error writing to file '%s': %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed retrieving file '%s' from %s\n"
 | 
			
		||||
msgstr "failed retrieving file '%s' from %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s appears to be truncated: %jd/%jd bytes\n"
 | 
			
		||||
msgstr "%s appears to be truncated: %jd/%jd bytes\n"
 | 
			
		||||
@@ -297,6 +302,14 @@ msgstr "database already registered"
 | 
			
		||||
msgid "could not find database"
 | 
			
		||||
msgstr "could not find database"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database"
 | 
			
		||||
msgstr "invalid or corrupted database"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database (PGP signature)"
 | 
			
		||||
msgstr "invalid or corrupted database (PGP signature)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database is incorrect version"
 | 
			
		||||
msgstr "database is incorrect version"
 | 
			
		||||
@@ -357,6 +370,14 @@ msgstr "operation cancelled due to ignorepkg"
 | 
			
		||||
msgid "invalid or corrupted package"
 | 
			
		||||
msgstr "invalid or corrupted package"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (checksum)"
 | 
			
		||||
msgstr "invalid or corrupted package (checksum)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (PGP signature)"
 | 
			
		||||
msgstr "invalid or corrupted package (PGP signature)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot open package file"
 | 
			
		||||
msgstr "cannot open package file"
 | 
			
		||||
@@ -377,6 +398,14 @@ msgstr "package architecture is not valid"
 | 
			
		||||
msgid "could not find repository for target"
 | 
			
		||||
msgstr "could not find repository for target"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "missing PGP signature"
 | 
			
		||||
msgstr "missing PGP signature"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid PGP signature"
 | 
			
		||||
msgstr "invalid PGP signature"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted delta"
 | 
			
		||||
msgstr "invalid or corrupted delta"
 | 
			
		||||
@@ -401,10 +430,6 @@ msgstr "conflicting files"
 | 
			
		||||
msgid "failed to retrieve some files"
 | 
			
		||||
msgstr "failed to retrieve some files"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to copy some file"
 | 
			
		||||
msgstr "failed to copy some file"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid regular expression"
 | 
			
		||||
msgstr "invalid regular expression"
 | 
			
		||||
@@ -417,6 +442,10 @@ msgstr "libarchive error"
 | 
			
		||||
msgid "download library error"
 | 
			
		||||
msgstr "download library error"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "gpgme error"
 | 
			
		||||
msgstr "gpgme error"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error invoking external downloader"
 | 
			
		||||
msgstr "error invoking external downloader"
 | 
			
		||||
@@ -426,8 +455,8 @@ msgid "unexpected error"
 | 
			
		||||
msgstr "unexpected error"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database larger than maximum size\n"
 | 
			
		||||
msgstr "database larger than maximum size\n"
 | 
			
		||||
msgid "could not fully load metadata for package %s-%s\n"
 | 
			
		||||
msgstr "could not fully load metadata for package %s-%s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not find %s in database -- skipping\n"
 | 
			
		||||
@@ -441,6 +470,10 @@ msgstr "removing %s from target list\n"
 | 
			
		||||
msgid "cannot remove file '%s': %s\n"
 | 
			
		||||
msgstr "cannot remove file '%s': %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot remove %s (%s)\n"
 | 
			
		||||
msgstr "cannot remove %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove database entry %s-%s\n"
 | 
			
		||||
msgstr "could not remove database entry %s-%s\n"
 | 
			
		||||
@@ -493,14 +526,6 @@ msgstr "could not commit removal transaction\n"
 | 
			
		||||
msgid "could not commit transaction\n"
 | 
			
		||||
msgstr "could not commit transaction\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s database version is too old\n"
 | 
			
		||||
msgstr "%s database version is too old\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "could not remove lock file %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not create temp directory\n"
 | 
			
		||||
msgstr "could not create temp directory\n"
 | 
			
		||||
@@ -509,6 +534,10 @@ msgstr "could not create temp directory\n"
 | 
			
		||||
msgid "could not copy tempfile to %s (%s)\n"
 | 
			
		||||
msgstr "could not copy tempfile to %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove %s\n"
 | 
			
		||||
msgstr "could not remove %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove tmpdir %s\n"
 | 
			
		||||
msgstr "could not remove tmpdir %s\n"
 | 
			
		||||
@@ -546,5 +575,5 @@ msgid "no %s cache exists, creating...\n"
 | 
			
		||||
msgstr "no %s cache exists, creating...\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "couldn't create package cache, using /tmp instead\n"
 | 
			
		||||
msgstr "couldn't create package cache, using /tmp instead\n"
 | 
			
		||||
msgid "couldn't find or create package cache, using %s instead\n"
 | 
			
		||||
msgstr "couldn't find or create package cache, using %s instead\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,22 @@
 | 
			
		||||
# SOME DESCRIPTIVE TITLE.
 | 
			
		||||
# Copyright (C) YEAR Pacman Development Team <pacman-dev@archlinux.org>
 | 
			
		||||
# This file is distributed under the same license as the PACKAGE package.
 | 
			
		||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
			
		||||
#
 | 
			
		||||
# Translators:
 | 
			
		||||
# Angel Velasquez <angvp@archlinux.org>, 2011.
 | 
			
		||||
# Dan McGee <dpmcgee@gmail.com>, 2011.
 | 
			
		||||
# Juan Antonio Cánovas Pérez <traumness@gmail.com>, 2011.
 | 
			
		||||
#   <juantascon@gmail.com>, 2011.
 | 
			
		||||
# neiko <neikokz+tsfx@gmail.com>, 2011.
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: Arch Linux Pacman package manager\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: http://bugs.archlinux.org/index.php?project=3\n"
 | 
			
		||||
"POT-Creation-Date: 2011-04-18 11:23-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-03-22 15:34+0000\n"
 | 
			
		||||
"Last-Translator: angvp <angvp@archlinux.org>\n"
 | 
			
		||||
"Language-Team: Spanish (Castilian) <>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-10-05 22:35-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-10-06 16:10+0000\n"
 | 
			
		||||
"Last-Translator: juantascon <juantascon@gmail.com>\n"
 | 
			
		||||
"Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/"
 | 
			
		||||
"archlinux-pacman/team/es/)\n"
 | 
			
		||||
"Language: es\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
@@ -81,6 +87,10 @@ msgstr "no se pudo obtener el directorio de trabajo actual\n"
 | 
			
		||||
msgid "could not change directory to %s (%s)\n"
 | 
			
		||||
msgstr "no se pudo cambiar el directorio a %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not restore working directory (%s)\n"
 | 
			
		||||
msgstr "no se pudo restaurar el directorio de trabajo (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "problem occurred while upgrading %s\n"
 | 
			
		||||
msgstr "ocurrió un error durante la actualización de %s\n"
 | 
			
		||||
@@ -135,7 +145,7 @@ msgstr "no se pudo crear el directorio %s: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not parse package description file in %s\n"
 | 
			
		||||
msgstr "no se pudo interpretar el archivo de descripción en %s\n"
 | 
			
		||||
msgstr "no se pudo leer el archivo de descripción en %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "missing package name in %s\n"
 | 
			
		||||
@@ -157,13 +167,23 @@ msgstr "faltan los metadatos del paquete en %s\n"
 | 
			
		||||
msgid "removing invalid file: %s\n"
 | 
			
		||||
msgstr "eliminando archivo inválido: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "no se pudo eliminar el archivo de bloqueo %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not parse package description file '%s' from db '%s'\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"error al leer el archivo de descripción '%s' del paquete de la base de datos "
 | 
			
		||||
"'%s'\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database path is undefined\n"
 | 
			
		||||
msgstr "la ruta de la base de datos no está definida\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "dependency cycle detected:\n"
 | 
			
		||||
msgstr "ciclo de dependencias detectado:\n"
 | 
			
		||||
msgstr "bucle de dependencias detectado:\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s will be removed after its %s dependency\n"
 | 
			
		||||
@@ -171,7 +191,7 @@ msgstr "%s será eliminado después de su dependencia %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s will be installed before its %s dependency\n"
 | 
			
		||||
msgstr "%s será instalado antes de su dependencia %s\n"
 | 
			
		||||
msgstr "%s será instalado antes que su dependencia %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "ignoring package %s-%s\n"
 | 
			
		||||
@@ -208,34 +228,26 @@ msgid "Partition %s is mounted read only\n"
 | 
			
		||||
msgstr "La partición %s está montada como sólo lectura\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Partition %s too full: %ld blocks needed, %ld blocks free\n"
 | 
			
		||||
msgid "Partition %s too full: %jd blocks needed, %jd blocks free\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"La partición %s está muy llena: %ld bloques necesarios, %ld bloques "
 | 
			
		||||
"disponibles\n"
 | 
			
		||||
"Partición %s demasiado llena: %jd bloques son necesarios, %jd bloques "
 | 
			
		||||
"libres\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "disk"
 | 
			
		||||
msgstr "disco"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to create temporary file for download\n"
 | 
			
		||||
msgstr "error al crear un archivo temporal para la descarga\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "url '%s' is invalid\n"
 | 
			
		||||
msgstr "la dirección %s no es válida\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed retrieving file '%s' from %s : %s\n"
 | 
			
		||||
msgstr "fallo al obtener archivo '%s' desde %s: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "resuming download of %s not possible; starting over\n"
 | 
			
		||||
msgstr "no es posible continuar la descarga de %s; empezando de nuevo\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error writing to file '%s': %s\n"
 | 
			
		||||
msgstr "no se pudo escribir al archivo '%s': %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed retrieving file '%s' from %s\n"
 | 
			
		||||
msgstr "error al obtener el archivo '%s' desde %s\n"
 | 
			
		||||
msgstr "error al obtener archivo '%s' desde %s: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s appears to be truncated: %jd/%jd bytes\n"
 | 
			
		||||
@@ -305,6 +317,14 @@ msgstr "base de datos ya registrada"
 | 
			
		||||
msgid "could not find database"
 | 
			
		||||
msgstr "no se pudo encontrar la base de datos"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database"
 | 
			
		||||
msgstr "base de datos no válida o dañada"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database (PGP signature)"
 | 
			
		||||
msgstr "base de datos no válida o dañada (firma PGP)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database is incorrect version"
 | 
			
		||||
msgstr "la base de datos es de una versión incorrecta"
 | 
			
		||||
@@ -364,7 +384,15 @@ msgstr "operación cancelada debido a ignorepkg"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package"
 | 
			
		||||
msgstr "paquete inválido o corrupto"
 | 
			
		||||
msgstr "paquete no válido o dañado"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (checksum)"
 | 
			
		||||
msgstr "paquete no válido o dañado (suma de verificación)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (PGP signature)"
 | 
			
		||||
msgstr "paquete no válido o dañado (firma PGP)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot open package file"
 | 
			
		||||
@@ -386,6 +414,14 @@ msgstr "la arquitectura del paquete no es válida"
 | 
			
		||||
msgid "could not find repository for target"
 | 
			
		||||
msgstr "no pudo encontrarse un repositorio para el objetivo"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "missing PGP signature"
 | 
			
		||||
msgstr "falta la firma PGP"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid PGP signature"
 | 
			
		||||
msgstr "firma PGP no válida"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted delta"
 | 
			
		||||
msgstr "no válido o diferencial dañado"
 | 
			
		||||
@@ -410,10 +446,6 @@ msgstr "archivos en conflicto"
 | 
			
		||||
msgid "failed to retrieve some files"
 | 
			
		||||
msgstr "error al descargar algunos archivos"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to copy some file"
 | 
			
		||||
msgstr "error al copiar algún archivo"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid regular expression"
 | 
			
		||||
msgstr "expresión regular no válida"
 | 
			
		||||
@@ -426,6 +458,10 @@ msgstr "error de libarchive"
 | 
			
		||||
msgid "download library error"
 | 
			
		||||
msgstr "error de descarga de biblioteca"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "gpgme error"
 | 
			
		||||
msgstr "error de gpgme"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error invoking external downloader"
 | 
			
		||||
msgstr "error invocando el descargador externo"
 | 
			
		||||
@@ -435,8 +471,8 @@ msgid "unexpected error"
 | 
			
		||||
msgstr "error inesperado"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database larger than maximum size\n"
 | 
			
		||||
msgstr "la base de datos supera el tamaño máximo\n"
 | 
			
		||||
msgid "could not fully load metadata for package %s-%s\n"
 | 
			
		||||
msgstr "no se pudo cargar completamente los metadatos para el paquete %s-%s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not find %s in database -- skipping\n"
 | 
			
		||||
@@ -450,6 +486,10 @@ msgstr "quitando %s de la lista de objetivos\n"
 | 
			
		||||
msgid "cannot remove file '%s': %s\n"
 | 
			
		||||
msgstr "no se pudo quitar el archivo '%s': %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot remove %s (%s)\n"
 | 
			
		||||
msgstr "error al eliminar %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove database entry %s-%s\n"
 | 
			
		||||
msgstr "no se pudo quitar la entrada %s-%s de la base de datos\n"
 | 
			
		||||
@@ -504,14 +544,6 @@ msgstr "no se pudo enviar la operación de eliminación\n"
 | 
			
		||||
msgid "could not commit transaction\n"
 | 
			
		||||
msgstr "no se pudo asignar la transacción\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s database version is too old\n"
 | 
			
		||||
msgstr "la versión de la base de datos %s es muy antigua\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "no se pudo eliminar el archivo de bloqueo %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not create temp directory\n"
 | 
			
		||||
msgstr "no se puede crear el directorio temporal\n"
 | 
			
		||||
@@ -520,6 +552,10 @@ msgstr "no se puede crear el directorio temporal\n"
 | 
			
		||||
msgid "could not copy tempfile to %s (%s)\n"
 | 
			
		||||
msgstr "no se pudo copiar el archivo temporal a %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove %s\n"
 | 
			
		||||
msgstr "no se pudo eliminar %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove tmpdir %s\n"
 | 
			
		||||
msgstr "no se pudo eliminar el directorio temporal %s\n"
 | 
			
		||||
@@ -557,5 +593,6 @@ msgid "no %s cache exists, creating...\n"
 | 
			
		||||
msgstr "no existe la caché %s, creando...\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "couldn't create package cache, using /tmp instead\n"
 | 
			
		||||
msgstr "no se pudo crear la cache de paquetes, usando /tmp en su lugar\n"
 | 
			
		||||
msgid "couldn't find or create package cache, using %s instead\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"no se pudo encontrar o crear la caché del paquete, en lugar se utilizará %s\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,23 @@
 | 
			
		||||
# SOME DESCRIPTIVE TITLE.
 | 
			
		||||
# Copyright (C) YEAR Pacman Development Team <pacman-dev@archlinux.org>
 | 
			
		||||
# This file is distributed under the same license as the PACKAGE package.
 | 
			
		||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
			
		||||
#
 | 
			
		||||
# Translators:
 | 
			
		||||
# apuasi <kaannokset.hellberg@gmail.com>, 2011.
 | 
			
		||||
# Dan McGee <dpmcgee@gmail.com>, 2011.
 | 
			
		||||
# Jesse Jaara <jesse.jaara@gmail.com>, 2011.
 | 
			
		||||
#   <larso@gmx.com>, 2011.
 | 
			
		||||
# Larso <larso@gmx.com>, 2011.
 | 
			
		||||
# Lasse Liehu <lasse.liehu@gmail.com>, 2011.
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: Arch Linux Pacman package manager\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: http://bugs.archlinux.org/index.php?project=3\n"
 | 
			
		||||
"POT-Creation-Date: 2011-04-18 11:23-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-04-18 11:10+0000\n"
 | 
			
		||||
"Last-Translator: apuasi <kaannokset.hellberg@gmail.com>\n"
 | 
			
		||||
"Language-Team: Finnish <None>\n"
 | 
			
		||||
"POT-Creation-Date: 2011-10-05 22:35-0500\n"
 | 
			
		||||
"PO-Revision-Date: 2011-10-07 18:48+0000\n"
 | 
			
		||||
"Last-Translator: toofishes <dpmcgee@gmail.com>\n"
 | 
			
		||||
"Language-Team: Finnish (http://www.transifex.net/projects/p/archlinux-pacman/"
 | 
			
		||||
"team/fi/)\n"
 | 
			
		||||
"Language: fi\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
@@ -47,7 +54,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "extract: not overwriting dir with file %s\n"
 | 
			
		||||
msgstr "purku: kansiota ei ylikirjoiteta tiedostolla %s\n"
 | 
			
		||||
msgstr "purku: kansiota ei korvata tiedostolla %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "extract: symlink %s does not point to dir\n"
 | 
			
		||||
@@ -81,6 +88,10 @@ msgstr "nykyisen kansion sijaintia ei voitu määrittää\n"
 | 
			
		||||
msgid "could not change directory to %s (%s)\n"
 | 
			
		||||
msgstr "ei voitu vaihtaa kansioon %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not restore working directory (%s)\n"
 | 
			
		||||
msgstr "työhakemistoa ei voitu palauttaa (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "problem occurred while upgrading %s\n"
 | 
			
		||||
msgstr "pakettia %s päivitettäessä tapahtui virhe\n"
 | 
			
		||||
@@ -119,11 +130,11 @@ msgstr "tiedostoa %s ei voitu avata: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s database is inconsistent: name mismatch on package %s\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "tietokanta %s on epäyhtenäinen: paketin %s nimi ei täsmää\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s database is inconsistent: version mismatch on package %s\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "tietokanta %s on epäyhtenäinen: paketin %s versio ei täsmää\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not create directory %s: %s\n"
 | 
			
		||||
@@ -131,7 +142,7 @@ msgstr "kansiota %s ei voitu luoda: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not parse package description file in %s\n"
 | 
			
		||||
msgstr "paketin kuvausta tiedostossa %s ei voitu jäsentää\n"
 | 
			
		||||
msgstr "paketin kuvaustiedostoa %s ei voitu jäsentää\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "missing package name in %s\n"
 | 
			
		||||
@@ -153,6 +164,14 @@ msgstr "paketin metadata puuttuu tiedostosta %s\n"
 | 
			
		||||
msgid "removing invalid file: %s\n"
 | 
			
		||||
msgstr "poistetaan virheellinen tiedosto: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "lukkotiedostoa %s ei voitu poistaa\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not parse package description file '%s' from db '%s'\n"
 | 
			
		||||
msgstr "paketin kuvaustiedostoa '%s' ei voitu jäsentää tietokannassa '%s'\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database path is undefined\n"
 | 
			
		||||
msgstr "tietokannan polkua ei ole määritelty\n"
 | 
			
		||||
@@ -175,7 +194,7 @@ msgstr "ohitetaan paketti %s-%s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot resolve \"%s\", a dependency of \"%s\"\n"
 | 
			
		||||
msgstr "ei voida selvittää paketin \"%s\", riippuvuutta \"%s\"\n"
 | 
			
		||||
msgstr "pakettia '%s' ei voida selvittää, paketin '%s' riippuvuus\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not get filesystem information\n"
 | 
			
		||||
@@ -202,13 +221,17 @@ msgid "Partition %s is mounted read only\n"
 | 
			
		||||
msgstr "Osio %s on liitetty vain lukutilassa\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Partition %s too full: %ld blocks needed, %ld blocks free\n"
 | 
			
		||||
msgstr "osio %s on liian täynnä: %ld lohkoa tarvitaan, %ld lohkoa vapaana\n"
 | 
			
		||||
msgid "Partition %s too full: %jd blocks needed, %jd blocks free\n"
 | 
			
		||||
msgstr "Osio %s on liian täynnä: %jd lohkoa tarvitaan, %jd lohkoa vapaana\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "disk"
 | 
			
		||||
msgstr "levy"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to create temporary file for download\n"
 | 
			
		||||
msgstr "väliaikaistiedoston luonti lataamista varten epäonnistui\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "url '%s' is invalid\n"
 | 
			
		||||
msgstr "osoite '%s' on virheellinen\n"
 | 
			
		||||
@@ -217,18 +240,6 @@ msgstr "osoite '%s' on virheellinen\n"
 | 
			
		||||
msgid "failed retrieving file '%s' from %s : %s\n"
 | 
			
		||||
msgstr "tiedoston '%s' nouto palvelimelta %s epäonnistui : %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "resuming download of %s not possible; starting over\n"
 | 
			
		||||
msgstr "tiedoston %s latauksen jatkaminen ei mahdollista; aloitetaan alusta\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error writing to file '%s': %s\n"
 | 
			
		||||
msgstr "virhe kirjoitettaessa tiedostoon '%s': %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed retrieving file '%s' from %s\n"
 | 
			
		||||
msgstr "tiedoston '%s' nouto palvelimelta %s epäonnistui\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s appears to be truncated: %jd/%jd bytes\n"
 | 
			
		||||
msgstr "%s näyttää katkenneen: %jd/%jd tavua\n"
 | 
			
		||||
@@ -297,6 +308,14 @@ msgstr "tietokanta on jo rekisteröity"
 | 
			
		||||
msgid "could not find database"
 | 
			
		||||
msgstr "tietokantaa ei löytynyt"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database"
 | 
			
		||||
msgstr "virheellinen tai vahingoittunut tietokanta"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted database (PGP signature)"
 | 
			
		||||
msgstr "virheellinen tai vahingoittunut tietokanta (PGP-allekirjoitus)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database is incorrect version"
 | 
			
		||||
msgstr "tietokannan versio on väärä"
 | 
			
		||||
@@ -327,7 +346,7 @@ msgstr "toimenpidettä ei ole alustettu"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "duplicate target"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "kohde on useampaan kertaan"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "transaction not prepared"
 | 
			
		||||
@@ -355,7 +374,15 @@ msgstr "operaatio peruutettiin ignorepkg:n takia"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package"
 | 
			
		||||
msgstr "paketti ei kelvollinen tai se on vahingoittunut"
 | 
			
		||||
msgstr "virheellinen tai vahingoittunut paketti"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (checksum)"
 | 
			
		||||
msgstr "virheellinen tai vahingoittunut paketti (tarkistussumma)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted package (PGP signature)"
 | 
			
		||||
msgstr "virheellinen tai vahingoittunut paketti (PGP-allekirjoitus)"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot open package file"
 | 
			
		||||
@@ -377,9 +404,17 @@ msgstr "paketin arkkitehtuuri ei ole kelvollinen"
 | 
			
		||||
msgid "could not find repository for target"
 | 
			
		||||
msgstr "kohteen varastoa ei löytynyt"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "missing PGP signature"
 | 
			
		||||
msgstr "puuttuva PGP-allekirjoitus"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid PGP signature"
 | 
			
		||||
msgstr "virheellinen PGP-allekirjoitus"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid or corrupted delta"
 | 
			
		||||
msgstr "delta ei kelvollinen tai vahingoittunut"
 | 
			
		||||
msgstr "virheellinen tai vahingoittunut delta"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "delta patch failed"
 | 
			
		||||
@@ -401,10 +436,6 @@ msgstr "ristiriidassa olevia tiedostoja"
 | 
			
		||||
msgid "failed to retrieve some files"
 | 
			
		||||
msgstr "joidenkin tiedostojen nouto epäonnistui"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "failed to copy some file"
 | 
			
		||||
msgstr "jonkin tiedoston kopiointi epäonnistui"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "invalid regular expression"
 | 
			
		||||
msgstr "virheellinen säännöllinen lauseke"
 | 
			
		||||
@@ -417,6 +448,10 @@ msgstr "libarchive-virhe"
 | 
			
		||||
msgid "download library error"
 | 
			
		||||
msgstr "latauskirjaston virhe"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "gpgme error"
 | 
			
		||||
msgstr "gpgme-virhe"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "error invoking external downloader"
 | 
			
		||||
msgstr "virhe kutsuttaessa ulkoista latausohjelmaa"
 | 
			
		||||
@@ -426,8 +461,8 @@ msgid "unexpected error"
 | 
			
		||||
msgstr "odottamaton virhe"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "database larger than maximum size\n"
 | 
			
		||||
msgstr "tietokanta enimmäiskokoa suurempi\n"
 | 
			
		||||
msgid "could not fully load metadata for package %s-%s\n"
 | 
			
		||||
msgstr "paketin %s-%s metadataa ei voitu ladata täysin\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not find %s in database -- skipping\n"
 | 
			
		||||
@@ -441,6 +476,10 @@ msgstr "poistetaan %s kohteiden listasta\n"
 | 
			
		||||
msgid "cannot remove file '%s': %s\n"
 | 
			
		||||
msgstr "tiedostoa '%s' ei voitu poistaa: %s\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "cannot remove %s (%s)\n"
 | 
			
		||||
msgstr "tiedostoa %s ei voida poistaa (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove database entry %s-%s\n"
 | 
			
		||||
msgstr "ei voitu poistaa tietokantamerkintää %s-%s\n"
 | 
			
		||||
@@ -495,14 +534,6 @@ msgstr "poistotoimenpidettä ei voitu suorittaa\n"
 | 
			
		||||
msgid "could not commit transaction\n"
 | 
			
		||||
msgstr "toimenpidettä ei voitu suorittaa\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%s database version is too old\n"
 | 
			
		||||
msgstr "tietokannan %s versio on liian vanha\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove lock file %s\n"
 | 
			
		||||
msgstr "lukkotiedostoa %s ei voitu poistaa\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not create temp directory\n"
 | 
			
		||||
msgstr "väliaikaiskansiota ei voitu luoda\n"
 | 
			
		||||
@@ -511,6 +542,10 @@ msgstr "väliaikaiskansiota ei voitu luoda\n"
 | 
			
		||||
msgid "could not copy tempfile to %s (%s)\n"
 | 
			
		||||
msgstr "väliaikaistiedostoa ei voitu kopioida kansioon %s (%s)\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove %s\n"
 | 
			
		||||
msgstr "%s ei voitu poistaa\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "could not remove tmpdir %s\n"
 | 
			
		||||
msgstr "väliaikaiskansiota %s ei voitu poistaa\n"
 | 
			
		||||
@@ -548,5 +583,7 @@ msgid "no %s cache exists, creating...\n"
 | 
			
		||||
msgstr "välimuistia %s ei ole olemassa, luodaan...\n"
 | 
			
		||||
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "couldn't create package cache, using /tmp instead\n"
 | 
			
		||||
msgstr "pakettivälimuistia ei voitu luoda, käytetään /tmp:tä sen sijasta\n"
 | 
			
		||||
msgid "couldn't find or create package cache, using %s instead\n"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"pakettivälimuistia ei ollut olemassa eikä sitä voitu luoda. Käytetään %s sen "
 | 
			
		||||
"sijaan\n"
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user