+ if ((authmask & HTTPD_AUTH_MAGIC) &&
+ (check_owning_uid(fd, 1) == getuid())) {
+ authtype = HTTPD_AUTH_MAGIC;
+ if (authmask != HTTPD_AUTH_MAGIC)
+ printf("Using Linux /proc/net magic authentication\n");
+ } else if ((authmask & HTTPD_AUTH_BASIC)) {
+ char username[128], password[128], userpassbuf[259];
+ const char *userpass;
+ const char *rname;
+ unsigned char passbuf[10];
+ int i, j, k, fd;
+
+ authtype = HTTPD_AUTH_BASIC;
+
+ if (authmask != HTTPD_AUTH_BASIC)
+ printf("Using HTTP Basic authentication\n");
+
+ if (dcfg->basicauthdata) {
+ userpass = dcfg->basicauthdata;
+ } else {
+ strcpy(username, PNAME);
+ rname = "/dev/urandom";
+ fd = open(rname, O_RDONLY);
+ if (fd < 0) {
+ int err = errno;
+ rname = "/dev/random";
+ fd = open(rname, O_RDONLY);
+ if (fd < 0) {
+ int err2 = errno;
+ fprintf(stderr, "/dev/urandom: open: %s\n", strerror(err));
+ fprintf(stderr, "/dev/random: open: %s\n", strerror(err2));
+ exit(1);
+ }
+ }
+ for (i = 0; i < 10 ;) {
+ j = read(fd, passbuf + i, 10 - i);
+ if (j <= 0) {
+ fprintf(stderr, "%s: read: %s\n", rname,
+ j < 0 ? strerror(errno) : "unexpected EOF");
+ exit(1);
+ }
+ i += j;
+ }
+ close(fd);
+ for (i = 0; i < 16; i++) {
+ /*
+ * 32 characters out of the 36 alphanumerics gives
+ * me the latitude to discard i,l,o for being too
+ * numeric-looking, and w because it has two too
+ * many syllables and one too many presidential
+ * associations.
+ */
+ static const char chars[32] =
+ "0123456789abcdefghjkmnpqrstuvxyz";
+ int v = 0;
+
+ k = i / 8 * 5;
+ for (j = 0; j < 5; j++)
+ v |= ((passbuf[k+j] >> (i%8)) & 1) << j;
+
+ password[i] = chars[v];
+ }
+ password[i] = '\0';
+
+ sprintf(userpassbuf, "%s:%s", username, password);
+ userpass = userpassbuf;
+
+ printf("Username: %s\nPassword: %s\n", username, password);
+ }
+
+ k = strlen(userpass);
+ authstring = snewn(k * 4 / 3 + 16, char);
+ for (i = j = 0; i < k ;) {
+ int s = k-i < 3 ? k-i : 3;
+ base64_encode_atom((unsigned char *)(userpass+i), s, authstring+j);
+ i += s;
+ j += 4;
+ }
+ authstring[j] = '\0';
+ } else if ((authmask & HTTPD_AUTH_NONE)) {
+ authtype = HTTPD_AUTH_NONE;
+ if (authmask != HTTPD_AUTH_NONE)
+ printf("Web server is unauthenticated\n");
+ } else {
+ fprintf(stderr, PNAME ": authentication method not supported\n");
+ exit(1);
+ }
+ if (ntohs(addr.sin_addr.s_addr) == INADDR_ANY) {
+ printf("Server port: %d\n", ntohs(addr.sin_port));
+ } else if (ntohs(addr.sin_port) == 80) {
+ printf("URL: http://%s/\n", inet_ntoa(addr.sin_addr));
+ } else {
+ printf("URL: http://%s:%d/\n",
+ inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
+ }