static callback_ret_t directmap_callback(CFStringRef key, __unused CFStringRef value, void *udata) { char *str; CFIndex key_len; char dir[MAXFILENAMELEN+1]; struct loaddirect_cbdata *temp = (struct loaddirect_cbdata *)udata; char *opts = temp->opts; char *localmap = temp->localmap; char **stack = temp->stack; char ***stkptr = temp->stkptr; if (trace > 1) { str = od_CFStringtoCString(key); if (str != NULL) { trace_prt(1, " directmap_callback called: key %s\n", str); free(str); } } key_len = od_cfstrlen(key); if (key_len > (CFIndex)MAXFILENAMELEN || key_len < 2) return (OD_CB_KEEPGOING); if (!od_cfstrlcpy(dir, key, key_len)) return (OD_CB_KEEPGOING); if (isspace((unsigned char)dir[0]) || dir[0] == '#') return (OD_CB_KEEPGOING); /* ignore blank lines and comments */ dirinit(dir, localmap, opts, 1, stack, stkptr); return (OD_CB_KEEPGOING); }
spawncli(f, n) { fortran void comlv$(); ttcolor(CTEXT); ttnowindow(); ttmove(nrow-1, 0); if (epresf != FALSE) { tteeol(); epresf = FALSE; } ttclose(); comlv$(); sgarbf = TRUE; /* Force repaint. */ ttopen(); #ifndef NO_DIR (void) dirinit(); /* current directory may have changed */ #endif return (TRUE); }
/*ARGSUSED*/ spawncli(f, n) { register void (*oisig)(); int status; #ifdef EXTD_DIR ensurecwd(); #endif if (shellp == NULL) { shellp = getenv("SHELL"); if (shellp == NULL) shellp = getenv("shell"); if (shellp == NULL) shellp = "command.x"; /* Safer. */ } ttcolor(CTEXT); ttnowindow(); ttmove(nrow-1, 0); if (epresf != FALSE) { tteeol(); epresf = FALSE; } ttclose(); sgarbf = TRUE; /* Force repaint. */ oisig = signal(SIGINT, SIG_IGN); #ifdef EXTD_DIR dirend(); #endif if (spawnlp(P_WAIT, shellp, shellp, NULL) == -1) { status = FALSE; } else { status = TRUE; } (VOID) signal(SIGINT, oisig); ttopen(); if(status == FALSE) { ewprintf("Failed to run %s", shellp); sleep(2); /* Show this message for 2 sec */ /* before refresh screen. */ } dirinit(); return (status); }
int main(int argc, char **argv) { char *cp, *init_fcn_name = NULL; PF init_fcn = NULL; int o, i, nfiles; int nobackups = 0; struct buffer *bp = NULL; #ifdef MRUBY mrb_mg_init(); int noinitfile = 0; #endif /* MRUBY */ while ((o = getopt(argc, argv, "nf:q")) != -1) switch (o) { case 'n': nobackups = 1; break; case 'f': if (init_fcn_name != NULL) errx(1, "cannot specify more than one " "initial function"); init_fcn_name = optarg; break; case 'q': noinitfile = 1; break; default: usage(); } argc -= optind; argv += optind; maps_init(); /* Keymaps and modes. */ funmap_init(); /* Functions. */ /* * This is where we initialize standalone extensions that should * be loaded dynamically sometime in the future. */ { extern void grep_init(void); extern void theo_init(void); extern void cmode_init(void); extern void dired_init(void); dired_init(); grep_init(); theo_init(); cmode_init(); #ifdef UTF8 utf8_init(); #endif /* UTF8 */ } if (init_fcn_name && (init_fcn = name_function(init_fcn_name)) == NULL) errx(1, "Unknown function `%s'", init_fcn_name); vtinit(); /* Virtual terminal. */ dirinit(); /* Get current directory. */ edinit(bp); /* Buffers, windows. */ ttykeymapinit(); /* Symbols, bindings. */ /* * doing update() before reading files causes the error messages from * the file I/O show up on the screen. (and also an extra display of * the mode line if there are files specified on the command line.) */ update(); /* user startup file */ #ifdef MRUBY if (noinitfile == 0 && (cp = startupfile(NULL)) != NULL) mrb_mg_load(cp); #else if ((cp = startupfile(NULL)) != NULL) (void)load(cp); #endif /* MRUBY */ /* * Now ensure any default buffer modes from the startup file are * given to any files opened when parsing the startup file. * Note *scratch* will also be updated. */ for (bp = bheadp; bp != NULL; bp = bp->b_bufp) { bp->b_flag = defb_flag; for (i = 0; i <= defb_nmodes; i++) { bp->b_modes[i] = defb_modes[i]; } } /* Force FFOTHARG=1 so that this mode is enabled, not simply toggled */ if (init_fcn) init_fcn(FFOTHARG, 1); if (nobackups) makebkfile(FFARG, 0); for (nfiles = 0, i = 0; i < argc; i++) { if (argv[i][0] == '+' && strlen(argv[i]) >= 2) { long long lval; const char *errstr; lval = strtonum(&argv[i][1], INT_MIN, INT_MAX, &errstr); if (argv[i][1] == '\0' || errstr != NULL) goto notnum; startrow = lval; } else { notnum: cp = adjustname(argv[i], FALSE); if (cp != NULL) { if (nfiles == 1) splitwind(0, 1); if ((curbp = findbuffer(cp)) == NULL) { vttidy(); errx(1, "Can't find current buffer!"); } (void)showbuffer(curbp, curwp, 0); if (readin(cp) != TRUE) killbuffer(curbp); else { /* Ensure enabled, not just toggled */ if (init_fcn_name) init_fcn(FFOTHARG, 1); nfiles++; } } } } if (nfiles > 2) listbuffers(0, 1); /* fake last flags */ thisflag = 0; for (;;) { if (epresf == KCLEAR) eerase(); if (epresf == TRUE) epresf = KCLEAR; if (winch_flag) { do_redraw(0, 0, TRUE); winch_flag = 0; } update(); lastflag = thisflag; thisflag = 0; switch (doin()) { case TRUE: break; case ABORT: ewprintf("Quit"); /* FALLTHRU */ case FALSE: default: ttbeep(); macrodef = FALSE; } } }
static callback_ret_t mastermap_callback(CFStringRef key, CFStringRef invalue, void *udata) { char *key_str, *value_str, *value; CFIndex key_len, value_len; char *pmap, *opts; char dir[LINESZ], map[LINESZ], qbuff[LINESZ]; struct loadmaster_cbdata *temp = (struct loadmaster_cbdata *)udata; char *defopts = temp->defopts; char **stack = temp->stack; char ***stkptr = temp->stkptr; CFIndex i; if (trace > 1) { key_str = od_CFStringtoCString(key); value_str = od_CFStringtoCString(invalue); if (key_str != NULL && value_str != NULL) { trace_prt(1, " mastermap_callback called: key %s, value %s\n", key_str, value_str); } free(value_str); free(key_str); } key_len = od_cfstrlen(key); value_len = od_cfstrlen(invalue); if (key_len >= LINESZ || value_len >= LINESZ) return (OD_CB_KEEPGOING); if (key_len < 2 || value_len < 2) return (OD_CB_KEEPGOING); value_str = od_CFStringtoCString(invalue); value = value_str; i = value_len; while (i > 0 && isspace((unsigned char)*value)) { value++; i--; } if (*value == '\0') { free(value_str); return (OD_CB_KEEPGOING); } if (!od_cfstrlcpy(dir, key, key_len)) { free(value_str); return (OD_CB_KEEPGOING); } if (isspace((unsigned char)dir[0]) || dir[0] == '#') { free(value_str); return (OD_CB_KEEPGOING); } if (trace > 1) trace_prt(1, "mastermap_callback: dir= [ %s ]\n", dir); for (i = 0; i < LINESZ; i++) qbuff[i] = ' '; switch (macro_expand("", dir, qbuff, sizeof (dir))) { case MEXPAND_OK: break; case MEXPAND_LINE_TOO_LONG: pr_msg( "%s in Open Directory map: entry too long (max %zu chars)", dir, sizeof (dir) - 1); free(value_str); return (OD_CB_KEEPGOING); case MEXPAND_VARNAME_TOO_LONG: pr_msg( "%s in Open Directory map: variable name too long", dir); free(value_str); return (OD_CB_KEEPGOING); } strlcpy(map, value, sizeof (map)); /* we know this will not truncate */ free(value_str); if (trace > 1) trace_prt(1, "mastermap_callback: map= [ %s ]\n", map); switch (macro_expand("", map, qbuff, sizeof (map))) { case MEXPAND_OK: break; case MEXPAND_LINE_TOO_LONG: pr_msg( "%s in Open Directory map: entry too long (max %zu chars)", map, sizeof (map) - 1); return (OD_CB_KEEPGOING); case MEXPAND_VARNAME_TOO_LONG: pr_msg( "%s in Open Directory map: variable name too long", map); return (OD_CB_KEEPGOING); } pmap = map; while (*pmap && isspace(*pmap)) pmap++; /* skip blanks in front of map */ opts = pmap; while (*opts && !isspace(*opts)) opts++; if (*opts) { *opts++ = '\0'; while (*opts && isspace(*opts)) opts++; if (*opts == '-') opts++; else opts = defopts; } /* * Check for no embedded blanks. */ if (strcspn(opts, " \t") == strlen(opts)) { if (trace > 1) trace_prt(1, "mastermap_callback: dir=[ %s ], pmap=[ %s ]\n", dir, pmap); dirinit(dir, pmap, opts, 0, stack, stkptr); } else { /* XXX - this was "dn=" for LDAP; is that the server name? */ pr_msg( "Warning: invalid entry for %s in Open Directory ignored.\n", dir); } if (trace > 1) trace_prt(1, "mastermap_callback exiting...\n"); return (OD_CB_KEEPGOING); }
int main(int argc, char **argv) { char *cp, *init_fcn_name = NULL; PF init_fcn = NULL; int o, i, nfiles; struct buffer *bp = NULL; while ((o = getopt(argc, argv, "f:")) != -1) switch (o) { case 'f': if (init_fcn_name != NULL) errx(1, "cannot specify more than one " "initial function"); init_fcn_name = optarg; break; default: usage(); } argc -= optind; argv += optind; setlocale(LC_CTYPE, ""); maps_init(); /* Keymaps and modes. */ funmap_init(); /* Functions. */ if (init_fcn_name && (init_fcn = name_function(init_fcn_name)) == NULL) errx(1, "Unknown function `%s'", init_fcn_name); vtinit(); /* Virtual terminal. */ dirinit(); /* Get current directory. */ edinit(bp); /* Buffers, windows. */ bellinit(); /* Audible and visible bell. */ /* * doing update() before reading files causes the error messages from * the file I/O show up on the screen. (and also an extra display of * the mode line if there are files specified on the command line.) */ update(CMODE); /* Force FFOTHARG=1 so that this mode is enabled, not simply toggled */ if (init_fcn) init_fcn(FFOTHARG, 1); for (nfiles = 0, i = 0; i < argc; i++) { if (argv[i][0] == '+' && strlen(argv[i]) >= 2) { long lval; char *end; lval = strtol(&argv[i][1], &end, 0); if (argv[i][1] == '\0' || *end != '\0') goto notnum; startrow = lval; } else { notnum: cp = adjustname(argv[i], FALSE); if (cp != NULL) { if (nfiles == 1) splitwind(0, 1); if ((curbp = findbuffer(cp)) == NULL) { vttidy(); errx(1, "Can't find current buffer!"); } (void)showbuffer(curbp, curwp, 0); if (readin(cp) != TRUE) killbuffer(curbp); else { /* Ensure enabled, not just toggled */ if (init_fcn_name) init_fcn(FFOTHARG, 1); nfiles++; } } } } if (nfiles > 2) listbuffers(0, 1); /* fake last flags */ thisflag = 0; for (;;) { if (epresf == KCLEAR) eerase(); if (epresf == TRUE) epresf = KCLEAR; if (winch_flag) { do_redraw(0, 0, TRUE); winch_flag = 0; } update(CMODE); lastflag = thisflag; thisflag = 0; switch (doin()) { case TRUE: break; case ABORT: ewprintf("Quit"); /* FALLTHRU */ case FALSE: default: macrodef = FALSE; } } }
/* name: path name of file * attr: atttributes */ long ixcreat(char *name, char attr) { DND *dn; OFD *fd; FCB *f; const char *s; char n[2], a[11]; /* M01.01.03 */ int i, f2; /* M01.01.03 */ long pos, rc; n[0] = (char)ERASE_MARKER; n[1] = 0; /* first find path */ if ((long)(dn = findit(name,&s,0)) < 0) /* M01.01.1212.01 */ return (long)dn; if (!dn) /* M01.01.1214.01 */ return EPTHNF; if (!*s || (*s == '.')) /* no file name || '.' || '..' */ return EPTHNF; /* M01.01.0721.01 */ if (contains_illegal_characters(s)) return EACCDN; /* * if the volume label attribute is set, no others are allowed */ if ((attr&FA_VOL) && (attr != FA_VOL)) return EACCDN; /* * volume labels may only be created in the root */ if ((attr == FA_VOL) && dn->d_parent) return EACCDN; if (!(fd = dn->d_ofd)) fd = makofd(dn); /* makofd() also updates dn->d_ofd */ /* * if a matching file already exists, we delete it first. note * that the definition of matching, and the action taken, differs * depending on whether the file is a volume label or not: * . for a volume label, *any* existing volume label matches * and will be deleted (reference: Rainbow TOS Release Notes) * . for other files, the name must match, and the existing * file will be deleted unless (a) it's read-only or a folder * or (b) the file being created is a folder. */ pos = 0; if (attr == FA_VOL) f = scan(dn,"*.*",FA_VOL,&pos); else f = scan(dn,s,FA_NORM|FA_SUBDIR,&pos); if (f) /* found matching file / label */ { if (attr != FA_VOL) /* for normal files, need to check more stuff */ { /* M01.01.0730.01 */ if ((f->f_attrib & (FA_SUBDIR | FA_RO)) || (attr == FA_SUBDIR)) return EACCDN; /* subdir or read only */ } pos -= 32; ixdel(dn,f,pos); } else pos = 0; /* now scan for empty space */ /* M01.01.SCC.FS.02 */ while( !( f = scan(dn,n,0xff,&pos) ) ) { /* not in current dir, need to grow */ if (!fd->o_dnode) /* but can't grow root */ return EACCDN; if ( nextcl(fd,1) ) return EACCDN; f = dirinit(dn); pos = 0; } builds(s,a); pos -= 32; f->f_attrib = attr; for (i = 0; i < 10; i++) f->f_fill[i] = 0; f->f_td.time = current_time; swpw(f->f_td.time); f->f_td.date = current_date; swpw(f->f_td.date); f->f_clust = 0; f->f_fileln = 0; ixlseek(fd,pos); ixwrite(fd,11L,a); /* write name, set dirty flag */ ixclose(fd,CL_DIR); /* partial close to flush */ ixlseek(fd,pos); s = (char*) ixread(fd,32L,NULL); f2 = rc = opnfil((FCB*)s,dn,(f->f_attrib&FA_RO)?RO_MODE:RW_MODE); if (rc < 0) return rc; getofd(f2)->o_flag |= O_DIRTY; return f2; }
/* * If the system is labeled then we need to * have a uniquely-named auto_home map for each zone. * The maps are made unique by appending the zonename. * The home directory is made unique by prepending /zone/<zonename> * for each zone that is dominated by the current zone. * The current zone's home directory mount point is not changed. * * For each auto_home_<zonename> a default template map is created * only if it doesn't exist yet. The default entry is used to declare * local home directories created within each zone. For example: * * +auto_home_public * * -fstype=lofs :/zone/public/export/home/& */ static void loadzone_maps(char *mntpnt, char *map, char *opts, char **stack, char ***stkptr) { zoneid_t *zids = NULL; zoneid_t my_zoneid; uint_t nzents_saved; uint_t nzents; int i; if (!priv_ineffect(PRIV_SYS_MOUNT)) return; if (zone_list(NULL, &nzents) != 0) { return; } my_zoneid = getzoneid(); again: if (nzents == 0) return; zids = malloc(nzents * sizeof (zoneid_t)); nzents_saved = nzents; if (zone_list(zids, &nzents) != 0) { free(zids); return; } if (nzents != nzents_saved) { /* list changed, try again */ free(zids); goto again; } for (i = 0; i < nzents; i++) { char zonename[ZONENAME_MAX]; char zoneroot[MAXPATHLEN]; if (getzonenamebyid(zids[i], zonename, ZONENAME_MAX) != -1) { char appended_map[MAXPATHLEN]; char prepended_mntpnt[MAXPATHLEN]; char map_path[MAXPATHLEN]; int fd; (void) snprintf(appended_map, sizeof (appended_map), "%s_%s", map, zonename); /* for current zone, leave mntpnt alone */ if (zids[i] != my_zoneid) { (void) snprintf(prepended_mntpnt, sizeof (prepended_mntpnt), "/zone/%s%s", zonename, mntpnt); if (zone_getattr(zids[i], ZONE_ATTR_ROOT, zoneroot, sizeof (zoneroot)) == -1) continue; } else { (void) strcpy(prepended_mntpnt, mntpnt); zoneroot[0] = '\0'; } dirinit(prepended_mntpnt, appended_map, opts, 0, stack, stkptr); /* * Next create auto_home_<zone> maps for each zone */ (void) snprintf(map_path, sizeof (map_path), "/etc/%s", appended_map); /* * If the map file doesn't exist create a template */ if ((fd = open(map_path, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP| S_IROTH)) != -1) { int len; char map_rec[MAXPATHLEN]; len = snprintf(map_rec, sizeof (map_rec), "+%s\n*\t-fstype=lofs\t:%s/export/home/&\n", appended_map, zoneroot); if (len <= sizeof (map_rec)) (void) write(fd, map_rec, len); (void) close(fd); } } } free(zids); }
long xmkdir(char *s) { register OFD *f; register FCB *f2; OFD *fd,*f0; FCB *b; DND *dn; int h,cl,plen; long rc; if ((h = rc = ixcreat(s,FA_SUBDIR)) < 0) return(rc); f = getofd(h); /* build a DND in the tree */ fd = f->o_dirfil; ixlseek(fd,f->o_dirbyt); b = (FCB *) ixread(fd,32L,NULLPTR); /* is the total path length too long? */ /* M01.01.1107.01 */ plen = namlen( b->f_name ); for ( dn = f->o_dnode; dn; dn = dn->d_parent ) plen += namlen( dn->d_name ); if ( plen >= (LEN_ZPATH-3) ) { ixdel( f->o_dnode, b, f->o_dirbyt ); return ( EACCDN ); } if( (dn = makdnd(f->o_dnode,b)) == NULLPTR ) { ixdel( f->o_dnode, b, f->o_dirbyt ); /* M01.01.1103.01 */ return (ENSMEM); } if( (dn->d_ofd = f0 = makofd(dn)) == (OFD*)NULLPTR ) { ixdel( f->o_dnode, b, f->o_dirbyt ); /* M01.01.1103.01 */ f->o_dnode->d_left = NULLPTR; /* M01.01.1103.01 */ xmfreblk((char *)dn); return (ENSMEM); } /* initialize dir cluster */ if (nextcl(f0,1)) { ixdel( f->o_dnode, b, f->o_dirbyt ); /* M01.01.1103.01 */ f->o_dnode->d_left = NULLPTR; /* M01.01.1103.01 */ freednd(dn); /* M01.01.1031.02 */ return(EACCDN); } f2 = dirinit(dn); /* pointer to dirty dir block */ /* write identifier */ memcpy(f2, dots, 22); f2->f_attrib = FA_SUBDIR; f2->f_time = time; swpw( f2->f_time ) ; /* M01.01.SCC.FS.04 */ f2->f_date = date; swpw( f2->f_date ) ; /* M01.01.SCC.FS.04 */ cl = f0->o_strtcl; swpw(cl); f2->f_clust = cl; f2->f_fileln = 0; f2++; /* write parent entry .. */ memcpy(f2, dots, 22); f2->f_name[1] = '.'; /* This is .. */ f2->f_attrib = FA_SUBDIR; f2->f_time = time; swpw( f2->f_time ) ; /* M01.01.SCC.FS.06 */ f2->f_date = date; swpw( f2->f_date ) ; /* M01.01.SCC.FS.06 */ cl = f->o_dirfil->o_strtcl; if (!fd->o_dnode) /* if creating a folder in the root, the */ cl = 0; /* cluster# of the .. entry must be 0 */ swpw(cl); f2->f_clust = cl; f2->f_fileln = 0; memcpy(f, f0, sizeof(OFD)); f->o_flag |= O_DIRTY; ixclose(f,CL_DIR | CL_FULL); /* force flush and write */ xmfreblk((char*)f); sft[h-NUMSTD].f_own = 0; sft[h-NUMSTD].f_ofd = 0; return(E_OK); }