bitkeeper revision 1.1159.220.2 (41e6700bFJzLjEYlNh48j_cSTbRy9A)

Code duplication cleanup: remove a number of duplicate identical
static functions in xc_*_{build,restore}.c, replaced with single
(non-static) copy in xc_private.c
This commit is contained in:
mafetter@fleming.research committed 2005-01-13 12:56:43 +00:00
1 parent 27f2ee4d4c
commit 79c26560e2
6 files changed
+179 -350

No files matched your search

+7 -137
View File
@@ -41,52 +41,6 @@ loadelfsymtab(
char *elfbase, int xch, u32 dom, unsigned long *parray,
struct domain_setup_info *dsi);
static long get_tot_pages(int xc_handle, u32 domid)
{
dom0_op_t op;
op.cmd = DOM0_GETDOMAININFO;
op.u.getdomaininfo.domain = (domid_t)domid;
op.u.getdomaininfo.ctxt = NULL;
return (do_dom0_op(xc_handle, &op) < 0) ?
-1 : op.u.getdomaininfo.tot_pages;
}
static int get_pfn_list(int xc_handle,
u32 domid,
unsigned long *pfn_buf,
unsigned long max_pfns)
{
dom0_op_t op;
int ret;
op.cmd = DOM0_GETMEMLIST;
op.u.getmemlist.domain = (domid_t)domid;
op.u.getmemlist.max_pfns = max_pfns;
op.u.getmemlist.buffer = pfn_buf;
if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 )
return -1;
ret = do_dom0_op(xc_handle, &op);
(void)munlock(pfn_buf, max_pfns * sizeof(unsigned long));
return (ret < 0) ? -1 : op.u.getmemlist.num_pfns;
}
static int copy_to_domain_page(int xc_handle,
u32 domid,
unsigned long dst_pfn,
void *src_page)
{
void *vaddr = xc_map_foreign_range(
xc_handle, domid, PAGE_SIZE, PROT_WRITE, dst_pfn);
if ( vaddr == NULL )
return -1;
memcpy(vaddr, src_page, PAGE_SIZE);
munmap(vaddr, PAGE_SIZE);
return 0;
}
static int setup_guestos(int xc_handle,
u32 dom,
char *image, unsigned long image_size,
@@ -206,7 +160,7 @@ static int setup_guestos(int xc_handle,
goto error_out;
}
if ( get_pfn_list(xc_handle, dom, page_array, nr_pages) != nr_pages )
if ( xc_get_pfn_list(xc_handle, dom, page_array, nr_pages) != nr_pages )
{
PERROR("Could not get the page frame list");
goto error_out;
@@ -229,7 +183,7 @@ static int setup_guestos(int xc_handle,
PERROR("Error reading initrd image, could not");
goto error_out;
}
copy_to_domain_page(xc_handle, dom,
xc_copy_to_domain_page(xc_handle, dom,
page_array[i>>PAGE_SHIFT], page);
}
}
@@ -364,69 +318,6 @@ static int setup_guestos(int xc_handle,
return -1;
}
static unsigned long get_filesz(int fd)
{
u16 sig;
u32 _sz = 0;
unsigned long sz;
lseek(fd, 0, SEEK_SET);
read(fd, &sig, sizeof(sig));
sz = lseek(fd, 0, SEEK_END);
if ( sig == 0x8b1f ) /* GZIP signature? */
{
lseek(fd, -4, SEEK_END);
read(fd, &_sz, 4);
sz = _sz;
}
lseek(fd, 0, SEEK_SET);
return sz;
}
static char *read_kernel_image(const char *filename, unsigned long *size)
{
int kernel_fd = -1;
gzFile kernel_gfd = NULL;
char *image = NULL;
unsigned int bytes;
if ( (kernel_fd = open(filename, O_RDONLY)) < 0 )
{
PERROR("Could not open kernel image");
goto out;
}
*size = get_filesz(kernel_fd);
if ( (kernel_gfd = gzdopen(kernel_fd, "rb")) == NULL )
{
PERROR("Could not allocate decompression state for state file");
goto out;
}
if ( (image = malloc(*size)) == NULL )
{
PERROR("Could not allocate memory for kernel image");
goto out;
}
if ( (bytes = gzread(kernel_gfd, image, *size)) != *size )
{
PERROR("Error reading kernel image, could not"
" read the whole image (%d != %ld).", bytes, *size);
free(image);
image = NULL;
}
out:
if ( kernel_gfd != NULL )
gzclose(kernel_gfd);
else if ( kernel_fd >= 0 )
close(kernel_fd);
return image;
}
int xc_linux_build(int xc_handle,
u32 domid,
const char *image_name,
@@ -445,13 +336,13 @@ int xc_linux_build(int xc_handle,
unsigned long image_size, initrd_size=0;
unsigned long vstartinfo_start, vkern_entry;
if ( (nr_pages = get_tot_pages(xc_handle, domid)) < 0 )
if ( (nr_pages = xc_get_tot_pages(xc_handle, domid)) < 0 )
{
PERROR("Could not find total pages for domain");
goto error_out;
}
if ( (image = read_kernel_image(image_name, &image_size)) == NULL )
if ( (image = xc_read_kernel_image(image_name, &image_size)) == NULL )
goto error_out;
if ( (ramdisk_name != NULL) && (strlen(ramdisk_name) != 0) )
@@ -462,7 +353,7 @@ int xc_linux_build(int xc_handle,
goto error_out;
}
initrd_size = get_filesz(initrd_fd);
initrd_size = xc_get_filesz(initrd_fd);
if ( (initrd_gfd = gzdopen(initrd_fd, "rb")) == NULL )
{
@@ -747,27 +638,6 @@ loadelfimage(
return 0;
}
static void
map_memcpy(
unsigned long dst, char *src, unsigned long size,
int xch, u32 dom, unsigned long *parray, unsigned long vstart)
{
char *va;
unsigned long chunksz, done, pa;
for ( done = 0; done < size; done += chunksz )
{
pa = dst + done - vstart;
va = xc_map_foreign_range(
xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
chunksz = size - done;
if ( chunksz > (PAGE_SIZE - (pa & (PAGE_SIZE-1))) )
chunksz = PAGE_SIZE - (pa & (PAGE_SIZE-1));
memcpy(va + (pa & (PAGE_SIZE-1)), src + done, chunksz);
munmap(va, PAGE_SIZE);
}
}
#define ELFROUND (ELFSIZE / 8)
static int
@@ -818,7 +688,7 @@ loadelfsymtab(
(shdr[h].sh_type == SHT_SYMTAB) )
{
if ( parray != NULL )
map_memcpy(maxva, elfbase + shdr[h].sh_offset, shdr[h].sh_size,
xc_map_memcpy(maxva, elfbase + shdr[h].sh_offset, shdr[h].sh_size,
xch, dom, parray, dsi->v_start);
/* Mangled to be based on ELF header location. */
@@ -850,7 +720,7 @@ loadelfsymtab(
sym_ehdr->e_shstrndx = SHN_UNDEF;
/* Copy total length, crafted ELF header and section header table */
map_memcpy(symva, p, sizeof(int) + sizeof(Elf_Ehdr) +
xc_map_memcpy(symva, p, sizeof(int) + sizeof(Elf_Ehdr) +
ehdr->e_shnum * sizeof(Elf_Shdr), xch, dom, parray,
dsi->v_start);
}
+1 -26
View File
@@ -19,31 +19,6 @@
#define DPRINTF(_f, _a...) ((void)0)
#endif
static int get_pfn_list(int xc_handle,
u32 domain_id,
unsigned long *pfn_buf,
unsigned long max_pfns)
{
dom0_op_t op;
int ret;
op.cmd = DOM0_GETMEMLIST;
op.u.getmemlist.domain = (domid_t)domain_id;
op.u.getmemlist.max_pfns = max_pfns;
op.u.getmemlist.buffer = pfn_buf;
if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 )
{
PERROR("Could not lock pfn list buffer");
return -1;
}
ret = do_dom0_op(xc_handle, &op);
(void)munlock(pfn_buf, max_pfns * sizeof(unsigned long));
return (ret < 0) ? -1 : op.u.getmemlist.num_pfns;
}
/** Read the vmconfig string from the state input.
* It is stored as a 4-byte count 'n' followed by n bytes.
* The config data is stored in a new string in 'ioctxt->vmconfig',
@@ -220,7 +195,7 @@ int xc_linux_restore(int xc_handle, XcIOContext *ioctxt)
}
/* Build the pfn-to-mfn table. We choose MFN ordering returned by Xen. */
if ( get_pfn_list(xc_handle, dom, pfn_to_mfn_table, nr_pfns) != nr_pfns )
if ( xc_get_pfn_list(xc_handle, dom, pfn_to_mfn_table, nr_pfns) != nr_pfns )
{
xcio_error(ioctxt, "Did not read correct number of frame "
"numbers for new dom");
+6 -52
View File
@@ -132,52 +132,6 @@ static int
#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
#define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
static long
get_tot_pages(int xc_handle, u32 domid)
{
dom0_op_t op;
op.cmd = DOM0_GETDOMAININFO;
op.u.getdomaininfo.domain = (domid_t) domid;
op.u.getdomaininfo.ctxt = NULL;
return (do_dom0_op(xc_handle, &op) < 0) ?
-1 : op.u.getdomaininfo.tot_pages;
}
static int
get_pfn_list(int xc_handle,
u32 domid, unsigned long *pfn_buf, unsigned long max_pfns)
{
dom0_op_t op;
int ret;
op.cmd = DOM0_GETMEMLIST;
op.u.getmemlist.domain = (domid_t) domid;
op.u.getmemlist.max_pfns = max_pfns;
op.u.getmemlist.buffer = pfn_buf;
if (mlock(pfn_buf, max_pfns * sizeof (unsigned long)) != 0)
return -1;
ret = do_dom0_op(xc_handle, &op);
(void) munlock(pfn_buf, max_pfns * sizeof (unsigned long));
#if 0
#ifdef DEBUG
DPRINTF(("Ret for get_pfn_list is %d\n", ret));
if (ret >= 0) {
int i, j;
for (i = 0; i < op.u.getmemlist.num_pfns; i += 16) {
fprintf(stderr, "0x%x: ", i);
for (j = 0; j < 16; j++)
fprintf(stderr, "0x%lx ", pfn_buf[i + j]);
fprintf(stderr, "\n");
}
}
#endif
#endif
return (ret < 0) ? -1 : op.u.getmemlist.num_pfns;
}
static int
setup_guestos(int xc_handle,
u32 dom,
@@ -216,7 +170,7 @@ setup_guestos(int xc_handle,
goto error_out;
}
if (get_pfn_list(xc_handle, dom, cpage_array, tot_pages) != tot_pages) {
if (xc_get_pfn_list(xc_handle, dom, cpage_array, tot_pages) != tot_pages) {
PERROR("Could not get the page frame list");
goto error_out;
}
@@ -487,11 +441,11 @@ xc_plan9_build(int xc_handle,
full_execution_context_t st_ctxt, *ctxt = &st_ctxt;
unsigned long virt_startinfo_addr;
if ((tot_pages = get_tot_pages(xc_handle, domid)) < 0) {
if ((tot_pages = xc_get_tot_pages(xc_handle, domid)) < 0) {
PERROR("Could not find total pages for domain");
return 1;
}
DPRINTF(("get_tot_pages returns %ld pages\n", tot_pages));
DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages));
kernel_fd = open(image_name, O_RDONLY);
if (kernel_fd < 0) {
@@ -505,7 +459,7 @@ xc_plan9_build(int xc_handle,
return 1;
}
DPRINTF(("get_tot_pages returns %ld pages\n", tot_pages));
DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages));
if (mlock(&st_ctxt, sizeof (st_ctxt))) {
PERROR("Unable to mlock ctxt");
return 1;
@@ -519,7 +473,7 @@ xc_plan9_build(int xc_handle,
PERROR("Could not get info on domain");
goto error_out;
}
DPRINTF(("get_tot_pages returns %ld pages\n", tot_pages));
DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages));
if (!(op.u.getdomaininfo.flags & DOMFLAGS_PAUSED)
|| (op.u.getdomaininfo.ctxt->pt_base != 0)) {
@@ -527,7 +481,7 @@ xc_plan9_build(int xc_handle,
goto error_out;
}
DPRINTF(("get_tot_pages returns %ld pages\n", tot_pages));
DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages));
if (setup_guestos(xc_handle, domid, kernel_gfd, tot_pages,
&virt_startinfo_addr,
&load_addr, &st_ctxt, cmdline,
+146
View File
@@ -4,6 +4,7 @@
* Helper functions for the rest of the library.
*/
#include <zlib.h>
#include "xc_private.h"
void *xc_map_foreign_batch(int xc_handle, u32 dom, int prot,
@@ -201,5 +202,150 @@ unsigned long xc_get_m2p_start_mfn ( int xc_handle )
return mfn;
}
int xc_get_pfn_list(int xc_handle,
u32 domid,
unsigned long *pfn_buf,
unsigned long max_pfns)
{
dom0_op_t op;
int ret;
op.cmd = DOM0_GETMEMLIST;
op.u.getmemlist.domain = (domid_t)domid;
op.u.getmemlist.max_pfns = max_pfns;
op.u.getmemlist.buffer = pfn_buf;
if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 )
{
PERROR("Could not lock pfn list buffer");
return -1;
}
ret = do_dom0_op(xc_handle, &op);
(void)munlock(pfn_buf, max_pfns * sizeof(unsigned long));
#if 0
#ifdef DEBUG
DPRINTF(("Ret for xc_get_pfn_list is %d\n", ret));
if (ret >= 0) {
int i, j;
for (i = 0; i < op.u.getmemlist.num_pfns; i += 16) {
fprintf(stderr, "0x%x: ", i);
for (j = 0; j < 16; j++)
fprintf(stderr, "0x%lx ", pfn_buf[i + j]);
fprintf(stderr, "\n");
}
}
#endif
#endif
return (ret < 0) ? -1 : op.u.getmemlist.num_pfns;
}
long xc_get_tot_pages(int xc_handle, u32 domid)
{
dom0_op_t op;
op.cmd = DOM0_GETDOMAININFO;
op.u.getdomaininfo.domain = (domid_t)domid;
op.u.getdomaininfo.ctxt = NULL;
return (do_dom0_op(xc_handle, &op) < 0) ?
-1 : op.u.getdomaininfo.tot_pages;
}
int xc_copy_to_domain_page(int xc_handle,
u32 domid,
unsigned long dst_pfn,
void *src_page)
{
void *vaddr = xc_map_foreign_range(
xc_handle, domid, PAGE_SIZE, PROT_WRITE, dst_pfn);
if ( vaddr == NULL )
return -1;
memcpy(vaddr, src_page, PAGE_SIZE);
munmap(vaddr, PAGE_SIZE);
return 0;
}
unsigned long xc_get_filesz(int fd)
{
u16 sig;
u32 _sz = 0;
unsigned long sz;
lseek(fd, 0, SEEK_SET);
read(fd, &sig, sizeof(sig));
sz = lseek(fd, 0, SEEK_END);
if ( sig == 0x8b1f ) /* GZIP signature? */
{
lseek(fd, -4, SEEK_END);
read(fd, &_sz, 4);
sz = _sz;
}
lseek(fd, 0, SEEK_SET);
return sz;
}
char *xc_read_kernel_image(const char *filename, unsigned long *size)
{
int kernel_fd = -1;
gzFile kernel_gfd = NULL;
char *image = NULL;
unsigned int bytes;
if ( (kernel_fd = open(filename, O_RDONLY)) < 0 )
{
PERROR("Could not open kernel image");
goto out;
}
*size = xc_get_filesz(kernel_fd);
if ( (kernel_gfd = gzdopen(kernel_fd, "rb")) == NULL )
{
PERROR("Could not allocate decompression state for state file");
goto out;
}
if ( (image = malloc(*size)) == NULL )
{
PERROR("Could not allocate memory for kernel image");
goto out;
}
if ( (bytes = gzread(kernel_gfd, image, *size)) != *size )
{
PERROR("Error reading kernel image, could not"
" read the whole image (%d != %ld).", bytes, *size);
free(image);
image = NULL;
}
out:
if ( kernel_gfd != NULL )
gzclose(kernel_gfd);
else if ( kernel_fd >= 0 )
close(kernel_fd);
return image;
}
void xc_map_memcpy(unsigned long dst, char *src, unsigned long size,
int xch, u32 dom, unsigned long *parray,
unsigned long vstart)
{
char *va;
unsigned long chunksz, done, pa;
for ( done = 0; done < size; done += chunksz )
{
pa = dst + done - vstart;
va = xc_map_foreign_range(
xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
chunksz = size - done;
if ( chunksz > (PAGE_SIZE - (pa & (PAGE_SIZE-1))) )
chunksz = PAGE_SIZE - (pa & (PAGE_SIZE-1));
memcpy(va + (pa & (PAGE_SIZE-1)), src + done, chunksz);
munmap(va, PAGE_SIZE);
}
}
+13
View File
@@ -189,4 +189,17 @@ typedef struct mfn_mapper {
unsigned long xc_get_m2p_start_mfn ( int xc_handle );
long xc_get_tot_pages(int xc_handle, u32 domid);
int xc_copy_to_domain_page(int xc_handle, u32 domid,
unsigned long dst_pfn, void *src_page);
unsigned long xc_get_filesz(int fd);
char *xc_read_kernel_image(const char *filename, unsigned long *size);
void xc_map_memcpy(unsigned long dst, char *src, unsigned long size,
int xch, u32 dom, unsigned long *parray,
unsigned long vstart);
#endif /* __XC_PRIVATE_H__ */
+6 -135
View File
@@ -46,53 +46,6 @@ loadelfsymtab(
char *elfbase, int xch, u32 dom, unsigned long *parray,
struct domain_setup_info *dsi);
static long get_tot_pages(int xc_handle, u32 domid)
{
dom0_op_t op;
op.cmd = DOM0_GETDOMAININFO;
op.u.getdomaininfo.domain = (domid_t)domid;
op.u.getdomaininfo.ctxt = NULL;
return (do_dom0_op(xc_handle, &op) < 0) ?
-1 : op.u.getdomaininfo.tot_pages;
}
int xc_get_pfn_list(int xc_handle,
u32 domid,
unsigned long *pfn_buf,
unsigned long max_pfns)
{
dom0_op_t op;
int ret;
op.cmd = DOM0_GETMEMLIST;
op.u.getmemlist.domain = (domid_t)domid;
op.u.getmemlist.max_pfns = max_pfns;
op.u.getmemlist.buffer = pfn_buf;
if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 )
return -1;
ret = do_dom0_op(xc_handle, &op);
(void)munlock(pfn_buf, max_pfns * sizeof(unsigned long));
return (ret < 0) ? -1 : op.u.getmemlist.num_pfns;
}
static int copy_to_domain_page(int xc_handle,
u32 domid,
unsigned long dst_pfn,
void *src_page)
{
void *vaddr = xc_map_foreign_range(
xc_handle, domid, PAGE_SIZE, PROT_WRITE, dst_pfn);
if ( vaddr == NULL )
return -1;
memcpy(vaddr, src_page, PAGE_SIZE);
munmap(vaddr, PAGE_SIZE);
return 0;
}
static int setup_guestos(int xc_handle,
u32 dom,
char *image, unsigned long image_size,
@@ -225,7 +178,7 @@ static int setup_guestos(int xc_handle,
PERROR("Error reading initrd image, could not");
goto error_out;
}
copy_to_domain_page(xc_handle, dom,
xc_copy_to_domain_page(xc_handle, dom,
page_array[i>>PAGE_SHIFT], page);
}
}
@@ -402,68 +355,6 @@ static int setup_guestos(int xc_handle,
return -1;
}
static unsigned long get_filesz(int fd)
{
u16 sig;
u32 _sz = 0;
unsigned long sz;
lseek(fd, 0, SEEK_SET);
read(fd, &sig, sizeof(sig));
sz = lseek(fd, 0, SEEK_END);
if ( sig == 0x8b1f ) /* GZIP signature? */
{
lseek(fd, -4, SEEK_END);
read(fd, &_sz, 4);
sz = _sz;
}
lseek(fd, 0, SEEK_SET);
return sz;
}
static char *read_kernel_image(const char *filename, unsigned long *size)
{
int kernel_fd = -1;
gzFile kernel_gfd = NULL;
char *image = NULL;
unsigned int bytes;
if ( (kernel_fd = open(filename, O_RDONLY)) < 0 )
{
PERROR("Could not open kernel image");
goto out;
}
*size = get_filesz(kernel_fd);
if ( (kernel_gfd = gzdopen(kernel_fd, "rb")) == NULL )
{
PERROR("Could not allocate decompression state for state file");
goto out;
}
if ( (image = malloc(*size)) == NULL )
{
PERROR("Could not allocate memory for kernel image");
goto out;
}
if ( (bytes = gzread(kernel_gfd, image, *size)) != *size )
{
PERROR("Error reading kernel image, could not"
" read the whole image (%d != %ld).", bytes, *size);
free(image);
image = NULL;
}
out:
if ( kernel_gfd != NULL )
gzclose(kernel_gfd);
else if ( kernel_fd >= 0 )
close(kernel_fd);
return image;
}
#define VMX_FEATURE_FLAG 0x20
@@ -505,13 +396,13 @@ int xc_vmx_build(int xc_handle,
goto error_out;
}
if ( (nr_pages = get_tot_pages(xc_handle, domid)) < 0 )
if ( (nr_pages = xc_get_tot_pages(xc_handle, domid)) < 0 )
{
PERROR("Could not find total pages for domain");
goto error_out;
}
if ( (image = read_kernel_image(image_name, &image_size)) == NULL )
if ( (image = xc_read_kernel_image(image_name, &image_size)) == NULL )
goto error_out;
if ( (ramdisk_name != NULL) && (strlen(ramdisk_name) != 0) )
@@ -522,7 +413,7 @@ int xc_vmx_build(int xc_handle,
goto error_out;
}
initrd_size = get_filesz(initrd_fd);
initrd_size = xc_get_filesz(initrd_fd);
if ( (initrd_gfd = gzdopen(initrd_fd, "rb")) == NULL )
{
@@ -746,26 +637,6 @@ loadelfimage(
return 0;
}
static void
map_memcpy(
unsigned long dst, char *src, unsigned long size,
int xch, u32 dom, unsigned long *parray, unsigned long vstart)
{
char *va;
unsigned long chunksz, done, pa;
for ( done = 0; done < size; done += chunksz )
{
pa = dst + done - vstart;
va = xc_map_foreign_range(
xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
chunksz = size - done;
if ( chunksz > (PAGE_SIZE - (pa & (PAGE_SIZE-1))) )
chunksz = PAGE_SIZE - (pa & (PAGE_SIZE-1));
memcpy(va + (pa & (PAGE_SIZE-1)), src + done, chunksz);
munmap(va, PAGE_SIZE);
}
}
#define ELFROUND (ELFSIZE / 8)
@@ -817,7 +688,7 @@ loadelfsymtab(
(shdr[h].sh_type == SHT_SYMTAB) )
{
if ( parray != NULL )
map_memcpy(maxva, elfbase + shdr[h].sh_offset, shdr[h].sh_size,
xc_map_memcpy(maxva, elfbase + shdr[h].sh_offset, shdr[h].sh_size,
xch, dom, parray, dsi->v_start);
/* Mangled to be based on ELF header location. */
@@ -849,7 +720,7 @@ loadelfsymtab(
sym_ehdr->e_shstrndx = SHN_UNDEF;
/* Copy total length, crafted ELF header and section header table */
map_memcpy(symva, p, sizeof(int) + sizeof(Elf_Ehdr) +
xc_map_memcpy(symva, p, sizeof(int) + sizeof(Elf_Ehdr) +
ehdr->e_shnum * sizeof(Elf_Shdr), xch, dom, parray,
dsi->v_start);
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.