/** * Parse a specific file. * @return 1 on success and 0 on failure. */ char ParseFile(const char *fileName, int depth) { TokenNode *tokens; FILE *fd; char *buffer; depth += 1; if(JUNLIKELY(depth > MAX_INCLUDE_DEPTH)) { ParseError(NULL, "include depth (%d) exceeded", MAX_INCLUDE_DEPTH); return 0; } fd = fopen(fileName, "r"); if(!fd) { return 0; } buffer = ReadFile(fd); fclose(fd); tokens = Tokenize(buffer, fileName); Release(buffer); Parse(tokens, depth); ReleaseTokens(tokens); return 1; }
/** Parse a dynamic menu (called from menu code). */ Menu *ParseDynamicMenu(const char *command) { Menu *menu = NULL; TokenNode *start = ParseMenuIncludeHelper(NULL, command); if(JLIKELY(start)) { menu = ParseMenu(start); ReleaseTokens(start); } return menu; }
/** Parse a menu include. */ MenuItem *ParseMenuInclude(const TokenNode *tp, Menu *menu, MenuItem *last) { TokenNode *start = ParseMenuIncludeHelper(tp, tp->value); if(JLIKELY(start)) { last = ParseMenuItem(start->subnodeHead, menu, last); ReleaseTokens(start); } return last; }
/** Get tokens from a menu include (either dynamic or static). */ TokenNode *ParseMenuIncludeHelper(const TokenNode *tp, const char *command) { FILE *fd; char *path; char *buffer; TokenNode *start; buffer = NULL; if(!strncmp(command, "exec:", 5)) { path = Allocate(strlen(command) - 5 + 1); strcpy(path, command + 5); ExpandPath(&path); fd = popen(path, "r"); if(JLIKELY(fd)) { buffer = ReadFile(fd); pclose(fd); } else { ParseError(tp, "could not execute included program: %s", path); } } else { path = CopyString(command); ExpandPath(&path); fd = fopen(path, "r"); if(JLIKELY(fd)) { buffer = ReadFile(fd); fclose(fd); } else { ParseError(NULL, "could not open include: %s", path); } } if(JUNLIKELY(!buffer)) { Release(path); return NULL; } start = Tokenize(buffer, path); Release(buffer); Release(path); if(JUNLIKELY(!start || start->type != TOK_JWM)) { ParseError(tp, "invalid include: %s", command); ReleaseTokens(start); return NULL; } return start; }
/** Create an empty XML tag node. */ TokenNode *CreateNode(TokenNode *current, const char *file, unsigned int line) { TokenNode *np; np = Allocate(sizeof(TokenNode)); np->type = TOK_INVALID; np->value = NULL; np->attributes = NULL; np->subnodeHead = NULL; np->subnodeTail = NULL; np->parent = current; np->next = NULL; np->fileName = Allocate(strlen(file) + 1); strcpy(np->fileName, file); np->line = line; np->invalidName = NULL; if(current) { /* A node contained inside another node. */ if(current->subnodeHead) { current->subnodeTail->next = np; } else { current->subnodeHead = np; } current->subnodeTail = np; } else if(!head) { /* The top-level node. */ head = np; } else { /* A duplicate top-level node. * This is probably a configuration error. */ ReleaseTokens(np); np = head->subnodeTail ? head->subnodeTail : head; } return np; }
/** Release a token list. */ void ReleaseTokens(TokenNode *np) { AttributeNode *ap; TokenNode *tp; while(np) { tp = np->next; while(np->attributes) { ap = np->attributes->next; if(np->attributes->name) { Release(np->attributes->name); } if(np->attributes->value) { Release(np->attributes->value); } Release(np->attributes); np->attributes = ap; } if(np->subnodeHead) { ReleaseTokens(np->subnodeHead); } if(np->value) { Release(np->value); } if(np->invalidName) { Release(np->invalidName); } if(np->fileName) { Release(np->fileName); } Release(np); np = tp; } }
int main(int argc, char **argv) { char **av = argv; struct sockaddr_in host; afs_int32 code; struct hostent *hp; char hnamebuf[200]; struct timeval tv; int noAuth = 1; /* Default is authenticated connections */ argc--, av++; if (argc < 1) { printf("usage: pxclient <serverHost>\n"); exit(1); } memset(&host, 0, sizeof(struct sockaddr_in)); host.sin_family = AF_INET; host.sin_addr.s_addr = inet_addr(av[0]); #ifdef STRUCT_SOCKADDR_HAS_SA_LEN host.sin_len = sizeof(struct sockaddr_in); #endif if (host.sin_addr.s_addr != -1) { strcpy(hnamebuf, av[0]); } else { hp = gethostbyname(av[0]); if (hp) { host.sin_family = hp->h_addrtype; memcpy((caddr_t) & host.sin_addr, hp->h_addr, hp->h_length); } else { printf("unknown server host %s\n", av[0]); exit(1); } } if ((code = pxclient_Initialize(noAuth, host.sin_addr.s_addr)) != 0) { printf("Couldn't initialize fs library (code=%d).\n", code); exit(1); } code = ubik_Call(RXAFS_GetTime, cstruct, 0, &tv.tv_sec, &tv.tv_usec); if (!code) printf("AFS_GetTime on %s sec=%ld, usec=%ld\n", av[0], tv.tv_sec, (long int)tv.tv_usec); else printf("return code is %d\n", code); #ifdef notdef while (1) { char line[500]; int nargs; printf("fs> "); if (fgets(line, 499, stdin) != NULL) { char *oper; char **argp = args; GetArgs(line, argp, &nargs); oper = &argp[0][0]; ++argp, --nargs; if (!strcmp(oper, "probe")) { code = ubik_Call(RXAFS_GetTime, cstruct, 0, &tv.tv_sec, &tv.tv_usec); printf("return code is %d\n", code); if (!code) printf("sec=%d\n", tv.tv_sec); } else if (!strcmp(oper, "fsstats")) { struct afsStatistics stats; code = ubik_AFS_GetStatistics(cstruct, 0, &stats); printf("return code is %d\n", code); } else if (!strcmp(oper, "fd")) { code = FetchData(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "fs")) { code = FetchStatus(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "fa")) { code = FetchACL(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "sd")) { code = StoreData(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "ss")) { code = StoreStatus(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "sa")) { code = StoreACL(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "cf")) { code = CreateFile(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "rf")) { code = RemoveFile(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "rn")) { code = Rename(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "sl")) { code = Symlink(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "hl")) { code = HardLink(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "md")) { code = MakeDir(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "rd")) { code = RemoveDir(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "rdd")) { code = Readdir(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "mm")) { code = MakeMountPoint(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "rt")) { code = ReleaseTokens(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "bs")) { code = BulkStatus(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "lk")) { code = Lookup(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "gt")) { code = GetToken(argp); printf("return code is %d\n", code); } else if (!strcmp(oper, "ka")) { code = KeepAlive(argp); printf("return code is %d\n", code); } else if ((!strcmp(oper, "q")) || !strcmp(oper, "quit")) exit(0); else { printf("Unknown oper! Available operations: \n\n"); printf("fd <vnode> <unique> <pos> <len>\n"); printf("fs <vnode> <unique>\n"); printf("fa <vnode> <unique>\n"); printf ("sd <vnode> <unique> <pos> <len> <flen> [<mode>|-1] [<owner>|-1] [<length>|-1] <string>\n"); printf ("ss <vnode> <unique> [<mode>|-1] [<owner>|-1] [<length>|-1]\n"); printf("sa <vnode> <unique> <string>\n"); printf("rf <vnode> <unique> <name>\n"); printf ("cf <vnode> <unique> <name> [<mode>|-1] [<owner>|-1] [<length>|-1]\n"); printf ("rn <ovnode> <ounique> <oname> <nvnode> <nunique> <nname>\n"); printf ("sl <vnode> <unique> <name> <contents> [<mode>|-1] [<owner>|-1] [<length>|-1]\n"); printf("hl <dvnode> <dunique> <name> <evnode> <eunique>\n"); printf ("md <vnode> <unique> <name> [<mode>|-1] [<owner>|-1] [<length>|-1]\n"); printf("rd <vnode> <unique> <name>\n"); printf("rdd <vnode> <unique> <pos> <len>\n"); printf("lk <vnode> <unique> <name>\n"); printf("gt <vnode> <unique> <tokenID>\n"); printf("ka <vol.l> <vnode> <unique> <isExec> <kaTime>\n"); } } } #endif return 0; }
/** Parse a menu include. */ MenuItem *ParseMenuInclude(const TokenNode *tp, Menu *menu, MenuItem *last) { FILE *fd; char *path; char *buffer = NULL; TokenNode *start; Assert(tp); if(!strncmp(tp->value, "exec:", 5)) { path = Allocate(strlen(tp->value) - 5 + 1); strcpy(path, tp->value + 5); ExpandPath(&path); fd = popen(path, "r"); if(JLIKELY(fd)) { buffer = ReadFile(fd); pclose(fd); } else { ParseError(tp, "could not execute included program: %s", path); } } else { path = CopyString(tp->value); ExpandPath(&path); fd = fopen(path, "r"); if(JLIKELY(fd)) { buffer = ReadFile(fd); fclose(fd); } else { ParseError(tp, "could not open include: %s", path); } } if(!buffer) { Release(path); return last; } start = Tokenize(buffer, path); Release(buffer); Release(path); if(JUNLIKELY(!start || start->type != TOK_JWM)) { ParseError(tp, "invalid included menu: %s", tp->value); } else { last = ParseMenuItem(start->subnodeHead, menu, last); } if(start) { ReleaseTokens(start); } return last; }