9
#include "client_vss.h"
10
#include "autoupgrade_client.h"
12
static int receive_file(const char *autoupgrade_dir, const char *file, struct cntr *p1cntr)
21
unsigned long long rcvdbytes=0;
22
unsigned long long sentbytes=0;
24
if(!(incoming=prepend_s(autoupgrade_dir, file, strlen(file))))
32
//set_win32_backup(&bfd);
33
if(bopen(&bfd, incoming,
34
O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
38
logp("Could not open for writing %s: %s\n",
39
incoming, be.bstrerror(errno));
44
if(!(fp=open_file(incoming, "wb")))
52
ret=transfer_gzfile_in(incoming, &bfd, NULL, &rcvdbytes, &sentbytes,
53
NULL, 0, p1cntr, NULL);
56
ret=transfer_gzfile_in(incoming, NULL, fp, &rcvdbytes, &sentbytes,
57
NULL, 0, p1cntr, NULL);
61
if(!ret) logp("received: %s\n", incoming);
62
if(incoming) free(incoming);
66
int autoupgrade_client(struct config *conf, struct cntr *p1cntr)
74
char *script_path=NULL;
75
char script_name[32]="";
76
char package_name[32]="";
77
char write_str[256]="";
79
if(!conf->autoupgrade_dir)
81
logp("autoupgrade_dir not set!\n");
84
if(!conf->autoupgrade_os)
86
logp("autoupgrade_os not set!\n");
89
if(!(copy=strdup(conf->autoupgrade_dir)))
91
logp("out of memory\n");
94
// strip trailing slash
95
if(copy[strlen(copy)-1]=='/') copy[strlen(copy)-1]='\0';
96
if((cp=strchr(copy, '/'))) *cp='\0';
97
if(mkpath(&(conf->autoupgrade_dir), copy))
100
// Let the server know we are ready.
101
snprintf(write_str, sizeof(write_str),
102
"autoupgrade:%s", conf->autoupgrade_os);
103
if(async_write_str(CMD_GEN, write_str))
106
if(async_read(&cmd, &buf, &len))
111
if(!strcmp(buf, "do not autoupgrade"))
116
else if(strcmp(buf, "autoupgrade ok"))
118
logp("unexpected response to autoupgrade from server: %s\n", buf);
124
logp("unexpected response to autoupgrade from server: %c:%s\n", cmd, buf);
129
win32_enable_backup_privileges(1 /* ignore_errors */);
130
snprintf(script_name, sizeof(script_name), "script.bat");
131
snprintf(package_name, sizeof(package_name), "package.exe");
133
snprintf(script_name, sizeof(script_name), "script");
134
snprintf(package_name, sizeof(package_name), "package");
137
if(receive_file(conf->autoupgrade_dir, script_name, p1cntr))
139
logp("Problem receiving %s/%s\n",
140
conf->autoupgrade_dir, script_name);
143
if(receive_file(conf->autoupgrade_dir, package_name, p1cntr))
145
logp("Problem receiving %s/%s\n",
146
conf->autoupgrade_dir, package_name);
150
if(!(script_path=prepend_s(conf->autoupgrade_dir,
151
script_name, strlen(script_name)))) goto end;
153
chmod(script_path, 0755);
155
/* Run the script here. */
156
ret=run_script(script_path,
157
NULL, 0, NULL, NULL, NULL, NULL, NULL, p1cntr,
158
0 /* do not wait */);
159
/* To get round Windows problems to do with installing over files
160
that the current process is running from, I am forking the child,
161
then immediately exiting the parent process. */
164
logp("The server tried to upgrade your client.\n");
165
logp("You will need to try your command again.\n");
172
if(script_path) free(script_path);