/* * Uses setup_tmpfile() to pass the updated message on directly to any * logfile programs that have a regular expression match for the checked in * directory in the source repository. The log information is fed into the * specified program as standard input. */ void Update_Logfile (const char *repository, const char *xmessage, FILE *xlogfp, List *xchanges, const char *xbugid) { /* nothing to do if the list is empty */ if (xchanges == NULL || xchanges->list->next == xchanges->list) return; loginfo_param_t args; args.message = xmessage; args.logfp=xlogfp; args.changes=xchanges; args.directory=Short_Repository(repository); /* call Parse_Info to do the actual logfile updates */ TRACE(3,"run loginfo trigger"); run_trigger(&args, update_logfile_proc); }
void run() { Data *data=this; wait_flag=false; RunTask run_wait(function_stop()); run_wait(TaskCount,function_wait()); RunTask run_trigger; for(ulen index=0; index<TaskCount ;index++) run_trigger( [=] () -> void { data->trigger_loop(index); } ); wait_flag=true; }
gboolean run_triggers (GCancellable *cancellable, GError **error) { gboolean ret = FALSE; int i; GPtrArray *triggers = NULL; char *path = NULL; if (!get_sorted_triggers (&triggers, cancellable, error)) goto out; for (i = 0; i < triggers->len; i++) { const char *basename; GFile *trigger_path = triggers->pdata[i]; guint64 start_time; guint64 end_time; g_free (path); path = g_file_get_path (trigger_path); basename = strrchr (path, '/'); if (basename) basename += 1; else basename = path; start_time = g_get_monotonic_time (); g_print ("ostree-run-triggers: Starting: %s\n", basename); if (!run_trigger (path, cancellable, error)) goto out; end_time = g_get_monotonic_time (); g_print ("ostree-run-triggers: Completed %s in %.2f seconds\n", basename, (double) (end_time - start_time) / (double)G_USEC_PER_SEC); } ret = TRUE; out: g_free (path); if (triggers) g_ptr_array_unref (triggers); return ret; }
void run_bus_trigger(int socket, int cpu, char *level, char *pp, char *rrrr, char *ii, char *timeout) { int ei = 0; char *env[MAX_ENV]; int i; char *msg; char *location; if (socket >= 0) asprintf(&location, "CPU %d on socket %d", cpu, socket); else asprintf(&location, "CPU %d", cpu); asprintf(&msg, "%s received Bus and Interconnect Errors in %s", location, ii); asprintf(&env[ei++], "LOCATION=%s", location); free(location); if (!bus_trigger) goto out; if (socket >= 0) asprintf(&env[ei++], "SOCKETID=%d", socket); asprintf(&env[ei++], "MESSAGE=%s", msg); asprintf(&env[ei++], "CPU=%d", cpu); asprintf(&env[ei++], "LEVEL=%s", level); asprintf(&env[ei++], "PARTICIPATION=%s", pp); asprintf(&env[ei++], "REQUEST=%s", rrrr); asprintf(&env[ei++], "ORIGIN=%s", ii); asprintf(&env[ei++], "TIMEOUT=%s", timeout); env[ei] = NULL; assert(ei < MAX_ENV); run_trigger(bus_trigger, NULL, env); for (i = 0; i < ei; i++) free(env[i]); out: free(msg); }
void run_iomca_trigger(int socket, int cpu, int seg, int bus, int dev, int fn) { int ei = 0; char *env[MAX_ENV]; int i; char *msg; char *location; if (socket >= 0) asprintf(&location, "CPU %d on socket %d", cpu, socket); else asprintf(&location, "CPU %d", cpu); asprintf(&msg, "%s received IO MCA Errors from %x:%02x:%02x.%x", location, seg, bus, dev, fn); asprintf(&env[ei++], "LOCATION=%s", location); free(location); if (!iomca_trigger) goto out; if (socket >= 0) asprintf(&env[ei++], "SOCKETID=%d", socket); asprintf(&env[ei++], "MESSAGE=%s", msg); asprintf(&env[ei++], "CPU=%d", cpu); asprintf(&env[ei++], "SEG=%x", seg); asprintf(&env[ei++], "BUS=%02x", bus); asprintf(&env[ei++], "DEVICE=%02x", dev); asprintf(&env[ei++], "FUNCTION=%x", fn); env[ei] = NULL; assert(ei < MAX_ENV); run_trigger(iomca_trigger, NULL, env); for (i = 0; i < ei; i++) free(env[i]); out: free(msg); }
/* Runs the user-defined verification script as part of the commit or import process. This verification is meant to be run whether or not the user included the -m atribute. unlike the do_editor function, this is independant of the running of an editor for getting a message. */ int do_verify (char **message, const char *repository) { FILE *fp; char *fname = NULL; int retcode = 0; int len; char boughtsuite[100]; if (current_parsed_root->isremote) /* The verification will happen on the server. */ return 0; /* FIXME? Do we really want to skip this on noexec? What do we do for the other administrative files? */ if (noexec) return 0; /* If there's no message, then we have nothing to verify. Can this case happen? And if so why would we print a message? */ if (message == NULL) { cvs_output ("No message to verify\n", 0); return 0; } /* open a temporary file, write the message to the temp file, and close the file. */ if ((fp = cvs_temp_file (&fname)) == NULL) error (1, errno, "cannot create temporary file %s", fname); else { fprintf (fp, "%s", *message); if ((*message)[0] == '\0' || (*message)[strlen (*message) - 1] != '\n') fprintf (fp, "%s", "\n"); if (fclose (fp) == EOF) error (1, errno, "%s", fname); /* Run the verify message */ if (repository != NULL) { verifymsg_param_t args; args.directory = Short_Repository(repository); args.filename = fname; TRACE(3,"run verifymsg trigger"); retcode = run_trigger(&args,verifymsg_proc); if(!retcode && reread_log_after_verify) { if((fp=fopen(fname,"r"))==NULL) error(1, errno, "Couldn't reread message file"); fseek(fp,0,SEEK_END); len = ftell(fp); fseek(fp,0,SEEK_SET); *message = (char*)xmalloc(len+1); if(!*message) error(1,errno,"Out of memory rereading message"); len = fread(*message, 1, len, fp); if(len < 0) error(1, errno, "Couldn't reread message file"); (*message)[len]='\0'; if (fclose (fp) == EOF) error (1, errno, "Couldn't close %s", fname); } #ifdef _WIN32 #if (CVSNT_SPECIAL_BUILD_FLAG != 0) if (strcasecmp(CVSNT_SPECIAL_BUILD,"Suite")!=0) #endif { if (message!=NULL) { if (strstr(*message,"Committed on the Free edition of March Hare Software CVSNT")==NULL) { if(CGlobalSettings::GetGlobalValue("cvsnt","PServer","HaveBoughtSuite",boughtsuite,sizeof(boughtsuite))) strcpy(boughtsuite,"no"); if (strcasecmp(boughtsuite,"yes")) { len=strlen(*message); *message=(char *)xrealloc(*message,len+400); strcat(*message,"\nCommitted on the Free edition of March Hare Software CVSNT Server.\nUpgrade to CVS Suite for more features and support:\nhttp://march-hare.com/cvsnt/"); } } } } #endif } /* Delete the temp file */ if (unlink_file (fname) < 0) error (0, errno, "cannot remove %s", fname); xfree (fname); } return retcode; }
/* * Builds a temporary file using setup_tmpfile() and invokes the user's * editor on the file. The header garbage in the resultant file is then * stripped and the log message is stored in the "message" argument. * * If REPOSITORY is non-NULL, process rcsinfo for that repository; if it * is NULL, use the CVSADM_TEMPLATE file instead. */ void do_editor (const char *dir, char **messagep, const char *repository, List *changes) { static int reuse_log_message = 0; char *line; int line_length; size_t line_chars_allocated; char *fname; struct stat pre_stbuf, post_stbuf; int retcode = 0; if (noexec || reuse_log_message) return; /* Abort creation of temp file if no editor is defined */ if (strcmp (Editor, "") == 0) error(1, 0, "no editor defined, must use -e or -m"); /* Create a temporary file */ /* FIXME - It's possible we should be relying on cvs_temp_file to open * the file here - we get race conditions otherwise. */ fname = cvs_temp_name (); again: if ((fp = CVS_FOPEN (fname, "w+")) == NULL) error (1, 0, "cannot create temporary file %s", fname); if (*messagep) { fprintf (fp, "%s", *messagep); if ((*messagep)[0] == '\0' || (*messagep)[strlen (*messagep) - 1] != '\n') fprintf (fp, "\n"); } if (repository != NULL) { rcsinfo_param_t args; args.directory = Short_Repository(repository); args.message=NULL; /* tack templates on if necessary */ TRACE(3,"run rcsinfo trigger"); if(!run_trigger(&args,rcsinfo_proc) && args.message) { fprintf(fp,"%s",args.message); if (args.message[0] == '\0' || args.message[strlen(args.message) - 1] != '\n') fprintf (fp, "\n"); } } else { FILE *tfp; char buf[1024]; size_t n; size_t nwrite; /* Why "b"? */ tfp = CVS_FOPEN (CVSADM_TEMPLATE, "rb"); if (tfp == NULL) { if (!existence_error (errno)) error (1, errno, "cannot read %s", CVSADM_TEMPLATE); } else { while (!feof (tfp)) { char *p = buf; n = fread (buf, 1, sizeof buf, tfp); nwrite = n; while (nwrite > 0) { n = fwrite (p, 1, nwrite, fp); nwrite -= n; p += n; } if (ferror (tfp)) error (1, errno, "cannot read %s", CVSADM_TEMPLATE); } if (fclose (tfp) < 0) error (0, errno, "cannot close %s", CVSADM_TEMPLATE); } } fprintf (fp,"%s----------------------------------------------------------------------\n",CVSEDITPREFIX); #ifdef _WIN32 #if (CVSNT_SPECIAL_BUILD_FLAG != 0) if (strcasecmp(CVSNT_SPECIAL_BUILD,"Suite")!=0) #endif { fprintf (fp,"%s Committed on the Free edition of March Hare Software CVSNT Server\n",CVSEDITPREFIX); fprintf (fp,"%s Upgrade to CVS Suite for more features and support:\n",CVSEDITPREFIX); fprintf (fp,"%s http://march-hare.com/cvsnt/\n",CVSEDITPREFIX); fprintf (fp,"%s----------------------------------------------------------------------\n",CVSEDITPREFIX); } #endif fprintf (fp,"%sEnter Log. Lines beginning with `%.*s' are removed automatically\n%s\n", CVSEDITPREFIX, CVSEDITPREFIXLEN, CVSEDITPREFIX,CVSEDITPREFIX); if (dir != NULL && *dir) fprintf (fp, "%sCommitting in %s\n%s\n", CVSEDITPREFIX, dir, CVSEDITPREFIX); if (changes != NULL) setup_tmpfile (fp, CVSEDITPREFIX, changes); fprintf (fp,"%s----------------------------------------------------------------------\n", CVSEDITPREFIX); /* finish off the temp file */ if (fclose (fp) == EOF) error (1, errno, "%s", fname); if ( CVS_STAT (fname, &pre_stbuf) == -1) pre_stbuf.st_mtime = 0; /* run the editor */ run_setup (Editor); run_arg (fname); if ((retcode = run_exec (true)) != 0) error (0, retcode == -1 ? errno : 0, "warning: editor session failed"); /* put the entire message back into the *messagep variable */ fp = open_file (fname, "r"); if (*messagep) xfree (*messagep); if ( CVS_STAT (fname, &post_stbuf) != 0) error (1, errno, "cannot find size of temp file %s", fname); if (post_stbuf.st_size == 0) *messagep = NULL; else { /* On NT, we might read less than st_size bytes, but we won't read more. So this works. */ *messagep = (char *) xmalloc (post_stbuf.st_size + 1); *messagep[0] = '\0'; } line = NULL; line_chars_allocated = 0; if (*messagep) { size_t message_len = post_stbuf.st_size + 1; size_t offset = 0; while (1) { line_length = getline (&line, &line_chars_allocated, fp); if (line_length == -1) { if (ferror (fp)) error (0, errno, "warning: cannot read %s", fname); break; } if (strncmp (line, CVSEDITPREFIX, CVSEDITPREFIXLEN) == 0) continue; if (offset + line_length >= message_len) expand_string (messagep, &message_len, offset + line_length + 1); strcpy (*messagep + offset, line); offset += line_length; } } if (fclose (fp) < 0) error (0, errno, "warning: cannot close %s", fname); if (pre_stbuf.st_mtime == post_stbuf.st_mtime || *messagep == NULL || strcmp (*messagep, "\n") == 0) { for (;;) { printf ("\nLog message unchanged or not specified\n"); printf ("a)bort, c)ontinue, e)dit, !)reuse this message unchanged for remaining dirs\n"); printf ("Action: (continue) "); fflush (stderr); fflush (stdout); line_length = getline (&line, &line_chars_allocated, stdin); if (line_length < 0) { error (0, errno, "cannot read from stdin"); if (unlink_file (fname) < 0) error (0, errno, "warning: cannot remove temp file %s", fname); error (1, 0, "aborting"); } else if (line_length == 0 || *line == '\n' || *line == 'c' || *line == 'C') break; if (*line == 'a' || *line == 'A') { if (unlink_file (fname) < 0) error (0, errno, "warning: cannot remove temp file %s", fname); error (1, 0, "aborted by user"); } if (*line == 'e' || *line == 'E') goto again; if (*line == '!') { reuse_log_message = 1; break; } printf ("Unknown input\n"); } } if (line) xfree (line); if (unlink_file (fname) < 0) error (0, errno, "warning: cannot remove temp file %s", fname); xfree (fname); }