ali@0: /* ali@0: * Copyright (C) 2009 J. Ali Harlow ali@0: * ali@0: * This program is free software; you can redistribute it and/or modify ali@0: * it under the terms of the GNU General Public License as published by ali@0: * the Free Software Foundation; either version 2 of the License, or ali@0: * (at your option) any later version. ali@0: * ali@0: * This program is distributed in the hope that it will be useful, ali@0: * but WITHOUT ANY WARRANTY; without even the implied warranty of ali@0: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ali@0: * GNU General Public License for more details. ali@0: * ali@0: * You should have received a copy of the GNU General Public License along ali@0: * with this program; if not, write to the Free Software Foundation, Inc., ali@0: * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ali@0: */ ali@0: ali@0: #include ali@0: #include ali@0: #include ali@0: #include ali@0: #ifdef WIN32 ali@0: #include ali@0: #include ali@0: #endif ali@0: #include ali@0: #include "config.h" ali@0: #include "plover/plover.h" ali@0: #include "whelk/whelk.h" ali@0: ali@0: LUALIB_API int luaopen_posix(lua_State *L); ali@0: ali@0: struct vector { ali@0: int len,alloc; ali@0: char **strings; ali@0: }; ali@0: ali@0: struct vector *vector_new(void) ali@0: { ali@0: struct vector *vector; ali@0: vector=malloc(sizeof(*vector)); ali@0: vector->len=0; ali@0: vector->alloc=16; ali@0: vector->strings=calloc(vector->alloc,sizeof(char *)); ali@0: return vector; ali@0: } ali@0: ali@0: void vector_append(struct vector *vector,const char *str) ali@0: { ali@0: if (++(vector->len)>=vector->alloc) ali@0: { ali@0: vector->alloc*=2; ali@0: vector->strings=realloc(vector->strings,vector->alloc*sizeof(char *)); ali@0: } ali@0: vector->strings[vector->len-1]=strdup(str); ali@0: vector->strings[vector->len]=NULL; ali@0: } ali@0: ali@0: int vector_contains(struct vector *vector,const char *str) ali@0: { ali@0: int i; ali@0: for(i=0;ilen;i++) ali@0: if (!strcmp(vector->strings[i],str)) ali@0: return 1; ali@0: return 0; ali@0: } ali@0: ali@0: void vector_free(struct vector *vector) ali@0: { ali@0: int i; ali@0: for(i=0;ilen;i++) ali@0: free(vector->strings[i]); ali@0: free(vector->strings); ali@0: free(vector); ali@0: } ali@0: ali@0: static void *alloc_lua(void *user_data,void *ptr,size_t osize,size_t nsize) ali@0: { ali@0: if (!nsize) ali@0: { ali@0: free(ptr); ali@0: return NULL; ali@0: } ali@0: else ali@0: return realloc(ptr,nsize); ali@0: } ali@0: ali@3: void setup(const char *argv0) ali@0: { ali@3: char *path,*s,*prefix; ali@0: int changed; ali@0: struct comps *comps; ali@0: struct comps_group *group; ali@0: struct comps_requirement *pkg; ali@0: struct vector *packages=NULL; ali@3: path=plover_get_program_directory(argv0); ali@0: s=plover_strconcat(path,"/repodata/comps.xml",NULL); ali@0: comps=plover_comps_new_from_file(s); ali@0: if (!comps) ali@0: { ali@0: perror(s); ali@0: exit(1); ali@0: } ali@0: free(s); ali@3: prefix=plover_default_prefix_for_vendor(comps->vendor); ali@0: group=plover_comps_lookup_group(comps,"base"); ali@0: if (!group) ali@0: { ali@0: fprintf(stderr,"No base group found in comps.xml\n"); ali@0: exit(1); ali@0: } ali@0: packages=vector_new(); ali@0: do ali@0: { ali@0: changed=0; ali@0: for(pkg=group->packages;pkg;pkg=pkg->next) ali@0: { ali@0: if (vector_contains(packages,pkg->name)) ali@0: continue; ali@0: if (pkg->type==COMPS_REQUIREMENT_DEFAULT || ali@0: pkg->type==COMPS_REQUIREMENT_MANDATORY || ali@0: pkg->type==COMPS_REQUIREMENT_CONDITIONAL && ali@0: vector_contains(packages,pkg->requires)) ali@0: { ali@0: changed++; ali@0: vector_append(packages,pkg->name); ali@0: } ali@0: } ali@0: } while(changed); ali@3: plover_comps_free(comps); ali@0: if (!packages->len) ali@0: { ali@0: fprintf(stderr,"No packages to install\n"); ali@0: exit(1); ali@0: } ali@0: plover_install(path,prefix,packages->strings); ali@0: vector_free(packages); ali@0: free(prefix); ali@3: free(path); ali@0: } ali@0: ali@0: int main(int argc,char **argv) ali@0: { ali@0: razor_set_lua_loader("posix",luaopen_posix); ali@0: razor_set_lua_loader("whelk",luaopen_whelk); ali@0: if (argc>1 && !strcmp(argv[1],"-u")) ali@0: plover_remove(NULL); ali@0: else ali@3: setup(argv[0]); ali@0: }