/*
* Copyright 2006,2008 Nick White
*
* This file is part of GetHT
*
* GetHT 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 3 of the License, or
* (at your option) any later version.
*
* GetHT 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 GetHT. If not, see .
*
*/
#include
#include
#include
#include
#include
#include
#include
#include "version.h"
#include "issue.h"
#include "getht.h"
int update_contents_files();
int proxy_type; char proxy_addr[STR_MAX]; long proxy_port;
int proxy_auth;
char proxy_user[STR_MAX]; char proxy_pass[STR_MAX];
char issue_xml[STR_MAX];
char issue_uri[STR_MAX];
CURL *main_curl_handle;
int main(int argc, char *argv[])
{
char getht_path[STR_MAX];
char save_path[STR_MAX];
/* Define & set up paths */
snprintf(getht_path,STR_MAX,"%s/.getht",getenv("HOME"));
if(!opendir(getht_path))
if(mkdir(getht_path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH))
{
fprintf(stderr,"Cannot open/create directory %s\n",getht_path);
printf("Please enter the path of a directory to save settings in: ");
scanf("%s", getht_path);
}
snprintf(issue_xml,STR_MAX,"%s/%s",getht_path,ISS_XML_FILE);
strncpy(issue_uri,XML_TOC_URI,STR_MAX);
snprintf(save_path,STR_MAX,"%s/hinduism_today",getenv("HOME"));
int downall = 0;
int downissue = 0, downissueno = -1;
int listissues = 0;
int force = 0, update = 0;
int verbose = 0, option = 0;
proxy_type = 0;
proxy_port = 0;
proxy_addr[0] = '\0';
proxy_auth = 0;
proxy_user[0] = '\0';
proxy_pass[0] = '\0';
if(loadconfig(getht_path, &save_path, &update) != 0)
writefreshconfig(getht_path, &save_path, &update, &issue_uri);
if(!opendir(save_path))
if(mkdir(save_path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH))
{
fprintf(stderr,"Cannot open/create directory %s",save_path);
printf("Please enter the path of a directory to save issues in: ");
scanf("%s", save_path);
updateconfig(getht_path, &save_path, NULL);
}
/* Parse command line options */
char c;
static struct option long_opts[] =
{
{"download-all", no_argument, 0, 'a'},
{"download-issue", required_argument, 0, 'd'},
{"force", no_argument, 0, 'f'},
{"list-issues", no_argument, 0, 'l'},
{"update", no_argument, 0, 'u'},
{"help", no_argument, 0, 'h'},
{"verbose", no_argument, 0, 'v'},
{"version", no_argument, 0, 'V'},
{0, 0, 0, 0}
};
while((c = getopt_long(argc, argv, "ad:fhlmn:osuvVx:t:", long_opts, NULL)) != -1) {
switch(c) {
case 'a':
downall = 1;
downissue = 1;
option = 1;
break;
case 'd':
downissue = 1;
downissueno = atoi(optarg);
option = 1;
break;
case 'l':
listissues = 1;
option = 1;
break;
case 'f':
force = 1;
option = 1;
break;
case 'u':
update = 1;
option = 1;
break;
case 'h':
showusage();
return 0;
break;
case 'v':
verbose++;
option = 1;
break;
case 'V':
printf("GetHT version: %s\n",VERSION);
option = 1;
return 0;
break;
}
}
if(!option)
{
showusage();
return 0;
}
main_curl_handle = curl_easy_init();
if(update)
{
if(update_contents_files())
fprintf(stderr,"Could not update contents files\n");
}
/* Parse TOC, filling issue structure */
iss **issue;
int no_of_issues = -1;
int i;
if(downissue || listissues)
{
issue = parsetoc(issue_xml, &no_of_issues);
if(!issue)
{
if(!update)
{
printf("Cannot open contents file, trying to update contents\n");
if(update_contents_files())
return 1;
issue = parsetoc(issue_xml, &no_of_issues);
}
else
{
printf("Cannot open contents file, try running `getht --update`\n");
return 1;
}
}
if(downall)
{
for(i = 0; i < no_of_issues; i++)
downloadissue(NULL, save_path, issue[i], force);
}
else if(downissueno >= 0 && downissueno <= no_of_issues)
downloadissue(NULL, save_path, issue[downissueno], force);
}
if(listissues)
list_issues(issue, no_of_issues, verbose);
/* Ensure curl cleans itself up */
curl_easy_cleanup(main_curl_handle);
return 0;
}
int update_contents_files()
/* Returns 0 on success, 1 on failure */
{
if(save_file(NULL, issue_uri, issue_xml, "contents", 0))
return 1;
else
return 0;
}