char *port = NULL;
char *hostport = NULL;
char *name = get_my_name(false);
- char *filename = NULL;
+ char filename[PATH_MAX];
// Use first Address statement in own host config file
if(check_id(name)) {
- xasprintf(&filename, "%s" SLASH "hosts" SLASH "%s", confbase, name);
+ snprintf(filename,PATH_MAX, "%s" SLASH "hosts" SLASH "%s", confbase, name);
scan_for_hostname(filename, &hostname, &port);
scan_for_hostname(tinc_conf, &hostname, &port);
}
else
xasprintf(&hostport, "%s:%s", hostname, port);
} else {
- hostport = hostname;
- hostname = NULL;
+ if(strchr(hostname, ':'))
+ xasprintf(&hostport, "[%s]", hostname);
+ else
+ hostport = xstrdup(hostname);
}
free(hostname);
free(port);
- free(filename);
return hostport;
}
return 1;
// Ensure no host configuration file with that name exists
- char *filename = NULL;
- xasprintf(&filename, "%s" SLASH "hosts" SLASH "%s", confbase, argv[1]);
+ char filename [PATH_MAX];
+ snprintf(filename,PATH_MAX, "%s" SLASH "hosts" SLASH "%s", confbase, argv[1]);
if(!access(filename, F_OK)) {
- free(filename);
fprintf(stderr, "A host config file for %s already exists!\n", argv[1]);
return 1;
}
- free(filename);
// If a daemon is running, ensure no other nodes now about this name
bool found = false;
char hash[64];
- xasprintf(&filename, "%s" SLASH "invitations", confbase);
+ snprintf(filename,PATH_MAX, "%s" SLASH "invitations", confbase);
if(mkdir(filename, 0700) && errno != EEXIST) {
fprintf(stderr, "Could not create directory %s: %s\n", filename, strerror(errno));
- free(filename);
return 1;
}
DIR *dir = opendir(filename);
if(!dir) {
fprintf(stderr, "Could not read directory %s: %s\n", filename, strerror(errno));
- free(filename);
return 1;
}
while((ent = readdir(dir))) {
if(strlen(ent->d_name) != 24)
continue;
- char *invname;
+ char invname[PATH_MAX];
struct stat st;
- xasprintf(&invname, "%s" SLASH "%s", filename, ent->d_name);
+ snprintf(invname,PATH_MAX, "%s" SLASH "%s", filename, ent->d_name);
if(!stat(invname, &st)) {
if(deadline < st.st_mtime)
count++;
fprintf(stderr, "Could not stat %s: %s\n", invname, strerror(errno));
errno = 0;
}
- free(invname);
}
if(errno) {
fprintf(stderr, "Error while reading directory %s: %s\n", filename, strerror(errno));
closedir(dir);
- free(filename);
return 1;
}
closedir(dir);
- free(filename);
ecdsa_t *key;
- xasprintf(&filename, "%s" SLASH "invitations" SLASH "ecdsa_key.priv", confbase);
+ snprintf(filename,PATH_MAX, "%s" SLASH "invitations" SLASH "ecdsa_key.priv", confbase);
// Remove the key if there are no outstanding invitations.
if(!count)
if(!f) {
if(errno != ENOENT) {
fprintf(stderr, "Could not read %s: %s\n", filename, strerror(errno));
- free(filename);
return 1;
}
key = ecdsa_generate();
if(!key) {
- free(filename);
return 1;
}
f = fopen(filename, "w");
if(!f) {
fprintf(stderr, "Could not write %s: %s\n", filename, strerror(errno));
- free(filename);
return 1;
}
chmod(filename, 0600);
fprintf(stderr, "Could not read private key from %s\n", filename);
}
- free(filename);
if(!key)
return 1;
b64encode_urlsafe(cookie, cookie, 18);
// Create a file containing the details of the invitation.
- xasprintf(&filename, "%s" SLASH "invitations" SLASH "%s", confbase, cookiehash);
+ snprintf(filename,PATH_MAX, "%s" SLASH "invitations" SLASH "%s", confbase, cookiehash);
int ifd = open(filename, O_RDWR | O_CREAT | O_EXCL, 0600);
if(!ifd) {
fprintf(stderr, "Could not create invitation file %s: %s\n", filename, strerror(errno));
- free(filename);
return 1;
}
f = fdopen(ifd, "w");
fprintf(f, "#---------------------------------------------------------------#\n");
fprintf(f, "Name = %s\n", myname);
- char *filename2;
- xasprintf(&filename2, "%s" SLASH "hosts" SLASH "%s", confbase, myname);
+ char filename2[PATH_MAX];
+ snsprintf(filename2,PATH_MAX, "%s" SLASH "hosts" SLASH "%s", confbase, myname);
fcopy(f, filename2);
fclose(f);
- free(filename2);
// Create an URL from the local address, key hash and cookie
char *url;
fprintf(f, "Name = %s\n", name);
- char *filename;
- xasprintf(&filename, "%s" SLASH "%s", hosts_dir, name);
+ char filename[PATH_MAX];
+ snprintf(filename,PATH_MAX, "%s" SLASH "%s", hosts_dir, name);
FILE *fh = fopen(filename, "w");
if(!fh) {
fprintf(stderr, "Could not create file %s: %s\n", filename, strerror(errno));
}
fclose(f);
- free(filename);
while(l && !strcasecmp(l, "Name")) {
if(!check_id(value)) {
return false;
}
- xasprintf(&filename, "%s" SLASH "%s", hosts_dir, value);
+ snprintf(filename,PATH_MAX, "%s" SLASH "%s", hosts_dir, value);
f = fopen(filename, "w");
if(!f) {
}
fclose(f);
- free(filename);
}
// Generate our key and send a copy to the server
if(!b64key)
return false;
- xasprintf(&filename, "%s" SLASH "ecdsa_key.priv", confbase);
+ snprintf(filename,PATH_MAX, "%s" SLASH "ecdsa_key.priv", confbase);
f = fopenmask(filename, "w", 0600);
if(!ecdsa_write_pem_private_key(key, f)) {