4 * Command-line utility to manipulate network configuration files
5 * Copyright (c) 1998 Art Cancro
17 struct roomshare *next;
24 char nn_spoolcmd[256];
25 struct roomshare *nn_first;
29 void get_config(void);
33 struct netnode *load_node(char *nodename)
38 struct netnode *newnn;
39 struct roomshare *newrs;
41 sprintf(filename, "./network/systems/%s", nodename);
42 fp = fopen(filename, "r");
47 newnn = (struct netnode *) malloc(sizeof(struct netnode));
48 strcpy(newnn->nn_nodename, nodename);
49 newnn->nn_first = NULL;
52 buf[strlen(buf)-1] = 0;
53 strcpy(newnn->nn_spoolcmd, buf);
55 while (fgets(buf, 255, fp) != NULL) {
56 newrs = (struct roomshare *) malloc(sizeof(struct roomshare));
57 newrs->next = newnn->nn_first;
58 newnn->nn_first = newrs;
59 buf[strlen(buf)-1] = 0;
60 strcpy(newrs->rs_name, buf);
62 buf[strlen(buf)-1] = 0;
63 newrs->rs_lastsent = atol(buf);
72 void save_node(struct netnode *nnptr)
77 struct roomshare *rsptr = NULL;
79 sprintf(filename, "./network/systems/%s", nnptr->nn_nodename);
80 fp = fopen(filename, "w");
82 fprintf(stderr, "%s\n", strerror(errno));
85 fprintf(fp, "%s\n", nnptr->nn_spoolcmd);
86 while (nnptr->nn_first != NULL) {
87 fprintf(fp, "%s\n%ld\n", nnptr->nn_first->rs_name,
88 nnptr->nn_first->rs_lastsent);
89 rsptr = nnptr->nn_first->next;
90 free(nnptr->nn_first);
91 nnptr->nn_first = rsptr;
99 void display_usage(void) {
100 fprintf(stderr, "netsetup for %s\n", CITADEL);
101 fprintf(stderr, "usage: netsetup <command> [arguments]\n\n");
102 fprintf(stderr, "Commands: \n");
103 fprintf(stderr, " nodelist (Lists all neighboring nodes\n");
104 fprintf(stderr, " addnode [name] (Adds a new node to the list)\n");
105 fprintf(stderr, " deletenode [name] (Deletes a node from the list)\n");
106 fprintf(stderr, " roomlist [node] (List rooms being shared)\n");
107 fprintf(stderr, " getcommand [node] (Show spool command)\n");
108 fprintf(stderr, " setcommand [node] [cmd] (Set spool command)\n");
109 fprintf(stderr, " share [node] [room] (Add a new shared room)\n");
110 fprintf(stderr, " unshare [node] [room] (Stop sharing a room)\n");
111 fprintf(stderr, " help (Display this message)\n");
116 * Display all neighboring nodes
117 * (This is inherently nonportable)
119 void display_nodelist(void) {
123 ls = (FILE *) popen("cd ./network/systems; ls", "r");
125 fprintf(stderr, "netsetup: Cannot open nodelist: %s\n",
130 while (fgets(buf, 255, ls) != NULL) {
141 void add_node(char *NewNodeName)
144 char sysfilename[256];
146 sprintf(sysfilename, "./network/systems/%s", NewNodeName);
148 fp = fopen(sysfilename, "r");
151 fprintf(stderr, "A node named '%s' already exists.\n",
156 fp = fopen(sysfilename, "w");
158 fprintf(stderr, "%s\n", strerror(errno));
162 fprintf(fp, "cat %%s >>./network/spoolout/%s\n", NewNodeName);
169 void delete_node(char *NodeName)
172 char sysfilename[256];
173 char spooloutfilename[256];
175 sprintf(sysfilename, "./network/systems/%s", NodeName);
176 sprintf(spooloutfilename, "./network/spoolout/%s", NodeName);
178 fp = fopen(sysfilename, "r");
180 fprintf(stderr, "'%s' does not exist.\n",
186 unlink(spooloutfilename);
187 if (unlink(sysfilename)==0) {
190 fprintf(stderr, "%s\n", strerror(errno));
197 void do_roomlist(char *NodeName)
200 char sysfilename[256];
203 sprintf(sysfilename, "./network/systems/%s", NodeName);
205 fp = fopen(sysfilename, "r");
207 fprintf(stderr, "'%s' does not exist.\n",
212 fgets(buf, 255, fp); /* skip past spool cmd */
213 while (fgets(buf, 255, fp) != NULL) {
215 fgets(buf, 255, fp); /* skip past last-sent pointer */
225 void show_spool_cmd(char *NodeName)
228 char sysfilename[256];
231 sprintf(sysfilename, "./network/systems/%s", NodeName);
233 fp = fopen(sysfilename, "r");
235 fprintf(stderr, "'%s' does not exist.\n",
248 void set_spool_cmd(char *nodename, char *spoolcmd)
250 struct netnode *nnptr;
252 nnptr = load_node(nodename);
254 fprintf(stderr, "No such node '%s'.\n", nodename);
258 strncpy(nnptr->nn_spoolcmd, spoolcmd, 255);
265 void add_share(char *nodename, char *roomname)
267 struct netnode *nnptr;
268 struct roomshare *rsptr;
272 nnptr = load_node(nodename);
274 fprintf(stderr, "No such node '%s'.\n", nodename);
278 for (rsptr = nnptr->nn_first; rsptr != NULL; rsptr = rsptr->next) {
279 if (!strcasecmp(rsptr->rs_name, roomname)) {
282 if (rsptr->rs_lastsent > highest) {
283 highest = rsptr->rs_lastsent;
288 rsptr = (struct roomshare *) malloc(sizeof(struct roomshare));
289 rsptr->next = nnptr->nn_first;
290 strcpy(rsptr->rs_name, roomname);
291 rsptr->rs_lastsent = highest;
292 nnptr->nn_first = rsptr;
301 void remove_share(char *nodename, char *roomname)
303 struct netnode *nnptr;
304 struct roomshare *rsptr, *rshold;
307 nnptr = load_node(nodename);
309 fprintf(stderr, "No such node '%s'.\n", nodename);
313 if (nnptr->nn_first != NULL)
314 if (!strcasecmp(nnptr->nn_first->rs_name, roomname)) {
315 rshold = nnptr->nn_first;
316 nnptr->nn_first = nnptr->nn_first->next;
321 if (nnptr->nn_first != NULL)
322 for (rsptr = nnptr->nn_first; rsptr->next != NULL; rsptr = rsptr->next) {
323 if (!strcasecmp(rsptr->next->rs_name, roomname)) {
324 rshold = rsptr->next;
325 rsptr->next = rsptr->next->next;
328 rsptr = nnptr->nn_first;
335 fprintf(stderr, "Not sharing '%s' with %s\n",
342 int main(int argc, char **argv)
352 if (!strcmp(argv[1], "help")) {
357 if (!strcmp(argv[1], "nodelist")) {
362 if (!strcmp(argv[1], "addnode")) {
371 if (!strcmp(argv[1], "deletenode")) {
376 delete_node(argv[2]);
380 if (!strcmp(argv[1], "roomlist")) {
385 do_roomlist(argv[2]);
389 if (!strcmp(argv[1], "getcommand")) {
394 show_spool_cmd(argv[2]);
398 if (!strcmp(argv[1], "setcommand")) {
403 set_spool_cmd(argv[2], argv[3]);
407 if (!strcmp(argv[1], "share")) {
412 add_share(argv[2], argv[3]);
416 if (!strcmp(argv[1], "unshare")) {
421 remove_share(argv[2], argv[3]);