4 * Copyright (c) 1998 Art Cancro
16 struct roomshare *next;
23 char nn_spoolcmd[256];
24 struct roomshare *nn_first;
32 * struncmp() - case-insensitive version of strncmp()
33 * citadel.h will #define a strucmp() based on this
35 int struncmp(lstr,rstr,len)
41 lc=tolower(lstr[pos]);
42 rc=tolower(rstr[pos]);
43 if ((lc==0)&&(rc==0)) return(0);
44 if (lc<rc) return(-1);
54 struct netnode *load_node(nodename)
59 struct netnode *newnn;
60 struct roomshare *newrs;
62 sprintf(filename, "./network/systems/%s", nodename);
63 fp = fopen(filename, "r");
68 newnn = (struct netnode *) malloc(sizeof(struct netnode));
69 strcpy(newnn->nn_nodename, nodename);
70 newnn->nn_first = NULL;
73 buf[strlen(buf)-1] = 0;
74 strcpy(newnn->nn_spoolcmd, buf);
76 while (fgets(buf, 255, fp) != NULL) {
77 newrs = (struct roomshare *) malloc(sizeof(struct roomshare));
78 newrs->next = newnn->nn_first;
79 newnn->nn_first = newrs;
80 buf[strlen(buf)-1] = 0;
81 strcpy(newrs->rs_name, buf);
83 buf[strlen(buf)-1] = 0;
84 newrs->rs_lastsent = atol(buf);
94 struct netnode *nnptr; {
98 struct roomshare *rsptr = NULL;
100 sprintf(filename, "./network/systems/%s", nnptr->nn_nodename);
101 fp = fopen(filename, "w");
103 fprintf(stderr, "%s\n", strerror(errno));
106 fprintf(fp, "%s\n", nnptr->nn_spoolcmd);
107 while (nnptr->nn_first != NULL) {
108 fprintf(fp, "%s\n%ld\n", nnptr->nn_first->rs_name,
109 nnptr->nn_first->rs_lastsent);
110 rsptr = nnptr->nn_first->next;
111 free(nnptr->nn_first);
112 nnptr->nn_first = rsptr;
120 void display_usage() {
121 fprintf(stderr, "netsetup for %s\n", CITADEL);
122 fprintf(stderr, "usage: netsetup <command> [arguments]\n\n");
123 fprintf(stderr, "Commands: \n");
124 fprintf(stderr, " nodelist (Lists all neighboring nodes\n");
125 fprintf(stderr, " addnode [name] (Adds a new node to the list)\n");
126 fprintf(stderr, " deletenode [name] (Deletes a node from the list)\n");
127 fprintf(stderr, " roomlist [node] (List rooms being shared)\n");
128 fprintf(stderr, " getcommand [node] (Show spool command)\n");
129 fprintf(stderr, " setcommand [node] [cmd] (Set spool command)\n");
130 fprintf(stderr, " share [node] [room] (Add a new shared room)\n");
131 fprintf(stderr, " unshare [node] [room] (Stop sharing a room)\n");
132 fprintf(stderr, " help (Display this message)\n");
137 * Display all neighboring nodes
138 * (This is inherently nonportable)
140 void display_nodelist() {
144 ls = (FILE *) popen("cd ./network/systems; ls", "r");
146 fprintf(stderr, "netsetup: Cannot open nodelist: %s\n",
151 while (fgets(buf, 255, ls) != NULL) {
162 void add_node(NewNodeName)
165 char sysfilename[256];
167 sprintf(sysfilename, "./network/systems/%s", NewNodeName);
169 fp = fopen(sysfilename, "r");
172 fprintf(stderr, "A node named '%s' already exists.\n",
177 fp = fopen(sysfilename, "w");
179 fprintf(stderr, "%s\n", strerror(errno));
183 fprintf(fp, "cat %%s >>./network/spoolout/%s\n", NewNodeName);
190 void delete_node(NodeName)
193 char sysfilename[256];
194 char spooloutfilename[256];
196 sprintf(sysfilename, "./network/systems/%s", NodeName);
197 sprintf(spooloutfilename, "./network/spoolout/%s", NodeName);
199 fp = fopen(sysfilename, "r");
201 fprintf(stderr, "'%s' does not exist.\n",
207 unlink(spooloutfilename);
208 if (unlink(sysfilename)==0) {
211 fprintf(stderr, "%s\n", strerror(errno));
218 void do_roomlist(NodeName)
221 char sysfilename[256];
224 sprintf(sysfilename, "./network/systems/%s", NodeName);
226 fp = fopen(sysfilename, "r");
228 fprintf(stderr, "'%s' does not exist.\n",
233 fgets(buf, 255, fp); /* skip past spool cmd */
234 while (fgets(buf, 255, fp) != NULL) {
236 fgets(buf, 255, fp); /* skip past last-sent pointer */
246 void show_spool_cmd(NodeName)
249 char sysfilename[256];
252 sprintf(sysfilename, "./network/systems/%s", NodeName);
254 fp = fopen(sysfilename, "r");
256 fprintf(stderr, "'%s' does not exist.\n",
269 void set_spool_cmd(nodename, spoolcmd)
272 struct netnode *nnptr;
274 nnptr = load_node(nodename);
276 fprintf(stderr, "No such node '%s'.\n", nodename);
280 strncpy(nnptr->nn_spoolcmd, spoolcmd, 255);
287 void add_share(nodename, roomname)
290 struct netnode *nnptr;
291 struct roomshare *rsptr;
295 nnptr = load_node(nodename);
297 fprintf(stderr, "No such node '%s'.\n", nodename);
301 for (rsptr = nnptr->nn_first; rsptr != NULL; rsptr = rsptr->next) {
302 if (!strucmp(rsptr->rs_name, roomname)) {
305 if (rsptr->rs_lastsent > highest) {
306 highest = rsptr->rs_lastsent;
311 rsptr = (struct roomshare *) malloc(sizeof(struct roomshare));
312 rsptr->next = nnptr->nn_first;
313 strcpy(rsptr->rs_name, roomname);
314 rsptr->rs_lastsent = highest;
315 nnptr->nn_first = rsptr;
324 void remove_share(nodename, roomname)
327 struct netnode *nnptr;
328 struct roomshare *rsptr, *rshold;
331 nnptr = load_node(nodename);
333 fprintf(stderr, "No such node '%s'.\n", nodename);
337 if (nnptr->nn_first != NULL)
338 if (!strucmp(nnptr->nn_first->rs_name, roomname)) {
339 rshold = nnptr->nn_first;
340 nnptr->nn_first = nnptr->nn_first->next;
345 if (nnptr->nn_first != NULL)
346 for (rsptr = nnptr->nn_first; rsptr->next != NULL; rsptr = rsptr->next) {
347 if (!strucmp(rsptr->next->rs_name, roomname)) {
348 rshold = rsptr->next;
349 rsptr->next = rsptr->next->next;
352 rsptr = nnptr->nn_first;
359 fprintf(stderr, "Not sharing '%s' with %s\n",
377 if (!strcmp(argv[1], "help")) {
382 if (!strcmp(argv[1], "nodelist")) {
387 if (!strcmp(argv[1], "addnode")) {
396 if (!strcmp(argv[1], "deletenode")) {
401 delete_node(argv[2]);
405 if (!strcmp(argv[1], "roomlist")) {
410 do_roomlist(argv[2]);
414 if (!strcmp(argv[1], "getcommand")) {
419 show_spool_cmd(argv[2]);
423 if (!strcmp(argv[1], "setcommand")) {
428 set_spool_cmd(argv[2], argv[3]);
432 if (!strcmp(argv[1], "share")) {
437 add_share(argv[2], argv[3]);
441 if (!strcmp(argv[1], "unshare")) {
446 remove_share(argv[2], argv[3]);