4 * $DragonFly: src/sbin/rconfig/client.c,v 1.1 2004/06/18 02:46:46 dillon Exp $
9 #define LONG_ALIGN(n) (((n) + (sizeof(long) - 1)) & ~(sizeof(long) - 1))
11 static void load_client_broadcast_tags(tag_t tag, const char *tagName);
20 * The server list is in the form host[:tag]
22 for (tag = AddrBase; tag && !done; tag = tag->next) {
23 struct sockaddr_in sain;
24 struct sockaddr_in rsin;
35 bzero(&sain, sizeof(sain));
36 if (tag->name == NULL) {
37 load_client_broadcast_tags(tag, "auto");
40 if (tag->name[0] == ':') {
41 load_client_broadcast_tags(tag, tag->name + 1);
44 host = strdup(tag->name);
45 if ((tagName = strchr(host, ':')) != NULL)
49 tagName = strdup(tagName);
50 if (inet_aton(host, &sain.sin_addr) == 0) {
52 if ((hp = gethostbyname2(host, AF_INET)) == NULL) {
53 fprintf(stderr, "Unable to resolve %s\n", host);
56 bcopy(hp->h_addr_list[0], &sain.sin_addr, hp->h_length);
58 host = strdup(hp->h_name);
61 sain.sin_port = htons(257);
62 sain.sin_len = sizeof(sain);
63 sain.sin_family = AF_INET;
66 * Do a couple of UDP transactions to locate the tag on the server.
68 printf("%s:%s - ", host, tagName);
70 rc = udp_transact(&sain, &rsin, &ufd, &res, &len, "TAG %s\r\n", tagName);
71 if (rc != 101 || res == NULL) {
72 printf("NO LUCK %s\n", (res ? res : ""));
76 rc = tcp_transact(&rsin, &fi, &fo, &buf, &len, "TAG %s\r\n", tagName);
77 if (rc == 201 && buf) {
81 asprintf(&path, "%s/%s.sh", WorkDir, tagName);
82 ffd = open(path, O_CREAT|O_TRUNC|O_RDWR, 0755);
83 if (ffd >= 0 && write(ffd, buf, len) == len) {
84 printf("running %s [%d] in", path, len);
87 for (rc = 5; rc > 0; --rc) {
96 printf("rconfig script exit code %d\n", rc);
104 printf(" unable to create %s [%d] - DOWNLOAD FAILED\n",
108 printf(" DOWNLOAD FAILED\n");
134 load_client_broadcast_tags(tag_t tag, const char *tagName)
136 struct sockaddr_dl *sdl;
137 struct if_msghdr *ifm;
147 mib[4] = NET_RT_IFLIST;
150 if (sysctl(mib, 6, NULL, &bytes, NULL, 0) < 0) {
151 printf("no interfaces!\n");
155 if (sysctl(mib, 6, buf, &bytes, NULL, 0) < 0) {
156 printf("no interfaces!\n");
161 while ((char *)ifm < buf + bytes && ifm->ifm_msglen) {
162 switch(ifm->ifm_type) {
164 if (ifm->ifm_flags & IFF_UP) {
165 sdl = (void *)(ifm + 1);
172 struct sockaddr_in *sain;
173 struct ifa_msghdr *ifam;
179 scan = (char *)(ifam + 1);
180 for (i = 0; i < RTAX_MAX; ++i) {
181 if ((1 << i) & ifam->ifam_addrs) {
184 asprintf(&name, "%s:%s",
185 inet_ntoa(sain->sin_addr), tagName);
186 ntag = calloc(sizeof(struct tag), 1);
189 ntag->next = tag->next;
193 printf("add: %s (%s)\n", sdl->sdl_data, tag->name);
195 scan = scan + LONG_ALIGN(sain->sin_len);
201 ifm = (void *)((char *)ifm + ifm->ifm_msglen);