void setptype(Lextok *n, int t, Lextok *vis) /* predefined types */ { int oln = lineno, cnt = 1; extern int Expand_Ok; while (n) { if (n->sym->type && !(n->sym->hidden&32)) { lineno = n->ln; Fname = n->fn; non_fatal("redeclaration of '%s'", n->sym->name); lineno = oln; } n->sym->type = (short) t; if (Expand_Ok) { n->sym->hidden |= (4|8|16); /* formal par */ if (t == CHAN) setaccess(n->sym, ZS, cnt, 'F'); } if (t == UNSIGNED) { if (n->sym->nbits < 0 || n->sym->nbits >= 32) fatal("(%s) has invalid width-field", n->sym->name); if (n->sym->nbits == 0) { n->sym->nbits = 16; non_fatal("unsigned without width-field", 0); } } else if (n->sym->nbits > 0) { non_fatal("(%s) only an unsigned can have width-field", n->sym->name); } if (vis) { if (strncmp(vis->sym->name, ":hide:", 6) == 0) { n->sym->hidden |= 1; if (t == BIT) fatal("bit variable (%s) cannot be hidden", n->sym->name); } else if (strncmp(vis->sym->name, ":show:", 6) == 0) { n->sym->hidden |= 2; } else if (strncmp(vis->sym->name, ":local:", 7) == 0) { n->sym->hidden |= 64; } } if (t == CHAN) n->sym->Nid = ++Nid; else { n->sym->Nid = 0; if (n->sym->ini && n->sym->ini->ntyp == CHAN) { Fname = n->fn; lineno = n->ln; fatal("chan initializer for non-channel %s", n->sym->name); } } if (n->sym->nel <= 0) { lineno = n->ln; Fname = n->fn; non_fatal("bad array size for '%s'", n->sym->name); lineno = oln; } n = n->rgt; cnt++; } }
char * jump_etc(char *op) { char *p = op; /* try to get the type separated from the name */ p = skip_white(p); /* initial white space */ if (strncmp(p, "enum", strlen("enum")) == 0) /* special case: a two-part typename */ { p += strlen("enum")+1; p = skip_white(p); } p = skip_nonwhite(p); /* type name */ p = skip_white(p); /* white space */ while (*p == '*') p++; /* decorations */ p = skip_white(p); /* white space */ if (*p == '\0') fatal("c_state format (%s)", op); if (strchr(p, '[') && !strchr(p, '{')) { non_fatal("array initialization error, c_state (%s)", p); return (char *) 0; } return p; }
void no_side_effects(char *s) { IType *tmp; char *t; /* could still defeat this check via hidden * side effects in function calls, * but this will catch at least some cases */ tmp = find_inline(s); t = (char *) tmp->cn; if (strchr(t, ';') || strstr(t, "++") || strstr(t, "--")) { bad: lineno = tmp->dln; Fname = tmp->dfn; non_fatal("c_expr %s has side-effects", s); return; } while ((t = strchr(t, '=')) != NULL) { if (*(t-1) == '!' || *(t-1) == '>' || *(t-1) == '<') { t++; continue; } t++; if (*t != '=') goto bad; t++; } }
void set_times (const char *destination, const struct stat *statbuf) { int result; { #ifdef HAVE_GOOD_UTIME_H struct utimbuf tb; tb.actime = statbuf->st_atime; tb.modtime = statbuf->st_mtime; // result = utime (destination, &tb); #else /* ! HAVE_GOOD_UTIME_H */ #ifndef HAVE_UTIMES long tb[2]; tb[0] = statbuf->st_atime; tb[1] = statbuf->st_mtime; result = utime (destination, tb); #else /* HAVE_UTIMES */ struct timeval tv[2]; tv[0].tv_sec = statbuf->st_atime; tv[0].tv_usec = 0; tv[1].tv_sec = statbuf->st_mtime; tv[1].tv_usec = 0; result = utimes (destination, tv); #endif /* HAVE_UTIMES */ #endif /* ! HAVE_GOOD_UTIME_H */ } if (result != 0) non_fatal (_("%s: cannot set time: %s"), destination, strerror (errno)); }
void setxus(Lextok *p, int t) { Lextok *m, *n; has_xu = 1; if (!context) { lineno = p->ln; Fname = p->fn; fatal("non-local x[rs] assertion", (char *)0); } for (m = p; m; m = m->rgt) { Lextok *Xu_new = (Lextok *) emalloc(sizeof(Lextok)); Xu_new->val = t; Xu_new->lft = m->lft; Xu_new->sym = context; Xu_new->rgt = Xu_List; Xu_List = Xu_new; n = m->lft; if (n->sym->type == STRUCT) setallxu(n->sym->Slst, t); else if (n->sym->type == CHAN) setonexu(n->sym, t); else { int oln = lineno; lineno = n->ln; Fname = n->fn; non_fatal("xr or xs of non-chan '%s'", n->sym->name); lineno = oln; } } }
static void def_inline(Symbol *s, int ln, char *ptr, char *prc, Lextok *nms) { IType *tmp; int cnt = 0; char *nw = (char *) emalloc(strlen(ptr)+1); strcpy(nw, ptr); for (tmp = seqnames; tmp; cnt++, tmp = tmp->nxt) if (!strcmp(s->name, tmp->nm->name)) { non_fatal("procedure name %s redefined", tmp->nm->name); tmp->cn = (Lextok *) nw; tmp->params = nms; tmp->dln = ln; tmp->dfn = Fname; return; } tmp = (IType *) emalloc(sizeof(IType)); tmp->nm = s; tmp->cn = (Lextok *) nw; tmp->params = nms; if (strlen(prc) > 0) { tmp->prec = (char *) emalloc(strlen(prc)+1); strcpy(tmp->prec, prc); } tmp->dln = ln; tmp->dfn = Fname; tmp->uiid = cnt+1; /* so that 0 means: not an inline */ tmp->nxt = seqnames; seqnames = tmp; }
void setmtype(Lextok *m) { Lextok *n; int cnt, oln = lineno; if (m) { lineno = m->ln; Fname = m->fn; } if (!Mtype) Mtype = m; else { for (n = Mtype; n->rgt; n = n->rgt) ; n->rgt = m; /* concatenate */ } for (n = Mtype, cnt = 1; n; n = n->rgt, cnt++) /* syntax check */ { if (!n->lft || !n->lft->sym || n->lft->ntyp != NAME || n->lft->lft) /* indexed variable */ fatal("bad mtype definition", (char *)0); /* label the name */ if (n->lft->sym->type != MTYPE) { n->lft->sym->hidden |= 128; /* is used */ n->lft->sym->type = MTYPE; n->lft->sym->ini = nn(ZN,CONST,ZN,ZN); n->lft->sym->ini->val = cnt; } else if (n->lft->sym->ini->val != cnt) non_fatal("name %s appears twice in mtype declaration", n->lft->sym->name); } lineno = oln; if (cnt > 256) fatal("too many mtype elements (>255)", (char *)0); }
void typ_ck(int ft, int at, char *s) { if ((verbose&32) && ft != at && (ft == CHAN || at == CHAN)) { char buf[128], tag1[64], tag2[64]; (void) sputtype(tag1, ft); (void) sputtype(tag2, at); sprintf(buf, "type-clash in %s, (%s<-> %s)", s, tag1, tag2); non_fatal("%s", buf); } }
int execute_command (SOCKET s, pAccount a, pMessage m) { int err; const char *contact = m->contact; if (strcmp (contact, a->n_name) == 0) { contact = m->n_name; } if (strncmp (m->command, "$restart", 8) == 0) { err = cleanup (s, a, m); if (err == -1) { non_fatal ("Cleanup"); } my_send (s, "PRIVMSG %s :Restarting...\r\n", contact); my_send (s, "QUIT :Manual restart\r\n"); #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) ShellExecute (NULL, "open", prog_name, NULL, NULL, SW_HIDE); #elif defined(__linux__) execv (prog_name, &prog_name); #endif } else if (strncmp (m->command, "$die", 4) == 0) { err = cleanup (s, a, m); if (err == -1) { non_fatal ("Cleanup"); } my_send (s, "PRIVMSG %s :Dying...\r\n", contact); my_send (s, "QUIT :Died\r\n"); exit (EXIT_SUCCESS); } return TRUE; }
static void __init check_ptrace(void) { int pid, syscall, n, status; non_fatal("Checking that ptrace can change system call numbers..."); pid = start_ptraced_child(); if ((ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *) PTRACE_O_TRACESYSGOOD) < 0)) fatal_perror("check_ptrace: PTRACE_OLDSETOPTIONS failed"); while (1) { if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) fatal_perror("check_ptrace : ptrace failed"); CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); if (n < 0) fatal_perror("check_ptrace : wait failed"); if (!WIFSTOPPED(status) || (WSTOPSIG(status) != (SIGTRAP | 0x80))) fatal("check_ptrace : expected (SIGTRAP|0x80), " "got status = %d", status); syscall = ptrace(PTRACE_PEEKUSER, pid, PT_SYSCALL_NR_OFFSET, 0); if (syscall == __NR_getpid) { n = ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_NR_OFFSET, __NR_getppid); if (n < 0) fatal_perror("check_ptrace : failed to modify " "system call"); break; } } stop_ptraced_child(pid, 0, 1); non_fatal("OK\n"); check_sysemu(); }
void setutype(Lextok *p, Symbol *t, Lextok *vis) /* user-defined types */ { int oln = lineno; Symbol *ofn = Fname; Lextok *m, *n; m = getuname(t); for (n = p; n; n = n->rgt) { lineno = n->ln; Fname = n->fn; if (n->sym->type) non_fatal("redeclaration of '%s'", n->sym->name); if (n->sym->nbits > 0) non_fatal("(%s) only an unsigned can have width-field", n->sym->name); if (Expand_Ok) n->sym->hidden |= (4|8|16); /* formal par */ if (vis) { if (strncmp(vis->sym->name, ":hide:", 6) == 0) n->sym->hidden |= 1; else if (strncmp(vis->sym->name, ":show:", 6) == 0) n->sym->hidden |= 2; else if (strncmp(vis->sym->name, ":local:", 7) == 0) n->sym->hidden |= 64; } n->sym->type = STRUCT; /* classification */ n->sym->Slst = m; /* structure itself */ n->sym->Snm = t; /* name of typedef */ n->sym->Nid = 0; /* this is no chan */ n->sym->hidden |= 4; if (n->sym->nel <= 0) non_fatal("bad array size for '%s'", n->sym->name); } lineno = oln; Fname = ofn; }
void checkindex(char *s, char *t) { BaseName *b; /* printf("xxx Check %s (%s)\n", s, t); */ for (b = bsn; b; b = b->nxt) { /* printf(" %s\n", b->str); */ if (strcmp(b->str, s) == 0) { non_fatal("do not index an array with itself (%s)", t); break; } } }
void validref(Lextok *p, Lextok *c) { Lextok *fp, *tl; char lbuf[512]; for (fp = p->sym->Slst; fp; fp = fp->rgt) for (tl = fp->lft; tl; tl = tl->rgt) if (strcmp(tl->sym->name, c->sym->name) == 0) return; sprintf(lbuf, "no field '%s' defined in structure '%s'\n", c->sym->name, p->sym->name); non_fatal(lbuf, (char *) 0); }
static void setonexu(Symbol *sp, int t) { sp->xu |= t; if (t == XR || t == XS) { if (sp->xup[t-1] && strcmp(sp->xup[t-1]->name, context->name)) { printf("error: x[rs] claims from %s and %s\n", sp->xup[t-1]->name, context->name); non_fatal("conflicting claims on chan '%s'", sp->name); } sp->xup[t-1] = context; } }
/* When testing for SYSEMU support, if it is one of the broken versions, we * must just avoid using sysemu, not panic, but only if SYSEMU features are * broken. * So only for SYSEMU features we test mustpanic, while normal host features * must work anyway! */ static int stop_ptraced_child(int pid, int exitcode, int mustexit) { int status, n, ret = 0; if (ptrace(PTRACE_CONT, pid, 0, 0) < 0) { perror("stop_ptraced_child : ptrace failed"); return -1; } CATCH_EINTR(n = waitpid(pid, &status, 0)); if (!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) { int exit_with = WEXITSTATUS(status); if (exit_with == 2) non_fatal("check_ptrace : child exited with status 2. " "\nDisabling SYSEMU support.\n"); non_fatal("check_ptrace : child exited with exitcode %d, while " "expecting %d; status 0x%x\n", exit_with, exitcode, status); if (mustexit) exit(1); ret = -1; } return ret; }
void setpname(Lextok *n) { UType *tmp; for (tmp = Pnames; tmp; tmp = tmp->nxt) if (!strcmp(n->sym->name, tmp->nm->name)) { non_fatal("proctype %s redefined", n->sym->name); return; } tmp = (UType *) emalloc(sizeof(UType)); tmp->nm = n->sym; tmp->nxt = Pnames; Pnames = tmp; }
int gretl_spawn (char *cmdline) { GError *error = NULL; gchar *errout = NULL; gchar *sout = NULL; int ok, status; int ret = 0; gretl_error_clear(); ok = g_spawn_command_line_sync(cmdline, &sout, /* standard output */ &errout, /* standard error */ &status, /* exit status */ &error); if (!ok) { gretl_errmsg_set(error->message); fprintf(stderr, "gretl_spawn: '%s'\n", error->message); g_error_free(error); ret = 1; } else if (errout && *errout) { fprintf(stderr, "stderr: '%s'\n", errout); if (!non_fatal(errout)) { gretl_errmsg_set(errout); fprintf(stderr, "gretl_errmsg: '%s'\n", gretl_errmsg_get()); ret = 1; } } else if (status != 0) { if (sout != NULL && *sout) { gretl_errmsg_set(sout); fprintf(stderr, "gretl_spawn: status = %d: '%s'\n", status, sout); } else { gretl_errmsg_set(_("Command failed")); fprintf(stderr, "gretl_spawn: status = %d\n", status); } ret = 1; } if (errout != NULL) g_free(errout); if (sout != NULL) g_free(sout); if (ret) { fprintf(stderr, "Failed command: '%s'\n", cmdline); } return ret; }
static Symbol * do_same(Lextok *n, Symbol *v, int xinit) { Lextok *tmp, *fp, *tl; int ix = eval(n->lft); int oln = lineno; Symbol *ofn = Fname; lineno = n->ln; Fname = n->fn; /* n->sym->type == STRUCT * index: n->lft * subfields: n->rgt * structure template: n->sym->Slst * runtime values: n->sym->Sval */ if (xinit) ini_struct(v); /* once, at top level */ if (ix >= v->nel || ix < 0) { printf("spin: indexing %s[%d] - size is %d\n", v->name, ix, v->nel); fatal("indexing error \'%s\'", v->name); } if (!n->rgt || !n->rgt->lft) { non_fatal("no subfields %s", v->name); /* i.e., wants all */ lineno = oln; Fname = ofn; return ZS; } if (n->rgt->ntyp != '.') { printf("bad subfield type %d\n", n->rgt->ntyp); alldone(1); } tmp = n->rgt->lft; if (tmp->ntyp != NAME && tmp->ntyp != TYPE) { printf("bad subfield entry %d\n", tmp->ntyp); alldone(1); } for (fp = v->Sval[ix]; fp; fp = fp->rgt) for (tl = fp->lft; tl; tl = tl->rgt) if (!strcmp(tl->sym->name, tmp->sym->name)) { lineno = oln; Fname = ofn; return tl->sym; } fatal("cannot locate subfield %s", tmp->sym->name); return ZS; }
void * read_debugging_info (bfd *abfd, asymbol **syms, long symcount, bfd_boolean no_messages) { void *dhandle; bfd_boolean found; dhandle = debug_init (); if (dhandle == NULL) return NULL; if (! read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, &found)) return NULL; if (bfd_get_flavour (abfd) == bfd_target_aout_flavour) { if (! read_symbol_stabs_debugging_info (abfd, syms, symcount, dhandle, &found)) return NULL; } if (bfd_get_flavour (abfd) == bfd_target_ieee_flavour) { if (! read_ieee_debugging_info (abfd, dhandle, &found)) return NULL; } /* Try reading the COFF symbols if we didn't find any stabs in COFF sections. */ if (! found && bfd_get_flavour (abfd) == bfd_target_coff_flavour && symcount > 0) { if (! parse_coff (abfd, syms, symcount, dhandle)) return NULL; found = TRUE; } if (! found) { if (! no_messages) non_fatal (_("%s: no recognized debugging information"), bfd_get_filename (abfd)); return NULL; } return dhandle; }
void setuname(Lextok *n) { UType *tmp; for (tmp = Unames; tmp; tmp = tmp->nxt) if (!strcmp(owner->name, tmp->nm->name)) { non_fatal("typename %s was defined before", tmp->nm->name); return; } if (!owner) fatal("illegal reference inside typedef", (char *) 0); tmp = (UType *) emalloc(sizeof(UType)); tmp->nm = owner; tmp->cn = n; tmp->nxt = Unames; Unames = tmp; }
void sr_buf(int v, int j) { int cnt = 1; Lextok *n; char lbuf[512]; for (n = Mtype; n && j; n = n->rgt, cnt++) if (cnt == v) { if(strlen(n->lft->sym->name) >= sizeof(lbuf)) { non_fatal("mtype name %s too long", n->lft->sym->name); break; } sprintf(lbuf, "%s", n->lft->sym->name); strcat(Buf, lbuf); return; } sprintf(lbuf, "%d", v); strcat(Buf, lbuf); }
void c_track(Symbol *s, Symbol *t, Symbol *stackonly) /* name, size */ { C_Added *r; r = (C_Added *) emalloc(sizeof(C_Added)); r->s = s; r->t = t; r->ival = stackonly; /* abuse of name */ r->nxt = c_tracked; c_tracked = r; if (stackonly != ZS) { if (strcmp(stackonly->name, "\"Matched\"") == 0) r->ival = ZS; /* the default */ else if (strcmp(stackonly->name, "\"UnMatched\"") != 0 && strcmp(stackonly->name, "\"unMatched\"") != 0 && strcmp(stackonly->name, "\"StackOnly\"") != 0) non_fatal("expecting '[Un]Matched', saw %s", stackonly->name); else has_stack = 1; /* unmatched stack */ } }
void setxus(Lextok *p, int t) { Lextok *m, *n; has_xu = 1; if (m_loss && t == XS) { printf("spin: warning, %s:%d, xs tag not compatible with -m (message loss)\n", (p->fn != NULL) ? p->fn->name : "stdin", p->ln); } if (!context) { lineno = p->ln; Fname = p->fn; fatal("non-local x[rs] assertion", (char *)0); } for (m = p; m; m = m->rgt) { Lextok *Xu_new = (Lextok *) emalloc(sizeof(Lextok)); Xu_new->uiid = p->uiid; Xu_new->val = t; Xu_new->lft = m->lft; Xu_new->sym = context; Xu_new->rgt = Xu_List; Xu_List = Xu_new; n = m->lft; if (n->sym->type == STRUCT) setallxu(n->sym->Slst, t); else if (n->sym->type == CHAN) setonexu(n->sym, t); else { int oln = lineno; lineno = n->ln; Fname = n->fn; non_fatal("xr or xs of non-chan '%s'", n->sym->name); lineno = oln; } } }
int smart_rename (const char *from, const char *to, int preserve_dates ATTRIBUTE_UNUSED) { bfd_boolean exists; struct stat s; int ret = 0; exists = lstat (to, &s) == 0; #if 1 /* Win32, unlike unix, will not erase `to' in `rename(from, to)' but fail instead. Also, chown is not present. */ if (exists) remove (to); ret = rename (from, to); if (ret != 0) { /* We have to clean up here. */ non_fatal (_("unable to rename '%s'; reason: %s"), to, strerror (errno)); unlink (from); } #else /* Use rename only if TO is not a symbolic link and has only one hard link, and we have permission to write to it. */ if (! exists || (!S_ISLNK (s.st_mode) && S_ISREG (s.st_mode) && (s.st_mode & S_IWUSR) && s.st_nlink == 1) ) { ret = rename (from, to); if (ret == 0) { if (exists) { /* Try to preserve the permission bits and ownership of TO. First get the mode right except for the setuid bit. Then change the ownership. Then fix the setuid bit. We do the chmod before the chown because if the chown succeeds, and we are a normal user, we won't be able to do the chmod afterward. We don't bother to fix the setuid bit first because that might introduce a fleeting security problem, and because the chown will clear the setuid bit anyhow. We only fix the setuid bit if the chown succeeds, because we don't want to introduce an unexpected setuid file owned by the user running objcopy. */ // chmod (to, s.st_mode & 0777); // if (chown (to, s.st_uid, s.st_gid) >= 0) // chmod (to, s.st_mode & 07777); } } else { /* We have to clean up here. */ non_fatal (_("unable to rename '%s'; reason: %s"), to, strerror (errno)); unlink (from); } } else { ret = simple_copy (from, to); if (ret != 0) non_fatal (_("unable to copy file '%s'; reason: %s"), to, strerror (errno)); if (preserve_dates) set_times (to, &s); unlink (from); } #endif /* _WIN32 && !__CYGWIN32__ */ return ret; }
static debug_type parse_coff_struct_type (bfd *abfd, struct coff_symbols *symbols, struct coff_types *types, int ntype, union internal_auxent *pauxent, void *dhandle) { long symend; int alloc; debug_field *fields; int count; bfd_boolean done; symend = pauxent->x_sym.x_fcnary.x_fcn.x_endndx.l; alloc = 10; fields = (debug_field *) xmalloc (alloc * sizeof *fields); count = 0; done = FALSE; while (! done && symbols->coff_symno < symend && symbols->symno < symbols->symcount) { asymbol *sym; long this_coff_symno; struct internal_syment syment; union internal_auxent auxent; union internal_auxent *psubaux; bfd_vma bitpos = 0, bitsize = 0; sym = symbols->syms[symbols->symno]; if (! bfd_coff_get_syment (abfd, sym, &syment)) { non_fatal (_("bfd_coff_get_syment failed: %s"), bfd_errmsg (bfd_get_error ())); return DEBUG_TYPE_NULL; } this_coff_symno = symbols->coff_symno; ++symbols->symno; symbols->coff_symno += 1 + syment.n_numaux; if (syment.n_numaux == 0) psubaux = NULL; else { if (! bfd_coff_get_auxent (abfd, sym, 0, &auxent)) { non_fatal (_("bfd_coff_get_auxent failed: %s"), bfd_errmsg (bfd_get_error ())); return DEBUG_TYPE_NULL; } psubaux = &auxent; } switch (syment.n_sclass) { case C_MOS: case C_MOU: bitpos = 8 * bfd_asymbol_value (sym); bitsize = 0; break; case C_FIELD: bitpos = bfd_asymbol_value (sym); bitsize = auxent.x_sym.x_misc.x_lnsz.x_size; break; case C_EOS: done = TRUE; break; } if (! done) { debug_type ftype; debug_field f; ftype = parse_coff_type (abfd, symbols, types, this_coff_symno, syment.n_type, psubaux, TRUE, dhandle); f = debug_make_field (dhandle, bfd_asymbol_name (sym), ftype, bitpos, bitsize, DEBUG_VISIBILITY_PUBLIC); if (f == DEBUG_FIELD_NULL) return DEBUG_TYPE_NULL; if (count + 1 >= alloc) { alloc += 10; fields = ((debug_field *) xrealloc (fields, alloc * sizeof *fields)); } fields[count] = f; ++count; } } fields[count] = DEBUG_FIELD_NULL; return debug_make_struct_type (dhandle, ntype == T_STRUCT, pauxent->x_sym.x_misc.x_lnsz.x_size, fields); }
static void __init check_sysemu(void) { unsigned long regs[MAX_REG_NR]; int pid, n, status, count=0; non_fatal("Checking syscall emulation patch for ptrace..."); sysemu_supported = 0; pid = start_ptraced_child(); if (ptrace(PTRACE_SYSEMU, pid, 0, 0) < 0) goto fail; CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); if (n < 0) fatal_perror("check_sysemu : wait failed"); if (!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP)) fatal("check_sysemu : expected SIGTRAP, got status = %d\n", status); if (ptrace(PTRACE_GETREGS, pid, 0, regs) < 0) fatal_perror("check_sysemu : PTRACE_GETREGS failed"); if (PT_SYSCALL_NR(regs) != __NR_getpid) { non_fatal("check_sysemu got system call number %d, " "expected %d...", PT_SYSCALL_NR(regs), __NR_getpid); goto fail; } n = ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_RET_OFFSET, os_getpid()); if (n < 0) { non_fatal("check_sysemu : failed to modify system call " "return"); goto fail; } if (stop_ptraced_child(pid, 0, 0) < 0) goto fail_stopped; sysemu_supported = 1; non_fatal("OK\n"); set_using_sysemu(!force_sysemu_disabled); non_fatal("Checking advanced syscall emulation patch for ptrace..."); pid = start_ptraced_child(); if ((ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *) PTRACE_O_TRACESYSGOOD) < 0)) fatal_perror("check_sysemu: PTRACE_OLDSETOPTIONS failed"); while (1) { count++; if (ptrace(PTRACE_SYSEMU_SINGLESTEP, pid, 0, 0) < 0) goto fail; CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); if (n < 0) fatal_perror("check_sysemu: wait failed"); if (WIFSTOPPED(status) && (WSTOPSIG(status) == (SIGTRAP|0x80))) { if (!count) { non_fatal("check_sysemu: SYSEMU_SINGLESTEP " "doesn't singlestep"); goto fail; } n = ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_RET_OFFSET, os_getpid()); if (n < 0) fatal_perror("check_sysemu : failed to modify " "system call return"); break; } else if (WIFSTOPPED(status) && (WSTOPSIG(status) == SIGTRAP)) count++; else { non_fatal("check_sysemu: expected SIGTRAP or " "(SIGTRAP | 0x80), got status = %d\n", status); goto fail; } } if (stop_ptraced_child(pid, 0, 0) < 0) goto fail_stopped; sysemu_supported = 2; non_fatal("OK\n"); if (!force_sysemu_disabled) set_using_sysemu(sysemu_supported); return; fail: stop_ptraced_child(pid, 1, 0); fail_stopped: non_fatal("missing\n"); }
int smart_rename (const char *from, const char *to, int preserve_dates) { bfd_boolean exists; struct stat s; int ret = 0; exists = lstat (to, &s) == 0; #if defined (_WIN32) && !defined (__CYGWIN32__) /* Win32, unlike unix, will not erase `to' in `rename(from, to)' but fail instead. Also, chown is not present. */ if (exists) remove (to); ret = rename (from, to); if (ret != 0) { /* We have to clean up here. */ non_fatal (_("unable to rename '%s' reason: %s"), to, strerror (errno)); unlink (from); } #else /* Use rename only if TO is not a symbolic link and has only one hard link, and we have permission to write to it. */ if (! exists || (!S_ISLNK (s.st_mode) && S_ISREG (s.st_mode) && (s.st_mode & S_IWUSR) && s.st_nlink == 1) ) { ret = rename (from, to); if (ret == 0) { if (exists) { /* Try to preserve the permission bits of TO. Don't * restore special bits. */ chmod (to, s.st_mode & 0777); } } else { /* We have to clean up here. */ non_fatal (_("unable to rename '%s' reason: %s"), to, strerror (errno)); unlink (from); } } else { ret = simple_copy (from, to); if (ret != 0) non_fatal (_("unable to copy file '%s' reason: %s"), to, strerror (errno)); if (preserve_dates) set_times (to, &s); unlink (from); } #endif /* _WIN32 && !__CYGWIN32__ */ return ret; }
static debug_type parse_coff_type (bfd *abfd, struct coff_symbols *symbols, struct coff_types *types, long coff_symno, int ntype, union internal_auxent *pauxent, bfd_boolean useaux, void *dhandle) { debug_type type; if ((ntype & ~N_BTMASK) != 0) { int newtype; newtype = DECREF (ntype); if (ISPTR (ntype)) { type = parse_coff_type (abfd, symbols, types, coff_symno, newtype, pauxent, useaux, dhandle); type = debug_make_pointer_type (dhandle, type); } else if (ISFCN (ntype)) { type = parse_coff_type (abfd, symbols, types, coff_symno, newtype, pauxent, useaux, dhandle); type = debug_make_function_type (dhandle, type, (debug_type *) NULL, FALSE); } else if (ISARY (ntype)) { int n; if (pauxent == NULL) n = 0; else { unsigned short *dim; int i; /* FIXME: If pauxent->x_sym.x_tagndx.l == 0, gdb sets the c_naux field of the syment to 0. */ /* Move the dimensions down, so that the next array picks up the next one. */ dim = pauxent->x_sym.x_fcnary.x_ary.x_dimen; n = dim[0]; for (i = 0; *dim != 0 && i < DIMNUM - 1; i++, dim++) *dim = *(dim + 1); *dim = 0; } type = parse_coff_type (abfd, symbols, types, coff_symno, newtype, pauxent, FALSE, dhandle); type = debug_make_array_type (dhandle, type, parse_coff_base_type (abfd, symbols, types, coff_symno, T_INT, NULL, dhandle), 0, n - 1, FALSE); } else { non_fatal (_("parse_coff_type: Bad type code 0x%x"), ntype); return DEBUG_TYPE_NULL; } return type; } if (pauxent != NULL && pauxent->x_sym.x_tagndx.l > 0) { debug_type *slot; /* This is a reference to an existing type. FIXME: gdb checks that the class is not C_STRTAG, nor C_UNTAG, nor C_ENTAG. */ slot = coff_get_slot (types, pauxent->x_sym.x_tagndx.l); if (*slot != DEBUG_TYPE_NULL) return *slot; else return debug_make_indirect_type (dhandle, slot, (const char *) NULL); } /* If the aux entry has already been used for something, useaux will have been set to false, indicating that parse_coff_base_type should not use it. We need to do it this way, rather than simply passing pauxent as NULL, because we need to be able handle multiple array dimensions while still discarding pauxent after having handled all of them. */ if (! useaux) pauxent = NULL; return parse_coff_base_type (abfd, symbols, types, coff_symno, ntype, pauxent, dhandle); }