/*
Copyright 2008 Nathan Phillip Brink, Ethan Zonca, Matt Orlando
This file is a part of DistRen.
DistRen is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DistRen 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with DistRen. If not, see .
*/
/* Ideas for php-side stuff:
*
* PHP adds the users... has captcha and email confirmation wth a pseudo-random number that
* the user must enter on the site. Apache should be running mod_peruser for safety, and I'm
* thinking zserver2 for web serving for convenience...
*/
#include
#include /* sprintf, printf */
#include /* malloc, free */
#include /* getopt */
#include
#include // for strcat
int main(int argc, char *argv[])
{
char *input;
char *output;
char *jobid;
char curopt;
distren_t distren;
distren_job_t distren_job;
input = NULL;
output = NULL;
while(-1 != (curopt = getopt(argc, argv, "i:o:h")))
{
if(curopt == ':')
{
fprintf(stderr, "-%c: is missing an argument\n", optopt);
return 1;
}
else if(curopt == '?')
{
fprintf(stderr, "-%c: invalid option specified\n", optopt);
return 1;
}
else if(curopt == 'h')
{
fprintf(stderr, "Usage: %s -i -o \n", argv[0]);
fprintf(stderr, "\t-i\tSpecifies the input file\n\
\t-o\tSpecifies the output file\n\
\t-h\tShows this help message\n");
/*
don't return here because options_init will have an overall
options help page
*/
}
else if(curopt == 'i')
/*
TODO: is strdup good or bad? what about
the idea that all libs should allow plugging different
malloc/free implementations in?
*/
input = strdup(optarg);
else if(curopt == 'o')
output = strdup(optarg);
}
/*
give this error after the general arguments parsing so that
the general help from options_init can have effect
*/
if(!input
|| !output)
{
fprintf(stderr, "Input and output files must be specified\n");
return 1;
}
fprintf(stderr, "reading from %s\nwriting to %s\n", input, output);
if(distren_init_mf(&distren, &malloc, &free))
{
fprintf(stderr, "error initializing distren handle\n");
return 1;
}
if(distren_submit_file(distren, &distren_job, input))
{
fprintf(stderr, "error submitting file\n");
return 1;
}
if(distren_job_getid(distren_job, &jobid))
{
fprintf(stderr, "error retrieving job id\n");
return 1;
}
fprintf(stdout, "jobid: %s\n", jobid);
if(distren_job_retrieve_file(distren_job, output))
{
fprintf(stderr, "error retrieving output file\n");
return 1;
}
/* if these following lines fail, it'll be reported as a core dump ;-) */
distren_job_free(distren_job);
distren_free(distren);
// !!! Killed for now because I'm doing other randomness !!! //
// Please find a better way of doing this :( you can't strcat multiple strings.. meh
// use something like sprintf
//char *username = cfg_getstr(cfg, "username");
//char *hostname = cfg_getstr(cfg, "hostname");
//strcat(username, "@");
//strcat(username, hostname);
// SSH's to client machine with the username speficied.
/*
char buf[10];
struct execio *testrem;
char *execargv[] =
{
"ssh",
"username", //cfg_getstr(cfg, "username") . "@" . cfg_getstr(cfg, "hostname"),
"-i guest.rsa", //yeaaaah any better ideas?
"sh",
"-c",
"\"echo hello from ${HOSTNAME}\"", // "\"useradd -M -c" strcat( cfg_getstr(cfg, "name") cfg_getstr(cfg, "email")) "-d /home/distren --gid 537" cfg_getstr(cfg, "username") "\"",
(char *)NULL
};
size_t readlen;
fprintf(stderr, "execio madness is occuring!");
fprintf(stderr, "execio_open returns %d\n", execio_open(&testrem, "ssh", execargv));
buf[9] = '\0';
*/
/*
while(!execio_read(testrem, buf, 9, &readlen))
{
if(readlen > 9 )
{
fprintf(stderr, "execio_read doesn't set readlen correctly or read() is messed up\n");
return 1;
}
buf[readlen] = '\0';
fprintf(stderr, "read \"%s\"\n", buf);
}
execio_close(testrem);
*/
// Can we prune off some of this code up here^? I'm not exactly sure how execio returns output, but it seems like more could be happening in execio itself, and less happening where it is actually called.
// We need some code to ssh, and if the SSH fails, tell the user to register.
// Killed the user reg code, as the php interface will take care of this. Although it should check for users...
// ------------------------------
// Ok, this is just to do something to keep distren aliveish... Kill if needed/wanted/meh'd. Borrowed some code from matt's blender.c
// Vars to fill:
int os=1;
unsigned int frame_to_render; // initialize this somewhere else...
frame_to_render = 10; // temporary, the number 10 will be replaced with a function call
char *filename;
if(os == 1){char *bin[44] = "blender.exe";}
else{char *bin[28] = "blender";} // mac/*nix
// Placeholders? figure out what the last one is...
char *format = "%s -b \"%s\" -o %s -f %d -F JPEG -x 1",bin,input,output; /* the format string to pass to sprintf */
size_t blenderstrlen;
// This seems pretty ridik. Just sayin'. We gotta switch this up.
blenderstrlen = strlen(format) - 2 * 2 /* format string minus placeholders */ + strlen(filename) + intstrlen(frame_to_render) + 1 /* NULL terminator */;
char *blendercmd = malloc(blenderstrlen);
snprintf(blendercmd, blenderstrlen, format, filename, frame_to_render);
fprintf(stderr, "will run job num. %s ``%s''\n",jobid,blendercmd);
free(blendercmd);
// -------------End cruddy code that will eventually compose blender.c-----------------
return 0;
};