X-Git-Url: https://git.xinqibao.xyz/slstatus.git/blobdiff_plain/fb524b60508dd8adee66ae30e834632fd6b4402c..9078fb351dc3d1e2eac261ec185acef1f66180bc:/slstatus.c?ds=sidebyside diff --git a/slstatus.c b/slstatus.c index 7af71e0..4b69cc6 100644 --- a/slstatus.c +++ b/slstatus.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -149,6 +150,10 @@ datetime(const char *timeformat) time_t tm; size_t bufsize = 64; char *buf = malloc(bufsize); + if (buf == NULL) { + fprintf(stderr, "Failed to get date/time"); + return smprintf("n/a"); + } /* get time in format */ time(&tm); @@ -257,6 +262,22 @@ entropy(const char *null) return smprintf("%d", entropy); } +/* gid */ +char * +gid(const char *null) +{ + gid_t gid; + + if ((gid = getgid()) < 0) { + fprintf(stderr, "Could no get gid."); + return smprintf("n/a"); + } else { + return smprintf("%d", gid); + } + + return smprintf("n/a"); +} + /* hostname */ char * hostname(const char *null) @@ -427,6 +448,32 @@ ram_used(const char *null) return smprintf("%f", (float)used / 1024 / 1024); } +/* custom shell command */ +char * +run_command(const char* command) +{ + FILE *fp; + char buffer[64]; + + /* try to open the command output */ + if (!(fp = popen(command, "r"))) { + fprintf(stderr, "Could not get command output for: %s.\n", command); + return smprintf("n/a"); + } + + /* get command output text, save it to buffer */ + fgets(buffer, sizeof(buffer)-1, fp); + + /* close it again */ + pclose(fp); + + /* add nullchar at the end */ + buffer[strlen(buffer) - 1] = '\0'; + + /* return the output */ + return smprintf("%s", buffer); +} + /* temperature */ char * temp(const char *file) @@ -450,42 +497,103 @@ temp(const char *file) return smprintf("%d°C", temperature / 1000); } +/* username */ +char * +username(const char *null) +{ + register struct passwd *pw; + register uid_t uid; + + /* get the values */ + uid = geteuid (); + pw = getpwuid (uid); + + /* if it worked, return */ + if (pw) { + return smprintf("%s", pw->pw_name); + } + else { + fprintf(stderr, "Could not get username.\n"); + return smprintf("n/a"); + } + + return smprintf("n/a"); +} + +/* uid */ +char * +uid(const char *null) +{ + register uid_t uid; + + /* get the values */ + uid = geteuid (); + + /* if it worked, return */ + if (uid) { + return smprintf("%d", uid); + } + else { + fprintf(stderr, "Could not get uid.\n"); + return smprintf("n/a"); + } + + return smprintf("n/a"); +} + + /* alsa volume percentage */ char * vol_perc(const char *soundcard) { int mute = 0; long vol = 0, max = 0, min = 0; - - /* get volume from alsa */ snd_mixer_t *handle; snd_mixer_elem_t *pcm_mixer, *mas_mixer; snd_mixer_selem_id_t *vol_info, *mute_info; + + /* open everything */ snd_mixer_open(&handle, 0); snd_mixer_attach(handle, soundcard); snd_mixer_selem_register(handle, NULL, NULL); snd_mixer_load(handle); + + /* prepare everything */ snd_mixer_selem_id_malloc(&vol_info); snd_mixer_selem_id_malloc(&mute_info); + /* check */ + if (vol_info == NULL || mute_info == NULL) { + fprintf(stderr, "Could not get alsa volume"); + return smprintf("n/a"); + } snd_mixer_selem_id_set_name(vol_info, channel); snd_mixer_selem_id_set_name(mute_info, channel); pcm_mixer = snd_mixer_find_selem(handle, vol_info); mas_mixer = snd_mixer_find_selem(handle, mute_info); + + /* get the info */ snd_mixer_selem_get_playback_volume_range((snd_mixer_elem_t *)pcm_mixer, &min, &max); snd_mixer_selem_get_playback_volume((snd_mixer_elem_t *)pcm_mixer, SND_MIXER_SCHN_MONO, &vol); snd_mixer_selem_get_playback_switch(mas_mixer, SND_MIXER_SCHN_MONO, &mute); - if (vol_info) + + /* clean up */ + if (vol_info) { snd_mixer_selem_id_free(vol_info); - if (mute_info) + } + if (mute_info) { snd_mixer_selem_id_free(mute_info); - if (handle) + } + if (handle) { snd_mixer_close(handle); + } /* return the string (mute) */ - if (!mute) + if (!mute) { return smprintf("mute"); - else + } + else { return smprintf("%d%%", (vol * 100) / max); + } } /* wifi percentage */