static void shell_logger(enum mbuni_event_type_t type, const char *subtype, int err, const char *file, int line, const char *function, const char *interface, Octstr *id, Octstr *msg) { char *xtype; Octstr *cmd, *xid = octstr_duplicate(id); gw_assert(shell_cmd); switch(type) { case MBUNI_INFO: xtype = "INFO"; break; case MBUNI_WARNING: xtype = "WARNING"; break; default: /* including error. */ xtype = "ERROR"; break; } escape_shell_chars(msg); escape_shell_chars(id); cmd = octstr_format("%S '%s' '%s' %d '%s' '%s' %d '%S' '%S'", shell_cmd, xtype, subtype ? subtype : "", err, interface ? interface : "", file, line, xid ? xid : octstr_imm(""), msg); system(octstr_get_cstr(cmd)); octstr_destroy(cmd); octstr_destroy(xid); }
gchar *archive_decompress(const gchar *filename) { gchar *tmpdir, *cmd, *escaped_filename; ArchiveType type; #ifndef HAVE_MKDTEMP #ifdef S_IRGRP mode_t mode755 = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; #else mode_t mode755 = S_IRWXU; #endif #endif if ((type = archive_get_type(filename)) <= ARCHIVE_DIR) return NULL; #ifdef HAVE_MKDTEMP tmpdir = g_build_filename(g_get_tmp_dir(), "audacious.XXXXXXXX", NULL); if (!mkdtemp(tmpdir)) { g_free(tmpdir); AUDDBG("Unable to load skin: Failed to create temporary " "directory: %s\n", g_strerror(errno)); return NULL; } #else tmpdir = g_strdup_printf("%s/audacious.%ld", g_get_tmp_dir(), (long)rand()); make_directory(tmpdir, mode755); #endif escaped_filename = escape_shell_chars(filename); cmd = archive_extract_funcs[type] (escaped_filename, tmpdir); g_free(escaped_filename); if (!cmd) { AUDDBG("extraction function is NULL!\n"); g_free(tmpdir); return NULL; } AUDDBG("Attempt to execute \"%s\"\n", cmd); if (system(cmd) != 0) { AUDDBG("could not execute cmd %s\n", cmd); g_free(cmd); return NULL; } g_free(cmd); return tmpdir; }
/* do_command(): do @cmd after replacing the format codes @cmd: command to run @current_file: file name of current song @pos: playlist_pos */ void do_command(char *cmd, const char *current_file, int pos) { int length, rate, freq, nch; char *str, *shstring = NULL, *temp, numbuf[16]; gboolean playing; Formatter *formatter; if (cmd && strlen(cmd) > 0) { formatter = xmms_formatter_new(); str = xmms_remote_get_playlist_title(sc_gp.xmms_session, pos); if (str) { temp = escape_shell_chars(str); xmms_formatter_associate(formatter, 's', temp); xmms_formatter_associate(formatter, 'n', temp); g_free(str); g_free(temp); } else { xmms_formatter_associate(formatter, 's', ""); xmms_formatter_associate(formatter, 'n', ""); } if (current_file) { temp = escape_shell_chars(current_file); xmms_formatter_associate(formatter, 'f', temp); g_free(temp); } else xmms_formatter_associate(formatter, 'f', ""); sprintf(numbuf, "%02d", pos + 1); xmms_formatter_associate(formatter, 't', numbuf); length = xmms_remote_get_playlist_time(sc_gp.xmms_session, pos); if (length != -1) { sprintf(numbuf, "%d", length); xmms_formatter_associate(formatter, 'l', numbuf); } else xmms_formatter_associate(formatter, 'l', "0"); xmms_remote_get_info(sc_gp.xmms_session, &rate, &freq, &nch); sprintf(numbuf, "%d", rate); xmms_formatter_associate(formatter, 'r', numbuf); sprintf(numbuf, "%d", freq); xmms_formatter_associate(formatter, 'F', numbuf); sprintf(numbuf, "%d", nch); xmms_formatter_associate(formatter, 'c', numbuf); playing = xmms_remote_is_playing(sc_gp.xmms_session); sprintf(numbuf, "%d", playing); xmms_formatter_associate(formatter, 'p', numbuf); shstring = xmms_formatter_format(formatter, cmd); xmms_formatter_destroy(formatter); if (shstring) { execute_command(shstring); /* FIXME: This can possibly be freed too early */ g_free(shstring); } } }
/* do_command(): do @cmd after replacing the format codes @cmd: command to run */ static void do_command (char * cmd) { int playlist = aud_playlist_get_playing (); int pos = aud_playlist_get_position (playlist); char *shstring = NULL, *temp, numbuf[32]; gboolean playing; Formatter *formatter; if (cmd && strlen(cmd) > 0) { formatter = formatter_new(); char * ctitle = aud_playlist_entry_get_title (playlist, pos, FALSE); if (ctitle) { temp = escape_shell_chars (ctitle); formatter_associate(formatter, 's', temp); formatter_associate(formatter, 'n', temp); g_free(temp); str_unref (ctitle); } else { formatter_associate(formatter, 's', ""); formatter_associate(formatter, 'n', ""); } char * filename = aud_playlist_entry_get_filename (playlist, pos); if (filename) { temp = escape_shell_chars (filename); formatter_associate(formatter, 'f', temp); g_free(temp); str_unref (filename); } else formatter_associate(formatter, 'f', ""); g_snprintf(numbuf, sizeof(numbuf), "%02d", pos + 1); formatter_associate(formatter, 't', numbuf); int length = aud_playlist_entry_get_length (playlist, pos, FALSE); if (length > 0) { g_snprintf(numbuf, sizeof(numbuf), "%d", length); formatter_associate(formatter, 'l', numbuf); } else formatter_associate(formatter, 'l', "0"); playing = aud_drct_get_playing(); g_snprintf(numbuf, sizeof(numbuf), "%d", playing); formatter_associate(formatter, 'p', numbuf); if (playing) { int brate, srate, chans; aud_drct_get_info (& brate, & srate, & chans); snprintf (numbuf, sizeof numbuf, "%d", brate); formatter_associate (formatter, 'r', numbuf); snprintf (numbuf, sizeof numbuf, "%d", srate); formatter_associate (formatter, 'F', numbuf); snprintf (numbuf, sizeof numbuf, "%d", chans); formatter_associate (formatter, 'c', numbuf); } Tuple * tuple = aud_playlist_entry_get_tuple (aud_playlist_get_active (), pos, 0); char * artist = tuple ? tuple_get_str (tuple, FIELD_ARTIST, NULL) : NULL; if (artist) { formatter_associate(formatter, 'a', artist); str_unref(artist); } else formatter_associate(formatter, 'a', ""); char * album = tuple ? tuple_get_str (tuple, FIELD_ALBUM, NULL) : NULL; if (album) { formatter_associate(formatter, 'b', album); str_unref(album); } else formatter_associate(formatter, 'b', ""); char * title = tuple ? tuple_get_str (tuple, FIELD_TITLE, NULL) : NULL; if (title) { formatter_associate(formatter, 'T', title); str_unref(title); } else formatter_associate(formatter, 'T', ""); if (tuple) tuple_unref (tuple); shstring = formatter_format(formatter, cmd); formatter_destroy(formatter); if (shstring) { execute_command(shstring); /* FIXME: This can possibly be freed too early */ g_free(shstring); } } }