User Tools

Site Tools


etc:20-lpm-gui

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
etc:20-lpm-gui [2022/05/14 02:26] wikiadminetc:20-lpm-gui [2022/07/28 18:13] (current) wikiadmin
Line 55: Line 55:
 As archive format, lpk uses gzip compressed cpio, prepended by a header containing the package information. The prepended header looks like this: As archive format, lpk uses gzip compressed cpio, prepended by a header containing the package information. The prepended header looks like this:
  
-  * 11 bytes made from 5 bytes containing the version signature (EPLM20) and 6 bytes containing the zero-padded size of the following header+  * 11 bytes made from 5 bytes containing the version signature (ELPM20) and 6 bytes containing the zero-padded size of the following header
   * The package description, starting at byte 12.   * The package description, starting at byte 12.
  
Line 189: Line 189:
 </code> </code>
  
-The function int plpm_exec(int action,EKVA **options,char **packages) in lpmsh.c provides a working example on how to call plpm in all cases.+The function plpm_exec in lpmsh.c provides a working example on how to call plpm in all cases.
  
-===== 8. Important data structures =====+===== 8. Important frontend data structures ===== 
 + 
 +==== 8.1 LPI ==== 
 + 
 +Most relevant structures and functions are defined in the header file lpm.h, the most important structure is: 
 +<code> 
 + 
 +struct s_lpk_info { 
 +    char *name; 
 +    char *variant; 
 +    char *version; 
 +    char *creator; 
 +    int arch; 
 +    char *desc; 
 +    char *clog; 
 +    char **deps; 
 +    int removable; 
 +    unsigned long datasize; 
 +    /* The next two are only for repository packages */ 
 +    unsigned long filesize; 
 +    char *filehash; 
 +    char *abs_uri; 
 +    char *rel_uri; 
 +    /* These three are only for locally installed packages */ 
 +    time_t install_time; 
 +    char  install_type; 
 +    char *install_head; 
 +    time_t *update_time; 
 +    /* The next three are for the signature */ 
 +    char *rsa_sig_subj; 
 +    char *rsa_sig_data_buf; 
 +    int rsa_sig_data_len; 
 +    int rsa_verified; 
 +    /* Now follows a ekva with any further extended attributes */ 
 +    struct s_ekva **ext_attributes; 
 +}; 
 + 
 +typedef struct s_lpk_info LPI; 
 + 
 +</code> 
 + 
 +LPI is used throughout lpm for any package information, either for installed packages, available packages or package files. It contains all relevant information of any package, but not its actual contents. Consequently, all functions that will return information about one or more packages with either return one LPI, or an array of LPI's. 
 + 
 +The meaning of its members are: 
 + 
 +|name|the package name| 
 +|variant|the package variant, can be NULL| 
 +|version|the package version| 
 +|creator|name and mail address of the package creator| 
 +|arch|either i686,x86_64,mips or any, largely unused| 
 +|desc|the package description| 
 +|clog|the package's changelog, unused| 
 +|deps|an array of names of the package's dependencies, can be NULL| 
 +|removable|boolean of package is removable, absolutely unused| 
 +|datasize|the sum of bytes in the data part of a package| 
 +|filesize|the filesize of a package in lpc catalogue| 
 +|abs_uri|the absolute uri of a package in lpc catalogue| 
 +|rel_url|the relative uri of a package in lpc catalogue| 
 +|install_time|the installation unix time of an installed package| 
 +|install_type| \\ X for an installed package if explicitely installed, D if installed as a dependency| 
 +|install_head|if installed as a dependency, the name of the package having required it| 
 +|update_time|an array of unix time when the package was updated, can be NULL| 
 +|rsa_sig_data|the buffer and it's size containing the package's signature| 
 +|rsa_sig_subj|the subject dn of the package signer| 
 +|rsa_verified|a flag containing the vefication status| 
 +|ext_attributes|an EKVA of other package attributes, currently unused| 
 +| | | 
 + 
 +==== 8.2 EKVA ==== 
 + 
 +EKVA is an array of stuctures containg a pointer to a key and to a value and is defined in stuff/ekva.h: 
 +<code> 
 + 
 +struct s_ekva { 
 +    char *key; 
 +    char *val; 
 +}; 
 + 
 +typedef struct s_ekva EKVA; 
 + 
 +</code> 
 + 
 +EKVA arrays are used extensively throughout lpm as text-based keyword-value stores, with multiple values for one keyword possible depending on its initialisation. As their first element, they hold a header containing their current size an mode, allowing for automatic growing and management of multiple values. 
 + 
 +EKVA arrays are created, filled, read and deleted by a set of functions defined in ekva.h, the most important ones being: 
 + 
 +- ekva_new: to create a new EKVA array \\ - ekva_addval: to add a key/val pair to the EKVA arrray \\ - ekva_getval: to read the first value for a key \\ - ekva_cntval: to count the number of vaules for a key \\ - ekva_getone: to read the specified value for a key \\ - ekva_getvals: to read all values for a key 
 + 
 +==== 8.3 LPA ==== 
 + 
 +LPA arrays are used to store information about available updates in an easily parsable form: 
 + 
 +<code> 
 +struct s_lpa { 
 +    char action; 
 +    char status; 
 +    LPI *lpi; 
 +    char *candidate; 
 +}; 
 +typedef struct s_lpa LPA; 
 + 
 +</code> 
 + 
 +- action is 'U' or 'I', as an update might pull a new dependency \\ - status is always 'N' \\ - lpi contains the package info of the package to be installed or updated 
 + 
 +===== 9. important frontend functions ===== 
 + 
 +All frontend functions are defined int lpm.h, the ones relevant to a frontend using plpm for privileged actions are: 
 + 
 +- lpm_open: "opens" the local lpm repository and return an LPM * structure for further use. 
 + 
 +- lpmui_init: initializes the internally used lpmui, necessary, but has no effect… 
 + 
 +- lpm_lpc_load: loads the configured package catalogue 
 + 
 +- lpm_lpc_connect: connects the program to the package catalogie 
 + 
 +- lpm_lpc_cache_fill: fills the package catalogue cache 
 + 
 +- lpm_lpc_release: disconnects from the package catalogue 
 + 
 +- lpm_cache_free: frees the cache 
 + 
 +- lpk_info_ekva: converts an LPI * package description to a string-based EKVA * keyword/value list 
 + 
 +- lpm_list_lpi: returns a list of locally installed package descriptions 
 + 
 +- lpm_lpf_info: returns a package description from a package file 
 + 
 +- lpm_findpkg_new: returns a list of available, not installed packages 
 + 
 +- lconf_read: reads the lpm config file 
 + 
 +- log_init: initializes the internal logging mechanism, necessary 
 + 
 +- lpm_pre_update: checks for an available update of a specified package 
 + 
 +- lpm_lpa_list_add_lpt: adds the results of lpm_pre_update to an easily readable LPA * list 
 + 
 +===== 10. Required globals ===== 
 + 
 +In order for the frontend to be able to use all further funtions correctly, it has to define a set of global variables: 
 + 
 +<code> 
 +void *lpc_backend_handle; 
 +EKVA **lpm_sys_conf = NULL; 
 +LPC *lpc; 
 + 
 +int dry_run =  0; 
 +int vote_mode = LPM_VOTE_DEFAULT; 
 +LPMUI *lpmui = NULL; 
 +struct s_llog *llog; 
 + 
 +LPI **lpc_cache; 
 + 
 +</code> 
 + 
 +===== 11. Required initialization sequence ===== 
 + 
 +Maybe in later releases, the initialisation sequence will be simplyfied and merged into some lpm_init function, but for the moment, the code from line 490 - 542 from lpmsh.c can be copied for that purpose.
  
  
etc/20-lpm-gui.1652487963.txt.gz · Last modified: by wikiadmin