void parse_proto( xfs_mount_t *mp, struct fsxattr *fsx, char **pp) { parseproto(mp, NULL, fsx, pp, NULL); }
int Compiler::parsefile(int ifdef) { int k; while(parser->next(0)) { if (!strcmp(parser->token,"fun")) { if ((!parser->next(0))||(!islabel(parser->token))) { if (parser->token) PRINTF(m)(LOG_COMPILER,"Compiler : name of function expected (found '%s')\n",parser->token); else PRINTF(m)(LOG_COMPILER,"Compiler : name of function expected (found EOF)\n"); return MTLERR_SN; } if (k=STRPUSH(m,parser->token)) return k; int* s=VALTOPNT(STACKGET(m,0)); if (k=parsefun()) { PRINTF(m)(LOG_COMPILER,"Compiler : error compiling function '%s'\n",STRSTART(s)); return k; } } else if (!strcmp(parser->token,"type")) { if ((!parser->next(0))||(!islabel(parser->token))) { if (parser->token) PRINTF(m)(LOG_COMPILER,"Compiler : name of type expected (found '%s')\n",parser->token); else PRINTF(m)(LOG_COMPILER,"Compiler : name of type expected (found EOF)\n"); return MTLERR_SN; } if (k=STRPUSH(m,parser->token)) return k; int* s=VALTOPNT(STACKGET(m,0)); if (k=parsetype()) { PRINTF(m)(LOG_COMPILER,"Compiler : error compiling type '%s'\n",STRSTART(s)); return k; } } else if (!strcmp(parser->token,"var")) { if ((!parser->next(0))||(!islabel(parser->token))) { if (parser->token) PRINTF(m)(LOG_COMPILER,"Compiler : name of reference expected (found '%s')\n",parser->token); else PRINTF(m)(LOG_COMPILER,"Compiler : name of reference expected (found EOF)\n"); return MTLERR_SN; } if (k=STRPUSH(m,parser->token)) return k; int* s=VALTOPNT(STACKGET(m,0)); if (k=parsevar()) { PRINTF(m)(LOG_COMPILER,"Compiler : error compiling var '%s'\n",STRSTART(s)); return k; } } else if (!strcmp(parser->token,"const")) { if ((!parser->next(0))||(!islabel(parser->token))) { if (parser->token) PRINTF(m)(LOG_COMPILER,"Compiler : name of reference expected (found '%s')\n",parser->token); else PRINTF(m)(LOG_COMPILER,"Compiler : name of reference expected (found EOF)"); return MTLERR_SN; } if (k=STRPUSH(m,parser->token)) return k; int *s=VALTOPNT(STACKGET(m,0)); if (k=parseconst()) { PRINTF(m)(LOG_COMPILER,"Compiler : error compiling const '%s'\n",STRSTART(s)); return k; } } else if (!strcmp(parser->token,"proto")) { if ((!parser->next(0))||(!islabel(parser->token))) { if (parser->token) PRINTF(m)(LOG_COMPILER,"Compiler : name of function expected (found '%s')\n",parser->token); else PRINTF(m)(LOG_COMPILER,"Compiler : name of function expected (found EOF)\n"); return MTLERR_SN; } if (k=STRPUSH(m,parser->token)) return k; int* s=VALTOPNT(STACKGET(m,0)); if (k=parseproto()) { PRINTF(m)(LOG_COMPILER,"Compiler : error compiling proto '%s'\n",STRSTART(s)); return k; } } else if (!strcmp(parser->token,"ifdef")) { if (k=parseifdef(0)) return k; } else if (!strcmp(parser->token,"ifndef")) { if (k=parseifdef(1)) return k; } else if ((ifdef)&&(!strcmp(parser->token,"}"))) { parser->giveback(); return 0; } else { PRINTF(m)(LOG_COMPILER,"Compiler : unknown token %s\n",parser->token); return MTLERR_SN; } } return 0; }
static void parseproto( xfs_mount_t *mp, xfs_inode_t *pip, struct fsxattr *fsxp, char **pp, char *name) { #define IF_REGULAR 0 #define IF_RESERVED 1 #define IF_BLOCK 2 #define IF_CHAR 3 #define IF_DIRECTORY 4 #define IF_SYMLINK 5 #define IF_FIFO 6 char *buf; int committed; int error; xfs_fsblock_t first; int flags; xfs_bmap_free_t flist; int fmt; int i; xfs_inode_t *ip; int len; long long llen; int majdev; int mindev; int mode; char *mstr; xfs_trans_t *tp; int val; int isroot = 0; cred_t creds; char *value; struct xfs_name xname; memset(&creds, 0, sizeof(creds)); mstr = getstr(pp); switch (mstr[0]) { case '-': fmt = IF_REGULAR; break; case 'r': fmt = IF_RESERVED; break; case 'b': fmt = IF_BLOCK; break; case 'c': fmt = IF_CHAR; break; case 'd': fmt = IF_DIRECTORY; break; case 'l': fmt = IF_SYMLINK; break; case 'p': fmt = IF_FIFO; break; default: fprintf(stderr, _("%s: bad format string %s\n"), progname, mstr); exit(1); } mode = 0; switch (mstr[1]) { case '-': break; case 'u': mode |= S_ISUID; break; default: fprintf(stderr, _("%s: bad format string %s\n"), progname, mstr); exit(1); } switch (mstr[2]) { case '-': break; case 'g': mode |= S_ISGID; break; default: fprintf(stderr, _("%s: bad format string %s\n"), progname, mstr); exit(1); } val = 0; for (i = 3; i < 6; i++) { if (mstr[i] < '0' || mstr[i] > '7') { fprintf(stderr, _("%s: bad format string %s\n"), progname, mstr); exit(1); } val = val * 8 + mstr[i] - '0'; } mode |= val; creds.cr_uid = (int)getnum(pp); creds.cr_gid = (int)getnum(pp); xname.name = (uchar_t *)name; xname.len = name ? strlen(name) : 0; tp = libxfs_trans_alloc(mp, 0); flags = XFS_ILOG_CORE; xfs_bmap_init(&flist, &first); switch (fmt) { case IF_REGULAR: buf = newregfile(pp, &len); getres(tp, XFS_B_TO_FSB(mp, len)); error = libxfs_inode_alloc(&tp, pip, mode|S_IFREG, 1, 0, &creds, fsxp, &ip); if (error) fail(_("Inode allocation failed"), error); flags |= newfile(tp, ip, &flist, &first, 0, 0, buf, len); if (buf) free(buf); libxfs_trans_ijoin(tp, pip, 0); newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist, 1); libxfs_trans_ihold(tp, pip); break; case IF_RESERVED: /* pre-allocated space only */ value = getstr(pp); llen = cvtnum(mp->m_sb.sb_blocksize, mp->m_sb.sb_sectsize, value); getres(tp, XFS_B_TO_FSB(mp, llen)); error = libxfs_inode_alloc(&tp, pip, mode|S_IFREG, 1, 0, &creds, fsxp, &ip); if (error) fail(_("Inode pre-allocation failed"), error); libxfs_trans_ijoin(tp, pip, 0); newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist, 1); libxfs_trans_ihold(tp, pip); libxfs_trans_log_inode(tp, ip, flags); error = libxfs_bmap_finish(&tp, &flist, &committed); if (error) fail(_("Pre-allocated file creation failed"), error); libxfs_trans_commit(tp, 0); rsvfile(mp, ip, llen); return; case IF_BLOCK: getres(tp, 0); majdev = (int)getnum(pp); mindev = (int)getnum(pp); error = libxfs_inode_alloc(&tp, pip, mode|S_IFBLK, 1, IRIX_MKDEV(majdev, mindev), &creds, fsxp, &ip); if (error) { fail(_("Inode allocation failed"), error); } libxfs_trans_ijoin(tp, pip, 0); newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist, 1); libxfs_trans_ihold(tp, pip); flags |= XFS_ILOG_DEV; break; case IF_CHAR: getres(tp, 0); majdev = (int)getnum(pp); mindev = (int)getnum(pp); error = libxfs_inode_alloc(&tp, pip, mode|S_IFCHR, 1, IRIX_MKDEV(majdev, mindev), &creds, fsxp, &ip); if (error) fail(_("Inode allocation failed"), error); libxfs_trans_ijoin(tp, pip, 0); newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist, 1); libxfs_trans_ihold(tp, pip); flags |= XFS_ILOG_DEV; break; case IF_FIFO: getres(tp, 0); error = libxfs_inode_alloc(&tp, pip, mode|S_IFIFO, 1, 0, &creds, fsxp, &ip); if (error) fail(_("Inode allocation failed"), error); libxfs_trans_ijoin(tp, pip, 0); newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist, 1); libxfs_trans_ihold(tp, pip); break; case IF_SYMLINK: buf = getstr(pp); len = (int)strlen(buf); getres(tp, XFS_B_TO_FSB(mp, len)); error = libxfs_inode_alloc(&tp, pip, mode|S_IFLNK, 1, 0, &creds, fsxp, &ip); if (error) fail(_("Inode allocation failed"), error); flags |= newfile(tp, ip, &flist, &first, 1, 1, buf, len); libxfs_trans_ijoin(tp, pip, 0); newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist, 1); libxfs_trans_ihold(tp, pip); break; case IF_DIRECTORY: getres(tp, 0); error = libxfs_inode_alloc(&tp, pip, mode|S_IFDIR, 1, 0, &creds, fsxp, &ip); if (error) fail(_("Inode allocation failed"), error); ip->i_d.di_nlink++; /* account for . */ if (!pip) { pip = ip; mp->m_sb.sb_rootino = ip->i_ino; libxfs_mod_sb(tp, XFS_SB_ROOTINO); mp->m_rootip = ip; isroot = 1; } else { libxfs_trans_ijoin(tp, pip, 0); newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist, 1); pip->i_d.di_nlink++; libxfs_trans_ihold(tp, pip); libxfs_trans_log_inode(tp, pip, XFS_ILOG_CORE); } newdirectory(mp, tp, ip, pip); libxfs_trans_log_inode(tp, ip, flags); error = libxfs_bmap_finish(&tp, &flist, &committed); if (error) fail(_("Directory creation failed"), error); libxfs_trans_ihold(tp, ip); libxfs_trans_commit(tp, 0); /* * RT initialization. Do this here to ensure that * the RT inodes get placed after the root inode. */ if (isroot) rtinit(mp); tp = NULL; for (;;) { name = getstr(pp); if (!name) break; if (strcmp(name, "$") == 0) break; parseproto(mp, ip, fsxp, pp, name); } libxfs_iput(ip, 0); return; } libxfs_trans_log_inode(tp, ip, flags); error = libxfs_bmap_finish(&tp, &flist, &committed); if (error) { fail(_("Error encountered creating file from prototype file"), error); } libxfs_trans_commit(tp, 0); }