setup/setup.c
author J. Ali Harlow <ali@juiblex.co.uk>
Thu Oct 01 20:38:39 2009 +0100 (2009-10-01)
changeset 7 6b408af5467c
parent 0 49fc8f60e4a5
child 13 b0a35bae4961
permissions -rw-r--r--
Release version 0.2.1
ali@0
     1
/*
ali@0
     2
 * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
ali@0
     3
 *
ali@0
     4
 * This program is free software; you can redistribute it and/or modify
ali@0
     5
 * it under the terms of the GNU General Public License as published by
ali@0
     6
 * the Free Software Foundation; either version 2 of the License, or
ali@0
     7
 * (at your option) any later version.
ali@0
     8
 *
ali@0
     9
 * This program is distributed in the hope that it will be useful,
ali@0
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ali@0
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ali@0
    12
 * GNU General Public License for more details.
ali@0
    13
 *
ali@0
    14
 * You should have received a copy of the GNU General Public License along
ali@0
    15
 * with this program; if not, write to the Free Software Foundation, Inc.,
ali@0
    16
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ali@0
    17
 */
ali@0
    18
ali@0
    19
#include <stdlib.h>
ali@0
    20
#include <stdio.h>
ali@0
    21
#include <string.h>
ali@0
    22
#include <limits.h>
ali@0
    23
#ifdef WIN32
ali@0
    24
#include <windows.h>
ali@0
    25
#include <shlobj.h>
ali@0
    26
#endif
ali@0
    27
#include <lua.h>
ali@0
    28
#include "config.h"
ali@0
    29
#include "plover/plover.h"
ali@0
    30
#include "whelk/whelk.h"
ali@0
    31
ali@0
    32
LUALIB_API int luaopen_posix(lua_State *L);
ali@0
    33
ali@0
    34
struct vector {
ali@0
    35
    int len,alloc;
ali@0
    36
    char **strings;
ali@0
    37
};
ali@0
    38
ali@0
    39
struct vector *vector_new(void)
ali@0
    40
{
ali@0
    41
    struct vector *vector;
ali@0
    42
    vector=malloc(sizeof(*vector));
ali@0
    43
    vector->len=0;
ali@0
    44
    vector->alloc=16;
ali@0
    45
    vector->strings=calloc(vector->alloc,sizeof(char *));
ali@0
    46
    return vector;
ali@0
    47
}
ali@0
    48
ali@0
    49
void vector_append(struct vector *vector,const char *str)
ali@0
    50
{
ali@0
    51
    if (++(vector->len)>=vector->alloc)
ali@0
    52
    {
ali@0
    53
	vector->alloc*=2;
ali@0
    54
	vector->strings=realloc(vector->strings,vector->alloc*sizeof(char *));
ali@0
    55
    }
ali@0
    56
    vector->strings[vector->len-1]=strdup(str);
ali@0
    57
    vector->strings[vector->len]=NULL;
ali@0
    58
}
ali@0
    59
ali@0
    60
int vector_contains(struct vector *vector,const char *str)
ali@0
    61
{
ali@0
    62
    int i;
ali@0
    63
    for(i=0;i<vector->len;i++)
ali@0
    64
	if (!strcmp(vector->strings[i],str))
ali@0
    65
	    return 1;
ali@0
    66
    return 0;
ali@0
    67
}
ali@0
    68
ali@0
    69
void vector_free(struct vector *vector)
ali@0
    70
{
ali@0
    71
    int i;
ali@0
    72
    for(i=0;i<vector->len;i++)
ali@0
    73
	free(vector->strings[i]);
ali@0
    74
    free(vector->strings);
ali@0
    75
    free(vector);
ali@0
    76
}
ali@0
    77
ali@0
    78
static void *alloc_lua(void *user_data,void *ptr,size_t osize,size_t nsize)
ali@0
    79
{
ali@0
    80
    if (!nsize)
ali@0
    81
    {
ali@0
    82
	free(ptr);
ali@0
    83
	return NULL;
ali@0
    84
    }
ali@0
    85
    else
ali@0
    86
	return realloc(ptr,nsize);
ali@0
    87
}
ali@0
    88
ali@3
    89
void setup(const char *argv0)
ali@0
    90
{
ali@3
    91
    char *path,*s,*prefix;
ali@0
    92
    int changed;
ali@0
    93
    struct comps *comps;
ali@0
    94
    struct comps_group *group;
ali@0
    95
    struct comps_requirement *pkg;
ali@0
    96
    struct vector *packages=NULL;
ali@3
    97
    path=plover_get_program_directory(argv0);
ali@0
    98
    s=plover_strconcat(path,"/repodata/comps.xml",NULL);
ali@0
    99
    comps=plover_comps_new_from_file(s);
ali@0
   100
    if (!comps)
ali@0
   101
    {
ali@0
   102
	perror(s);
ali@0
   103
	exit(1);
ali@0
   104
    }
ali@0
   105
    free(s);
ali@3
   106
    prefix=plover_default_prefix_for_vendor(comps->vendor);
ali@0
   107
    group=plover_comps_lookup_group(comps,"base");
ali@0
   108
    if (!group)
ali@0
   109
    {
ali@0
   110
	fprintf(stderr,"No base group found in comps.xml\n");
ali@0
   111
	exit(1);
ali@0
   112
    }
ali@0
   113
    packages=vector_new();
ali@0
   114
    do
ali@0
   115
    {
ali@0
   116
	changed=0;
ali@0
   117
	for(pkg=group->packages;pkg;pkg=pkg->next)
ali@0
   118
	{
ali@0
   119
	    if (vector_contains(packages,pkg->name))
ali@0
   120
		continue;
ali@0
   121
	    if (pkg->type==COMPS_REQUIREMENT_DEFAULT ||
ali@0
   122
	      pkg->type==COMPS_REQUIREMENT_MANDATORY ||
ali@0
   123
	      pkg->type==COMPS_REQUIREMENT_CONDITIONAL &&
ali@0
   124
	      vector_contains(packages,pkg->requires))
ali@0
   125
	    {
ali@0
   126
		changed++;
ali@0
   127
		vector_append(packages,pkg->name);
ali@0
   128
	    }
ali@0
   129
	}
ali@0
   130
    } while(changed);
ali@3
   131
    plover_comps_free(comps);
ali@0
   132
    if (!packages->len)
ali@0
   133
    {
ali@0
   134
	fprintf(stderr,"No packages to install\n");
ali@0
   135
	exit(1);
ali@0
   136
    }
ali@0
   137
    plover_install(path,prefix,packages->strings);
ali@0
   138
    vector_free(packages);
ali@0
   139
    free(prefix);
ali@3
   140
    free(path);
ali@0
   141
}
ali@0
   142
ali@0
   143
int main(int argc,char **argv)
ali@0
   144
{
ali@0
   145
    razor_set_lua_loader("posix",luaopen_posix);
ali@0
   146
    razor_set_lua_loader("whelk",luaopen_whelk);
ali@0
   147
    if (argc>1 && !strcmp(argv[1],"-u"))
ali@0
   148
	plover_remove(NULL);
ali@0
   149
    else
ali@3
   150
	setup(argv[0]);
ali@0
   151
}