From: Pedro Venda <pjvenda-pQd4kjVL+REh2FBCd0jGRA@public.gmane.org>
Cc: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: Re: Re: first shoot for smartbattery
Date: Tue, 11 Jan 2005 10:10:17 +0000 [thread overview]
Message-ID: <41E3A609.7000505@arrakis.dhis.org> (raw)
In-Reply-To: <m2sm58mhzg.fsf-KjnUIgV0B0bak1Ioo/c9IoRWq/SkRNHw@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 1357 bytes --]
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Johan Vromans wrote:
| "Zdzis³aw A. Kaleta" <sanskryt-FWhLrETftxM@public.gmane.org> writes:
|
|
|>So it look like that I realy have the not proper smartbattery.c
|>version. Where I can find proper one?
|
|
| Maybe Pedro Venda <pjvenda-pQd4kjVL+RHfqL7NgpvPWWD2FQJk+8+b@public.gmane.org> (the author) is
| willing to post an updated version?
well, the working version for your program is still the one you're using. I'm
building another and it's nearly done, but when it is, you'll have to rework
your script.
sneak preview:
archon smartbatt-head # ./smartbattery 5
charger state: discharging
~ estimated time to empty: 47 minutes
battery state: [==========| ] 28%
archon smartbatt-head #
don't worry, I'll put a command line switch to make it show verbose information.
the smartbattery.c I've previously written (changed) follows attached.
regards,
pedro venda.
- --
Pedro João Lopes Venda
email: pjvenda-pQd4kjVL+REh2FBCd0jGRA@public.gmane.org
http://arrakis.dhis.org
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org
iD8DBQFB46YJeRy7HWZxjWERAmxpAKCkLduuHRrmbI2XHt7uhmMfg/BDyQCdF01k
8q85Ceyuy/YzLn1cSVEoWQ8=
=F8zL
-----END PGP SIGNATURE-----
[-- Attachment #2: smartbattery.c --]
[-- Type: text/plain, Size: 10639 bytes --]
/*
smartbatt.c - a user-space program for debugging smartbattery support
(C) 2004 Bruno Ducrot, licence same as i2cdump.c since this stuff
was shamelessly stolen from:
i2cdump.c - a user-space program to dump I2C registers
Copyright (C) 2002-2003 Frodo Looijaard <frodol-B0qZmFHriGg@public.gmane.org>, and
Mark D. Studebaker <mdsxyz123-/E1597aS9LQAvxtiuMwx3w@public.gmane.org>
Copyright (C) 2004 The lm_sensors group
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <limits.h>
#include <dirent.h>
#include <fcntl.h>
#include <errno.h>
#include <i2c-dev.h>
/*
this just prints out the installed i2c busses in a consistent format, whether
on a 2.4 kernel using /proc or a 2.6 kernel using /sys.
If procfmt == 1, print out exactly /proc/bus/i2c format on stdout.
This allows this to be used in a program to emulate /proc/bus/i2c on a
sysfs system.
*/
void print_i2c_busses(int procfmt)
{
FILE *fptr;
char s[100];
struct dirent *de, *dde;
DIR *dir, *ddir;
FILE *f;
char *border;
char dev[NAME_MAX], fstype[NAME_MAX], sysfs[NAME_MAX], n[NAME_MAX];
int foundsysfs = 0;
int tmp;
int count=0;
/* look in /proc/bus/i2c */
if((fptr = fopen("/proc/bus/i2c", "r"))) {
while(fgets(s, 100, fptr)) {
if(count++ == 0 && !procfmt)
fprintf(stderr," Installed I2C busses:\n");
if(procfmt)
printf("%s", s);
else
fprintf(stderr, " %s", s);
}
fclose(fptr);
goto done;
}
/* look in sysfs */
/* First figure out where sysfs was mounted */
if ((f = fopen("/proc/mounts", "r")) == NULL) {
goto done;
}
while (fgets(n, NAME_MAX, f)) {
sscanf(n, "%[^ ] %[^ ] %[^ ] %*s\n", dev, sysfs, fstype);
if (strcasecmp(fstype, "sysfs") == 0) {
foundsysfs++;
break;
}
}
fclose(f);
if (! foundsysfs) {
goto done;
}
/* Bus numbers in i2c-adapter don't necessarily match those in
i2c-dev and what we really care about are the i2c-dev numbers.
Unfortunately the names are harder to get in i2c-dev */
strcat(sysfs, "/class/i2c-dev");
if(!(dir = opendir(sysfs)))
goto done;
/* go through the busses */
while ((de = readdir(dir)) != NULL) {
if (!strcmp(de->d_name, "."))
continue;
if (!strcmp(de->d_name, ".."))
continue;
/* this should work for kernels 2.6.5 or higher and */
/* is preferred because is unambiguous */
sprintf(n, "%s/%s/name", sysfs, de->d_name);
f = fopen(n, "r");
/* this seems to work for ISA */
if(f == NULL) {
sprintf(n, "%s/%s/device/name", sysfs, de->d_name);
f = fopen(n, "r");
}
/* non-ISA is much harder */
/* and this won't find the correct bus name if a driver
has more than one bus */
if(f == NULL) {
sprintf(n, "%s/%s/device", sysfs, de->d_name);
if(!(ddir = opendir(n)))
continue;
while ((dde = readdir(ddir)) != NULL) {
if (!strcmp(dde->d_name, "."))
continue;
if (!strcmp(dde->d_name, ".."))
continue;
if ((!strncmp(dde->d_name, "i2c-", 4))) {
sprintf(n, "%s/%s/device/%s/name",
sysfs, de->d_name, dde->d_name);
if((f = fopen(n, "r")))
goto found;
}
}
}
found:
if (f != NULL) {
char x[120];
fgets(x, 120, f);
fclose(f);
if((border = index(x, '\n')) != NULL)
*border = 0;
if(count++ == 0 && !procfmt)
fprintf(stderr," Installed I2C busses:\n");
/* match 2.4 /proc/bus/i2c format as closely as possible */
if(!strncmp(x, "ISA ", 4)) {
if(procfmt)
printf("%s\t%-10s\t%-32s\t%s\n", de->d_name,
"dummy", x, "ISA bus algorithm");
else
fprintf(stderr, " %s\t%-10s\t%-32s\t%s\n", de->d_name,
"dummy", x, "ISA bus algorithm");
} else if(!sscanf(de->d_name, "i2c-%d", &tmp)) {
if(procfmt)
printf("%s\t%-10s\t%-32s\t%s\n", de->d_name,
"dummy", x, "Dummy bus algorithm");
else
fprintf(stderr, " %s\t%-10s\t%-32s\t%s\n", de->d_name,
"dummy", x, "Dummy bus algorithm");
} else {
if(procfmt)
printf("%s\t%-10s\t%-32s\t%s\n", de->d_name,
"unknown", x, "Algorithm unavailable");
else
fprintf(stderr, " %s\t%-10s\t%-32s\t%s\n", de->d_name,
"unknown", x, "Algorithm unavailable");
}
}
}
closedir(dir);
done:
if(count == 0 && !procfmt)
fprintf(stderr,"Error: No I2C busses found!\n"
"Be sure you have done 'modprobe i2c-dev'\n"
"and also modprobed your i2c bus drivers\n");
}
int open_i2c_dev(const int i2cbus, char *filename)
{
int file;
sprintf(filename, "/dev/i2c/%d", i2cbus);
file = open(filename, O_RDWR);
if (file < 0 && errno == ENOENT) {
sprintf(filename, "/dev/i2c-%d", i2cbus);
file = open(filename, O_RDWR);
}
if (file < 0) {
if (errno == ENOENT) {
fprintf(stderr, "Error: Could not open file "
"`/dev/i2c-%d' or `/dev/i2c/%d': %s\n",
i2cbus, i2cbus, strerror(ENOENT));
} else {
fprintf(stderr, "Error: Could not open file "
"`%s': %s\n", filename, strerror(errno));
if (errno == EACCES)
fprintf(stderr, "Run as root?\n");
}
}
return file;
}
/*
We don't use this #define but it was put into i2c.h at the same time as
i2c_smbus_read_i2c_block_data() was implemented (i2c 2.6.3),
so we use it as a version check.
*/
#ifdef I2C_FUNC_SMBUS_READ_I2C_BLOCK_2
#define USE_I2C_BLOCK 1
#else
#define USE_I2C_BLOCK 0
#endif
#ifdef I2C_FUNC_SMBUS_BLOCK_DATA_PEC
#define HAVE_PEC 1
#endif
void help(void)
{
fprintf(stderr, "Syntax: smartbatt I2CBUS\n");
print_i2c_busses(0);
}
int main(int argc, char *argv[])
{
char *end;
int i2cbus, address, file;
int temp, voltage, current;
int avg_current, avg_time_to_full, avg_time_to_empty;
int rel_state_charge , full_charge_cap , design_charge_cap , abs_state_charge;
int remain;
int cycle_count;
int design_voltage;
int battery_status;
int battery_mode;
char filename[20];
long funcs;
if (argc < 2) {
fprintf(stderr, "Error: No i2c-bus specified!\n");
help();
exit(1);
}
i2cbus = strtol(argv[1], &end, 0);
if (*end) {
fprintf(stderr, "Error: First argument not a number!\n");
help();
exit(1);
}
if (i2cbus < 0 || i2cbus > 0xff) {
fprintf(stderr, "Error: I2CBUS argument out of range!\n");
help();
exit(1);
}
if (argc >= 3) {
address = strtol(argv[2], &end, 0);
} else
address = 0xb;
if (address < 0 || address > 0x7f) {
fprintf(stderr, "Error: Address out of range!\n");
help();
exit(1);
}
file = open_i2c_dev(i2cbus, filename);
if (file < 0) {
exit(1);
}
/* check adapter functionality */
if (ioctl(file, I2C_FUNCS, &funcs) < 0) {
fprintf(stderr, "Error: Could not get the adapter "
"functionality matrix: %s\n", strerror(errno));
exit(1);
}
if (!(funcs & I2C_FUNC_SMBUS_READ_WORD_DATA)) {
fprintf(stderr, "Error: Adapter for i2c bus "
"%d does not have word read "
"capability\n", i2cbus);
exit(1);
}
/* use FORCE so that we can look at registers even when
a driver is also running */
if (ioctl(file, I2C_SLAVE_FORCE, address) < 0) {
fprintf(stderr, "Error: Could not set address to %d: %s\n",
address, strerror(errno));
exit(1);
}
/* BatteryMode() */
battery_mode = i2c_smbus_read_word_data(file,0x3);
/* Temperature() */
temp = i2c_smbus_read_word_data(file, 0x8);
/* Voltage() */
voltage = i2c_smbus_read_word_data(file, 0x9);
/* Current() */
current = i2c_smbus_read_word_data(file, 0xa);
/* AvgCurrent() */
avg_current = i2c_smbus_read_word_data(file,0xb);
/* RelativeStateOfCharge() */
rel_state_charge = i2c_smbus_read_word_data(file,0xd);
/* AbsoluteStateOfCharge() */
abs_state_charge = i2c_smbus_read_word_data(file,0xe);
/* RemainingCapacity() */
remain = i2c_smbus_read_word_data(file, 0xf);
/* FullChargeCapacity() */
full_charge_cap = i2c_smbus_read_word_data(file,0x10);
/* AverageTimeToEmpty() */
avg_time_to_empty = i2c_smbus_read_word_data(file, 0x12);
/* AverageTimeToFull() */
avg_time_to_full = i2c_smbus_read_word_data(file, 0x13);
/* BatteryStatus() */
battery_status = i2c_smbus_read_word_data(file, 0x16);
/* CycleCount() */
cycle_count = i2c_smbus_read_word_data(file,0x17);
/* DesignChargeCapacity() */
design_charge_cap = i2c_smbus_read_word_data(file,0x18);
/* DesignVoltage() */
design_voltage = i2c_smbus_read_word_data(file,0x19);
/* if current is negative, we need to make the 2' complement
* to show the correct decimal value */
current=current & 0xffff;
if(current & 0x8000) {
current=((current^0xffff)+0x0001);
current*=(-1);
}
printf("status:\t\t");
if(battery_status & 0x0010)
printf("\tfully discharged");
if(battery_status & 0x0020)
printf("\tfully charged");
if(battery_status & 0x0040)
printf("\tdischarging");
if(battery_status & 0x0080)
printf("\tinitialized");
printf("\n");
printf("mode:\t\t");
if(battery_mode & 0x0080)
printf("\tcondition_flag");
if(! battery_mode & 0x8000) {
printf("\tcapacity in mA/mAh");
} else {
printf("\tcapacity in 10 mW/mWh");
}
printf("\n");
printf("design voltage:\t\t%d mV\n",design_voltage & 0xffff);
printf("design charge capacity:\t%d mAh or mWh\n",design_charge_cap & 0xffff);
printf("absolute charge:\t%d%\n",abs_state_charge & 0xffff);
printf("full charge capacity:\t%d mAh or mWh\n",full_charge_cap & 0xffff);
printf("relative charge:\t%d%\n",rel_state_charge & 0xffff);
printf("current:\t\t%d mA\n", current);
printf("voltage:\t\t%d mV\n", voltage & 0xffff);
printf("remain:\t\t\t%d mA\n", remain & 0xffff);
printf("average time to empty:\t%d minutes\n", avg_time_to_empty & 0xffff);
printf("average time to full:\t%d minutes\n", avg_time_to_full & 0xffff);
printf("temperature:\t\t%2.1f C\n", ((temp & 0xffff) - 2730) / 10.);
printf("cycle count:\t\t%d\n",cycle_count & 0xffff);
return 0;
}
next prev parent reply other threads:[~2005-01-11 10:10 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20041231092156.GA612@phys.ethz.ch>
[not found] ` <20041231092156.GA612-vpGm2Noi6jeZvKxeG3EEhw@public.gmane.org>
2004-12-31 14:19 ` i2c-acpi-ec.c Pedro Venda
[not found] ` <41D56002.5060008-aHmAgkVUFT6Joy8PIJZ9VA@public.gmane.org>
2004-12-31 15:07 ` i2c-acpi-ec.c Bruno Ducrot
[not found] ` <20041231150724.GK19199-kk6yZipjEM5g9hUCZPvPmw@public.gmane.org>
2004-12-31 18:16 ` first shoot for smartbattery (was Re: Re: i2c-acpi-ec.c) Bruno Ducrot
[not found] ` <20041231181628.GL19199-kk6yZipjEM5g9hUCZPvPmw@public.gmane.org>
2004-12-31 18:48 ` François Valenduc
[not found] ` <41D59F15.2030504-IWqWACnzNjyZIoH1IeqzKA@public.gmane.org>
2004-12-31 19:09 ` Bruno Ducrot
2005-01-01 8:26 ` Mathias Weyland
[not found] ` <20050101082605.GA24896-vpGm2Noi6jeZvKxeG3EEhw@public.gmane.org>
2005-01-01 10:08 ` first shoot for smartbattery Johan Vromans
[not found] ` <m2acrth375.fsf-KjnUIgV0B0bak1Ioo/c9IoRWq/SkRNHw@public.gmane.org>
2005-01-01 22:33 ` François Valenduc
2005-01-03 13:45 ` Bruno Ducrot
2005-01-03 14:39 ` Bruno Ducrot
[not found] ` <20050103143902.GQ19199-kk6yZipjEM5g9hUCZPvPmw@public.gmane.org>
2005-01-03 14:55 ` Mathias Weyland
[not found] ` <41D95CDC.8050802-vpGm2Noi6jeZvKxeG3EEhw@public.gmane.org>
2005-01-03 15:05 ` François Valenduc
[not found] ` <41D95F53.5000008-IWqWACnzNjyZIoH1IeqzKA@public.gmane.org>
2005-01-03 15:41 ` François Valenduc
[not found] ` <41D967B5.7040002-IWqWACnzNjyZIoH1IeqzKA@public.gmane.org>
2005-01-03 17:02 ` liste-9nAOAgdJVo4b1SvskN2V4Q
[not found] ` <Pine.LNX.4.60.0501031751590.5329-KnfdeQs3A3X/9pzu0YdTqQ@public.gmane.org>
2005-01-03 17:54 ` Bruno Ducrot
[not found] ` <20050103175449.GW19199-kk6yZipjEM5g9hUCZPvPmw@public.gmane.org>
2005-01-04 1:56 ` Pedro Venda
[not found] ` <41D9F7CA.7030408-pQd4kjVL+REh2FBCd0jGRA@public.gmane.org>
2005-01-04 10:24 ` Bruno Ducrot
[not found] ` <20050104102424.GC19199-kk6yZipjEM5g9hUCZPvPmw@public.gmane.org>
2005-01-04 15:27 ` Pedro Venda
[not found] ` <41DAB5C7.9040605-pQd4kjVL+REh2FBCd0jGRA@public.gmane.org>
2005-01-06 8:51 ` Bruno Ducrot
[not found] ` <20050106085149.GJ19199-kk6yZipjEM5g9hUCZPvPmw@public.gmane.org>
2005-01-11 10:05 ` Pedro Venda
2005-01-03 15:08 ` Bruno Ducrot
2005-01-03 17:03 ` Pedro Venda
[not found] ` <41D97AF3.7000409-pQd4kjVL+REh2FBCd0jGRA@public.gmane.org>
2005-01-03 17:34 ` Bruno Ducrot
2005-01-03 17:35 ` Pedro Venda
[not found] ` <41D98251.9020002-pQd4kjVL+REh2FBCd0jGRA@public.gmane.org>
2005-01-03 18:02 ` Bruno Ducrot
[not found] ` <20050103180219.GX19199-kk6yZipjEM5g9hUCZPvPmw@public.gmane.org>
2005-01-03 19:50 ` Pedro Venda
[not found] ` <41D9A1F5.1060508-pQd4kjVL+REh2FBCd0jGRA@public.gmane.org>
2005-01-03 20:30 ` Johan Vromans
[not found] ` <m2mzvq5k7u.fsf-KjnUIgV0B0bak1Ioo/c9IoRWq/SkRNHw@public.gmane.org>
2005-01-13 12:44 ` Johannes Kuhlmann
[not found] ` <47e0449d05011304446094c8b-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2005-01-16 20:44 ` Johan Vromans
[not found] ` <m2fz11gl3c.fsf-KjnUIgV0B0bak1Ioo/c9IoRWq/SkRNHw@public.gmane.org>
2005-01-17 9:31 ` Fionn Behrens
2005-01-17 9:55 ` Johan Vromans
[not found] ` <m2pt04qt1j.fsf-KjnUIgV0B0bak1Ioo/c9IoRWq/SkRNHw@public.gmane.org>
2005-01-17 11:49 ` Johannes Kuhlmann
[not found] ` <47e0449d050117034912fb9ae3-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2005-01-17 12:37 ` Fernando Gómez
2005-01-17 19:41 ` Johannes Kuhlmann
[not found] ` <47e0449d050117114113973694-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2005-01-18 9:49 ` Johan Vromans
2005-01-04 7:47 ` Jeroen Wijnhout
2005-01-04 10:08 ` Bruno Ducrot
[not found] ` <20050104100844.GA19199-kk6yZipjEM5g9hUCZPvPmw@public.gmane.org>
2005-01-04 14:33 ` François Valenduc
[not found] ` <41DAA92C.4080605-IWqWACnzNjyZIoH1IeqzKA@public.gmane.org>
2005-01-04 14:45 ` Johannes Kuhlmann
[not found] ` <47e0449d05010406454e59b16a-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2005-01-05 18:14 ` Pavel Machek
2005-01-04 15:24 ` Pedro Venda
[not found] ` <41DAB539.2020605-pQd4kjVL+REh2FBCd0jGRA@public.gmane.org>
2005-01-09 13:41 ` Johan Vromans
[not found] ` <m2oefyzplr.fsf-KjnUIgV0B0bak1Ioo/c9IoRWq/SkRNHw@public.gmane.org>
2005-01-10 13:51 ` Zdzisław A. Kaleta
[not found] ` <200501101451.36702.sanskryt-FWhLrETftxM@public.gmane.org>
2005-01-11 10:12 ` Pedro Venda
[not found] ` <41E3A69B.2020506-pQd4kjVL+REh2FBCd0jGRA@public.gmane.org>
2005-01-11 10:49 ` z.a.kaleta
[not found] ` <200501111149.55615.sanskryt-h7QdYz1kt/Q@public.gmane.org>
2005-01-11 11:44 ` Pedro Venda
[not found] ` <41E3BC06.30408-pQd4kjVL+REh2FBCd0jGRA@public.gmane.org>
2005-01-11 12:30 ` Zdzisław A. Kaleta
2005-01-10 14:24 ` Zdzisław A. Kaleta
[not found] ` <200501101524.58077.sanskryt-FWhLrETftxM@public.gmane.org>
2005-01-10 14:57 ` Johan Vromans
[not found] ` <m28y71fi1s.fsf-KjnUIgV0B0bak1Ioo/c9IoRWq/SkRNHw@public.gmane.org>
2005-01-10 15:43 ` Pedro Venda
2005-01-10 19:44 ` Johan Vromans
2005-01-10 16:36 ` Zdzisław A. Kaleta
[not found] ` <200501101736.24293.sanskryt-FWhLrETftxM@public.gmane.org>
2005-01-10 19:34 ` Johan Vromans
[not found] ` <m27jmlf57y.fsf-KjnUIgV0B0bak1Ioo/c9IoRWq/SkRNHw@public.gmane.org>
2005-01-10 22:41 ` Zdzisław A. Kaleta
[not found] ` <200501102341.07731.sanskryt-FWhLrETftxM@public.gmane.org>
2005-01-11 9:29 ` Johan Vromans
[not found] ` <m2sm58mhzg.fsf-KjnUIgV0B0bak1Ioo/c9IoRWq/SkRNHw@public.gmane.org>
2005-01-11 10:10 ` Pedro Venda [this message]
2005-01-01 17:05 ` first shoot for smartbattery (was Re: Re: i2c-acpi-ec.c) Pedro Venda
2005-01-01 12:35 ` Hendrik Jürgens
2005-01-01 19:21 ` John Belmonte
[not found] ` <41D6F826.8090906-wanGne27zNesTnJN9+BGXg@public.gmane.org>
2005-01-03 13:13 ` Bruno Ducrot
2005-01-09 3:08 ` ultrakorne
[not found] ` <41E0A01C.6060607-XtQPfPCVGG7srOwW+9ziJQ@public.gmane.org>
2005-01-09 12:04 ` Pedro Venda
[not found] ` <41E11DD0.2090809-pQd4kjVL+REh2FBCd0jGRA@public.gmane.org>
2005-01-09 16:12 ` Ultrakorne
2005-01-09 17:08 ` ultrakorne
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=41E3A609.7000505@arrakis.dhis.org \
--to=pjvenda-pqd4kjvl+reh2fbcd0jgra@public.gmane.org \
--cc=acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox