setup/setup.c
author J. Ali Harlow <ali@juiblex.co.uk>
Thu Aug 13 12:42:26 2009 +0100 (2009-08-13)
changeset 2 1f06562182cb
child 3 868db5c1f2d7
permissions -rw-r--r--
Switch to razor 0.2 API
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@0
    89
void setup()
ali@0
    90
{
ali@0
    91
    char path[PATH_MAX],*s,*t,*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@0
    97
#ifdef WIN32
ali@0
    98
    SHGetFolderPath(NULL,CSIDL_PROGRAM_FILES|CSIDL_FLAG_DONT_VERIFY,NULL,0,
ali@0
    99
      path);
ali@0
   100
    prefix=strdup(path);
ali@0
   101
    GetModuleFileName(NULL,path,sizeof(path));
ali@0
   102
    s=strrchr(path,'/');
ali@0
   103
    if (s)
ali@0
   104
    {
ali@0
   105
	t=strrchr(s,'\\');
ali@0
   106
	if (t)
ali@0
   107
	    s=t;
ali@0
   108
    }
ali@0
   109
    else
ali@0
   110
	s=strrchr(path,'\\');
ali@0
   111
    if (s)
ali@0
   112
	*s='\0';
ali@0
   113
#else
ali@0
   114
    strcpy(path,"/tmp");
ali@0
   115
    prefix=NULL;
ali@0
   116
#endif
ali@0
   117
    s=plover_strconcat(path,"/repodata/comps.xml",NULL);
ali@0
   118
    comps=plover_comps_new_from_file(s);
ali@0
   119
    if (!comps)
ali@0
   120
    {
ali@0
   121
	perror(s);
ali@0
   122
	exit(1);
ali@0
   123
    }
ali@0
   124
    free(s);
ali@0
   125
#ifdef WIN32
ali@0
   126
    s=plover_strconcat(prefix,"\\",comps->vendor?comps->vendor:"Plover",NULL);
ali@0
   127
    free(prefix);
ali@0
   128
    prefix=s;
ali@0
   129
#endif
ali@0
   130
    group=plover_comps_lookup_group(comps,"base");
ali@0
   131
    if (!group)
ali@0
   132
    {
ali@0
   133
	fprintf(stderr,"No base group found in comps.xml\n");
ali@0
   134
	exit(1);
ali@0
   135
    }
ali@0
   136
    packages=vector_new();
ali@0
   137
    do
ali@0
   138
    {
ali@0
   139
	changed=0;
ali@0
   140
	for(pkg=group->packages;pkg;pkg=pkg->next)
ali@0
   141
	{
ali@0
   142
	    if (vector_contains(packages,pkg->name))
ali@0
   143
		continue;
ali@0
   144
	    if (pkg->type==COMPS_REQUIREMENT_DEFAULT ||
ali@0
   145
	      pkg->type==COMPS_REQUIREMENT_MANDATORY ||
ali@0
   146
	      pkg->type==COMPS_REQUIREMENT_CONDITIONAL &&
ali@0
   147
	      vector_contains(packages,pkg->requires))
ali@0
   148
	    {
ali@0
   149
		changed++;
ali@0
   150
		vector_append(packages,pkg->name);
ali@0
   151
	    }
ali@0
   152
	}
ali@0
   153
    } while(changed);
ali@0
   154
    if (!packages->len)
ali@0
   155
    {
ali@0
   156
	fprintf(stderr,"No packages to install\n");
ali@0
   157
	exit(1);
ali@0
   158
    }
ali@0
   159
    plover_install(path,prefix,packages->strings);
ali@0
   160
    vector_free(packages);
ali@0
   161
    plover_comps_free(comps);
ali@0
   162
#ifdef WIN32
ali@0
   163
    free(prefix);
ali@0
   164
#endif
ali@0
   165
}
ali@0
   166
ali@0
   167
int main(int argc,char **argv)
ali@0
   168
{
ali@0
   169
    razor_set_lua_loader("posix",luaopen_posix);
ali@0
   170
    razor_set_lua_loader("whelk",luaopen_whelk);
ali@0
   171
    if (argc>1 && !strcmp(argv[1],"-u"))
ali@0
   172
	plover_remove(NULL);
ali@0
   173
    else
ali@0
   174
	setup();
ali@0
   175
}