- /* do special processing based on class */
- if (strcmp((char *) info.data, "user") == 0)
- {
- message(Arpa_Info, "expanded to (%s) %s", info.data, bp);
- AliasLevel++;
- sendtolist(bp, a, sendq);
- AliasLevel--;
+ /* use internal buffer if it will fit; otherwise malloc */
+ if (i < sizeof buf)
+ user = buf;
+ else
+ user = xalloc(i + 1);
+ bcopy(p, user, i);
+ user[i] = '\0';
+ break;
+
+ case UDB_REMOTE:
+ if (sendto(udbsock, a->q_user, strlen(a->q_user), 0,
+ (struct sockaddr *) &up->udb_addr,
+ up->udb_addrlen) < 0)
+ {
+ continue;
+ }
+ timeout.tv_sec = up->udb_timeout / 10;
+ timeout.tv_usec = (up->udb_timeout % 10) * 100000;
+ do
+ {
+ FD_ZERO(&fdset);
+ FD_SET(udbsock, &fdset);
+ i = select(FD_SETSIZE, &fdset, NULL, NULL, &timeout);
+ } while (i > 0 && !FD_ISSET(udbsock, &fdset));
+ if (i <= 0)
+ continue;
+ i = recvfrom(udbsock, buf, sizeof buf - 1, 0, NULL, NULL);
+ if (i < 0)
+ continue;
+ class = buf;
+ user = &buf[strlen(buf)];
+ buf[i] = '\0';
+ break;
+
+ case UDB_FORWARD:
+ class = "forward";
+ i = strlen(up->udb_fwdhost) + strlen(a->q_user) + 1;
+ if (i < sizeof buf)
+ user = buf;
+ else
+ user = xalloc(i + 1);
+ (void) sprintf(user, "%s@%s", a->q_user, up->udb_fwdhost);
+ break;
+
+ case UDB_EOLIST:
+ breakout = TRUE;
+ continue;
+
+ default:
+ /* unknown entry type */
+ continue;
+ }
+
+ if (tTd(28, 1))
+ printf("Class %s: %s\n", class, user);
+
+ /* do special processing based on class */
+ if (strcmp(class, "user") == 0 || strcmp(class, "forward") == 0)
+ {
+ message(Arpa_Info, "expanded to (%s) %s", class, user);
+ AliasLevel++;
+ sendtolist(user, a, sendq);
+ AliasLevel--;
+ breakout = TRUE;
+ }
+
+ /* free memory if we allocated it */
+ if (up->udb_type == UDB_FORWARD || up->udb_type == UDB_LOOKUP)
+ {
+ if (user != buf)
+ free(user);
+ }