The file is basically a concatenation of several host config blocks. Each host
config block starts with @code{Name = ...}. Lines that look like @code{#---#}
are not important, it just makes it easier for humans to read the file.
+However, the first line of an invitation file @emph{must} always start with
+@code{Name = ...}.
The first host config block is always the one representing the invitee. So the
first Name statement determines the name that the invitee will get. From the
l[len] = 0;
+ // Ignore lines with empty variable names
+ if(!*l) {
+ continue;
+ }
+
// Is it a Name?
- if(!strcasecmp(l, "Name"))
+ if(!strcasecmp(l, "Name")) {
if(strcmp(value, name)) {
break;
} else {
continue;
- } else if(!strcasecmp(l, "NetName")) {
+ }
+ } else if(!strcasecmp(l, "NetName")) {
continue;
}
if(getaddrinfo(host, port, &hints, &res) || !res) {
if(verbose) {
- fprintf(stderr, "Cannot resolve %s port %s: %s", host, port, sockstrerror(sockerrno));
+ fprintf(stderr, "Cannot resolve %s port %s: %s\n", host, port, sockstrerror(sockerrno));
}
return false;
if(ioctlsocket(fd, FIONBIO, &arg) != 0) {
if(verbose) {
- fprintf(stderr, "ioctlsocket failed: %s", sockstrerror(sockerrno));
+ fprintf(stderr, "System call `%s' failed: %s\n", "ioctlsocket", sockstrerror(sockerrno));
}
}
buf[0] = 0;
if(!fgets(buf, sizeof(buf), f)) {
- fprintf(stderr, "Invalid invitation file %s", fname);
+ fprintf(stderr, "Invalid invitation file %s\n", fname);
fclose(f);
continue;
}
}
if(strncmp(buf, "Name = ", 7) || !check_id(buf + 7)) {
- fprintf(stderr, "Invalid invitation file %s", fname);
+ fprintf(stderr, "Invalid invitation file %s\n", fname);
continue;
}