static char *openvzLocateConfDir(void);
static int openvzGetVPSUUID(int vpsid, char *uuidstr, size_t len);
-static int openvzLocateConfFile(int vpsid, char *conffile, int maxlen, const char *ext);
+static int openvzLocateConfFile(int vpsid, char **conffile, const char *ext);
static int openvzAssignUUIDs(void);
int
int
openvzWriteVPSConfigParam(int vpsid, const char *param, const char *value)
{
- char conf_file[PATH_MAX];
+ char *conf_file;
+ int ret;
- if (openvzLocateConfFile(vpsid, conf_file, PATH_MAX, "conf")<0)
+ if (openvzLocateConfFile(vpsid, &conf_file, "conf") < 0)
return -1;
- return openvzWriteConfigParam(conf_file, param, value);
+ ret = openvzWriteConfigParam(conf_file, param, value);
+ VIR_FREE(conf_file);
+ return ret;
}
static int
int
openvzReadVPSConfigParam(int vpsid ,const char * param, char *value, int maxlen)
{
- char conf_file[PATH_MAX];
+ char *conf_file;
+ int ret;
- if (openvzLocateConfFile(vpsid, conf_file, PATH_MAX, "conf")<0)
+ if (openvzLocateConfFile(vpsid, &conf_file, "conf") < 0)
return -1;
- return openvzReadConfigParam(conf_file, param, value, maxlen);
+ ret = openvzReadConfigParam(conf_file, param, value, maxlen);
+ VIR_FREE(conf_file);
+ return ret;
}
static int
char * confdir = NULL;
char * default_conf_file = NULL;
char configfile_value[PATH_MAX];
- char conf_file[PATH_MAX];
+ char *conf_file = NULL;
int ret = -1;
if (openvzReadConfigParam(VZ_CONF_FILE, "CONFIGFILE", configfile_value,
if (confdir == NULL)
goto cleanup;
- if (virAsprintf(&default_conf_file, "%s/ve-%s.conf-sample", confdir, configfile_value) < 0) {
+ if (virAsprintf(&default_conf_file, "%s/ve-%s.conf-sample", confdir,
+ configfile_value) < 0) {
virReportOOMError();
goto cleanup;
}
- if (openvzLocateConfFile(vpsid, conf_file, PATH_MAX, "conf")<0)
+ if (openvzLocateConfFile(vpsid, &conf_file, "conf") < 0)
goto cleanup;
if (openvz_copyfile(default_conf_file, conf_file)<0)
cleanup:
VIR_FREE(confdir);
VIR_FREE(default_conf_file);
+ VIR_FREE(conf_file);
return ret;
}
* 0 - OK
*/
static int
-openvzLocateConfFile(int vpsid, char *conffile, int maxlen, const char *ext)
+openvzLocateConfFile(int vpsid, char **conffile, const char *ext)
{
char * confdir;
int ret = 0;
if (confdir == NULL)
return -1;
- if (snprintf(conffile, maxlen, "%s/%d.%s",
- confdir, vpsid, ext ? ext : "conf") >= maxlen)
+ if (virAsprintf(conffile, "%s/%d.%s", confdir, vpsid,
+ ext ? ext : "conf") < 0) {
+ virReportOOMError();
ret = -1;
+ }
VIR_FREE(confdir);
return ret;
static int
openvzGetVPSUUID(int vpsid, char *uuidstr, size_t len)
{
- char conf_file[PATH_MAX];
+ char *conf_file;
char line[1024];
char *saveptr = NULL;
char *uuidbuf;
char *iden;
int fd, ret;
- int retval = 0;
+ int retval = -1;
- if (openvzLocateConfFile(vpsid, conf_file, PATH_MAX, "conf")<0)
+ if (openvzLocateConfFile(vpsid, &conf_file, "conf") < 0)
return -1;
fd = open(conf_file, O_RDONLY);
if (fd == -1)
- return -1;
+ goto cleanup;
while (1) {
ret = openvz_readline(fd, line, sizeof(line));
- if (ret == -1) {
- close(fd);
- return -1;
- }
+ if (ret == -1)
+ goto cleanup;
if (ret == 0) { /* EoF, UUID was not found */
uuidstr[0] = 0;
uuidbuf = strtok_r(NULL, "\n", &saveptr);
if (iden != NULL && uuidbuf != NULL && STREQ(iden, "#UUID:")) {
- if (virStrcpy(uuidstr, uuidbuf, len) == NULL)
- retval = -1;
+ if (virStrcpy(uuidstr, uuidbuf, len) == NULL) {
+ openvzError(VIR_ERR_INTERNAL_ERROR,
+ _("invalid uuid %s"), uuidbuf);
+ goto cleanup;
+ }
break;
}
}
- close(fd);
+ retval = 0;
+cleanup:
+ if (fd >= 0)
+ close(fd);
+ VIR_FREE(conf_file);
return retval;
}
int
openvzSetDefinedUUID(int vpsid, unsigned char *uuid)
{
- char conf_file[PATH_MAX];
+ char *conf_file;
char uuidstr[VIR_UUID_STRING_BUFLEN];
+ int ret = -1;
if (uuid == NULL)
return -1;
- if (openvzLocateConfFile(vpsid, conf_file, PATH_MAX, "conf")<0)
+ if (openvzLocateConfFile(vpsid, &conf_file, "conf") < 0)
return -1;
if (openvzGetVPSUUID(vpsid, uuidstr, sizeof(uuidstr)))
- return -1;
+ goto cleanup;
if (uuidstr[0] == 0) {
FILE *fp = fopen(conf_file, "a"); /* append */
if (fp == NULL)
- return -1;
+ goto cleanup;
virUUIDFormat(uuid, uuidstr);
and be careful always to close the stream. */
if ((fprintf(fp, "\n#UUID: %s\n", uuidstr) < 0)
+ (fclose(fp) == EOF))
- return -1;
+ goto cleanup;
}
- return 0;
+ ret = 0;
+cleanup:
+ VIR_FREE(conf_file);
+ return ret;
}
static int