4 * Copyright (c) 1998 Art Cancro
16 struct roomshare *next;
23 char nn_spoolcmd[256];
24 struct roomshare *nn_first;
28 void get_config(void);
32 struct netnode *load_node(char *nodename)
37 struct netnode *newnn;
38 struct roomshare *newrs;
40 sprintf(filename, "./network/systems/%s", nodename);
41 fp = fopen(filename, "r");
46 newnn = (struct netnode *) malloc(sizeof(struct netnode));
47 strcpy(newnn->nn_nodename, nodename);
48 newnn->nn_first = NULL;
51 buf[strlen(buf)-1] = 0;
52 strcpy(newnn->nn_spoolcmd, buf);
54 while (fgets(buf, 255, fp) != NULL) {
55 newrs = (struct roomshare *) malloc(sizeof(struct roomshare));
56 newrs->next = newnn->nn_first;
57 newnn->nn_first = newrs;
58 buf[strlen(buf)-1] = 0;
59 strcpy(newrs->rs_name, buf);
61 buf[strlen(buf)-1] = 0;
62 newrs->rs_lastsent = atol(buf);
71 void save_node(struct netnode *nnptr)
76 struct roomshare *rsptr = NULL;
78 sprintf(filename, "./network/systems/%s", nnptr->nn_nodename);
79 fp = fopen(filename, "w");
81 fprintf(stderr, "%s\n", strerror(errno));
84 fprintf(fp, "%s\n", nnptr->nn_spoolcmd);
85 while (nnptr->nn_first != NULL) {
86 fprintf(fp, "%s\n%ld\n", nnptr->nn_first->rs_name,
87 nnptr->nn_first->rs_lastsent);
88 rsptr = nnptr->nn_first->next;
89 free(nnptr->nn_first);
90 nnptr->nn_first = rsptr;
98 void display_usage(void) {
99 fprintf(stderr, "netsetup for %s\n", CITADEL);
100 fprintf(stderr, "usage: netsetup <command> [arguments]\n\n");
101 fprintf(stderr, "Commands: \n");
102 fprintf(stderr, " nodelist (Lists all neighboring nodes\n");
103 fprintf(stderr, " addnode [name] (Adds a new node to the list)\n");
104 fprintf(stderr, " deletenode [name] (Deletes a node from the list)\n");
105 fprintf(stderr, " roomlist [node] (List rooms being shared)\n");
106 fprintf(stderr, " getcommand [node] (Show spool command)\n");
107 fprintf(stderr, " setcommand [node] [cmd] (Set spool command)\n");
108 fprintf(stderr, " share [node] [room] (Add a new shared room)\n");
109 fprintf(stderr, " unshare [node] [room] (Stop sharing a room)\n");
110 fprintf(stderr, " help (Display this message)\n");
115 * Display all neighboring nodes
116 * (This is inherently nonportable)
118 void display_nodelist(void) {
122 ls = (FILE *) popen("cd ./network/systems; ls", "r");
124 fprintf(stderr, "netsetup: Cannot open nodelist: %s\n",
129 while (fgets(buf, 255, ls) != NULL) {
140 void add_node(char *NewNodeName)
143 char sysfilename[256];
145 sprintf(sysfilename, "./network/systems/%s", NewNodeName);
147 fp = fopen(sysfilename, "r");
150 fprintf(stderr, "A node named '%s' already exists.\n",
155 fp = fopen(sysfilename, "w");
157 fprintf(stderr, "%s\n", strerror(errno));
161 fprintf(fp, "cat %%s >>./network/spoolout/%s\n", NewNodeName);
168 void delete_node(char *NodeName)
171 char sysfilename[256];
172 char spooloutfilename[256];
174 sprintf(sysfilename, "./network/systems/%s", NodeName);
175 sprintf(spooloutfilename, "./network/spoolout/%s", NodeName);
177 fp = fopen(sysfilename, "r");
179 fprintf(stderr, "'%s' does not exist.\n",
185 unlink(spooloutfilename);
186 if (unlink(sysfilename)==0) {
189 fprintf(stderr, "%s\n", strerror(errno));
196 void do_roomlist(char *NodeName)
199 char sysfilename[256];
202 sprintf(sysfilename, "./network/systems/%s", NodeName);
204 fp = fopen(sysfilename, "r");
206 fprintf(stderr, "'%s' does not exist.\n",
211 fgets(buf, 255, fp); /* skip past spool cmd */
212 while (fgets(buf, 255, fp) != NULL) {
214 fgets(buf, 255, fp); /* skip past last-sent pointer */
224 void show_spool_cmd(char *NodeName)
227 char sysfilename[256];
230 sprintf(sysfilename, "./network/systems/%s", NodeName);
232 fp = fopen(sysfilename, "r");
234 fprintf(stderr, "'%s' does not exist.\n",
247 void set_spool_cmd(char *nodename, char *spoolcmd)
249 struct netnode *nnptr;
251 nnptr = load_node(nodename);
253 fprintf(stderr, "No such node '%s'.\n", nodename);
257 strncpy(nnptr->nn_spoolcmd, spoolcmd, 255);
264 void add_share(char *nodename, char *roomname)
266 struct netnode *nnptr;
267 struct roomshare *rsptr;
271 nnptr = load_node(nodename);
273 fprintf(stderr, "No such node '%s'.\n", nodename);
277 for (rsptr = nnptr->nn_first; rsptr != NULL; rsptr = rsptr->next) {
278 if (!strcasecmp(rsptr->rs_name, roomname)) {
281 if (rsptr->rs_lastsent > highest) {
282 highest = rsptr->rs_lastsent;
287 rsptr = (struct roomshare *) malloc(sizeof(struct roomshare));
288 rsptr->next = nnptr->nn_first;
289 strcpy(rsptr->rs_name, roomname);
290 rsptr->rs_lastsent = highest;
291 nnptr->nn_first = rsptr;
300 void remove_share(char *nodename, char *roomname)
302 struct netnode *nnptr;
303 struct roomshare *rsptr, *rshold;
306 nnptr = load_node(nodename);
308 fprintf(stderr, "No such node '%s'.\n", nodename);
312 if (nnptr->nn_first != NULL)
313 if (!strcasecmp(nnptr->nn_first->rs_name, roomname)) {
314 rshold = nnptr->nn_first;
315 nnptr->nn_first = nnptr->nn_first->next;
320 if (nnptr->nn_first != NULL)
321 for (rsptr = nnptr->nn_first; rsptr->next != NULL; rsptr = rsptr->next) {
322 if (!strcasecmp(rsptr->next->rs_name, roomname)) {
323 rshold = rsptr->next;
324 rsptr->next = rsptr->next->next;
327 rsptr = nnptr->nn_first;
334 fprintf(stderr, "Not sharing '%s' with %s\n",
341 int main(int argc, char **argv)
351 if (!strcmp(argv[1], "help")) {
356 if (!strcmp(argv[1], "nodelist")) {
361 if (!strcmp(argv[1], "addnode")) {
370 if (!strcmp(argv[1], "deletenode")) {
375 delete_node(argv[2]);
379 if (!strcmp(argv[1], "roomlist")) {
384 do_roomlist(argv[2]);
388 if (!strcmp(argv[1], "getcommand")) {
393 show_spool_cmd(argv[2]);
397 if (!strcmp(argv[1], "setcommand")) {
402 set_spool_cmd(argv[2], argv[3]);
406 if (!strcmp(argv[1], "share")) {
411 add_share(argv[2], argv[3]);
415 if (!strcmp(argv[1], "unshare")) {
420 remove_share(argv[2], argv[3]);