?? ddns3.c
字號:
/* * DDNS v3 Client * * Author: Alan Yates <alany@ay.com.au> * Win32 Port: Kieron Briggs <kieron@kieron.nu> * Version: $Id: ddns3.c,v 1.2 2003/03/20 05:21:59 alany Exp $ */#include <stdio.h>#ifdef WIN32#include <windows.h>#define strcasecmp(x,y) stricmp((x),(y))else#include <unistd.h>#endif#include <string.h>#include <stdlib.h>#include "ctx.h"#define ERR_USAGE -1#define ERR_ARGUMENTS -2#define ERR_CONNECTION -3#define ERR_AUTH -4#define ERR_CLOSING -5#define ERR_LOGIC -6struct client_vars { char *host; char *port; char *auth; char *user; char *pass; int debug;} CV;static voidhelp(void) { fprintf(stderr, "\n"); fprintf(stderr, "DDNS Client v3 (c) :: http://www.ddns.nu/\n"); fprintf(stderr, "(c) 1999-2002 Alan Yates <alany@ay.com.au>\n"); fprintf(stderr, "$Id: ddns3.c,v 1.2 2003/03/20 05:21:59 alany Exp $\n"); fprintf(stderr, "\n"); fprintf(stderr, "Usage: ddns3 <required args> [optional args] <action list>\n"); fprintf(stderr, "\n"); fprintf(stderr, "Required args\n"); fprintf(stderr, " --user username\n"); fprintf(stderr, " --pass password\n"); fprintf(stderr, "Optional args\n"); fprintf(stderr, " --host server-hostname specify server host\n"); fprintf(stderr, " --port server-tcp-port specify server port\n"); fprintf(stderr, " --debug activate debug mode\n"); fprintf(stderr, " --auth auth-name specify authentication type\n"); fprintf(stderr, "Authentication types:\n");#ifdef WIN32 fprintf(stderr, " plaintext, md5, ddns (default), strong\n");#else fprintf(stderr, " plaintext, crypt, md5, ddns (default), strong\n");#endif fprintf(stderr, "Actions:\n"); fprintf(stderr, " list lists IP-Handles\n"); fprintf(stderr, " set <handle> <ip> sets an IP-Handle's value\n"); fprintf(stderr, " guess <handle> <source> sets an IP-Handle's value\n"); fprintf(stderr, " guessing the IP from the <source>\n"); fprintf(stderr, " end of the connection, ends are\n"); fprintf(stderr, " named 'remote' or 'local'\n"); fprintf(stderr, "\n");}static intparse_args(int argc, char **argv, char **env) { int i; if(argc == 1) { help(); exit(ERR_USAGE); } for(i = 1; i < argc; i++) { if(!strcmp("--user", argv[i]) && i+1 < argc) { CV.user = argv[++i]; } else if(!strcmp("--pass", argv[i]) && i+1 < argc) { CV.pass = argv[++i]; } else if(!strcmp("--host", argv[i]) && i+1 < argc) { CV.host = argv[++i]; } else if(!strcmp("--port", argv[i]) && i+1 < argc) { CV.port = argv[++i]; } else if(!strcmp("--auth", argv[i]) && i+1 < argc) { CV.auth = argv[++i]; } else if(!strcmp("--debug", argv[i])) { CV.debug = -1; } else if(!strcmp("list", argv[i])) break; else if(!strcmp("set", argv[i])) break; else if(!strcmp("guess", argv[i])) break; else { fprintf(stderr, "unknown or malformed argument: %s\n", argv[i]); exit(ERR_ARGUMENTS); } } return i;}static voiddefaults(void) { CV.host = "ns.ddns.nu"; CV.port = "5000"; CV.auth = "ddns"; CV.debug = 0;}static voidcheck_args(void) { int err = 0; if(!CV.user) { fprintf(stderr, "client_error: you must specify a username\n"); err ++; } if(!CV.pass) { fprintf(stderr, "client_error: you must specify a password\n"); err ++; } if(err > 0) { fprintf(stderr, "client_exit: argument parsing; %d errors\n", err); exit(ERR_ARGUMENTS); }}static intactions(struct ddns3_ctx *c, int argc, char **argv, int start) { int i, err = 0; for(i = start; i < argc; i++) { if(!strcmp("list", argv[i])) { if(ddns3_ctx_list(c) < 0) { fprintf(stderr, "server_message: %s", c->buf); fprintf(stderr, "client_error: could not get handle list\n"); err++; } else { int j; for(j = 0; c->list[j]; j += 2) { printf("%-20s %s\n", c->list[j], c->list[j+1]); } } } else if(!strcmp("set", argv[i]) && i+2 < argc) { if(ddns3_ctx_set(c, argv[i+1], argv[i+2]) < 0) { fprintf(stderr, "server_message: %s", c->buf); fprintf(stderr, "client_error: could not set handle %s to ip %s, closing\n", argv[i+1], argv[i+2]); err++; } else printf("server_message: %s", c->buf); i += 2; } else if(!strcmp("guess", argv[i]) && i+2 < argc) { int type = -1; if(!strcasecmp("remote", argv[i+2])) type = GUESS_REMOTE; else if(!strcasecmp("local", argv[i+2])) type = GUESS_LOCAL; else { fprintf(stderr, "client_error: invalid guess type: %s\n", argv[i+2]); return ERR_ARGUMENTS; } if(ddns3_ctx_guess(c, argv[i+1], type) < 0) { fprintf(stderr, "server_message: %s", c->buf); fprintf(stderr, "client_error: could not set handle %s by guessing IP, closing\n", argv[i+1]); err++; } else printf("server_message: %s", c->buf); i += 2; } else { fprintf(stderr, "unknown or mangled action: %s\n", argv[i]); return ERR_ARGUMENTS; } } return err;}intmain(int argc, char **argv, char **env) { int start, ret; struct ddns3_ctx *c; /* arguments and ugly stuff */ memset(&CV, 0, sizeof(struct client_vars)); defaults(); start = parse_args(argc, argv, env); check_args(); /* now the long and ugly stuff */ /* connect and login to DDNS server */ if(ddns3_ctx_new(&c, CV.host, atoi(CV.port)) < 0) { fprintf(stderr, "client_error: creating ddns3_ctx, exiting\n"); exit(ERR_LOGIC); } if(ddns3_ctx_connect(c) < 0) { fprintf(stderr, "server_message: %s", c->buf); fprintf(stderr, "client_error: could not connect to %s:%d, exiting\n", CV.host, atoi(CV.port)); exit(ERR_CONNECTION); } if(ddns3_ctx_login(c, CV.auth, CV.user, CV.pass) < 0) { fprintf(stderr, "server_message: %s", c->buf); fprintf(stderr, "client_error: could not authenticate\n"); exit(ERR_AUTH); } /* do what we have to */ ret = actions(c, argc, argv, start); /* close connection nicely */ if(ddns3_ctx_logout(c) < 0) { fprintf(stderr, "server_message: %s", c->buf); fprintf(stderr, "client_error: could not logout, giving up clean goodbye, exiting\n"); exit(ERR_CLOSING); } if(ddns3_ctx_disconnect(c) < 0) { fprintf(stderr, "server_message: %s", c->buf); fprintf(stderr, "client_error: disconnect failed, giving up\n"); exit(ERR_CLOSING); } if(ddns3_ctx_del(&c) < 0) { fprintf(stderr, "client_error: could not delete ddns3_ctx, oh well\n"); exit(ERR_LOGIC); } return ret;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -